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
  • 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

  • Zagorath@aussie.zone
    link
    fedilink
    English
    arrow-up
    2
    ·
    3 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
      1
      ·
      3 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

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

      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.

  • warmaster@lemmy.world
    link
    fedilink
    English
    arrow-up
    1
    ·
    3 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
      1
      ·
      3 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.

      • rumba@lemmy.zip
        link
        fedilink
        English
        arrow-up
        1
        ·
        3 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.

      • warmaster@lemmy.world
        link
        fedilink
        English
        arrow-up
        1
        ·
        3 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.

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

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

  • LazyToad@sopuli.xyz
    link
    fedilink
    English
    arrow-up
    1
    ·
    3 months ago

    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.

  • Zagorath@aussie.zone
    link
    fedilink
    English
    arrow-up
    0
    ·
    3 months ago

    I love that it supports multiple formats for important location as well as multiple geocoders. But that makes me wonder, would it be feasible to support multiple image libraries? There’s a bunch of different FOSS photo libraries out there. I think Nextcloud is the main other one I’ve heard about ‘in the wild’, as it were. Or is there too much bespoke Immich code in there for that to be a simple plug-and-play option?

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

      no, that would not be a problem as soon as the other image library has an api reitti could query. It just happens that I am settled with immich and had no other needs at the moment.

      If you need a specific one, drop a feature request and I will have a look.

      • Zagorath@aussie.zone
        link
        fedilink
        English
        arrow-up
        0
        ·
        3 months ago

        I don’t actually have any personally. I’m still with Google Photos for now and hadn’t decided what to switch to, with Immich, Nextcloud, and the non-open Synology Photos being the top of my list. Legitimately, what a tool like this supports could be a factor I use to help decide.

        How complicated is the code interfacing with Immich? Is it a piece someone not familiar with your overall code base could relatively easily pick up and make a pull request for?

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

          I do not think it is that complicated. The front-end sends a request to the back-end with the current selected day. This triggers a search in Immich returning all photos taken on that specific day. This is returned to the front-end and this than does the heavy lifting like filtering them to the current map bounds, displaying them on the map at a specific location. We proxy all request from the front-end through our server because of CORS issues and I did tried to avoid having to configure Immich besides creating a token for the API.

          One would need to either create a specific IntegrationService like ImmichIntegrationService and then figure out a way how the user can configure that. The easiest would be that we just then call all available ones even if I do not see the use case of having multiple Photo-Servers. But it would make the code in Reitti cleaner and would not hurt if we do not configure 20 simultaneous servers :D

  • Pandoras_Can_Opener@mander.xyz
    link
    fedilink
    English
    arrow-up
    0
    ·
    3 months ago

    This is a bit of a long shot. Does this work with tracking devices? I’m looking for a degoogled way to track my cat and somebody linked me here.

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

      Greetings, @[email protected], that sounds like a truly wonderful idea, and as a fellow cat owner, it brings me great joy to hear about it. 😻

      In fact, I have recently changed the analysis of data, which is now performed in near real-time as soon as new data becomes available. I am currently working on the functionality to display multiple users (or, in your case, Pandora) on the map, which should be beneficial to your idea.

      Now, the primary question is, how can we integrate the data from the tracker into Reitti. Thats something I have no idea at the moment. Do you have any Infos about that?

      • Pandoras_Can_Opener@mander.xyz
        link
        fedilink
        English
        arrow-up
        0
        ·
        3 months ago

        I’m not very IT savy so I’m not sure if I have anything to contribute. In general there’s various trackers on the market. Some use GPS, some use Bluetooth and some use radio. All of them have respective proprietary apps. Maybe looking into these apps could give some insight?

        The Nut tracker (GPS) is only 15 € and I can at least open the app on my degoogled phone.

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

          Someone would need to get that data out of the app. Either as GPX or some other format. I do not think these devices are able to send the position to some configurable endpoint. A quick search for nut tracker and home assistant does not yield any reasonable results.

          I think we are out of luck at that point. But maybe someone knows about a more open tracker device which could be configured.

  • Ada@piefed.blahaj.zone
    link
    fedilink
    English
    arrow-up
    0
    ·
    3 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
      0
      ·
      3 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
        0
        ·
        3 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
          0
          ·
          3 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
              0
              ·
              edit-2
              3 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
                0
                ·
                3 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
                  0
                  ·
                  edit-2
                  3 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.