I have been tutoring maths for years, and since around December 2024 I had been thinking about doing it more professionally: with my own website and a calendar in which a student chooses a free slot themselves, instead of arranging times with me over messages. In early 2025 I looked at ready-made booking systems such as Reservio, but they either did not let me combine individual and group lessons, or cost more than I was willing to pay for something I would have had to bend to my needs anyway. So I decided to build it myself, even though I had never had anything to do with programming before.
This post is about the first stage: how a few pages and a form turned into an application that runs online and takes bookings. I made plenty of mistakes along the way, and I only found out about some of them when something stopped working.
The first pages in Flask
On 1 September 2025 I saved the first version of my code on GitHub, a service that stores code together with its full history of changes. I wrote the application in Python with Flask, a tool for building websites, and aimed it from the start at Render, a company that rents out servers for applications like this. In Flask every page has a ready-made skeleton, which the server fills with data before sending it to the browser. To begin with, a handful of these skeletons was enough (the home page, the offer, contact, the calendar and the booking form), plus a file describing how the site looks and a few images. Bookings, user accounts, holidays and settings sat in plain text files next to the code, which would come back to bite me later.
There was an admin panel from the very start, because someone had to see the bookings, block out times and reply to messages. The price list did not live in the database but in a settings file: at first lesson lengths and prices, later also discounted packages and instalments. To change a price, I edited the file and uploaded the whole site to the server again. At the time it seemed like a sensible simplification, and for a while it really was one.
A short attempt at PHP
The first serious problem was not about the application itself but about where it should run. The cheapest servers, the kind people usually rent for a company website, are set up for PHP, a different programming language, not for Python, the language I had written Algebra in. So I figured that since the server was built for PHP, I would rewrite the application for the server.
In mid-September I moved the whole site into a new PHP project, but after a few days I dropped the idea and went back to Flask. Instead of fitting a working application to the server, I looked for a server that would take the application as it was. The lesson from this episode is simple: choosing a server is part of the project, not a formality at the very end.
Render, Koyeb and two days of trial and error
In October I tidied up the Flask version in a new project, and on 26 October 2025 I created the one on GitHub that I still work in today. From the start it contained instructions for Render, which builds and runs the application straight from the code by itself. I chose the free plan and a server in Frankfurt, and the application got its own web address.
Before everything got going, though, I spent two days bouncing between Render and Koyeb, a very similar service. I first added the file that tells the server how to start the application, then removed it because Koyeb was supposed to recognise Flask by itself, and finally added it back again. I also had to match the number of the door the application waits behind, because the server, checking whether it was alive, knocked on 8000 while it was waiting elsewhere. On top of that, the cookies that let a site remember who is logged in had to be set differently on the server than on my own computer. In the end Render won, and that is where Algebra runs today.
One day with the header
18 November deserves a chapter of its own, because the history of changes shows more than twenty fixes to the header alone on that day, meaning the bar with the menu at the top of the page. On a phone the menu broke into two lines, the buttons sat in a staircase, and the drop-down menu (the three-line icon) behaved differently for visitors than in the admin panel. Every fix repaired something and broke something else, until in the end I reverted all the changes to where things stood that morning and started over, this time copying the header from the admin panel, which worked fine.
The lesson from that day comes in handy on every project: when fixes start going round in circles, it is better to go back to the last good state and make one well-thought-out change than to keep patching the patches.
The first payments
Back in October I connected Algebra to Stripe, a company that handles online payments, and that is where I first understood how such a payment actually works. The customer goes to the payment operator's page, pays and comes back to my site, while the operator separately sends my server a message saying the money has arrived. After a few days, though, I switched to HotPay, and the site's terms and conditions gained a clause about the new payment operator. In November came instalments and discounted packages, and with them the first fix in the price list file, because a file like that does not forgive even one misplaced comma, and the site then stops understanding it.
Where I am today
Three months after the first version of the code, Algebra has a website, a calendar, bookings, an admin panel and payments. What gives me the most trouble now is the database, because bookings can disappear after I upload a new version of the site. I am looking for the cause, and once I find it I will write about it in a separate post.
The whole series
This post opens a series about how Algebra i Spółka came to be:
- The first Algebra: Flask, templates and the PHP I quickly gave up on
- Bookings that disappeared with every deployment
- Algebra from scratch: from Flask templates to React and TypeScript
- A price list in a file, Premium and my first payment gateway
- Tasks, a formula sheet and drawings that would not add up
I describe what the whole thing looks like today in the post Algebra i Spółka from the inside.

