The Satyrs Motorcycle Club is one of the oldest LGBTQ+ motorcycle clubs in the world, founded in 1954. When I joined the club, its membership and events management was handled through a patchwork of email threads, spreadsheets, and a static website. A club with 70+ years of history and an active membership deserved better infrastructure.
In 2 months of part time development, I built and launched a production web application to manage membership records, events, and club communications, designed to run indefinitely on free and hobby hosting tiers to fit a nonprofit operating budget.

Planning
The first constraint was financial sustainability. A club of this size cannot support a SaaS bill, so the architecture had to be optimized for free and low-cost hosting from the start. I settled on Netlify for the frontend, Railway for the API, and Neon for the database, all of which offer free tiers sufficient for the club’s usage patterns.
The second constraint was longevity. Club volunteers maintain this system, not professional engineers. That meant choosing a stack that would be readable and maintainable by someone coming in cold, with clear data models and minimal operational overhead.
The third constraint was the membership itself. Motorcycle clubs skew older, and asking members to create and remember a password is a real adoption barrier. I designed the authentication flow around passwordless magic links sent to email, leveraging the contact records already on file for every member. No account creation, no password resets, no support burden. Members who were already in the system could log in the first time they tried without doing anything they hadn’t already done before.
I scoped the initial version around three core needs: membership records with status tracking, event management with RSVP, and a simple admin surface for club officers.
Building
The stack is TypeScript end-to-end: a React frontend, a Node.js API layer using tRPC for type-safe communication between client and server, and a PostgreSQL database managed through TypeORM. Zod handles all validation at the API boundary, and react-hook-form manages form state on the frontend.
tRPC was a deliberate choice over a traditional REST API. With a small team of one, the shared type safety between frontend and backend eliminates an entire category of integration bugs and removes the need for generated client code or manual type maintenance. This was especially important as guardrails for agentic engineering using Claude Code.
Results
The application is in active production use by club members. The passwordless login flow eliminated the most common barrier to adoption for a membership that spans multiple generations, and seeding the system from existing contact records meant members were already in the platform before it launched. It replaced the previous ad hoc systems and gave club officers a reliable, maintainable tool for managing the membership and events of an organization with over seven decades of history. Development is ongoing, as we start digitizing the decades of archives and make them accessible for club members and researchers alike.