Build log
A year of building in public.
150 engineering posts — Rust, Tauri, audio pipelines, and the unglamorous work of shipping. This is what “local-first” looks like from the inside.
The Second-Paste Bug: A CGEventTap Race That Made Every Recording Paste the Last One
The Bug That Made Whisper Drop the Word "Auto"
Everything That Works in tauri dev But Breaks the Moment You Ship a Real Mac Build
Three Attempts at an Apple Developer Account, and Why the Third One Was Personal
The Bug I Walked Away From Came Back — And Taught Me to Stop Trusting My First Diagnosis
The Day I Broke Working Software to Fix a Log Message
The Third Patch Is a Smell: When to Stop Bandaging a Bug and Rearchitect
A go/no-go framework for the moment every builder hits — when each fix to a bug uncovers a new one, and you have to decide whether you're closing gaps or chasing a design that's wrong. Plus the exact move that saved me from shipping a time bomb: stop, write a PRD, and hand it to a fresh context window.
The Parity Closure Doc: How to Stop Lying to Yourself About What's Actually Shipped
The specific document pattern that separates "the phase plan" (aspirational) from "what's actually done" (reality) — and the practice that catches scope drift in 30 minutes instead of 3 months.
Streaming Transcription: How to Show Live Text as Whisper Produces It (Without Breaking Your Final Result)
The specific bridge from whisper-rs's segment callback to a Tauri event stream to a React hook — with the exact pattern that keeps streaming previews and final results perfectly in sync.
State Machines Beat Boolean Flags: The Rust Enum Pattern That Killed 194 console.logs
The specific structural move that made invalid app states uncompilable — and the migration pattern from "isRecording && !isProcessing && hasResult" to "match state { Idle, Recording, Processing, Done, Error }".
Golden-File Characterization Tests: How to Verify a Port Without a Spec
The specific testing pattern for code you don't fully understand but need to preserve exactly — and the 13-scenario edge-case corpus that caught 4 silent regressions during our port.
When NOT to Rewrite: Why We Kept 1,722 Lines of TypeScript Inside a Rust App
The counterintuitive companion to the rewrite decision. The specific engineering principle that protects you from the second-system effect — and the test that decides what to port vs. what to leave alone.
whisper-rs in Production: Kill the Subprocess, Cache the Model, Delete the Temp Files
The specific architecture move that took transcription from "spawn a CLI, write a WAV, parse JSON" to "in-process, persistent model, direct memory results" — and the gotchas around Metal GPU on Apple Silicon.
From Swift CLI to cpal: How to Replace Platform Subprocess Audio With In-Process Rust
The specific architecture move that eliminated 1,628 lines of Swift, removed subprocess fragility, and made cross-platform audio possible in 600 lines of Rust.
PRD-Driven Development for Solo Builders: Enterprise Discipline Without Enterprise Overhead
The exact frontmatter schema, the audit-block pattern that keeps docs honest, and the 30-minute weekly ritual that stops docs from rotting.
When It's Time to Rewrite: A Solo Builder's Decision Framework (and Why We Picked Rust)
The exact assessment we ran on our Electron + Swift codebase, the eight criteria we scored against, and the rewrite decision rule that says "yes, do it" or "no, stop being romantic about it."
Stop Losing Your Strategy to the Tab Close: A Capture System You Can Stand Up in a Weekend
The exact directory structure, file templates, and mobile workflow that turn 2-hour Claude sessions into compounding strategic infrastructure instead of vanished clarity.
Your Tauri Animation Looks Fine in Chrome and Flashes in the App: The WebKit box-shadow Trap
The exact CSS pattern that breaks in macOS Tauri WebViews — and the `::after` + `opacity` refactor that fixes it without changing the visual effect.
Tauri Tray Icons Look Small on macOS: The 18pt Floor Hidden Inside tray-icon
The exact line in `tray-icon` 0.21.3 that decides your menu-bar icon's displayed size — and the PNG-sizing rule that actually helps once you know it.
From Revert to Recovery: How Simplicity Won the Day
After reverting a "perfect" architectural fix, we shipped a working auto-recovery feature by embracing simplicity and invisible UX
Know When to Hold 'Em, Know When to Fold 'Em: The Art of Reverting
How we spent hours implementing a "perfect" architectural fix, only to revert it all—and why that was the right decision
When Tech Debt Blocks Features: The Dual Audio Path That Almost Killed Auto-Recovery
How a "temporary" architectural compromise became a critical blocker—and why we're fixing it before v1.0 launch
The Risk Assessment Framework: How to Compare Features Before You Build Them
Why we created parallel risk assessments for auto-recovery and live transcription—and how comparing them side-by-side revealed the obvious choice
The Feature Prioritization Framework: When Technical Readiness Isn't Enough
How we decided to ship auto-recovery but delay live transcription—and why UX friction matters more than technical complexity
The Backlog Paradox: Why I Created 38 GitHub Issues I'll Probably Never Do
Moving from markdown files to GitHub Issues taught me that the best backlog management strategy is knowing when NOT to track things
The Security Fix ROI Calculator: When to Fix, When to Ship, When to Accept Risk
How we fixed 19 vulnerabilities in 20 minutes and learned that "zero vulnerabilities" isn't always the right goal
From Zero to Green: Building a Production-Ready GitHub Actions Quality Gate in One Session
How we went from "no CI/CD" to "enterprise-grade quality checks" in 2 hours - and why Dependabot is your secret weapon for staying secure
Anxiety-Driven Development: How to Know When to Fix vs. When to Ship (Without Users Yet)
The fresh perspective advantage: Why taking a break, checking your git state, and using trust as your North Star leads to better technical decisions
Swift Refactoring Patterns: From 180-Line God Function to Testable Components
The exact refactoring patterns that reduced function complexity from 39 to 5 while improving testability and maintainability
"I'm Weighing the Risk": A Solo Builder's Framework for Safe Refactoring Decisions
When your tests pass but your CI fails - how to decide between shipping now and refactoring first
From 29 Critical Violations to Zero: The Solo Builder's Safe Refactoring Playbook
How we eliminated 100% of SwiftLint critical violations in 3 hours without breaking a single test - and why this matters for your CI pipeline
Flow State vs. Safety: How We Chose Content Protection Over UX Innovation
December 2024
The Hidden Cost of "Smart" Optimizations: A Real-Time Lesson in Complexity Economics
Or: How I Almost Added 433 Lines of Code to Save 87 Milliseconds
Separating Marketing from Product: Why We Built Our Website as a Separate Repository with Git Submodules
Strategic Architecture Decisions for Solo Builders Who Want Professional Marketing Without Compromising Product Development
116: When Tests Lie and Users Win - A Solo Builder's Guide to Business-Value Testing
December 2024
The Solo Builder's Guide to Safe Tech Debt Cleanup: How to Eliminate Cruft Without Breaking Everything
Posted: June 21, 2025
The Four-Hour Tech Debt Cleanup That Changed Everything
Why solo builders can't afford to skip the unglamorous work that makes everything else possible
The Solo Builder SPF Merge Cheat Sheet: How to Safely Authorize Multiple Email Senders
The Solo Builder Security Mini-Series: Complete Table of Contents
The Solo Builder Security Playbook: How to Stay Safe While Moving Fast
How I Finally Untangled My DNS to Host Email Separately While Keeping My Website Elsewhere
DMARC Maturity Roadmap for Solo Builders: How To Lock Down Your Email Without Breaking It
AI Vendor Data Policy Comparison: What Solo Builders Need to Know
The Solo Builder AI Privacy Checklist (Downloadable Cheat Sheet)
The Solo Builder's AI Privacy Cheat Sheet: How I Decide What To Share With My AI Tools
Environment Cleanup Scripts: A Solo Builder's Sanity Saver
June 17, 2025
When "Zero Dependencies" Meets Reality: The Hidden Costs of Cross-Platform Distribution
Or: How I learned to stop worrying and love Apple Silicon-only releases
Simplicity Wins: The 30-Day Journey to Two Recording Modes
P.S. If you're wondering why this post feels like a weight has been lifted, it's because I literally just deleted 300 lines of unnecessary code. It feels good. You should try it sometime.
The Great Swift CLI Integration Adventure: A Journey Through Silence Detection, Debugging, and Determination
December 12, 2024
When Your MVP Breaks: The Great Silence Detection Heist and Our Chunking Epiphany
Date: January 11, 2025
When Native Beats Third-Party: Replacing SOX with Swift Audio Preprocessing
This post is part of our real-time journey building VoiceCatcher. If you want to follow along with more behind-the-scenes development stories and practical TPM insights, consider supporting us on Patreon. We share the messy middle, not just the polished outcomes.
Why We're Investing 40+ Hours in Core Audio Preprocessing Instead of Quick Fixes
Published: January 11, 2025
Replacing SoX with a Native Swift Audio Engine: Lessons in Async Signal Handling and Integration Architecture
Posted on January 10, 2025
When Your AI Assistant Avoids the Hard Problems (And Gets Called Out for It)
Trust me on this one.
When Test Coverage Saves Your Bacon: How 25 Unit Tests Revealed a Critical Swift Bug
Or: Why I stopped trusting "it works on my machine" and started sleeping better at night
How to Set Up AI for Success: From Integration Guide to Production Code
What complex integration are you avoiding because it would take too long to implement properly? This methodology might make it achievable in an afternoon.
From Zero to Production-Ready Swift in 3 Hours: Why Enterprise Audio Processing Doesn't Require Enterprise Overhead
Building in public, one dependency at a time. What should we tackle next?
How I Replaced a GPL Time Bomb with a Native Swift Submodule
Ditching SoX for Swift: How We Built Our Own Audio Capture Tool (And Why You Should Too)
Published: December 2024
Protecting Critical Algorithms: A Multi-Layer Defense Strategy
December 8, 2024 - Jeremy Goldberg
AI Code Safety: Protecting Your Critical Algorithms While Fixing the Easy Stuff
December 8, 2024 - Jeremy Goldberg
The Real Cost of "Just Install It": What We Learned Building a Zero-Configuration Desktop App
Published: December 2024
The Last Mile: Making Product Decisions When Beta is Breathing Down Your Neck
February 8, 2025
One Ring - I mean, Settings - to Rule Them All: Resolving the Dual Storage Anti-Pattern
Part 2 of "The Tale of Two Settings" - December 7, 2024
The Tale of Two Settings: When Tech Debt Becomes a User Experience Nightmare
December 7, 2024
The Power of AI-Generated Testing Dashboards: From Weeks to Hours
December 7, 2025
Building Sophisticated Transcript Formatting: A Deliberate A/B Testing Approach
December 2024
The TPM's Secret Weapon: Why Problem Decomposition Beats "AI, Fix This"
December 2024
How Questioning My AI Assistant Led to Better Product Decisions (And Why You Should Challenge Every AI Answer)
December 19, 2024
When the "Impossible" Bug Becomes Your Greatest Victory: Fixing VoiceCatcher's Pause Detection
December 2024
The Code Signing Survival Guide for Solo Builders: How to Stop Apple's Gatekeeper from Murdering Your Beta Launch
Or: How I learned to stop worrying and love the notarization process
Don't Reinvent the Wheel: Critical Lessons from Hotkey Troubleshooting with AI
Have you experienced similar challenges with AI over-engineering solutions? I'd love to hear your stories and lessons learned. The key is recognizing that AI's strength in generating new code can also be its weakness when architectural consistency is more important than novelty.
The Last-Mile Feature Problem: How We Added Recording Mode Indicators Without Breaking Anything
Famous last words.
Don't Break What You Love: The Art of Adding Features to Perfect Software
December 15, 2024
When AI Overthinks the Simple Solution: The Live Recording Dashboard That Almost Wasn't
Or: How a Principal Engineer said "wait, why don't we just..." and saved 20 hours of overengineering
The Context Transfer Lifehack: How AI Chat Summaries Saved My Sanity (and 47 Hours This Month)
Facepalm.
When Configuration Tech Debt Nearly Killed Our Audio Pipeline: A Systematic Diagnosis Journey
You know that moment when you're debugging what should be a simple UI discrepancy and suddenly realize your entire application has been running on duct tape and good intentions? That's exactly where we found ourselves last week. What started as "why does the UI show 'enabled' but the test logs show 'false'" turned into a full archaeological expedition through layers of Electron configuration management that would make any senior engineer simultaneously laugh and cry.
From Black Box to Crystal Clear: Building Audio Pipeline Visibility in 3 Hours (Not 3 Weeks)
Want to see this in action? The complete implementation is available in the VoiceCatcher repository, and we're always happy to discuss how this pattern might apply to your specific technical challenges. The time you spend building targeted visibility tools is time you get back tenfold in faster debugging and more confident deployments.
Breakthrough: Solving VoiceCatcher's Paragraph Break Problem with Whisper Timing Data
This improvement represents a 75% reduction in processing complexity while achieving 90% confidence in paragraph break detection. Sometimes less really is more.
Building a Bulletproof Audio Test Suite: How We Moved from "Hope It Works" to "Know It Works"
Some of the best engineering decisions come not from planning, but from that uncomfortable moment when you realize you've been flying blind. For months, I'd been shipping VoiceCatcher updates with a nagging question: "Is the transcription actually getting better or worse?" Sure, I had manual testing—recording myself saying "testing, testing" for the hundredth time. But every time I pushed a code change that touched the audio pipeline, I'd hold my breath and hope nothing broke.
When Your Settings Menu Becomes a Crime Scene: A Tech Debt Detective Story
Building products solo means making these architectural decisions without a team to pressure-test them. Want to follow along as I continue building VoiceCatcher and share more lessons like this? [Join the journey on Patreon](link) - your support helps me keep sharing the messy, honest reality of solo product development.
When Your App Randomly Eats User Data: A Defense-in-Depth Guide for Solo Builders
Originally published: [Date]
Critical Text Loss Bug Fix: Post-Processing Safety Architecture
This bug fix is part of our ongoing commitment to making VoiceCatcher the most reliable voice transcription tool available. No shortcuts, no compromises on data safety.
When Your AI Transcription Eats Your Words: A Debugging Detective Story
"Is there a word limit? It cuts off after the first sentence..."
Verbose Logging: The 15-Minute Feature That Saved My Sanity
Mastering Root Cause Analysis: The Principal Engineer's Framework for Bulletproof Systems
"The database ran out of connections because traffic spiked. We restarted the service. RCA complete."
When AI Insists on Reinventing the Wheel: A Technical Product Manager's Guide to Breaking the Regex Addiction
Or: How I learned to stop worrying and love natural language processing libraries
Technical Product Management vs AI: When to Override Your Smart Assistant
Coming up: How to design AI-assisted development workflows that maintain quality standards without killing momentum.
AI Test Avoidance Anti-Pattern: When Your Assistant Tries to Skip Instead of Fix
Next week I'll dig into another pattern I've noticed: how AI generates bloated code that actively fights against the libraries you're trying to use. Because apparently, teaching AI to play nicely with existing solutions is its own special challenge.
The AI Persistence Problem: When Your Assistant Won't Let Go of Legacy Code
Next week: How to build A/B testing capabilities into AI-assisted development so you can actually measure whether your architectural decisions are improvements or just different complexity.
When AI Code Bloat Fights Your Libraries: The NLP Implementation War
Coming up next: how to detect when AI is persistently ignoring your architectural decisions and what that means for technical leadership in AI-assisted development.
The Complete Guide to VoiceCatcher's Text Enhancement: Making Your Voice Actually Sound Professional
A comprehensive user guide to the intelligent post-processing features that transform raw transcriptions into polished text
Learning to Throw Away Code: The Strategic Discipline Most Developers Never Master
This post is part of my ongoing documentation of lessons learned while building VoiceCatcher, a local voice-to-text application. You can follow the complete development journey in our [project documentation](../README.md).
When to Pause: The TPM Framework for Knowing When You're Spinning Your Wheels
"Am I building what my customers actually need, or am I just building what's technically impressive?"
The Product Insight That Changed Everything: Dogfooding, AI, and the Discovery of Flow State
This blog post was written using VoiceCatcher, naturally. No interruptions, no broken flow state, just pure thought-to-text transformation. The kind of experience every voice tool should provide, but somehow, most don't.
Award-Winning Help System: Tri-Modal UX Transformation
From cramped sidebar chat to revolutionary voice-first help experience
Trust Through Transparency: Designing UX That Never Loses User Data
What trust-building UX patterns have you found effective? I'd love to hear about your own approaches to transparent design.
The Strategic Breakthrough: Post-Processing vs Real-Time Formatting
December 31, 2024 • Jeremy Gould
The 80/20 Rule: Why We Chose Regex Over AI for Text Formatting
What's your experience with choosing proven vs. cutting-edge solutions? I'd love to hear about your own 80/20 engineering decisions.
Building Accessible Software: The Solo Builder's Guide to Real-World Standards
December 28, 2024
From Two Weeks to Two Hours: Building Production-Ready Help Systems in the Age of AI
How AI-assisted development is fundamentally changing what's possible for solo builders
GitHub Release Automation: From Manual Chaos to One-Command Professional Releases
How we eliminated 90% of release overhead while improving quality and consistency
Leading Systematic Debugging: A TPM's Guide to Silent Failures and Root Cause Analysis
How a 57% performance improvement emerged from methodical investigation of a "working" feature that wasn't actually working
Professional Software Delivery for Solo Builders: When Product Management Meets Engineering Excellence
Published: January 2025 | Reading time: 12 minutes
Icon Management Disaster Recovery: Building Systematic Asset Protection for Electron Apps
For implementation questions or to share your own asset management experiences, connect with me on [Twitter](https://twitter.com/yourhandle) or [LinkedIn](https://linkedin.com/in/yourprofile). I'm always interested in hearing how teams adapt these patterns to their specific contexts.
Building Design Systems That Scale: From Solo Developer to Community Contributions
How Technical Architecture Decisions Enable Design Consistency at Scale
Power Users vs. Mainstream: The Feature Complexity Balancing Act
How Progressive Disclosure Serves Both Segments Without Compromise
Performance Constraints Drive UX Decisions: The Whisper.cpp Story
How Technical Limitations Shaped Our Entire Product Architecture
Technical Debt as Product Strategy: When to Fix vs. Ship
How the Three-Attempt Rule Separates User Value from Engineering Preference
The Business Psychology of Progressive Disclosure
Why "Show More" Buttons Increase Engagement Instead of Decreasing It
Feature Roadmapping Through "Coming Soon" UI Elements
How Placeholder UI Shapes Product Strategy and User Expectations
Custom Title Bars and Window Management in Electron
When Removing Browser Chrome Means Building Your Own
Expandable Text Systems: Handling Long Content Without Truncation
When User-Generated Content Breaks Your Clean Interface Design
The Neumorphic Design System: Technical Consistency as User Experience
How Shared CSS Architecture Became Infrastructure That Scales
Information Architecture as Product Strategy: Essential → History → Advanced
How Feature Ordering Drives User Adoption and Prevents Feature Burial
The Three-Attempt Rule: Technical Problem-Solving in Product Development
When Your First Solution Fails, How Do You Know When to Pivot vs. Persist?
When UI Constraints Drive Architecture: How 'No Scrolling' Shaped Our History Feature
A Technical Product Manager's Guide to Letting UX Principles Drive Technical Decisions
The Whisper Optimization Journey: How We Solved the "First Word Missing" Problem and What It Teaches Us About AI Product Development
A technical product manager's deep dive into speech recognition optimization, systematic problem-solving, and the hidden complexities of AI integration
🧠 From Voice Recorder to Voice Agent: A Real-Time Case Study in AI-Powered Product Evaluation
🤖 When "Magic" Breaks Trust: A Product Manager’s Guide to Agent UX
Published on [VoiceCatcher.io](https://voicecatcher.io)
The App Icon Nightmare: Why AI Still Can't Handle Your Brand (And How to Survive It)
A Technical Product Manager's Guide to Wrestling Custom Icons from AI Tools
From Development to Production: Building a Bulletproof Electron Deployment Pipeline
A technical product manager's guide to navigating the treacherous waters of Electron app packaging, with hard-won lessons from the VoiceCatcher project
🧼 Git Hygiene for Solo Builders: Think Like a Product, Build Like a Dev
Founder of ProductBuilt, solo app builder, former VP of Product, full-stack curious
Accessibility-First Design: Building Beautiful Interfaces That Work for Everyone
How we achieved WCAG 2.1 AA compliance in VoiceCatcher while maintaining award-winning visual aesthetics
Documentation Milestone: Hotkey Selector Implementation Complete
Comprehensive documentation strategy delivers measurable business value
Pragmatic Engineering: When "Good Enough" Is Perfect - The VoiceCatcher Hotkey Selector Journey
A Technical Product Manager's perspective on shipping practical solutions over perfect ones
Systematic Pointer-Events Debugging: A Forensic Engineering Approach
Or: "How Principal Engineer Code Forensics Revealed Hidden CSS Stacking Context Issues"
UX Debugging Mastery: The Test-First Pattern That Saves Hours
Or: "How Building a Working Test Component Revealed Hidden Anti-Patterns in React State Management"
Build Pipeline Efficiency: Auto-Formatting vs. Format-Checking - A Simple Change with Dramatic Impact
How moving `prettier --write` earlier in the build cycle eliminated the "build fails → manual format → rebuild" cycle and improved developer experience
The Production-Development Paradox: Building Dual-Environment Architecture for Real-World Electron Apps
A Technical Product Manager's Journey Through the Complexities of Desktop Application Deployment
UX Transformation Through AI-Assisted Design Psychology: From Functional to Delightful
How we applied cognitive design principles to transform VoiceCatcher's interface using strategic AI collaboration
The Solo TPM's Dilemma: Building While Using Your Own Product
Strategic decision-making for technical product managers who are both builder and user
The Product Manager's AI Advantage: When Technical Vision Meets Engineering Excellence
This transformation exemplifies how AI-enhanced Technical Product Managers can bridge product vision with technical execution to deliver measurable competitive advantage and accelerated market success.
The Strategic Engineering Metric: When Documentation Becomes Competitive Advantage
"I fixed 17 TypeScript warnings and wrote 83 commits."
Unused Code Cleanup Project Complete: When "Technical Debt" Reveals Sophisticated Architecture
This cleanup project exemplifies how Technical Product Managers can transform routine engineering tasks into strategic business intelligence gathering that delivers measurable competitive advantage.
Unused Code Analysis: Open Source Readiness through Strategic Code Cleanup
A systematic approach to identifying and eliminating unused code before open sourcing, using modern tooling for professional code quality
Systematic Unused Code Cleanup: Build-Safe Approach to Open Source Readiness
A comprehensive case study in professional code cleanup methodology and senior engineering decision-making
Day 5: Professional Transformation Complete - From Hobby Project to Enterprise-Ready Application
The complete journey from 2,662 linting issues to professional-grade foundation, and why this transformation creates lasting competitive advantage
TypeScript Safety Improvements: Strategic Implementation with Measurable Results
How we achieved 92% improvement in type safety while maintaining 100% functionality through strategic engineering decisions
Strategic Documentation Consolidation: The Business Case for Product Roadmap Excellence
How consolidating scattered documentation into a strategic product roadmap delivers measurable business value for open source projects
Build Pipeline Optimization: Eliminating Redundancy for 2x Faster Development Cycles
How we identified and eliminated build script redundancy, cutting build times and improving developer experience through systematic pipeline analysis
Systematic Code Quality Improvement: A Measurable Methodology That Delivers Results
How we reduced 253 linting issues to 212 in one session using a strategic, build-safe approach that maintains team velocity
Beyond AI Suggestions: A Critical Approach to Security Tool Evaluation
How we evaluated npm security auditing tools without falling into the "just trust the AI" trap - featuring Sandworm, npm audit alternatives, and a systematic verification methodology
Prettier + Build System Integration: From 40 Formatting Issues to Zero in One Command
How integrating code formatting into your build pipeline eliminates inconsistency, prevents regressions, and creates a professional development experience
The Art of Professional Linting: A Journey from 2,662 Issues to Production-Ready TypeScript
A practical guide to systematic code quality improvement, technical debt management, and when to fix vs. document linting issues
The Art of Systematic Debugging: A VoiceCatcher Case Study
Or: "How Two Small Bugs Taught Us Big Lessons About Development Process"
From Prototype to Production: A Code Quality Retrospective
Or: "How 2,662 Lint Errors Taught Us About Development Velocity vs. Technical Debt"
Pragmatic Component Refactoring: When "Good Enough" Beats "Perfect"
Or: "How We Learned to Stop Over-Engineering and Start Shipping"
Testing with Business Value: A Critical Evaluation of Test Strategy
How we transformed our testing approach from "coverage for coverage's sake" to "tests that matter"
Building VoiceCatcher: A Journey Through Modern JavaScript Complexity
Or: "How I Learned to Stop Worrying and Love the Build Pipeline"