Shows small notifications of recent activity — someone just signed up, someone just bought — pulled from your own systems, as social proof.
Build me a social-proof notification tool that replaces Fomo: real recent activity shown on my site, from my own data, with nothing invented. STACK - Node 20+ with Fastify, SQLite through better-sqlite3 - One embeddable script, vanilla, under 8KB gzipped, from my own domain - Server-rendered admin - Caddy in front THE DATA MODEL - sources: id, kind, config_json, is_active — a webhook, a database view, a CSV upload, or an API push - events: id, source_id, kind, actor_name, actor_location, subject, subject_url, image_path, amount_cents, currency, occurred_at, received_at, is_public - rules: id, name, event_kinds_json, page_pattern, min_age_minutes, max_age_hours, display_seconds, gap_seconds, position, max_per_session - impressions: id, event_id, rule_id, session_hash, shown_at, clicked_at, dismissed_at - Every event carries the time it actually happened. Nothing is generated, ever, and the schema has no column that would let it be THE HARD RULE - This tool shows things that happened. There is no fake mode, no sample generator that can be left on in production, and no 'someone in Berlin' when nobody was in Berlin. - Write that in the README and enforce it in the code: an event with no source and no occurred_at cannot be stored. - Anonymise instead of inventing: a first name and a city, taken from the real record, and configurable down to 'someone' — the ceiling is what is true, the floor is what is polite GETTING THE DATA IN - A webhook endpoint with a shared secret, taking one event or a batch - A pull adapter for a database view, run every minute - A CSV import for a backfill - Idempotency by external id: a retry does not show the same purchase twice - Events older than the rule's maximum age are stored but never shown, because 'somebody bought this' in a notification means recently SHOWING IT - One notification at a time, in a corner, for N seconds, with a gap of M seconds before the next - A per-session cap, because the fifth notification is worse than the first - A per-page rule set: the pricing page shows purchases, the blog shows nothing - Never covering navigation or the bottom bar on a phone; never blocking a click - Dismissible, and a dismissal is remembered for the session - Keyboard reachable and announced politely to a screen reader, or not announced at all — never interrupting WHAT A NOTIFICATION SAYS - A line of text with slots: name, location, subject, and how long ago - The relative time is computed in the browser from the real timestamp and never rounded upwards - An optional image and a link to the subject - The template is per rule, and the interface previews it with a real recent event, never with a placeholder MEASURING WHETHER IT WORKS - Impressions, clicks, dismissals, and click-through per rule - A/B: two templates on the same rule, split by session hash, with the split stated - The honest metric is conversion on the pages where it ran against where it did not — the admin page says that plainly rather than showing a vanity number PRIVACY - The name shown is whatever the source sends; the README says to send a first name only - Location from a local database file at country or city level, never finer - Visitors are identified by a session-scoped salted hash: no cookie, no cross-site anything - A person in the source data can be excluded by key, permanently THE INTERFACE - One page per rule: what it shows, where, how often, and a live preview - A feed of recent events with a switch to hide one - Dark and light, one accent OPERATIONS - .env: DATABASE_PATH, BASE_URL, WEBHOOK_SECRET, HASH_SALT, GEOIP_DB_PATH, ALLOWED_ORIGINS - Migrations on boot, each once - The payload endpoint answers from memory with an ETag - Nightly backup off the machine, restore script - Health endpoint that reports the age of the newest event, because a silent source is the failure mode here WHAT MATTERS MOST Ingestion honesty and the frequency rules. Build the webhook, the idempotency and the one-at-a-time display first. Then put it on a real page for a day: if you cannot say where every notification came from, the tool is doing the one thing it must never do. Give me the repository, the embeddable script, migrations, .env.example, a seed of real-shaped events, and a README with deploy steps behind Caddy.
What you lose
- Connectors that read recent orders and signups from a dozen platforms
- Display rules and rate limiting already tuned
- Templates that look credible rather than desperate
If you would rather not build
- Your own recent-orders query plus a script
- A static testimonial, which is honest and permanent
- Nothing at all, which many sites find performs the same
What it costs
read from their page 15 Aug 2026
| Plan | Billed monthly | Billed yearly | Last read |
|---|---|---|---|
| — | $25/mo | — | 15 Aug 2026 |
Their pricing page is where these came from. Seeing a different price? Tell us.
The escape hatch
open source · no votes, no paid placement
Astro
$0Renders the proof server-side so no client script is needed at all.
withastro/astrofree · open source
Why this verdict
our own opinion · changed only by a person
88/100
Verdict yes at 88. It is a cached query and a small script. The only thing worth insisting on is that the events are real.
History
tracked since 10 Aug 2026 · nothing is ever overwritten
Questions about Fomo
answered from the record above
Is Fomo free?
No — the plan we track is $25 a month. From around $25/month billed monthly, priced on notifications shown.
Can you replace Fomo by building your own?
YES. Replaceable in one session with an AI coding agent. Replacement score 88 out of 100, build time one session. Read what you lose before you decide.
How much does Fomo cost?
$25 a month on Starter — $300 a year. Recorded 10 Aug 2026.
What do you lose by replacing Fomo?
Connectors that read recent orders and signups from a dozen platforms; Display rules and rate limiting already tuned; Templates that look credible rather than desperate. If any of those carry weight for you, keep paying.
Is there an open-source alternative to Fomo?
Yes: Umami, Astro. The prompt on this page is for when you want it your way instead.
Related entries
same category first, most replaced first
Every week, something stops being worth paying for.
New verdicts, prices that moved, entries added. One email a week. Unsubscribe in one click. Nothing is being sent yet — your address is kept here, and the first issue is the first thing it is used for.
free forever · no tracking pixel · stored here, never passed to anyone

