Skip to main content Skip to audio player
← the other ear

what's changed

running v1.6.7 — released 2026-04-19 at 20:20 UTC.

build served checked

  1. v1.6.7 current

    Service worker cache-bust — v1.6.5/6 changes were shipped but the SW was serving stale bundles. Fixed.

    • fix The /sw.js CACHE_NAME was stuck at "toe-v2" across every release since v1.5.x, which meant any returning visitor kept seeing the OLD _astro/*.js and *.css bundles even though new ones were on the CDN. That's why the v1.6.5/6 fixes appeared to "do nothing" — the code was deployed, the SW just wasn't serving it. Bumped to "toe-v1.6.7"; activate() now purges the old cache and clients.claim() takes control immediately.
    • fix HTML navigations now fetch with cache:"no-cache" so the shell never references a stale _astro/*.js hash even within the same SW lifetime.
    • docs Added a CACHE_NAME bump rule to sw.js — every release touching UrlIntake, /sources, or /api/status MUST bump it. Future 1.x.y bumps follow this discipline.
    • fix Once refreshed on this release, users will finally see: album art at 40px (not 64px), numbered track rows in mono with highlight on play, /sources adapter cards in Outfit display font, hygiene stats at 22px display font with tabular-nums, and "listen as station" actually playing a station with auto-advance.

    sw-cache-bust · sw-navigate-no-cache

  2. v1.6.6

    "Listen as station" actually plays a station now; album art shrunk; track rows formatted; sources adapter cards + hygiene stats use house-style fonts.

    • fix UrlIntake: "Listen as station" was silently broken — it called window.__toe_playSet which doesn't exist anywhere, so the fallback ran and only played the first track. Built a real mini station player inside UrlIntake: shuffles items for serendipity, manages its own queue, listens to audio.ended for auto-advance, highlights the currently-playing row, lets the user click any row to jump. Cleans up its event listeners on view-transition.
    • fix UrlIntake: album art shrunk from 64px to 40px so it sits inline with the title rather than dominating the panel.
    • fix UrlIntake: track rows reformatted with numbered prefixes (01, 02, …), title flex-grows, artist + duration as muted tail. Removed per-row thumbnails (album art at the top covers the context). Currently-playing row gets an accent border-left and auto-scrolls into view. Hover any row to highlight (click to jump if station is active).
    • style /sources adapter cards: name uses house-style display font (Outfit, light) with proper letter-spacing; stats use mono with tabular-nums so digits align across cards.
    • style /sources hygiene stats: numbers (192 / 0 / 1 / 260) now use the display font (Outfit, light) at 22px to match the page-title vocabulary; tabular-nums so they align across the four stat cards. Labels use the same display font.

    intake-station-player · intake-art-shrink · intake-rows-format · sources-adapter-fonts · sources-hygiene-fonts

  3. v1.6.5

    Paste-any-URL fixed (field-name reconciliation), album art + track details inline, license-only sources greyed instead of refused, /sources hygiene rolls up from /api/sources/stats when curator hygiene endpoint errors, prober UI on house-style fonts.

    • fix UrlIntake: products /api/intake/parse returns audioUrl/sourceName/sourceType (camelCase) but the component expected url/source_name/source_type (snake_case) — added a normalisation layer so both shapes work transparently. The previously-broken Bandcamp paste flow now plays.
    • feature UrlIntake: album art now renders inline next to the result title (from display.thumbnail or items[0].thumbnail) and each track row shows a thumbnail + artist + duration where the parser provides them. Proactive ethos — surface what was found, don't hide it.
    • feature UrlIntake: license-only sources (AudioNetwork, Soundstripe, etc.) now grey out the action buttons instead of disabling them with a red error — tracks remain listed (greyed) so users see what the source contains. Hover the disabled button for the per-source reason.
    • fix /sources hygiene panel was showing 0/0/0/0 because the curator /api/sources/hygiene returns "no such column: source_type" — schema bug filed for products. Site now falls back to computing rollups from /api/sources/stats which works (same underlying table, different query).
    • fix Prober status page (probes.theotherear.fm) now uses house-style fonts — Outfit (display) and DM Mono (data) — to match the rest of the site. Was previously system-ui sans-serif.

    intake-camelcase-norm · intake-album-art · intake-license-greyout · sources-hygiene-fallback · prober-house-fonts

  4. v1.6.4

    Codevault prober live at probes.theotherear.fm — 25/25 probes green; site /status now consumes the off-cluster source.

    • feature Codevault prober Worker deployed at https://probes.theotherear.fm/ — 25 probes covering compliance (license-only fixtures), curator API, intake parser canaries, site routes, and asset CDNs. KV-backed 24h history with p50/p95/p99/pass-rate-24h rollups. Public HTML status page + /probes JSON + /history?probe=... per-probe trend. (REQ-V11-006/007/008/009)
    • feature Site /api/status Pages Function now prefers the off-cluster prober Worker as its source-of-truth and falls back to in-page probing only if the Worker is unreachable. /status page transparently uses either source — the build-verification widget shows which one served the report.
    • feature tooling/mcp/uptime-bridge projects.ts gains proberJson + proberPage entries so any agent calling uptime_status can hit the canonical off-cluster URL directly.
    • docs V11 progress: 18 of 19 REQs DONE. Remaining V11-005 (cv observe probes-load) shipped as Rust source by the products-agent (commit 5942218) but pending build verification — needs MSVC tools on the dev box. Worker is deployed and serving in the meantime.
    • fix Resolved JSON double-encoding bug in the prober — probe TOML body strings ("{\"url\":\"x\"}") were being JSON.stringify'd again at send time, hitting the curator as a quoted string instead of an object. Fix: send strings as-is, stringify everything else.
    • infra Workers free-tier limit (5 cron triggers per account) hit — pivoted to lazy-on-demand probing: /probes re-runs the set if cached report is older than 60s. The site /api/status calls keep it warm. Switch to a real cron once cv observe probes-deploy can target a paid Workers plan.

    REQ-V11-005 · REQ-V11-006 · REQ-V11-007 · REQ-V11-008 · REQ-V11-009

  5. v1.6.3

    Treacle removed — 4 fetches deferred behind first paint, lazy tab loading, F5 stream-label adapter; tooling MCP + liveness suite shipped.

    • perf /sources: render the static grid before any network call. All four boot-time fetches (loadCounts, loadAdapterStats, loadFooter, loadHygiene) now defer one frame after paint via requestIdleCallback. (REQ-V11-016)
    • perf /sources: 30s loadFooter setInterval now aborts on astro:before-swap so navigating away no longer leaks a polling timer.
    • perf /sources: tightened all boot-time fetch timeouts from 6–8s to 3s — when an upstream is slow, the page no longer dangles for 8s before showing partial data.
    • perf /personal: lazy-load each tab panel (collection / history / govern). Was loading all four loaders on init regardless of which tab was active — now loads only the active tab on first paint, others on click. (REQ-V11-016)
    • perf UrlIntake: parse timeout reduced from 12s to 6s — click handler no longer blocks for 12s when the curator is slow.
    • fix F5 label adapter: when the products parser returns kind="track" for a direct audio URL with host="stream", display chip shows "stream" so the UX matches user expectation. Functionally identical.
    • feature tooling: new mcp/uptime-bridge MCP server with 5 tools (uptime_status, uptime_history, uptime_diff_routes, uptime_open_status_page, uptime_load_probes). Two are full-featured today; three stub gracefully until codevault REQ-V11-005..009 ships. (REQ-V11-010)
    • feature tooling: site-harness gains a "liveness" suite (status-endpoint-reachable, overall-healthy, report-fresh-under-5min) so portfolio reports mix live + tested-once results in one view. (REQ-V11-011)
    • docs tooling: liveness convention paragraph added to D:/code/tooling/CLAUDE.md — every site/service in the portfolio MUST expose /api/status + register a probe set. (REQ-V11-012)

    REQ-V11-010 · REQ-V11-011 · REQ-V11-012 · REQ-V11-016

  6. v1.6.2

    Live status page (/status) + tri-state homepage pill + __toe_api auto-failover.

    • feature New /status page — runs 12 live probes from the Cloudflare edge against the curator (/health, /health/deep, all four queues, source-counts, intake parser with bandcamp fixture, intake compliance with AudioNetwork fixture) and the site itself (homepage, /sources). Refreshes every 30s. Honest when broken. (REQ-V11-013)
    • feature Pages Function /api/status returns the same data as JSON for agents and external dashboards, with a 30s edge cache. Pass `?fresh=1` to bypass. (REQ-V11-014)
    • feature Build verification widget on /status shows site version, site build id, page-served timestamp, curator version (git sha) and curator built_at — so "the fix is in" can be proved or disproved. (REQ-V11-018)
    • feature Homepage health-dot is now a tri-state link to /status, sourcing its colour from /api/status (overall green/amber/red) instead of just the curator /health flag. (REQ-V11-015)
    • feature __toe_api auto-failover: window.fetch is wrapped at page boot so primary-host 5xx or network errors flip the session to api.toe.fm with one console.warn — no more silent breakage when one CDN proxy is down. (REQ-V11-017)
    • infra CSP connect-src now includes api.toe.fm + wss://api.toe.fm so the failover path is allowed.
    • docs V11 still owes: products /api/health/deep (DONE), products version stamping (DONE), products host parity (DONE), 4 of 8 intake fixtures (REQ-V11-019). Codevault prober Worker (REQ-V11-005..009) still TODO — until then this Pages Function is the canonical probe runner.

    REQ-V11-013 · REQ-V11-014 · REQ-V11-015 · REQ-V11-017 · REQ-V11-018

  7. v1.6.1

    Source list expanded — No Tape Left Behind, etree, Old Time Radio, cylinders, Citizen DJ, UbuWeb, PennSound; v10 spec for products.

    • feature Added No Tape Left Behind (Aadam Jacobs Collection — 2,500+ indie & punk live tapes 1984–2010s) to /sources.
    • feature Added Live Music Archive (etree) — 250k+ trade-friendly lossless concert recordings.
    • feature Added Internet Archive Old Time Radio — ~50k pre-1972 radio plays, mostly public domain.
    • feature Added LoC National Jukebox, Citizen DJ (LoC Labs), UCSB Cylinder Audio Archive, UbuWeb Sound, PennSound, Cities and Memory.
    • docs v10 spec written: 23 REQs across 4 tiers for the products agent — drop-in IA collections, new adapters with APIs, larger builds (NTS / Dublab / KEXP archives), backfill of unadapted listings, plus EDUCATIONAL and MIXED licence postures.
    • docs v9-002a addendum: Bandcamp Weekly (`bandcamp.com/radio?show=N`) added to spec; surfaces preview-only warning when host returns 30s clips.
    • fix Confirmed: `https://api.theotherear.fm/api/intake/parse` returns 404 in production — products has merged the code but the curator service has not been redeployed yet. Site falls through to client fallback; Bandcamp parsing therefore still pending in prod.

    REQ-V10-001 · REQ-V10-002 · REQ-V10-003 · REQ-V10-008 · REQ-V10-009 · REQ-V10-010 · REQ-V10-012 · REQ-V9-002a

  8. v1.6.0

    Universal URL intake — paste any URL, get a station.

    • feature New <UrlIntake/> component on /sources and /personal: one box, host detection, license badge, owner/attribution line, three actions (listen as station / save to garden / save as set).
    • feature Client-side fallback parser handles archive.org/details/* and /details/@account profile expansion, direct audio URLs, and 9 license-only hosts (Soundstripe, AudioNetwork, Epidemic, Artlist, MotionArray, PremiumBeat, Musicbed, Marmoset, Pond5) with explicit blocking.
    • feature Recognises Bandcamp, SoundCloud, FMA, Jamendo, YouTube, Audius, Mixcloud, ccMixter — passes them to the new server-side parser when available, otherwise shows "scanner on the way".
    • feature Products agent shipped POST /api/intake/parse with 15 host parsers, 24h cache, idempotent replay, SSRF-safe HTTP client and 124 new tests.
    • fix Removed cryptic "+" overlay on /sources — replaced with the inline intake.
    • fix /sets gains a hand-off link to the new intake for albums and collections (per-track form retained for single tracks).
    • feature Footer version chip is now clickable — opens this changelog so you can confirm the running build.
    • docs Spec written: docs/requirements/2026-04-19_requirements_v9_universal_intake.md (REQ-V9-001..008).

    REQ-V9-001 · REQ-V9-002 · REQ-V9-003 · REQ-V9-004 · REQ-V9-005 · REQ-V9-006 · REQ-V9-007 · REQ-V9-008

  9. v1.5.1

    CSP fix, CI pipeline, sitemap, console cleanup — 79/80 REQs (99%).

    • fix Content-Security-Policy adjusted so all whitelisted audio CDNs play.
    • infra GitHub Actions CI pipeline restored, Docker deploy fixed.
    • feature sitemap.xml + robots.txt generated.
    • fix Stray console logs removed across the player and station islands.

    REQ-021 · REQ-023

  10. v1.5.0

    Source hygiene UI, GARDEN-006 complete — 77/80 REQs (96%).

    • feature Source health dashboard on /sources: per-adapter healthy / degraded / dead counts.
    • feature Per-source health report with status pills and failure counts.

    REQ-GARDEN-006

  11. v1.4.0

    @toe/bar v5 — BAR-001..011 all DONE; 1,156 tests passing.

    • feature BarPort external deposit channel (postMessage / BroadcastChannel / extension).
    • feature Trust model with origin allowlist and consent UI.
    • feature SharedWorker audio state + cross-tab island sync.
    • feature Browser extension scaffold (Manifest V3) with filament bridge.
    • feature Opt-in island telemetry hooks.

    REQ-BAR-001 · REQ-BAR-002 · REQ-BAR-003 · REQ-BAR-004 · REQ-BAR-005 · REQ-BAR-006 · REQ-BAR-007 · REQ-BAR-008 · REQ-BAR-009 · REQ-BAR-010 · REQ-BAR-011

  12. v1.3.0

    Bar migration, source diversity badge, retention preview — v4 complete.

    • feature @toe/bar replaces the old player bar; 4 islands (audio, station, filament, layout).
    • feature 11 source adapters surfaced on /sources with diversity badge.
    • feature Discovery-queue and retention-preview panels on /dashboard.
    • feature Filament binary trust indicator with update-available nudge.

    REQ-V4-001 · REQ-V4-005 · REQ-V4-008 · REQ-V4-014

  13. v1.2.0

    WCAG 2.2 AA accessibility, 190-language hero, hidden curation grammar.

    • a11y Skip nav, ARIA tablist, focus trap, live regions, dynamic play/pause labels.
    • a11y Reduced-motion + forced-colors handling, canvas accessibility.
    • feature Hidden /curation page with EBNF grammar and Wunderkammer axes.
    • feature Hero title randomises across 190+ languages on every visit.
    • feature Toast notification system replaces inline status messages.
  14. v1.1.0

    API standardisation, multi-media support, petitions, moderation.

    • feature Centralised window.__toe_api removed 20+ hardcoded URLs.
    • feature Audio + image + video + text + playlist routing.
    • feature /petitions with community voting; client + server moderation.
    • feature Curation grammar (EBNF), source registry, pipeline spec.
v1.6.7