Managing tasks gets messy when everything depends on remembering what needs to be done. Today, I ...Managing tasks gets messy when everything depends on remembering what needs to be done. Today, I ...
The network for creativity
Join 1.25M professional creatives like you
Connect with clients, get discovered, and run your business 100% commission-free
Creatives on Contra have earned over $150M and we are just getting started
Managing tasks gets messy when everything depends on remembering what needs to be done.
Today, I built a lightweight Task Manager API with FastAPI to make that process more organized. It can create, update, complete, search, filter, sort, paginate, and delete tasks.
What I enjoyed most wasn't just building the endpoints—it was testing the system, finding a real bug, understanding why it happened, and fixing it.
Another small step toward building backend systems that solve real problems.
Malware in a WordPress backup, disguised as a photo
A client wanted me to restore a WordPress site from a zip backup and asked for one thing before paying: a screenshot of the site running on my own computer, with localhost in the address bar.
Loading a WordPress site runs its PHP on whatever machine serves it. So I read the zip with a script first and didn't extract it.
WordPress core matched the official checksums. In wp-content/mu-plugins, though, there was a file that looked for a 4.6 MB "JPEG" in uploads, renamed it to .exe and tried nine ways to launch it. The first two bytes of that "JPEG" were MZ, which is how a Windows executable starts. Opening localhost for the screenshot would have been enough to run it.
My first script missed it because it trusted file extensions. Now it reads the first bytes of every file.
The MZ check is such a good catch. Worth adding for anyone restoring sites: mu-plugins run on every request and can't be switched off from the dashboard, so they're a favourite hiding spot. Did the client ever reply after you flagged it?
Logging every cleaning action is the part I like most: when a number in the report looks strange, you can follow it back to the fix that changed it. With 585 issues, how did you decide which ones the script fixes alone and which ones it only reports?