<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"
    xmlns:fh="http://purl.org/syndication/history/1.0"
    xmlns:at="http://purl.org/atompub/tombstones/1.0">

    <title>Sockpuppet: Blog</title>
    
    <subtitle><![CDATA[Updates, articles, and behind-the-scenes content.]]></subtitle>
    
    <link href="https://sockpuppet.band/blog/feed?id=2017&amp;tag=streaming" rel="self" />
    
    <link href="https://sockpuppet.band/blog/feed?tag=streaming" rel="current" />
    <fh:archive/>
    

    <link href="https://busybee.superfeedr.com" rel="hub" />
    
    
    <link href="https://sockpuppet.band/blog/" />
    <id>tag:sockpuppet.band,2026-05-14:blog</id>
    <updated>2026-08-28T01:11:03-07:00</updated>

    

    <entry>
        
        <title>NHAMFest &#39;26: behind the scenes (a little)</title>
        <link href="https://sockpuppet.band/blog/2017-NHAMFest-26-behind-the-scenes-a-little" rel="alternate" type="text/html" />
        <published>2026-08-27T23:49:25-07:00</published>
        <updated>2026-08-27T23:49:25-07:00</updated>
        <id>urn:uuid:5ef8b4db-461d-4d1e-894f-f7cc93f13f94</id>
        <author><name>fluffy</name></author>
        <summary type="html"><![CDATA[<p><a href="https://sockpuppet.band/live/2113-NHAMFest26">NHAMFest &lsquo;26</a> was a huge success this year, and was great for bringing together two of my favorite spaces: the VRChat music community and the Fediverse music community.</p>]]></summary>
        <content type="html"><![CDATA[

		

        



        <p><a href="https://sockpuppet.band/live/2113-NHAMFest26">NHAMFest &lsquo;26</a> was a huge success this year, and was great for bringing together two of my favorite spaces: the VRChat music community and the Fediverse music community.</p><p>Here&rsquo;s some stuff about the specifics that went into producing this show on my end!</p>

        
            <p>I&rsquo;ve already described <a href="https://sockpuppet.band/blog/1302-VR-performance-setup-2.0">my general performance setup</a>, and that should be read as a prerequisite.</p><h3 id="2017_h3_1_Multi-streaming-setup">Multi-streaming setup<a href="https://sockpuppet.band/blog/2017-NHAMFest-26-behind-the-scenes-a-little#2017_h3_1_Multi-streaming-setup" class="toc_link"></a></h3><p>A big part of this particular show is that I had two streams running simultaneously: one in VRChat and one on <a href="https://live.sockpuppet.band/">my Owncast instance</a>. Each of these came from a separate OBS instance; the VRChat one showed my Owncast live chat (so that people in VR could follow the chat), and the Owncast one had my live camera as an inset so that people on the outside could see what was actually happening in my physical space; as much as I love the whole &ldquo;virtual critter&rdquo; thing I also want to make it clear that I am actually performing the music live, at least to an extent.</p><p>(I would actually put the camera on both streams but unfortunately I&rsquo;m still using Windows for VRChat and for some reason there&rsquo;s no way to share a camera across multiple processes in Windows.)</p><p>For the VRChat side of the stream I used <a href="https://vrcdn.live/">VRCDN</a>, while the Owncast side used my <a href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN">self-hosted setup</a>, with the Owncast server hosted on my home network and then fronted by my Linode as a caching proxy.</p><p>As part of maintaining continuity with the rest of the festival, I streamed the previous and next participant into the VRChat world using a scene that just <a href="https://owncast.online/docs/embed/">embedded their respective players and chat</a>. Originally I used the HLS m3u8 but it was much too unreliable, and switched to using the player embed as a browser source.</p><p>For the chatbox I used a browser source with some custom CSS:</p><figure class="blockcode"><pre class="highlight" data-language="css" data-line-numbers><span class="line" id="e2017cb1L1"><a class="line-number" href="https://sockpuppet.band/blog/2017-NHAMFest-26-behind-the-scenes-a-little#e2017cb1L1"></a><span class="line-content"><span class="nt">body</span><span class="w"> </span><span class="p">{</span></span></span>
<span class="line" id="e2017cb1L2"><a class="line-number" href="https://sockpuppet.band/blog/2017-NHAMFest-26-behind-the-scenes-a-little#e2017cb1L2"></a><span class="line-content"><span class="w">    </span><span class="k">background-color</span><span class="p">:</span><span class="w"> </span><span class="nb">rgba</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mf">0.5</span><span class="p">);</span></span></span>
<span class="line" id="e2017cb1L3"><a class="line-number" href="https://sockpuppet.band/blog/2017-NHAMFest-26-behind-the-scenes-a-little#e2017cb1L3"></a><span class="line-content"><span class="w">    </span><span class="k">margin</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="kt">px</span><span class="w"> </span><span class="kc">auto</span><span class="p">;</span><span class="w"> </span><span class="k">overflow</span><span class="p">:</span><span class="w"> </span><span class="kc">hidden</span><span class="p">;</span></span></span>
<span class="line" id="e2017cb1L4"><a class="line-number" href="https://sockpuppet.band/blog/2017-NHAMFest-26-behind-the-scenes-a-little#e2017cb1L4"></a><span class="line-content"><span class="p">}</span></span></span>
<span class="line" id="e2017cb1L5"><a class="line-number" href="https://sockpuppet.band/blog/2017-NHAMFest-26-behind-the-scenes-a-little#e2017cb1L5"></a><span class="line-content"></span></span>
<span class="line" id="e2017cb1L6"><a class="line-number" href="https://sockpuppet.band/blog/2017-NHAMFest-26-behind-the-scenes-a-little#e2017cb1L6"></a><span class="line-content"><span class="nt">html</span><span class="w"> </span><span class="p">{</span></span></span>
<span class="line" id="e2017cb1L7"><a class="line-number" href="https://sockpuppet.band/blog/2017-NHAMFest-26-behind-the-scenes-a-little#e2017cb1L7"></a><span class="line-content"><span class="w">    </span><span class="k">font-size</span><span class="p">:</span><span class="w"> </span><span class="mi">36</span><span class="kt">px</span><span class="p">;</span></span></span>
<span class="line" id="e2017cb1L8"><a class="line-number" href="https://sockpuppet.band/blog/2017-NHAMFest-26-behind-the-scenes-a-little#e2017cb1L8"></a><span class="line-content"><span class="p">}</span></span></span>
<span class="line" id="e2017cb1L9"><a class="line-number" href="https://sockpuppet.band/blog/2017-NHAMFest-26-behind-the-scenes-a-little#e2017cb1L9"></a><span class="line-content"></span></span>
<span class="line" id="e2017cb1L10"><a class="line-number" href="https://sockpuppet.band/blog/2017-NHAMFest-26-behind-the-scenes-a-little#e2017cb1L10"></a><span class="line-content"><span class="p">#</span><span class="nn">chat-container</span><span class="w"> </span><span class="p">{</span></span></span>
<span class="line" id="e2017cb1L11"><a class="line-number" href="https://sockpuppet.band/blog/2017-NHAMFest-26-behind-the-scenes-a-little#e2017cb1L11"></a><span class="line-content"><span class="w">    </span><span class="k">background-color</span><span class="p">:</span><span class="w"> </span><span class="nb">rgba</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mf">0.5</span><span class="p">);</span></span></span>
<span class="line" id="e2017cb1L12"><a class="line-number" href="https://sockpuppet.band/blog/2017-NHAMFest-26-behind-the-scenes-a-little#e2017cb1L12"></a><span class="line-content"><span class="w">    </span><span class="k">font-size</span><span class="p">:</span><span class="w"> </span><span class="mi">200</span><span class="kt">%</span><span class="p">;</span></span></span>
<span class="line" id="e2017cb1L13"><a class="line-number" href="https://sockpuppet.band/blog/2017-NHAMFest-26-behind-the-scenes-a-little#e2017cb1L13"></a><span class="line-content"><span class="w">    </span><span class="k">text-shadow</span><span class="p">:</span><span class="w"> </span><span class="mi">-2</span><span class="kt">px</span><span class="w"> </span><span class="mi">-2</span><span class="kt">px</span><span class="w"> </span><span class="mi">1</span><span class="kt">px</span><span class="w"> </span><span class="kc">black</span><span class="p">,</span></span></span>
<span class="line" id="e2017cb1L14"><a class="line-number" href="https://sockpuppet.band/blog/2017-NHAMFest-26-behind-the-scenes-a-little#e2017cb1L14"></a><span class="line-content"><span class="w">         </span><span class="mi">-2</span><span class="kt">px</span><span class="w"> </span><span class="mi">2</span><span class="kt">px</span><span class="w"> </span><span class="mi">1</span><span class="kt">px</span><span class="w"> </span><span class="kc">black</span><span class="p">,</span></span></span>
<span class="line" id="e2017cb1L15"><a class="line-number" href="https://sockpuppet.band/blog/2017-NHAMFest-26-behind-the-scenes-a-little#e2017cb1L15"></a><span class="line-content"><span class="w">         </span><span class="mi">2</span><span class="kt">px</span><span class="w"> </span><span class="mi">-2</span><span class="kt">px</span><span class="w"> </span><span class="mi">1</span><span class="kt">px</span><span class="w"> </span><span class="kc">black</span><span class="p">,</span></span></span>
<span class="line" id="e2017cb1L16"><a class="line-number" href="https://sockpuppet.band/blog/2017-NHAMFest-26-behind-the-scenes-a-little#e2017cb1L16"></a><span class="line-content"><span class="w">         </span><span class="mi">2</span><span class="kt">px</span><span class="w"> </span><span class="mi">2</span><span class="kt">px</span><span class="w"> </span><span class="mi">1</span><span class="kt">px</span><span class="w"> </span><span class="kc">black</span><span class="p">;</span></span></span>
<span class="line" id="e2017cb1L17"><a class="line-number" href="https://sockpuppet.band/blog/2017-NHAMFest-26-behind-the-scenes-a-little#e2017cb1L17"></a><span class="line-content"><span class="p">}</span></span></span>
<span class="line" id="e2017cb1L18"><a class="line-number" href="https://sockpuppet.band/blog/2017-NHAMFest-26-behind-the-scenes-a-little#e2017cb1L18"></a><span class="line-content"></span></span>
<span class="line" id="e2017cb1L19"><a class="line-number" href="https://sockpuppet.band/blog/2017-NHAMFest-26-behind-the-scenes-a-little#e2017cb1L19"></a><span class="line-content"><span class="p">.</span><span class="nc">ChatActionmessage_chatAction__SaAM1</span><span class="w"> </span><span class="p">{</span></span></span>
<span class="line" id="e2017cb1L20"><a class="line-number" href="https://sockpuppet.band/blog/2017-NHAMFest-26-behind-the-scenes-a-little#e2017cb1L20"></a><span class="line-content"><span class="w">    </span><span class="k">background-color</span><span class="p">:</span><span class="w"> </span><span class="nb">rgba</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mf">0.5</span><span class="p">);</span></span></span>
<span class="line" id="e2017cb1L21"><a class="line-number" href="https://sockpuppet.band/blog/2017-NHAMFest-26-behind-the-scenes-a-little#e2017cb1L21"></a><span class="line-content"><span class="w">    </span><span class="k">font-size</span><span class="p">:</span><span class="w"> </span><span class="mi">24</span><span class="kt">px</span><span class="p">;</span></span></span>
<span class="line" id="e2017cb1L22"><a class="line-number" href="https://sockpuppet.band/blog/2017-NHAMFest-26-behind-the-scenes-a-little#e2017cb1L22"></a><span class="line-content"><span class="p">}</span></span></span>
<span class="line" id="e2017cb1L23"><a class="line-number" href="https://sockpuppet.band/blog/2017-NHAMFest-26-behind-the-scenes-a-little#e2017cb1L23"></a><span class="line-content"></span></span>
<span class="line" id="e2017cb1L24"><a class="line-number" href="https://sockpuppet.band/blog/2017-NHAMFest-26-behind-the-scenes-a-little#e2017cb1L24"></a><span class="line-content"><span class="p">.</span><span class="nc">ChatSocialMessage_follower__yYsqi</span><span class="w"> </span><span class="p">{</span></span></span>
<span class="line" id="e2017cb1L25"><a class="line-number" href="https://sockpuppet.band/blog/2017-NHAMFest-26-behind-the-scenes-a-little#e2017cb1L25"></a><span class="line-content"><span class="w">    </span><span class="k">text-shadow</span><span class="p">:</span><span class="w"> </span><span class="kc">none</span><span class="p">;</span></span></span>
<span class="line" id="e2017cb1L26"><a class="line-number" href="https://sockpuppet.band/blog/2017-NHAMFest-26-behind-the-scenes-a-little#e2017cb1L26"></a><span class="line-content"><span class="p">}</span></span></span>
<span class="line" id="e2017cb1L27"><a class="line-number" href="https://sockpuppet.band/blog/2017-NHAMFest-26-behind-the-scenes-a-little#e2017cb1L27"></a><span class="line-content"></span></span>
<span class="line" id="e2017cb1L28"><a class="line-number" href="https://sockpuppet.band/blog/2017-NHAMFest-26-behind-the-scenes-a-little#e2017cb1L28"></a><span class="line-content"><span class="p">.</span><span class="nc">ChatModeratorNotification_chatModerationNotification__BNHEb</span><span class="w"> </span><span class="p">{</span></span></span>
<span class="line" id="e2017cb1L29"><a class="line-number" href="https://sockpuppet.band/blog/2017-NHAMFest-26-behind-the-scenes-a-little#e2017cb1L29"></a><span class="line-content"><span class="w">    </span><span class="k">display</span><span class="p">:</span><span class="w"> </span><span class="kc">none</span><span class="p">;</span></span></span>
<span class="line" id="e2017cb1L30"><a class="line-number" href="https://sockpuppet.band/blog/2017-NHAMFest-26-behind-the-scenes-a-little#e2017cb1L30"></a><span class="line-content"><span class="p">}</span></span></span>
</pre></figure><h3 id="2017_h3_2_Gear-loadout">Gear loadout<a href="https://sockpuppet.band/blog/2017-NHAMFest-26-behind-the-scenes-a-little#2017_h3_2_Gear-loadout" class="toc_link"></a></h3><p>Here was my pedal setup for the show:</p>
<figure class="images"><a href="https://sockpuppet.band/blog/2017-NHAMFest-26-behind-the-scenes-a-little"><img src="https://sockpuppet.band/static/_img/67/aa96/IMG_9317_121337cd90_640x561_q50.webp" width="640" height="561" srcset="https://sockpuppet.band/static/_img/67/aa96/IMG_9317_121337cd90_640x561_q50.webp 1x, https://sockpuppet.band/static/_img/67/aa96/IMG_9317_121337cd90_1280x1121_q50.webp 2x" loading="lazy" class="u-photo" alt="A collection of guitar effect pedals"></a></figure>
<p>As usual I was using my lunchbox amp primarily as a power source for my pedal chain. The signal chain is a <a href="https://amzn.to/4y1U24Z">Boss RC-20XL</a> loop pedal, a <a href="https://amzn.to/4yrstmb">Hotone Soul Press II</a> wah pedal, a <a href="https://amzn.to/4wSdSi6">cheap alphabet-soup-name distortion pedal</a>, and a <a href="https://amzn.to/4hZxeyk">TC Electronic POLYTUNE 3</a> tuner. The &ldquo;loose&rdquo; pedal in front of the loop pedal is the control switch for my reverb unit.</p><p>I also have a couple of other effect pedals in that image that aren&rsquo;t in the signal chain; the blue one is a cheap shimmer reverb that I&rsquo;ve been playing with but haven&rsquo;t found useful for any of my typical live stuff, and the pink one is a cheap reverb+delay+loop pedal which I&rsquo;ve found adds way too much saturation to the signal.</p><p>For this show I used my Epiphone Sheraton II guitar (the blonde one on the left):</p>
<figure class="images"><a href="https://sockpuppet.band/blog/2017-NHAMFest-26-behind-the-scenes-a-little"><img src="https://sockpuppet.band/_img/.eJyLVkrOzytJzSvRT8rJT9f39HWPtzQ2MtDLKkhNV9Ix1KlWyk2siC_PTCnJULIyMzHQAfMzUjPTM0qgAkWpxZlVqUpWSmmZJUo6Smn5RbmJQDml8tSkAiC_sDQxJ7OkUsnK1KA2FgDSHSOY.9GGuLsok5svjCrjgx1RpWr9i06Y" width="360" height="640" srcset="https://sockpuppet.band/_img/.eJyLVkrOzytJzSvRT8rJT9f39HWPtzQ2MtDLKkhNV9Ix1KlWyk2siC_PTCnJULIyMzHQAfMzUjPTM0qgAkWpxZlVqUpWSmmZJUo6Smn5RbmJQDml8tSkAiC_sDQxJ7OkUsnK1KA2FgDSHSOY.9GGuLsok5svjCrjgx1RpWr9i06Y 1x, https://sockpuppet.band/static/_img/5a/c22d/IMG_9320_f4fccafd04_720x1280_q50.webp 2x" loading="lazy" class="u-photo" alt="Epiphone Sheraton II, Ovation Elite 1778TX"></a></figure>
<p>For electric sets like this one, I only use the loop pedal as a convenient way to lift my guitar signal to line level. I also have a dynamic mic (on the round-base mic stand) connected to the looper, which is nice for adding hand percussion and glockenspiel to loop pedal performances, but I didn&rsquo;t use it for this show.</p><h3 id="2017_h3_3_Hand-tracking">Hand tracking<a href="https://sockpuppet.band/blog/2017-NHAMFest-26-behind-the-scenes-a-little#2017_h3_3_Hand-tracking" class="toc_link"></a></h3><p>A bit over a year ago I wrote about <a href="https://beesbuzz.biz/blog/7168-On-the-quest-for-VR-hand-tracking">my quest for VR hand tracking</a> on my main blog<sup id="r_e2017_fn1"><a href="https://sockpuppet.band/blog/2017-NHAMFest-26-behind-the-scenes-a-little#d_e2017_fn1" rel="footnote">1</a></sup>. At the time the <a href="https://www.eozvr.com/products/eoz-immersive-vr-gloves">EOZ Immersive Gloves</a> were not yet available, but since then I have gotten into their early adopter beta program and have been part of their group of testers, which has been a hugely helpful opportunity.</p><p>The way the EOZ gloves work is that they install an alternate controller profile to a pair of <a href="https://tundra-labs.com/">Tundra trackers</a>, which makes them appear as SteamVR hand input when no regular controllers are connected. They also connect to an external circuit that puts a bunch of IMUs on each finger (rather than using more traditional strain sensors).</p><p>I have found that the gloves themselves in their current prototype stage are a bit uncomfortable and constraining, and not great for my grip when playing guitar. But, the alternate controller profile happens to work perfectly with <a href="https://beesbuzz.biz/blog/7168-On-the-quest-for-VR-hand-tracking#7168_h3_3_Mounting-Index-controllers-to-th">my 3D printed wrist mounts</a>, and while I don&rsquo;t get finger tracking, getting the general position down is all that I really care about.</p>
<figure class="images"><a href="https://sockpuppet.band/blog/2017-NHAMFest-26-behind-the-scenes-a-little"><img src="https://sockpuppet.band/_img/.eJyLVkrOzytJzSvRT8rJT9f39HWPtzQ2MtLLKkhNV9Ix1KlWyk2siC_PTCnJULIyMzHQAfMzUjPTM0qgAkWpxZlVqUpWSmmZJUo6Smn5RbmJQDml8tSkAiC_sDQxJ7OkUsnK1KA2FgDSzyOa.4UjRactdNfnCw2u17whJQyp-8qM" width="640" height="553" srcset="https://sockpuppet.band/_img/.eJyLVkrOzytJzSvRT8rJT9f39HWPtzQ2MtLLKkhNV9Ix1KlWyk2siC_PTCnJULIyMzHQAfMzUjPTM0qgAkWpxZlVqUpWSmmZJUo6Smn5RbmJQDml8tSkAiC_sDQxJ7OkUsnK1KA2FgDSzyOa.4UjRactdNfnCw2u17whJQyp-8qM 1x, https://sockpuppet.band/static/_img/ea/55f5/IMG_9322_8af85bcf9c_1280x1106_q50.webp 2x" loading="lazy" class="u-photo" alt="A human forearm wearing a compression sleeve and a Tundra tracker on a 3D-printed wrist mount"></a></figure>
<p>It would be nice if there were a way to have the hand trackers just work by overriding the position of my controllers and then otherwise use the controllers for the finger sensors and buttons, but this setup works well enough that I can compromise on the slight annoyance of having to turn my controllers on and off when I need the buttons.</p><h3 id="2017_h3_4_Clothing">Clothing<a href="https://sockpuppet.band/blog/2017-NHAMFest-26-behind-the-scenes-a-little#2017_h3_4_Clothing" class="toc_link"></a></h3><p>The fun with the camera gimmick is that I like to have my physical body dressed more or less the same as my avatar. For that I have <a href="https://busybee.threadless.com/designs/plaid-life/womens/bottoms/leggings">leggings</a> and a <a href="https://amzn.to/4wYjZBN">tunic top</a> (which is what I modeled my in-game clothing after in the first place). And of course I&rsquo;m wearing some plaid socks (which I think I got on clearance at Target).</p><h3 id="2017_h3_5_Body-tracking">Body tracking<a href="https://sockpuppet.band/blog/2017-NHAMFest-26-behind-the-scenes-a-little#2017_h3_5_Body-tracking" class="toc_link"></a></h3><p>My feet have Vive 2.0 trackers, and my hip tracker is my third Tundra. They&rsquo;re attached using <a href="https://www.eozvr.com/products/eozstraps">EOZ VR straps</a>, specifically their belt and their foot straps.</p><h3 id="2017_h3_6_Backing-tracks">Backing tracks<a href="https://sockpuppet.band/blog/2017-NHAMFest-26-behind-the-scenes-a-little#2017_h3_6_Backing-tracks" class="toc_link"></a></h3><p>I maintain a library of backing tracks for my non-acoustic performances. Some of them are just album versions with the lead vocals and guitar omitted, and some of them are all-new versions that I&rsquo;ve produced specifically for live shows. Many of these I intend to eventually use for an album where I revisit many of my songs in new styles, although I&rsquo;ll still want to rework them a bunch since I&rsquo;m using a lot of Logic&rsquo;s algorithmic &ldquo;session musicians&rdquo; for a lot of it.</p><p>When I set up a set list I put the backing tracks onto a timeline and order them for flow and musical progression, add in a couple of strategic drink and banter breaks, and then add little title cards to let me know what song is coming up next and any pertinent banter notes (typically things to call out like &ldquo;second last song&rdquo; or &ldquo;shout out <a href="https://mecagorp.com/">Chorus</a>&rdquo;). I play the video file in VLC, with the window set to float in my VR playspace.</p>
<figure class="images"><a href="https://sockpuppet.band/blog/2017-NHAMFest-26-behind-the-scenes-a-little"><img src="https://sockpuppet.band/_img/.eJwtyVsKwjAQQNGtlPkObQy1SrYiIpM6SQabpI-R-sC9W8TPc-8J-pKFsjRuKKEx2nT6aA5Vjpg8LVI57G-cQz3mAGqn3pDwcVn5KhFs12r1cyQOUf5hpoVfBBY8CyjwZU64PVjJjZunOw4sT7B7_Tl_AV1vKS0.DLIn7oeGTjptb_UtFkz9_dBbr-I" width="640" height="366" srcset="https://sockpuppet.band/_img/.eJwtyVsKwjAQQNGtlPkObQy1SrYiIpM6SQabpI-R-sC9W8TPc-8J-pKFsjRuKKEx2nT6aA5Vjpg8LVI57G-cQz3mAGqn3pDwcVn5KhFs12r1cyQOUf5hpoVfBBY8CyjwZU64PVjJjZunOw4sT7B7_Tl_AV1vKS0.DLIn7oeGTjptb_UtFkz9_dBbr-I 1x, https://sockpuppet.band/static/_img/cd/b12e/20260827-nhamfest-backing_8bf305ef4f_1280x732_q50.webp 2x" loading="lazy" class="u-photo" alt="Final Cut Pro session with a sequence of song snippets. The title cue for &#34;The Difference&#34; is visible in the editor preview"></a></figure>
<p>The plus side to this approach is that it keeps my show timing down pat and lets me make sure that I fit in all the songs I mean to fit in. The minus side is I have no flexibility in case of technical difficulties and I cannot take requests on the fly (although I don&rsquo;t think I&rsquo;d really be able to accommodate requests in these shows anyway; that&rsquo;s a lot easier on my totally-live acoustic sets).</p><p>This was the set list and the origin of each backing track:</p>
<ul>
<li><a href="https://sockpuppet.band/track/behind-a-mask">Behind a Mask</a>: This is the album version with lead vocals muted, and the lead guitar removed past the intro.</li>
<li><a href="https://sockpuppet.band/track/a-long-plastic-hallway">A Long Plastic Hallway</a>: This is just the album version with lead vocals muted; when performing it live I&rsquo;ll add in more guitar for texture that wasn&rsquo;t in the original. This is also the only track where I make use of my reverb unit&rsquo;s switch. This track also has a lyric cue sheet for reference, as I&rsquo;ve had a hard time getting &ldquo;off-book&rdquo; on this song.</li>
<li><a href="https://sockpuppet.band/track/run-faster">Run Faster</a>: This is a funk version I created specifically for VR performances.</li>
<li><a href="https://sockpuppet.band/track/tw3rp">tw3rp</a>: This is a funk version I created specifically for VR performances. I really should add visual cues because I <em>always</em> forget my auditory cues for when to come in.</li>
<li><a href="https://sockpuppet.band/track/sometimes-its-hard-to-keep-yourself-moving">Sometimes It&rsquo;s Hard to Keep Yourself Moving</a>: This is the album version but with the drums replaced with something with a more &ldquo;live&rdquo; sound. This track was new to this show.</li>
<li><a href="https://sockpuppet.band/track/baby-be-quiet">Baby, Be Quiet</a>: This is a funk version I created specifically for VR performances. It also adds an outro that was not in the original song (but which I have been adding into my live performances for ages). This has a few visual cues for when the different sections start so I don&rsquo;t lose track of the solo.</li>
<li><a href="https://sockpuppet.band/track/change-is-coming">Change Is Coming</a>: This is just the album version with lead vocals muted. I perform additional guitars on top of the synthesized guitar in the album track. I tend to mess them up pretty badly. This one also has visual lyric cues because I have a hard time remembering all of the lyrics.</li>
<li><a href="https://sockpuppet.band/track/material-change">Material Change</a>: This is a disco-funk version I made specifically for VR performances.</li>
<li>Bipolar Bear: This is the upcoming album version sans guitar and vocals. This show was the debut of this track. It has visual lyric cues out of an abundance of caution (since the song is so new) but I don&rsquo;t seem to actually need them.</li>
<li><a href="https://sockpuppet.band/track/strangers">Strangers</a>: This is a piano pop version I made for VR performances, although the piano arpeggio is taken from one of the synths in the original track in places (used as a specific leitmotif of sorts).</li>
<li><a href="https://sockpuppet.band/track/freak-flag">Freak Flag</a>: This is the album version. I play guitar on top which wasn&rsquo;t part of the original. Someday I&rsquo;m going to make a version based on the <a href="https://youtu.be/rhOL3ruM6fk">2020 jazz rendition</a>, because I love its energy for a live performance. I also have visual lyric cues on this because I tend to forget verses, which is ridiculous considering how short this song is.</li>
<li><a href="https://sockpuppet.band/track/the-war-machine">The War Machine</a>: This is the released single version. I try to play guitar on top of it but I have a really hard time remembering the chords while actually performing for some reason (it always goes well in practice). It also has visual lyric cues but I don&rsquo;t really need them anymore.</li>
<li><a href="https://sockpuppet.band/track/space-cadet">Space Cadet</a>: This is just the album version, which I play additional guitar on top of.</li>
<li><a href="https://sockpuppet.band/track/no-brakes">No Brakes</a>: This is a grunge-funk fusion version that I produced specifically for VR performances.</li>
<li>The Difference: This is the upcoming album version sans guitar and vocals. This track debuted at this show. It also has visual lyric cues which I probably don&rsquo;t need but I still use them out of an abundance of caution.</li>
<li><a href="https://sockpuppet.band/track/safety-in-numbers">Safety in Numbers</a>: This is a disco-ska fusion version that I made specific for VR performances.</li>
</ul>
<p>The reason I&rsquo;ve done so many disco/funk versions of things is because <a href="https://sockpuppet.band/live/1821-Moonlit-EU-100">one of the Moonlit Academy shows</a> had a city pop/funk theme, so I decided to adapt a couple of my songs to it, and I found that it brought a great energy to the performance. I ended up liking it so much that I&rsquo;ve used that as my preferred style for my live adaptations going forward.</p><h3 id="2017_h3_7_Show-post-mortem">Show post mortem<a href="https://sockpuppet.band/blog/2017-NHAMFest-26-behind-the-scenes-a-little#2017_h3_7_Show-post-mortem" class="toc_link"></a></h3><p>I think that things went pretty well, all things considered. I did mess up a few of my lyrics (which I don&rsquo;t think anyone else noticed), and I definitely had trouble with the guitar chords on both Change Is Coming and The War Machine. I was also sweaty and fatigued and in a bit more pain than usual. Hour-long sets always take a lot out of me, but I also feel like it&rsquo;s very worth it in the end, even if I can&rsquo;t do them as often as I can do 30-minute sets.</p><p>I loved reviewing the chat transcript afterward and seeing all of the kind comments, and I&rsquo;ll similarly enjoy editing the video and listening to the background chatter that I couldn&rsquo;t hear over my own performing.</p><p>I find it very funny that at every show since Furality I&rsquo;ll have people requesting <a href="https://sockpuppet.band/blog/2206-Furality-Ultra-booth-video-behind-the-scenes">my Furality jingle</a>, which is not something I&rsquo;m going to ever do on a backing track set (the Furality song specifically, but also taking requests generally). But it&rsquo;s something I can accommodate in an <a href="https://sockpuppet.band/live/3035-Gilly-s-Winter-Melodies">acoustic show</a> (time permitting, of course), and I am always happy to do it while <a href="https://youtu.be/EnPY8PZDsGk">busking</a>.</p><p>Anyway. NHAMFest was super good and I hope this is a tradition that keeps going! It&rsquo;s a huge amount of work for everyone involved and I think we&rsquo;re all going to be taking a <em>very</em> well-deserved nap. Thanks to everyone who attended, both on the Fediverse side and in VRChat, and thanks <em>especially</em> to the folks who ran the show and kept it going so smoothly, as well as to Noxi and Tune Together for knocking it out of the park with hosting and promoting the show on the VRChat side.</p>
            
                <hr/><ol><li id="d_e2017_fn1"><p>I notice that on that blog post I was talking about the Leapmotion as the next thing I was going to try. It ended up not working at all well; it drew too much power for the BigScreen Beyond to handle, and even if I connected it to a USB port directly on my computer the tracking quality was pretty abysmal.&nbsp;<a href="/blog/2017-NHAMFest-26-behind-the-scenes-a-little#r_e2017_fn1" rev="footnote">↩</a></p></li></ol>
            

            

        
        <a rel="tag" href="https://sockpuppet.band/blog/?tag=NHAMFest">#NHAMFest</a>
        
        <a rel="tag" href="https://sockpuppet.band/blog/?tag=NHAMFest26">#NHAMFest26</a>
        
        <a rel="tag" href="https://sockpuppet.band/blog/?tag=VRChat">#VRChat</a>
        
        <a rel="tag" href="https://sockpuppet.band/blog/?tag=performances">#Performances</a>
        
        <a rel="tag" href="https://sockpuppet.band/blog/?tag=streaming">#Streaming</a>
        

        ]]>



        </content>
        <category term="Blog" label="Blog" />
        
        
        <category term="NHAMFest" label="NHAMFest" />
        
        <category term="NHAMFest26" label="NHAMFest26" />
        
        <category term="VRChat" label="VRChat" />
        
        <category term="Performances" label="performances" />
        
        <category term="Streaming" label="streaming" />
        

        

    </entry>
    <entry>
        
        <title>Where&#39;d your music go?!</title>
        <link href="https://sockpuppet.band/blog/2156-Where-d-your-music-go" rel="alternate" type="text/html" />
        <published>2025-10-02T18:48:22-07:00</published>
        <updated>2025-10-02T18:48:22-07:00</updated>
        <id>urn:uuid:c47916bc-18db-5fe2-bef6-4fe2391a1de3</id>
        <author><name>fluffy</name></author>
        <summary type="html"><![CDATA[<p>Today I removed all my music, except <a href="https://sockpuppet.band/track/the-war-machine">The War Machine</a>, from Spotify, for the reasons explained in that song (and also <a href="https://sockpuppet.band/blog/121-On-Spotify-and-listening-to-and-collecting-music">in this lengthy diatribe</a>)​.</p>]]></summary>
        <content type="html"><![CDATA[

		

        



        <p>Today I removed all my music, except <a href="https://sockpuppet.band/track/the-war-machine">The War Machine</a>, from Spotify, for the reasons explained in that song (and also <a href="https://sockpuppet.band/blog/121-On-Spotify-and-listening-to-and-collecting-music">in this lengthy diatribe</a>)<sup id="r_e2156_fn1"><a href="https://sockpuppet.band/blog/2156-Where-d-your-music-go#d_e2156_fn1" rel="footnote">1</a></sup>.</p><p>But doing so also required, for very annoying reasons, removing it from all other streaming platforms as well, because the distributor I was working with, TooLost, had no option for removing music from <em>just</em> one platform without deleting and re-uploading everything<sup id="r_e2156_fn2"><a href="https://sockpuppet.band/blog/2156-Where-d-your-music-go#d_e2156_fn2" rel="footnote">2</a></sup>.</p><p>So, when is my music going to get back onto the other streaming platforms? <a href="https://sockpuppet.band/blog/2388-Please-do-not-ask-me-about-streaming-distribution">Ehhh</a>.</p>

        
            <h3 id="2156_h3_1_Why-we-re-at-this-point">Why we&rsquo;re at this point<a href="https://sockpuppet.band/blog/2156-Where-d-your-music-go#2156_h3_1_Why-we-re-at-this-point" class="toc_link"></a></h3><p>The state of affairs for independent music distribution is a horror show. Every distributor I&rsquo;ve used has been a nightmare to work with in some way, and has ended up costing me far more in my dealings with them than I&rsquo;ve ever made back. I&rsquo;ve made probably around $100<sup id="r_e2156_fn3"><a href="https://sockpuppet.band/blog/2156-Where-d-your-music-go#d_e2156_fn3" rel="footnote">3</a></sup> in total over the past 20 years from streaming. It has cost me a <em>lot</em> more than $100 to make my music available on streaming<sup id="r_e2156_fn4"><a href="https://sockpuppet.band/blog/2156-Where-d-your-music-go#d_e2156_fn4" rel="footnote">4</a></sup>.</p><p>Meanwhile, the &ldquo;best&rdquo; month I&rsquo;ve ever had on streaming was the month after <a href="https://sockpuppet.band/blog/3123-Furality-is-gonna-be-amazing">Furality Somna</a>, where I got a brief surge of interest on Spotify, but not enough of one to actually get any of the sustainable characteristics that one would expect. The people who listened to my stuff didn&rsquo;t <em>keep</em> listening to it, my work never ended up in any recommendation feeds or popular playlists, and even with the amount of direct interest I got, I only ended up making around $7, which isn&rsquo;t even enough to receive a payment from my distributor. And it only pays for about two months of distribution fees anyway.</p><p>I&rsquo;ve also written extensively about <a href="https://sockpuppet.band/blog/121-On-Spotify-and-listening-to-and-collecting-music">the problems with streaming platforms and Spotify in particular</a>, and that&rsquo;s not an industry I really want to support right now. In addition to Spotify&rsquo;s issues, I&rsquo;ve also learned of reasons to distrust Apple Music and Tidal, for example their <a href="https://tidal.com/partners/pioneerdj">partnerships</a> with <a href="https://rekordbox.com/en/2025/03/apple-music-support/">Rekordbox</a> which makes it so that DJs can stream artists&#39; music into their mixes without materially supporting said artists beyond &ldquo;exposure.&rdquo;</p><p>I&rsquo;ve also had great difficulty with getting my music onto streaming platforms to begin with these days. In addition to costing considerably more to get distribution than I can ever expect to receive in return, every distributor has succumbed to the problems with a glut of AI submissions, where they have lost all trust in musicians who haven&rsquo;t already made it big, and provide Kafka-esque hoops to jump through to prove that my music was made by me. This isn&rsquo;t <em>entirely</em> the fault of the distributors, but it <em>is</em> a symptom of a deeply broken industry.</p><p>I have also applied to many record labels but they only want to sign up-and-coming musicians, not ones with a deep catalog of what they see as unsuccessful releases, or they want people with a much larger social media presence and a fanbase which would be large enough for me to not need a label to begin with. I am not a social media darling (nor do I want to be), and I just plain don&rsquo;t have it in me to try to get what they want of me.</p><p>So I&rsquo;m focusing on what I have control over.</p><h3 id="2156_h3_2_Where-we-are-right-now">Where we are right now<a href="https://sockpuppet.band/blog/2156-Where-d-your-music-go#2156_h3_2_Where-we-are-right-now" class="toc_link"></a></h3><p>At the moment, my plan is to do the following:</p>
<ul>
<li>Continue to focus on <a href="https://sockpuppet.band/bandcamp">Bandcamp</a>, <a href="https://sockpuppet.band/mirlo">Mirlo</a>, <a href="https://sockpuppet.band/itch">itch.io</a>, and the other storefronts that value creators <em>and</em> listeners, and evangelizing a return to people <a href="https://sockpuppet.band/blog/121-On-Spotify-and-listening-to-and-collecting-music#own-your-collection">owning their own collections</a></li>
<li>Switch to fully-self-managing the releases on my <a href="https://sockpuppet.band/youtube">YouTube</a> and <a href="https://sockpuppet.band/peertube">Peertube</a> channels, and hopefully at least keep my stuff available through YouTube Music in that way</li>
<li>Focus on building my audience through <a href="https://sockpuppet.band/live">live performances</a> and <a href="https://sockpuppet.band/commissions">commissions</a></li>
<li>Continue to work towards a <a href="https://beesbuzz.biz/blog/11155-A-fair-independent-streaming-platform">fair streaming future</a> and other grassroots efforts like <a href="https://kvrradio.com/">KVRR</a> and <a href="https://theindiebeat.fm/">TheIndieBeat</a></li>
</ul>
<h3 id="2156_h3_3_This-isn-t-permanent">This isn&rsquo;t permanent<a href="https://sockpuppet.band/blog/2156-Where-d-your-music-go#2156_h3_3_This-isn-t-permanent" class="toc_link"></a></h3><p>If someone can point me to a fair, ethically-managed distributor that <em>supports</em> independent musicians (rather than using the promise of winning the lottery to keep us constantly buying tickets), I would certainly consider reuploading my catalog somewhere.</p><p>What do I think counts as ethical in this case?</p>
<ul>
<li>Charging an affordable, sustainable amount for the distribution and maintenance of the catalog (even if this means both an annual fee and a royalty cut)</li>
<li>Providing reasonable tools for bulk import/upload of releases (rather than everything being an accessibility nightmare)</li>
<li>Providing <em>actual support</em> to artists who need it, not copy-pasted brush-off responses</li>
<li>Timely distribution of royalty payments, with regular (e.g. annual) lump-sum payments irrespective of minimum thresholds</li>
<li>The ability to pick and choose which streaming platforms works go onto, and the ability to change this later (with takedowns and redistributions on a per-platform basis)</li>
<li>Actually investigating claims of playlist fraud instead of categorically taking down entire catalogs based on a mere suspicion from a platform (and in the meantime, at most only suspending the suspected works on the suspected platforms, <em>not</em> a full takedown from every service)</li>
</ul>
<p>None of these feel very likely to happen in the foreseeable future. But also, the entire streaming music industry needs to change for me to want to really participate in it, and I don&rsquo;t see <em>that</em> happening either. Too much about how the industry works is based around the demands of the major labels in order to keep the major-label content available, even though their requirements ultimately end up working against <em>their</em> interests as well!</p><p>Alternately, if any of the streaming platforms were to allow artists to directly upload and self-distribute to them while still earning royalties<sup id="r_e2156_fn5"><a href="https://sockpuppet.band/blog/2156-Where-d-your-music-go#d_e2156_fn5" rel="footnote">5</a></sup>, that would be peachy.</p><h3 id="2156_h3_4_One-size-does-not-fit-all">One size does not fit all<a href="https://sockpuppet.band/blog/2156-Where-d-your-music-go#2156_h3_4_One-size-does-not-fit-all" class="toc_link"></a></h3><p>I know many musicians for whom this path would not make any sense. Last night at an open mic I was talking about this with a friend, and he was very surprised to hear about my experiences with streaming vs. sales; he makes <em>substantial</em> amounts of money from streaming, and very little from Bandcamp (and what he pays to get his stuff on Bandcamp hasn&rsquo;t paid for his Bandcamp earnings).</p><p>A big part of that is that he primarily records and releases covers of popular music. As a result, he ends up getting his audience from people looking for popular songs, and this led to a level of sustainability that works in his favor. This is also why Bandcamp has been a money pit for him, because mechanical licenses for purchase are significantly more expensive than those for streaming.</p><p>But by the same token, what works for other musicians has not worked for me. Why should I keep playing the game when I have 20+ years of experience telling me that it just plain isn&rsquo;t worthwhile for me to do so?</p><p>Anyway. I do not need streaming in order to <a href="https://sockpuppet.band/blog/2700-On-success">feel successful</a>. So for now I&rsquo;m opting out.</p><p>Maybe in the future this will change. But dealing with the stresses and frustration of streaming is the least important thing to me right now with everything else going on in my life.</p>
            
                <hr/><ol><li id="d_e2156_fn1"><p>Yes, I realize Daniel Ek &ldquo;stepped down&rdquo; as CEO, but only by becoming the chairman of the board. He is now essentially the CEO&rsquo;s <em>boss</em>, and still the majority shareholder, so this doesn&rsquo;t actually change anything vis-a-vis my issues with Spotify.&nbsp;<a href="/blog/2156-Where-d-your-music-go#r_e2156_fn1" rev="footnote">↩</a></p></li><li id="d_e2156_fn2"><p>I also had to pay $3 to do it because TooLost was holding my catalog hostage, but that&rsquo;s just pocket change in the grand scheme of things.&nbsp;<a href="/blog/2156-Where-d-your-music-go#r_e2156_fn2" rev="footnote">↩</a></p></li><li id="d_e2156_fn3"><p>Or rather, I&rsquo;ve had numbers in a database totalling around that amount, but I can&rsquo;t even withdraw a bunch of it because it&rsquo;s all in little pieces that are below their respective distributors&#39; payout thresholds, where they will sit forever.&nbsp;<a href="/blog/2156-Where-d-your-music-go#r_e2156_fn3" rev="footnote">↩</a></p></li><li id="d_e2156_fn4"><p>It&rsquo;s hard to put an actual number on it, but I do know I&rsquo;ve spent at least this much:&nbsp;<a href="/blog/2156-Where-d-your-music-go#r_e2156_fn4" rev="footnote">↩</a></p>
<ul>
<li>$225 for two albums distributed via CDBaby in the early days</li>
<li>$125 for an album distributed via TuneCore in the early days</li>
<li>At least $275 for the years I subscribed to DistroKid and TooLost</li>
<li>A few hundred bucks on SoundCloud Pro</li>
<li>A lot of time and effort and energy spent dealing with all this nonsense, and that isn&rsquo;t free and has probably taken years off my life with the stress</li>
</ul>
</li><li id="d_e2156_fn5"><p><a href="https://support.tidal.com/hc/en-us/articles/26542012438673-TIDAL-Upload">Tidal Upload</a>, sadly, <a href="https://support.tidal.com/hc/en-us/articles/26542012438673-TIDAL-Upload#h_01JRD4Y1E3FNVRJETXP7D9DDPQ">does not count</a>:&nbsp;<a href="/blog/2156-Where-d-your-music-go#r_e2156_fn5" rev="footnote">↩</a></p>
<blockquote>
<p><strong>Does the music that I upload earn royalties on TIDAL?</strong></p><p>No, your uploaded files do not earn royalties.</p></blockquote>
</li></ol>
            

            

        
        <a rel="tag" href="https://sockpuppet.band/blog/?tag=streaming">#Streaming</a>
        
        <a rel="tag" href="https://sockpuppet.band/blog/?tag=Spotify">#Spotify</a>
        
        <a rel="tag" href="https://sockpuppet.band/blog/?tag=business">#Business</a>
        

        ]]>



        </content>
        <category term="Blog" label="Blog" />
        
        
        <category term="Streaming" label="streaming" />
        
        <category term="Spotify" label="Spotify" />
        
        <category term="Business" label="business" />
        

        

    </entry>
    <entry>
        
        <title>Self-hosted streaming CDN</title>
        <link href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN" rel="alternate" type="text/html" />
        <published>2025-09-26T20:22:51-07:00</published>
        <updated>2026-08-28T01:11:03-07:00</updated>
        <id>urn:uuid:2a025873-f8cb-59b0-a816-98cf02912659</id>
        <author><name>fluffy</name></author>
        <summary type="html"><![CDATA[<p>Performers who do streaming-based performances on VRChat and other places have a few options for actually providing their stream. Once upon a time it was preetty common for people to use Twitch or YouTube Live, but those are now being locked down due to advertising considerations. So, many people currently use <a href="https://vrcdn.live/">VRCDN</a>, an inexpensive but limited hosted service that you have to pay monthly for. But for folks with a bit more technical acumen, there&rsquo;s another choice, <a href="https://owncast.online/">Owncast</a>, which is basically a self-hosted Twitch-like.</p>]]></summary>
        <content type="html"><![CDATA[

		

        



        <p>Performers who do streaming-based performances on VRChat and other places have a few options for actually providing their stream. Once upon a time it was preetty common for people to use Twitch or YouTube Live, but those are now being locked down due to advertising considerations. So, many people currently use <a href="https://vrcdn.live/">VRCDN</a>, an inexpensive but limited hosted service that you have to pay monthly for. But for folks with a bit more technical acumen, there&rsquo;s another choice, <a href="https://owncast.online/">Owncast</a>, which is basically a self-hosted Twitch-like.</p><p>Here&rsquo;s how I have mine set up and how I run it for (basically<sup id="r_e2089_fn1"><a href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#d_e2089_fn1" rel="footnote">1</a></sup>) free.</p>

        
            <h3 id="2089_h3_1_Local-server-origin">Local server (origin)<a href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#2089_h3_1_Local-server-origin" class="toc_link"></a></h3><p>First off, I have an Intel NUC running Linux<sup id="r_e2089_fn2"><a href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#d_e2089_fn2" rel="footnote">2</a></sup> on my home network. This computer runs a bunch of my home services but mostly sits idle. Its CPU is a 2.7GHz i7-8559U, which is sufficient to transcode my stream to a number of bitrates and resolutions simultaneously. I currently have the following bitrates configured:</p>
<ul>
<li>Original/raw stream (as configured in OBS; usually 1080p60 @ 6000 Kbps)</li>
<li>1080p60 @ 4500 Kbps</li>
<li>720p30 @ 2000 Kbps</li>
<li>360p24 @ 1000 Kbps</li>
<li>180p24 @ 500 Kbps</li>
</ul>
<p>In theory I should also be able to configure it to use Intel Quick Sync for a bit lower CPU utilization, although I haven&rsquo;t gone through the rigmarole to make that happen, as it hasn&rsquo;t been necessary.</p><p>Anyway, Owncast is running on its own user account, creatively called <code>owncast</code>. To make the server automatically start up, I have the following systemd unit file:</p><figure class="blockcode"><figcaption>/home/owncast/.config/system/user/owncast.service</figcaption><pre class="highlight" data-language="systemd" data-line-numbers><span class="line" id="e2089cb1L1"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb1L1"></a><span class="line-content"><span class="k">[Unit]</span></span></span>
<span class="line" id="e2089cb1L2"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb1L2"></a><span class="line-content"><span class="na">Description</span><span class="o">=</span><span class="s">Owncast Service</span></span></span>
<span class="line" id="e2089cb1L3"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb1L3"></a><span class="line-content"></span></span>
<span class="line" id="e2089cb1L4"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb1L4"></a><span class="line-content"><span class="k">[Service]</span></span></span>
<span class="line" id="e2089cb1L5"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb1L5"></a><span class="line-content"><span class="na">WorkingDirectory</span><span class="o">=</span><span class="s">/home/owncast/owncast</span></span></span>
<span class="line" id="e2089cb1L6"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb1L6"></a><span class="line-content"><span class="na">ExecStart</span><span class="o">=</span><span class="s">/home/owncast/owncast/owncast</span></span></span>
<span class="line" id="e2089cb1L7"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb1L7"></a><span class="line-content"><span class="na">Restart</span><span class="o">=</span><span class="s">always</span></span></span>
<span class="line" id="e2089cb1L8"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb1L8"></a><span class="line-content"><span class="na">RestartSec</span><span class="o">=</span><span class="s">5</span></span></span>
<span class="line" id="e2089cb1L9"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb1L9"></a><span class="line-content"></span></span>
<span class="line" id="e2089cb1L10"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb1L10"></a><span class="line-content"><span class="k">[Install]</span></span></span>
<span class="line" id="e2089cb1L11"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb1L11"></a><span class="line-content"><span class="na">WantedBy</span><span class="o">=</span><span class="s">default.target</span></span></span>
</pre></figure><p>To make this run, I had to enable lingering for the account, with <code>sudo loginctl enable-linger owncast</code> from an administrative user, and <code>systemctl --user enable owncast.service</code> from the owncast account.</p><h3 id="2089_h3_2_Proxy-server">Proxy server<a href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#2089_h3_2_Proxy-server" class="toc_link"></a></h3><p>The next thing to do was to expose this server to the greater Internet. There&rsquo;s a few ways you can go about doing this. The most straightforward, if you have an ISP that allows it, is to set up your home router to forward a particular port to the Owncast instance. However, many ISPs do not allow you to run servers this way, and even though mine does, I wasn&rsquo;t super comfortable with the idea of exposing a network port to the wider Internet or with having my home IP address be part of any public Internet service.</p><p>However, I already have a VPS with <a href="https://linode.com/">Akamai Cloud</a> which I use to run all of my websites. So, I set up an ssh tunnel (specifically using <a href="https://www.harding.motd.ca/autossh/">autossh</a> to automatically restart the connection if it drops). To that end, I made a second systemd unit:</p><figure class="blockcode"><figcaption>/home/owncast/.config/systemd/user/owncast-tunnel.service</figcaption><pre class="highlight" data-language="systemd" data-line-numbers><span class="line" id="e2089cb2L1"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb2L1"></a><span class="line-content"><span class="k">[Unit]</span></span></span>
<span class="line" id="e2089cb2L2"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb2L2"></a><span class="line-content"><span class="na">Description</span><span class="o">=</span><span class="s">Owncast ssh tunnel</span></span></span>
<span class="line" id="e2089cb2L3"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb2L3"></a><span class="line-content"></span></span>
<span class="line" id="e2089cb2L4"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb2L4"></a><span class="line-content"><span class="k">[Service]</span></span></span>
<span class="line" id="e2089cb2L5"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb2L5"></a><span class="line-content"><span class="na">ExecStart</span><span class="o">=</span><span class="s">autossh -NT -R 29929:localhost:8080 MYSERVER.example.com</span></span></span>
<span class="line" id="e2089cb2L6"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb2L6"></a><span class="line-content"><span class="na">Restart</span><span class="o">=</span><span class="s">always</span></span></span>
<span class="line" id="e2089cb2L7"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb2L7"></a><span class="line-content"><span class="na">RestartSec</span><span class="o">=</span><span class="s">5</span></span></span>
<span class="line" id="e2089cb2L8"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb2L8"></a><span class="line-content"></span></span>
<span class="line" id="e2089cb2L9"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb2L9"></a><span class="line-content"><span class="k">[Install]</span></span></span>
<span class="line" id="e2089cb2L10"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb2L10"></a><span class="line-content"><span class="na">WantedBy</span><span class="o">=</span><span class="s">default.target</span></span></span>
</pre></figure><p>where <code>MYSERVER.example.com</code> is the actual hostname of my VPS. I enabled this service with <code>systemctl --user enable owncast-tunnel.service</code> and now localhost connections to 29929 on my VPS connect to port 8080 on my NUC. (No need for Tailscale!)</p><p>Finally, I set up a caching reverse proxy for <a href="https://live.sockpuppet.band">my owncast server</a>. This is how I did it in nginx:</p><figure class="blockcode"><figcaption>/etc/nginx/vhosts-enabled/live.sockpuppet.band</figcaption><pre class="highlight" data-language="nginx" data-line-numbers><span class="line" id="e2089cb3L1"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb3L1"></a><span class="line-content"><span class="k">server</span><span class="w"> </span><span class="p">{</span></span></span>
<span class="line" id="e2089cb3L2"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb3L2"></a><span class="line-content"><span class="w">    </span><span class="kn">listen</span><span class="w"> </span><span class="mi">80</span><span class="p">;</span></span></span>
<span class="line" id="e2089cb3L3"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb3L3"></a><span class="line-content"><span class="w">    </span><span class="kn">listen</span><span class="w"> </span><span class="s">[::]:80</span><span class="p">;</span></span></span>
<span class="line" id="e2089cb3L4"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb3L4"></a><span class="line-content"><span class="w">    </span><span class="kn">server_name</span><span class="w"> </span><span class="s">live.sockpuppet.band</span><span class="p">;</span></span></span>
<span class="line" id="e2089cb3L5"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb3L5"></a><span class="line-content"><span class="w">    </span><span class="kn">return</span><span class="w"> </span><span class="mi">301</span><span class="w"> </span><span class="s">https://</span><span class="nv">$host$request_uri</span><span class="p">;</span></span></span>
<span class="line" id="e2089cb3L6"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb3L6"></a><span class="line-content"><span class="p">}</span></span></span>
<span class="line" id="e2089cb3L7"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb3L7"></a><span class="line-content"></span></span>
<span class="line" id="e2089cb3L8"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb3L8"></a><span class="line-content"><span class="k">proxy_cache_path</span><span class="w"> </span><span class="s">/var/tmp/live_sockpuppet</span><span class="w"> </span><span class="s">levels=1:2</span><span class="w"> </span><span class="s">keys_zone=live_sockpuppet:10m</span><span class="w"> </span><span class="s">max_size=10g</span></span></span>
<span class="line" id="e2089cb3L9"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb3L9"></a><span class="line-content"><span class="w">                 </span><span class="s">inactive=60m</span><span class="w"> </span><span class="s">use_temp_path=off</span><span class="p">;</span></span></span>
<span class="line" id="e2089cb3L10"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb3L10"></a><span class="line-content"></span></span>
<span class="line" id="e2089cb3L11"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb3L11"></a><span class="line-content"><span class="k">server</span><span class="w"> </span><span class="p">{</span></span></span>
<span class="line" id="e2089cb3L12"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb3L12"></a><span class="line-content"><span class="w">    </span><span class="kn">server_name</span><span class="w"> </span><span class="s">live.sockpuppet.band</span><span class="p">;</span></span></span>
<span class="line" id="e2089cb3L13"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb3L13"></a><span class="line-content"><span class="w">    </span><span class="kn">listen</span><span class="w"> </span><span class="mi">443</span><span class="w"> </span><span class="s">ssl</span><span class="p">;</span></span></span>
<span class="line" id="e2089cb3L14"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb3L14"></a><span class="line-content"><span class="w">    </span><span class="kn">ssl_certificate</span><span class="w"> </span><span class="s">/path/to/sockpuppet.band.crt</span><span class="p">;</span></span></span>
<span class="line" id="e2089cb3L15"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb3L15"></a><span class="line-content"><span class="w">    </span><span class="kn">ssl_certificate_key</span><span class="w"> </span><span class="s">/path/to/sockpuppet.band.key</span><span class="p">;</span></span></span>
<span class="line" id="e2089cb3L16"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb3L16"></a><span class="line-content"></span></span>
<span class="line" id="e2089cb3L17"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb3L17"></a><span class="line-content"><span class="w">    </span><span class="kn">location</span><span class="w"> </span><span class="s">/</span><span class="w"> </span><span class="p">{</span></span></span>
<span class="line" id="e2089cb3L18"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb3L18"></a><span class="line-content"><span class="w">        </span><span class="kn">proxy_set_header</span><span class="w"> </span><span class="s">Host</span><span class="w"> </span><span class="nv">$host</span><span class="p">;</span></span></span>
<span class="line" id="e2089cb3L19"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb3L19"></a><span class="line-content"><span class="w">        </span><span class="kn">proxy_set_header</span><span class="w"> </span><span class="s">X-Forwarded-Host</span><span class="w"> </span><span class="nv">$host</span><span class="p">;</span></span></span>
<span class="line" id="e2089cb3L20"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb3L20"></a><span class="line-content"><span class="w">        </span><span class="kn">proxy_set_header</span><span class="w"> </span><span class="s">X-Forwarded-Server</span><span class="w"> </span><span class="nv">$host</span><span class="p">;</span></span></span>
<span class="line" id="e2089cb3L21"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb3L21"></a><span class="line-content"><span class="w">        </span><span class="kn">proxy_set_header</span><span class="w"> </span><span class="s">X-Forwarded-Proto</span><span class="w"> </span><span class="nv">$scheme</span><span class="p">;</span></span></span>
<span class="line" id="e2089cb3L22"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb3L22"></a><span class="line-content"><span class="w">        </span><span class="kn">proxy_set_header</span><span class="w"> </span><span class="s">X-Real-IP</span><span class="w"> </span><span class="nv">$remote_addr</span><span class="p">;</span></span></span>
<span class="line" id="e2089cb3L23"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb3L23"></a><span class="line-content"><span class="w">        </span><span class="kn">proxy_set_header</span><span class="w"> </span><span class="s">X-Forwarded-For</span><span class="w"> </span><span class="nv">$proxy_add_x_forwarded_for</span><span class="p">;</span></span></span>
<span class="line" id="e2089cb3L24"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb3L24"></a><span class="line-content"><span class="w">        </span><span class="kn">proxy_http_version</span><span class="w"> </span><span class="mi">1</span><span class="s">.1</span><span class="p">;</span></span></span>
<span class="line" id="e2089cb3L25"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb3L25"></a><span class="line-content"><span class="w">        </span><span class="kn">proxy_set_header</span><span class="w"> </span><span class="s">Upgrade</span><span class="w"> </span><span class="nv">$http_upgrade</span><span class="p">;</span></span></span>
<span class="line" id="e2089cb3L26"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb3L26"></a><span class="line-content"><span class="w">        </span><span class="kn">proxy_set_header</span><span class="w"> </span><span class="s">Connection</span><span class="w"> </span><span class="nv">$connection_upgrade</span><span class="p">;</span></span></span>
<span class="line" id="e2089cb3L27"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb3L27"></a><span class="line-content"><span class="w">        </span><span class="kn">proxy_pass</span><span class="w"> </span><span class="s">http://127.0.0.1:29929</span><span class="p">;</span></span></span>
<span class="line" id="e2089cb3L28"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb3L28"></a><span class="line-content"><span class="w">        </span><span class="kn">proxy_cache</span><span class="w"> </span><span class="s">live_sockpuppet</span><span class="p">;</span></span></span>
<span class="line" id="e2089cb3L29"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb3L29"></a><span class="line-content"><span class="w">    </span><span class="p">}</span></span></span>
<span class="line" id="e2089cb3L30"><a class="line-number" href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#e2089cb3L30"></a><span class="line-content"><span class="p">}</span></span></span>
</pre></figure><p>This caching configuration means that this edge server only needs to proxy each HLS segment from my home network once, so in theory I can get a full gigabit of upstream from my VPS without overly burdening my home connection (although my home connection has plenty of bandwidth to spare, all the same).</p><h3 id="2089_h3_3_Wider-distribution-with-a-CDN">Wider distribution with a CDN<a href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#2089_h3_3_Wider-distribution-with-a-CDN" class="toc_link"></a></h3><p>This is optional, but <del>I use <a href="https://cloudflare.com/">Cloudflare CDN</a> for DDOS and bot mitigation, as well as better caching performance worldwide</del>. So far I&rsquo;ve never come even <em>remotely</em> close to exceeding the bandwidth capacity of my VPS (which should theoretically be able to serve around 200 simultaneous viewers), but Cloudflare&rsquo;s free tier means I don&rsquo;t have to worry about scaling at all. <mark>Update:</mark> I no longer use Cloudflare. Right now if I were to need a better scaling solution I&rsquo;d probably make use of Owncast&rsquo;s support for S3/B2 block storage instead, or maybe I&rsquo;d see if there&rsquo;s a way to use Akamai.</p><p>I&rsquo;m not a huge fan of Cloudflare for a number of reasons, but it&rsquo;s made it a lot easier for me to deal with the constant deluge of AI bot traffic that&rsquo;s been causing me so much stress lately, and having a proper geographically-distributed CDN is a nice bonus.</p><p>In theory, if your ISP allows running servers, you could also configure Cloudflare to talk directly to your home router, although I believe doing arbitrary port forwards requires a paid plan.</p><h3 id="2089_h3_4_Finally-streaming">Finally, streaming!<a href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#2089_h3_4_Finally-streaming" class="toc_link"></a></h3><p>To send a stream out, instead of using the public-facing hostname (live.sockpuppet.band), I connect OBS to the local IP address, so that I don&rsquo;t have to go out to the public Internet just to be routed back home. This way I also don&rsquo;t have to expose Owncast&rsquo;s RTMP port to the public Internet, which gives me better security. On the minus side, this means I cannot easily share my server with others to allow others to stream with my infrastructure, but that&rsquo;s never come up. If I ever wanted to do a cooperative stream with someone, I could use a WebRTC proxy such as <a href="https://vdo.ninja/">VDO.ninja</a>, but setting that up is outside the scope of this blog post.</p><p>Anyway, when someone connects to <a href="https://live.sockpuppet.band">my owncast</a> they are viewing it through <del>Cloudflare, which pulls the data from</del> my VPS, which in turn proxies it over the SSH tunnel to the Owncast instance running on my device at home. The raw stream (used, for example, by a VRChat in-world player) is available at <code>https://live.sockpuppet.band/hls/stream.m3u8</code>.</p><h3 id="2089_h3_5_How-to-roll-your-own-streaming-C">How to roll your own streaming CDN<a href="https://sockpuppet.band/blog/2089-Self-hosted-streaming-CDN#2089_h3_5_How-to-roll-your-own-streaming-C" class="toc_link"></a></h3><p>Okay so let&rsquo;s say you just want to roll your own VRCDN-like thing, and don&rsquo;t care about having your streaming box be directly on your local network. Here&rsquo;s what I&rsquo;d do for that:</p>
<ol>
<li>Set up a VPS of some sort, even one which only runs when you need it to (which both DigitalOcean and Linode/Akamai support)</li>
<li>Install <a href="https://owncast.online/">owncast</a> on it</li>
<li>Install nginx or apache as a fronting webserver, and have it just reverse proxy into Owncast (so you can run Owncast on port 80/443 without having to run Owncast itself as root)</li>
<li>Front the server with a CDN such as Cloudflare or Akamai, and have it cache aggressively</li>
</ol>
<p>For streaming you&rsquo;ll need to connect directly to the server by IP address (or by having a hostname that&rsquo;s <em>not</em> Cloudflare-proxied), but otherwise you&rsquo;re good to go from here.</p><p>In such a setup you&rsquo;ll probably need to limit the bitrates that you provide.</p><p>Anyway, a suitably-capable VPS will cost around 5.4¢/hour while it&rsquo;s running, and theoretically be able to support hundreds, if not thousands, of simultaneous viewers.</p>
            
                <hr/><ol><li id="d_e2089_fn1"><p>It&rsquo;s only basically free because I already have a public Internet server I run my websites on and a local computer I can use for Owncast. If you don&rsquo;t already have a VPS of some sort, my particular setup won&rsquo;t work for you.&nbsp;<a href="/blog/2089-Self-hosted-streaming-CDN#r_e2089_fn1" rev="footnote">↩</a></p></li><li id="d_e2089_fn2"><p>All of this could also be run on Windows or macOS, but setting up a persistent server and ssh tunnel on those platforms is not something I&rsquo;ve had to internalize.&nbsp;<a href="/blog/2089-Self-hosted-streaming-CDN#r_e2089_fn2" rev="footnote">↩</a></p></li></ol>
            

            

        
        <a rel="tag" href="https://sockpuppet.band/blog/?tag=technology">#Technology</a>
        
        <a rel="tag" href="https://sockpuppet.band/blog/?tag=owncast">#Owncast</a>
        
        <a rel="tag" href="https://sockpuppet.band/blog/?tag=streaming">#Streaming</a>
        
        <a rel="tag" href="https://sockpuppet.band/blog/?tag=VRChat">#VRChat</a>
        

        ]]>



        </content>
        <category term="Blog" label="Blog" />
        
        
        <category term="Technology" label="technology" />
        
        <category term="Owncast" label="owncast" />
        
        <category term="Streaming" label="streaming" />
        
        <category term="VRChat" label="VRChat" />
        

        

    </entry>
    <entry>
        
        <title>Please do not ask me about streaming distribution</title>
        <link href="https://sockpuppet.band/blog/2388-Please-do-not-ask-me-about-streaming-distribution" rel="alternate" type="text/html" />
        <published>2025-08-19T16:13:40-07:00</published>
        <updated>2025-08-19T16:13:40-07:00</updated>
        <id>urn:uuid:b01c0a0e-3bb6-527d-a31b-64de7807c566</id>
        <author><name>fluffy</name></author>
        <summary type="html"><![CDATA[<p>Quite some time ago I posted <a href="https://sockpuppet.band/blog/289-Some-recommendations-for-digital-distribution">my recommendations for streaming distributors</a> but things have all changed in a very bad way since then.</p>]]></summary>
        <content type="html"><![CDATA[

		

        



        <p>Quite some time ago I posted <a href="https://sockpuppet.band/blog/289-Some-recommendations-for-digital-distribution">my recommendations for streaming distributors</a> but things have all changed in a very bad way since then.</p>

        
            <p>TooLost (my previous top recommendation) has gotten incredibly difficult to deal with when it comes to copyright-related things. They now have a hair trigger for deciding that a song &ldquo;needs documentation&rdquo; regarding its legality, but won&rsquo;t provide <em>any</em> useful information about what they think the problem is. On <a href="https://sockpuppet.band/track/the-war-machine">my most recent track</a> they seem to think that it violates someone&rsquo;s copyright but they won&rsquo;t tell me whose, and apparently they&rsquo;re putting the burden on me to just plain guess what their issue is, while taking a week to get back to me on every single question.</p><p>The best advice I&rsquo;ve gotten from anyone is to spend a crapton <em>more</em> money on a copyright registration service with the hopes that it&rsquo;ll convince them that I own the copyright to my own words, and even then there&rsquo;s still the chance that it won&rsquo;t actually help anything.</p><p>Then, for individual tracks that required licensing, I was recommending Soundrop, but they&rsquo;ve raised their price <em>and</em> their cut, and apparently have similar support issues today.</p><p>The other distributors are just as bad. And the streaming environment is <em>also</em> bad.</p><p>In the past year I&rsquo;ve made approximately $5 on streaming services. $5. Total. For a whole year&rsquo;s worth of music.</p><p>Why should I continue to pay into a broken system that isn&rsquo;t going to serve me?</p><p>Y&#39;all can find my music on <a href="https://sockpuppet.band/bandcamp">Bandcamp</a> and <a href="https://sockpuppet.band/mirlo">Mirlo</a> and (eventually) Subvert. And my current stuff will stay up on streaming as long as TooLost decides not to take it down after I stop paying, but I&rsquo;m not going to go out of my way to put more stuff up through them.</p><p>Fuck streaming.</p><p><a href="https://sockpuppet.band/blog/121-On-Spotify-and-listening-to-and-collecting-music">There are better ways</a>.</p>
            

            

        
        <a rel="tag" href="https://sockpuppet.band/blog/?tag=business">#Business</a>
        
        <a rel="tag" href="https://sockpuppet.band/blog/?tag=streaming">#Streaming</a>
        
        <a rel="tag" href="https://sockpuppet.band/blog/?tag=distribution">#Distribution</a>
        
        <a rel="tag" href="https://sockpuppet.band/blog/?tag=TooLost">#TooLost</a>
        

        ]]>



        </content>
        <category term="Blog" label="Blog" />
        
        
        <category term="Business" label="business" />
        
        <category term="Streaming" label="streaming" />
        
        <category term="Distribution" label="distribution" />
        
        <category term="TooLost" label="TooLost" />
        

        

    </entry>
    <entry>
        
        <title>On Spotify, and listening to and collecting music</title>
        <link href="https://sockpuppet.band/blog/121-On-Spotify-and-listening-to-and-collecting-music" rel="alternate" type="text/html" />
        <published>2025-07-15T17:18:54-07:00</published>
        <updated>2026-05-27T23:45:59+00:00</updated>
        <id>urn:uuid:1a1c5f3b-37e2-5984-8fd6-be5b3fe04bd0</id>
        <author><name>fluffy</name></author>
        <summary type="html"><![CDATA[<p>As a musician, I am often asked where people can listen to my music, and people express confusion about why my music isn&rsquo;t on Spotify (aside from <a href="https://sockpuppet.band/track/the-war-machine">The War Machine</a>, which is about why my music isn&rsquo;t on Spotify).</p>]]></summary>
        <content type="html"><![CDATA[

		

        



        <p>As a musician, I am often asked where people can listen to my music, and people express confusion about why my music isn&rsquo;t on Spotify (aside from <a href="https://sockpuppet.band/track/the-war-machine">The War Machine</a>, which is about why my music isn&rsquo;t on Spotify).</p><p>I wrote this as an explanation of why I don&rsquo;t support Spotify and why I ask listeners to return to buying and collecting music or, at the very least, moving to other streaming services.</p><p>Also, see <a href="https://rmr.media">Jeremy Blake</a>&rsquo;s <a href="https://www.youtube.com/watch?v=LQRtKD4gx1k">very good video on this topic</a>.</p><p><strong>tl;dr summary</strong>: If you are able to, buy your music, ideally from <a href="https://mirlo.space/">Mirlo</a> or <a href="https://bandcamp.com/">Bandcamp</a>. If you are going to pay to stream, use <a href="https://qobuz.com/">Qobuz</a> or <a href="https://tidal.com/">Tidal</a>, and if you want to stream for free (and I totally get it! times are tough!), use <a href="https://music.youtube.com/">YouTube Music</a> or <a href="https://pandora.com/">Pandora</a>.</p>

        
            <h3 id="121_h3_1_Ranking-the-services">Ranking the services<a href="https://sockpuppet.band/blog/121-On-Spotify-and-listening-to-and-collecting-music#121_h3_1_Ranking-the-services" class="toc_link"></a></h3><p>Here is my personal ranking of the best ways to get and/or listen to music, ordered from best to worst.</p><p>All per-stream prices are an estimate and based on my most recent available earnings data at the time of this writing, and based on the US market. They are definitely subject to change based on a number of factors that are difficult to predict.</p><h4 id="121_h4_2_From-the-band-s-own-website">From the band&rsquo;s own website<a href="https://sockpuppet.band/blog/121-On-Spotify-and-listening-to-and-collecting-music#121_h4_2_From-the-band-s-own-website" class="toc_link"></a></h4><p>If the band has their own website<sup id="r_e121_fn1"><a href="https://sockpuppet.band/blog/121-On-Spotify-and-listening-to-and-collecting-music#d_e121_fn1" rel="footnote">1</a></sup>, they&rsquo;ll probably display their preference for how you get their music. Above all else, that should be your top consideration.</p><p>Note that listening to a band&rsquo;s music on their own website typically does not give them any revenue; listening on a band&rsquo;s website is generally offered as a means of doing a &ldquo;try before you buy.&rdquo; If you like what you hear on a band&rsquo;s website, <em>please</em> follow the respective purchase or streaming links for your actual collecting/listening.</p><h4 id="121_h4_3_Mirlo"><a href="https://sockpuppet.band/mirlo">Mirlo</a><a href="https://sockpuppet.band/blog/121-On-Spotify-and-listening-to-and-collecting-music#121_h4_3_Mirlo" class="toc_link"></a></h4><p><a href="https://mirlo.space/">Mirlo</a> is an independent online music store run as a cooperative. The audio quality is great and musicians are in complete control of how much money they make on it, including choosing how much of the purchase price goes to Mirlo itself. The people running it are doing so for the love of music rather than to make fat stacks of cash, and my understanding is that the site pretty much just breaks even on its operating costs.</p><p>It is also <a href="https://github.com/funmusicplace/mirlo/">open source</a> meaning people can contribute changes or directly influence the development efforts, and you can run your own instance of it if you really want to for some reason.</p><p>With Mirlo you will have to <a href="https://sockpuppet.band/blog/feed?id=2017&amp;tag=streaming#own-your-collection">own your collection</a>, which is a good thing. More on that later.</p><h4 id="121_h4_4_itch.io"><a href="https://sockpuppet.band/itch">itch.io</a><a href="https://sockpuppet.band/blog/121-On-Spotify-and-listening-to-and-collecting-music#121_h4_4_itch.io" class="toc_link"></a></h4><p><a href="https://itch.io">itch</a> isn&rsquo;t really a music store, but a lot of people <a href="https://itch.io/soundtracks">sell music there</a>. The experience usually isn&rsquo;t great and is up to the musician (although things like <a href="https://fluffy.itch.io/bandcrash">bandcrash</a> can help to make it better). Like Mirlo, it&rsquo;s totally up to the musician how much money they get and how much goes to the platform.</p><p>With itch you will also have to <a href="https://sockpuppet.band/blog/feed?id=2017&amp;tag=streaming#own-your-collection">own your collection</a>.</p><h4 id="121_h4_5_Bandcamp"><a href="https://sockpuppet.band/bandcamp">Bandcamp</a><a href="https://sockpuppet.band/blog/121-On-Spotify-and-listening-to-and-collecting-music#121_h4_5_Bandcamp" class="toc_link"></a></h4><p><a href="https://bandcamp.com/">Bandcamp</a> is probably the most popular indie music download site there is, and with good reason. They offer high-quality downloads in a number of formats, they were the first site to offer a lot of features which many places take for granted these days (pay-what-you-want pricing, embedded lyrics, optional per-track artwork, full discography purchases, and so much more), and if you buy something on Bandcamp you can also stream it through the app so you don&rsquo;t need to manage your own local library. They also only take a 15% cut for small musicians, and a 10% cut for larger musicians.</p><p>They&rsquo;ve somewhat fallen out of favor in recent years due to a series of changes in ownership, but it is still a great place to buy music which supports the artists.</p><p>While it isn&rsquo;t strictly required that you <a href="https://sockpuppet.band/blog/feed?id=2017&amp;tag=streaming#own-your-collection">own your collection</a> (thanks to the streaming app), it&rsquo;s still a good idea that you do so, especially if you listen to music that comes from a mix of sources.</p><h4 id="121_h4_6_Qobuz">Qobuz<a href="https://sockpuppet.band/blog/121-On-Spotify-and-listening-to-and-collecting-music#121_h4_6_Qobuz" class="toc_link"></a></h4><p><a href="https://qobuz.com/">Qobuz</a> is both a streaming provider and a <a href="https://www.qobuz.com/us-en/shop">download store</a>. Their claim to fame is that they provide everything in the highest possible bitrate and quality, <em>and</em> they are also quite good in terms of how they support artists.</p><p>They&rsquo;re not the best option for purchasing (since Mirlo and Bandcamp match them in terms of quality and exceed them in terms of payment cut), but they <em>are</em> the most-desirable option for streaming (since they provide the highest per-stream rate in the industry, at 1.5¢/stream at the time of this writing).</p><p>If there&rsquo;s an album you want to buy and which isn&rsquo;t on Mirlo or Bandcamp, Qobuz is probably the best place to acquire it.</p><p>Unfortunately, they aren&rsquo;t available globally, buf if you&rsquo;re in one of the supported countries they&rsquo;re a good choice.</p><h4 id="121_h4_7_Tidal">Tidal<a href="https://sockpuppet.band/blog/121-On-Spotify-and-listening-to-and-collecting-music#121_h4_7_Tidal" class="toc_link"></a></h4><p>Tidal has good quality, a reasonable monthly price, and one of the better per-stream rates (1¢/stream) of the larger/better-known providers. They&rsquo;re also one of the few major DSPs which allows musicians to directly upload their music for streaming and sales, although some of their artist management could be better. That shouldn&rsquo;t affect listeners, although sometimes my music ends up on the wrong artist profile and getting that corrected can be tricky.</p><p>For example, as of April 2026, <a href="https://tidal.com/@sockpuppet">my official artist profile</a> only has one release on it, while most of my music has ended up on <a href="https://tidal.com/artist/44840891">a different profile</a>, and Tidal support is taking their sweet time getting that fixed. (They claim it will take <em>at least</em> 8 weeks to get sorted out.)</p><p>I&rsquo;ve also heard anecdotally from other musicians that the opposite problem often happens, where other musicians with the same name release music, Tidal erroneously puts it on their profile, and getting that corrected also takes, apparently, forever.</p><h4 id="121_h4_8_Amazon-Music">Amazon Music<a href="https://sockpuppet.band/blog/121-On-Spotify-and-listening-to-and-collecting-music#121_h4_8_Amazon-Music" class="toc_link"></a></h4><p>The Amazon Music store and Amazon Prime Streaming are pretty okay, all things considered. As a download store they take a 30% cut, but they provide music in reasonably-high-quality (but not the best quality) MP3. The streaming service pays around 1¢/stream.</p><p>The main downside is that using them means supporting Amazon, which a lot of folks do not want to do for very good reasons.</p><h4 id="121_h4_9_Apple-Music-iTunes-Music-Store">Apple Music/iTunes Music Store<a href="https://sockpuppet.band/blog/121-On-Spotify-and-listening-to-and-collecting-music#121_h4_9_Apple-Music-iTunes-Music-Store" class="toc_link"></a></h4><p>The iTunes Music Store is one of the earliest major download services (and they set the standard for how those work), and even today it&rsquo;s still a reasonable option. It&rsquo;s far from the best, though, mostly because they only offer AAC downloads at a high-but-not-amazing bitrate, and being Apple they heavily encourage its use on Apple devices (although there are Windows and Android clients as well, and with effort you can make your purchases on Linux too).</p><p>For downloads they keep a 30% cut, which isn&rsquo;t the worst in the industry but is also far from the best. For streams, their payment rate is just <em>okay</em>, currently around 0.8¢/stream.</p><h4 id="121_h4_10_YouTube-Music"><a href="https://sockpuppet.band/youtube">YouTube Music</a><a href="https://sockpuppet.band/blog/121-On-Spotify-and-listening-to-and-collecting-music#121_h4_10_YouTube-Music" class="toc_link"></a></h4><p>YouTube Music has a bunch going for it:</p>
<ul>
<li>You&rsquo;re already there to watch video</li>
<li>They have basically <em>everything</em> (especially if you consider unofficial uploads)</li>
<li>The quality is decent</li>
</ul>
<p>The main downsides are that the subscription is on the expensive side, and that you&rsquo;re supporting Google, which a lot of people don&rsquo;t like.</p><p>They currently pay around 0.6¢/stream for subscription plays. (They also pay based on ad revenue for content match videos but that&rsquo;s not relevant to this discussion, or to my music, as being Creative Commons-licensed it&rsquo;s not eligible for ContentID, but that&rsquo;s a whole other rant.)</p><h4 id="121_h4_11_Most-other-streaming-providers">Most other streaming providers<a href="https://sockpuppet.band/blog/121-On-Spotify-and-listening-to-and-collecting-music#121_h4_11_Most-other-streaming-providers" class="toc_link"></a></h4><p>Providers like Deezer, Rdio, Napster, etc. all seem to offer rates of around 0.8¢/stream.</p><p>There are two notable exceptions:</p>
<ul>
<li>iHeartRadio, which seems to pay around 1.2¢/stream but I get so few streams from them it&rsquo;s basically statistical line noise, and it&rsquo;s hard to tell if that rate would last if they got more popular</li>
<li>Pandora, which pays a mere 0.5¢/stream (but it has a <em>really good</em> recommendation engine, that said)</li>
</ul>
<h4 id="121_h4_12_Piracy">Piracy<a href="https://sockpuppet.band/blog/121-On-Spotify-and-listening-to-and-collecting-music#121_h4_12_Piracy" class="toc_link"></a></h4><p>I would honestly prefer people pirate my music before they listen to it on Spotify. This is because:</p><h4 id="121_h4_13_Spotify">Spotify<a href="https://sockpuppet.band/blog/121-On-Spotify-and-listening-to-and-collecting-music#121_h4_13_Spotify" class="toc_link"></a></h4><p>If you listen to music on Spotify, even on a free plan, they get money. And where does that money go?</p>
<ul>
<li><a href="https://apnews.com/article/joe-rogan-spotify-deal-76fa0e2c9d4b137f510428528ea6226b">Joe Rogan</a> and other right-wing podcasters</li>
<li>Their chairman<sup id="r_e121_fn2"><a href="https://sockpuppet.band/blog/121-On-Spotify-and-listening-to-and-collecting-music#d_e121_fn2" rel="footnote">2</a></sup>, Daniel Ek, who uses his billions of dollars to <a href="https://djmag.com/news/spotifys-daniel-ek-leads-eu600-million-investment-ai-military-defence-company">directly finance the war machine</a> and the economic destruction of all future creativity via generative AI</li>
<li>Spotify&rsquo;s own AI efforts towards turning all music into bullshit slop</li>
</ul>
<p>You see what&rsquo;s missing from that list? <strong><em>The actual musicians.</em></strong></p><p>Back when Spotify paid musicians, the rate was about 0.5¢/stream. This is among the worst in the industry.</p><p><strong><em>HOWEVER</em></strong></p><p>At this point they rarely even pay musicians, especially the smaller ones:</p>
<ul>
<li>Any track that doesn&rsquo;t get at least 1000 streams per year doesn&rsquo;t get paid, because it&rsquo;s assumed to be low-quality filler (and not just undiscovered)</li>
<li>Any small-artist track which <em>does</em> get at least 1000 streams per year and doesn&rsquo;t come from a major label is assumed to have gotten &ldquo;algorithmic streaming&rdquo; (i.e. bot traffic) and is removed from eligibility on that basis</li>
</ul>
<p>So, for a smaller independent musician like me, Spotify pays essentially $0.</p><p>You may then ask, why do so many musicians put their stuff on Spotify if it&rsquo;s so bad? It&rsquo;s mostly because it&rsquo;s the platform everyone uses, and the hope is that if one gets discovered on Spotify they&rsquo;ll actually make a decent amount of money. But even the artists who <em>do</em> are getting largely screwed over, and not making nearly as much as if those streams had come from a different streaming provider.</p><p>But enough musicians have decided to <a href="https://variety.com/2025/digital/news/deerhoof-remove-catalog-from-spotify-daniel-ek-ai-investment-1236443990/">remove their music from Spotify</a> that I hope that listeners will decide to go to other, more ethical sources for their music.</p><p>Every time I perform at a show I get people asking me not &ldquo;where can I hear your music?&rdquo; but &ldquo;Where&rsquo;s your Spotify?&rdquo; Or if they do ask where they can hear it and I point them to my website, they ask about Spotify, because that&rsquo;s the only place they can <em>conceive</em> of listening to it. Sometimes these questions even come right after I&rsquo;ve performed <a href="https://sockpuppet.band/track/the-war-machine">The War Machine</a>, a song which is explicitly about why my music isn&rsquo;t on Spotify. It will take some time to get people on board with seeking alternatives.</p><p>My goal in this post isn&rsquo;t to encourage musicians to leave Spotify. My goal is to get <em>listeners</em> to do so. It&rsquo;s the listeners who make Spotify money, and that money goes to terrible places.</p><p>There are better listening experiences that cost you less while doing a much better job of directly supporting musicians.</p><h3 id="121_h3_14_Owning-your-collection"><span id="own-your-collection">Owning your collection</span><a href="https://sockpuppet.band/blog/121-On-Spotify-and-listening-to-and-collecting-music#121_h3_14_Owning-your-collection" class="toc_link"></a></h3><p>Owning your collection means buying and downloading your music, and managing it in your own local collection. This has so many advantages:</p>
<ul>
<li>You can get music from many different sources (including CDs!)</li>
<li>It&rsquo;s a one-time purchase instead of a recurring monthly payment</li>
<li><em>Way</em> more of the money goes to the artists (typically, buying a song once is worth over 100 streams&#39; worth!)</li>
<li>Once you have it, it won&rsquo;t disappear if the artist stops listing their music for whatever reason (contract disputes, dissolution of the band/death of the artist, streaming service disappears)</li>
<li>You can choose the way that you listen to music depending on preferences and such</li>
</ul>
<p>I manage my collection by keeping it all on my desktop computer and then use Music.app/iTunes to track it in its database. Then I have a smart playlist setup that will randomly select albums I haven&rsquo;t listened to recently, and use that for actually listening to my music and for building playlists to sync to my phone.</p><p>I also have a backup (always keep it backed up!) on a file server which is also running <a href="https://plex.tv/">Plex</a> and <a href="https://jellyfin.org/">Jellyfin</a>, which gives me the ability to stream my collection from just about anywhere. Plex in particular provides an &ldquo;Album Radio&rdquo; mode which will build a playlist from randomly-selected albums, and the paid version gives you some nice virtual DJ things for automatically building mixes from a particular song (great for crate digging!).</p><p>People often ask me about how I discover new music.</p><p>First of all, my playback setup is integrated with <a href="https://last.fm/user/plaidfluff">last.fm</a>, so that maintains a history of the music I&rsquo;ve played, and can also make recommendations for more music to listen to. Plex has last.fm support built in directly, and both macOS and iOS have <a href="https://www.last.fm/about/trackmymusic">tracking apps</a> to feed the play history in.</p><p>The other major thing is that I follow a lot of musicians and music fans, both via blogs and via social media (<a href="https://joinmastodon.org/">the Fediverse</a> in particular). <a href="https://etherdiver.com/">Ether Diver</a> has a blog called <a href="https://www.etherdiver.com/category/other-peoples-music/">Other People&rsquo;s Music</a> which has been particularly helpful. (And of course sometimes I try to remember to post <a href="https://sockpuppet.band/blog/?tag=recommendations">similar things here</a> to pay it forward, and this is also why I keep my last.fm profile public.)</p><p>Sometimes I also listen to the radio. <a href="https://kexp.org/">A good radio station</a> will expose you to so much good music that you hadn&rsquo;t heard before. Also be on the lookout for various community Internet radio stations like <a href="https://kvrradio.com/public/kvrr">KVRR</a> and <a href="https://theindiebeat.fm/">The Indie Beat</a>. But most of how I discover new music is by word-of-mouth, and then buying entire discographies of bands I like.</p><p>Here&rsquo;s some non-iTunes music players and self-hosted streaming systems that you might consider for managing your collection:</p>
<ul>
<li><a href="https://www.foobar2000.org/">Foobar2000</a> is a well-regarded music player for local collections, which supports Windows, macOS, Android, and iOS</li>
<li><a href="https://github.com/sentriz/gonic">Gonic</a> is a self-hosted streaming server, similar to Jellyfin, with a number of client apps available</li>
<li><a href="https://www.navidrome.org/">Navidrome</a> is another self-hosted streaming server with a really nice user interface</li>
<li><a href="https://audacious-media-player.org/">Audacious</a> (a modern fork of the venerable XMMS, in turn a clone of Winamp<sup id="r_e121_fn3"><a href="https://sockpuppet.band/blog/121-On-Spotify-and-listening-to-and-collecting-music#d_e121_fn3" rel="footnote">3</a></sup>), which has versions for Windows, Linux, and macOS</li>
<li><a href="https://www.doubletwist.com/">Doubletwist</a> is basically the phone sync part of iTunes, but for Windows</li>
<li><a href="https://videolan.org/">VLC</a> runs pretty much everywhere, and now you understand the traffic cone memes too</li>
<li><a href="https://radiccio.music/">Radiccio</a> is macOS-only but does a lot of stuff better than iTunes/Apple Music</li>
</ul>
<h3 id="121_h3_15_Edit-history">Edit history<a href="https://sockpuppet.band/blog/121-On-Spotify-and-listening-to-and-collecting-music#121_h3_15_Edit-history" class="toc_link"></a></h3>
<ul>
<li><strong>2025-07-15:</strong> Initial post</li>
<li><strong>2025-07-20:</strong> Add link to Jeremy Blake&rsquo;s video</li>
<li><strong>2025-10-02:</strong> Some updates and formatting cleanups</li>
<li><strong>2026-01-25:</strong> Updates regarding Daniel Ek</li>
<li><strong>2026-03-26:</strong> Updates regarding my own availability on streaming</li>
<li><strong>2026-03-31:</strong> Some rewrites based on me no longer being on Spotify and some other phrasing updates</li>
<li><strong>2026-04-12:</strong> Some minor notes about Tidal</li>
<li><strong>2026-04-23:</strong> Added some minor notes about Pandora and my own situation</li>
<li><strong>2026-05-27:</strong> Restored this edit history in the name of transparency and clarity</li>
</ul>

            
                <hr/><ol><li id="d_e121_fn1"><p>If a band does not have their own website, they could do well to build one using any number of website builders. <a href="https://simonrepp.com/faircamp/">Faircamp</a> is pretty decent for a lot of folks. Personally I use a combination of <a href="https://publ.beesbuzz.biz/">Publ</a> and <a href="https://fluffy.itch.io/bandcrash">Bandcrash</a> but that can be pretty involved to set up.&nbsp;<a href="/blog/121-On-Spotify-and-listening-to-and-collecting-music#r_e121_fn1" rev="footnote">↩</a></p></li><li id="d_e121_fn2"><p>When I first wrote this article Ek was still the CEO. He has since &ldquo;stepped down&rdquo; to become the chairman of the board, which makes no actual practical difference because now he&rsquo;s the CEO&rsquo;s boss and still the majority shareholder.&nbsp;<a href="/blog/121-On-Spotify-and-listening-to-and-collecting-music#r_e121_fn2" rev="footnote">↩</a></p></li><li id="d_e121_fn3"><p>No llamas had their asses whipped in the making of this blog post.&nbsp;<a href="/blog/121-On-Spotify-and-listening-to-and-collecting-music#r_e121_fn3" rev="footnote">↩</a></p></li></ol>
            

            

        
        <a rel="tag" href="https://sockpuppet.band/blog/?tag=business">#Business</a>
        
        <a rel="tag" href="https://sockpuppet.band/blog/?tag=streaming">#Streaming</a>
        
        <a rel="tag" href="https://sockpuppet.band/blog/?tag=customer+choice">#CustomerChoice</a>
        

        ]]>



        </content>
        <category term="Blog" label="Blog" />
        
        
        <category term="Business" label="business" />
        
        <category term="Streaming" label="streaming" />
        
        <category term="CustomerChoice" label="customer choice" />
        

        

    </entry>
    

    
</feed>