<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>Torben Labs</title>
    <subtitle>Torben — Senior Backend Engineer in Hamburg. Resilient distributed systems in .NET and Rust, and Tipperoo, an ad-free football prediction game.</subtitle>
    <link rel="self" type="application/atom+xml" href="https://www.torbenlabs.com/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://www.torbenlabs.com"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-07-17T00:00:00+00:00</updated>
    <id>https://www.torbenlabs.com/atom.xml</id>
    <entry xml:lang="en">
        <title>Why I&#x27;m building another Tippspiel</title>
        <published>2026-07-17T00:00:00+00:00</published>
        <updated>2026-07-17T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Torben
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.torbenlabs.com/posts/why-im-building-another-tippspiel/"/>
        <id>https://www.torbenlabs.com/posts/why-im-building-another-tippspiel/</id>
        
        <content type="html" xml:base="https://www.torbenlabs.com/posts/why-im-building-another-tippspiel/">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Update, September 2026:&lt;&#x2F;strong&gt; the August 2026 window came and went and Tipperoo
wasn’t ready, so it didn’t ship. Since the start of a season is the only moment
a whole round will tolerate moving, the next opening is a year out: the beta
now targets &lt;strong&gt;August 2027&lt;&#x2F;strong&gt;, for the 2027&#x2F;28 season. Everything below is the
July 2026 post unchanged — including the part where I named this exact failure
mode as the second most likely way it goes wrong.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Every August the same thing happens in German offices, family WhatsApp groups and
Vereinsheime. Somebody sets up a Tippspiel, everyone predicts the Bundesliga
scores, and a leaderboard runs quietly in the background until May. It is a small
ritual and people are weirdly attached to it.&lt;&#x2F;p&gt;
&lt;p&gt;Most of those rounds run on Kicktipp. It was started in 1995 by Janning Vygen, who
wanted to stay in touch with friends after they scattered around the country, and
it is still run by two people. Roughly two million people use it every weekend.
During the EURO in 2024 that went up to about six million. As far as I can tell
from the reporting, it earns somewhere around €1.5 million a year on ads and a
light premium tier, with no marketing budget at all.&lt;&#x2F;p&gt;
&lt;p&gt;That is a very good business, run by two people, in a category I now want to
compete in. So the question I get, reasonably, is why bother.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-market-is-smaller-than-it-looks-and-that-s-the-point&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-market-is-smaller-than-it-looks-and-that-s-the-point&quot; aria-label=&quot;Anchor link for: the-market-is-smaller-than-it-looks-and-that-s-the-point&quot;&gt;The market is smaller than it looks, and that’s the point&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Let me be honest about the size first, because it changes everything downstream.&lt;&#x2F;p&gt;
&lt;p&gt;If Tipperoo became the default Tippspiel in Germany, replacing the incumbent
outright, the prize is roughly that same €1.5 million a year. Total dominance of
this category gets you a lean, profitable niche business and nothing like a
unicorn, and Kicktipp has already proved you can run it with two people.&lt;&#x2F;p&gt;
&lt;p&gt;Most people would read that and stop. I read it and found it clarifying, for two
reasons.&lt;&#x2F;p&gt;
&lt;p&gt;The first is that it rules out the strategy that kills most challengers here. You
cannot raise money, buy growth and out-spend anyone, because the revenue at the
end doesn’t justify it. So the only viable posture is the one Kicktipp already
demonstrates: stay tiny, keep costs near zero, and let the product’s own invite
loop do the work. Being small is the configuration that wins here, which is a
strange thing to have to plan for.&lt;&#x2F;p&gt;
&lt;p&gt;The second is that it points at where the money actually is. Consumer willingness
to pay for a prediction game is close to nothing, and always will be. Workplace
willingness to pay is much higher, and it’s the lane Kicktipp monetises weakly and
the modern consumer apps ignore entirely.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;kicktipp-wins-on-habit-not-on-quality&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#kicktipp-wins-on-habit-not-on-quality&quot; aria-label=&quot;Anchor link for: kicktipp-wins-on-habit-not-on-quality&quot;&gt;Kicktipp wins on habit, not on quality&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;This part matters, because it would be easy to be arrogant about it and arrogance
here would be wrong. Kicktipp’s feature set is genuinely deep. Freely
configurable scoring, the Quotenregel, jokers, bonus questions, mixed-league
calendars, team rankings for company events, multi-sport, livescores. If I tried
to out-configure them I would lose, and it would take years to lose.&lt;&#x2F;p&gt;
&lt;p&gt;What Kicktipp is not is modern. The web UI is dated and doesn’t respond properly
on a phone, which is where most people now tip. There are ads. There’s betting-odds
adjacency in the wider ecosystem. The navigation gets called &lt;em&gt;unübersichtlich&lt;&#x2F;em&gt;
often enough that it’s basically consensus, and Kicktipp itself concedes some of
the admin screens “leider sind einige Masken etwas komplizierter geworden.”&lt;&#x2F;p&gt;
&lt;p&gt;So it wins on incumbency and habit rather than on quality. That’s a real thing to
win on. Thirty years of group-invite loops and accumulated SEO is a genuine moat,
and I’m not pretending otherwise.&lt;&#x2F;p&gt;
&lt;p&gt;There’s also a cautionary tale sitting right there. HALBZEIT was a better-built
version of roughly this idea, and it died in 2024. Not because the product was
bad. It died because there was no growth engine and the runway ran out. That’s the
failure mode I’m most likely to repeat, and I think about it more than I think
about any technical problem.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;how-you-actually-beat-something-like-that&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#how-you-actually-beat-something-like-that&quot; aria-label=&quot;Anchor link for: how-you-actually-beat-something-like-that&quot;&gt;How you actually beat something like that&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;The framework I keep coming back to is counterpositioning, from Hamilton Helmer’s
&lt;em&gt;7 Powers&lt;&#x2F;em&gt;. The idea is that a challenger adopts a model the incumbent can see
perfectly clearly, understands completely, and still won’t copy, because copying
it would damage its own business. It’s one of the few durable advantages available
to someone with no capital, because it rewards timing and position rather than
spend.&lt;&#x2F;p&gt;
&lt;p&gt;Tipperoo is pointed at three places where I think Kicktipp is stuck:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;No ads and no betting odds.&lt;&#x2F;strong&gt; Kicktipp’s web revenue &lt;em&gt;is&lt;&#x2F;em&gt; ads plus betting
adjacency. That’s a meaningful part of how two people net €1.5 million. Going
ad-free and betting-free would cannibalise their own income, so they won’t. I can,
because I never built that revenue line in the first place. They are not asleep
here, they are stuck, and stuck is a much better thing to bet against than lazy.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;A modern, mobile-first rebuild.&lt;&#x2F;strong&gt; Kicktipp’s founder says the product “lives
from its simplicity,” and there’s thirty years of refined code and user muscle
memory behind it. A ground-up rebuild risks both. Incumbents defend with
incremental micro-innovations, not resets, so that ground stays open more or less
indefinitely.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Workplace-native.&lt;&#x2F;strong&gt; Kicktipp’s pro package is a website-integration product sold
to marketers. Rebuilding around bottom-up, self-serve, Slack and Teams adoption is
a different business, and there’s no reason for them to disrupt themselves for it.&lt;&#x2F;p&gt;
&lt;p&gt;The framework also predicts how the incumbent responds, which is to ignore the
small niche player for as long as possible. That happens to be exactly the cover a
challenger wants.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-i-m-trying-to-get-right&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#what-i-m-trying-to-get-right&quot; aria-label=&quot;Anchor link for: what-i-m-trying-to-get-right&quot;&gt;What I’m trying to get right&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;No ads, no odds, no entry fees. Permanently.&lt;&#x2F;strong&gt; Not as a launch promise I quietly
walk back once there’s traffic, since the whole counterposition rests on it. The
moment I run ads I’ve become a worse-funded Kicktipp and the reason for anyone to
switch evaporates. The Tippkasse, if a group runs one, is tracked and never touched by
us.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;The simple core stays sacred.&lt;&#x2F;strong&gt; This is the failure I’m most worried about,
because it’s the one that comes from doing my &lt;em&gt;own&lt;&#x2F;em&gt; idea too enthusiastically. The
risk of counterpositioning hard on “modern” is that you end up with something so
featureful that a casual player can’t just type two numbers and get on with their
day. Kicktipp’s simplicity is the reason the category works at all. Depth in
Tipperoo is opt-in, never imposed. If your uncle can’t use it, it’s broken.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Being right, publicly, on a Saturday afternoon.&lt;&#x2F;strong&gt; A wrong table destroys trust
instantly and permanently. Six matches finish at once and everyone is refreshing.
So a score stays provisional until two independent sources agree, results live in
an append-only log so a correction recomputes the standings transparently instead
of quietly rewriting them, and the UI is allowed to say “we don’t know yet” rather
than show a confident wrong number. That’s a whole post of its own, and I’ll write
it once the beta has had a chance to embarrass me.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Hitting the one window.&lt;&#x2F;strong&gt; Points don’t transfer between platforms and groups
resist switching mid-season, so realistically there is exactly one moment a year
when a whole round will tolerate moving: the start of the season. That’s why the
beta rides on 2. Bundesliga from 7 August, and why GA is targeted at 18 August
rather than whenever it feels ready. Miss it and the answer is “ask us again next
August.” &lt;em&gt;(And that is what happened — see the update at the top.)&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;where-this-could-go-wrong&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#where-this-could-go-wrong&quot; aria-label=&quot;Anchor link for: where-this-could-go-wrong&quot;&gt;Where this could go wrong&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;The likeliest way this ends badly has nothing to do with Kicktipp crushing me. I
build something good, nobody ever hears about it, and it quietly folds, which is
precisely what happened to HALBZEIT. Distribution decides this rather than the code, and the code is the part
I’m naturally better at, which is roughly where I’d expect the whole thing to come
apart if it does.&lt;&#x2F;p&gt;
&lt;p&gt;Second most likely: the season window opens, the product isn’t ready, and I ship
it anyway because the date is emotionally load-bearing. I’d rather move the launch
than launch something that gets a table wrong in front of somebody’s colleagues.&lt;&#x2F;p&gt;
&lt;p&gt;Ask me in September how much of this survived contact with reality.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Tipperoo</title>
        <published>2026-07-16T00:00:00+00:00</published>
        <updated>2026-07-16T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Torben
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.torbenlabs.com/projects/tipperoo/"/>
        <id>https://www.torbenlabs.com/projects/tipperoo/</id>
        
        <content type="html" xml:base="https://www.torbenlabs.com/projects/tipperoo/">&lt;h2 id=&quot;why&quot;&gt;Why&lt;&#x2F;h2&gt;
