<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Snapp Technology: stuff we're building</title>
    <link>https://snapp.technology/building</link>
    <description>The products we are building, the decisions behind them, and what we are learning as we go.</description>
    <language>en</language>
    <managingEditor>hello@snapp.technology (Snapp Technology)</managingEditor>
    <webMaster>hello@snapp.technology (Snapp Technology)</webMaster>
    <copyright>Snapp Technology</copyright>
    <lastBuildDate>Wed, 09 Sep 2026 12:00:00 +0000</lastBuildDate>
    <atom:link href="https://snapp.technology/rss.xml" rel="self" type="application/rss+xml" />
    <image>
      <url>https://snapp.technology/logos/Mark_navy.png</url>
      <title>Snapp Technology: stuff we're building</title>
      <link>https://snapp.technology/building</link>
    </image>
    <item>
      <title>VertMatch: a new palette, public race pages, and 69,000 climbs</title>
      <link>https://snapp.technology/building/vertmatch-redesign</link>
      <guid isPermaLink="true">https://snapp.technology/building/vertmatch-redesign</guid>
      <pubDate>Wed, 09 Sep 2026 12:00:00 +0000</pubDate>
      <description>Five weeks after the first VertMatch post, the product is teal instead of orange, races have a front door built for strangers, and the climb catalogue has grown roughly fivefold. Here is what changed and what the repaint cost us.</description>
      <category>product</category>
      <category>trail running</category>
      <category>design</category>
      <enclosure url="https://snapp.technology/building/vertmatch-redesign/cover.jpg" length="188861" type="image/jpeg" />
      <content:encoded><![CDATA[<p><img src="https://snapp.technology/building/vertmatch-redesign/cover.jpg" alt="VertMatch: a new palette, public race pages, and 69,000 climbs" /></p>
<p>We wrote about <a href="https://snapp.technology/building/vertmatch">VertMatch</a> in early August, at the point where it had turned into a race-readiness engine for trail runners: a climb catalogue, a common currency called TEP, and a readiness score. Ninety-nine commits later it looks like a different product. This is what happened in between.</p>
<h2>The orange took 250 hex literals with it</h2>
<p>The most visible change is a colour. The accent moved from #FF8C00 orange to #0E7C7B alpine teal on 7 August, the week after the last post.</p>
<p>The interesting part is what that cost. Changing one brand colour meant editing roughly 250 hand-written hex literals across 79 files, because almost every surface had copied the value into a style prop rather than referencing anything. The colour was never a token. It was a string, 250 times.</p>
<p>So the repaint came with a rule attached. There is now a single module that owns the accent and its four companions, the light and dark steps used in gradients, and the brighter shade reserved for text on dark surfaces where the main accent misses the contrast threshold. Everything else points at the theme. The next brand change is one edit rather than a sweep.</p>
<p>That is not a glamorous lesson, and it is the one worth writing down: the cost of a design decision is rarely the decision. It is how many places you have to visit to apply it.</p>
<h2>Warm stone instead of cool grey</h2>
<p>The palette swap went well past the accent. The application background moved from #f8fafc, a cool blue-grey, to #f6f4f0, a warm stone. Card surfaces went from pure white to #fdfcf9. Both text tones were re-mixed. All five TEP category colours were re-toned, having previously been more or less stock Material primaries.</p>
<p>The full-bleed mountain photograph behind the old hero came out at the same time. What replaced it is a live 3D terrain render of an actual race, the Zugspitz Ultratrail, with the course traced on it and a scoring card counting up beside it. The old background said &quot;mountains&quot;. The new one says &quot;this is your race, and here is what we know about it&quot;.</p>
<p>The rest of the palette does quieter work. Pages sit on warm stone, the cards that carry a countdown or a session go dark, and the teal turns up on the things you are meant to act on. Elevation profiles are drawn in it too, which is why a race page reads as one object rather than a chart bolted to a header.</p>
<figure><img src="https://snapp.technology/building/vertmatch-redesign/races.jpg" alt="The VertMatch races page: a dark card counting down 205 days to a target race, its course profile drawn in teal, above a timeline of past and upcoming races" /></figure>
<p>The design system itself only caught up a month later, on 7 September. Its token file still taught the orange brand, so anyone building from it, human or agent, would have produced work in a retired palette. Twenty-one preview and kit files were re-pointed, the source of truth widened from two files to six, and a full icon set landed with it: favicon, the installable app tiles, the touch icon, a default avatar and eight drawn SVGs.</p>
<p>A design system that lags the product is worse than no design system, because it is confidently wrong. That gap was open for a month.</p>
<h2>What the brand is not allowed to touch</h2>
<p>One rule came out of the repaint that we would keep on any product with a scoring model in it.</p>
<p>Difficulty scales, readiness states, TEP categories and session families are not brand colours. They answer &quot;what is this&quot;, not &quot;whose product is this&quot;, and they live in separate files that the brand is not permitted to reach into. When the accent moved, they did not.</p>
<p>You can see it on a climb page. The category chip, the TEP tile and the elevation profile are all amber because the climb is a Significant one. The navigation and the buttons are teal because the product is VertMatch. Those two things are allowed to disagree.</p>
<figure><img src="https://snapp.technology/building/vertmatch-redesign/climb-detail.jpg" alt="A VertMatch climb page showing a Significant climb at 10.0 TEP, with vertical, distance and average grade, and a plain-language summary of what the climb will feel like" /></figure>
<h2>Say what it means, not just what it measures</h2>
<p>The other shift in the redesign is harder to see in a palette diff. The product used to draw you a chart and leave you to it. It now says what the chart means.</p>
<p>A climb page carries a line like &quot;Very steep: hands-on-knees climbing; this is about strength, not speed. Plan for roughly 16 to 27 minutes of continuous climbing. The steepest 500 m hits 30% at km 0.4.&quot; That is the same data as before, read out loud. A comparison between two races now states its conclusion rather than drawing the same shape twice in two colours.</p>
<p>The training side works the same way. A session does not stop at &quot;easy run, 1h 22&quot;. It says how long it has been since the last one, what the effort should feel like in plain words, and what to do when the day does not cooperate, including rebuilding the session for a bike.</p>
<figure><img src="https://snapp.technology/building/vertmatch-redesign/today-session.jpg" alt="The VertMatch Today page showing a prescribed easy run with its warm up, main set and cool down, an explanation of how the effort should feel, and options to skip it or ride it instead" /></figure>
<h2>Races got a front door</h2>
<p>An event used to be whatever string a scraper found next to a race, which is how the collection filled up with domain names and entries called &quot;Unknown Event&quot;. Events are now curated pages that an admin writes: one festival, one place, several races over several days. Nothing else writes them.</p>
<p>The public page is built for someone who has never heard of us, because that is usually who arrives. An organiser links to it. So the terrain does the selling: every course carries its elevation profile with the climbs banded by grade, a TEP score, and its biggest climb with the kilometre it arrives at. Where that climb is in the catalogue it gets its name, a photo somebody who ran it took, and a way through to its own page.</p>
<p>The Innsbruck Alpine Trailrunning Festival page is a fair example. Twelve distances from 7 to 105 km, 84 climbs scored, the hardest course at 41 TEP, and every course profile drawn at the same scale so the outlier is obvious. The terrain gets a plain reading, &quot;a blend of longer climbs and sharper ramps, with no one shape dominating&quot;, and the climbs are banded by grade: one hors catégorie, four major, seven significant, ten moderate, sixty-two minor. The organiser's own logo and website sit on the page, because the page is theirs as much as ours.</p>
<figure><img src="https://snapp.technology/building/vertmatch-redesign/event-page.jpg" alt="The public event page for the Innsbruck Alpine Trailrunning Festival 2027, with a countdown, the organiser's logo, headline numbers for the festival, a breakdown of its 84 climbs by grade, and all twelve course profiles drawn at the same scale" /></figure>
<p>The <a href="https://vertmatch.run/events">event list</a> is public, and so is every page under it.</p>
<p>Sharing those links used to preview as a bare &quot;VertMatch&quot; with no image, whatever the link pointed at, because social crawlers do not run JavaScript and a static single-page app answers every route with the same shell. Event, race and climb links now render real preview cards.</p>
<h2>Every climb on the map</h2>
<p>Zoomed out, the map used to answer with the hundred newest climbs: a handful of lines in one corner of an empty continent. It now asks what the viewport actually holds and draws a badge per group carrying the count, the toughest TEP hiding underneath, and a ring showing the category mix. Zoom in far enough and it switches to real geometry, at the point where a view holds few enough climbs to draw honestly.</p>
<p>Climbs that share a trail used to be drawn on top of each other, so you could not tell them apart and a tap took whichever was on top. They now run as parallel lanes, easing back onto their true line where they part company. The overlap is settled in metres so bundles do not reshuffle as you zoom, while the visual nudge is in screen pixels so the lanes stay legible.</p>
<figure><img src="https://snapp.technology/building/vertmatch-redesign/map-lanes.jpg" alt="Two phone screenshots of the VertMatch climbs map: zoomed out, climbs are grouped into badges showing counts and TEP; zoomed in, each climb is drawn as its own coloured lane" /></figure>
<p>The basemap also moved off CARTO onto OpenFreeMap, and a map now survives a browser with no WebGL context rather than taking the page down with it. The <a href="https://vertmatch.run/climbs">climb map</a> is open without an account.</p>
<h2>The climbs you train on, timed</h2>
<p>Most catalogued climbs a runner touches are incidental: a race, a trail day, a one-off. The handful they actually train on can now be marked as favourites, and those get a deeper read. Every past ascent, personal best, pacing, and whether they are getting faster.</p>
<p>Timing had to come first, and it was being discarded at every provider boundary. The elapsed time of an ascent is now kept from intervals.icu, from FIT files (which covers Suunto, COROS and direct uploads) and from Polar's TCX. Nothing else about a hill rep varies: same hill, same vertical, same calibrated score every time. Elapsed time is the only signal progress can be read from.</p>
<p>Repeated ascents of the same climb are a hill-rep workout, so they are now classified as one rather than falling through to &quot;easy&quot; and charging the training model nothing.</p>
<h2>Sixty-nine thousand climbs</h2>
<p>The catalogue was around 14,000 climbs in the last post. It now round-trips 68,765.</p>
<p>Most of that is public data brought in properly: the US National Forest System trail network and The National Map, England and Wales rights of way with the Welsh elevation model, New Zealand's Department of Conservation trails wired to LINZ's open one-metre LiDAR, plus Czechia, Quebec, Ontario, Emilia-Romagna and the Azores. Data credits are grouped by source on the pages that use them.</p>
<h2>What is next</h2>
<p>The phone app is in development, Climb Finder is shipping, and the UNA watch build we <a href="https://snapp.technology/building/una-watch">wrote about</a> is out as a testing release. Pacer, the paid tier, is still priced at early bird.</p>
<p>If you want to see the new look rather than read about it, pick a race at <a href="https://vertmatch.run">vertmatch.run</a> and let the terrain make the argument.</p>]]></content:encoded>
    </item>
    <item>
      <title>A trail running stack for the UNA Watch</title>
      <link>https://snapp.technology/building/una-watch</link>
      <guid isPermaLink="true">https://snapp.technology/building/una-watch</guid>
      <pubDate>Tue, 18 Aug 2026 12:00:00 +0000</pubDate>
      <description>UNA Watch sent us a developer device. One afternoon in the simulator before it arrived, five days after it landed: their MIT-licensed recorder forked into a trail running app, an Android companion beside it, climbs delivered from VertMatch, and runs that leave as files rather than into a single service.</description>
      <category>product</category>
      <category>hardware</category>
      <category>trail running</category>
      <enclosure url="https://snapp.technology/building/una-watch/cover.jpg" length="48954" type="image/jpeg" />
      <content:encoded><![CDATA[<p><img src="https://snapp.technology/building/una-watch/cover.jpg" alt="A trail running stack for the UNA Watch" /></p>
<p>UNA Watch sent us a developer device. One afternoon in the simulator before it arrived, five days after it landed: their MIT-licensed recorder forked into a trail running app, an Android companion beside it, climbs delivered from VertMatch, and runs that leave as files rather than into a single service.</p>
<p><a href="https://snapp.technology/building/una-watch">Read the full post on snapp.technology</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Indoor Bike: an indoor cycling app with no landlord</title>
      <link>https://snapp.technology/building/indoorbike</link>
      <guid isPermaLink="true">https://snapp.technology/building/indoorbike</guid>
      <pubDate>Wed, 05 Aug 2026 12:00:00 +0000</pubDate>
      <description>A local-first, open source trainer app for Android: ERG mode over standard Bluetooth, workouts that fit in a URL, zero network calls by default, and the first outside contributor already merged.</description>
      <category>product</category>
      <category>cycling</category>
      <category>open source</category>
      <enclosure url="https://snapp.technology/building/indoorbike/cover.jpg" length="54231" type="image/jpeg" />
      <content:encoded><![CDATA[<p><img src="https://snapp.technology/building/indoorbike/cover.jpg" alt="Indoor Bike: an indoor cycling app with no landlord" /></p>
<p>A local-first, open source trainer app for Android: ERG mode over standard Bluetooth, workouts that fit in a URL, zero network calls by default, and the first outside contributor already merged.</p>
<p><a href="https://snapp.technology/building/indoorbike">Read the full post on snapp.technology</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Open Terrain: a shop window for indie outdoor software</title>
      <link>https://snapp.technology/building/openterrain</link>
      <guid isPermaLink="true">https://snapp.technology/building/openterrain</guid>
      <pubDate>Wed, 05 Aug 2026 11:59:00 +0000</pubDate>
      <description>Twenty-nine tools, twelve countries, one day from first commit to production. Why we built a curated software directory for open-water swimmers, gravel riders and trail runners, and why the code is boring on purpose.</description>
      <category>product</category>
      <category>directory</category>
      <enclosure url="https://snapp.technology/building/openterrain/cover.jpg" length="277364" type="image/jpeg" />
      <content:encoded><![CDATA[<p><img src="https://snapp.technology/building/openterrain/cover.jpg" alt="Open Terrain: a shop window for indie outdoor software" /></p>
<p>Twenty-nine tools, twelve countries, one day from first commit to production. Why we built a curated software directory for open-water swimmers, gravel riders and trail runners, and why the code is boring on purpose.</p>
<p><a href="https://snapp.technology/building/openterrain">Read the full post on snapp.technology</a></p>]]></content:encoded>
    </item>
    <item>
      <title>VertMatch: matching your training to the mountain</title>
      <link>https://snapp.technology/building/vertmatch</link>
      <guid isPermaLink="true">https://snapp.technology/building/vertmatch</guid>
      <pubDate>Wed, 05 Aug 2026 11:58:00 +0000</pubDate>
      <description>Three attempts, one right question. How our race-readiness engine for trail runners went from a gradient dashboard nobody needed to a 14,000-climb catalogue, a readiness score, and a EUR 2 plan in nineteen weeks.</description>
      <category>product</category>
      <category>trail running</category>
      <enclosure url="https://snapp.technology/building/vertmatch/logo.png" length="315989" type="image/png" />
      <content:encoded><![CDATA[<p><img src="https://snapp.technology/building/vertmatch/logo.png" alt="VertMatch: matching your training to the mountain" /></p>
<p>Three attempts, one right question. How our race-readiness engine for trail runners went from a gradient dashboard nobody needed to a 14,000-climb catalogue, a readiness score, and a EUR 2 plan in nineteen weeks.</p>
<p><a href="https://snapp.technology/building/vertmatch">Read the full post on snapp.technology</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Introducing: stuff we're building</title>
      <link>https://snapp.technology/building/introducing-stuff-were-building</link>
      <guid isPermaLink="true">https://snapp.technology/building/introducing-stuff-were-building</guid>
      <pubDate>Wed, 29 Jul 2026 12:00:00 +0000</pubDate>
      <description>A place to show what we are building: our own products, the decisions behind them, and what we are learning as we go.</description>
      <category>company</category>
      <category>product</category>
      <content:encoded><![CDATA[<h2>Why this space</h2>
<p>We build a lot. Products of our own, tools for ourselves, experiments that sometimes grow legs. This space is where we show what we have been up to: the decisions behind a design, a technique that worked, a short note when we ship something.</p>
<p>Some posts will be long. Most will be short. The point is not to publish on a schedule. It is to leave a trail of how we think and work.</p>
<h2>Already on the shelf</h2>
<p>The first deep dives are live: <a href="https://snapp.technology/building/vertmatch">VertMatch</a>, a race-readiness engine for trail runners; <a href="https://snapp.technology/building/openterrain">Open Terrain</a>, a curated directory of indie software for outdoor sports; and <a href="https://snapp.technology/building/indoorbike">Indoor Bike</a>, a local-first smart trainer app with no subscription attached.</p>
<figure><img src="https://snapp.technology/building/vertmatch/climb-map.png" alt="The VertMatch climb catalogue around Garmisch-Partenkirchen, climbs coloured by severity" /><figcaption>VertMatch keeps a shared catalogue of over 14,000 climbs. The full story is in the VertMatch post.</figcaption></figure>
<figure><img src="https://snapp.technology/building/indoorbike/ride-hud.jpg" alt="The Indoor Bike ride screen holding 60 watts in ERG mode against a night landscape" /><figcaption>Indoor Bike drives a smart trainer with zero network calls by default. Unedited screenshot from the deep dive.</figcaption></figure>
<figure><img src="https://snapp.technology/building/openterrain/gravel.jpg" alt="A gravel road through forest, one of the three sports Open Terrain curates software for" /><figcaption>Open Terrain curates indie software for open-water swimming, gravel and trail running.</figcaption></figure>
<h2>What to expect</h2>
<ul><li>Deep dives into the products we build and run</li><li>Design and engineering decisions, explained</li><li>Occasional opinions on European software independence</li></ul>
<blockquote><p>Building great software is a multi-disciplinary process. We would rather show that than describe it.</p></blockquote>
<p>If any of it prompts a question, <a href="https://snapp.technology/contact">get in touch</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>A refreshed home page and a proper impressum</title>
      <link>https://snapp.technology/building/site-refresh</link>
      <guid isPermaLink="true">https://snapp.technology/building/site-refresh</guid>
      <pubDate>Wed, 29 Jul 2026 11:59:00 +0000</pubDate>
      <description>We reworked the landing experience and added the legal details page every EU company should have.</description>
      <category>website</category>
      <content:encoded><![CDATA[<p>We gave the home page a pass this week: a cleaner hero and a tighter walk through what we do. We also added an <a href="https://snapp.technology/impressum">impressum</a> with our full company details and registration number, which every European company should have.</p>
<p>Small changes, but the site should now read a little more like the studio behind it.</p>]]></content:encoded>
    </item>
  </channel>
</rss>
