The hard part
New Brunswick has been laser-scanned from the air, and the data is free to download but hard to use. Each corridor is tens of gigabytes of point clouds in formats only mapping software opens, behind a download site that turns automated requests away. Making it something a person can walk through on a phone means solving storage, processing and delivery together, with no server to pay for.
Every 1 km tile is a self-contained job on a fleet of machines: download it from NRCan's public bucket, convert it into 1 m columns, build the mesh, cut it into 200 m web chunks, then delete the source. The browser draws 12-byte instanced quads, a quarter of the memory of an ordinary vertex format, streamed under a governor that protects the frame rate. The world is served from nine Cloudflare Pages sites that share one map. GeoNB's own site sits behind a bot challenge, so the build uses NRCan's official bulk copy of the same surveys rather than trying to get past it.
5,139 km² and 263 of 2,057 named communities built; 35 to 60 s per tile on a fleet machine; 48.7 GB of source for one corridor that never lands on the main workstation.
What the measurements mean
Only what is unusual for this project. Every sentence names the field it came from; nothing here is asserted that cannot be checked against the data.
- The scan hit its file ceiling here, so every count for this project is a floor rather than a total. truncatedfrom truncated
- It exists in 3 folders under the same name, so which one is current has to be established rather than assumed. possible-copy single_copysee the evidencefrom family
- It declares ports 8330, 8765, 8791, 8793, so it runs as a service rather than a script.from assets.routes, assets.ports
- It was changed within the last week, so this is work in progress. activefrom mtime_newest_code
How it works
The province's LiDAR is open data: GeoNB's surveys, republished by NRCan's CanElevation on a public bucket made for bulk access. NBLidar reads those points and turns them into 1-metre columns of blocks, inferring water, bridges, buildings and trees from the class each point carries. The source data is large, so each 1 km tile is a self-contained job on my machine fleet: one machine downloads the tile's data, builds it and deletes the source. That keeps the 48.7 GB of source data for one corridor off the main workstation, and a tile takes 35 to 60 seconds on a fleet machine. Much of it is reused from VoxelBlox: the mesher, the column layout, the vertex format, and the way that game exports to the browser. Everything is prepared in Python ahead of time, and a WebGL2 viewer with no dependencies streams 200 m chunks while keeping to a frame-time budget. It has orbit, fly and walk modes, phone controls, place search, and English and French throughout. Regions are spread across nine Cloudflare Pages sites that share one region list, so the menu on any site opens any region.
What it is built from
Each bar is one of this project's own modules, sized by how many times the rest of the project imports it. The counts are measured, not estimated, and the module at the top is the one the rest of the project leans on most.
What kind of engineering this is
Six signals counted from the source: files that run models locally, that act without being asked each time, that check their own output, that survive failure, that touch parsers and protocols, and that were measured then improved. Every axis carries its file count.
What it is written in
Share of code bytes. Vendored bundles and generated output are set aside before this is computed, which is why it differs from a simple file count.
What stands out
- 5,139 km² and 263 of the province's 2,057 named communities built from open LiDAR
- Each 1 km tile is one fleet job: the machine downloads, builds and deletes its own data
- The mesher and browser export are reused from VoxelBlox, with a bilingual, phone-friendly WebGL2 viewer across nine Pages sites
Capabilities
- Setup
- Pipeline
- Controls (web)
- Layout
- Orbit
- Walk
- GNB Open Government Licence
Grade
Every check names the field it measured. Checks that cannot apply are excluded, never counted as failures.
- provenance100.0%
- documentation100.0%
- runnability100.0%
- maintenance0.0%
- integrity70.0%
Not met
- single_copy 2 sibling folder(s)
atlas dupes --check-git - scan_complete truncated at the file cap
raise max_files_per_project, or exclude the directory causing it
Architecture
Directories carrying real modules, largest first.
tools49 modulesnblidar18 modules
Data model
Typed structures and tables found in the source.
- versions
- experiments
- runs
- battles
- forces
- unit_stats
- kills
- postures
Vocabulary
Parsed 129 of 130 Python file(s). 1 file(s) could not be parsed and are excluded rather than counted as empty. Counts are exact; the names below are a sample.
Classes
Htools/studio.py:30log_message, end_headers, do_GET, json_out, sfx_review, _sfx_review, do_POSTColumnCachenblidar/store.py:54__init__, getRegionnblidar/store.py:89__init__, column, padded, walk_y, ground_level, to_geoHandlertools/mp_test.py:26__init__, log_message, do_GETHtools/qa_page.py:31do_GETPagetools/qa_page.py:56__init__, ev, wait, closeRenderernblidar/render.py:143__init__, _grow_ibo, upload, _vao, drop, _build_far, _far_patch, drawStreamernblidar/stream.py:38__init__, wanted, update, load_all_now, closeCameranblidar/viewer.py:33__init__, eye, center, set_mode, moveSharedtools/throttle.py:89__init__, mbps, closeBuckettools/throttle.py:156__init__, reread, takeGeoNBChallengenblidar/tilejob.py:61ShortDownloadnblidar/tilejob.py:65TileColumnsnblidar/tilejob.py:151__init__, columnPeertools/net_relay.py:32__init__, recv, send, textRegiontools/shotcheck.py:123__init__, xz, ll, cellBusynblidar/gpuguard.py:23LIMITnblidar/gpuguard.py:69IOnblidar/gpuguard.py:76EXTnblidar/gpuguard.py:79Gridsnblidar/voxelize.py:45__init__, add_Handlertests/test_geonb.py:46do_GET, log_messagePublishertools/build_queue.py:189__init__, submit, _run, donePartstools/sfx_families.py:87__init__
Functions
loadtools/film.py:63savetools/film.py:67tourtools/film.py:73load_plannedtools/film.py:89save_plannedtools/film.py:93region_readytools/film.py:100has_takestools/film.py:106lifetools/film.py:110plannedtools/film.py:123readytools/film.py:130brieftools/film.py:171musictools/film.py:182import_musictools/film.py:203fit_musictools/film.py:218plantools/film.py:239shot_indextools/film.py:258set_shottools/film.py:267reshoottools/film.py:282statustools/film.py:298maintools/film.py:314calltools/owner.py:36gqltools/owner.py:52humantools/owner.py:58build_sectiontools/owner.py:67
Command line
- ingest
- experiment
- lesson
- query
- plays
- summary
- --km
- --url
- --view
- --no-greedy
- --shot
- --cam
- --perf
- --base
- --water-level
- --old
Depth
Signals counted from the code, not asserted.
506 commits across 19 separate working days over 1 months, 24 of them revising existing behaviour
Built from scratch
- Concurrency primitives
- Renderer / graphics pipeline
- Protocol / wire format
Proves itself
- Backtesting / evaluation
- Benchmarks
- Golden / baseline files
Survives failure
- Timeouts
- Rate limiting
- Recovery / restore
- Retry / backoff
- Fallback paths
- Logging / observability
Systems
Model operations
- Model formats
Networking
- WebSocket transport
Environment engineering
- Pinned versions
Languages
- Python18,613
- JavaScript5,762
- Shell63
- SQL22
Built with
- NumPy
- Pillow
- ModernGL
- Numba
- Playwright
- Cloudflare Workers
- pip
Recurring themes in the commit history
- live
- built
- coverage
- inventory
- refreshed
- round
- battle
- command
- mode
- area
Evidence
Taken from the code itself: a module docstring or the opening of the README.
The block palette: ids are uint8 (the world needs ~20 kinds, so half the memory of VoxelBlox's uint16). Colours are linear-ish sRGB 0-1; the desktop and web shaders both read this table (the web pack carries it in meta.json), so a colour changed here changes both.
At a glance
- Status
- active
- Primary language
- Python
- First commit
- 2026-10-26
- Last activity
- 2026-11-13
- Domain
- Games & graphics
- Agent docs
- .claude