Thnkrr: Swappable Suppliers

9 October 2026. Research and recommendations. Nothing in here is built yet.

What this document is for

Thnkrr runs on other companies' services: Amazon for the servers, database, files, email and the AI check; GitHub for the code; and a few more. This document answers three questions for every one of those suppliers:

  1. What do we use it for, and what would break for a student if it stopped?
  2. What else could do the same job, at the same price or better?
  3. How would we switch, without taking the site down, and how long would it take?

The goal is the one big companies work to: no supplier should be able to hold us hostage. If a price doubles, a service is retired, a company changes its rules on children's data, or an account is frozen, we switch, and students never notice. The companion file PROVIDER-SWAP-PLAN-2026-10-09.md is the step-by-step build plan for an AI coding agent. It waits for your approval.

This document was written alongside PRODUCTION-RESEARCH-2026-10-09.md and PRODUCTION-PLAN-2026-10-09.md (the production deployment work). It does not replace them. It adds the "and we can leave" layer on top of whatever shape that plan lands on.


The one-minute version


Words used in this document

WordWhat it means
Supplier / providerA company whose service we rent: Amazon, GitHub, an email sender
Connector (adapter)A small piece of our code that talks to one supplier. The rest of the app only talks to the connector. Swapping suppliers means writing or choosing one connector, not changing the app
Open standard / protocolAn agreed language many suppliers speak. S3 (files), SMTP (email), Postgres (database), OpenTelemetry (logs and measurements), OCI (packaged app images). If we speak the standard, we can change who listens
SettingsValues the app reads when it starts (addresses, names, keys). A swap that is "a settings change" needs no new code
Stand-inA free, local copy of a supplier's service that runs on a developer's laptop and in automated tests. It proves daily that the connector works without that supplier
Dual-runRunning the old and new supplier side by side for a while, comparing results, before switching
CutoverThe moment traffic moves from old to new
Warm spareA second supplier's account, set up and tested, costing nothing or almost nothing until used
Exit drillPractising a switch on a test copy, with a timer, and writing down what happened
Lock-inWhen leaving a supplier would be so expensive or slow that we can't
Egress feeWhat a cloud charges to copy your data out
RegionA group of a supplier's data centres in one place. Ours is Amazon's US East (Virginia)

How the big companies do it, and what we take from each

What follows is what these companies have said publicly. It is a mix of good examples and honest warnings.

LinkedIn. Announced in 2019 that it would move everything to Microsoft's cloud (Azure). Shelved the move in 2022 and 2023 and stayed in its own data centres. The lesson is not "don't move"; it is that even a company owned by the cloud provider found a wholesale move too hard. What LinkedIn does well is layers: its apps talk to in-house systems (Espresso for data, Kafka for messages, Ambry for files, Nuage as a self-service portal), never to a vendor directly. It also tests every release with a canary: a small copy gets real traffic first and is compared against the old version for 30 minutes before the rest follow, and "dark canaries" receive copied traffic whose answers are thrown away.

Netflix. Fully on Amazon since 2016, and open about it: it does not try to be cloud-neutral. Instead it runs in several Amazon regions at once so one region failing is survivable, and it runs its own delivery network (Open Connect) for video, the one part of the bill that would otherwise be ruinous. Its deploy tool, Spinnaker, can target any cloud. The lesson: pick the one or two costly or risky parts and make those swappable; accept the rest.

Spotify. Moved from its own data centres to Google's cloud in 2016 to 2018. It did the move service by service, user-facing parts first, with no redesign during the move, and ran data and services as two separate programmes. About two years of preparation.

Dropbox. Moved 90% of its file storage off Amazon S3 onto its own hardware (2015 to 2016), and later reported about $75 million saved over two years. Possible only because its file layer already sat behind its own interface.

37signals (Basecamp). Left the cloud between 2022 and 2025. The yearly bill fell from about $3.2 million to $1.3 million, then the remaining storage moved too. Amazon waived about $250,000 in egress fees for the final copy-out. They built a small, open deploy tool, Kamal, that puts a packaged app on any Linux server with zero downtime and a one-command rollback. It is the closest open tool to what our deploy script does today, and it works on any provider.

