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

  • Ada@piefed.blahaj.zone
    link
    fedilink
    English
    arrow-up
    1
    ·
    5 months ago

    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?

    • danielgraf@discuss.tchncs.deOP
      link
      fedilink
      English
      arrow-up
      1
      ·
      5 months 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.

  • Ada@piefed.blahaj.zone
    link
    fedilink
    English
    arrow-up
    1
    ·
    5 months ago

    Is there any way of forcing it to rebuild places and trips? Somewhere along the line, most of mine disappeared. It’s still building new ones just fine as GPS logger adds real time data, but most of my historical stuff is gone.

    The actual data is there, and it shows up fine on the maps for each day, but the places/trips/stats etc are mostly empty.

    I can’t see anything in the logs that might explain it

    • danielgraf@discuss.tchncs.deOP
      link
      fedilink
      English
      arrow-up
      4
      ·
      5 months ago

      If you are running Reitti with Docker, you can set the environment variable DANGEROUS_LIFE to true. This will enable a new section in the Settings. There, you can use the button ‘Clear and Reprocess’. This will delete all visits and trips and set all raw data points to unprocessed. During the next run, everything will be recalculated. In that settings section, you could also press the ‘Start Processing’ button if you don’t want to wait. Make sure to wait until the success message appears. It can take a while until all data is deleted and switched to unprocessed.

  • Ada@piefed.blahaj.zone
    link
    fedilink
    English
    arrow-up
    8
    ·
    5 months ago

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

    • danielgraf@discuss.tchncs.deOP
      link
      fedilink
      English
      arrow-up
      7
      ·
      5 months ago

      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 🙂

      • Ada@piefed.blahaj.zone
        link
        fedilink
        English
        arrow-up
        5
        ·
        5 months ago

        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.

        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
        
        • danielgraf@discuss.tchncs.deOP
          link
          fedilink
          English
          arrow-up
          2
          ·
          5 months ago

          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.

            • danielgraf@discuss.tchncs.deOP
              link
              fedilink
              English
              arrow-up
              2
              ·
              edit-2
              5 months ago

              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.

              • Ada@piefed.blahaj.zone
                link
                fedilink
                English
                arrow-up
                1
                ·
                5 months ago

                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

                • danielgraf@discuss.tchncs.deOP
                  link
                  fedilink
                  English
                  arrow-up
                  1
                  ·
                  edit-2
                  5 months ago

                  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.

    • danielgraf@discuss.tchncs.deOP
      link
      fedilink
      English
      arrow-up
      7
      ·
      5 months ago

      Thanks :) As a German I really like the name Dawarich. First it sound really nice for me but also that “Da war ich” means “There have i been” in german makes, at least for me, an awesome project name.

      Take this with a grain of salt because I have no idea what the plans are for Dawarich or have ever been and this is solely based on my external view. For me the main differences are:

      • visits and trips are our main data, everything else is just the way to calculate them. For Dawarich it looks to me, that it is the other way around. It displays all the location data in good way with the heatmap and so on but visits or places seems so tacked on. This should not be an offense against it. I actually still have an instance running and it was the main pushing point to finally start working on Reitti.
      • the sleek UI but this depends on your taste

      In the end, they are not that far off. Maybe a matter of taste.

      • emrsmsrli@lemmy.world
        link
        fedilink
        English
        arrow-up
        2
        ·
        5 months ago

        Thanks for the reply! I will give it a go :)

        The word dawarich does not produce a polite sound in my main language, meant no offense to the project :)

      • pipariturbiini@sopuli.xyz
        link
        fedilink
        English
        arrow-up
        3
        ·
        5 months ago

        Maybe slightly off-topic, but how did you end up with the name “reitti”? You say you’re German - do you have some sort of tie to the Finnish language?

        • danielgraf@discuss.tchncs.deOP
          link
          fedilink
          English
          arrow-up
          3
          ·
          5 months ago

          Oh, i had the idea in mind what i want to create and than it was a matter of a couple of Google queries but in the end one of the LLM suggested a list of different names in foreign languages and reitti somehow sticked 😊

    • danielgraf@discuss.tchncs.deOP
      link
      fedilink
      English
      arrow-up
      4
      ·
      5 months ago

      Let me know how it worked out. I am deploying it to my server via docker without an problems, but maybe they are some quirks i missed. :D

      • Atropos@lemmy.world
        link
        fedilink
        English
        arrow-up
        3
        ·
        5 months ago

        Of course, happy to do so. I’ll report back with my experience when I have it working!

  • shrink9313@lemmy.world
    link
    fedilink
    English
    arrow-up
    2
    ·
    5 months ago

    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.

    • danielgraf@discuss.tchncs.deOP
      link
      fedilink
      English
      arrow-up
      1
      ·
      5 months ago

      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.

      • shrink9313@lemmy.world
        link
        fedilink
        English
        arrow-up
        1
        ·
        5 months 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!

  • warmaster@lemmy.world
    link
    fedilink
    English
    arrow-up
    16
    ·
    5 months ago

    This looks amazing, congratulations and thank you for making it FOSS. I was wondering if you are considering integrating with Home Assistant.

    • danielgraf@discuss.tchncs.deOP
      link
      fedilink
      English
      arrow-up
      3
      ·
      5 months ago

      Thanks :)

      No, did not occur to me. What would the integration look like? Connecting it to the message bus to receive location updates? Honestly it is a couple years ago I played with HA.

      • warmaster@lemmy.world
        link
        fedilink
        English
        arrow-up
        3
        ·
        5 months ago

        I have the HA app on my phone, it reports my location back to my HA server.

        I would like if Reitti could retrieve my location from my HA server, instead of asking me to upload it again to Reitti. Uploading my location in short intervals drains the battery very fast, it’s something I want to avoid if I can.

        Additiinally, I don’t want to expose anything to the internet. So I pay for the Home Assistant cloud subscription that does it for me in a more secure manner than what I could implement with the little free time I have. Reitti could retrieve my location more securely if it did so without exiting my LAN.

        • danielgraf@discuss.tchncs.deOP
          link
          fedilink
          English
          arrow-up
          1
          ·
          edit-2
          5 months ago

          I had a similar setup with Home Assistant in the past so I understand your usecase. For Reitti to detect visits somewhat reliable it needs at least one datapoint of location data a minute. We build location clusters with minimum 5 points in 5 minutes. If HA tracks that often it should work. HA probably tracks more than that.

          I could add an integration that Reitti fetches the data from Home Assistant. Do you mind in creating a feature request?

      • rumba@lemmy.zip
        link
        fedilink
        English
        arrow-up
        4
        ·
        5 months ago

        Location sensor would be a good minimum bar.

        A custom card for your app that is just basically a iframe into your app with auth would also be pretty decent. Your version of a map looks really nice.

        Maybe surfacing metrics of distance traveled or number of geolocations.

        I’ll have to install the app and play around with it to make other recommendations but those are the first things that come to mind.

      • pyr0ball@lemmy.dbzer0.com
        link
        fedilink
        English
        arrow-up
        7
        ·
        5 months ago

        Home automation using geofencing, and my partner likes to get a notification when I’m heading home from the office

  • Zagorath@aussie.zone
    link
    fedilink
    English
    arrow-up
    46
    ·
    5 months ago

    Fuck yeah this is awesome! The detail of Immich integration is just the icing on top of an awesome cake!

    How demanding is it on server resources? Am I likely to be able to run it on an old Raspberry Pi that’s also running a couple of other relatively light tasks? How much storage does it end up using over time? I’m probably going to try and get it running either on my Pi or my Synology NAS, though the latter has had issues with Docker containers in the past depending on the container’s dependencies…

    • danielgraf@discuss.tchncs.deOP
      link
      fedilink
      English
      arrow-up
      16
      ·
      5 months ago

      I have no clue if a raspberry will handle it. There a a couple of services involved to make it fast, but they are then another burden like RabbitMQ. Which make ingesting data instantaneous but you need extra processing power to handle the queues. It all comes with a tradeoff.

      For size, there is mainly the PostGIS DB. I just checked and my db is around 800 MB for roughtly 8 1/2 Years of data.

      Photon (the reverse geocode enabled in the compose file) is another beast. For Germany it takes 14 GB of storage while running, if you let PARALLELL updates enabled you can double that every time the index is updated. But you can remove that from the compose file and rely on external Geocoders. It is described in https://github.com/dedicatedcode/reitti?tab=readme-ov-file#reverse-geocoding-options

      • Zagorath@aussie.zone
        link
        fedilink
        English
        arrow-up
        2
        ·
        5 months ago

        Oh interesting. I’ve just read through that link, and I was assuming that something similar to the “external only” option would have been the only way it worked. More specifically, I thought it’d just store a list of historical points and display those on an OSM overlay. But it seems like even “external only” is much more involved than that.

        What happens with self-hosted Photon if you specify a country, but then also visit another country? (I assume in hybrid mode it’s as simple as "use Photon in your country, use Nominatim otherwise?)

        But yeah, definitely sounds like a Pi is probably not gonna cut it. I’ll have to see if my Synology can do it, or if the weird OS restrictions Synology imposes prevent it.

        • danielgraf@discuss.tchncs.deOP
          link
          fedilink
          English
          arrow-up
          3
          ·
          5 months ago

          If you use Photon and only have your main country available, it will fallback to the configured external Geo-coding-services since Photon will not return a result then. So the order of execution is:

          • first try Photon
          • if it does not return anything, try to call one or all of the available Geo coding services.
            • danielgraf@discuss.tchncs.deOP
              link
              fedilink
              English
              arrow-up
              3
              ·
              edit-2
              5 months ago

              Maybe the wording is confusing in the Readme. Reitti will try to fetch the data from a configured photon instance first, if this does not return anything and you have Geocoding services configured, it will try them. There is actually no switch for hybrid mode or only local. It depends on what is configured.

              Photon Only: you have only photon configured and under Settings > Gecoding you deleted or disable every available service. Hybrid Mode: Photon is configured and under Settings > Geocoding there are Services available. That es is the one I use. Having Photon with the data for Germany and all the rest is handled by Geoapify.com.

              External Only: You dropped Photon from the docker-compose file and only rely on services under Settings > Geocoding

              If you do not configure anything, then Reitti will skip Geocoding and only display Unknown Place.

              I will update the Readme to make that clear.

              • Zagorath@aussie.zone
                link
                fedilink
                English
                arrow-up
                1
                ·
                5 months ago

                If you do not configure anything, then Reitti will skip Geocoding and only display Unknown Place.

                Ah ok thanks. This is what I was wondering.

                Two follow-ups:

                Can you specify multiple COUNTRY_CODEs? (and if so, is the method

                environment:
                  - COUNTRY_CODE=country_one
                  - COUNTRY_CODE=country_two
                

                or

                environment:
                  - COUNTRY_CODE=[country_one, country_two]
                

                or something else?)

                And is this something that can seemlessly be retroactively changed? For example, if I set COUNTRY_CODE=au and it works fine for Australia, but then I move to NZ, can I add (assuming the answer to my first question is yes) or change to COUNTRY_CODE=nz and have all the NZ locations work on the already-recorded data, even if I made that change to my configuration after I had been in NZ for a few months?

                • danielgraf@discuss.tchncs.deOP
                  link
                  fedilink
                  English
                  arrow-up
                  2
                  ·
                  edit-2
                  5 months ago

                  Good question, afaik you can not enter multiple countries to Photon. I was hoping it would be possible but everything i saw was it is either one country or the whole world. But maybe you can have a look here: https://github.com/komoot/photon That is the service we are using.

    • acchariya@lemmy.world
      link
      fedilink
      English
      arrow-up
      4
      arrow-down
      1
      ·
      5 months ago

      Looks to be a java application with a number of services running alongside- I don’t think it’s going to be lightweight to run on resource constrained devices, but sweet project anyway! (Side note, no clue how you engineers find the time to hack on things like this, I feel like I’ve got so little time to myself I cannot imagine dedicating it to a project like this)

  • Ada@piefed.blahaj.zone
    link
    fedilink
    English
    arrow-up
    2
    ·
    5 months ago

    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

  • MrQuallzin@lemmy.world
    link
    fedilink
    English
    arrow-up
    5
    ·
    5 months ago

    This is really awesome! I was just about to start looking for something like this, so great timing. Going to get this up on my Unraid server tomorrow and play around with it

  • scarilog@lemmy.world
    link
    fedilink
    English
    arrow-up
    18
    arrow-down
    1
    ·
    5 months ago

    My only concern is battery usage. Google has the advantage of OS integration, which skims location data for timeline history even when another app accesses location, which uses essentially no battery (since you would’ve been using location for that other app anyway).

    But it’s awesome that a tool like this exists anyways, great work.

    • danielgraf@discuss.tchncs.deOP
      link
      fedilink
      English
      arrow-up
      8
      ·
      5 months ago

      Thank you :)

      I understand your concerns, this is something every additional app would have to deal with.

      For me it is ok to have GPSLogger running all the time, I think for what it is doing it is quite easy on the battery but I do not use my phone actively that much and I am happy if it survives a day which it does.

      • illusionist@lemmy.zip
        link
        fedilink
        English
        arrow-up
        4
        ·
        5 months ago

        I log my position every 5 seconds for years and gpslogger is not among any of the battery consuming processes if you use the device. If you don’t use the phone at all, it will consume more power but that’s no reason not to use it.

  • Lost_My_Mind@lemmy.world
    link
    fedilink
    English
    arrow-up
    3
    arrow-down
    13
    ·
    5 months ago

    Man. I have no use for this. I know where I go. I go to work. And then the gym. Almost every day. Because I work a lot.

    It’s like my boss always says…“BACK TO WORK, DICKHEAD!”

  • SomeDudeFromSpace@lemmy.ml
    link
    fedilink
    English
    arrow-up
    1
    ·
    5 months ago

    Great project! Any recommendations for an iOS app for this? I’ve been using OwnTracks, but it works very unreliably. As far as I understand, it’s an OS problem since Apple allows for very limited background processing for the sake of saving battery, so there’s not much any logging apps can do, but I was just curious if someone found a way around it.

    • danielgraf@discuss.tchncs.deOP
      link
      fedilink
      English
      arrow-up
      2
      ·
      5 months ago

      Not really, I stopped using IOS a year ago because of exactly this reason. Had a lot of problems syncing files because of the power saving. I understand why IOS is doing it and for a normal user I think it is the way to go. But anything beyond that, it only hinders the experience you get out of apps. Maybe someone here as any experience with an app which works reliably.