SouthpawStrings.com is a practice website made for left-handed guitarists first. It has interactive music theory tools, user accounts, playlists, sheet music, uploaded practice audio, and the Desk (a workspace where tools open as windows you can drag and arrange). It also has ways for supporters to help fund it. It is live, public, and gaining real users.
I wrote the application myself, using well-known programming frameworks. It is not put together from a website builder, a content management system or a pile of plugins. I designed the product, how its data is stored, what gets encrypted, how it is packaged and hosted, its network rules, and how new versions are released. Building it this way keeps the design easy to understand. It also leaves me free to shape the product around what left-handed guitarists actually need.
It is entirely a personal project. I built it outside work hours, on my own equipment, domains, accounts, licences and hosting. No employer or customer code, data, systems, documentation or confidential information was used anywhere in it.
This page explains what I built and how. It shows a project built to order, kept secure and well documented, and run to the standard of a professional service.
The product
From resource hub to practice platform
SouthpawStrings brings left-handed theory, your own practice material and real playback tools together in one place. You can go from learning an idea to rehearsing it with a song.
The stack
Modern, typed, maintainable
The site is built with Next.js 16 and React 19, two widely used frameworks for building web applications. All of the code is written in TypeScript, which checks that data has the expected shape, from the screen down to the database. Styling uses Tailwind CSS and shadcn/ui components.
Data lives in a PostgreSQL 16 database. The code reaches it through Prisma 7, a library that turns database tables into typed code. Every change to the database’s structure is a numbered script that only moves forward. CloudNativePG runs the live database. It records every change continuously and takes a full backup each day, so I can restore the data to any point in time. Separate exports and offsite copies give a second way back. I have practised restoring the data, so I know it works.
Auth.js handles sign-in. People can use an email and password, or sign in with Google, Apple, Microsoft or Facebook. Each provider gets the protections it supports. These include PKCE, which stops a stolen sign-in code being used by someone else. Apple’s sign-in secret is created fresh from its signing key when needed, rather than stored for a long time.
The site is packaged as locked-down Docker containers (self-contained bundles of the app and everything it needs). These run on Kubernetes, software that starts, restarts and scales those containers. Cloudflare sits between the site and the internet. A self-hosted pipeline tests each change and releases it to development automatically. I use k6 to load-test the site with short checks, gradual ramps, sudden spikes and long sustained runs. That way I know its capacity rather than guessing.
Security by design
Built secure, not patched secure
I built security in from the first line of code. Later I ran a full security review of the code and fixed every significant finding.
Operations
Run to production standards
A website is only as good as the way it is run. I run SouthpawStrings the way a company would run a professional service.
Documentation
Documented like it matters
Engineers love documentation, and businesses need it. A system nobody wrote down is a risk. It can’t be audited, it can’t be handed over, and it depends entirely on whoever built it. So I document SouthpawStrings the way a commercial system should be. Every operating procedure is written down, stored with the code, and kept up to date as the site changes.
That includes a release guide, database safety procedures, and a setup guide for every outside service the site uses. It also includes the security review and its fixes, an overview of how the system fits together, and a formal handover document. Another engineer could pick the site up from scratch and run it.
That habit isn’t specific to this project. Accurate documentation, guides anyone can follow, and a handover pack stop any system depending on one person. If it isn’t documented, it isn’t finished.
Still moving
What’s been shipping lately
The site has had more than 175 numbered releases. It still changes in small, tested steps, and each release has a changelog entry that records why. I moved the core of the practice Desk into its own library, @denley/desk-engine, and the site now uses that library. Since then the whole site has moved onto the Desk. Windows can now fill the whole screen and remember the size a player chose. They also move visibly when they close, minimise, restore and roll up.
September added a tuning and capo system and a choice of note names: letters, Do Re Mi, or German notation. It also added a realistic fretboard drawn by the graphics card, and English, Spanish, German and Japanese in the language switcher. A person still approves every live release, and each one names the exact build it uses.
Much of that polish came from watching real people use it and not settling for a first attempt. I rebuilt the language switcher after its first version tested badly. I fixed the snap previews so they show exactly where a window will land. When the Desk rearranges windows, it now keeps the rows a player can see. The standard is simple: it has to feel right, not just work.
How it was delivered
I built SouthpawStrings with AI tools, but under my direction. AI helped me move faster on code, documentation and testing. I reviewed the work, set its limits, and owned every decision. I apply the same rule to all my professional work. AI speeds things up. It never replaces engineering judgement, security limits or accountability.
Professional relevance
What this demonstrates
SouthpawStrings is a music project, not an IT business. But it is honest evidence of how I work. I gave a website for guitarists encrypted data, two-factor sign-in, a network that trusts nothing by default, and a careful release process. That says something about the standards I apply. Documentation, privacy, security, automated releases, good design and maintainable code matter to me, even on a hobby project.