Figma and Pinterest, the counter-examples. Figma's 2025 stock-market filing says its platform is "designed specifically to run on AWS" and commits it to at least $545 million over five years. Pinterest has a $3.25 billion Amazon commitment through 2029. Both are fine businesses. Both have given up the option to leave.

What regulators now demand. Europe's rules for financial firms (DORA, in force since 17 January 2025) require a written and tested exit strategy for every important outside service. Europe's Data Act (12 September 2025) forces cloud providers to make switching possible and bans switching charges, including egress fees for leaving, from 12 January 2027. Amazon, Google and Microsoft already waive egress fees for customers who leave. These rules don't apply to us, but they define what "industry standard" means now: a written exit plan per supplier, tested on a schedule.

The patterns we adopt, in plain words:

PatternWhat it means for us
Backing services are attachable (the "twelve-factor" rule)The app must not be able to tell a local stand-in from the real supplier. Only the settings differ
Ports and adaptersOne connector per supplier type, one interface the app uses. We already do this for files, email, AI, speech and the guardian check
Expand, migrate, contractFor data moves: set up the new place, copy and keep in sync, switch readers, switch writers, then retire the old. Never a big-bang
Dual-run and shadow trafficBefore trusting a new AI model or email sender, run it beside the old one on real items and compare
DNS as the switchOur addresses (thnkrr.com, media.thnkrr.com) are ours. Lower the address's cache time a day before, point it at the new place, keep the old place alive for a day
Backups outside the providerA copy of every backup at a second company, in a format anyone can read
Exit drills on a calendarEach switch practised on a test copy at least twice a year, timed, written down
A supplier registerOne page listing every supplier, what it holds, the fallback, the last drill date. The same list feeds the public supplier (subprocessor) page schools will see

Everything we depend on today

"Swap today" is how long a switch would take right now, with the code as it is. "After the plan" is after the companion plan is built.

WhatSupplier todayOpen standard?Swap todayAfter the plan
The server the app runs onAmazon EC2 (one machine)Yes: plain Linux1 to 2 days by handAbout 1 hour
The databaseAmazon RDS (Postgres 16)Yes: Postgres1 day, with an outageUnder 1 hour of read-only time
Photo and video filesAmazon S3Yes: S3 languageHours (copy) + a settings changeSame, practised
Delivery network and website hostingAmazon CloudFront + S3Partly: the routing rule and the purge are Amazon-specific1 day1 hour (DNS switch)
EmailAmazon SESYes: SMTP1 hour + a day for the new sender's domain setupMinutes (spare pre-verified)
AI writing checkAmazon Bedrock (gpt-oss-safeguard-20b)Partly: Amazon's own API, but an open-standard API exists tooA model change is one setting; a provider change is a new connectorOne setting, within our allowed list
Picture checkNone yet (Rekognition decided)No connector existsNot applicableOne setting
Speech-to-textWhisper on our own serverYes: open modelAlready oursUnchanged; a cloud fallback adapter added
Video conversionffmpeg on our own serverYes: open softwareAlready oursUnchanged
Domain and DNSUnknown registrar; DNS not yet decidedYes: DNSHoursMinutes (zone kept in code)
HTTPS certificatesLet's Encrypt via CaddyYes: ACMEAutomatic fallback alreadyUnchanged
Code hosting and tests (CI)GitHubPartly: Git yes, Actions noDaysHours (mirror ready, thin workflows)
Getting code onto the serverBash script over Amazon Session ManagerNoRewriteSame packaged image on any host
Secrets (passwords, keys)One locked file on the serverPortable, but by handHoursMinutes (encrypted in the repo)
Logs, alarms, errors, uptimeNot built; Amazon CloudWatch plannedPlanned as Amazon-onlyNot applicableAny backend (OpenTelemetry)
BackupsRDS automatic backups onlyAmazon-onlyNot possible outside AmazonNightly copy at a second company
Child-safety and identity vendorsHive or Thorn (quote), WebPurify (quote), Checkr, DigiLocker (2027)Each proprietaryContract-levelBehind connectors where they touch code
Laptop and test stand-insMinIO (files), Mailpit (email), Docker PostgresYesMinIO is now unmaintained (see below)Replaced

