Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ python3 build.py # regenerate data/attractions.{json,js} after data
- **`data/attractions.{js,json}` are generated** — never hand-edit; change a scraper or `data/raw/*.json` and run `build.py`. **Exception:** `tags`/`duration_min` are planning *state* held inline in `attractions.json` (filled by the `tag-places` skill / `enrich/tag_places.py`); `build.py` preserves them across rebuilds. `attractions.js` is always a generated mirror.
- **Parse `data/attractions.json`, not `.js`** — `attractions.js` is `window.ATTRACTIONS = [...];` (JS assignment, not JSON; `JSON.parse` fails). Use the `.json` twin for programmatic reads.
- **Duplicate places across sources** — the same spot appears from multiple sources at near-identical coords; dedupe by rounded coords (e.g. `lat.toFixed(3)`) when aggregating.
- **Deploy = merge to `main`** → GitHub Pages at https://amnir.github.io/maptiyul/ (absolute OG/`og:url` point there). `main` is protected: push a branch + open a PR (`gh pr create`), direct pushes are rejected.
- **Deploy = merge to `main`** → GitHub Pages at https://amnir.github.io/maptiyul/ (absolute OG/`og:url` point there). `main` is protected: push a branch + open a PR (`gh pr create`), direct pushes are rejected. **After a PR merges, delete its feature branch** (local `git branch -D` + remote `git push origin --delete`, plus `git worktree remove` if it was a worktree) — squash merges mean `git branch -d` won't auto-detect the merge.
- **RTL layout** (`dir="rtl"`): logical CSS props are mirrored — `inline-start` = right, `inline-end` = left.
- **`sw.js` cache** `maptiyul-v1`: page + `attractions.js` are network-first; bump the cache name when changing which shell assets are precached.
- **Trip planner has two modes**: deterministic client-side generator (default, no backend) and an optional Supabase Edge Function (`supabase/functions/plan/`) for a real LLM, vendor-agnostic via `LLM_BASE_URL`/`LLM_API_KEY`/`LLM_MODEL`. The LLM path falls back to the deterministic one on any error. `SUPABASE_URL`/`SUPABASE_ANON_KEY` in `index.html` are public-by-design; real provider/service keys live only in Supabase secrets (`.env` is gitignored) — never commit them. See README "Trip planner (LLM backend)".
Expand Down