Releases: revolutionaryPhoton/f13-configurator
Release list
v0.5.2
Security + dependency-maintenance release. Resolves two undici advisories (one HIGH) and refreshes the GUI build/runtime dependencies. No functional changes — same signed + notarized macOS app as v0.5.1.
Download
| Platform | File |
|---|---|
| macOS (Apple Silicon, 11.0+) | F13.Configurator_0.5.2_aarch64.dmg |
Linux still deferred. The
.AppImage/.debbuilds need a rebuild against an older glibc before they run on common target distros — tracked for a later release. The shell wizard (bin/f13-config) works on Linux today from a checkout.
Security
undici7.25.0 → 7.28.0 — resolves:- HIGH (GHSA-vmh5-mc38-953g): TLS certificate-validation bypass via dropped
requestTlsin the SOCKS5 ProxyAgent. - MEDIUM (GHSA-pr7r-676h-xcf6): cross-user information disclosure via a shared-cache whitespace bypass.
- HIGH (GHSA-vmh5-mc38-953g): TLS certificate-validation bypass via dropped
Other dependency bumps
@sveltejs/kit2.63.0 → 2.66.0svelte5.56.2 → 5.56.3@biomejs/biome2.4.16 → 2.5.0tailwindcss+@tailwindcss/vite4.3.0 → 4.3.1vitest4.1.8 → 4.1.9
All patch/minor; CI green throughout. macOS .dmg builds, signs, notarizes, and Gatekeeper-accepts unchanged.
⚠️ AI-generated
Almost the entire codebase — and the loop that produced it — was written by Claude Code with human review at the diff level, not line-by-line. No formal security audit. See SECURITY.md. Local development use; for production-adjacent work prefer the shell wizard.
Full changelog: https://github.com/revolutionaryPhoton/f13-configurator/blob/main/CHANGELOG.md
v0.5.1
Dependency-maintenance release. Refreshes the GUI build/runtime dependencies — no functional changes. Same signed + notarized macOS app as v0.5.0.
Download
| Platform | File |
|---|---|
| macOS (Apple Silicon, 11.0+) | F13.Configurator_0.5.1_aarch64.dmg |
Linux still deferred. The
.AppImage/.debbuilds need a rebuild against an older glibc before they run on common target distros — tracked for a later release. The shell wizard (bin/f13-config) works on Linux today from a checkout.
What changed
Dependency bumps only (all patch/minor, no majors):
vite8.0.14 → 8.0.16,vitest4.1.7 → 4.1.8svelte5.56.0 → 5.56.2@sveltejs/kit2.61.1 → 2.63.0svelte-check4.4.8 → 4.6.0axe-core4.11.4 → 4.12.0
CI green on every change; the macOS .dmg builds, signs, notarizes, and Gatekeeper-accepts unchanged from v0.5.0.
⚠️ AI-generated
Almost the entire codebase — and the loop that produced it — was written by Claude Code with human review at the diff level, not line-by-line. No formal security audit. See SECURITY.md. Local development use; for production-adjacent work prefer the shell wizard.
Full changelog: https://github.com/revolutionaryPhoton/f13-configurator/blob/main/CHANGELOG.md
v0.5.0
First signed + notarized macOS distributable. Download, drag to Applications, launch — Gatekeeper-clean, no terminal required. Phase 10 of the PRD.
Download
| Platform | File |
|---|---|
| macOS (Apple Silicon, 11.0+) | F13.Configurator_0.5.0_aarch64.dmg |
Linux is coming in v0.5.1. The
.AppImage/.debbuilds need a rebuild against an older glibc before they'll run on common target distros — deferred so the macOS release isn't held up. The shell wizard (bin/f13-config) works on Linux today from a checkout.
What's new
Signed macOS app (S53 + S54 + S56)
- Tag-driven release pipeline builds, signs, notarizes and staples both the
.appand the.dmg, then attaches it to a draft Release for manual publish. - Developer ID signing;
minimumSystemVersion11.0 (Apple Silicon).
Bundled-mode data paths (S51 + S52)
- An installed app now writes its
generated/config to~/Library/Application Support/de.f13-os.configurator/generatedinstead of inside the read-only signed bundle — which is what makes the installed app actually work.bin/f13-stop/bin/f13-resetauto-discover that location.
Bundled app finds your toolchain
- A Finder-launched app inherits a minimal PATH from macOS, so the preflight could miss Homebrew/Docker tools. The app now recovers your login-shell PATH at startup, so
docker, Homebrewbash,envsubst, etc. resolve correctly.
Install notes
The app shells out to Docker and the F13 wizard scripts. Make sure Docker is installed and running before the preflight. Everything else (bash 4+, curl, etc.) is detected automatically.
⚠️ AI-generated
Almost the entire codebase — and the loop that produced it — was written by Claude Code with human review at the diff level, not line-by-line. No formal security audit. See SECURITY.md. Local development use; for production-adjacent work prefer the shell wizard.
Full changelog: https://github.com/revolutionaryPhoton/f13-configurator/blob/main/CHANGELOG.md
v0.4.1 — maintenance release
Maintenance release. CI-blocking Tauri JS/Rust version mismatch fixed; build chain refreshed (TypeScript 5 → 6, vite 6 → 8 via @sveltejs/vite-plugin-svelte 5 → 7, svelte 5.55.5 → 5.55.9 with a transitive XSS fix); Dependabot grouping config added so neither the JS/Rust mismatch nor a vite/peer-dep deadlock can reopen silently. No user-facing changes — same wizard, same GUI, same flows.
Fixed
@tauri-apps/apipin (PR #7, squash5de58bd). Dependabot bumped the cargo-sidetauricrate 2.10.3 → 2.11.1 on 2026-05-08 (PR #2), but the JS-side@tauri-apps/apistayed at 2.10.1 in the lockfile. Tauri's startup version-mismatch guard tripped on every macOS CI run for two weeks before anyone noticed.gui/package.jsonwidened to"@tauri-apps/api": "^2.11.0"; subsequently bumped to 2.11.2 via the newtauri-jsDependabot group (PR #13).gui/biome.json$schemaURL (PR #24, squash37179ba). Cosmetic follow-up to PR #16 (biome CLI bump) — schema URL updated from/2.4.13/to/2.4.15/sobiome checkstops emitting an info-level deserialize warning.
Security
svelte5.55.5 → 5.55.9 (PR #8, squash04dacc9). 5.55.7 fixes an XSS onhydratablefrom user content. Practical exposure is low (F13's GUI doesn't render arbitrary user content), but the upstream fix lands here regardless. Also: SSR empty-attribute ban, regex hardening, runtime-property symbol move (5.55.7);svelte:bodyprint + keyframe percentage double-print fixes (5.55.8);{#await}batch + hydration fixes (5.55.9); stale-promise /$state.eager/bind:thisproxification fixes (5.55.6). Transitively bumpsdevalue5.7.1 → 5.8.1.
Changed — build chain majors
typescript5.6.3 → 6.0.3 (PR #14, squashaeff244). TS 5 → 6. Pin tightened from~5.6.2to~6.0.3. Full backpressure suite green under TS 6.vite-buildgroup: vite 6 → 8 + plugin-svelte 5 → 7 (PR #20, squash1c783df). Bundled by the newvite-buildDependabot group (PR #19).@sveltejs/vite-plugin-svelte7.1.2 widens its peer tovite ^8.0.0-beta.7 || ^8.0.0, unblocking the vite major.@sveltejs/vite-plugin-svelte5.1.1 → 7.1.2;vite6.0.3 → 8.0.14;vitestpatch. A prior standalone vite-8 bump (PR #17) was ERESOLVE'ing on the vite-plugin-svelte 5.x peer constraint — the group config is what fixed it; #17 was auto-closed as superseded.tailwindcss4.2.4 → 4.3.0 (transitive via PR #20). Minor. New utilities (@container-size,scrollbar-*,zoom-*,tab-*) none of which we use yet, plus canonicalization fixes. Standalone PR #22 auto-closed as redundant after #20's lockfile churn lifted it.
Changed — SvelteKit + tooling
@sveltejs/kit2.58.0 → 2.60.1 (PR #9, squashbb3e04c). Minor. Formsubmit/hiddenaccept numbers + booleans; warns on unread form remote-function validation; fixesquery.batchcross-talk and aborts navigation after async render. F13 is a Tauri shell via@sveltejs/adapter-static, so new features are inert here.svelte-check4.4.6 → 4.4.8 (PR #15, squash3193028). Patch.@biomejs/biome2.4.13 → 2.4.15 (PR #16, squash4ae036c). Patch.
Changed — Tauri pair (matched JS+Rust via Dependabot groups)
tauri-rustgroup: 2.11.1 → 2.11.2 (PR #11, squash29bd9ec). Patch line acrosstauri,tauri-build,tauri-codegen,tauri-macros,tauri-plugin-opener,tauri-plugin-shell,tauri-runtime,tauri-runtime-wry.tauri-jsgroup: api+cli 2.10.1 → 2.11.2 (PR #13, squash7e82d0c). JS/Rust now matched at 2.11.2 across both ecosystems — the grouping config's first successful validation.serde_json1.0.149 → 1.0.150 (PR #12, squash4823d6d). Cargo patch.
Changed — test-only dev dependencies
jsdom29.0.2 → 29.1.1 (PR #23, squashc47db4c). vitest env;getComputedStyle()fixes and perf improvements.axe-core4.11.3 → 4.11.4 (PR #21, squash5a2bf9a). vitest a11y tests; bug fixes aroundaria-labelledby+ hidden ancestors andgetAncestryescaping.
Added — Dependabot config
.github/dependabot.yml(PR #10, squash0714ebb; extended in PR #19, squash386dc39). Previously there was no config — version updates were running off the UI toggle, ungrouped, which is how the v0.4.0 cycle's JS/Rust mismatch slipped past review. Now two npm groups (tauri-js,vite-build) and one cargo group (tauri-rust) bundle deps that must move together. Thevite-buildgroup was validated end-to-end during this release cycle.
Added — CI
shellcheck + batsjob alongside the macOS Tauri build (PR #26, squash0482072). The existing workflow only covered three of the five backpressure pieces (npm run check,npm run test:unit,cargo check). The shell side (shellcheck -S warning bin/* lib/*.shandbats tests/) was previously enforced only locally + via the ralph loop, so a shell-only regression could have landed via PR. Closing that gap: newshell-checksjob onubuntu-latest, runs in parallel withbuild-macosin ~1m on a cold cache. Paths filter extended to includetests/**and.github/workflows/**. Workflow display name renamed from "GUI build (macOS)" to "CI"; file path kept asgui-build.yml.
Tests
No new tests. vitest stays 378/378 green; cargo check passes; full backpressure suite (svelte-check + tsc + vitest + cargo + shellcheck + bats 283/283) clean both at the initial release cut and again after the build-chain bumps. Maintainer smoke-tested the GUI on macOS at multiple points — no regressions on the static-adapter build path through SvelteKit 2.60.1, vite 8.0.14, or vite-plugin-svelte 7.1.2.
Full CHANGELOG: https://github.com/revolutionaryPhoton/f13-configurator/blob/main/CHANGELOG.md
v0.4.0 — i18n + zoom
The GUI now speaks four languages and can zoom.
What's new
Localization (S41–S43)
The desktop GUI is fully translated to German, French, and Spanish, with English remaining the canonical source. A small four-button locale picker (EN / DE / FR / ES) lives in the welcome-screen footer; selection persists to localStorage and is restored on next launch.
The picker is deliberately welcome-screen-only — once you pick a language you never see it again mid-flow. Brand terms (F13, Ollama, Docker, docker compose, ollama serve, ollama pull, mock) stay in English across all locales. The shell wizard's terminal output is not translated — that's the documented operator surface.
Catalog files at gui/src/lib/i18n/<locale>.json keyed by dotted message ids. Key parity is enforced by a vitest fixture, so a missing translation fails CI rather than silently falling back to English. 176 keys × 4 locales.
Zoom (S44)
Webview-level zoom for users on high-DPI displays:
| Action | Shortcut |
|---|---|
| Zoom in (max 2.0×) | Ctrl/Cmd + + (or =) |
| Zoom out (min 0.6×) | Ctrl/Cmd + − |
| Reset to 100% | Ctrl/Cmd + 0 |
A compact − / 100% / + stepper in Settings → Appearance does the same thing. The current factor persists to localStorage and is restored on next launch.
Implementation uses the CSS zoom property on the document root — works identically across all three Tauri webview backends (WKWebView / WebView2 / WebKitGTK) with no Rust code.
Phase mapping
This is Phase 9 of the PRD shipping in one consolidated release. Phase 10 (signed distributables — .dmg / .AppImage / .deb — and bundled-mode data paths) is now the next planned phase but unstarted.
Known loose ends carried forward
- HF5 — auto-regenerate broken stack on Start instead of forcing the user through the full Reconfigure wizard. Deferred to a v0.4.x patch when maintainer judgement is available on the UX shape.
Validated on
- macOS (Apple Silicon, manual smoke test of all four locales + zoom shortcuts + Settings stepper)
Linux runtime parity is from v0.3.0; no Phase 9 changes were Linux-specific.
Backpressure
shellcheck -S warning bin/* lib/*.sh— cleanbats tests/— 281/282 (the 1 fail is the same pre-existing local-Ollama-running flake)npm run check— cleannpm run test:unit— 378/378 (up from 299)cargo check— clean
Full Changelog: v0.3.2...v0.4.0
v0.3.2 — HF2 + HF3 + tauri 2.11.1
Two backlog hand-fixes plus a clean Dependabot bump.
HF2 — Cancel actually stops the wizard
Cancel previously just set a JS-side flag and let the bash subprocess keep running in the background until natural completion. The wizard would happily finish bringing up containers, write state, pull images, etc. — meanwhile the user was on another screen wondering why their stack was up.
Fix: plumb AbortSignal from the Cancel button through engine.runWizardNonInteractive to the ProcessRunner. On abort, the spawned Tauri Child gets killed.
Caveat (documented): killing the bash leader does NOT kill its docker compose up grandchild — that's reparented to PID 1 and keeps running. The proper kernel-level fix (kill the process group via setsid/process_group(0) on the Rust side) is deferred. As a workable mitigation, handleCancel calls compose down twice with a 1.5 s gap so the second pass catches anything the orphan brought up during the first. User-visible delay between click and navigation is ~1.5 s, which is fine for a destructive action.
HF3 — Clear error when frontend image is missing
When the locally built f13-frontend:v2.0.0_based image isn't on disk (user pruned it, daemon was reinstalled, etc.), Compose's default pull-when-missing behavior surfaced a confusing pull access denied against registry.opencode.de — where this image was never pushed.
Fix in two layers:
- Pinned
pull_policy: neveron the frontend service in the compose template. The image is built locally; a registry pull is always wrong for it. - Added a precondition check in
compose::upthat runsdocker image inspect ${FRONTEND_IMAGE}beforedocker compose up. On miss, returns a clear "frontend image is missing locally — re-run the wizard so it can rebuild" message. The shell wizard's--compose-uphandler propagates that message into thedoneevent so the GUI's error toast surfaces the friendly text instead of a generic "compose up failed".
Dependencies
tauri2.10.3 → 2.11.1 (Dependabot #2). Cargo.lock only; no API changes required in our Rust glue. Backpressure clean.
Known loose ends carried forward
- HF5 (new) — auto-regenerate broken stack on Start instead of forcing the user through the full Reconfigure wizard walk. The HF3 precondition fix surfaces a clear error, but recovery still requires walking preflight → inference → ollama → ports just to rebuild the frontend image. PRD entry added; deferred to a future v0.3.x patch.
- HF2's kill-process-group proper fix is deferred (current double-down mitigation works).
Validated on
- macOS (Apple Silicon, manual smoke test of both HF2 cancel-during-pipeline and HF3 missing-image error in the GUI)
Backpressure
shellcheck -S warning bin/* lib/*.sh— cleanbats tests/— 281/282 (the 1 fail is the same pre-existing local-Ollama-running flake from v0.3.1 that fails onmaintoo)npm run check— cleannpm run test:unit— 299/299cargo check— clean against tauri 2.11.1
Full Changelog: v0.3.1...v0.3.2
v0.3.1 — HF4 reconfigure
HF4 fix — the GUI's Reconfigure flow now actually swaps the chat backend (mock ↔ Ollama) on a running stack instead of silently no-op'ing. Three compounding bugs were found and fixed in this single ship.
What was broken
Clicking Reconfigure on a running stack and switching backend (mock → Ollama, or back) would walk through the wizard but leave Docker Compose untouched. The user would land back on /status with the old backend still serving.
Three compounding bugs (all fixed)
-
state::readclobbered env-set values — the GUI exportedCHAT_BACKEND=ollama, but the wizard's state-loader overwrote it with the previously savedmockbefore the new compose got rendered. Inverted the guard so env wins. Also normalizedOLLAMA_MODEL, which was missing the empty-state check the other four vars had. -
F13_STATE_ACTIONwas shadowed beforestate::checkread it —bin/f13-configdidF13_STATE_ACTION=""unconditionally, so the GUI's exportededitvalue was discarded and the wizard defaulted tokeep. Without this, the wizard never even entered the edit branch. -
Reconfigure didn't bring down the running stack — even after the wizard correctly took the edit path, the previous run's containers stayed bound to the chosen ports and the new chat container couldn't claim them. The user got stuck on the GUI's port-check screen because both ports were reported as in-use. Now the Reconfigure button on /status calls
compose.downbefore navigating, and a new_wizard_stop_running_stackhelper in the shell wizard adds defense-in-depth for direct CLI invocations.
Tests
- 4 new bats regressions in
tests/state.bats(env-wins forCHAT_BACKEND,OLLAMA_MODEL,FRONTEND_PORT, plus an empty-env case) - 4 new bats assertions in
tests/f13-config.bats(stop event on edit / reset, absent on keep / fresh init) - 4 new vitest assertions (
stateAction:"edit"plumbing + Reconfigure stops a running stack) - Pre-existing
re-run with edit action re-renders configtest tightened — old form was a no-op assertion
Validated on
- macOS (Apple Silicon, manual smoke test of the full reconfigure round-trip: mock → Ollama → mock → fresh init)
Linux validation will happen on the maintainer's WSL2 box during the next session there; the changes are pure logic/state-machine fixes with no Linux-specific surface area.
Known loose ends carried forward
- HF2 — Cancel button in the launch pipeline doesn't kill the bash subprocess (deferred since v0.2.x)
- HF3 — Sporadic
pull access deniedon frontend image (deferred since v0.2.x)
PRD also flags some "likely-others" edge cases that may surface now that the reconfigure flow actually works (port changes mid-cycle, stale OLLAMA_MODEL on Ollama → mock). Worth a sweep but out of scope for this patch.
Full Changelog: v0.3.0...v0.3.1
v0.3.0 — Linux runtime parity
The GUI is now mostly stable on macOS and Linux for daily local use. Phase 8 of the PRD ships in this release.
What's new
- Linux runtime parity (WSL2 Ubuntu 22.04 validated) —
apply_linux_runtime_defaults()silences libEGL/dev/dri/*warnings and forces Mesa's software path on Linux.host.docker.internal:host-gatewayconfirmed working under WSL2 + Docker Desktop. Apt prerequisites for emoji rendering (fonts-noto-color-emoji) andxdg-open(wslu) documented ingui/CONTRIBUTING.md. - Image pinning —
core→core:v2.0.0,chat(mock + Ollama) →chat:v1.2.0,feedback-db→postgres:17-alpine, frontend git clone pinned to--branch v2.0.0via_FRONTEND_GIT_REFconstant. - Frontend image renamed —
f13-frontend:configurator-v1→f13-frontend:v2.0.0_based. Tag is derived from_FRONTEND_GIT_REFso future bumps cascade automatically. - Frontend source always cloned — the local
../frontend/fast-path was removed since arbitrary local trees could diverge from the pinned ref. - UX polish — embedding-model alert in the Ollama picker (with auto-scroll-into-view), soft warnings about embedding models in both shell wizard and GUI banner.
- Bug fixes — secret files written
0644so the non-root container user can read through Linux bind-mounts (was breakingcorestartup);editre-run reuses the existingfeedback_dbpassword so the postgres volume + new secret stay aligned; Tailwind v4 +<script lang="ts">+<style>interaction inProgressBar.svelteworked around by hoisting the keyframe to global CSS.
Breaking change
feedback-db-data named volume from a postgres:16 install will not auto-upgrade. Existing stacks must run ./bin/f13-reset (drops the volume) before pulling this version, or perform a manual pg_upgrade outside the configurator.
Known loose ends
- HF4 — GUI reconfigure flow on a running stack silently no-ops on backend swap (mock ↔ Ollama). Two compounding bugs (GUI doesn't pass
stateAction: "edit", andstate::readclobbers env-set vars). Doesn't block normal use; the unblocker for "in-flight model swaps" is documented in the PRD. - HF2 (Cancel button doesn't kill subprocess) and HF3 (sporadic frontend pull-access-denied) carried forward from v0.2.x.
Validated on
- macOS (Apple Silicon, prior releases)
- Ubuntu 22.04 + WSL2 + Docker Desktop (this release)
Other Linux distros (Fedora, Arch, native Ubuntu without WSLg) should largely work but haven't been smoke-tested.
Full Changelog: v0.2.2...v0.3.0
v0.2.2 — macOS GUI mostly stable
Phase 7.5 closeout: the desktop GUI is now usable for daily local work on macOS. Path resolution, Stop/Start cycles, Reset confirmation, and the Ollama picker all behave correctly. The shell wizard and the GUI now write to the same generated/ tree, so cross-surface stop/reset Just Works.
ℹ️ Mostly stable, not yet hardened. We have not checked every possible combination of state transitions, error paths, and inputs. Edge cases may still surface bugs. Treat as good for daily local exploration on macOS; for production-adjacent work, the shell wizard (
bin/f13-config) remains the recommended surface.
What's new
Phase 7.5 — loop fixes
bba394dS32 —f13-resetandf13-stophonourF13_GENERATED_DIR(bats-verified).b192f98S34 — Wizard's keep-state path emits per-stageskipped:trueevents; the GUI's six-stage pipeline graph now fills instantly on re-runs instead of looking stuck.
HF1 — path resolution (4 iterations)
6510ca1→d2defe1→387699c→18cbacf— settled on detecting dev mode by the executable's own path (target/debug/ortarget/release/), since Tauri symlinks resources into the dev binary's directory and made sentinel-file checks unreliable. Final off-by-one in the workspace walk-up was the actual blocker.
Status page UX
86cc560Stop/Start cycle — Stop stays on/statusand flips the badge to "Stopped" with a contextual white "Start F13" CTA in the hero card. Postgres data preserved between cycles.46549acStopped badge reads "Stopped" with a red pulsing dot rather than the ambiguous "Running · Issues".7bcaac4Reset modal submits on Enter onceRESETis typed, with a small<kbd>Enter</kbd>hint.
Ollama picker
84dde9bFree-text "Use any model name" input below the radio list — works for cloud-hosted models (which never appear in/api/tags) and any model Ollama can pull on first request. Cloud-tag inline note reminds aboutollama signin.7317918Empty-state pull hint generalised toollama pull modelname:tag, with a clickable ollama.com/search link via the Tauri opener plugin. Cloud-tag example unified atgemma4:31b-cloud.
Security & dependencies
f7cb906Dependabot #1 —cookie@0.6.0→0.7.2vianpm overrides. The two Rust alerts (rand@0.7.3andglib@0.18.5) traced to Tauri 2.10.3's deep dep stack and were dismissed viagh apiwithtolerable_riskrationale (no exploit path in our usage; null GitHub severity).
Test maintenance
d452fc3Refresh 27 vitest assertions stale from v0.2.1 polish. Suite restored to 288/288 green.
Known issues / on the backlog
These are tracked but didn't block this release:
- HF2 — Cancel button mid-launch only flips a JS-side flag; the underlying bash subprocess keeps running. No orphan-container cleanup on cancel. Workaround: let the pipeline complete, then Stop or Reset.
- HF3 — Sporadic
pull access deniedfor the locally builtf13-frontend:configurator-v1image when compose's first pass races with image presence checks. Not seen since HF1 v4 landed but the precondition guard isn't in place yet. - Linux GUI — Untouched. Wizard runs fine on Linux from the shell, but the Tauri app hasn't been validated. Phase 8 lands this in v0.3.0.
What's stable
The shell wizard from v0.1.0 is unchanged and remains the trustable surface for any production-adjacent work — bin/f13-config for first-time deployment, bin/f13-stop / bin/f13-reset / bin/f13-rebuild-frontend for ops.
What's coming
- v0.3.0 — Phase 8: validate the GUI end-to-end on Linux (Ubuntu 22.04 / 24.04). No new screens.
- v0.4.0 — Phase 9: signed
.dmg,.AppImage+.deb, GitHub Releases automation, optional auto-update.appLocalDataDirswap for bundled mode.
See PRD for the full story sequence.
v0.2.1 — Zinc design polish (macOS GUI still buggy)
Apply the Claude Design handoff bundle's Zinc visual direction across all seven wizard screens. Engine wiring unchanged from v0.2.0; this is purely visual polish on top of the existing functional GUI.
⚠️ The macOS GUI is still not stable — more bug-fixing required before it's safe for anything beyond exploration. Use the shell wizard (`bin/f13-config`) for any real work. See the Known issues section below.
What's polished
Foundation (`9c0993c`)
- Zinc design tokens: `--f13-border-strong`, `--f13-accent`, `--f13-radius-{sm,,lg}` scale, `--f13-font` and `--f13-font-mono`.
- Six animation keyframes: `f13-fadeUp`, `f13-spin`, `f13-pulse`, `f13-scanLine`, `f13-flowDash`, `f13-shimmer`.
- New `F13Logo.svelte` (clean 64×22 pixel mark, scalable).
- Layout primitives: `StepHeader`, `Footer`, `PageBody`, `PageTitle` — used by every step screen.
Welcome + Preflight (`f235bc4`)
- Welcome: pixel logo, green-dot preset badge, mono credit footer, 500ms fadeUp entry.
- Preflight: scan progress bar with shimmer overlay, mono check rows, three-state title pattern (Scanning / Some requirements missing / Environment ready).
Inference + Ollama (`cd6a7ef`)
- Tile component now fills with text-color when selected (high-contrast inversion).
- Recommended badge floats off the corner.
- Ollama picker gets the colored-left-border GPU warning, custom radio dots, cloud pill badges with cloud icon.
Ports + Run pipeline (`2558a1c`)
- Ports: bordered field cards, mono inputs with `--border-strong` outline, inline status icons, "Launch" CTA.
- Run: slim header with uppercase "LAUNCHING F13" kicker, six-node SVG pipeline graph with flowing dashes between stages and a pulsing aura on the active node, terminal-style live log (200px tall, dark mono) with auto-scroll.
Status (`2ca974b`)
- Dark gradient hero card with concentric circle decoration.
- Pulsing green status badge (with glow), big 24px title, mono URL line, white-on-black "Open F13 in browser" CTA.
- 2×2 service grid with green dots, mono service names, image tags, ports.
- "ACTIONS" panel with kicker.
Disclaimer wording (`5b43566`)
- "F13 can make mistakes" → "F13 uses AI models and those can make mistakes." Specific about the actual user-facing risk.
Known issues (not fixed in v0.2.1)
These were logged during v0.2.0 + v0.2.1 testing and need fixing before the macOS GUI is stable:
- `f13-reset` is path-blind — only wipes `configurator_v1/generated/`, not the GUI's `gui/src-tauri/target/debug/generated/`. So the GUI's stale state survives reset attempts from the shell wizard.
- GUI's run page defaults `generatedDir = "./generated"` (relative) — resolves against the Tauri dev process's CWD, so the GUI's stack ends up in `target/debug/generated/` rather than under `configurator_v1/`. Confusing and not where the shell wizard's `f13-stop`/`f13-reset` looks.
- Wizard's "keep existing state" path is incomplete for the GUI — when `.state` exists, the wizard skips secrets/render/build/pull/health and only emits `step name=start`. The GUI's six-stage pipeline graph stays pending forever, looking stuck even though docker compose is actually running underneath.
- No abort UX — the Cancel button only sets a JS-side flag; the underlying bash subprocess keeps running. Stopping mid-pipeline can leave half-built containers.
- Sporadic "pull access denied" errors for the locally-built `f13-frontend:configurator-v1` image when compose's first pass races with image presence checks. Direct `docker compose up -d` works reliably; only seen via the GUI.
What's stable
The shell wizard from v0.1.0 is still the trustable surface — `bin/f13-config` for first-time deployment, `bin/f13-stop` / `bin/f13-reset` / `bin/f13-rebuild-frontend` for ops. The Phase 7 / 7.5 desktop GUI works end-to-end on macOS but expect the rough edges above.
What's coming
Next sprint: knock out the five known issues above, then v0.2.2 closes out Phase 7 with a usable GUI. Phase 8 (Linux runtime, signed bundles) follows.