Membership and Access Control Platform
All projects

Membership and Access Control Platform

Fitness and Wellness

2026 - Present

ZKTeco
Hardware scanner integrated
2
Builds available, desktop and web

About the project

A membership and access control system where each member carries a QR code and the entrance screen validates entries in real time, still working when the connection drops.

My role: Product design and full stack development, including the hardware scanner integration and the offline access path.

I built this platform because access control usually forces an unpleasant choice. Either you buy a closed turnstile system that comes with its own software and its own rules, or you manage subscriptions in a spreadsheet and check membership by memory at the desk. The first is expensive and rigid, the second stops working the moment the place has more than a hundred members.

The product handles members and subscriptions, issues a QR code per member, and drives an access control screen that validates each entry against the subscription status. The scanner is a ZKTeco unit operating as a keyboard wedge, which means it types the QR content followed by a return key. I read that at the document level rather than through a focused input field, so the operator can never break the screen by clicking elsewhere, and no driver or vendor SDK sits between the hardware and the application.

The access screen is the part that must never fail, so it is designed to keep validating while the connection is down and to reconcile afterwards. The stack is React 19 with TypeScript on Vite, Tailwind v4 and Firebase for authentication and data, packaged with Electron for the desk machine. I built it against a gym, which is the hardest version of the problem: high traffic at fixed hours and a queue forming the moment a scan hesitates. The same three pieces, a credential, a subscription state and a door decision, are what a coworking space, a pool or a private clinic needs, which is why nothing in the model is named after a gym.

Main features

  • 🎫 QR code per member: Every membership generates its own code, so entry needs no card, no badge and no proprietary token.
  • 🚪 Real time access screen: Each scan is validated against the subscription status and answered on screen immediately.
  • 📴 Works with the connection down: The entrance keeps validating members offline and reconciles once the link is back.
  • ⌨️ Driverless scanner integration: The ZKTeco unit acts as a keyboard, read at document level, so no vendor SDK sits between hardware and app.
  • 🖱️ Focus proof by design: Because the scan is captured globally, an operator clicking elsewhere can never silently break the entrance.
  • 💳 Membership and plan management: Members, subscription plans and products are managed from one back office rather than a spreadsheet.
  • 🏛️ Not tied to one kind of venue: A credential, a subscription state and a door decision are the same three pieces for a gym, a coworking space, a pool or a clinic.
  • 🖥️ Desk ready desktop build: Electron packages the application for the reception machine, so the entrance is not a browser tab someone can close.
  • 🚦 Status today: The software is built and drives a real scanner, and it has no site in production yet. The door relay is the next phase, so the current release claims only what it does.

Problems and solutions

Problem: A venue choosing access control picks between a closed turnstile system that imposes its own software and pricing, or a spreadsheet plus staff memory at the desk. The first is rigid and expensive, the second collapses past a hundred members and lets expired memberships walk in.

Solution: This platform keeps the software open and the hardware cheap. A standard QR scanner behaving as a keyboard removes the vendor lock entirely, the entrance screen validates every scan against live subscription status, and it keeps deciding offline so a network outage never turns into a queue at the door.

Problem: Access control software is usually written for one kind of venue, so a gym product cannot serve a coworking space without a rewrite even though both are doing exactly the same thing: checking whether this person is paid up, right now, at a door.

Solution: The model holds a credential, a subscription state and a door decision, and nothing above that is named after a gym. Changing venue type is a matter of plans and opening rules, not of code, which is what makes the same build sellable to a pool or a private clinic.

Tech stack

React
TypeScript
Firebase
Firestore
Tailwind CSS
Node.js