[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-73086":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":19,"stars90d":16,"forks30d":16,"starsTrendScore":20,"compositeScore":21,"rankGlobal":10,"rankLanguage":10,"license":22,"archived":23,"fork":23,"defaultBranch":24,"hasWiki":23,"hasPages":23,"topics":25,"createdAt":10,"pushedAt":10,"updatedAt":31,"readmeContent":32,"aiSummary":33,"trendingCount":16,"starSnapshotCount":16,"syncStatus":34,"lastSyncTime":35,"discoverSource":36},73086,"reitti","dedicatedcode\u002Freitti","dedicatedcode","Reitti is a comprehensive personal location tracking and analysis application that helps you understand your movement patterns and significant places. The name \"Reitti\" comes from Finnish, meaning \"route\" or \"path\".","https:\u002F\u002Fwww.dedicatedcode.com\u002Fprojects\u002Freitti\u002F",null,"Java",2258,68,7,41,0,9,22,53,27,91.82,"MIT License",false,"main",[26,27,28,29,30],"geolocation","google-maps","gps-location","owntracks-recorder","timeline","2026-06-12 04:01:07","![](.github\u002Fbanner.png)\n\n\nReitti is a comprehensive personal location tracking and analysis application that helps you understand your movement patterns and significant places. The name \"Reitti\" comes from Finnish, meaning \"route\" or \"path\".\n\n## Features\n\n### Main View\n\n![](.github\u002Fscreenshots\u002Fmain.png)\n\n### Multiple Users View\n\n![](.github\u002Fscreenshots\u002Fmultiple-users.png)\n\n### Live View Mode\n\n![](.github\u002Fscreenshots\u002Flivemode.png)\n\n### Statistics View\n\n![](.github\u002Fscreenshots\u002Fstatistics.png)\n\n### Login page\n\n![](.github\u002Fscreenshots\u002Flogin.png)\n\n### Core Location Analysis\n- **Visit Detection**: Automatically identify places where you spend time\n- **Trip Analysis**: Track your movements between locations with transport mode detection (walking, cycling, driving)\n- **Significant Places**: Recognize and categorize frequently visited locations with custom naming\n- **Timeline View**: Interactive daily timeline showing visits and trips with duration and distance information\n- **Raw Location Tracking**: Visualize your complete movement path with detailed GPS tracks\n- **Multi-User-View**: Visualize all your family and friends on a single map\n- **Live-Mode**: Visualize incoming data automatically without having to reload the map \n- **Fullscreen-Mode**: Display the map in fullscreen. Combined with the Live-Mode you got a nice kiosk-display\n\n### Data Import & Integration\n\n- **Multiple Import Formats**: Support for GPX files, Google Takeout JSON, Google Timeline Exports, and GeoJSON files\n- **Real-time Data Ingestion**: Live location updates via OwnTracks and GPSLogger mobile apps\n- **Batch Processing**: Efficient handling of large location datasets with direct processing\n- **API Integration**: RESTful API for programmatic data access and ingestion\n\n### Photo Management\n- **Immich Integration**: Connect with self-hosted Immich photo servers\n- **Location-based Photos**: View photos taken at specific locations and dates on your timeline\n- **Interactive Photo Viewer**: Full-screen photo modal with keyboard navigation\n- **Photo Grid Display**: Organized photo galleries for locations with multiple images\n\n### User Management & Security\n- **Multi-user Support**: Multiple user accounts with individual data isolation\n- **API Token Management**: Secure API access with token-based authentication\n- **User Profile Management**: Customizable display names and secure password management\n\n### Geocoding & Address Resolution\n- **Multiple Geocoding Services**: Support for custom geocoding providers (Nominatim, etc.)\n- **Automatic Address Resolution**: Convert coordinates to human-readable addresses\n- **Service Management**: Configure multiple geocoding services with automatic failover\n\n### Customization & Localization\n- **Multi-language Support**: Available in English, Finnish, German, and French\n- **Unit System**: Display distances in the Imperial or Metric system\n- **Queue Monitoring**: Real-time job status and processing queue visibility\n- **Custom Tiles-Server**: Ability to use your own tiles-server\n\n### Privacy & Self-hosting\n- **Complete Data Control**: Your location data never leaves your server\n- **Self-hosted Solution**: Deploy on your own infrastructure\n- **Asynchronous Processing**: Handle large datasets efficiently with direct processing and task scheduling\n\n## Getting Started\n\n### Prerequisites\n\n- Java 25 or higher\n- Maven 3.6 or higher\n- Docker and Docker Compose\n- PostgreSQL database with spatial extensions (PostGIS)\n- Redis for caching and queueing\n\n### Quick Start with Docker\n\nThe easiest way to get started is using Docker Compose:\n\n1. Get the docker compose file\n   ```bash\n   mkdir reitti\n   cd reitti\n   wget https:\u002F\u002Fraw.githubusercontent.com\u002Fdedicatedcode\u002Freitti\u002Frefs\u002Fheads\u002Fmain\u002Fdocker-compose.yml\n   ```\n   or manually downloading it [here](https:\u002F\u002Fraw.githubusercontent.com\u002Fdedicatedcode\u002Freitti\u002Frefs\u002Fheads\u002Fmain\u002Fdocker-compose.yml)\n2. Adjust the compose-file to your needs\n\n3. Start all services (PostgreSQL, Redis and Reitti)\n   ```bash\n   docker compose up -d\n   ```\n\n5. Access the application at `http:\u002F\u002Flocalhost:8080`\n\n6. Login with admin:admin\n\n**Note for ARM64 users (Apple Silicon, etc.):** Until [postgis\u002Fdocker-postgis#216](https:\u002F\u002Fgithub.com\u002Fpostgis\u002Fdocker-postgis\u002Fissues\u002F216) is fixed by the PostGIS team, users wanting to run Reitti on ARM64 platforms need to change the PostGIS image in the docker-compose file from `image: postgis\u002Fpostgis:17-3.5-alpine` to `image: imresamu\u002Fpostgis:17-3.5-alpine`.\n\n### Development Setup\n\nFor development or custom deployments:\n\n1. Start infrastructure services\n   ```bash\n   docker compose up -d postgis redis\n   ```\n\n2. Build and run the application\n   ```bash\n   mvn spring-boot:run\n   ```\n\n3. Access the application at `http:\u002F\u002Flocalhost:8080`\n\nDefault username and password is `admin`\n\n### Building Docker Image\n\n```bash\n# Build the application\nmvn clean package\n\n# Build the Docker image\ndocker build -t reitti\u002Freitti:latest .\n```\n\n### Initial Configuration\n\nAfter starting the application:\n\n1. **Generate API Token**: Create an API token in `Settings → API Tokens` for mobile app integration\n2. **Configure Geocoding**: Add geocoding services in `Settings → Geocoding` for address resolution.\n   See [Reverse Geocoding Options](https:\u002F\u002Fwww.dedicatedcode.com\u002Fprojects\u002Freitti\u002F4.0\u002Fconfigurations\u002Freverse-geocoding\u002F)\n3. **Import Data**: Upload your location data via `Settings → Import Data`.\n   See [Data Import](https:\u002F\u002Fwww.dedicatedcode.com\u002Fprojects\u002Freitti\u002F4.0\u002Fusage\u002Fimport-data\u002F)\n4. **Set up Mobile Apps**: Configure one of the supported apps for real-time tracking.\n   See [Mobile App Integration](https:\u002F\u002Fwww.dedicatedcode.com\u002Fprojects\u002Freitti\u002F4.0\u002Fintegrations\u002Fmobile-apps\u002F)\n5.\n\n## Docker Deployment\n\nThis [repository](https:\u002F\u002Fhub.docker.com\u002Fr\u002Fdedicatedcode\u002Freitti\u002F) contains Docker images for the Reitti application.\n\n### Production Deployment\n\nFor production use, we recommend using the provided docker-compose configuration:\n\n```bash\n# Pull the latest image\ndocker pull dedicatedcode\u002Freitti:latest\n\n# Start all services\ndocker compose up -d\n\n# View logs\ndocker compose logs -f reitti\n```\n\n### Standalone Docker Usage\n\n```bash\n# Run standalone with environment variables\ndocker run -p 8080:8080 \\\n  -e POSTGIS_HOST=postgres \\\n  -e POSTGIS_PORT=5432 \\\n  -e POSTGIS_DB=reittidb \\\n  -e POSTGIS_USER=reitti \\\n  -e POSTGIS_PASSWORD=reitti \\\n  -e REDIS_HOST=redis \\\n  -e REDIS_PORT=6379 \\\n  -e REDIS_USERNAME= \\\n  -e REDIS_PASSWORD= \n  dedicatedcode\u002Freitti:latest\n```\n\n### Docker Compose Configuration\n\nThe included `docker-compose.yml` provides a complete setup with:\n- PostgreSQL with PostGIS extensions\n- Redis for caching and queueing\n- Reitti application with proper networking\n- Persistent data volumes\n- Health checks and restart policies\n\n### Environment Variables\n\n| Variable                       | Description                                                                                                                                                                     | Default             | Example                          |\n|--------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------|----------------------------------|\n| `POSTGIS_HOST`                 | PostgreSQL database host                                                                                                                                                        | postgis             | postgis                          |\n| `POSTGIS_PORT`                 | PostgreSQL database port                                                                                                                                                        | 5432                | 5432                             |\n| `POSTGIS_DB`                   | PostgreSQL database name                                                                                                                                                        | reittidb            | reittidb                         |\n| `POSTGIS_USER`                 | Database username                                                                                                                                                               | reitti              | reitti                           |\n| `POSTGIS_PASSWORD`             | Database password                                                                                                                                                               | reitti              | reitti                           |\n| `REDIS_HOST`                   | Redis host                                                                                                                                                                      | redis               | redis                            |\n| `REDIS_PORT`                   | Redis port                                                                                                                                                                      | 6379                | 6379                             |\n| `REDIS_USERNAME`               | Redis username (optional)                                                                                                                                                       |                     | username                         |\n| `REDIS_PASSWORD`               | Redis password (optional)                                                                                                                                                       |                     | password                         |\n| `REDIS_DATABASE`               | Redis database to use (optional)                                                                                                                                                | 0                   | 1                                |\n| `REDIS_CACHE_PREFIX`           | Redis cache key prefix (optional)                                                                                                                                               |                     | reitti_cache:                    |\n| `ADVERTISE_URI`                | Routable URL of the instance. Used for federation of multiple instances. (optional)                                                                                             |                     | https:\u002F\u002Freitti.lab               |\n| `DISABLE_LOCAL_LOGIN`          | Whether to disable the local login form (username\u002Fpassword) This only works, if OIDC login is configured.                                                                       | false               | true                             |\n| `OIDC_ENABLED`                 | Whether to enable OIDC sign-ins                                                                                                                                                 | false               | true                             |\n| `OIDC_CLIENT_ID`               | Your OpenID Connect Client ID (from your provider)                                                                                                                              |                     | google                           |\n| `OIDC_CLIENT_SECRET`           | Your OpenID Connect Client secret (from your provider)                                                                                                                          |                     | F0oxfg8b2rp5X97YPS92C2ERxof1oike |\n| `OIDC_ISSUER_URI`              | Your OpenID Connect Provider Discovery URI (don't include the \u002F.well-known\u002Fopenid-configuration part of the URI)                                                                |                     | https:\u002F\u002Fgithub.com\u002Flogin\u002Foauth   |\n| `OIDC_SCOPE`                   | Your OpenID Connect scopes for your user (optional)                                                                                                                             | openid,profile      | openid,profile                   |\n| `OIDC_AUTHENTICATION_METHOD`   | The authentication method the OIDC Client should use (optional)                                                                                                                 | client_secret_basic | client_secret_basic,none         |\n| `OIDC_SIGN_UP_ENABLED`         | Whether new users should be signed up automatically if they first login via the OIDC Provider. (optional)                                                                       | true                | false                            |\n| `PROCESSING_WAIT_TIME`         | How many seconds to wait after the last data input before starting to process all unprocessed data. (⚠️ This needs to be lower than your integrated app reports data in Reitti) | 15                  | 15                               |\n| `DANGEROUS_LIFE`               | Enables data management features that can reset\u002Fdelete all database data (⚠️ USE WITH CAUTION)                                                                                  | false               | true                             |\n| `TILES_CACHE`                  | The url of the tile caching proxy (Set to ''  to disable the cache                                                                                                              | http:\u002F\u002Ftile-cache   |                                  |\n| `PROCESSING_BATCH_SIZE`        | How many geo points should we handle at once. For low-memory environment it could be needed to set this to 100.                                                                 | 1000                | 100                              |\n| `SERVER_PORT`                  | Application server port                                                                                                                                                         | 8080                | 8080                             |\n| `APP_UID`                      | User ID to run the application as                                                                                                                                               | 1000                | 1000                             |\n| `APP_GID`                      | Group ID to run the application as                                                                                                                                              | 1000                | 1000                             |\n| `JAVA_OPTS`                    | JVM options                                                                                                                                                                     |                     |                                  |\n| `BASE_PATH`                    | Set to server reitti under a path.                                                                                                                                              | \u002F                   | \u002Freitti                          |\n| `LOGGING_LEVEL`                | Used to adjust the verbosity of the logs                                                                                                                                        | INFO                | DEBUG                            |\n\n### Tags\n\n- `next` - **⚠️ DANGER: ALPHA BUILD ⚠️** This is an alpha build that is recreated on every push to the `next` branch. **DO NOT USE THIS TAG** unless you are a developer testing the next version. It is guaranteed to have bugs, may delete your database, and can break your data. **NOT FOR PRODUCTION OR IMPORTANT DATA.**\n- `develop` - **Bleeding Edge**: Built from every push to the main branch. For developers and early adopters who want the newest features and don't mind potential instability.\n- `latest` - **Stable Release**: Updated with each stable release. For most users who want reliable, tested functionality with new features.\n- `x.y.z` - **Conservative**: Specific version releases for users who want full control over updates and prefer to manually choose when to upgrade.\n\n## Data Flow & Architecture\n\n### Location Data Processing Pipeline\n\n1. **Data Ingestion**: Location data enters the system via:\n   - File uploads (GPX, Google Takeout, GeoJSON)\n   - Real-time mobile app integration (OwnTracks, GPSLogger)\n   - REST API endpoints\n\n2. **Analysis & Detection**: The application directly processes the data to:\n   - Detect significant places where you spend time\n   - Identify trips between locations\n   - Determine transport modes (walking, cycling, driving)\n   - Calculate distances and durations\n\n3. **Storage & Indexing**: Results are stored in PostgreSQL with:\n   - Spatial indexing for efficient geographic queries\n   - Temporal indexing for timeline operations\n   - User data isolation and security\n\n4. **Task Scheduling**: Redis is used for scheduling background tasks:\n   - Reverse geocoding requests\n   - User notifications\n   - Other asynchronous operations\n\n5. **Visualization**: Web interface displays processed data as:\n   - Interactive timeline with visits and trips\n   - Map visualization with location markers\n   - Photo integration showing images taken at locations\n   - Statistical summaries and insights\n\n### Mobile App Integration\n\nConfigure mobile apps for automatic location tracking:\n\n- **[OwnTracks](https:\u002F\u002Fwww.dedicatedcode.com\u002Fprojects\u002Freitti\u002Flatest\u002Fintegrations\u002Fmobile-apps\u002F#owntracks-setup)**:\n  Privacy-focused location sharing\n- **[GPSLogger](https:\u002F\u002Fwww.dedicatedcode.com\u002Fprojects\u002Freitti\u002Flatest\u002Fintegrations\u002Fmobile-apps\u002F#gpslogger-setup)**:\n  Lightweight Android GPS logging\n- **[Overland](https:\u002F\u002Fwww.dedicatedcode.com\u002Fprojects\u002Freitti\u002Flatest\u002Fintegrations\u002Fmobile-apps\u002F#overland-setup)**:\n  Lightweight IOS GPS logging\n- **[Home-Assistant](https:\u002F\u002Fwww.dedicatedcode.com\u002Fprojects\u002Freitti\u002Flatest\u002Fintegrations\u002Fhome-assistant\u002F)**: Use\n  Home-Assistant to send location data\n- **[Custom Apps](https:\u002F\u002Fwww.dedicatedcode.com\u002Fprojects\u002Freitti\u002Flatest\u002Fintegrations\u002Fcustom-file-upload\u002F)**: Use the REST\n  API for custom integrations\n\n### Photo Integration\n\nConnect with Immich photo servers to:\n- Display photos taken at specific locations\n- Show images on the timeline map\n- Browse photo galleries by location and date\n\n## Reverse Geocoding Options\n\nReitti supports multiple approaches for reverse geocoding (converting coordinates to human-readable addresses). You can choose the option that best fits your privacy, performance, and storage requirements.\nFor more information, visit\nthe [Reverse Geocoding Guide](https:\u002F\u002Fwww.dedicatedcode.com\u002Fprojects\u002Freitti\u002Flatest\u002Fguides\u002Freverse-geocoding\u002F).\n\n## Open ID Connect (OIDC)\nReitti supports using a third party OIDC provider for sign-ins. It provides the following environment variables which are required for OIDC authentication.\n\n- `OIDC_ENABLED`\n- `OIDC_CLIENT_ID`\n- `OIDC_CLIENT_SECRET`\n- `OIDC_ISSUER_URI`\n- `OIDC_SCOPE` (optional: should usually be set to \"openid,profile\")\n\nSetting `OIDC_ENABLED = true` enables OIDC, whereas the remaining need to be found from your OIDC provider, e.g. github. See the [Environment Variables](#environment-variables) section for examples.\n\nFor detailed OIDC configuration instructions and provider-specific examples, see the [OIDC documentation](https:\u002F\u002Fwww.dedicatedcode.com\u002Fprojects\u002Freitti\u002Fconfigurations\u002Foidc\u002F).\n\nThere are two URLs provided by reitti that you should give to your OIDC provider (see their documentation for further information on this), one of which is required.\n- (Required) Callback URL: https:\u002F\u002F\u003Cyour-reitti-url>\u002Flogin\u002Foauth2\u002Fcode\u002Foauth (e.g. `https:\u002F\u002Freitti.internal\u002Flogin\u002Foauth2\u002Fcode\u002Foauth`)\n- (Optional) Logout callback URL: https:\u002F\u002F\u003Cyour-reitti-url>\u002Flogout\u002Fconnect\u002Fback-channel\u002Foauth\n\nThe logout callback URL will allow your OIDC provider to sign you out of Reitti when you sign out from your provider. If you don't set it, you will have to manually sign out of Reitti even if you sign out from your OIDC provider.\n\n### Login Requirements\n\nReitti's OIDC authentication follows a flexible user matching and creation process:\n\n#### User Matching Process\n1. **Primary Match**: First attempts to find an existing user by `external_id` (format: `{issuer}:{subject}`)\n2. **Fallback Match**: If no external_id match, searches for a user with the OIDC `preferred_username`\n3. **Account Linking**: When a username match is found, the account is updated with the external_id for future logins\n\n#### User Creation\n- **Automatic Registration**: When `OIDC_SIGN_UP_ENABLED=true` (default), new users are automatically created if no match is found\n- **Registration Disabled**: When `OIDC_SIGN_UP_ENABLED=false`, login fails with an error if no existing user matches\n\n#### User Data Handling\n- **Username**: Set to the OIDC `preferred_username` \n- **Display Name**: Updated from OIDC `name` claim on each login\n- **External ID**: Set to `{issuer}:{subject}` for permanent account linking\n- **Profile URL**: Updated from OIDC `profile` claim if available\n- **Avatar**: Automatically downloaded from OIDC `picture` claim if provided\n\n#### Password Management\n- **Local Login Enabled** (`DISABLE_LOCAL_LOGIN=false`): Existing passwords are preserved, allowing both OIDC and local authentication\n- **Local Login Disabled** (`DISABLE_LOCAL_LOGIN=true`): Passwords are cleared from accounts to enforce OIDC-only authentication\n\n#### Required OIDC Claims\nYour OIDC provider must provide these claims for successful authentication:\n- `sub` (subject) Required for external_id generation\n- `preferred_username` - Required for username assignment\n- `name` - Recommended for display name\n- `profile` - Optional for profile URL\n- `picture` - Optional for avatar download\n\n#### PKCE\n\nTo enable PKCE for the OIDC Client, you need to set `OIDC_AUTHENTICATION_METHOD` to `none` and make sure that you do not set `OIDC_CLIENT_SECRET`.\n\n\n#### Security Considerations\n- External IDs are immutable once set, ensuring account security even if usernames change in the OIDC provider\n- User data is updated on each login to keep information current\n- Avatar downloads are performed securely with error handling for network failures\n\n## Technologies\n\n## Backup & Data Persistence\n\n- **Backup Requirements:** \n  - The PostGIS database needs to be backed up regularly. This database contains all user location data, analysis results, and other persistent information.\n  - The storage path used by Reitti needs to be backed up regularly. This contains uploaded files.\n- **Stateless Services:** All other components (Redis, Photon, etc.) are stateless and do not store any important data. These can be redeployed or restarted without risk of data loss.\n\n**Recommended Backup Strategy:**\n- Use standard PostgreSQL backup tools (such as `pg_dump` or physical volume snapshots) to back up your database.\n- Back up the entire storage directory\u002Fvolume used by Reitti for file storage.\n- Ensure backups are performed regularly and stored securely.\n- No backup is needed for Redis and Photon.\n\n**Restore:**\n- In case of disaster recovery, restore both the PostGIS database and the storage path to recover all user data and history.\n\nFor more details, see the [Reitti backup documentation](https:\u002F\u002Fwww.dedicatedcode.com\u002Fprojects\u002Freitti\u002Flatest\u002Fbackup\u002F).\n\n## Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request.\n\n## Getting support\n\nThere are multiple ways of getting support:\n\n- create a [new issue](https:\u002F\u002Fgithub.com\u002Fdedicatedcode\u002Freitti\u002Fissues\u002Fnew\u002Fchoose)\n- tag me on [Lemmy](https:\u002F\u002Fdiscuss.tchncs.de\u002Fu\u002Fdanielgraf)\n- or join **#reitti** on [libera.chat](https:\u002F\u002Flibera.chat)\n\n## Translations\n\nWe are using [weblate](https:\u002F\u002Fhosted.weblate.org\u002Fengage\u002Freitti\u002F) to translate Reitti. If you want to add your language,\nclick on this [link](https:\u002F\u002Fhosted.weblate.org\u002Fengage\u002Freitti\u002F)\n\n[![Translation status](https:\u002F\u002Fhosted.weblate.org\u002Fwidget\u002Freitti\u002Freitti\u002Fmulti-auto.svg)](https:\u002F\u002Fhosted.weblate.org\u002Fengage\u002Freitti\u002F)\n\n## Support the Project\n\n\u003Ca href='https:\u002F\u002Fko-fi.com\u002FK3K01HDAUW' target='_blank'>\u003Cimg height='36' style='border:0px;height:36px;' src='https:\u002F\u002Fstorage.ko-fi.com\u002Fcdn\u002Fkofi6.png?v=6' border='0' alt='Buy Me a Coffee at ko-fi.com' \u002F>\u003C\u002Fa>\n\n## Star History\n\n[![Star History Chart](https:\u002F\u002Fapi.star-history.com\u002Fsvg?repos=dedicatedcode\u002Freitti&type=Date)](https:\u002F\u002Fwww.star-history.com\u002F#dedicatedcode\u002Freitti&Date)\n\n## License\n\nThis project is licensed under the MIT License, see the LICENSE file for details.\n","Reitti 是一款全面的个人位置跟踪和分析应用程序，旨在帮助用户理解自己的移动模式和重要地点。其核心功能包括访问检测、行程分析、重要地点识别、时间线视图等，能够自动识别停留点、追踪不同交通方式下的移动路径，并对频繁访问的地点进行分类命名。此外，Reitti 支持多用户视图、实时模式以及多种数据导入格式（如GPX文件、Google Takeout JSON等），并且可以与自托管的Immich照片服务器集成，提供基于位置的照片管理和交互式查看体验。该应用适用于希望深入了解自身出行习惯或管理家庭成员位置信息的个人用户，也适合需要对地理位置数据进行详细分析的研究者。",2,"2026-06-11 03:44:20","high_star"]