Using Hugo + Netlify
This site has been through several iterations, hosting providers, and tools. For a while now, I’ve been happy with using Hugo as a static site generator. This gets me plain HTML and a lot more flexibility with how the hosting actually works.
At my day job, I help operate the corporate cloud with lots of VMs, and lots of complexity. When I’m running stuff for myself, I’d rather maximize simplicity This doesn’t just apply at home – it just applies so much more so when using the limited time I have for myself. .
After sprucing up my own site, I decided to review how I was hosting things. I’ve considered something like IPFS, but then I’d need to setup/manage a few servers running the IPFS daemon, an ipfs web gateway, pipelines to publish – so much yak shaving Don’t get me wrong, IPFS is really neat and I think it is something that should exist, I’m just not ready to plunk down my time into that rabbit hole – yet! . I just want to host a couple HTML files!
Instead, I’ve gone with Netlify since they handle all the complexity for me. As an added bonus, they’re free for my usage tier. I don’t have analytics right now, but they do offer a tool I might pay for their analytics as a means to pay for what I use. I don’t get enough traffic to justify their $45 dollar cost. that uses the data from their CDN for tracking instead of modifying the site.
I don’t even need to write any deployment code either. I just hooked it up to this site’s github repo and they took care of the rest. To deploy, I just commit and push my changes to master – it doesn’t get much simpler than that.
This all should reduce the friction of writing. To that end, I’ve made a simple
script that’s in my repo to make new articles easier. One of the things I don’t
like about the standard hugo new post/title
is that it creates the content
file without the date as a prefix. I find that prefixing things with the date
makes it easier for me, since I don’t need to make such pithy titles and then
my files are listed in order.
#!/usr/bin/env ruby
fail 'an argument is required' unless ARGV.length >= 1
type, title = ARGV.join(' ').split('/')
title.gsub!(/[^[A-Za-z0-9]]+/, '-')
name = [
Time.now.strftime("%Y-%m-%d"),
title,
].join('-')
fail "file already exists" if File.file?("content/#{type}/#{name}.md")
if system("hugo new #{type}/#{title}.md")
if File.rename("content/#{type}/#{title}.md", "content/#{type}/#{name}.md")
exec("nvim content/#{type}/#{name}.md")
end
end
It probably could use a few variables and handle errors a bit better, but that
is kind of like work. I keep it as ./bin/create
which means I just
execute
I mostly write go and keep the compiled binaries in a
./bin
directory. I’ve added it to my $PATH
so I can have locally scoped
scripts/binaries.
create post/something clever
. This saves me
the extra mileage on my fingers to generate the date prefix and removes just a
little bit more friction from writing.