Paper-only, with the fee model in plain sight

A trading engine that shows its work, on paper.

Peregrine nets every edge against a fee model you can read and checks each idea with a risk gate. On real books the fees ate the gaps, so it blocked the trades and said why. Paper money only.

Illustration: an empty rooftop observation terrace at night with a brass telescope on a wooden tripod pointing out over a wide field of distant city lights, and one small warm lamp on the stone parapet.

Internal to Renkara. Peregrine is a tool Renkara Media Group builds and runs for itself. It is not for sale, and there is nothing to buy or join.

Features

An engine that explains every trade it did not make.

Peregrine streams public quotes, spots prices that are out of line, runs each idea through a risk gate, and trades it on a paper account on the same tick, with no language model anywhere on that path. It runs locally today and trades simulated money only. These are the things it does.

Every market, on one screen

Three venues, no keys

Public top-of-book from Kraken, Coinbase, and Gemini over websockets, with no API keys and no private endpoints. Each venue's state (connecting, live, error, or stopped), update count, and last error are shown, and a lost connection reconnects with capped exponential backoff.

A heatmap of stretch

One tile per market, tinted by how far its mid sits from its own recent mean, in standard deviations. A direction mark carries the same information, so color is never the only signal. A chip per symbol shows the best bid on one venue minus the best ask on another, and says Crossed when it is positive.

About 48 markets, in dollars only
Every one of 17 symbols each venue lists, quoted in US dollars only. Tether-quoted markets are left out on purpose: mixing the two assets would invent arbitrage out of the basis between them.
A synthetic market for demos
A seeded random walk with its own spread, noise, and lag per venue stands in for the wire when you work offline or run tests. Every screen on this site was captured against a quiet one, where nothing is planted.
Peregrine's dashboard on a synthetic market: a PAPER badge, the feed named sim, a paper account at $10,000.00 with zero fills, decision latency tiles, a heatmap of markets in three venue tiles per symbol, an equity line flat at $10,000.00, the risk panel with a Halt and flatten button, and an event tape of ideas the risk gate blocked.Peregrine's dashboard on a synthetic market: a PAPER badge, the feed named sim, a paper account at $10,000.00 with zero fills, decision latency tiles, a heatmap of markets in three venue tiles per symbol, an equity line flat at $10,000.00, the risk panel with a Halt and flatten button, and an event tape of ideas the risk gate blocked.
The live dashboard on a quiet synthetic market: nothing traded, and the tape says why. Enlarge to see the full screen.

Latency you can read

Time from a quote arriving to the engine's verdict is measured on every tick and shown as p50, p99, and max. On live data on November 3, 2026 it measured about 25 µs at p50 and about 1.3 ms at p99.

Illustration with example data: five steps for one Coinbase SOL/USD quote (stamp, book, re-mark, scan and gate, time), four checked and re-mark dimmed, a BLOCK verdict reading edge -62.8 bps below 2.0 bps after fees, the clock stopped, a ring of the last 4,096 ticks for p50, p99, and max, and two bars for live data on November 3, 2026: p50 budget 100 µs, measured about 25 µs; p99 budget 2 ms, measured about 1.3 ms.Illustration with example data: five steps for one Coinbase SOL/USD quote (stamp, book, re-mark, scan and gate, time), four checked and re-mark dimmed, a BLOCK verdict reading edge -62.8 bps below 2.0 bps after fees, the clock stopped, a ring of the last 4,096 ticks for p50, p99, and max, and two bars for live data on November 3, 2026: p50 budget 100 µs, measured about 25 µs; p99 budget 2 ms, measured about 1.3 ms.

Illustration, not the Peregrine app, with example prices. A Coinbase quote for SOL/USD arrives and is stamped, which starts the latency clock. The market book scores it against its prior mean, then folds it in. There is no paper position on this market to re-mark. Coinbase's bid of 180.04 over Kraken's ask of 180.00 is a cross-venue gap of 2.22 basis points, which is -62.8 after 40 and 25 basis points of fees, and there is no snapback, so the risk gate blocks the cross-venue idea and says why. The clock stops, and the elapsed time goes into a ring of the last 4,096 ticks that feeds p50, p99, and max. The budget is 100 µs at p50 and 2 ms at p99, and on live data on November 3, 2026 it measured about 25 µs and about 1.3 ms.

