A personal engineering project
A desktop research environment for mining, building, testing and running systematic trading strategies — one that spends most of its machinery trying to prove its own results are luck, and that can replay, bar by bar, what a running strategy's orders actually did.
This site is a showcase, written for people I know who asked what I have been building. It describes how the system is put together and what the pieces do. It is not a product page, nothing here is for sale, and no claim on this site is an offer of anything.
Two names, two different things, and they are easy to run together because this showcase is named after both. Mithraeum is the software you would install. Agora is the site you would sign in to. Two more programs stand behind them, and all four are below.
Counted from the working tree at Round 543. "Lines of source" is Python, JavaScript and CSS across the four programs, excluding test code, archived revisions, bundled third-party environments and vendored libraries; the 138,000 lines of tests are counted separately beside it. "API routes" is the combined HTTP surface of all four programs. Every one of the 113 indicators can now be drawn by the search as well as used by hand. The engineering log is the round-by-round write-up, one entry per change, kept since the first.
The mining engine
Ask the machine for strategies and it will find thousands that look wonderful on the history they were found in. Almost all of them are luck. The search is built around that fact.
More on searching and trying to break it, the tool catalogue, and the research bots that run all of it unattended.
The replay
A backtest says what a strategy would have done. The replay shows what a deployment's orders did — bar by bar, scrubbable like a video, with everything that happened drawn where it happened.
More on running it and on how execution is measured.
The testing battery
Whatever the search keeps is treated as luck until it has been pushed from every angle the project knows how to push — and the verdict comes back with its reasons attached.
More on trying to break it, and every testing tool, one by one, in the catalogue.
Mining, the replay and the testing battery are the spine of it — finding something, finding out what it did, and trying hard to prove it was luck. Around them sits the rest of the application.
Votes of at least K conditions, weighted scores, negation, lagged operands, a calendar and a clock, swings and market structure, rolling regression, indicators on another symbol, pyramiding and risk sizing — in a logic tree, never a script.
The whole plan as a tree with how often each condition fired, leading with the exits no condition controls — and saying so when a strategy has no stop at all.
Formulas parsed in a sandbox rather than executed as code, registered beside the 113 built-ins — so your own indicator appears in every dropdown, every search and every gate.
Every request goes to the source you selected and to no other; an unrecognised one requests nothing at all, and the whole application can run fully offline.
Blend survivors into a portfolio or rank a universe through time and hold the leaders, with turnover charged honestly and the cash line drawn.
A deployment ladder where nothing promotes itself, standing rules born in shadow, forward paper evidence, and a live book drawn like the backtest's.
Bots that mine, prove and label what they promote, under an honesty floor no configuration can lower and a guard on every door to your broker, your data and your work.
A hash-chained audit trail, daily self-diagnosis, alerts derived from the trail, and limits a setting cannot switch off — everything that watches for the quiet failures.
Two peer panes on one screen, a context menu on whatever is under the cursor, pages that fit the window, and controls that say what is working rather than going grey.
Two of them are the ones you would actually use — the Mithraeum is the application on your machine, the Agora is the website. The other two stand behind those. Click any card to open it; the row it sits in opens with it.
The application itself — a local-first desktop program for designing, testing and running strategies.
You describe a strategy as logic rather than code, test it against real history, search for variations you did not think of, try hard to prove the survivors were luck, and — if you choose to connect a broker — run them, then replay what they did.
Everything it knows lives on the machine it runs on. There is no server holding your positions, because there is no server.
Its pages sit under Mithraeum in the bar — start with the workflow.
The web service that handles accounts, the manual, a forum, a shared library and support.
It knows who you are and nothing about what you trade — and that is structural rather than a promise. It was never given a way to ask.
It also owns the paperwork of having an account at all, including closing one: self-service, password-confirmed, blocked by nothing, and your own contributions destroyed rather than hidden.
It has its own page — the community in screenshots — and the strategy library beside it.
The backend owning commercial authority: subscriptions, signed entitlements and the release channel.
The smallest of the four and the only one holding a signing key. It answers two questions: what is this account entitled to, and what is the current version of the software — both answered with a signature the application verifies against a key it already pinned.
Described with the trust boundaries on Architecture, under The platform.
The workbench. It launches, watches, tests, backs up and packages the other three — and never ships.
Operational tooling lives in a fourth program that is not part of any release, so the thing customers install stays a clean application rather than an application with a maintenance hatch in it.
Toured on the workbench page, under The platform.
They are separate programs, not modules, and they run as separate processes. That separation is the main architectural decision in the whole project: the thing holding a signing key is not the thing exposed to the internet, and neither of them is the thing holding anyone's trading data.
Seven stages, in order, and the order is the point — most of what follows exists to stop an idea moving to the next one. Two of them are gates rather than steps: nothing crosses them because it did well, and nothing crosses them by itself. The workflow takes each in turn.
A strategy is a logic tree, not a script — conditions, votes, groups, and an optional regime gate.
Run it over real history with costs, slippage and delay modelled, then scrub the result bar by bar.
Ask a machine for thousands of variations — then spend most of the machinery defending against what it finds.
Held-out data, walk-forward, stress sweeps, synthetic paths, an empirical null. Most candidates die here, by design.
Blend survivors into a book, or rank a universe and hold the leaders — with turnover charged honestly.
Paper, then connected, then armed, then unattended. Each rung is its own decision; nothing promotes itself.
Re-read the broker before acting, record everything locally, be able to stop — and replay what the orders did.
The two lit steps are the gates. Everything before stage four is a way of generating candidates; everything at and after it is a way of refusing them. What comes back the other way matters too — the replay, the attribution ledger and the position dossier turn a live result into the next revision rather than an abandonment. Stages three and four can be handed to an unattended researcher; stages six and seven never can, and that is a property of the code rather than a setting.
The project is built in numbered rounds, each written up before it closes. These are the ones the rest of this site keeps referring back to — not a changelog, but the load-bearing moments. The full story lives in the working notes.
The first numbered round, and the habit that outlasted every feature: nothing ships without its own written entry — what changed, what broke, what the mistake taught. Every round since has one.
The application stops holding web credentials and starts redeeming a one-time ticket with the identity service, server to server. The browser becomes a courier that carries a token it cannot use.
Custom formulas, parsed in a sandbox rather than executed as code, register into the same registry as the built-ins — so your own indicator appears in every dropdown, every search and every gate, first class.
Generation, evolution, diversity control, held-out fitness and the empirical null land as one connected machine. Most of what it does is refuse to let a search flatter itself.
The whole testing battery, run in sequence against one strategy with nothing to configure — and coverage reported beside the score, because a partial run can flatter itself.
Subscriptions, entitlement signing and the release channel move into their own small service. From here on, the program facing the internet cannot mint an entitlement, and the program holding the key faces almost nothing.
"When this condition holds, do that" — except every rule starts in shadow mode, recording what it would have done against the real book until you have the evidence to arm it.
Self-service deletion with no blockers, the username released the same minute, one anonymous row retained — and an order of operations that aborts whole rather than ever destroying half.
The profit green and loss red are re-solved under colour-blindness simulation rather than picked by eye, and the theme family closes into a deliberate two-by-two of warm and cold, night and day.
Two concurrent writes shared one fixed temporary filename and spliced the store, and a read that treated corrupt and missing as the same fact reported it empty. Every store write is atomic per writer now, and a file that will not parse is preserved rather than replaced.
Asked to mine the best stops, the measurement said a stop's return is not optimisable while its drawdown reduction transfers reliably — so the tool ships as a price list, not an optimiser.
The unattended search becomes a program: bots that draw a set-up, mine it, prove the survivors and label what they promote — under an honesty floor no configuration can lower, and a guard on sixteen doors so a bot can reach no broker, no data provider and none of your own work.
The gradient came off the top bar: an identity asserted six times in one strip is a texture, not a signature. State is carried by position and one solid rule now. This site followed it.
Every limit a data vendor publishes now has a number, a ceiling nobody can raise past, and a sweep that checks the configuration against it — and every request, brokerage and data together, lands in one trail.
A review of the mining evidence found the noise floor's twin leaking the next bar's open, validation slices cut from a sampled curve, parents bred on the validation span, and one fixed holdout. Each was corrected, and the page's defaults stopped favouring the in-sample maximum.
A sealed tail at the end of every bot's tape, opened once, after the search is over — and a cost-stressed twin derived rather than re-run, which made each candidate cheaper to test honestly.
The Ordeal becomes a single picture; sectioned pages gain a unified arrangement; everything fits the window; two panes share one screen; and a right-click reaches the object under the cursor.
A deployability sweep found the unattended funnel's verdict on its own search space was no — so the benchmark is charged on both sides, the Ordeal's letter means something again, and a condition that never fires is something the cut can see.
Votes, weighted scores, negation, a calendar axis, swings and market structure, rolling regression, an indicator on another symbol, pyramiding and risk sizing — each off by default, and a gate that asks the whole registry whether any indicator reads the future.
The replay: landmarks under the scrub bar, strips that share the book's window, the delay split into the machine's leg and the broker's, drift on a named basis, and an order's trail joined from three records.
No logic tree had ever mentioned a stop. The explainer leads with the exits no condition controls — and found more than half the saved strategies had none.
The replay's book becomes one component: the Backtest page scrubs a test the way the Replay page scrubs a deployment, and the live and mining pages take its look.
All 113 indicators become drawable and the search learns votes, negation, position-state exits and peer instruments — while the classic grammar stays byte-identical, so every stored search still reproduces.
The tree this site is counted from: four programs, 332 test suites, and a round log 3.6 MB long. Still a personal project, still nothing for sale.
Every screenshot on this site was captured from a demonstration instance running on synthetic data — series the application generated itself (the SYN-* and DEMO-* tickers visible in the frames), with no real market behind them. Where a number, a curve or a verdict is visible, it is the demonstration's arithmetic over those invented series: not a result, not a track record, and not a claim about anything.
The navigation groups the pages the same way: what belongs to the Mithraeum (the application), what belongs to the Agora (the community site), and what describes the platform standing behind both.
| Section | What it covers |
|---|---|
| The Mithraeum — the application | |
| Workflow | The path from an idea to a live position, and what must be true at each gate. |
| Research | Designing strategies, searching for them by the thousand, and trying to break the survivors. |
| Bots | Handing the search to an unattended researcher — and everything it is not allowed to touch. |
| Toolkit | Every mining and testing tool, one by one, and what each guards against. |
| Combining | Blending strategies into a book, rotation, and charging turnover honestly. |
| Live trading | The deployment ladder, the replay, and every order-level control in one place. |
| Data | One data-source selector with no fallbacks, the request gate, and working fully offline. |
| The Agora — the community site | |
| The Agora | The landing, accounts and sign-on, the boards and support in screenshots, and closing an account for real. |
| Library | Strategy posts — published as logic, forked with attribution, adopted into the application. Results do not travel. |
| The platform behind both | |
| Architecture | Four programs, three trust boundaries, what is not allowed to travel — and the Control Plane, which signs what the others verify. |
| Safeguards | Error handling, audit trails, diagnostics, monitoring and warnings — everything that watches for the quiet failures. |
| Privacy | What stays yours: local-first data, the bundle allowlist, and where the network is involved at all. |
| Workbench | Behind the scenes — the workbench that never ships, and the lessons that shaped everything else. |
Please read this bit. This site describes a personal software project. It is not investment advice, not a recommendation to trade anything, and not an offer of any product or service. Nothing here should be taken as a claim about financial performance — the only figures anywhere on this site are a demonstration instance's own arithmetic over app-generated synthetic series, shown inside screenshots as illustrations of the tools, and no performance is claimed or implied by any of them. Software for testing trading ideas is a tool for reasoning about history; history is not a prediction. I am not a financial adviser or a broker, and nothing on this site should be relied upon as though I were.
A personal project. Not advice. Nothing for sale.
This site describes a personal engineering project, written and run by one person in their own time and published under the name Mithraeum Agora. There is no company behind it, no team and no other contributor. It is not a product and not a business. Nothing here is for sale — there is no account to open, nothing to buy, no subscription, no waiting list, and no service is being offered or solicited. Sending a message through the note form creates no customer, client or contractual relationship of any kind. The note form on the contact page is the way to reach me, and it is the only one.
Nothing on this site is investment advice, financial advice, tax advice, or a recommendation, solicitation or offer to buy or sell any security or financial instrument. I am not a financial adviser, a broker, an investment manager or a regulated firm, and nothing here should be relied on as though I were. If you are making decisions about money, take advice from someone qualified and regulated to give it.
Figures do appear on this site, inside screenshots, and none of them is a performance claim. Every one is a demonstration instance's own arithmetic over price series the application generated itself — synthetic data, with no real market behind it — shown to illustrate what the tools display. They are hypothetical and simulated: no capital was at risk, no orders were placed, and a result computed over history with the benefit of hindsight carries limitations that live trading does not forgive. Hypothetical results are not indicative of future returns, and past performance — real or simulated — predicts nothing.
No brokerage, market-data vendor or other company is named anywhere on this site, and where a name appeared inside a screenshot it has been redacted out of the image. Nothing here states or implies that any company is associated with this project, endorses it, sponsors it, supplies it or has reviewed it. None is, and none has.
What this site collects. Nothing, unless you write to me. There is no analytics, no tracking, no advertising, and nothing at all is loaded from another domain. If you use the note form it takes the name, address and message you type, stores them privately where only I can read them, and keeps them for up to a year before they are deleted — sooner if you ask, and you do not have to give a reason. Your IP address is not kept. One thing is stored on your own device: the colour theme you pick, remembered by your browser so the site does not change appearance every time you arrive. It is written only when you choose a theme, and it identifies nothing and nobody. The preference itself never leaves your browser, but the screenshots follow it, so the pictures your browser fetches from this site are the ones drawn in that palette. The contact page answers all of this in more detail.
Terms of use. This site is provided as is and as available, with no warranty of any kind, express or implied. It describes software under active development: anything here may be incomplete, out of date or simply wrong, and it may change or disappear without notice. Nothing on it is a contract, a term of service for any product, or a promise that anything described will be built, released or kept running. To the fullest extent the law allows, I accept no liability for any loss or damage arising from use of this site or from reliance on anything it says. Nothing here excludes or limits any liability that cannot lawfully be excluded or limited.
Trading involves risk of loss.