mrkeyoor.com_
Mon 07 Sept 22:55 UTC
Self-Hostedevaluationupdated 07 Sept 2026

snagtime review

SnagTime is a self-hosted booking app for sharing availability, accepting appointments, syncing Google Calendar, and sending email. It gives developers the source for a scheduling service with team workspaces and test payments, while leaving hosting, provider accounts, security, and backups in their hands.

trackingstars / 7d
Verdict

Our SnagTime run installed 986 packages and used 1059 MB, then the build failed and 104 of 196 tests failed, which rules commit 1c95490 out for production use. Try it locally if you want an inspectable scheduling app and can diagnose a young Node monorepo. Choose a released alternative if bookings or payments must work before you invest engineering time.

We ran it

Lab card: what happened when we ran snagtimeScreenshot of snagtime (github.com/nateherkai/snagtime)
Install✓ · 37s986 packages · 1059 MB
Build✗ · 41s
Tests✗ · 103s92 passed · 104 failed of 196 (vitest)
Known vulns10 critical · 0 high · 1 moderate · 0 low (npm audit)
Repo266 files~10,658 lines of source · 1.8 MB · 1 CI workflows · Dockerfile · tests dir

Answers from our run

Does snagtime build from source?

Dependencies installed in 37 seconds (986 packages), and the build failed. We cloned commit 1c95490 into a clean Debian container with 3 CPUs and no project-specific setup.

Do snagtime's tests pass?

Not all of them: 92 of 196 passed and 104 failed when we ran the project's own test command (vitest). Some failures need services or credentials a bare container does not have.

Does snagtime have known vulnerabilities in its dependencies?

npm audit flagged 1 known advisory in the dependency tree at the time of our run.

Who should not use snagtime?

Teams requiring a clean build and passing suite before evaluation: our build failed, and 104 of 196 tests failed.

What are the alternatives to snagtime?

Cal.diy, Easy!Appointments. Our SnagTime run installed 986 packages and used 1059 MB, then the build failed and 104 of 196 tests failed, which rules commit 1c95490 out for production use.

Setup2/537-second install; build and 104 tests failed
Docs5/5Local, integration, security, and production paths are specific
Community2/5331 stars and 2 open PRs, but the repository is days old
Maturity1/5No release tag; main failed its build and 104 tests

Who it’s for

Developers willing to evaluate a 986-package Node monorepo before trusting it with bookings.
Solo operators and small teams that want workspaces, public booking links, availability rules, rescheduling, and cancellation.
Self-hosters prepared to run a Node web service, a separate worker, and PostgreSQL 18 for public use.
Builders who can configure and verify Google OAuth, SMTP delivery, and Stripe test-mode webhooks themselves.

Who it’s NOT for

Teams requiring a clean build and passing suite before evaluation: our build failed, and 104 of 196 tests failed.
Businesses that need live card charges: the README says this release rejects Stripe live-mode keys and events.
Vercel or static-host users: the deployment guide requires a permanent Node web service, a separate worker, PostgreSQL 18, and HTTPS ingress.
Small operators who do not want to own database TLS, independent secrets, backups, sender-domain records, monitoring, and incident response.
Buyers who require versioned releases and settled production behavior: GitHub lists no release or tag, while open pull request 1 reports a production tenant-context fix that is not on main.

Setup reality

Our sandbox install succeeded in 37 seconds, adding 986 packages and using 1059 MB. The build failed after 41 seconds: Next.js reported a module-not-found error from apps/web/src/server/db.ts, reached through auth/session.ts and instrumentation.ts. Tests failed after 103 seconds, with 92 passing and 104 failing of 196; one notification test timed out at 5000 ms. Npm audit reported 1 moderate vulnerability and none rated high or critical.

The README calls its local path a five-minute setup. It generates an ignored .env.local, then uses SQLite plus local calendar, inbox, and payment adapters without provider credentials. Google Calendar needs OAuth credentials, real email needs SMTP and a verified sender domain, and payments are limited to Stripe test mode.

Public hosting is a different job: PostgreSQL 18 with verified TLS, separate database roles, a permanent Node web service and worker, HTTPS proxying, independent secrets, monitoring, and encrypted backup drills. Vercel and static hosting are explicitly unsupported. Node.js 20.9 or newer is accepted, while Node.js 24 is the documented verified runtime.

The 266-file monorepo covers the appointment loop

Across 266 files, SnagTime handles organizer accounts, workspaces, invitations, event types, public booking pages, and time-zone conversion. Availability can include weekly hours, date overrides, buffers, minimum notice, and booking windows. Invitees can answer custom questions, then confirm, reschedule, or cancel through recovery links. That is enough product surface for a consultant or small team to test a complete booking journey instead of assembling a calendar picker around a form.

The 1.8 MB checkout also includes custom workspace branding, Google Calendar free-busy checks and event creation, SMTP notifications, and optional test pricing. Payments deserve the qualifier: Stripe Checkout runs only in test mode, including webhook confirmation and refund handling. Live keys and live events are rejected by design. SnagTime can prove a paid-booking flow, but accepting real money would require separate implementation and an audit that this release does not claim.

