Skip to content
/ bits Public

Open creator monetisation platform. Find your audience and make money doing what you love.

Notifications You must be signed in to change notification settings

jcf/bits

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

259 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Bits

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.

Development

devenv up

HTTPS and *.test URLs

Setup

To get our *.test URLs to work takes some effort with DNS.

drill bits.test | awk '/^bits/ { print $1 "\t" $5 }'
HostAddress
bits.test.127.0.0.1
cat /etc/resolver/test

Test

The 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
done

And 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

Decision records

Dev tasks

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

SLOC

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 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

Prompts

We maintain version-controlled prompt docs that describe sessions with language models where we plan, generate, and review functionality.

TODO

StatusDateTitle
TODO2026-02-10Demo Creators
DOING2026-02-13Shop Tab
TODO2026-02-13About Tab
TODO2026-02-13Purchase Flow
TODO2026-02-13Posts Feed
DOING2026-02-14Session and Auth Security
==2026-02-15GDPR Excision with Per-Tenant Databases
TODO2026-02-15Presence System

DONE

StatusDateTitle
DONE2026-02-10Prompt Workflow
DONE2026-02-10Tenancy Routing
DONE2026-02-10Fonts and Theme
DONE2026-02-10Creator Profile Page
DONE2026-02-12Asset Pipeline
DONE2026-02-12SSE Retry Delay Configuration
DONE2026-02-14Migrate from Datahike to Datomic Pro
DONE2026-02-15Remove redundant indirection around Datomic API

TODOs

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`.

About

Open creator monetisation platform. Find your audience and make money doing what you love.

Resources

Stars

Watchers

Forks

Releases

No releases published

Sponsor this project

 

Packages

 
 
 

Contributors 2

  •  
  •