This is my blog

I enjoy writing about all kinds of stuff, so please don't expect any kind of common theme here!


Breaking Down the Costs of a Bootstrapped SaaS with $11,000 Monthly Revenue

February 12, 2024

How much does running a webapp in production actually cost? An interesting and related question is: what services does an app like this use? In this post, I will dive into both questions for the product I’m building. I’ll also provide some explanation for each service. First, a quick bit of background information. My product, Keepthescore.com, is built using Python Flask for the backend and Vue for the frontend. In a typical month, it has 250k visitors and 1.3 million pageviews. If you want to discover more about my journey and lessons...

Read More


Lessons from bootstrapping my side-project to $10,000 monthly revenue

November 20, 2023

My side-project, Keepthescore.com, has finally hit the $10k monthly revenue milestone. It’s a webapp that allows you to create scoreboards and leaderboards. The 10k is gross revenue and includes MRR (subscription revenue), one-off payments and advertising revenue. As tradition demands, here is a post sharing some lessons learnt so far. I want to show that this journey is absolutely possible – once a few prerequisites are in place. Even if you’re not about to quit your job to code (and market!) your own product, I hope you’ll still find some interesting insights....

Read More


A simple hack to improve your landing page copy with ChatGPT

November 10, 2023

It’s surprisingly hard to write the copy for your product landing page: one trap that is very easy to fall into is using your own language and not the customer’s when describing the product. What the company says: “Our Dermaglow cream is a sophisticated blend of micro-nutrients, rare botanicals, and innovative moisture-binding compounds that rejuvenate and revitalize your skin at a cellular level.” What customers say: “This lotion makes my face feel less like an old leather bag and more like a baby’s butt. Plus, it smells like lavender, not like a...

Read More


SaaS: the greatest business model of all

August 9, 2023

“SaaS is the greatest business model of all” is something I’ve heard once or twice, and I’m slowly beginning to come round to it. Why? First of all, what is a “SaaS” business model? SaaS stands for software as a service. A SaaS product is a web-based software product that people pay to use. An example of a small SaaS product would be a tool to help you schedule your social media posts. Large SaaS products are Salesforce or the Google suite of office products (Google Docs, Google Sheets and so on)....

Read More


How I chose my pricing strategy for Keepthescore.com

July 31, 2023

“Raise your prices” is the mantra of all solopreneurs. “Add expansion revenue” is its less well-known twin. I’ve just done both on my SaaS product (Keepthescore.com). 💰 What is expansion revenue? Expansion revenue, also known as upsell or cross-sell revenue, refers to the additional revenue generated from existing customers who make additional purchases beyond their initial or core purchase. It is a crucial aspect of business growth and revenue generation for companies. Another way of looking at expansion revenue is that it allows you to “milk the rich”. Up till...

Read More


If I died tomorrow, how long would my webapp keep running?

March 3, 2023

I am the sole developer of a webapp that has around 5,000 USD in monthly revenue. Yesterday I was thinking about what would happen to it if I died suddenly. I really should have some kind of succession plan. But instead of diving into that, I began to wonder how long the app would keep running for if it was left completely to itself, with no further human support. It’s interesting because my app runs as a completely self-sufficient system. The app makes monthly revenue which automatically gets deposited into a bank...

Read More


Online leaderboard widgets for your website

February 21, 2023

