Commit Graph
182 Commits
Author SHA1 Message Date
rzen f587bab71a pipeline: TEAM.md — document the editorial team, its prompts, and house rules
Roster mapping each role (researcher, curator, reviewer, copy editor,
picker, conductor) to its pipeline stage and canonical prompt file,
the shared house rules, the day-in-the-life commit flow, and the
copy editor's subagent brief verbatim — the one prompt not stored as
a skill; daily-pipeline stage 4 now references it as canonical.

Claude-Session: https://claude.ai/code/session_01WZaczDJjL3xZ3u5spsN5AL
2026-07-14 20:11:04 -04:00
rzen 64bad7091b pipeline: EDITORIAL.md voice charter + fresh-eyes copy-edit stage
One written standard for every audience-facing word: concise, to the
point, inspiring delight through specificity — with word budgets per
copy type (reviews had drifted from a ~370-word median to 500-1000+).
All writing skills now reference the charter, and daily-pipeline gains
a stage-4 copy-edit pass: a subagent that didn't write the day's copy
tightens it against the charter, prose only, diff reviewed before
commit. Digest gains a copy-edit line.

Claude-Session: https://claude.ai/code/session_01WZaczDJjL3xZ3u5spsN5AL
2026-07-14 19:46:35 -04:00
rzen 06f8a9dc22 pipeline: hard editorial exclusion of tobacco and alcohol content
New rule at every selection stage: daily-finds drops such items at
capture (categorical, overrides design/gift appeal; borderline cases
skip too), build-bundle and cluster-bundles treat legacy alcohol
finds as ineligible for new bundles, and build-review refuses to
graduate them even on explicit slug. Existing finds stay published
per forward-only decision; CLAUDE.md records the policy centrally.

Claude-Session: https://claude.ai/code/session_01WZaczDJjL3xZ3u5spsN5AL
2026-07-14 09:03:05 -04:00
rzen f9bc8f93eb pipeline: relax hero floor to 2, keep ~4 as the soft aim
The real failure mode is 0-1 images (wall of text); two heroes read
fine on the 1-2 column layouts. Keep ~4 as the aim — prefer
hero-bearing candidates among equal fits, more images for bigger
bundles — since 2 among 8 items still looks thin on the wide
4-column grid. Restores the 3-item minimum bundle size.

Claude-Session: https://claude.ai/code/session_01WZaczDJjL3xZ3u5spsN5AL
2026-07-14 08:35:00 -04:00
rzen f0f1d8fb61 pipeline: hero floor — bundles require at least 4 items with hero images
Bundles now ship only when at least four of their items have a hero.*
image, purely so the grid never renders image-thin. Clusters that miss
the floor are held back and logged rather than padded or written thin;
the weekly catch widens its window to older unbundled hero-bearing
finds instead of holding. Capture gets a nudge to try a second image
source before giving up on a hero.

Claude-Session: https://claude.ai/code/session_01WZaczDJjL3xZ3u5spsN5AL
2026-07-14 08:08:57 -04:00
rzen 7e7b5afa1f site: pick of the day — Shanling M0 Pura
Rotated from herculaneum-scroll-first-read (held since 07-13).

The best hero image of the run is deliberately NOT the pick: Lai Tak Tsuen's
atrium is the most arresting thing we published today, but its residents have
posted notices asking photographers to stay out, and the homepage hero is this
site's loudest amplifier — pointing it there would generate exactly the traffic
they are trying to stop. Same shape as the rule against heroing anything that
reads as endorsing harm, just quieter. The review still runs; it just never
gets the tile.

The M0 Pura wins the rest on the axes the pick is judged by: a press shot that
shows the whole product in one frame (it is tiny, and there is nothing on it),
a virtue legible from the tile without domain knowledge, and nothing remotely
controversial about it.
2026-07-14 02:11:23 -04:00
rzen b463f85b3f site: reviews — Shanling M0 Pura, Lunacy, Lai Tak Tsuen Estate (graduate from finds)
Three graduations, and the fact-check earned its keep on every one.

