🚲 Bike Parking across Germany, France & Luxembourg

100 000+ parking locations from OpenStreetMap β€” bundled offline, available instantly across Germany πŸ‡©πŸ‡ͺ, France πŸ‡«πŸ‡· and Luxembourg πŸ‡±πŸ‡Ί. Tap the map to place a custom pin and navigate there, use address search powered by Nominatim, MapLibre vector tile map, BRouter on-device routing, 5 cycling profiles, favorites, dark mode, and 8 languages included.

Why VeloSpot?

πŸ”

Address Search

Type any address in Germany, France or Luxembourg into the floating search bar to get up to 5 live Nominatim suggestions, biased to your surroundings. Tap a result to drop a pin and open the same sheet as a custom pin β€” start in-app BRouter navigation, save it as a favourite, or remove the pin.

πŸ“Œ

Tap-to-Place Custom Pin

Tap any empty spot on the map to drop a blue custom pin. The address is resolved instantly via Nominatim reverse geocoding and a bottom sheet lets you start in-app bike navigation directly to that exact location.

🌍

Germany, France & Luxembourg

100 000+ bicycle parking locations from OpenStreetMap β€” pre-bundled as SQLite assets, available offline from the very first launch.

⚑

Viewport-Based Loading

Only the markers visible in the current map area are queried. Scroll from Flensburg to Munich without any slowdowns.

🧊

Marker Clustering

At city-level zoom, dense parking pins are aggregated into native MapLibre clusters for a fast, uncluttered map. Tap a cluster to zoom in and break it apart.

🏠

Fully Offline

All parking data is bundled inside the APK. No network call is needed to find and browse parking spots.

πŸ“¬

Lazy Address Lookup

Tap a marker and its address is resolved automatically via Nominatim β€” cached permanently so subsequent opens are instant.

πŸ—Ύ

MapLibre Vector Map

Silky-smooth vector tile rendering via MapLibre and OpenFreeMap Liberty style β€” no API key needed, sharp at every zoom level, and ready for custom dark-mode styles.

πŸ“

Interactive Map

Browse bike parking spaces on an intuitive vector map with clear markers and quick detail access.

❀️

Favorites

Save the parking spots you use most often and launch navigation directly from the favorites list β€” even if they are outside the current viewport.

🌐

8 Languages

Switch between German, English, French, Italian, Portuguese, Luxembourgish, Dutch, and Spanish via a flag-based picker β€” the choice is remembered across app restarts.

πŸŒ™

Dark Map Mode

Enable dark mode and the entire map switches to a bundled dark vector-tile style that reuses the same OpenFreeMap tiles β€” no extra tile provider, with brighter, higher-contrast markers for night use.

πŸ—‚οΈ

Toggle Map Layers

Show or hide pin categories independently β€” parking spots, favourites, and saved places β€” via an intuitive layers sheet. The selection persists across restarts.

⭐

Saved Places

Save any tapped location as a named favourite. Saved places appear as persistent green star markers and live in the favourites list with navigate and show-on-map actions.

🧭

In-App Bike Navigation

Calculate bike routes directly inside the app and follow a live route overlay without switching to an external map app.

πŸ™οΈ

Live 3D Navigation

A Google-Maps-style 3D follow camera (60Β° pitch, heading-up, speed-dependent zoom) snaps your position onto the route, rotates a heading arrow with your direction of travel, greys out the path behind you, raises 3D buildings, counts down the live remaining distance + ETA, and reroutes automatically when you go off-route.

🧱

2D / 3D Map View

Pick a flat top-down map or a tilted 3D view with extruded buildings from a sleek segmented selector β€” the choice is remembered. Active navigation always uses the full 3D camera.

πŸ—ΊοΈ

BRouter Offline Routing

Routes calculated entirely on-device via the embedded BRouter engine β€” no internet needed after the one-time ~200–250 MB segment download. Choose from 5 cycling profiles: Trekking, Fast, Shortest, MTB, and Gravel.

πŸ‘οΈ

Navigation Focus

While navigation is active, non-destination markers appear smaller, lighter gray, and more transparent so your target stands out.

πŸ“Š

Ride Statistics

Record a ride and the "My rides" timeline leads with a collapsible statistics dashboard: totals (distance, time, elevation), averages, personal records (top speed, longest ride, biggest climb), activity streaks (active days, this week / this month) and fun facts like COβ‚‚ saved vs. a car, calories burned and your share of a lap around the Earth β€” all computed on-device from your own rides.

🚴

Record Your Rides

Track any ride with live time, distance, speed and elevation plus a speed chart. Recording keeps running in the background with a notification, a Quick Settings tile and a home-screen widget β€” and your live-location avatar visibly pedals as you ride, planting a foot down when you stop.

🏷️

Named Rides & GPX

Rides are auto-named after the destination ("Round trip – place" for loops), and finishing a manual recording asks for a name suggested from your current location. Export selected rides as GPX β€” share them or save to a file (combine or one file per ride) β€” and import GPX tracks back in.

πŸ”₯

Ride Heatmap & Ridden Tracks

Turn all your recorded rides into a colour heatmap that reveals where you cycle most, or draw every ride as its own thin, translucent line so frequently used streets read stronger. Both are optional map layers built on-device from your own data.

πŸ—£οΈ

Voice Guidance

Optional spoken turn-by-turn guidance reads the upcoming turns aloud via Text-to-Speech β€” an early "prepare" cue, a "now" cue right before the turn and an arrival cue β€” building on the on-screen turn banner. Opt-in and persisted.

πŸ”

Round-Trip Generator

Pick a target distance (5–50 km) and BRouter builds a circular route that starts and ends right at your position β€” perfect for a quick loop. Offline routing required.

