this post was submitted on 03 Jul 2025
609 points (99.5% liked)

Selfhosted

49213 readers
471 users here now

A place to share alternatives to popular online services that can be self-hosted without giving up privacy or locking you into a service you don't control.

Rules:

  1. Be civil: we're here to support and learn from one another. Insults won't be tolerated. Flame wars are frowned upon.

  2. No spam posting.

  3. Posts have to be centered around self-hosting. There are other communities for discussing hardware or home computing. If it's not obvious why your post topic revolves around selfhosting, please include details to make it clear.

  4. Don't duplicate the full text of your blog or github here. Just post the link for folks to click.

  5. Submission headline should match the article title (don’t cherry-pick information from the title to fit your agenda).

  6. No trolling.

Resources:

Any issues on the community? Report it using the report flag.

Questions? DM the mods!

founded 2 years ago
MODERATORS
 

Hey everyone!

I'm excited to introduce Reitti, a location tracking and analysis application designed to help you gain insights about your movement patterns and significant places—all while keeping your data private on your own server.

Core Capabilities:

  • Visit Tracking: Automatically recognizes and categorizes the places where you spend time, using customizable detection algorithms
  • Trip Analysis: Analyzes your movements between locations to understand how you travel whether by walking, cycling, or driving
  • Interactive Timeline: Visualizes all your past activities on an interactive timeline with map and list views that show visit duration, transport method, and distance traveled

Photo Integration:

  • Connect your self-hosted Immich photo server to seamlessly display photos taken at specific locations right within Reitti's timeline. The interactive photo viewer lets you browse galleries for each place.

Data Import Options:

  • Multiple Formats Supported: Reitti can import existing location data from GPX, GeoJSON, and Google Takeout (JSON) backups
  • (Near) Real-time Updates: Automatically receive location info via mobile apps like OwnTracks, GPSLogger or our REST API

Customization:

  • Multi-geocoding Services: Configurable options to convert coordinates to human-readable addresses using providers like Nominatim
  • User Profiles: Customize individual display names, password management, and API token security under your own control

Self-hosting:

  • Reitti is designed to be deployed on your own infrastructure using Docker containers. We provide configuration templates to set up linked services like PostgreSQL, RabbitMQ and Redis that keep all your location data private.

Reitti is still early in development but has already developed extensive capabilities. I'd love to hear your feedback and answer any questions to tailor Reitti to meet the community's needs.

Hope this sparks some interest!

Daniel

top 50 comments
sorted by: hot top controversial new old
[–] [email protected] 1 points 21 hours ago (1 children)

I've got a question about how reitti calculates significant places/visits.

I was thinking of adjust gps logger so that it doesn't log points if they're within 10m of the last point it logged. That will clear up the data when I'm at home or work, so that there is less of a random squiggle of location data. It will record me arriving at home, and leaving home, but not much in between.

Will that impact how reitti calculates locations though? Is it looking at the number of points, or is it simply a matter of duration within a particular vicinity?

[–] [email protected] 1 points 17 hours ago

Hi ada,

yes, this will impact the visit calculation. Visits are calculated in building clusters of at least 5 points in a range of 100m over a duration of at least 5 minutes. If there is only one point logged for example at work or home, Reitti is not able to detect when you left it because every point is just an instant in time and does not carry any duration information with it.

The more points we have to calculate Visits the more accurate it will be. I personally have set up GPSLogger to log every 30 seconds no matter how far I travelled but with at least 40m of accuracy.

[–] [email protected] 2 points 1 day ago (1 children)

Having all of this data stored in a location I can control has been really good.

But yesterday, it was pointed out to me that the API reitti provides means I have access to over a decades worth of location history that I can use to geotag my photo collection! That is a game changer. I've been trying to find a way to pull that information from google location history for a long time, and it turns out, you've created it!

This is really valuable to me, so I want you to know just how much I appreciate the effort you've put in to making it. Thank you

[–] [email protected] 1 points 1 day ago

Thank you very much for these kind words. Means a lot to me if my little tool brings value to you :)

[–] [email protected] 2 points 2 days ago (1 children)

Dear OP,

I just spent some time setting up Reitti and I am very pleased with the results. Many thanks for all the work and great documentation.

I do have a few questions:

  1. You mention that it can take hours to days for Photon to setup. How do I know its done?
  2. The default external reverse geocoding is not doing anything for me, but there seems little to no info in the logs for me to try any remedy. Related to my previous comment, how would I know that photon is working correct?
  3. Is it possible to enjoy the map view in color in stead of the black and white?

