From Quiet Maintenance to Mobile Momentum

Monthly Summaryby Deariary Official

September started in a strangely quiet, low-signal place: long stretches with no commits, no Linear movement, and a completely silent Bluesky account. It ended in a late-month surge of product work, mobile infrastructure, timeline polish, and admin cleanup. The month felt less like a steady sprint and more like waiting in the dark before suddenly turning on every light at once.


Open source maintenance

  • The first three weeks were mostly about keeping the tool ecosystem healthy rather than building something new. I approved PRs across circleci-tools, bitflyer-tools, irasutoya-tools, and deariary, often cleaning up Dependabot branches and pushing the approved changes through to master.
  • There were several review bursts:
    • Five PRs approved on September 2.
    • Four on September 9.
    • A larger batch across circlei-cli, irasutoya, bitflyer, and their CLI repositories on September 18.
    • Another approvals spree on September 25, including irasutoya #564 and #565, circlei-cli #1101 and #1103, bitflyer #702 and #704, and DroidFlyer #549.
    • Nine dependency updates approved on September 28.
  • On September 6, I patched a CRLF injection issue in cycle-flyer by upgrading form-data to 2.5.6. PR #933 merged quickly, and I followed up with the cleanup and another review. A small but satisfying example of maintenance actually preventing trouble.
  • I handled a few dependency upgrades that were more involved than their size suggested:
    • Raised Norimaki’s target SDK to 36 after Google Play rejected an upload with 403 Forbidden — "Target SDK of artifact is too low: 1948."
    • Dropped Ruby 3.2 support from irasutoya because it was EOL and conflicted with newer rbs and steep.
    • Consolidated the Vitest 5 and coverage package upgrades in both deariary/frontend and github-weekly-reporter so peer dependencies would resolve cleanly.
  • This was not glamorous work, but it had a dependable rhythm to it. On the quiet days, approving a few PRs or deleting stale branches was enough to feel like I was keeping the machinery from rusting.

Product and production work

  • September 22 finally broke the long run of blank Linear days. I opened JRNL-816 after seeing the production backend steadily climb to around 95% of its 512Mi memory limit. The root cause was still unknown, but the measurements, ruled-out possibilities, and next steps were documented instead of left as vague anxiety.
  • That investigation uncovered two related issues:
    • JRNL-817: NestJS throttling was using the default in-memory store, which never evicts entries and could grow forever.
    • JRNL-818: OAuth token exchange failures could log full request URLs, including client_secret and authorization codes for some providers. This was marked critical, and rightly so.
  • On September 23, I shipped the latest LLM model update in roughly 30 minutes. That was a nice reminder that some product work can move very quickly when the scope is clear.
  • The end of the month became a serious push to make the mobile app and mobile data model real:
    • Mobile sign-in with PKCE.
    • Mobile-only token claims and ingest guards.
    • Event ingestion and plan-based capabilities.
    • OAuth callbacks that return cleanly to the app.
    • Environment-specific auth callback schemes so local, staging, and production builds do not fight over deep links.
    • RevenueCat webhook support for store subscriptions.
  • I also mapped the less glamorous operational chain behind Android subscriptions: virtual office → sole proprietorship registration → D-U-N-S number → Google Play organization account → Play subscription products. The immediate blocker is now explicit in JRNL-835 instead of floating around as an undefined business prerequisite.
  • The production and billing work had a slightly uncomfortable tone: the closer the product gets to being real, the more edge cases become impossible to ignore. Memory leaks, secret logging, double billing, misleading metrics, and store-account rules are all part of shipping something people can trust.

Mobile, timelines, and the entry experience

  • The biggest visible shift came on September 27, when the entry experience started to feel like a product rather than a collection of pages.
  • I shipped the first Story / Timeline split on diary pages, extended it to shared entries, and added both a calendar view and a Today card to the month page.
  • Entries gained much better visual recognition:
    • Month cards can show up to four photo thumbnails.
    • Timeline places are now proper cards with inline Maps Static API images.
    • Story view uses one Google map for all locations in a day, while Timeline keeps maps attached to individual places.
  • Mobile integration also became much less rough:
    • Added proper Mobile icon and text.
    • Translated steps, sleep, and workout highlights.
    • Added /integrations/mobile so users can review and delete phone-sourced data.
    • Expanded APIs to include photo URLs and captions.
    • Fixed a staging upload failure caused by a Pixel 3 XL JPEG with NUL-terminated EXIF strings that Postgres rejected inside jsonb.
    • Fixed GPS reference handling affected by the same malformed metadata.
  • I fixed post-login redirects so protected pages stop dumping users at /entries, and web sign-out now revokes refresh tokens server-side instead of only deleting them locally.
  • September 27 ended with an almost absurd 15 frontend PRs merged, including shared timelines, entry maps, and photo thumbnails. It was the clearest burst of momentum in the month, and probably the point where all the earlier backend groundwork finally became visible.
  • On September 29, Mobile stopped being treated like a permanently passive source. Captions now appear consistently across the gallery, timeline, and shared entries, and I started making mobile media playback show useful context like title · artist and then album · app.
  • There is still plenty to build. I filed contracts for mobile analytics events and photo metadata events, including timestamps and EXIF locations without uploading the actual images. But the shape of the system is much clearer now.

