No updates detected yet. GitHub releases will appear here.
A personal Paris discovery guide — ranked, weather-aware suggestions for what to do today, tonight and this weekend.
翻訳待ち
Loading the full README. The saved excerpt is shown below.
A city guide for the people who live in one. Paris, Delhi, Bengaluru and the Bay Area, at allez.city.
It answers one question every time you open it: *what is something interesting
we could do next?* Not an events listing — a ranked, weather-aware, date-aware
set of suggestions built around wherever you happen to be standing.
The old ektasengar.github.io/paris address redirects here and will keep
doing so.
Four things worth knowing before you change anything.Read the full README ↗A city guide for the people who live in one. Paris, Delhi, Bengaluru, the Bay Area and New York, at allez.city.
Live at → allez.city
It answers one question every time you open it: what is something interesting we could do next? Not an events listing — a ranked, weather-aware, date-aware set of suggestions built around wherever you happen to be standing.
The old ektasengar.github.io/paris address redirects here and will keep
doing so.
Four things worth knowing before you change anything.
It is one engine and five city packs. js/ holds the engine — ranking,
distance, expiry, photographs, the render path. Each of paris/, delhi/,
bengaluru/, bay-area/ and new-york/ holds a pack: the vocabulary, the zones, the
transit grammar, the money, the calendar, which views exist and which sources
feed them. The engine never names a city. If you find yourself writing
Paris or ₹ or arrondissement in js/, it belongs in a pack instead — see
The city pack.
The why fields are the whole product. Every curated record says why you
would care, in a human sentence somebody wrote. That is the difference between
this and a listings site, and it does not scale, which is fine. Four of the
five cities have an empty curated tier right now because nobody has written
theirs yet — though the Bay Area, Delhi and Bengaluru now have an editorial
one, which is the researched-but-never-visited tier below it. Adding rows is not progress; adding judgement is.
Some of the code looks wrong and is not. Script tags above <main>, a
:empty CSS reservation, <picture> where an <img> would do, a 200 ms
deadline on the weather fetch, tabs as markup rather than rendered. Each is
load-bearing and each has a measured cost if tidied. They are written up in
.claude/skills/paris-performance/references/invariants.md — read that before
touching the boot sequence, the critical path, image slots or the render path.
Run the checks. They are fast, and between them they have caught every real regression this codebase has had:
node scripts/check-packs.mjs # every city pack holds up its end
node scripts/version.mjs --all # restamp after touching css/, js/ or data/
node scripts/refresh.mjs --check # every record still valid
node scripts/check-location.mjs # moving still changes the answers
All four run on every pull request. The heavier one, check-views.mjs, renders
every view in a headless browser and hashes the result — run it by hand around
anything that touches rendering:
export CHROME_PATH="/path/to/Chrome"
node scripts/check-views.mjs --save /tmp/before.json
# …make the change…
node scripts/check-views.mjs --compare /tmp/before.json
node scripts/serve.mjs # http://localhost:4321
http://localhost:4321/ is the discovery homepage: city switching, mood
filters, previews of written recommendations, and a surprise idea. It
reads existing city files; live location-aware ranking stays in the city
guides. /paris/, /delhi/,
/bengaluru/, /bay-area/ and /new-york/ are the cities.
Read SOURCES.md first. What a new pack can reuse depends almost entirely on which country the city is in, and far less on how big it is: a European city probably publishes its own events and facilities through Opendatasoft or CKAN, an American one probably publishes facilities through Socrata and no events at all, and an Indian one publishes nothing a keyless script can read. Measured, with the numbers, in that file.
Copy the nearest existing pack, not Paris — Paris is the one with a municipal
data feed and twenty numbered zones, and almost nothing about that transfers.
check-packs.mjs will tell you what the engine still expects that you have not
supplied. The short version:
<city>/city.js — the pack. Zones with centroids, vocabulary, reach model,
money, holidays, views.<city>/index.html — copy a neighbour's and change the wordmark, the
placeholder text, the zone label and the price chip. A city owns its own
page; the engine does not write it.<city>/data/ — home.json plus structurally valid empty files. A CORE
file that 404s rejects the whole load, so "nothing here yet" has to be an
empty items array rather than a missing file.HOMEGROUND_CITY=<city> node scripts/discover.mjs — the OpenStreetMap layer.why fields. This is the part that cannot be generated.Static site. No build step, no framework, no backend, no API keys, no accounts. A handful of JavaScript files and some JSON.
This is the beginning of the README. Read the rest at the original. Read the full README ↗