Developer Experience Baseline for Solo Polyglot Development

12 min read

Note: these articles are auto generated from my Obsidian notebook by Claude

Modern DX tooling in 2025 favors unified, high-performance solutions over traditional tool stacks. For solo developers working with Python, JavaScript/TypeScript, and Rust, discover how Ruff + Pyright + Biome.js provides the optimal balance of performance, simplicity, and comprehensive coverage.

Executive Summary

For a solo developer working primarily with Python, JavaScript/TypeScript, and Rust, Ruff + Pyright + Biome.js provides the optimal balance of performance, simplicity, and comprehensive coverage. This baseline enables a "gentle introduction" approach with permissive initial settings that progressively tighten as habits form.

Tool Selection Matrix

Python Development Stack

Linting/Formatting: Ruff (unanimous winner)

  • 10-100x faster than Black+isort+flake8 combined
  • Single tool replaces 6+ traditional tools
  • Drop-in Black compatibility (>99.9%)
  • Zero configuration with sensible defaults

Type Checking: Pyright (for solo developers)

  • 3-5x faster than mypy on large codebases
  • Superior type inference without annotations
  • Native VS Code integration via Pylance
  • Switch to mypy only if heavy Pydantic usage requires plugin features

Testing/Coverage: pytest + coverage.py

  • coverage.py directly (skip pytest-cov wrapper)
  • mutmut for mutation testing on critical modules only
  • Target: 60% → 70% → 80% coverage progression

Security: pip-audit + Semgrep + Gitleaks

  • pip-audit replaces Safety (licensing changes)
  • Semgrep over Bandit for multi-language support
  • Gitleaks for secrets scanning (2-5 seconds overhead)

JavaScript/TypeScript Stack

All-in-One: Biome.js

  • 80% faster than ESLint + Prettier
  • Single configuration file
  • Excellent VS Code integration

Rust Integration

Standard tooling with Python-friendly configs:

  • rustfmt with 88-character line width (matching Black)
  • cargo-watch, cargo-outdated for familiar workflows
  • Maturin for Python-Rust bridges

Progressive Configuration Examples

Stage 1: Minimal Baseline (Week 1)

# pyproject.toml
[tool.ruff]
select = ["F", "E4", "E7", "E9"]  # Critical errors only
line-length = 88
fix = true

# pyrightconfig.json
{
    "typeCheckingMode": "basic",
    "reportMissingImports": "warning"
}
# .pre-commit-config.yaml
repos:
  - repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v4.5.0
    hooks:
      - id: trailing-whitespace
      - id: end-of-file-fixer
      - id: check-yaml
  
  - repo: https://github.com/astral-sh/ruff-pre-commit
    rev: v0.1.8
    hooks:
      - id: ruff
        args: [--fix]
      - id: ruff-format

Time impact: 5-10 seconds per commit

Stage 2: Enhanced Quality (Week 3)

# pyproject.toml additions
[tool.ruff]
select = ["F", "E", "W", "B", "I"]  # Expand rule coverage
ignore = ["E501"]  # Still allow long lines initially

[tool.coverage.run]
source = ["."]
omit = ["*/tests/*", "*/venv/*"]
branch = true

[tool.coverage.report]
fail_under = 70  # Enforce minimum coverage

Add to pre-commit:

  - repo: https://github.com/gitleaks/gitleaks
    rev: v8.22.1
    hooks:
      - id: gitleaks

Stage 3: Production Ready (Week 5+)

[tool.ruff]
select = ["ALL"]
ignore = ["D", "ANN", "TD", "FIX"]  # Skip docs/annotations initially
line-length = 88

[tool.ruff.mccabe]
max-complexity = 10

# biome.json for JS/TS
{
  "linter": {
    "enabled": true,
    "rules": {
      "recommended": true,
      "complexity": {
        "noExcessiveCognitiveComplexity": "error"
      }
    }
  }
}

Phased Adoption Plan

Week 1-2: Foundation (4 hours setup)

  1. Install Ruff, configure with minimal rules
  2. Set up basic pre-commit hooks
  3. Create pyrightconfig.json with "basic" mode
  4. Target 60% test coverage

Week 3-4: Enhancement (2 hours/week)

  1. Add Gitleaks to pre-commit
  2. Configure pip-audit for weekly runs
  3. Expand Ruff rules gradually
  4. Increase coverage target to 70%

Week 5-6: Optimization (1 hour/week)

  1. Add Biome.js for JS/TS projects
  2. Configure Semgrep with basic Python rules
  3. Set up mutation testing for core modules
  4. Target 80% coverage

Month 2+: Maturity

  1. Enable stricter Ruff rules (complexity, naming)
  2. Add Vulture for dead code detection
  3. Implement full polyglot pre-commit suite
  4. Automate dependency updates

Maintenance Automation

#!/bin/bash
# weekly-maintenance.sh
pip-audit --fix
pip-review --auto
pre-commit autoupdate
ruff check . --fix
coverage report --fail-under=80

Documentation Standards

Use this minimal structure:

project/
├── README.md          # Quick start, badges, structure
├── CONTRIBUTING.md    # Dev setup, style guide
├── .github/
│   └── ISSUE_TEMPLATE/
└── docs/
    └── decisions/     # Architecture Decision Records

Risk Mitigation

Tool Lock-in: Pin tool versions in requirements-dev.txt

ruff==0.1.8
pyright==1.1.339
biome==1.5.0

False Positives: Start with permissive configs, use inline suppressions:

# ruff: noqa: F401  # Temporary import for side effects

Performance Degradation: Monitor pre-commit times:

# Skip expensive hooks when needed
SKIP=mypy,pytest git commit -m "hotfix"

Migration Fatigue: Adopt one tool at a time, allow 2 weeks per tool for habit formation.

The Bottom Line

This baseline provides enterprise-grade quality with minimal overhead. The key is progressive adoption: start with Ruff's speed and simplicity, gradually add type checking and security scanning, then expand to polyglot tooling. Total time investment: 8-10 hours over 6 weeks, with 30-60 minutes weekly maintenance thereafter. The unified toolchain approach (Ruff + Biome) reduces context switching and configuration complexity, making it ideal for solo developers who need professional results without dedicated DevOps resources.

This article was generated with the assistance of AI and carefully reviewed by our editorial team.