What happened when we ran it

Our sandbox installed commit 1c95490 in 37 seconds, pulling 986 npm packages and occupying 1059 MB on disk. The environment was a fresh unprivileged Debian container with 3 CPUs, 8 GB of RAM, Node 22, and no secrets. The repository itself contained about 10,658 lines of source. Installation therefore worked, although the dependency footprint was much larger than the 1.8 MB checkout.

The production build failed with exit code 1 after 41 seconds. The log tail points to apps/web/src/server/db.ts at line 35 and links to Next.js's module-not-found message; the import path then reaches apps/web/src/server/auth/session.ts and apps/web/src/instrumentation.ts. The supplied tail does not identify a deeper cause, so the defensible finding is simple: the measured commit did not produce a Next.js production build in our clean container.

Vitest also exited 1 after 103 seconds: 92 tests passed and 104 failed out of 196 across 30 test files. The failures named capabilities, resilience, payment safety, event types, occupancy, sessions, and notifications. One notification case timed out after 5000 ms. Our run also found 1 moderate npm vulnerability, with 0 high and 0 critical findings. The checkout has a tests directory, one CI workflow, a Dockerfile, and npm workspaces, but those signals do not cancel the failed results.

The local demo and PostgreSQL 18 deployment are different jobs

Node.js 20.9 or newer is the documented entry point, with Node.js 24 named as the verified runtime. npm run setup creates an ignored local configuration and generates independent secrets, while npm run demo:free installs dependencies, prepares SQLite, seeds an organizer, and starts the development server. Local calendar, inbox, and payment adapters mean the first booking can be tried without Google, SMTP, Stripe, PostgreSQL, or hosting credentials. That is a thoughtful way to separate product evaluation from account setup.

PostgreSQL 18 is mandatory for the documented public architecture, which uses forced row-level security, verified database TLS, and separate migration, app, worker, and monitoring credentials. Operators must run a web container plus a continuously running worker behind HTTPS, create several independent application secrets, and rehearse encrypted backups. Google OAuth, a verified SMTP sender with SPF, DKIM, and DMARC, and Stripe test webhooks add human checkpoints. The guide says Vercel is unsupported out of the box and static hosting is incompatible.

Two open pull requests are the visible community activity

GitHub listed 331 stars, 113 forks, and 2 open items when checked; both open items were pull requests. The repository was created on August 27, 2026, main was last pushed on August 28, and outside pull requests arrived on August 29 and August 31. No release or tag exists. That is current activity, but it is only days of public history, too little evidence for upgrade discipline, maintainer response times, or long-lived production maintenance.

Open pull request 1 reports that the PostgreSQL production path could lose tenant context across an asynchronous boundary, hiding Google connection state and breaking an availability update. Its author supplied a fix and reported 39 focused tests passing on the branch, but the pull request remains open against commit 1c95490. We did not reproduce that deployment report. It is still a precise reason to test Google status, token refresh, availability saves, and tenant isolation on the exact production topology before inviting users.

Cal.diy and Easy!Appointments trade scope for longer histories

Cal.diy requires Node.js 18+ and PostgreSQL 13+, and it carries more scheduling surface from its Cal.com ancestry. Its own README now recommends personal, non-production self-hosting, so it is an alternative for feature exploration rather than an automatic production answer. Easy!Appointments takes the older PHP 8.2+ and MySQL route, with services, providers, working plans, Google Calendar sync, email, and multiple interface languages. That stack may fit conventional shared or managed servers better than SnagTime's worker and PostgreSQL 18 contract.

Our 41-second build failure and 104 failed tests outweigh SnagTime's clear documentation for any production decision today. The credential-free demo is still useful for inspecting its booking model, and the MIT license leaves room to repair or adapt it. We would keep that work in a local trial until main produces a clean build, the full 196-test suite passes in a fresh environment, and the reported production tenant-context fix is resolved. Real bookings should wait for those checks.

Alternatives

ProjectWhat it isPick it when
Cal.diy gh↗An MIT scheduling platform that needs Node.js 18+ and PostgreSQL 13+.pick this instead when you want a broader community scheduling codebase for personal self-hosting and accept its warning against production use.
Easy!AppointmentsA GPL appointment scheduler for PHP 8.2+ and MySQL hosts.pick this instead when a conventional PHP and MySQL deployment, multiple providers, and a multilingual interface fit your server better.

What people are saying

  1. [velocity-scout] nateherkai/snagtime

Sources

  1. SnagTime repository and README
  2. AI-assisted local setup guide
  3. Google, SMTP, and Stripe test integration guide
  4. PostgreSQL production deployment guide
  5. SnagTime security policy
  6. Production tenant-context pull request 1
  7. SnagTime pull request activity
  8. SnagTime releases

More self-hosted reviews

dozzle · s-ui · opencloud · obsidian-livesync · koodo-reader · LunaTV · the whole board →