Marketing & download landing page for Secretary
a free, open-source Android assistant for todos, reminders and a journal — by ShuttleLab.
🌐 secretary.shuttlelab.org · 📱 Android app: ShuttleLab/secretary-android · 🔌 Server: ShuttleLab/Secretary
This repo is just the website. The Secretary Android app (Kotlin / Compose) lives at ShuttleLab/secretary-android and its Go server at ShuttleLab/Secretary. Bilingual (English / 中文), static export, deployable anywhere.
You type what you need the way you'd say it — "remind me to take the bins out at 8 tomorrow", "every weekday at 9, stand up", "I finished the report" — and an assistant on the server turns it into a task, a recurring reminder, or a journal entry.
The part that's actually hard is the reminder arriving. Android freezes backgrounded apps and push can queue behind a dead socket, so Secretary schedules an exact alarm on the device itself as the primary path — it fires offline, without Google services, and through a push outage — and sends over Telegram and Discord as independent backups. The paths recognise each other, so you get one notification rather than three, and every delivery is logged per channel so a missing reminder is something you can read rather than guess at.
npm install
npm run dev # then open /en or /zh — see the caveat below
npm run build # next build + postbuild (promotes out/en → out/, patches lang, writes sw.js)
npx serve out # preview a real build; `npm run start` does NOT work (no server runtime)
npm run lintCaveats
/404s undernpm run dev. The English-at-the-root promotion is a postbuild step, so in dev the locales live at/enand/zh. Production/is correct.- Delete
out/before rebuilding — the postbuild copy usesforce: false, so stale files persist.
- Tag a release in the app repo. The download button points at
releases/latest/download/Secretary.apk, and nov*tag has been pushed yet, so it 404s until one is. (The release workflow already publishes that fixed filename for this purpose.) - Point the
secretary.shuttlelab.orgDNS record at the Worker.
Static export → Cloudflare Workers static assets.
npm run build
npx wrangler deploy # [assets] directory = "./out"app/[locale]/ home, privacy, terms
app/ layout (MobileApplication JSON-LD), robots, sitemap, manifest, OG + icon routes
components/ header, footer, seo-faq (use cases + comparison + FAQ), theme/palette, ui/
messages/ en.json, zh.json — keep in parity
i18n/, lib/i18n/ next-intl routing + locale metadata
lib/seo.ts canonical / hreflang helpers (trailing slashes matter)
scripts/postbuild.mjs en→root promotion, <html lang> patch, service-worker generation
See AGENTS.md for the detailed briefing.
AGPL-3.0-only — same as the Secretary app and server.



