<?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: harry</title>
    <description>The latest articles on DEV Community by harry (@harry_2205).</description>
    <link>https://dev.to/harry_2205</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%2F4006736%2Fb5ebde48-9ce4-45c4-8969-a5924d71d3c8.png</url>
      <title>DEV Community: harry</title>
      <link>https://dev.to/harry_2205</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/harry_2205"/>
    <language>en</language>
    <item>
      <title>I Built a Music Production Tracker for the H0 Hackathon</title>
      <dc:creator>harry</dc:creator>
      <pubDate>Sun, 28 Jun 2026 16:33:09 +0000</pubDate>
      <link>https://dev.to/harry_2205/i-built-a-music-production-tracker-for-the-h0-hackathon-53n2</link>
      <guid>https://dev.to/harry_2205/i-built-a-music-production-tracker-for-the-h0-hackathon-53n2</guid>
      <description>&lt;h1&gt;
  
  
  I Built Finito: A Production Tracker That Actually Gets Music Producers
&lt;/h1&gt;

&lt;p&gt;*I created this post for the purposes of entering the H0 Hackathon. &lt;/p&gt;

&lt;h1&gt;
  
  
  H0Hackathon
&lt;/h1&gt;




&lt;h2&gt;
  
  
  The Problem I Kept Ignoring
&lt;/h2&gt;

&lt;p&gt;Producers always struggle to finish their tracks — drives are always &lt;br&gt;
full of unfinished projects, and the reason isn't talent, it's having &lt;br&gt;
no system. I understand this issue personally because I have a music &lt;br&gt;
background. Every solution out there is a generic task manager &lt;br&gt;
reskinned with a music emoji. None of them understand how producers &lt;br&gt;
actually work.&lt;/p&gt;

&lt;p&gt;So I built Finito to fix that. It is personally helping me finish &lt;br&gt;
and track my own music progress.&lt;/p&gt;


&lt;h2&gt;
  
  
  What Is Finito?
&lt;/h2&gt;

&lt;p&gt;Finito gives every track a visual pipeline — &lt;strong&gt;Idea → WIP → Mixing → &lt;br&gt;
Mastering → Finished&lt;/strong&gt; — so producers can save and track all their &lt;br&gt;
projects in one place with real-time reminders so nothing goes cold.&lt;/p&gt;

&lt;p&gt;But the pipeline is just the container. The real features are what &lt;br&gt;
happen inside it.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Features That Matter
&lt;/h2&gt;
&lt;h3&gt;
  
  
  🎛️ Real Audio Analysis
&lt;/h3&gt;

&lt;p&gt;This is the best part. Upload a mix and Finito runs an actual &lt;strong&gt;FFT &lt;br&gt;
on the audio file using the Web Audio API&lt;/strong&gt; — entirely in the browser, &lt;br&gt;
no server processing needed. It measures real low, mid, and high &lt;br&gt;
frequency balance from the actual signal data, then sends those &lt;br&gt;
numbers to Gemini AI for a specific mixing diagnosis.&lt;/p&gt;

&lt;p&gt;Not guesswork. Not loudness scores. Real frequency data from your &lt;br&gt;
actual mix.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// FFT runs client-side — audio never leaves the browser&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;analyser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;audioCtx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createAnalyser&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;analyser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fftSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2048&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;bufferLength&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;analyser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;frequencyBinCount&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;dataArray&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Float32Array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bufferLength&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;analyser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getFloatFrequencyData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dataArray&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🤖 DAW-Aware AI
&lt;/h3&gt;

&lt;p&gt;Set your DAW and every AI suggestion changes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;FL Studio&lt;/strong&gt; → Fruity Parametric EQ 2 references&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ableton&lt;/strong&gt; → stock device advice
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Logic Pro&lt;/strong&gt; → Channel EQ suggestions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Studio One&lt;/strong&gt; → Pro EQ guidance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It feels like a producer friend who actually knows your setup — not &lt;br&gt;
a generic blog post that could apply to anyone.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Milestones
&lt;/h3&gt;

&lt;p&gt;At the starting phase we did not have milestones, but I thought this &lt;br&gt;
could be a great feature because milestones add excitement and give &lt;br&gt;
immense satisfaction even when you complete just a few checkpoints.&lt;/p&gt;

&lt;p&gt;Break tracks into checkpoints — drums done, vocals recorded, mix &lt;br&gt;
approved. Check them off as you go. Progress bars update on the kanban &lt;br&gt;
card. Small wins compound into finished tracks.&lt;/p&gt;

&lt;h3&gt;
  
  
  📧 Automated Accountability
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Untouched for 3 days? &lt;strong&gt;Email.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Deadline approaching? &lt;strong&gt;Email.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Mark a track Finished? &lt;strong&gt;AWS Lambda fires automatically&lt;/strong&gt; via 
DynamoDB Streams and sends a congratulations email.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That moment deserves to be celebrated.&lt;/p&gt;

&lt;h3&gt;
  
  
  📤 Export
&lt;/h3&gt;