Part by part

Each section says: what we use, what a switch looks like for students, the realistic alternatives, what must be true in the code, and how long. Prices are list prices seen on 9 October 2026 unless marked "unverified". Our usage is tiny, so the differences are a few dollars; what matters more is the rules each company applies to children's data.

1. The server the app runs on

Today: one Amazon EC2 machine (2 processors, 4 GB memory, about $25 a month plus disk and a fixed address). The production plan proposes Amazon's container service (Fargate) instead. Either way the app is a plain Node program on Linux.

What a switch looks like: we package the app once as a standard container image (an "OCI image", the same format every cloud and every laptop runs). The same image runs on an Amazon container service, on a rented Linux machine at any company, or on a laptop. Moving host = run the image somewhere else, point the address at it.

Alternatives for one always-on machine of about this size:

CompanyAbout a monthNotes
Amazon EC2 t4g.medium (today)$25 + disk + addressARM chip, cheap; our credits pay it
DigitalOcean (2 processors, 4 GB)$24Official price. Per-second billing since January 2026. New York and Bangalore
Linode / Akamai (2 processors, 4 GB)$24Official price. Washington DC, Newark, Atlanta; Mumbai and Chennai
Vultr Regular (2 processors, 4 GB)$20 (High Performance line: $24)Third-party listing; Vultr's own page blocks readers. Has Mumbai
Hetzner (US, Ashburn)CPX11 (2 processors, 2 GB) $20.49; CPX21 (3 processors, 4 GB) $37.49Official, after the 15 June 2026 rise (CPX11 was $6.99). The cheap CX and ARM lines are not sold in the US. No longer a bargain here
Google Compute e2-medium (2 processors, 4 GB)$24.46 (South Carolina) to $27.55 (Virginia)Third-party price tracker, 4 October 2026
Microsoft Azure B2ls v2 (2 processors, 4 GB)about $30Third-party calculator, July 2026
Oracle Cloud "Always Free" ARM$0Official: 2 processors and 12 GB in total, 200 GB disk, 20 GB file storage. Reclaimed if idle (under 20% use for 7 days); home region only; capacity often short
Fly.io, Render, Railway$22 to $25Zero-upkeep hosts; Fly changed prices 1 October 2026; Render cut included bandwidth 20× in August 2026

Rule that stays: the app must keep running all the time, because the review queue runs inside it. Any host that "sleeps when idle" is out.

What must be true in code: a container image built in CI; a deploy tool that works on any Linux machine (Kamal 2 is the recommendation: free, open, zero-downtime, one-command rollback, automatic HTTPS, used by 37signals for their own exit); the existing single-server files kept as the fallback. Time to build: 2 days. Time to switch after: about 1 hour.

2. The database

Today: Amazon RDS running Postgres 16. Postgres itself is open software; only the hosting is Amazon's. Our search needs two standard Postgres add-ons (pg_trgm, citext); every host below supports them.

What a switch looks like: Postgres can copy itself to another Postgres live ("logical replication"). We set up the new database, let it catch up, then make the old one read-only for a few minutes, point the app at the new one, done. Tools: Postgres's own replication, or pgcopydb, which a company used in March 2026 to move 1 TB from Amazon to Microsoft with a cutover of minutes. Things that don't copy automatically and must be scripted: sequence counters, and the schema itself (we have it in our migration files already).

Alternatives (about 1 to 2 GB memory, backups to any minute):

