Skip to main content

Configuration Reference

All configuration is managed via ASP.NET Core's configuration system (appsettings.json + environment variables). Environment variable names use double-underscore (__) as the section separator.

Full appsettings.json

{
"Database": {
"Provider": "sqlite",
"ConnectionStrings": {
"Sqlite": "Data Source=data/gpxanalyzer.db",
"PostgreSql": "Host=localhost;Database=gpxanalyzer;Username=gpx;Password=gpx"
}
},
"Jwt": {
"Secret": "<random-string-of-at-least-32-characters>",
"Issuer": "gpx-analyzer",
"Audience": "gpx-analyzer-client",
"AccessTokenExpirationMinutes": 60,
"RefreshTokenExpirationDays": 30
},
"Storage": {
"Type": "local",
"GpxDirectory": "data/gpx",
"DemDirectory": "data/dem",
"S3": {
"Endpoint": "http://localhost:9000",
"AccessKey": "rustfsadmin",
"SecretKey": "rustfsadmin",
"BucketName": "gpx-files",
"BasePrefix": ""
}
},
"Email": {
"Type": "noop",
"Smtp": {
"Host": "localhost",
"Port": 587,
"UseSsl": false,
"Username": "",
"Password": "",
"From": "noreply@gpx-analyzer.app",
"FromName": "GPX Analyzer"
}
},
"AiProvider": {
"Name": "gemini",
"Model": "gemini-2.0-flash",
"ApiKey": "",
"Endpoint": null
},
"GpxCli": {
"DefaultPreset": "trail",
"DefaultSmoothing": "medium",
"DefaultTrackSmoothing": "medium"
},
"Routing": {
"Provider": "",
"Ors": {
"ApiKey": "",
"BaseUrl": "https://api.openrouteservice.org"
},
"Osrm": {
"BaseUrl": "http://osrm:5000"
}
},
"Integrations": {
"Strava": {
"ClientId": "",
"ClientSecret": "",
"WebhookVerifyToken": "gpx-analyzer"
},
"Garmin": {
"ConsumerKey": "",
"ConsumerSecret": ""
}
}
}

Storage Modes

Local Storage (default)

Files stored on the container filesystem. Suitable for single-instance dev/test deployments.

{ "Storage": { "Type": "local" } }

No external dependencies. GPX files are archived as zip after first processing, then replaced by the enriched version.

RustFS / S3 Storage

S3-compatible object storage. Recommended for production, enables horizontal scaling and durable storage.

{
"Storage": {
"Type": "s3",
"S3": {
"Endpoint": "http://rustfs:9000",
"AccessKey": "your-key",
"SecretKey": "your-secret",
"BucketName": "gpx-files"
}
}
}

The API auto-creates the S3 bucket on startup if it doesn't exist.

AI Providers

NameNotes
geminiGoogle Gemini (default) — free tier available
openaiOpenAI GPT models
anthropicClaude models
mistralMistral AI
azure-openaiAzure OpenAI — set Endpoint to your Azure endpoint
ollamaLocal LLM via Ollama — set Endpoint to http://ollama:11434

Leave AiProvider:Name empty or unset to disable AI reports (activities will still be analyzed).

GPX CLI Settings

Per-user settings (overridable from the UI):

KeyDefaultDescription
GpxCli:DefaultPresettrailStop detection preset: trail, hiking, run, walk, cycle, swim
GpxCli:DefaultSmoothingmediumElevation smoothing: none, light, medium, heavy
GpxCli:DefaultTrackSmoothingmediumTrack (lat/lon) smoothing level
GpxCli:AutoDetectActivityTypefalseAuto-detect activity type from GPX metadata and computed stats
GpxCli:FixAnomaliesfalseAttempt to fix GPS anomalies (experimental)

Routing Services (optional)

For the route editor feature. Leave Routing:Provider empty to disable.

OpenRouteService (ORS)

{
"Routing": {
"Provider": "ors",
"Ors": {
"ApiKey": "your-ors-key",
"BaseUrl": "https://api.openrouteservice.org"
}
}
}

OSRM (self-hosted)

{
"Routing": {
"Provider": "osrm",
"Osrm": {
"BaseUrl": "http://osrm:5000"
}
}
}

Frontend Configuration

The React client is built at Docker image time. Runtime configuration is handled via API responses (language, units, etc.).

The Vite dev server (npm run dev) proxies /api/* requests to http://localhost:5000.