Early thoughts on Pokémon Unbound
diff --git a/public/emily-dickinson-queer-theory/index.html b/public/emily-dickinson-queer-theory/index.html index 6ffb9ba..b3d1c07 100644 --- a/public/emily-dickinson-queer-theory/index.html +++ b/public/emily-dickinson-queer-theory/index.html @@ -11,10 +11,12 @@ - + + +LITR 308 Emily Dickinson & Queer Theory
diff --git a/public/fx-chains-by-the-utterly-inept/index.html b/public/fx-chains-by-the-utterly-inept/index.html index 29af782..fb87f49 100644 --- a/public/fx-chains-by-the-utterly-inept/index.html +++ b/public/fx-chains-by-the-utterly-inept/index.html @@ -12,10 +12,12 @@ In case it was not clear, I am not a professional. I am a blockhead who likes to - + + +FX chains by the utterly inept
diff --git a/public/hate-for-the-island/index.html b/public/hate-for-the-island/index.html index 61453b5..8a6823f 100644 --- a/public/hate-for-the-island/index.html +++ b/public/hate-for-the-island/index.html @@ -11,10 +11,12 @@ - + + +hate for the island
diff --git a/public/hosting-a-podcast-for-pennies-a-day/index.html b/public/hosting-a-podcast-for-pennies-a-day/index.html new file mode 100644 index 0000000..3d055db --- /dev/null +++ b/public/hosting-a-podcast-for-pennies-a-day/index.html @@ -0,0 +1,158 @@ + + + + + + + + ++ + cassie + + ink + +
+ + + + +Hosting a podcast for pennies a day
+ +I’ve been podcasting on and off for over ten years now — all shows that I’ve since abandoned1, either intentionally or due to time — but I’ve kept websites for them up and running for archival purposes. Originally, the sites were powered by WordPress and podcasting plugins (PowerPress and then Podlove). I didn’t want to continue paying to host the sites nor maintain a WordPress install2, so here’s how I migrated the sites to Hugo and maintain them for about $12/yr (not including the cost of the domains).
+I chose Hugo because I understand how to use it. I’m sure you could make this work with other static site generators; there’s an 11ty plugin out there too which is far more advanced than what I’ve set up. But I built this myself with minor knowledge of how to make a website. It’s simple and it works and it probably will not need any fiddling with unless I intentionally decide to change some part of how it works. That said, if you have suggestions on how to improve or streamline this, shoot me an email! This is by no means a perfect, streamlined, optimized workflow.
+Setting up a podcast feed in Hugo
+At its core, a podcast is just audio files served by an RSS feed. Hugo already has an embedded RSS template that it uses to syndicate your content.3 It’s a good base to start from; we’re basically going to use that and inject in the basic podcast tags as well as some additional ones for newer features like chapter support.
+Note: Hugo has updated the default RSS feed template since I set this up. I’m continuing to use the old one as my base, but I’m going through the changes I made step-by-step, so you can retro fit my edits to the newer template. Or you can just wholesale copy mine; it’s older, but it works. You can jump to the finished feed by clicking here.
+Creating a custom feed template
+First, create a new file at layouts/index.podcast.xml
. Then, add the following to your Hugo config file (I use toml
format, which I believe is the Hugo default).
1[outputs]
+2home = ["HTML", "RSS", "podcast" ] # Sets up podcast feed
+3
+4[outputFormats]
+5 [outputFormats.podcast]
+6 MediaType = "application/rss+xml"
+7 BaseName = "feed" # Your feed will be located at example.org/feed.xml. If you edit this value, you need to edit line 43 in layouts/index.podcast.xml.
+
This tells Hugo to use the new feed template that we’re going to create. Now, let’s work on the template.
+In layouts/index.podcast.xml
, first copy and paste the default Hugo RSS feed template to use as a base. We’re going to start by changing the rss
tag to add podcasting namespaces. Find…
1<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
+
and replace it with…
+1<rss version="2.0"
+2 xmlns:atom="http://www.w3.org/2005/Atom"
+3 xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
+4 xmlns:podcast="https://podcastindex.org/namespace/1.0"
+5 xmlns:content="http://purl.org/rss/1.0/modules/content/">
+
This tells anything reading your feed (like a podcatcher app) that it is, indeed, a feed for podcasts.
+Next, let’s take a look at the first few items in <channel>
tag. Think of this as the show information. We’ll get to the episodes later in the <item
tag. Hugo will, by default, use the site information you provided in your contact file; we’re going to override that. I hard-coded these values, but you probably could declare them in your config file. I don’t really plan on changing the name of my show, though, so it’s fine to hard code them. Editing the template is just as easy as editing your config template.
+
-
+
-
+
I think about bringing Pitch & Play back sometimes because I truly do miss podcasting and I like talking about games. I walked away from the Harry Potter one for obvious reasons, and the one before that I won’t mention because episodes of it still exist online (outside of my control) and I’d rather not attach myself to them. ↩︎
+
+ -
+
WordPress is a bloated monster that constantly has security patches and the founder is super problematic. ↩︎
+
+ -
+
This template has been updated since I set up my feeds; I’m sticking with the old version. ↩︎
+
+
-
+
- + + Podcasting + +
- + + Tech + +
+ + cassie + + ink + +
+ + + + +Using Hugo to generate a podcast feed
+ +I’ve been podcasting on and off for over ten years now — all shows that I’ve since abandoned1, either intentionally or due to time — but I’ve kept websites for them up and running for archival purposes. Originally, the sites were powered by WordPress and podcasting plugins (PowerPress and then Podlove). I didn’t want to continue paying to host the sites nor maintain a WordPress install2. I could, of course, use one of the many podcast hosting services out there — but just like I believe in owning your own space on the internet, I believe you should own and control your podcast feed (and not have to pay a company $15/mo in perpetuity). I use Hugo (which I then deploy with Cloudflare Pages) to generate the sites and feeds; I chose because I understand how to use it. I’m sure you could make this work with other static site generators. There’s an 11ty plugin out there, for example, which is far more advanced than what I’ve set up. But I built this myself. It works. It does not require me to endlessly fiddle or update (unless I want to).
+I am not going to cover hosting your audio files in this post. I offload mine to a storage zone on Bunny; my podcasts are low traffic, so that costs me $12/yr. You could probably get away with using archive.org for free instead, as long as you can get a direct link to your mp3. I’m also not going to cover creating a theme for your podcast in this post. I made my own for both of my sites, but you can easily use a premade one.
+A podcast is, at its core, a collection of audio files served by an RSS feed. That feed provides information to podcast apps, like where to download an episode and how long it is. An SSG like Hugo, which is designed primarily for bloggers, works great for this because it already has an an embedded RSS template that it uses to syndicate your content. The only difference is that we’re going to set up the RSS feed to serve both text (your show notes) and audio — as well as all the information that podcast apps need to surface your show. We’re going to work from Hugo’s RSS base template but inject basic podcast tags as well as some additional ones for newer features like chapter support.
+Creating a custom feed template
+First, find your Hugo config file. I use toml
format, so mine is hugo.toml at the root of my site directory. I believe Hugo uses toml
by default, but if you use yaml
, you’ll have to adapt the syntax (but if you use yaml
, you probably know how to do that).
1[outputs]
+2home = ["HTML", "RSS", "podcast" ] # Sets up podcast feed
+3
+4[outputFormats]
+5 [outputFormats.podcast]
+6 MediaType = "application/rss+xml"
+7 BaseName = "feed" # Your feed will be located at example.org/feed.xml.
+
This tells that we’re making a new RSS feed template and that it should use it to serve our content. Now, create a new file at layouts/index.podcast.xml
.
In layouts/index.podcast.xml
, first copy and paste the default Hugo RSS feed template to use as a base.
1{{- $authorEmail := "" }}
+ 2{{- with site.Params.author }}
+ 3 {{- if reflect.IsMap . }}
+ 4 {{- with .email }}
+ 5 {{- $authorEmail = . }}
+ 6 {{- end }}
+ 7 {{- end }}
+ 8{{- end }}
+ 9
+10{{- $authorName := "" }}
+11{{- with site.Params.author }}
+12 {{- if reflect.IsMap . }}
+13 {{- with .name }}
+14 {{- $authorName = . }}
+15 {{- end }}
+16 {{- else }}
+17 {{- $authorName = . }}
+18 {{- end }}
+19{{- end }}
+20
+21{{- $pctx := . }}
+22{{- if .IsHome }}{{ $pctx = .Site }}{{ end }}
+23{{- $pages := slice }}
+24{{- if or $.IsHome $.IsSection }}
+25{{- $pages = $pctx.RegularPages }}
+26{{- else }}
+27{{- $pages = $pctx.Pages }}
+28{{- end }}
+29{{- $limit := .Site.Config.Services.RSS.Limit }}
+30{{- if ge $limit 1 }}
+31{{- $pages = $pages | first $limit }}
+32{{- end }}
+33{{- printf "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>" | safeHTML }}
+34<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
+35 <channel>
+36 <title>{{ if eq .Title .Site.Title }}{{ .Site.Title }}{{ else }}{{ with .Title }}{{ . }} on {{ end }}{{ .Site.Title }}{{ end }}</title>
+37 <link>{{ .Permalink }}</link>
+38 <description>Recent content {{ if ne .Title .Site.Title }}{{ with .Title }}in {{ . }} {{ end }}{{ end }}on {{ .Site.Title }}</description>
+39 <generator>Hugo</generator>
+40 <language>{{ site.Language.LanguageCode }}</language>{{ with $authorEmail }}
+41 <managingEditor>{{.}}{{ with $authorName }} ({{ . }}){{ end }}</managingEditor>{{ end }}{{ with $authorEmail }}
+42 <webMaster>{{ . }}{{ with $authorName }} ({{ . }}){{ end }}</webMaster>{{ end }}{{ with .Site.Copyright }}
+43 <copyright>{{ . }}</copyright>{{ end }}{{ if not .Date.IsZero }}
+44 <lastBuildDate>{{ (index $pages.ByLastmod.Reverse 0).Lastmod.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}</lastBuildDate>{{ end }}
+45 {{- with .OutputFormats.Get "RSS" }}
+46 {{ printf "<atom:link href=%q rel=\"self\" type=%q />" .Permalink .MediaType | safeHTML }}
+47 {{- end }}
+48 {{- range $pages }}
+49 <item>
+50 <title>{{ .Title }}</title>
+51 <link>{{ .Permalink }}</link>
+52 <pubDate>{{ .PublishDate.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}</pubDate>
+53 {{- with $authorEmail }}<author>{{ . }}{{ with $authorName }} ({{ . }}){{ end }}</author>{{ end }}
+54 <guid>{{ .Permalink }}</guid>
+55 <description>{{ .Summary | transform.XMLEscape | safeHTML }}</description>
+56 </item>
+57 {{- end }}
+58 </channel>
+59</rss>
+
We’re going to start by changing the rss
tag to add podcasting namespaces. Find the rss
tag at line 34.
1<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
+
and replace it with…
+1<rss version="2.0"
+2 xmlns:atom="http://www.w3.org/2005/Atom"
+3 xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
+4 xmlns:podcast="https://podcastindex.org/namespace/1.0"
+5 xmlns:content="http://purl.org/rss/1.0/modules/content/">
+
We need to do this because otherwise, a feed reader (like a browser or a podcast app) won’t be able to recognize the podcast-specific tags we’re using. Most of them are itunes
tags because Apple controlled the game early on in podcasts; they never updated the syntax when they rebranded to Apple Podcasts (which is a good thing — if they had, everyone would have had to update their feeds). We’re also adding supporting for Podcast Index’s newer tags — you can think of them like a modern, open competitor to Apple. They added a bunch of modern features to podcast feeds (like standardized chapter support and transcripts). Their tags are supported by most modern podcast apps, including Apple Podcasts.
The channel tag
+Next, let’s take a look at the first few items in <channel>
tag. Think of this as the basic show information; we’ll get to the episodes later in the <item>
tag. Here’s what Hugo has by default at the start of the <channel>
tag.
1<title>{{ if eq .Title .Site.Title }}{{ .Site.Title }}{{ else }}{{ with .Title }}{{ . }} on {{ end }}{{ .Site.Title }}{{ end }}</title>
+2 <link>{{ .Permalink }}</link>
+3 <description>Recent content {{ if ne .Title .Site.Title }}{{ with .Title }}in {{ . }} {{ end }}{{ end }}on {{ .Site.Title }}</description>
+4 <generator>Hugo</generator>
+5 <language>{{ site.Language.LanguageCode }}</language>{{ with $authorEmail }}
+6 <managingEditor>{{.}}{{ with $authorName }} ({{ . }}){{ end }}</managingEditor>{{ end }}{{ with $authorEmail }}
+7 <webMaster>{{ . }}{{ with $authorName }} ({{ . }}){{ end }}</webMaster>{{ end }}{{ with .Site.Copyright }}
+8 <copyright>{{ . }}</copyright>{{ end }}{{ if not .Date.IsZero }}
+9 <lastBuildDate>{{ (index $pages.ByLastmod.Reverse 0).Lastmod.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}</lastBuildDate>{{ end }}
+
We can leave title
, link
, generator
, language
, copyright
, and lastBuildDate
alone. We don’t need managingEditor
or webMaster
, so you can remove those.
Edit the description
tag with your podcast’s tagline.
1<description>Just another podcast feed.</description>
+
Now, we’ll have to add a few podcasting-specific declarations, starting with the show information.
+First, we need to add itunes:author
. This can be your name, your podcast network, or just the name of the show. Be aware that most podcatchers display this information prominently, so make your decision accordingly: if you don’t want your full first and last name out there, don’t put it here.
1<itunes:author>John Podcast</itunes:author>
+
Now, we need the itunes:type
tag, which can have two possible values: episodic
(appropriate for most podcasts — episodes don’t need to be consumed in any particular order) or serial
(episodes should be consumed sequentially).
1<itunes:type>episodic</itunes:type>
+
The itunes:image
tag is where you’ll specify your show’s cover art. I also declare this through image
, which will display your cover art on the raw RSS feed displayed in a browser, too.
1<itunes:image href="https://yourwebsite.com/cover.png" />
+2<image>
+3 <url>https://yourwebsite.com/cover.png</url>
+4</image>
+
Next, we need to specify the category for the show with the itunes:category
tag. Apple has the full list of available categories and sub-categories here. For the sake of this example, let’s assume you’re a podcast about video games.
1<itunes:category text="Leisure">
+2 <itunes:category text="Video Games"/>
+3</itunes:category>
+
If your show is in a category with an ampersand (&), make sure you escape the character, as in the example below. This example also shows how to specify multiple categories if appropriate for your show; you can have up to three.
+1<itunes:category text="Society & Culture">
+2 <itunes:category text="Documentary" />
+3</itunes:category>
+4<itunes:category text="Health & Fitness">
+5 <itunes:category text="Mental Health" />
+6</itunes:category>
+
Ampersands break RSS feeds, so why Apple decided to create categories with ampersands, I will never know.
+We’ll also need to specify if the show is explicit using the itunes:explicit
tag. The possible values are either true
or false
. I am told that Apple can be quite strict about this, so if there’s any cursing or adult content on your show, use true
.
1<itunes:explicit>true</itunes:explicit>
+
I’m not actually sure if this part is required, but I have it and it doesn’t hurt. This is a link to your feed. Obviously, change yourwebsite.com
to your actual domain.
1<atom:link
+2 href="https://yourwebsite.com/feed.xml"
+3 rel="self"
+4 type="application/rss+xml" />
+
If you changed the BaseName
in hugo.toml
, make sure it matches here.
The item tag
+Okay — we’re all set on the channel
information. Now, let’s work on the item
tag. When Hugo generates your actual RSS feed, there will be an item
tag for every episode you release. Of course, we’ll need to customize it to have some podcast-specific data, just like we did in the channel
tag; this time around, though, it’s a little more complicated. The content in the channel
tag is relatively constant — you’re probably not changing the name of your show all that often. But the information we have to provide about our episodes will, naturally, change on an episode-by-episode basis. This means we’re going to have to create some custom parameters that we will then specify in the episode content files.
Here’s what Hugo has by default:
+1<item>
+2 <title>{{ .Title }}</title>
+3 <link>{{ .Permalink }}</link>
+4 <pubDate>{{ .PublishDate.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}</pubDate>
+5 {{- with $authorEmail }}<author>{{ . }}{{ with $authorName }} ({{ . }}){{ end }}</author>{{ end }}
+6 <guid>{{ .Permalink }}</guid>
+7 <description>{{ .Summary | transform.XMLEscape | safeHTML }}</description>
+8 </item>
+
We’re off to a start, but, of course, there’s a lot to add and edit. The title
, link
, pubDate
, and guid
tags can all remain as is.
The description
tag renders what will become your show notes. Right now, it’s set to your post’s summary, which, by default in Hugo, is the first paragraph or so of your post. We want that to be the full text of our post, so we’re going to change .Summary
to .Content
, like so:
1<description>{{ .Content | transform.XMLEscape | safeHTML }}</description>
+
OK — now let’s dig into actually making these podcast episodes. We’re going to be slotting in a lot of custom parameters, which we’ll eventually flesh out when we get to our post template. Let’s start with the episode title. We’ve already specified that in the title
tag, but there’s an Apple-specific one to declare again. We can reuse the same syntax from before, though.
1<itunes:title>{{ .Title }}</itunes:title>
+
Next up is itunes:episodeType
, which can be either full
, bonus
, or trailer
. Because this varies on an episode-to-episode basis, we’ll need a custom parameter.
1<itunes:episodeType>{{ .Params.episodeType }}</itunes:episodeType>
+
We’ll also add a content:encoded
tag. Similar to itunes:title
, this is redundant with another tag (description
), but we’re aiming for compatibility here. Some older podcast apps still use content:encoded
, so we want to support it.
Now for the itunes:summary
tag. This is your episode’s tagline, a preview of its contents. Not all podcast apps surface this, but some do. We’re going to use .Summary
here; we’ll get to customizing it when we set up our actual post templates.
1<itunes:summary>{{ .Summary | transform.XMLEscape | safeHTML }}</itunes:summary>
+
The next tag is probably the most important: enclosure
, which is where you link your actual media file. We’ll do this with two custom parameters: episodeLength
(a bit of a misnomer — it’s the file size in bytes) and episodeURL
.
1<enclosure length="{{ .Params.episodeLength }}" type="audio/mpeg" url="{{ .Params.episodeURL }}" />
+
Now, for the actual duration of the episode, we need itunes:duration
.
1<itunes:duration>{{ .Params.episodeDuration }}</itunes:duration>
+
I’m choosing to remain consistent with the code’s syntax; I wish it was enclosure size
because duration and length are too interchangeable, but it’s not, so we will have to solider on.
Podcast feeds can also have some episodes marked explicit and some non-explicit, so we have to declare that on an episode-to-episode basis. Imagine, for example, that your show as a whole isn’t generally explicit, but on a particular episode, you discuss a Chuck Tingle book — you can mark just that episode as explicit.
+1<itunes:explicit>{{ .Params.episodeExplicit }}</itunes:explicit>
+
We’ll also need to specify an episode and season number. If your show is episodic, we’ll just always use season 1, and podcatchers shouldn’t show any season number. But you can also leave out that tag if your show is episodic and you never plan on using seasons. Some episodic shows still use seasons, though, like shows that go on extended breaks. I don’t use seasons right now, but I’d like to have the opportunity in the future, so I’ll include it.
+1<itunes:episode>{{ .Params.episodeNumber }}</itunes:episode>
+2<itunes:season>{{ .Params.episodeSeason }}</itunes:season>
+
Now, we’re going to build in support for podcast chapters, which are perhaps the greatest innovation in the podcasting space in the last ten years. We’re going to wrap this in an if
statement to check if the parameter returns true
, meaning, your episode has chapters; if it does, we’ll use a standard URL format. If it’s false
, this tag won’t render. If we didn’t do this, there would be a broken link in the feed.
1{{ if eq .Params.episodeChapters false }}
+2 {{ else }}
+3 <podcast:chapters url="{{ .Permalink }}chapters.json" type="application/json+chapters" />
+4{{ end }}
+
If you need help generating chapters for your podcast, by the way, there’s a great web-based tool here.
+We’ll do the same if/else statement for transcripts (for the same reason). I like vtt
format, but there are others out there; just specify whichever one you prefer.
1{{ if eq .Params.episodeTranscript false }}
+2 {{ else }}
+3 <podcast:transcript url="{{ .Permalink }}transcript.vtt" type="text/vtt" />
+4{{ end }}
+
And that’s it! There are a lot of other available podcast tags and a lot of tags that have been deprecated over the years; this covers the major required ones and the ones that most people will want. If you’re interested in using any other tags, just add them as we have been and build those custom parameters into your post template.
+Finished Feed Template
+We have created a custom podcast feed, which will render at yourwebsite.com/feed.xml
. We’ve filled it with the following contents:
1{{- $authorEmail := "" }}
+ 2{{- with site.Params.author }}
+ 3 {{- if reflect.IsMap . }}
+ 4 {{- with .email }}
+ 5 {{- $authorEmail = . }}
+ 6 {{- end }}
+ 7 {{- end }}
+ 8{{- end }}
+ 9
+10{{- $authorName := "" }}
+11{{- with site.Params.author }}
+12 {{- if reflect.IsMap . }}
+13 {{- with .name }}
+14 {{- $authorName = . }}
+15 {{- end }}
+16 {{- else }}
+17 {{- $authorName = . }}
+18 {{- end }}
+19{{- end }}
+20
+21{{- $pctx := . }}
+22{{- if .IsHome }}{{ $pctx = .Site }}{{ end }}
+23{{- $pages := slice }}
+24{{- if or $.IsHome $.IsSection }}
+25{{- $pages = $pctx.RegularPages }}
+26{{- else }}
+27{{- $pages = $pctx.Pages }}
+28{{- end }}
+29{{- $limit := .Site.Config.Services.RSS.Limit }}
+30{{- if ge $limit 1 }}
+31{{- $pages = $pages | first $limit }}
+32{{- end }}
+33{{- printf "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>" | safeHTML }}
+34<rss version="2.0"
+35 xmlns:atom="http://www.w3.org/2005/Atom"
+36 xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
+37 xmlns:podcast="https://podcastindex.org/namespace/1.0"
+38 xmlns:content="http://purl.org/rss/1.0/modules/content/">
+39 <channel>
+40 <title>{{ if eq .Title .Site.Title }}{{ .Site.Title }}{{ else }}{{ with .Title }}{{ . }} on {{ end }}{{ .Site.Title }}{{ end }}</title>
+41 <link>{{ .Permalink }}</link>
+42 <description>Just another podcast feed.</description>
+43 <generator>Hugo</generator>
+44 <language>{{ site.Language.LanguageCode }}</language>{{ with $authorEmail }}
+45 <copyright>{{ . }}</copyright>{{ end }}{{ if not .Date.IsZero }}
+46
+47 <itunes:author>John Podcast</itunes:author>
+48 <itunes:type>episodic</itunes:type>
+49 <itunes:image href="https://yourwebsite.com/cover.png" />
+50 <image>
+51 <url>https://yourwebsite.com/cover.png</url>
+52 </image>
+53 <itunes:category text="Leisure">
+54 <itunes:category text="Video Games"/>
+55 </itunes:category>
+56 <itunes:explicit>true</itunes:explicit>
+57 <atom:link
+58 href="https://yourwebsite.com/feed.xml"
+59 rel="self"
+60 type="application/rss+xml" />
+61
+62 <lastBuildDate>{{ (index $pages.ByLastmod.Reverse 0).Lastmod.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}</lastBuildDate>{{ end }}
+63 {{- with .OutputFormats.Get "RSS" }}
+64 {{ printf "<atom:link href=%q rel=\"self\" type=%q />" .Permalink .MediaType | safeHTML }}
+65 {{- end }}
+66 {{- range $pages }}
+67 <item>
+68 <title>{{ .Title }}</title>
+69 <link>{{ .Permalink }}</link>
+70 <pubDate>{{ .PublishDate.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}</pubDate>
+71 {{- with $authorEmail }}<author>{{ . }}{{ with $authorName }} ({{ . }}){{ end }}</author>{{ end }}
+72 <guid>{{ .Permalink }}</guid>
+73 <description>{{ .Content | transform.XMLEscape | safeHTML }}</description>
+74
+75 <itunes:title>{{ .Title }}</itunes:title>
+76 <itunes:episodeType>{{ .Params.episodeType }}</itunes:episodeType>
+77 <content:encoded>{{ .Content | transform.XMLEscape | safeHTML }}</content:encoded>
+78 <itunes:subtitle>{{ .Summary | transform.XMLEscape | safeHTML }}</itunes:subtitle>
+79 <enclosure length="{{ .Params.episodeLength }}" type="audio/mpeg" url="{{ .Params.episodeURL }}" />
+80 <itunes:duration>{{ .Params.episodeDuration }}</itunes:duration>
+81 <itunes:explicit>{{ .Params.episodeExplicit }}</itunes:explicit>
+82 <itunes:episode>{{ .Params.episodeNumber }}</itunes:episode>
+83 <itunes:season>{{ .Params.episodeSeason }}</itunes:season>
+84 {{ if eq .Params.episodeChapters false }}
+85 {{ else }}
+86 <podcast:chapters url="{{ .Permalink }}chapters.json" type="application/json+chapters" />
+87 {{ end }}
+88 {{ if eq .Params.episodeTranscript false }}
+89 {{ else }}
+90 <podcast:transcript url="{{ .Permalink }}transcript.vtt" type="text/vtt" />
+91 {{ end }}
+92 </item>
+93 {{- end }}
+94 </channel>
+95</rss>
+
Now, we’ll need to work on creating episodes.
+Episode Template
+Inside Hugo’s content
folder, we’re going to create another folder titled episodes
. Each episode will go in a folder, like so:
1├── content/
+2│ └── episodes/
+3│ └── YYYY-MM-DD Title/
+4│ └── chapters.json
+5│ └── index.md
+6│ └── transcript.vtt
+
I use the YYYY-MM-DD format for my folders because it keeps them in episode order, but you could easily do something like S01E01. The naming schema is only used for file organization; it’s not surfaced on your feed or in your post at all.
+You can omit the chapters.json
and transcript.vtt
files if that episode doesn’t have chapters or a transcript, respectively. The index.md
file contains the actual content of our episode. In the frontmatter of every index.md
file, we’ll need to include the custom parameters that we created in our feed. Let’s open up index.md
for our first episode and get to work.
We will start with the standard frontmatter that Hugo requires:
+1---
+2title: "My First Post"
+3date: 2024-01-14T07:07:07+01:00
+4draft: false
+5---
+6
+7Type your shownotes in markdown format here!
+
First, let’s address the itunes:subtitle
tag, which is currently set to pull Hugo’s post summary. By default, Hugo will just use the first paragraph of your post as a summary. If that works for you, you don’t have to do this next step, but if you want want to specify a custom subtitle for your episode, you can add in the summary
tag.
1---
+2title: "My First Post"
+3date: 2024-01-14T07:07:07+01:00
+4draft: false
+5summary: 'This is my episode subtitle!'
+6---
+7
+8Type your shownotes in markdown format here!
+
OK — now onto the parameters that we created for our podcast feed.
+Parameter | +Type | +Description | +
---|---|---|
episodeType | +String | +full , bonus , or trailer |
+
episodeLength | +Number | +The length (in bytes) of your media file. There are a lot of ways to find this information, but on Windows, right-click on the file and select Properties. You’ll see it after Size: in parentheses. |
+
episodeURL | +String | +A direct link to your media file (probably an MP3) | +
episodeDuration | +String | +The duration of your episode in hh:mm:ss format | +
episodeExplicit | +Boolean | +true or false |
+
episodeNumber | +Number | +Increment with every episode | +
episodeSeason | +Number | +If you’re not using seasons, just set this as 1 every time |
+
episodeChapters | +Boolean | +true (the episode has chapters) or false (the episode does not have chapters). If set to true , make sure you place the json file in the episode folder. |
+
episodeTranscript | +Boolean | +true (the episode has a transcript) or false (the episode does not have a transcript). If set to true , make sure you place the vtt file in the episode folder. |
+
An example might be…
+ 1---
+ 2title: "My First Post"
+ 3date: 2024-01-14T07:07:07+01:00
+ 4draft: false
+ 5summary: 'This is my episode subtitle!'
+ 6
+ 7episodeType: full
+ 8episodeLength: 20451328
+ 9episodeURL: https://yourwebsite.com/episodes/episode1.mp3
+10episodeDuration: 00:27:59
+11episodeExplicit: true
+12episodeNumber: 1
+13episodeSeason: 1
+14episodeChapters: false
+15episodeTranscript: false
+16---
+17
+18Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur auctor aliquet urna id gravida. In sollicitudin posuere risus a malesuada. Cras pretium, neque eget molestie laoreet, urna neque consequat turpis, sed vestibulum sem mi eget velit. Integer in orci sit amet sapien pharetra malesuada a id justo. Ut pellentesque, magna at finibus tincidunt, elit ante venenatis nibh, in fermentum ipsum elit et ligula. Phasellus lorem elit, volutpat volutpat auctor et, laoreet molestie sapien. Sed hendrerit pellentesque nulla a rutrum. Nunc lobortis mattis vestibulum. Pellentesque vel orci viverra est sagittis pulvinar.
+
Every time you’re ready to post a new episode, you’ll just create a new folder and index.md
with the appropriate information. You can probably automate this a bit with a custom archetype, but I usually just copy and paste the frontmatter from the previous post and tweak it as necessary.
Now, you just have to build and deploy your site. Your feed will be found at yourwebsite.com/feed.xml
. You’ll have to manually submit that feed to the major podcast directories, but that’s a one time deal; once you’re listed, the apps should refresh shortly after you publish your episodes.
You can see this at work on Pitch & Play. Do note that I’ve made a few customizations to the feed template for my show specifically — I’m a dumbass who put an ampersand in their show name and I had to work around that. I followed the same basic protocol for Podtrificus Totalus, but some of the feed structure is outdated because I generated that site further back than Pitch & Play. Both sites use custom themes; they’re bespoke and probably a bit janky, so I won’t be releasing them to the public for use, but the repos for them are public, so you can steal whatever you want.
+Want to test your feed? I like the Podbase Validator; you can run Pitch & Play’s feed directly by clicking here.3
+If this post helped you — or if something isn’t working — feel free to get in touch with me.
++
-
+
-
+
I think about bringing Pitch & Play back sometimes because I truly do miss podcasting and I like talking about games. I walked away from the Harry Potter one for obvious reasons, and the one before that I won’t mention because episodes of it still exist online (outside of my control) and I’d rather not attach myself to them. ↩︎
+
+ -
+
WordPress is a bloated monster that constantly has security patches, and the founder is super problematic. ↩︎
+
+ -
+
I’m failing the Byte-range support test right now, but that’s related to where my media is hosted, not the RSS feed — and in my testing, I’m not sure that’s actually a problem. ↩︎
+
+
-
+
- + + Podcasting + +
- + + Tech + +
(week notes 28)
+Doing
+Reading
+Watching
+Playing
+Listening
+I finally got around to listening to SOPHIE by SOPHIE. Man, I have such mixed feelings about posthumous releases. The greedy bitch in me wants more, always, especially from artists who died way too young. I know SOPHIE’s brother, who finished the album, insists that SOPHIE was nearly done with it at the time of her death, but the stretch between “nearly finished” and “actually ready to release” can be miles long for an artist. I’m not an artist, by any means, of SOPHIE’s caliber, but a piece of writing for me can completely transform in the edit. Posthumous albums too often feel like an early sketch1, a pastiche of the auteur that are perhaps categorically incapable of capturing the genuine vision and artistry of the deceased. Unfortunately, this was the case for me with SOPHIE: “Reason Why” and “Live in My Truth” were standouts, but in general, it lacked the thrill and voice of SOPHIE (RIP).
+-
+
- + + Week-Notes + +
Using Hugo to generate a podcast feed
+I’ve been podcasting on and off for over ten years now — all shows that I’ve since abandoned1, either intentionally or due to time — but I’ve kept websites for them up and running for archival purposes. Originally, the sites were powered by WordPress and podcasting plugins (PowerPress and then Podlove). I didn’t want to continue paying to host the sites nor maintain a WordPress install2, so here’s how I migrated the sites to Hugo (which I then deploy with Cloudflare Pages).
+-
+
- + + Podcasting + +
- + + Tech + +
I want to fuck my computer (week notes 027)
FX chains by the utterly inept
-Once upon a time ago (and a time, and a time), I had a podcast. I miss podcasting dearly and think about going back often — otherwise, what am I to do with a partial, flawed understanding of normalizing to a target loudness and editing around the disgusting noises my mouth makes? Well, share it with others, of course.1
-In case it was not clear, I am not a professional. I am a blockhead who likes to tinker and who has watched a lot of YouTube videos. These are the FX chains I use for my voice, which may or may not be helpful to other people who do not have my voice. This is also not an exhaustive audio guide or overview of how I edit my audio. Maybe another time.
--
-
- - - Tech - -
- - - Podcasting - -
- - - Audio - -
Climbing my personal Mount Doom (I finished reading Lord of the Rings)
-Peter Jackson’s The Lord of the Rings: The Fellowship of the Ring released in 2001 when I was seven years old. At the time, my media diet consisted mostly of The Powerpuff Girls and obsessively reading and re-reading the first four Harry Potter books.1 I would like to say that my father was thoughtful and felt that I would have enjoyed another fantasy series with wizards and magic but knew that a three-plus-hour theater experience was tall ask for a seven year old. Unfortunately, I know him, and I think it more likely that he is cheap and thought the movie looked cool, so when Fellowship released on home media, we trucked to the neighborhood knock-off and rented it on VHS. That night, I crowded with my two older siblings around a (by today’s standards) laughably small tube TV. We tucked in with no expectations or understanding of what the movie would be about.
--
-
- - - Literature - -
Intentional Listening
diff --git a/public/js/main.js.map b/public/js/main.js.map index 56bf96b..bee2152 100644 --- a/public/js/main.js.map +++ b/public/js/main.js.map @@ -1 +1 @@ -{"version":3,"sources":["file:///F:/Websites/cassiedotink/themes/neverhungoveragain/assets/js/main.js"],"sourcesContent":["console.log('This site was generated by Hugo.');\n"],"mappings":";;AAAA,UAAQ,IAAI,kCAAkC;","names":[]} \ No newline at end of file +{"version":3,"sources":["file:///F:/websites/cassiedotink/themes/neverhungoveragain/assets/js/main.js"],"sourcesContent":["console.log('This site was generated by Hugo.');\r\n"],"mappings":";;AAAA,UAAQ,IAAI,kCAAkC;","names":[]} \ No newline at end of file diff --git a/public/litr-250-close-reading-2e/index.html b/public/litr-250-close-reading-2e/index.html index d13a4d9..0a8fb32 100644 --- a/public/litr-250-close-reading-2e/index.html +++ b/public/litr-250-close-reading-2e/index.html @@ -11,10 +11,12 @@ - + + +LITR 250 Close Reading 2E
diff --git a/public/media-log-2024-01/index.html b/public/media-log-2024-01/index.html index d865b68..74cbdea 100644 --- a/public/media-log-2024-01/index.html +++ b/public/media-log-2024-01/index.html @@ -11,10 +11,12 @@ - + + +Media Log (January 2024)
diff --git a/public/media-log-august-2023/index.html b/public/media-log-august-2023/index.html index da74c35..684c2e2 100644 --- a/public/media-log-august-2023/index.html +++ b/public/media-log-august-2023/index.html @@ -10,10 +10,12 @@ - + + +Media Log (August 2023)
diff --git a/public/media-log-july-2023/index.html b/public/media-log-july-2023/index.html index 338abf8..79e5439 100644 --- a/public/media-log-july-2023/index.html +++ b/public/media-log-july-2023/index.html @@ -11,10 +11,12 @@ Movies The Fast and the Furious - a rewatch of a movie I watched way too much as - + + +Media Log (July 2023)
diff --git a/public/moving-my-home-server-to-a-new-chassis/index.html b/public/moving-my-home-server-to-a-new-chassis/index.html index 302fa64..1e19497 100644 --- a/public/moving-my-home-server-to-a-new-chassis/index.html +++ b/public/moving-my-home-server-to-a-new-chassis/index.html @@ -11,10 +11,12 @@ - + + +Moving my home server to a new chassis
diff --git a/public/moving-to-a-rack-mount-setup/index.html b/public/moving-to-a-rack-mount-setup/index.html index 5386432..eb0431c 100644 --- a/public/moving-to-a-rack-mount-setup/index.html +++ b/public/moving-to-a-rack-mount-setup/index.html @@ -11,10 +11,12 @@ - + + +Moving to a rack mount setup
diff --git a/public/my-year-in-lists/index.html b/public/my-year-in-lists/index.html index 0c64bfd..caed5c4 100644 --- a/public/my-year-in-lists/index.html +++ b/public/my-year-in-lists/index.html @@ -12,10 +12,12 @@ However, I am a very goal-oriented, reflective person. In late 2022, after years - + + +my year in lists
diff --git a/public/old-woman-yells-at-the-cloud/index.html b/public/old-woman-yells-at-the-cloud/index.html index 6478d2c..71deb95 100644 --- a/public/old-woman-yells-at-the-cloud/index.html +++ b/public/old-woman-yells-at-the-cloud/index.html @@ -11,10 +11,12 @@ - + + +Old Woman Yells at the Cloud
diff --git a/public/on-teaching/index.html b/public/on-teaching/index.html index a3d518e..c28f487 100644 --- a/public/on-teaching/index.html +++ b/public/on-teaching/index.html @@ -12,10 +12,12 @@ When I was a kid, I was always interested in teaching; my grandparents had an un - + + +On Teaching
diff --git a/public/posts/2024-11-25-23-06-55/index.html b/public/posts/2024-11-25-23-06-55/index.html index c7e6033..c0835cf 100644 --- a/public/posts/2024-11-25-23-06-55/index.html +++ b/public/posts/2024-11-25-23-06-55/index.html @@ -15,6 +15,7 @@ ++ + cassie + + ink + +
+ + + + +Hosting a podcast for pennies a day
+ +I’ve been podcasting on and off for over ten years now — all shows that I’ve since abandoned1, either intentionally or due to time — but I’ve kept websites for them up and running for archival purposes. Originally, the sites were powered by WordPress and podcasting plugins (PowerPress and then Podlove). I didn’t want to continue paying to host the sites nor maintain a WordPress install2, so here’s how I migrated the sites to Hugo and maintain them for about $12/yr (not including the cost of the domains).
+I chose Hugo because I understand how to use it. I’m sure you could make this work with other static site generators; there’s an 11ty plugin out there too which is far more advanced than what I’ve set up. But I built this myself with minor knowledge of how to make a website. It’s simple and it works and it probably will not need any fiddling with unless I intentionally decide to change some part of how it works. That said, if you have suggestions on how to improve or streamline this, shoot me an email! I’m sharing not because this is a perfect, optimized workflow but because I hope it might help someone.
+Setting up a podcast feed in Hugo
+At its core, a podcast is just audio files served by an RSS feed. Hugo already has an embedded RSS template that it uses to syndicate your content.3 It’s a good base to start from; we’re basically going to use that and inject in the basic podcast tags as well as some additional ones for newer features like chapter support.
+First, create a new file at layouts/index.podcast.xml
. Then, add the following to your Hugo config file (I use toml
format, which I believe is the Hugo default).
[outputs]
+home = ["HTML", "RSS", "podcast" ] # Sets up podcast feed
[outputFormats]
+[outputFormats.podcast]
+MediaType = "application/rss+xml"
+BaseName = "feed" # Your feed will be located at example.org/feed.xml. If you edit this value, you need to edit line 43 in layouts/index.podcast.xml.
+
-
+
-
+
I think about bringing Pitch & Play back sometimes because I truly do miss podcasting and I like talking about games. I walked away from the Harry Potter one for obvious reasons, and the one before that I won’t mention because episodes of it still exist online (outside of my control) and I’d rather not attach myself to them. ↩︎
+
+ -
+
WordPress is a bloated monster that constantly has security patches and the founder is super problematic. ↩︎
+
+ -
+
This template has been updated since I set up my feeds; I’m sticking with the old version. ↩︎
+
+
Using Hugo to generate a podcast feed
+I’ve been podcasting on and off for over ten years now — all shows that I’ve since abandoned1, either intentionally or due to time — but I’ve kept websites for them up and running for archival purposes. Originally, the sites were powered by WordPress and podcasting plugins (PowerPress and then Podlove). I didn’t want to continue paying to host the sites nor maintain a WordPress install2, so here’s how I migrated the sites to Hugo. I’m not going to cover hosting your media files or creating a theme for your podcast website in this post, but maybe I’ll do another write up in the future on those topics.
+ +-
+
- + + Podcasting + +
- + + Tech + +
an ode to gitsync
-Since I moved this site to Hugo, I’ve been using an app called GitJournal to post from my phone. I have a beautiful desk setup with a clacky mechanical keyboard that’s a joy to write on, but the simple fact is that I’m a lazy shit and want to update my blog from the couch. It’s all mostly worked fine, with some headaches. I originally intended to use GitJournal to store my Github repo to my phone’s filesystem and then point an Obsidian1 vault at that.
- - - -an ode to gitsync
+Since I moved this site to Hugo, I’ve been using an app called GitJournal to post from my phone. I have a beautiful desk setup with a clacky mechanical keyboard that’s a joy to write on, but the simple fact is that I’m a lazy shit and want to update my blog from the couch. It’s all mostly worked fine, with some headaches. I originally intended to use GitJournal to store my Github repo to my phone’s filesystem and then point an Obsidian1 vault at that.
+ + + ++
I finished The Basic Eight and I can't decide if I enjoyed it
-Spoilers to follow.
-I wrote in my week notes:
--The Basic Eight by Daniel Handler. Handler’s Adverbs is often what I cite when folks ask what my favorite book is, and I loved Watch Your Mouth, too. I need light reprieves from The Odyssey, too, so this seemed an excellent time to round out my reading of Handler’s bibliography. I’m about halfway through and enraptured by the narrative voice. It’s pretentious, as a story narrated by a precocious high school senior should be, without being cloying, and with Handler’s charming humor throughout. I love it so far and have faith that the feeling will continue. I normally hate books set in high school, but this one takes me back to my high school self — somehow, in a good way, which I don’t think I’ve ever felt before.
- --- --
-- - - Literature -
-
I finished The Basic Eight and I can't decide if I enjoyed it
+Spoilers to follow.
+I wrote in my week notes:
++The Basic Eight by Daniel Handler. Handler’s Adverbs is often what I cite when folks ask what my favorite book is, and I loved Watch Your Mouth, too. I need light reprieves from The Odyssey, too, so this seemed an excellent time to round out my reading of Handler’s bibliography. I’m about halfway through and enraptured by the narrative voice. It’s pretentious, as a story narrated by a precocious high school senior should be, without being cloying, and with Handler’s charming humor throughout. I love it so far and have faith that the feeling will continue. I normally hate books set in high school, but this one takes me back to my high school self — somehow, in a good way, which I don’t think I’ve ever felt before.
+ +++ ++
+- + + Literature +
+
Moving my home server to a new chassis
-I have a home server (running Unraid) that I use to backup computers, as media storage, and to run various apps. It’s mostly been cobbled together from used parts I found for cheap, and it generally followed Serverbuild’s NAS Killer 4 guide. It runs like a dream, and putting it together is one of the best decisions I’ve ever made. More recently, with streaming sites like Netflix, Hulu, etc. cracking down on password sharing, it has become my pathway to shedding some monthly subscriptions and owning my own media.
- - - -Moving my home server to a new chassis
+I have a home server (running Unraid) that I use to backup computers, as media storage, and to run various apps. It’s mostly been cobbled together from used parts I found for cheap, and it generally followed Serverbuild’s NAS Killer 4 guide. It runs like a dream, and putting it together is one of the best decisions I’ve ever made. More recently, with streaming sites like Netflix, Hulu, etc. cracking down on password sharing, it has become my pathway to shedding some monthly subscriptions and owning my own media.
+ + + +hate for the island
-I was born and raised on Long Island in a hamlet that rests along the Great South Bay.1 Known to most as a ferry town, this charming suburb lives and breathes the ocean. Most every resident has access to some kind of boat, whether through personal ownership or advantageous friendship. In the 90s, the town was voted the “friendliest town in America,” a slogan that still adorns the sign as you drive into town, by a mysterious group that awards such superlatives. That accolade, along with our yacht clubs, country clubs, lack of racial diversity, and generalized fear of anything outside the norm makes the town the near picture of 1950s suburban ideal.
- --
-
- - - Life - -
hate for the island
+I was born and raised on Long Island in a hamlet that rests along the Great South Bay.1 Known to most as a ferry town, this charming suburb lives and breathes the ocean. Most every resident has access to some kind of boat, whether through personal ownership or advantageous friendship. In the 90s, the town was voted the “friendliest town in America,” a slogan that still adorns the sign as you drive into town, by a mysterious group that awards such superlatives. That accolade, along with our yacht clubs, country clubs, lack of racial diversity, and generalized fear of anything outside the norm makes the town the near picture of 1950s suburban ideal.
+ +-
+
- + + Life + +
Media Log (August 2023)
-Movies
--
-
- Barbie - I was underwhelmed. There’s been lots of chatter, and I loved Lady Bird, but Barbie didn’t hit for me; too much Ken (to be the hundredth person to whine about it) and the ending felt unearned and thematically confused. This was more of an homage to Barbie as a product than it was an homage to womanhood, but it pretended to be the latter. -
Games
--
-
- Vampire Survivors - I originally played Vampire Survivors for my video game podcast, Pitch & Play (on hiatus but will come back!); my friend and co-host Ross recommended it to me. I was pleasantly surprised by how much I got into it given that I don’t really have nostalgia for this sort of game, but I played several hours of it and then became distracted by life. While moving this month, I was without internet for quite a while and had not hooked up my consoles (or my PC, still). To kill some time while my body recovered from lifting boxes and scrubbing surfaces, I downloaded Vampire Survivors onto my phone and went deep into it. It’s a fantastic game that I’ll come to associate with my early days in the house. -
Books
--
-
- Walk Two Moons by Sharon Creech - I read this book originally as a child in the fifth grade. I remember loving it but little else. I have been looking for a text to add to my curriculum and wanted to try Walk Two Moons out. I enjoyed reading it and was surprised by how much of it came back to me even though I am (nearly) twenty years out from reading it the first time. I do think the Native American set dressing might be problematic given that the author is not, by any account I’ve read, actually Native; the plot is also predictable, but perhaps that is because I’m an adult reading a book written for children and because I’ve read it before. I’m not sure it’s the book I’m looking for, but it’s not a bad read. -
-
-
- - - Media-Log - -
Media Log (August 2023)
+Movies
+-
+
- Barbie - I was underwhelmed. There’s been lots of chatter, and I loved Lady Bird, but Barbie didn’t hit for me; too much Ken (to be the hundredth person to whine about it) and the ending felt unearned and thematically confused. This was more of an homage to Barbie as a product than it was an homage to womanhood, but it pretended to be the latter. +
Games
+-
+
- Vampire Survivors - I originally played Vampire Survivors for my video game podcast, Pitch & Play (on hiatus but will come back!); my friend and co-host Ross recommended it to me. I was pleasantly surprised by how much I got into it given that I don’t really have nostalgia for this sort of game, but I played several hours of it and then became distracted by life. While moving this month, I was without internet for quite a while and had not hooked up my consoles (or my PC, still). To kill some time while my body recovered from lifting boxes and scrubbing surfaces, I downloaded Vampire Survivors onto my phone and went deep into it. It’s a fantastic game that I’ll come to associate with my early days in the house. +
Books
+-
+
- Walk Two Moons by Sharon Creech - I read this book originally as a child in the fifth grade. I remember loving it but little else. I have been looking for a text to add to my curriculum and wanted to try Walk Two Moons out. I enjoyed reading it and was surprised by how much of it came back to me even though I am (nearly) twenty years out from reading it the first time. I do think the Native American set dressing might be problematic given that the author is not, by any account I’ve read, actually Native; the plot is also predictable, but perhaps that is because I’m an adult reading a book written for children and because I’ve read it before. I’m not sure it’s the book I’m looking for, but it’s not a bad read. +
-
+
- + + Media-Log + +
What's This?
-Well, I have another blog.
-Welcome to cassie.land, the latest (as of writing this) web project that I’ve started and may promptly abandon.
-Here’s the truth: These past few months have shown me the impermanence of online platforms. I have quit reddit with the third-party API shutdowns, and while I am probably better off for it, it does feel like losing one of the bastions of the internet I once knew. I regret to inform that I am officially an old person on the internet; I yearn for the days of hyper-specific Geocities pages with incredibly useful information written by a thirteen year old screaming into the void (and for the days where our search engines actually directed us to that information rather than some circuitous tripe written by AI that packs in every SEO keyword without actually saying anything).
- --
-
- - - Meta - -
+ + cassie + + ink + +
+ + + + +All Posts
+ + + +What's This?
+Well, I have another blog.
+Welcome to cassie.land, the latest (as of writing this) web project that I’ve started and may promptly abandon.
+Here’s the truth: These past few months have shown me the impermanence of online platforms. I have quit reddit with the third-party API shutdowns, and while I am probably better off for it, it does feel like losing one of the bastions of the internet I once knew. I regret to inform that I am officially an old person on the internet; I yearn for the days of hyper-specific Geocities pages with incredibly useful information written by a thirteen year old screaming into the void (and for the days where our search engines actually directed us to that information rather than some circuitous tripe written by AI that packs in every SEO keyword without actually saying anything).
+ +-
+
- + + Meta + +
-
+
+
+
+
- + + First + + + + + + +
- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
- + + 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
- + + 4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
- + + 5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
- + + 6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
- + + 7 + + + + + + + + + + + + +
+ + cassie + + ink + +
+ + + + +My thirtieth birthday party, the day before my actual turn from one decade to the next, was a beautiful night. My mom, both pre-emptively staking out her territory as an Italian-American grandmother and (past but an adverb?) fulfilling regrets at never having been able to throw me a childhood party, brought too much food and snacks and love — or staying up and out past the early afternoon, which is a kind of love for us; my friends, older than me in years and with busy families and schedules, brought wisdom and comfort in growing older gracefully; and my friends closer in age drove great distances to celebrate me — or at least, with me.
+The actual day passed uneventfully, cleaning and resting from the festivities, alone and at home with Joe. As the night wore on, however, I noticed, with (something something - mixed alarm, absence, desparation, and a painful normalcy) that I hadn’t heard from my dad, and I was suddenly borne ceaselessly back into the past.
+After years of baggage and mixed-up emptions, ups and downs, I’ve entered a maintenance phase in my relationship with him: I maintain the most tenuous connection I possibly can while his mother, my grandmother, is still alive, and I have planned to sever those last vestiges when she passed. I’ve entertained fleeting fancies on what would happen when he goes — how I would find out, how I would react, if I would even bother to attend or instead seize it as an opportunity to enact my triumphant revenge by never showing up.
+And yet, and yet, despite years of receiving a call on the wrong birthday, I’m back in the second grade, at an in-school Father’s Day celebration, waiting, waiting for any sign; mixed gratitude and crushing disappointment to see my maternal grandfather in my dad’s stead; and sunk lower by every playground busy-bpdy asking why my dad was so old and having to explain that it’s not actually my perfectly hale and hearty dad, who simply did not show up. I’m back in the schoolyard waiting for him — late again — to pick us up for his agreed upon custodial visits, so late the sun starts to set and a worried teacher contacts home seeing three abandoned kids who are realizing, slowly, that they are not important to their father. I’m back at my high school graduation and not bothering to invite him because I have almost two decades of experience to know the outcome, to know it’s better than to set myself up for disappointment by expecting him to show. I’m back at my college graduation, a tremendous, back-breaking accomplishment, shocked to see him show up but wishing he hadn’t as he makes it about himself: “I’m glad to see you’re not a fuck up like me.”
+I am 30. Why now, on the cusp of starting my own family — of discussing the unsexy logistics of planned conception, (lack of sufficient) maternity leave, and childcare, do I need a call from my daddy on my birthday? Why have I not learned the lesson experience has so deeply (that isn’t the right word) taught me so many times over?
+At a parent meeting for a beloved student, I sang praises about her while admiring the original: she is, in every respect — her mannerisms, dress, energy — her mother. A little shorter and less gray, but otherwise a carbon, in the ways that matter. And as I went home that evening and reflected, I wondered what in me I would pass along — those idiosyncrasies impossible to spot within oneself that would one day leave bemused teachers, friends, family to remark the same of my child and me.
+And again, the lingering seven year old in me bubbled to the surface: what in me resembled my father — and, worse yet, what of his toxic line would seep (need a stronger verb, think like an oil spill) into another generation? Have I created enough distance to avoid his influence? Is there some latent biological evil in my genetics? And what of my traumas, my inability to move past my feelings of abandonment, would I, against my best efforts, inflict on my own?
+People say girls look for their fathers in their partners. I’ve looked for the opposite. Joe is always gentle, always patient — the kind to drop everything just to be there for a friend in need. When I asked him if I had any mannerisms he thought I might pass along, he laughed and responded with a list, paramount upon which was my passion. He recalled nights at the movie theater sitting in a mostly one-sided conversation, listening to me monologue about some esoteric music bullshit and falling in love.
+I hope for my children from me passion and devotion; that they stick wholeheartedly to that which — and who — they care about. I wish for them the softness that comes from having two parents who make them feel loved, valued, important.
+ + + + +