CompanyAbout a monthNotes
Amazon RDS db.t4g.micro (today)$12 + $2 diskOur credits pay it
DigitalOcean Managed Postgres 1 GB$15Per-minute billing since 2026; HA doubles it
Microsoft Azure Flexible B1ms$121 processor, 2 GB; Central India available
Google Cloud SQL db-f1-micro / g1-small$8 / $26Mumbai available
Crunchy Bridge (Postgres specialists)from $10Runs inside AWS, Azure or Google regions
Neonabout $19 always-on + storagePay-per-hour; must turn off auto-sleep, or our queue stalls
Supabase Pro$25, includes the smallest ("Micro") databaseOfficial. The free plan pauses after a week idle, so only Pro fits us
AivenFree (1 GB, no choice of cloud); $12 Hobbyist on DigitalOcean, Google or OVH; $75 if it must run inside AWSOfficial
Tiger Data (Timescale)$30 + $0.177 per GBOfficial. Time-series specialist; fine as plain Postgres
Postgres on our own server$0 extraWe'd own backups and upgrades; not recommended for minors' data

What must be true in code: nothing new in the app (it already takes a database address). What's missing is a backup we own: a nightly export in the standard pg_dump format, encrypted, copied to a second company's storage, plus a restore drill. Time to build: 1 day. Time to switch after: under an hour of read-only time, or hours from a backup.

3. Photo and video files

Today: two private Amazon S3 buckets. The code speaks the S3 language, not "Amazon". Database rows store file names, never full addresses, so the storage company can change without touching data.

