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.
| Host | What you pay for | Per month |
|---|---|---|
| Render | Starter web service ($7) plus a 1 GB disk ($0.25 per GB) | about $7.25 |
| Fly.io | One 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 VPS | Docker Compose; whatever the box already costs | varies |
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.
render.yaml. (Or fork the repository yourself and use https://render.com/deploy?repo=<your fork>.)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).https://babysitting-desk-xxxx.onrender.com.ADMIN_KEY and CAL_TOKEN into a password manager.fly auth signup (or fly auth login).ventures/babysitting-business-kit folder, and open a terminal in it.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
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.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.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.
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.
https://your-address/site, with the form wired up. Share that link, or point your own domain at it.https://your-address/inquiry, then download the website again from the Website tab.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.
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.
| Variable | Needed? | What it does |
|---|---|---|
ADMIN_KEY | Yes | Password for syncing, the API and the /admin page. 32 random characters. |
CAL_TOKEN | For the calendar | The secret part of your calendar link. |
TZ | Recommended | Your time zone, e.g. America/Chicago. |
DIGEST_HOUR | No (7) | Hour of the morning to-do list. |
NOTIFY_WEBHOOK_URL, NOTIFY_FORMAT | No | Phone alerts: an ntfy.sh topic address (default format), or a Slack or Discord webhook. |
RESEND_API_KEY, FROM_EMAIL, NOTIFY_EMAIL | No | Email through your own Resend account; NOTIFY_EMAIL is where your alerts go and where families' replies land. |
AUTO_REPLY | No (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_UP | No (0) | 1 emails due follow-ups with the morning digest. |
BACKUP_S3_BUCKET, BACKUP_S3_ACCESS_KEY_ID, BACKUP_S3_SECRET_ACCESS_KEY | No | A 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_PREFIX | No | For non-AWS buckets: the provider's S3 endpoint (https only) and region (R2 uses auto). Prefix defaults to babysitting-desk/. |
BACKUP_DIR, BACKUP_KEEP | No | Where daily snapshots go (default: backups beside the state file) and how many to keep (14). |
BOOK_WEEKS | No (2) | How many weeks of open times the public /book page shows (1 to 8). |
PUBLIC_URL | For automations | Your server's address (https://...): puts an unsubscribe link in automated emails and is the address Twilio's incoming-text webhook calls. |
UNSUBSCRIBE_SECRET | No | Signs unsubscribe links; defaults to ADMIN_KEY. |
TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN, TWILIO_FROM | No | Texts through your own Twilio account, for the automations you turn on in Settings. Families must have agreed to texts. |
TWILIO_WEBHOOK_URL | No | The exact incoming-text URL Twilio signs, if it differs from PUBLIC_URL + /twilio/inbound. |
STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET | No | Optional 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_URL | No | Blog 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_HOST | No | Alternatives to LLM_PROVIDER: setting one of these picks that provider. |
NETWORK_ID, NETWORK_PEERS | No | The 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, PORT | Set for you | /data/desk.json and 8080 in the container. |
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.
desk.json.corrupt-<time>, logs that, and starts from the newest good snapshot.https://your-address/admin asks for your admin key and shows the version, lead counts, the last morning digest, which integrations are on (names only, never values), disk use, and the snapshots, with buttons to download one or restore from it or from a file. A restore saves the current desk first.BACKUP_S3_* settings, or download a backup from /admin now and then.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.