Shanling M0 Pura (music): the 250mW balanced figure needs an adapter Shanling
sells separately — out of the box it is 100mW, on a single 3.5mm jack. The
'cannot stream' pitch holds (no Wi-Fi, no apps) but the review declines to sell
the myth: Bluetooth-receiver mode will happily play your phone's Spotify. Read
alongside the existing Zenteek review — the same argument with a battery in it.

Lunacy (play): runs the original unmodified After Dark module, not a
reimplementation — confirmed. Corrects the find's attribution of More After
Dark to Apple (it was Berkeley Systems) and disambiguates Jeff Halter, who made
Lunacy, from Ben Haller, who wrote Lunatic Fringe in 1991. Ships no game data;
you supply your own copy. Same developer as the Stacks HyperCard player, which
is the actual story.

Lai Tak Tsuen Estate (places — new category): the find was substantially wrong
and both it and this morning's bundle have been corrected in place. Not two
1975 towers but four cylinders across two twin-cylinder blocks, completed 1976.
And access is not 'a guard checks resident cards' — there are coded gates and
posted notices prohibiting entry and photography, put up because the Ghost in
the Shell shoot turned a residential estate into a backdrop. The bundle no
longer invites anyone through the gate, and this is emphatically not the pick.
2026-07-14 02:10:49 -04:00
rzen a1da03acc4 site: bundles — Not built to be visited, The page is the point
Pool was at exactly 25 (the nominal cluster threshold) but yesterday's cluster
run already judged its remainder un-clusterable, so re-clustering would only
re-litigate that. Two tight 3-item themes instead, neither padded: three places
built for living/working rather than visiting (the run's one real patch to a
travel axis that has been thin for a week), and three things that argue for the
handmade page by being one — which finally surfaces london-notebook-writing,
shortlisted-but-invisible since 07-04.
2026-07-14 02:00:16 -04:00
rzen 117f519c83 content: 2026-07-14 capture run — 20 finds across 9 productive sources
Dedup was the story: 56 candidates surfaced, 31 already captured (the daily
feeds largely re-served yesterday's items), 2 previously rejected on merit,
5 failed the bar today.

Shortlisted 10. Two items were demoted off the shortlist by the fact-check
step rather than before it — the Coleman stove's Snow Peak IGT compatibility
is not a claim Coleman makes (and it is backorder-only), and Shortverse is a
filmmaker hosting platform, not the viewer-facing short-film streamer it
looked like. Both stay as finds, honestly written.

5 Amazon links. Source maintenance: Kevin Kelly demoted weekly -> as-needed
(publishes, but the Technium is essays, never things); The Browser's free feed
now carries only 2 of 5 daily picks; two Reddit 429s recorded but not acted on
(same-domain subs succeeded, so it reads as throttling, not a block).
2026-07-14 01:58:13 -04:00
rzen 311e83470a site: pick of the day — The First Herculaneum Scroll, Read 2026-07-13 02:00:40 -04:00
rzen 2225785559 site: reviews — Herculaneum scroll, Zen Mode, The HTML Review (graduate from finds) 2026-07-13 01:59:54 -04:00
rzen 36e2614d19 site: cluster run — 7 bundles from the 46-find backlog 2026-07-13 01:53:32 -04:00
rzen 568c48ed38 content: 2026-07-13 capture run — 28 finds across 12 productive sources 2026-07-13 01:45:50 -04:00
rzen 1072e5faf3 site: upgrade Astro 5 → 7
- astro 7.0.7, @astrojs/mdx 7, sitemap 3.7, rss 4.0.19, check 0.9.9
- trailingSlash 'always' → 'ignore': Astro 7 generates prerender paths for
  dynamic extension endpoints (/categories/<c>/rss.xml) with a trailing
  slash under 'always' but builds their route patterns without one, so the
  build fails with "Missing parameter"; directory-format output is
  identical either way. Also removes the now-unneeded dev feed-slash shim.
- compressHTML: true pinned to keep pre-v7 whitespace behavior
- zod 4: import z from 'astro/zod' (astro:content re-export deprecated),
  z.string().url() → z.url()
- npm audit fix (fast-uri, fast-xml-builder, yaml)

Claude-Session: https://claude.ai/code/session_01WZaczDJjL3xZ3u5spsN5AL
2026-07-12 20:40:26 -04:00
rzen 9f6cc65ea8 site: review — Folo (graduate from find)
Fact-check against folo.is, its pricing page, and the GitHub README
corrected the license (AGPL-3.0, not GPL-3.0) and added mobile apps,
real pricing tiers, and the self-hosting caveat the find omitted.
2026-07-12 19:41:42 -04:00
rzen 9e5fce1eb0 site: topics axis + per-source indexes
Topics — the curated subscription layer: 18-value controlled vocabulary
in src/lib/topics.ts, enum-enforced by the content schema on finds and
reviews so unattended runs can't drift it. /topics/ index +
/topics/<t>/ pages with finds first-class alongside reviews, per-topic
RSS feeds that include finds (unlike category/tag feeds), "By topic"
section on /feeds/, Topics footer link and llms.txt section, dev-shim
coverage for the new feed URLs. daily-finds and build-review skills now
classify at capture/graduation time; "giftable" is a tag, never a
topic.

Per-source indexes: /sources/<slug>/ lists every review and find from a
source (catalog ∪ names in content, so retired sources resolve);
find/review colophons link "(more from this source)"; /sources/ cards
link "everything from this source →"; sub-3-item pages noindexed.

Claude-Session: https://claude.ai/code/session_01WZaczDJjL3xZ3u5spsN5AL
2026-07-12 19:39:11 -04:00
rzen be7263b912 site: review — Tintd 2 (graduate from find)
Fact-check against tintd.app and the App Store surfaced a version split:
the direct download is the real Tintd 2 (macOS 14+, one-time $9.99+),
while the Mac App Store listing is still the older v1.3.4 (macOS 13+,
subscription option) — Apple's review queue hasn't caught up yet.
2026-07-12 19:36:21 -04:00
rzen 12b3505c55 content: classify all finds and reviews into the topics vocabulary
864 finds + 64 reviews assigned 1-3 topics each from the new 18-topic
controlled vocabulary (src/lib/topics.ts, lands in the next site
commit). The retired gifts topic becomes a giftable tag on the 140
finds that carried it; 5 finds legitimately match no topic.

Claude-Session: https://claude.ai/code/session_01WZaczDJjL3xZ3u5spsN5AL
2026-07-12 19:34:15 -04:00
rzen b28bcd640f site: review — Paste Switch (graduate from find)
Fact-check against indieseek.co corrected the find's "no panel" claim
(there's a secondary status view) and added shortcut mechanics,
format limits, and pricing.
2026-07-12 19:30:42 -04:00
rzen 9f25db4b8f docs: start TODO.md — giftable-tag presentation idea
giftable is a facet, not a topic; parked the idea of giving it a
tasteful prominent surface once the gifts topic migrates to a tag.

Claude-Session: https://claude.ai/code/session_01WZaczDJjL3xZ3u5spsN5AL
2026-07-12 19:11:23 -04:00
rzen ff4c6959a5 site: tag pages include finds; find-only tags get pages
Tag pages are now generated from the union of entry and find tags —
1,179 tags that existed only on finds (most tag links on find pages)
previously 404'd. Tagged finds render in a compact secondary "Finds"
list below the entry grid, keeping the editorial tier on top. Find-only
tag pages with fewer than 3 finds are noindexed until they fill out.
Tag feeds stay entries-only; the RSS pill and autodiscovery link only
render where a feed exists. Category pages unchanged (finds have no
category).

Claude-Session: https://claude.ai/code/session_01WZaczDJjL3xZ3u5spsN5AL
2026-07-12 19:05:46 -04:00
rzen ccfee1c8b5 site: fix dev-server 404 on scoped feed URLs
With trailingSlash 'always', astro dev only matches dynamic-route
endpoints when the request has a trailing slash, so the RSS pill links
(/tags/<t>/rss.xml, /categories/<c>/rss.xml) 404'd locally while the
built site served them fine. Dev-only vite middleware rewrites those
requests to the slashed form.

Claude-Session: https://claude.ai/code/session_01WZaczDJjL3xZ3u5spsN5AL
2026-07-12 18:47:15 -04:00
rzen 1aa1216a9d site: visible RSS pill on category and tag pages
Autodiscovery alone is invisible since browsers dropped feed-detection
UI — add a small RSS pill in the subheader (new feedHref prop on
BaseLayout) linking to the page's scoped feed.

Claude-Session: https://claude.ai/code/session_01WZaczDJjL3xZ3u5spsN5AL
2026-07-12 18:41:20 -04:00
rzen 86ea4c8873 site: feeds everywhere + programmatic surface
Feeds: JSON Feed 1.1 at /feed.json, per-category and per-tag RSS at
/categories/<name>/rss.xml and /tags/<name>/rss.xml alongside the main
/rss.xml — all from a shared src/lib/feed.ts item source. Category/tag
pages advertise their scoped feed via autodiscovery; new /feeds/
directory page (footer-linked) lists every feed with counts; RSS feeds
gain an atom:link self reference and a feed.xsl stylesheet so they
render readably in browsers.

Programmatic readers: build-generated /llms.txt (site map with every
review/bundle/post), SearchAction on the WebSite JSON-LD wired to
/search/?q=, and a "For robots" section on /feeds/ documenting
search.json, llms.txt, the sitemap, and JSON-LD coverage.

Claude-Session: https://claude.ai/code/session_01WZaczDJjL3xZ3u5spsN5AL
2026-07-12 17:56:55 -04:00
rzen d91ebacf85 site: about — questions go to [email protected]
Claude-Session: https://claude.ai/code/session_0128nQd7R3P23CfRSVw82HZV
2026-07-12 08:06:19 -04:00
rzen 9c87155296 site: 4/3-column layout on all grid pages — bundle details, sources, search, tags, categories join in 2026-07-12 08:02:53 -04:00
rzen 99b55e4e19 site: back out wide layout — fixed 3/4-column masonry, fixes broken bundle pages
The width-tier system (full-bleed wide tier, body max-width tweens,
absolute-positioned FLIP masonry) is gone. Grid pages are 4 columns in a
55.5rem container (>=69rem viewport), everything else 3, with the existing
1-2 column steps on small screens. Masonry returns to real flex columns.

This also fixes bundle pages rendering as a diagonal card cascade: the old
.masonry > .masonry-tile { position: absolute } tied with FindCard's scoped
position: relative on specificity, and on bundle pages the FindCard rule won
the cascade order, leaving tiles in normal flow with masonry translate()
offsets stacked on top. Flex columns don't position tiles, so the tie is gone.

Kept from the motion pass: staggered tile reveal on initial load and
"Load more" (now via animation-delay), card hover lifts, button tactility.
2026-07-12 07:51:14 -04:00
rzen 7c86c0f97b site: pick of the day — David Rumsey Map Collection 2026-07-12 02:01:27 -04:00
rzen 1f78a5929a site: reviews — David Rumsey Map Collection, Cities and Memory, Marked QL (graduate from finds) 2026-07-12 02:00:41 -04:00
rzen 3f967a1950 site: bundles — Maps of the unmappable, The week's catch (Jul 5–12) 2026-07-12 01:55:31 -04:00
rzen 5c9e085cca content: 2026-07-12 capture run — 28 finds across 15 productive sources 2026-07-12 01:53:55 -04:00
rzen a0ea9c9690 site: motion & delight pass — media fades in, cards lift, grids ripple
- Images/videos fade in on load instead of popping (cached media renders
  instantly; nothing is hidden without JS)
- Cross-document view transitions: soft cross-fade between pages where
  supported
- Masonry reveals ripple: initial grid and "Load more" batches stagger in
  per-tile instead of blinking on at once
- Card hover: gentle -2px lift + slow image zoom on hero, home/grid tiles,
  and find cards; find-card lift switched to `translate` so it composes
  with the masonry's inline transform (it was silently dead before), and
  its transition list unified with .masonry-tile's to end their cascade tie
- Tactile press/lift on "Load more" and the external CTA button
- Accent-tinted ::selection, visible :focus-visible rings, smooth anchor
  scrolling; global prefers-reduced-motion catch-all disables it all

Claude-Session: https://claude.ai/code/session_01ADR9r5rw5NuvvnCxfYbMuc
2026-07-11 15:20:47 -04:00
rzen e06e7311d6 site: layout width tiers + masonry glide — column changes animate instead of snapping
Named width tiers (mobile/narrow/regular/wide) with body max-width easing
between them; grid pages opt in via BaseLayout `wide`. Masonry is now
absolute-positioned with FLIP glides on column-count changes: targets are
computed from the *final* container width (reading --max, which flips
instantly while max-width tweens), mid-glide column changes retarget
instead of being dropped, and container height eases so content below
rides along.

Claude-Session: https://claude.ai/code/session_01ADR9r5rw5NuvvnCxfYbMuc
2026-07-11 13:42:23 -04:00
rzen d51dd85a36 site: remove light/dark theme switch — light-only theme 2026-07-11 08:21:01 -04:00
rzen 7d1a6ab3ab site: pick of the day — Corelle Vitrelle Dinnerware (was: knife, per new guardrail) 2026-07-11 08:09:14 -04:00
rzen 0984cbce2a pipeline: pick-of-the-day guardrail — front page must be broadly, unmistakably benign 2026-07-11 08:09:14 -04:00
rzen fcfb487370 site: pick of the day — Böker Cable Knife 2026-07-11 01:58:48 -04:00
rzen 7ce2fda97f site: reviews — Böker Cable Knife, Wyrm Math, Corelle Vitrelle Dinnerware (graduate from finds) 2026-07-11 01:57:30 -04:00
rzen 1baac31f5a site: bundle — Nothing leaves the device 2026-07-11 01:49:12 -04:00
rzen c12a077e15 content: 2026-07-11 capture run — 27 finds across 13 productive sources 2026-07-11 01:45:17 -04:00
rzen dd499bc5ef site: end-of-review "Discuss it here" CTA linking the Stoop space 2026-07-10 19:28:59 -04:00
rzen 98cace5706 site: review — Eley Hose Nozzle (graduates from find) 2026-07-10 18:55:22 -04:00
rzen 068b7586fd content: log — 3 review graduations (2026-07-10) 2026-07-10 18:45:28 -04:00
rzen 5cd9228f22 site: review — App Monitor (graduates from find) 2026-07-10 18:45:28 -04:00
rzen 9f4d47b56d site: review — iPhone dumb-phone via Assistive Access (graduates from find) 2026-07-10 18:45:28 -04:00
rzen 40042a5e8a site: review — The 1911 Odyssey (graduates from find) 2026-07-10 18:45:28 -04:00
rzen d59550c473 pipeline: several reviews per run (judgment call), pick decision every run, auto-deploy note 2026-07-10 09:45:12 -04:00
rzen c60149d1f8 site: pick of the day — Picview 2026-07-10 01:56:47 -04:00
rzen 20ef9656ef site: reviews — Recall, Picview (graduate from finds) 2026-07-10 01:56:38 -04:00
rzen 2ca799366f site: bundle — Customizing the uncustomizable 2026-07-10 01:48:23 -04:00