Whether a project becomes a clean, stable build or a messy spaghetti mountain often depends not just on code quality — but on workflow and tools.
A good tool can automate repetitive chaos, clarify complex processes, and keep your project clean and healthy.
Today, I’m not talking about well-known libraries like Requests or Pandas.
Instead, I’ll share some lesser-known yet powerful tools that have genuinely improved my workflow and developer experience.
🧰 ServBay — The All-in-One Local Dev Environment Manager
Ever got headaches from managing multiple Python environments?
One project needs Python 3.8, another wants 3.11, and that legacy one still runs 2.7.
You can use pyenv
, virtualenv
, and conda
together… but it’s messy.
Then I found ServBay — and those problems vanished. It solves a ton of pain points:
Multiple Python versions, cleanly isolated:
I can install Python 2.7 to 3.14 with one click, each version sandboxed and tidy. Switching between projects is effortless.One-stop services:
It’s more than a Python manager — it includes Nginx, MariaDB, MySQL, Redis, and more.
I just open one control panel and start what I need.Run local AI models easily:
Need to test open-source models like Qwen 3 locally? Just install and run in ServBay — no environment chaos.
In short: ServBay unified my entire local dev setup — Python versions, databases, and even AI models — all in one place.
⚙️ Doit — Goodbye, Messy Makefiles
Every project has tasks like formatting code, running tests, or packaging builds.
I used to juggle shell scripts and Makefiles… until I met Doit.
It lets you define and run automation tasks in pure Python.
Example setup (file: dodo.py
):
def task_format():
"""Format code"""
return { 'actions': ['ruff check . --fix'] }
def task_test():
"""Run tests after formatting"""
return { 'actions': ['pytest -q'], 'task_dep': ['format'] }
Then just run doit
in your terminal — it handles dependencies and runs what’s needed.
In short: It replaced my scattered scripts with something cleaner and more Pythonic.
🧪 Playwright — The Modern Web Automation Powerhouse
I used Selenium for years for web automation and scraping.
But since switching to Playwright, my workflow feels like jumping from a bicycle to a sports car.
Example:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto("https://www.google.com")
page.screenshot(path="google.png")
browser.close()
In short: Playwright is faster, more reliable, and async-friendly — my go-to for web automation now.
🧩 pyinfra — Deploy Servers with Python Code
Many use Ansible for server automation, but writing YAML for complex logic gets painful.
pyinfra fixes that by letting you use plain Python to describe infrastructure.
Example:
from pyinfra import host
from pyinfra.operations import server, files
server.user(name="Create app user", user="app", home="/home/app")
files.sync(name="Sync app files", src="dist/app/", dest="/opt/app/")
In short: If you’d rather code than configure, pyinfra is a dream come true.
🖥️ Rio — Build Terminal UI Like a Frontend Dev
Sometimes, I want my CLI tools to look better than just text prompts.
Rio feels like React but for terminal apps — declarative, component-based, and fun.
Example:
import rio
class MyAppComponent(rio.Component):
def build(self) -> rio.Component:
return rio.Column(
rio.Text("Hello, World!", style="heading1"),
rio.Button("Click Me!", on_press=lambda: print("Clicked!")),
)
app = rio.App(build=MyAppComponent)
app.run()
In short: A React-style framework for building beautiful terminal apps. I love its design philosophy.
🪟 FreeSimpleGUI — Add a Simple GUI to Scripts in Minutes
Sometimes your non-technical users just can’t handle command lines.
But building a Qt or Tkinter app for a small tool is overkill.
FreeSimpleGUI fills that gap perfectly.
Example:
import FreeSimpleGUI as sg
layout = [
[sg.Text("Enter your name")],
[sg.InputText(key='-INPUT-')],
[sg.Button('OK'), sg.Button('Cancel')]
]
window = sg.Window('Simple Window', layout)
while True:
event, values = window.read()
if event in (sg.WIN_CLOSED, 'Cancel'):
break
print(f'Hello, {values["-INPUT-"]}!')
window.close()
In short: Great for quick, user-friendly interfaces with minimal effort.
🔥 py-spy — Zero-Overhead Python Profiler
When your Python app suddenly consumes 100% CPU or slows to a crawl,
py-spy is the hero you want.
It attaches to a running process without changing your code or restarting anything.
Commands:
py-spy top --pid 12345
py-spy record -o profile.svg --pid 12345
In short: It’s my go-to for production performance debugging — simple, powerful, and safe.
⚡ watchfiles — Super-Fast File Watching and Auto-Reload
Ever wished your app would auto-reload after code changes?
watchfiles, written in Rust, does that blazingly fast.
Example:
from watchfiles import watch
from subprocess import run
for changes in watch('./src', watch_filter=lambda c, f: f.endswith('.py')):
print("File changed:", changes)
run(["pytest", "-q"])
In short: I use it to re-run tests or reload services automatically — huge productivity boost.
🕸️ BeautifulSoup — The Classic HTML Parser
It’s old but gold.
For web scraping and HTML parsing, BeautifulSoup remains one of the easiest tools ever.
Example:
from bs4 import BeautifulSoup
html_doc = """
The Dormouse's story
"""
soup = BeautifulSoup(html_doc, 'html.parser')
print(soup.title.string) # Output: A Story
In short: Still my favorite when extracting data from messy HTML.
Final Thoughts
I hope some of these tools find their way into your daily workflow.
A great tool isn’t the most complex one — it’s the one that solves your problem elegantly.
And if you’re still juggling local environments, databases, and AI setups,
take a look at ServBay — it might become your new favorite companion for development.
Top comments (0)