Thanks for your time.

[–] [email protected] 1 points 2 days ago (1 children)

Cool, thanks for the feedback.

For: 1: There should be something about downloading in the Photon logs. You can check with docker compose logs photon. I do not remember how long it took to download the index for Germany, but it was noticeable. It depends a lot on how you are connected to the internet and then how long it takes to extract the index.

2: You should also see that in the log of Photon. If the default does not work reliably, you can create an account on Geoapify; it is free, and you get 3000 reverse geocode requests per day. I personally have Photon for DE and then the default service and additional Geoapify.

3: Yeah, I was also thinking about that. In the end, a per-user setting and then the overlay should be disabled, but it could take a while until I can get to it.

[–] [email protected] 1 points 2 days ago

Thanks a bunch for your time and answers! Ill have another go later this week and try to report back here. GPS logger and immich work flawless!

[–] [email protected] 2 points 4 days ago (2 children)

Got it up and running, looks neat!

Is there a way to import old pictures from Immich? If I take new ones they do show up on Reitti, but none of the old ones are shown.

[–] [email protected] 1 points 1 day ago

Hi LazyToad,

it depends. Reitti on its own does not import any pictures. It only shows fetches them from Immich. For that to work it needs the geolocation where the image was taken in the exif data. You need to check if your expected image has this data in Immich. If it is available it shoud be displayed on the map if you select the day the picture was taken.

Does it show the location in Immich? You can verify this if you open the image in Immich and let it display the Info.

If it is showing, then it still could be that it is a bug in Reitti. Feel free to open an issue then :)

[–] [email protected] 3 points 4 days ago (1 children)

Thank you for testing Reitti. 🙏

It depends on two key requirements for Reitti:

  1. First, it finds all photos from Immich taken on the day you selected.
  2. Then, it filters these photos based on the selected map bounds, using the embedded EXIF geolocation data (where the photo was shot).

If the EXIF data does not contain geolocation information, we currently cannot display those photos because their placement on the map cannot be determined.

Could you please verify in Immich if the expected photo has its location in the metadata? If it is available there, then the issue might lie in how Reitti is parsing that specific data.

[–] [email protected] 3 points 4 days ago (1 children)

Thanks for the explanation! Seems to work correctly after all, pictures do show up when I change the date on timeline instead of just staring at current date, 👍 Had just not understood how to use Reitti properly.

[–] [email protected] 3 points 4 days ago

Glad I could help :)

[–] [email protected] 4 points 4 days ago (1 children)

Hell yes! I turned off location data for immich but now I can use this!

[–] [email protected] 2 points 4 days ago

It is actually awesome if you have some old photos with the geodata attached and scim through Reitti and suddenly one of them shows up :)

[–] [email protected] 8 points 4 days ago (1 children)

I managed to break our instance. I imported several years worth of google takeout location data, and now the "stay-detection-queue" is stalled.

[–] [email protected] 6 points 4 days ago (1 children)

Congratulations 😆

To help with that I would need some information:

  • does it show anything in the logs?
  • what do you mean by several years or how big was the Records.json?

Thank you for testing 🙂

[–] [email protected] 5 points 4 days ago (1 children)

It's a 1gig json file that has about 10 years of data. I get multiple repeats of the rabbit timeout in the logs. The Job Status section tells me that it's got just under 9 hours of processing remaining for just over 16,000 in the stay-detection-queue. The numbers change slightly, so something is happening, but it's been going for over 12 hours now, and the time remaining is slowly going up, not down.

