redshift 860266ab0e fix: announce provider as soon as the NSEC is saved
A node runner who configures the NSEC through the admin UI (rather than the
NSEC env var) was never announced. The kind 38421 publish task was only
created at boot, gated on an NSEC already being present: saving the key
stored it and updated the live settings singleton, but nothing re-launched
the task, so the provider stayed invisible on relays until the process was
restarted.

Start the task unconditionally and restructure announce_provider into the
idle-and-re-read loop that publish_usage_analytics already uses: it waits
while there is no NSEC, re-derives the identity whenever the key changes,
and re-reads endpoints, mints and relays every iteration. The long
re-announce sleep is now ticked so a replaced identity is announced
promptly instead of up to 24h later. Relay backoff state is hoisted so it
survives an idle poll, a full cycle and an identity change.

This also covers the cases that previously killed the task until a restart:
an invalid NSEC, or a node with no reachable endpoint (HTTP_URL left at its
http://localhost:8000 default and no onion address) now idle and recover as
soon as the configuration is fixed.
2026-09-16 21:39:30 +02:00
2025-10-22 12:18:00 +08:00
2026-09-09 23:23:11 +02:00
2026-08-06 22:58:44 +02:00
2026-08-26 22:51:09 +02:00
2025-06-09 23:46:19 +02:00
2025-08-12 15:02:22 -03:00
2025-04-08 21:42:32 +08:00
2025-08-01 22:31:18 -03: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
S
Description
Routstr is a decentralized protocol for permissionless, private, and censorship-resistant AI inference.
Readme GPL-3.0
33 MiB
Languages
Python 79.8%
TypeScript 18.3%
HTML 1.2%
JavaScript 0.2%
Makefile 0.2%
Other 0.3%