Live site: https://ex-ct.github.io/EXFA-App/ — an EVE Online fitting tool in the browser, the Pyfa-shaped replacement on top of the Rust engine in EX-CT/EXFA-Engine. No install, no account required; all computation runs locally in a Web Worker (Rust→WASM).
- Fitting, Pyfa-style: market tree + search with EVE shorthand (
lse,dc ii,5mn mwd), double-click or drag items onto the fitting canvas, right-click a module for its context menu (variations, states, remove), drag charges onto a module to load them, drag modules to reorder within a rack. Every item (modules, drones, fighters, implants, boosters, ship, market rows, library entries) has a context menu — no browser native menu anywhere. - Rich module rows: per-module PG/CPU/cap use/cycle/range/tracking/DPS/price chips in aligned
columns, charge icons, overheat badges — and link groups: group identical modules into one
×Nrow and change the whole group's ammo/state/variation at once. - Item info pane (no popups): a fixed panel under the market tree shows quick stats, traits, required skills, base-vs-modified attributes and one-click variation swap for fitted items; clicking any fitted item also locates its group in the market tree.
- Edit-time state constraints: passive modules only ever offer offline/online — the UI mirrors
the engine's
allowed_statesrule so illegal states can't even be requested. - Everything computed by the engine: offense/defense/capacitor/navigation/targeting stats, resource bars, drone bays, remote assistance, damage patterns and target profiles — with scenarios (custom targets: range/speed/angle/sig + library-fit resists) and an engine-driven graph dock (every axis the engine offers, multi-fit × multi-scenario lines, legend toggles, crosshair, CSV/PNG export).
- Characters: built-in all-0/all-5, manual sheets, alpha-clone caps, and ESI sign-in (EVE SSO v2 PKCE) to import trained skills and implants straight into the fit.
- Formats: EFT / DNA / ESI-JSON / XML / eftcfg import (WASM formats engine, or a built-in fallback), export to EFT / DNA / ESI / multibuy, share links.
- Prices: the engine embeds a snapshot at build time; the site re-fetches the newest
EXFA-Data
prices-*snapshot hourly and injects it into the live engine session (status shown in the price box). Local "my price" overrides on top. - 中文界面 toggle, mutaplasmid mutations, projected/fleet/environment effects — and an
@exfa/formatv1 library: nested folders, tags, fleets with roles, per-fit branches + version history, module alternatives,.exfa.json/.zip/ folder import & export.
- EXFA Web (
apps/web): a vite/React single-page app. The engine runs in a Web Worker as Rust→WASM (dataset compiled in; stats + graphs), or over HTTP against a local/remoteexfaengine viatools/engine-bridge.mjs. Deployed by GitHub Pages tohttps://ex-ct.github.io/EXFA-App/(workflow.github/workflows/pages.yml,BASErepo variable); optional second publish to Cloudflare Pages (deploy-cfjob, see EXFA-Docs docs/25). - EXFA MCP (
packages/mcp): engine-agnostic MCP server (search, validate, compute, compare, optimise) for AI agents. Binaryexfa-mcp, package@ex-ct/exfa-mcp; seepackages/mcp/README.md.
Everything the site needs is downloaded from sibling releases — nothing is compiled from Rust or SDE here:
apps/web/public/data/dataset-*.json.gz,presets-web.json— latestsde-*release of EX-CT/EXFA-Data (tools/slim-presets.mjsslimspresets.json).apps/web/public/prices/latest.json.gz— newestprices-*-tagged release of EXFA-Data (release list, not/releases/latest— that endpoint points at the Latest-markedsde-*release).apps/web/public/engines/f/{exfa_wasm.wasm,exfa_formats_wasm.wasm}— latest EXFA-Engine release assets (exfa-wasm32-wasip1.wasm,exfa_formats_wasm.wasm), the in-browser stats/graphs and format-import engines.
| Name | Where | Purpose |
|---|---|---|
ESI_CLIENT_ID |
repo variable | EVE developer app client id baked into the build (VITE_ESI_CLIENT_ID); without it users can still paste a client id into the Character panel |
CF_ENABLED / CF_PROJECT |
repo variable | set CF_ENABLED=true to turn on the Cloudflare Pages deploy (deploy-cf job) |
CF_API_TOKEN / CF_ACCOUNT_ID |
repo secret | Cloudflare API token (Pages:Edit) + account id for wrangler Direct Upload |
Registering the EVE app: developers.eveonline.com → new application → callback
<site-base>/esi/callback (e.g. https://ex-ct.github.io/EXFA-App/esi/callback),
scopes esi-skills.read_skills.v1 + esi-clones.read_implants.v1. PKCE public client,
no secret needed.
npm ci
npm run build --workspace=apps/web # or: npm run build -w packages/mcp
npm run test --workspaces --if-presentUnit tests need the mini dataset (apps/web/src/test/fixtures) — checked in. The formats WASM is
optional locally (EXFA_FORMATS_WASM env or apps/web/public/engines/f/exfa_formats_wasm.wasm);
MCP integration tests need EXFA_ENGINE_BIN + EXFA_DATASET (see packages/mcp/src/test/helpers.ts).
LGPL-3.0-or-later (LICENSE, LICENSE.GPL-3.0), per the EXFA licensing policy in
EX-CT/EXFA-Docs docs/00. EVE Online data © CCP hf., used under
the CCP developer licence.