<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Sourish Panda</title>
    <description>The latest articles on DEV Community by Sourish Panda (@t-rexbytes).</description>
    <link>https://dev.to/t-rexbytes</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4026815%2Fa722cacd-1e7c-44a3-9a1d-945c06d48bb4.jpg</url>
      <title>DEV Community: Sourish Panda</title>
      <link>https://dev.to/t-rexbytes</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/t-rexbytes"/>
    <language>en</language>
    <item>
      <title>Repost : The groove is the 40 milliseconds a grid throws away, so we built a beat studio that gives them back, in a browser tab</title>
      <dc:creator>Sourish Panda</dc:creator>
      <pubDate>Sun, 04 Oct 2026 21:33:22 +0000</pubDate>
      <link>https://dev.to/t-rexbytes/repost-the-groove-is-the-40-milliseconds-a-grid-throws-away-so-we-built-a-beat-studio-that-gives-3j6k</link>
      <guid>https://dev.to/t-rexbytes/repost-the-groove-is-the-40-milliseconds-a-grid-throws-away-so-we-built-a-beat-studio-that-gives-3j6k</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;At 90 BPM a sixteenth note lasts &lt;strong&gt;166.7 ms&lt;/strong&gt;. Swing at 50% pushes every second one of them late by &lt;strong&gt;41.7 ms&lt;/strong&gt;. That is the entire difference between a hi-hat that marches and one that bounces, and it is shorter than one frame of most phone videos.&lt;/p&gt;

&lt;p&gt;A plain step grid snaps every hit onto those 166.7 ms boundaries and throws the 40 ms away. We built one that keeps them, and then asked a harder question.&lt;/p&gt;

&lt;p&gt;The single most common mistake in a multi-sponsor project is using each sponsor as a logo. A drum machine that stores a JSON blob somewhere is not a database project. A text box that calls an API once is not a sound-design project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So the first question was: what can each piece do that the others physically cannot?&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Piece&lt;/th&gt;
&lt;th&gt;The one thing only it can do here&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;The browser&lt;/td&gt;
&lt;td&gt;Play audio with sample-accurate timing and run open-source models on the user's own device&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tiger Data&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Keep workspaces, audio, 384-d embeddings and a full-text index in &lt;strong&gt;one&lt;/strong&gt; Postgres, and answer "find me a warm, dusty kick" with a single SQL statement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ElevenLabs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Produce a sound that exists in no sample pack, from a sentence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Entire&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Keep the agent's reasoning next to the commit it produced, so the build itself is reviewable&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;My friend &lt;strong&gt;Anuv&lt;/strong&gt; makes beats, and his ideas don't wait for him to be at his setup. [[ONE TRUE SENTENCE IN HIS WORDS ABOUT A LOST IDEA OR A NIGHT OF SAMPLE-PACK DIGGING]] Krisp is what we built him.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Krisp&lt;/strong&gt; is a minimal, hardware-feel beat studio in a browser tab. You tap a beat on pads, give it feel with velocity and swing, let an open-source model humanize it or offer four variations, describe a sound and get it, find any sound again by its vibe, arrange beats into a song, mix it through a real master chain, and export a WAV, or MIDI for your DAW.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; pads, keys --&amp;gt; zustand store --&amp;gt; scheduler -------&amp;gt; Tone.js engine --&amp;gt; speakers
 (tap, paint,   one Workspace,    pure timing math,  channels, reverb,
  velocity,     undo history      100 ms look-ahead  comp + limiter    same engine
  live REC)          |                                   |        --&amp;gt; Tone.Offline --&amp;gt; WAV
                     |--&amp;gt; Magenta.js (GrooVAE, MusicVAE, DrumRNN)   in the browser
                     |--&amp;gt; all-MiniLM-L6-v2 (384-d embeddings)       in the browser
                     |
                     '--&amp;gt; /api (Vercel) --&amp;gt; Tiger Data: Postgres + pgvector + full-text
                                       '--&amp;gt; ElevenLabs Sound Effects (server-side key)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  One thing up front, because it changes how you read every number below
&lt;/h3&gt;

&lt;p&gt;Every number in this post was &lt;strong&gt;measured&lt;/strong&gt;, and here is where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Audio and AI timings: &lt;strong&gt;headless Chrome on a Windows laptop with no GPU&lt;/strong&gt;, against a local dev server. A laptop with a GPU will be faster. I haven't measured that, so I don't claim it.&lt;/li&gt;
&lt;li&gt;Database latency: &lt;strong&gt;India to a Tiger Data service in US-East&lt;/strong&gt;. The deployed functions run in Vercel's &lt;code&gt;iad1&lt;/code&gt;, next to the database.&lt;/li&gt;
&lt;li&gt;Search measurements used &lt;strong&gt;synthetic test sounds&lt;/strong&gt; that the test script generated, uploaded and deleted again.&lt;/li&gt;
&lt;li&gt;Where something broke, the error is quoted &lt;strong&gt;verbatim&lt;/strong&gt; in What Didn't Work.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  The walkthrough
&lt;/h3&gt;

