← Babysitting Business Kit

Run your own server, step by step

The app works on its own in your browser. The optional server adds three things: your website's form turns each inquiry into a scored lead (with a phone alert, and an instant reply email if you want one), a calendar link your phone can subscribe to, and a morning to-do list. It runs on your hosting account. Nobody else, including the people who wrote it, can see your data or your bill.

If a friend is helping you, they can do steps 1 to 3; you only need the two keys at the end.

What it costs

HostWhat you pay forPer month
RenderStarter web service ($7) plus a 1 GB disk ($0.25 per GB)about $7.25
Fly.ioOne shared-cpu-1x machine with 256 MB, always on ($2.19) plus a 1 GB volume ($0.15 per GB)about $2.34
Your own computer or a VPSDocker Compose; whatever the box already costsvaries

Prices as published on render.com/pricing and fly.io/docs/about/pricing when this was written (October 2026). Check current pricing before you sign up; both need a card on file. Render's free plan has no disk, so leads would vanish when it restarts; that is why the kit asks for Starter. Email through Resend and phone alerts through ntfy.sh have free tiers; check theirs too.

Option A: Render (simplest)

  1. Make a free GitHub account if you do not have one.
  2. Open the one-click deploy page, choose Render, and follow it. It copies just this kit into a new repository in your GitHub account and opens Render with the kit's render.yaml. (Or fork the repository yourself and use https://render.com/deploy?repo=<your fork>.)
  3. Render shows the settings. It generates ADMIN_KEY and CAL_TOKEN for you. Leave the optional ones blank for now. Pick your time zone in TZ (for example America/New_York).
  4. Click Apply. The first build takes a few minutes. When it is live you get an address like https://babysitting-desk-xxxx.onrender.com.
  5. In the service's Environment tab, copy ADMIN_KEY and CAL_TOKEN into a password manager.

Option B: Fly.io (cheaper, needs the command line)

  1. Install flyctl and run fly auth signup (or fly auth login).
  2. Get the kit: download it from the deploy page (Fly.io) or copy the ventures/babysitting-business-kit folder, and open a terminal in it.
  3. Run, one line at a time (choose your own app name; Fly names are shared by everyone):
    fly launch --copy-config --no-deploy --dockerfile Dockerfile --name my-sitter-desk
    fly volumes create state --size 1 --region iad
    fly secrets set ADMIN_KEY=$(openssl rand -hex 16) CAL_TOKEN=$(openssl rand -hex 12)
    fly deploy
  4. Before fly secrets set, you can print the two values with openssl rand -hex 16 and openssl rand -hex 12, save them in a password manager, then paste them in. Fly will not show a secret again.
  5. Your address is https://my-sitter-desk.fly.dev. The kit's fly.toml keeps one machine always on, because your data lives on its volume and the morning digest needs it awake.

Option C: Docker on a box you already have

ADMIN_KEY=$(openssl rand -hex 16) CAL_TOKEN=$(openssl rand -hex 12) docker compose up -d

From the kit's folder, with docker-compose.yml. Put it behind HTTPS (Caddy, nginx or a tunnel) before families use the form.

Connect the app

Open your server's address in your browser: it serves the same app. In Settings, under "Sync with your own server", enter the address and your ADMIN_KEY, then press Sync now. Leads that arrive through your website are merged in; the key is kept in that browser only.

Connect your website form

Test it: fill in the form yourself. The lead should appear in the Leads tab after the next sync. The form has a hidden spam trap and accepts at most 10 messages an hour from one address.

Subscribe your phone's calendar

Your feed is https://your-address/calendar.ics?t=CAL_TOKEN (your own token in place of CAL_TOKEN). Anyone with that link can see your sits, so share it with no one.

Settings (environment variables)

