- Replace technical app names with user-friendly capability categories:
- "Information Library" (Kiwix) - offline Wikipedia, medical refs, etc.
- "Education Platform" (Kolibri) - Khan Academy, K-12 content
- "AI Assistant" (Open WebUI + Ollama) - local AI chat
- Add bullet point feature lists for each core capability
- Move secondary apps (Notes, Data Tools) to collapsible "Additional Tools"
- Show already-installed capabilities with "Installed" badge and disabled state
- Update terminology: "capabilities" instead of "apps", "content packs" instead of "ZIM collections"
- Update Review step to show capability names with technical names in parentheses
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Jake Turner <52841588+jakeaturner@users.noreply.github.com>
Adds a dynamic storage projection bar that shows users how their
selections will impact disk space:
- Displays current disk usage and projected usage after installation
- Updates in real-time as users select maps, ZIM collections, and tiers
- Color-coded warnings (green→tan→orange→red) based on projected usage
- Shows "exceeds available space" warning if selections exceed capacity
- Works on both Linux (disk array) and Windows (fsSize array)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
jsDelivr CDN was aggressively caching old data during development.
Raw GitHub URLs provide more immediate updates when pushing changes
to the feature branch.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
jsDelivr aggressively caches branch references. Adding version
parameter ensures fresh data is fetched when categories are updated.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
GitHub raw URLs don't allow cross-origin requests from localhost.
Using jsDelivr CDN which serves GitHub content with proper CORS headers.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add kiwix-categories.json with Medicine category and 3 tiers
- Create CategoryCard component for displaying category cards
- Create TierSelectionModal for tier selection UI
- Integrate categories into Easy Setup wizard (Step 3)
- Add TypeScript types for categories and tiers
- Fallback to legacy flat collections if categories unavailable
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The removeNotification function was using a stale reference to the
notifications array from the closure scope, causing the setTimeout
callback to filter against an outdated state.
Changed to use functional update pattern (prev => prev.filter(...))
which correctly references the current state when the timeout fires.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>