Bitcoin research and trading · open source
The record
2021-01-01 → 2026-09-24 12:02 UTC
6,173,120,060 trades
5,245,163,016,011 USDT
We will never ask you to trust. We ask you to verify.
We are a research collective that deploys its own capital through an auditable and verifiable system we build and maintain. At Vaquum, open source is a first principle.
Open source
Closed-source trading software is a structural contradiction for a financial system built to eliminate counterparty risk.
It asks you to do the one thing Bitcoin was designed to eliminate: trust a black box as your operational infrastructure.
Our alpha does not live in the algorithms. It lives in our research and our thesis. So the algorithms are public, and you can check every one of them.
- 01Read the docs.
- 02Audit the code.
- 03Pull your data.
- 04Run your research.
- 05Set your strategy.
- 06Execute your trades.
- 07Judge the results.
We never touch your keys. You deploy our software on your own infrastructure.
The system
Seven products.
One system.
Every one of them is public on GitHub under the MIT License.
01 · The data layer
Bitcoin research and trading · open source
Event-sourced market data. Each trade is kept as recorded, and every derived number can be rebuilt from it.
Read the source ↗Return to the system
Scroll · Day one ↓
Source events are preserved as the checksum-verified canonical record. The same inputs produce the same outputs, and every projection rebuilds from the ledgered raw layer.
- Repository
- github.com/Vaquum/Origo
- License
- MIT
Day one
2017-08-17, the first day of BTCUSDT on Binance. Its first trade: 0.1 BTC at 4,261.48 USDT, at 04:00:28.322 UTC.
Every trade, as recorded
3,427 trades by midnight, each kept exactly as Binance recorded it: its ID, price, quantity, time, and which side took it.
Checked before it is read
Binance publishes each day as an archive with a SHA-256 sidecar, and Origo checks one against the other before it reads a row. Your browser has just done the same.
The canonical day
Every number Origo derives from this day, from a one-minute bar to a cell of the market-state cube, is built from these rows and can be built again.
Bars
One day.
Five cuts.
Origo cuts the same trades by the clock, by money, by coin, by count and by imbalance. Here is day one, cut each way in your browser with Origo’s formulas.
- 01TimeOne bar for every UTC minute that holds a trade.831 bars on day one
- 02DollarA new bar each time a million USDT has traded since midnight. A trade is never split between bars.4 bars on day one
- 03VolumeA new bar each time 100 BTC has traded since midnight.8 bars on day one
- 04TickA new bar every 1,000 trades.4 bars on day one
- 05ImbalanceA bar closes at the first trade that takes taker buys minus taker sells, in USDT, 100,000 either way from where the bar opened.19 bars on day one, the last still open at midnight
Each bar carries 16 measures: open, high, low, close, mean, standard deviation, volume, the share of trades in which the maker bought, the trade count, the USDT of its first, largest, smallest and last trade, its total USDT, and the maker side’s volume and USDT. Origo also writes source-labelled one-minute rows; they are not shown here.
Verify
Rebuild a
published day.
2020-01-01 is the first day of Origo’s published series. Rebuild it here, from Binance’s archive, and compare every bar with what Origo published.
- Fetch the official archive
- Check its SHA-256 against Binance’s sidecar
- Unpack its trades
- Build the day’s one-minute and million-USDT bars
- Compare every bar with Origo’s published files
| Measure | Rebuilt here | Published |
|---|
Archives: Binance’s official daily trade files for 2017-08-17 and 2020-01-01, byte for byte as Origo keeps them in its test fixtures at e77d2d5. Published bars: vaquum/binance_btcusdt_1m_klines at db3d1be and vaquum/binance_btcusdt_1M_dollar_klines at bd303c2, the day’s rows read from their full-history files. Nothing is fetched from outside this page.
Accepted state
Proven before
it is read.
Readers see one accepted state at a time. A new build becomes that state only after it has been staged and checked, and the last complete one stays until it has.
- PartitionA bounded UTC interval: a day of archive, or a minute of provisional data.
- Provider revisionOne particular upstream input for that interval, with the evidence it came with.
- BuildThe components made from that input, each with its own content hash.
- GenerationThe build readers are given. A competing change cannot slip in while it is chosen.
- Canonical archive days take precedence over the provisional minutes they cover.
- A replacement that fails leaves the previous complete generation in place.
- Missing, changed, failed or damaged partitions are repaired; a bad one can be rolled back or quarantined.
- New components are added over the raw trades already kept, without fetching them again.
| Source | Stage | Declared from | Input |
|---|---|---|---|
| Spot trades | Live | 2017-08-17 | Daily archive, then minutes over REST until the archive arrives |
| Perpetual trades | Live | 2019-09-08 | Daily archive and continuous capture, with a spool and repair |
| Spot aggregate trades | Live | 2017-08-17 | Daily archive, then minutes over REST |
| Perpetual aggregate trades | Canary | 2019-12-31 | Daily archive, then minutes over REST |
| Spot top 20 book | Live | 2026-10-24 13:00 | Two independent collectors; missing seconds stay missing |
| Perpetual top 20 book | Live | 2026-10-24 13:00 | Two independent collectors; missing seconds stay missing |
The data laws
- R1
- The newest readable minute, with physical proof behind it
- C1
- The newest canonical interval that is due
- C2
- Every older canonical interval on the calendar
- M1
- The market-state cube readers are given
- M2
- The cube’s history, complete
Each law is judged from the builds, counts and hashes actually selected. Missing evidence is reported as unknown, never as a pass, and an archive not yet due is told apart from a failure.
Specifications
Vaquum
‘Origo’
- Markets
- Binance BTCUSDT spot and USDT-M perpetual
- Sources
- 6: individual and aggregate trades, and top 20 books, for each market; five live, one canary
- Bars
- Time, dollar, volume, tick and dollar-imbalance, plus source-labelled one-minute rows
- Series
- Time 1m to 4h and dollar 1M to 240M for each trade family, from 2020-01-01: 48 declared
- Publication
- Monthly Parquet with per-file checksums, versioned Arrow, and full-history snapshots on Hugging Face
- Cube
- 56.25 s × 125 USDT base cells of spot trades from 2021, queried over HTTP
- Research
- Monthly bar readers, the cube, rally discovery and recent microstructure
- Monitoring
- 7 checks and 5 data laws, an evidence tape, a read-only dashboard and email alerts
- Admission
- 100 GB of free space and 10 % of free inodes kept back
- Not here
- Order execution, portfolios and strategy backtests
- Source
- github.com/Vaquum/Origo · e77d2d5 · 2026-10-28 · MIT
Read the source ↗Return to the system
Every claim about Origo on this page is its source at e77d2d5, 2026-10-28. Source dates are the ones its registry declares, not a measure of complete coverage. The trades are Binance’s own archives; the bars are rebuilt in your browser and compared with Origo’s published files. As of 2026-10-29.
Next · 02 · The research engineLimen →02 · The research engine
Bitcoin research and trading · open source
Puts trading ideas to recorded markets, keeps the evidence, and carries what is chosen into inference.
Read the source ↗Read the docs ↗Return to the system
Scroll · From a question to a Sensor ↓
Limen searches the parameters of models and rules alike, in your own Python or from a declared YAML pipeline. Every round is recorded, and a chosen one is rebuilt before it becomes a Sensor.
- Repository
- github.com/Vaquum/Limen
- Install
- pip install vaquum-limen
- License
- MIT
The question
Does recent momentum still pay after costs? Limen’s research book puts it to 1,920 recorded quarter-hour bars of BTCUSDT, from 2025-01-01.
Split first
960 bars to fit, 480 to choose, 480 for later. Each part makes its own features and labels, so none reaches across a boundary.
A feature and a label
Momentum is the close against the close 4 bars earlier. The label is the next bar’s open-to-close return. Each training bar becomes one point.
Fitted on the past
A scaler and a Ridge line, fitted to the 947 training rows alone. It tilts down: after a rise, it expects a slight fall.
Four candidates
Two windows, 4 and 12 bars, and two Ridge penalties. Each candidate trades the next 467 bars the way its forecast points, and pays 2 basis points a round trip.
Costs decide
Before costs, the 4-bar window earned 0.48 basis points a bar. After them, it lost 1.52, and the 12-bar window lost 1.80. Neither penalty changed a single decision.
Carried forward
Limen keeps one candidate per window, losers both, and wraps each as a Sensor. A Cohort averages them over 480 bars research never saw; its last forecast is +3.68 basis points.
Rules
Eight rules.
One year.
Limen ships eight classic long-or-flat rules as baselines. Here they are on 2024’s hourly bars, at 10 basis points a fill and 5 of slippage, each position worked out again in your browser.
- 01Buy and holdLong from the first bar to the last.Nov–Dec: +2.12 bp an hour after costs · 1 trade
- 02SMA crossLong while the 50-hour average is above the 200-hour.Nov–Dec: +0.82 bp an hour after costs · 5 trades
- 03EMA crossLong while the 12-hour exponential average is above the 26-hour.Nov–Dec: +1.17 bp an hour after costs · 21 trades
- 04MACDLong while MACD 12/26 is above its 9-hour signal line.Nov–Dec: −1.44 bp an hour after costs · 63 trades
- 05RSI reversionIn when the 14-hour RSI falls to 30; out when it reaches 70.Nov–Dec: −0.21 bp an hour after costs · 4 trades
- 06Bollinger reversionIn at or below the lower 20-hour band, 2 deviations out; out at the middle.Nov–Dec: +0.65 bp an hour after costs · 34 trades
- 07Donchian breakoutIn above the prior 20-hour high; out below the prior 10-hour low.Nov–Dec: +0.34 bp an hour after costs · 22 trades
- 08MomentumLong while the close is above the close 20 hours earlier.Nov–Dec: −0.89 bp an hour after costs · 84 trades
Each rule runs on its own in each period, from no history, so its warm-up stays flat. A signal at a close is acted on at the next bar. Results are Limen’s own, from the run published with 6.0.1: train January to September, validation October, test November and December. In the test months, no rule beat holding.
Verify
Run them
again.
Limen recorded both experiments when it published 6.0.1. Run them here, from the same bars, and compare every number with Limen’s record.
- Read the recorded bars
- Split, and prepare each part on its own
- Fit and score the four candidates
- Keep one per window, and forecast the 480 later bars
- Run the eight rules in each period, with costs
- Compare everything with Limen’s record
| Measure | Worked out here | Limen recorded |
|---|
The quarter-hour bars are spot_15m_20250101_20250531.parquet, SHA-256 eb3392d…, and the hourly bars spot_1h_20240101_20241231.parquet, a634bbd…: Origo’s bars, as Limen’s example bundle pins them. The record is Limen’s native output from its 6.0.1 documentation publication, and the book’s own retained result. Nothing is fetched from outside this page.
Compiled Research
Declared,
then run.
The same engine runs a declared pipeline. The book’s second project writes its experiment as YAML, and the command line checks it, runs it and assesses it.
- data_source
HistoricalData.get_any_file· the same 2025 quarter-hours- split_dates
- Train 01-01 to 01-15 · validation to 01-18 · test to 01-22
- indicators
roc, period 1: each bar’s rate of change- target
QuantileBinaryTarget: whether the next bar’s change beats the training median- scaler
- The logistic policy, fitted on training rows
- reference_architecture
logreg_binary, with C of 1.0 and 0.5- backtest
- Cash spot BTCUSDT, 1 basis point a fill, 900-second bars
- objective
backtest_total_return, maximized on validation- assessment
- The top round by validation return, rebuilt as a Sensor, with predictions
limen validateChecks the declaration: fields, types, dates, callables and parameters.limen profileLoads the data, samples preparation and fitting, and sizes the search.limen run --dry-runCompiles the experiment without running it.limen runEvaluates both candidates and records every round.limen assessRanks by validation, rebuilds the top round and writes its predictions.
Recorded by 6.0.1: 2 rounds, each −0.051 % on validation and −2.30 % on test after 81 trades; 1 selected and 1 Sensor rebuilt. Manifest sha256:dd58886c…
- Fetch the raw input
- Select before the split, if declared
- Split into train, validation and test
- Form bars inside each split
- Indicators and features
- Fit the target on train; apply it across
- Feature shims and ablation
- Fit the scaler on train; apply it across
- Align the schema; fit PCA on train
- Finalize the data
- Run the model
Every manifest runs in this order, so nothing is fitted before the split. The order cannot repair a feature that reads the future; feature causality stays the researcher’s.
- Every round is recorded.Its parameters, identity and metrics, and on request its predictions, alignment, trade ledger and fold details.
- A chosen round is rebuilt.Trainer refits it under the recorded manifest and replays it. Where the results file is kept, the replayed metrics must match it before a Sensor is made.
- Costs are declared.Fees, slippage, the product, funding and timing belong to the experiment, not to the result.
- The last window is reserved first.
limen reservemarks it before research begins; research stops short of it, and its assessment is written to the project’s history. That history cannot show what was read elsewhere.
Specifications
Vaquum
‘Limen’
- Interfaces
- Python Research, with your own functions, and Compiled Research, from typed YAML through the CLI; one engine
- Data
- Origo’s BTCUSDT candles, 1m to 4h, and dollar bars, 1M to 240M; Binance archives; Parquet, CSV, ZIP and Arrow
- Bars
- Trade-count, volume, liquidity, imbalance and run bars over the source candles, formed inside each split
- Features
- 117 indicators, 47 of them candlestick patterns; 120 feature helpers; a seven-label market-regime classifier
- Targets
- 16 target classes, fitted on training rows
- Models
- 18 reference architectures, from logistic regression and LightGBM to TabPFN, LSTM, linked learning and rule strategies
- Search
- Grid, random and Sobol; a mutable search queue; 5 reducers
- Execution
- Snapshot backtests with 20 measures; event execution for cash spot and linear perpetuals, with five ledgers and funding
- Evidence
- Walk-forward with purge and embargo, deflated Sharpe and PBO; Trainer reconstruction
- Inference
- Sensors, and Cohorts of compatible Sensors
- Command line
- 14 commands, from
validatetoreserveandassess - Not here
- Live order routing, order books, venue queues and liquidation models
- Source
- github.com/Vaquum/Limen · 6.0.1 · 9bc8a63 · 2026-10-29 · MIT · Python 3.10–3.13
Read the source ↗Read the docs ↗Return to the system
Every claim about Limen on this page is its source and documents at 6.0.1, 9bc8a63, 2026-10-29. The experiments are the research book’s own, and their results are what Limen recorded; your browser repeats them. The book runs the momentum case to show execution, selection and inference on recorded bars, not to settle the question. As of 2026-10-29.
Next · 03 · The decision layerNexus →03 · The decision layer
Bitcoin research and trading · open source
Turns signals into validated decisions, controlled capital deployment, and recoverable state.
Read the source ↗Return to the system
Scroll · One decision through Nexus ↓
Nexus separates user-defined decision logic from non-negotiable capital, risk, price, health, and platform controls. Each instance manages one trading account with durable state and crash-safe recovery.
- Repository
- github.com/Vaquum/Nexus
- License
- MIT
One account
One Nexus instance runs one account. In Nexus’s example it holds a pool of 10,000 USDT, and no order may take more than 15 % of it, nor all orders together more than 80 %.
A decision
A strategy returns an action: buy 0.01 BTC at the market, the same order you can follow through Praxis. Priced at the book’s best ask, it costs 805.14 USDT, plus an estimated fee.
Six checks
Intake, risk, price, capital, health and platform limits, in that order, and the first refusal stops it. On a real book 12 milliseconds old, all six allow it.
Set aside
The capital stage checks the pool and reserves the cost in the same step, under one lock, so two strategies cannot spend the same money. Unsent, the reservation lapses after 60 seconds.
Sent, then working
When Praxis sends the order, the reservation becomes capital in flight; when the venue acknowledges it, a working order. Every unit stays accounted for.
Filled
Praxis reports the fill: 0.01 BTC at 80,514.49. The working order becomes a position at its full cost, fee included, and 9,194.05 USDT stays available.
Written down
After every change Nexus appended the whole account to its log: five records, each with a CRC32. A restart reads them back, and the fill is marked applied, so replaying it does nothing.
Validation
Six gates.
One refusal.
Change one thing about the same decision, and a different stage refuses it. Every verdict and message here is Nexus’s own.
- 00As decided0.01 BTC, on a real book 12 milliseconds old.All six allow it, and 805.95 USDT is reserved
- 01HaltedAn operator has halted the account.Intake refuses · INTAKE_MODE_BLOCKS_ENTER
- 02A bad dayThe account has lost 250 USDT in 24 hours.Risk refuses · RISK_ROLLING_LOSS_24H_LIMIT
- 03A stale bookThe book is 6 seconds old.Price refuses · PRICE_BOOK_STALE
- 04Twice the size0.02 BTC: 16.1 % of the pool.Capital refuses · CAPITAL_RESERVATION_DENIED
- 05A slow venueThe venue takes 1.5 seconds to answer.Health refuses · HEALTH_LATENCY_BREACH
- 06A full handThe account already holds 0.045 BTC.Platform limits refuse · PLATFORM_LIMITS_MAX_POSITION_LIMIT
The limits are example settings: at most 10 orders a second, a book at most 5 seconds old, a spread of at most 5 and a price deviation of at most 10 basis points, at most 200 USDT lost in 24 hours, latency under 1,000 ms, and at most 2,000 USDT an order and 0.05 BTC held. Praxis, which runs Nexus, takes the price and platform limits from deployment caps that a live account must set. Exits, amendments and aborts skip the five stages after intake, so no limit can trap a position; a halted account still refuses exits and amendments at intake.
Recovery
Pull the
plug.
Nexus wrote the account to its log after every change above. Cut the log at any byte, as a power failure would, and see what a restart recovers.
The log is the file Nexus’s StateStore wrote at 953477a for the example above: an 8-byte header, then for each record its length, its CRC32 and the record in MessagePack, each holding the whole account. Its entries carry the example’s own times. Your browser reads the bytes, checks every CRC32, and decodes every record; nothing is fetched from outside this page.
Modes
Three modes.
One writer.
Six holds can halt an account and two can confine it to reducing. Nexus’s mode controller weighs them against health, and nothing else writes the mode.
The account is
Active
- Halted
- Any halt hold, or health reading halted. Refuses entries, exits and amendments at intake; only aborts and cancels pass.
- Reduce only
- Otherwise, a reduce-only hold or health reading reduce only. Refuses entries.
- Active
- Otherwise. The holder is named in the order shutdown, manual, risk, reconciliation, protection, then health.
Specifications
Vaquum
‘Nexus’
- Role
- One account per instance: strategies’ actions in, validated orders out, outcomes back into durable state
- Strategies
- Python classes with seven callbacks, each on its own executor, sharing one capital pool by percentage
- Signals
- Prediction series read from Conduit as Arrow, matched to their bar’s close; timers per strategy
- Actions
- Enter, exit, modify and abort; 7 execution modes and 8 order types, carried out by Praxis
- Validation
- 6 stages, in order and fail-fast: intake, risk, price, capital, health, platform limits
- Capital
- Reserved, in flight, working, filled or released; 15 % per order and 80 % in all; reservations lapse after 60 s
- Modes
- Active, reduce only, halted; 6 halt holds and 2 reduce-only holds
- Recovery
- A CRC32-checked write-ahead log, atomic snapshots, durable outcome deduplication, and boot reconciliation with Praxis
- Loops
- Predictions every 0.25 s, health every 5 s, mark-to-market every 30 s, snapshots every 300 s
- Tests
- 1,619 test cases
- Not here
- A launcher or service of its own, venue connections, and research; Praxis runs Nexus, and Limen produces signals for it
- Source
- github.com/Vaquum/Nexus · 0.76.1 · 953477a · 2026-09-15 · MIT · Python 3.10 and later
Read the source ↗Return to the system
Every claim about Nexus on this page is its source at 953477a, 2026-09-15, version 0.76.1. The decision is an example; the book and the fill are the real ones on the Praxis page. The verdicts, the log and the modes were produced by Nexus’s own code, and your browser reads and checks them again. As of 2026-10-29.
Next · 04 · The execution systemPraxis →04 · The execution system
Bitcoin research and trading · open source
Turns decisions into execution, durable state, and auditable outcomes.
Read the source ↗Return to the system
Scroll · One order through Praxis ↓
Praxis unifies order routing, venue communication, lifecycle management, and recovery around a single event spine. Every order is written to the spine before it is sent, and a restart rebuilds the account from what was written.
- Repository
- github.com/Vaquum/Praxis
- License
- MIT
One record
Praxis keeps one record of what it does: an append-only spine of events in SQLite. Its first row hangs from an anchor the spine keeps for itself.
A decision arrives
Buy 0.01 BTC at the market, in one shot, on a paper account. Praxis accepts the command, and writes that down first.
Written before it is sent
The order is named and recorded before the venue hears of it. Whatever a crash interrupts, the spine already holds the order’s name.
Sent and filled
Binsim, the paper venue, fills it from a real observed book: 0.01 BTC at 80,514.49 USDT, for a commission of 0.00001 BTC.
Reported
The outcome goes back to Nexus: filled, 0.01 of 0.01 BTC, for 805.1449 USDT.
The process dies
Everything Praxis held in memory is gone: the order, the position, the outcome. The spine is on disk.
It starts from the spine
Before it may send again, Praxis checks every row of the chain, replays the rows into its state, and asks the venue what happened while it was down.
Ready
The account stands again exactly as its five rows say it should.
- 0Genesis anchorSHA-256 of praxis.spine.chain.v1.genesis
- 1CommandAcceptedThe command, accepted into the account’s queue
- 2OrderSubmitIntentThe order, named before it is sent
- 3OrderSubmittedThe venue’s order ID
- 4FillReceived0.01 BTC at 80,514.49 USDT
- 5TradeOutcomeProducedFilled, and back to Nexus
Verify
Try to
break it.
These are the five rows a Praxis spine wrote for that order. Praxis checks them at every start, before it will send an order. Change one, and see what the check says.
verify_chain
event spine chain verified · 5 rows
Every row agrees with its own contents and with the row before it.
Rows, hashes and verdicts are Praxis’s own: its Event Spine and verify_chain at d036870 wrote and checked them, and your browser works every hash out again from the same length-framed preimage. The order is an example; the book it filled from is a real observation.
Execution
One decision.
Seven ways.
The same 0.06 BTC, carried out seven ways. Single shot runs by default; a host turns on the other modes it allows.
- 01Single shotOne order: market, limit, IOC, stop, stop-limit, take-profit, take-profit-limit, or an OCO pair.On by default. A limit price can be amended; trigger prices cannot.
- 02TWAPEqual market slices at a fixed interval, buying or selling.The slice count and interval can change while it runs.
- 03Time DCAMarket buys on a schedule.Buys only.
- 04Scheduled VWAPMarket slices sized by weights you supply, summing to one.The weights are fixed once it starts; the interval can change.
- 05BracketA market entry, then a take-profit and a stop-loss on the other side, as one OCO pair.The protection can be amended. It rests, so Binsim cannot run it.
- 06IcebergOne limit order that shows the venue only part of its size.The venue refills it, not Praxis. It rests, so Binsim cannot run it.
- 07Ladder DCAResting limit orders at several prices, sized equally or by weight.It rests, so Binsim cannot run it.
Paper
Walk
the book.
Binsim fills a market order from a real book: three sealed observations of BTCUSDT, one second apart, collected on 2026-10-24. Choose a size and watch the order walk.
The book: Vaquum/binance-book-collector A, BTCUSDT spot, segment 428, the first three original sealed observations, SHA-256 b0d9b7b…, from Praxis’s test fixtures. Binsim fills at each level in turn and does not use the liquidity up; it refuses a size beyond what the book shows, and charges 10 basis points, in BTC on a buy and in USDT on a sell.
Live
Armed,
not assumed.
Praxis runs on paper unless told otherwise. A live start needs every one of these, or the host refuses to start.
- The mode
TRADE_MODE=liveWith no paper venue configured: live alongside BINSIM_URL is refused. - The arm phrase
PRAXIS_LIVE_ARM=I_UNDERSTAND_THIS_ENABLES_REAL_BINANCE_MAINNET_ORDERSByte for byte, checked before any adapter, socket or credential backend exists. - Six caps
PRAXIS_MAX_ORDER_NOTIONAL · PRAXIS_MAX_POSITION · PRAXIS_MAX_ORDER_RATE · PRAXIS_MAX_SPREAD_BPS · PRAXIS_BOOK_STALENESS_SECONDS · PRAXIS_MAX_SLIPPAGE_BPSEvery one set, and positive. - Two breakers
max_daily_loss · max_drawdown or max_drawdown_pctIn every account’s manifest, so an account that loses halts on its own. - Live credentialsA live credential backend, with separate keys for each account.
The operator’s controls
- Halt
- Holds an account until it is resumed.
- Resume
- Clears that hold, and only that hold: a risk breaker stays tripped.
- Cancel all
- Asks to abort every open piece of work, and returns receipts for what it submitted.
- Close all
- Cancels, then sends market orders the other way. Its receipts are not proof the account is flat.
Loopback only, behind a bearer token compared in constant time.
Evidence
Every claim,
sourced.
Praxis’s wiki explains one piece per article, in plain words, and every claim in it names the lines of code that make it true.
- The walk reads the marker before any row, and stops there if it is gone
event_spine.py 1254, refused at 879–884 - An unhashed row after a hashed one is refused
event_spine.py 1263–1268 - A backward link that does not match is refused
event_spine.py 1272–1277 - A hash that does not come out the same is refused
event_spine.py 1279–1287 - It stops at the first row it refuses
event_spine.py 1277 or 1287, whichever check fails first - The marks are worked out afresh from the fields beside them
event_spine.py 1279–1283, the working-out at 419–434
- Articles
- 115
- Checker
- 7,115 lines
- Its tests
- 540
- Pages checked
- 120
The checker refuses evidence it cannot stand behind: a comment, a docstring or a signature offered as behaviour, a line range that does not hold what it claims, a term left unlinked from the article that owns it. It reasons over the code itself, branch by branch, to tell reachable lines from dead ones.
Specifications
Vaquum
‘Praxis’
- Role
- Turns Nexus’s decisions into venue orders, durable execution state and auditable outcomes
- Spine
- Append-only SQLite, schema 4, SHA-256 chain over a length-framed preimage, checked at every start
- Events
- 42 durable types
- Execution
- 7 modes; single shot by default
- Checks
- Intake, risk, price, capital, health and platform limits, before a command reaches execution
- Accounts
- One writer each, with its own credentials and a queue of up to 1,000 commands
- Ledger
- Double-entry per account, FIFO or average cost, BTC and USDT
- Venues
- Binance Spot testnet · Binsim on observed depth · Binance mainnet when armed
- Replay
- The real launcher, Nexus and execution over recorded bars, against a simulated venue
- Tests
- 2,957 test functions
- Status
- Paper and testnet; not yet a live-trading-hardened production deployment
- Source
- github.com/Vaquum/Praxis · d036870 · 2026-10-25 · MIT
Read the source ↗Return to the system
Every claim about Praxis on this page is its source and documents at d036870, 2026-10-25. The spine rows were written by Praxis’s own Event Spine for one example paper order; the verdicts are its own verify_chain’s. The book is a real observation from Vaquum’s book collector, kept in Praxis’s test fixtures. As of 2026-10-29.
Next · 05 · The market state cubeCube →05 · The market state cube
Bitcoin research and trading · open source
Every BTCUSDT trade since 2021, counted into cells of time and price, and the instrument that reads them.
Read the source ↗Return to the system
Scroll · Into the cube ↓
The cube counts every Binance BTCUSDT spot trade since 2021-01-01 into cells of 56.25 seconds by 125 USDT. Nothing is sampled and nothing is smoothed.
- Repository
- github.com/Vaquum/Cube
- License
- MIT
The record
Every Binance BTCUSDT spot trade since 2021-01-01: 6,173,120,060 trades in 785 columns of 64 hours by 112 rows of 1,000 USDT.
Every cut doubles
Time and price are cut independently, and each cut halves a column or a row. Seven cuts read the last 30 days at 2 hours by 250 USDT.
The same trades at every level
A cell is the sum of the cells inside it, so no cut adds or loses a trade. The last seven days, at 1 hour by 250 USDT.
One day
The 24 hours to 2026-09-24 12:00 UTC, at 15 minutes by 125 USDT: 3,475,972 trades.
One cell
The busiest cell of that day: 38,598 trades from 14:15 to 14:30 UTC, between 84,125 and 84,250 USDT.
The base cell
Four more cuts reach 56.25 seconds by 125 USDT, the cell every level is made of. Seven of these sixteen held no trade, so they are outlined, never drawn as zero.
56.25 seconds × 125 USDT
The busiest of them held 8,446 trades. The record is 3,214,083 base columns long.
The instrument
Three views.
One count.
The instrument that reads the cube is built from three views of the same cells. Here they are, on the same 24 hours.
- ElevationFrom the front, the cells: each one as dark as the USDT traded in it.
- End view and planSummed along time, the cells give volume by price. Summed along price, they give volume by time.
- The screenUnfold the three views and you have Cube: the chart, its profile beside it, and the Columns pane beneath.
In view
2026-09-23 12:00 → 09-24 12:00 UTC · 82,750–86,000 USDT
- Volume
- 1,918,601,006 USDT
- Trades
- 3,475,972
- Taker-bought
- 45.5 %
- POC
- 84,312.5
- 70 % value area
- 83,625–84,750
Point at a cell, or focus the chart and use the arrow keys.
Verify
Two projections.
One record.
The cube and Origo’s 4-hour klines are built separately from the same trades. In all 784 whole 64-hour columns their trade counts are equal, and their USDT agree within the klines’ own rounding.
- Columns compared
- 784
- Trade counts equal
- 784 of 784
- Largest difference
- 0.393 USDT
- The klines’ rounding
- 16 × 0.05 USDT
- An unavailable value is never a zero.Fourteen typed results, from finite to invalid input. A measure without a value says why, and nothing is drawn as a number it does not have.
- Unfinished looks unfinished.An open column carries a cap, a coarser cell a corner tick, and the provisional minutes a dashed edge where the archived days end.
- Replay never looks ahead.Its edge governs every measurement, history, reference and comparison, and nothing beyond it is read.
- A zero is a measurement.Delta is 2 × taker-buy USDT − USDT. A cell whose buys equal its sells holds a zero; a cell without trades holds no delta at all.
- Motion moves structure, never values.One spring for Cube and for this page: stiffness 180, damping 20, mass 1.
For people and agents
One document.
Two readers.
An investigation is one document, cube-analysis@1: the view, its frozen evidence, the selection, the comparisons, the drawings, and where every number came from.
A person opens it in Cube. An agent reads and extends it through nine MCP tools, and every import is validated before anything changes.
- cube_capabilities
- cube_inspect
- cube_query
- cube_compare
- cube_configure
- cube_replay
- cube_annotate
- cube_share
- cube_refresh
Specifications
Vaquum
‘Cube’
- Market
- Binance BTCUSDT spot, from 2021-01-01 00:00 UTC
- Base cell
- 56.25 s × 125 USDT
- Levels
- 21 in time by 10 in price: 210 ways to read the same trades
- Counters
- USDT, taker-buy USDT, trades, taker buys
- Cells
- Volume, Trades, Trade size, Taker flow, Taker trades, Delta, Cascade, Path, Dwell, Geometry, Candles
- Typed results
- 14, and an unavailable value is never a zero
- Reference
- 60 searchable topics
- Agents
- cube-analysis@1 · 9 MCP tools · loopback HTTP
- Build
- No runtime dependencies beyond vendored D3, assembled deterministically
- Source
- github.com/Vaquum/Cube · f7b786e · 2026-10-28 · MIT
Read the source ↗Return to the system
Every figure on this page is computed from Cube’s recorded snapshot of Binance BTCUSDT spot, cutoff 2026-09-24 12:02:48.750 UTC: the record in 64-hour by 1,000 USDT cells, the last 30 days at 2 hours by 250 USDT, the last 7 days at 1 hour by 250 USDT, the 24 hours to 12:00 at 15 minutes by 125 USDT, and that day’s busiest cell in its 16 base cells. Coarser levels are exact sums of finer ones; each level is read on its own scale. The klines are Origo’s, vaquum/binance_btcusdt_4h_klines revision 45183e4. Claims about Cube are its documents at f7b786e. Cube’s backend lives in Origo. As of 2026-10-29.
Next · 06 · The pattern composerComposer →06 · The pattern composer
Bitcoin research and trading · open source
Draw bars, find the closest windows in BTCUSDT history, and read what they became.
Read the source ↗Return to the system
Scroll · One drawing through Composer ↓
Patterns are composed in Filang’s g1 language and matched against 15-minute to 4-hour BTCUSDT bars, compared exactly in integer cents. No estimate is shown for fewer than 30 supporting windows.
- Repository
- github.com/Vaquum/Composer
- License
- MIT
Two bars
Composer opens on a drawing of two bars: a rise, then a fall whose body covers it, which it names a bearish engulfing. Any end can be dragged, and bars added up to twenty.
Chained
Each drawn bar opens exactly where the one before it closed, as in a market that never shuts. Recorded BTCUSDT bars do so 46.6 % of the time, to the cent, and 37.6 % open one cent away.
Order, not size
Composer reads a drawing as the order of its eight ends, equal ends sharing a rank. In Filang’s g1 this one is g1:o:1,3,4,5,u;0,2,4,6,d, one of 7,452 two-bar patterns, of which 1,573 have occurred.
Every window
It searches every two consecutive bars of BTCUSDT from 1 January 2020, at 15 and 30 minutes and at 1, 2 and 4 hours: 463,536 windows, none across a missing bar.
1,741 twins
1,741 windows have the drawing’s exact order and colours, compared in integer cents, from 854 at 15 minutes to 79 at 4 hours. With 30 or more twins, Composer reads its answers from them.
What came next
Each twin’s next six bars, in the twin’s own scale: the low of its two bars is 0 and their high 1. For the 1,739 with all six, the middle half of the sixth close lies between −0.44 and 1.19.
Within limits
After six bars, 29.8 % had closed above the pattern’s high, 33.7 % inside its range and 36.5 % below its low. Every rate carries a Wilson 95 % interval, and none is shown for fewer than 30 windows.
One comparison away
Flip one
comparison.
Twenty-eight comparisons between its ends fix a two-bar pattern, and one changed makes another, with a history of its own. These are the six neighbours of the opening drawing that BTCUSDT holds most often.
- 00The opening drawingA rise, then a fall whose body covers it.1,741 windows · the next bar rose after 54.3 %
- 01Bar 2’s close below bar 1’s lowThe fall closes beneath all of the rise.3,797 windows · the next bar rose after 54.4 %
- 02Bar 2’s high below bar 1’s highThe fall stays under the rise’s high.3,151 windows · the next bar rose after 52.3 %
- 03Bar 2’s low above bar 1’s lowThe fall stays above the rise’s low.2,893 windows · the next bar rose after 50.6 %
- 04Bar 2’s close above bar 1’s openThe fall’s body no longer covers the rise’s body.1,373 windows · the next bar rose after 51.3 %
- 05Bar 2’s open above bar 1’s closeThe fall opens above the rise’s close: the joint is no tie.1,013 windows · the next bar rose after 52.4 %
- 06Bar 2’s open below bar 1’s closeThe fall opens below the rise’s close.947 windows · the next bar rose after 50.5 %
Each group is Composer’s own: its matcher took every two-bar window on the five timeframes with the drawing’s colours and exactly one comparison between bar ends different, and grouped them by that comparison. The bars drawn for each group are its closest-looking window, scaled to the drawing as Composer’s Try it places them, with their prices as recorded, so a joint can miss by a cent. Rates are the share of windows whose next bar closed above their last close, with Wilson 95 % intervals; they describe what happened, not what will.
Compose
Draw it.
Find its twins.
Drag any end of a bar, add bars, flip the first. On every change your browser searches every window again, ranked as Composer ranks them, in the same bars Composer reads.
The drawing
The search needs the script on this page.
The bars are Composer’s own payload: its bars.py read vaquum’s five BTCUSDT kline files at the revisions pinned for this page, refused any price finer than a cent, and wrote them as CBAR1, 3.5 MB in five files. Your browser checks each file’s SHA-256, decodes it, and searches it in a background worker; nothing is fetched from outside this page. As Composer does, it keeps the 480 closest windows, shows the 6 closest that do not overlap in time, and reads its answers from the exact twins, or from the 480 closest when there are fewer than 30 twins.
Specifications
Vaquum
‘Composer’
- Role
- A workbench for BTCUSDT bar patterns: draw bars, find their closest windows in history, and read what followed
- Drawing
- 2 to 20 chained bars; drag shadows, bodies and closes, which snap onto exact ties; 400 steps of undo
- Identity
- Filang g1, with colours (g1:o) or as shape only (g1:u); 14 classical names, and a sentence for each pair of bars
- Matching
- Every window at 15m, 30m, 1h, 2h and 4h, in integer cents: exact twins, and the closest by colours, shape and sizes, with a charge for each flipped comparison
- Holds
- Pins on relations and colours, a skeleton of swings, a stretch of up to 4 skipped bars, and next-bar filters by direction, basis points or ATR
- What came next
- The next bar’s close; the six bars after as paths, branches, and states above, inside or below the range; a fan of 10, 25, 50, 75 and 90 % quantiles from up to 20,000 continuations
- Readings
- Volume, trades and trade size against the 11 bars before; maker share; range and body in ATR14; place in the prior UTC day’s range
- Statistics
- Wilson 95 % intervals for rates, t for means, and nothing for fewer than 30 windows
- Data
- Vaquum’s BTCUSDT kline datasets on HuggingFace at 15m, 30m, 1h, 2h and 4h, from 2020-01-01, checked by SHA-256 and row count; missing bars stay missing
- Serving
- Python’s standard HTTP server on 127.0.0.1:8488, reading the files with PyArrow; a checksummed snapshot refreshed hourly; behind the Vaquum portal login
- Checks
- 21 Python tests and 23 check files, among them a brute force of the ranking and an independent recomputation of the panes
- Not here
- Live prices, orders, accounts, saved drawings and share links
- Source
- github.com/Vaquum/Composer · 133e301 · 2026-10-17 · MIT · Python 3.12 and a browser
Read the source ↗Return to the system
Every claim about Composer on this page is its source at 133e301, 2026-10-17. The bars are vaquum’s BTCUSDT kline files at the revisions of 2026-10-30, from 2020-01-01 through 2026-10-29, encoded by Composer’s own bars.py. The drawings, counts, rates, neighbours and words were produced by Composer’s own matcher.js and page functions, and your browser computes them again. The count of 7,452 two-bar patterns is Composer’s, and this page’s record enumerates them to check it. As of 2026-10-30.
Next · 07 · The sweep monitorGrid →07 · The sweep monitor
Bitcoin research and trading · open source
Shows how each parameter of a sweep moves the outcome, with the uncertainty of every number.
Read the source ↗Return to the system
Scroll · One sweep through Grid ↓
Grid follows a running sweep’s results file and log. A Limen experiment is read live while limen run writes it, and nothing is inferred.
- Repository
- github.com/Vaquum/Grid
- License
- MIT
A sweep
Grid reads a sweep while it runs. This one is in Grid’s own tests: Limen 5.14.0 drawing 37 parameters of a LightGBM experiment at random, 10,000 rounds planned, read at the first 200. Each round is tested on hourly BTCUSDT from March to September 2026.
One needle
Every view measures one outcome, the needle. For a Limen run with no declared objective it is net PnL per bar: here −0.025 basis points, with a 95 % interval from −0.037 to −0.012, over the 200 rounds.
Rows arrive
As rows arrive, each parameter gets a card: the needle at each of its values, every card on one scale. A value is drawn hollow, with no number, until it has 30 rows; at row 60, 8 of the 123 values have one.
A leader
For all but two of the rows from 52 to 128, the strongest parameter is min_child_weight. But 37 parameters are tested at once, and after Benjamini–Hochberg its q never falls below 0.078: Grid never calls it detectable.
Two move the needle
At row 129 use_calibration takes the lead with q under 0.05, and at row 140 class_weight follows. At 200 rows those two move the needle; min_child_weight is sixth, at q 0.35.
Where it acts
Calibrated models averaged +0.003 basis points a bar and uncalibrated ones −0.055, an ω² of 10.3 %. Read on entries, the same parameter leads: 84 of the 105 calibrated rounds entered no trade at all, against 29 of the 95 others.
Within noise
At p under 0.05, four parameters would pass; corrected for 37 tests, two do. The other 35 have no detectable effect: their spread is within noise, and their intervals bound how far each could move the needle.
The needle
Change the
question.
The same 200 rounds, measured another way, answer differently. Grid tests every parameter again for whichever needle is chosen, and corrects the board as a whole.
- 00Net PnL per baruse_calibration and class_weight.2 of 37 move it · use_calibration, ω² 10.3 %
- 01Entriesuse_calibration, class_weight and lookahead_hours: calibrated models enter less.3 of 37 · use_calibration, ω² 21.2 %
- 02AUClookahead_hours alone: how far ahead the target looks.1 of 37 · ω² 30.4 %
- 03Precisionuse_calibration and max_duration_hours.2 of 37 · use_calibration, ω² 10.7 %
- 04Mean losing barnotional_rate alone: the size of the position.1 of 37 · ω² 48.4 %, over the 80 rounds that have one
- 05Drawdown p5use_calibration, class_weight and notional_rate.3 of 37 · use_calibration, ω² 17.1 %
- 06Seconds per rowmax_duration_hours and feature_groups: what the features cost to compute.2 of 37 · max_duration_hours, ω² 31.0 %
Each needle is one of the run’s own columns, as Grid names it and reads its direction, or Grid’s own count of entries. Every board here is Grid’s engine on the needle over all 200 rounds: 37 one-way tests, q from Benjamini–Hochberg, detectable under 0.05, strength as ω². A parameter that moves no needle is not called inert; its intervals bound how much it could.
Stack values.
Read the pocket.
A pocket holds the rounds whose values you choose: any of a parameter’s chosen values, every chosen parameter at once. Grid reads the needle inside it and ranks the next value by the cautious end of its interval.
In the pocket
Next, by the cautious end
The pocket needs the script on this page.
The rounds are Grid’s own test fixture at 01ac611: the first 200 rows that a real Limen 5.14.0 run wrote, with its manifest, as Grid’s own pack reads them. Because the sampler drew every parameter independently and uniformly, a pocket’s mean estimates what a new sweep drawn inside it would give; the halves compare its rounds in the first and second half of their arrival. Nothing is fetched from outside this page.
Specifications
Vaquum
‘Grid’
- Role
- A monitor for parameter sweeps: it follows a sweep’s results and log while they are written, and shows how each parameter moves the outcome, with the uncertainty of every number
- Reads
- JSON lines and Limen result directories, live or recorded, local or over SSH; several shards of one manifest read as one run
- Views
- Experiment, Board, Pocket, Pairs, Features, Trials, Gates, Run and Cohort, each shareable by its address and replayable to any row
- Statistics
- 95 % intervals, t for means and Wilson for rates; nothing for fewer than 30 rows; ω² with the F test, or the G-test for a rate; Benjamini–Hochberg q
- Interactions
- Beyond an additive fit, up to six parameters at once; moderators across the board; sampler dependence by Cramér’s V
- Halves
- Each test window’s two halves read as windows of their own; an effect counts only when it shows in both
- Experiments
- Manifests checked by limen validate as they are typed, run in shards with Limen’s own stop and resume, recorded as Sweep or Inspect
- Cohorts
- Chosen on the first half of the test window, judged on the second, and made a predictor in the layout Furnace reads
- Agents
- 18 operations over a JSON API, a command line and MCP, running the page’s own engine in Node
- Retention
- Content-addressed exact evidence, sealed runs compacted and reconstructed before anything is pruned
- Serving
- Python’s standard library on 127.0.0.1:8490, behind the Vaquum portal login, inside a 199,000,000,000-byte storage boundary
- Checks
- 272 Python, 167 JavaScript and 88 browser tests; the statistics checked against scipy on a sweep with planted effects
- Not here
- Limen itself, which Grid runs through its command line; the portal login; Furnace, which reads the predictors
- Source
- github.com/Vaquum/Grid · 01ac611 · 2026-10-19 · MIT · Python 3.11 and later, Node 18 and later
Read the source ↗Return to the system
Every claim about Grid on this page is its source at 01ac611, 2026-10-19. The sweep is its test fixture tests/fixtures/limen_run_200: the first 200 rounds of lightgbm_binary_full, a 10,000-round random search Limen 5.14.0 began on 2026-10-09, trained on hourly BTCUSDT from 2024-01-01 and tested from 2026-03-01 to 2026-09-30. Grid’s own pack read it and Grid’s own engine produced every board, edge and pocket; your browser computes them again. As of 2026-10-30.
Next · 01 · The data layerOrigo →Open source
Don’t trust.
Verify.
Every configuration testable. Every state traceable. The strategy you deploy is the strategy you tested.
- OrigoMIT
- LimenMIT
- NexusMIT
- PraxisMIT
- CubeMIT
- ComposerMIT
- GridMIT
The record is Cube’s recorded snapshot of Binance BTCUSDT spot, from 2021-01-01 00:00 to 2026-09-24 12:02:48.750 UTC, in 785 columns of 64 hours by 112 rows of 1,000 USDT. Column prices and trade counts are Origo’s 4-hour klines (vaquum/binance_btcusdt_4h_klines, revision 45183e4, SHA-256 e0b5256…), grouped 16 to a column. Motion uses one spring — stiffness 180, damping 20, mass 1 — and moves structure, never a value. As of 2026-10-29.