One quote, one tick, one verdict, and every tick timed.

Edges net of fees, ideas through a gate

A risk gate with reasons

Every idea is answered PASS with a size, or BLOCK with a reason such as an edge below the minimum after fees, the trade-rate limit, or a halt. Blocked ideas land on the event tape, throttled per strategy and symbol so the tape stays readable.

Two detectors
The cross-venue detector compares the best bid on any venue against the best ask on any other. The snapback detector flags a market whose mid sits at least four standard deviations from its own exponentially weighted mean. A quote older than 1.5 seconds by receipt time never forms an idea.
Peregrine's dashboard on a synthetic market: a PAPER badge, the feed named sim, a paper account at $10,000.00 with zero fills, decision latency tiles, a heatmap of markets in three venue tiles per symbol, an equity line flat at $10,000.00, the risk panel with a Halt and flatten button, and an event tape of ideas the risk gate blocked.Peregrine's dashboard on a synthetic market: a PAPER badge, the feed named sim, a paper account at $10,000.00 with zero fills, decision latency tiles, a heatmap of markets in three venue tiles per symbol, an equity line flat at $10,000.00, the risk panel with a Halt and flatten button, and an event tape of ideas the risk gate blocked.
The live dashboard on a quiet synthetic market: nothing traded, and the tape says why. Enlarge to see the full screen.

A fee model on the page

Every edge is reported net of the taker fee on each leg. The defaults are 25 basis points a side at Kraken, 40 at Coinbase, and 30 at Gemini, deliberately not the lowest tiers. The Risk page shows them, and says so when a trade only counts after clearing them.

Illustration with synthetic example prices: on Kraken and Gemini, a bid of 2,300.69 over an ask of 2,300.00 is a gap of 3.0 basis points, 55 basis points of taker fees leave a net edge of −52.0, the risk gate blocks it at the minimum-edge check, and the event tape gives the reason, with the paper account at $10,000.00 and 0 fills.Illustration with synthetic example prices: on Kraken and Gemini, a bid of 2,300.69 over an ask of 2,300.00 is a gap of 3.0 basis points, 55 basis points of taker fees leave a net edge of −52.0, the risk gate blocks it at the minimum-edge check, and the event tape gives the reason, with the paper account at $10,000.00 and 0 fills.

Illustration, not the Peregrine app, with synthetic example prices. Kraken bids 2,300.69 for ETH/USD while Gemini asks 2,300.00, a gap of 3.0 basis points before fees. Peregrine subtracts the taker fee on each leg, 25 basis points at Kraken and 30 at Gemini, 55 for this pair (pairs with Coinbase cost 65 or 70), which leaves a net edge of −52.0 basis points. The risk gate checks in order: not halted, the loss limit not reached, then a net edge of at least 2.0 basis points, which fails, so the idea is blocked and the reason is written to the event tape. The last two checks are never reached. Nothing trades, and the paper account stays at $10,000.00 with 0 fills. A last line notes that on November 3, 2026, real order books crossed by only 1 to 5 basis points.

Limits you can edit

Order size, position per market, gross exposure, daily loss, trades per minute, and minimum net edge are editable from the Risk page and validated, and a change applies to the very next order.

Peregrine's Risk page: six editable limits (order size, position per market, gross exposure, daily loss, trades per minute, and minimum net edge) above a fee model table of taker fees per side and per round trip for four venues.Peregrine's Risk page: six editable limits (order size, position per market, gross exposure, daily loss, trades per minute, and minimum net edge) above a fee model table of taker fees per side and per round trip for four venues.
The limits the gate enforces, and the fee model every edge is net of.

Simulated money, with an off switch

A paper broker
Taker fills at the touch, worsened by 2 basis points of slippage and paying the venue's fee. A cross-venue pair realizes on the tick, against inventory assumed to sit on both venues. A snapback opens a position with a target at the mean, a stop at twice the stretch on the other side, and a 120-second time stop.
Made for a second monitor
The dashboard updates over a WebSocket up to four times a second however many screens are connected, falls back to polling while the socket is down, and works in light and dark, down to a 375-pixel phone, and on an iPad beside a desk.
Peregrine's dashboard on a synthetic market: a PAPER badge, the feed named sim, a paper account at $10,000.00 with zero fills, decision latency tiles, a heatmap of markets in three venue tiles per symbol, an equity line flat at $10,000.00, the risk panel with a Halt and flatten button, and an event tape of ideas the risk gate blocked.Peregrine's dashboard on a synthetic market: a PAPER badge, the feed named sim, a paper account at $10,000.00 with zero fills, decision latency tiles, a heatmap of markets in three venue tiles per symbol, an equity line flat at $10,000.00, the risk panel with a Halt and flatten button, and an event tape of ideas the risk gate blocked.
The live dashboard on a quiet synthetic market: nothing traded, and the tape says why. Enlarge to see the full screen.