&lt;p&gt;Six stops, in the order you meet them.&lt;/p&gt;
&lt;h4&gt;
  
  
  1 · The dashboard
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;🖼️ ADD IMAGE HERE →&lt;/strong&gt; &lt;code&gt;01-home-workspaces.png&lt;/code&gt; (from the "Blog images" folder) — &lt;em&gt;Krisp home: workspace cards with beat-colour strips&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Every idea is a card. Its colour strip is the first six beats inside it, so a sketch is recognisable before you open it. Under the cards, a hand-lettered guide teaches the whole app with real controls you can touch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🖼️ ADD IMAGE HERE →&lt;/strong&gt; &lt;code&gt;03-guide-eight-steps.png&lt;/code&gt; (from the "Blog images" folder) — &lt;em&gt;Hand-lettered guide: eight steps from a blank page to a WAV&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;For Anuv:&lt;/strong&gt; his ideas stop living in voice memos and stray files. They are all one click from Home, and he never needs a manual.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;
  
  
  2 · Creating a workspace
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;🖼️ ADD IMAGE HERE →&lt;/strong&gt; &lt;code&gt;02-new-workspace-presets.png&lt;/code&gt; (from the "Blog images" folder) — &lt;em&gt;New workspace dialog: Empty plus eight preset beats with BPM and a mini pad map&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Start empty, or from one of eight original patterns, each with its own tempo and swing.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;For Anuv:&lt;/strong&gt; a groove is playing seconds after he opens the app, as a starting point he reshapes by hand, not a blank grid.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;
  
  
  3 · The full workspace
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;🖼️ ADD IMAGE HERE →&lt;/strong&gt; &lt;code&gt;05-workspace-overview.png&lt;/code&gt; (from the "Blog images" folder) — &lt;em&gt;The full workspace: transport, Rack, Beat Editor, Song timeline and sound library&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;One screen: the transport on top, the Rack on the left, the Beat Editor in the centre, the Song underneath, Sounds and AI on the right. Saving is automatic. The LED goes amber, then green.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;For Anuv:&lt;/strong&gt; nothing hides behind menus or modes. Beat, song and sounds are all in view while the idea is still warm.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;
  
  
  4 · Left side: the Rack and the Beat Editor
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;🖼️ ADD IMAGE HERE →&lt;/strong&gt; &lt;code&gt;06-rack-and-beat-editor.png&lt;/code&gt; (from the "Blog images" folder) — &lt;em&gt;Rack and Beat Editor: ten slots, sixteen steps, velocity shown as brightness&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Each Rack row is one sound, with tune, mute, solo and a preview pad, and it &lt;em&gt;is&lt;/em&gt; the row header of the grid beside it: same height, same order. Click to place a hit, drag to paint a row, Shift-click for a ghost note or an accent, or hit REC and play it in from the keyboard.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;For Anuv:&lt;/strong&gt; he programs the way he already thinks, and the grid keeps the velocity and swing that make it his.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;
  
  
  5 · Right side: Sounds and AI
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;🖼️ ADD IMAGE HERE →&lt;/strong&gt; &lt;code&gt;10-library-playlists.png&lt;/code&gt; (from the "Blog images" folder) — &lt;em&gt;Library: playlists above unsorted sounds, each with an options menu&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Four tabs: Presets, Create (ElevenLabs), Upload and Library. The Library sorts sounds into playlists and searches by name or by vibe. The AI tab next to it holds Humanize, Variations, Continue and Morph (Stage 4 below).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;For Anuv:&lt;/strong&gt; an evening of digging through sample packs becomes one sentence and one search box.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;
  
  
  6 · The mixer
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;🖼️ ADD IMAGE HERE →&lt;/strong&gt; &lt;code&gt;08-mixer.png&lt;/code&gt; (from the "Blog images" folder) — &lt;em&gt;Mixer drawer: ten channel strips, reverb return and master section&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Press &lt;strong&gt;M&lt;/strong&gt;. Every sound gets a strip with EQ, reverb send, pan and fader. Then a reverb return, and a master with a compressor, gain-reduction LEDs and a limiter.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;For Anuv:&lt;/strong&gt; a sketch leaves Krisp already mixed, so the WAV he sends sounds finished, not like a demo.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Live:&lt;/strong&gt; &lt;a href="https://krisp.vercel.app" rel="noopener noreferrer"&gt;https://krisp.vercel.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[[VIDEO: 2–3 min, Anuv building a tune and exporting it. Paste the embed tag with your YouTube link here]]&lt;/p&gt;

