What needed solving.
A panoramic photo looks convincing from its capture point, but it is not a volume that a player can dig into or build on.
- 01Panorama + map footprints
- 02Projected voxel chunks
- 03Editable street + local deltas
Simplified from the implementation and project notes.
How it fits together.
Turn map inputs into a voxel proxy
The app finds a nearby Street View panorama, fetches OpenStreetMap vector data, rasterizes building outlines and heights into one-meter columns, then composes that geometry with a sparse map of player edits.
Project photos onto editable geometry
Untouched voxel faces sample the panorama from its capture center; exposed faces use block textures. While walking, adjacent panoramas cross-fade. Sixteen-cubed chunks use greedy meshing, allowing a flat untouched street surface to collapse into a single quad.
Persist local edits; expose reconstruction limits
Edits are stored in browser localStorage and reloaded for nearby visits at the same block size. Core voxel behavior has a focused test and the app has a typecheck. Cars and trees are painted into photos, terrain is flat, map footprints may be incomplete, and saved edits do not sync to other browsers.
Inside the software.
Browser prototype turns linked Street View panoramas and OpenStreetMap building geometry into an editable voxel world. The photo projection is viewpoint-dependent and player edits remain local to one browser.
Navigate linked street panoramas
Start from a real street panorama and travel through linked capture points, cross-fading imagery as the view changes.
Map Tiles API locates nearby panoramas, loads a low-resolution preview before full tiled imagery, and uses neighbour links for movement/prefetch.
Implemented prototype; requires a configured Google Maps API key and billed tile requests.
Implementation references
street-craft/README.mdstreet-craft/src/streetview.tsstreet-craft/src/pano.tsstreet-craft/src/panoSampler.tsstreet-craft/src/arrows.ts
Build voxel geometry from map data
Convert building footprints and heights into an editable voxel proxy aligned to the local street grid.
OpenStreetMap vector tiles are rasterized into one-meter columns; the world combines terrain and buildings with sparse player edits.
Implemented prototype; map coverage and building measurements are approximate.
Implementation references
street-craft/README.mdstreet-craft/src/osm.tsstreet-craft/src/heightfield.tsstreet-craft/src/geo.tsstreet-craft/src/world.ts
Project street photography onto editable surfaces
Color untouched world faces from the panorama viewpoint, while newly exposed faces use block textures; cross-fade projection between adjacent viewpoints.
World material samples panorama pixels from capture center; enclosing sphere supplies sky and geometry beyond modeled height. Tint mode reveals proxy alignment.
Implemented; projection artifacts increase away from capture point.
Implementation references
street-craft/README.mdstreet-craft/src/worldMaterial.tsstreet-craft/src/main.tsstreet-craft/src/panoSampler.ts
Mine, place and use blocks
Walk, mine photographed road/facade surfaces, place blocks, and use TNT and flint-and-steel interactions.
Raycast interaction updates sparse world deltas; mined photo surfaces can become street blocks with extracted imagery. Block selection uses hotbar controls.
Implemented prototype.
Implementation references
street-craft/README.mdstreet-craft/src/raycast.tsstreet-craft/src/blocks.tsstreet-craft/src/hud.tsstreet-craft/src/fx/effects.ts
Greedy chunk meshing
Reduce voxel geometry by merging adjacent faces, allowing untouched flat regions to render with few polygons.
Sixteen-cubed chunks are greedy-meshed and refreshed around changed areas rather than representing every block face separately.
Implemented; performance depends on device and scene size.
Implementation references
street-craft/README.mdstreet-craft/src/mesher.tsstreet-craft/src/chunks.tsstreet-craft/src/core.test.ts
Walk and free-flight inspection
Walk along Street View arrows or toggle free roam to fly around and inspect reconstructed geometry.
Keyboard and pointer controls support movement, look, mining/place actions, hotbar slots and free-flight speed controls.
Implemented prototype.
Implementation references
street-craft/README.mdstreet-craft/src/main.tsstreet-craft/src/hud.tsstreet-craft/src/arrows.ts
Persist edits by area
Reload local edits when revisiting the same area and block size in the same browser.
Sparse edit data is serialized through browser localStorage and associated with area identity and resolution.
Implemented; storage is local to the browser and does not sync across devices.
Implementation references
street-craft/README.mdstreet-craft/src/storage.tsstreet-craft/src/world.tsstreet-craft/src/core.test.ts
Procedural textures, icons and effects
Generate block textures, icons, hand animations, sound and visual effects from code instead of bundled art assets.
Asset and effects modules create textures and interaction feedback at runtime, including cube/hand/audio effects.
Present in the reviewed source.
Implementation references
street-craft/README.mdstreet-craft/src/assets/textures.tsstreet-craft/src/assets/icons.tsstreet-craft/src/fx/audio.tsstreet-craft/src/fx/effects.tsstreet-craft/src/fx/hand.ts
Building and checking it.
The player moves between linked panoramas, mines or places blocks, and can switch to free flight to inspect the reconstructed geometry. Area edits persist in browser localStorage.
The implementation exposes a geometry tint view for diagnosing the relationship between the photo and its proxy surfaces. This is particularly useful because projection can hide errors at the original viewpoint.
Cars, trees, and people are painted onto proxy surfaces and smear away from the capture center. Flat ground misaligns in hilly areas; map footprints can be incomplete. This is local browser persistence, not a shared multiplayer world.
Source notes
Based on repository code and project records reviewed on October 30, 2026. Historical checks are described as recorded, not rerun for this article. Screenshots, renders, and mockups are labeled individually.
street-craft/README.mdstreet-craft/src/worldMaterial.tsstreet-craft/src/mesher.tsstreet-craft/src/main.tsstreet-craft/src/storage.tsstreet-craft/src/core.test.tsstreet-craft/package.json
