selfhost.directory

The index of self-hostable projects — ranked, categorized and served with live updates.
Own your data and stop giving it to big tech.

GitHub
SnagTime logo

Self-host SnagTime

Self-hosted scheduling with booking links and calendar sync

BetaOpen SourceMIT
Updated2 months ago
LanguageTypescript
Setup difficultyAdvanced
Stars
400
Port
3000 (HTTP web server)
Install with NPM

What is SnagTime?

SnagTime is a self-hosted scheduling application built with Next.js and Prisma. It handles account registration, workspaces, event types with durations and test pricing, availability management, public booking links with timezone support, booking confirmation and rescheduling, Google Calendar synchronization, Stripe test payments with webhooks, SMTP email notifications, and custom branding. The local demo runs on SQLite with a local calendar adapter, an internal email inbox, and stub payments requiring no external credentials. Production uses PostgreSQL 18 with row-level security, separate web and worker containers, TLS, and authenticated proxy ingress. MIT licensed.

Should you self-host SnagTime?

SnagTime scores 44/100 on selfhost.directory (how scoring works) and ranks #23 of 30 in Calendar & Contacts. It has 400 GitHub stars.

There was no stable release in the past 12 months, so check the repository's recent activity before you rely on it.

Setup is advanced: plan for several services and some ongoing maintenance. It is MIT-licensed and written mostly in Typescript.

Its closest alternative on selfhost.directory is Radicale (69/100, 5 154 stars). It scores higher overall, so compare the two before you pick. See SnagTime vs Radicale side by side.

Features

  • Availability management
  • Booking links
  • Booking management
  • Calendar Sync
  • Custom Branding
  • Email notifications
  • Event types
  • Local demo mode
  • Production architectureAdvanced self-hosting path, not a one-click managed service
  • REST API
  • Test paymentsStripe live mode is explicitly rejected in this release
  • Workspaces

SnagTime README

How to install SnagTime

Install SnagTime with NPM

git clone https://github.com/nateherkai/snagtime.git cd snagtime npm run setup npm run demo:free

Local development with SQLite, no external dependencies required

How to configure SnagTime

  • AUTH_SECRETreplace-with-at-least-32-random-charactersUse a long random value outside source control. NEXTAUTH_SECRET is accepted as a fallback.

    Use a long random value outside source control. NEXTAUTH_SECRET is accepted as a fallback.

  • BOOKING_CAPABILITY_KEY_IDbooking-capability-v1Versioned signing key for booking bootstrap capabilities

    Versioned signing key for booking bootstrap capabilities

  • BOOKING_CAPABILITY_SECRETreplace-with-an-independent-32-byte-random-valueIndependent 32-byte random value for booking capabilities

    Independent 32-byte random value for booking capabilities

  • BUILD_IDdevelopmentImmutable build identifier

    Immutable build identifier

  • CALENDAR_PROVIDERlocalCalendar provider (local or google)

    Calendar provider (local or google)

    values: local, google

  • DATABASE_PROVIDERsqliteDatabase provider

    Database provider

    values: sqlite, postgresql

  • DATABASE_ROLEappDatabase role

    Database role

  • DATABASE_URLfile:./dev.dbLocal demo database. Prisma resolves this relative to prisma/schema.prisma.

    Local demo database. Prisma resolves this relative to prisma/schema.prisma.

  • DEMO_HOST_EMAILowner@example.comDemo organizer email

    Demo organizer email

  • DEMO_HOST_PASSWORDreplace-with-a-strong-demo-passwordDemo organizer password

    Demo organizer password

  • DEMO_MODEtrueEnable demo mode

    Enable demo mode

  • EMAIL_FROMFrom email address

    From email address

  • EMAIL_PROVIDERlocalEmail provider (local or smtp)

    Email provider (local or smtp)

    values: local, smtp

  • EMAIL_REPLY_TOReply-to email address

    Reply-to email address

  • EMAIL_SENDER_DOMAINSender domain for email authentication

    Sender domain for email authentication

  • EMAIL_TOKEN_SECRET32-byte random secret for email tokens

    32-byte random secret for email tokens

  • GOOGLE_CALENDAR_IDprimaryGoogle Calendar ID to use

    Google Calendar ID to use

  • GOOGLE_CLIENT_IDGoogle OAuth client ID

    Google OAuth client ID

  • GOOGLE_CLIENT_SECRETGoogle OAuth client secret

    Google OAuth client secret

  • GOOGLE_ENV_WORKSPACE_IDEnvironment-managed Google credentials workspace ID

    Environment-managed Google credentials workspace ID

  • GOOGLE_REFRESH_TOKENGoogle OAuth refresh token

    Google OAuth refresh token

  • MONITOR_DATABASE_URLMonitor database URL

    Monitor database URL

  • NEXTAUTH_SECRETFallback for AUTH_SECRET

    Fallback for AUTH_SECRET

  • NEXT_PUBLIC_APP_URLhttp://localhost:3000Canonical application URL

    Canonical application URL

  • NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEYStripe publishable key (test mode only)

    Stripe publishable key (test mode only)

  • OPERATOR_HEALTH_SECRETSecret for operator health checks

    Secret for operator health checks

  • OUTBOX_POLL_INTERVAL_MS5000Outbox poll interval in milliseconds

    Outbox poll interval in milliseconds

  • OUTBOX_WORKER_ENABLEDtrueEnable outbox worker for background jobs

    Enable outbox worker for background jobs

  • OUTBOX_WORKER_MODElocalOutbox worker mode

    Outbox worker mode

    values: local, dedicated

  • PAYMENTS_PROVIDERstubPayments provider (stub or stripe)

    Payments provider (stub or stripe)

    values: stub, stripe

  • PROXY_SHARED_SECRETShared secret for trusted proxy

    Shared secret for trusted proxy

  • RATE_LIMIT_HASH_SECRETRate limit hash secret

    Rate limit hash secret

  • RATE_LIMIT_MAX_BUCKETS100000Maximum rate limit buckets

    Maximum rate limit buckets

  • RATE_LIMIT_PROVIDERlocalRate limit provider

    Rate limit provider

    values: local, postgresql

  • SMTP_HOSTSMTP host

    SMTP host

  • SMTP_PASSWORDSMTP password

    SMTP password

  • SMTP_PORTSMTP port

    SMTP port

  • SMTP_TLS_MODEstarttlsSMTP TLS mode

    SMTP TLS mode

    values: starttls, implicit

  • SMTP_USERSMTP username

    SMTP username

  • STRIPE_CLAIMABLE_SANDBOXfalseEnable Stripe CLI claimable sandbox (non-production only)

    Enable Stripe CLI claimable sandbox (non-production only)

    values: true, false

  • STRIPE_SECRET_KEYStripe secret key (test mode only)

    Stripe secret key (test mode only)

  • STRIPE_WEBHOOK_SECRETStripe webhook secret

    Stripe webhook secret

  • TENANT_CONTEXT_SECRETTenant context secret

    Tenant context secret

  • TOKEN_ENCRYPTION_KEYreplace-with-64-random-hex-characters64 random hex characters for encrypting Google OAuth tokens at rest

    64 random hex characters for encrypting Google OAuth tokens at rest

  • TRUST_PROXYfalseTrust proxy headers

    Trust proxy headers

    values: true, false

  • WORKER_DATABASE_URLWorker database URL

    Worker database URL

  • WORKER_SHUTDOWN_TIMEOUT_MS30000Worker shutdown timeout in milliseconds

    Worker shutdown timeout in milliseconds

More in Calendar & Contacts

Rate this project

Click to rate — no account needed.

0 comments

Posting as guest
Loading comments…