&lt;p&gt;Saving and the sound library sit behind a studio passcode, because ElevenLabs credits cost money. The video shows them. Everything in the next list works without it.&lt;/p&gt;
&lt;h3&gt;
  
  
  Verify this in 60 seconds, no keys, no clone
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;a href="https://krisp.vercel.app" rel="noopener noreferrer"&gt;https://krisp.vercel.app&lt;/a&gt; → &lt;strong&gt;New workspace&lt;/strong&gt; → &lt;strong&gt;Lo-fi&lt;/strong&gt; → &lt;strong&gt;Create&lt;/strong&gt;. If it asks for a passcode, click &lt;strong&gt;Not now&lt;/strong&gt;. You can still make music; it just won't save.&lt;/li&gt;
&lt;li&gt;Press &lt;strong&gt;Space&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Shift-click pads in the snare row. They cycle ghost → soft → normal → accent. Turn &lt;strong&gt;Swing&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI&lt;/strong&gt; tab → &lt;strong&gt;Humanize&lt;/strong&gt;. The first run downloads the model. Then tiny dots appear inside the pads: that's microtiming.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Export&lt;/strong&gt; → &lt;strong&gt;WAV&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  The check I would make if I were judging this
&lt;/h3&gt;

&lt;p&gt;Drop that WAV into Audacity and zoom into the hi-hats. At 90 BPM with 50% swing, every second hat must land about &lt;strong&gt;41 ms&lt;/strong&gt; late, and the even ones must not move.&lt;/p&gt;

&lt;p&gt;When I ran exactly this against Krisp's own export, the odd hats landed &lt;strong&gt;0.24 of a step&lt;/strong&gt; late (40 ms against the formula's 41.7 ms) and the even hats moved by less than 0.02 of a step. That is how you know the WAV is the same engine you were listening to, and not a re-implementation of it.&lt;/p&gt;
&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Dronzer2code" rel="noopener noreferrer"&gt;
        Dronzer2code
      &lt;/a&gt; / &lt;a href="https://github.com/Dronzer2code/Krisp" rel="noopener noreferrer"&gt;
        Krisp
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Krisp — a beat workspace that runs in the browser&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;Krisp is a calm, hardware-feel beat workspace built for one producer friend. Make beats by hand on a step
sequencer, arrange them into a song, mix them with channel strips and a master chain, and export WAV and MIDI for
your DAW. Open-source AI (Magenta.js) runs &lt;strong&gt;in your browser&lt;/strong&gt; to humanize and vary your own beats. ElevenLabs
creates the exact one-shot or loop you describe, and a Tiger Data hybrid search finds any sound again by its
name or by its sound ("warm dusty kick").&lt;/p&gt;
&lt;p&gt;Built for the DEV &lt;strong&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/strong&gt; (October 2026).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live demo:&lt;/strong&gt; &lt;em&gt;URL added after deploy&lt;/em&gt; (the sound library and saving are behind a studio passcode)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docs for agents and contributors:&lt;/strong&gt; &lt;a href="https://github.com/Dronzer2code/Krisp/CLAUDE.md" rel="noopener noreferrer"&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt;&lt;/a&gt; → &lt;a href="https://github.com/Dronzer2code/Krisp/docs/" rel="noopener noreferrer"&gt;&lt;code&gt;docs/&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What it does&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Area&lt;/th&gt;
&lt;th&gt;Features&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Workspaces&lt;/td&gt;
&lt;td&gt;Create (empty or from 8 original preset beats), open, rename, duplicate, delete;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;…&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Dronzer2code/Krisp" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Created inside the challenge window (first commit 2026-10-03). Open-source work Krisp stands on is credited in the README: &lt;strong&gt;Magenta.js&lt;/strong&gt;, &lt;strong&gt;Tone.js&lt;/strong&gt;, &lt;strong&gt;transformers.js&lt;/strong&gt; with &lt;strong&gt;all-MiniLM-L6-v2&lt;/strong&gt;, &lt;strong&gt;@tonejs/midi&lt;/strong&gt;, &lt;strong&gt;pgvector&lt;/strong&gt;, and &lt;strong&gt;Petaluma Script&lt;/strong&gt; for the hand-lettered guide.&lt;/p&gt;

