btw is an open source personal website and blog builder, positioned as a Medium alternative, that lets a writer publish a personal blog in minutes either through the hosted service at btw.so or by self-hosting the GPL-3.0 codebase.
What it is
btw is a JavaScript web application published under the GPL-3.0 licence, with a hosted instance at btw.so and a self-hostable version in the repository. It presents itself as an open source personal website builder and carries the topics blog-platform, medium, no-code, note-taking, notes-app, personal-blog and website-builder, which places it in the same space as hosted publishing platforms and lightweight note-to-website tools. Public blogs built with it include deeptichopra.com and siddg.com. The repository has drawn 1257 stars and 102 forks, with 15 open issues at the time of the recorded data.
The concrete problem it solves is ownership of a personal publishing destination. On Medium, a writer's work lives inside a platform the writer does not control; btw instead produces a personal blog at a slug or domain the writer chooses, and the site can be run on the writer's own infrastructure. Someone who only wants to write can sign up at btw.so and use it without installing anything, while someone who wants full control can run the same software themselves with Docker. The thing it replaces in practice is a hosted blogging account, not a static site generator: the project ships an editor, a database-backed publishing flow and login, so the writer gets a working blog rather than a template to assemble.
Key capabilities
- Hosted option: sign up at btw.so and use btw without installing anything.
- Self-hosted option: run the open source version with Docker and docker-compose.
- Built-in editor: after
docker-compose -f docker-compose.dev.yml up and login at localhost:9000, the writer starts writing; published articles appear at localhost:9222?domain=.
- OTP login: set an optional 6 digit
ADMIN_OTP to put the writer behind OTP login, which is turned off by default; SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASS and SMTP_FROM support emailing those OTPs.
- Image uploads in the editor through S3-compatible storage, configured with
S3_ENDPOINT, REACT_APP_S3_ENDPOINT, S3_BUCKET, S3_KEY and S3_SECRET.
- Environment-driven configuration in
deploy/docker-compose.dev.yml, where ADMIN_EMAIL and ADMIN_SLUG are the only mandatory fields and the database is automatically configured on first setup.
- Personal blog and website building aimed at no-code writers, per the blog-platform, no-code, personal-blog and website-builder topics.
Who uses it and how
- Individual writers who want a personal blog rather than a profile on someone else's platform, as shown by the published examples deeptichopra.com and siddg.com.
- Writers who do not want to run infrastructure: they sign up at btw.so and skip installation entirely, which is the shortest path the project offers.
- Self-hosters who already run Docker and a working Postgres instance, plus SMTP credentials (mailgun is the README's example) for login email.
- Writers who want the publishing account guarded: setting
ADMIN_OTP and SMTP credentials puts the editor behind OTP login instead of open access.
- Developers working locally: they run the compose file from the
deploy folder, log in on port 9000, and preview published articles on port 9222.
Getting started
The fastest route is to sign up at btw.so and use the hosted version with no installation. To self-host, set ADMIN_EMAIL and ADMIN_SLUG in deploy/docker-compose.dev.yml, then run docker-compose -f docker-compose.dev.yml up from the deploy folder and visit localhost:9000 to log in and write.
How it compares
The project describes itself directly as an open source Medium alternative, so the comparison the facts support is with Medium: btw is GPL-3.0 and can be self-hosted, which means the blog, its content and its database can sit on infrastructure the writer controls, while Medium is a hosted service where publishing happens inside the platform. The cost model differs accordingly, since self-hosters pay for their own Postgres, storage and SMTP rather than a platform subscription. The facts in this registry name no other comparable tool, so Medium is the only point of contrast they support.
When to use it — and when not to
A self-hoster must operate Docker with docker-compose, a working Postgres instance and SMTP credentials, and must change the default SECRET; image uploads in the editor additionally require S3-compatible storage, so the blog is not fully functional without optional infrastructure. Anyone unwilling to run a database and mail setup should use the hosted btw.so instance instead, and anyone who wants a static, database-free blog should look elsewhere. The honest weaknesses are visible in the repository itself: the README lists documentation, contributing guidelines, a feature roadmap, simplified development setup, a sample cloud deployment and custom domain setup instructions under "Coming next", so much of the operational guidance a self-hoster would want does not exist yet, and the GPL-3.0 licence imposes copyleft obligations on redistribution.