About this project

tessella is an independent Rust project that implements a frontend for the MapLibre style specification. It performs all the work of a map frontend — parsing styles, evaluating expressions, managing sources and tiles, network and caching, layout and bucket generation, glyph and sprite atlases, transform and camera handling, and render orchestration — but it does not draw. Instead, it emits a capture stream: geometry, uniforms, textures, draw order, and camera state in a flat envelope ABI. This separation makes the frontend GPU-free and pure Rust, so it can cross-compile to aarch64 and riscv64 without a graphics stack, while the renderer becomes a swappable consumer. State is process-scoped where possible and per-view only where necessary. A single style, file-source stack, tile store, bucket set, and glyph atlas are shared across views, because buckets are camera-free and zoom interpolation lives in uniforms. Per-view state is limited to the transform, cover decisions, symbol placement, and a few uniform blocks. The project claims that four map views cost one geometry stream plus four small view streams, with fetches, decodes, and bucket builds staying flat in view count, backed by CI counters. Traffic is proportional to change: a parked map emits zero bytes, pure camera motion emits a camera block, and only churn emits geometry. An SPSC ring transport uses absolute state writes for coalescable envelopes, bounding occupancy if the consumer stalls. The workspace includes crates for the facade (tessella, currently a name-reservation stub at version 0.0.0), style (tessella-style), sources (tessella-source), tiles (tessella-tile), storage (tessella-storage), layout (tessella-layout), placement (tessella-place), orchestration (tessella-orchestrate), capture ABI (tessella-capture-abi), and glyph handling (tessella-glyph). Only the tessella crate is published to crates.io; the rest are publish = false until they carry content. Current status is R0 complete. The producer emits its full stream for a hermetic style. A C++ oracle implementation, mbgl-capture-probe, emits a canonical serialization of the capture stream for the same style and camera, and the two are diffed. Comparisons cover geometry, uniform buffers, textures, clip masks, painter order, and the camera block, whose projection matches bit for bit in all sixteen elements. Ours alone — the view declaration and release pair of DR-18 — is checked on sequence: a view is declared before use, geometry precedes the order that draws it, and the order precedes the camera naming its epoch. A settled view writes zero bytes. The capture ABI is frozen, with a generated C header carrying per-field offset assertions that compile as both C11 and C++17. Two known deliberate differences are documented: GeoJSON polygon vertex order is a rotation of the oracle's because mbgl normalizes rings through wagyu, so the diff compares rings as cycles (DR-19). Also, the projection refuses bearing and pitch because the probe is unrotated and there is nothing to check a quaternion path against. R1 — vector tiles, network and cache, the line layer, data-driven binders, the expression VM — has not started. The plan.md documents the design of record at rev 0.9. Consumers include a Filament-backed consumer and impeller-rs (a pure-Rust Impeller reimplementation) consuming at the entity/HAL level. Maps require an SSBO-capable backend — Vulkan today, GLES 3.1+ if a consumer implements one. riscv64 is a producer, soak, and cross-compile lane only; a VisionFive 2 can build tessella but not draw with it. Building uses a toolchain pinned in rust-toolchain.toml to Rust 1.94.1, the version Yocto wrynose (6.0) ships in oe-core. CI carries an advisory stable lane. Cross-compilation lanes are cargo check only for aarch64-unknown-linux-gnu and riscv64gc-unknown-linux-gnu. Tests use cargo clippy and cargo test. The golden oracle reference dumps live in tests/golden so the Rust side can be checked without a C++ build. Generated mbgl-derived mirrors in tessella-capture-abi come from a pinned maplibre-native tree and are committed; a cargo run for mbgl-codegen regenerates or checks them. The flat C header in include/ is generated from Rust definitions with static assertions for size, alignment, and field offsets. tessella is independent, not affiliated with or endorsed by the MapLibre organization, and does not use the mln namespace. License is BSD-2-Clause.