CIOport
Trading Terminal with comprehensive macro news and intelligence.
CIOport
A trading terminal with an event-intelligence overlay.
Live at cioport.app
Next CIOport update gates on CIOport becoming a product. It gets scheduled only after I understand what users need, not before. 0.1.2/M8 is the furthest I can take CIOport without solid product judgment and user understanding. M9 and beyond will be developed but not deployed until product decision.
CIOport is a cockpit that binds macro/geopolitical events to your own holdings β βthis event just touched these positions you holdβ β and surfaces it as explainable, advisory hints inside an actionable trading terminal. At its center is the eventβasset linkage engine: a join across events Γ your portfolio Γ market data Γ news, rendered as hints on the assets you actually hold, alongside an event-on-map monitor, a positions/P&L dashboard, holdings-bound alerts, and (paper-first) order entry.
Architecture
CIOport is built as three zones over one hexagonal core, with a single shared linkage kernel that runs on two hosts:
- Edge β object storage + CDN serving per-layer, content-addressed, immutable snapshots under a signed manifest that pins a co-valid epoch, regenerated on a schedule; open layers are public and private layers (e.g. quotes-driven P&L, news) sit behind a lightweight auth gate.
- Client β a TypeScript SPA that joins the broadcast snapshot to your local holdings and renders the advisory faces: eventβasset hints, estimated P&L, the event monitor.
- Server β a Go modular monolith holding the core that stays server-side: alerts, execution, authoritative persistence, ingestion, and licensed data.
One shared RustβWASM linkage kernel runs in the browser (Web Worker), in the producer (via wazero, in-process), and in the local MCP connector (Node) β one scoring logic, three hosts, byte-identical output at equal snapshot + kernel version. Tenancy (org_id) and the ApprovalPort are parameters: single-user is the degenerate org_id = self + pass-through case; a team config is the same structure with maker-checker populated. The action space stays advisory β notify / highlight, never auto-trade; a human initiates every order, and broker secrets never leave the backend.
| Zone | Responsibility |
|---|---|
| Edge (object storage + CDN) | Per-layer immutable snapshot artifacts + signed manifest (the atomic consistency point) |
| Client (TS SPA + Web Worker) | UI cockpit + client-side compute: hint join, estimated P&L, snapshot cache |
| Server (Go modular monolith) | Read-model domain modules Β· Intelligence (alerts + snapshot publisher) Β· Execution write plane Β· Postgres + ingestion |
| Shared kernel (RustβWASM) | One linkage/scoring logic hosted on both the browser and the server |
| Ports & adapters | EventProvider (GDELT) Β· MarketDataProvider (Polygon/Twelve Data) Β· NewsProvider (Marketaux/Tiingo) Β· BrokerPort (paper default Β· IBKR/Saxo/Alpaca/crypto) |
Current architecture (M0βM4)
The table above is the full target shape; the always-on server (eager alerts, execution / broker, Postgres, O(feeds) ingestion) is not built yet. What runs today is a strict subset β a scheduled producer publishes immutable snapshots to a CDN, and a browser computes over them. There is no always-on origin:
free, no-key public sources
GDELT Β· Yahoo Β· USGS/EONET/GDACS Β· CoinGecko Β· FRED Β· Finnhub
Β· UCDP / GPR / V-Dem Β· wire & Google News
β capture
βΌ
ββ PRODUCER β scheduled job (serverless cron Β· scale-to-zero) ββββββββββββββββββ
β capture sources β score (anomaly Β· trend Β· composite risk, weights-as-data) β
β β assemble per-layer immutable snapshot β SIGN a co-valid manifest β
βββββββββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββββ
β publish (~15 min)
βΌ
ββ EDGE β object storage + CDN (+ the static SPA) βββββββββββββββββββββββββββββ
β PUBLIC : events Β· composite Β· baseline Β· trend Β· reference Β· rules β
β Β· SIGNED MANIFEST (pins a co-valid epoch) Β· basemap β
β PRIVATE: quotes Β· news β served only through the auth gate β
ββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββ
fetch β SPA + public layers + manifest β private layers
βΌ βΌ (Bearer JWT)
ββ CLIENT β TypeScript SPA + Web Worker (your browser) βββββββββββββββββββββββββ
β cockpit: event map Β· composite scores Β· news/signal feed Β· indicators Β· β
β portfolio overlay Β· est. P&L β
β Web Worker β RustβWASM kernel: verify signed manifest β hint join β
β (events Γ your local holdings) Β· est. P&L Β· indicators Β· scenario what-if β
β Β· in-app alert when a fresh event touches a holding β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
auth: the edge gate is also the token issuer β sign-in delegates to an external
identity provider (OIDC), and the edge mints the short-lived session JWT it then
checks before serving the private layers β the public plane needs no sign-in.
the SAME RustβWASM kernel runs in the browser AND in the producer (one logic).
Tech stack
- Server: Go (modular monolith)
- Shared kernel: Rust β WebAssembly (browser Web Worker + server via wazero)
- Client: TypeScript SPA (Vite) + Web Worker
- Data: Postgres
- Schema pipeline: Rust serde structs β JSON Schema β generated Go + TypeScript (single source of truth)
Current state
Build underway β M0βM8 complete and live: the monitor is live, holdings-bound, refreshed on a cadence, given an interface & brand pass, built out into a full analysis terminal, hardened for integrity with its snapshot verified before compute, deepened with more sources and correlation, and extended into new product surfaces β replayable history, portability, shareable views, an AI connector, and a rule builder. Beyond the deployed line, M9 (server-side sync) and M10 (push alerts + the mobile app) are built on branch but not yet deployed (per the note at the top) β the first always-on server, cross-device holdings, server-eager push that fires with the tab closed, the native Android/iOS app, and extra alert channels. The architecture is settled (docs/CIOPORT_ARCHITECTURE.md); the build is sequenced UI/intelligence-first and QC-gated milestone by milestone (docs/CIOPORT_DEVELOPMENT.md, executable steps in docs/CIOPORT_M0_STEPS.md β¦ docs/CIOPORT_M10_STEPS.md).
M0 β Boot contracts laid the foundation: the schema contract (RustβGo+TS with a drift gate), the RustβWASM kernel with its host ABI and a browser round-trip, and a Vite SPA + Web Worker shell.
M1 β Intelligence monitor is the monitor itself: open the app and see a macro/geopolitical intelligence picture (no holdings yet), computed right in your browser over a real data snapshot.
- Real data, from free public sources β a capture step pulls a historical slice from free, no-key sources (GDELT, Yahoo Finance, wire & Google News, World Bank, USGS/EONET/GDACS, CoinGecko) and turns it into the monitorβs signals β anomaly baselines, trends, and two composite risk scores (per-country geo-risk Β· per-instrument market-regime), published as a verifiable, versioned snapshot.
- Computed in-browser β a shared RustβWebAssembly engine runs the technical indicators (moving averages, RSI, MACD, Bollinger) and the anomaly/trend scoring in the page, checked against the data producer so the numbers always agree.
- The cockpit β a fast, framework-free UI: a 2D event map with quake/disaster layers, composite-score panels with their breakdown, a news/signal feed, indicator and anomaly/trend panels, an honest βwhatβs missing or staleβ source tracker, and a β/Ctrl-K command palette with one-key layout presets.
M2 β Portfolio bind adds your holdings on top of the monitor β βthis event touched what you holdβ β still computed in your browser over the same snapshot (docs/CIOPORT_M2_STEPS.md):
- Your holdings, your way β add positions by hand (saved in your browser), with room for a server account or a broker sync to plug in later without a redesign. Holdings are advisory only β the app will notify and highlight, never auto-trade.
- The bind β the in-browser RustβWebAssembly engine links events to the assets you actually hold: explainable, time-stamped hints, a portfolio risk-exposure view broken down by holding / country / sector / issuer, and an estimated P&L β each checked against a hand-labeled reference, so the bind is correct rather than hand-wavy.
- The lens β per-holding hints, the exposure breakdown, touched events ringed on the map, estimated P&L (honest when a cost basis is missing), what-if scenarios (inject a hypothetical event or nudge a countryβs risk and watch your exposure move), and simple custom rules β all reachable from the command palette and a portfolio preset.
M3 β Live intelligence turns the monitor from a one-time snapshot into a living dashboard (docs/CIOPORT_M3_STEPS.md):
- Always current β the monitor refreshes itself on a schedule and updates in place, with no reload. Fresh events, prices, and scores flow in, and your portfolio view moves on its own.
- Signals you can trust β an event is flagged against your holdings only once several independent, credible sources agree on it, with noisier sources counting for less β fewer false alarms. The source mix widens, too (UCDP conflict data, a geopolitical-risk country index, V-Dem, FRED, Finnhub) on top of the originals.
- It tells you when the world moves your portfolio β the moment a fresh, corroborated event touches something you hold, you get an in-app alert (and, if you allow it, a desktop notification).
- Public map, private portfolio β the intelligence layer (events on the map, risk scores, anomalies) is open to everyone; a quick sign-in unlocks your private view β live estimated P&L and the news feed.
It stays automatically verified end-to-end and runs without an always-on server, so it keeps refreshing on its own at minimal cost. Through M3 the focus was being correct and genuinely useful; M4 is the first pass at how it looks and feels.
M4 β Interface & brand is a design pass over the live monitor β same intelligence, presented like an instrument:
- A real map β the event map now draws land, water, and borders over a self-hosted vector basemap, instead of plotting markers on an empty field.
- A one-screen cockpit β the dashboard fits the viewport with no long page scroll: each panel scrolls on its own, and the β/Ctrl-K presets swap focused views β the way professional terminals are laid out.
- A considered look β a restrained graphite-and-silver palette where the only colour on screen is the data itself (gains and losses, risk, staleness), so the numbers draw the eye, not the chrome.
- Sources, two-plane β per-item source reliability stays public in the feed; the full named provider roster moves behind sign-in.
M5 β The Terminal turns the monitor into a full, symbol-focused analysis terminal β still $0/serverless, still computed in your browser (docs/CIOPORT_M5_STEPS.md):
- Interactive charts with your intelligence on them β candlestick charts with the in-browser engineβs indicator overlays (moving averages, RSI, MACD, Bollinger) and event/hint markers on the price time-axis β the events that touched your holdings, plotted against price. That fusion is the thing a generic charting product structurally canβt do.
- Live prices with no server, no account β crypto price history streams straight from a keyless public source into your browser (no key, no backend); equity price, charts and P&L arrive the same way once you connect a free market-data key of your own (kept in your browser, never sent to us), with a broker sync available later.
- More instruments on the cockpit β an economic calendar (macro releases with the reported figures) and macro indicator series, a signals panel (market sentiment/flow gauges like Fear & Greed), and a sector risk heatmap rendered from the composite risk scores β all reachable from the command palette and a dedicated Terminal preset.
- Honest about data rights β market-data sources are routed by their license: openly-redistributable data is served from the CDN, display-only data sits behind sign-in, and personal-use-only data is fetched by your browser directly from the source (never re-hosted) β so the app maximizes free data without redistributing anyoneβs feed.
M6 β Integrity & trust hardens the foundation and adds three fixes you can see (docs/CIOPORT_M6_STEPS.md):
- Verified before itβs shown β each snapshot is checked against a cryptographic signature before anything is computed over it, and the status bar shows a verified cue when it passes; a snapshot that fails is refused, not displayed.
- Your data is legible when a vendor is quiet β a connected market-data vendor now shows its own status (last successful fetch, or its quota/error note), so an empty equity chart explains why instead of going blank.
- The hint lens is populated at rest β the βthis touched what you holdβ view shows relevant hints without needing a what-if scenario.
- Trustworthy by construction β under the hood, the producer and the in-browser engine are cross-checked to agree on every publish, and the public/private data routing derives from a single source of truth so it canβt drift.
M7 β Depth at $0 deepens the intelligence itself β more sources, more correlation, fuller coverage β still $0/serverless and still computed in your browser (docs/CIOPORT_M7_STEPS.md):
- More of the world, corroborated β the event stream gains dedicated conflict/unrest depth (UCDP armed-conflict data, a geopolitical-risk index, V-Dem) plus news-derived corroboration: headlines are mined for conflict/security signals that can only reinforce an event several independent sources already report, never raise an alarm on their own.
- Where independent streams agree β a cross-stream correlation lens surfaces the places where separate feeds (conflict, hazards, anomalies) cluster in the same place and window β as a geo-density layer on the map and as a dimension inside the risk scores, so agreement between streams actually moves the numbers.
- Hints that cover the whole map β the eventβholdings rule pack grows from a demo handful into a full matrix over a stable set of event classes β armed conflict, civil unrest, and natural hazards (earthquake, storm, flood, wildfire, volcano, drought). Every raw source category is normalized onto that one vocabulary, with a build-time check that no class ships uncovered and no upstream category slips through unmapped.
- A richer market-regime read β the per-instrument market-regime score now folds in real regime inputs β market sentiment (Fear & Greed), the rates backdrop (Treasury yields), and crypto momentum β routed by asset class, so the risk heatmap tells crypto and equity regimes apart.
- Deeper macro β the economic calendar and macro panels broaden well past a starter set: many more US series (growth, inflation, employment, rates, industrial production, sentiment, money supply, oil) and World Bank development indicators fetched across multiple regions, not just the world aggregate.
M8 β Reach at $0 extends the terminal into new product surfaces β still $0/serverless (docs/CIOPORT_M8_STEPS.md):
- Rewind the world β snapshots are retained as they publish, and a time scrubber replays how risk evolved across the day: map, scores and charts move together. Any moment is a shareable link (the viewβs preset, symbol, layers and scrubbed moment live in the URL β never your holdings or rules).
- Your data is yours β export holdings, watchlist and rules to one JSON file (plus CSV) and import it anywhere the app runs, merge-confirmed. Exports carry user-authored data only.
- Point your AI at it β a local, read-only MCP connector (
mcp/) lets an agent query world events, risk scores, macro, signals and the calendar β and, aimed at your exported portfolio file, which events touched what you hold. It hosts the same RustβWASM kernel as the app (a third host of one logic), reads only the public data plane, and returns context, never trade recommendations. - Rules you compose β watch rules become a condition builder (field Β· operator Β· value, with severity floors over a new normalized event-severity axis: quake magnitude, disaster alert level, conflict intensity on one scale), with a test-fire preview that runs the real kernel join before you save.
- Graceful offline β a service worker caches the public snapshot, so warm loads are faster and a dropped connection shows the last snapshot with an honest offline cue. (Installability is deliberately deferred to the mobile milestone, where it ships together with push.)
The milestones below are built on branch but not yet deployed β the deployed line stays at 0.1.2/M8 until the product decision at the top of this README.
M9 β Server-side sync stands up the first always-on server, so your portfolio stops living in a single browser (docs/CIOPORT_M9_STEPS.md):
- Your holdings follow you β sign in and your holdings, watchlist and rules sync across devices, stored server-side and scoped to your account; your M8 export is the migration payload. Signed out, everything still runs locally, exactly as before.
- First-party sign-in β authentication is first-party: the edge issues your session and the server is a pure verifier of its own tokens (no third-party auth broker in the path).
- A hosted connector β the local MCP connector gains a hosted, holdings-bound upgrade: an agent can ask about your exposure over an authenticated link β org-scoped, read-only, returning context, never trade recommendations.
M10 β Push alerts + the mobile app makes βthe world moved your portfolioβ reach you when the app is closed, and puts the cockpit in your pocket (docs/CIOPORT_M10_STEPS.md):
- Alerts that fire with the tab closed β the server recomputes, each epoch, which fresh corroborated events touched your holdings and pushes you a pointer β symbol, headline, and a link to the hint β never any licensed data in the notification. Standard Web Push covers desktop and Android browsers with no install.
- The CIOport mobile app β the same cockpit wrapped as a native app for Android and iOS, with native push (FCM/APNs), a biometric app lock, a share sheet, and alert haptics. The app is the install path for mobile β there is no web βadd to home screenβ.
- Alerts where you already are β route the same alerts to Slack, Discord, Telegram or a webhook, with quiet hours that hold and release across the window.
- An open tab reacts instantly β an optional live-refresh stream updates an open tab the moment an epoch turns; polling stays the fallback.
- Lighter on a small screen β the event map has a low-end mode (clustered markers, no heavy density raster), chosen automatically on modest devices and toggleable by hand β the intelligence is unchanged, only the mapβs weight.
Roadmap
QC-gated milestones, UI/intelligence-first and dependency-ordered β each is loadable and reviewable before the next begins. M0βM3 reach a live, holdings-bound intelligence monitor, M5 builds it into a $0/serverless analysis terminal (including equity charts/P&L via your own free market-data key), M6 hardens it for integrity (snapshot verified before compute) with three visible fixes, M7 deepens the intelligence itself (more sources, cross-stream correlation, full hint coverage, a richer market-regime read, deeper macro), and M8 turns the $0 tier into product reach (time-scrub history, portability, shareable links, a local MCP connector, a rule builder). M9 (server-side sync) and M10 (push alerts + the mobile app) are built next β the first always-on server and the native app β followed by a broker connection, paid data tiers, commercial and team features, live execution, and an evidence-gated native-UI mobile app, sequenced as M11βM16 in docs/CIOPORT_DEVELOPMENT.md (each with its own step doc).
| Milestone | Capability | Status |
|---|---|---|
| M0 β Boot contracts | Schema contract (RustβGo+TS) Β· shared kernel WASM ABI Β· web shell. The app loads and the worker round-trips the WASM kernel | β Done |
| M1 β Intelligence monitor | Open the app and see a comprehensive macro-level news & intelligence monitor β events on a map, composite-score panels, news/signal feed, technical-indicator & anomaly/trend panels, a per-source freshness/gap surface, and a Cmd/Ctrl-K command palette with layer presets β computed client-side over a captured snapshot (no holdings yet) | β Done |
| M2 β Portfolio bind | Add holdings and see binding inside the monitor β βthis event touched what you holdβ: hint join + portfolio geo-risk exposure with decomposition + estimated P&L, as an overlay, with what-if scenarios and your own watch rules | β Done |
| M3 β Live intelligence | The monitor goes live β data refreshed on a cadence with deeper signals (cross-source corroboration, source-credibility, anomaly/trend), in-app notifications when something new touches your holdings, and a public + signed-in two-plane delivery | β Done |
| M4 β Interface & brand | A design pass over the live monitor: a real land/water/borders basemap, a one-screen cockpit (viewport-fit, per-panel scroll, preset-driven views), a restrained graphite-and-silver palette that reserves colour for the data, and a two-plane source surface (public reliability, signed-in provider roster) | β Done |
| M5 β The Terminal | A full analysis terminal over the same foundation: candlestick charts with in-browser indicator overlays and event/hint markers on the price axis, keyless crypto price history, equity price/charts/P&L via your own free market-data key (kept in your browser), an economic calendar + macro series, a market sentiment/flow signals panel, a sector risk heatmap, and a dedicated Terminal preset β all $0/serverless | β Done |
| M6 β Integrity & trust | Hardening + three visible fixes: the snapshotβs signature is checked before anything is computed and the status bar shows a verified cue when it is; connected market-data vendors show a per-vendor status line (last fetch / quota note) so an empty equity chart explains itself; and the eventβholdings hint lens is populated at rest | β Done |
| M7 β Depth at $0 | Deeper intelligence over the same foundation: more conflict/unrest sources (UCDP Β· geopolitical-risk index Β· V-Dem) plus news-derived corroboration, a cross-stream correlation / geo-density lens that also moves the risk scores, a full eventβholdings rule matrix over a normalized event-class vocabulary (conflict Β· unrest Β· natural hazards) with a coverage gate, a market-regime read enriched by sentiment/rates/momentum routed by asset class, and deeper macro (many more FRED series Β· multi-region World Bank) β all $0/serverless | β Done |
| M8 β Reach at $0 | New product surfaces over the same foundation: retained snapshot history with a time scrubber, shareable permalinks (view coordinates in the URL), holdings/rules import/export, a local read-only MCP connector (the same kernel, hosted in Node β ask your AI about your exposure), a rule condition-builder with a normalized event-severity axis and test-fire preview, and a graceful-offline service-worker cache β all $0/serverless | β Done |
| M9 β Server-side sync | The first always-on server: holdings/watchlist/rules follow you across devices (sign-in, org-scoped, import your M8 export as the migration payload), first-party session issuance, and a hosted, holdings-bound MCP upgrade | π§ Built Β· not deployed |
| M10 β Push alerts + the mobile app | βThe world moved your portfolioβ fires with the tab closed: server-side eager alerts behind a notification port, Web Push (desktop + Android browsers, no install), and the CIOport mobile app for Android & iOS β the same cockpit in a native package with native push (FCM/APNs), a biometric app lock, share-sheet and alert haptics β plus extra notify channels (Slack/Discord/Telegram/webhook) with quiet hours, an optional live-refresh stream, and a low-end lighter-map mode. A notification is a pointer, never licensed data. | π§ Built Β· not deployed |
| M11 β Broker (paper-first) | Link a brokerage (sandbox OAuth) for holdings sync and paper order entry β every order carries the snapshot epoch it was decided against; a human initiates every order, never auto-trade | Planned |
| M12 β Paid & licensed data | The entitled tier: licensed real-time quotes, tagged news wires, GICS/credit reference, fundamentals/disclosures depth, and social news & sentiment (X/Twitter and others) β every source routed by its license, server-side where redistribution is off-limits | Planned |
| M13 β Commercial | Billing, plans and quotas, multi-user organizations, and the scale-seam flips (cache/pub-sub/instances) as load demands | Planned |
| M14 β Desk | Team workflows: maker-checker order approval, roles, an immutable compliance audit view, row-level tenant isolation | Planned |
| M15 β Live execution | Real-broker order routing as an explicit, gated flip from paper β with hard limits, confirmations, and the same human-initiates invariant, last and most carefully | Planned |
| M16 β Native-UI mobile app | The mobile appβs core surfaces (monitor, hints/alerts, portfolio glance) rebuilt in native UI (SwiftUI / Jetpack Compose) over the same Rust kernel via native bindings β evidence-gated: built when the shell appβs measured UX ceiling demands it | Planned |
Keywords
- Languages:
GoΒ·RustΒ·WebAssemblyΒ·TypeScript - Architecture:
Hexagonal (Ports & Adapters)Β·Modular MonolithΒ·Three-Zone Compute Split (edge Γ client Γ server)Β·Shared RustβWASM KernelΒ·Tenancy & Approval as Parameters - Schema & Kernel:
Rust β JSON Schema β Go + TypeScript CodegenΒ·Signed Manifest / Content-Addressed SnapshotsΒ·WASM Kernel ABIΒ·Web Worker HostΒ·Verify-Before-Compute - Intelligence & compute:
Technical Indicators (MA/RSI/MACD/Bollinger)Β·Welford Anomaly BaselinesΒ·Linear-Regression TrendΒ·Composite Risk Scoring (weights-as-data)Β·Deterministic Offline ProduceΒ·Two-Phase Capture (free public sources) - Portfolio bind:
EventβAsset Hint JoinΒ·Portfolio Geo-Risk Exposure BindΒ·Four-Axis Exposure DecompositionΒ·Estimated P&LΒ·Scenario What-IfΒ·User-Authored Rules (merged pack)Β·Source-Aware Holdings RepoΒ·Interactive Request/Response Web Worker - Live & delivery:
Scheduled Regeneration (serverless cron)Β·Epoch-Refresh (content-addressed layer diff)Β·Cross-Source Convergence Gating (K-of-N)Β·Source-Credibility WeightingΒ·Productionized Anomaly/TrendΒ·Client NotificationsΒ·Two-Plane Delivery (public CDN + auth-gated)Β·Delegated Authentication - Terminal (M5):
Candlestick Charts (KLineChart)Β·Kernel-Fed Indicator OverlaysΒ·Event/Hint Markers on Price AxisΒ·Economic Calendar + Macro SeriesΒ·Sentiment/Flow SignalsΒ·Sector Risk Heatmap (inline SVG)Β·License-Tiered Market-Data Routing (broadcast / gated / direct / blocked)Β·C-Direct Client-Fetch (keyless crypto OHLC)Β·Terminal Preset - Depth at $0 (M7):
Cross-Stream Correlation / Geo-Density (stdlib lat-lon binning)Β·News-Derived Event CorroborationΒ·Canonical Event-Class Vocabulary (normalization + drift gate)Β·Full Rules Coverage Matrix (soundness-#9 merge gate)Β·Market-Regime Signals by Asset ClassΒ·Multi-Region Macro Depth (FRED Β· World Bank) - Reach at $0 (M8):
Epoch History Retention (content-addressed, count-pruned)Β·Time-Scrub ReplayΒ·Shareable Permalinks (view-state-only URLs)Β·Holdings/Rules Import-Export (versioned round-trip)Β·Local MCP Connector (stdio Β· third kernel host in Node Β· origin-guarded)Β·Rule Condition-BuilderΒ·Normalized Event Severity (mag/alert/intensity β one axis)Β·Service-Worker Offline Cache (license-boundary) - Server sync (M9):
First-Party OAuth 2.1 Issuer (edge Worker)Β·Org-Scoped Holdings Persistence (Postgres)Β·Optimistic-Concurrency Bundle PUT (ETag)Β·Pure-Verifier Go API (own JWKS)Β·Hosted MCP (holdings-bound Β· read-only Β· org-scoped)Β·Fourth Kernel Host (hosted connector) - Push & mobile (M10):
Server-Eager Inverted-Join Alerts (per-epoch gated-hint diff over wazero)Β·Web Push (VAPID Β· RFC 8291)Β·FCM / APNs (Capacitor shell)Β·First-Party Native OAuth Client (PKCE Β· system browser Β· keystore refresh)Β·Pointer-Not-Payload Notification AllowlistΒ·Notify Channels (Slack/Discord/Telegram/webhook) + Hold-&-Release Quiet HoursΒ·Config-Gated SSE Refresh Hub (LISTEN/NOTIFY)Β·Low-End Map Budget (device heuristic Β· clustered markers)Β·Biometric App Lock