Repository navigation
Releases: edgedepthhq/edgedepth-terminal
Release list
v0.5.1 - Real-time charts, replay and a simpler start
A current terminal, a shorter first-run guide, and new screenshots plus a replay clip.
Since v0.4.0
- Real-time charts: an attached depth ladder, stable 100ms trade bubbles, clearer chart titles, and current depth bounded to the live margin. Trades-only recordings say when no depth was recorded.
- Charts and replay: independent timeframes for extra charts, same-venue compare replay, sub-minute gap repairs, and an absorption layer with an evidence inspector.
- Volume and VPIN: volume stays aligned through candle corrections, history loads and replay seeks. VPIN gains a readable fit-to-visible option and respects the replay clock.
- Clearer evidence: liquidation scenarios are labelled as estimates, unsupported leverage selections no longer leave the map blank, and Stats distinguish one-minute CVD and position stress.
- Venues and polish: Bybit-aware routing, shared menus, per-tab layouts and drawing synchronization. Feed support still depends on your data source.
- Replay exit: live chart callbacks now detach from their original data manager, preventing a crash when returning from the Replay Library.
- Container refreshes: venue-specific URLs now reload correctly, with an HTTP regression guarding script routing.
- Getting started: a concise README with current OSS captures and a plain comparison of self-hosting, Pro and Research.
The client includes rendering support for host-supplied research overlays. Hosted admin previews, fitted research models, historical archives and paid data services are not bundled. The public tests use synthetic model parameters.
Compatibility and checks
The wire changes since v0.4.0 are additive. Existing compatible feeds continue working; new layers require the corresponding observations. The bundled gateway supplies public Binance data. Older context candles in a replay pack may not have footprint data.
Verified with 32 native tests, five data-feed example tests, WebAssembly regressions, and an Emscripten Release build. Windows and Linux CI passed for the synced application. Container routing is also checked over HTTP. The published image was checked with a live gateway through pause, replay exit, market switching and timeframe changes.
Run it
git clone https://github.com/edgedepthhq/edgedepth-terminal.git
cd edgedepth-terminal
docker compose upOpen http://localhost:8080. No account or API key needed.
To pin this terminal image, use ghcr.io/edgedepthhq/edgedepth-terminal:0.5.1 (without the leading v). The gateway is versioned separately.
The v0.5.0 candidate was held after browser testing exposed the replay-exit crash. Use v0.5.1.
v0.4.0 - Real-time depth, candle bubbles, workspaces, near-black chrome
Fifty commits since v0.3.0. The theme is seeing what the feed actually delivered: a real-time mode that draws observed depth and every print on one axis, large prints seated in their own candles, and evidence views that report "unavailable" instead of inventing a number.
Real-time depth mode
Choose Real-time beside the timeframe bar. The chart shows observed orderbook history, sampled best bid/ask steps and trade bubbles on one price axis, and the linked DOM shares the chart's price rows, sampled book and pause state. Individual bubbles keep their received execution price and timestamp; dense views group volume by time and side at average prices, with a label, and zooming in recovers the individual records. Quotes and trades are separate streams, so a print can sit outside the sampled spread. Bubbles are never moved onto a quote to make them fit.
- Browser-local history. RT records from activation, targeting 30 minutes inside a shared 256 MiB compressed IndexedDB budget. The menu reports actual coverage and offers Whole session and Return live. Detail uses 100ms observed samples; wide views use mean depth bins. Archive reads run on their own worker queue, so a history query never stalls live capture, and a retired trade-ring boundary preserves the displayed prefix instead of freezing the tail.
- Startup history on compatible feeds. After the first live depth sample the client asks the backend for recent observations over the new
STREAM_RT_HISTORYstream: zstd protobuf, a 60 second window with a 90 second binary reach, up to 16,384 identified trades and 100ms grouped bins. Depth ends strictly before the first live sample with an explicit gap marker, and Binance aggregate trade IDs give exact overlap checks. A feed without the endpoint keeps recording live and says so in the status line. The community gateway is such a feed. - Auto-fit visible history. Linked RT fits observed trades and quotes in the visible interval with 10 percent padding. Display price groups grow immediately when rows would become unreadable and shrink after five seconds of sustained spare room, always as integer native-tick multiples of the selected fidelity. Grouping recalibrates colors; retained observations are unchanged. Turn it off for fixed-fidelity following.
- Linked DOM alignment. DOM rows use the renderer's native tick and fidelity (UHD/HD/SD/LD/ULD: 1/2/5/10/20 ticks), zero-anchored, lower-inclusive and upper-exclusive. Every complete visible bucket draws its price and nonzero depth and flow. GPU prices are relative to a nearby book origin, so 0.1 ticks survive at BTC prices.
- Replay. Continuous replay, pause and seeking work on recordings with a valid seed and continuous depth. Seeks reconstruct the book from the opening seed through the target and hold the source clock during catch-up. A missing or corrupt chain produces a persistent error with a frozen replay context; Close replay owns the return to live, and nothing silently falls back to playing.
- Price following needs a deliberate cumulative vertical drag to detach; horizontal jitter keeps the axis locked. Follow/Recenter sits beside the chart and Return live rearms it.
- Reported liquidations draw as independent diamonds with an activity strip that respects pause and replay cutoffs. Reported fields only, never an inferred match to tape prints.
See docs/REALTIME_DEPTH.md for settings, replay steps, retention limits and the distinction between quotes and executions.
Candles
- Trade bubbles on candles, on by default on every feed. Prints at or above 8x the market's typical trade value are retained by the chart and drawn as a translucent disc with a solid ring. They used to land over the next bar: bars are centred on the period's open time while the period's trades run from open to open + tf, so half of every bar's prints drew one bar to the right. Each print now sits at ts - tf/2, inside its own bar. Discs are sized by log-compressed value (about 9, 16 and 22px at P90, 10x P90 and 100x P90) and thinned to a screen budget, so zooming reveals more without moving or summing prints. Hover for the print; the LAYERS row has a manual minimum, persisted per workspace. Recorded bubbles for earlier bars load in 15-minute tiles when the backend answers
get_candle_bubbles. - Footprint imbalances: same-price or diagonal buy/sell comparisons with a configurable ratio and minimum volume, plus consecutive same-side stacks drawn with thicker outlines. Uses closed one-minute tick-volume buckets; replay excludes buckets that end after the playhead. Live footprints show the forming minute as observed partial volume and replace it with the completed snapshot when it arrives.
- Candle depth is grouped before GPU upload with source bounds and stable contrast. RT rendering and its calibration are untouched by that change.
- Recent observed depth is retained for ten minutes across GPU rebuilds. Unobserved minutes remain gaps; the current book is never copied backward to fill them.
Workspaces and reference context
Workspace in the full live terminal saves the current layout and settings in browser storage, with up to 20 named copies, import/export, and Order Flow, Liquidity, Replay Review and Candles presets. Reset Layout recreates a clean preset, including closed Watchlist and DOM panels, and Watchlist (24h change) reopens from + Widget. Replay and embedded pages never overwrite the saved live workspace. Browser storage is best effort; the exported JSON is the portable backup.
Layers gains session VWAP (00:00 UTC), anchored VWAP from the chart context menu, and previous-day and previous-week high, low and close (Monday weeks). VWAP is HLC3 weighted by base volume from completed candles, not exact trade-price VWAP, and levels become known at candle close. Missing bars stop VWAP; incomplete periods have no levels. Not shown on TPO or Renko.
Flow & Positioning
A chart view that aligns selected-minute aggression with raw open-interest contracts and reported liquidations, keeps missing and stale states explicit, and exports the assessment as JSON with its sources and limitations spelled out. It needs a backend that answers get_flow_positioning. On the community gateway it reports the evidence as unavailable rather than inventing it.
Chrome
Near-black surfaces with square corners, a white on-state accent (the brand mark keeps its cyan), and Inter plus Roboto Mono in place of Hanken Grotesk and JetBrains Mono, all OFL and credited in THIRD_PARTY_NOTICES.md. The top bar wraps below 1150px, the watchlist rail stacks price under the symbol, the symbol picker aligns its title, search and section labels, sort chips are one flat header row, and the indicator pane header folds into the top plot. Candle conventions gain Blue/White and a custom palette; appearance persists between sessions. "Follow live" is now "Jump to latest" or "Jump to playhead", and only appears after panning away.
Routing and layout repair
/terminal/<symbol> decodes percent-escaped segments once, so Unicode-named perpetuals route. Saved ImGui window IDs are remapped across markets, which repairs docking that came up broken on startup, and automatic layouts from before layout revision 2 are repaired once to a clean preset. The historical replay failure reason is shown with wrapping instead of a generic reload prompt.
Wire format
protos/messages.proto adds STREAM_RT_HISTORY (36), the RealtimeHistory and RealtimeTradeBin messages, CensusQuality, and three census fields on LiquidationHeatmapUpdate. All additive. A gateway that never emits them keeps working exactly as before.
Build and tests
The native suite grows from 12 to 23 tests (footprint manager, RT navigation, workspace documents, reference context, candle bubble display and history, flow positioning, observed liquidations, census history, liq field tiers, and a product copy contract) and still needs no framework and no protoc, and now builds warning-clean under MSVC /W4 /WX as well as GCC -Wall -Wextra -Werror. WASM regressions cover the real-time archive worker (concurrent appends, delayed queries, reset, exact quantities, gaps, 30-minute capture and eviction), heatmap live columns and the RT mesh and pack paths. The data examples and their CI wire checks (CSV, Parquet, terminal contract) are back after a sync dropped them, and the sync that publishes this repository now refuses to run without them.
Versions and pinning
The leading v is not part of the image tag:
docker pull ghcr.io/edgedepthhq/edgedepth-terminal:0.4.0 # works
docker pull ghcr.io/edgedepthhq/edgedepth-terminal:v0.4.0 # manifest unknownThe terminal and the gateway version independently, so their numbers do not match. docker-compose.yml still pins :latest on purpose, so the quick start stays current without editing anything.
Quick start
git clone https://github.com/edgedepthhq/edgedepth-terminal.git
cd edgedepth-terminal
docker compose upThen open http://localhost:8080. No API key, no account.
v0.3.0 - Correct prices, self-host routing, replay stability
Twenty-nine commits since v0.2.0. The theme is a fresh clone behaving correctly: the price ladder, the routes, and exiting a replay.
Correct prices in the DOM and tape
Widgets were built before the symbol registry answered, so tick size fell back to 0.1 and prices rendered at two decimals. A ladder that should read 0.25382 read 2.30, 2.20, 0.00, -0.10.
It looked intermittent because it is a race, and a faster machine loses it more often: the metadata fetch interleaves with the pack's range requests, the registry misses, and nothing revisited the fallback. Widgets now rebind tick and precision from the frame loop when the registry epoch moves, a replay seeds the registry from the pack header's own tick_size so it needs no network for its grid, and an unknown tick is one representation that the DOM waits on rather than drawing an invented ladder.
Self-hosting
/terminal/<symbol>is routed. The client pushes that path a few seconds after boot and navigates to it on a watchlist click, but nginx had no counterpart, so clicking any watchlist row, and every refresh, bookmark and shared link after boot, hit a bare 404. The fallback is scoped to/terminal/rather than blanket, so document-relative scripts are still served as scripts.- arm64 images. The Emscripten stage is pinned to
$BUILDPLATFORM, so C++20 to WebAssembly runs once natively and only the thin nginx layer is built twice. Apple Silicon stops pulling an amd64 image and running emulated. - The feature list is split on data, not on tier. Volume profile, TPO and footprint were described as built client-side from tick volume. That is true of an
.edpackand false of a raw live feed, so a self-hoster wiring up the gateway and enabling VPVR saw an empty panel and reasonably concluded the list lies. Both places now name the axis and point at the Replay Library, which really does light all of them up with no account and no backend. - The exchange query parameter is matched on a key boundary.
Replay
- Exiting a replay crashed the terminal two times in five. The replay context was freed as soon as the swap callback returned, but that callback only marks the replay widgets closed and the frame loop erases them at the end of the frame. Every replay widget outlived the managers it had subscribed to, which is a hard use-after-free.
- Launching a library pack no longer renames the live chart. A pack opens on its own symbol and re-keys the dock.
- Candle artifacts on timeframe switches and anchored loads are fixed: no more flat ghost candle one period ahead of the playhead, and no empty stretch between an anchored load and where playback actually starts.
- The client stopped truncating the replay reach it is handed. It mirrored a 90-day constant that was doing two jobs, a safety bound and a product limit. It now mirrors the safety bound only, so reach the server is willing to serve is no longer silently cut short.
- Three more curated recordings in the Replay Library.
Rendering
Chinese-named perpetuals render instead of question marks. Two chart widgets no longer corrupt one ImGui window. The drawing input-map override is applied before BeginPlot, which is when ImPlot actually reads it, so it takes effect at all. TPO rebuilds when a setting that shapes it changes. VPIN pane landmarks line up with the bands the data is scored against.
Build and tests
Nine more core modules have native tests, the suite runs on Ubuntu and native Windows through CTest, and one std::tolower narrowing that only MSVC diagnoses is fixed. The pure core headers compile off Emscripten, the liquidation Field moved out of ChartWidget into its own renderer, and first-party sources build with -Wall -Wextra.
Versions and pinning
The README previously said there were no semver tags on the registry. That was wrong, and it is corrected in this release. Note the leading v is not part of the image tag:
docker pull ghcr.io/edgedepthhq/edgedepth-terminal:0.3.0 # works
docker pull ghcr.io/edgedepthhq/edgedepth-terminal:v0.3.0 # manifest unknownThe terminal and the gateway version independently, so their numbers do not match. docker-compose.yml still pins :latest on purpose, so the quick start stays current without editing anything.
Quick start
git clone https://github.com/edgedepthhq/edgedepth-terminal.git
cd edgedepth-terminal
docker compose upThen open http://localhost:8080. No API key, no account.
v0.2.0 - Replay Library, Windows builds
Replay Library
Curated market recordings, playable with no live feed and no account. Open Replay then Open Replay Library, or + widget then Replay Library if a chart is already up.
Picking a recording builds its own chart, DOM and tape from an empty terminal, streams the .edpack over HTTP range requests, and plays entirely client-side. The catalog is fetched at runtime, so new recordings appear without updating the terminal.
The first entry is 30 tick-by-tick minutes from a June 2026 ZEC selloff (53 MB) including order book, tape, liquidations, footprint and volume profile.
Windows build support
The source build now works on native Windows, not just Linux and WSL2.
protocis discovered by name rather than assumed to be a Unix binary, soprotoc.exeis found, and a missing compiler points at the pinned v21.12 release for your platform- paths are quoted through the version probe, so a toolchain under a directory with a space in it configures cleanly
- the native tests moved to CMake/CTest, so Ubuntu and native Windows run the same build
- CI builds both platforms on every PR
The README documents three paths: Docker Desktop, WSL2, and native PowerShell with Ninja, with emsdk 4.0.15 and protoc 21.12 pinned.
Write your own feed
examples/synthetic_feed.py is a working feed in one file, with no protoc step and no protobuf package:
pip install websockets
python3 examples/synthetic_feed.pyOpen the terminal with ?ws=ws://localhost:8765 and it drives the chart, tape and DOM from a random walk. Swap that for a strategy, a simulator, or a replay of your own capture.
Quick start
git clone https://github.com/edgedepthhq/edgedepth-terminal.git
cd edgedepth-terminal
docker compose upThen open http://localhost:8080. No API key, no account.
Full changelog: v0.1.0...v0.2.0