&lt;h3&gt;
  
  
  Run it yourself
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/Dronzer2code/Krisp &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;Krisp
&lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env    &lt;span class="c"&gt;# TIGER_DATABASE_URL, ELEVENLABS_API_KEY, APP_PASSCODE, DAILY_SOUND_LIMIT&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;span class="c"&gt;# paste db/schema.sql into the Tiger Data SQL editor once&lt;/span&gt;
npx vercel dev          &lt;span class="c"&gt;# app + /api on http://localhost:3000&lt;/span&gt;
npm run &lt;span class="nb"&gt;test&lt;/span&gt;            &lt;span class="c"&gt;# 146 unit tests&lt;/span&gt;
npm run build &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; bash scripts/check-secrets.sh   &lt;span class="c"&gt;# no key may appear in dist/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The architecture, actually explained
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stage&lt;/th&gt;
&lt;th&gt;Tech&lt;/th&gt;
&lt;th&gt;Where it runs&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;zustand store&lt;/td&gt;
&lt;td&gt;browser&lt;/td&gt;
&lt;td&gt;One Workspace object, undo history; a whole knob drag is one undo step&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Scheduler&lt;/td&gt;
&lt;td&gt;browser&lt;/td&gt;
&lt;td&gt;Pure timing math on Tone.js's Transport, 100 ms look-ahead&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Audio engine&lt;/td&gt;
&lt;td&gt;browser&lt;/td&gt;
&lt;td&gt;Channels → reverb → master EQ → compressor → limiter → ceiling clipper&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Magenta.js&lt;/td&gt;
&lt;td&gt;browser&lt;/td&gt;
&lt;td&gt;Humanize, Variations, Continue, Morph on the user's own beat&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;ElevenLabs&lt;/td&gt;
&lt;td&gt;server&lt;/td&gt;
&lt;td&gt;Text → one-shot or seamless loop&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Tiger Data&lt;/td&gt;
&lt;td&gt;server&lt;/td&gt;
&lt;td&gt;Workspaces (JSONB), sounds + embeddings (pgvector), full-text, playlists&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Entire&lt;/td&gt;
&lt;td&gt;git&lt;/td&gt;
&lt;td&gt;Agent sessions as checkpoints, linked to the commits they produced&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The rule behind every row: &lt;strong&gt;anything musical happens in the browser and never waits on the network.&lt;/strong&gt; The network is for saving, the library, and making new sounds. Nothing else.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage 2: the scheduler is three pure functions
&lt;/h3&gt;

&lt;p&gt;A drum machine in a browser is a timing problem before it's anything else. All of Krisp's timing is three functions you can unit-test without a sound card:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;stepSeconds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bpm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;bpm&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;swingDelay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;stepIndex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;swing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;stepSec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;stepIndex&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;swing&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;stepSec&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;hitTime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tickTime&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;stepIndex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;step&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nx"&gt;swing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;stepSec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;tickTime&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nf"&gt;swingDelay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;stepIndex&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;swing&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;stepSec&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;step&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;offset&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;stepSec&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tickTime&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;0.4&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;stepSec&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// a humanized hit may lead, never into the previous step&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Transport never loops. The loop region is applied by one more pure function, &lt;code&gt;wrapTick&lt;/code&gt;, so drum hits and audio clips are triggered by the &lt;strong&gt;same&lt;/strong&gt; per-tick code and can't drift apart.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🖼️ ADD IMAGE HERE →&lt;/strong&gt; &lt;code&gt;07-song-arrangement.png&lt;/code&gt; (from the "Blog images" folder) — &lt;em&gt;Song timeline: Lo-fi, Drum &amp;amp; Bass and Boom Bap clips on three beat lanes&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage 3: the export is not a second renderer
&lt;/h3&gt;

&lt;p&gt;The obvious way to make a WAV is to write an offline renderer. That gives you two engines, and they will eventually disagree. &lt;code&gt;createEngine(context)&lt;/code&gt; accepts &lt;em&gt;any&lt;/em&gt; audio context, so the export opens a &lt;code&gt;Tone.Offline&lt;/code&gt; context and runs the same graph and the same scheduler through it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;rendered&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;Tone&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Offline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;engine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;     &lt;span class="c1"&gt;// identical graph: channels, reverb, master chain&lt;/span&gt;
  &lt;span class="nx"&gt;engine&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;engine&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ready&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;                    &lt;span class="c1"&gt;// reverb impulse response&lt;/span&gt;
  &lt;span class="nf"&gt;bindScheduler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;transport&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;getWorkspace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;trigger&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;engine&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;trigger&lt;/span&gt; &lt;span class="cm"&gt;/* … */&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;transport&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nx"&gt;seconds&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;44100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A 16-bar song at 90 BPM is 42.7 s of music. With a 2 s reverb tail, it rendered in &lt;strong&gt;16.1 s&lt;/strong&gt; on that GPU-less laptop, about 2.7× faster than real time. It also followed the arrangement exactly: audio in bars 1–4, then RMS &lt;strong&gt;0.000000&lt;/strong&gt; after.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🖼️ ADD IMAGE HERE →&lt;/strong&gt; &lt;code&gt;12-export.png&lt;/code&gt; (from the "Blog images" folder) — &lt;em&gt;Export dialog: WAV through the full mixer, or MIDI on drum channel 10&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage 4: the AI never writes the beat for you
&lt;/h3&gt;

