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 / Open Charting PWA
Installable AXIS for price and time. Compose sources, streams, engines, and storage — broad Pine-compatible surface via PYNE without a proprietary charting host.
Unofficial · not affiliated with TradingView, Inc. Not a TradingView product.
3×
Engines
500+
Builtins
$0
Lock-in
AXIS is an open charting PWA that treats price, time, and calculation as separable axes. Sources load history. Streams advance the present. Engines evaluate Pine Script™. Storage keeps your library. Compose any lawful combination; own AXIS under AGPL v3.
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.
Four kinds share one contract: source, stream, engine, storage. Swap a venue without rewriting the editor; swap an engine without re-plumbing the watchlist.
Strategy events, equity metrics, drawings, 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. Tabs map to registry kinds plus AXIS UI chrome, language surface, and Worker API.
| Id | Name | Tag | Detail |
|---|---|---|---|
pwa | Installable PWAoffline | Shell | manifest.webmanifest · service worker · void chrome (#0a0b10). Cache-first app shell; network-first for /api/*. |
chart | Multi-pane chart host | Chart | TradingView® Lightweight Charts v5 — price, volume, indicator, and equity panes with resize. |
draw | Drawing tools | Annotate | Cursor, horizontal line, trend, ray, rectangle, Fibonacci, measure, and text annotations on the chart. |
pine-draw | Pine Script™ drawings | Runtime | Lines, labels, and boxes from the engine drawings payload render beside interactive tools. |
watchlist | Watchlist | Market | Detachable side rail — symbol list, quick load, session memory across visits. |
editor | CodeMirror 6 editor | Edit | Pine language mode, detachable and tabbed layout, void theme tokens. |
indicators | Indicators panel | Overlay | Multi-indicator cards; visible scripts re-run when live streams advance bars. |
results | Results panel | Export | Events · Strategy · Plots · Metrics · Raw — copy, JSON, and trades CSV. |
strategy | Strategy tester | Research | P&L, win rate, max drawdown; jump-to-bar from closed trades on the chart. |
logs | System logs | Ops | Collapsible ops stream with per-line and bulk copy. Status bar shows engine, source, stream, storage. |
settings | Schema-driven settings | Config | Plugin configSchema fields become Settings controls — plugins self-describe. |
manager | Plugin Manager | Ext | Catalog with capability badges · Install from ES-module URL · Script Library tab. |
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) 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 — Pine 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 + R2Three 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 or edge Worker.
Local research backend via make run. Full pynescript fidelity on your machine. Default endpoint http://localhost:5002.
In-browser Python isolate. Installs the vendored pynescript wheel via micropip. Offline when the network is the risk.
POST /api/run proxies to EXTERNAL_BACKEND today. DO streams, KV keys/usage, optional D1 scripts and R2 bundles.
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 · pynescript
make run # :5002 cd frontend && bun run dev # :3000
Serve the built PWA without Cloudflare® Pages.
Depends · bun build · Python 3
cd frontend && 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 162.254.38.194:8081 API 162.254.38.194:5002
Demo over HTTP on a raw IP — prefer IP CTAs; hostname may be hosts-file only.
Global static AXIS with edge API, keys, streams, optional D1/R2.
Depends · wrangler · KV · (optional D1/R2)
cd frontend/worker && wrangler deploy cd frontend && wrangler pages deploy dist --project-name=pynescript-superchart
Project id pynescript-superchart is frozen infrastructure — do not rename.
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.
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.
Wrangler/Pages project remains pynescript-superchart. Brand is AXIS; optional custom domain alias later.
VPS systemd: axis-pwa (AXIS) + pynescript-api (Flask). Prefer IP URLs in public CTAs.
Own the axes. Swap the engine. AXIS stays open.