Offline lab
Air-gapped research. Mock data, client-side Python, IndexedDB library — DevTools Offline still runs after first wheel load.
- S
- mock-walk
- T
- mock-poll
- E
- pyodide
- St
- local
AXIS 2.5.0 / Open Charting PWA
The chart you can own — sources, streams, engines, storage. Swap any piece without a proprietary host.
Unofficial · not affiliated with TradingView®, Inc. Not a TradingView® product.
Thesis — section loads with JavaScript. Open docs
Atlas — section loads with JavaScript. Open docs
Compose — section loads with JavaScript. Open docs
Engines — section loads with JavaScript. Open docs
Storage — section loads with JavaScript. Open docs
ADRs — section loads with JavaScript. Open docs
Run — section loads with JavaScript. Open docs
Deploy — section loads with JavaScript. Open docs
Close — section loads with JavaScript. Open docs
AXIS 2.5.0 is an open charting PWA that treats price, time, and calculation as separable axes. Sources load history from 11 built-in venues plus 103+ CCXT exchanges. Streams advance the present via WebSocket. Engines evaluate Pine Script™ — Flask, Pyodide, or Cloudflare® Worker. Storage keeps your library. Six plugin kinds share one contract. Mobile-first shell on phones, full keyboard shortcuts on desktop. Compose any lawful combination; own AXIS under AGPL v3. Demo: axis.hoox.sh.
The chart shell never embeds a closed interpreter. Evaluation is always a plugin — Flask on the desk, Pyodide offline, or a Cloudflare® Worker proxy at the edge. Swap engines without re-plumbing the watchlist.
source, stream, engine, storage, dataset, component — all share one contract. Swap a venue without rewriting the editor; add on-chain data without forking the core.
Strategy events, equity metrics, hyperparameter optimization, 10 chart themes, advanced drawing tools, and CSV export ship as first-class panels — AXIS is a laboratory, not a locked display.
Honest inventory of what ships in the AXIS PWA and its backends — not a roadmap teaser. Pick a domain on the map; entries map to registry kinds, shell chrome, language surface, and Worker API.
PWA chrome, chart host, editor, research panels — 16 entries
pwamanifest.webmanifest · service worker · void chrome (#0a0b10). Cache-first app shell; network-first for /api/*. Command palette (Cmd/Ctrl+K).
mobilePhone shell (≤767px): compact header + bottom tab bar (Chart · Panels · Editor · Studio · More), full-viewport panel sheets with swipe-down dismiss, force-single chart with slot switcher. Tablets get a scrollable topbar; desktop ≥1024px unchanged.
shortcutsGlobal chord dispatch hub with dialog-skip guard — app, chart, and editor scopes (line ops: duplicate, comment, indent, delete). Settings → Keyboard chord recorder with persisted overrides; Shortcuts modal lists defaults.
chartTradingView® Lightweight Charts v5 — price, volume, indicator, and equity panes. Multi-chart layouts (2×2 grid). 10 curated themes (Void, Classic, Mono, Obsidian, Pacific, …).
drawTrendline, horizontal/vertical/extended line, Fibonacci (retracement, extension, fan), Pitchfork, Brush, Callout, Gann, Pattern (XABCD, Head & Shoulders), Triangle, Channel, Ellipse, Arrow, Text, Price Label, Polyline, Linefill.
pine-drawLines, labels, boxes, polylines, and tables from the engine drawings payload. label.style_* with bubble tips, icon markers, yloc.abovebar/belowbar. Drawing GC for overflow.
watchlistDetachable side rail with symbol list and session memory. Topbar Venue Picker: native CEX (Binance, OKX, Bybit, Coinbase, Kraken, MEXC), CCXT gateway (103+ exchanges), local.
editorPYNE language mode (.pyne / .pine), multi-tab, pre-eval lint (idle 1s), call parameter intelligence, inline color chips, add type declarations, editor profiler, format document.
indicatorsMulti-indicator cards; visible scripts re-run when live streams advance bars. fill() bands, barcolor(), bgcolor(), hline() with linestyle, plotshape/plotchar/plotarrow.
resultsEvents (Stream / Open⇄Close position-cycle views) · Strategy · Plots · Metrics · Raw — copy, JSON, and trades CSV. Hyperparameter Optimizer tab (TPE/random/grid via pyne POST /optimize).
strategySingle-column report: P&L, win rate, return %, max drawdown, bars-held, fill counts; jump-to-bar from closed trades. Equity curve pane. Broker parameters (initial capital, commission, leverage, pyramiding). Saved runs show win %, PF, return %, max DD in the script library.
data-mgrMulti-page OHLCV backfill, density validation, gap-fill, durable IndexedDB cache. Walk-back pagination with per-venue page sizes. 100K bar historical cap.
onchainDataset plugins: DefiLlama TVL, GeckoTerminal DEX OHLCV. Worker proxy for allowlisted egress. TVL spike events, CSV export, popular protocol presets.
settingsPlugin configSchema fields become Settings controls — plugins self-describe. Editor intelligence settings (lint, hover, autocomplete, underline).
studioFull-page overlay: Runtime, Wire (compose-recipe dialog), Plugins, Settings share one viewport with left rail. Workers Manager with health cards and inspector.
managerCatalog with capability badges · Install from ES-module URL · Script Library tab. Six plugin kinds: source, stream, engine, storage, dataset, component.
Plugins are orthogonal. Keep AXIS fixed; vary the active set. Default stream pairs follow the selected source — any lawful combination still works.
AXIS fixed · plugins orthogonal · registry contract unified. Default stream pairs follow source (e.g. mock-walk → mock-poll).
Air-gapped research. Mock data, client-side Python, IndexedDB library — DevTools Offline still runs after first wheel load.
Full pynescript fidelity on the laptop: Vite AXIS app + Flask Pro API. Live Binance bars, local script library.
Same AXIS, different venue. Flip source/stream pairs (OKX, Bybit, Coinbase, Kraken, MEXC) or route through CCXT gateway (103+ exchanges) without rewriting the editor or results panel.
Upload private OHLCV, evaluate with the server engine, export strategy metrics and trades CSV.
Pages-hosted PWA + Worker proxy. Keys in KV, optional D1 script library, Durable Object stream fan-out.
Any data/engine combo with git storage — PYNE scripts as commits on GitHub or GitLab. Drafts stay local until Save.
Prove the ES-module contract: CoinGecko source + Tiny Pine engine examples via Manager Install URL — no core fork.
Browser PWA → Sources · Streams · Engines · Storage
│ (plugin registry)
│ UDTs · libraries · methods · input.*
├─ Flask API (dev)
├─ Pyodide (offline)
└─ Cloudflare® Worker + DO + KV + D1 + R2Four calculation surfaces, one plugin contract. Language fidelity (UDTs, libraries, methods, inputs) travels with the engine, not the host. The server engine points at any compatible /run endpoint — desk Flask, edge Worker, or pyne-worker. Default exec mode is auto (try compile, fall back to interpret).
Local research backend via make run. Full pynescript fidelity on your machine. Default endpoint http://localhost:5002.
In-browser Python isolate. Self-hosted vendored pynescript wheel (~14MB, no CDN). Offline after first cache. Vendored pynescript 0.5.0.
POST /api/run proxies to EXTERNAL_BACKEND today. DO streams, KV keys/usage, optional D1 scripts and R2 bundles. WebSocket client with 45s dead cooldown.
REST POST /run to HOOX pyne-worker (Python Cloudflare® Worker). Same evaluate contract: libraries, alerts, trade forwarding, script registry, bar-close cron.
In-worker Pyodide evaluation is planned (RUNTIME.md) and feature-gated. Do not assume zero-infra Python on the edge without the external backend until that path ships.
Script libraries are plugins too. Pick IndexedDB for sovereignty, cloud for multi-device, or git when the repository is the source of truth.
localIndexedDB primary store with localStorage fallback. Offline by construction. Migrates SuperChart library keys on first open.
cloudBearer-authenticated /api/scripts. Partitioned by key hash. D1 schema optional; memory store for wrangler dev.
gitGitHub or GitLab Contents API. Commit + push on explicit Save. Personal access tokens stay in browser config — never server-side by default.
Architecture decisions that shaped AXIS. Short academic form: context, decision, consequences. Numbered for citation in ops notes and PRs.
Where AXIS can run — from air-gapped browser to dual-process desk to Cloudflare® edge. AXIS is constant; the topology is chosen.
┌─ Browser PWA (always) ─────────────────────────────────────┐
│ Sources · Streams · Engines · Storage · SW cache │
└───────────────┬────────────────────────────┬───────────────┘
│ │
engine=pyodide engine=server
(no backend) POST /run
│ │
│ ┌─────────────┴─────────────┐
│ ▼ ▼
│ Local Flask (:5002) Cloudflare® Worker
│ make run /api/run proxy
│ DO /api/stream
│ KV · D1 · R2
▼
Fully offline after wheel cacheDay-to-day development with HMR AXIS and full Python fidelity.
Depends · bun · Python · hoox-pyne
make -C ../pyne run # :5002 (PYNESCRIPT_SRC if clone dir is pynescript) bun run dev # :3000
Serve the built PWA without Cloudflare® Pages.
Depends · bun build · Python 3
bun run build python3 axis_pwa_server.py # :8081
Shared public AXIS + Pro API for demos and smoke.
Depends · systemd · axis-pwa · pynescript-api
PWA axis.hoox.sh API pynescript.online
Canonical demo host: axis.hoox.sh.
Global static AXIS with edge API, keys, streams, optional D1/R2.
Depends · wrangler · axis CLI · KV · (optional D1/R2)
bun run axis:install bun run axis:deploy # or: cd worker && wrangler deploy
Worker name pynescript-axis; project ids are frozen infrastructure — do not rename casually.
No network after first load — research on untrusted or denied links.
Depends · Browser only (wheel cached)
Source=mock-walk · Stream=mock-poll · Engine=pyodide · Storage=local
Public venue data in the browser; evaluate on desk Flask or Worker proxy.
Depends · Any source/stream + server engine endpoint
Set Endpoint → Flask or *.workers.dev · Engine=server
Copyable make targets for the desk and the edge. Demo endpoints remain IP-first on HTTP until TLS lands on the VPS.
Operator entry (@hoox-sh/axis-cli): install, doctor, setup, secrets, deploy, health. Run via bun run axis … or packages/cli bin axis.
Pro API ALLOWED_ORIGINS (comma-separated). Demo may use *; production should list AXIS origins and a localhost regex.
Provision KV API_KEYS + USAGE; optional D1 pynescript and R2 indicator-bundles before Worker deploy.
Public demo: https://axis.hoox.sh. Worker: pynescript-axis. AXIS package version 2.5.0.
Own the axes. Swap the engine. AXIS stays open.