Skip to content

Commit 3213f81

Browse files
committed
feat: initial scaffold with walking isochrone MVP
- Spec-driven foundation: PRD, ADRs 0001-0005, TASKS, research note, DEVELOPING/FIRST-RUN guides - Turborepo monorepo: Next.js 14 + TS + Tailwind + MapLibre, providers package - IsochroneProvider / PoiProvider / TileProvider / TransitDataProvider abstractions - ORS isochrone adapter (with fixture-driven Vitest tests), Geoapify POI adapter, Stadia tile adapter - Walking isochrone slice: draggable origin, time selector, polygon render, URL state, geolocation - NavigateTo handoff: Google Maps / Waze / Moovit / Apple Maps / OSM deep links - GitHub Actions CI: lint, typecheck, unit tests
1 parent fdd775d commit 3213f81

72 files changed

Lines changed: 8684 additions & 0 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.editorconfig

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
root = true
2+
3+
[*]
4+
indent_style = space
5+
indent_size = 2
6+
end_of_line = lf
7+
charset = utf-8
8+
trim_trailing_whitespace = true
9+
insert_final_newline = true
10+
11+
[*.md]
12+
trim_trailing_whitespace = false

.env.example

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# Env vars live in apps/web/.env.local — not here.
2+
#
3+
# Next.js loads .env files relative to the directory containing next.config.mjs.
4+
# For this repo that's apps/web/. See apps/web/.env.example for the template,
5+
# and copy it to apps/web/.env.local for local dev.
6+
#
7+
# Why not at the repo root? Putting .env.local at the root means Next ignores it
8+
# silently and you get cryptic "X not set" errors at runtime. Keeping the file
9+
# next to the app makes the contract obvious.

.github/workflows/ci.yml

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
name: CI
2+
3+
on:
4+
pull_request:
5+
push:
6+
branches: [main]
7+
8+
concurrency:
9+
group: ci-${{ github.ref }}
10+
cancel-in-progress: true
11+
12+
jobs:
13+
verify:
14+
runs-on: ubuntu-latest
15+
timeout-minutes: 15
16+
17+
steps:
18+
- uses: actions/checkout@v4
19+
20+
- uses: pnpm/action-setup@v4
21+
with:
22+
version: 9
23+
24+
- uses: actions/setup-node@v4
25+
with:
26+
node-version-file: '.nvmrc'
27+
cache: 'pnpm'
28+
29+
- name: Install dependencies
30+
run: pnpm install --frozen-lockfile
31+
32+
- name: Lint
33+
run: pnpm lint
34+
35+
- name: Typecheck
36+
run: pnpm typecheck
37+
38+
- name: Unit tests
39+
run: pnpm test

.gitignore

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# dependencies
2+
node_modules/
3+
.pnpm-store/
4+
5+
# build outputs
6+
.next/
7+
out/
8+
dist/
9+
build/
10+
.turbo/
11+
12+
# env
13+
.env
14+
.env.local
15+
.env.*.local
16+
17+
# logs
18+
*.log
19+
npm-debug.log*
20+
yarn-debug.log*
21+
yarn-error.log*
22+
pnpm-debug.log*
23+
24+
# editors
25+
.vscode/
26+
.idea/
27+
*.swp
28+
.DS_Store
29+
Thumbs.db
30+
31+
# tests
32+
coverage/
33+
playwright-report/
34+
test-results/
35+
.playwright/
36+
37+
# misc
38+
*.tsbuildinfo

.npmrc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
auto-install-peers=true
2+
strict-peer-dependencies=false
3+
shamefully-hoist=false

.nvmrc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
20.18.0

.prettierignore

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
node_modules
2+
.next
3+
.turbo
4+
dist
5+
build
6+
coverage
7+
pnpm-lock.yaml
8+
**/__fixtures__/**/*.json

.prettierrc.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"semi": true,
3+
"singleQuote": true,
4+
"trailingComma": "all",
5+
"printWidth": 100,
6+
"tabWidth": 2,
7+
"plugins": ["prettier-plugin-tailwindcss"]
8+
}

