It Took Me a Decade to Find the Perfect Personal Website Stack – Ghost+Fathom
davidgomes.com
davidgomes.com
> I just write them in Notion, and then I copy-paste them into the Ghost editor
> every now and then I have to hack some CSS together to fix some bugs
> the theme can only be compiled with an ancient version of npm
> the code is really messy, so at some point I won’t be able to maintain it any longer
> images don’t work very well with my theme
To each their own, but to me this sounds like an absolutely terrible "website stack"
Send help pls
> So, all in all, I’m paying almost 400 euros per year to host a personal blog.
Seems...a bit much. But what do I know? I've just been using Jekyll since 2013. For a long time now Github has had first-class support for Jekyll and so I haven't even had to mess with Ruby for many years now, I usually just edit it online in the Github UI. I pay $0 a year for this service so my only cost is DNS.
Anyway, here's my blog post on it. I actually pay 20$ to AWS to host my Captain Rover server, but I have multiple web apps running.
I used the mailgun integration for mail, which involved adding a few lines to a config file and typing `ghost restart`.
Self hosting will always involve some fiddling, but I’ve fiddled less with Ghost than almost every other thing I’ve self hosted over the decades. Maybe I’m just lucky.
I use MDX to write posts. I have CI/CD set up to auto publish when I push a new post. It's a simple set up (for a developer).
I don't get why one would want to or need to pay hundreds of dollars each year to host a simple blog, especially if that person is technically inclined. There are cheaper/free options.
Even your average Squarespace/Wordpress/Wix user will pay less than 400 euros a year. This sounds like the exact opposite of "perfect" to me.
It's only free while you have no traffic. Getting a single post on the top of HN could cost you e.g. $10.
Paying $400/year to get some static html based on markdown for a personal website seems insane to me.
Fashions with things come and go, but Jekyll is still around.
Much faster now too, thanks to improvements to Jekyll and importantly Ruby!
Compile times used to be painful, especially with inclusions and data files, but now I don’t have any noticeable build time pain!
Cloud Cannon is a great service to run Jekyll on, but not free I don’t think.
I'm sure Hugo is also great for the same reason, just haven't had a chance to mess with it.
I also wish there were an easier way up make an api call to get data to use within the template.
I tried migrating to hugo for these reasons but i'm not a fan of hugo syntax and i couldn't figure out how to setup a non-blog site.
I do the same but I wish there was a easier way to make a blog post as it's still a bit fiddly. It would be great if it was as simple as sending an email or writing a message in a messaging app.
I'd bet that a side effect of paying that money is that you're significantly more likely to write posts. That would make it worth the money.
To create any static site, including blogs, I just use hugo, maybe a custom theme, edit it in any editor, including the online one at github/gitlab, once it merges/pushes the CI/CD script is just 3 lines and 2 of those deal with aws.
And of course the pricing depends on the traffic but s3 and cloudfront can handle a lot of traffic before it starts getting out of hand.
This is my blog post about how I set up my blog: https://blog.burakcankus.com/2023/04/23/getting-a-blog-runni...
But theoretically there is no such thing as a free lunch, and bandwidth costs money. Even cache hits in cloudfront generate bandwidth. A cache can't magically transfer text to your clients, it's still using transfer cost outgoing from cloudfront cache servers.
I'm no authority on this topic, but maybe because it still sparks interesting conversations.
Jekyll remains one of the most robust solutions for small projects and blogs.
[0] https://www.notion.so/help/public-pages-and-web-publishing
JUST USE WORDPRESS!
If you genuinely find it too hard to self host (and I’m banging my head against the table cos this is HN where people apparently know what they’re doing with tech, and it’s a LAMP stack ffs), then do it on Wordpress.com. Free! Easy! Simple to migrate if you do one day want to self host! No blockers to exporting your content as XML! Or CSV! Or hit up the API!
Funny old lark.
Works out approx. £57 per year.
right there
at any time you could have hit that button and spent a while poking around its immense collection of default themes and installed the "I do not like the block site editor, please give me the old editor" plugin and had a big, empty text box just begging for you to fill it with words, all the time you spent faffing about with jekyll and hugo and ghost and your custom style looking for the absolutely perfect version of the the same black text on white ground style that a zillion templates have been made of could have been spent writing blog posts instead
but I guess you gained some experience fooling around with the technologies underlying Hugo and Jekyll and maybe that was surprisingly useful in other parts of your life, and maybe that was better in the long run?
anyway, good luck putting words in that big blank text box you have finally perfected.
Understatement of the year. cPanel feels janky but it works, and works very well. OP could’ve one clicked a Wordpress installation and hammered away with the default theme (which is quite readable already).
My $20 DNS hosting comes with cPanel and I never had to lift a finger on sysadmin.
gutenberg sucks though
- Spend a lot of time finalizing the stack
- Spend a lot of time styling the new blog
- Migrate some of the posts from the old stack to the new stack
- Write a 1-2 new posts in the new blog
- Stop writing
- After a few months, I come back to writing a post and realize there are dependencies to upgrade, scripts to run, and what not. I give up for at least a year.
After 10 years of having gone into this cycle over and over again, I'm currently using the following setup:
- IA Writer -> Gitlab -> Cloudflare pages
To write a new post, I just have to create a new file in IA Writer and save it. That's all.
A bare bones shell script blog.sh converts markdown into HTML (locally on my mac), invokes git push to Gitlab. And there's a 'Pages' project in Cloudflare which listens to changes to my Gitlab repo, and just statically publishes whatever's in the 'site' directory.
I've written more posts in this new stack than ever before. And I think the best part is that I just need to 'create new file' and 'save'.
What dependencies? If it's just a matter of simple html and css, why not just run a minimal configuration of apache or nginx? Publishing from markdown is not part of your stack. It's your publishing process and independent of the hosting.
For example, I use pelican (pretty much 'what if jekyll but in python and more flexible'), and found that every time i wanted to update my site there was a problem with some unmaintained plugin not working with the latest python standard library, or similar.
It's also easy to set up what feels like good process for publishing, only to find that it wasn't as well documented or obvious as you thought the next time around. This is natural for anything semi-complicated that you only do once every 6 months, when you're really trying to get something else done (writing the damn content).
If you already know how to use it, nix is a good solution to this, as you can pin all dependencies (including languages and external tools), and they will still be there and working in a few years.
I fell in to this trap previously. Spent $4000AUD on a huge OLED tv, then when I had to move it was too big to bring so I sold it and bought a similar sized IPS tv for $900. Realised that, yes, I can see the difference between an oled and an IPS tv, but I do not enjoy using it any less. I had spent an extra $3000 and got no extra enjoyment from it.
From years 0 to 25 I kept my taste in cheese simple. Then, one day at 25 I went to a wedding and tasted a couple strong cheeses that carved a path in my neurons for the rest of my life: Epoisses, Cabrales, Stilton, Queijo Serra da Estrela.
I've been enjoying that stuff for 20 years now. Some of the cheeses are somehow expensive but nothing stupid if compared to gadgets, audiophile equipment, wine or clothing brands.
I can buy 250gr Epoisses at £8, 10$ USD, or 9.5 EUR at a couple major supermarkets in the UK. And let me tell you, all I need in life is a long run in the morning and eating Epoisses at any point in the day. That's the description of heaven to me... the rest is superfluous.
A wine connoisseur wouldn't be seen dead picking their wines from the upper mid-range section of a supermarket and would try to avoid actually drinking the stuff where possible, and I assume cheese works on the same principle. To be a true connoisseur you should probably go to an artisanal cheese maker, ask lots of questions about churning process then take a very small piece, tap it lightly to your tongue and mutter "bad mould pairing, not as well aged as the 2019 variety"
If you're a moderate audiophile then you'll end up with a system that sounds a lot better than what most people will have by default, and then you'll be happy with it and won't change it for years. Given the years of value you get out of it you're not spending that much money.
If you're a stereotypical "religious audiophile" maximalist then you'll be chasing the top of the top and buying obscenely expensive things every month or two for years and years without any perceivable improvement over what the moderate has. This can sometimes manifest as the notorious $1000 audio cables but more commonly it's like spending $3000 on some headphones that aren't really better than a $350 pair. And then doing that over and over and over.
Having it on my home computer also gives me massive storage space and ease of editing. The only cost is ~$10/yr for the .com domain. DNS hosting is free from zoneedit (they've been great the last 20 years).
How does the DNS thing work? They use a DynDNS client on your computer or what
Yes, I leave my computer on 24/7/365. The webserver/my primary desktop is on a Core2Duo build from 2007 and it still chugging along just fine.
I merge a change to master. Webhook triggers. Lambda builds the static site from a fixed version (for consistency) of Hugo (static site generator) and pushes the files to a CloudFront / S3 Website.
I can revisit my site after a year of non-maintenance and can add something without worrying about version changes breaking the site.. I don't even need any special software -- a text editor and git.
(For Rapid development, I generally run Hugo locally, but I can do a typo or link update from any computer very quickly)
https://gohugo.io/hosting-and-deployment/hosting-on-github/
Example blog from one of the popular themes: https://github.com/hugo-sid/hugo-blog-awesome/tree/main/exam...
I'm also a fan of the "only as complex as needed, and no more" approach, but part of applying that approach is admitting when problems have a level of inherent complexity that calls for tools / frameworks to help manage it. The antidote to framework bloat is not the absence of frameworks, it's applying the right amount of them in the right places.
While I agree you have to apply the right amount in the right places, the reality is most websites don’t follow this and use many multiples more than they need. Which is why the Internet is so needlessly bloated.
I host my blogs on GH pages or Netlify. Additionally, I dump the notes I want to share with the world on GH pages as well with the excellent Obsidian Github Publisher [0] Plugin. I don't really care about analytics for a personal blog though.
Works for me, and costs nothing.
[0]: https://github.com/ObsidianPublisher/obsidian-github-publish...
Any static hosting sites that provide this for free today?
I got it up and running with Podman, so no need to install and run the Docker daemon. I also fixed SQLite support [1], so no need for an additional DB server.
I analyzed available open-source web analytics tools [2] and AFAIK there is simpler solution for web analytics that doesn't involve a third party.
[1] https://github.com/milesmcc/shynet/issues/208
[2] https://blog.fidelramos.net/software/privacy-respecting-self...
In the end I just made my own from scratch and just use S3 for hosting [manual uploads, as i don't update it often]
simple HTML responsive grid, using tailwind CDN. No build steps.
https://www.stayanotherminute.com/ [yet to compress images, currently 14mb worth of images so mobile data users be warned]
As for the cost, I mean, could a site like this be run for a lot less than that? Absolutely. But if he’s happy paying those money then who cares.
It’s certainly not a setup I’d personally recommend.
So if you ignore those two, you're looking at ~20 page views a day.
$14/month for analytics on a site with that level of traffic sounds wild to me but again, it's not my money and if he's happy then that's all that matters.
Yes, and on top of that a blog is made to post articles, not to spend days tinkering on. Some people just like to make their life complicated to be able to brag about how hard it is.
Of course there is problem if these tinkerers ask everyone to value tinkering to the level that they do. But it's a perspective.
Next step is to offboard from GitHub pages and move the blog directly to Hetzner where my analytics are hosted.
A Common Lisp program generates static HTML files from handwritten HTML content. The website has minimal dynamic elements in the form of comment and subscriber forms, implemented using Common Lisp + Hunchentoot. All content is written in simple HTML, facilitated by Emacs' HTML+ mode. The CSS is basic, offering support for light and dark modes. I host the website on a virtual private server (VPS) running Debian and Nginx. The CSS and HTML layout change very rarely, so it allows me to focus on content.
This stack has proven to be stable and cost-effective, with the server handling low traffic of 1 request every 5-10 seconds or so on normal days. During occasional spikes, like when a page reaches the front page of HN, the traffic increases to about 10-20 requests per second but this is still a piece of cake for the $5/month VPS the website is running on.
"Analytics" is just a handful of make targets in a Makefile that invokes commands like zgrep, sort, uniq, etc. to filter the access logs and show me which posts are getting the most hits, which days are the busiest, etc. That's all. I'm quite happy with this stack and I think this will serve me well for the next few decades.
I self-host Ghost and Plausible Analytics (along with several other services,) on an Unraid box at home, fronted by Cloudflare, and it holds up well to load. Costs next to nothing, too, since it inherits hand-me-down parts from my main desktop PC.
I'm self hosting a family blog frontend by Cloudflare but using wordpress instead. The media seems to be a bottleneck for me and I've kept most at 480p. Family a few states away report it takes quite a long time to get anything to load except for the html.
In theory I could get up to double that with a different ISP, but my router doesn’t handle those kind of speeds.
My preference would be to do something with nginx log analysis in Loki to get a broader perspective of all traffic flowing through nginx, but this will do for now.
Some optional customization for page templates/fonts/CSS, some CI so I can build and deploy it inside of a Docker container, Matomo for analytics that respect privacy (which I already use elsewhere) and some additional web server configuration to hide anything interesting behind an additional login and I'm good. Maybe backups and uptime monitoring if I'm feeling brave, which is what most sites should also have (so copy + paste there).
All of that for under 100 euros per year (could also pay half of that if I didn't host anything else on the server), the blog has actually survived getting on the front page of HN once or twice and requires relatively little maintenance, at least less than a proper install of WordPress, due to its larger surface area.
The best thing is that it's simple enough for me to understand how it works, to be able to move it anywhere as needed and use more or less plain Markdown for writing the blog posts. Here's a quick example of a recent post: https://blog.kronis.dev/articles/ever-wanted-to-read-thousan...
Now all that's left is to find motivation to write more, but at least 90% of my time doesn't go into tinkering with custom fancy solutions, no matter how much I'd love that. Then again, nothing wrong with the alternatives either: 400 euros might be perfectly worth it for some, whereas working with static site generators or even custom CMSes would be a fun experience for others!
For me, domain registration $16.99 CAD + about $1.00 CAD/month in S3 storage and bandwidth costs ~ $29 CAD per annum. I could probably drive the hosting down to zero deploying on Github; but I'm too lazy to deal with it. And _vide infra_.
Truly though, the biggest cost to me over the years, keeping my little weblog is the time/churn created by the quest for the "Perfect Personal Website Stack." At some point, I realized that migrating from platform-to-platform comes with its own costs and "good-enough" is my new watchword. (It's just Hugo deployed to S3.)
My very first blog, from waaaaaay back in the day on free wordpress? Still up and functioning perfectly. Including the image uploads.
I should move back and just pay these dudes. https://lostinthegc.wordpress.com/2011/05/06/the-25-pc-comin...
I have settled in Hugo + Cloudflare Pages. I just write markdown, and commit it. Cloudflare does the rest.
Though I am building my own static site generator / server for my blog just for fun that I might switch to. Simple, tailored. And it's written in a way that instead of static files, it's a go app, with all my of my blog posts are embedded and the site lives in an in-memory filesystem.
Most of this was because I wanted to add webmentions.
It is good if the provided features are good and enough for you.. but if they aren't, then you are in trouble. I would like to note that Ghost is meant mostly for making content behind subscriptions, since they prioritize adding and improving their subscription features.
The content is meant to be written by hand, with some limitations.
Templating engine is limited, if you want to have some static pages. It is very difficult to generate something from custom data, other than your posts or pages. I wish Ghost had some custom key-value endpoint with their API, but instead if you want to add anything custom, it must be set to the custom configuration file, and it is very limited.
Eventually, you need to embed JSON into JS and then generate some parts of the HTML on client side, what you would instead like to do these in server side. E.g. if you would like to show for example a table with data. Or you need to use some other static site generator to build the HTML table from JSON.
Something very simple, but yet so difficult.
I liked that it was possible to use SQLite3 in production for Ghost. It worked very well and scales as well since it is mostly read operation, but they are officially dropping support for production and using only MySQL. I guess the one argument was, that sending emails for many subscribers was too much for SQLite.
There is also another good analytics service, without cookies and also fully GDPR compliant: https://plausible.io/
I just use GitHub. I just rely on the default repository view on GitHub.com. I edit in Typora on Windows or on the web interface on GitHub website.
I create a README.md and add markdown headings to the bottom or to the top (bottom if its a journal, top if it's a blog) and then when I get to 100-800 I create a new repository and repeat.
https://github.com/samsquire/ideas (2013)
https://github.com/samsquire/ideas4
https://github.com/samsquire/ideas3
- I write everything in Notion, and "publish to web"
- Cloudflare Workers API pulls Notion data and does a bit of SWR, w/ a block
- Sveltekit on Vercel grabs the Notion data, serves the pages
- Everything's up as soon as I type it in Notion!
Pros: - Free
- Low maintenance / just works
- Easy to write. I like to plop my thoughts down in short posts, rather than long bursts of well-written essays
- Renders almost all Notion blocks, so what I see is what I get
Cons: - Slow, because Notion, but I'm fine with that
Probably won't work for most people who want blazingly fast pages, or perfect static sites. I can pull the data on build and completely serve it as static, but then I have to redeploy, which only takes a few seconds but still takes me out of the flow. It fits my needs.Happy to share the code too if anyone cares!
I'll have to do a better writeup of it once it's stable and fixed. (Sorry in advance; everything is in Svelte)
There is no benefit whatsoever in me rolling my own tech unless it actually allows me to do something I can't do otherwise, and a lack of imagination has been my biggest limiting factor.
Once I saw this I also stopped trying to reimplement Django from scratch too. But, doing these custom and also abandoned own website rolling projects did teach me a lot about how Django and Pelican work!
Only $4/mo for a personal account upgrade if you want the repo to be private too.
I moved to Obsidian Publish recently for my blog - so I can keep my knowledgebase, notes, and writing all in one place. $10/mo ($8 on yearly plan).
Carrd.co premium (something like $45/year) for one-pager sites for most other uses - how many small project sites actually need more than one page?
The most time I've spent with this "stack" is reading documentation to decide to move from pages to Obsidian+Carrd.
Definitely cost me less than 400 euro of my own time.
replace wordpress with whatever open source blogging software you like.
I don't want to have a full Notion CMS but I do like the Notion UI a lot. Maybe I should look into the Notion integration stuff.
Shoutout to goatcounter, if you are looking for a cool web analytics solutiom.
Paying even half that much, as someone with development skills as described by OP, is absolutely insane to me. Is this a sponsored post?
I think for personal pages (though honestly for other stuff, too) static pages are much easier to host - you just put them on GitHub Pages / S3 + Cloudfront / CloudFlare Pages and you've got cheap and easy scalability, with almost zero passive costs.
So yeah, I prefer Hugo / Docusaurus.
Easy to configure (just python) and capable of Markdown or Jupyter notebook publishing. The latter was why I wanted it since it gives drag+drop image inserts.
Wow. I wonder what an imperfect stack looks like to OP
[0] https://github.com/surprisetalk/worstpress
It's ~50 lines of bash that builds websites. I hook it up to Cloudflare, and bam, I've got a free and easy blog written with markdown.
With that said, I know some people like Ghost, but to pay that much is nuts. I pay less than that for my homelab that runs ~20 services 24/7.
Astro as SSG, UnoCSS / TailwindCSS for CSS, DecapCMS for CMS. Everything can be hosted for free out of Netlify, auth is handled for free, I can create custom content types for any sort of page or blog or portfolio wanted. Analytics can be done with Google or any amount of paid analytics services.
I recently used that stack for the first time and created a simple portfolio (+ cv & bio) website in a single day, closely mimicking the client's previous Wordpress site which was a broken mess, with a few design tweaks.
If I spent a while figuring out how automatic image compression works, then created a template for it, I'm pretty sure I could bring down the time for creating a totally new unique website down to maybe half a day, or sprinkle in some cooler stuff like a custom interactive frontpage element or something and get it done in the original timeframe.
Edit: Stack for my own website is very similar. But instead of a CMS I write everything straight into HTML.
Now if only I ever felt like writing anything. It's been five years.
I guess I am missing analytics, but I don't use those anyway out of respect for my readers' privacy.
My blog is now artisinal HTML+CSS +JS. It’s hosted on Netlify which costs me… I dunno but some number so small I don’t care. Maybe $10/mo on the high end? Plus whatever I pay per year for a domain.
I suggested the GPL in person to one of the founders (perhaps not very nicely at the time) and eventually it happened. Not for long, but by then the founders had left and SixApart was run from their Japanese subsidiary
At times I feel tempted to do the same, but ironically enough HTML is not a particularly convenient document format.
[If you need tags imagine this is a sarcasm tag]