Architecture/Data Sources
GitHub

Data Sources

The external APIs and blockchain data that power Frontier Pulse.

World APISystems, KillsAssembliesOracle BackendScoring, CHIReputationSui BlockchainPulseRegistryOn-chain scoresFrontendDashboardVisualizationsdirect read (fallback)

24,502

Solar Systems

from World API

10 min

Refresh Rate

oracle cycle

5 min

Cache TTL

live data

50

Batch Size

per PTB transaction

EVE Frontier World API

The World API is the primary source of game state. Base URL: https://world-api-stillness.live.tech.evefrontier.com

EndpointDataUsed For
GET /v2/solarsystems24,502 systems with 3D coords, constellation, regionGalaxy map rendering, system enumeration
GET /v2/solarsystems/:idSingle system detail + gate linksDeep dive panel, constellation neighbors
GET /v2/smartassembliesAll deployed Smart Assemblies (gates, SSUs, turrets)Infrastructure mapping, stewardship scoring
GET /v2/killmailsPvP kill records (attacker, victim, system, timestamp)Combat analysis, volatility scoring

Pagination Strategy

All paginated endpoints support ?limit=N&offset=M and return metadata.total. Frontier Pulse uses parallel page fetching for speed:

worldApi.ts
// 1. Probe for total count
const probe = await fetch(`${BASE}/v2/solarsystems?limit=1&offset=0`);
const total = (await probe.json()).metadata.total;  // → 24502

// 2. Fetch all pages in parallel (1000 per page)
const pages = Math.ceil(total / 1000);  // → 25 pages
const fetches = Array.from({ length: pages }, (_, i) =>
  fetch(`${BASE}/v2/solarsystems?limit=1000&offset=${i * 1000}`)
    .then(r => r.json())
    .then(d => d.data)
);
const all = (await Promise.all(fetches)).flat();  // → 24502 systems

Coordinate Normalization

World API provides 3D coordinates (x, y, z). The frontend normalizes these to 0-1 range for Canvas rendering:

worldApi.ts
// Find bounds across all systems
for (const s of all) {
  minX = min(minX, s.location.x);  maxX = max(maxX, s.location.x);
  minZ = min(minZ, s.location.z);  maxZ = max(maxZ, s.location.z);
  minY = min(minY, s.location.y);  maxY = max(maxY, s.location.y);
}

// Normalize with 3% padding
nx    = 0.03 + ((x - minX) / rangeX) * 0.94   // → horizontal position
ny    = 0.03 + ((z - minZ) / rangeZ) * 0.94   // → vertical position
depth = (y - minY) / rangeY                     // → parallax/sizing

Sui Blockchain

On-chain data is read via Sui JSON-RPC and written via the Sui TypeScript SDK.

MethodDataUsed By
sui_getObjectPulseRegistry shared object (CHI, player count, system count, timestamps)Frontend suiReader.ts
suix_queryTransactionBlocksOracle transaction history filtered by package IDTransaction log page
signAndExecuteTransactionBatched PTBs for system health, reputation, CHI, alertsOracle suiWriter.ts

Reading On-Chain Data

lib/suiReader.ts
const SUI_RPC = "https://fullnode.testnet.sui.io:443";
const REGISTRY_ID = "0x945f1d589bae9c60e95b99c0f02a7fffb814db3772cb16467e5c683ea0bd32c4";

async function rpc<T>(method: string, params: unknown[]): Promise<T> {
  const res = await fetch(SUI_RPC, {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({ jsonrpc: "2.0", id: 1, method, params }),
  });
  return (await res.json()).result as T;
}

// Read CHI + registry stats
const result = await rpc("sui_getObject", [
  REGISTRY_ID,
  { showContent: true },
]);
const fields = result.data?.content?.fields;
// → fields.chi.fields.overall_score, fields.total_players, etc.

Data Priority Chain

The frontend uses a three-tier fallback strategy for every data request:

1On-chain (Sui) — Read from PulseRegistry via JSON-RPC. Most authoritative.
2Live-computed — Fetch World API data and compute scores locally using liveData.ts.
3Deterministic fallback — Hash-based vitals from vitals.ts. Same ID = same scores, always.
This means the dashboard always works, even when the oracle is offline or the World API is unreachable. Only the source and freshness of scores changes.

Caching & Refresh Rates

Data TypeCache LocationTTL
Solar systems (24K)In-memory (worldApi.ts)10 minutes
Smart assemblies + killmailsIn-memory (liveData.ts)5 minutes
Computed scores (CHI, reputation)Sui blockchainWritten every 10 min by oracle
Pulse Card SVGHTTP Cache-Controlmax-age=300 (5 min)
Frontend page dataNone (force-dynamic)Fresh on every load
ResourceURL
World API (Swagger)docs.evefrontier.com/SwaggerWorldApi
Builder Documentationdocs.evefrontier.com
Sui JSON-RPC Referencedocs.sui.io/references/sui-api
Sui TypeScript SDKsdk.mystenlabs.com
Move Bookmove-book.com
EVE Frontier Discorddiscord.gg/evefrontier