Replaced file_picker's Load/Browse with a custom NativePickerRegistrar
Swift plugin that opens NSOpenPanel with showsHiddenFiles = true.
The file_picker package hardcodes this to false, making hidden folders
like ~/.claude invisible in its dialogs.
Changes:
- New NativePickerRegistrar.swift: custom NSOpenPanel with hidden files
- New NativePicker Dart service using method channel
- Browse: only shows folders (canChooseFiles=false), hidden visible
- Load: only shows .jsonl files, hidden folders visible
- Registered via AppDelegate.applicationDidFinishLaunching
- Removed file_picker dependency from home_screen imports
- Fixed all info-level lint issues (super params, null-aware, doc comment)
- Signed, notarized, stapled DMG
CocoaPods was conflicting with Swift PM and preventing file_picker
plugin from registering at runtime (MissingPluginException).
All macOS plugins are Swift Packages now — CocoaPods is not needed.
- pod deintegrate + remove Podfile, Podfile.lock, Pods/
- Remove CocoaPods includes from Flutter-Debug.xcconfig and Flutter-Release.xcconfig
- Signed, notarized, stapled DMG
- Remove App Sandbox from Release entitlements (developer tool needs
filesystem access to ~/.claude/projects — same as VS Code, iTerm2)
- Explicitly set get-task-allow=false in entitlements for notarization
- Add path input field in header so users can type paths with hidden
folders (e.g. ~/.claude/projects) — press Enter or click arrow to scan
- Field pre-populated with ~/.claude/projects on launch
- Signed, notarized, stapled DMG
Performance:
- Move JSON parsing to background isolate via Isolate.run() (eliminates 2-4s UI freeze)
- Cache filteredEntries with key-based invalidation (eliminates O(n) recomputation)
- Debounce search queries at 300ms (prevents cascade rebuilds on keystroke)
- Flatten timeline from 2-level turn×response Column to single virtualized ListView.builder
- Add RepaintBoundary per timeline item (isolates repaints during scroll)
- Use context.select for granular rebuilds instead of top-level context.watch
- Lazy ExpandableCard: child not built until first expand (replaces AnimatedCrossFade)
- Use IndexedStack in AppShell (preserves screen state across tab switches)
Fixes:
- Collect parse errors instead of silently swallowing them
- Show parse error count in timeline filter bar
- Fix overflow in tokens screen pie chart legend
Build:
- Configure Developer ID signing with hardened runtime for production distribution
- Enable secure timestamps for notarization
- Update app name to Claude Session Viewer
- Signed, notarized, stapled DMG distribution
- Rename package, bundle ID, and all display strings from
"Claude Session Viewer" to "Claude Session Analysis"
- Bundle ID: com.svrnty.claudeSessionAnalysis
- Add App Store category (developer-tools) to Info.plist
- Add PrivacyInfo.xcprivacy privacy manifest (required by Apple)
- Bump deployment target from macOS 10.15 to 13.0
- Fix App Sandbox: resolve real home directory so ~/.claude/projects
is accessible in sandboxed release builds
- Make project name parsing dynamic (no hardcoded username)
- Auto-detect Claude Code data directory at ~/.claude/
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
A desktop app that parses Claude Code .jsonl session logs and provides
a rich UI for exploring conversations, tool usage, subagents, and token
consumption. Features include project browser with auto-discovery of
~/.claude/projects, conversation timeline with inline subagent expansion,
agents overview, toolbelt chart, and token usage dashboard.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>