How this site works now
I moved this site over to Eleventy[1], so I want to provide an update to the many posts I’ve written on the subject in the past. This posts assumes you’ve followed the basic Getting Started guide on the Eleventy website to install the dependencies required.
Directory structure
Most everything, for me, lives in the src folder.
└── src/
├── _includes/
├── books/
├── css/
├── fonts/
├── games/
├── posts/
├── weeknotes/
├── about.md
├── archive.md
├── books.md
├── games.md
└── index.md
The markdown files (about.md, archive.md, books.md, games.md, and index.md) are pages on the site. Most of them display a collection of posts, like so (for archive.md):
{% for yearGroup in collections.blogYear %}
<h2 class="year">{{ yearGroup.year }}</h2>
{% for post in yearGroup.posts %}
<article>
<ul>
<li class="date">{{ post.date | isoDate }}</li>
<li class="title">
<a href="{{ post.url }}">{{ post.data.title }}</a>
<div class="summary">{{ post.data.summary }}</div>
</li>
</ul>
</article>
{% endfor %}
{% endfor %}
I’m using a custom collection (blogYear) here, which pulls anything from the posts and weeknotes directories and breaks them up into sections by year.
The _includes, fonts, and css folders hold template and theme files. I’m assuming most people will use an off-the-shelf theme; I made my own and this is where the files for it live.
That leaves the books, games, posts, and weeknotes folders, which all do what they say on the tin. Inside of each of those folders is a global data file in json format that adds some frontmatter to each item. Here’s the global data file for the posts folder, for example (src/posts/posts.json):
{
"layout": "layouts/post.njk",
"permalink": "/{{ title | slugify }}/",
"tags": ["posts", "blog"]
}
I really love this feature of Eleventy. When I used Hugo, most of what I put in the frontmatter was repeated across every file. This saves me some time, and I can always override it in the posts themselves (like to use a custom layout for a post; Anh does this sometimes and it’s very cool).
Eleventy uses tags for building collections. Right now, my posts directory and weeknotes directories go into the blog collection, which I then sort by year for my archive pages. The games and books directories have their own separate collections so that they can have separate pages. Hugo used tags as most people would expect (a post might be tagged #meta or #life or something along those lines). I still have all that data, but I’m not currently using it in any way. One day, maybe.
Media tracking
The books and games folders are my way of tracking the media I consume without using shit like GoodReads. I only started doing this recently, so there’s not a lot of history, but it’s a pretty easily maintainable system that I hope I’ll sustain.
A file in the books folder might look something like this (american-born-chinese.md):
---
draft: false
title: American Born Chinese
author: Gene Luen Yang
isbn: 9780312384487
release: 2006
cover: https://cdn.cassie.ink/images/books/americanbornchinese.jpg
rating: ★★★
status: re-read
started: 2025-11-26
date: 2025-11-26
summary: re-read it because I assigned it to my college students
---
From [my week notes](https://cassie.ink/week-notes/39/):
> I first read this nine years ago when I took the class [that I'm teaching right now]; I remember enjoying it and finding the twist novel. This time around, I flew through and was surprised by how much of it I remembered — in my head, it was a lot longer and more complicated. It’s a book I would have considered for my middle school curriculum if I was staying at the grade level.
I'd recommend *American Born Chinese* to anyone who likes middle grades coming of age stories that blend in classic mythology and folktales.
I can type a review or any thoughts I have about the book in the content of the file. Right now, I’m manually including mentions of the book in my week notes, but I’m hoping to eventually transition to the interlinker plugin to automate this. I do a lot of underlining of quotes I love (or have thoughts about) in my physical books; I might start collecting them on these pages, too. The resulting page looks like this.
The games folder works similarly (see pokopia.md):
---
draft: false
title: Pokémon Pokopia
publisher: Omega Force & Game Freak
igdbid: 366893
release: 2026-03-05
genre: sandbox
cover: https://cdn.cassie.ink/images/games/pokopia.jpg
platform: Nintendo Switch 2
rating: ★★★★
trophies:
status: Finished (Main Story)
playtime:
started: 2026-04-05
date: 2026-04-15
summary:
---
I probably could automate some of this frontmatter with an Obsidian plugin, but I don’t really care.
When I finish a book or a game, I fill in the date field. For the collection array, it first checks for a date (i.e. is the game finished or not); if not, it uses the started data instead to sort.
Writing
I write my posts in either Obsidian or VSCodium. For Obsidian, my vault is just the directory (cassiedotink) on my PC, which I synchronize with the obsidian-git plugin on desktop. On mobile, I use the Obsidian mobile app and GitSync instead (obsidian-git reports that it’s unstable on mobile). GitSync automatically synchronizes when I open and close the Obsidian app. This all is pretty seamless. I can write from anywhere, and there’s very little friction between an idea and getting it on (proverbial) paper.
I use templates in Obsidian to automatically populate frontmatter in my files – there’s a template for games, books, posts, and week notes, to save me a little time. I create a markdown file in the appropriate folder, insert the appropriate template, and then I’m off to write. I use draft: true in the frontmatter if a post isn’t quite finished yet, and I prefix the markdown files in the posts folder with an ISO date to keep them in order (for me) (e.g. 2025-07-18 Climbing my personal Mount Doom.md).
Pushing changes and building the site
All changes are synchronized to my repo on source.tube, a Forgejo instance from omg.lol. Runners on Forgejo work mostly the same as Github or similar. Once I push changes to master[2], this build script triggers:
name: 11ty build
run-name: deploy cassie.ink
on: [push]
jobs:
build_deploy:
runs-on: docker
permissions:
contents: write
steps:
- name: Checkout last commit of repo
uses: actions/checkout@v4
- name: Install node.js
uses: actions/setup-node@v4
with:
node-version: 20
- name: Restore or install dependencies
run: npm ci
- name: Build with 11ty
run: npx @11ty/eleventy
- name: Deploy via Rsync
uses: https://github.com/Burnett01/rsync-deployments@v8
with:
switches: -avzr --delete
path: "public/"
remote_path: "/home/public/"
remote_host: $
remote_user: $
remote_key: $
This script…
- Installs important dependencies
- Builds the site
- Deploys the site with SSH with rsync to my host (NearlyFreeSpeech)
This takes about 20 seconds. That means, in less than a minute, I can publish a post from anywhere (either on my PC, laptop, or phone) and update the site.
Future changes
Media uploads: Right now, I upload my media (images, mostly) to a Bunny storage zone. There’s probably a way to store these files in a local directory (that’s excluded with .gitignore so I’m not clogging up source.tube) that automatically synchronizes with the storage zone, but for now, uploading via FTP or the web interface is fine with me.
Theme tweaks: I built the site’s theme myself and am basically always tweaking it. I didn’t address theming much because, again, I imagine most people will just use one of the many that great people have released for free and because anything I write will be quickly outdated.
Diving into Eleventy more! One of the motivating factors in switching from Hugo to Eleventy is the vast community online for Eleventy and the really cool plugins out there. I’ve already learned so much in building the site myself and getting it to parity with my Hugo setup; I’m excited to extend it even more as time goes on.
Endnotes
This setup works really well for me. I’ve finally reached pretty much my dream workflow. If you’re reading this and it sounds intimidating, give it a try! A few years ago, I knew nothing about git or static site generators. I learned through trial and error and the resources others have shared (like this one). If you have any questions, feel free to reach out to me.
Eleventy is apparently rebranding to “Build Awesome” soon, but I think that name is worse, so I’ll continue referring to it as Eleventy (as I think most of the community plans). ↩︎
I think the current practice is to use
maininstead ofmaster. I am a git newbie and didn’t know this and don’t know how to rename it (it’s probably simple). ↩︎