Routstr is a decentralized protocol for permissionless, private, and censorship-resistant AI inference. http://docs.routstr.com/
  • Python 74.7%
  • TypeScript 23.2%
  • HTML 1.4%
  • Makefile 0.3%
  • Shell 0.2%
  • Other 0.1%
Find a file
Apollo ☀️ 0b48b90489 ci(fork): action to sync main + apollo/automation with upstream
Single fork-only commit on top of upstream/main. The workflow this
adds keeps origin/main a pure ff-mirror of upstream/main and rebases
this very commit onto each fresh upstream tip so apollo/automation
stays identical to upstream except for this HEAD.
2026-08-29 16:01:02 +00:00
.forgejo/workflows ci(fork): action to sync main + apollo/automation with upstream 2026-08-29 16:01:02 +00:00
.github/workflows use full docker image for ghci 2026-05-05 22:15:13 +02:00
docs better price estimation 2026-08-27 00:41:26 +02:00
examples chore: add type annotations to example and test files 2026-01-10 21:35:16 +01:00
logs chore: drop non-analytics branch drift 2026-03-13 17:00:15 +08:00
migrations fix: reconcile fee payouts safely 2026-08-11 01:32:41 +02:00
plans docs: add other mints balance tracking plan 2026-03-23 21:28:45 +00:00
routstr Merge pull request #699 from Routstr/add-detailed-error-message-for-payout 2026-08-29 16:09:20 +02:00
scripts feat(scripts): add admin-password reset CLI 2026-07-23 10:51:20 +02:00
testing-clients testing clients 2025-10-22 12:18:00 +08:00
tests Merge pull request #699 from Routstr/add-detailed-error-message-for-payout 2026-08-29 16:09:20 +02:00
ui update packages 2026-08-26 00:38:15 +02:00
.dockerignore clean up 2026-08-06 22:58:44 +02:00
.env.example chore: trim redundant comments 2026-08-26 22:51:09 +02:00
.gitignore fix(vault): provision a master key on upgrade instead of refusing to boot 2026-07-23 10:51:20 +02:00
.python-version pin python version 2025-10-27 12:38:55 +08:00
alembic.ini Fix alembic config and migration 2025-06-09 23:46:19 +02:00
build-docs.sh docs: Add comprehensive documentation for Routstr Core project 2025-08-25 01:17:40 +00:00
compose.testing.yml docs: update configuration/pricing docs and compose with FIXED_* vars 2025-09-08 10:53:32 +01:00
compose.yml revert: restore default compose port 2026-07-30 01:14:36 +02:00
CONTRIBUTING.md fix folder name 2025-08-12 15:02:22 -03:00
Dockerfile add missing git dep. to display correct commit 2026-05-30 17:56:03 +02:00
Dockerfile.full resolve rest 2026-07-07 17:22:48 +02:00
LICENSE Initial commit 2025-04-08 21:42:32 +08:00
Makefile build: type-check the entire repo in make targets, matching CI 2026-06-11 21:22:28 +02:00
mkdocs.yml improved docs 2026-01-24 17:55:45 +08:00
models.example.json update examples 2025-08-01 22:31:18 -03:00
pyproject.toml update release version 0.4.5 2026-08-17 00:23:15 +02:00
README.md docs: align onboarding with UI-managed secrets 2026-07-23 10:51:21 +02:00
SECURITY.md Add SECURITY.md with vulnerability reporting policy 2026-08-16 19:47:56 +01:00
uv.lock update packages 2026-08-26 00:38:15 +02:00

Routstr Payment Proxy

License Stars Issues Release

Routstr is a decentralized protocol for permissionless, private, and censorship-resistant AI inference. It combines Nostr for discovery and Cashu for private Bitcoin micropayments.

This repo contains Routstr Core: a FastAPI-based reverse proxy that sits in front of OpenAI-compatible APIs and handles pay-per-request billing.

Start Here

Basic Usage

If you are a user/developer, you just point an OpenAI-compatible SDK at a Routstr node and pay with a Cashu token.

OpenAI SDK

from openai import OpenAI

client = OpenAI(
    base_url="https://api.routstr.com/v1",
    api_key="cashuBo2FteCJodHRwczovL21...",
)

response = client.chat.completions.create(
    model="gpt-5-nano",
    messages=[{"role": "user", "content": "hello"}],
)

print(response.choices[0].message.content)

cURL

curl https://api.routstr.com/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "x-cashu: cashuBo2FteCJodHRwczovL21..." \
  -d '{
    "model": "gpt-5-nano",
    "messages": [{"role": "user", "content": "hello"}]
  }'

Quick Start (Docker)

If you are a node runner, start a Routstr Core instance using Docker Compose:

  1. Prepare your .env:

    # Optional: encrypts node secrets at rest. If unset, the node generates a key
    # on first start, writes it to routstr_secret.key, and prints it once — back
    # up that file. Set it explicitly to manage the key yourself (recommended in
    # production).
    ROUTSTR_SECRET_KEY=<generated-key>
    NAME="My AI Node"
    DESCRIPTION="Fast access to models"
    RECEIVE_LN_ADDRESS=yourname@wallet.com
    

    Your Nostr identity (nsec) is not set in .env — configure it from the admin UI after first start, where it's stored encrypted in the database. (NSEC in .env is still read once as a legacy seed for existing deployments.)

    If you don't set one, a key is generated and printed on first start — save it somewhere safe (losing it makes previously encrypted secrets unreadable). To supply your own, generate it once and keep it stable:

    uv run python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"
    
  2. Start the services:

    docker compose up -d
    
  3. Get your admin password: On first start the node generates an admin password and logs it once with the /admin URL. Read it from the logs:

    docker compose logs routstr | grep -i admin
    

    (Lost it? Reset with docker compose exec routstr /.venv/bin/python scripts/reset_admin_password.py --regenerate.)

  4. Configure: Open http://localhost:8000/admin/ to connect your AI providers and set pricing.

For full instructions, see the Provider Quick Start Guide.

Development

make setup
cp .env.example .env
fastapi run routstr