<?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: Kanishq Sharma</title>
    <description>The latest articles on DEV Community by Kanishq Sharma (@damnbrocrazy).</description>
    <link>https://dev.to/damnbrocrazy</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%2F4146706%2F134c7849-8ee6-47c0-b7c0-bdbcdc88c1ef.png</url>
      <title>DEV Community: Kanishq Sharma</title>
      <link>https://dev.to/damnbrocrazy</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/damnbrocrazy"/>
    <language>en</language>
    <item>
      <title>Foley Field Notes: a tin box, an entire train</title>
      <dc:creator>Kanishq Sharma</dc:creator>
      <pubDate>Mon, 28 Sep 2026 09:49:08 +0000</pubDate>
      <link>https://dev.to/damnbrocrazy/foley-field-notes-a-tin-box-an-entire-train-2i8h</link>
      <guid>https://dev.to/damnbrocrazy/foley-field-notes-a-tin-box-an-entire-train-2i8h</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/sanity-2026-09-16"&gt;Sanity Challenge, Path Two: Vibe-Code Something Strange&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Foley Field Notes&lt;/strong&gt; is a tiny imaginary sound studio. A tin box becomes a train; a cup becomes a bell; tracing paper becomes rain.&lt;/p&gt;

&lt;p&gt;Pick a sound recipe, arrange its entrance in a scene, adjust its level, and download the result as a real WAV file. The sounds are synthesized in the browser. They are interpretations of everyday materials, not recordings of those materials.&lt;/p&gt;

&lt;p&gt;The interesting part is what lives in Sanity. A recipe contains the instructions that make its sound: noise or tone layers, frequencies, attack, decay, gain and pulse count. A scene references those recipes with start times and levels. Content is doing something audible here.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://damnbrocrazy-svg.github.io/foley-field-notes/" rel="noopener noreferrer"&gt;Open Foley Field Notes&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No login or microphone permission is needed for the player. A quick route through it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Listen to &lt;strong&gt;Paper rain&lt;/strong&gt; and &lt;strong&gt;Pocket train&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;The last train is a tin box&lt;/strong&gt; from the scene selector.&lt;/li&gt;
&lt;li&gt;Move the cup bell's entrance, change a cue's level, and play the scene.&lt;/li&gt;
&lt;li&gt;Download the WAV. The arrangement stays in your current tab.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The editor is separate and requires Sanity project membership. Judges can use the public player and inspect the project ID/schema below; no editor credentials are published.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/damnbrocrazy-svg/foley-field-notes" rel="noopener noreferrer"&gt;Source, tests and build notes&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The application is MIT licensed. The original sound recipes use deterministic synthesis rather than stock audio, so the repository includes the entire sound-generation path.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Build Process
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;AI disclosure:&lt;/strong&gt; this was an autonomous AI-assisted build using Codex under my direction. Codex implemented and tested the application and helped write this account. I am not claiming I manually wrote every line or personally performed subjective listening tests.&lt;/p&gt;

&lt;p&gt;The brief used in the build was to make a small, unusual app where structured content materially changes the experience, with a working Astro frontend and no paid runtime AI API. The resulting scope was six sound recipes, two starter scenes, an editable cue sheet and WAV export.&lt;/p&gt;

&lt;h3&gt;
  
  
  The schema came before the cards
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;soundRecipe&lt;/code&gt; describes a material, a gesture, the synthesis layers and a duration. &lt;code&gt;soundScene&lt;/code&gt; contains cue objects with references to recipes. A reused recipe is one document, not a copied block in each scene.&lt;/p&gt;

&lt;p&gt;This choice is easy to see in the app: change a recipe's synthesis parameters in the editor, approve and publish it, then refresh the public collection. Every scene referencing it uses the new sound.&lt;/p&gt;

&lt;h3&gt;
  
  
  Approval had to describe the current content
&lt;/h3&gt;

&lt;p&gt;A status field alone would allow a recipe to be approved and then silently changed. The workflow therefore stores a signature of the approved content. An edit makes that signature stale.&lt;/p&gt;

