Articles on Python · Rust · AI

  • Database-Driven RBAC with FastAPI and Azure Entra ID

    This came out of a coaching project: a FastAPI service backing a geotechnical database. We use Azure Entra ID for authentication, but we needed role-based access control (RBAC) granularly per endpoint and across different user roles. It turned into an interesting sprint where we designed it so that role changes did not require code changes.

  • 5 design patterns used in my new habit tracker app

    There are plenty of habit trackers, but I wanted to build mine with constraints, a calendar view and habit streaks. So I built commitgraph: a small Django + HTMX app. Here are five Python design and testing patterns from building it.

  • Why does Alembic need an import you never use?

    A coaching session this week surfaced a good question: Alembic autogenerate only works if you import your models first, even though you never reference them.

    Ruff flags the import as unused.

    So why is it there?

  • Unsubscribe links without a login: Django signing

    Django has a signing module that makes it easy to build an unsubscribe link that works with no login and no session: token = signing.dumps(recipient.pk, salt=UNSUBSCRIBE_SALT). The token itself is the credential, and it ships with Django out of the box.

  • Guardrails Protect Your Codebase. What Protects Your Judgment?

    Cal Newport's On AI Coding and Its Discontents lands on an uncomfortable point: the speed AI gives you is paid for with the thinking that made us good engineers in the first place.

    Read code instead of writing it and you get passive recognition where you used to have an active model of the code.

  • Learning New Skills in the AI Era (vBrownBag)

    I joined the vBrownBag podcast with Damian to talk about how to actually learn a new language or skill when an agent can write the code before you finish typing the prompt.

  • Rust, AI, and the Developer Mindset (Develpreneur Podcast)

    I joined the Develpreneur podcast with Jim Hodapp to talk about the Rust developer mindset and what makes Rust a good fit for AI-assisted work.

  • Judgment: The Skill AI Can't Give You

    Every time I hear the phrase coding is solved, I worry about where this industry is heading. Yes, AI writes the code, you review it, ship it, move on. Is there still value in writing the code yourself and going deep into the problem? Yes, and I think it matters more than ever.

  • One Core, Two Interfaces, No Rewrites

    When building applications, I always build the core first, then the interfaces. It was no different with Ask the Canon: a uv run main.py ask "..." CLI for quick iteration and validation, then the web app for MVP. Search, ranking, citations, all using the same engine.

  • Ask the Canon: Semantic Search Without a Vector Database

    I built out askthecanon.com this weekend, a semantic search over 100 public-domain books (from the Gutenberg project). You ask a question in plain language and get the passages that mean that, cited by author, title, and chapter. I wanted a local, no-generative-AI solution: a retrieval engine using Hugging Face embeddings and NumPy that returns original passages, no full vector database (yet), no API calls at query time.

Notes on Python, Rust, and AI for developers who value deep work over shallow trends.

Read the newsletter →