&lt;p&gt;A &lt;em&gt;Tippspiel&lt;&#x2F;em&gt; is a fixture of German office and family life: everyone predicts
the scores, points accumulate, someone’s uncle wins. The category leader is a
decade-old site funded by advertising and bookmaker odds. That works, but it
means the thing you play with your family is also quietly a funnel into gambling.&lt;&#x2F;p&gt;
&lt;p&gt;Tipperoo is the counter-position: no ads, no odds, no entry fees, no operated
money — permanently, as a matter of identity rather than a launch promise.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-s-interesting-technically&quot;&gt;What’s interesting technically&lt;&#x2F;h2&gt;
&lt;p&gt;The hard part isn’t the tipping. It’s being &lt;strong&gt;right&lt;&#x2F;strong&gt;, in public, on a Saturday
afternoon when six matches finish at once and everyone is refreshing.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Never score on unreconciled data.&lt;&#x2F;strong&gt; A football result arrives from a provider
as a number, but it isn’t truth yet — it can be corrected, a match can go to
extra time or penalties, a fixture can be postponed after people have already
tipped. So results move through explicit &lt;code&gt;provisional → confirmed&lt;&#x2F;code&gt; states, and
points are only final once two independent sources agree. The UI has to &lt;em&gt;show&lt;&#x2F;em&gt;
that distinction rather than paper over it — provisional points are visibly
provisional.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Corrections have to be cheap.&lt;&#x2F;strong&gt; Results are an append-only event log. A
correction is a new event, not an &lt;code&gt;UPDATE&lt;&#x2F;code&gt;, so the standings recompute from the
log and the change is auditable rather than mysterious.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Live push that can’t lie.&lt;&#x2F;strong&gt; The tempting design is to push the score to the
browser. The problem is that a pushed score is a claim you then have to keep
consistent forever. Instead the database emits a transactional, &lt;em&gt;contentless&lt;&#x2F;em&gt;
signal, and the client refetches the durable row. A lost or duplicated message
costs a refetch — never a wrong number on screen.&lt;&#x2F;p&gt;
&lt;p&gt;Most of the interesting work has been in the seams: what counts as truth, how you
prove it, and what you show a user while you’re still deciding.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;status&quot;&gt;Status&lt;&#x2F;h2&gt;
&lt;p&gt;Not launched. The market page and waitlist are live at
&lt;a rel=&quot;noopener noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;tipperoo.de&quot;&gt;tipperoo.de&lt;&#x2F;a&gt;. The August 2026 window came and went without
the product being ready, and since groups only tolerate switching platforms at
the start of a season, the next real opening is a year out: the soft beta rides
on 2. Bundesliga in &lt;strong&gt;August 2027&lt;&#x2F;strong&gt;, with general availability targeted at the
Bundesliga opening weekend, gated on readiness rather than the date. Bundesliga
and Premier League for the 2027&#x2F;28 season, bilingual German and English from day
one.&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