What a switch looks like: copy the buckets with rclone (free, open), then change one setting. During the copy, new uploads go to both (dual-write) or the new place pulls files on demand (Cloudflare's "Sippy" does this). Students see nothing.

Alternatives that speak S3:

CompanyStorage per GB-monthDownload feeLegal-hold lockUS East / IndiaNotes
Amazon S3 (today)$0.023$0.09 after 100 GBYes (Object Lock)Yes / Yes
Cloudflare R2$0.015$0Bucket-level locks only, no per-file holdNo regions; "US" hint only, no IndiaFree delivery pairs with free CDN
Backblaze B2$0.00695 (rose 1 May 2026)Free up to 3× storedYes, per fileVirginia / no IndiaCheapest with real lock; best for backups
Wasabi$0.008 (rose July 2026)$0, fair useYesVirginia / unverified1 TB minimum bill, 90-day deletion charge
Google Cloud Storage$0.020$0.12YesYes / MumbaiS3 mode exists
DigitalOcean Spaces$5 for 250 GB1 TB includedNoNew York / Bangalore
Microsoft Azure Blob$0.018$0.087YesYes / Central IndiaDoes not speak S3: needs a translation layer or code change
Hetzner, Scalewayabout $5 baselowYesEU onlyNot for US students

Two things to know. First, the law-related holds: anything linked to a child-safety case must be kept a year and never deleted by a reviewer. Today that hold lives in our database, not in the storage company's lock, so R2's weaker lock is fine for live media. The future "archive" plan wants a true lock, so backups and archives should go to B2, Wasabi or S3, not R2. Second, no copy tool preserves a lock; after any copy, the lock must be re-applied.

MinIO, our laptop stand-in, is dead. The free MinIO stopped shipping in October 2025 and its code was archived in April 2026; the images we pull are a third party's frozen build with no security fixes. Replacements for laptops and tests: Garage (small, S3-speaking, no versioning or lock, fine for dev), SeaweedFS (has lock), or simply R2's free 10 GB for CI.

What must be true in code: already true. Add a conformance test that runs our storage connector against any S3 address and reports pass or fail, so a new company is proven in minutes. Time to build: half a day. Time to switch after: copy time plus minutes.

4. Delivery network and the website files

Today: Amazon CloudFront in front of the files and the website. Three Amazon-specific pieces: the rule that sends app pages to index.html (a "CloudFront Function"), the purge call when a photo is taken down (needed for the 2-hour legal clock), and a secret header CloudFront adds so the API believes the visitor's address.

What a switch looks like: a delivery network is a layer in front of our own addresses. Switching is a DNS change plus warming the new cache. The three Amazon-specific pieces each need an equivalent on the new network.

CompanyPricePurgePrivate-bucket accessApp-page routing
Amazon CloudFront (today)First 1 TB a month freeAPI, free to 1,000 paths a month, minutesYes (OAC)CloudFront Function
Cloudflare (free plan)$0API, 1,000 URLs a minute, secondsYes, when paired with R2Pages or a Worker
Bunny.net$0.01 per GB, $1 minimumAPI, tag or URLYes (Storage Zone or S3 origin)Edge rules
Fastly, AkamaiEnterpriseFastYesYes
Google Cloud CDN, Azure Front DoorUsageSlower purgeYesYes

What must be true in code: the purge connector gets a Cloudflare and a Bunny adapter beside the CloudFront one; the "which header carries the visitor's address" rule becomes a setting; the website publish step becomes a script with one adapter per host. Time to build: 1 to 2 days. Time to switch after: about an hour, plus DNS cache time.

5. Email

Today: Amazon SES, through plain SMTP. Switching the sender is literally one setting. The catch is not the code: a new sender must prove it owns thnkrr.com (DNS records) and build a reputation, which takes a day to set up and should be done before it is needed. The guardian consent email is a legal instrument, so deliverability is the whole game.

CompanyAt our volume (about 5,000 a month)Keeps message text?WhereNotes
Amazon SES (today)about $0.50; new accounts from July 2026 start on a $0.16-per-1,000 planNo body kept by default; archiving is a separate opt-in featureChoose region (US East, Mumbai)
Postmark$15 for 10,00045 days, cannot be shortened below 7US only (Chicago area and AWS); Postmark says it has no plans for EU serversBest deliverability reputation
ResendFree to 3,000; $20 for 50,00030 days unless a $50-a-month add-onUS only
Mailgun$15 for 10,0001 to 5 days on cheap plansUS or EU
Brevo, Mailjet, ScalewayFree to $15Not statedEU onlyFine for EU, not our first pick
SendGrid$20 for 50,0003 days of logsUSKilled its free plan in 2025
Zoho ZeptoMail$2.50 per credit of 10,000 (price from third-party listings; Zoho's page confirms the credit size, a free first credit, and a 6-month expiry)Not found"Available across all regions" (Zoho runs US, EU, India data centres)Cheapest; credits expire
Self-hosted (Postal)Server costWe controlAnywhereWe'd own the sending reputation; not recommended

Recommendation for the warm spare: Postmark or Zoho ZeptoMail, domain verified in advance, chosen on retention terms (ask Postmark for the 7-day setting).

What must be true in code: nothing. Add a mail:check script that confirms the DNS records (SPF, DKIM, DMARC) for the active and spare sender. Time to build: half a day. Time to switch after: minutes.

6. The AI writing check

Today: Amazon Bedrock running an open model (gpt-oss-safeguard-20b), with Amazon set to keep nothing. The code has one interface and three connectors (Bedrock, a laptop-only Anthropic one that production refuses, and "none"). The model name is stamped on every verdict, and a daily check keeps the backup models reachable. This is already the best-designed seam in the codebase.

Our rule stands: student writing goes only to a model running inside a cloud account we already hold, with zero retention and a written no-training promise. Never to a model company's own API. So the realistic fallbacks are other big clouds' model services and our own server, not Groq or Together, however cheap.

Where the same model can runHas gpt-oss-safeguard?Price per million words-ish (in / out)Retention termsFits our rule?
Amazon Bedrock (today)Yes$0.07 / $0.20None, by settingYes
Microsoft Azure AI FoundryYes (catalog)120b: $0.15 / $0.60Abuse monitoring may store flagged prompts for human review unless Microsoft grants an exemptionYes, only with the exemption
Google Vertex AINo (plain gpt-oss yes)$0.15 / $0.60Zero retention needs an abuse-monitoring exception via account teamYes, with exception; different model
Oracle OCINo (plain gpt-oss yes)Per tokenStandard no-trainingYes; different model; has Hyderabad
Our own GPU server (vLLM)Yes (open weights)about $0.50 to $0.80 an hour, 24/7 ≈ $350 to $600 a monthOursYes; expensive while idle
Groq, Fireworks, DeepInfra, TogetherSome$0.03 to $0.30Good zero-retention optionsNo: a new company would see children's writing

The one portability trick worth doing: Bedrock now also answers in the industry-standard "OpenAI-compatible" API that every other host above speaks. Our Bedrock connector today uses Amazon's own API (Converse). Adding a second, generic connector that speaks the standard API to any allowed address means a provider switch becomes a settings change. Production keeps an allow-list of addresses so no setting can send writing to an unapproved company.

What must be true in code: the generic connector; the allow-list; the daily keep-alive generalised to any connector; the model-comparison script (already exists) run before any switch. Time to build: 1 to 2 days. Time to switch after: a setting, after the comparison passes.

7. The picture check (not built)

Today: people check every photo and video. Amazon Rekognition was chosen for later. The architecture docs describe an imageScreen connector; the code has none.

ServicePer 1,000 imagesFree tierNotes
Amazon Rekognition$1.00 (+$1.00 for text in image)5,000 a month, first yearDefault keeps images to improve Amazon's AI; must opt out account-wide first
Google Vision SafeSearch$1.501,000 a monthGood terms, official: images are processed in memory and not written to disk; Google does not use them to train Vision
Microsoft Azure Content Safetyabout $0.75 per 1,000 images (third-party; Microsoft's page hides the figure)5,000 a month, officialBest data terms (nothing stored, nothing trained); narrower categories, no text-in-image
Hive$3.00 (+$2.00 text)Trial creditMost detailed categories. Its public privacy policy says nothing about retention or training and allows storage "in the United States or other countries"; terms would have to be negotiated
Sightengine$29 for 10,000 operations2,000 a monthEU company. Offers an "delete immediately" setting and a data agreement; region choice only on enterprise plans; no explicit no-training promise found
WebPurify$2.60 automatic; $20 humanFounder has asked for a quote
Open-source on our server (NudeNet and similar)$0Nudity only; misses much; keep humans

What must be true in code: build the connector with a "send to a person" default and one real adapter; a provider setting. Time: 1 day for the seam, 1 day per adapter.

8. Speech-to-text and video conversion

Both run as open software on our own server (Whisper, ffmpeg). Nothing to swap away from. The production plan proposes moving speech to Amazon Transcribe for speed; that is fine as long as it goes behind the existing speech connector so Whisper stays the fallback. Cloud options, if we ever need them: Amazon Transcribe (official: $0.006 a minute for batch, $0.01 for live, 60 free minutes a month in the first year; the account-wide opt-out of data use is required first), Google (from $0.003 a minute, no logging by default), Microsoft Azure Speech. For video conversion, the only services that read from any S3 storage are Coconut, Qencode and Transloadit (about $0.0075 to $0.015 a minute). Mux, Bunny Stream and Cloudflare Stream keep the output on their side, which is lock-in; Amazon MediaConvert and Google only read their own storage.

9. Domain, DNS and certificates

Today: the domain's registrar and DNS host are not yet confirmed (an open item in docs/27). Certificates come from Let's Encrypt through Caddy, which already falls back to a second free authority (ZeroSSL) on its own.

The standard practice: keep the DNS zone as a text file in the repository and push it to whichever DNS company is active (open tools: DNSControl or OctoDNS). Then a DNS company switch is a one-line change, and the zone can never be lost with an account.

CostAPINotes
Amazon Route 53$0.50 a zone + $0.40 per million lookupsYesNatural if the site stays on Amazon
Cloudflare DNS$0YesFastest, free, DNSSEC included
DNSimple, NS1, deSEC$0 to $6YesdeSEC is a non-profit
Registrar: Cloudflare, Porkbun, Namecheap, Gandiat cost to $15 a yearKeep the registrar separate from the hosting company

10. Code hosting, tests and the packaged image

Today: GitHub holds the code and runs the tests (Actions). GitHub cut its hosted-runner prices in January 2026 and postponed a planned charge for self-hosted runners. Fine to stay. The risk is concentration, not price.

Standard practice: a nightly mirror of both repositories to a second host (GitLab, Codeberg, or a plain Git server), and workflows that only call our own scripts (pnpm ci:local already mirrors CI), so they port in hours. Container images pushed to two registries (GitHub's free one and Amazon's). Alternatives for CI: GitLab (400 free minutes), Woodpecker (free, self-hosted), Forgejo Actions (reads GitHub workflow files with small differences). Earthly, often suggested, shut down in 2025.

11. Secrets

Today: one locked file on the server, typed by hand. Portable in theory, but it lives in one place, and the production plan's move to Amazon Secrets Manager would tie it to Amazon.

Standard practice for a small team: secrets encrypted inside the repository with SOPS and age (free, open), decrypted at deploy time on whatever host. Alternatives: systemd's own encrypted credentials; 1Password or Bitwarden Secrets Manager (Kamal reads both directly); OpenBao (the open fork of Vault) if we ever need rotation and audit. Avoid a cloud's own secret store unless it sits behind a one-line loader we can replace.

12. Logs, alarms, errors, uptime and status

Today: nothing beyond the server's own log. The production plan proposes Amazon CloudWatch with Amazon's log format for metrics. That works, but it is the single most common lock-in in small companies.

Standard practice: the app emits logs, measurements and traces in OpenTelemetry (the open standard; traces and metrics are stable in the Node library, logs are still maturing), through a small collector that forwards to whichever backend we choose. Change the backend, change one line in the collector. Errors go through the Sentry format, which the open GlitchTip and Bugsink also accept.

NeedOptionsCost
Logs, metrics, traces backendAmazon CloudWatch; Grafana Cloud (free: 50 GB logs, 10,000 series); Honeycomb (free 20 million events); Axiom (free 500 GB); SigNoz (free self-hosted)$0 to $25
ErrorsSentry (free 5,000 errors; $26 team); GlitchTip (free self-hosted, $15 hosted); Bugsink (one container)$0 to $26
Uptime check from outside AmazonUptimeRobot (free 50 checks); Better Stack (free 10); Checkly; Gatus or Uptime Kuma self-hosted$0
Status pageInstatus (free); Better Stack (free 1); Upptime (free on GitHub)$0
PagingPagerDuty (free 5 users); incident.io (free basic); Grafana IRM (free 3 users). Opsgenie ends April 2027$0

The uptime check and status page must live outside Amazon, or they go dark with it.

13. Backups

Today: Amazon's automatic database backups, 7 days. Nothing outside Amazon. If the Amazon account were frozen or deleted, every photo, post and consent record would be gone.

Standard practice (3-2-1): three copies, two kinds of storage, one at a different company. For us: Amazon's own backups, plus a nightly encrypted pg_dump and a nightly file sync to Backblaze B2, plus a restore drill every quarter that times a full restore onto a test host at a different company. Tools: pg_dump and rclone, or pgBackRest for continuous backup (archived by its maintainer in April 2026 and revived in May 2026 under a coalition including AWS and Supabase). Cost at our size: about $1 to $5 a month.

14. Child-safety and identity vendors

These are contracts more than code. What we can do in code is keep each behind a connector with a "people do it" default, which already exists for the guardian adult check.

NeedVendorsSwappable?
Child-abuse image matchingMicrosoft PhotoDNA (free, vetted), Google CSAI Match (free, vetted), IWF list (£5,000+ a year), NCMEC hash sharing (free), Cloudflare's scanning tool (free with Cloudflare)Several free sources; one connector
Grooming and new-content detectionThorn Safer (list $30,720 a year), HiveContract; keep the human queue as the default
Human review vendorWebPurify ($0.02 an image)Contract; results arrive through one interface
Staff background checksCheckr ($29.99), Certn ($49.99), GoodHire ($29.99), Sterling (quote)Any; no code
Guardian adult check (India, from 13 May 2027)DigiLocker (named in the law), plus IDfy, Signzy, HyperVerge (India), Veriff ($0.80), Persona ($250 a month minimum)Connector exists; one adapter per vendor
Reporting to NCMECNCMEC onlyNot swappable: the law names it

Things we accept are not swappable


What the plan would build, in order

  1. Backups outside Amazon and a restore drill. The one step that removes the catastrophe. 1 day.
  2. The missing seams: the picture-check connector, the generic AI connector with an allow-list, Cloudflare and Bunny purge adapters, a configurable visitor-address header. 3 to 4 days.
  3. The packaged app (container image) and Kamal as the any-host deploy path, beside the existing files. 2 days.
  4. Website publish script with an adapter per host. 1 day.
  5. Secrets in the repository, encrypted. Half a day.
  6. OpenTelemetry for logs, measurements and traces, with Sentry-format errors. 2 days.
  7. DNS zone in the repository; registrar confirmed. Half a day.
  8. Repository mirrors, two image registries, thin CI workflows. Half a day.
  9. Supplier register (internal page plus the public supplier list), providers command that prints what is live and whether each is reachable, and a drill calendar. 1 day.
  10. The first exit drills on a test copy, timed and written down: storage to R2, email to the spare, AI to the backup model, delivery network to Cloudflare, host to a rented machine, database restore from the off-site copy. 3 days.

About 3 to 4 weeks of agent work, interleaved with the production plan's phases.

What it costs

ItemA month
Off-site backups (Backblaze B2, about 100 GB first year)about $1, rising to $5
Cloudflare account (DNS, CDN, R2 free tier)$0
Spare email sender, verified, idle$0 (Postmark free developer tier) or $0 (ZeptoMail first 10,000 free)
Uptime check and status page outside Amazon$0
Logs and errors backend, free tiers$0, up to $25 if we outgrow them
Totalabout $1 to $15

Against that: a switch that today would take days of hand work and an outage becomes an hour; a frozen account becomes a bad day instead of the end of the data; and every school asking "what happens to our students' data if your provider fails?" gets a written, practised answer.


Decisions for the founder and CTO

Product and money decisions. Everything else follows from them.

#DecisionRecommendedAlternative
P1Approve the companion plan as the next build after the production plan's Phase 1Yes, interleavedLater, after the first school
P2Second company for backupsBackblaze B2 (US, cheap, real lock)Wasabi (1 TB minimum) or Google
P3Allowed AI fallback cloud, if Amazon's model were ever unusableMicrosoft Azure AI Foundry, with the abuse-monitoring exemption in writingOur own GPU server (about $400 to $600 a month)
P4Spare email senderPostmark (ask for 7-day retention)Zoho ZeptoMail (has India)
P5Laptop and test file stand-in, replacing the dead MinIOGarageSeaweedFS, or R2's free tier in CI
P6Infrastructure code toolKeep the production plan's CDK; app and data stay portableOpenTofu for one tool across clouds
P7Measurements formatOpenTelemetry to CloudWatch via a collector (swappable)Amazon's own log format (not swappable)
P8SecretsEncrypted in the repository (SOPS and age)Amazon Secrets Manager behind a loader
P9Drill cadenceEvery quarter, one drill; all six at least once a yearTwice a year
P10Domain registrar and DNSRegistrar separate from hosting; zone in the repositoryEverything at Route 53

What we could not verify

Checked again on 9 October 2026. Resolved against the supplier's own pages: DigitalOcean, Linode, Hetzner (US table), Oracle's free tier, Amazon Transcribe, Google Vision's data terms, Postmark's US-only hosting, ZeptoMail's credit terms, Supabase, Aiven, Tiger Data, Bedrock's model prices, and SES's no-storage default. Still resting on third-party figures or silent pages:


Sources

Seen 9 October 2026 unless noted. Grouped by the section they support.

How the big companies do it

Servers and hosts

Database

File storage

Delivery network and DNS

Email

AI writing check

Picture check, speech, video

Code hosting, CI, secrets, observability

Identity and background checks

●  Have your own?

// Publish your own markdown.

Write your own