<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Web App | Timon Weitkamp | No Worries, Just Maps</title>
    <link>https://timonweitkamp.me/tags/web-app/</link>
      <atom:link href="https://timonweitkamp.me/tags/web-app/index.xml" rel="self" type="application/rss+xml" />
    <description>Web App</description>
    <generator>Hugo Blox Builder (https://hugoblox.com)</generator><language>en-us</language><lastBuildDate>Sat, 07 Nov 2026 00:00:00 +0000</lastBuildDate>
    <image>
      <url>https://timonweitkamp.me/media/icon_hu11869890484969746898.png</url>
      <title>Web App</title>
      <link>https://timonweitkamp.me/tags/web-app/</link>
    </image>
    
    <item>
      <title>Field Time Series Viewer</title>
      <link>https://timonweitkamp.me/project/field-time-series-viewer/</link>
      <pubDate>Sat, 07 Nov 2026 00:00:00 +0000</pubDate>
      <guid>https://timonweitkamp.me/project/field-time-series-viewer/</guid>
      <description>&lt;p&gt;When a field suddenly looks different in our weekly analysis, the first question is always: is this real? It can be a cloud the mask missed, actual crop change, or a field that is bare because it was just harvested. To answer that you need to look at the images themselves, and most of my colleagues don&amp;rsquo;t open QGIS.&lt;/p&gt;
&lt;p&gt;So I built a web app that shows the downloaded GeoTIFFs of every field we monitor. You pick a field and scroll through all its images in order.&lt;/p&gt;
&lt;p&gt;It is a Streamlit app in Python, with GDAL to read the rasters, packaged as a Docker image so it runs the same on a server as on a colleague&amp;rsquo;s laptop. Syncthing (open source, a bit like OneDrive) syncs the TIFFs from the laptops where they are processed to a server in the EU, and the viewer is hosted on that same server.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Related:&lt;/strong&gt; &lt;a href=&#34;https://timonweitkamp.me/project/smartcane-bv/&#34;&gt;SmartCane&lt;/a&gt; · &lt;a href=&#34;https://timonweitkamp.me/project/smartcane-web-apps/&#34;&gt;SmartCane web apps&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>SmartCane web apps</title>
      <link>https://timonweitkamp.me/project/smartcane-web-apps/</link>
      <pubDate>Fri, 06 Nov 2026 00:00:00 +0000</pubDate>
      <guid>https://timonweitkamp.me/project/smartcane-web-apps/</guid>
      <description>&lt;p&gt;The SmartCane pipeline needs clean inputs. If the field boundaries or the field data are wrong, the analysis is wrong too.&lt;/p&gt;
&lt;p&gt;Before, checking this meant opening QGIS or a script. Now there is a small set of browser tools for it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a data validation tool for the crop-analysis inputs&lt;/li&gt;
&lt;li&gt;a GeoJSON viewer and an ODK viewer, to look at field boundaries and field data&lt;/li&gt;
&lt;li&gt;a polygon analysis editor to check and fix field polygons&lt;/li&gt;
&lt;li&gt;a sugar mill locator: a map of mills in East and Southern Africa, coloured by country and sized by production, where you can draw in new mills and export them as CSV&lt;/li&gt;
&lt;li&gt;a viewer for our technical documentation, and a small ID generator&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each tool is a self-contained HTML and JavaScript page without a backend, so they are easy to host and to change. They are mainly for colleagues who are not technical, so they can check and prepare data themselves instead of waiting for me.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Related:&lt;/strong&gt; &lt;a href=&#34;https://timonweitkamp.me/project/smartcane-bv/&#34;&gt;SmartCane&lt;/a&gt; · &lt;a href=&#34;https://timonweitkamp.me/project/field-time-series-viewer/&#34;&gt;Field Time Series Viewer&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Opportunity Radar</title>
      <link>https://timonweitkamp.me/project/opportunity-radar/</link>
      <pubDate>Thu, 05 Nov 2026 00:00:00 +0000</pubDate>
      <guid>https://timonweitkamp.me/project/opportunity-radar/</guid>
      <description>&lt;p&gt;Before Opportunity Radar there was a scraper that ran on my laptop. It worked, but only for one person. After a while it had collected 561 leads, and every single one was still marked &amp;ldquo;New&amp;rdquo;, because there was no way for two people to work on the same list.&lt;/p&gt;
&lt;p&gt;Opportunity Radar is the team version. It collects opportunities from several sources and scores each one against the fit criteria of each practice in the company, first with rules and then with an LLM that reads the description. The team then triages the list, assigns leads to people, discusses them and records the Go/No-Go decision. The reasons behind past decisions are fed back into the scoring, so it gets better at filtering out what we never bid on.&lt;/p&gt;
&lt;p&gt;The frontend is React with TypeScript, the backend FastAPI with PostgreSQL, and everything runs in Docker on an EU server. To be honest about how it was built: I relied heavily on Claude to write it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Related:&lt;/strong&gt; &lt;a href=&#34;https://timonweitkamp.me/project/smaller-builds/&#34;&gt;Smaller builds&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