This is a post demonstrating how to embed a leaderboard widget from keepthescore.com. What’s really nice is that it will update automatically without the page reloading. Here’s what the leaderboard widget looks like. How does it work? First of all you need to go over to keepthescore.com and create your leaderboard. Click the “PUBLISH” button at the top of your board. Click the “Embed on a Website” Panel and then “COPY TO CLIPBOARD” Paste the code into your page (e.g....

Read More


Deployment and infrastructure for a bootstrapped webapp with 150k monthly visits

September 23, 2022

I am a one-man show building a web-based software product. Some quick facts about my app: 150k visitors per month 15k registered users 3k US$ revenue per month 70 requests per second at peak-time The app is KeepTheScore.com, an online scoreboard app This is a technical post looking at the infrastructure that runs my app with a focus on how I deploy it. Summary I use 2 VPS (virtual private servers) running on DigitalOcean The database is Postgres and is fully managed by DigitalOcean I use a blue-green deployment...

Read More


Why I chose Python to build my SaaS

July 1, 2022

I am a one-man show building my own software product. It currently has 11,000 registered users and revenue of around 1,500 USD per month. In this post I go into the reasons why I chose Python to build it. UPDATE (November 2023): my product is now making 10,000 USD per month and has 47,000 registered users! But first, what is a SaaS product? SaaS stands for software as a service. A SaaS product is a web-based software product that people pay to use. An example of a small SaaS product...

Read More


12 months into building my online business

May 26, 2022

I’m Caspar. I quit my job last year to build and market my own online product. Here’s the story of why I got started and how. Now it’s time for a retrospective, to reveal some numbers, go through some highlights and lowlights, and peer into the future. I’ll try and do this every 12 months. 1. Going solo First off, what does it feel like to go it alone? Am I lonely? Missing colleagues? Afraid? The answer is: it’s flipping awesome. I already feel that I have been lost to the world of...

Read More


Radical transparency: all of my metrics are now publicly available

April 26, 2022

After a lot of overthinking I have decided to make all of my metrics public on a single dashboard. The newly created dashboard shows revenue, engagement and signups for Keepthescore.com. Click here to see the dashboard. To be clear, this is less radical that it actually sounds. Others have been taken this path before such as Buffer.com or Ghost.org. Why am I doing this? The main reason is marketing. I think that publishing your metrics and being transparent demonstrates that you have nothing to hide. It increases trust. But mainly: it...

Read More


Hiding Arnold Schwarzenegger in my product to help the Ukraine

March 18, 2022

Yesterday I watched Arnold Schwarzenegger’s video, “A message to the Russian people”, and boy, is it good. I think it’s a masterclass in communication. He respects his intended Russian audience, builds empathy with some anecdotes and then delivers a crisp and simple message. He intersperses it with well-chosen footage of the crisis and makes it crystal clear who is to blame. I’m assuming that most Russians know Arnold and are more likely to listen to him than some unfamiliar journalist or Western corporation. Everything that I could say about the “special military operation”...

Read More


Things I learned about product management by becoming a full-stack developer

March 4, 2022

I spent most of my career as a product manager / product owner. In 2021 I “crossed the aisle”, so to speak, and became a full-stack developer. Well, actually I decided to build, run and grow my own software product. This means that on top of being a developer, I am still a product manager, as well as doing customer support and a lot of other things. But I would say that I am now mainly a full-stack developer. Here are 8 things that I have learned that would have helped me...

Read More


Learning to code a SaaS? Don't use a Javascript framework

February 18, 2022

This post is aimed at people who want to learn to code — with the explicit aim of creating their own SaaS product. It covers the purely technical aspects (not marketing nor product development). I’ve spent the last 5 years building a software product and want to share my learnings. The tl;dr version is: go old-school whenever you can. Don’t listen to the siren-calls of shiny new technology. Instead, aim to learn the technical fundamentals whilst shipping a product as soon as possible. This is absolutely do-able. What is a SaaS product?...

Read More


An expensive mistake — a short CTO war story

October 13, 2021

This story was recounted to me many years ago by the CTO of a startup. He himself was responsible for this error which cost the company tens of thousands of USD. The startup built an online multiplayer game. Users had to register and all registered users were represented by the same type of animal within the game. Let’s say that all users were cats. One day, sometime after the site had launched and was performing really nicely, the backend locked up solid. The tech team rebooted the server and things ticked along...

Read More


Why you should launch your product without a login

October 5, 2021

I’ve launched 2 successful web products (and several unsuccessful ones) that did not have a login. The product that I’m currently working on (keepthescore.com) has over 50k pageviews per day, monthly revenue of 2000 USD and has been online for 4 years – and I’ve only just added a user login. So what are the advantages of launching without a login? Summary By deferring implementation of a user-login you are: Speeding up development and reducing code complexity Reducing friction for your users during onboarding Reducing the attack area (no email or password...

Read More


Using Python and Docker to generate social images for any website

June 22, 2021

In today’s attention economy you need to stand out when you post your content on social media: that means having some kind of image as part of the package. This is easy if you’re sharing a blog post with photos (or other images) because you can setup your system to use one of these photos. But what if you’re sharing content that doesn’t come with a pre-made image? This is a problem I was facing. I’m building an online scoreboard and leaderboard app whose content regularly gets shared on Twitter, Facebook and elsewhere. However, these scoreboards do not come...

Read More


How I uncovered a black-hat SEO scam

June 7, 2021

This is the story of how I accidentally discovered a sizable SEO scamming operation. Summary Some highly-ranked online tools for editing or “cleaning” HTML seem to be secretly injecting links into their output to push themselves and affiliated sites up the search engine rankings. This scam is highly successful and appears to have gone undetected so far. Tools which I suspect of doing this are all made by the same people: html-cleaner.com html-online.com/editor/ html5-editor.net htmlg.com … and others Sites that have fallen victim to this include BoingBoing, the official German Football Association and Kaspersky. The delicious irony...

Read More


Why I'm quitting my job to build an online business

March 30, 2021

I’m quitting a good job to go it alone: I want to build an online product that can generate revenue. Hopefully it will become a sustainable business. UPDATE 20.05.2022: here’s a retrospective of what happened so far. Why am I doing this? I am doing this because I want to have freedom. Creative freedom, financial freedom and the ability to work on my own schedule. Naval Ravikant, an indian-american investor and modern-day internet sage says the following: You’re not going to get rich renting out your time. You must own equity...

Read More


A parable about startups and tech stacks

March 21, 2021

Once upon a time there was a young man who lived on an island where life was simple and austere. The young man dreamed of a different life, a life on the mainland, where there were shining cities, culture, exotic ideas and adventure. He spent most of his waking hours making plans about how to get to the mainland. Many young men before him had cultivated the same dream. Many had set off on the journey across the ocean which took many months. A few had made it, sending back...

Read More


How to embed an online fundraising widget

March 9, 2021

This is a post demonstrating how to embed a fundraising widget from keepthescore.com on a web page. What’s quite nice is that it will update automatically without the page reloading or having to touch the embed code. Here’s what an embedded thermometer looks like: How to add your own widget First of all you need to go over to keepthescore.com and create your thermometer. You can do this without registering or providing an email address. Pretty cool, no? Click the...

Read More


Google Analytics: Stop feeding the beast

February 25, 2021

The beast that is Google There was a time when Google was a small, quirky company with a single product so awesome that it blew away the competition. That time is long gone. These days Google is a gigantic multinational mega-corp. But that’s understating it a little. Think of Google as a kind of Godzilla that slurps up data about its users at one end and craps out gold ingots at the other. It does both of these at huge scale. When thinking about Google, there are three things that are not...

Read More


Online soccer score widget for your website

January 21, 2021

This is a post demonstrating how to embed a soccer score widget from keepthescore.com. What’s really nice is that it will update automatically without the page reloading. First of all you need to go over to keepthescore.com and create your leaderboard. You can do this without registering or providing an email address. Pretty cool, no? Click the “SHOW AND SHARE” button at the top of your board. Click the “Add scoreboard to a Website” Panel and then “COPY CODE TO CLIPBOARD” Paste the code into your page (e.g. Wordpress, Wix, Square, etc.) That’s it! Here’s what...

Read More


I deleted the production database by accident 💥

October 17, 2020

Today at around 10:45pm CET, after a couple of glasses of red wine, I deleted the production database for my online product (KeepTheScore.com, an online scoreboard app) by accident 😨. Over 300.00 scoreboards and their associated data were vaporised in an instant. By the way, I’m a one-man show, building a software product for a living. My product is keepthescore.com, an online scoreboard and leaderboard tool. Thankfully my database is a managed database from DigitalOcean, which means that DigitalOcean automatically do backups once a day. After 5 minutes of blind panic, I took the website into maintenance mode and...

Read More


Costs of running a Python webapp for 55k monthly users

September 4, 2020

How much does running a webapp in production actually cost? Maybe more than you think. keepthescore.com is a Python flask application running on DigitalOcean and Firebase. It currently has around 55k unique visitors per month, per day it’s around 3.4k. (In terms of page views, this is around 700k per month, 25k per day.) I have written a new post on this topic and updated it for 2024 Here’s a monthly breakdown with some background information on each cost: Servers and database on DigitalOcean Costs per month: $95...

Read More


Britain believes in a fairy-tale version of its history

October 3, 2019

This is going to be a rant, so buckle up. I went to school in England, from primary school all the way to higher education. I was taught British history the British way. I had no reason to question anything I was taught. Outside of school I thoroughly absorbed the British point of view concerning their place in the world. However, I have an unusual perspective because after growing up in England, I moved abroad and reflected on my experiences. I have since concluded that children in Britain are taught a naive, incomplete and context-free version of their country’s history....

Read More


A new type of basketball scoreboard

July 3, 2019

Why are basketball scoreboards so expensive? You can easily pay over 3000 USD for a hardware scoreboard! Of course you could download a a basketball scoreboard software for your computer and then display the result on a large monitor or projector. However, the software solutions have other problems: They often only run on one type of computer (e.g. Windows) They have a terrible usability They are still fairly expense They are all ugly! So here’s a new solution: a basketball scoreboard that runs in your browser. It looks like this: This means...

Read More


Die atemberaubende Beschissenheit von 3D Secure bei der DKB

June 23, 2019

Das 3D Secure Verfahren der DKB ist eine Frechheit. Es ist peinlich und grotesk. Es ist ein perfektes Beispiel dafür, wie Deutsche Banken kopfüber und ahnungslos ins Verderben rennen. Was ist überhaupt 3D Secure? Die DKB Webseite sagt: “3D Secure ist ein Service von Visa, Mastercard und der DKB, der Ihnen beim Online-Shopping zusätzlichen Schutz vor der unberechtigten Verwendung Ihrer Kreditkarte bietet und die aktuellen Sicherheitsstandards für Zahlungen im Internet erfüllt.” Ich werde mich hier nur über das Anmelde-Verfahren für 3D Secure auslassen, die Probleme, die bei der Nutzung entstehen, kann man...

Read More


A simple theory of consciousness

March 29, 2019

This is a text I originally posted on Quora. If you find it marginally interesting then it has fulfilled its purpose. What is consciousness? Consciousness is an essential tool for human social interaction. It arises as a result of living in societies of individuals with complex motives. To explain, let’s begin with a fundamental assumption: Being social and cooperating have many benefits. On average, individuals that are better at being social will be more successful at surviving and reproducing than individuals that are less social. Due to limiting factors (e.g. time available) individuals can only be...

Read More


Why you should work for my employer

September 21, 2018

I want to tell you about my current employer (a Berlin-based company) and why it’s very unusual as well as being an excellent place to work. I’ve been there for around 1.5 years. These opinions are my own and provided of my own volition: I’m not being paid to write this, I was not told to write this, nor is there a gun pointing at my head. Also, I’m writing from the perspective of someone who’s spent their career in the (Berlin) startup world. Let’s begin. Self-organisation and Holacracy The company is well on the way to becoming self-organised....

Read More


Lessons from a carpet salesman

June 13, 2018

How to make a carpet Last week I had a sales experience I will never forget. It began like this: “You are about to receive some very important insights into an ancient industry. Please let me have your undivided attention.” The speaker of these words was a well-groomed alpha male who was not fond of interruptions. I was in Turkey with a group of German tourists and we were visiting a carpet manufacturer and dealership. “My name is Dolunay”, our Turkish host continued. “It means full moon. You will find my name on...

Read More


Z-shell in Ubuntu 18.04

June 2, 2018

All the cool kids are using z-shell instead of bash these days. I won’t go into details here, other than saying: zsh has much better tab completion behavior than bash it makes working with git much more pleasant and productive Here’s what you need to do to install zsh, install Oh-My-Zsh (a prepackaged bunch of themes and addons) and get the fonts working on Ubuntu 16.04. 1. Install prerequisite packages sudo apt install git-core zsh 2. Install Oh My Zsh sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"...

Read More


Creating an online scoreboard with Python Flask and SQLite

January 11, 2018

I recently wanted to learn something new and decided to make a webapp using Python Flask. Webapps are often under-appreciated next to their native cousins, especially when some kind of user collaboration is required. Not only are webapps an order of magnitude easier to implement, their usability can actually be superior to native apps in certain situations: collaboration paired with no-registration onboarding is an unbeatable combination. I think this has been wonderfully demonstrated by Kittysplit.com, which I made with a bunch of friends. Keeping score online So I searched around for an idea and hit upon making a...

Read More


How to quit Facebook gracefully

August 30, 2017

Facebook is really really awful. I hate Facebook. It chews up too much time. It’s watching you on every website you visit, all the time. It’s basically a massive surveillance operation. How does this work? In short, using those innocent looking 👍 buttons that are plastered all over the web. You don’t even need to interact with them. Facebook makes gazillions of dollars by giving advertises access to you based on what Facebook knows about you. Read more here. It’s bad for your mental health. Yes really. You can Google it right now. It is an...

Read More


Empirum auf dem Mac entfernen / deinstallieren

July 8, 2017

Auf meinem Arbeitsrechner (ein MacBook Pro) läuft der Empirum Agent, eine Software von Matrix24. Sie ermöglich es unseren IT Administratoren viel zu automatisieren: Betriebssysteme und Software installieren, Ausstattung inventarisieren oder regelmäßig Softwareaktualisierungen durchführen. Leider habe ich auch den Eindruck, dass mein Mac deswegen sehr heiß wird. Mit folgeden Shell Kommandos kannst du Empirum in die ewigen Jagdgründe der ungeliebten Software schicken ☠️. Dafür benötigst Du allerdings sudo-Rechte auf deinem Rechner. sudo launchctl unload /Library/LaunchAgents/com.Matrix42.GUIAgent.plist sudo rm -f /Library/LaunchAgents/com.Matrix42.GUIAgent.plist sudo launchctl unload /Library/LaunchDaemons/com.Matrix42.EmpirumD.plist sudo rm -f /Library/LaunchDaemons/com.Matrix42.EmpirumD.plist sudo rm -fR /Library/Application\ Support/matrix42/Empirum sudo rm –fR...

Read More


Z-shell in Ubuntu 16.04

May 2, 2016

All the cool kids are using z-shell instead of bash these days. I won’t go into details here, other than saying: zsh has much better tab completion behavior than bash it makes working with git much more pleasant and productive Here’s what you need to do to install zsh, install Oh-My-Zsh (a prepackaged bunch of themes and addons) and get the fonts working on Ubuntu 16.04. 1. Install prerequisite packages sudo apt install git-core zsh 2. Install Oh My Zsh sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"...

Read More


A tool to present user stories

March 1, 2016

The legendary computer scientist Donald E. Knuth was in the middle of writing a series of books, when he realised that the typesetting systems of the day weren’t to his satisfaction. So he did what any tinkerer in his situation would do, which is epically procrastinate interrupt his writing and make a better system first. Eight years later his mission was complete and he had built the best typesetting system in the world. He then went back to writing his books. Anyway, I’m no Donald E. Knuth but recently I wanted to discuss a bunch of user stories...

Read More


Ubuntu development has stagnated

February 26, 2016

Last year I ranted about the state of Ubuntu and claimed that it had a general smell of decay and abandonment. This time I decided to try and find some concrete evidence to back up my claim and wondered whether mailing list activity would be a good proxy for measuring the health of the project. So I wrote a small script that analyses some Ubuntu mailing lists (each one can be downloaded as an archive file). The script simply counts the mails sent to each list in a 6 month period. Here’s what I found. Ubuntu...

Read More


Android In App Billing Howto

March 23, 2015

Here’s how I implemented in App Billing in my app(s). My goal was to implement a donate feature for my wallpaper apps so I set about reading the documentation on the Google developer pages. Events took a familiar course: after 10 minutes of reading, I thought, there’s got to be a less painful way to do this. So I googled the magic words tutorial and found quite a good one. However, the recommended method given by Google is annoying. You have to copy Java classes around by hand and there are no Gradle dependencies to make things...

Read More


Using Python to find domains; finding out if a domain is registered

March 10, 2015

I made a Python script to create domain names and then check if they are free. It uses a python whois module. Here’s what you need to do. 1. Checkout the code This bit is quite easy git clone git@github.com:caspii/domainfinder.git 2. Create your own building blocks This bit is also quite easy. Open the file input.txt in your favorite text editor. You’ll see that it contains a section called “–prefixes” and one called “–suffixes”. Simply edit these sections as you see fit, taking care not to delete the actual section titles. The...

Read More


How to take daily automatic screenshots in Ubuntu / Linux using the command line

November 26, 2013

For some reason you may want to automatically take screenshots every day. Maybe you want to spy on someone, maybe you want to keep a visual diary of what you’re doing on your computer, maybe you just really really love screenshots. Here’s how to do it using just command-line tools on Ubuntu. Step 1 Install the scrot package sudo apt-get install scrot Step 2 Create the following script and call it screenshots Note: you must give a values for FILEPATH. This must be absolute e.g. /home/bob/Dropbox. You must also give a...

Read More