Mort O'Della

Badges

# How This Blog Works

Blog Mort O'Della 4 min read
Table of Contents

For the curious, here’s how I’m running this website.

Framework

To build the site, I’m using Astro.

  1. I can keep writing posts in markdown. This was mandatory.
  2. React-like templating. I really like Astro’s templating style, especially how it lets you add style and script tags that are scoped to specific components, and it lets you write those in Sass and Typescript!
  3. Dynamic islands seemed like a sexy way to add interactivity without getting in the way of the mostly static blog content. I thought maybe I’d rewrite Turt in React using this, but in practice I haven’t used it at all!
  4. I didn’t pick it for this but the optimizations Astro does at build-time are really nice.
  5. A lot of other cool modular features like an RSS feed and link previews.

I wanted to keep everything static just since adding a server to the mix is an extra component to worry about, but I do wish I could track viewcounts or add a guestbook. I’ve seen people reccomend Umami for self-hosted analytics, but if I’m doing that I might as well just self-host a proper server. Astro has adapters for on-demand rendering so if hardware costs come back down after the AI bubble pops and I buy a house and I build the home lab of my dreams maybe I’ll take that route.

I will say I spent a lot of time teaching myself all the ways that Astro renders individual pages vs. content collections, so there’s a bit of a learning curve to it especially if you’re setting it up raw without a theme.

Theme

I’m using an Astro theme called MultiTerm, which implemented a bunch of nice features like search and theme switching, so it was great to not have to figure out how to do that stuff. I have and will continue to modify it heavily though because it isn’t nearly busy enough. I crave a Geocities level of visual loudness. The other thing is it uses Tailwinds which is, on one hand, very convenient to use, but on the other hand Tailwinds is designed to be mobile-first and it makes all of the content just so big and far apart that it drives me crazy. I’ve been doing a lot of fiddly work just trying to squeeze more content onto each page.

Hosting

This is a Neocities page! For some reason I was under the impression for the longest time that Neocities was some kind of CMS with a WYSIWYG editor and not just like simple web hosting? Anyway, after actually looking into it, and being won over by Neocities’ light social networking functionality and CLI, I moved everything over to Neocities. Another thing was that I was a bit concerned about hosting multimedia through GitLab Pages since they have a 10 GB storage limit across all your repos, and its $5/10 GB after that. Neocities, on the other hand, gives you 50 GB if you subscribe (also $5), and I’d much rather support Neocities than GitLab. If I do end up hitting GitLab’s cap by committing too many MP3s or something, I’ll figure out a way to upload that sort of stuff separately from the main website content.

The last iteration of this blog was hosted in GitHub Pages, but I moved away from GitHub a) for anonymity reasons since that was associated with my business persona and b) out of general anti-Microsoft BDS sentiment. I moved to GitLab which also has its own Pages. While I’m not using GitLab Pages for hosting anymore, I’m still using GitLab to back up the git repository, for the project management stuff (I like using issues as a TODO list for future posts/features), and for the CI/CD pipelines. Here’s what my pipeline for building + deploying to Neocities looks like:

.gitlab-ci.yml
astro-build:
image: node:22.14.0
stage: build
script:
- npm ci
- npm run build
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
artifacts:
paths:
- public/
deploy-neocities:
image: ruby:latest
resource_group: deploy # only one "deploy" job can run at once!
needs:
- astro-build
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
stage: deploy
script:
- gem install neocities
- neocities push --prune ./public

This requires that you add your sitename and API key as CI/CD variables, and voilá:

Terminal window
NEOCITIES_API_KEY=**********
NEOCITIES_SITENAME=mortodella

More Posts