I've always loved the internet. I can remember the moment I fell in love with it — watching the scene in the original Mission Impossible movie when Ethan Hunt (Tom Cruise) is sending an email to Max (Vanessa Redgrave) in his hotel room. Such a simple thing in today's world, yet it blew my mind back then that that was possible.
Since then I've always tinkered with web technologies, and my personal site has taken many forms over the years. But I am most happy with this iteration. I wanted to create an online home that represents all my interests — as a musician, web developer, tinkerer, etc. — where people can come to find music but also learn about my web development journey, and where folks interested in my dev projects could hear a little Bach as well.
I wanted a clean, modern, sophisticated design, but that is also inviting. The emphasis is on the content, which is also why I've spent a good deal of time making sure the performance is lightning fast.
I also wanted to have everything in one place. I was using Gumroad to sell some scores, but I wanted the new site to have everything right there.
The backend is a Node.js / Express server wtih Postgres that's managed in Docker containers. I produce all the scores with Lilypond. I wrote an internal Python CLI to generate the pdfs programatically, create the sample images (with "sample copy" watermark), upload them to my self-hosted S3 storage, and sync with the Stripe API.
After a successful purchase, the scores are watermarked with the buyer's information for licensing, before being uploaded to my S3 storage. Presigned urls are then generated and sent with SendGrid. I use PostgreSQL to maintain my own records of purchases and also to log submissions from the contact page form — just in case something goes wrong with the transactional emails.
I also manage DB backups using a
crontabbed Python script.