One consequence of living abroad while having friends and family who are scattered around the world is that you tend to fall out of touch. It also doesn't help that I don't use much social media.
To solve this problem, I built a simple tool that serves only two purposes:
- reminding me to get in touch with people I have not spoken to in a while
- maintaining notes of past conversations
What's under the hood?
Willow employs Flask, a simple Python web framework, and is completely server-side rendered. Contacts and interactions are stored in simple SQLite databases. On the front-end, I use HTML templating with Jinja2, which ships with Flask. The styling is all CSS. The app is hosted on Hetzner Cloud. I used pytest for unit tests and Playwright for website tests. You can check out the source code here.
What did the process look like?
Building the app was a great learning experience. It started as a suggestion from a friend, who had built a similar app for his own use. To start with, I used Appsmith, a low code front-end builder to build a working prototype.
I then started building the app out using Flask and a lot of help from ChatGPT. Initial progress was rapid, but I soon had to resort to hacks that I was ashamed off. I then realized that I needed some code refactoring. When I tried to write some unit tests, I realized that my code wasn't modular enough to test properly.
I started off with some website tests using Playwright and used them as a basis for refactoring my code. I was then able to write unit tests as well. I then proceeded from hurdle to hurdle - from authentication to database to server deployment. All of this was new to me, so I ended up learning a tonne of stuff.
I improved the application in iterations until it had all the features I really wanted. It now has user registration, responsive design and password reset. I hereby consider this project shipped. Feel free to try it out!
What all did I learn?
- Building a dynamic web application from scratch
- How to use Flask to setup a backend server
- Databases (MySQL and SQLite)
- Unit testing with extensive mocks
- Encrypting credentials and user authentication
- Hosting on Hetzner Cloud with Nginx & Gunicorn
- Responsive design with CSS
- Password reset via short-lived tokens
- The merit of using an object oriented design
- How ChatGPT and Github Co-Pilot are paradigm changing tools
A special thanks to my friend, Neil Fernandes, for inspiring this project.