
From Zero to Production: A Complete Python Setup Guide
You've got a brilliant Python project idea. You create a file called main.py, and start coding. Fast forward six months: your script has grown into multiple files, dependencies, and contributors. Now you're drowning in errors and deployment headaches. Most Python projects start this way, but they don't have to. By setting a strong foundation, you save headaches and plan for project success.

Hands-On CI: Building Your First GitHub Actions Workflow
We have previously talked about why Continuous Integration is a powerful DevOps concept for helping your team develop high-quality code faster. Today we are taking you through a deep-dive into the “how,” with step-by-step instructions for setting up a linting pipeline in GitHub Actions. We’ll explain how and why CI workflows can take your team to the next level!

Legacy Code: Defuse the Time Bomb
Legacy code that doesn’t measure up to your linting or formatting standards can lie dormant for months and then explode into a crisis. Tackling these hidden hazards isn’t just a nice-to-have, it’s essential for keeping your software delivery engine humming. In this post we’ll walk through the ways that outdated legacy code can bring your team to a halt, and show you how Zumbro, our GitHub App, offers a fast and straightforward way to get control of your legacy mess.

A Surprising Secret About Python Linters
It sounds crazy: you run your linter, fix the issues, run it again… and suddenly it finds more issues. Wait, what?
Yes, it’s a real thing. Depending on the complexity of your code and the tools you’re using, sometimes one pass isn’t enough to get a clean bill of health. But don’t worry, there’s a simple fix: run your linters twice!

Why Linters Hate Unused Imports
If you’ve been writing Python code for long, you’ve run into one of the many tools that want to clean up your files. And you’ve probably noticed that they all want to delete unused imports. This might seem a little nitpicky, but there are good reasons to nuke unused imports. And while it starts with clean code, the reasons don’t end there.

How Code Reviews Should Work
The best code reviews feel like collaboration, not judgment. They’re an opportunity to ask questions, learn, and improve as a team. When the small stuff is already taken care of, there’s space for that conversation to happen. Caparra is building tools to make this easier for your team.

Python Linter Showdown
Python Linter Showdown! It’s time for a spirited comparison of four popular Python linters: black, flake8, pylint, and ruff. Each tool promises to tidy up your code, catch pesky bugs, and keep your scripts neat. Our contestants today will face off on three files containing some not-so-great Python. Get ready to witness our code-based house of horror!

Clean Commits from the Start with pre-commit
Have you ever run git commit, only to realize later that you forgot to fix a small error? If so, you know that tiny missteps can quickly add up to big hassles for your entire team. That is why a simple tool called pre-commit can be so helpful. It automatically runs checks, linters, and other automated routines right before you commit your code.

Sort It Out: How isort Makes Python Better
When working with Python, keeping your code clean and organized is essential. You may have heard of isort, a handy tool that automatically sorts your Python imports. Keeping your import statements sorted is a simple step that is deceptively powerful, and we’ll talk about how adding isort to your Python workflows can save you hours and hours of time debugging your code. If only every part of coding was this easy!

Intro to Linters in Python: Clean and Bug-Free Code
Writing clean, error-free code is a lot easier when you have a little help. That’s where linters come in. In this post, we’ll introduce you to linters for Python, and walk through what they are, how to use them, where they came from, and why they’re so useful. We’ll also show a simple Python linting example, and cover how to integrate linters into different environments, from your local editor to CI/CD pipelines. Finally, we’ll recommend the best Python linter for beginners. Let’s get started!