Changelog
Release history and platform updates.
0.4.0
Information architecture
- The menu has two levels. A top bar holds the three sections — Dashboards, Charts Library and Explorer — and the sidebar shows only the tree of the section you are in, at the same width in every section, so the content's left edge never moves between pages. The second tree that used to sit beside the sidebar on chart pages is now that section's own tree.
- One file holds every page's name and its one sentence. The sidebar label, the URL, the heading and the browser title are the same string read from it, and asking it for a page it does not know throws rather than printing a name no page carries. A test asserts that no label is used twice.
- The five hub pages — Markets, Fiat, Bridge & Routes, Value & Activity, Network — are index pages: one row per page, its name and its line, in importance order. The five KPI cards and five navigation cards they carried are deleted, not moved: a hub that shows figures competes with the page that measures them.
- URLs follow names. Twenty-four old-to-new pairs live in one table — eleven pages, ten chart addresses and the three Tokens views that were query strings — and every old address answers with a single 308, from /terminal/, from the /console/ era and from the bare path. A test fails on any redirect that arrives through a second hop.
- Indexes is removed, and FX Corridors, a stub since May, with it; the documents behind both were copied out first, and the FX corridor snapshot, its script and the health checks for its collections are gone from the codebase. Bridge Flow and Bridge Monitor answered the same question and are one page, Bridge, with one window control and one read of bridge_history where there were two. Tokens is four addresses — Tokens, Token Creation, Popular Tokens, Recent Tokens — because one market-cap headline stood above three pages that were not about market cap.
Four templates
- Every page under /terminal is built on one of four templates. Index: a header and a list of rows, no figures. Dashboard: a page figure with the moment it was read, one control row, then sections in reading order. Chart: one measured series, its unit beside the title, and the definition and technical note as plain text. Document: the changelog, the risk disclaimer and the feedback form.
- Every figure appears once. The page figure is in the header, a section's own figure in that section's header, and everything else in a definition list at the foot of the section it comes from. The KPI strips are gone, and nothing on a page is drawn larger than the page figure.
- One control per variable. A control that drives more than one section sits in the control row under the title, and every section it drives states in a chip what it used; a control that drives one section sits in that section's header. A section never vanishes while it loads or fails — it keeps its heading and says which state it is in.
- Tables are one structure at every width: columns drop as the screen narrows, rows and rank stay, numbers are right-aligned, and paging is the same control everywhere. Accounts read as names — the bridge is "Base Bridge", not an address — in the routes tables and in the one transfer table that Live Transactions and Swaps now share.
Landing page
- The landing page follows the same rules as the Terminal. Two decorative gradient charts behind the hero, a showcase of invented transfer cards and the grid of KPI cards with sparklines are deleted. What is left is one reading column: the hero, the live figures, the sections as rows read from the menu, and the method notes.
- Its figures are Home's readout, drawn by the same components, so the two cannot disagree. They had: the landing valued a thirty-day-old snapshot at today's prices and showed "Digital Assets 30D +1759.2%" on a day Home showed +2.3% 24H for the same figure. It also counted the hour in progress in its 24H volume, printed "$0" when volume_history answered with nothing, and dated itself from the visitor's clock rather than from a source.
Corrections
- An absence is no longer drawn as a measurement. Network Status zero-filled the minutes it had no sample for and reported 0.0000 tx/s and a 0.00 s block time; a failed read of the value API printed Digital Assets as "$0.00" and quietly left Network Value standing on fiat alone; a failed bridge_history read looked exactly like a quiet day, "$0 net, In $0, Out $0". Each shows an em-dash and names the source that did not answer, and a hole inside a series is a gap the line breaks on rather than a zero.
- Four pages draw their clocks in UTC and say so: Network Status, Live Transactions, Swaps and Transaction Volume stamped their figures in UTC and then drew their axes and rows in the browser's zone — Live Transactions printed 00:26 over a feed whose newest row was 22:26 UTC, and Transaction Volume drew local hours under "As of 00:00 UTC". On those four a time carries its zone where it stands — "Time (UTC)" as a column head, the zone in a chart's chip — and a date range given in the URL is read as UTC days too. The rest is not converted: Bridge, Fiat Flow, NVT & Velocity, Fiat On-Chain and the chart pages still draw their hour axes in the reader's own zone, unlabelled, so a 24H axis runs past the UTC moment the figure above it was read.
- No figure stands without a reading behind it. The NVT comparison table had "~73.5", "~57" and "~3.7" typed in for Bitcoin, Ethereum and Solana beside Keeta's live number; that column is gone, and what remains is the published range per network, with only the Keeta row marked as read. Recent Tokens and Popular Tokens published swap-implied prices with no guard — KUSD at $0.0₃987 off two swaps and KJPY at $1.1k off one, where the registry values them near $1 and near $0.007 — and one rule now gives a token one price across the three token views, with "—" under five swaps and the reason beside it.
- The figure over a flow chart is the window's total, not its last bucket. Read as a level, a flow's last point is the period in progress: Fiat Volume led with "$0 −100.0% 90D" above ninety days of bars, and Bridge Net Flow read "$0" for a window the Bridge page states as +$824.7K. Every metric now declares whether it is a flow or a level, a total drops the period in progress, and a window missing a period inside it states no total at all.
- The community swap job still had a KTA price of 0.25 to fall back on, the last of the hardcoded prices. A failed price read wrote that invented number into the token list and into every USD field derived from it, with nothing on the page to show for it. The job now starts from the last price actually read and skips the run when there is none.
0.3.0
Settlement Routes
- New section under Analytics: which parties a transfer was observed to settle through, derived from the counterparties of each settlement. Keeta settles atomically — measured on mainnet, 53 of 53 multi-operation transactions had every leg in the same block — so a route cannot be read from block ordering. It comes from who the operations moved value between, which was already in the indexed data.
- Four pages. Overview charts throughput, value, live routes and route-class activity, with a sortable table of every observed path. Parties is a master-detail view per account: an origin-to-destination matrix, per-account small multiples on a shared scale, and inbound / outbound / round-trip over time. Routing Graph shows what the anchor resolver declares the network can route. Method carries every caveat, once.
- Backfilled to 90 days. The route aggregation held 31 days; the underlying transactions held 149, so the missing span was recomputed with the same function the hourly job uses.
- Every declared route that can touch Keeta is listed — 226 of the registry's 4,105 edges, grouped into 70 provider corridors. The other 3,879 belong to a provider that declares no Keeta location and can never appear in settlement data, so listing them as potential routes here would not have been true.
Workbench
- A new tool at Charts Library → Workbench: pick a measure, a breakdown, a resolution and a transform, and the chart appears. Two sources — settlement routes and network volume — with the whole configuration in the URL, so a chart you build is a link you can send.
- Transforms run over data already fetched: cumulative, moving average, rebase to 100 and change per period. Rebasing indexes each series against its own first reading, so series of very different sizes can be compared by movement.
- It offers only combinations the stored data can answer. Per-token breakdown, per-provider breakdown, hop counts and distribution statistics are absent because the aggregation does not hold them, and the reason is recorded next to each.
Corrections
- A community token declared itself "USDT" and was presented as Tether. It was swapping 18 million of itself against $16 of KTA. Two paths allowed it: the indexer took a token's own on-chain metadata at face value, and the symbol resolver mapped anything named "usdt" or "tether" to USDT. Neither checked an address. USDT and PYUSD have been removed from the codebase entirely — they were carried in eleven places with no address anywhere, which is a placeholder any token can occupy. A symbol is now confirmed only by a registered address, and a token claiming a confirmed symbol without being that address is marked rather than believed.
- Bridge withdrawals were invisible in route data. The escrow vault was filtered out as bookkeeping, but a withdrawal sends user to vault, so removing the vault left nothing to route. Measured: 68 vault sends in 400 consecutive transactions, none of them counted.
- The route mix chart rendered in the bottom 1% of its own frame. It computed percentages and then asked the chart to normalise them again, against an axis pinned to 0-100. Replaced with unstacked counts, which also show a class going quiet — a share chart cannot.
- The headline figure above every multi-series chart ignored the series you selected. It was computed from the first key of everything fetched, so on Fiat Composition, picking CAD showed HKD's value. It now follows the selection, and shows nothing when several series are drawn rather than silently speaking for one.
- Sent and Received misreported every swap desk. A round trip leaves and arrives at the same party, so it was counted on both sides — the FX resolver read 449 out and 419 in when it is really 86 out, 56 in and 361 round trips.
- Route classification keyed on display labels and worked by coincidence: one account's label happened to contain the word "bridge". Renaming that account would have silently reclassified its traffic. It now keys on a frozen identifier.
- Coverage was removed rather than annotated. It read as a completeness score and could never reach 100%: of 1,997 unrouted transactions in a 3,000 sample, 1,324 are plain wallet-to-wallet sends that pass through no infrastructure and so have no route to show.
Interface
- The sidebar uses one type system. Group headings were small tracked capitals sitting directly above sentence-case items; they now match the items, with weight and colour carrying the hierarchy.
- Chart toolbar labels dropped their tracked capitals for the same reason — one word in capitals among sentence-case siblings reads as a different system rather than as emphasis.
- Section cards on the landing page and Terminal Home lost the small grey tag line under each description. It restated the sentence above it in fewer words.
0.2.0
Terminal
- Reorganised the product around a new information architecture: a marketing landing page at the root, and the whole application under /terminal with permanent redirects from every previous URL.
- New sidebar as a catalog tree — Home, Dashboards, Charts Library and Explorer — with collapsible groups that remember their state.
- Light theme is now the default for first-time visitors.
Charts Library
- Added a searchable catalog with a dedicated page per metric, driven by a central metric registry and rendered on a new ECharts engine with pan, zoom, crosshair, log scale and PNG export.
- Rebuilt Fiat On-Chain as a master-detail view with per-currency series in native units.
- Line charts are now filled, matching the area charts; multi-series charts stay unfilled so crossings remain readable.
Data integrity
- Fixed nine paths where the transaction indexer could stop reading early and still advance its cursor. Anything skipped fell behind the cursor and was never re-read — silently, while the run reported success. The scan must now prove it covered the window before the cursor moves, and fails visibly when it cannot.
- Timestamps are no longer invented. A staple whose timestamp could not be read was previously stamped with the current time, which could push the cursor into the future and stop indexing permanently while every health metric still read green. Such rows are now recorded separately and never touch the cursor.
- The reconciliation watchdog no longer reports a clean window when it read an incomplete one. It shared the same defects as the code it audits, so a decode failure was invisible on both sides of its comparison. Its first supervised run confirmed 324 staples on chain against 324 indexed.
- Transactions that arrive after their hour has closed are now counted. They were previously dropped by both the live and the batch aggregation layer.
- A backlog can now drain. The scan keeps what it read and resumes where it stopped, instead of restarting from the chain tip each minute and never finishing.
- Repaired daily active addresses for 8–10 July, where a failed read had left 9 July recorded as zero despite 631 real transactions that day.
Fixes
- Daily Swap Volume, Cumulative Swap Volume and Community Token Prices rendered blank; their stored time labels carried no year and could not be read back as dates.
- The Daily Active Addresses chart no longer dips below its axis, and the Wallet Tiers change column now follows the selected range instead of always showing 30 days.
- The Base chip is now identical on the landing page and in the live feed.
- Panels that cannot read their data now say so, instead of showing an empty state that looks like a healthy zero.
0.1.12
Summary
- Added a fiat dimension for Keeta Personal with three new analytics pages: Fiat On-Chain (per-currency supply in native units), Fiat Flow (deposit/withdrawal ramp), and Fiat Composition (book registry + share-over-time).
- Corrected on-chain parsing so fiat deposit/withdrawal flow is attributed and counted correctly; previously these operations were silently dropped, leaving ramp flow blank.
- Added a Fiat Volume KPI and a dedicated Fiat Volume chart on Transaction Volume; reframed Volume by Asset Class as share-of-period to avoid misleading scale.
- Pre-aggregated the fiat supply series so the Fiat On-Chain page reads a single document per visit.
0.1.11
Summary
- Hardened transaction indexing so cursors advance only after dependent data writes complete.
- Corrected aggregate data handling for active addresses, community token totals, and transaction filtering.
0.1.10
Summary
- Improved bridge reconciliation, explorer/indexer visibility, and analytics presentation.
- Reduced noisy NVT and velocity interpretation so the metrics read more neutrally.
0.1.9
Summary
- Aligned bridge classification across explorer, dashboard, and scheduled data jobs.
- Added rebuild and regression coverage for bridge and resolver data flows.
0.1.8
Summary
- Improved Explorer loading states and empty-state messaging.
- Hardened transaction indexing, pagination, dedupe, and pipeline reliability.
- Moved more dashboard data to indexed and pre-aggregated sources.
0.1.7
Summary
- Rolled out the lighter UI system across key product pages.
- Added FX Liquidity and improved market/dashboard readability.
- Improved mobile layout behavior across explorer and swaps.
0.1.6
Summary
- Updated certification, NVT, and velocity pipelines.
- Cleaned up deployment and navigation behavior.
0.1.5
Summary
- Mobile-first UI pass across dashboard, analytics, explorer, and market views.
- General layout, readability, and consistency improvements.
0.1.4
Summary
- Expanded swap volume tracking and Network Status metrics.
- Improved dashboard summaries, bridge flow views, and supporting data infrastructure.
0.1.3
Summary
- Moved pricing and bridge widgets toward Firestore-backed data.
- Improved audit visibility and corrected several metric-labeling issues.
0.1.2
Summary
- Improved bridge, TOCV, capital flow, and token market data accuracy.
- Expanded internal reporting and screenshot views.
0.1.1
Summary
- Added admin screenshot views and X profile links.
0.1.0
Summary
- Added liquidity token indicators and token market cap improvements.