State of bahá'í song project (August 2025)

01 Intro

bahá’í song project offers a growing collection of over 200 Bahá’í-inspired songs, with lyrics, chords, and videos. The bahá’í song project YouTube channel has 4500 subscribers and bahaisongproject.com reaches 3000 users every month. The current architecture for the website evolved from my experimentation with new technologies and leveraging free-tier services. I often say I’ll re-architect and refactor everything someday—but that day has yet to come.

02 Current Architecture

The song sheets containing ChordPro files with lyrics and chords live in this public repository. On each push to the repo I build and publish the song sheet PDFs. The song data, such as titles, artists, tags, languages and texts the song is based are stored in a Postgres database.

I expose the song data with a GraphQL API. I finished the first version of the GraphQL API in early 2019. At the time i was nearing the end of my studies in computer science, but doing more machine learning research than software engineering. GraphQL was very hyped-up at the time, and so it happened that the first API I’ve ever built was a GraphQL API.

I generate bahaisongproject.com as a static website using the GraphQL endpoint. This repository is also public. The only dynamic element is search, which I added with Algolia. I additionally use the GraphQL endpoint in a script that I run manually when creating the song sheets to add song data to the song sheet. I do this so that I only have to maintain the song data in one place, the database.

03 Current Pain Points

I frequently get messages with corrections or submissions of new songs. Currently, to add or update a song, I need to spin up Prisma Studio locally. When I add a song, I need to update multiple tables separately. This is a lot better than directly interacting with the database, but still cumbersome. This means that fixes and new song submissions are often delayed. Additionally, I create a song sheet in ChordPro. I link the song sheet to the song data via the slug of the song title which also serves as file name of the song sheet. When the song data changes in the database, I then run a local script to update the song sheets and push them, triggering another build. I also need to manually trigger a rebuild of the website to include the new or corrected data. These are too many steps. I spend more time thinking about the steps I need to take, than with doing the actual work of adding or correcting song data.

Berlin 28 August 2025