Karti Tripathi 924be42f19
gates / clean-clone (push) Successful in 15s
gates / zero-config-boot (push) Successful in 8s
gates / no-binary-art (push) Successful in 4s
Say two, because two is what ships
Trimming Southern California from seven focus regions to two was a measured
call — seven came to 0.73M lattice points and a 6.6 second field build against
0.13M and 0.8 — but the comment above the array went on describing seven, with
arithmetic for a configuration that no longer existed.

That comment is the only place the per-axis limitation of `buildAxis` is
written down next to real numbers, so it now records what happened rather than
what was planned. Also corrected the coarse cell size (10x, not 6x) and the
Bay Area's instance count.

The marketing pages cite these figures. A repository comment that disagrees
with them is how the two start drifting.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-05 03:53:35 -07:00
2026-08-05 03:53:35 -07:00

Tera

The map view of Lumbridge Simulate — cities from above, in three.js. Its other half, Spaces, is the offices you walk into: one engine and one asset library, seen from outside and from inside.

Apache 2.0. Runs at tera.lumbridgecorp.com.

San Francisco


What it is

An engine plus data packs. The engine renders terrain, coastline, a built city on real street grids, bridges, roads, markers and air traffic. A city pack is pure data — coastlines, hills, districts, landmarks, camera chapters — so adding a city is a data contribution anyone can review, not a fork.

San Francisco ships today. Los Angeles / Orange County / Riverside is next; New York after that.

Quick start

npm install
npm run dev

Using the engine

import { createScene } from "@lumbridge/tera/engine/scene.ts";
import SAN_FRANCISCO from "@lumbridge/tera/cities/sf.ts";

const scene = createScene(canvas, {
  city: SAN_FRANCISCO,
  markerPalette: { hiring: 0x4ade80, closed: 0xef4444 },
});

scene.setMarkers([
  { id: "1", lat: 37.7765, lng: -122.4241, label: "Somewhere", colorKey: "hiring" },
]);

The engine renders Marker[] and looks colours up by colorKey in a palette you supply. It does not know what your markers mean — that mapping lives in your adapter. This is what lets one renderer serve a private map coloured by one scheme and a public map coloured by another, without either being a fork.

Adding a city

Write src/cities/<id>.ts exporting a City. Trace the coastline and parks by hand, place hills as radial peaks, and give each district its street bearing.

Two rules, and they are not stylistic:

  • Do not import geometry from OpenStreetMap. OSM and Nominatim output is ODbL — share-alike, and incompatible with this repo's licence.
  • Do not commit logos or brand assets. They are trademarks, not code.

See ARCHITECTURE.md §3 for the full reasoning, and NOTICE for the attribution and data-provenance statement.

Aircraft

The engine takes a FlightSource. Two ship here: SimulatedFlights (original, flies real approach and departure corridors) and AdsbFlights (open community ADS-B feeds such as adsb.lol).

FlightRadar24 is deliberately absent — their terms forbid scraping and forbid redistributing their data, so a client for it cannot live in an Apache-2.0 repository. Commercial sources belong in private deployments. The best long-term answer is an RTL-SDR receiver: first-party data with nothing to comply with.

Layout

src/engine/    renderer — terrain, blocks, structures, markers, flights, scene
src/cities/    data packs — pure geography, no code
src/adapters/  where outside data plugs in

engine never imports cities; neither imports adapters.

Licence

Apache License 2.0 — see LICENSE and NOTICE.

S
Description
Tera — the map view of Lumbridge Simulate. A 3D engine for cities you can look at and, with Spaces, offices you can walk into. Apache 2.0, self-hostable.
Readme Apache-2.0 654 KiB
Languages
TypeScript 96.2%
JavaScript 2.2%
HTML 1.2%
Dockerfile 0.2%
Vim Snippet 0.2%