***
[ntContainer#2-1] c.d.r.s.p.VisitDetectionService          : Detected 61806 stay points for user ada
reitti-1  | 2025-07-04T03:06:17.848Z  WARN 1
***
[ntContainer#2-1] o.s.a.r.l.SimpleMessageListenerContainer : Consumer raised exception, processing can restart if the connection factory supports it
reitti-1  |
reitti-1  | com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - delivery acknowledgement on channel 9 timed out. Timeout value used: 1800000 ms. This timeout value can be configured, see consumers doc guide to learn more, class-id=0, method-id=0)
reitti-1  |     at org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.checkShutdown(BlockingQueueConsumer.java:493) ~[spring-rabbit-3.2.5.jar!/:3.2.5]
reitti-1  |     at org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.nextMessage(BlockingQueueConsumer.java:554) ~[spring-rabbit-3.2.5.jar!/:3.2.5]
reitti-1  |     at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:1046) ~[spring-rabbit-3.2.5.jar!/:3.2.5]
reitti-1  |     at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:1021) ~[spring-rabbit-3.2.5.jar!/:3.2.5]
reitti-1  |     at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.mainLoop(SimpleMessageListenerContainer.java:1423) ~[spring-rabbit-3.2.5.jar!/:3.2.5]
reitti-1  |     at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1324) ~[spring-rabbit-3.2.5.jar!/:3.2.5]
reitti-1  |     at java.base/java.lang.Thread.run(Unknown Source) ~[na:na]
reitti-1  | Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - delivery acknowledgement on channel 9 timed out. Timeout value used: 1800000 ms. This timeout value can be configured, see consumers doc guide to learn more, class-id=0, method-id=0)
reitti-1  |     at com.rabbitmq.client.impl.ChannelN.asyncShutdown(ChannelN.java:528) ~[amqp-client-5.25.0.jar!/:5.25.0]
reitti-1  |     at com.rabbitmq.client.impl.ChannelN.processAsync(ChannelN.java:349) ~[amqp-client-5.25.0.jar!/:5.25.0]
reitti-1  |     at com.rabbitmq.client.impl.AMQChannel.handleCompleteInboundCommand(AMQChannel.java:193) ~[amqp-client-5.25.0.jar!/:5.25.0]
reitti-1  |     at com.rabbitmq.client.impl.AMQChannel.handleFrame(AMQChannel.java:125) ~[amqp-client-5.25.0.jar!/:5.25.0]
reitti-1  |     at com.rabbitmq.client.impl.AMQConnection.readFrame(AMQConnection.java:761) ~[amqp-client-5.25.0.jar!/:5.25.0]
reitti-1  |     at com.rabbitmq.client.impl.AMQConnection.access$400(AMQConnection.java:48) ~[amqp-client-5.25.0.jar!/:5.25.0]
reitti-1  |     at com.rabbitmq.client.impl.AMQConnection$MainLoop.run(AMQConnection.java:688) ~[amqp-client-5.25.0.jar!/:5.25.0]
reitti-1  |     ... 1 common frames omitted
[–] [email protected] 2 points 4 days ago (1 children)

Thanks for the information. I will try to recreate it locally. In my testing I used a 600MB file and this took maybe 2 hours to process on my server. It is one of these ryzen 7 5825U. Since Reitti tries to do these analysis on multiple cores we start it with 4 to 16 Threads when processing. But the stay detection breaks when doing it that way, so it is locking per user to handle that. If now one of them takes a long time the others will break eventually. They will get resheduled 3 times until rabbitmq gives up.

On what type of system do you run it?

I will add some switches so it is configurable how many threads are opened and add some log statements to print out the duration it took for a single step.

[–] [email protected] 2 points 4 days ago (1 children)
[–] [email protected] 2 points 4 days ago* (last edited 4 days ago) (1 children)

Hmm, I had hoped you say something like a Raspberry PI :D

But this should be enough to have it processed in a reasonable time. What I do not understand in the moment is, that the filesize should not affect it in any way. When importing it 100 Geopoints are bundled, send to RabbitMQ. From there we retrieve them, do some filtering and save them in the database. Then actually nothing happens anymore until the next processing run is triggered.

But this than works with the PostGis DB and not with the file anymore. So the culprit should be there somewhere. I will try to insert some fake data into mine and see how long it takes if i double my location points.

[–] [email protected] 1 points 4 days ago (1 children)

I was also trying to set up GPSLogger whilst it was crunching through the backlog, and I manually transferred a file from that app before I had autologging configured. Not sure if that could have done it?

The times don't overlap, as the takeout file is only up until 2023

[–] [email protected] 1 points 4 days ago* (last edited 4 days ago) (1 children)

Thanks for getting back to me. I can look into it. I don't think it's connected, but you never know.

The data goes the same way, first to RabbitMQ and then the database. So it shouldn't matter, it's just another message or a bunch of them in the queue.

[–] [email protected] 1 points 4 days ago (1 children)

Ok, so it may not be frozen. The numbers in the queue seem to imply it is, however, timelines and places are slowly filling out in my history. A couple of dates I had looked at previously were showing me tracklogs for the day, but not timeline information, and now, they're showing timelines for the day

[–] [email protected] 1 points 4 days ago (1 children)

That's good, but I still question why it is so slow. If you receive these timeout exceptions more often, at some point the data will cease to be analyzed.

I just re-tested it with multiple concurrent imports into a clean DB, and the stay-detection-queue completed in 10 minutes. It's not normal for it to take that long for you. The component that should take the most time is actually the merge-visit-queue because this creates a lot of stress for the DB. This test was conducted on my laptop, equipped with an AMD Ryzen™ 7 PRO 8840U and 32GB of RAM.