README.md

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# Ilsochrone
2+
3+
A Tel Aviv isochrone web app — pick a point, pick a time, see where you can get and what's worth visiting inside that area. Walking-only MVP; transit, driving, and bikeshare in later phases.
4+
5+
> Not a navigation app. The product is the answer to **"where can I get?"** — to encourage public transportation and spontaneous urban exploration.
6+
7+
## Quickstart
8+
9+
```bash
10+
pnpm install
11+
cp apps/web/.env.example apps/web/.env.local # then fill in API keys
12+
pnpm dev
13+
```
14+
15+
Open <http://localhost:3000>. See [docs/DEVELOPING.md](docs/DEVELOPING.md) for the full setup walkthrough.
16+
17+
## Documentation
18+
19+
- [Product Requirements](docs/PRD.md)
20+
- [Sprint Plan (T-01..T-15)](docs/TASKS.md)
21+
- [Developer Guide](docs/DEVELOPING.md)
22+
- [Research note — data sources & APIs](docs/research/01-data-sources.md)
23+
- Architecture Decision Records:
24+
- [ADR-0001 — Web stack](docs/adr/0001-stack.md)
25+
- [ADR-0002 — Isochrone engine](docs/adr/0002-isochrone-engine.md)
26+
- [ADR-0003 — POI and tile providers](docs/adr/0003-poi-and-tile-providers.md)
27+
- [ADR-0004 — Deployment and AI workflow](docs/adr/0004-deployment-and-ai-workflow.md)
28+
29+
## Stack
30+
31+
Next.js 14 (App Router), TypeScript strict, Turborepo + pnpm workspaces, MapLibre GL JS, Tailwind, Zod, SWR, Vitest, Playwright. Deploys to Vercel.
32+
33+
## Status
34+
35+
Pre-alpha. Specs landed; scaffolding in place; walking isochrone slice (T-04 through T-07) wired. Run `pnpm dev` after adding API keys to see the map and a live polygon.

apps/web/.env.example

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# Copy this file to apps/web/.env.local for local development.
2+
#
3+
# IMPORTANT: this file must live in apps/web/, NOT at the repo root.
4+
# Next.js loads .env files relative to the directory containing
5+
# next.config.mjs, which is apps/web/. A .env.local at the repo root
6+
# will be silently ignored.
7+
#
8+
# Production values live in Vercel project env vars (Production + Preview).
9+
10+
# OpenRouteService — required.
11+
# Get a key at https://openrouteservice.org/dev/#/signup
12+
# After signing up, click the verification link in the email — keys
13+
# do not work until verified.
14+
ORS_API_KEY=
15+
16+
# Geoapify — required for POIs.
17+
# Get a key at https://myprojects.geoapify.com/
18+
GEOAPIFY_API_KEY=
19+
20+
# Stadia Maps — required for basemap tiles.
21+
# Get a key at https://client.stadiamaps.com/
22+
# This is public-by-design (browser fetches tiles directly).
23+
# Lock the key by origin in your Stadia dashboard before deploying.
24+
NEXT_PUBLIC_STADIA_API_KEY=
25+
26+
# MapTiler — optional alternative tile provider.
27+
# Get a key at https://cloud.maptiler.com/account/keys/
28+
# Leave blank in MVP unless you want to switch tile providers.
29+
MAPTILER_API_KEY=
30+
31+
# Public env vars (exposed to the browser).
32+
# Default origin for the map when geolocation is unavailable.
33+
NEXT_PUBLIC_DEFAULT_LNG=34.7818
34+
NEXT_PUBLIC_DEFAULT_LAT=32.0853
35+
NEXT_PUBLIC_DEFAULT_ZOOM=13
36+
37+
# Optional: pin the providers for debugging. Defaults are set in code.
38+
# NEXT_PUBLIC_TILE_PROVIDER=stadia
39+
# NEXT_PUBLIC_POI_PROVIDER=geoapify
40+
# NEXT_PUBLIC_ISOCHRONE_PROVIDER=ors

0 commit comments

Comments
 (0)