Category: Philosophy

  • Using AI Without Letting It Wreck Your Codebase

    AI tools like Cursor, Copilot, and others are getting really good. There’s no question they can speed things up, and I have no qualms with admitting to our usage of them as a development tool.

    But there’s a catch we ran into pretty quickly:

    If your system isn’t well-defined, AI will make it worse, not better.

    So before leaning on AI for real development work in BakBeat, we put a few guardrails in place. Nothing fancy, just structure. The result has been a pretty dramatic speed increase (easily 3–5x in some areas) without losing control of the codebase.

    Here’s the high-level approach.

    The Problem With “Just Let AI Build It”

    AI is great at generating code that looks correct. But in a real project, that’s not enough.

    Without structure, you start to see:
    – multiple ways of doing the same thing
    – logic split across layers (UI vs data vs services)
    – features that exist but aren’t clearly defined anywhere
    – subtle inconsistencies that compound over time

    AI isn’t doing anything wrong—it just doesn’t know which version of your system is “the right one.”

    So the goal becomes:
    > Make the system clear enough that AI doesn’t have to guess.

    What We Put In Place

    We didn’t try to control AI directly. Instead, we made the system easier to navigate and harder to misuse.

    1. A Clear Command Surface (CLI-First)

    Every feature in BakBeat is exposed through a CLI command.

    That gives us:
    – a single place to define behavior
    – a consistent interface across the system
    – something both humans and AI can rely on

    If something can’t be triggered from the CLI, it’s not considered complete.

    2. A Self-Updating Command Index

    We maintain a generated index of all CLI commands, including:
    – what each command does
    – where it’s implemented
    – where it’s tested

    This index updates automatically on every commit.

    That means:
    – no stale documentation
    – no guessing where things live
    – a reliable map of the system at any point in time

    3. Explicit, Inspectable State

    Where it makes sense, we prefer:
    – deterministic data
    – inspectable formats (like JSON)
    – derived indexes instead of hidden state

    This keeps behavior understandable and rebuildable, which is important when multiple tools (including AI) are interacting with the system.

    4. AI Works Within the System

    Instead of asking AI to “figure things out,” we give it:
    – a defined command surface
    – a current index of capabilities
    – consistent patterns to follow

    So it doesn’t explore—it navigates.

    That alone removes a lot of wasted time.

    The Development Loop

    Once everything is wired together, development becomes very straightforward:

    1. Define the behavior
    2. Expose it through the CLI
    3. Let the index update
    4. Use that structure to implement and test

    Because everything is connected, there’s less room for drift.

    What We Avoid

    A few simple rules make a big difference:

    – No UI-only behavior (UI reflects the CLI, not the other way around)
    – No undocumented features
    – No “temporary” patterns that don’t match the rest of the system

    These aren’t strict for the sake of it—they’re what keep the system predictable.

    What Changed

    After putting this in place, the difference was immediate:

    – Much faster navigation through the codebase
    – Less time spent figuring out “where things are”
    – More consistent implementations
    – AI suggestions that actually line up with the system

    In one recent pass, we closed about half of our remaining audio playback gaps in a single day.

    The speed didn’t come from AI alone—it came from reducing ambiguity.

    The Takeaway

    If you’re using AI in your development workflow, the most important thing isn’t the tool—it’s the structure around it.

    > AI doesn’t need perfect instructions.
    > It needs a system that’s easy to understand.

    Once you have that, it stops guessing and starts helping.

    We’ll share more as BakBeat continues to evolve, especially as we move into device sync and hardware workflows. That’s where this approach will really get tested.

    For now, this has been one of the most impactful changes we’ve made.

  • What’s Taking So Long?

    There’s a recurring question I get whenever I show early progress on BakBeat:

    “Why is this taking so long?”

     “Isn’t it just a music sync app?”

    That question usually comes from a good place. But it assumes something BakBeat is very deliberately not.

    BakBeat is not built on novelty.

    It’s built on legibility.

    And that choice has consequences.

    ________________________________

    Modern software is fast because it ignores reality

    Most modern apps move quickly by doing at least one of the following:

    – hiding the filesystem
    – outsourcing state to the cloud
    – assuming perfect connectivity
    – assuming users never need to understand what happened
    – assuming devices are disposable

    That works great… until it doesn’t.

    When it breaks, you’re no longer debugging a system — you’re negotiating with a ghost.

    I’ve spent my career cleaning up those ghosts.

    BakBeat exists because I don’t want that experience anywhere near something as personal as a music library.

    _______________________

    BakBeat is built like old systems were

    Not because they were nostalgic.

    Because they were honest.

    – Files lived in folders with names that meant something
    – Devices mounted as volumes
    – State was visible
    – Failure modes were explainable

    If you saved a document, it went into Documents.

    You knew where it was because the system told you the truth.

    That kind of design doesn’t come for free anymore.

    ___________________
    Lateral thinking with withered technology

    Gunpei Yokoi — the mind behind Nintendo’s Game & Watch and the Game Boy — described his philosophy as:

    “Lateral thinking with withered technology.”

    Use mature, well-understood components.

    Design around their limits.

    Make systems that survive real life.

    BakBeat follows that same principle:

    – old devices
    – old filesystems
    – old formats

    but with modern understanding and care.

    The hard part isn’t copying music.

    The hard part is not lying about what’s happening.
    _______________________

    Why this takes time

    BakBeat doesn’t assume:

    – one operating system
    – one filesystem
    – one device behavior
    – one happy path

    It has to respect:

    – FAT quirks
    – flaky USB devices
    – weird firmware assumptions
    – decades of accumulated edge cases

    That means:

    – writing tests before UI
    – verifying behavior on real hardware
    – refusing “close enough” solutions
    – rebuilding boring foundations correctly

    It’s slower up front.

    It’s faster for the next ten years.
    ______________________

    This is not a startup app

    BakBeat is not optimized for:

    – growth charts
    – feature velocity
    – demo polish
    – “just ship it”

    It’s optimized for:

    – trust
    – durability
    – explainability
    – and not waking you up at 2am wondering where your music went

    That’s why it’s not built in a day.

    And that’s why it will still work long after trend-driven software has moved on.
    ____________________

    If this resonates

    You’re probably someone who:

    – likes knowing where files live
    – doesn’t trust magic sync
    – still owns hardware older than most apps
    – wants systems that respect your time and data

    You’re who BakBeat is for.

    And if this sounds slow, overbuilt, or unnecessary — that’s okay too.

    There are plenty of modern apps that move fast by assuming less.

    BakBeat just isn’t one of them.