<?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: Final Vinyl</title>
    <description>The latest articles on DEV Community by Final Vinyl (@final_vinyl_f951c62ec9683).</description>
    <link>https://dev.to/final_vinyl_f951c62ec9683</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2368555%2F67f3e48a-b015-4e77-bf58-a547378236ed.jpg</url>
      <title>DEV Community: Final Vinyl</title>
      <link>https://dev.to/final_vinyl_f951c62ec9683</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/final_vinyl_f951c62ec9683"/>
    <language>en</language>
    <item>
      <title>Zoneout</title>
      <dc:creator>Final Vinyl</dc:creator>
      <pubDate>Sun, 08 Mar 2026 22:44:33 +0000</pubDate>
      <link>https://dev.to/final_vinyl_f951c62ec9683/zoneout-3c46</link>
      <guid>https://dev.to/final_vinyl_f951c62ec9683/zoneout-3c46</guid>
      <description>&lt;p&gt;I built a collaborative listening app today. Here's what happened.&lt;br&gt;
This morning I had an idea. By this afternoon it had users. By tonight I was DJing to an empty room on the internet and it was still kind of magical.&lt;br&gt;
Zoneout is a collaborative SoundCloud listening room. Anyone in the room can queue tracks, everyone hears them synced in real time. There's a WebGL2 visualiser, chat, and a DJ override system. It runs on Node.js and MySQL and three HTML files.&lt;br&gt;
I built it hacking between terminals, Claude Code, and Cursor — each model has its strengths and I used all of them. The idea, the design, the aesthetic, and the first listening event were all real. I had people playtesting it while I was still building it. Nine users signed up on day one. Someone joined the Procrastinatrix room and stayed.&lt;br&gt;
The stack is deliberately boring. The vibe is deliberately not.&lt;br&gt;
It feels like Turntable.fm if you remember that. That's the whole pitch.&lt;br&gt;
&lt;a href="https://dev.tourl"&gt;ffilm.org/zoneout&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>music</category>
      <category>community</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>#My first dev</title>
      <dc:creator>Final Vinyl</dc:creator>
      <pubDate>Thu, 07 Nov 2024 01:30:04 +0000</pubDate>
      <link>https://dev.to/final_vinyl_f951c62ec9683/my-first-dev-4d85</link>
      <guid>https://dev.to/final_vinyl_f951c62ec9683/my-first-dev-4d85</guid>
      <description>&lt;p&gt;I’ve built some personal websites before but never taken on a challenge of this magnitude. It went live today; a one page app for exploring my fledgling record label’s catalogue; integrating Bandcamp but giving it a more ‘crate digging’ feel using three.js for the album navigation. It’s 4,500 lines of code, a dozen modules of JavaScript. It took a week. I worked alone with only Claude.ai as a coding partner. I must say it’s a remarkable tool but not without its foibles. &lt;br&gt;
Anyway I’d love you guys to visit my site and tell me what you think. I did save the code publicly to GitHub if you want to root about in it. But here’s the site: &lt;a href="https://notthefinalvinyl.net" rel="noopener noreferrer"&gt;Not the Final Vinyl&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Claude wanted me to add a few things:&lt;/p&gt;
&lt;h1&gt;
  
  
  Technical Deep Dive
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Check out the code: &lt;a href="https://github.com/elixircorp/NotTheFinalVinyl" rel="noopener noreferrer"&gt;NotTheFinalVinyl on GitHub&lt;/a&gt;&lt;br&gt;
Live site: &lt;a href="https://notthefinalvinyl.net" rel="noopener noreferrer"&gt;notthefinalvinyl.net&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  The Architecture 🏗️
&lt;/h2&gt;

&lt;p&gt;Built around a custom vinyl record interaction system using Three.js, with about 4,500 lines of vanilla JavaScript split across 12 key modules:&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;// Example from VinylManager.js - Physics-based vinyl sliding&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;animate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;timestamp&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;startTime&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;startTime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;timestamp&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;elapsed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;timestamp&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;startTime&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;slideOutDuration&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;elapsed&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&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="c1"&gt;// Custom easing function for natural vinyl movement&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;progress&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;
            &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;*&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;t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;
            &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&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;pow&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="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;t&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;3&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="nx"&gt;album&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setVinylPosition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;slideDistance&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;progress&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nf"&gt;requestAnimationFrame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;animate&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Core Components 🔧
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SceneManager&lt;/strong&gt;: Three.js setup and WebGL handling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VinylManager&lt;/strong&gt;: Record animations and state&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EventHandler&lt;/strong&gt;: Touch/mouse/keyboard interactions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;InfoDisplay&lt;/strong&gt;: Bandcamp integration and UI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Albums&lt;/strong&gt;: 3D vinyl mesh and texture management&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Technical Challenges Solved 💪
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Performance&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Texture preloading&lt;/li&gt;
&lt;li&gt;Efficient animation system&lt;/li&gt;
&lt;li&gt;Smart render ordering for overlapping vinyls&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Mobile Support&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Touch gestures&lt;/li&gt;
&lt;li&gt;Dynamic viewport scaling&lt;/li&gt;
&lt;li&gt;Mobile GPU optimizations&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Integration&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bandcamp iframe embedding&lt;/li&gt;
&lt;li&gt;Facebook browser detection&lt;/li&gt;
&lt;li&gt;State management between components&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Learning Points 📚
&lt;/h2&gt;

&lt;p&gt;As my first major JavaScript project, I learned:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WebGL/Three.js fundamentals&lt;/li&gt;
&lt;li&gt;Complex animation timing&lt;/li&gt;
&lt;li&gt;State management patterns&lt;/li&gt;
&lt;li&gt;Performance optimization&lt;/li&gt;
&lt;li&gt;Mobile-first development&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Future Plans 🚀
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Adding vinyl reflection effects&lt;/li&gt;
&lt;li&gt;More interactive behaviors&lt;/li&gt;
&lt;li&gt;Performance enhancements&lt;/li&gt;
&lt;li&gt;Better mobile experience&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Looking for Feedback On:
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Code organization&lt;/li&gt;
&lt;li&gt;Three.js best practices&lt;/li&gt;
&lt;li&gt;Performance optimizations&lt;/li&gt;
&lt;li&gt;Mobile UX improvements&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The GitHub Journey
&lt;/h2&gt;

&lt;p&gt;Still learning Git workflows - the repo reflects my learning process! Feel free to explore and suggest improvements. I'm particularly interested in feedback on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Project structure&lt;/li&gt;
&lt;li&gt;Documentation&lt;/li&gt;
&lt;li&gt;Git best practices&lt;/li&gt;
&lt;li&gt;Testing approaches&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  threejs #webgl #javascript #frontend #webdev #showdev #animation #ux
&lt;/h1&gt;

&lt;p&gt;``&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
