Full-Stack
Repair Shop Management System
A work-order system for a repair business, with a one-click demo that logs a stranger in against a real hosted identity provider.

The problem
A repair shop runs on work orders: who the customer is, what came in, which technician owns it, and whether it is still open. That is straightforward to model. The hard problem was the demo. The app authenticates against Kinde, a hosted identity provider, and a hosted provider deliberately gives you no way to hand a visitor a session. So either every prospective client has to create a real account before seeing anything, or the login has to be solved properly on the server.
Approach
- Customers, tickets and user permissions are modelled in Postgres with Drizzle ORM, running on Neon serverless, with indexes on the fields the permission checks actually filter by.
- Authentication is delegated to Kinde rather than hand-rolled, and a permissions table maps each Kinde user id to a role, so authorization stays in the application while identity stays with the provider.
- The one-click demo is the centerpiece: a server-side route drives the provider's real login flow end to end, extracting the hidden form fields, maintaining a cookie jar across redirects, and decoding the returned token, then sets the session cookies on the visitor. The visitor clicks once and is inside the app as the demo user, with no account and no shared password typed anywhere.
- Forms are validated with Zod schemas generated from the database schema, so the validation rules and the table definition cannot drift apart.
- Ticket and customer lists use TanStack Table for sorting, filtering and pagination against real data rather than a static mock.
- Sentry is wired in for error tracking, and a health endpoint plus a migration endpoint make the deployed instance inspectable and upgradable without shell access.
What it proves
- Live demo anyone can enter in one click, with no signup and no credentials to type.
- Automated tests cover the input sanitization layer and interactive components.
- Authorization is enforced by role in the database, not by hiding buttons in the UI.
- Deployed on Vercel against a serverless Neon Postgres instance.
Next.js 15TypeScriptTailwind CSSNeon DatabaseDrizzle ORMKinde Authshadcn/uiSentryReact Hook FormZodTanStack TableVitest