Snag a time. Get booked.
A free, self-hostable scheduling app for availability, booking links, calendar sync, email notifications, and test payments.
What SnagTime does
SnagTime gives you the source code for your own scheduling system. You can run it locally for free, customize it, and host it on infrastructure you control.
- Account registration, sign-in, password recovery, and email verification
- Workspaces, members, invitations, and workspace switching
- Event types with multiple durations and optional test pricing
- Weekly availability, date overrides, buffers, minimum notice, and booking windows
- Public booking links with time-zone handling and custom questions
- Booking confirmation, rescheduling, cancellation, and recovery links
- Google Calendar free/busy checks and event creation
- Stripe Checkout in test mode, including webhook confirmation and refund handling
- SMTP email for organizers and invitees
- Custom workspace branding, accent colors, profile images, and uploaded logos
- SQLite for the local demo and a hardened PostgreSQL production architecture
Set it up with Codex or Claude Code
You can give an AI coding assistant this repository URL and have it handle the local installation while it pauses for the account steps only you can complete.
Open AI-assisted setup, copy the student prompt, and paste it into Codex or Claude Code with this repository link:
https://github.com/nateherkai/snagtime
The guide separates the credential-free local demo, optional integrations, and advanced public deployment so the assistant does not pull you into infrastructure work before the app runs locally.
Five-minute local setup
Requirements
- Node.js 20.9 or newer. Node.js 24 is the verified runtime.
- npm
- Git
1. Clone and enter the repository
git clone https://github.com/nateherkai/snagtime.git
cd snagtime
2. Generate your local configuration
npm run setup
The setup command creates an ignored .env.local, generates independent cryptographic secrets, and prints the local demo login once. You can provide your own organizer login instead:
npm run setup -- --email you@example.com --password "YourStrong!Password7"
3. Install, prepare the database, and start SnagTime
npm run demo:free
Open http://localhost:3000 and use the login printed by the setup command.
The credential-free local mode uses SQLite, a local calendar adapter, a local email inbox, and stub payments. It does not call Google or Stripe.
Connect your services
Copying the repository gives you all of the software. External integrations still belong to you and must be configured with your own accounts.
| Capability | What you provide | Required for local demo? |
|---|---|---|
| Database | Nothing for SQLite, PostgreSQL for production | No |
| Public hosting | HTTPS domain plus a long-running Node web service and worker | No |
| Google Calendar | OAuth client ID and client secret | No |
| Transactional email | SMTP host, user, password, and verified sender domain | No |
| Stripe payments | Stripe test secret, publishable key, and webhook secret | No |
See Integration setup for exact callback URLs, environment variables, and verification steps.
Put it on the internet
SnagTime is a dynamic application, not a static website. It needs server-side Node.js execution, a persistent database, webhook endpoints, and a continuously running background worker.
- ChatGPT Sites is not a compatible production host for this repository.
- Vercel is not supported out of the box because the current production design requires a long-running worker and PostgreSQL runtime roles.
- A Linux VPS or a container platform that supports a web service, a worker service, persistent PostgreSQL, secrets, and HTTPS is the right shape.
The full production architecture is intentionally strict. It uses PostgreSQL 18, forced row-level security, separate app and worker credentials, verified database TLS, and authenticated proxy ingress. Read Deployment guide before choosing a host.
What is actually free?
The SnagTime source code is free under the MIT License. Running it locally can also cost nothing.
A public deployment can still create third-party costs:
- Hosting or a VPS
- A domain name
- Managed PostgreSQL, if your host does not include it
- Transactional email volume
- Provider fees for any services you connect
Google OAuth credentials can be created without paying SnagTime. Stripe test mode is free for testing. This release deliberately rejects Stripe live-mode keys, so do not advertise it as a live payment processor without implementing and auditing live-mode support.
Useful commands
npm run setup # Create .env.local and local credentials
npm run setup:check # Validate the credential-free local configuration
npm run demo:free # Install, migrate, seed, and run the free local demo
npm run dev # Run the configured local development server
npm run test # Run the unit and contract test suite
npm run typecheck # Check TypeScript
npm run lint # Run ESLint
npm run build # Create the Next.js production build
npm run ci:secret-scan # Scan public source files for credential patterns
Database commands:
npm run db:generate
npm run db:migrate
npm run db:seed
npm run db:reset destroys the local SQLite database. Use it only when you intentionally want a clean demo.
Project structure
apps/web/ Next.js application and API routes
apps/web/public/ SnagTime logo and icon
prisma/ SQLite schema, PostgreSQL schema, and migrations
scripts/ Setup, database, worker, security, and verification tools
infrastructure/ PostgreSQL container hardening
tests/ Browser and end-to-end tests
docs/ Setup, deployment, and brand documentation
Project status
The local SQLite experience and integration test paths are designed for demos, development, and personal experimentation. The production architecture is an advanced self-hosting path, not a one-click managed service. You are responsible for infrastructure security, backups, provider configuration, deliverability, compliance, and ongoing operations.
Please read Security before exposing a deployment publicly.
Comments