Worker plane
POST /mcp over Streamable HTTP with a pn_… Bearer key. Stateless JSON-RPC tools for health, run, the cloud script library, market and on-chain proxies, keys, and usage — no browser tab required.
AXIS 2.28.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.
What's new — section loads with JavaScript. Open docs
Thesis — section loads with JavaScript. Open docs
Atlas — section loads with JavaScript. Open docs
MCP — 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
Plans — section loads with JavaScript. Open docs
AXIS 2.27 makes idle pre-eval single-pass — 5.9 s → 43 ms at 2 000 lines, 22 s → 120 ms at 4 000 — and ships offline Pine Script™ symbol navigation (definition, references, rename, highlight) plus W002 / W104 lint parity on the vendored pynescript-0.6.29 wheel. 2.26 keeps live paint tip-only while you range, defers window-slide setData, tightens chart.lag rings, and points the CLI at https://pynescript.online. 2.25 made the Rolling window the chart window. This plate is the recent surface — not the full changelog.
AXIS 2.27.0 · 2026-11-01
Full changelogscanAllCallSites is single-pass O(n) instead of O(n²): open parens stack and each call parses when its closer lands, so idle pre-eval with both lint passes on drops from ~5.9 s → 43 ms at 2 000 lines and ~22 s → 120 ms at 4 000 (unclosed mid-edit calls are skipped). A local symbol index answers Go to Definition, Find References, Rename, and occurrence highlight without a Pro API round trip — F12 / Shift-F12 / F2 work in Pyodide and offline, with indentation-scoped Pine Script™ resolution that refuses builtins, keywords, collisions, and type / enum members. Offline lint now flags pre-v5 //@version (W002) and removed v6 kwargs (W104: when= on strategy orders, transp= on drawings / plots). Vendored wheel: pynescript-0.6.29.
AXIS 2.28.0 is an open charting PWA that treats price, time, and calculation as separable axes. Sources load history from 11 built-in sources plus 103+ CCXT exchanges. Streams advance the present via WebSocket. Engines evaluate Pine Script™ — Flask, Pyodide, or Cloudflare® Worker. Storage keeps your library. Agents drive the app over MCP (POST /mcp). 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 — 24 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, …).
theme-libraryNamed chart themes: save the current chart under a name, rename or delete custom themes, and keep a bar coloring per theme. A coloring can be saved on its own, applied into the selected theme, and updated across every theme that uses it.
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.
file-dropDrop .pyne / .pine / .pinescript / .pinev5 / .pinev6 anywhere on the app to import into the script library — multi-file, with or without the file picker. A collapsed “Expand (N lines)” stub is stripped with a truncation warning instead of importing dead inline code.
color-toolsA working color with picker, transparency, and write-as format (hex, named, color.rgb, color.new); chips for every color in the script; click-to-copy format rows and click-to-replace across hits.
symbol-pickerTradingView®-editor-safe glyph set by category — insert at the cursor raw, quoted, or as a plotchar() snippet, or copy the glyph.
function-treeOptional right-rail outline of the script — user functions, methods, types, and enums — with click-to-jump. Lives opposite the minimap and toggles from the editor overflow menu or the command palette.
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. The Hyperparameter Optimizer lives in its own tab.
hpoSweep indicator and strategy inputs from the Results panel: samplers auto / random / tpe / grid; objectives net_pnl, profit_factor, calmar, composite; validations in-sample, holdout, walk-forward. Runs against the pyne POST /optimize contract.
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.
history-windowThe chart keeps the entire dataset; Settings → Historical bars caps only what reaches the engine each run — a rolling window, default 10,000, clamped 200–200,000. An explicit holdout slice is windowed too, so a trial cannot quietly exceed the budget.
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).
mcpRemote Model Context Protocol on the Worker (POST /mcp, Bearer pn_…). Worker tools for run/scripts/on-chain; app_invoke drives a connected tab (chart, editor, alerts, library). CLI: axis mcp.
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.
AXIS is agent-native. A remote Model Context Protocol server on the Cloudflare® Worker exposes the desk to any MCP client, and a live-app bridge lets an agent drive a connected tab — read the chart, edit Pine Script™, run a script, place a drawing, toggle a panel, manage alerts. Every invoke lands in System Logs.
POST /mcp over Streamable HTTP with a pn_… Bearer key. Stateless JSON-RPC tools for health, run, the cloud script library, market and on-chain proxies, keys, and usage — no browser tab required.
app_invoke / app_get / app_set drive a connected tab over the McpBridgeDO WebSocket. Reads stay read-only; mutating calls need the ticket-authenticated bridge. JSON-RPC batches cap at 10, 60/min, and payloads over 1 MiB fail closed.
axis mcp forwards newline-delimited JSON-RPC to POST /mcp for clients that spawn a process; axis mcp config writes the client entry. Same key, same tool surface.
axis_healthaxis_runaxis_requestaxis_scripts_listaxis_scripts_putaxis_onchainaxis_marketaxis_keys_validateaxis_usagechart.loadLoad OHLCV for a symbol, interval, and source.
editor.setReplace the active Pine Script™ buffer.
editor.runEvaluate the editor document against the loaded bars.
drawings.addPlace a drawing from kind + time/price points.
alerts.createCreate a price-cross alert with params.
chart.screenshotCapture the panes as a base64 PNG.
A status-bar capsule shows the bridge socket state and the attached-tab count; a second dot lights while an agent invoke is in flight. Click it to open Settings → MCP.
Same-origin page scripts reach the app bridge read-only, and the Worker replays an allowlisted API surface — axis_request is not an open proxy. Secrets are redacted from snapshots. MCP is not order routing; alerts stay local.
Plugins are orthogonal; AXIS is constant. Compose any lawful { source, stream, engine, storage } set, then choose where it runs — air-gapped browser, dual-process desk, or Cloudflare® edge. The active set is the recipe; the topology is where it executes.
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 the first wheel load.
Depends · Browser only (wheel cached)
Full PYNE fidelity on the laptop: the Vite AXIS app plus the Flask Pro API. Live venue bars, local script library.
make -C ../pyne run # :5002 (dir sometimes still named pynescript) bun run dev # :3000
Depends · bun · Python · hoox-pyne
Same AXIS, different venue. Flip source/stream pairs (OKX, Bybit, Coinbase, Kraken, MEXC) or route through the CCXT gateway (103+ exchanges) without rewriting the editor or results panel.
Upload private OHLCV, evaluate with the server engine, export strategy metrics and a trades CSV.
Pages-hosted PWA with the Worker API: keys in Cloudflare® KV, optional Cloudflare® D1 script library, Cloudflare® Durable Object stream fan-out, optional Cloudflare® R2 bundles.
bun run axis:install bun run axis:deploy # or: cd worker && wrangler deploy
Depends · wrangler · axis CLI · KV · (optional D1/R2)
Worker name pynescript-axis; project ids are frozen infrastructure — do not rename casually.
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: a CoinGecko source plus a Tiny Pine engine installed from a Manager URL — no core fork.
Serve the built PWA without Cloudflare® Pages — a plain static host plus the small Python file server.
bun run build python3 axis_pwa_server.py # :8081
Depends · bun build · Python 3
The shared public AXIS plus Pro API used for demos and smoke tests.
PWA axis.hoox.sh API pynescript.online
Depends · systemd · axis-pwa · pynescript-api
Canonical demo host: axis.hoox.sh.
Four 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 wheel: PYNE 0.6.29.
POST /api/run proxies to EXTERNAL_BACKEND today. Cloudflare® Durable Object streams, Cloudflare® KV keys/usage, optional Cloudflare® D1 scripts and Cloudflare® 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. Cloudflare® 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.
AGPL-3.0-only self-host is free forever. Closed-use rights (Commercial, upcoming) and hosted ops (Pro SaaS, upcoming).
Pro SaaS is upcoming — self-host free under AGPL-3.0-only today. Full terms: AXIS COMMERCIAL-LICENSE.txt · docs/reference/commercial.