&lt;p&gt;Most AI music tools generate the song. Krisp's AI only touches the beat you made, and every result is one undo away.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Open checkpoint&lt;/th&gt;
&lt;th&gt;What it is allowed to change&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Humanize&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;groovae_2bar_humanize&lt;/code&gt;, trained on the Groove MIDI Dataset of real drummers&lt;/td&gt;
&lt;td&gt;Velocity and timing of steps that are &lt;strong&gt;already on&lt;/strong&gt;. It can't add or remove a note&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Variations&lt;/td&gt;
&lt;td&gt;&lt;code&gt;drums_2bar_lokl_small&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Four candidates near your beat; &lt;em&gt;wildness&lt;/em&gt; sets similarity and temperature&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Continue&lt;/td&gt;
&lt;td&gt;&lt;code&gt;drum_kit_rnn&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Writes bar 2 from bar 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Morph&lt;/td&gt;
&lt;td&gt;&lt;code&gt;drums_2bar_lokl_small&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Nine steps from one beat to another&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Before Humanize, every hit sits dead on the grid:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🖼️ ADD IMAGE HERE →&lt;/strong&gt; &lt;code&gt;16-ai-before-humanize.png&lt;/code&gt; (from the "Blog images" folder) — &lt;em&gt;Before Humanize: hits exactly on the grid&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;After, the same hits, nothing added or removed. Velocities changed (brightness), and each dot is a microtiming offset the model put there:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🖼️ ADD IMAGE HERE →&lt;/strong&gt; &lt;code&gt;17-ai-after-humanize.png&lt;/code&gt; (from the "Blog images" folder) — &lt;em&gt;After Humanize: same steps, new velocities, microtiming dots inside the pads&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Variations are previewed by &lt;em&gt;holding&lt;/em&gt; a candidate. It plays in place of your beat for as long as you hold it, without touching the beat or the undo history.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🖼️ ADD IMAGE HERE →&lt;/strong&gt; &lt;code&gt;18-ai-variations.png&lt;/code&gt; (from the "Blog images" folder) — &lt;em&gt;Variations: four candidates, hold one to hear it, then Apply or Add as new beat&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Two facts I only learned by running the models are now built into the converter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MusicVAE and DrumRNN return quantized notes with &lt;strong&gt;velocity unset&lt;/strong&gt;. It reads as 0, so Krisp defaults it to 100.&lt;/li&gt;
&lt;li&gt;GrooVAE returns &lt;strong&gt;unquantized&lt;/strong&gt; notes: a start time, not a step. Krisp recovers the step as &lt;code&gt;round(startTime / stepSeconds)&lt;/code&gt; and keeps the remainder as an offset clamped to ±½ step. That remainder &lt;em&gt;is&lt;/em&gt; the groove.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And one I had to design around: Snare and Clap share drum pitch 38. A model's snare notes would wipe out the clap row, so model notes go to the &lt;strong&gt;first&lt;/strong&gt; slot with a pitch and the rest keep their own steps.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage 5: ElevenLabs, the sound that isn't in any pack
&lt;/h3&gt;

&lt;p&gt;Digging through sample packs is search over things that already exist. ElevenLabs makes the thing that doesn't. That's a different job, and it changes the workflow: the producer says what they hear, and the sound turns up on a pad.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🖼️ ADD IMAGE HERE →&lt;/strong&gt; &lt;code&gt;09-elevenlabs-create.png&lt;/code&gt; (from the "Blog images" folder) — &lt;em&gt;Create tab: the exact prompt sent to ElevenLabs is shown under the field, with today's remaining generations&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Krisp shapes the request and &lt;strong&gt;shows you exactly what it sends&lt;/strong&gt;, so nothing is hidden behind a magic box:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;ONE_SHOT  "&amp;lt;your words&amp;gt;, single drum one-shot, isolated, dry, no music"
LOOP      "&amp;lt;your words&amp;gt;, seamless drum loop, &amp;lt;bpm&amp;gt; bpm"        + loop: true

POST https://api.elevenlabs.io/v1/sound-generation?output_format=mp3_44100_128
     xi-api-key: (server only)   { text, duration_seconds, prompt_influence: 0.5, loop }
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Everything ElevenLabs is actually doing here
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Where&lt;/th&gt;
&lt;th&gt;Why it's load-bearing&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sound Effects API&lt;/td&gt;
&lt;td&gt;&lt;code&gt;api/sound-generate.ts&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The only way to get a sound that exists in no pack&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;loop: true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;loop requests&lt;/td&gt;
&lt;td&gt;Seamless loops that drop straight onto an AUDIO lane&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;duration_seconds&lt;/code&gt; 0.5–2 s&lt;/td&gt;
&lt;td&gt;one-shots&lt;/td&gt;
&lt;td&gt;Drum hits, not soundscapes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Server-side key&lt;/td&gt;
&lt;td&gt;Vercel function&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;scripts/check-secrets.sh&lt;/code&gt; fails the build if a key leaks into &lt;code&gt;dist/&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Daily limit&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;sound_usage&lt;/code&gt; table&lt;/td&gt;
&lt;td&gt;40 credits per second of sound; the counter ("38 left today") keeps the demo alive through judging&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The two generated sounds in this library came back at &lt;strong&gt;1.3 s&lt;/strong&gt; each. In the browser they are trimmed of silence, faded, peak-normalised to −1 dBFS, embedded, and filed next to uploads:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🖼️ ADD IMAGE HERE →&lt;/strong&gt; &lt;code&gt;11-upload.png&lt;/code&gt; (from the "Blog images" folder) — &lt;em&gt;Upload: drop your own WAV, MP3 or OGG up to 3 MB&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage 6: Tiger Data, one Postgres with three kinds of memory
&lt;/h3&gt;

