1. Capture Your Current Workflow with a CLI Stopwatch
The cheapest, most reliable way to see where your time disappears is to log it with a command‑line stopwatch. hyperfine is a benchmark tool that can also be repurposed as a lightweight timer.
# Install hyperfine (macOS / Linux)
brew install hyperfine # Homebrew
# or
sudo apt-get install hyperfine
# Start a timer for a task (e.g., "process invoices")
hyperfine --warmup 0 --export-json invoice-timer.json "sleep 0"
Replace the sleep 0 placeholder with the actual command you run (or wrap a shell script that performs the step). Run this each time you start the task and stop it when you finish. After a week of data, parse the JSON files:
jq -s 'map(.mean) | add / length' *.json
The average seconds per run give you a concrete metric to compare tasks. If a task repeatedly takes more than 5 minutes and you perform it at least 3 times per week, it becomes a strong candidate for automation.
2. Normalize the Data into a CSV for Easy Ranking
Once you have the raw timings, bring them together in a spreadsheet‑friendly format. csvkit works everywhere and handles edge cases like commas in task names.
# Install csvkit
pip install csvkit
# Convert all JSON logs into a single CSV
jq -r '[.command, .mean] | @csv' *.json > raw.csv
csvcut -c 1,2 raw.csv > timings.csv
Open timings.csv in your favorite editor and add two extra columns:
| task | avg_seconds | frequency_per_week | automation_score |
|---|---|---|---|
| (fill) | (from CSV) | (estimate) | = (avg_seconds * frequency_per_week) |
Sort by automation_score descending. The top three rows are your initial automation targets.
3. Validate the Candidates with a Small Scripted Prototype
Before you invest in a full‑blown pipeline, write a proof‑of‑concept using the same language you already use for other business scripts (Python is a safe bet). The prototype should:
- Accept the same inputs as the manual process.
- Perform the core transformation.
- Output a result in the format you currently use (CSV, JSON, PDF, etc.).
Below is a minimal example that automates "exporting sales data from a Google Sheet to a local CSV" using the gspread library.
import os
import gspread
from oauth2client.service_account import ServiceAccountCredentials
# 1️⃣ Set up the Google Sheets API credentials (service account JSON file)
scope = ["https://spreadsheets.google.com/feeds", "https://www.googleapis.com/auth/drive"]
creds = ServiceAccountCredentials.from_json_keyfile_name(os.getenv("GS_CREDS"), scope)
client = gspread.authorize(creds)
# 2️⃣ Open the sheet and fetch all records
sheet = client.open("Sales Data").worksheet("2024 Q1")
records = sheet.get_all_records()
# 3️⃣ Write to a local CSV (same layout you currently copy‑paste)
import csv
with open("sales_q1.csv", "w", newline="") as f:
writer = csv.DictWriter(f, fieldnames=records[0].keys())
writer.writeheader()
writer.writerows(records)
print("✅ Export complete: sales_q1.csv")
Run the script with python export_sales.py. If it finishes in seconds where the manual copy‑paste took minutes, you have a clear win.
4. Pitfalls to Watch Out For
| Pitfall | Why It Happens | Mitigation |
|---|---|---|
| Missing error handling | A one‑off script may crash on an empty row, stopping the whole pipeline. | Wrap each external call in try/except and log failures to a separate file. |
| Webhooks delivering duplicate events | Most webhook providers guarantee at least once delivery, so the same event can arrive twice. | Deduplicate by storing a hash of the payload (sha256) and skipping if it already exists. |
| Containerised tools on macOS can't use the Apple GPU | Docker Desktop, Colima, and OrbStack run containers in a Linux VM, which has no access to Metal. | If your automation needs GPU (e.g., image generation), run the code natively on macOS or use a cloud VM with CUDA. |
| Quantised models still need RAM | A 7‑8B model quantised to Q4_K_M is ~5 GB, but inference still needs ~8‑10 GB RAM on a laptop. | Test the model on a small sample first; if RAM is insufficient, fall back to a lighter model or run inference as a remote service. |
5. Automate the Audit Itself (Optional Bonus)
If you plan to repeat this exercise quarterly, you can automate the entire audit pipeline:
- Cron job that runs the stopwatch wrapper for a predefined list of tasks.
- GitHub Action that aggregates the JSON logs, computes the CSV, and posts the top three scores to a Slack channel via an incoming webhook.
- n8n (or any open‑source workflow engine) to trigger the next‑step scripts when a score exceeds a threshold.
Because webhooks are at least once, make your n8n flow idempotent: add a Unique ID node that checks a Redis cache before proceeding.
By turning a vague feeling of “busy work” into hard numbers, you can pinpoint the first three tasks that give the biggest ROI when automated. The process is fully reproducible, uses only free CLI tools, and can be scaled as your business grows.
Want the complete, tested version? I wrote it up as a step-by-step guide: https://coldriver8.gumroad.com/l/solo-operator-os.
Not sure what to automate first? Try the free 5-minute AI Automation Audit.
This article was drafted with AI assistance.
Top comments (0)