Automating the Boring Stuff: When Forgetting to Push Becomes a Thing of the Past
đ ď¸ Time for an Engineerâs Side Quest!
Welcome to the behind-the-scenes labâwhere I share the practical, messy, and sometimes hilarious realities of building this project.
If you landed here after reading my two-part mini-series, Shipping a Blog with Real DevOps (Part 1) and Part 2, welcome to the bonus round. This is where I dig a little deeper into the automation detailsâjust the kind of stuff that makes an engineerâs life easier (and maybe a bit more fun).
You know that sinking feeling when you turn off your computer, walk away, and suddenly remember: “Did I push my latest blog post? What about those notes from this morning?” Yeah, I’ve been there. Too many times.
It’s the kind of small friction that seems trivial until it isn’t. You’re working on something importantâmaybe a new blog post, project documentation, or just daily notes in Obsidianâand you forget to commit and push. Then your machine is off, you’re away from your desk, and that nagging thought lingers: “Is my work actually backed up?”

âď¸ Yes, thatâs a right hand on a left armâAI art is wild sometimes đ
The Problem: Manual Backups Are Easy to Forget
Here’s the thing about manual processes: they work great until they don’t. You tell yourself, “I’ll just remember to push before shutting down.” And most days, you do. But then life happensâyou’re in a hurry, distracted, tiredâand suddenly your latest work is sitting unsynced on a machine that’s already off.
For me, this started as a very specific problem: keeping my daily blog work committed and backed up without manual intervention. I was writing posts, tweaking layouts, updating contentâall tracked in gitâbut I kept forgetting to push at the end of the day. One too many “oh no, did I commit that draft?” moments convinced me there had to be a better way.
But once I had the solution working for the blog, I realized the same friction existed everywhere. Tech notes backed up in GitHub repos, project documentation, configuration files scattered across repositoriesâeach one technically backed up… if I remembered to push. But relying on memory for something this routine? That’s a recipe for eventual failure. Good engineering means removing unnecessary friction, even in your personal workflows.
The Solution: A Tool That Does It for You
So I built sync-reposâa small Bash script that automatically commits and pushes changes in all your git repositories before your computer shuts down. No intervention, no remembering, no panic. You configure which directories to scan, and the tool handles the rest.
The script is dead simple by design. It scans specified folders for git repositories, checks if there are uncommitted changes or unpushed commits, and takes care of them with timestamped commit messages. If there’s nothing to do, it stays silent. If there’s work to sync, it logs what it’s doing and moves on.
But here’s the clever part: it runs as a systemd service triggered before shutdown. That means every time you turn off your computer, your work gets automatically backed up. You don’t have to think about it. You don’t have to remember. It just happens.
How It Actually Works
The tool itself is straightforwardâjust a Bash script and a systemd unit file. You install it with a simple make install, configure which directories to watch, and you’re done. From that point on, every shutdown triggers the service, which runs the script, processes your repositories, and pushes everything upstream.
You can also run it manually with sync-repos if you want to force a backup without rebooting, or use --dry-run to see what it would do without actually changing anything. There’s even a --show-logs option to review what’s been backed up recently. It’s designed to be unobtrusive but transparentâyou can ignore it completely, or dig into the details whenever you need them.
The configuration is flexible, too. You can set it up system-wide in /etc/sync-repos/directories or per-user in ~/.config/sync-repos/directories. This makes it easy to use on personal machines or shared environments without stepping on anyone’s toes. And because it’s just a Bash script, it’s easy to tweak if you have specific needs.
Why This Matters for Engineers
This isn’t just about backing up blog posts. It’s about reducing cognitive load. Every manual task you have to remember is a tiny tax on your attention. Over time, those taxes add up. The best engineers I know don’t just write good codeâthey also automate the boring stuff so they can focus on what actually matters.
In the case of sync-repos, the boring stuff is remembering to run git push. It’s trivial in isolation, but when you’re juggling multiple projects, documentation, notes, and a blog, it becomes just one more thing to track. Automating it means one less thing to think about, one less chance for human error, and one more process that just works in the background.
This is also why I find DevOps principles so compelling. It’s not just about deploying web apps or managing infrastructure. It’s about treating your entire workflowâpersonal or professionalâas something that can be made more reliable, more repeatable, and ultimately more humane. Good automation doesn’t replace human judgment; it frees you to use your judgment where it actually counts.
Building for Others, Not Just Yourself
When I first wrote this tool, it was purely selfishâI needed it to keep my blog work backed up daily. But as I started using it for other reposâtech notes, documentation, side projectsâI realized: other people probably have this problem too. So I made sure it was configurable, documented, and easy to install. The README explains everything, there’s a contributing guide for anyone who wants to improve it, and the whole thing is MIT-licensed. If it solves a problem for someone else, great. If not, at least it’s one less thing I have to remember.
The feedback loop is what makes open source rewarding. Someone might suggest a feature, find a bug, or just say “this saved me from losing work.” That’s worth more than perfect code. It’s about solving real problems for real peopleâeven if the problem is as mundane as “I forgot to push again.”
The Bigger Lesson: Automate the Friction
The real takeaway here isn’t about git or systemd or Bash scripts. It’s about recognizing unnecessary friction in your workflow and doing something about it. Maybe for you it’s not git backupsâmaybe it’s repetitive file renames, or deployment steps you keep doing manually, or log files you always forget to rotate.
This automation-first approachâbuilding scripts that handle the boring, error-prone workâbecame the foundation for something bigger. A few weeks later, I’d find myself at a crossroads: chase Kubernetes for resume appeal, or double down on this kind of repeatable, well-tested automation. But that decision, and what it taught me about production engineering maturity, is a story for a future post.
Whatever it is, always ask yourself: “Could this be automated?” And if the answer is yes, even partially, it’s worth the time investment. The upfront cost of writing a script or configuring a service pays dividends every single time you don’t have to think about it again. That’s the engineer’s mindset: not just solving problems, but removing them entirely when possible.
If you’re curious about the tool, check it out at github.com/jerosanchez/sync-repos. It’s simple, it’s open source, and if it saves you even one “oh crap, did I push that?” moment, it’s done its job. And if you have ideas for improving itâor just want to share your own workflow automation winsâfeedback is always welcome.
For me, this is just one more step in making software engineering less about remembering trivia and more about building things that matter. One less manual task, one more reliable process, one step closer to a workflow that just works.