&lt;p&gt;Producers search two ways. Sometimes it's a word: "808", "clap". Sometimes it's a feeling: "warm", "dusty", "like old vinyl". Keyword search fails the second; vector search fumbles the first. The usual answer is a Postgres &lt;em&gt;and&lt;/em&gt; a vector database &lt;em&gt;and&lt;/em&gt; glue code between them.&lt;/p&gt;

&lt;p&gt;Tiger Data made that a non-problem. One service holds the workspaces as &lt;strong&gt;JSONB&lt;/strong&gt;, the audio as &lt;strong&gt;bytea&lt;/strong&gt;, the meaning as &lt;strong&gt;pgvector&lt;/strong&gt; and the spelling as &lt;strong&gt;tsvector&lt;/strong&gt;. The fusion is a single statement, reciprocal rank fusion with k = 60 (columns abridged):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;            &lt;span class="c1"&gt;-- meaning: cosine distance on all-MiniLM-L6-v2 embeddings made in the browser&lt;/span&gt;
  &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;row_number&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="n"&gt;OVER&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;embedding&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;
  &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;sounds&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nb"&gt;text&lt;/span&gt; &lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="n"&gt;kind&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;embedding&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt; &lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;
&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;              &lt;span class="c1"&gt;-- spelling: Postgres full-text&lt;/span&gt;
  &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;row_number&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="n"&gt;OVER&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;ts_rank&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tsv&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;
  &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;sounds&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;websearch_to_tsquery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'english'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;q&lt;/span&gt;
  &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;tsv&lt;/span&gt; &lt;span class="o"&gt;@@&lt;/span&gt; &lt;span class="n"&gt;q&lt;/span&gt; &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nb"&gt;text&lt;/span&gt; &lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="n"&gt;kind&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;ts_rank&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tsv&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt; &lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="n"&gt;coalesce&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;coalesce&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;vector_hit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;keyword_hit&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;sounds&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="k"&gt;LEFT&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="k"&gt;LEFT&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt; &lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every result carries a &lt;strong&gt;&lt;code&gt;vector&lt;/code&gt;&lt;/strong&gt; badge, a &lt;strong&gt;&lt;code&gt;keyword&lt;/code&gt;&lt;/strong&gt; badge, or both, so you can see &lt;em&gt;why&lt;/em&gt; a sound came up. In testing, &lt;em&gt;"dusty kick"&lt;/em&gt; found the uploaded kick with both badges. &lt;em&gt;"warm lo-fi bass drum"&lt;/em&gt; (words that were never its name) found it by vector, plus a keyword hit on its &lt;code&gt;warm&lt;/code&gt; tag.&lt;/p&gt;

&lt;p&gt;[[SCREENSHOT: Library search showing vector and keyword badges for two queries]]&lt;/p&gt;

&lt;p&gt;The library is organised the way producers organise folders: &lt;strong&gt;playlists&lt;/strong&gt;, where a sound can live in several at once, sit above everything still unsorted (you saw them in the walkthrough).&lt;/p&gt;

&lt;p&gt;This is the whole schema on Tiger Data, live:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🖼️ ADD IMAGE HERE →&lt;/strong&gt; &lt;code&gt;13-tiger-data-tables.png&lt;/code&gt; (from the "Blog images" folder) — &lt;em&gt;Tiger Data console: five Postgres tables — sounds, workspaces, playlist_sounds, playlists, sound_usage&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Everything Tiger Data is actually doing here
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Where&lt;/th&gt;
&lt;th&gt;Why it's load-bearing&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;pgvector (&lt;code&gt;vector(384)&lt;/code&gt;, HNSW cosine)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sounds.embedding&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Search by vibe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Full-text (&lt;code&gt;tsvector&lt;/code&gt;, GIN)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sounds.tsv&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Search by exact word&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One-statement RRF&lt;/td&gt;
&lt;td&gt;&lt;code&gt;api/search.ts&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Both searches, one round trip, ranked together&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JSONB&lt;/td&gt;
&lt;td&gt;&lt;code&gt;workspaces.data&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A whole Workspace (rack, beats, song, mix) in one row&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bytea&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sounds.audio&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Audio lives with its metadata. No second storage service&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Two-table join&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;playlists&lt;/code&gt; + &lt;code&gt;playlist_sounds&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Folders where a sound can be in many&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Stage 7: Entire, the build is reviewable too
&lt;/h3&gt;

