Book the lakehouse โ€“ A beautiful OSS booking calendar for holiday homes Shrimbly released Book the Lakehouse, an open-source booking calendar application designed for families sharing a holiday home. The MIT-licensed tool, built with Next.js, React, Drizzle, Neon, and Vercel Blob, allows family members to claim dates on a shared calendar using a PIN, with optional cost tracking and payment prompts. The application includes a "Mary mode" admin area for trusted users to manage bookings and payments, and can be deployed through Vercel with automated setup scripts. MIT licensed /shrimbly/book-the-lakehouse/blob/master/LICENSE ยท built with Next.js, React, Drizzle, Neon, and Vercel Blob A small app for sharing the family holiday home without turning the family chat into a booking tribunal: a private calendar with a shared PIN, optional stay costs, bank transfer details, photos from the trip, and just enough ceremony to keep everyone honest. For families with a lakehouse, bach, cabin, cottage, or other beloved place that people take turns using. - Pick your identity, then claim dates on a spacious month calendar. - Edit and delete your own stays โ€” no global admin powers required. - Optional nightly costs, bank details, and a transfer prompt at booking time. Mary mode โ€” a quiet admin area where trusted users can tick off paid stays.- Profile and stay photos when Vercel Blob is configured. - Runs locally with demo data before you connect Neon. - Rename the place, people, footer, PIN, colors, and cookie prefix to suit your own family. - Agent-friendly: hand the codebase to an AI assistant, or run /setup or npm run setup to wire up database, storage, and family settings in one go. Mary mode is named for my aunt Mary, who embodies the idea of an admin far better than the word "admin" ever could. btl-1.mp4 If you have an AI coding assistant, type /setup in the chat. Otherwise run the interactive wizard: npm run setup It checks the Vercel CLI, walks you through linking the Neon Postgres and Vercel Blob integrations, pulls the connection strings down for you, prompts for your family-specific settings PIN, site title, nightly costs, bank details, admins , and runs the initial schema push and seed. Once it finishes, you're good to go. If you prefer to configure the application manually: - Fork and clone this repo. - Create a Vercel https://vercel.com/pricing project from your fork. The Hobby plan is a good starting point for personal use. - Add the Neon integration for Vercel https://vercel.com/marketplace/neon . It creates the Postgres database and wires the database environment variables for you. Neon's Free plan is fine for getting started. - Add the Vercel Blob integration https://vercel.com/docs/storage/vercel-blob if you want profile photos and stay photos. Vercel handles the Blob environment variable too. - Add your app-specific settings from .env.example , especially FAMILY PIN and the NEXT PUBLIC display text. - Run npm run db:push once, then npm run db:seed to add starter people and sample bookings. That is the whole shape of it: Vercel runs the app, Neon keeps the calendar, and Blob stores the nice little photos. For tinkering before deployment: git clone https://github.com/shrimbly/book-the-lakehouse.git cd book-the-lakehouse npm install cp .env.example .env.local npm run dev Open http://localhost:3000 http://localhost:3000 . With only .env.example copied, the app can render with demo data. Add DATABASE URL when you are ready for real bookings to stick around. Create .env.local in the project root: Most of the database, Blob storage, and Vercel-specific values can be created for you by the Vercel Neon and Vercel Blob integrations. Once they exist in Vercel, pull them down locally with: vercel env pull .env.local Then add the app-specific bits, like FAMILY PIN , display text, Marys, and any optional stay-cost details. FAMILY PIN=1234 DATABASE URL=postgres://... BLOB READ WRITE TOKEN=vercel blob rw ... BOOKING COST PER NIGHT=50 BOOKING COST CURRENCY=NZD PAYMENT ACCOUNT NAME="Lakehouse Account" PAYMENT ACCOUNT NUMBER="12-3456-7890123-00" PAYMENT REFERENCE="Lakehouse stay" PAYMENT NOTE="Please transfer after booking." MARY IDS=mary NEXT PUBLIC HOME NAME="Book the lakehouse" NEXT PUBLIC SITE DESCRIPTION="A private family booking calendar for the lakehouse." NEXT PUBLIC FOOTER TEXT="Book the lakehouse" NEXT PUBLIC REPO URL="https://github.com/shrimbly/book-the-lakehouse" COOKIE PREFIX=book-the-lakehouse Only FAMILY PIN is needed for the PIN gate. DATABASE URL enables the real database-backed calendar. BLOB READ WRITE TOKEN enables photos. BOOKING COST PER NIGHT turns on the cost and bank-transfer prompt. MARY IDS is a comma-separated list of person IDs for Marys, the admin users who can open /mary and check off paid stays. This project uses Drizzle with Neon Postgres. npm run db:generate npm run db:push npm run db:seed src/lib/data.ts contains the starter people and bookings used by both demo mode and npm run db:seed . Swap them out for your own family, then seed again. Run npm run db:push after pulling changes that add Mary mode, because bookings include a persisted payment settled checklist field. Useful database commands: npm run db:studio | Path | Purpose | |---|---| src/app/ | Next.js app route, metadata, and Server Actions. | src/app/mary/ | Mary mode checklist view for tracking stay payments. | src/components/ | Calendar, identity, PIN, photo, and month UI. | src/db/ | Drizzle schema, client, queries, and seed script. | src/lib/site.ts | Reusable site branding and cookie configuration. | src/lib/data.ts | Demo and seed data for people and sample bookings. | npm run dev Start the local Next.js dev server npm run build Build for production npm run start Run the production build npm run lint Run ESLint npm run db:generate Generate Drizzle migrations npm run db:push Push schema changes to DATABASE URL npm run db:seed Seed people and bookings from src/lib/data.ts | Tool | Why | |---|---| | Next.js 16 | App Router, Server Components, Server Actions, and metadata. | | React 19 | Client interactions for picking, dragging, uploading, and editing. | | Drizzle | Typed schema and query helpers for Postgres. | | Neon | Serverless Postgres that deploys cleanly on Vercel. | | Vercel Blob | Simple public image storage for profile and stay photos. | | Tailwind CSS 4 | Quiet, responsive styling with a small custom palette. | PRs are welcome, especially improvements that make the calendar easier for another family to adopt. Keep it small, private-by-default, and friendly to people who just want to book a weekend away without learning a new system. MIT.