WallpaperMachine
당신이 사랑하는 배경화면, 맥에서 새롭게 만나보세요
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Où se retrouver ? Compare les temps de trajet voiture et train de plusieurs groupes vers des villes de France, à partir de données ouvertes (IGN, SNCF GTFS).
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Où se retrouver ce week-end ? A static web app that helps a family spread across France pick a meeting city. Each departure group says where it starts from and whether it travels by car, by train, or either. The app compares candidate cities and ranks them by fairness: it minimises the longest one-way trip anyone has to make, not the average. No backend, no API key. The browser asks the IGN routing service for car durations, and reads train durations from tables precomputed weekly from SNCF's open timetable, for every weekend the timetable covers (about five months ahead).README 전문 보기 ↗
Où se retrouver ce week-end ? A static web app that helps a family spread across France pick a meeting city. Each departure group says where it starts from and whether it travels by car, by train, or either. The app compares candidate cities and ranks them by fairness: it minimises the longest one-way trip anyone has to make, not the average.
Live: https://pierrebeaucoral.github.io/on-se-retrouve/
No backend, no API key. The browser asks the IGN routing service for car durations, and reads train durations from tables precomputed weekly from SNCF's open timetable, for every weekend the timetable covers (about five months ahead).
The engine lives in lib/travel/model.ts and is covered by tests/model.test.ts.
| Mode | Source | How |
|---|---|---|
| Car | IGN Géoplateforme itinéraire | Called from the browser (CORS enabled), fastest route on the BD TOPO road graph, city centre to city centre, no traffic. Cached seven days in the browser. |
| Train | Horaires SNCF, GTFS on transport.data.gouv.fr (TGV INOUI, OUIGO, Intercités, TER; 151-day horizon, refreshed daily) | scripts/build-rail.ts downloads the feed and precomputes, for every Friday, Saturday and Sunday inside the feed's horizon (about 70 dates), the shortest rail journey between every pair of the app's 156 cities. Coaches are excluded. |
| Map | france-geojson | Region outlines, drawn as SVG. |
For each date and each departure profile (06:00, 08:00, … 18:00), the script runs a RAPTOR search (lib/rail/raptor.ts) from every departure inside the following six hours and keeps, per destination, the journey with the shortest duration, ties broken by earliest arrival. Rules:
The output is one JSON per date and departure city in public/rail/<date>/<origin>.json plus public/rail/index.json, so the browser only downloads the departure cities in play. These files are generated in CI and not committed (public/rail/ is git-ignored); run npm run rail once for local development. In the app, a request at 14:30 uses the 16:00 profile: every train shown leaves after the time the user chose. These are theoretical timetables, not sales data; check the actual train before booking.
lib/travel/places.ts lists the 156 cities the app can compare: the original family cities plus the prefectures and main towns of metropolitan France that have a served station. It is generated by scripts/build-places.ts, which holds the curated name list and, for ambiguous names, the explicit stations of a city (for example Tours includes Saint-Pierre-des-Corps, Valence both Valence Ville and Valence TGV). Add a city to the script and rerun node scripts/build-places.ts; coordinates come from the main station. Ids of the original cities never change, so saved preferences keep working.
.github/workflows/refresh-and-deploy.yml runs every Monday at 05:00 UTC (and on manual dispatch): it recomputes the rail tables from the latest GTFS, builds the site and deploys it to GitHub Pages. As SNCF publishes about five months ahead, the covered range rolls forward one week at a time. A push to main reuses the week's tables from the Actions cache and only rebuilds the site. If the SNCF download fails the job fails loudly and the previously deployed tables stay live.
index.html, src/main.tsx Vite entry
src/App.tsx the page (groups, dates, scenarios, ranking, details)
src/travel-map.tsx SVG map of France
lib/travel/model.ts groups, scenarios, ranking, validation
lib/travel/places.ts generated list of cities and their stations
lib/travel/car-client.ts IGN routing client (browser)
lib/travel/rail-client.ts reads the precomputed rail tables
lib/travel/client.ts one round trip = car or rail, outbound + return
lib/rail/gtfs.ts GTFS parsing, station mapping
lib/rail/raptor.ts RAPTOR routing and journey tightening
lib/rail/build.ts per-date table builder
lib/rail/zip.ts minimal zip reader (no native unzip needed)
scripts/build-rail.ts CLI: GTFS → public/rail/<date>/<origin>.json
scripts/build-places.ts CLI: curated city names + GTFS → lib/travel/places.ts
tests/ node:test suites (engine, routing, parsing)
components/ui/ shadcn primitives actually used
npm install
npm run dev # local preview with hot reload
npm test # engine, routing and parser tests
npm run typecheck
npm run lint
npm run rail # build public/rail from the live SNCF feed (about 30 minutes for 156 cities)
npm run rail -- --gtfs path/to/feed.zip --dates 2026-09-18 # offline / single date
npm run build # static site in dist/ (base path /on-se-retrouve/)
VITE_BASE=/ npm run build # build for another host
Node 22.18 or newer is required (TypeScript scripts run without a build step).
The page works inside an iframe and without localStorage; preferences and the car cache are conveniences, not requirements.