&lt;p&gt;The Studio actions are &lt;strong&gt;Request review&lt;/strong&gt;, &lt;strong&gt;Approve for playback&lt;/strong&gt;, and &lt;strong&gt;Return to draft&lt;/strong&gt;. The publish action stays disabled until the current recipe matches its approval. Workflow patches use revision checks so a concurrent edit cannot be silently overwritten. The frontend checks approval too.&lt;/p&gt;

&lt;p&gt;This is an editorial workflow for trusted project members, not an administrator-proof permission system. The starting collection explicitly names its reviewer as &lt;strong&gt;Demonstration seed (automated)&lt;/strong&gt;; it does not imply human approval.&lt;/p&gt;

&lt;h3&gt;
  
  
  A few things needed correction
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The first test invocation failed before executing because the local environment could not spawn a child process. Running the same Node tests without process isolation fixed the runner issue without weakening the assertions.&lt;/li&gt;
&lt;li&gt;The volume control initially affected the next playback only. Review caught that mismatch; it now changes the active gain node as well.&lt;/li&gt;
&lt;li&gt;The initial Studio build command used an unsupported output flag. The current positional-output command built successfully.&lt;/li&gt;
&lt;li&gt;The first upload draft flattened nested file paths. It was discarded before committing, and the saved repository was checked for the proper &lt;code&gt;src&lt;/code&gt;, &lt;code&gt;tests&lt;/code&gt; and &lt;code&gt;docs&lt;/code&gt; directories.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What was verified
&lt;/h3&gt;

&lt;p&gt;Eleven automated tests passed for deterministic sound generation, non-silence, finite/bounded samples, cue timing, overlapping-cue normalization, WAV headers, invalid input and approval invalidation.&lt;/p&gt;

&lt;p&gt;Browser checks exercised the actual public Sanity data, recipe selection, scene presets, cue editing, playback start/stop, WAV download and the empty state. Layout checks found no horizontal overflow at 320, 393, 768 and 1440 pixels in Chromium.&lt;/p&gt;

&lt;p&gt;Four additional live Studio checks used a temporary unpublished document: a draft could not publish, requesting review enabled approval, approval enabled publication, and a title edit disabled publication again. The temporary draft was then removed.&lt;/p&gt;

&lt;p&gt;The fallback is intentionally visible. If the initial content request fails, the player says &lt;strong&gt;Offline demonstration&lt;/strong&gt; and loads its bundled sample pack. That is not reported as a successful Sanity connection.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where I stopped
&lt;/h3&gt;

&lt;p&gt;There is no runtime LLM, App SDK integration or automatic realtime refresh. The frontend uses an explicit &lt;strong&gt;Refresh collection&lt;/strong&gt; control. Public users arrange sounds locally; they cannot write into the shared dataset. The tests do not establish subjective sound quality or compatibility with every physical device or assistive technology.&lt;/p&gt;

&lt;p&gt;That left room to finish a small app whose structured content, review state and generated output all have a clear purpose.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sanity Project Details
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Project ID:&lt;/strong&gt; &lt;code&gt;vkj2ioma&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dataset:&lt;/strong&gt; &lt;code&gt;production&lt;/code&gt; (public)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Document types:&lt;/strong&gt; &lt;code&gt;soundRecipe&lt;/code&gt;, &lt;code&gt;soundScene&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nested types:&lt;/strong&gt; &lt;code&gt;soundLayer&lt;/code&gt;, &lt;code&gt;sceneCue&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Framework:&lt;/strong&gt; Astro, with Sanity Studio for authoring&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://github.com/damnbrocrazy-svg/foley-field-notes/blob/main/sanity.config.ts" rel="noopener noreferrer"&gt;Inspect the schema&lt;/a&gt; or &lt;a href="https://github.com/damnbrocrazy-svg/foley-field-notes/blob/main/BUILD_NOTES.md" rel="noopener noreferrer"&gt;read the build notes&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>sanitychallenge</category>
      <category>devchallenge</category>
      <category>ai</category>
      <category>sanity</category>
    </item>
  </channel>
</rss>
