Hey, I'm Benjamin Mayanja. I build Soma, a learning and publishing platform that treats reading like thinking on paper. Private by default, public when you choose, and it runs on infra you own.
Every publishing tool I tried forced the same trade. Blogging platforms push you to perform for an audience before you've understood the topic yourself. Note-taking apps keep your thinking trapped in proprietary clouds or fragile sync setups. You either publish too early or you never ship at all.
So I stopped shopping for tools and started building one. Soma (Luganda: to read, study, learn) puts the private notebook, the editorial reading experience, and the publish button in one place. Draft the way you would on paper, flip one toggle, and the same page is on the public web.
Owning the loop
Owning the loop mattered more than any feature. Fork the repo, import it into Vercel, add one password, click Add on the Turso card, deploy. Tables initialize on their own, and pulling my updates later never touches your words, because your writing lives in your database, never in git.
Your notes, highlights, and publishing toggles sit in your own Turso edge SQLite behind one password you invent. There's no Soma cloud holding your writing hostage, which means my fixes can never overwrite a single sentence of yours.
Three pieces, one loop
Reading a chapter feels like progress. Then someone asks you to explain it a week later and you say, uh, it was about types. Nothing stuck.
Soma is where the learning lives. You write in markdown, drop a Mermaid diagram next to KaTeX math, and add a 3D scene where a picture won't do. Select any paragraph and the margin AI explains, challenges, or simplifies it. Notes stay private until you flip one toggle, and every word sits in your own Turso database. Point a coding agent at the repo and it drafts content too, staged private until you say otherwise. The repo is github.com/Essomero/soma. Fork it, import it into Vercel, add one password, and you're running.
Soma Labs is where you find out whether you actually know it. Each lesson turns into a drill. A failing test, a function you write, then a green check when your version behaves like the real one. Reading about generics is easy. Writing them until the test passes is the part that sticks. The drills live at github.com/Essomero/soma-labs.
Son is its own thing. It's a personal speech platform. Pick a role, talk to it in the browser, and hear it answer, with barge-in when you cut in. It reads anything you paste out loud and saves the audio as MP3. It dictates your speech straight into whatever box has the cursor. It tags a folder of podcast episodes or an album in one pass. Speech-to-text and text-to-speech are both swappable, from local models to cloud ones, so the whole voice path can run on your machine. Soma borrows it for one job: speaking your oral exam questions. I bundled it here because that's a good use case, not because either repo needs the other. The repo is github.com/Essomero/son.
Three repos, one loop. Read it in Soma, drill it in Soma Labs, explain it to Son. When all three feel easy, you know it.
Try it: https://soma.mayanja.dev Crossposted from soma.mayanja.dev/featured/why-i-built-soma. This piece first appeared there.