DevMeme · Changelog
What shipped
DevMeme changes daily — this is the receipt. Each update covers everything that landed the day before, straight from the commit log. Currently showing the last two weeks (110 changes).
covering Sunday, July 12 · 10 changes
- seo fix image alt and document caches 2ca3963
- profile authored comments — desktop section + /profile/comments page + compact screen b81cf94
- comments unify compact drawer with desktop — one flat list, all authors equal c480ba0
- auth guest vote/reply prompts centered sign-in modal — controls stay visible 20c158c
- hide trending rank badge for now (render-gated with false &&, not removed); flip unit assertions 93543a1
- feat /changelog — daily digest of last 2 weeks from git log (unlinked, direct URL only) 8a15dc0
- decommission new.devme.me: apex devme.me is production — drop alias from allowedDomains/CSRF example, flip script defaults + living docs (nginx now 301s new.devme.me → devme.me) fc9ca2a
- og redesign default share card — dark brand, brag messaging (actually explained, L1-L4 depths, deadpan stats) 67883f8
- analytics Microsoft Clarity tag (qz3eu0y36m, same project as old prod) in both layouts, prod-only f349c39
- fix keep disabled communities response private a80f6ff
covering Saturday, July 11 · 12 changes
- comments hover-reveal branch controls — resting rows are pure content afbbccd
- comments density pass from full padding audit 10bb5ca
- comments kill dead vertical band under rows — branch controls + rating into meta line 0f45eec
- comments votes inline in actions row; auth-gate user controls signed-out 514f00c
- fix rollback deletes replies deepest-first (UserComment parent relation forbids deleting a parent with live children, P2014) 4826c06
- revert bot filtering from importer — extraction layer (root repo src/extraction) owns source cleanliness; importer trusts the JSONs b2f141b
- seo compact pages are first-class in sitemap — self-canonical /compact/* (drop cross-canonicals to desktop + noindex on compact categories/tags), sitemap emits desktop+compact twin per entry, add /privacy + /terms, communities prepared but commented out, drop desktop rel=alternate mobile links 58158fd
- feat skip group-bot pollution on import — bot authors (isBot flag / *bot username) and /command@bot invocations; no pseudo users for bots e32020a
- gitignore generated brag-output dirs 1146f54
- fix desktop comment thread UI: drop L2/L3 depth badges, icon-only Reply/Focus, single-rail indent, compact vote rail, no '-' rating placeholder, reply-count pluralization 84225ae
- fix channel pseudo-user is dev_meme (real channel), not devmemez (stale June plan name) c01f44d
- feat one-time Telegram discussion comments import as UserComment rows 0c03fe3
covering Friday, July 10 · 14 changes
- fix compact profile visual scale 6966a1b
- prioritize compact profile activity 3c5560f
- fix compact account connection copy d2caf65
- fix compact profile visual hierarchy 5bfe451
- record compact staging verification 59bcd4c
- focus compact auth sheets 2c7dd83
- refresh compact launch evidence matrix d767860
- clarify saved fallback thumbnails cb9fb39
- align compact behavior documentation df2ee19
- make compact trending context honest 9cc8a2e
- polish compact meme interactions 4e7fff9
- unify compact profile and saved flows 6459b1c
- refine compact discovery browsing fecde44
- polish compact navigation and theme ffc49d1
covering Wednesday, July 8 · 2 changes
- Fix compact profile scrolling and spacing c3a04eb
- Hide achievement notifications behind flag 0b84798
covering Tuesday, July 7 · 1 change
- fix dedupe achievement notifications c6177c9
covering Saturday, July 4 · 14 changes
- feat(auth) returning sign-in also merges legacy User.email owners (no EmailIdentity row) — github re-login now heals pre-identity duplicate accounts, not just Connect Email; ambiguous legacy match logs+skips instead of breaking sign-in. Tests. 4d70efa
- feat(auth) auto-merge proven-same-person accounts — conflict throws (email_conflict/provider_account_conflict) become mergeUsers(); fixes Connect Email dead-end after github minted duplicate user (no email shared) + returning github sign-in that would hard-fail once email arrives. Survivor: sign-in => email-identity owner, link => session user. Source user stripped not deleted (stale sessions degrade, no 500). github /user/emails non-ok: retry once then throw (no more silent email-less duplicates). Legacy User.email (no identity row) merges on connect-email too. e2e-verified locally: A+B email users, B connects A's email => link=success, B owns both accounts+identities, A stripped, sessions intact. d536731
- quiet-graphite P0: land the missing foundation the committed profile depends on 26b53c7
- fix(auth) error redirects target /profile?auth=error, not hardcoded /compact — desktop users clicking expired magic links landed on the mobile-only compact profile (broken at desktop width, no message). Magic dead token adds &reason=link; middleware device-routes mobile UAs to /compact/profile preserving query. Compact ProfileFlow now toasts on auth=error (was silently ignored); both surfaces show expired-link-specific copy for reason=link. Tests updated + error-branch coverage. 0c967b0
- fix(auth) backfill Account.email on returning sign-in — email captured only at account creation froze null forever (transient github /user/emails failure => permanent 'No email shared'); warn on /user/emails non-ok. Tests. e3f97e2
- one model policy, all surfaces: main session (fable-5 high) orchestrates/judges; PRIORITIZE codex subagents (gpt-5.5 high) for all delegated work; purge codex-5.3-spark; dual visual verification codex+grok ba3fe13
- model policy: Claude Code surface = fable-5 high orchestration, codex/gpt-5.5 high for all subagent work, dual visual verification codex+grok (grok-build) in parallel (owner directive 2026-07-04) 2d73723
- CLAUDE.md align subagent rule with current global policy — background subagents allowed with lifecycle hygiene (stale ban removed) 3184307
- fix(achievements) drop init-time route_open — astro:page-load fires on initial load too (both layouts have ClientRouter); init record double-counted every full load 696f6a4
- fix(achievements) category/tag/route counters actually earnable — record route_open on every astro:page-load swap (init-only recording missed all ClientRouter navs); /category/ + /tag/ route opens drive categoryScout/categoryMapper/tagTaster/tagDiver (category:filter dispatcher is dead code, tag_open never dispatched); skip badge vibrate before user gesture (Chrome blocks + console error). Tests + docs. d4b93d2
- push 400 bad_user_id guard on internal test-send (malformed ObjectID made prisma 500); QA smokes SMK-CAP-23..25 + matrix/arch cross-links; runbook mechanical checks 47ae0de
- test(profile) repair 8 stale expectations vs shipped quiet-graphite UI (hero copy, aria-label stat tiles, SyncCard copy, sync toast, pref data-attrs). ProfileFlow suite green; trendingService.unit.test.ts still red — imports computeTrendBucketKeys/resolveRangeWindow that never existed in any commit (c1bf17c committed never-green test, redesign workstream to resolve) 47ec9d3
- fix(achievements) restore profile grid CSS (6c39a7d excised profileCss; profile-flow.css has no .profile-achievement-* rules — inject shared achievementGridCss like CompactAchievementsPage); community achievements secret until communities.enabled launches (public-but-unearnable = product defect) e533e09
- docs user-journey dashboard (119 US-* + 31 S#.#, per-step shots) + build pipeline + many-to-many cross-links af3f9bb
covering Friday, July 3 · 6 changes
- quiet-graphite-gate include comments.css in blue grep (no ,#hex fallbacks); update msg for closure task. gate re-runs clean. (implementer subagent verification closure, no app source change) abb26a2
- compact-qg range default+prop (today + links+viewer), types, deletes (0-use sub verified); tests+build+strand post; evidence+cross updated 6c39a7d
- compact redesign: atomic integration checkpoint (gate script + profile pieces + test robustness + font hygiene; delete sidecar patches) c1bf17c
- compact redesign: wire socials config + prop (spec Phase3), align discover subtitle, profile updates per subagent+spec 6c3c374
- checkpoint 0e3c62f
- Ship analytics achievements e632cff
covering Thursday, July 2 · 23 changes
- Use centered comment vote ratings 9fb5f00
- fix(auth) avatar ring uses actual DevMeme favicon, not >_ svg 47de01e
- Complete vote wording visual fixes df86a82
- Fix compact profile card sizing 670aab2
- Bust achievement icon caches be32c0b
- Move achievements to dedicated pages 933b3ef
- Expand compact achievements 18234fb
- Add missing achievement utilities 6068885
- Add account connections profile UI d215e68
- Unify vote language and icons 5d7c97d
- Fix desktop auth header first paint eb94cf8
- fix(achievements) restore full catalog ab1aaf1
- fix(profile) derive taste from saved and liked 027ccd5
- fix(view-tracking) sendBeacon for view pings — no 'Fetch failed loading' noise acfebf1
- feat(api) GET /api/version — build-time commit SHA + built-at 49ef04f
- docs fix stale public HTML TTL claims (14400 → 300) 9fada68
- seo desktop→mobile rel=alternate links + host-aware sitemap origin af59e42
- perf(css) composited first-run hint animation 8c30f80
- perf(api) ack-then-persist beacon endpoints (analytics events/performance, meme view) 1712734
- perf(feed) LCP — fetchpriority=high on slide 0, embed first-window details in /api/feed/queue 33241ff
- feat(scripts) capture-screens.mjs — app-wide tour, coverage/showcase modes a6e8256
- fix(auth) warm DevMeme sunrise avatar ring; drop Google-ish rainbow 0588905
- docs(auth-ab) clicked event in category list; delivery confirmed, converted still pending 41f4f98
covering Wednesday, July 1 · 8 changes
- fix(404) Cache-Control no-store — transient 404s (e.g. /sw.js mid-deploy) were browser-cached 4h via CF default TTL 1740172
- fix(push) pushsubscriptionchange re-subscribe + gap-sweep docs 71d4b37
- polish(meme-detail) hero hover = border recolor only; zoom-in cursor 4b7ac03
- docs app-wide screenshot capture plan (coverage/showcase modes, S#.# traced) f99ce8b
- Removed old, outdated research ebfdac4
- Improve comment lifecycle anchors 8c786b2
- fix(comments) keep joke likes after reload 3fea008
- feat(comments) add pre-moderation setting fb51ac7
covering Tuesday, June 30 · 19 changes
- feat(comments) AI jokes are replyable, threaded comments (desktop) 3caff96
- fix(meme-detail) collapsed peek — vote actions + 'Read all' share one row fd2f69d
- feat(meme-detail) unify comments (collapsed joke peek ⇄ threads) + hover action bar 5b28df0
- fix(meme-detail) hero image no longer lifts on hover 51d5d18
- chore(scripts) drop A/B smoke cleanup script (box has mongosh not bun; use one-liner) e9f6082
- chore(scripts) scoped dry-run-first cleanup for A/B smoke-test events 78d6124
- docs add parallel-agents coexist/don't-clobber rule be7cbf5
- feat add desktop cards comments f4c7026
- test(auth) make 00-auth-config no-creds asserts hermetic 46abf72
- feat(auth) add distinct email_ab_clicked event (funnel: sent/opened/clicked/converted) 04a890f
- docs(auth) document magic-link email A/B + relink analytics/api-reference 95c741a
- feat(auth) 8-variant A/B magic-link emails + sent/open/convert tracking 735f205
- feat(profile) merge stat tiles into one panel; fan apart on hover, click scrolls to section e3fb254
- legal code-accurate privacy disclosures + terms hardening a1c4f94
- style(auth) scrub remaining em dashes (preheader + internals) 9006590
- style(auth) drop em dashes from magic-link email copy 2e21155
- feat(auth) brand the magic-link email (terminal-lux) a3062ef
- fix(auth) magic-link consume uses MULTI GET+DEL, not GETDEL 7290954
- docs(auth) reflect Google/GitHub/Apple+email staging activation 3b39610
covering Monday, June 29 · 1 change
- fix(compact) add standard mobile-web-app-capable meta (Chrome deprecates apple- prefix; keep both for iOS+Chrome) 17c2eae