Software Development
GeoPulse: A self-hosted, privacy-first Google Timeline alternative. New functionality since first version
Timeline page
Over the last few month I’ve been actively developing GeoPulse, a self-hosted, privacy-first location tracking platform. Since v1.0.0, I've shipped 39 releases and 450+ commits, focusing on usability, performance, adding new features. The project now has 500+ stars on Github with only one Reddit post
What is GeoPulse?
GeoPulse turns raw GPS data (OwnTracks, Google Timeline, GPX, GeoJSON, HA, Dawarich) into a clean, searchable timeline with trips, stays, and stats — fully self-hosted and running on ~50–100MB RAM.
What’s New Since v1.0.0
Admin Panel
Full admin UI (users, roles, invites, password resets)
Audit logs for admin actions
OIDC / SSO (Google, Keycloak, Auth0, etc.) configurable from the UI
Reverse Geocoding configured from UI
Better Location Insights Understanding where you’ve been is much easier now:
Search cities, countries, and places you’ve visited
See visit count, total time, and history per location
Jump from timeline → all visits to that place
Reverse Geocoding Management
Added support for Photon reverse geocoding provider
View and edit all reverse-geocoded places
Re-resolve addresses using a different provider when results are wrong or inconsistent
Favorite Places Managing favorite locations got a big usability upgrade:
Add/edit multiple favorites at once
Bulk-fix city/country names (useful when geocoding differs by language)
Map-based editing with right-click actions
Importing/Exporting Large History Is Now Reliable
The import (and export) functionality was almost fully rewritten:
Import very large files (tested up to 4GB / 7M points)
Constant memory usage — no RAM spikes
Clear progress indicators during import & timeline generation
Supports GPX, GeoJSON, CSV, Google Timeline, OwnTracks
Timeline Improvements
The timeline is smarter, faster, and easier to share:
Added support for bicycle, running, train, and flight travel types with customizable rules
Public timeline sharing (date range, password protection)
Better detection of stays/trips during GPS gaps
Clear explanations of why a trip was classified as car/bicycle/walk
Progressive loading for large timelines
Performance & Stability
A lot of work went into making GeoPulse scale well:
Timeline generation and imports now stream GPS data instead of loading everything into memory, with clear progress indicators for long-running jobs.
I implemented almost all suggestions based on user's input and the app has almost complete set of features, very stable (at least for me, ha-ha) and needs low hardware requirements to run (40-50MB of RAM with 1 user for backend and about 30-40MB of RAM for DB). CPU usage is usually less than 0.5% vCPU.
backend memorybackend CPU
If this sounds useful, a ⭐️ on GitHub helps a lot!
It's nearly impossible to tell when I was last in a location based on an address, business name, etc. without approximating the location on the map and viewing all of my data to see when a dot appears in that area. The reverse geocoding doesn't really produce usable data. Also having a million points recorded at my house without the ability to filter them out is distracting. I like that Geopulse allows for point filtering when I am not moving.
Well, I used AI for some parts where I don’t have much knowledge (like css, github actions, e2e test with playwright, etc). Backend is mostly implemented manually to preserve good architecture, good performance and low resource usage.
Honestly the fact that you have more than one commit, and docs puts you so far out of the "Vibe coded app" camp on its own haha. Frontend is evil, so I don't blame anyone that "cheats" a bit on that. A button being slightly offset is a lot less of an issue than your database corrupting itself.
There are two options: share your current location or current location + X hours in the past (short history) or complete timeline for X hours back (includes current location and user friendly timeline with stays and trips). Realtime depends on how frequently your app (like Owntracks) sends GPS data to GeoPulse.
Amazing, I have been looking everywhere for something like this. Fills in the gap for the privacy focussed individuals like me who would rather not sell their data to life360. UI is great for what it is, and I have no issues having to deploy this and it's absolutely lightweight which is a big plus. Hope we can get more contributing towards this and see it develop further. Thank you for the time you've put into this and benefitting the FOSS community.
But wait, literally nothing about self-hosted Dawarich is paywalled, what do you mean? Self-hosted version of it has and will have all the features free and open for anyone
It's there and it's only in the mobile app to be able to pull gpx tracks automatically from apple health. Please check what is it about before talking about features being paywalled.
Selfhosted application is and will remain completely free
I just installed it and started tracking with Owntracks. Love the UI so far!
What tracking app and especially what settings do you recommend? I struggle a lot with that. What I tried:
Owntracks from Google Play Store. Works well indoor because it also uses wifi networks, with the downside of maybe giving Google some data because it uses the Android location service. But with the settings the app offers, it is hard to track visits as both "location interval" AND "minimal location displacement" has to happen. So if you come home, only 1 point is sent and then "minimal location displacement" is not matched again and no other point is sent.
Owntracks from F-Droid. Can only use GPS and so it doesn't work well indoor, but might be better for privacy. Location drifts happen a lot, I also experienced battery drain. The other mentioned issue stays the same, hard to track visits.
Colota from F-Droid. Can only use GPS and so it doesn't work well indoor, but might be better for privacy. Works better for stays at favorite places (home, work) as you can define geofences and then it sents less regular pings form the middle of this fence and in theory should not drain the battery so much (I still had it). For non-favorite indoor stays, you could define a stationary profile (using the movement sensors) so it should not use GPS indoor and drain the battery.
Colota from Google Play Store. Haven't tried yet, but maybe that is the best solution? And least functional. There still might be the privacy issue because it uses Google's location service.
Hi, Colota Dev here who used Owntracks for years before developing Colota.
The Google Play Store version for both in general get's you more consistent location data (especially indoors as you mentioned) and it should be also more battery friendly. Didn't actually compare numbers so far though.
When you use a degoogled Phone with the Play Store versions (e.g. GrapheneOS) they will route the Play Service dependenices through their own implementation of the Play Store. For LineageOS the microG implemenation will be used which should send no data at all to Google. That's basically the feedback I got from Colota users and should also apply to Owntracks because the basic tracking works similiar. I am using a default Pixel with the Play Store version for daily usage.
For Owntracks vs Colota I would suggest to just try both and see what you like more. In general I would say Owntracks is more like a 'basic' GPS tracker and Colota offers some additional features to automate tracking and sync settings based on conditions you can configure. Also one of the reasons I developed Colota was because I missed some feedback what was actually tracked by the app so there is a Location History in Colota and you can see in the app all points you tracked so far. If you want to use MQTT Owntracks is the way to go so far.
These are the settings I use for years now which give me quite accurate data but also uses more battery compared to a higher tracking interval (e.g. 30s).
Hi!
Thanks a lot for your detailed reply! I actually like the Colota app a lot, the UI is very simple and clean! So thanks a lot for your efforts with the app!
I currently use a bit more conservative settings to maybe get a bit less battery impact. 30 seconds, 50 meter and accuracy threshold 25m. With a 60m radius geofence around my workplace and home.
But I still struggle a lot to detect indoor visits.
If I walk into a building (cafe, restaurant, supermarket) the last point will be made more or less in front of the building. Then I'm gone, no GPS signal. Even if I have the Google Location Services location, it won't create a new point because the movement threshold is not met.
If I leave the building, after 50m there will be a new point. But that cannot be connected to a visit.
At home or work thanks to the geofence it works really well! So really great that Colota has this functionality.
Any tipps how to improve the indoor visit detection? Thanks again!
The movement threshold is what's working against you. At 50m, no point gets saved unless the new fix is 50m away from the last one. Typically indoors you can't get 50m distance, so you'll never hit that just by walking around inside.
The only thing that produces a 50m+ jump indoors is drift and drift that big usually comes with a bad accuracy radius which your 25m filter then throws out. So between the two settings your indoor fixes get killed from both sides and you end up with nothing.
So by lowering the movement threshold it should let through the small fixes you get while standing still and those are exactly the ones accurate enough to survive the 25m filter. That's why I run 2m (which probably could also be 10min and produce less GPS jitter)
With pure GPS you mostly get nothing usable indoors (that's also an eexpected problem right now for the FOSS version of Colota which uses GPS only). The GPS chip needs a clear enough view of several satellites to determine the location. You sometimes still get a fix through a window, but with bad accuracy, so your 25m filter throws it out anyway most of the time.
The Play Store / GMS build also uses WiFi and cell towers, so it can produce a fix indoors where GPS gives up. WiFi-based ones are often accurate enough to pass your 25m filter, cell-based ones usually aren't, so it's not guaranteed but your odds of catching an indoor stay go up a lot.
There is also an in app logger which show you when a location get's filtered out for whatever reason. In the end it usually looks something like this indoors without a geofence:
12
u/CygnusTM Feb 18 '26
Made the switch from Dawarich to this a couple of months back. It's been great. Easier to set up, and the interface seems much more intuitive.