Bots, so many Bots

ProductHunt has over 1 million user signups. More than 60% of those are bots. How it started. I’ve used ProductHunt since early 2014. Besides Hacker News, it was a good way to see the latest product l…

Read more

Building a Background Task Queue in Python

Why not just use Celery/RQ/Huey/TaskTiger?. Unfortunately, WakaTime has been using Celery for almost 10 years now. During that time I’ve experienced many critical bugs, some still open years after bei…

Read more

The End of Atom

Today GitHub announced it will archive Atom and all projects under the Atom organization for an official sunset on December 15, 2022. Why?. Development on Atom has been slowing for a while now. We see…

Read more

Go Desperately Needs Nil Safe Types

If you’ve worked with Go before, you’ve probably seen this runtime error. panic: runtime error: invalid memory address or nil pointer dereference The current solution is checking thevar != nil before …

Read more

Maximize your concurrent web server connections

For production web servers, most people assume scaling means needing faster (and more expensive) hardware. Before spending more money on servers, first make sure your web server process is using the m…

Read more

Latency of DigitalOcean Spaces vs AWS S3

WakaTime’s infra is split across DigitalOcean and AWS. We use DigitalOcean Droplets for compute resources, AWS S3 to store code stats, and DigitalOcean Spaces for backups. You can find more info on th…

Read more

Using a disk-based Redis clone to reduce AWS S3 bill

Redis is an in-memory database with very high write and read speed, and a limitation that data sets can’t be larger than available RAM. It’s like memcached but supports data structures instead of just…

Read more

How to Automate Responding to GDPR Data Removal Request Emails

Do you receive emails from your website users with the subject “Data Removal Request” that look like this? I hereby withdraw my consent for you to collect, process or store any personal data related t…

Read more

Flask Part 3: API Decorators and Helpers

This is the third of three posts about building a JSON API with Flask. Make sure you start with part 1 and part 2. In the first post, we used a custom base SQLAlchemy class to serialize and deserializ…

Read more

Flask Part 2: Building a RESTful API

This is the second of three posts about building a JSON API with Flask. Part 1 arrived yesterday and part 3 is arriving tomorrow. In the previous post we learned how to serialize SQLAlchemy models to/…

Read more