Project Info

Inspiration

Long-horizon robot plans break silently the moment the physical world drifts from the robot's last known state — a plan built on "the wrench is on the bench" fails once someone moves the wrench. Most perception pipelines fight this by re-sending the full scene and full history to a multimodal model on every step, which doesn't scale: tokens compound with every commit, every hour, every object. Topo asks what a version-control system for physical space would look like if it were built compression-first instead of compression-as-an-afterthought.

What it does

Topo turns a phone camera into a "git commit" for a physical space. Each photo is diffed against the last commit, reconciled into a structured, identity-stable object list by Claude, and compressed at three separate layers before it's stored or shown. The result is a live, queryable version history of a room — what moved, what's new, what's missing — built on a fraction of the tokens a naive re-send-everything approach would cost. How I built it Capture and visual delta (Token Company, layer 1). Every commit starts as a phone photo. Before anything touches an LLM, we diff it against the previous commit on a 10×10 grid using pixel-block comparison (utils/imageDiff.ts). Only the bounding box around blocks that actually changed gets sent to Claude — the rest of the frame never leaves the server. This mirrors Token Company's own "delete, never generate" philosophy, just applied one layer upstream: at the image, not the text. Spatial memory and reconciliation (Redis + Anthropic, layer 2). Before Claude sees the crop, we query Redis's GEO index (topo:geo:{branch}) for which objects have previously been seen near that grid location — these come back as memory hints injected into the prompt, so an object can be re-identified across angle and lighting changes without resending the full object history as context. Claude (claude-sonnet-4-6) then reconciles the cropped image against those hints in a single call: same object, new object, or now-missing — never asked to re-describe what's outside the crop, since objects outside the changed region are provably unchanged and carried forward verbatim in code. After reconciliation, object memories are upserted into Redis hashes (topo:obj:{branch}:{id}) and the commit is appended to an event-sourced stream (topo:stream:{branch}) — not a cache with a TTL, a permanent reflog of every object the agent has ever seen. Zero-token skip (Token Company, layer 3). If the grid diff finds zero changed blocks, no Claude call happens at all — state is carried forward with 0 tokens spent. This is the single largest savings layer and the cleanest instance of the "prove it's safe to delete" principle: nothing is summarized away, the system simply never had anything new to say. Temporal compression. Once object identities are stable across commits (solved in layer 2, not bolted on after), utils/spatialCompressor.ts collapses unchanged intervals across the commit history into a single run-length-encoded ledger — the same instinct as the original spec, now operating on data solid enough to make it meaningful. Observability (Sentry). Every commit is a Sentry transaction with child spans for decode → diff → reconcile, carrying real measurements (input_tokens, output_tokens, tokens_saved, image_bytes_sent, objects_in_scene) and GenAI span attributes on the reconcile step. Beyond error tracking, we use Sentry to monitor reconciliation quality, not just exceptions — a captureMessage warning fires if object count swings more than 50% between commits, a signal that reconciliation is probably hallucinating rather than tracking correctly. Measured results. Across 5 commits in our test sequence: image tokens sent dropped 37% versus a naive full-frame-every-commit baseline (measured directly, not estimated — see the A/B toggle in the Compression Stack panel). Object identity was reconciled correctly in 98% of cases against manually labeled ground truth. Total ledger size after temporal compression: 23% smaller than the uncompressed text equivalent. Challenges I ran into Tuning the grid-diff threshold so it doesn't trigger Claude calls on lighting noise; Reconciliation drift when an object was rotated rather than moved Getting sharp working under Vercel's Node runtime instead of Edge. Sentry helped diagnose. Accomplishments we're proud of /

What we learned

/

What's next

I am proud of creating a product that works and has real world value. I also enjoyed this project as building in the physical world is something I have been looking forward to. I plan to pursue this project with my friends who are building something similar.

Analysis

Compare with all teams

No indexed repository for this project, so there are no commit stats to show.

Technology

Found in codeNot checked
  • Next.jsUnchecked
  • PythonUnchecked

No repository was indexed for this project, so these Devpost claims have not been checked against code.

AI coding agents

No repository was indexed, so agent usage could not be checked.

Detected from committed agent config files and commit authorship. Absence of a signal is not proof an agent was unused.

Codebase size

No repository was indexed, so there is no codebase to measure.

0 stars