[homepage|cv] WM-071 [text|html] [remarks]
              
Document: WM-071                                                 P. Webb
Category: Project                                             2025.06.16

                           Introducing Nickel

Abstract

   I just want my own YouTube, but sustainable.

Body

   Long story short, there aren’t any video platforms that I want to use
   or that want me as a customer, so I made my own.

   1. The inspiration

      Vimeo is best suited for small businesses, filmmakers, and
      agencies. The only other realistic option? YouTube…which is a
      Google product and I’ve been largely anti‑Google for at least a
      decade. At the top of this year though, I ended my anti‑Google
      stance to not only create a Gmail account, but create a new
      YouTube channel as well. The idea was that I’d just use them to
      grow my personal brand or whatever but that felt gross. I cringed
      every time I logged in.

      Around the same time, I remembered reading an article[1] where
      someone had a ton of video they were storing with Cloudflare
      and paying pennies. I finally re‑read the article and got the
      confidence to try it out for myself. The idea of having my own
      video platform always felt like an impossible dream, just out of
      reach. Not anymore, I did it!

      https://nickel.video/77C015N7N2N3[2]

      Few things to note: most of the site isn’t done; internal links
      will show a nice "404, I’m working on it" message and the site is
      NOT responsive. This is for two reasons:

      1. I wanted to use this immediately
      2. I need to get over needing projects to be "perfect" before
         launching them

      My personal deadline was the launch date of Nintendo Switch 2
      because I wanted to film an unboxing video. My son was a
      persistent micro‑manager during this time of immense frustration
      because guess what? Everything worked in development but not on
      my server…WTF?!!

   2. What went wrong

      I develop on an M1 Max MacBook Pro with 32GB of RAM. Transcoding a
      700MB video is fast af. Deciding to do so on a server with 2GB of
      RAM and watching my app crash again and again for no obvious (at
      the time) reason was excrutiating. What I know NOW is that the
      large video was being kept in memory and when memory fills up, a
      computer will crash. I had to learn how to chunk the video from my
      app and stream its parts to my transcoder before reassembling said
      parts so the transcoding could actually occur before sending
      those bits to Cloudflare R2.

      WHEW!

      Switch 2 launched June 5th and I wasn’t able to get my unboxing
      video onto Nickel until 5 or 6 days later…not terribly bad because
      I literally didn’t know what I didn’t know. I thought the 4GB
      Linode that’s currently running my transcoder was good enough but
      I think I’ll upgrade that to 8GB before I get my initial group of
      VIPs to find edge cases for me.

      Oh yeah, one of the avoidable issues I ran into was forgetting to
      install ffmpeg and wondering why the transcoder API wouldn’t run
      LOL! Man, I felt like such a dummy.

   3. What went well

      I’m having a blast figuring things out TBQH. Much of how the
      internet works remains a mystery to me, until I’m forced to learn
      something to develop a feature.

      For example, blob[3] URLs! They look more professional than having
      your CDN or raw playlist files be exposed in your video source
      tag. Transcoding is neat too! It basically creates several
      versions of your source video in different resolutions so you can
      serve video based on available bandwidth. I’ve gotta optimize my
      ffmpeg config some more to optimize for size, although I want to
      prioritize quality.

      Designing the video player took a few tries. I tried using Plyr[4]
      first but when I found that serving HLS content was proving
      difficult with it, I found the great hls-video-element and
      media-chrome[5] libraries. Fan‑freaking‑tastic libraries, they
      make themeing a breeeeeze.

      I made the video player add context when embedded[6] versus being
      on the site (you can see the title and username of the creator,
      along with a "NICKEL" button that’ll take you to the video on the
      site). I haven’t quite managed to get video to preview within
      Apple Messages or Discord but it seems like you need to be
      whitelisted to make that happen anyway. Nickel won’t get that
      entitlement for quite some time (I thought adding Twitter meta
      tags would work but they don’t so I’ll remove them from the
      codebase in the next update).

      Speaking of updates, I thought I’d also record a video of me
      talking about the latest changes coming to Nickel and post under
      the official account there. Ya gotta dogfood your projects!

   4. The future

      I’ve yet to setup a blog for Nickel so the next update or two
      about it will likely be here on my personal blog as I get basic
      site functionality done. I’m currently working on the pricing page
      and will get that responsive before fixing the rest of the
      ancillary pages.

      It was important for me to have a plan for sustainability because
      as we’ve all seen, ad‑supported always devolves into the worst
      possible experience for everyone who isn’t an advertiser.

      It is my hope that Nickel can become the home of short‑form video
      for at least 100,000 people; creators and the people that support
      them. Stay tuned!

      🕸️

   P.S.: For the tech stack nerds, nothing’s changed. I’m using Gel,
   Deno, GraphQL, and SvelteKit (Typescript and Sass) on Linode.