What "craftsman SaaS" means to me

A good error message answers three questions: what happened, why it happened, and what to try next. Most ship the first, hint at the second, and forget the third. The fix is usually a single sentence longer.

Markdown won because it was always good enough. Not the best at any one thing — never the fastest editor, never the prettiest output, never the most semantically rich. But always close enough that the switching cost killed every alternative.

The hardest part of a 1-person startup isn't the work — it's the lack of a forcing function. Without a meeting on Tuesday, nothing has to ship on Monday. The schedule has to come from somewhere, and "because I said so" isn't enough.

swift
// SwiftUI: keep all five tab views mounted across tab switches so // each view's @StateObject model persists. ZStack { ForEach(AppTab.allCases, id: \.self) { tab in view(for: tab) .opacity(router.selectedTab == tab ? 1 : 0) .allowsHitTesting(router.selectedTab == tab) } }

"The best note-taking system is the one you already have open." — every productivity post ever, and also true

Whiteboard sketch
Whiteboard sketch

Open questions

The hardest part of a 1-person startup isn't the work — it's the lack of a forcing function. Without a meeting on Tuesday, nothing has to ship on Monday. The schedule has to come from somewhere, and "because I said so" isn't enough.