From 3d808d3a39f250f20efc976bfb8fa4c8429ef223 Mon Sep 17 00:00:00 2001
From: davd-gzl <60177543+davd-gzl@users.noreply.github.com>
Date: Fri, 23 Oct 2026 18:21:51 +0000
Subject: [PATCH] Rename the app to Railmap
Railmap: every train, every pass. The app now covers more than the MAX
passes, so the name no longer names one.
GitHub Pages will serve the site under /Railmap/ once the repository is
renamed to Railmap. Move the build base, manifest, service worker, 404 page
and site links to that path, rename the app in every locale, the Android
label and the store metadata, and rewrite the README.
The Android application id (org.maxfinder.app) and the keystore alias stay
as they are so existing installs keep upgrading.
---
.claude/skills/foss-serverless-app/SKILL.md | 2 +-
.github/workflows/release-apk.yml | 2 +-
README.md | 192 +++++++++---------
VISION.md | 6 +-
android/app/src/main/res/values/strings.xml | 4 +-
capacitor.config.ts | 2 +-
docs/FDROID.md | 14 +-
docs/algorithms.md | 4 +-
docs/how-it-works.md | 14 +-
docs/user-flows.md | 2 +-
.../android/en-US/full_description.txt | 2 +-
fastlane/metadata/android/en-US/title.txt | 2 +-
index.html | 54 ++---
package-lock.json | 4 +-
package.json | 2 +-
public/404.html | 10 +-
public/api.json | 16 +-
public/llms.txt | 32 +--
public/manifest.webmanifest | 12 +-
public/sw.js | 10 +-
scripts/e2e.mjs | 6 +-
scripts/prerender.mjs | 4 +-
scripts/screenshot.mjs | 4 +-
scripts/shot-hidden.mjs | 4 +-
scripts/shot-radius.mjs | 4 +-
scripts/verify-render.mjs | 4 +-
specs/constitution.md | 2 +-
src/config.ts | 4 +-
src/i18n/ar.ts | 4 +-
src/i18n/de.ts | 4 +-
src/i18n/en.ts | 4 +-
src/i18n/es.ts | 4 +-
src/i18n/fr.ts | 4 +-
src/i18n/it.ts | 4 +-
src/i18n/ja.ts | 4 +-
src/i18n/ko.ts | 4 +-
src/i18n/nl.ts | 4 +-
src/i18n/pt.ts | 4 +-
src/i18n/zh.ts | 4 +-
src/pwa/register.ts | 2 +-
src/types.ts | 2 +-
src/ui/ics.ts | 2 +-
src/ui/modals.ts | 2 +-
src/ui/shell.ts | 2 +-
vite.config.ts | 6 +-
45 files changed, 238 insertions(+), 240 deletions(-)
diff --git a/.claude/skills/foss-serverless-app/SKILL.md b/.claude/skills/foss-serverless-app/SKILL.md
index bd2c323..aa63e07 100644
--- a/.claude/skills/foss-serverless-app/SKILL.md
+++ b/.claude/skills/foss-serverless-app/SKILL.md
@@ -12,7 +12,7 @@ description: >-
# Build a FOSS, serverless remake — end to end
-This is the method used to build `MAX-Finder` (a MAX JEUNE / SENIOR train-seat
+This is the method used to build `Railmap` (a MAX JEUNE / SENIOR train-seat
finder on SNCF open data). It generalizes to any "remake X as a FOSS static app" task.
## Core principles (decide these first)
diff --git a/.github/workflows/release-apk.yml b/.github/workflows/release-apk.yml
index 40f0176..54924dc 100644
--- a/.github/workflows/release-apk.yml
+++ b/.github/workflows/release-apk.yml
@@ -89,7 +89,7 @@ jobs:
set -euo pipefail
tag="${{ github.event.release.tag_name || github.ref_name }}"
src=$(ls android/app/build/outputs/apk/release/*-release.apk | grep -v -- -unsigned | head -n1)
- name="max-finder-${tag}.apk"
+ name="railmap-${tag}.apk"
cp "$src" "$name"
echo "name=$name" >> "$GITHUB_OUTPUT"
diff --git a/README.md b/README.md
index f9bbd52..d1977cc 100644
--- a/README.md
+++ b/README.md
@@ -1,145 +1,143 @@
-# MAX Finder
+# Railmap
-**Find every SNCF train where a free MAX JEUNE / MAX SENIOR (ex-TGVmax) seat is actually reservable — instead of checking SNCF Connect one route at a time.**
+**Every train, every pass.** Find the trains your rail pass can take, across a whole country, in one search.
-### ▶ [**Try it live — offware-apps.github.io/MAX-Finder**](https://offware-apps.github.io/MAX-Finder/) — no signup, runs in your browser
+**Live app: [offware-apps.github.io/Railmap](https://offware-apps.github.io/Railmap/)**. No account, nothing to install, it runs in your browser.
-With a MAX JEUNE or MAX SENIOR pass, high-speed trains are free — but only when a MAX seat is still open on that train. SNCF Connect makes you check one route at a time; MAX Finder shows every station you can reach for free from a single search, using SNCF's open availability data.
+[](./LICENSE)
+[](https://github.com/offware-apps/Railmap/actions/workflows/test.yml)
-Free, no account, open-source, and serverless — it runs entirely in your browser.
+Railmap was called MAX Finder until October 2026. Old `/MAX-Finder/` links redirect here.
-> Independent open-source tool — **not affiliated with SNCF, not a ticket seller**. Availability is indicative and refreshed ~daily; always confirm and book on [SNCF Connect](https://www.sncf-connect.com/).
+## Contents
----
+- [What it does](#what-it-does)
+- [Supported passes](#supported-passes)
+- [Screenshots](#screenshots)
+- [Getting started](#getting-started)
+- [How it works](#how-it-works)
+- [Mobile app](#mobile-app)
+- [Data API](#data-api)
+- [Contributing](#contributing)
+- [License](#license)
-## See it
+## What it does
-| | |
-| --- | --- |
-| [](docs/screenshots/from.png) | [](docs/screenshots/tour.png) |
-| **Where to?** — everywhere you can go, ranked by availability | **Tour** — chain several cities into one free itinerary |
-| [](docs/screenshots/best.png) | [](docs/screenshots/trip.png) |
-| **Ideas** — fastest destinations that day | **Exact trip** — exact route + 30-day calendar |
-
-
-
-
-
+A MAX JEUNE or MAX SENIOR pass makes SNCF high-speed trains free, but only on trains that still have a MAX seat open. SNCF Connect makes you check one route at a time. Railmap searches every train at once and shows you where you can go.
----
+- **Where to?** Every destination you can reach from a station, ranked by availability.
+- **Where from?** Every origin that reaches a destination.
+- **Exact trip.** One route, with connections, a 30-day availability calendar and a round-trip finder.
+- **Ideas.** The fastest destinations reachable on a given day.
+- **Tour.** A multi-city itinerary, day by day, each leg on a pass seat.
-## Search modes
+It also handles connections (up to 6 changes, an optional stopover city, overnight stops), night trains, filters by time, duration and train type, a map of every station, calendar export and shareable links. It is available in 11 languages, including Arabic with a right-to-left layout, works offline once installed, and keeps your favorites and settings on your device only.
-- **Where to?** — every destination reachable from a station, ranked by availability.
-- **Where from?** — the reverse: every origin that reaches a destination.
-- **Exact trip** — one origin → destination, with connections, a 30-day availability calendar, and a round-trip finder.
-- **Ideas** — the fastest destinations reachable that day.
-- **Tour** — a multi-city, day-by-day itinerary, each hop on a free MAX seat.
+## Supported passes
-## Features
+| Pass | Status | What Railmap shows |
+| --- | --- | --- |
+| MAX JEUNE (16 to 27) | Available | Trains with a free MAX seat open for booking |
+| MAX SENIOR (60+) | Available | Trains with a free MAX seat open for booking |
+| Interrail | In progress ([#83](https://github.com/offware-apps/Railmap/pull/83)) | Every SNCF train a pass holder can take, international stops included |
-| | |
-| --- | --- |
-| **Connections** | Multi-leg up to 6 changes via hubs, optional **Via** stopover, overnight-stopover mode |
-| **Round trips & night trains** | Round trips pair the earliest-arriving outbound with the latest feasible return to maximize time there; night mode covers genuine *Intercités de Nuit* only |
-| **Filters** | Time window, max duration, MAX JEUNE vs SENIOR, train type, region |
-| **Map** | Leaflet map of every station, with correspondences plotted as intermediate points; click to select |
-| **Search & share** | Explicit run (`Enter`/`g`), back nav (`Esc`), **Surprise me** random city, ICS calendar export, shareable URLs |
-| **Private by default** | No accounts — favorites, settings and searches in `localStorage`; optional local notifications |
-| **Everywhere** | 11 languages (FR EN ES DE IT KO ZH JA NL PT AR, incl. RTL), light/dark, installable app that works offline, mobile, accessible |
-
----
+Booking always happens on [SNCF Connect](https://www.sncf-connect.com/). Railmap is an independent project, not affiliated with SNCF, and does not sell tickets. Availability is refreshed about once a day, so confirm before you book.
-## Why it's free
+## Screenshots
-Which trains have a free MAX seat is published by SNCF as open data. MAX Finder is a static frontend over it:
+| Where to? | Tour |
+| --- | --- |
+| [](docs/screenshots/from.png) | [](docs/screenshots/tour.png) |
+| **Ideas** | **Exact trip** |
+| [](docs/screenshots/best.png) | [](docs/screenshots/trip.png) |
-- A scheduled **GitHub Action** snapshots the dataset each morning into `public/data/tgvmax.json`, keeping only the trains with a free seat (~77 MB feed trimmed to ~6 MB).
-- The **browser** downloads that file and runs the search on your device; it can also query the SNCF API directly as a fallback.
-- Everything is static files on **GitHub Pages** — no backend, no database, no server cost.
+
+
+
+
-## Develop
+## Getting started
-**Prereqs:** Node 20+ and npm (CI runs Node 22).
+You need Node 20 or later and npm. CI runs Node 22.
```bash
+git clone https://github.com/offware-apps/Railmap.git
+cd Railmap
npm install
-npm run dev # http://localhost:5173 (uses the committed data snapshot if present, else fixture)
-npm test # unit tests, no network needed
-npm run build # type-check + static build -> dist/
-npm run verify # render gate: the built app mounts (home + exact-trip + tour), no blank page
-npm run test:e2e # end-to-end user journeys in headless Chromium against dist/ (needs build first)
+npm run dev
```
-The full check suite (`build` → `test` → `verify` → `test:e2e`) also runs in CI on every
-pull request and push to `main` (`.github/workflows/test.yml`), and gates the Pages deploy.
+Then open . The dev server uses the committed data snapshot, or a small fixture if there is none.
+
+| Command | What it does |
+| --- | --- |
+| `npm run dev` | Start the dev server |
+| `npm test` | Unit tests, no network needed |
+| `npm run build` | Type-check and build the static site into `dist/` |
+| `npm run verify` | Check that the built app renders (home, exact trip, tour) |
+| `npm run test:e2e` | End-to-end journeys in headless Chromium against `dist/` (run `build` first) |
+| `npm run fetch-data` | Download a fresh availability snapshot |
+
+CI runs `build`, `test`, `verify` and `test:e2e` on every pull request and on `main`, and only deploys to GitHub Pages when they pass.
-Repository layout — where each piece of logic lives
+Project layout
```
-public/data/ committed daily snapshot (tgvmax.json + meta.json), served at /data/
-data/ station registry + a small fixture for dev/tests
-src/core pure search / connections / calendar logic (unit-tested)
-src/data dataset loading + station lookup (+ DatasetProfile seam)
-src/ui rendering (search form, results, map, calendar)
-scripts/ fetch-data.ts (daily Action) + verify-render.mjs + e2e.mjs + screenshot.mjs
-tests/ unit tests (vitest)
-.github/ ci (test) + update-data (cron) + deploy (Pages) workflows
-docs/ how-it-works.md, algorithms.md (plain-language guides) + screenshots
-specs/ constitution.md (guiding principles)
+public/data/ daily availability snapshot (tgvmax.json + meta.json)
+data/ station registry and a small fixture for dev and tests
+src/core search, connections and calendar logic (unit-tested)
+src/data dataset loading and station lookup
+src/ui search form, results, map, calendar
+scripts/ data fetch, render check, e2e and screenshot scripts
+tests/ unit tests (vitest)
+docs/ plain-language guides and screenshots
+specs/ guiding principles
```
-## Docs & roadmap
+## How it works
-- **[How it works](docs/how-it-works.md)** — plain-language tour of the app, its data, and why it runs free with no server or account.
-- **[Algorithms](docs/algorithms.md)** — how it actually finds trains (free-seat filter, connections, one-pass sweeps, round trips, tours, station naming) with diagrams.
-- **[Vision / roadmap](VISION.md)** — V1 today is SNCF, done well; V2 adds Deutsche Bahn, Renfe and more of Europe into the same search. Principles in [`specs/constitution.md`](./specs/constitution.md).
+SNCF publishes which trains have a free MAX seat as open data. Railmap is a static site on top of it:
-## Mobile app (Capacitor)
+1. A scheduled GitHub Action downloads the dataset each morning and keeps only the trains with a free seat (about 77 MB trimmed to about 6 MB).
+2. Your browser downloads that file and runs every search on your device. It can query the SNCF API directly as a fallback.
+3. Everything is served as static files from GitHub Pages. There is no backend, no database and no server cost.
-The same static app is wrapped as a native Android/iOS app with
-[Capacitor](https://capacitorjs.com/). The native build uses base `/` (assets
-load from the app bundle, not the GitHub Pages sub-path), the service worker is
-skipped on native, and the Android hardware back button navigates in-app history.
+More detail:
-```bash
-npm run cap:sync # build for native (base "/") + copy assets & plugins into the platform
-npx cap open android # open in Android Studio to run / build an APK/AAB
-```
+- [How it works](docs/how-it-works.md): a plain-language tour of the app and its data.
+- [Algorithms](docs/algorithms.md): how it finds trains, connections, round trips and tours.
+- [Vision](VISION.md): where the project is headed, including more operators across Europe.
-The `android/` native project is already committed, so there's nothing to
-generate first. (If it's ever deleted, `npm run cap:add:android` regenerates it.)
+## Mobile app
-Requires the Android SDK / Android Studio to compile — the web build itself
-needs only Node. To add iOS: `npm i @capacitor/ios && npx cap add ios`.
+The same app is wrapped as an Android app with [Capacitor](https://capacitorjs.com/).
-### Releases & F-Droid
+```bash
+npm run cap:sync # build for native and copy it into android/
+npx cap open android # open in Android Studio
+```
-Publishing a **GitHub Release** triggers the
-[`Release Android APK`](.github/workflows/release-apk.yml) workflow, which builds
-the app, signs it with the configured keystore and attaches the APK to the release
-(it fails early if the keystore secrets are not set). The app is also packaged for
-**F-Droid**, which builds and signs from source. Signing setup, the per-release version bump, and the F-Droid build
-recipe are documented in **[docs/FDROID.md](docs/FDROID.md)**.
+You need the Android SDK to compile it. Publishing a GitHub Release builds and signs the APK automatically, and the app is also packaged for F-Droid. See [docs/FDROID.md](docs/FDROID.md) for signing and release steps.
-Contributions welcome — fork, `npm install`, `npm test`, then open a PR; principles in [`specs/constitution.md`](./specs/constitution.md).
+## Data API
-## For agents / data API
+The deployed site doubles as a read-only API. [`llms.txt`](public/llms.txt) and [`api.json`](public/api.json) describe it.
-Machine-readable and serverless — [`llms.txt`](public/llms.txt) and [`api.json`](public/api.json) describe the data + query API for AI agents.
+- `/data/tgvmax.json` lists availability. A record with `od_happy_card: "OUI"` has a free MAX seat.
+- `/data/meta.json` and `/data/stations.json` hold snapshot metadata and the station registry.
+- Searches are deep-linkable: `?mode=&from=&to=&date=&conn=…`, with modes `from`, `to`, `od`, `tour` and `best`.
-- **Availability** — the deployed site serves `/data/tgvmax.json` (records where `od_happy_card: "OUI"` means a free MAX seat is reservable), plus `/data/meta.json` and `/data/stations.json`.
-- **Deep-link search** — build a URL with `?mode=&from=&to=&date=&conn=…` (modes: `from`, `to`, `od`, `tour`, `best`). Full parameter list in [`api.json`](public/api.json).
+## Contributing
-## Data & license
+Fork the repo, run `npm install` and `npm test`, then open a pull request. The project's principles are in [`specs/constitution.md`](./specs/constitution.md).
-**Data:** [SNCF Open Data — Disponibilité à 30 jours de places MAX JEUNE et MAX SENIOR](https://ressources.data.sncf.com/explore/dataset/tgvmax/information/) (the `tgvmax` dataset), licensed under the [Licence Ouverte / Open Licence](https://www.etalab.gouv.fr/licence-ouverte-open-licence). Availability is updated roughly once a day and is **indicative** — always confirm and book on [SNCF Connect](https://www.sncf-connect.com/). This project does not sell tickets and is not affiliated with SNCF.
+Thanks to [@AhmedFr](https://github.com/AhmedFr) for the map-first view and the connection-count pin colors ([#2](https://github.com/offware-apps/Railmap/pull/2), carried over in [#21](https://github.com/offware-apps/Railmap/pull/21) and [#26](https://github.com/offware-apps/Railmap/pull/26)).
-**Code:** [AGPL-3.0](./LICENSE).
+## License
-## Credits
+Code: [AGPL-3.0](./LICENSE).
-- **[@AhmedFr](https://github.com/AhmedFr)** — designed the **map-first view** (List/Map toggle, full-bleed map with a floating results panel) and the **connection-count pin tinting**, originally in [#2](https://github.com/offware-apps/MAX-Finder/pull/2). That work was salvaged onto the current codebase in [#21](https://github.com/offware-apps/MAX-Finder/pull/21) and refined in [#26](https://github.com/offware-apps/MAX-Finder/pull/26).
+Data: [SNCF Open Data, MAX JEUNE and MAX SENIOR availability over 30 days](https://ressources.data.sncf.com/explore/dataset/tgvmax/information/) (the `tgvmax` dataset), under the [Licence Ouverte / Open Licence](https://www.etalab.gouv.fr/licence-ouverte-open-licence).
diff --git a/VISION.md b/VISION.md
index 2fde3b8..8db8db4 100644
--- a/VISION.md
+++ b/VISION.md
@@ -1,6 +1,6 @@
-# Vision — MAX Finder
+# Vision — Railmap
-Where MAX Finder is today, and where it's headed. For the day-to-day of *how it
+Where Railmap is today, and where it's headed. For the day-to-day of *how it
works now*, see [`docs/how-it-works.md`](docs/how-it-works.md) and
[`docs/algorithms.md`](docs/algorithms.md). The non-negotiable principles live in
[`specs/constitution.md`](specs/constitution.md).
@@ -9,7 +9,7 @@ works now*, see [`docs/how-it-works.md`](docs/how-it-works.md) and
## Today (V1): SNCF, done well
-MAX Finder finds SNCF trains where a free **MAX JEUNE / MAX SENIOR** seat is
+Railmap finds SNCF trains where a free **MAX JEUNE / MAX SENIOR** seat is
reservable, from SNCF open data — Where to?, Where from?, Exact trip, Tour, Ideas,
round trips and night trains, all serverless and account-free. **This is and stays
the heart of the app**, and the branding stays SNCF / MAX.
diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml
index 136c4cc..01987ee 100644
--- a/android/app/src/main/res/values/strings.xml
+++ b/android/app/src/main/res/values/strings.xml
@@ -1,7 +1,7 @@
- MAX Finder
- MAX Finder
+ Railmap
+ Railmaporg.maxfinder.apporg.maxfinder.app
diff --git a/capacitor.config.ts b/capacitor.config.ts
index f3a6578..d52be05 100644
--- a/capacitor.config.ts
+++ b/capacitor.config.ts
@@ -6,7 +6,7 @@ import type { CapacitorConfig } from "@capacitor/cli";
// running `npx cap sync`.
const config: CapacitorConfig = {
appId: "org.maxfinder.app",
- appName: "MAX Finder",
+ appName: "Railmap",
webDir: "dist",
backgroundColor: "#0f7a52",
android: {
diff --git a/docs/FDROID.md b/docs/FDROID.md
index edbfd03..3a0a67c 100644
--- a/docs/FDROID.md
+++ b/docs/FDROID.md
@@ -1,4 +1,4 @@
-# Publishing MAX Finder (GitHub Releases + F-Droid)
+# Publishing Railmap (GitHub Releases + F-Droid)
There are two independent Android distribution channels. They are **signed by
different keys**, so a user must pick one and stick with it (see
@@ -23,7 +23,7 @@ be injected by CI.
- `versionCode` → an integer that **increases by at least 1 every release** (Android refuses to upgrade otherwise). e.g. `1` → `2`.
2. Commit, then tag and push: `git tag v0.2.0 && git push origin v0.2.0`.
3. **Publish a GitHub Release** for that tag. The workflow builds, signs (if
- secrets are set), and attaches `max-finder-v0.2.0.apk`.
+ secrets are set), and attaches `railmap-v0.2.0.apk`.
4. **For F-Droid**, add a new build entry with the same `versionCode`/`versionName`
to the metadata in `fdroiddata` (see below). With `UpdateCheckMode: Tags` the
F-Droid bot will also propose this for you.
@@ -77,14 +77,14 @@ Categories:
- Internet
- Travel
License: AGPL-3.0-only
-AuthorName: MAX Finder contributors
-SourceCode: https://github.com/offware-apps/MAX-Finder
-IssueTracker: https://github.com/offware-apps/MAX-Finder/issues
+AuthorName: Railmap contributors
+SourceCode: https://github.com/offware-apps/Railmap
+IssueTracker: https://github.com/offware-apps/Railmap/issues
-AutoName: MAX Finder
+AutoName: Railmap
RepoType: git
-Repo: https://github.com/offware-apps/MAX-Finder.git
+Repo: https://github.com/offware-apps/Railmap.git
Builds:
- versionName: 0.1.0
diff --git a/docs/algorithms.md b/docs/algorithms.md
index a99162a..eb84d4f 100644
--- a/docs/algorithms.md
+++ b/docs/algorithms.md
@@ -1,6 +1,6 @@
-# How MAX Finder finds your trains
+# How Railmap finds your trains
-MAX Finder helps people with an SNCF "MAX JEUNE" or "MAX SENIOR" pass find trains where a reserved seat costs nothing extra. This page explains, in plain words, how the app decides which trains to show you and how it strings them into trips. No maths, just everyday pictures. Each section has a one-line intro, a real-world analogy, the actual steps, and a small diagram.
+Railmap helps people with an SNCF "MAX JEUNE" or "MAX SENIOR" pass find trains where a reserved seat costs nothing extra. This page explains, in plain words, how the app decides which trains to show you and how it strings them into trips. No maths, just everyday pictures. Each section has a one-line intro, a real-world analogy, the actual steps, and a small diagram.
---
diff --git a/docs/how-it-works.md b/docs/how-it-works.md
index e4052bf..373c20b 100644
--- a/docs/how-it-works.md
+++ b/docs/how-it-works.md
@@ -1,4 +1,4 @@
-# How MAX Finder Works
+# How Railmap Works
A friendly tour of what this little app does, where its train data comes from, and why it can run for free forever without a server or an account.
@@ -8,7 +8,7 @@ A friendly tour of what this little app does, where its train data comes from, a
If you hold an SNCF **MAX JEUNE** or **MAX SENIOR** pass, you can ride certain high-speed trains for free — but only if there's a special "MAX" seat still open on that train. The catch: normally you'd have to poke at the SNCF Connect booking site one station pair at a time ("Paris to Lyon? Paris to Bordeaux? Paris to Nantes?…") just to discover *where* those free seats even exist.
-MAX Finder flips that around. Instead of you guessing routes, it already knows every train with a free reservable seat and lets you ask big, open questions like:
+Railmap flips that around. Instead of you guessing routes, it already knows every train with a free reservable seat and lets you ask big, open questions like:
> "From my city, where can I go for free this weekend?"
@@ -43,12 +43,12 @@ flowchart LR
## How it runs for free, forever — no server, no account
-Here's the part that keeps it truly free: **there is no back-end and no login.** MAX Finder is just a bundle of ordinary files — a web page, some code, and that daily data file — parked on **GitHub Pages**, GitHub's free static-file hosting.
+Here's the part that keeps it truly free: **there is no back-end and no login.** Railmap is just a bundle of ordinary files — a web page, some code, and that daily data file — parked on **GitHub Pages**, GitHub's free static-file hosting.
When you open the site, *your own browser* downloads the data file and does **all** the searching right there on your device. Nothing you type is sent off to some computer in a data centre. Compare the two shapes:
- **A traditional app:** your browser → a company's server → a database → back to you. Someone pays for that server every month.
-- **MAX Finder:** your browser → a static file on free hosting → and the searching happens on your own device.
+- **Railmap:** your browser → a static file on free hosting → and the searching happens on your own device.
Because there's no server to keep running, there's nothing to pay for and nothing that can quietly shut down when the bill isn't paid.
@@ -78,11 +78,11 @@ flowchart TD
## The five things you can do
-MAX Finder gives you five ways to explore the same pool of free seats. Pick one from the tabs and fill in a station or two.
+Railmap gives you five ways to explore the same pool of free seats. Pick one from the tabs and fill in a station or two.
```mermaid
flowchart TD
- H["MAX Finder"] --> A["Where to? Pick a start, see everywhere you can go free"]
+ H["Railmap"] --> A["Where to? Pick a start, see everywhere you can go free"]
H --> B["Where from? Pick a destination, see every free way to reach it"]
H --> C["Exact trip One route in detail: connections plus a 30-day calendar"]
H --> D["Tour Chain several cities into one free itinerary"]
@@ -113,7 +113,7 @@ For when you have **no fixed plan**. Pick just a starting city and it lists the
## Your privacy
-MAX Finder is private by design, because there's simply nowhere for your information to go.
+Railmap is private by design, because there's simply nowhere for your information to go.
- Your **pass type, language, theme, favourite routes, saved trips, and watched routes** are stored only in your browser (in local storage on your own device). They never leave it. If you clear your browser data, they're gone — that's the only way they leave.
- Because there's no server and no account, there's nothing to log in to and no profile being built about you.
diff --git a/docs/user-flows.md b/docs/user-flows.md
index 73fe039..a46faae 100644
--- a/docs/user-flows.md
+++ b/docs/user-flows.md
@@ -1,6 +1,6 @@
# User flows
-The canonical map of what a user can do in MAX Finder and how each flow behaves. Keep
+The canonical map of what a user can do in Railmap and how each flow behaves. Keep
this in sync with the app — see the rule in `AGENTS.md` ("Living documentation"): any
change to a user-facing flow must update this file in the same PR.
diff --git a/fastlane/metadata/android/en-US/full_description.txt b/fastlane/metadata/android/en-US/full_description.txt
index 93bd8dd..ce7d138 100644
--- a/fastlane/metadata/android/en-US/full_description.txt
+++ b/fastlane/metadata/android/en-US/full_description.txt
@@ -3,7 +3,7 @@ SENIOR (ex-TGVmax) seat is currently reservable — so you don't have to probe
station-by-station in SNCF Connect.
The hard part — which trains actually have a free MAX seat — is published by SNCF
-as open data. MAX Finder is a frontend over that dataset: no backend, no account,
+as open data. Railmap is a frontend over that dataset: no backend, no account,
no cost, no tracking. Your favorites, settings and searches live only on your
device.
diff --git a/fastlane/metadata/android/en-US/title.txt b/fastlane/metadata/android/en-US/title.txt
index d0676f3..409404a 100644
--- a/fastlane/metadata/android/en-US/title.txt
+++ b/fastlane/metadata/android/en-US/title.txt
@@ -1 +1 @@
-MAX Finder
\ No newline at end of file
+Railmap
\ No newline at end of file
diff --git a/index.html b/index.html
index 716acb8..94252c4 100644
--- a/index.html
+++ b/index.html
@@ -7,37 +7,37 @@
http-equiv="Content-Security-Policy"
content="default-src 'self'; img-src 'self' data: https:; style-src 'self' 'unsafe-inline'; script-src 'self'; connect-src 'self' https://ressources.data.sncf.com; worker-src 'self'; base-uri 'self'"
/>
- Trains MAX JEUNE / MAX SENIOR (ex-TGVmax) réservables — MAX Finder
+ Trains MAX JEUNE / MAX SENIOR (ex-TGVmax) réservables — Railmap
-
+
-
-
+
+
-
-
+
+
-
+
-
+
-
+