Installation

Install AXIS via the AXIS CLI, Vite+Solid dev, static dist PWA, desktop shell, or Cloudflare® Worker backends.

This page

Installation

AXIS ships as the axis package (Solid + Vite), version 2.5.0. Primary path is the product UI under src/. Legacy static shell (main.js, root style.css) is not the product UI—prefer bun run dev or built dist/.

AXIS CLI help: install, doctor, setup, deploy, health

Abstract

Operator modes:

ModeCommand surfaceWhen
AXIS CLI (recommended ops)bun run axis · make axis-*Install / doctor / setup / deploy / health
Dev AXISbun run dev · axis devDay-to-day UI work
Desktop shellbun run desktop:devTauri 2 native window
Static PWAdist/ + axis_pwa_server.py :8081Offline demo / VPS
AXIS at the edgeaxis deploy worker (+ optional Pages)Production data plane

Backend is optional when Engine = Client-Side (Pyodide) and sources/streams are mock or CSV.

Prerequisites

  • Bun ≥ 1.2 for package install, Vite, and the AXIS CLI
  • Python 3.10+ if you use Flask Pro API (make run) or axis_pwa_server.py
  • Modern Chromium / Firefox / Safari (PWA install works best on Chromium)
  • Optional: Cloudflare® auth (CLOUDFLARE_API_TOKEN or wrangler login) for Worker deploy
  • Optional desktop: Rust + platform webview libs — Desktop (Tauri)

CLI-first bootstrap (recommended)

# From the AXIS monorepo root
bun install
cd packages/cli && bun install && cd ../..

axis install          # app + worker/ + CLI deps
axis doctor           # toolchain + optional CF auth; wrangler.toml warns until `axis setup`
axis setup            # ensure wrangler.toml + local D1 schema
# repo aliases (no global install): bun run axis:install / axis:doctor / axis:setup
# or: make axis-install && make axis-doctor && make axis-setup
CommandRepo alias (no global install)
axisbun run axis
axis installbun run axis:install
axis doctorbun run axis:doctor
axis setupbun run axis:setup
axis deploy workerbun run axis:deploy
axis healthbun run axis:health
axis …make axis ARGS="…" pass-through
axis …make axis-install · axis-doctor · axis-setup · axis-deploy · axis-health

Full command surface: AXIS CLI.

Dev AXIS

# Terminal 1 — Pro API (server engine) from sister pyne repo
# Clone https://github.com/hoox-sh/pyne as ../pyne (local dir is sometimes still named pynescript)
make -C ../pyne run          # Flask :5002

# Terminal 2 — AXIS
bun run dev                  # Vite :3000
# or: bun run axis dev

Open http://localhost:3000. Default symbol BTCUSDT, engine often server with endpoint http://localhost:5002 (or demo host https://axis.hoox.sh).

Desktop shell (optional)

bun run desktop:dev          # Tauri window + Vite HMR
bun run desktop:build        # native installers

See Desktop (Tauri).

Edge Worker (local)

bun run axis dev worker      # wrangler :8787
# or: cd worker && bun run dev

In AXIS: open Workers Manager (topbar activity icon) or Settings → set Backend URL to http://127.0.0.1:8787. Production Worker is worker-axis at https://worker.axis.hoox.sh — see topologies.

Deploy checklist (prod)

axis setup --github-client-id Ov23li… --remote-d1
axis secret put ADMIN_TOKEN
axis secret put EXTERNAL_BACKEND
axis deploy
axis health --oauth

Production build (static)

axis install
bun run build                # → dist/
python3 axis_pwa_server.py   # serves dist/ on :8081

Confirm:

  • App shell loads; chart requests history
  • DevTools → Application → Manifest + Service Worker
  • Icons 192/512 from public/assets/

Pyodide assets and vendor wheels under public/pyodide/ and public/vendor/ must be present in dist/ for offline engine—bun run build copies them via Vite public/.

Offline-first lab (no Flask)

  1. Source → Mock Walk
  2. Stream → Mock Poll (or None)
  3. Engine → Client-Side (Pyodide)
  4. Storage → Local

Disable network in DevTools; Run still executes. First Pyodide boot downloads/loads self-hosted runtime from the origin—allow that once while online, then go offline.

CORS when using server engine

Browser origin → Pro API must allow your AXIS origin. Flask uses ALLOWED_ORIGINS. Localhost regex is typically included; for a VPS demo host, set an explicit origin list. Symptom of failure: POST /run blocked in Network tab (no Access-Control-Allow-Origin). Worker CORS: CORS and origins.

PWA install

  • Manifest: void theme #0a0b10, name AXIS
  • Service Worker: cache-first shell; network-first /api/*; offline API returns structured failure so Pyodide path remains usable
  • Chrome/Edge: install icon in the omnibox; AXIS also shows a modest Install app chip in the topbar when the browser fires beforeinstallprompt (right-click hides it for the session)

Verification checklist

CheckExpect
LoadBars on chart for default symbol
TopbarSource / Stream / Engine pickers populated
Run (server)Flask or Worker responds; plots overlay
Run (pyodide)Offline OK after warm-up
ManagerCatalog lists built-ins
Workers ManagerHealth cards for local/prod backends
ThemeDark/light toggle persists
axis doctorRequired toolchain green. Missing worker/wrangler.toml is a warning on a fresh clone until axis setup (copies wrangler.toml.example).

Failure modes

SymptomLikely causeFix
Empty chartSource network / CORS / wrong symbolLoad again; try mock-walk
Engine errors immediatelyEndpoint down or wrong URLSettings / Workers Manager → Probe
Pyodide “BadZipFile” / HTMLSPA fallback instead of wheelsEnsure public/vendor and pyodide in dist/
SW stale UIAggressive cacheUnregister SW or hard reload
API_KEYS_REQUIRED on scriptsD1 without KVBind API_KEYS or local ALLOW_OPEN_KEYS=1Auth

Internals (repo paths)

PathRole
src/index.tsx, src/app.tsxSolid entry
vite.config.tsBuild
axis_pwa_server.pyStatic host
public/manifest.webmanifest, SWPWA
worker/Cloudflare® Worker data plane
packages/cli/AXIS CLI (@hoox-sh/axis-cli)
src-tauri/Desktop shell

See also