&lt;p&gt;A project built with an AI agent has a second artefact besides the code: the reasoning that produced it. Entire keeps it. We ran &lt;code&gt;entire enable --agent claude-code --import-history&lt;/code&gt;. That installed Claude Code hooks, and it also &lt;strong&gt;imported the session that had started before Entire was set up&lt;/strong&gt;, so nothing from the first hour was lost. Since then, every &lt;code&gt;git push origin&lt;/code&gt; uploads the session checkpoints next to the commits they produced. The repository itself lives on Entire (&lt;code&gt;origin&lt;/code&gt;), mirrored to GitHub for Vercel.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🖼️ ADD IMAGE HERE →&lt;/strong&gt; &lt;code&gt;14-entire-repo-overview.png&lt;/code&gt; (from the "Blog images" folder) — &lt;em&gt;Entire repository overview: 36 commits in the past month, split Claude Code and manual, two contributors&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Entire's own numbers for this repo: &lt;strong&gt;36 commits&lt;/strong&gt;, &lt;strong&gt;7 checkpoints&lt;/strong&gt;, &lt;strong&gt;15 messages&lt;/strong&gt;, &lt;strong&gt;591.3k tokens&lt;/strong&gt; (996 in, 590.3k out), about &lt;strong&gt;84.5k tokens per checkpoint&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🖼️ ADD IMAGE HERE →&lt;/strong&gt; &lt;code&gt;15-entire-analytics.png&lt;/code&gt; (from the "Blog images" folder) — &lt;em&gt;Entire analytics: checkpoints, throughput, messages and token usage over the build&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That is what made the "verbatim errors" table below possible. Every failure, and the reasoning that fixed it, is on record rather than reconstructed from memory.&lt;/p&gt;

&lt;h4&gt;
  
  
  Everything Entire is actually doing here
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Where&lt;/th&gt;
&lt;th&gt;Why it's load-bearing&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Claude Code hooks&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.claude/settings.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Sessions captured as they happen, no copy-pasting transcripts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--import-history&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;first setup&lt;/td&gt;
&lt;td&gt;Recovered the session from before Entire existed in the repo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Checkpoints on &lt;code&gt;git push&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;entire://…/et/krisp/krisp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Reasoning travels with the code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Analytics&lt;/td&gt;
&lt;td&gt;Entire dashboard&lt;/td&gt;
&lt;td&gt;Measurable build: commits, checkpoints, tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What My Friend Said
&lt;/h2&gt;

&lt;p&gt;[[HANDOVER: what Anuv did on camera — the tune he made, what he exported, what he took into his DAW. Facts only.]]&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;[[QUOTE: Anuv's own words, exactly as he said them]]&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;Four concrete reasons, each one measured or tested:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The beat never leaves the device.&lt;/strong&gt; I ran the whole AI test suite with &lt;strong&gt;every &lt;code&gt;/api&lt;/code&gt; request blocked&lt;/strong&gt; in the browser. Humanize, Variations, Continue and Morph all passed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It costs nothing to run.&lt;/strong&gt; No per-request inference bill for the AI. The only metered call in Krisp is ElevenLabs, and it's explicit and capped per day.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open means inspectable.&lt;/strong&gt; I only found out that GrooVAE returns unquantized start times, and that the VAE leaves velocity at 0, &lt;em&gt;because&lt;/em&gt; the checkpoints and the library are open. A closed API would have handed back a groove I couldn't explain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Once loaded, it is always there.&lt;/strong&gt; The cold cost is real: the drums VAE loaded in &lt;strong&gt;14.2 s&lt;/strong&gt; and the first Humanize took &lt;strong&gt;15 s&lt;/strong&gt;, both on a GPU-less machine. Both happen once. [[MEASURE: warm Humanize time on Anuv's laptop]]&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  What this unlocks
&lt;/h3&gt;

