Easy-to-manage touch screens
Free, open-source touch screens. Guided USB setup, a drag-and-drop editor and local control. Made for Home Assistant.
A living city guide you operate, not just read. Single-file HTML guides from AI research.
LifestyleHTML · JavaScriptGitHub @robriggs3OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
A living city guide you operate, not just read.
AI engines produce good city research in minutes, but the output is a wall
of text you re-scroll all week while the real trip mutates around it:
plans reorder, options die ("full tonight"), backups get promoted, and
half the value is discovered on the ground. Nomadding owns the layer between
AI research and the actual week: a guide with a working memory.Read the full README ↗A living city guide you operate, not just read.
AI engines produce good city research in minutes, but the output is a wall of text you re-scroll all week while the real trip mutates around it: plans reorder, options die ("full tonight"), backups get promoted, and half the value is discovered on the ground. Nomadding owns the layer between AI research and the actual week: a guide with a working memory.
Live app: app.nomadding.com · Example guide: example.html · Deep dive: docs/ARCHITECTURE.md
This public repo ships the app plus one bundled example city. The real city guides it was built around (and field-tested on) are personal travel data and live out-of-repo by design, in a private deployment of the same code.
| Planner | Review-verified intel |
|---|---|
plan, backup, done, or
archived, with one-tap moves and undos. Days are chronological slots;
drag a day's content elsewhere and the dates stay put while the plan
reorders. Rename items, collapse sections, collapse whole days once they
are done; everything persists.must / good / skip verdicts on
specific dishes and specifics-of-the-thing (which route, which seats,
which add-on), plus tips and a source line. A real pass on a lived-in
guide produced 25 items with 73 verdicts, built from per-dish review
data, and corrected the guide's own prose in four places.template.html to <city>.html (e.g. lisbon.html).PROMPT.md with the city, dates,
accommodation, and traveler profile, then paste the whole prompt into
Claude, ChatGPT, or any capable AI engine. It returns a single JSON
code block.<script type="application/json" id="city-data">
block in <city>.html, orcities/<city>.json and run
node tools/embed.js cities/<city>.json <city>.html.Or skip the file entirely: open the app, tap the city name, + Add city, and either paste generated JSON or start a blank city from a name and dates. Build my prompt assembles step 2 for you, with your saved interest profile included.
Each place has a lifecycle: plan (the current pick), backup (the
alternative when plan A falls through), done (visited; recedes but
stays visible as the trip record), and archived (out of the way,
recoverable). One-tap controls move items between states; every move is
undoable, and controls only render where the action is valid.
Days render as chronological slot cards, including empty days, so anything can be dragged or moved onto any date of the stay. Share flips to a clean read-only view (prints as a one-pager). Export downloads schema-valid JSON with your live changes baked in; the round trip back through paste is lossless by test. Update data and Enrich accept pasted JSON on the go: Update data replaces a city's research wholesale, Enrich merges a delta (new interest matches, or an intel pass) without touching anything you've done.
Somewhere recommended over dinner goes in by hand from the + on any section header, and the card that appears carries an Ask Claude control that looks the place up and ranks it against the rest of that section: "ranks 2nd of your 11 dinner picks". The header carries a single row of highlights above the city's facts: today's sunset, computed on the device from the city's coordinates with no network call, and up to four pinned items, so the tap-water rule sits in the header instead of eleven screens down the Info tab.
Run tools/verify.sh before opening a PR; paste its last line in the PR
body. It runs the unit suite, the build, the drift guard and the headless
browser checks, prints one line per stage, and exits non-zero on any failure.
Only the headless stage needs a network: VERIFY_SKIP_HEADLESS=1 skips it with
a visible SKIP line.
On a shared machine run it through the build lock, so the browser and bundler stages queue instead of competing for memory:
~/bin/build-lock.sh tools/verify.sh
The short version of docs/ARCHITECTURE.md:
fetch (no SDK): magic-link auth, epoch-ms
newer-wins reconcile, flush-on-hide, RLS-only security with anonymous
access revoked and verified.index.html, what to do in a
city) and the trip side (/trip/, stops, stays and travel legs)
share an origin, a session, and a credential store. Both are assembled
from src/ by the same assembler, so the drift guard covers both./share/, a read-only snapshot of a trip
(optionally with chosen city guides) at an unguessable token, for
people with no account. Anonymous readers get exactly one door, the
get_share(token) security-definer function; the shares table itself
grants nothing to anon, so enumeration is impossible and a rotated
token dies instantly. What a snapshot may contain is a fixed field list
in the engine (CityOps.shareKit), pure and unit tested: no costs, no
booking confirmations, no paid flags, no private notes, no addresses.PROMPT.md doubles as
documentation and machine-readable source, sliced by landmark into
generated prompts; the merge path is validation-gated and
prototype-safe.has_active_entitlement(uid) is a security-definer helper checked in
the WITH CHECK of every write policy on cities, city_state,
planahead and shares. Reads and deletes stay own-rows, so a lapsed
account keeps everything it made, can still export it, and can still
delete it; what pauses is write-sync, one-tap AI and publishing a
share link. The same decision is mirrored in the engine
(CityOps.entitlementKit, pure and unit tested) for one purpose only:
saying why before a refusal happens, never after. Stripe reaches the
project through one Payment Link per tier and one edge function
(supabase/functions/stripe-webhook) whose signature check IS its
inbound auth gate.Schema v1 is the contract across standalone guides, the app, exports, and the generation prompt. Three forms, by audience:
validate() / validateItem() / validateIntel()
at the top of src/cityops.js, the enforcement boundary
for every entry path (paste, delta merge, sync pull). Deliberately a
permissive subset of the JSON Schema; the schema file's description
documents exactly which constraints are advisory.The shape in one glance:
{
"schema": 1,
"city": {"name": "Yerevan", "country": "AM",
"dates": {"from": "2026-08-15", "to": "2026-08-22"}},
"sections": [{"id": "dinner", "label": "Dinner", "icon": "🍽️"}],
"items": [{
"id": "buzand-cafe", "section": "dinner", "status": "plan",
"day": "2026-08-16", "name": "Buzand Cafe Restaurant",
"price": {"text": "~4,000-12,000 AMD / $11-33"},
"note": "4.8 stars across 442 reviews ...",
"hours": {"text": "10:00-23:00 daily", "class": "late"},
"links": [{"kind": "map", "label": "Open in Maps", "href": "https://maps.google.com/?cid=..."}],
"intel": {"verdicts": [{"tier": "must", "text": "The Italian side of the menu"}],
"tips": ["Ask for the outdoor patio"],
"source": "Yandex per-dish review data, Aug 2026"},
"place_id": null, "verified": null
}]
}
Built and shipped in phases, each gated on evidence from real use:
single-file guides (phase 1), the multi-city app with sync and a custom
domain (phase 2), profiles + intel + delta enrichment (phase 3a). Next:
a bridge from the companion itinerary tracker (one tap scaffolds a city
from a trip stop), server-side enrichment when usage justifies the cost,
and Places-API verification. Full history in docs/superpowers/.
MIT. The example city data is real, field-checked research; treat prices and hours as snapshots of when they were verified.
docs/superpowers/