&lt;p&gt;Imagine you have plans to travel and all your project data is on the &lt;br&gt;
dashboard. Simply export everything and work offline. Download all &lt;br&gt;
projects as &lt;strong&gt;Excel, JSON, or CSV&lt;/strong&gt; — BPM, key, genre, DAW, milestones, &lt;br&gt;
deadlines, all included.&lt;/p&gt;




&lt;h2&gt;
  
  
  The AWS Architecture
&lt;/h2&gt;

&lt;p&gt;This is where it gets interesting. Built on the &lt;strong&gt;H0 stack — &lt;br&gt;
Vercel + AWS&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  DynamoDB — The Core Database
&lt;/h3&gt;

&lt;p&gt;I ended up with &lt;strong&gt;three DynamoDB tables&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;Table&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;finito-projects&lt;/td&gt;
&lt;td&gt;All project data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;finito-activity-log&lt;/td&gt;
&lt;td&gt;Every user action timestamped&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;finito-ai-chat&lt;/td&gt;
&lt;td&gt;AI chat history per project&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The projects table uses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GSI&lt;/strong&gt; — for status-based queries (show all WIP projects)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TTL&lt;/strong&gt; — auto-expires abandoned projects after 180 days&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DynamoDB Streams&lt;/strong&gt; — triggers Lambda on every status change&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transactions&lt;/strong&gt; — atomic writes across tables when marking Finished&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conditional writes&lt;/strong&gt; — prevents duplicate entries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This isn't a demo database. This is production-grade DynamoDB usage.&lt;/p&gt;

&lt;h3&gt;
  
  
  S3 — Audio Storage
&lt;/h3&gt;

&lt;p&gt;Producers upload audio files up to 5GB per project. The frontend &lt;br&gt;
never touches AWS credentials directly:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;App requests a &lt;strong&gt;presigned URL&lt;/strong&gt; from the API&lt;/li&gt;
&lt;li&gt;Browser uploads directly to S3 using that URL&lt;/li&gt;
&lt;li&gt;The S3 key is stored in DynamoDB&lt;/li&gt;
&lt;li&gt;Downloads use the same presigned URL pattern&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Audio never passes through Vercel — it goes straight browser → S3.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lambda + SES — Event-Driven Emails
&lt;/h3&gt;

&lt;p&gt;When a producer marks a track Finished:&lt;br&gt;
DynamoDB status change&lt;/p&gt;

&lt;p&gt;→ DynamoDB Streams detects it&lt;/p&gt;

&lt;p&gt;→ Lambda function fires&lt;/p&gt;

&lt;p&gt;→ SES sends congratulations email&lt;/p&gt;

&lt;p&gt;No polling. No cron. Fully event-driven.&lt;/p&gt;

&lt;p&gt;A separate &lt;strong&gt;Vercel Cron job&lt;/strong&gt; runs daily checking for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Projects untouched for 3+ days → reminder email&lt;/li&gt;
&lt;li&gt;Deadlines within 7 days → deadline alert email&lt;/li&gt;
&lt;li&gt;Upcoming release dates → release reminder email&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  IAM — Scoped Permissions
&lt;/h3&gt;

&lt;p&gt;The Lambda role only has access to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The specific DynamoDB tables it needs&lt;/li&gt;
&lt;li&gt;SES send permissions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not admin credentials. Properly scoped IAM — because that's how &lt;br&gt;
it should be done.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Challenges
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Never used AWS before.&lt;/strong&gt;&lt;br&gt;
DynamoDB Streams and Lambda wiring took significant debugging. IAM &lt;br&gt;
permissions had to be scoped exactly right — one wrong policy and &lt;br&gt;
nothing fires.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. SES sandbox mode.&lt;/strong&gt;&lt;br&gt;
Emails land in spam in sandbox mode. In production this would use a &lt;br&gt;
verified domain with DKIM and SPF. This was frustrating, but I am &lt;br&gt;
happy it is working — it took significant time to get it right.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Knowing when to stop.&lt;/strong&gt;&lt;br&gt;
Every hour on feature fourteen is an hour the first thirteen features &lt;br&gt;
go unexplained. I learned this the hard way.&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;DynamoDB Streams are underused.&lt;/strong&gt; The pattern of "data changes → &lt;br&gt;
event fires → something happens" is exactly right for reactive &lt;br&gt;
applications. Cleaner than polling, cleaner than webhooks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FFT in the browser is more capable than I expected.&lt;/strong&gt; The Web Audio &lt;br&gt;
API's AnalyserNode gives you real frequency data — not just a &lt;br&gt;
visualizer, actually useful for mixing diagnosis.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DAW-aware AI was the best idea I had.&lt;/strong&gt; Generic AI advice for &lt;br&gt;
producers is everywhere. Advice that knows you're on FL Studio and &lt;br&gt;
references Fruity Parametric EQ 2 — that feels completely different.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Full auth with AWS Cognito&lt;/li&gt;
&lt;li&gt;Spotify and SoundCloud integration for release tracking&lt;/li&gt;
&lt;li&gt;Mobile app for logging ideas on the go&lt;/li&gt;
&lt;li&gt;Inspiration library — reference tracks, album art, DAW templates&lt;/li&gt;
&lt;/ul&gt;




</description>
      <category>ai</category>
      <category>hackathon</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