VariableNeeded?What it does
ADMIN_KEYYesPassword for syncing, the API and the /admin page. 32 random characters.
CAL_TOKENFor the calendarThe secret part of your calendar link.
TZRecommendedYour time zone, e.g. America/Chicago.
DIGEST_HOURNo (7)Hour of the morning to-do list.
NOTIFY_WEBHOOK_URL, NOTIFY_FORMATNoPhone alerts: an ntfy.sh topic address (default format), or a Slack or Discord webhook.
RESEND_API_KEY, FROM_EMAIL, NOTIFY_EMAILNoEmail through your own Resend account; NOTIFY_EMAIL is where your alerts go and where families' replies land.
AUTO_REPLYNo (0)1 emails your reply draft to a family as soon as they ask (never to a lead the kit marks as a decline).
AUTO_FOLLOW_UPNo (0)1 emails due follow-ups with the morning digest.
BACKUP_S3_BUCKET, BACKUP_S3_ACCESS_KEY_ID, BACKUP_S3_SECRET_ACCESS_KEYNoA daily off-site copy to your own S3-compatible bucket (AWS S3, Cloudflare R2, Backblaze B2). Off until all three are set.
BACKUP_S3_ENDPOINT, BACKUP_S3_REGION, BACKUP_S3_PREFIXNoFor non-AWS buckets: the provider's S3 endpoint (https only) and region (R2 uses auto). Prefix defaults to babysitting-desk/.
BACKUP_DIR, BACKUP_KEEPNoWhere daily snapshots go (default: backups beside the state file) and how many to keep (14).
BOOK_WEEKSNo (2)How many weeks of open times the public /book page shows (1 to 8).
PUBLIC_URLFor automationsYour server's address (https://...): puts an unsubscribe link in automated emails and is the address Twilio's incoming-text webhook calls.
UNSUBSCRIBE_SECRETNoSigns unsubscribe links; defaults to ADMIN_KEY.
TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN, TWILIO_FROMNoTexts through your own Twilio account, for the automations you turn on in Settings. Families must have agreed to texts.
TWILIO_WEBHOOK_URLNoThe exact incoming-text URL Twilio signs, if it differs from PUBLIC_URL + /twilio/inbound.
STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRETNoOptional card payments on your invoices, into your own Stripe account. Both are needed: the secret key from your Stripe dashboard, and the signing secret (whsec_...) of a webhook endpoint you add at PUBLIC_URL/stripe/webhook for the checkout.session.completed event. A family's pay link then offers "Pay by card" (with an optional tip if you turn tips on), and the payment is recorded on the invoice once Stripe confirms it. Stripe charges you a fee per payment; check current pricing at stripe.com/pricing. Try it first with test-mode keys.
LLM_PROVIDER, LLM_API_KEY, LLM_MODEL, LLM_BASE_URLNoBlog drafts on your own model account (anthropic, openai, openai-compatible, ollama). Drafts wait for your approval.
ANTHROPIC_API_KEY, OPENAI_API_KEY, GEMINI_API_KEY, OLLAMA_HOSTNoAlternatives to LLM_PROVIDER: setting one of these picks that provider.
NETWORK_ID, NETWORK_PEERSNoThe sitter network handoff between two kit servers, off until set. NETWORK_ID is your server's short name (letters, digits, -); NETWORK_PEERS lists theirname=shared-secret pairs, one secret per pair of sitters, at least 16 characters (openssl rand -hex 16). Each side sets the other's name and the same secret. A handoff carries only a family's first name, the kids' ages and the time, signed with HMAC-SHA256, and only after you recorded the family's OK.
STATE, PORTSet for you/data/desk.json and 8080 in the container.

Late-sit safety check-in

The app's Safety tab can start a check-in before a late sit: a trusted contact and a "home by" time. It needs no new settings, only texts (TWILIO_ACCOUNT_SID and friends) or email (RESEND_API_KEY, FROM_EMAIL) already set up; with neither, the server refuses the check-in so you never rely on one that cannot fire. At the home-by time the server pings you (your NOTIFY_WEBHOOK_URL or NOTIFY_EMAIL) with your private link, PUBLIC_URL/safe/<token>, where you tap "I'm home safe", extend or cancel. After the grace period it texts or emails your contact your name, phone, the time and only the place you chose to share, never anything about the children, and an all-clear when you check in. Unlike the automations, it ignores quiet hours: a safety alert goes out at any hour. The server checks every minute, so an alert can be up to a minute late; it is a backup, not an emergency service.

Backups and the status page

You are the operator

Your copy runs on your account: you choose who sees it, you pay the host, and you keep the keys. Families' messages are stored in your server's file and only leave it through services you switch on. Keep the server updated by redeploying from the latest kit now and then.