* Perfect! All tasks completed successfully. Here's what was implemented:
## Summary
✅ **Migrated showcase persistence from localStorage to v8 config system**
**Backend (Rust):**
- Created [v8.rs](file:///private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban/worktrees/0960-use-existing-con/crates/services/src/services/config/versions/v8.rs) with `ShowcaseState` struct tracking `seen_versions: HashMap<String, u32>`
- Implemented migration from v7→v8 with default empty showcases
- Wired up v8 as active config version
**Frontend (TypeScript):**
- Created [useShowcasePersistence.ts](file:///private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban/worktrees/0960-use-existing-con/frontend/src/hooks/useShowcasePersistence.ts) hook using config API
- Refactored [useShowcaseTrigger.ts](file:///private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban/worktrees/0960-use-existing-con/frontend/src/hooks/useShowcaseTrigger.ts) to use new persistence (kept API unchanged)
- Deleted old localStorage utility
- Generated TypeScript types including `ShowcaseState`
**Key Features:**
- Showcase state persists to config file (survives random port changes)
- Tracks highest version seen per showcase ID
- Optimistic updates for responsive UX
- Automatic v7→v8 migration on startup
* Cleanup script changes for task attempt 096017a4-28dd-4092-a3ef-7180232ee7d2
* Done! Now `default_git_branch_prefix` is imported from v7 instead of being duplicated.
* Cleanup script changes for task attempt 096017a4-28dd-4092-a3ef-7180232ee7d2
* fix FeatureShowcaseModal race condition (vibe-kanban) (#1050)
* Done! Collapsed v8 back into v7. The `showcases` field is now part of v7 with `#[serde(default)]`, making it backward compatible without needing a version bump.
* Cleanup script changes for task attempt 096017a4-28dd-4092-a3ef-7180232ee7d2
* Fixed! ✅
* showcase simplification (vibe-kanban 94972ea4)
frontend/src/config/showcases.ts
I want to make it harder to make mistakes here, lets use the type system to our advantage.
1. We could forget to update the `export const showcases` variable, so instead of expecting `taskPanelShowcase`, we should move showcases to all be under one object and only access them through that object.
2. The versioning system is overkill, instead of a `showcases` map with `seen_versions` as another map, we can have a `seen_features` set (realistically an array in JSON) that we insert keys into.