Halt and flatten

One button, with a confirmation, stops all trading and closes every open paper position at its mark, with the usual slippage and fee. The engine halts itself when the day's loss (a UTC day) reaches the daily limit, and only a person starts it again, with Resume. Nothing resumes on a timer, and the halt is saved with the account, so a restart does not clear it. The reason shows on a banner and on the tape.

Illustration with example data: a clock hand past 00:00 UTC, a Trading halted banner, the note that nothing resumes on a timer, a highlighted Resume trading button, and the line that only a person starts it again.Illustration with example data: a clock hand past 00:00 UTC, a Trading halted banner, the note that nothing resumes on a timer, a highlighted Resume trading button, and the line that only a person starts it again.

Illustration, not the Peregrine app, with example data. A paper engine is running, with one large Halt and flatten button. A confirmation asks Halt trading and flatten, and a person confirms. Three things happen in order: the risk gate halts with the reason, every open paper position closes (none are open here), and one Halt line goes on the event tape, reading halted: Manual halt from the dashboard followed by the signed-in operator's name, here the fictional Elara Voss. The engine also halts itself at the UTC day's loss limit, with the reason halted: daily loss limit $250 reached. Nothing resumes on a timer: the clock passes 00:00 UTC and the banner still reads Trading halted. Only a person starts it again, with Resume trading.

One button stops it, and only a person starts it again.
A fresh account on request
The paper account begins with $10,000 and is saved, so a restart picks up where it left off. Reset puts equity back at the starting balance and clears positions, fills, and the equity curve; the saved history stays, and a halt stays on.
Peregrine's dashboard after the kill switch: a Trading halted banner reading Manual halt from the dashboard (Elara Voss), the risk panel marked Halted with a Resume trading button, and a Halt event with the same reason at the top of the tape.Peregrine's dashboard after the kill switch: a Trading halted banner reading Manual halt from the dashboard (Elara Voss), the risk panel marked Halted with a Resume trading button, and a Halt event with the same reason at the top of the tape.
The kill switch pressed: trading halted, with the reason on the banner and the tape.
Screens

See it in light and dark

Real captures of the running tool, with fictional StrataForge Robotics data. They follow your theme.

How it works

From a quote to a verdict, in one tick

  1. Receive

    A public quote arrives and is stamped with the time it was received. That stamp starts the latency clock.

  2. Scan

    The market book scores the tick against its prior mean, and the scanner looks for a cross-venue gap or a snapback, each net of fees.

  3. Gate

    The risk gate answers PASS with a size or BLOCK with a reason. A halted engine blocks everything.

  4. Fill or record

    A pass trades on the paper account on the same tick. A block is written to the tape. Either way the elapsed time goes into the latency ring.

Accessibility

Built so everyone can use Peregrine.

Peregrine's dashboard is built on the Renkara design system. A scripted axe-core run covers its two pages in light and dark at phone and desktop widths, and the same run walks the keyboard path to the kill switch. That run found and fixed seven defects before this site was built. Here is what the product supports today and what we have actually checked. We do not claim a WCAG conformance level for the product.

  • Partly supported

    Keyboard operation

    Every control is a native link, button, or form field, and the scrolling Markets and event tape regions take focus so a keyboard user can scroll them. In a scripted run, Tab reached Halt and flatten, Enter opened the confirmation dialog, focus moved into it, and Escape closed it with the engine still trading. Every stop in a 40-press Tab walk showed a focus indicator except where focus left the page.

  • Partly supported

    Screen reader landmarks and labels

    axe-core, which checks names, labels, roles, and landmark structure, found no violations of any impact on the dashboard, the Risk page, or the halted dashboard. Peregrine has not been tested with a screen reader. The event tape is a labeled log that is not announced live, because it updates several times a second.

  • Supported

    Contrast in light and dark

    Text and controls are checked for contrast in both the light and dark themes, including the heatmap tiles at their strongest tint and the event tape's kind chips.

  • Partly supported

    Reduced motion

    The tick flash and the live dot stop under the reduced-motion setting. In a scripted run, 54 animations ran on the dashboard with no preference and none with the setting on. Peregrine's own tests do not exercise the setting.

  • Not yet tested

    Text resize and zoom

    Resizing text to 200 percent has not been tested.

  • Supported

    Mobile and touch

    Both pages fit a 375 pixel and a 320 pixel wide screen with no sideways scrolling of the page. Some controls are smaller than 44 by 44 pixels, including the design system's header buttons and the chart library's attribution link.

