Hardening to launch: features & content sprint

Monthly Summaryby Deariary Official

March felt like two different months stitched together: the first half was a deep, sometimes painful hardening and refactor — tightening security, observability, and UX — and the second half was outward-facing: launches, migrations, and a relentless content sprint. The mood was productive and a little breathless; proud of the infrastructure work, energized by shipping visible things, and quietly aware that traction (and revenue) still needs to catch up.


Core engineering & reliability

  • Big hardening push early in the month: 78 commits and 15 PRs across frontend and brand to tighten security, runtime, and API resilience (notable: PR #303/#304).
    • Added CSP/HSTS/XFO headers, a PWA manifest, runtime env validation, route loading skeletons, and staged Basic Auth warnings for staging.
    • Introduced error boundaries (global-error.tsx / route-level error.tsx), safeFetch wrapper (timeouts, parse guards, RFC 7807 parsing), and clearer toast errors in place of silent catches.
    • Implemented account deletion and cleaned up dead TODOs — felt like finishing what had been nagging at me for weeks.
  • Observability landed: Sentry wired client/server/edge (PR #315), with PII scrubbing in beforeSend/breadcrumbs and source maps enabled.
    • Relief: production errors feel visible and actionable now; worry reduced about undetected runtime failures.
  • Tests and CI got serious attention:
    • Test surge: from 848 tests to 1,010 tests, coverage into the mid-90s (95.94% noted), 123 test files earlier in the month; fixed Node 22 flakes and stubs for storage.
    • Killed date-based flakes with fake timers and adjusted snapshots for date rollovers — small wins that keep CI calm.
  • How it felt: gritty, necessary, and stabilizing. The work is less glamorous but leaves me calmer at 3 a.m.

Product features & integrations

  • Public-facing product work ramped up: API keys (settings create/list/revoke, gated to Advanced; PR #333), data export flow, and a backfill for first-time generators (PR #341).
  • Integrations shipped and matured:
    • Todoist (shipped), Google Calendar (iCal / api_key flow), Bluesky (AT Protocol app password), Toggl Track, Discord (full frontend landed and live), and Steam/others in LP copy.
    • Unified integration registry so new integrations are one declarative entry — small refactor, big ergonomic win.
  • Monetization & access:
    • Billing flows reworked: inline confirms, unified cancel/downgrade UI, disabled plan changes during pending states; adapted to backend downgrade semantics (no immediate charge).
    • Trial surfaced with TrialBanner and trial UX across app; gating for Free plan history to 30 days added (historyDaysForPlan()).
  • How it felt: shipping integrations was energizing — tangible value users will notice. At the same time, locking down plan boundaries felt bureaucratic but necessary to avoid user confusion.

UX, brand, and the landing/blog push

  • Landing page (LP) and brand polish:
    • LP overhaul: storytelling, sample journals, motion, improved typography (Crimson/Klee One), and full SEO/accessibility cleanup. Migrated LP from Next.js to Astro SSG to serve zero-JS pages and reduce crawl cost (PR #112).
    • Locale work exploded: LP grew from 12 to 42 locales; global locale dictionaries in the app were normalized (no English fallbacks), and CJK font support was added.
    • Brand tweaks: overgrowth flora expanded to 6 stages, serif switch for JP, OG image polish, and blog chrome aligned with product tokens.
  • Blog launch and publishing pipeline:
    • Blog shipped with MDX, RSS, satori-generated OGPs, scheduled publishing, dark mode, and distribution assets for X/Bluesky. Early SEO pieces and many long-form posts were queued and published throughout March.
    • Built the content engine: templates, satori cover generator, and a posting/distribution workflow so writing → staging → posting happens smoothly.
  • How it felt: the outward face of the product finally matched the quality bar we set internally. That’s a boost to confidence — the product reads like a real product now.

Content, community, and "build in public"

  • Content cadence was relentless: dozens of posts pushed across March — pillar essays, competitor captures, integration deep dives, and SEO-targeted articles (examples: “What is automatic journaling?”, “What did I do today?”, numerous comparison pieces).
    • Schedules were set into April mid-month to keep a steady cadence; distribution assets shipped alongside posts.
  • Social and community: Bluesky was the primary playground for build-in-public updates; engagement was light but steady (likes, a few reposts), followers fluctuated around ~3.5k.
    • Public dev logs and automatic daily dev entries sparked conversation about the line between demo and performative updates — “Transparency without insight is just noise.” I kept replying with the intent: this is demonstration, not showmanship.
  • Metrics & feelings: proud to have an actual content pipeline and distribution; uneasy but honest about zero MRR reported publicly — a reminder that shipping is necessary but not sufficient.

Analytics, SEO & discoverability

  • Analytics evolved quickly:
    • Implemented in-app analytics SDK with batching/flush behavior, then simplified to immediate keepalive fetches to reduce failure modes (frontend #467).
    • Cross-domain session sharing implemented between App and LP via _sid (cookie-free) to track sessions coherently.
  • SEO & crawl health work:
    • Shipped llms.txt for LLM discovery, fixed hreflang/canonical/trailing-slash issues, repaired robots/sitemap problems, and resolved many Google Search Console warnings.
    • Canonical hygiene across 42 locales and API docs limited to English where appropriate — fewer crawl traps and clearer signals for search engines.
  • How it felt: satisfying — the “technical SEO” edits are boring but the payoff is clarity and fewer indexing headaches.

Maintenance, CI, and small wins

  • Quiet maintenance days peppered the month: Dependabot merges, action/version alignment, and branch cleanups across a handful of org tools (bitflyer-tools, irasutoya-tools, circleci-tools).
  • Small UX and performance wins:
    • Lazy-loaded i18n dictionaries to kill a 3.2 MB chonky chunk, fixed typography sizing per entry language, View Transition API for smoother navigation, PWA install action added.
  • How it felt: these were the comfortable satisfactions — small, visible improvements that compound.

Closing thoughts: March was a heavy month in the best way — foundational work early, then a burst of outward-facing polish and content. I shipped infra I can trust (Sentry, tests, safeFetch), built integrations people will use, and finally got the LP/blog to the quality bar the product deserves. The nervous bit remains: traction and revenue are not automatic. But momentum is real, the product looks finished to newcomers, and the content pipeline means we'll keep showing up. That's enough to feel like forward progress.

Share

Check out my diary entry on deariary #deariary #diary

Your life, automatically written.

deariary gathers your day from the services you already use, and AI turns it into a diary. No writing required — just a daily record you can look back on.

Turn your passing days into your own diary.

Try it free