Wayfarer
Developers and contributors
This is the starting point for working on the Wayfarer web application. It covers source development, repository orientation and the shortest path from a change to useful validation. Supported installation and production operation are separate concerns; use the self-hosting guide for those.
Maintained development baseline
- .NET 10 SDK.
- Native Linux/WSL2 AMD64 or ARM64 image processing: Rust 1.90.0 plus C/C++, CMake,
NASM on x64 and
pkg-configat build time;util-linuxat runtime. Image helper packaging and dependency policy. - Node.js 24.22.1 and npm for reproducible builds.
.nvmrcpins the verified patch fornvmand both CI setup-node steps, matching the immutable Docker build Node. Existing native build/provisioning hosts may use Node 24.22.1+ within Node 24;bash deployment/check-trust.sh --nodechecks the minimum and effective roots before downloads. - PostgreSQL 18 with PostGIS for local development and guarded relational tests.
citextis also used by the EF model. - Ubuntu 24.04 on Linux or WSL2 is the complete development baseline, including imaging.
Native Windows application builds exclude the Linux image helper. Native Windows
image-proxy operations return HTTP 501 with
Cache-Control: no-store, includingoptimize=falseand public trip covers; invalid URLs still return 400 and missing/ private covers 404. Native Windows production deployment is unsupported.
WayfarerMobile is a separate repository. Changes to the server do not implicitly change the mobile application.
Restore and run
Clone into a native filesystem for the environment you are using. On WSL2, prefer a path such as ~/src/Wayfarer rather than /mnt/c/....
Restore the .NET tools, application dependencies and locked frontend dependencies:
dotnet tool restore
dotnet restore
nvm install
nvm use
npm ci
Create or select a local PostgreSQL database, enable postgis and citext, and configure ConnectionStrings:DefaultConnection. The checked-in Development JSON contains only a placeholder password; do not commit credentials. An environment-variable override is unambiguous:
export ConnectionStrings__DefaultConnection='Host=localhost;Port=5432;Database=wayfarer;Username=postgres;Password=your-local-password'
Start the ASP.NET Core application in Development:
dotnet run
dotnet watch run is the normal hot-reload alternative. Non-Production startup applies pending EF migrations, aligns the Quartz schema and seeds required development data. Production startup deliberately does not perform those mutations; see Database and the self-hosting documentation.
Native Windows uses the same .NET commands from PowerShell or Command Prompt, with a native checkout and a local development/test PostgreSQL 18 + PostGIS connection. Keep disposable smoke storage and Data Protection keys separate from existing user data; do not bypass startup/readiness checks. The current native Windows build/controller evidence and remaining actual-startup prerequisite are recorded in helper validation.
Frontend development
Wayfarer has two frontend paths that share the same ASP.NET Core application:
- Razor views use MvcFrontendKit.
frontend.config.yamlowns global assets and mapsViews/{Controller}/{Action}orAreas/{Area}/{Controller}/{Action}to matching JavaScript underwwwroot/js/. - The Trip Editor is a Vue application under
ClientApps/trip-editor/. Vite serves it during development and builds it towwwroot/vite/trip-editor/withmanifest.jsonas the ASP.NET integration point.
For Razor/MvcFrontendKit production bundles, use the repository-local tool:
dotnet frontend build
For the Trip Editor, run Vite beside the ASP.NET application when editing the Vue client:
npm run dev
Build the Trip Editor assets with:
npm run typecheck
npm run build
Generated wwwroot/dist/ and wwwroot/vite/ outputs are build products, not source ownership boundaries.
Repository orientation
Start from responsibilities rather than individual files:
Program.cscomposes startup, middleware, Identity, EF, Quartz and application services.Areas/contains the Admin, Manager, User, API and Public HTTP surfaces; ASP.NET Core Identity pages live under the Identity area.Controllers/and area controllers own HTTP translation. Domain and workflow behavior normally belongs inServices/, not in views or JavaScript.Models/,Models/Configuration/and EF configuration own durable shapes and relational rules;Migrations/records schema evolution.Jobs/contains Quartz job entry points. Long-running import/enrichment workflow ownership also lives under the corresponding service namespaces.Parsers/owns location-import format parsing.ClientApps/trip-editor/owns Vue Trip Editor state and behavior.wwwroot/js/owns Razor/area-aligned JavaScript.tests/Wayfarer.Tests/andtests/client/hold the .NET and client test seams.
Read Architecture before changing an unfamiliar subsystem. Use Extending Wayfarer for task-oriented recipes.
Development and production are different paths
dotnet run is a source-development path. It is not the supported way to install or operate a production Wayfarer instance. Production/self-hosting uses the documented release, Compose and wayfarerctl flow under Self-hosting. Keep operator credentials, backup/update procedures and lifecycle qualification out of source-development instructions.
Contribution path
Before editing, read the repository-root AGENTS.md. It owns contribution, review, branch, merge and evidence policy; this guide does not duplicate those rules.
A practical development loop is:
- Locate the owning HTTP, service, persistence and client boundary.
- Make the smallest coherent change in that owner.
- Prove behavior at the lowest reliable test seam.
- Add relational or browser evidence only when the requirement depends on those layers.
- Run the relevant frontend checks, Code Guard and repository CI described in Testing.
- Update the canonical documentation when the public developer contract changes.
Continue with Architecture, Configuration, Database, API, Security, Extending Wayfarer and Testing.
Proposed contracts awaiting implementation include the Option C Activity reconciliation design, covering catalog identity, safe import retry, authenticated reads and existing-client Activity ID compatibility.