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.

24 Aug 2026 · Varun

Swapped bearblog for PaperMod

Swapped the bearblog theme for PaperMod on the same day the site launched. Bearblog was fine for getting the first commit out fast, but it was too minimal — no built-in search, no dark mode, no real homepage layout options. What changed Theme: hugo-bearblog → PaperMod — gained dark/light auto-switch, JSON search, and a cleaner post list. Homepage: switched to homeInfoParams with a short blurb and social icons instead of the bearblog bare index. About page: added content/about.md since PaperMod’s profile mode gives it a proper layout. Config: rewrote hugo.toml for PaperMod params — Dracula highlight style, auto theme, reading/share buttons off. Removed the hand-rolled baseof.html that bearblog needed; PaperMod handles its own layouts. Deployment stayed the same — Cloudflare Pages just rebuilt from the new commit and everything worked. The config diff was the biggest part; PaperMod has a lot more knobs than bearblog did.

24 Aug 2026 · Varun

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 (Hindi 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.

23 Aug 2026 · Varun

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.

07 Jul 2026 · Varun

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.”

03 Jul 2026 · Varun