&lt;p&gt;The same pattern (a pure scheduler, one engine for live and offline, open models in the tab, one Postgres for meaning and spelling) works for any instrument, not just drums. A melodic step sequencer, a sample chopper or a practice metronome with real feel is a new rack, not a new architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Didn't Work
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Hazards, with the errors verbatim
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What happened&lt;/th&gt;
&lt;th&gt;The error&lt;/th&gt;
&lt;th&gt;The fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Postgres refused my search column&lt;/td&gt;
&lt;td&gt;&lt;code&gt;generation expression is not immutable&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;array_to_string&lt;/code&gt; isn't immutable, so &lt;code&gt;tsv&lt;/code&gt; became a plain column that each INSERT fills&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A new Tiger service failed TLS for over an hour&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SELF_SIGNED_CERT_IN_CHAIN&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The cert came from Tiger's own CA, &lt;code&gt;ca.timescale.com&lt;/code&gt;. I trusted that CA &lt;strong&gt;with verification on&lt;/strong&gt;, instead of &lt;code&gt;rejectUnauthorized: false&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Disabling the limiter crashed the mixer&lt;/td&gt;
&lt;td&gt;&lt;code&gt;RangeError: Value must be within [-100, 0], got: 1e-7&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Tone ramps start from 1e-7 when a param is 0, so dynamics params are now set directly, not ramped&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Solo didn't silence the other channels&lt;/td&gt;
&lt;td&gt;no error: the kick still read &lt;strong&gt;−32 dB&lt;/strong&gt; with the snare soloed&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Volume.mute&lt;/code&gt; was undone by the next volume ramp. Mute is now its own gate stage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The limiter didn't limit&lt;/td&gt;
&lt;td&gt;no error: on &lt;strong&gt;+6.4 dBFS&lt;/strong&gt;, off &lt;strong&gt;+7.2 dBFS&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;WebAudio's compressor adds makeup gain and lets transients through; even a raw −12 dB / 20:1 left a 0 dB sine at −4.2 dBFS. A soft clipper now holds peaks at exactly &lt;strong&gt;−6.0 dBFS&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TypeScript gave up on transformers.js&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Expression produces a union type that is too complex to represent.&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A typed wrapper around &lt;code&gt;pipeline()&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vercel blocked deploys after a teammate's merge&lt;/td&gt;
&lt;td&gt;status &lt;strong&gt;Blocked&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Hobby only deploys private-repo commits authored by the owner. An owner-authored commit unblocked it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Saving felt slow in local dev&lt;/td&gt;
&lt;td&gt;~3 s per request&lt;/td&gt;
&lt;td&gt;2.16 s TLS connect + 0.26 s per query, India → US-East, new connection per request. Production sits next to the DB and keeps its pool&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  What's real and what's simplified
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Real&lt;/th&gt;
&lt;th&gt;Simplified, on purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Magenta models running in the browser&lt;/td&gt;
&lt;td&gt;The default kit is synthesised; your own sounds replace it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ElevenLabs generation, server-side&lt;/td&gt;
&lt;td&gt;No time-stretching. A warning dot marks loops that don't fit the bar grid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pgvector + full-text hybrid search&lt;/td&gt;
&lt;td&gt;A shared studio passcode instead of accounts; it's built for one person&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The WAV export &lt;em&gt;is&lt;/em&gt; the playback engine&lt;/td&gt;
&lt;td&gt;4/4 only, 16 or 32 steps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;146 unit tests + browser end-to-end checks&lt;/td&gt;
&lt;td&gt;A daily generation cap to protect credits&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  My Agent Session
&lt;/h2&gt;

&lt;p&gt;Krisp was built with Claude Code and captured with Entire (see Stage 7):&lt;/p&gt;

&lt;p&gt;[[ENTIRE: session links: the engine and scheduler, the offline export, the hybrid search, the TLS fix]]&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of ElevenLabs&lt;/strong&gt;: generated one-shots and seamless loops inside the workflow, with the exact prompt shown and a daily cap.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Tiger Data&lt;/strong&gt;: one Postgres holding JSONB workspaces, bytea audio, pgvector meaning and full-text spelling, fused in a single SQL statement with visible match reasons.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Entire&lt;/strong&gt;: the repository lives on Entire; every agent session is captured, imported from before setup, and linked to the commits it produced.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Team
&lt;/h2&gt;

&lt;p&gt;[[TEAM: Subarna Maity (&lt;a class="mentioned-user" href="https://dev.to/dronzer2code"&gt;@dronzer2code&lt;/a&gt;) · Sourish Panda (@[[DEV username]])]]&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Magenta.js — &lt;a href="https://github.com/magenta/magenta-js" rel="noopener noreferrer"&gt;https://github.com/magenta/magenta-js&lt;/a&gt; · Groove MIDI Dataset — &lt;a href="https://magenta.tensorflow.org/datasets/groove" rel="noopener noreferrer"&gt;https://magenta.tensorflow.org/datasets/groove&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;ElevenLabs Sound Effects API — &lt;a href="https://elevenlabs.io/docs/api-reference/text-to-sound-effects/convert" rel="noopener noreferrer"&gt;https://elevenlabs.io/docs/api-reference/text-to-sound-effects/convert&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;pgvector — &lt;a href="https://github.com/pgvector/pgvector" rel="noopener noreferrer"&gt;https://github.com/pgvector/pgvector&lt;/a&gt; · Tiger Data — &lt;a href="https://www.tigerdata.com" rel="noopener noreferrer"&gt;https://www.tigerdata.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Entire — &lt;a href="https://docs.entire.io" rel="noopener noreferrer"&gt;https://docs.entire.io&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Tone.js — &lt;a href="https://tonejs.github.io" rel="noopener noreferrer"&gt;https://tonejs.github.io&lt;/a&gt; · transformers.js — &lt;a href="https://github.com/huggingface/transformers.js" rel="noopener noreferrer"&gt;https://github.com/huggingface/transformers.js&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Built within the challenge window by Subarna Maity and Sourish Panda with AI pair programming, captured on Entire. All preset beat patterns are original to this project. The sounds used in the search measurements were synthetic test tones, generated, uploaded and deleted by the test script. Anuv's name and words appear with his permission.&lt;/em&gt; [[CONFIRM before publishing]]&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
