Middle-office software · investors & small funds

The middle office you don't have.

Banks run three functions behind every trading desk: tax and books, position-sizing discipline, and PnL attribution. If you're an investor or a small fund, you have none of them — you have a broker CSV and a spreadsheet. Vireo is those three functions, on your own machine.

Built by a sell-side PnL reconciliation professional.
Runs locally — your broker files never leave your machine.

The three functions

One ledger. Three answers you currently guess at.

Everything below is computed from a single normalized ledger built out of your broker exports — so the tax number, the risk number and the performance number can never disagree with each other.

01

Tax reporting

Raw broker activity in, a jurisdiction-aware tax output out. Tax lots matched by the method your jurisdiction actually requires, foreign currency converted on the rule your tax office actually uses, dividends and withholding tax reconciled.

  • US: an independent cross-check of your broker's 1099-B — every difference itemised, wash-sale effects labelled as expected rather than reported as broker error
  • Realized gains and losses per instrument and per lot
  • Dividend and withholding-tax summary, treaty credit shown
  • FX conversion audit table — every rate, its source and its quote date
  • Form-field summary with mapping notes
1099-B cross-checkTY2026 · USD
Proceeds — broker box 1d412,880.15
Proceeds — recomputed412,880.15 TIES
Cost basis — broker box 1e388,204.60
Cost basis — recomputed387,061.20 DIFF
↳ wash-sale adjustment1,143.40 EXPECTED
Unexplained difference0.00 CLEAN
differences itemised per lota check on your broker, not a filed return
02

Sizing discipline

The rules you already believe in, enforced instead of remembered. Check a trade before you place it, or scan the whole book against your limits and see what drifted since last time.

  • Limits on position, sector, asset-class and currency weight; max notional; leverage
  • Volatility-adjusted sizing from realized vol — estimator and lookback stated, no scores
  • Optional Kelly-fraction cap, off by default
  • Timestamped breach log; sign-off workflow on Pro
Pre-trade checkBUY 120 NVDA
Position ≤ 8% NAV6.4% PASS
Sector ≤ 30% NAV28.1% WARN
Vol contribution ≤ 1.5%1.9% FAIL
Gross leverage ≤ 1.4×1.08× PASS
Max notional ≤ $25,000$24,118 PASS
vol: 20d realized, annualisedsuggested size 94
03

PnL attribution

Why did I make money — answered with a decomposition that sums exactly to your actual PnL, to the cent. Price, currency, carry and fees separated, then rolled up by asset class, sector or your own strategy tags.

  • Per-position and per-period breakdown, buckets tie to total PnL by assertion
  • Skill versus market: benchmark-relative view against an ETF you choose
  • Fee drag and FX drag quantified, not buried
  • Multi-portfolio comparison and daily PnL walk on Pro
Monthly attributionJun 2026 · USD
Market (beta)+3,824 Selection+2,282 Carry / dividends+383 FX−599 Fees−414 Residual+2
total +$5,478 · ties exactlyvs SPY +1.8%

Why you can hand this to an auditor

Every number traces back to the broker row it came from.

Most tools give you a figure and ask for trust. This one gives you the chain. Each ledger event is identified by a hash of its origin, and the raw file it came from is archived beside the database — so a number is either provable or it doesn't ship.

event_id = sha256( adapter_id ‖ source_file_sha256 ‖ record_locator ) ↳ re-importing the same export inserts nothing: identity is content, not sequence ↳ overlapping date ranges de-duplicate exactly, never heuristically
Append-only ledger

Events are immutable facts. Corrections arrive as new events, so history is never quietly rewritten under a number you already filed.

Decimal, never floats

Monetary values reject floating point at construction. In a tax engine, 0.1 + 0.2 must be 0.3 — bugs there are the ones that actually cost people money.

Version-stamped reports

Every report carries the engine version, the jurisdiction ruleset version and the hashes of its inputs. Same inputs, same output, always.

Coverage, stated honestly

Where you trade and where you file are two different questions.

The ledger, sizing and attribution work on any instrument from any venue, in any currency. Tax forms are jurisdiction-specific work, shipped one country at a time — so here is exactly what exists, what's next, and what won't be built.

ScopeLedger · sizing · attributionTax output
US, UK & EU listed equities, ETFs, optionsFull supportsee rows below
United StatesFull supportv1.x — independent realized-gains report to cross-check your broker's 1099-B, differences itemised. No return is filed for you.
Any FIFO jurisdictionFull supportv1 — neutral realized-gains report for your accountant
Poland — PIT-38Full supportv1 — reference jurisdiction, validated against a real filing
GermanyFull supportplanned after v1
United KingdomFull supportlater — Section 104 pooling, engine designed for it
BrokersIBKR Flex as reference; mapped-CSV import for XTB, Degiro, Trading 212 and custom exports; dedicated adapters follow

A neutral gains report is deliberately not sold as a filing. Where a local form isn't implemented, you get the computed, traceable numbers your accountant needs — and we say so rather than implying a return.

Plans

One engine. Two ways to buy it.

Pro isn't a different product — it's the same codebase with multi-entity, audit and approval features switched on, packaged to run inside your own environment.

Lite · individual investors

Lite

$99 / tax year, one-off

or $15 / month for the full monthly toolkit

  • Annual tax pack for your jurisdiction, with the full FX and lot audit trail
  • Up to 5 broker accounts, one portfolio
  • Sizing guardrails and pre-trade checks
  • Monthly “why did I make money” report
  • Runs locally: CLI plus self-contained HTML and PDF reports
Join the list
Pro · funds, family offices & prop desks

Pro

from $449 / month per entity

annual −10% · deployed in your environment via Docker

  • Everything in Lite, plus
  • Multi-portfolio and multi-entity, with per-investor tax-lot allocation
  • Immutable audit log across ingestion, limits and reports
  • Risk-limit framework with breach sign-off and limit-change history
  • Exportable compliance and administrator packs (CSV, XLSX, PDF)
  • Daily PnL explain — start-of-day to end-of-day walk (phase 2)
Talk about a deployment

Indicative pricing while v1 is in build; early-access participants keep their entry price for the first year.

Build status · updated 6 July 2026

Being built in the open, in dependency order.

Nothing here is claimed as finished before it is. Each module ships with its tests before the next one starts, and the tax engine ships with golden-file tests — given this broker export, the output must be exactly these numbers.

✓ DONEIngestion & ledgerIBKR Flex + CSV
30 tests · 91% cov
● IN BUILDTax enginelot matching,
FX audit, rulesets
○ QUEUEDAttributionbuckets, tags,
benchmark
○ QUEUEDSizingrules, pre-trade,
breach log
○ QUEUEDReportingHTML, PDF,
CSV / XLSX
○ QUEUEDPro featuresentities, audit,
approvals

Early access

Bring one year of broker exports. Get one year of answers.

The first cohort is small on purpose: real exports from real brokers are how the parsers get hardened, and how the tax numbers get validated against filings that were actually submitted.

Email to join
You bring — one broker export, one jurisdiction
You get — the outputs, and your entry price held for a year
You keep — everything local; nothing is uploaded
No commitment — leave whenever, take your data