Dead simple track storage and visualization
Store, search, filter, view and share your GPS tracks without the bloat
- About
- Key Features
- Screenshots
- Tech Stack
- Getting Started
- Architecture
- Adaptive Simplification
- Roadmap
- Contributing
- License
- Contact
Trackly solves a simple but frustrating problem: where do you store hundreds of GPS tracks from hikes, bike rides, and runs in a way that's actually convenient?
Originally, I had tracks scattered across Google Drive β impossible to search, preview, or organize. Every time I wanted to view one, I'd have to download it and open it in yet another app. After that, I tried a dozen online services, but none focused on the core need of easy storage and viewing with advanced filtration without unnecessary complexity or bloat.
I tested every GPS track service I could find:
- ttrails.ru β poor UX
- Wikiloc β overcomplicated for simple storage
- GPSLib β outdated interface from the 90s
- MapMagic β overpriced for what it offers
- BRouter β great for planning, not storage
- Velocat β clunky UX despite large database
- Nakarte β excellent but stores in browser (unreliable)
- GPX Studio β good viewer, not a storage solution
Trackly is laser-focused on doing one thing well: storing, viewing and advanced filtration over hundreds of tracks with zero friction. Why? I'm an outdoor enthusiast that love to hike, trek and trailrunning, and I constantly facing the very specific problem: which tracks are perfectly suited for my next adventure in terms of distance, elevation and slope? None of the existing solutions addressed this core need without unnecessary bloat, so I built Trackly.
- π― Dead simple β Upload GPX, view on map, search, filter, done
- π« No bloat β Not trying to be Strava, Komoot, or a social network
- π Your data β Self-hosted, full control
- β‘ Fast β Adaptive simplification keeps huge tracks smooth
- π Dynamic sitemap: backend exposes
/sitemap.xmlwhich lists public tracks for search engine indexing (auto-generated from public tracks).
- π€ Supporting GPX format only β Focused on the most widely used GPS track format for now
- πΊοΈ Interactive maps β View tracks on OpenStreetMap (Leaflet)
- π Smart filtering β Filter by category, length, elevation, slope
- π Easy sharing β Export to GPX or share map links
- π Session-based ownership β Edit and delete your own tracks
- β‘ Adaptive simplification β Huge tracks load instantly without losing much detail
- π― Deduplication β Geometry-based hash prevents duplicates
- π Rich metadata β Elevation, heart rate, temperature, cadence, speed, pace
- π Geospatial storage β PostGIS for proper spatial queries
- π On-the-fly optimization β Dynamic simplification based on zoom level
- π POI support β Points of interest with deduplication
Note: Add screenshots of your deployed instance here showing:
- Main map view with multiple tracks
- Track detail view with elevation profile
- Upload interface
- Filter/search functionality
π¦ Component Details
| Component | Technology | Purpose |
|---|---|---|
| Frontend | Vue 3 + Vite | Reactive UI with fast HMR |
| Map Rendering | Leaflet | Interactive OpenStreetMap visualization |
| API Framework | Axum (Rust) | Fast, type-safe REST API |
| Database | PostgreSQL 17+ | Reliable data storage |
| Spatial Extension | PostGIS | Geospatial queries and operations |
| Reverse Proxy | Caddy | Auto HTTPS and routing |
| Containerization | Docker Compose | Easy deployment and scaling |
| File Parsing | gpx (Rust) | GPX/KML/FIT parsing |
| Database Client | SQLx | Compile-time checked queries |
Before you begin, ensure you have installed:
- Docker (20.10+) and Docker Compose (2.0+)
- Git for cloning the repository
That's it! Docker handles everything else.
-
Clone the repository
git clone https://github.com/like-a-freedom/trackly.git cd trackly -
Set up environment variables (optional)
cp .env.example .env # Edit .env with your preferred settings
Start the development environment with hot-reload:
docker-compose -f docker-compose.dev.yaml up --buildAccess the application:
- π Frontend: http://localhost:81
- π§ Backend API: http://localhost:8080
- ποΈ PostgreSQL: localhost:5432
Quick SEO checks: See frontend/SEO.md for a short guide to verify base meta tags, robots.txt, sitemap.xml, and how to run a local Lighthouse smoke test.
The frontend uses Vite environment variables for configuration. If you want to customize environment variables, create a .env file in the frontend folder (copy .env.example).
Choose the appropriate compose file for your architecture:
For ARM64 (Apple Silicon, ARM servers):
docker-compose -f docker-compose.aarch64.prod.yaml up -dFor AMD64 (Intel/AMD x86_64):
docker-compose -f docker-compose.amd64.prod.yaml up -dUsing pre-built images:
Images are automatically published to GitHub Container Registry:
# Pull images
docker pull ghcr.io/like-a-freedom/trackly-backend:latest
docker pull ghcr.io/like-a-freedom/trackly-frontend:latestAfter starting, test the installation:
# Health check
curl http://localhost:8080/health
# Expected response: {"status":"ok"}trackly/
βββ backend/ # Rust (Axum) REST API
βββ frontend/ # Vue 3 + Vite SPA
βββ db_data/ # PostgreSQL data volume
βββ docs/ # Technical specifications
βββ migrations/ # Database schema migrations
βββ docker-compose.* # Deployment configurations
Core Responsibilities:
- RESTful API for track CRUD operations
- Parse GPX/KML/FIT files and extract geometry + metadata
- Store only parsed data (no file storage)
- Geometry-based deduplication using spatial hashing
- Export tracks to GPX format
- Adaptive on-the-fly simplification for large datasets
- Session-based ownership enforcement
Key Technologies:
axumβ Web frameworksqlxβ Type-safe SQL with compile-time verificationgpxβ GPX/KML/FIT parsinggeoβ Geospatial operationstokioβ Async runtime
Core Responsibilities:
- Interactive map with track visualization
- Filter UI (category, length, elevation, slope)
- Upload, edit, delete, export workflows
- Session management for ownership
- Responsive design
Key Technologies:
Vue 3β Reactive framework (Composition API)Viteβ Build tool with HMRLeafletβ Map renderingAxiosβ HTTP client
Schema Highlights:
tracksβ Main track metadata and geometrytrack_pointsβ Individual GPS points with elevation/HR/temp/cadencepoisβ Points of interest with deduplication- Spatial indexes for fast queries
- Geometry hash column for deduplication
Migrations:
All schema changes are versioned with SQLx migrations in backend/migrations/.
Trackly uses intelligent simplification to keep the UI responsive even with tracks containing 50,000+ points.
Only responses are simplified β original data remains intact in the database.
Two-tier approach:
- Geometry simplification β Douglas-Peucker algorithm with zoom-aware tolerance
- Profile downsampling β Elevation/HR/temperature/time arrays match simplified geometry
| Points Range | Tolerance Scale* | Behavior |
|---|---|---|
| 0 β 1,000 | None | β Return original (no simplification) |
| 1,001 β 5,000 | 0.5Γ base | π’ Mild simplification |
| 5,001 β 20,000 | 1.0Γ base | π‘ Base simplification + 33% retention guard |
| 20,001 β 50,000 | 1.5Γ base | π Strong simplification |
| 50,000+ | 2.5Γ base | π΄ Aggressive simplification |
Base tolerance depends on zoom level:
- World view (zoom 0-8): 1000m tolerance
- Regional view (zoom 9-13): 100m tolerance
- City view (zoom 14-16): 10m tolerance
- Max detail (zoom 17+): 5m tolerance
For moderately sized tracks (5,001β20,000 points), a minimum retention rate of ~33% prevents over-collapse. This preserves detail in tracks that are mostly linear but have important nuances.
Example:
- Original: 10,000 points
- Douglas-Peucker reduction: Would drop to 1,500 points
- Guard enforcement: Returns at least 3,333 points
- Result: β Smooth rendering + preserved detail
β
Fast loading β Even 100k point tracks load instantly
β
Preserved fidelity β Small tracks never simplified
β
Smart balancing β Retention guard prevents detail loss
β
Zoom-aware β More detail at higher zoom levels
β
Original data safe β Simplification only affects API responses
TBD
See the open issues for feature requests and known issues.
Contributions are what make open source amazing! Any contributions you make are greatly appreciated.
- Fork the Project
- Create your Feature Branch (
git checkout -b feature/AmazingFeature) - Commit your Changes (
git commit -m 'Add some AmazingFeature') - Push to the Branch (
git push origin feature/AmazingFeature) - Open a Pull Request
- Follow SOLID principles and DRY practices
- Use Test-Driven Development (TDD) where applicable
- Run tests before submitting PR:
cargo test(backend),npm test(frontend) - Update documentation for new features
- Keep PRs focused and small
Distributed under the MIT License. See LICENSE for more information.
Project Maintainer: @like-a-freedom
Project Link: https://github.com/like-a-freedom/trackly
Issues & Feature Requests: GitHub Issues
- OpenStreetMap β Map tiles and data
- Leaflet β Excellent mapping library
- Rust Community β Support and libraries
- Vue.js Team β Fantastic framework
- Best-README-Template β README structure inspiration
The project uses GitHub Actions for automated testing and deployment:
- π³ Build workflow β Publishes Docker images on releases
- ποΈ Multi-arch support β Both
linux/amd64andlinux/arm64
Made with β€οΈ for outdoor enthusiasts