<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Filippo Valle</title>
    <description>The latest articles on DEV Community by Filippo Valle (@filippo_valle_a92d85baba0).</description>
    <link>https://dev.to/filippo_valle_a92d85baba0</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4165680%2F97aa5f83-4b88-465a-b0e8-c72381cbecfd.jpg</url>
      <title>DEV Community: Filippo Valle</title>
      <link>https://dev.to/filippo_valle_a92d85baba0</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/filippo_valle_a92d85baba0"/>
    <language>en</language>
    <item>
      <title>ChatGPX</title>
      <dc:creator>Filippo Valle</dc:creator>
      <pubDate>Tue, 06 Oct 2026 07:33:30 +0000</pubDate>
      <link>https://dev.to/filippo_valle_a92d85baba0/chatgpx-4akd</link>
      <guid>https://dev.to/filippo_valle_a92d85baba0/chatgpx-4akd</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05"&gt;Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;chatGPX lets you chat with your own Komoot hiking, running, and cycling history. You log in with your Komoot account, the app downloads your tours as GPX files, and an LLM with tool access answers questions about them. The numbers come from the raw GPS tracks rather than from description text: distance (haversine), elevation gain and loss, elapsed time, and pace, with a monthly breakdown across your whole history. Where Komoot reports its own figures, they are shown alongside as a cross-check.&lt;/p&gt;

&lt;p&gt;It is meant to send people outdoors. Questions like "which month did I climb the most?" or "what was my longest hike this year?" turn past outings into a record you can learn from and plan the next one against. It is aimed at hikers, runners, and cyclists who already log activities and want more than a dashboard. It is also a small, reusable example of exposing personal outdoor data to any MCP client.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0vxxru4eq92d53zl2ye0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0vxxru4eq92d53zl2ye0.png" alt="Screenshot" width="799" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/fvalle1" rel="noopener noreferrer"&gt;
        fvalle1
      &lt;/a&gt; / &lt;a href="https://github.com/fvalle1/chatGPX" rel="noopener noreferrer"&gt;
        chatGPX
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;chatgpx&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Chat with your own Komoot hiking/running/cycling activities, and get real
statistics computed from the raw GPS data — not just descriptions.&lt;/p&gt;
&lt;p&gt;You log in with your Komoot email and password, the app pulls your tours as
GPX files, and you can then chat with an LLM (over OpenRouter) that has tool
access to that data via an MCP server — including tools that compute real
distance, elevation and pace figures from the GPS track itself, not just
whatever a description string happens to say.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/fvalle1/chatGPX/page.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Ffvalle1%2FchatGPX%2FHEAD%2Fpage.png" alt="page.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;How it fits together&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;server.py&lt;/code&gt; — an MCP server exposing tools over your downloaded GPX
activities (&lt;code&gt;list_activities&lt;/code&gt;, &lt;code&gt;read_activity&lt;/code&gt;, &lt;code&gt;get_activity_stats&lt;/code&gt;
&lt;code&gt;get_stats_summary&lt;/code&gt;, &lt;code&gt;summarize&lt;/code&gt;, &lt;code&gt;generate_activity_video&lt;/code&gt;) plus a
&lt;code&gt;docs://traces&lt;/code&gt; resource.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gpx_sync.py&lt;/code&gt; — logs in to Komoot and downloads all tours as GPX files
(&lt;code&gt;download_all_gpx(email, password, output_dir=...) -&amp;gt; list[Path]&lt;/code&gt;)
compatible with what &lt;code&gt;server.py&lt;/code&gt; reads.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;chat_backend.py&lt;/code&gt; — connects to &lt;code&gt;server.py&lt;/code&gt; over MCP…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/fvalle1/chatGPX" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MCP server (&lt;code&gt;server.py&lt;/code&gt;):&lt;/strong&gt; exposes &lt;code&gt;list_activities&lt;/code&gt;, &lt;code&gt;read_activity&lt;/code&gt;, &lt;code&gt;get_activity_stats&lt;/code&gt;, &lt;code&gt;get_stats_summary&lt;/code&gt;, &lt;code&gt;summarize&lt;/code&gt;, and an optional &lt;code&gt;generate_activity_video&lt;/code&gt;. It can run over stdio or streamable-http, so any MCP client can use it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sync (&lt;code&gt;gpx_sync.py&lt;/code&gt;):&lt;/strong&gt; downloads tours as GPX using the open-source KomootGPX library, vendored as a git submodule. Filters for tour type, sport, and date range are optional.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chat backend (&lt;code&gt;chat_backend.py&lt;/code&gt;):&lt;/strong&gt; connects to the MCP server and passes its tools to the LLM as function calls. It works with any OpenAI-compatible provider that supports tool calling, configured through &lt;code&gt;OPENAI_BASE_URL&lt;/code&gt; and &lt;code&gt;OPENAI_MODEL&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web app (&lt;code&gt;app.py&lt;/code&gt;):&lt;/strong&gt; a small web app with a static frontend and &lt;code&gt;/api/login&lt;/code&gt; and &lt;code&gt;/api/chat&lt;/code&gt; endpoints.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optional video:&lt;/strong&gt; flyover clips from a self-hosted Cosmos3-Nano server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Models used:&lt;/strong&gt; [name the open-weight model(s) you ran and how, e.g. local inference or a hosted open-weight model].&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tooling:&lt;/strong&gt; [mention Claude Code, Serena, or other agent harnesses if relevant, since &lt;code&gt;.claude&lt;/code&gt; and &lt;code&gt;.serena&lt;/code&gt; are in the repo].&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Statistics are computed in code, not by the model. The LLM decides which tool to call and explains the result, which keeps the figures reproducible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Open standards (MCP, GPX) and open libraries (KomootGPX) allowed the project to be assembled in a short time.&lt;/li&gt;
&lt;li&gt;Any OpenAI-compatible endpoint can be used, so the same code works with a hosted open-weight model or a fully local one.&lt;/li&gt;
&lt;li&gt;Location history is personal data. Running the MCP server and inference locally means GPS tracks do not have to be sent to a closed API.&lt;/li&gt;
&lt;li&gt;The video feature relies on a self-hosted model, which is not tied to a vendor's availability or pricing.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
  </channel>
</rss>