Tech specs

Under the hood

Peregrine technical specification
Engine
  • Python 3.13, FastAPI, and asyncio; the hot path is one synchronous function with no I/O and no language model in it
  • A tick-to-decision budget of 100 µs at p50 and 2 ms at p99 on about 50 markets; measured at about 25 µs and about 1.3 ms on live data, November 3, 2026
  • The dashboard snapshot is rebuilt at most four times a second however many clients are connected
Feeds
  • Public websocket top-of-book from Kraken, Coinbase, and Gemini through ccxt; no keys, no private endpoints
  • 17 symbols, about 48 markets, quoted in US dollars only
  • A seeded synthetic feed for tests, demos, and offline work
Risk and paper trading
  • Six editable limits: order size, position per market, gross exposure, daily loss, trades per minute, and minimum net edge
  • Halt and flatten, with an automatic halt at the daily-loss limit that only a person clears
  • No live broker exists in the code, and no setting or route enables one
Dashboard
  • React 19, TypeScript, and Vite on the Renkara design system; light, dark, and system themes
  • TradingView Lightweight Charts for the equity curve; a Dashboard page and a Risk page
  • One WebSocket hook that reconnects with backoff and falls back to polling
Operations
  • Health, diagnostics (engine, per-venue feed, and auth posture), and Prometheus metrics endpoints
  • Structured logs and gauges for quotes, opportunities, fills, equity, latency quantiles, the halt flag, and per-venue liveness
Tests
  • 127 backend tests at 99% line coverage and 73 frontend tests (November 3, 2026)
  • Contrast, the kill switch, the fee model, and the risk gate each have their own tests; the synthetic market is deterministic from a seed
FAQ

Questions people ask

Is Peregrine available to other teams?

No. Peregrine is internal to Renkara and is not offered for sale. This site shows what it does and how it is built. Write to fleet@renkara.com with questions.

Does it trade real money?

No. Peregrine has no live broker: none exists in the code, and no setting or route enables one. Everything it trades is simulated. Trading real money would be a separate, explicitly authorized change with its own requirements, review, and tests.

Does it make money?

Nothing on this site says so, and nothing Peregrine shows is evidence of how a strategy would do with real money. On November 3, 2026, live books crossed by 1 to 5 basis points while fees ran 55 to 70 basis points per round trip, depending on the pair of venues, so every cross-venue idea was blocked. A paper account fills at the touch plus a fixed slippage, which is not what a real order meets.

Is this investment advice?

No. It is a description of an engineering tool that trades simulated money. It does not recommend buying or selling anything.

Is it running in production?

No. Peregrine runs locally today and is not deployed, so everything on this site describes that local build.

Is the data in the screenshots real?

No. Every screenshot is a capture of the running dashboard against Peregrine's synthetic market, a seeded random walk with made-up prices, with the planted events turned off so only noise moves. No real venue was reached. Nothing traded, so the account stays at its starting $10,000, and the tape shows the risk gate blocking each idea that the fee model made negative.

Why do the screens show a slower decision time than 25 µs?

The 25 µs figure was measured on live data. The synthetic feed stamps a whole batch of quotes with one arrival time, so the later quotes in a batch look slower than they are. The latency tiles on the screens read what that capture measured.

Does a language model place the orders?

No. There is no language model on the order path, and nothing in Peregrine calls one today. The decision is arithmetic: a fee-adjusted edge, a risk check, and a paper fill.

Does it need exchange accounts or API keys?

No. Every stream is public, and Peregrine holds no venue credentials of any kind.

Contact

Questions about this tool?

Write to Renkara Media Group and a person will answer.