Platforms control your audience. Payment processors control your revenue. Bits gives you both back.
What you get:
- Subscriptions, one-time purchases, digital downloads
- Video hosting and delivery
- Your data, your domain, your rules
- Permissive content policies for persecuted creators
Why it works:
- Self-host on a $5/month VPS or use managed hosting
- Single binary deployment - no complex setup
- Built with care to minimize resource usage and maximize reliability
- Open source - audit the code, modify what you need, contribute back
The model: Like WordPress.org - free to self-host, managed option available. You’re never locked in.
Current state: Active development. Your funding accelerates delivery.
devenv upTo get our *.test URLs to work takes some effort with DNS.
drill bits.test | awk '/^bits/ { print $1 "\t" $5 }'| Host | Address |
|---|---|
| bits.test. | 127.0.0.1 |
cat /etc/resolver/testThe marketing site and “catch-all” homepage where we have no realm aren’t a priority so will return non-200 status codes.
urls=(
# These will work, provided you've applied the seeds in `bits.dev.realm`.
http://localhost:3000
https://bits.page.test
https://charlie.bits.page.test
https://charlie.bits.page.test
https://jcf.bits.page.test
)
for url in $urls; do
http_code="$(curl --silent --output /dev/null --write-out "%{http_code}" "$url")"
if [ "$http_code" -eq 200 ]; then
echo "✅ $url"
else
echo "❌ $url ($http_code)"
fi
doneAnd with a non-existent tenant, we expect a 404 response:
url="https://foo.bits.page.test"
http_code="$(curl --silent --output /dev/null --write-out "%{http_code}" "$url")"
if [ "$http_code" -eq 404 ]; then
echo "✅ $url"
else
echo "❌ $url ($http_code)"
fi- Get the message out
- Python-style environment variables
- Mission over SaaS startup playbook
- CI can wait
- Clojure over Rust
- Vanilla JS over ClojureScript for bits.js
- Crypto-Shredding for GDPR Compliance
- Datahike vs Datomic for distributed coordination
Available recipes:
[build]
build # Build an AOT-compiled uberjar
build-datomic # Build Datomic Pro output
docker-build tag="bits:latest" # Build the Docker image
docker-run tag="bits:latest" *args # Run the Docker image against the local devenv database
[dev]
cluster-certs # Generate cluster keystores
css # Regenerate Tailwind CSS from template
fmt # Format project files
lint # Run lints
market # Run the marketing site
mkcert # Create self-signed SSL certificates via mkcert
nrepl *args
setup # Setup a local development environment
tailwind # Watch source code for Tailwind classes
test *args # Run tests
[docs]
decide +title # Create a new decision record
execute *args # Execute a prompt in a new Claude Code session
prompt +title # Create a new prompt
[iac]
apply dir # Apply one or all Terraform projects
init dir *args # Initialize one or all Terraform projects
output dir *args # Interact with outputs one or all Terraform projects
plan dir # Plan one or all Terraform projects
[postgres]
migration name # Create a new migration
psql *args # Start an interactive psql session connected to the local development database
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Language Files Lines Code Comments Blanks ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Astro 10 165 139 0 26 Clojure 61 5760 4587 402 771 CSS 2 84 69 4 11 Dockerfile 1 72 50 6 16 Edn 2 119 106 1 12 HCL 12 389 323 13 53 JavaScript 5 310 255 20 35 JSON 4 59 59 0 0 Just 1 370 241 65 64 MDX 1 56 0 39 17 Nix 3 501 413 14 74 Org 13 2124 1877 6 241 SQL 4 43 37 0 6 SVG 2 12 12 0 0 TOML 1 46 41 0 5 TypeScript 3 36 30 1 5 XML 1 18 14 1 3 YAML 3 5056 3971 0 1085 ───────────────────────────────────────────────────────────────────────────────── HTML 1 76 72 0 4 |- CSS 1 171 151 0 20 (Total) 247 223 0 24 ───────────────────────────────────────────────────────────────────────────────── Markdown 1 352 0 228 124 |- Clojure 1 238 152 50 36 |- Org 1 19 12 0 7 |- Rust 1 68 49 10 9 (Total) 677 213 288 176 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Total 131 16144 12660 860 2624 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 051e32a-dirty @ 2026/02/15 23:44
We maintain version-controlled prompt docs that describe sessions with language models where we plan, generate, and review functionality.
| Status | Date | Title |
|---|---|---|
TODO | 2026-02-10 | Demo Creators |
DOING | 2026-02-13 | Shop Tab |
TODO | 2026-02-13 | About Tab |
TODO | 2026-02-13 | Purchase Flow |
TODO | 2026-02-13 | Posts Feed |
DOING | 2026-02-14 | Session and Auth Security |
| == | 2026-02-15 | GDPR Excision with Per-Tenant Databases |
TODO | 2026-02-15 | Presence System |
| Status | Date | Title |
|---|---|---|
DONE | 2026-02-10 | Prompt Workflow |
DONE | 2026-02-10 | Tenancy Routing |
DONE | 2026-02-10 | Fonts and Theme |
DONE | 2026-02-10 | Creator Profile Page |
DONE | 2026-02-12 | Asset Pipeline |
DONE | 2026-02-12 | SSE Retry Delay Configuration |
DONE | 2026-02-14 | Migrate from Datahike to Datomic Pro |
DONE | 2026-02-15 | Remove redundant indirection around Datomic API |
src/bits/app.clj:;; TODO Use Malli (or clojure.spec) to coerce and parse/validate configuration. src/bits/asset.clj:;; TODO Make content-type explicit or more intelligent. src/bits/auth.clj:;; TODO: I18n - user-facing strings need locale-aware source src/bits/brotli.clj: ;; TODO: Default buffer size for brotli library, needs to be tuned. src/bits/middleware.clj: ;; TODO Rename :sid to :session/id src/bits/service.clj: ;; TODO Improve 404 response src/bits/ui.clj: ;; TODO: I18n - error presentation src/bits/ui.clj:;; TODO: I18n - user-facing strings need locale-aware source src/bits/ui/creator.clj: ;; TODO: Real data from database test/bits/session_test.clj: ;; FIXME Remove `:sid` from `data`.