⛰️

Route Hilliness

A five-step "Route hilliness" slider lets you trade a little distance for less climbing. Each level adds an uphill penalty handed to BRouter and is applied live to point-to-point, on-demand and round-trip routing.

πŸ…ΏοΈ

Find My Bike

Save where you parked β€” automatically on navigation arrival or with one tap β€” and later navigate straight back to it, with the reverse-geocoded address and live distance from your position.

πŸ“€

Share Spots & Rides

Share any parking spot, pin, search result or saved place as a universal OpenStreetMap link, or export a recorded ride as a slick "VeloSpot Wrapped" card β€” your route on a map cutout with your stats β€” ready for WhatsApp, Telegram & Instagram.

Built With Modern Tech

Kotlin
Jetpack Compose
Clean Architecture
Hilt DI
Retrofit + Moshi
MapLibre (Vector Tiles)
OpenFreeMap Liberty Style
Room / SQLite Asset
BRouter Offline Engine
OSRM Online Fallback
Nominatim Geocoding (Reverse + Forward)
Play Services Location
pyosmium Pipeline
MVVM Pattern
Material Design 3

Built for Everyday Cycling β€” across Germany, France & Luxembourg

VeloSpot bundles the OpenStreetMap bicycle parking datasets for Germany, France and Luxembourg into a pre-populated SQLite database. All 100 000+ spots are available offline from first launch, with smooth viewport-based loading and automatic address resolution.

  • Address search β€” type any address in Germany, France or Luxembourg, tap a result, navigate
  • Tap-to-place custom pin β€” drop a pin anywhere, get the address, navigate there
  • 100 000+ locations from OpenStreetMap β€” bundled offline
  • Viewport-based loading keeps performance smooth at any zoom level
  • Marker clustering aggregates dense pins at low zoom β€” tap a cluster to zoom in
  • Addresses resolved via Nominatim on first tap, cached permanently
  • Favorite spots highlighted with red map markers
  • Dedicated favorites sheet with direct navigation
  • BRouter offline routing β€” on-device, no internet after setup
  • 5 cycling profiles: Trekking, Fast, Shortest, MTB, Gravel
  • In-app bike route overlay with hours + minutes travel time
  • Navigation focus mode with dimmed non-target markers
  • Location recenter button and current-position marker
  • Dark mode toggle directly in the map menu β€” including dark map tiles
  • Toggle pin layers β€” show/hide parking, favourites, and saved places
  • Save any tapped location as a named favourite (saved places)
  • Round-trip generator builds a circular loop back to your start
  • Record rides with stats & a speed chart; background recording with notification, tile & widget
  • Named rides + GPX export/import (share or save to a file)
  • Ride heatmap & "Ridden tracks" map layers from your own rides
  • Spoken turn-by-turn voice guidance (opt-in) and a "Route hilliness" slider
  • Find my bike β€” save your parking spot and navigate back
  • 8-language picker with persistent flag-based selection
  • MapLibre vector tiles via OpenFreeMap β€” sharp at any zoom, no API key
πŸ‡©πŸ‡ͺ

100 000+ Locations Β· Fully Offline

OpenStreetMap Β· Room Asset DB Β· Nominatim (Reverse + Forward Geocoding) Β· MapLibre Vector Tiles Β· BRouter Offline Routing Β· OSRM Fallback

App Preview

VeloSpot map view with bike parking markers

Explore the map

City-wide or country-wide β€” browse 100 000+ parking spots across Germany, France and Luxembourg.

VeloSpot address search bar with live suggestions

Address search

Type any address in Germany, France or Luxembourg to get live suggestions powered by Nominatim and navigate straight there.

VeloSpot found location with navigation sheet

Navigate to any location

Tap any spot on the map to drop a custom pin, get the address automatically, and start in-app bike routing.

VeloSpot parking space detail sheet with navigation and favourites

Inspect parking details

See capacity, address, and operator, then jump straight into navigation.

VeloSpot favourites list with saved bike parking spots

Manage favourites

Save your most-used spots and start navigation directly from the favourites sheet.

VeloSpot language picker with flag icons

Switch languages

Choose from 8 languages in-app via the flag-based language picker.

VeloSpot map in dark mode with dark vector tiles

Dark map mode

A bundled dark vector-tile style that reuses the same OpenFreeMap tiles β€” the whole map turns dark alongside the app theme, with higher-contrast markers.

VeloSpot layers sheet to show or hide pin categories

Toggle map layers

Show or hide each pin category independently β€” parking spots, favourites, and saved places β€” from an intuitive layers sheet. Your choice is remembered.

VeloSpot 2D and 3D map view selector with extruded buildings

2D / 3D map view

Switch the resting map between a flat top-down view and a tilted 3D view with extruded buildings β€” your choice is remembered.

VeloSpot bike routing profile picker

Bike routing profiles

Choose a cycling profile β€” Trekking, Fastbike or Mountain bike β€” for fully offline BRouter navigation.

VeloSpot round trip generator sheet with distance selector

Generate round trips

Generate a circular route that starts and ends at your location β€” pick a target distance (5–50 km) and BRouter builds the loop offline.

VeloSpot recorded ride track with live stats

Track your rides

Record a ride with live distance, duration, speed and elevation, then review the saved track on the map.

VeloSpot settings screen

Fine-tune settings

Tune preferences like the routing profile, elevation handling and keep-screen-on from a clean settings screen.

Ready to Cycle across Germany, France & Luxembourg?

Clone the project, build the Android app, and enjoy 100 000+ parking spots offline β€” plus tap-to-place custom pins, address search via Nominatim, MapLibre vector tile map, BRouter on-device routing, 5 cycling profiles, favorites, multilingual support, and dark mode.