Week of February 23, 2026
The week started with a Chrome Web Store rejection email and ended with a shared design system powering three sites. In between, lem.fyi got a full social layer.
Table of Contents
What I built
lem-fyi had its biggest week yet - 54 commits across 32 merged PRs. The headline was issue #63: a complete engagement system with likes, comments, Google OAuth, Cloudflare Turnstile bot prevention, Claude API content moderation, and Resend email notifications. Comments support editing, deleting, likes, and single-level replies (#132). The moderation defaults to review on API failure rather than reject - false negatives beat false positives on a personal blog.
The Preact-to-React migration (#128) was mechanical but tricky. React requires charSet (camelCase) and object-style style props where Preact accepted strings. The admin SPA stays on Preact with its own tsconfig to avoid type conflicts.
That migration enabled the real goal: a shared design system. Created @lem/ui (#127) as a standalone package with CSS custom properties, Tailwind v4 preset, and shared React components (Logo, SideNav, BottomNav, ThemeToggle). Wired it into both lem.fyi (#134) and lem-work (#307), cutting ~200 lines from each site. One gotcha: esbuild doesn't respect @jsxImportSource pragmas for files in symlinked packages, so the shared components use classic import React from 'react'.
Post page styling got a full pass (#129) - tighter letter-spacing on headings, rounded code blocks and callouts, responsive font sizes. The TOC went through three iterations (#70, #75, #79) before landing on a flex-based layout visible down to 1024px with a mobile collapsible fallback. Nav styling matched lem.work pixel-for-pixel (#91) after I discovered the root font size difference (18px vs 16px) was inflating all rem-based values by 12.5%.
Also shipped: Stripe donations (#61), floating action buttons (#95), email notifications for likes and comments (#94), Spotify and YouTube embed support for WIR posts (#121, #122), and a blog post on managing multiple GitHub accounts with direnv (#50).
darkly-suite spent the first half recovering from a Chrome Web Store rejection. Red Potassium flagged the listing for missing subscription disclosure - all features require a paid plan but the description didn't say so (#554). What followed was a compliance marathon: 14 PRs fixing descriptions (#583, #585, #587, #589), trimming test instructions to the 500-char CWS limit (#593), and applying the same fixes to Sheets (#601). Gmail Darkly bumped to 1.0.1 for resubmission (#580).
The second half pivoted to building a screenshot harness for CWS listing images. Six issues (#609-#614) delivered a mock framework with realistic Gmail, Sheets, and Docs page replicas, a Playwright + Sharp pipeline for automated capture and compositing, and per-extension YAML configs for screenshot generation. The mock pages render real-looking UIs with toolbars, sidebars, and content areas that show dark mode applied.
Subscription UX improved: warning banners for canceled and past-due subscriptions (#577, #582), a restore purchase flow for license recovery after reinstall (#564), and a redesigned side panel with collapsible sections (#572).
lem-work got a consulting booking feature (#301, #304) with Stripe payments and Google Calendar integration, renamed from "Consulting" to "Meet" with a General Inquiry meeting type. The CareConnect provider portal got its showcase page (#287) with deployment to Cloudflare (#290) and live demo links. Portfolio pages shipped for lem.work itself (#264) and eluketronic (#257).
The headshot got an easter egg: hover reveals a silly photo (#275), mousedown shows a no-glasses variant (#277), with mobile touch support (#281) and a question mark cursor hint (#279). The About page was redesigned (#185) with Spotify recently-played integration (#189).
What I consumed
No Spotify or YouTube data collected this week - the polling system wasn't wired up yet. That changes next week.
Closing
181 commits, 92 PRs, three repos. The engagement system and shared design system were the big wins. The CWS rejection felt like a setback but forced a proper compliance review that'll prevent future rejections. The screenshot harness means never hand-crafting store listing images again. Next week: get the journal automation actually running (it wasn't), and tackle the about page.
Consider leaving a small donation to support the blog.
Comments