Build and maintain macOS menubar apps with a Tuist-first workflow and stable launch scripts. Preserve strict architecture boundaries so networking, state, and UI remain testable and predictable.
LSUIElement = true by default.@Observable or equivalent), not in row/view presentation code.tuist run is unreliable for macOS target/device resolution.tuist xcodebuild build over raw xcodebuild in local run scripts when building generated projects.Use this placement by default:
Project.swift: app target, settings, resources, Info.plist keysSources/*Model*.swift: API/domain models and decodingSources/*Client*.swift: requests, response mapping, transport concernsSources/*Store*.swift: observable state, refresh policy, filtering, cachingSources/*Menu*View*.swift: menu composition and top-level UI stateSources/*Row*View*.swift: row rendering and lightweight interactionsrun-menubar.sh: canonical local restart/build/launch pathstop-menubar.sh: explicit stop helper when neededTuist.swift and Project.swift (or workspace manifests) exist.curl to verify endpoint shape, auth requirements, and pagination behavior.limit/page, implement full-list handling with local trimming in the store.App or menu scene declarations.tuist generate --no-open when generation is required.TUIST_SKIP_UPDATE_CHECK=1 tuist xcodebuild build ... instead of invoking raw xcodebuild directly.Run validations after edits:
TUIST_SKIP_UPDATE_CHECK=1 tuist xcodebuild build -scheme <TargetName> -configuration Debug
If launch workflow changed:
./run-menubar.sh
If shell scripts changed:
bash -n run-menubar.sh
bash -n stop-menubar.sh
./run-menubar.sh
tuist run cannot resolve the macOS destination:
Use run/stop scripts as canonical local run path.
Menu UI is laggy or inconsistent after refresh: Move derived state and filtering into the store; keep views render-only.
API payload changes break decode: Relax model decoding with optional fields and defaults, then surface missing data safely in UI.
Feature asks for quick UI patch: Trace root cause in model/client/store before changing row/menu presentation.