Build notes and progress logs — what shipped, what broke, and what I learned fixing it.
A dev log for the dev logs
Every good project diary needs an origin entry — this is it. Tonight I spun up devlog.stashed.in: a tiny Hugo site running the bearblog theme to keep build notes across all my projects instead of losing them in chat scrollback. Setup took minutes: hugo new site equivalent — folder + config + theme clone (hand-rolled layouts lasted all of five minutes before I wised up) Backfilled past logs from stashlist/stashed.in, mirror-habit, and the Mehfil wedding-invitation sprint Git repo → GitHub → Cloudflare Pages building Hugo straight from the repo Custom domain pointed at devlog.stashed.in The dogfooding begins here. If you’re reading this, the pipeline works end-to-end.
Challenge banners, tiers & archive mode
Big push today on mirror-habit — the challenge system is now complete end-to-end. What shipped Tier engine (src/lib/challengeResults.ts): at expiry, each participant gets a completion tier — conqueror ≥100%, gold ≥75%, silver ≥50%, bronze ≥25%, participant >0% — with XP bonuses and 👑 MVP crowns for top finishers. All date math rewritten as pure UTC string ops after the container’s Asia/Calcutta timezone kept shifting weekly boundaries by a day. Dropped date-fns from the engine entirely. Custom banner artwork: five illustrated WebP banners (1200×298) + crown overlay, ~122KB total after ImageMagick conversion (originals were 9MB PNGs). Wired into profile grid, habit detail, and popups. Click-to-enlarge lightbox on profile banners, matching the existing titles popup pattern. Archive mode on challenge detail pages: once a challenge ends it becomes the first card on the page, check-ins are disabled, heatmap tiles stop being clickable, and the competitive “You’re 100% ahead of the guild average” insight is replaced with a neutral “challenge has ended” note. Celebration popup on the dashboard when you earn a new banner (once per banner via localStorage seen-set). Past Challenges rows now show tier emoji stacks + your personal result. Bugs hit along the way A JSX restructure left an unclosed <div> that cascaded into main has no corresponding closing tag — tsc caught what my eyes missed. Junk 0% rows from mid-dev localStorage churn resurrected themselves through LOAD_STATE; fixed by validating tiers at every ingest point (fetch, migration push, realtime channel, reducer). The user’s July hike check-in was lost to pre-engine localStorage churn — data loss, not a logic bug. Backfill SQL provided. Next: guild-wide leaderboard maybe, or polish on the voting flow.
Mehfil — wedding invitations in one night
One late-night session that went from “a wedding invitation page” to “an invitation platform.” Started with a single Arjun ♥ Diya invitation — React + Vite + Tailwind v4 + GSAP scroll animations. Set live OG meta tags so shared links preview properly on WhatsApp, added a deploy script and TODO tracker. Then the scope creep hit: naming research, platform plan, locked the name — Mehfil (Urdu for gathering/celebration venue). Closed the night by swapping the venue image to an elegant ballroom shot from Pexels. From single invite to product idea in ~14 hours. Classic.
mirror-habit begins
Started a new project: mirror-habit — habits tracked in guilds, where everyone’s progress mirrors against everyone else. Challenges, streaks, gentle public pressure. Stack from day one: React + Supabase + Capacitor for Android. APK builds run entirely through GitHub Actions (no Android Studio) — took two commits to get the CI Java version right for AGP 8.13. A month and change later: challenge tiers, banner artwork, archive mode — see the next log.
stashed.in — seven months of stashing
A look back at stashed.in (the stashlist project) — 181 sessions from Dec 2025 to July 2026. Highlights along the way Boards & links core: masonry view with website previews like raindrop.io. Getting reliable banner/link images meant three fallback strategies for metadata fetching, plus Supabase edge caching for OpenGraph data. Browser extension so users can stash links without opening the site — including matching favicons. PWA support, Disqus comment counts on link buttons, tag autocomplete. QR-code sharing for password-protected stashes; import your YouTube subscriptions straight into a board. Endless polish: theme switcher sizing, dialog gradients, Cloudflare cache purging after deploys (“why do users still see the old build?”). It’s live at stashed.in — still my best shot at “make something people use.”