[–] [email protected] 1 points 4 days ago (1 children)

Since I last commented, the queue has jumped from about 9000 outstanding items, to 15,000 outstanding items, and it appears that I have timelines for a large amount of my history now.

However, the estimated time is still slowly creeping up (though only by a minute or two, despite adding 6000 more items to the queue).

I haven't uploaded anything manually that might have triggered the change in queue size.

Is there any external calls made during processing this queue that might be adding latency?

tl;dr - something is definitely happening

[–] [email protected] 1 points 4 days ago (1 children)

This process is not triggered by any external events.

Every ten minutes, an internal background job activates. Its function is to scan the database for any RawLocationPoints that haven't been processed yet. These unprocessed points are then batched into groups of 100, and each batch is sent as a message to be consumed by the stay-detection-queue. This process naturally adds to the workload of that queue.

However, if no new location data is being ingested, once all RawLocationPoints have been processed and their respective flags set, the stay-detection-queue should eventually clear, and the system should return to a idle state. I'm still puzzled as to why this initial queue (stay-detection-queue) is exhibiting such slow performance for you, as it's typically one of the faster steps.

[–] [email protected] 1 points 3 days ago (1 children)

Well, the last update seems to have cleared the queue, and all of my history from that 10 year import now shows, with trips and places identified!

But now, it's having issues with importing the new google format import. I've got a 34MB file there that goes back to 2017, and this data says that it has imported, but then never appears in my history.

If it's relevant, there is overlap in the data, as my 10 year takeout import went up to 2023, and my "new format" import starts in 2017 and went a couple of days ago. I changed my google account in 2017, but logged in to both on my phone simultaneously, so I was accruing location data on both accounts at the same time for a while before I turned it off on my old account.

[–] [email protected] 1 points 2 days ago (1 children)

I am glad it worked out for you in importing the first file. I am still puzzled why it took that long.

For the new format, did you have Android or iOS? With the timeline export from Google Maps on iOS, we can not do anything at the moment because there is actually no raw data in it. Only information like you stayed in this timeframe at that point and you traveled between these points. It's actually a little bit funny that it aggregates to the same data Reitti uses in the end.

If you are on Android, it could also be a bug when importing that file. I only had a small one from one of my accounts to test. If you mind creating a bug report, I will have a look. If you do not want to attach the export file there, feel free to send it to [email protected]. I will have a look at it then privately. No problem.

For the overlap in exports, it depends. If the points are the same, meaning they have the same timestamp, then Reitti will discard them. If not, they will be handled like every other new data and will end in recalculating visits and trips around that particular time.

[–] [email protected] 2 points 2 days ago

I'm on android. I'll raise a bug report.

[–] [email protected] 3 points 4 days ago (1 children)

I am slightly bothered by how the logo is quite off-center, is it intentional?

[–] [email protected] 6 points 4 days ago

It was not intentional but after bothering not about it because i had other things on my mind i got used to it and now like it the way it is.

But for everyone who is bothered by that. If Reitti reaches 1k stars on Github I will add a switch to use a centered one 😊

[–] [email protected] 2 points 4 days ago (1 children)
[–] [email protected] 1 points 4 days ago
[–] [email protected] 1 points 5 days ago (1 children)

can i use it to track vehicles too like traccar?

[–] [email protected] 2 points 5 days ago

I have no experience with traccar but it seems that it supports live tracking. This is something Reitti does not support. Depends on your usecase, but i think traccar is better suited.

[–] [email protected] 1 points 5 days ago* (last edited 5 days ago)

Congrats! Amazing project, exciting interface and you went the extra mile on the integration side with third parties. Kudos!

Edit: I'll definitely have to try it out!

[–] [email protected] 5 points 5 days ago (1 children)

That looks very neat. Thanks for starting this!

I guess this will directly compete with dawarich, right?

https://github.com/Freika/dawarich

[–] [email protected] 7 points 5 days ago (1 children)

I would not say compete. They are different in how things are done from my point of view. I want to focus more on the visits we have done in the past to relive some lost memories whereas Dwarich looks more "technical" for me. I have no better words for it, I hope you get my point in what i am trying to achieve with Reitti. So there should be enough room for both 🙂

I also do not have any intentions to offer a hosted version in the foreseeable future or even anytime.

[–] [email protected] 3 points 5 days ago* (last edited 5 days ago)

I get what you mean. The focus is different of dawarich. I'm really looking forward into checking reitti out!

load more comments
view more: next ›