Billing, reporting, and correctness

  • I closed JRNL-869 to prevent admin plan grants for users who already have active store subscriptions. That removes a possible double-billing path before it becomes a customer-support problem.
  • A broader review showed how much mobile data could distort existing admin reporting. I filed follow-up work for:
    • Store revenue and subscription reporting.
    • Mobile activity in engagement and retention.
    • Signup-client splits for growth and retention.
    • App analytics classification.
    • Mobile event and media inspection pages.
    • Excluding the automatically created Mobile connection from integration metrics.
  • I also caught an MRR bug where annual plans were stored as annual but admin queries were checking for yearly, badly overstating monthly revenue. Not the kind of bug that looks dramatic in the UI, but exactly the kind that quietly poisons decision-making.
  • The month’s lesson here was that “shipping mobile” is not just adding an app. It means rechecking every dashboard, entitlement rule, retention cohort, and billing assumption that used to think the web was the whole product.

Public surface and creative wandering

  • I published the AI model update changelog, refreshed the homepage’s featured essays, and updated the supported integrations list to reflect reality: Discord, Last.fm, Swarm, Trakt, and Linear are live; Weather moved to “coming soon.” A small cleanup, but it made the public story feel more honest and current.
  • I opened four distribution-minded backlog tickets on September 23:
    • MCP support so deariary can become “the memory layer that knows your daily life.”
    • An Obsidian plugin for people already living in Markdown.
    • A Raycast extension for quick access, search, and note capture.
    • An Expo Android app that turns the phone itself into a zero-setup data source.
  • The shared idea was good: meet people where they already are instead of asking them to wire up a complicated stack first. That felt like a more confident product direction than simply adding another isolated feature.
  • There were also a couple of enjoyable rabbit holes. I starred uhyo’s ui-library-benchmark, react-19-beta-playground, EmojiScript, custom-emojis, and typescript-puzzle, then went through demouth’s Go and Ebitengine projects, including generative-art-in-go, learning-ebitengine, suika-game-go, and orenoagent-go. These detours were not productive in the narrow sense, but they added some curiosity to an otherwise very maintenance-heavy month.

Metrics, silence, and the emotional texture

  • For most of the month, Bluesky was completely silent: no posts and no likes on nearly every day. Linear was similarly empty for long stretches, with no tickets created, moved, or commented on.
  • GitHub activity came in little pulses rather than a steady stream. Followers moved from roughly 3,680 early in the month to 3,700 by September 25, ending around the high 3,690s despite the usual small gains and losses. Tiny signals, but I still noticed them.
  • deariary/frontend’s open issues kept wandering up and down: +8 on September 1, down 5 on September 3, up 8 on September 8, up 6 on September 15, then gradually down again near the end. I even left myself a note to triage the backlog, though the later product push naturally became the bigger story.
  • The quiet days sometimes felt almost empty: “zero across the board,” “blank slate,” “ghost town.” But they were not entirely wasted. They created room for browsing, maintenance, and letting bigger decisions take shape.
  • The strongest feeling of the month arrived late: a sudden sense that many separate threads—mobile ingestion, maps, photos, subscriptions, timelines, analytics, and distribution—were finally connecting into one product direction.

September began as a month of watching counters and approving other people’s dependency bumps, almost suspiciously uneventful. It ended with production investigations, a real mobile foundation, a much richer diary experience, and a pile of follow-up work that feels difficult but meaningful. I’m left with the feeling that the month was quiet only on the surface; underneath, the product was gathering pressure, and by the final week it finally started moving.

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
From Quiet Maintenance to Mobile Momentum — deariary