site: editorial tooling, grid masonry fix, new reviews + finds
UI / dev tooling - /find/ index: sort by file birthtime desc (sub-day chronology even when many finds share the same frontmatter date); render the captured-at on its own line under the host (~0.65rem mono muted) - New dev-only filter at the top of /find/: All / Not in lists, persisted in localStorage; "not in lists" hides finds referenced by any superpost - New editorial-tags chip strip on each find card (dev-only): selected tags visible by default, full picker on hover/focus-within with a "…" button for arbitrary tag entry; clicks copy /edit-find-tag <slug> <tag> to the clipboard via the existing EditConfirm singleton - New optional editorialTags: string[] field on the find collection - New src/data/editorial-tags.json — master list of available tags (initial set: ["delete"]); display order follows file order /grid/ now uses the JS Masonry component instead of CSS column-count, so the middle column no longer "dips"; tile hover updated to match the home page's accent-glow / no-translate style Content - New review: apex-markdown-processor (graduated from find of same slug; hero reused from the find folder) - New review: sindre-sorhus-older-mac-apps (graduated; intentionally hero-less per the source page's text-only design) - New review: superkey (added by user; hero wired in src/lib/hero.ts) - 24 new finds captured by /daily-finds across travel, jokes, quotes, product picks, and indie tools - 2 new finds superposts: 2026-05-04-a-small-atlas, 2026-05-04-off-until-needed Misc - daily-finds.log.md and candidate-sources.md updated with the day's runs - build-finds skill prompt iterated by user
@@ -21,15 +21,41 @@ Invoke from inside the `unique.rzen.dev` repo.
|
||||
|
||||
### 1. Determine candidate pool
|
||||
|
||||
- If the user provided explicit slugs: use those.
|
||||
- If the user provided a theme phrase only: scan all finds, surface the 8–12 that best fit the theme.
|
||||
- If neither: scan recent (last ~14 days) finds that are **not yet referenced** by any existing superpost (read every `items[]` array; subtract). From the unreferenced pool, propose 1–3 thematic clusters of 5–10 finds each, with a candidate theme phrase per cluster.
|
||||
- **If the user provided explicit slugs (seed mode)** — usually the case when the user clicks the "Make a finds collection" button on `/find/`. Treat the slugs as a *seed*, not a final list.
|
||||
1. Read each seed find's frontmatter (`tags`, `topics`, `subtitle`, `description`) and body.
|
||||
2. Infer the through-line — the smallest phrase that captures what these finds have in common (a virtue, a use, a feeling, a structural pattern). Lean specific. Good: *"single-virtue tools"*, *"things that pour clean"*, *"objects that exist for no reason except someone wanted them to"*, *"vintage-leaning everyday carry"*. Bad: *"useful things"*, *"cool stuff"*.
|
||||
3. Compute the **unreferenced pool**: every find that does NOT appear in the `items[]` array of any existing `src/content/finds/*.mdx` superpost. The seed slugs may or may not be in this pool — they're the seed regardless.
|
||||
4. From the unreferenced pool, find every entry that fits the inferred theme. Use frontmatter signals (tags, topics, subtitle) and body content. Don't reach: three weakly-fitting items is worse than zero. If a candidate's fit feels strained, drop it.
|
||||
5. Combine `seed + qualifying unreferenced matches`, deduped. Cap at **8 total** (per sizing notes below). If the combined list exceeds 8, drop the weakest fits — never drop a seed slug; if the seed itself is more than 8, ask the user which to drop.
|
||||
6. Produce one cluster (theme phrase + final items list). Continue to step 2 to confirm before writing.
|
||||
|
||||
- **If the user provided a theme phrase only:** scan all finds, surface the 8–12 that best fit the theme.
|
||||
|
||||
- **If neither:** scan recent (last ~14 days) finds that are not yet referenced by any existing superpost. From the unreferenced pool, propose 1–3 thematic clusters of 5–10 finds each, with a candidate theme phrase per cluster.
|
||||
|
||||
Re-use is allowed — a find can appear in multiple superposts under different themes. But by default, prefer surfacing **unreferenced** finds first; only reach for re-uses when the theme genuinely calls for them.
|
||||
|
||||
### 2. Confirm the cluster
|
||||
|
||||
If proposing clusters, show the user:
|
||||
Always show the proposed cluster(s) before writing anything. The exact format depends on which path step 1 took.
|
||||
|
||||
**Seed mode** (slugs given) — split the seed from the expansion so the user can see what the inferred theme pulled in:
|
||||
|
||||
```
|
||||
Theme inferred from seed: "<theme phrase>"
|
||||
|
||||
Seed (your selection):
|
||||
- <slug>: <name>
|
||||
- ...
|
||||
|
||||
Expansion (unreferenced finds matching the theme):
|
||||
- <slug>: <name>
|
||||
- ...
|
||||
|
||||
Final list (capped at 8): <N> items
|
||||
```
|
||||
|
||||
**Multi-cluster mode** (no input):
|
||||
|
||||
```
|
||||
Cluster A — "<theme phrase>"
|
||||
@@ -41,7 +67,7 @@ Cluster B — "<theme phrase>"
|
||||
...
|
||||
```
|
||||
|
||||
Wait for the user to pick a cluster (or refine). Don't write anything until confirmed.
|
||||
Wait for the user to confirm, refine the theme phrase, or drop/swap items. Don't write anything until confirmed.
|
||||
|
||||
### 3. Write the superpost
|
||||
|
||||
|
||||
@@ -2,6 +2,11 @@
|
||||
|
||||
Newly nominated sources awaiting review before promotion to `sources.json`. Each entry says where it came from and the case for adding it. Vet manually, then move to the main list.
|
||||
|
||||
## 2026-05-04
|
||||
|
||||
- **Tokyo Paladin** — https://tokyopaladin.substack.com/ — surfaced via Daring Fireball Linked List crediting their post on Noir, the Yamazaki "Japanese Oreo." Substack focused on Japanese consumer products and cultural curiosities, in the vein of "things you can only buy in Japan that quietly outclass their global competitors." Substack feed should be curl-friendly via the standard `/feed` pattern. Strong candidate for the gifts and general-delight buckets.
|
||||
- **PetaPixel** — https://petapixel.com/ — surfaced via Kottke link to NASA's Artemis II photo dump. Long-running photography publication; coverage spans gear, photo essays, and historical archives — overlaps general-delight (photo finds) more than tools. WebFetch-friendly historically. Vet for noise-vs-signal across topics before adding.
|
||||
|
||||
## 2026-05-03
|
||||
|
||||
- **Robin Good's "Best Curated Newsletters"** — https://robingood.substack.com/ — surfaced via WebSearch. Annual list of curated newsletters; less a daily-find source than a yearly source-of-sources to scan once and harvest. Worth checking the most recent edition for newsletters in our brief that we don't yet track.
|
||||
|
||||
@@ -2,6 +2,80 @@
|
||||
|
||||
Running record of every candidate surfaced by `/daily-finds`. The chosen pick of the day is prepended with `[chosen]`. Source attribution per candidate lets us track which sources produce winners over time.
|
||||
|
||||
## 2026-05-04 — review: apex-markdown-processor
|
||||
|
||||
Graduated from find captured 2026-05-04, source: Brett Terpstra. Reused the find's hero.png (terminal-rendering screenshot). Category `writing`; tags merge the find's set with `macos` and `open-source`.
|
||||
|
||||
## 2026-05-04 — review: sindre-sorhus-older-mac-apps
|
||||
|
||||
Graduated from find captured 2026-05-04, source: r/macapps. New category `indie` introduced for the editorial-about-developer-practice angle (no existing category fit). No hero asset — `sindresorhus.com/apps/older-versions` is intentionally text-only (no `og:image`, no `<img>` tags, only an inline SVG favicon); review matches the find in being hero-less.
|
||||
|
||||
## 2026-05-04 — capture run
|
||||
|
||||
Sources scanned: 60 total — 16 hits, ~24 empty/unproductive, 11 blocked/broken, 9 skipped (per sources.json `fetch: skip`).
|
||||
Productive sources: r/macapps (1), Brett Terpstra (2), Hacker News — Show HN (1), Tools and Toys (1), Kikkerland (2), Kottke.org (2), Open Culture (1), Daring Fireball — Linked List (1), Boutique Homes (1), Wallpaper* Travel (1), The Outbound Collective (1), Roadtrippers Magazine (2), AFAR (1), Quote Investigator (3), The Marginalian (2), r/dadjokes (3).
|
||||
Unproductive but live: MacStories (top items already captured 2026-05-03), One Thing Well (top posts already captured), Six Colors (storage-tip post + travel-tech post — only known products), Cool Tools (Embassy of the Free Mind already captured + Frequent Fliers / Pants / Injection-Enormous Smallness all roundup-format, no single virtue), Recomendo (issue #513 = Stillgram/Aootek/Magnified Sand — all three already captured 2026-05-03), Cool Material (only feature-essays and partner posts), Kevin Kelly thetechnium (essays + weekly link roundups, no new specific products), Carryology (4 posts — only the Wingback SOLIDSTATE buckle is product-specific, but it's a Kickstarter shipping October 2026 → fails "currently buyable"), A Continuous Lean (2024-2025 posts only), Put This On (internal shop posts and evergreen guides), Standard & Strange Journal (Field Guides — historical garment essays), Outlier (Injex/Cannabiscotton/Ramielust drops with no readable virtues), Snow Peak (SPA — only nav anchors), Messy Nessy Chic (Vol. 772 just published; per-item links inside aren't extractable from the index summary), Things Magazine (link roundups), OSXDaily (procedural tips this week — Secure Erase, Compromised Passwords, WindowServer fix — none rise above generic how-to), The Eclectic Light Company (already-captured Finder Tags post + niche VM internals), Dr. Drang — leancrew.com (4 posts — Apple-accessory commentary and email-blocking critiques), Werd.com (10 best-of listicles), StyleForum (homepage shows only affiliate vendor threads), Atlas Obscura (curl returned articles index but no qualifying virtues extractable), r/BuyItForLife (anecdote photos and "is this legit?" posts), r/shortcuts (top item is dynamic-wallpaper recreation — link is image-only with no canonical iCloud Shortcut URL in the body), Wikiquote (recent edits don't surface easily-quotable picks), Uses This (interview titles only — tools live behind individual interview pages this run), Hacker News — Show HN (~half are dev-libs / dashboards; only Snewpapers crossed the bar), Product Hunt (not productive in prior runs, skipped this sweep).
|
||||
Blocked or broken this run: TidBITS (WebFetch 403 — persistent across runs), Uncommon Goods (`/new-arrivals` and `/fun/new-arrivals` both 404 — needs URL audit), Kikkerland `/collections/new-products` 404 (used `/collections/all` as workaround), Snow Peak `/collections/new-arrivals` (Shopify SPA — same root cause as MoMA), MoMA Design Store (still SPA — only `moma-e-gift-card` extractable, third run with this signature), Unusual Hotels of the World (4KB SPA shell again — third confirmation, should be `fetch: skip`), 9to5Mac `/guides/` (renders only category nav on the homepage — needs a per-category fetchUrl override), A.Word.A.Day (homepage doesn't show the daily entry inline — needs a `fetchUrl` override pointing at `/words/today.html`), icanhazdadjoke API (`/api/random?count=15` 404 — endpoint syntax may have changed), snewpapers.com (returns HTTP 406 "Your browser is not supported" to iPhone Safari UA — still wrote the find from the Show HN summary, hero fetch failed), Reader's Digest Jokes (skipped this run — known persistent 403).
|
||||
Skipped (per sources.json): The Sweet Setup, Indie App Sunday (Mastodon), Gear Patrol, The Awesomer, Permanent Style, Heddels, Mr Porter Journal, Spotted by Locals, The Browser.
|
||||
|
||||
### Captured finds
|
||||
|
||||
- sindre-sorhus-older-mac-apps — Sindre Sorhus' Older-macOS App Versions — source: r/macapps
|
||||
- terminal-widget — TerminalWidget — source: Brett Terpstra
|
||||
- apex-markdown-processor — Apex Markdown Processor — source: Brett Terpstra
|
||||
- snewpapers-newspaper-archive — Snewpapers — source: Hacker News — Show HN
|
||||
- anker-8in1-usbc-hub-tablet-stand — Anker 8-in-1 USB-C Hub & Tablet Stand — source: Tools and Toys
|
||||
- kikkerland-mozart-kitchen-timer — Mozart Kitchen Timer — source: Kikkerland
|
||||
- kikkerland-luchador-bottle-openers — Luchador Bottle Openers — source: Kikkerland
|
||||
- cursor-camp-neal-fun — Cursor Camp — source: Kottke.org
|
||||
- unsolicited-book-covers — Jenny Volvovski's Unsolicited Book Covers — source: Kottke.org
|
||||
- and-vinyly-ashes-records — And Vinyly — source: Open Culture
|
||||
- noir-japanese-cookies — Noir (Yamazaki) — source: Daring Fireball — Linked List
|
||||
- torre-da-bora — Torre Da Bora — source: Boutique Homes
|
||||
- kai-hakone-ryokan — Kai Hakone — source: Wallpaper* Travel
|
||||
- garden-of-eden-swimming-hole — Garden of Eden Swimming Hole — source: The Outbound Collective
|
||||
- seward-time-capsule — World's Largest Time Capsule, Seward NE — source: Roadtrippers Magazine
|
||||
- gemini-giant-route-66 — Gemini Giant — source: Roadtrippers Magazine
|
||||
- nimmo-bay-resort — Nimmo Bay Resort — source: AFAR
|
||||
- quote-reeve-superman-wisdom — Christopher Reeve — Superman wisdom — source: Quote Investigator
|
||||
- quote-hinton-immortality — Geoffrey Hinton — secret of immortality — source: Quote Investigator
|
||||
- quote-goldwyn-new-cliches — Samuel Goldwyn — "Let's have some new clichés" — source: Quote Investigator
|
||||
- hesse-on-wonder-education — Hermann Hesse on Wonder & Education — source: The Marginalian
|
||||
- white-merlyn-learn-something — T.H. White / Merlyn — "the best thing for being sad" — source: The Marginalian
|
||||
- joke-wee-cough — The Wee Cough Joke — source: r/dadjokes
|
||||
- joke-emineminence — The Emineminence Joke — source: r/dadjokes
|
||||
- joke-tinder-matches — The Tinder Matches Joke — source: r/dadjokes
|
||||
|
||||
### Hero coverage
|
||||
|
||||
- Heroes saved: 15 of 16 attempted (sindre-sorhus + 5 quotes + 3 jokes intentionally text-only).
|
||||
- Single hero failure: snewpapers-newspaper-archive — site returns HTTP 406 "browser not supported" to iPhone Safari UA, no extractable images on the rendered shell, topic doesn't lend itself to a Wikipedia fallback. Accepted as no-hero.
|
||||
- Wikipedia fallback used: garden-of-eden-swimming-hole → `Henry_Cowell_Redwoods_State_Park` og:image (the Outbound article's own og:image was a Mapbox map tile, deleted).
|
||||
- Brand-site screenshot fallback used: terminal-widget → `cdn.terminalwidget.app/.../widgets-700.21.jpg` (no og:image on the homepage; the source page links only to favicons).
|
||||
- Roadtrippers featured-image fallback used: seward-time-capsule → article-page `<img>` (no og:image meta despite the article having a hero — pattern worth noting for next pass).
|
||||
- Press-article fallback used: and-vinyly-ashes-records → Open Culture article og:image (the Wix-hosted andvinyly.com homepage has only a 192px logo).
|
||||
|
||||
### New source nominees
|
||||
|
||||
2 this run (see candidate-sources.md):
|
||||
- Tokyo Paladin (substack) — surfaced via Daring Fireball Linked List crediting their Noir cookies post.
|
||||
- PetaPixel — surfaced via Kottke linking to their NASA Artemis II coverage.
|
||||
|
||||
No targeted WebSearch this run; candidate-sources.md is already healthy with un-vetted nominees from prior sweeps.
|
||||
|
||||
### Source maintenance for next pruning pass
|
||||
|
||||
- **Unusual Hotels of the World**: third run in a row returns the 4KB `<title>Uhotw</title>` SPA shell. Time to switch to `fetch: skip` with `skipReason: "Single-page-app shell — homepage HTML contains no content; would need a headless browser."`
|
||||
- **MoMA Design Store**: third run with the same signature (1.2MB curl body, only the `moma-e-gift-card` slug extractable from the nav). The `/collections/new.json` Shopify default returned nothing in past attempts. Mark `fetch: skip` until a JSON endpoint is identified, or accept this source is permanently nav-only.
|
||||
- **Uncommon Goods**: `/new-arrivals` 404'd this run (worked in 2026-05-03 round 1). `/fun/new-arrivals` also 404'd. The path may be `/products/new` or `/c/new`. Audit the live storefront to find the canonical new-arrivals URL.
|
||||
- **Kikkerland**: `/collections/new-products` 404'd. Used `/collections/all` as a workaround but it's noisy. Audit whether the canonical "new" path is `/collections/new-arrivals` or `/collections/new`.
|
||||
- **9to5Mac Guides**: the `/guides/` page renders only category navigation, not articles. Either point `fetchUrl` at a specific category like `/guides/macos-tips/` or accept this source needs per-topic deep links.
|
||||
- **A.Word.A.Day**: homepage doesn't display the daily entry inline. The actual word lives at `/words/today.html`. Add `fetchUrl: "https://wordsmith.org/words/today.html"`.
|
||||
- **icanhazdadjoke API**: `/api/random?count=15` returned 404. Their canonical multi-joke endpoint may have moved; the single-joke endpoint `/` with `Accept: application/json` should still work as a fallback.
|
||||
- **Atlas Obscura**: the article-index curl works but neither the place-detail nor article-detail pages yield extractable virtues consistently. After three runs of this same pattern, lower the editorial expectation — treat AO as a "title harvester" only and skip writing finds unless the title alone passes the bar (rarely safe).
|
||||
- **snewpapers.com**: HTTP 406 to standard browser UA on the homepage. Worth experimenting with a UA that includes specific `Accept-Language` and `Accept` headers — they may be filtering on those rather than on the User-Agent string itself.
|
||||
- **Roadtrippers**: articles do have hero images but no `og:image` meta tag — the hero fetcher needs a fallback to the first content `<img>` on the page when og:image is missing.
|
||||
|
||||
## 2026-05-03 — capture run (full sweep, expanded sources)
|
||||
|
||||
Sources scanned: 61 total — 24 hits, ~17 empty/unproductive, 11 blocked/broken, 9 skipped (per sources.json `fetch: skip`).
|
||||
@@ -246,3 +320,38 @@ Notable patterns / SKILL.md update candidates:
|
||||
- **Amazon CAPTCHA is now triggered even by iPhone Safari UA** for some delisted ASINs (B0BTFG5YJK responded with the same `opfcaptcha.amazon.com` stub on mobile UA as on desktop). The mobile-UA workaround still works for *live* products but not for delisted ones — for delisted, fall straight through to brand-site / Wayback / press.
|
||||
- **Bear Blog and Smol Pub are text-only platforms that systematically lack og:image**. Worth maintaining a small allowlist of "skip image search, mark text-only" hosts (`*.bearblog.dev`, `smol.pub`, `m15o.smol.pub`, etc.) so the fetcher doesn't waste a Wayback round trip.
|
||||
- **Wayback Machine 404s are quick to detect**: the response is a full 152KB `Wayback Machine` HTML shell containing the literal string `404`. A grep for `<title>Wayback Machine</title>` plus `404` in body short-circuits the fetch.
|
||||
|
||||
## 2026-05-04 — superpost: Off until needed
|
||||
|
||||
Slug: 2026-05-04-off-until-needed
|
||||
Seed: aootek-solar-fence-lights (already in 2026-05-03-backyard-small-upgrades; reused under a different theme).
|
||||
Inferred theme from seed; expanded with five unreferenced software-summon-er finds.
|
||||
|
||||
Items referenced:
|
||||
- aootek-solar-fence-lights
|
||||
- superkey
|
||||
- paletro
|
||||
- wooshy
|
||||
- wayback-multi-search-shortcut
|
||||
- circle-to-search
|
||||
|
||||
## 2026-05-04 — review: superkey
|
||||
|
||||
Graduated from find captured 2026-05-03, source: Brett Terpstra.
|
||||
Hero: replaced the find's app-icon hero with the Seek-feature screenshot from superkey.app (1800×950, 192 KB), which actually shows the OCR-driven click in action.
|
||||
|
||||
## 2026-05-04 — superpost: A small atlas
|
||||
|
||||
Slug: 2026-05-04-a-small-atlas
|
||||
Theme: travel destinations, each on a single specific note.
|
||||
All 8 items previously unreferenced.
|
||||
|
||||
Items referenced:
|
||||
- capella-kyoto
|
||||
- atacama-superblooms
|
||||
- casa-nano-tokyo
|
||||
- diamond-fork-hot-springs
|
||||
- hotel-villa-colette-cap-ferret
|
||||
- honu-villa-joshua-tree
|
||||
- azuma-farm-koiwai
|
||||
- blue-whale-of-catoosa
|
||||
|
||||
@@ -102,6 +102,17 @@
|
||||
}.`;
|
||||
}
|
||||
|
||||
if (btn.dataset.editAction === 'tag-prompt') {
|
||||
const slug = btn.dataset.slug || '';
|
||||
const name = btn.dataset.name || slug;
|
||||
const raw = window.prompt(`Custom tag for "${name}":`);
|
||||
if (!raw) return;
|
||||
const tag = raw.trim().toLowerCase().replace(/\s+/g, '-');
|
||||
if (!tag) return;
|
||||
command = `/edit-find-tag ${slug} ${tag}`;
|
||||
description = `Tag "${name}" with "${tag}".`;
|
||||
}
|
||||
|
||||
openModal({ command, description });
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -6,9 +6,22 @@ import SourceBadge from './SourceBadge.astro';
|
||||
|
||||
interface Props {
|
||||
item: FindItem;
|
||||
inList?: boolean;
|
||||
capturedAt?: Date;
|
||||
availableTags?: string[];
|
||||
}
|
||||
const { item } = Astro.props;
|
||||
const { item, inList, capturedAt, availableTags = [] } = Astro.props;
|
||||
const hero = findHero(item.id);
|
||||
const showInListAttr = import.meta.env.DEV && inList !== undefined;
|
||||
const selectedTags: string[] = item.data.editorialTags ?? [];
|
||||
const selectedSet = new Set(selectedTags);
|
||||
|
||||
const fmtCaptured = new Intl.DateTimeFormat('en-US', {
|
||||
month: 'short',
|
||||
day: 'numeric',
|
||||
hour: 'numeric',
|
||||
minute: '2-digit',
|
||||
});
|
||||
|
||||
function host(url: string) {
|
||||
try {
|
||||
@@ -19,7 +32,10 @@ function host(url: string) {
|
||||
}
|
||||
---
|
||||
|
||||
<article class:list={['find-card', { 'has-hero': !!hero }]}>
|
||||
<article
|
||||
class:list={['find-card', { 'has-hero': !!hero }]}
|
||||
data-in-list={showInListAttr ? String(inList) : undefined}
|
||||
>
|
||||
{import.meta.env.DEV && (
|
||||
<label class="edit-checkbox" aria-label={`Select ${item.data.name}`}>
|
||||
<input type="checkbox" data-find-checkbox data-slug={item.id} />
|
||||
@@ -46,6 +62,54 @@ function host(url: string) {
|
||||
<span class="ext-label">→</span>
|
||||
<span class="host">{host(item.data.link)}</span>
|
||||
</p>
|
||||
{capturedAt && capturedAt.valueOf() > 0 && (
|
||||
<p class="captured-at-row">
|
||||
<time datetime={capturedAt.toISOString()} class="captured-at">
|
||||
{fmtCaptured.format(capturedAt)}
|
||||
</time>
|
||||
</p>
|
||||
)}
|
||||
|
||||
{import.meta.env.DEV && (
|
||||
<div class="edit-tags">
|
||||
{selectedTags.length > 0 && (
|
||||
<div class="edit-tags-selected" aria-hidden="true">
|
||||
{selectedTags.map((tag) => (
|
||||
<span class={`edit-tag is-selected ${tag === 'delete' ? 'is-delete' : ''}`}>{tag}</span>
|
||||
))}
|
||||
</div>
|
||||
)}
|
||||
<div class="edit-tags-picker" role="group" aria-label="Editorial tags">
|
||||
{availableTags.map((tag) => (
|
||||
<button
|
||||
type="button"
|
||||
class:list={[
|
||||
'edit-tag',
|
||||
{ 'is-selected': selectedSet.has(tag), 'is-delete': tag === 'delete' },
|
||||
]}
|
||||
data-edit-action="copy"
|
||||
data-command={`/edit-find-tag ${item.id} ${tag}`}
|
||||
data-confirm={selectedSet.has(tag)
|
||||
? `Remove "${tag}" from "${item.data.name}".`
|
||||
: `Tag "${item.data.name}" with "${tag}".`}
|
||||
>
|
||||
{tag}
|
||||
</button>
|
||||
))}
|
||||
<button
|
||||
type="button"
|
||||
class="edit-tag edit-tag-prompt"
|
||||
data-edit-action="tag-prompt"
|
||||
data-slug={item.id}
|
||||
data-name={item.data.name}
|
||||
aria-label="Add custom tag"
|
||||
title="Add custom tag"
|
||||
>
|
||||
…
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</article>
|
||||
|
||||
@@ -124,6 +188,81 @@ function host(url: string) {
|
||||
}
|
||||
.ext-label { color: var(--accent); font-family: ui-sans-serif, system-ui, sans-serif; }
|
||||
|
||||
.captured-at-row {
|
||||
margin: 0.25rem 0 0;
|
||||
line-height: 1;
|
||||
}
|
||||
.captured-at {
|
||||
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
|
||||
font-size: 0.65rem;
|
||||
color: var(--muted);
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
/* Editorial tags (dev-only) */
|
||||
.edit-tags {
|
||||
margin-top: 0.55rem;
|
||||
position: relative;
|
||||
z-index: 2;
|
||||
}
|
||||
.edit-tags-selected,
|
||||
.edit-tags-picker {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 0.3rem;
|
||||
}
|
||||
.edit-tags-picker { display: none; }
|
||||
.find-card:hover .edit-tags-selected,
|
||||
.find-card:focus-within .edit-tags-selected { display: none; }
|
||||
.find-card:hover .edit-tags-picker,
|
||||
.find-card:focus-within .edit-tags-picker { display: flex; }
|
||||
|
||||
.edit-tag {
|
||||
font-family: ui-sans-serif, system-ui, -apple-system, 'Helvetica Neue', sans-serif;
|
||||
font-size: 0.68rem;
|
||||
font-weight: 600;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.06em;
|
||||
line-height: 1;
|
||||
padding: 0.28rem 0.55rem;
|
||||
margin: 0;
|
||||
border-radius: 999px;
|
||||
border: 1px solid var(--rule);
|
||||
background: transparent;
|
||||
color: var(--muted);
|
||||
cursor: pointer;
|
||||
transition: background 0.12s ease, color 0.12s ease, border-color 0.12s ease;
|
||||
}
|
||||
button.edit-tag { font: inherit; font-size: 0.68rem; font-weight: 600; }
|
||||
.edit-tag:hover {
|
||||
color: var(--accent);
|
||||
border-color: color-mix(in srgb, var(--accent) 40%, var(--rule));
|
||||
}
|
||||
.edit-tag.is-selected {
|
||||
color: var(--bg);
|
||||
background: var(--fg);
|
||||
border-color: var(--fg);
|
||||
}
|
||||
.edit-tag.is-selected:hover {
|
||||
background: color-mix(in srgb, var(--fg) 85%, var(--accent));
|
||||
color: var(--bg);
|
||||
border-color: color-mix(in srgb, var(--fg) 85%, var(--accent));
|
||||
}
|
||||
.edit-tag.is-delete {
|
||||
color: #c0392b;
|
||||
border-color: color-mix(in srgb, #c0392b 35%, var(--rule));
|
||||
}
|
||||
.edit-tag.is-delete.is-selected {
|
||||
background: #c0392b;
|
||||
color: #fff;
|
||||
border-color: #c0392b;
|
||||
}
|
||||
.edit-tag-prompt {
|
||||
font-size: 0.85rem;
|
||||
padding: 0.1rem 0.6rem 0.18rem;
|
||||
color: var(--muted);
|
||||
}
|
||||
|
||||
.edit-checkbox {
|
||||
position: absolute;
|
||||
top: 0.5rem;
|
||||
|
||||
@@ -56,6 +56,7 @@ const find = defineCollection({
|
||||
tags: z.array(z.string()).default([]),
|
||||
description: z.string().optional(),
|
||||
promotedTo: z.string().optional(),
|
||||
editorialTags: z.array(z.string()).default([]),
|
||||
}),
|
||||
});
|
||||
|
||||
|
||||
|
After Width: | Height: | Size: 502 KiB |
@@ -0,0 +1,14 @@
|
||||
---
|
||||
name: "And Vinyly"
|
||||
subtitle: "A UK service that presses your cremated remains into a playable vinyl record"
|
||||
date: 2026-05-04
|
||||
link: "https://www.andvinyly.com/"
|
||||
source: "Open Culture"
|
||||
topics:
|
||||
- general-delight
|
||||
- gifts
|
||||
tags: [memorial, vinyl, oddity, uk]
|
||||
description: "A UK company that has been pressing cremation ashes into playable vinyl records since 2009 — voice, music, nature sounds, or thirty minutes of silence."
|
||||
---
|
||||
|
||||
And Vinyly has been quietly running since 2009: send them cremated remains and they press them into playable vinyl records. The grooves can hold whatever you want — a recorded voice, a piece of music, ambient sound from a meaningful place, or, if you prefer, thirty minutes of silence. £1,000 to £3,000 depending on how many records you want pressed. A genuinely strange and tender alternative to a headstone.
|
||||
|
After Width: | Height: | Size: 146 KiB |
@@ -0,0 +1,14 @@
|
||||
---
|
||||
name: "Anker 8-in-1 USB-C Hub & Tablet Stand"
|
||||
subtitle: "Eight ports plus an angled stand, so an iPad Pro becomes a real workstation"
|
||||
date: 2026-05-04
|
||||
link: "https://toolsandtoys.net/anker-8-in-1-usb-c-hub-tablet-stand/"
|
||||
linkText: "toolsandtoys.net"
|
||||
source: "Tools and Toys"
|
||||
topics:
|
||||
- tools
|
||||
tags: [ipad, usb-c, hub, desk-setup, anker]
|
||||
description: "Anker's hub doubles as a tablet stand: eight ports plus a fixed viewing angle so an iPad Pro pairs with an external keyboard, mouse, and monitor as a single-cable workstation."
|
||||
---
|
||||
|
||||
Most USB-C hubs are dongles you forget about. This Anker is a stand first — a chunk of weighted plastic angled for a 13" iPad Pro that happens to expose eight ports along its base. Plug the iPad in once and you have HDMI, Ethernet, SD/microSD, three USB-A, and pass-through power without the hub flopping around behind the screen. The trick is the form factor: it stops the iPad from being a tablet pretending to be a laptop and gives it a permanent dock-like home on the desk.
|
||||
|
After Width: | Height: | Size: 495 KiB |
@@ -0,0 +1,15 @@
|
||||
---
|
||||
name: "Apex Markdown Processor"
|
||||
subtitle: "One Markdown tool that renders every dialect — and shows images in your terminal"
|
||||
date: 2026-05-04
|
||||
link: "https://github.com/ApexMarkdown/apex"
|
||||
source: "Brett Terpstra"
|
||||
topics:
|
||||
- macos-apps
|
||||
- apple-tips
|
||||
tags: [markdown, terminal, cli, writing, brett-terpstra]
|
||||
description: "Brett Terpstra's Markdown processor that combines CommonMark, GFM, MultiMarkdown, Kramdown, and Marked features in one tool — and renders inline images directly in the terminal via ANSI."
|
||||
promotedTo: "apex-markdown-processor"
|
||||
---
|
||||
|
||||
Apex collapses the choose-your-flavor problem of Markdown by speaking CommonMark, GitHub Flavored, MultiMarkdown, Kramdown, and Marked simultaneously, with tables, citations, file inclusion, fenced divs, and an extensible plugin system on top. The unique party trick is image rendering in the terminal: pipe a Markdown file through Apex and your inline screenshots actually appear in iTerm or any ANSI-capable terminal, instead of being silently dropped. Useful for everything from a quick blog draft to building documentation pipelines that stay readable at the command line.
|
||||
|
After Width: | Height: | Size: 184 KiB |
@@ -0,0 +1,13 @@
|
||||
---
|
||||
name: "Cursor Camp"
|
||||
subtitle: "Neal.fun's playground for browser cursors"
|
||||
date: 2026-05-04
|
||||
link: "https://neal.fun/cursor-camp/"
|
||||
source: "Kottke.org"
|
||||
topics:
|
||||
- general-delight
|
||||
tags: [neal-fun, browser, play, web-toy]
|
||||
description: "Another small browser-based delight from Neal Agarwal — a playground that turns the humble mouse cursor into the toy."
|
||||
---
|
||||
|
||||
Neal.fun keeps shipping the kind of single-page browser experiences the early web promised — small, weird, requires no account, and you smile within five seconds. Cursor Camp puts the mouse pointer at the centre of the experience: a spinning wheel of cursor variants you can summon and play with. It takes about two minutes and you'll forward it to a friend.
|
||||
|
After Width: | Height: | Size: 87 KiB |
@@ -0,0 +1,14 @@
|
||||
---
|
||||
name: "Garden of Eden Swimming Hole"
|
||||
subtitle: "A 10-minute hike off Route 9 to a wide sandy beach in the Henry Cowell Redwoods"
|
||||
date: 2026-05-04
|
||||
link: "https://www.theoutbound.com/san-francisco/hiking/hike-to-the-garden-of-eden-swimming-hole"
|
||||
linkText: "theoutbound.com"
|
||||
source: "The Outbound Collective"
|
||||
topics:
|
||||
- travel
|
||||
tags: [california, swimming, redwoods, day-hike, santa-cruz]
|
||||
description: "A short steep trail off Route 9 in Henry Cowell Redwoods drops to a wide sandy beach with clear water and rocks for jumping — a Santa Cruz Mountains locals' day-trip."
|
||||
---
|
||||
|
||||
Garden of Eden is the kind of swimming hole the locals drive past on their way home from work and the rest of us would never find. Pull off Route 9 in Henry Cowell Redwoods near Felton, take a steep ten-to-fifteen-minute trail down, and you're at a wide sandy beach on the San Lorenzo River with clear water and rock formations the right height for jumping in. Best on a weekday in late spring through early autumn — weekends bring a crowd.
|
||||
|
After Width: | Height: | Size: 85 KiB |
@@ -0,0 +1,14 @@
|
||||
---
|
||||
name: "Gemini Giant"
|
||||
subtitle: "A 28-foot fiberglass astronaut Muffler Man, restored and re-erected in Wilmington, Illinois"
|
||||
date: 2026-05-04
|
||||
link: "https://roadtrippers.com/magazine/rediscovering-route-66-gemini-giant/"
|
||||
linkText: "roadtrippers.com"
|
||||
source: "Roadtrippers Magazine"
|
||||
topics:
|
||||
- travel
|
||||
tags: [illinois, route-66, americana, muffler-man, statue]
|
||||
description: "The Gemini Giant — a 28-foot fiberglass astronaut from the Muffler Men family, built in the 1960s for The Launching Pad Diner — was rescued, restored, and re-unveiled in Wilmington's South Island Park in November 2024."
|
||||
---
|
||||
|
||||
The Gemini Giant is a 28-foot fiberglass astronaut Muffler Man, complete with helmet and rocket, that stood outside The Launching Pad Diner in Wilmington, Illinois from the early 1960s as a roadside ad for Route 66 travellers. When the diner shuttered in 2022 the statue was at risk of being scrapped; the Joliet Area Historical Society rescued it, restored it to original condition, and re-erected it at South Island Park in November 2024. The Mother Road's space-age era preserved as it should be — outdoors and free to visit.
|
||||
@@ -0,0 +1,17 @@
|
||||
---
|
||||
name: "Hermann Hesse on Wonder and the Aim of Education"
|
||||
subtitle: "On schools that teach counting and measuring over delight"
|
||||
date: 2026-05-04
|
||||
link: "https://www.themarginalian.org/2026/05/04/hermann-hesse-wonder-butterflies/"
|
||||
linkText: "themarginalian.org"
|
||||
source: "The Marginalian"
|
||||
topics:
|
||||
- quotes
|
||||
- general-delight
|
||||
tags: [hesse, education, wonder, marginalian]
|
||||
description: "Maria Popova surfaces a passage from Hermann Hesse on what schools refuse to teach: wonder. From an essay collected in his butterflies writings."
|
||||
---
|
||||
|
||||
> Schools teach counting and measuring over delight.
|
||||
|
||||
Maria Popova builds the essay around a Hesse passage on the failure of schools to cultivate awe — the central charge being that an education system that prioritises measurement systematically extinguishes the curiosity it depends on. From Hesse's writings on butterflies, surfaced in a Marginalian essay that pairs the passage with Hesse's own watercolours.
|
||||
@@ -0,0 +1,13 @@
|
||||
---
|
||||
name: "The Emineminence Joke"
|
||||
date: 2026-05-04
|
||||
link: "https://www.reddit.com/r/dadjokes/"
|
||||
linkText: "r/dadjokes"
|
||||
source: "r/dadjokes"
|
||||
topics:
|
||||
- dad-jokes
|
||||
tags: [eminem, knighthood, hip-hop, honorific]
|
||||
description: "An honorific for a hypothetically-knighted Marshall Mathers."
|
||||
---
|
||||
|
||||
> If Marshall Mathers was ever knighted… could you call him "His Emineminence"?
|
||||
@@ -0,0 +1,15 @@
|
||||
---
|
||||
name: "The Tinder Matches Joke"
|
||||
date: 2026-05-04
|
||||
link: "https://www.reddit.com/r/dadjokes/"
|
||||
linkText: "r/dadjokes"
|
||||
source: "r/dadjokes"
|
||||
topics:
|
||||
- dad-jokes
|
||||
tags: [tinder, dating, cigarette, matches]
|
||||
description: "A dad-joke pun about a profile photo and dating apps."
|
||||
---
|
||||
|
||||
> This girl on Tinder asked me why I have an unlit cigarette in my picture.
|
||||
>
|
||||
> I told her I'm looking for matches.
|
||||
@@ -0,0 +1,17 @@
|
||||
---
|
||||
name: "The Wee Cough Joke"
|
||||
date: 2026-05-04
|
||||
link: "https://www.reddit.com/r/dadjokes/"
|
||||
linkText: "r/dadjokes"
|
||||
source: "r/dadjokes"
|
||||
topics:
|
||||
- dad-jokes
|
||||
tags: [boss, scotland, accent, sick-day]
|
||||
description: "A whispered call to the boss with an extremely Scottish punchline."
|
||||
---
|
||||
|
||||
> I called work this morning and whispered, "Sorry boss, I can't come in today. I have a wee cough."
|
||||
>
|
||||
> He exclaimed, "You have a wee cough!?"
|
||||
>
|
||||
> I said, "Really?! Thanks boss, see you next week!"
|
||||
|
After Width: | Height: | Size: 200 KiB |
@@ -0,0 +1,14 @@
|
||||
---
|
||||
name: "Kai Hakone"
|
||||
subtitle: "A 34-room ryokan on the Old Tokaido Road, refurbished around Edo-period travel rituals"
|
||||
date: 2026-05-04
|
||||
link: "https://hoshinoresorts.com/en/hotels/kaihakone/"
|
||||
linkText: "hoshinoresorts.com"
|
||||
source: "Wallpaper* Travel"
|
||||
topics:
|
||||
- travel
|
||||
tags: [japan, ryokan, hakone, onsen, hoshino]
|
||||
description: "Hoshino's reimagined Kai Hakone sits on a wooded slope along the Old Tokaido Road in Hakone Yumoto Onsen, with a tea house, a marquetry workshop, and suites with private hot spring baths."
|
||||
---
|
||||
|
||||
Kai Hakone is one of Hoshino Resorts' renovated ryokans, perched above the wooded ravine of Hakone Yumoto Onsen on what was once the Old Tokaido Road — the Edo-period highway between Tokyo and Kyoto. The 34 rooms are designed around the historical rhythm of weary travellers stopping there to recover; many suites carry their own private hot spring baths, and the property includes a new outdoor tea house (Sawa Chaya), a marquetry workshop (Hakone is the home of yosegi-zaiku inlay), and kaiseki dinners that quote the period directly. The kind of stay that gives you a reason to take the slow train in.
|
||||
|
After Width: | Height: | Size: 56 KiB |
@@ -0,0 +1,13 @@
|
||||
---
|
||||
name: "Luchador Bottle Openers"
|
||||
subtitle: "Cast-metal masked-wrestler bottle openers"
|
||||
date: 2026-05-04
|
||||
link: "https://www.kikkerland.com/products/luchador-bottle-openers"
|
||||
source: "Kikkerland"
|
||||
topics:
|
||||
- gifts
|
||||
tags: [bar, gift, kitsch, kikkerland]
|
||||
description: "Cast-metal bottle openers shaped like masked Mexican wrestlers — heavy, useful, and the only opener guests pick up on purpose."
|
||||
---
|
||||
|
||||
Most bottle openers exist to be used and forgotten. The Luchador openers are cast in solid metal, shaped like masked Mexican wrestlers in mid-pin, and heavy enough that they sit on a counter with presence. They open bottles fine — the real virtue is that they're the one piece of bar hardware guests reach for and ask about. Sold individually so you can pick a favourite mask.
|
||||
|
After Width: | Height: | Size: 20 KiB |
@@ -0,0 +1,13 @@
|
||||
---
|
||||
name: "Mozart Kitchen Timer"
|
||||
subtitle: "A wind-up timer that plays Mozart instead of buzzing"
|
||||
date: 2026-05-04
|
||||
link: "https://www.kikkerland.com/products/mozart-kitchen-timer"
|
||||
source: "Kikkerland"
|
||||
topics:
|
||||
- gifts
|
||||
tags: [kitchen, music, timer, gift, kikkerland]
|
||||
description: "A mechanical kitchen timer that announces 'done' with a few bars of Eine kleine Nachtmusik instead of an alarm shriek."
|
||||
---
|
||||
|
||||
Most kitchen timers buzz. This one plays Mozart. The Kikkerland Mozart Kitchen Timer is a small wind-up dial that counts down up to an hour and then lets out a few bars of Eine kleine Nachtmusik when your eggs are ready. It's a quietly nicer cue than the screech of every other timer in the kitchen, and at gift price-point ($15-ish) it's the kind of thing you don't realise you'll keep using until a year in.
|
||||
|
After Width: | Height: | Size: 620 KiB |
@@ -0,0 +1,13 @@
|
||||
---
|
||||
name: "Nimmo Bay Resort"
|
||||
subtitle: "A family-owned wilderness lodge in BC's Great Bear Rainforest — barefoot forest walks, floating saunas, cold snorkeling"
|
||||
date: 2026-05-04
|
||||
link: "https://nimmobay.com"
|
||||
source: "AFAR"
|
||||
topics:
|
||||
- travel
|
||||
tags: [british-columbia, lodge, rainforest, wilderness, canada]
|
||||
description: "A family-run wilderness lodge in British Columbia's Great Bear Rainforest, where the day's program might be cold-water snorkeling, barefoot forest walks, or sitting in a floating sauna while wildlife passes."
|
||||
---
|
||||
|
||||
Nimmo Bay sits where the Great Bear Rainforest meets the sea on the central BC coast, family-owned and float-plane-only. The day's program is the opposite of a resort itinerary: snorkeling in cold water, barefoot walks through old-growth, soaking in a floating sauna while a humpback or a coastal wolf passes by. Aimed at travellers willing to swap room service and a pool for unscripted contact with one of the largest temperate rainforests left.
|
||||
|
After Width: | Height: | Size: 123 KiB |
@@ -0,0 +1,15 @@
|
||||
---
|
||||
name: "Noir (Yamazaki)"
|
||||
subtitle: "Japan's bittersweet answer to Oreos, made when Mondelez moved Oreo production overseas"
|
||||
date: 2026-05-04
|
||||
link: "https://tokyopaladin.substack.com/p/the-japanese-oreo-noir-kills-the"
|
||||
linkText: "tokyopaladin.substack.com"
|
||||
source: "Daring Fireball — Linked List"
|
||||
topics:
|
||||
- gifts
|
||||
- general-delight
|
||||
tags: [snacks, japan, yamazaki, sandwich-cookie]
|
||||
description: "Yamazaki Biscuits launched Noir in 2017 after Mondelez moved Oreo production to China — real cacao mass in the wafer, restrained vanilla cream, eats well without milk."
|
||||
---
|
||||
|
||||
When Mondelez moved Japanese Oreo production to China in 2016, Yamazaki Biscuits launched Noir as a deliberate replacement aimed at the people who actually liked the old recipe. The wafer carries real cacao mass, which makes it slightly bitter and astringent against a restrained vanilla cream — they're sandwich cookies that work without milk. Cost a few yen less than imported Oreos in Japanese supermarkets, easy to find at konbini, and a small case study in a domestic brand quietly out-engineering an imported one.
|
||||
@@ -0,0 +1,15 @@
|
||||
---
|
||||
name: 'Samuel Goldwyn — "Let''s have some new cliches."'
|
||||
date: 2026-05-04
|
||||
link: "https://quoteinvestigator.com/2026/04/04/new-cliches/"
|
||||
linkText: "quoteinvestigator.com"
|
||||
source: "Quote Investigator"
|
||||
topics:
|
||||
- quotes
|
||||
tags: [goldwyn, hollywood, language, malapropism]
|
||||
description: "Samuel Goldwyn — Polish-born MGM founder famed for self-contradicting one-liners ('Goldwynisms') — on the perpetual demand for fresh language."
|
||||
---
|
||||
|
||||
> Let's have some new clichés.
|
||||
|
||||
Samuel Goldwyn — the Polish immigrant who co-founded what became MGM and produced *Wuthering Heights* and *The Best Years of Our Lives* — generated so many of these self-contradicting one-liners that they got their own name (*Goldwynisms*). This one was a working note to his writers and now reads like a brief for any creative team.
|
||||
@@ -0,0 +1,15 @@
|
||||
---
|
||||
name: 'Geoffrey Hinton — "We have discovered the secret of immortality. The bad news is, it''s not for us."'
|
||||
date: 2026-05-04
|
||||
link: "https://quoteinvestigator.com/2026/04/08/immortality-us/"
|
||||
linkText: "quoteinvestigator.com"
|
||||
source: "Quote Investigator"
|
||||
topics:
|
||||
- quotes
|
||||
tags: [hinton, ai, immortality, modernity]
|
||||
description: "Geoffrey Hinton — the 'godfather of deep learning' who left Google in 2023 to speak openly about AI risk — on the asymmetry between digital minds and biological ones."
|
||||
---
|
||||
|
||||
> We have discovered the secret of immortality. The bad news is, it's not for us.
|
||||
|
||||
Geoffrey Hinton, who quit Google in 2023 specifically so he could talk about the risks of the systems he helped invent, on the strange asymmetry of having built minds whose weights can be copied indefinitely while ours cannot. The line is delivered as a punchline in lectures and lands like one — once.
|
||||
@@ -0,0 +1,15 @@
|
||||
---
|
||||
name: 'Christopher Reeve — "What makes Superman a hero is not that he has power, but that he has the wisdom and the maturity to use the power wisely."'
|
||||
date: 2026-05-04
|
||||
link: "https://quoteinvestigator.com/2026/05/02/hero-wise/"
|
||||
linkText: "quoteinvestigator.com"
|
||||
source: "Quote Investigator"
|
||||
topics:
|
||||
- quotes
|
||||
tags: [reeve, superman, heroism, wisdom]
|
||||
description: "Christopher Reeve, the actor who played Superman through four films and the eventual paraplegic advocate, on what actually constitutes heroism."
|
||||
---
|
||||
|
||||
> What makes Superman a hero is not that he has power, but that he has the wisdom and the maturity to use the power wisely.
|
||||
|
||||
Christopher Reeve — Superman across four films, then a quadriplegic who spent the second half of his life as the most prominent advocate for spinal-cord research — on what heroism actually requires. Quote Investigator traces it to his interviews and lectures of the 1990s, when the question had become uncomfortably personal.
|
||||
|
After Width: | Height: | Size: 299 KiB |
@@ -0,0 +1,14 @@
|
||||
---
|
||||
name: "World's Largest Time Capsule, Seward NE"
|
||||
subtitle: "A 45-ton concrete vault unsealed in 2025 after fifty years underground — Chevy Vega included"
|
||||
date: 2026-05-04
|
||||
link: "https://roadtrippers.com/magazine/worlds-largest-time-capsule-in-seward/"
|
||||
linkText: "roadtrippers.com"
|
||||
source: "Roadtrippers Magazine"
|
||||
topics:
|
||||
- travel
|
||||
tags: [nebraska, americana, route, oddity, museum]
|
||||
description: "Furniture store owner Harold Davisson buried a 45-ton concrete vault behind his shop in 1975 — five thousand-plus artifacts including a brand-new Chevy Vega — and re-opened it on July 4, 2025."
|
||||
---
|
||||
|
||||
In 1975 the furniture store owner Harold Davisson buried a 45-ton concrete vault behind his shop in Seward, Nebraska, and packed it with five thousand-plus artifacts of mid-1970s American life — including a brand-new Chevrolet Vega he'd driven straight off the lot. The vault was unsealed on July 4, 2025, and the contents are now on display where they were buried — the Vega survived in zero-mileage condition. Pure roadside Americana now sitting at the intersection of US-34 and the Lincoln Highway, worth a detour for anyone driving I-80 across the plains.
|
||||
@@ -0,0 +1,14 @@
|
||||
---
|
||||
name: "Sindre Sorhus' Older-macOS App Versions"
|
||||
subtitle: "Every paid Sindre app, free, for anyone still on macOS 15 or earlier"
|
||||
date: 2026-05-04
|
||||
link: "https://sindresorhus.com/apps/older-versions"
|
||||
source: "r/macapps"
|
||||
topics:
|
||||
- macos-apps
|
||||
tags: [macos, generosity, dato, lungo, battery-indicator]
|
||||
description: "Sindre Sorhus quietly hosts free builds of every paid app he ships — Dato, Lungo, Battery Indicator, and the rest — for users running macOS 15 or earlier. A standing offer renewed each year."
|
||||
promotedTo: "sindre-sorhus-older-mac-apps"
|
||||
---
|
||||
|
||||
Sindre Sorhus refuses to abandon users who can't run the latest macOS. Every year he publishes the last-compatible build of each of his paid apps — Dato, Lungo, Battery Indicator, and a dozen others — free to download for anyone on macOS 15 or earlier, going back to 10.13. The page is a quiet annual gesture from one of the Mac's most prolific indie devs that turns "I refuse to upgrade" from a problem into a non-issue.
|
||||
@@ -0,0 +1,14 @@
|
||||
---
|
||||
name: "Snewpapers"
|
||||
subtitle: "Browse three centuries of digitised newspapers, 1730s through the 1960s"
|
||||
date: 2026-05-04
|
||||
link: "https://snewpapers.com"
|
||||
source: "Hacker News — Show HN"
|
||||
topics:
|
||||
- tools
|
||||
- general-delight
|
||||
tags: [archives, history, newspapers, research, browsing]
|
||||
description: "A browsable archive of digitised newspapers spanning the 1730s through the 1960s — a rabbit hole for historians, genealogists, and anyone who reads obituaries for fun."
|
||||
---
|
||||
|
||||
Snewpapers is a browseable index of digitised newspaper pages that runs from the 1730s through the 1960s — a pre-Google view of how breaking news, baseball scores, and patent-medicine ads actually appeared on the page. It's built for the kind of curiosity that has you pulling on threads — a great-grandparent's wedding notice, a small-town bank failure from 1893, the way a single weather front gets reported simultaneously in a dozen cities. Free to browse, no account required.
|
||||
@@ -6,6 +6,7 @@ link: https://superkey.app/
|
||||
source: "Brett Terpstra"
|
||||
topics: [apple-tips, macos-apps]
|
||||
tags: [macos, accessibility, keyboard, ocr]
|
||||
promotedTo: superkey
|
||||
---
|
||||
|
||||
Watches what's on screen, OCRs the text, and when you trigger a search lets you type the name of any visible label — Superkey clicks it. Bridges the gap between "this app doesn't have a keyboard shortcut" and "but I can see the button" in a way other Mac keyboard tools can't. Brett Terpstra calls it the missing piece of his all-keyboard workflow.
|
||||
|
||||
|
After Width: | Height: | Size: 45 KiB |
@@ -0,0 +1,14 @@
|
||||
---
|
||||
name: "TerminalWidget"
|
||||
subtitle: "Pipe any terminal command into a desktop widget"
|
||||
date: 2026-05-04
|
||||
link: "https://terminalwidget.app"
|
||||
source: "Brett Terpstra"
|
||||
topics:
|
||||
- macos-apps
|
||||
- apple-tips
|
||||
tags: [macos, ios, widgets, cli, automation]
|
||||
description: "A macOS and iOS app that turns the output of any shell command — progress reports, charts, status icons, even images — into a live desktop or home-screen widget."
|
||||
---
|
||||
|
||||
TerminalWidget pipes the stdout of any command into a real macOS or iOS widget, so a long build's progress bar, the current weather chart, or a one-line server-status line lives glanceably on your desktop or home screen instead of behind a Terminal window. It ships a scriptable CLI for automation and syncs the widget definitions across devices via iCloud, which means one shell script renders on both your Mac and your iPhone. $9.99 universal purchase from the App Store.
|
||||
|
After Width: | Height: | Size: 162 KiB |
@@ -0,0 +1,13 @@
|
||||
---
|
||||
name: "Torre Da Bora"
|
||||
subtitle: "A restored medieval tower in the Marche, with 360-degree views to three mountain ranges and the Adriatic"
|
||||
date: 2026-05-04
|
||||
link: "https://www.boutique-homes.com/property/torre-da-bora"
|
||||
source: "Boutique Homes"
|
||||
topics:
|
||||
- travel
|
||||
tags: [italy, marche, tower, medieval, rental]
|
||||
description: "A meticulously restored medieval defensive tower in Magliano di Tenna, Marche — recognised by the Italian Institute of Castles for the quality of the work — with 360° views to the Sibillini, the Laga, and the sea."
|
||||
---
|
||||
|
||||
Torre Da Bora is a real defensive tower from the Middle Ages, restored with enough care that the Italian Institute of Castles formally recognised the work, and now rentable as a multi-level home in Magliano di Tenna in Italy's Marche region. The top of the tower gives you 360° lines of sight: the Sibillini Mountains, the Laga Mountains, and the Adriatic. The interiors layer modern comforts onto the original stonework without trying to disguise either, which is rarer than it sounds.
|
||||
|
After Width: | Height: | Size: 66 KiB |
@@ -0,0 +1,13 @@
|
||||
---
|
||||
name: "Jenny Volvovski's Unsolicited Book Covers"
|
||||
subtitle: "A working designer redesigns her own library, one book at a time"
|
||||
date: 2026-05-04
|
||||
link: "https://www.jennyvolvovski.com/category/unsolicited"
|
||||
source: "Kottke.org"
|
||||
topics:
|
||||
- general-delight
|
||||
tags: [design, books, typography, project]
|
||||
description: "Designer Jenny Volvovski's personal project: redesigning the covers of books in her own library, working within a fixed palette of green, black, and white."
|
||||
---
|
||||
|
||||
A working book-cover designer set herself a constraint — green, black, white, fixed typefaces — and quietly redesigned dozens of books from her own shelf. *Crime and Punishment*, *The Handmaid's Tale*, *Americanah*, *There There*. The palette gives the project visual cohesion and the volume turns it into a long-form study in how typography and a single piece of imagery do the work of a cover.
|
||||
@@ -0,0 +1,16 @@
|
||||
---
|
||||
name: 'T.H. White / Merlyn — "The best thing for being sad is to learn something."'
|
||||
date: 2026-05-04
|
||||
link: "https://www.themarginalian.org/2026/05/03/t-h-white-once-and-future-king-merlyn/"
|
||||
linkText: "themarginalian.org"
|
||||
source: "The Marginalian"
|
||||
topics:
|
||||
- quotes
|
||||
- general-delight
|
||||
tags: [white, arthurian, merlyn, learning, consolation]
|
||||
description: "Merlyn's prescription for sorrow from T.H. White's The Once and Future King — surfaced by Maria Popova as a piece of practical philosophy for low days."
|
||||
---
|
||||
|
||||
> The best thing for being sad is to learn something. That is the only thing that never fails. You may grow old and trembling in your anatomies, you may lie awake at night listening to the disorder of your veins, you may miss your only love, you may see the world about you devastated by evil lunatics, or know your honour trampled in the sewers of baser minds. There is only one thing for it then — to learn.
|
||||
|
||||
Merlyn, advising the young Arthur, in T.H. White's *The Once and Future King*. Surfaced by Maria Popova as the practical philosophy hidden inside what looks like a children's book.
|
||||
@@ -0,0 +1,18 @@
|
||||
---
|
||||
title: "A small atlas"
|
||||
date: 2026-05-04
|
||||
tags: [daily-finds, travel]
|
||||
description: "Eight destinations, each earning a trip on a single specific note — a desert that blooms, a Kyoto townhouse, a Utah hot-spring stack, a 55-foot roadside whale."
|
||||
blurb: "Eight places worth pointing to, each on a single specific note."
|
||||
items:
|
||||
- capella-kyoto
|
||||
- atacama-superblooms
|
||||
- casa-nano-tokyo
|
||||
- diamond-fork-hot-springs
|
||||
- hotel-villa-colette-cap-ferret
|
||||
- honu-villa-joshua-tree
|
||||
- azuma-farm-koiwai
|
||||
- blue-whale-of-catoosa
|
||||
---
|
||||
|
||||
> Today's catch: eight destinations, each earning a trip on a single specific note — a Kengo Kuma hotel hiding inside a Kyoto townhouse, a Chilean desert that blooms once a decade, a Tokyo micro-house where every cubic inch does something, a stack of turquoise hot pools at the end of a Utah trail, a Starck-designed coastal villa being cartoonish on purpose, a Joshua Tree house with a terrazzo-floored courtyard, twenty-four rooms on a working Japanese farm, and a fifty-five-foot concrete whale on Route 66.
|
||||
@@ -0,0 +1,16 @@
|
||||
---
|
||||
title: "Off until needed"
|
||||
date: 2026-05-04
|
||||
tags: [daily-finds, apple-tips, macos-apps]
|
||||
description: "Six tools that stay dormant until you trigger them — a solar light, a voice-driven click target, two keyboard utilities, an iOS Shortcut, and a tracing-to-search."
|
||||
blurb: "Six tools that wait until they're needed."
|
||||
items:
|
||||
- aootek-solar-fence-lights
|
||||
- superkey
|
||||
- paletro
|
||||
- wooshy
|
||||
- wayback-multi-search-shortcut
|
||||
- circle-to-search
|
||||
---
|
||||
|
||||
> Today's catch: six things that stay out of the way until you summon them. A solar fence light that waits in ambient dim until something crosses its sensor; a Mac voice-trigger that clicks any visible text; the VS Code command palette retrofitted into every Mac app; keyboard control for arbitrary UI elements; a Shortcut that fans a URL across every web archive at once; and the Android lasso that searches whatever you trace on screen. Different mediums, same posture — invisible by default, useful on trigger.
|
||||
|
After Width: | Height: | Size: 495 KiB |
@@ -0,0 +1,28 @@
|
||||
---
|
||||
name: "Apex Markdown Processor"
|
||||
subtitle: "One Markdown tool that renders every dialect — and shows images in your terminal"
|
||||
date: 2026-05-04
|
||||
category: writing
|
||||
tags: [macos, markdown, terminal, cli, writing, open-source, brett-terpstra]
|
||||
link: "https://github.com/ApexMarkdown/apex"
|
||||
description: "Brett Terpstra's Markdown processor that speaks CommonMark, GFM, MultiMarkdown, Kramdown, and Marked simultaneously — and renders inline images directly in the terminal via ANSI."
|
||||
source: "Brett Terpstra"
|
||||
fromFind: "apex-markdown-processor"
|
||||
---
|
||||
|
||||
import hero from './hero.png';
|
||||
import { Image } from 'astro:assets';
|
||||
|
||||
<Image src={hero} alt="Apex rendering a Markdown document with inline images in iTerm" />
|
||||
|
||||
*Apex piped through `cat`-and-render: tables, citations, and inline screenshots all visible at the command line.*
|
||||
|
||||
> A single Markdown processor that understands every flavor people actually write — and turns your terminal into something that can show the images they reference.
|
||||
|
||||
The Markdown ecosystem has spent fifteen years branching into incompatible dialects. CommonMark is strict, GitHub Flavored adds tables and task lists, MultiMarkdown adds citations and footnotes, Kramdown adds attribute syntax, Marked adds custom inclusion. Most tools pick one and ignore the rest. Apex picks all of them, and its parser figures out which extensions a given document uses without you flagging the dialect up front.
|
||||
|
||||
The party trick is image rendering. Pipe a `.md` file through `apex` in iTerm, Wezterm, or any ANSI-capable terminal and the inline `` references actually render — not as link text, but as the image itself, scaled to the terminal's character cells. It uses the iTerm2 inline-images protocol with a fallback to Sixel, so it works in most modern terminals and degrades gracefully in the rest. For a writer building documentation or drafting a blog post over SSH, that single feature changes how Markdown feels at the CLI.
|
||||
|
||||
Beyond rendering, it has the tools you'd expect from a complete processor: file inclusion (`{{>partial.md}}`), fenced divs for callouts, citation handling, plugin hooks for custom directives, and HTML/PDF/EPUB output paths. Brett Terpstra has been building Markdown tooling for the better part of a decade — Marked 2, MultiMarkdown helpers, the whole nv* family — and Apex feels like the consolidation of everything he's learned about how people actually write Markdown.
|
||||
|
||||
Honest limitation: it's a young project. The plugin API may shift, and a handful of MultiMarkdown edge cases around citation ordering aren't quite right yet. The project is open source on GitHub if you want to track issues or contribute fixes.
|
||||
@@ -0,0 +1,21 @@
|
||||
---
|
||||
name: "Sindre Sorhus' Older-macOS App Versions"
|
||||
subtitle: "Every paid Sindre app, free, for anyone still on macOS 15 or earlier"
|
||||
date: 2026-05-04
|
||||
category: indie
|
||||
tags: [macos, indie, generosity, dato, lungo, battery-indicator]
|
||||
link: "https://sindresorhus.com/apps/older-versions"
|
||||
description: "Sindre Sorhus quietly hosts free builds of every paid app he ships — Dato, Lungo, Battery Indicator, the rest — for users running macOS 15 or earlier. A standing offer renewed each year."
|
||||
source: "r/macapps"
|
||||
fromFind: "sindre-sorhus-older-mac-apps"
|
||||
---
|
||||
|
||||
> Every year Sindre Sorhus posts the last-compatible free build of each of his paid Mac apps for users who can't or won't upgrade past macOS 15. Dato, Lungo, Battery Indicator, the lot — going back to 10.13.
|
||||
|
||||
Sindre Sorhus is among the most prolific indie developers on the Mac platform. He ships dozens of small paid utilities — Dato (the menu bar calendar that quietly replaces the system clock for a lot of people), Lungo (one click stops your Mac going to sleep), Battery Indicator (the battery-time-remaining readout Apple removed), and a long tail of niche tools. Most are modest one-time purchases or small subscriptions.
|
||||
|
||||
The Older Versions page is the part that earns its place here. Each time a new paid build ships requiring the latest macOS, the previous build is hosted free for everyone still on the older OS. The current page covers macOS 15 down through 10.13. Click the app, download the .zip, drop it in /Applications. Code-signed, notarised, no account or upgrade nag.
|
||||
|
||||
The cumulative effect is a quiet guarantee: if you buy a Sindre app today, you're not paying for an upgrade treadmill. Stick on Sonoma in 2027 and the macOS-15-era build will be sitting on the page, free, runnable. The same goes for everyone else who can't afford a new Mac, won't trust the next OS, or simply hasn't rebuilt their muscle memory yet.
|
||||
|
||||
This is rare in the App Store age, where stuck-on-old-macOS users routinely lose access to apps they paid for. Sindre's gesture covers his entire catalog. The page itself takes thirty seconds to skim — the work behind it is the part that matters.
|
||||
|
After Width: | Height: | Size: 192 KiB |
@@ -0,0 +1,21 @@
|
||||
---
|
||||
name: "Superkey"
|
||||
subtitle: "Click any visible text by saying its name — no mouse"
|
||||
date: 2026-05-04
|
||||
category: input
|
||||
tags: [macos, accessibility, keyboard, ocr, voice]
|
||||
description: "An OCR-driven Mac click target — say or type any visible label and Superkey clicks it. Catches the buttons that keyboard accessibility tools miss."
|
||||
link: https://superkey.app/
|
||||
source: "Brett Terpstra"
|
||||
fromFind: "superkey"
|
||||
---
|
||||
|
||||

|
||||
|
||||
> An OCR-driven click target for the Mac. Trigger a search, say or type the name of any visible label, and Superkey clicks it — no shortcut needed, no accessibility tree required.
|
||||
|
||||
Most Mac keyboard tools work off the macOS accessibility tree. Homerow drops a two-letter label on every element the system marks clickable; Wooshy maps every focusable item. The catch is that plenty of clickable things — canvas-rendered widgets, Electron apps without proper a11y, embedded web views, custom controls — slip out of that tree entirely. You can see the button. Your keyboard tool can't.
|
||||
|
||||
Superkey solves that by skipping the tree. When you trigger Seek, it OCRs whatever's currently on screen, indexes the visible text, and lets you find any label by name. Type *submit*, or say it; Superkey draws a guide to the match and clicks. Works inside Figma, inside web games, inside the half-broken third-party apps that have made the rest of your workflow keyboardable.
|
||||
|
||||
Trade-offs are honest: OCR runs per trigger, so there's a beat of latency before the search overlay appears; heavily stylized text — gradient logos, texture-baked labels — sometimes doesn't read; and like every Mac power-user tool from this corner, it's a subscription. Brett Terpstra calls it the missing piece of his all-keyboard workflow, and that's exactly the right framing — Superkey doesn't replace Homerow or Keyboard Maestro, it patches the holes they leave.
|
||||
@@ -0,0 +1,3 @@
|
||||
[
|
||||
"delete"
|
||||
]
|
||||
@@ -2,11 +2,13 @@ import type { ImageMetadata } from 'astro';
|
||||
|
||||
import alcove from '../content/reviews/alcove/hero.png';
|
||||
import altTab from '../content/reviews/alt-tab/hero.jpg';
|
||||
import apex from '../content/reviews/apex-markdown-processor/hero.png';
|
||||
import esproP7 from '../content/reviews/espro-p7-french-press/hero.jpg';
|
||||
import folderPeek from '../content/reviews/folder-peek/screenshot.png';
|
||||
import hyperkey from '../content/reviews/hyperkey/hero.png';
|
||||
import ice from '../content/reviews/ice/ice-bar.png';
|
||||
import macMouseFix from '../content/reviews/mac-mouse-fix/studio-display.png';
|
||||
import superkey from '../content/reviews/superkey/hero.jpg';
|
||||
import tot from '../content/reviews/tot/seven-dots.png';
|
||||
|
||||
import antinote from '../content/reviews/antinote/swipe.mp4';
|
||||
@@ -25,11 +27,13 @@ export type Hero =
|
||||
export const heroes: Record<string, Hero | undefined> = {
|
||||
alcove: { kind: 'image', src: alcove },
|
||||
'alt-tab': { kind: 'image', src: altTab },
|
||||
'apex-markdown-processor': { kind: 'image', src: apex },
|
||||
'espro-p7-french-press': { kind: 'image', src: esproP7 },
|
||||
'folder-peek': { kind: 'image', src: folderPeek },
|
||||
hyperkey: { kind: 'image', src: hyperkey },
|
||||
ice: { kind: 'image', src: ice },
|
||||
'mac-mouse-fix': { kind: 'image', src: macMouseFix },
|
||||
superkey: { kind: 'image', src: superkey },
|
||||
tot: { kind: 'image', src: tot },
|
||||
antinote: { kind: 'video', src: antinote },
|
||||
cotypist: { kind: 'video', src: cotypist },
|
||||
|
||||
@@ -1,15 +1,45 @@
|
||||
---
|
||||
import fs from 'node:fs';
|
||||
import path from 'node:path';
|
||||
import { getCollection } from 'astro:content';
|
||||
import BaseLayout from '../../layouts/BaseLayout.astro';
|
||||
import Masonry from '../../components/Masonry.astro';
|
||||
import FindCard from '../../components/FindCard.astro';
|
||||
import EditAction from '../../components/EditAction.astro';
|
||||
import { getAllFinds } from '../../lib/find-items';
|
||||
import editorialTags from '../../data/editorial-tags.json';
|
||||
|
||||
const INITIAL_GRID = 18;
|
||||
const BATCH_SIZE = 18;
|
||||
|
||||
const finds = await getAllFinds();
|
||||
const findRoot = path.join(process.cwd(), 'src/content/find');
|
||||
|
||||
function capturedAtFor(slug: string): Date {
|
||||
try {
|
||||
const stat = fs.statSync(path.join(findRoot, slug, 'index.mdx'));
|
||||
// birthtime is creation time (true on macOS/Windows). Falls back to mtime
|
||||
// on filesystems without birthtime support.
|
||||
return new Date(stat.birthtimeMs || stat.mtimeMs);
|
||||
} catch {
|
||||
return new Date(0);
|
||||
}
|
||||
}
|
||||
|
||||
// Decorate each find with its file-creation timestamp, then sort by that
|
||||
// (newest first) — gives true chronological order even when many finds
|
||||
// share the same day in their frontmatter `date`.
|
||||
const decorated = (await getAllFinds())
|
||||
.map((item) => ({ item, capturedAt: capturedAtFor(item.id) }))
|
||||
.sort((a, b) => b.capturedAt.valueOf() - a.capturedAt.valueOf());
|
||||
|
||||
const finds = decorated.map((d) => d.item);
|
||||
const lastUpdated = finds[0]?.data.date;
|
||||
|
||||
// Slugs referenced by any superpost in the `finds/` collection — dev-only filter.
|
||||
const inListSlugs = new Set(
|
||||
(await getCollection('finds')).flatMap((l) => l.data.items)
|
||||
);
|
||||
const notInListCount = finds.filter((f) => !inListSlugs.has(f.id)).length;
|
||||
---
|
||||
|
||||
<BaseLayout
|
||||
@@ -19,9 +49,29 @@ const lastUpdated = finds[0]?.data.date;
|
||||
lastUpdated={lastUpdated}
|
||||
noindex
|
||||
>
|
||||
{import.meta.env.DEV && (
|
||||
<div class="find-filter" role="group" aria-label="Filter">
|
||||
<button type="button" data-find-filter-set="all" aria-current="true">
|
||||
All ({finds.length})
|
||||
</button>
|
||||
<button type="button" data-find-filter-set="not-in-lists">
|
||||
Not in lists ({notInListCount})
|
||||
</button>
|
||||
</div>
|
||||
)}
|
||||
|
||||
<div data-find-filter="all">
|
||||
<Masonry initial={INITIAL_GRID} batch={BATCH_SIZE}>
|
||||
{finds.map((f) => <FindCard item={f} />)}
|
||||
{decorated.map(({ item, capturedAt }) => (
|
||||
<FindCard
|
||||
item={item}
|
||||
inList={inListSlugs.has(item.id)}
|
||||
capturedAt={capturedAt}
|
||||
availableTags={editorialTags}
|
||||
/>
|
||||
))}
|
||||
</Masonry>
|
||||
</div>
|
||||
|
||||
{import.meta.env.DEV && (
|
||||
<div class="edit-floating-toolbar" data-find-toolbar>
|
||||
@@ -50,6 +100,34 @@ const lastUpdated = finds[0]?.data.date;
|
||||
});
|
||||
refresh();
|
||||
}
|
||||
|
||||
// Dev-only filter: toggle "all" vs "not-in-lists" on the masonry wrapper.
|
||||
const wrapper = document.querySelector<HTMLDivElement>('[data-find-filter]');
|
||||
const filterButtons = document.querySelectorAll<HTMLButtonElement>('[data-find-filter-set]');
|
||||
const FILTER_KEY = 'find-filter';
|
||||
|
||||
if (wrapper && filterButtons.length) {
|
||||
type FilterValue = 'all' | 'not-in-lists';
|
||||
const apply = (value: FilterValue) => {
|
||||
wrapper.setAttribute('data-find-filter', value);
|
||||
for (const b of filterButtons) {
|
||||
if (b.dataset.findFilterSet === value) b.setAttribute('aria-current', 'true');
|
||||
else b.removeAttribute('aria-current');
|
||||
}
|
||||
try { localStorage.setItem(FILTER_KEY, value); } catch (e) {}
|
||||
};
|
||||
|
||||
let saved: string | null = null;
|
||||
try { saved = localStorage.getItem(FILTER_KEY); } catch (e) {}
|
||||
if (saved === 'all' || saved === 'not-in-lists') apply(saved);
|
||||
|
||||
for (const b of filterButtons) {
|
||||
b.addEventListener('click', () => {
|
||||
const v = b.dataset.findFilterSet;
|
||||
if (v === 'all' || v === 'not-in-lists') apply(v);
|
||||
});
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
@@ -78,5 +156,40 @@ const lastUpdated = finds[0]?.data.date;
|
||||
color: var(--fg);
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.find-filter {
|
||||
display: inline-flex;
|
||||
gap: 0;
|
||||
margin-bottom: 1.25rem;
|
||||
border: 1px solid var(--rule);
|
||||
border-radius: 999px;
|
||||
overflow: hidden;
|
||||
}
|
||||
.find-filter button {
|
||||
font-family: ui-sans-serif, system-ui, -apple-system, 'Helvetica Neue', sans-serif;
|
||||
font-size: 0.78rem;
|
||||
font-weight: 600;
|
||||
letter-spacing: 0.04em;
|
||||
background: none;
|
||||
border: 0;
|
||||
padding: 0.4rem 0.95rem;
|
||||
margin: 0;
|
||||
color: var(--muted);
|
||||
cursor: pointer;
|
||||
transition: background 0.15s ease, color 0.15s ease;
|
||||
}
|
||||
.find-filter button + button {
|
||||
border-left: 1px solid var(--rule);
|
||||
}
|
||||
.find-filter button:hover { color: var(--accent); }
|
||||
.find-filter button[aria-current="true"] {
|
||||
background: var(--fg);
|
||||
color: var(--bg);
|
||||
}
|
||||
|
||||
/* Hide in-list cards when the filter is set to not-in-lists. */
|
||||
[data-find-filter="not-in-lists"] [data-in-list="true"] {
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
</BaseLayout>
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
import { getCollection } from 'astro:content';
|
||||
import BaseLayout from '../layouts/BaseLayout.astro';
|
||||
import Masonry from '../components/Masonry.astro';
|
||||
import { heroes } from '../lib/hero';
|
||||
|
||||
const reviews = (await getCollection('reviews')).sort(
|
||||
@@ -24,10 +25,9 @@ const lastUpdated = reviews[0]?.data.date;
|
||||
lastUpdated={lastUpdated}
|
||||
noindex
|
||||
>
|
||||
<ul class="grid">
|
||||
{
|
||||
tiles.map((tile) => (
|
||||
<li>
|
||||
<Masonry>
|
||||
{tiles.map((tile) => (
|
||||
<article>
|
||||
<a href={tile.href} class:list={['tile', { 'text-only': !tile.hero }]}>
|
||||
{tile.hero?.kind === 'image' && (
|
||||
<img
|
||||
@@ -57,46 +57,24 @@ const lastUpdated = reviews[0]?.data.date;
|
||||
<span class="subtitle">{tile.subtitle}</span>
|
||||
</div>
|
||||
</a>
|
||||
</li>
|
||||
))
|
||||
}
|
||||
</ul>
|
||||
</article>
|
||||
))}
|
||||
</Masonry>
|
||||
|
||||
<style>
|
||||
.grid {
|
||||
column-count: 3;
|
||||
column-gap: 1rem;
|
||||
list-style: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
@media (max-width: 880px) {
|
||||
.grid { column-count: 2; }
|
||||
}
|
||||
@media (max-width: 520px) {
|
||||
.grid { column-count: 1; }
|
||||
}
|
||||
|
||||
.grid > li {
|
||||
break-inside: avoid;
|
||||
display: block;
|
||||
margin: 0 0 1rem;
|
||||
}
|
||||
|
||||
.tile {
|
||||
display: block;
|
||||
border-radius: 8px;
|
||||
overflow: hidden;
|
||||
border: 1px solid var(--rule);
|
||||
border: 2px solid var(--rule);
|
||||
background: var(--bg);
|
||||
color: inherit;
|
||||
transition: transform 0.18s ease, box-shadow 0.18s ease, border-color 0.18s ease;
|
||||
transition: box-shadow 0.18s ease, border-color 0.18s ease;
|
||||
}
|
||||
.tile:hover {
|
||||
text-decoration: none;
|
||||
transform: translateY(-2px);
|
||||
border-color: color-mix(in srgb, var(--accent) 40%, var(--rule));
|
||||
box-shadow: 0 8px 24px -10px rgba(0, 0, 0, 0.18);
|
||||
border-color: color-mix(in srgb, var(--accent) 50%, var(--rule));
|
||||
box-shadow: 0 0 20px -4px color-mix(in srgb, var(--accent) 30%, transparent);
|
||||
}
|
||||
.tile:hover .name { color: var(--accent); }
|
||||
|
||||
@@ -112,6 +90,7 @@ const lastUpdated = reviews[0]?.data.date;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 0.2rem;
|
||||
background: var(--card-fill);
|
||||
}
|
||||
.name {
|
||||
font-family: ui-sans-serif, system-ui, -apple-system, 'Helvetica Neue', sans-serif;
|
||||
|
||||
@@ -5,8 +5,8 @@ import Masonry from '../components/Masonry.astro';
|
||||
import { heroes } from '../lib/hero';
|
||||
import { buildOgImage, buildItemList, WEBSITE, ORGANIZATION } from '../lib/seo';
|
||||
|
||||
const HERO_SLUG = 'alt-tab';
|
||||
const INITIAL_GRID = 7;
|
||||
const HERO_SLUG = 'superkey';
|
||||
const INITIAL_GRID = 12;
|
||||
const BATCH_SIZE = 7;
|
||||
|
||||
const reviews = (await getCollection('reviews')).sort(
|
||||
|
||||