Book meetings. Get signatures. One tool, $5/mo.
- Shareable booking pages with custom branding
- Multiple event types (different durations, locations, custom questions)
- Google Calendar OAuth + 2-way sync (avoid double-booking)
- Outlook/Office 365 calendar sync (Microsoft Graph API)
- Multi-calendar conflict detection — connect multiple calendars, prevent double-booking across all of them (docs)
- Availability engine — working hours, day-specific rules, buffer time, daily/weekly limits
- Timezone auto-detection + display for bookers
- Video conferencing — auto-generate Zoom & Google Meet links
- Email confirmations + reminders (Amazon SES)
- SMS reminders (Twilio)
- Reschedule/cancel — self-service links for bookers
- Custom intake questions on booking page
- Embed widget (iframe + JS snippet)
- Custom branding (logo, colors)
- Payment collection via Stripe for paid bookings
- Webhooks + REST API
- Collective scheduling (find time across multiple hosts)
- Next.js 14 (App Router, TypeScript)
- Neon serverless PostgreSQL + Prisma ORM
- Auth.js v5 (Google OAuth)
- Stripe subscription billing ($5/mo or $48/yr)
- Landing page (conversion-focused)
- User dashboard + settings
- Frontend: Next.js 14, React, Tailwind CSS
- Backend: Next.js API routes
- Database: Neon serverless PostgreSQL + Prisma
- Auth: Auth.js v5 (Google OAuth)
- Payments: Stripe
- Email: Amazon SES via Nodemailer
- SMS: Twilio
- Calendar: Google Calendar API, Microsoft Graph API
- Video: Zoom API, Google Meet (via Calendar API)
# Install dependencies
npm install
# Set up environment variables
cp .env.example .env
# Fill in your API keys
# Set up database
npx prisma migrate dev
# Generate Prisma client
npx prisma generate
# Run development server
npm run devSee .env.example for all required variables. Key variables:
AUTH_SECRET— Auth.js session encryption key (generate withnpx auth secret)GOOGLE_CLIENT_ID/GOOGLE_CLIENT_SECRET— Google OAuth credentialsDATABASE_URL— Neon PostgreSQL connection stringNEXTAUTH_URL— App URL for Auth.js callbacks
All API requests require Authorization: Bearer <user-id> header.
GET /api/v1/event-types— List all event typesPOST /api/v1/event-types— Create event type
GET /api/v1/bookings— List bookings (supports?status=,?from=,?to=filters)
PATCH /api/calendar-connections/:id— Update connection settings (label, checkConflicts, isPrimary)DELETE /api/calendar-connections/:id— Disconnect a calendar
See Multi-Calendar Support for details.
Configure webhooks in the dashboard. Events:
booking.createdbooking.cancelledbooking.rescheduled
Webhook payloads include X-Webhook-Signature header (HMAC-SHA256).
TinyCal deploys on AWS Amplify with Neon serverless PostgreSQL:
Infrastructure:
- AWS Amplify — Next.js SSR hosting with auto-scaling
- Neon — Serverless PostgreSQL database
Deployment:
# Amplify automatically deploys on:
# - Push to main -> Dev
# - Tag v1.2.3-qa -> QA
# - Tag v1.2.3 -> Prod (requires approval)Account Structure:
| Environment | Deploy Trigger | Account |
|---|---|---|
| Dev | Push to main |
TinyCal-Dev |
| QA | Tag v*-qa |
TinyCal-QA |
| Prod | Tag v* |
TinyCal-Prod |
docker build -t tinycal .
docker run -p 3000:3000 --env-file .env tinycal<iframe src="https://your-domain.com/your-slug"
style="width:100%;height:700px;border:none;"
loading="lazy"></iframe><script src="https://your-domain.com/embed.js"
data-user="your-slug"></script>MIT