Starting is hard.
I’ve had this domain for a while. I’ve had ideas for posts. I’ve written drafts in various notes apps. But actually starting—actually putting something out there—that’s the hard part. The part that requires commitment, vulnerability, and the willingness to be imperfect.
There’s something paralyzing about the blank page, about the first post, about committing to actually doing the thing you’ve been thinking about doing. What if it’s not good enough? What if no one reads it? What if I run out of things to say?
But here we are. I’m starting anyway.
How This Site Works
Since I’m starting, I figured I might as well document how this site actually works. Partly for my own reference, partly because I find the technical details interesting, and partly because maybe someone else will find it useful.
Built with Astro
This site is built with Astro, a static site generator that’s become my go-to for content sites. It’s fast, simple, and perfect for blogs.
The key features I’m using:
-
Content Collections: All blog posts are markdown files in
src/content/blog/. Astro automatically reads them, validates the frontmatter, and makes them available throughout the site. No database needed—just files. -
Static Site Generation: Everything builds to static HTML, CSS, and JavaScript. No server-side rendering at runtime, which means it’s fast and cheap to host.
-
MDX Support: I can write posts in markdown, but if I need something more interactive, I can use MDX (markdown with JSX components).
The Structure
sites/labelsarehard/
├── src/
│ ├── content/
│ │ └── blog/ # All blog posts go here
│ ├── layouts/ # Base layout component
│ └── pages/ # Routes (index, blog listing, individual posts)
├── public/ # Static assets (favicon, images)
└── dist/ # Built output (generated)
When I want to add a new post, I just create a new .md file in src/content/blog/ with frontmatter:
---
title: My Post Title
description: A brief description
pubDate: 2025-12-18
author: Labels Are Hard
tags: ['tag1', 'tag2']
---
My post content...
Astro automatically picks it up, validates it, and includes it everywhere posts are listed. No manual registration, no database migrations, just files.
Deployment
The site is deployed using a setup that’s probably more complex than it needs to be, but it works for my infrastructure:
- Build: Run
pnpm buildto generate static files in thedist/directory - Serve: The static files are served by Caddy (a web server) on my home server
- Reverse Proxy: A DigitalOcean droplet running Caddy reverse-proxies requests to the home server over Tailscale (a VPN)
- SSL: Caddy automatically handles SSL certificates via Let’s Encrypt
The flow: labelsarehard.com → DigitalOcean droplet → Tailscale VPN → Home server → Static files
It’s a bit convoluted, but it means I can host multiple sites on one home server while still having them accessible publicly with proper SSL certificates. And since it’s all static files, it’s fast and doesn’t require much resources.
Why This Matters
I’m documenting this not because the technical details are particularly interesting, but because starting required making a bunch of decisions:
- What platform to use?
- How to structure content?
- Where to host it?
- How to deploy it?
Each decision point is a chance to get stuck, to research endlessly, to optimize prematurely. But at some point, you just have to pick something and go.
I picked Astro because I’ve used it before and it works well. I’m using my existing infrastructure because it’s already set up. I’m writing in markdown because it’s simple and I can focus on the content, not the formatting.
Could I optimize this? Probably. Could I use a different stack? Definitely. But the important thing isn’t having the perfect setup—it’s having a setup that lets me write and publish.
The Hard Part Was Starting
The technical part was relatively straightforward. The hard part was deciding to actually do it. To commit to writing. To put thoughts out there. To start.
But here we are. I started. And now that I’ve started, continuing feels easier. The blank page isn’t so blank anymore. The first post exists. The site works. The momentum has begun.
Starting is hard, but once you start, momentum helps. The second post is easier than the first. The third is easier than the second. And eventually, writing becomes a habit rather than a hurdle.
So if you’re thinking about starting something—a blog, a project, a conversation, whatever—just start. Pick something simple. Make it work. You can always improve it later.
The hard part is starting. Everything else is just iteration.