Countdown
Shared countdown timers that stay in sync on every screen — no account, any number of viewers.
- Transport
- Not stated
- Package
- —
- Registry id
- app.countlink/countdown
No install snippet on purpose. A working MCP config is a command, its arguments and an environment block — the last two are where API keys live, so this catalogue never stores them and cannot publish them. Follow the link above for the authors' own instructions.
A free, zero-backend countdown timer. Set a duration, copy the link, send it to a room — everyone who opens that link sees the identical countdown, perfectly in sync, because the deadline is a timestamp encoded in the URL itself. No account, no server, no database.
Live at countlink.app. For local dev, open index.html
directly or serve the folder — see below.
License: source-available, not open source. No LICENSE file means all rights reserved by default — this repo is public so the "nothing you paste is uploaded" claim is checkable, not an invitation to redistribute or relaunch it as your own product.
Why this exists
Full research and reasoning is in the project memory (see /Users/bruno/.claude/projects/-Users-bruno-Code-boring-apps/memory/),
but the short version: single-purpose "boring" utility sites (vClock, Wheel of
Names, word counters) generate real, verifiable ad revenue at near-zero
operating cost. vClock specifically — a free online timer — earns an
estimated ~$500K/yr from Google AdSense on ~5.4M monthly visits. CountLink
copies that proven business model (free tool, one ad slot, programmatic SEO
pages) while adding a genuine feature vClock doesn't have: shareable,
synced-by-link countdowns.
Project structure
index.html the tool — home page, canonical version of the UI
control.html phone-control remote (opt-in, off by default — see docs/phone-control-setup.md)
assets/
style.css all styling, shared by index.html and every /timers/ page
app.js all timer logic, shared the same way
control.js control.html's logic — separate file, different DOM shape
realtime.js thin Ably pub/sub wrapper for phone control, inert with no key configured
realtime-config.js the on/off switch — window.COUNTLINK_ABLY_KEY, empty by default
features.html generated — every capability, named (see "The feature inventory")
timers/ programmatic SEO landing pages (see docs/monetization.md)
meeting-timer.html the Meetings cluster hub
exam-timer.html
... (the eight fixed-duration pages were consolidated into
/timers/ on 2026-07-29 — see _redirects for why)
guides/ generated long-form articles
vs/ generated head-to-head comparison pages (/vs/<competitor>)
functions/ Cloudflare Pages Functions — the only server-side code here
mcp.js the MCP server at /mcp
badge.svg.js the README badge image
j/[code].js join codes: /j/<code> -> the ordinary #t= link
scripts/
build-timer-pages.mjs regenerates /timers/, /guides/, /vs/, features.html,
sitemap.xml and llms.txt from one data list
articles.mjs the /guides articles, as data
comparisons.mjs the /vs/ comparisons, as data — read its header before
editing: these pages make factual claims about other
companies and the rules are not stylistic
docs/
monetization.md step-by-step: analytics, AdSense, Pro/Stripe, growing /timers/
perception-gap-2026-09-06.md why assistants called this site "minimalist", and the fix
phone-control-setup.md pause/adjust/stop from a phone — LIVE since 2026-07-26, opt-in checkbox in the setup panel, Ably key already configured
ads.txt AdSense seller-verification file — already filled in and live; AdSense approval is separate from this file existing
robots.txt allows crawling, points to sitemap.xml
sitemap.xml generated — do not hand-edit, re-run the build script instead
archive/ earlier prototype ideas explored before CountLink (kept for reference)
Running it locally
From the project's README.