Receipts docs
v1.0.0
Live demo Get help
● Documentation · Node.js · Self-hosted

Receipts
signals with proof.

Everything you need to install, configure, brand and run your own signal marketplace where every signal is sealed and every result is computed from the market. Read it top to bottom the first time. After that, press / and search.

v1.0.0Node.js 20.12+ · TypeScriptSQLite, no database serverKeyless by default

01What you bought

Receipts is a self-hosted signal marketplace. Every signal is sealed the second it is published, every result is computed from the market at the price a follower could actually get, and anyone can verify a record without trusting your server.

WhoWhat they do
You, the operatorRun the site on your own server, set the rules in the Admin console and take an optional commission and fees.
ProvidersPublish trade signals (market, side, entry, stop, targets, expiry) from the web Studio, from Telegram, or from TradingView alerts by webhook.
MembersFollow providers for free, subscribe to paid ones, get each signal in their feed, as a notification, on Telegram or Discord.
Safe defaults

Every revenue stream starts switched off, the commission is capped at 50 % in code, and the package ships with no keys or accounts of any kind. You connect your own Stripe, Telegram and wallets, and turn on what you need.

02What makes it different

  • Sealed at issue. Each signal is hashed (SHA-256) and chained to the provider's previous signal. The database refuses to change or delete sealed rows. Edits (move stop, close, cancel) are new sealed events.
  • Timestamped on Bitcoin. Every 10 minutes by default, new seals are grouped into a Merkle tree and the root is submitted to the free public OpenTimestamps calendars. Receipts then show the Bitcoin block height. No wallet or coins are needed.
  • Results from the market. Public 1-minute candles and a fixed, deliberately pessimistic follower model. Providers cannot type in their own results.
  • Signed by the provider (optional). An Ed25519 key made in the provider's browser; anything published in their name without it shows as unsigned.
  • Anyone can check. /verify recomputes a proof in the browser; an offline script and the reference ots tool check it without the website.

What it does not do

  • It never places trades and never connects to anyone's exchange account.
  • It never holds money. Stripe pays into your Stripe account; bank and stablecoin payments go straight to you and you confirm them.
  • It invents no data. The demo mode uses labelled strategy bots on live prices; a real install starts empty.

03Pick your path

04What is in the package

Folder or fileWhat it is
src/core/Pure logic: sealing, results, statistics, OpenTimestamps.
src/services/, src/workers/State and background jobs: prices, payments, Stripe, Telegram, Discord, push, anchoring.
src/web/Server-rendered pages (Hono JSX, no client framework).
src/admin/, vendor/mikodes-admin/The operator console (MIKODES Admin Kit 0.3.0) and its settings manifest.
src/db/SQLite schema; applied automatically at start.
public/Styles, browser scripts (verifier, signing), service worker, icons, vendored TradingView Lightweight Charts.
scripts/verify-bundle.mjsThe offline, dependency-free verifier.
.env.example, SPEC.md, SOURCES.md, LICENSE.mdConfiguration template, behaviour spec, sources and licences, your licence.
You provide

A server (1 vCPU, 1 GB RAM is enough), a domain with HTTPS, and optionally a Stripe account, a Telegram bot, a bank account or stablecoin wallets for payments. None of these are part of the purchase.

05Try it before you install

A public demo runs with real market prices: receipts-demo.mikodes.com. On the sign-in page, one click signs you in as the demo operator, provider or subscriber. Signals come from labelled strategy bots, payments are sandboxed and the operator console is read-only for visitors.

The demo runs with DEMO_MODE=1 and DEMO_PUBLIC=1. Never use either on a live site.

06How to read these docs

  • Dark boxes are commands. Press Copy in the corner and paste them into a terminal.
  • Grey text after # is an explanation. The Copy button leaves it out.
  • Replace signals.example.com with your own domain everywhere.
  • Tested marks steps run against release 1.0.0 on macOS with Node 22 while writing these docs; Not tested here marks standard procedures that could not be run on the writer's machine (for example the Ubuntu, systemd and Caddy steps).