Skip to content
/ bits Public

jcf/bits

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

344 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Bits

https://code.invetica.team/jcf/bits/badges/workflows/ci.yml/badge.svg

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
    container                          # Build the container image and load into local Docker
    deps-lock                          # Regenerate deps-lock.json
    docker-run tag="bits:latest" *args # Run the Docker image against the local devenv database

    [dev]
    clean                              # Clean up generated classes and screenshots
    clj-kondo-import                   # Import clj-kondo configs
    cluster-certs                      # Generate cluster keystores
    css                                # Regenerate Tailwind CSS from template
    fmt *args                          # Format project files
    mkcert                             # Create self-signed SSL certificates via mkcert
    nrepl *args
    setup                              # Setup a local development environment
    tailwind                           # Watch source code for Tailwind classes

    [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

    [locales]
    locales-build                      # Build translation bundles from .po files
    locales-extract                    # Extract translatable strings to .pot file

    [postgres]
    migration name                     # Create a new migration
    psql *args                         # Start an interactive psql session connected to the local development database

    [test]
    check                              # Run all quality checks (format + lint)
    compile                            # Compile bits.main
    lint                               # Run lints
    perf *args                         # Run tests with performance tracing output
    test *args                         # Run tests

SLOC

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 Language              Files        Lines         Code     Comments       Blanks
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 Astro                    10          165          139            0           26
 Clojure                  66         6751         5330          505          916
 CSS                       2           84           69            4           11
 Dockerfile                1           82           58            7           17
 Edn                       2          136          121            1           14
 HCL                      12          386          320           13           53
 JavaScript                5          305          250           20           35
 JSON                      4           59           59            0            0
 Just                      1          292          181           61           50
 MDX                       1           56            0           39           17
 Nix                      11         1131          861          122          148
 Org                      15         2335         2039            5          291
 SQL                       4           43           37            0            6
 SVG                       2           12           12            0            0
 TOML                      1           43           38            0            5
 TypeScript                3           36           30            1            5
 XML                       1           18           14            1            3
 YAML                      3         5073         3988            0         1085
─────────────────────────────────────────────────────────────────────────────────
 HTML                      1           76           72            0            4
 |- CSS                    1          171          151            0           20
 (Total)                              247          223            0           24
─────────────────────────────────────────────────────────────────────────────────
 Markdown                  1          404            0          266          138
 |- Clojure                1          238          152           50           36
 |- Org                    1           19           12            0            7
 |- Rust                   1           68           49           10            9
 |- YAML                   1            1            1            0            0
 (Total)                              730          214          326          190
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 Total                   146        17984        13983         1105         2896
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

83a623b @ 2026/02/26 23:46

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/schema.clj:   ;; FIXME Avoid stringly typed entities - use `:db/ident`.
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

Sponsor this project

 

Packages

 
 
 

Contributors