Week of July 3, 2026
Features
Content
API
The producer flywheel — both spokes finally spinning
📲 1 demand-fulfilled push notification path
🟢 1 live homepage stat strip
⏱ 1 public scraper-status RPC
📡 1 RSS feed for /hunting-now
📝 24 blog posts
🔗 ~225 SEO pages live
- Demand-fulfilled push notifications — when a queued artist actually lands in the catalog (row flips queued → scraped), every signed-in user whose
user_id was attached to that demand row gets a push: "🎯 EBK Jaaybo just landed." New /api/notifications/demand-fulfilled endpoint, called by the scraper after successful saves. Honors per-user notify_drop_alerts opt-out. Tap → deep-link straight into Find My Sound with the artist pre-populated, auto-runs the search.
- "Recently fulfilled" tile on /hunting-now — new
public_recently_fulfilled RPC returns the last 5 demand rows that went queued → scraped in the past 7 days. Section is hidden by default; only renders when the RPC returns rows, so quiet weeks don't show an awkward empty box. Proves the consumer-side loop closes end-to-end.
- Anon-submittable "Add an artist" form — visitors who don't have an account can drop an artist name directly into the demand queue from /hunting-now. New anon grant on
log_missing_artist_request. Generic-genre rejection list (trap, drill, plug, etc.) prevents queue clutter. After submit, the queue list re-renders so the user sees their row immediately.
- Live catalog stat strip on the homepage hero — replaced "3.3k+ catalog · 1.7k+ producers · 2x daily scrape" marketing copy with three numbers that move:
total_beats, beats_today, demands_fulfilled_7d. Single-round-trip public_catalog_stats RPC. The "demands fulfilled" stat is wrapped in a /hunting-now link so the stat doubles as discovery.
- Scraper-status transparency strip on /hunting-now — three live numbers above the queue list: last-scrape age, pending queue depth, next-run ETA. New
public_scraper_status RPC, anon-callable. Removes the producer's reasonable doubt about whether the queue is real — the heartbeat is now visible.
- RSS feed for /hunting-now — producers subscribe to /hunting-now.rss in any feed reader (Feedly, Inoreader, NetNewsWire, Reeder) and new high-priority demand entries appear in their morning feed. New
/api/hunting-now-feed serverless function, RSS 2.0 with atom self-link, edge-cached 30 minutes. Each item links to the row's hash anchor on /hunting-now. Producer FAQ entry explains the use case.
- FAQ + FAQPage JSON-LD on /hunting-now — 8 questions covering "how do I get an artist on this list," "how long until my search gets scraped," "will I get notified," "I make beats — can I subscribe?" Mirrored in FAQPage structured data so Google indexes the questions for People Also Ask rich snippets.
- 24th blog post — The producer flywheel: closing the loop both ways. Walks through the asymmetry the original Hunting Now arc shipped with (consumers had ambient reasons to come back, producers didn't), why RSS specifically closed the gap, and the eight-step end-to-end loop with three actors and zero direct coordination.
- ~15 new SEO landing pages — Morgan Wallen, Zach Bryan, Sleep Token, Spiritbox, Sexyy Red, GloRilla, Baby Keem v2, Clipse, Lil Tecca, PluggnB, Yeat, Destroy Lonely, Chief Keef, Ken Carson, plus notify-themed slugs (notify-me, just-dropped, beat-alerts, freshly-scraped). Bringing live SEO landing pages to ~225.
- Architectural takeaway — every previous round of the demand-queue arc optimized the consumer side. This week's adds opened the producer side: feed subscription pulls them in via tools they already use, the live stat strip + scraper-status block make trust-building artifacts visible. Both spokes now spinning. The catalog now bends toward demand both reactively (searcher → scraper) and proactively (producer → upload).
Week of June 26, 2026
P0 fix
Features
Content
Hunting Now — the demand queue goes public, plus a P0 search-to-scrape fix
🎯 1 public demand-queue page
🔧 3 stacked scraper bugs fixed
📊 1 upgraded admin widget
📝 23 blog posts
🔗 ~210 SEO pages live
- P0 — user-search → scraper-queue gap. Test account searched "ebk jaaybo", got nothing. Next 2 scrapes ignored it. Three bugs stacked: (1) the search rescue path silently consumed demand signals when the multi-word fallback returned 10+ partial matches, (2)
queue_missing_requests marked rows 'queued' but the success path never marked them 'scraped' — so successful scrapes still left rows stuck forever, invisible to the next pending fetch, (3) crashed/quota-killed runs left rows orphaned with no retry path. Fixed: explicit unknown-artist queries always log demand; end of phase 1 marks queued rows scraped; recycle stale 'queued' rows older than 6 hours back to 'pending'. Full writeup.
- /hunting-now public page — top 30 user-typed artist demands, anonymized (no user_id, no query text). Mirrors /trending-now's pattern but green-themed for "demand pending, not catalog yet." New
public_demand_queue RPC. Linked from homepage chip cluster, footer, /community nav. See it live.
- Dynamic OG card for /hunting-now — every share on Twitter / Discord / Slack / iMessage previews with the live top-5 demand queue. Each share becomes a recruitment ad: "EBK Jaaybo · 1 search · IN QUEUE — search him too to bump priority." That's the loop that makes demand viral instead of internal.
- Search empty-state UX — replaced vague "🔥 Hunting Your Sound — Our AI is hunting your next drop" with concrete "✓ Saved to the priority queue. Your search just bumped a row. Scraper runs every 12h." Plus a tip explaining that searching the same artist again bumps it higher. Closes the loop on the P0 fix: users have credible reason to search again.
- Admin demand-queue widget — was thin top-10 by request count; now top-25 ordered by priority desc (= the field the scraper uses for queue order), with the original query text the user typed, age, and tap-to-bump-priority +5 action. Lets Chef triage demand without writing SQL.
- 23rd blog post — Hunting Now: how a search bug became a public demand queue. Five rounds end-to-end: bug → fix → admin → empty-state → public page → cross-link → OG. Pull quote: "Three bugs stacked. Together they made the demand loop look broken to anyone whose first search wasn't in the master list."
- ~10 new SEO landing pages — EBK Jaaybo type beats, California drill, discovery, new-artist, hunting-themed (most-searched, in-demand, requested, voted), plus dark-trap-vibes / melodic-drill / west-coast-melodic / east-coast-drill. Bringing live SEO landing pages to ~210.
- Architectural takeaway — exposing internal data publicly creates flywheels. The demand queue had been in the database for months. Once it had a URL, an OG card, and a chip on the homepage, every share became a recruitment ad for the demand queue itself. Same database row, three new surfaces (admin / search empty state / public page) — and the public page is the one that compounds.
Week of June 19, 2026
Features
Content
Cross-tool transfers — velocity → dynamics → bass → loop-count, four tools sharing one playbook
🎚 3-state velocity cells
🎹 4 dynamics modes (chords)
⏱ 3 tools w/ bar-count limit
📝 22 blog posts
🔗 ~200 SEO pages live
- Per-step velocity on /tools/drums — every cell is now a 3-state (off / soft / loud). Click cycles through. Soft hits get 0.55× gain + dimmer per-track tint. URL hash adds optional
v= field so legacy on/off-only links still play.
- Humanize button on /tools/drums — re-rolls velocities so the pattern sounds played-by-hand. Kick downbeat + snare backbeat stay LOUD; off-beat hi-hats 50% chance demoted to SOFT; everything else 35% SOFT.
- Chord dynamics on /tools/piano-roll — DYN pill row in the auto-play progression: Flat / Crescendo / Wave / Humanize. Same gain primitive as drum velocity, applied per-chord. Crescendo ramps 0.55→1.0 across the cycle (verse → chorus); Wave alternates; Humanize randomizes.
- Bass overlay on /tools/piano-roll — BASS pill row alongside DYN: Off / Roots / Walking. Walking plays root on the downbeat then fifth at the half-bar. Direct port of the drum sandbox's bass overlay shape (Round 108).
- Loop / bar-count picker on three tools — /tools/piano-roll's auto-play (4× / 8× / 16× / ∞), /tools/metronome (8 / 16 / 32 / ∞), and /tools/drums (4 / 8 / 16 / ∞). Same wrap-and-count idiom; counter increments when scheduler wraps to step 0; setTimeout stops cleanly after the last beat finishes ringing.
- 21st + 22nd blog posts — The drum sandbox grew up (12 iterations on a 16-step grid without breaking the URL hash) and Velocity, twice (cross-tool transfer when the underlying primitive is the same — half the cost the second time).
- ~12 new SEO landing pages — swing trap, walking bass, velocity hit, ghost note, live drum feel, human feel, velocity trap, dynamic drum, crescendo, dynamic chord, verse chorus, cinematic build, walking bassline, bass driven, pocket, expressive, practice metronome, 8 bar loop, 8 bar drum loop, practice drum, humanized chord, hand played piano. Bringing live SEO landing pages to ~200.
- Architectural takeaway — by Round 158, the toolkit had paid for the same primitive (gain multiplier on a Web Audio scheduler) four times: drums velocity (Round 143), drums Humanize (Round 144), piano roll DYN (Round 146), piano roll Humanize (Round 151). Each new use cost less because the previous ones taught the codebase one more shape of the data. Same compounding pattern as the URL-hash work.
Week of June 12, 2026
Features
Content
Velocity grows up — three-state cells, humanize, plus the drum sandbox journey
🎚 3-state velocity (off · soft · loud)
✨ 1 Humanize button
🥁 12 drum sandbox iterations
📝 21 blog posts
🔗 ~190 SEO pages live
- Per-step velocity on /tools/drums — every cell is now a 3-state instead of an on/off bit. Click cycles off → loud → soft → off. Loud hits use the kit's nominal gain; soft hits get a 0.55× gain multiplier and a dimmer per-track tint (kick orange, snare gold, hi-hat cyan, openhat green). The hash format stays backward-compatible:
p= still encodes 0/1 on/off bits and a new optional v= field encodes 0/1/2 velocity digits — only emitted when at least one cell is soft. Old shared links default to all-loud and play identically to before.
- ✨ Humanize button on /tools/drums — sits next to 🎲 Surprise me. Takes whatever pattern is on the grid right now (presets, hand-built, surprise-generated) and re-rolls velocities so it sounds played by hand. Kick downbeat + snare backbeat stay LOUD; hi-hat on-beats stay LOUD with off-beats 50% chance demoted to SOFT; everything else 35% SOFT, 65% LOUD. Operates in place — same hits, just new velocities — so a hand-built pattern keeps its shape while gaining dynamics.
- 21st blog post — The drum sandbox grew up: from grid to instrument. The 12-iteration story: Round 106 grid → 107 chord overlay → 108 walking bass → 109 kits → 117 save library → 125 swing → 135 random → 139 shift → 140 mute → 141 copy-share-link → 143 velocity → 144 humanize. The hash format from Round 106 still loads in the Round 144 sandbox without a single migration.
- Random pattern generator now uses velocity — surpriseMe re-tuned: kick downbeats and snare backbeats land LOUD, ghost-fill snares always SOFT, ~30% of fill kicks and hi-hats SOFT. Generated patterns ship with a baked-in groove instead of the pre-velocity "all loud" wall.
- ~9 new SEO landing pages — swing trap, walking bass, velocity hit, ghost note, live drum feel, human feel, plus the leftover bedroom-producer / random-beat-generator / pattern-presets pages. Bringing live SEO landing pages to ~190.
- Architectural takeaway — adding a third state to a binary grid would have meant a migration in most apps: change every read site, change every write site, change the serialization, write a converter for old saved patterns. Here the cost was three lines in the click handler, two lines in the renderer, twelve lines for the new
v= hash key. The data was already canonical (URL hash) and the saved patterns were already stored as hash strings (Round 117), so all the legacy state forwarded through unchanged. Velocity is the eleventh feature this layer has paid for "for free."
Week of June 5, 2026
Features
Content
Flip the read — four toggles, one idea, plus a random-beat button and a guitar reference tone
🎚 4 "flip the read" toggles
🎼 12 FAQ entries
🎲 1 random pattern generator
📝 20 blog posts
🔗 ~180 SEO pages live
- ÷2 / ×1 / ×2 BPM toggle — the BPM detector now lets you flip between half-time, detected, and double-time reads in one tap. The detector locks to whichever pulse is loudest in the energy envelope; the toggle is what comes after — same audio, three reads. Re-paint is sub-millisecond because it's just a multiplier on the cached
rawBpm; no audio re-analysis.
- Sharp / Flat enharmonic toggle — the piano roll now displays note names in the user's preferred enharmonic spelling. Flip ♯ ↔ ♭ and the chord card root, slash-bass, chord-tone list, pressed-row chips, scale row, and diatonic palette button labels all swap (C# ↔ Db, F# ↔ Gb). Bb major's diatonic 7ths read Bbmaj7 · Cm7 · Dm7 · Ebmaj7 · F7 · Gm7 · Aø7 instead of A#maj7 · etc. URL hash carries the preference as
&flats=1; the parser accepts either spelling so old shared links still work.
- Subdivision row on the metronome — Quarter / 8ths / 16ths / Triplet. Subdivision ticks are quieter than the main beats (700 Hz at 30% amplitude vs 1000 Hz main). Visual dot flashes only on main beats so the eye stays on the bar pulse while the ear catches the subdivisions. Persists in URL hash.
- Reference-tone playback on the guitar tuner — each string row now has a ▶ Tone button. Tap to hear a 1.5-second sine reference at the target frequency (E2 = 82.41 Hz, A2 = 110, etc.). Two oscillators detuned ±2 cents are summed for a slightly chorus-y feel. Useful when your room is too noisy for mic-pickup tuning.
- 🎲 Surprise me on the drum sandbox — one-tap random pattern generator. Per-track probabilities tuned so the result sounds like a beat: kick anchored on step 0 + probable 8, biased toward step 14; snare on backbeat 4/12 with 7% ghost notes; hi-hat 70% per step; open hat 8% sparse accents. URL hash persists the random so you can keep one.
- FAQ expansion on /tools/audio — added 4 new entries (now 12 total) covering half-time vs straight-time at the same BPM, the 70/140 detector paradox, MPC swing history (Akai MPC + J Dilla pocket), and why 7th chords sound jazzier than triads. All mirrored in the FAQPage JSON-LD for Google's "People also ask" rich result.
- 20th blog post — Flip the read: when one audio file has two right answers. The unifying-idea piece across the BPM toggle, swing pocket, triad/7th, and half-time/straight reads. Same audio, two right answers, one-tap flip. Each toggle ~30-50 lines because the data layer was already paying for the reuse.
- "What's new" strip on /tools/audio — refreshed with chord shape diagram, slash-chord notation, diatonic palette, 7ths toggle, swing presets, and metronome subdivisions. Reads as a rolling "last ~10 days of audio-tool changes" surface.
- ~14 new SEO landing pages — Chicago drill, Amapiano, ambient trap, new jazz, drum-and-bass, jersey drill, Nujabes-type, maj7 piano, sample flip, BeatStars-style, flat-key, Eb minor, bedroom producer, guitar loop, plus the random-beat-generator and beat-pattern-presets pages from the new drum sandbox features. Bringing live SEO landing pages to ~180.
- Architectural takeaway — each toggle was cheap because the previous round had already paid for the data structures. By the time the enharmonic toggle shipped, the diatonic palette already accepted any chord-name spelling via
ch()'s extended NAME_TO_PC. The "flip the read" pattern compounds: each new toggle teaches the codebase one more way to think about its own data, and the next toggle gets cheaper.
Week of May 29, 2026
Features
Content
Chord workshop, swing pocket, save library — five surfaces, one matcher
🎹 5 chord-workshop surfaces
🎯 12 diatonic keys
🥁 4 swing presets
📝 19 blog posts
🔗 ~165 SEO pages live
- Chord shape diagram — the chord identifier on /tools/piano-roll now draws a one-octave SVG keyboard alongside the chord name. Root in accent orange, chord tones in cyan, non-chord keys dimmed. The chord-tone names spelled out beside it (C · E · G for C major) so the player reads both shape and spelling at once.
- Inversion / slash-chord notation — when the lowest pressed note isn't the chord root, the identifier now reads the inversion:
C/E for first inversion, C/G for second, Cmaj7/B for third. The chord-meta line appends the ordinal ("1st inversion", "2nd inversion"). Foreign bass notes still display as the plain root chord — slash notation there would mislead. 7/7 cases verified.
- Diatonic chord palette — pick a key from the dropdown (6 majors + 6 minors) and a row of 7 buttons appears showing the diatonic triads with their roman-numeral function (I-ii-iii-IV-V-vi-vii° in major). Click any button to apply that chord to the keyboard. Diminished chords styled in red so the unstable degree is visible at a glance.
- Triad / 7ths toggle — same palette, a pill toggle in the header switches between triads and seventh chords. 7ths mode shows Imaj7-ii7-iii7-IVmaj7-V7-vi7-viiø7 in major; minor equivalents in minor. The half-diminished chord (m7b5) was the only addition; the matcher already recognized it.
- Swing pocket on /tools/drums — Swing row with four presets: Straight (50%), Light (54%), MPC (58% — the Dilla pocket), Full (66% — full triplet shuffle). Scheduler is swing-aware: after on-beat steps the gap to the off-beat is (1+s) * stepDur; after off-beat steps it's (1-s) * stepDur. Pairs always sum to 2 * stepDur so chord/bass overlay timing is unaffected.
- Save library on both tools — Save button on /tools/piano-roll and /tools/drums stashes the current state (URL hash) in localStorage with a name. Up to 12 saved per tool, render as gold pills above the presets, click to load, × to delete. Save is the share URL stored locally — same code path as Share/Open, no parallel persistence format.
- FAQ on /tools/audio — six common-question accordion using native <details>/<summary> (zero JS, full a11y). Wrapped in JSON-LD FAQPage schema for rich Google snippets.
- 18th + 19th blog posts — Round-trippable URLs: when saving is sharing and From scale detector to chord workshop. Both BlogPosting JSON-LD, indexed in /blog. The chord post is the architecture story across rounds 91, 101, 121-124: one matcher, five UI surfaces, each layer reusing the previous one's data shape.
- ~16 new SEO landing pages — Saweetie, Lil Loaded, chord-progression beats, minor-key trap, slow-tempo, R&B loop, jazz rap, acoustic guitar, neo-soul, gospel chord, Dilla pocket, songwriter rap, drumless, plus refreshes of boom-bap and the existing artist set. Bringing live SEO landing pages to ~165.
- Architectural takeaway — the chord identifier started as a 21-row dictionary lookup. Five iterations later it's a chord workshop. Each new feature was ~50 lines because the earlier features had already paid for the data structures: matcher returns intervals → diagram reads them; matcher tracks bass → inversion logic reads it; palette pushes chords back in via the same applyChord() the matcher's input used. One engine, five UI surfaces.
Week of May 22, 2026
Features
Infra
Chord workflow + drum sandbox + sitemap split — 5 audio tools, 17 blog posts
🎚 5 audio tools live
🎼 21 chord types matched
🥁 4 drum kits
📝 17 blog posts
🗺 5 sub-sitemaps
- Chord workflow on the piano roll — the scale detector now also identifies chords (3-7 notes pressed → chord name like Cmaj7, Dm9, F sus4 etc.). 21 chord types matched by Jaccard similarity over rotated pitch-class sets, with a bass-priority tie-breaker that resolves the C-F-G/Csus4-vs-Fsus2 ambiguity the way musicians do (the lowest note implies the root). 14/14 chord cases verified by node test harness.
- Chord progression presets + auto-play — 8 famous progressions (I-V-vi-IV, ii-V-I, blues, Andalusian, etc.) with prev/next/× nav, BPM input, play button. Web Audio look-ahead scheduler queues each chord at sample-accurate timing; visual highlight stays in lockstep via per-chord setTimeout. Same scheduler pattern the metronome uses.
- Chord-name lookup — type "Cmaj7" or "F#m7b5" or "Bb sus4" and the keys light up. ~25 suffix aliases (m, min, -, °, o, dim, +, aug, ø, m7♭5, m(maj7), etc.) all map to the 21 canonical chord shapes. 23/23 parser cases verified, including rejection of unparseable inputs (H, xyz, C#z all turn the input red).
- /tools/drums — 16-step drum pattern player. Each hit synthesized on the fly (no samples loaded over the network): kick is sine + pitch envelope, snare is high-passed noise + 200Hz triangle body, hats are 7kHz HP-noise. 4 drum kits (Default, 808, Lo-fi, Tight) swap parameter sets through one playDrum() function. 6 pattern presets (Boom-bap, Trap, Drill, House, Half-time, Bounce). URL hash encodes the full pattern + chord + bass + kit so shared links reproduce exactly.
- Drum chord + bass overlay — drums tool also takes a chord progression and a bass mode (Roots / Walking) on top. The same look-ahead scheduler queues drums + chord stack + bassline, all locked to one BPM. Now-playing chord pill in the transport.
- /tools/metronome — Web Audio look-ahead scheduler, 30-300 BPM, four time signatures (4/4, 3/4, 6/8, 5/4 with proper accent placement), tap-to-set tempo. Round 114 added 8 common-tempo chips with style labels (60 Ballad, 85 Boom-bap, 120 Dance, 140 Trap, 174 DnB, etc.).
- Guitar tuner alternate tunings — Drop D, Open G, DADGAD, Bass EADG, plus the original Standard EADGBE. String reference grid swaps on tuning change; low-frequency floor adapts so E1 (41Hz) gets caught for bass. URL hash persists the tuning choice.
- /tools/audio hub — single page that lists all 5 tools as cards, with a "What's new" strip showing recent updates and links to the two engineering blog posts. JSON-LD CollectionPage + BreadcrumbList for SEO.
- Sitemap split — replaced the 247-URL monolith with 5 category-specific sub-sitemaps (pages / tools / blog / artists / discover) referenced by /sitemap-index.xml. Search engines can recheck a category without re-evaluating unchanged URLs in others.
- Unified cross-nav across all 5 audio tools: same emoji prefix, same canonical order (piano · drums · BPM · metro · tuner), same related-tools pill row at the bottom of every tool. The toolkit feels like one app.
- 16th + 17th blog posts — The chord workflow on a single HTML page and One scheduler, three layers, four kits. Both BlogPosting JSON-LD, indexed in /blog and the Blog schema.
- ~24 new SEO landing pages — Lil Wayne, Pop Smoke, DaBaby, Moneybagg Yo, SZA, Doja Cat, Cardi B, Megan Thee Stallion, Lil Nas X, Chris Brown, Quavo, 6LACK, Tory Lanez, NLE Choppa, Mac Miller, DDG, Yung Bleu, Coi Leray, Yo Gotti, Young Dolph, Drakeo the Ruler, 03 Greedo, Mariah the Scientist, Smino, Big Sean, Russ, JID, Lil Pump, Kid Cudi, Pi'erre Bourne. Bringing live SEO landing pages to ~149.
Week of May 15, 2026
Features
Infra
Audio tools triad: piano roll, BPM + key, guitar tuner — all browser, no upload
🎼 3 new audio tools
⚙️ 0 new function slots
📝 15 total blog posts
🔬 4 hand-rolled DSP algorithms
- /tools/piano-roll — 2-octave interactive piano. Click keys, hear them via Web Audio (triangle wave with quick attack-decay), see every scale that contains the pressed pitch classes. Ranks by fit %; smaller scales win ties (pentatonic beats major when both fit). 12 scales in the bank: major/minor, the four canonical modes, harmonic + melodic minor, both pentatonics, blues.
- /tools/bpm-detector — drop an audio file, get tempo + key. BPM via energy-envelope autocorrelation (squared samples, 200Hz envelope, autocorrelate at 60-200 BPM lag range, pick peak). Key via hand-rolled iterative Cooley-Tukey FFT → 12-bin chromagram → Pearson correlation against all 24 Krumhansl-Schmuckler key profiles. Half/double-time tempo + relative-major/minor key alternates flagged.
- /tools/guitar-tuner — real-time mic-driven tuner. AnalyserNode + RAF loop reads ~50 buffers/sec; hand-rolled YIN pitch detection (CMNDF + parabolic interpolation around the minimum) finds the fundamental. Cents-off needle, color-coded state, EADGBE string highlighting in cents-log space (so E4 doesn't false-match E2).
- 15th blog post — Three audio tools, four rounds, zero servers — the algorithms behind each tool plus the case for browser-side DSP over server uploads.
- JSON-LD coverage expanded to 6 schema types: Organization + WebSite (homepage), CollectionPage + BreadcrumbList (history pages), BlogPosting (all 15 posts), Blog (index), MusicGroup (producer profiles), MusicRecording (beat detail), WebApplication (each new tool).
Week of May 8, 2026
Features
Growth
Infra
Four leaderboards, three history archives, the snapshot piggyback pattern
📊 4 leaderboards (producer, mover, beat, genre)
📜 3 history archive pages
🎨 23 dynamic OG cards
🎯 ~70 new SEO pages this batch
📝 4 new blog posts
⚙️ 1 cron, still 12/12
- Top-mover system. New
producer_top_mover RPC + /community Biggest Mover tile + iOS TopMoverCard on the home feed. Producer pages get a 🚀 Top Mover pill when they're the current biggest weekly climber. Dedicated ?type=mover OG card.
- /weekly-recap — single shareable surface consolidating top producer + biggest mover + top 10 + top genres + beat of the week. Lives at the same URL on web and iOS. Dedicated
?type=weekly-recap two-column OG card.
- /movers-history — hall-of-fame style page listing every past week's biggest leaderboard climber. Backed by
producer_rank_history + a new producer_top_mover_history RPC. Dedicated ?type=movers-history stacked share card.
- Beat of the week — single most-saved beat in the trailing 7-day window. New
beat_of_the_week RPC, /beat-of-the-week page with hero card layout, iOS BeatOfTheWeekCard on home feed, dedicated ?type=beat-of-the-week OG card.
- /beats-history — past 12 weeks of beat-of-the-week winners. Backed by a daily snapshot piggybacking on the existing daily-digest cron. Dedicated
?type=beats-history stacked share card.
- Top genres lens. New
top_genres_of_the_week RPC, bar-chart tile on /weekly-recap (web + iOS), dedicated ?type=top-genres share card. /genres-history page tracks the dominant genre week by week with runner-up lines.
- Producer rank trend sparkline. /producer/:name pages now render an inline SVG sparkline of the producer's past 8 weekly ranks. Climbing visualization (lower rank = higher on chart).
- Snapshot piggyback architecture. Three new history tables —
producer_rank_history, beat_of_the_week_history, weekly_top_genre_history — all populated by idempotent RPCs called inline at the top of the existing daily-digest cron. No new Vercel function slots consumed.
- ~70 new SEO landing pages covering missing trending artists (Drake, Future, Yeat, Lil Yachty, Brent Faiyaz, Bryson Tiller, Summer Walker, Giveon, PartyNextDoor, Lil Tecca, Lil Skies, Ken Carson, Jorja Smith, Jack Harlow, Fivio Foreign, Luh Tyler, Nardo Wick, Larry June, Doechii, GloRilla, Latto, Sleepy Hallow, Tee Grizzley) and a canonical-link audit on the top-of-funnel pages. Total live SEO pages: ~101.
- 4 new blog posts: leaderboard before community, the duplicate-URL leak, cron piggyback pattern, four leaderboards, one cron.
- iOS parity across the leaderboard story: TopProducersStrip + TopMoverCard + BeatOfTheWeekCard + TopGenresCard, plus a new /weekly-recap screen mirroring the web page.
- 23 OG card types including
weekly-recap, mover, movers-history, beat-of-the-week, beats-history, top-genres, genres-history. /og-preview gallery refreshed.
Week of May 1, 2026
Features
Growth
Infra
Producer leaderboard end-to-end, 33 SEO landing pages, 5 new blog posts, in-app /leaderboard screen
🏆 Live leaderboard — 24h / 7d / 30d
🎯 33 SEO pages this batch
📝 10 total blog posts
🎨 17 dynamic OG cards
⚙️ 12/12 Vercel functions
- Producer leaderboard at
/producers with live ?w=24h|7d|30d window toggle + share buttons. Server-side aggregation via the new producer_leaderboard_window RPC — replaces 5,000-row client-side scans in three places.
- Rank everywhere. 🏆 #N this week pill on /p/:slug profile pages, on the iOS producer profile (tappable to open the in-app leaderboard), and burned into the
?type=producer OG card so social shares carry the rank.
- iOS
/leaderboard screen — native top-30 list with the same window toggle + a share button that builds the matching ?type=leaderboard OG URL. Plus a horizontal TopProducersStrip on the home tab.
- Marketing homepage live producer widget. Top-5 rendered inline between How-it-works and Pro features. og:image set on every major marketing page (/, /weekly, /tools, /founders, /pricing, /about, /artists) so shares of studiomode.app unfurl with a live community card.
- iOS
/notes upgrade — search across title, producer, body; sort by Recent / Most words / A-Z; 5-version SecureStore-backed history per note with restore.
- iOS
/saved sort menu — Recent / A-Z / Most-played. iOS achievements long-press share. iOS HomeGreeting daily prompt rotating through 8 lines by day-of-year.
- Sound DNA share on iOS Stats — top genre + top producer one-line summary, share builds the
?type=wrapped OG URL with the user's stats.
- Share-a-bar from BeatNotesSheet — picks the longest non-marker line, fires a share with the
?type=note OG card. Companion /note-share page.
- 33 SEO landing pages covering trending genres (phonk, UK drill, jazz rap, dancehall, trap soul, afroswing, new jack swing, Detroit trap, etc.) and trending artists (Metro Boomin, Kanye, J. Cole, Young Thug, Kendrick, Tyler, Juice WRLD, Trippie, 21 Savage, Roddy Ricch, Lil Uzi, Lil Durk, Sexyy Red, Ice Spice, NBA YoungBoy, Polo G, Chief Keef, Baby Keem, Post Malone, The Weeknd).
- 5 new blog posts: 17 share-cards in one Vercel function, why we rank by saves, three callers, one RPC, 100-day retrospective, ten essays in: what compounded.
- 17 dynamic OG card types including new
?type=leaderboard; producer card now includes 🏆 rank badge for top-20 producers; /og-preview internal QA gallery shows every type live.
- Live pulse strip on /tools — three cells showing new beats today, saves this week, and the top 7-day producer. Hydrated from three independent Supabase REST queries.
- Help center got 3 new FAQs about the leaderboard; /labs gallery refreshed with leaderboard, OG preview, and lyric share entries.
Week of April 30, 2026
Features
Growth
Infra
Live data hub, share-card system, songwriting suite v2, and 4 long-form blog posts
📦 3,300+ beats indexed
🎛️ 1,700+ producers
📝 5 blog posts live
🌐 ~80 static pages
⚙️ 12/12 Vercel functions
- Daily Beat Tarot at
/beat-tarot — three-card daily reading drawn from your saved beats. Past / Present / Future with shareable PNG export.
- Live community surfaces.
/feed for anonymized live saves, /trending-now for the rolling-hour leaderboard, /spotlight for the weekly top producer, /community as the unified hub.
- Real-time co-write notes. Share a beat's note with a co-writer; both edit live. Powered by Supabase Realtime UPDATE subscriptions.
- Pin notes + Daily challenge banner + HomeGreeting + FirstTimeTour — meaningful UX surface area on the home tab.
- Streak freeze (Pro). Miss a day? Apply a freeze to protect your streak. One per rolling 7 days, server-enforced.
- BeatPlayer: loop, sleep timer, playback rate. Songwriter trio — loop a beat for long writing sessions, sleep timer auto-pauses overnight, 0.5×/0.75×/1×/1.25× to find the pocket.
- Lyric expander. AI-style next-bar suggestions powered by Datamuse rhymes + curated meter templates. Three suggestions, tap to insert.
- StudioMode Wrapped at
/wrapped — Spotify-Wrapped-shaped annual recap with PNG export.
- Compatibility checker at
/compat — paste two beats, get a 0-100 mash-up score by tempo + Camelot wheel + vibe.
- Vault Visualizer at
/vault — animated taste-evolution scatter of every saved beat.
- 11 share-card types via
/api/og — beat, producer, badge, default, tarot, wrapped, spotlight, compat, streak, trending, feed. Plus dynamic catalog sitemap. All in one Vercel function.
- Embeddable player at
/embed + Producer badge + Embed builder — three viral acquisition surfaces for producer-side leverage.
- 4 new long-form blog posts: the vision, how the algo works, building the scraper, what 5,000 saves taught us, 12 Vercel functions. RSS feed at
/blog/feed.xml.
- Public roadmap voting at
/roadmap. /labs gallery, /launch one-pager, /explore discovery hub, /help center, /wallpapers.
- Calendar streak heatmap on /achievements. 91-day GitHub-style save activity grid.
- iOS Skeleton loaders, Undo Toast, BPM tap detector — UX polish round.
Week of April 28, 2026
Growth
Features
Infra
Trial system, referrals, and 35 SEO landing pages
📦 5,830 beats indexed
🎛️ 3,703 producers
🎼 1,331 with BPM
🔑 727 with key
🔗 2,252 with marketplace
- 14-day Pro trial on signup. Every new user gets full Pro access for 14 days, no card required. Existing free users got a generous backfill.
- Two-sided referrals. Every user gets an 8-char referral code. When a friend signs up with it, both parties get +30 days of Pro.
- 35 SEO landing pages. Long-tail traffic for "boom-bap-beats," "dark-trap-beats," "Travis Scott type beats," and 32 more. Each tied to live AI-filtered results.
- Producer outreach engine. The
/outreach admin tool surfaces unsigned producers ranked by save velocity. Email template + tracking included.
- Vercel Git auto-deploy fixed. Every push now ships to production automatically — no more manual
vercel --prod.
- iOS trial banner + referral screen. Native UX parity with the web for the trial system + the new
/refer screen.
Week of April 21, 2026
Features
Fixes
BPM/key on every card, marketplace enrichment, faster scrape
- BPM + key surfaced everywhere. Tempo and key now show as labeled pills on every beat card across the app.
- Marketplace URL enrichment. When YouTube descriptions don't include BPM/key, our enrichment job fetches them from BeatStars / Airbit pages directly.
- Recommendation v8. Pagination + sparse-fallback + saved-not-played boost. Daily mix is sharper than ever after 10+ saves.
- Scraper v3. Bulk dedup + dynamic deep-crawl + title-mining. Catalog growth tripled while quota usage stayed flat.
- Beat of the Day + Today's Drop. Restored as default sections on the home feed.
Week of April 14, 2026
Features
Growth
Web parity, mini-player, persistent "For You" feed
- Web app reaches feature parity. Every iOS feature now works on the web: sign-in, save, AI search, mini-player, license filter, recently played, save streak.
- Mini-player on every page. Browse, hot, weekly, account, my-list — your active beat keeps playing as you navigate.
- iOS-style mini-player card. Like / dislike / skip buttons in the persistent player.
- Mood-driven SEO pages. Sad, hyped, chill, aggressive, dreamy, dark — search by feel, not just genre.
Week of April 7, 2026
Features
Save streaks, daily email digest, producer claim flow
- Save streaks. Save at least one beat each day to build a streak. Visible on home + account tab.
- Daily email digest. Personalized morning email with 5-10 fresh beats matched to your taste, sent at 9am local time.
- Producer claim flow. Producers can claim their auto-generated profile, get a verified badge, and edit their bio.
- Pricing page (web). Side-by-side Free / Pro / Annual / Founders Lifetime tiers.
Week of March 31, 2026
Features
Web app launch, AI search, license filter
- Web app at
/app. Full studio dashboard accessible from any browser. PWA-installable.
- AI search. Natural language: "Drake-type beat at 90 BPM in F minor for storytelling." Parses tempo, key, mood, era, producer style.
- License filter. Toggle between Free for Profit / Lease / All licenses anywhere in the app.
- Programmatic SEO infrastructure. First 5 long-tail landing pages (140-bpm-trap-beats, sad-piano-beats, etc.) — foundation for the 35-page expansion this week.
Week of March 24, 2026
Features
iOS v1.0 launch + push notifications
- iOS app shipped to App Store. One year of solo building, finally live.
- Push notifications. Daily Drop, drop alerts when followed producers release, weekly digest. Granular per-channel toggles.
- Sign in with Apple, Google. Frictionless signup paths added.
- Onboarding redesign. Typing-first artist seed → preview → sign-up flow.
Earlier (since March 2025)
Foundation
The first year — building the foundation
- Catalog scraping pipeline (YouTube Data API + headless Chromium for marketplace pages)
- Recommendation engine with save/play/skip signals + recency decay
- Folders for organizing saves into projects
- Producer profiles + follow system
- Binge mode (full-screen swipe-through player)
- Listening analytics (Pro feature) — top genres, top producers, sound evolution
- BeatPlayer with queue, next/prev, auto-advance, ⏪⏩ skip, share
Full git history: github.com/ecoria21/beatvault