Willow
Jul 2023One 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.