Your browser sucks, JavaScript disabled! Gunnar's console needs JavaScript and WebAssembly. Git over SSH on port 2222 does not.

nordisk/facett

.nornir/README-full.md

facett — complete overview

The real README: the full pitch, the complete crate catalog, and usage. The repo-root README.md is the slim face (title · mashup · pointers); this chapter is the heavy detail, and it is also folded into the manual docs/manual.pdf by nornir docs book.

Reusable data-viewing components for egui — each component is a facet of your data. A peer of znippy/skade: source-agnostic, hand it Arrow / a graph / geo and it draws it fast. Build your own korp on it; korp and nornir both do.

Swedish facett ("facet") — and the faceted-cube look of the Hugin & Munin ravens. (Distinct from the facet crate.)

Crates

Crate What
facett-core the visual kernel — render a node/edge Scene into egui. CPU painter today; a wgpu fast path (GPU viewport-cull + indirect draw, seeded from katana-osm's osm-viewer) lands behind the same draw() call.
facett-graph the graph (node/edge) viewer component — scene_from_labeled_edges, GraphView.
facett-arrow Apache Arrow → Scene: an edge RecordBatch (src/dst + labels) → a drawable graph.
facett-pop labelled-progress viewer (bulk-load / job progress) — a non-graph Facet.
facett-flow Falsett: supplied directed graphs with animated curves/packets, a translucent hub fixture and explicit counted group overview. Elm/Facet, bounded CPU preview, optional resident GPU renderer; host integration.
facett-pipeline dataflow/Spark DAG + job progress (composes facett-graph).
facett-table data-table viewer (striped grid, cell truncation).
facett-grid flagship data grid: Arrow-backed, virtualized rows+cols (60 fps over 1M+ rows), frozen header + pinned cols + Σ footer, multi-sort, Excel cell selection→TSV, type-aware cells (chips/bars/sparklines), conditional formatting, fully themeable.
facett-map geo viewer: a point layer + a vector basemap (roads/water/coastline as ways). CPU Web-Mercator painter by default; a wgpu GPU kernel (feature wgpu, ported from katana-osm's osm-viewer: upload-once + GPU frustum-cull + draw_indirect) draws the basemap behind the same ui().
facett-graph3d 3D graph (sphere/helix, Y-spin, depth cues).
facett-model3d reusable 3D-model viewer: load an embedded glTF/.glb, CPU-light + spin it, tint a named sub-mesh by a status scalar. Pure-Rust loader, wasm-safe, headless-testable.
facett-map3d embeddable 3D map: extrude facett_map::Ways → prisms/ribbons/terrain/water, orbit-navigate, draw through a swappable RenderBackend. CPU painter uses a software z-buffer (true per-pixel depth, no painter's-sort tearing) + ACES tonemap so the lit city renders correctly on llvmpipe / wasm; a wgpu production backend is the GPU fast lane.
facett-geomap the slippy-map viewer (OsmView) over GeoParquet: Web-Mercator pan/zoom, spatial-indexed points+ways, optional 2.5D tilt, and a Garmin car-navigator basemap (cartographic mode) — road-class hierarchy, casing-then-fill, one-way chevrons, a cased route ribbon, and collision-avoiding priority road labels.
facett-app the app-framework layer: NavModel + Router + nav chrome (Sidebar/Dropdown/Breadcrumb/NavShell), an AppShell (mounts real Facet panes), overlays (Modal/Popover/Toasts), layout (SplitPane) + widgets (Accordion/Stepper/Pagination/TabView/Tree/DatePicker). Compose whole apps.
facett-syschart system-map chart: free-positioned clickable peer nodes + edges, per-node count badge, click-select → inline expandable detail panel (a few peer services, e.g. a PKI/OIDC/Nexus triangle).
facett-auth-ui reusable in-GUI sign-in pane (LoginPane, a robot-testable Facet): renders an RFC 8628 device-code flow — Sign in → user-code + verification URL → poll → signed-in subject + credential NAMES → Sign out. Auth-library-agnostic via the host-implemented LoginSeam trait (korp + holger wire it to nornir-auth-client); the pane only renders states, never a secret value.
facett-plot charts (line/bars) wrapping egui_plot.
facett-osm OSM GeoParquet reader: WKB → points (read_points) and ways (read_ways → Vec<Way>, LineString/Polygon, tag-classified). osm2geoparquet output, 6.3M pts/s.
facett-docview documentation viewer: a Typst manual exported as one vector SVG per page — TOC sidebar, continuous scroll, stepped zoom / fit-width / page-jump. Pure Rust (resvg/usvg/tiny-skia, no pdfium); parse-once + per-(page, zoom) texture cache, viewport-bounded rasterization.
facett-buildthing the build-thing deck: an app's own build thing (a wasm plugin the forge loads) rendered as three panes — role-grouped Variants menu · build Graph (via facett-graphpan) · Result. See .nornir/build-thing-pattern.md.

Layouts: circular + force-directed. On egui 0.34. Every component implements facett_core::Facet (title / ui / state_json) so they drop into a FacetDeck (tab bar + composed introspection). Next: the wgpu fast path behind draw()/ui(). Themable (Theme::sci_fi()), self-tested headless (harness + the MEGA matrix + perf).

Benchmarks

facett ships a detached nornir Bencher harness (bench/, run with nornir bench run facett) that measures render throughput headless at scale N = 50_000: graph nodes/s (facett.graph_render), map points/s (facett.map_render), table rows/s, and the map3d cull/project path — each historized into the warehouse's bench_history and gated on regression by nornir release.

Numbers pending. No bench run has been recorded into this workspace's warehouse yet (nornir bench history-show facett → no bench runs recorded), so the measured old/new throughput table lands here after the first nornir bench run facett. The inline figures elsewhere in this doc (e.g. facett-grid at 60 fps over 1M+ rows, facett-osm at 6.3M pts/s) are component design targets from their own docs, not harness measurements — they are kept distinct until the harness records them.

Use

use facett_graph::{scene_from_labeled_edges, GraphView};

let scene = scene_from_labeled_edges(rows); // (src, dst, src_label, dst_label)
GraphView::new(scene).empty_hint("run a query").show(ui);

Source-agnostic by design: facett renders what it's handed — no connection or query logic (that stays in the data layer, e.g. knut). That's why it's a library anyone can build their own korp on.