Receipts docs
v1.1.0
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.1.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 the Telegram bot, or from TradingView alerts by webhook.
MembersFollow providers for free, subscribe to paid ones, get each signal in their feed, as a notification, in chat or on Discord.

AI tools were used to assist with parts of the code, documentation and graphics of this item. The author directed the work and reviewed the code before release. What was tested for version 1.1.0, on Node.js 22: pnpm check runs the TypeScript type check (the app and the bundled Admin Kit), ESLint and Prettier on the app's own code (the bundled Admin Kit and the chart library in public/lib are not linted) and 194 automated tests in 15 files, and all 194 pass; pnpm build compiles the app and the Admin Kit to dist/ and pnpm start runs it with plain node; and the release ZIP was unzipped into an empty folder, installed, built, tested and started. The item itself has no AI features: it does not call any AI model or AI service.

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 bot 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.

03How it fits together

One program on your server does all of it. A provider publishes a signal; the app seals it (a SHA-256 fingerprint chained to the provider's previous one) into a database that refuses edits. Background jobs read public market candles and compute the result a follower could really have got. Every 10 minutes the new seals are grouped into one fingerprint (a Merkle root) and timestamped through the free OpenTimestamps calendars, which later confirm it in a Bitcoin block.

Architecture: providers publish from the Studio, the Telegram bot or a TradingView webhook into one Node.js app on your server; each signal is sealed into an append-only SQLite chain; price jobs read public Binance and Bybit candles and compute results; every 10 minutes new seals are batched into a Merkle root sent to the OpenTimestamps calendars and later confirmed in a Bitcoin block; members read the site and get notifications; payments come from Stripe webhooks or are confirmed by the operator; visitors verify proofs in their browser or offline. YOUR SERVER: one Node.js process + SQLite files ProvidersStudio, bot, webhook Publish + sealSHA-256 hash chain Record (SQLite)append-only events Price APIsBinance, Bybit candles Result jobsfollower-reachable fills AnchoringMerkle root every 10 min Operator console/admin, sign-in + 2FA Site + feedsleaderboard, receipts OpenTimestampsthen a Bitcoin block Members, visitorsread, verify in browser PaymentsStripe, bank, USDT Notificationspush, bot, Discord
How the parts fit together. Everything inside the dashed box runs on your own server; payments go to your own Stripe, bank or wallet, and nothing is sent to MIKODES.

04Pick your path

05What 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 bot, Discord, push, anchoring.
src/web/Server-rendered pages (Hono JSX, no client framework).
src/admin/, packages/admin-kit/The operator console (MIKODES Admin Kit 0.6.0, with its source and LICENSE.md) and its settings manifest.
src/db/SQLite schema; applied automatically at start.
dist/Not in the download: created by pnpm build, the compiled JavaScript that pnpm start runs.
public/Styles, browser scripts (verifier, signing), service worker, icons, the fonts in public/fonts/, and TradingView Lightweight Charts in public/lib/.
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.

06Try it before you install

The live demo is at receipts-demo.mikodes.com: a click-through showcase with a static copy of the 1.1.0 site (sample data), the running demo install with one-click Operator, Provider and Subscriber roles at /login, and a read-only operator console at /admin (the e-mail and password are in the item's Demo instructions). Your own install runs on your own accounts and keys. The Quick start takes about ten minutes: pnpm install, cp .env.example .env with PUBLIC_URL=http://localhost:8787, pnpm build, pnpm start, then claim the site with the setup code the log prints.

For sample data, start a test copy once with DEMO_MODE=1: one-click demo logins as operator, provider or subscriber, a labelled demo checkout that moves no money, and labelled strategy bots that publish real, sealed signals from live prices. The screenshots in these docs and on the item page were captured in that mode. Never use DEMO_MODE=1 or DEMO_PUBLIC=1 on a live site.

07How 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.
  • Operating system. Commands are written for a macOS or Linux terminal (bash or zsh). On Windows, run them in WSL (Ubuntu) or Git Bash; the production server itself is assumed to be Ubuntu.
  • These docs describe release 1.1.0. The automated checks named here (pnpm check: type check, lint and 194 tests) are part of the download, so you can run them on your own machine.