Geo Feed is a CLI-led Lace experiment for public, asynchronous spatial messages. An author publishes each immutable message into one explicit H3 cell and resolution. A reader computes a finite H3 disk locally and synchronizes only that exact resolution after an explicit TAI lower bound.
An H3 cell is an author assertion, not proof of physical location. Geo Feed is not presence, a global timeline, or a remote map-query API. The endpoint can infer the area named by a reader’s policy, and records already copied are not retracted when the selected area changes.
The base frontend entry is //u//geo-feed//index.html;
the packaged HTTP compatibility host serves
//u//geo-feed/http//index.html.
The app accepts resolutions 5 through 10 and ring counts 0 through 5, yielding at most 91 cells away from pentagon distortion. Resolution changes select a different layer; the app does not aggregate H3 ancestors or descendants. H3 hierarchy is exact, but geometric containment between resolutions is only approximate, so the feed makes no metric-radius claim.
Raw latitude and longitude are constructor inputs only. Records carry
a canonical cell, resolution, and
Spatial-Profile: uber-h3-v4. Replies exact-link their
parent and inherit its cell and resolution. An author-marked retraction
must exact-link its target and match its spatial fields; it hides that
message from the projection without deleting bytes. Display order is
descending TAI then hash, and TAI is not trusted chronology.
The waypoint is intentionally public-write and has no application moderation authority. It admits well-shaped public records and intersects its broad operand with each client’s finite area operand. Abuse controls, quotas, retention, registration, and moderation are outside the current app.
The shared core/ owns H3 validation, records,
projection, policy generation, and bounded sync. CLI and browser code
only adapt identity, storage, connections, geolocation, and
presentation. Changing area inputs creates a new bounded policy; there
is no hidden mutable location or automatic sync.
Create an identity and post locally:
npm --prefix incubator/geo-feed run geo-feed -- \
--identity incubator/geo-feed/.lace-data/alice-identity.json \
identity create
npm --prefix incubator/geo-feed run geo-feed -- \
--store incubator/geo-feed/.lace-data/alice \
--identity incubator/geo-feed/.lace-data/alice-identity.json \
message post --lat 51.4416 --lng 5.4697 --resolution 8 \
--topic transit --text "The next bus is on time."
List a seven-day, two-ring exact-layer feed:
npm --prefix incubator/geo-feed run geo-feed -- \
--store incubator/geo-feed/.lace-data/alice \
--identity incubator/geo-feed/.lace-data/alice-identity.json \
feed list --lat 51.4416 --lng 5.4697 --resolution 8 --rings 2
Use message reply HASH --text TEXT,
message retract HASH, and feed all for linked
replies, retractions, and the full retained local projection. Run with
--help for sync and other options.
Build and run the complete Geo Feed host with Deno:
npm --prefix incubator/geo-feed run host
The command builds dist/, then serves the browser
interface and its Interlace endpoint together on
http://127.0.0.1:8877/. Host records persist under
.lace-data/geo-feed/host. Pass host options after
--, for example
--listen ws:127.0.0.1:0/interlace or
--store-path PATH.
The browser map has no tile or CDN dependency. Geolocation runs only after Use my location. Applying an area changes the local projection; Sync this area performs one bounded WebSocket interlace.
Fine cells can reveal homes, workplaces, routines, protests, or
shelters. Repeated syncs may reveal movement, and a persistent
By value makes locations linkable. Marks prove key control,
not identity, truth, location, or permission. The UI shows the exact
cell set before publication or synchronization.
npm --prefix incubator/geo-feed run check
node --test incubator/geo-feed/test/package.test.mjs incubator/geo-feed/test/core.test.mjs incubator/geo-feed/test/actions.test.mjs
node --test incubator/geo-feed/test/cli.test.mjs incubator/geo-feed/test/sync.test.mjs
git diff --check