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

290 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
    locales-build                      # Build translation bundles from .po files
    locales-extract                    # Extract translatable strings to .pot file
    market                             # Run the marketing site
    mkcert                             # Create self-signed SSL certificates via mkcert
    nrepl *args
    perf *args                         # Run tests with performance tracing output
    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

    [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                  63         6036         4798          431          807
 CSS                       2           84           69            4           11
 Dockerfile                1           72           50            6           16
 Edn                       2          130          116            1           13
 HCL                      12          389          323           13           53
 JavaScript                5          317          262           20           35
 JSON                      4           59           59            0            0
 Just                      1          258          164           51           43
 MDX                       1           56            0           39           17
 Nix                       4          520          432           14           74
 Org                      15         2375         2076            5          294
 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          353            0          229          124
 |- Clojure                1          238          152           50           36
 |- Org                    1           19           12            0            7
 |- Rust                   1           68           49           10            9
 (Total)                              678          213          289          176
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 Total                   136        16597        13029          875         2693
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

a5eba27 @ 2026/02/21 19:56

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/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/module/creator.clj:        ;; TODO: Real data from database
src/bits/module/creator.clj:     ;; TODO Extract platform/realm domain
src/bits/morph.clj:;; FIXME Relocate `morphable`.
src/bits/ui.clj:  ;; TODO: I18n - error presentation
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