Static Sites With Bash
After going through a bunch of static site generators (pelican, hugo, vite), I decided to roll my own. If you are more of the ‘show me the code’ kinda guy, here you go.
Text formatting
I chose to write in markdown, and convert to html with lowdown.
Directory structure
I host my site on GitHub pages, so docs/
has to be the
entry point. Markdown formatted posts go into posts/
, get
converted into html, and end up in docs/index.html
,
something like this:
posts=$(ls -t ./posts) # chronological order!
for f in $posts; do
file="./posts/"$f # `ls` mangled our file paths
echo "generating post $file"
html=$(lowdown "$file")
echo -e "html" >> docs/index.html
done
Assets
Most static site generators recommend dropping image assets into the site source itself. That does have it’s merits, but I prefer hosting images separately:
# strip file extension
ext="${1##*.}"
# generate a random file name
id=$( cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 2 | head -n 1 )
id="$id.$ext"
# copy to my file host
scp -P 443 "$1" emerald:files/"$id"
echo "https://u.peppe.rs/$id"
Templating
generate.sh
brings the above bits and pieces together (with some extra cruft to
avoid javascript). It uses sed
to produce nice titles from
the file names (removes underscores, title-case), and
date(1)
to add the date to each post listing!
I'm Akshay, programmer and pixel-artist. I write open-source stuff. I also design fonts: scientifica, curie.
Reach out at oppili@irc.rizon.net.