Spatiotemporal Tiles
A cloud-native, edge-cacheable tile format for streaming massive time-variant geospatial datasets — Rust tools to build archives from GeoParquet or a live PostGIS/DuckDB source, and TypeScript packages to animate them in deck.gl, Three.js, MapLibre, or Cesium.
Get started
From nothing to an animated, streaming map: install, point a layer at a hosted dataset, press play — then swap in your own data.
Introduction
What spatiotemporal tiles are: the packed container, temporal bucketing, temporal LOD, blob ordering, and the streaming render model.
Architecture
How the Rust build tools and the TypeScript reader + render stack fit together.
Format Spec
The canonical packed container: formatVersion 3 manifest + content-addressed packs + the v6 directory codec.
deck.gl Layers
Every animated layer on the SpatioTemporalLayer chassis — points, paths, polygons, trips, OD flows, splats, and the server-aggregated summary tiers.
Extensions
GPU layer extensions: temporal filtering, categorical color, marching chevrons, and gaussian splats.
Playback
The animation clock, the buffering governor, the media-element facade, and the React playback hooks + controls.
Core Reader & Kernel
The @poopdeck.gl/core reader — archive, tileset, decoder, binary features — and the framework-free render kernel.
Renderer Backends
Rendering STT beyond deck.gl: Three.js + TSL, MapLibre custom layers, CesiumJS — and the descriptor contract behind the capability matrix.
CLI
The five published stt-* CLIs plus the repo-only stt-generate dataset tool — every flag, with examples.
Guides
End-to-end recipes: build the showcase datasets, or bring your own data from Python.
AI Suite
The agent surface over STT: the @poopdeck.gl/mcp server plus the poopdeck-ai Agent Skills plugin — discover, analyze, compose, build, and debug datasets from an AI assistant.
Point an animated layer at a packed dataset's manifest.json and give it a clock:
import { AnimatedPointLayer } from '@poopdeck.gl/layers';import { TimeController } from '@poopdeck.gl/playback';const timeController = new TimeController({ speed: 3600 });const layer = new AnimatedPointLayer({id: 'earthquakes',// A real, public archive — CORS + range requests, no server of your own.data: 'https://tiles.poopdeck.gl/data/earthquakes/manifest.json',timeController,timeWindow: 30 * 24 * 3600 * 1000, // 30-day visible window});timeController.play();
The full quickstart runs that end to end — install, first render, playback controls — in React or vanilla JS. Building your own dataset? Start with the data-generation guide or the Python recipes.