Jacob Vosmaer's blog

Portfolio websites

2025-08-02

I made two new portfolio websites for myself: Music and Software Projects. In this post I reflect on why and how I did this.

Why make portfolio sites

The portfolio sites I made are little more than a list of links to content hosted on commercial platforms. The music portfolio links to Soundcloud and Bandcamp, and the software portfolio links to GitHub and GitLab. Why not use those sites as the portfolios?

First of all, for each category I am using more than one hosting platform. This is not nice for people who want to get an overview of my work. Having a single list is reason enough to make a portfolio.

Besides unifying my content into single lists, there are also the issues of filtering and presentation. GitHub makes a big mess of the "Repositories" list because it mixes stuff I made with stuff I contributed to. I only want to showcase the stuff I made, so I need to filter. My portfolio is that filter.

Even if the content platforms were already filtered, I don't like the way they present the projects. The information density is too low. By making my own lists I can control how I present the work.

Finally there is the issue of platform obsolescence. Something may happen in the future that makes me want to pull my content from one of these platforms. How will people find my stuff then? I need to own the portfolio lists.

How did I make these sites

At first I got stuck in the trap of wanting to make these sites "nice". This throws up "requirements" that derail the work. For example, it would be "nice" to host the Git repositories of my software projects myself. How do I do that? Should the repositories be cloneable or also browsable? Do I stand up a cloud server running CGit or something like that?

With the music portfolio, I felt that my releases ought to have album art. So I better come up with album art for all my songs first, before I can put them in a portfolio.

After a while I realized that perfect must not be the enemy of good. Having a simple portfolio is better than no portfolio. I re-used the house style of my blog and created a simple site generator for each portfolio using shell and Awk. The lists are stored in a text file. (Of course I wondered if I should put them in a proper database, yet another distraction.)

This is what the text file projects looks like for the software portfolio:

https://github.com/jacobvosmaer/fz1
Construct Casio FZ-1 disk images
C

https://github.com/jacobvosmaer/dwvw
Standalone DWVW audio codec
C

https://github.com/jacobvosmaer/yaforth
Forth-like programming language
C

The site generator uses echo statements to print a header and footer around a dynamic part which is the list. The list is generated by this Awk code:

awk '
BEGIN { RS=""; FS="\n" }
{
  link=$1; desc=$2; lang=$3
  title=link
  sub(".*/", "", title)
  printf "<a href=\"%s\">%s</a> &ndash; "%s &ndash;" \
    " <small>%s</small><br>", link, title, desc, lang
}
' projects

The resulting HTML looks like this in my browser:

Screenshot of fragment of my software portfolio site

The generator code and the list are in a Git repository so I can make changes with confidence: Git gives me an undo function.

Deployment

I am using my usual combination of S3, Cloudfront and s3cmd sync --cf-invalidate to deploy these sites. I ran into a funny problem with Cloudfront and s3cmd because Cloudfront has a new wizard for setting up static S3 hosting with HTTPS (great!) which uses an S3 URL pattern that s3cmd does not understand out of the box (not great!). I have the following s3cmd config because all my S3 buckets are in eu-west-1:

host_bucket = %(bucket)s.s3-eu-west-1.amazonaws.com

But for some reason the new Cloudfront wizard uses URL's that end in s3.eu-west-1.amazonaws.com. See the difference? I "fixed" this by manually editing the new Cloudfront configurations to use the URL scheme s3cmd expects.

I also had to manually set "Default root object" to index.html in Cloudfront. Otherwise it does not handle URL's ending in /.

This all took some fidgeting but the end result works very well for me, and my experience is that once deploying a static site like this works it keeps working.

Conclusion

I'm glad I did this and I hope the portfolios will be helpful to people who kindly take an interest in my work. As usual the key to getting the job done was to whittle down the requirements to something small enough to build quickly.

If you make stuff yourself you should consider making your own portfolio too!

IndexContact