{"id":49341104,"url":"https://github.com/thefinder808/traceview","last_synced_at":"2026-04-27T04:02:54.601Z","repository":{"id":353667298,"uuid":"1202926111","full_name":"thefinder808/TraceView","owner":"thefinder808","description":"Native macOS log viewer inspired by CMTrace — real-time following, severity highlighting, built-in error-code lookup, Console.app-style sidebar.","archived":false,"fork":false,"pushed_at":"2026-04-24T22:06:40.000Z","size":10097,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-25T00:24:51.281Z","etag":null,"topics":["cmtrace","log-viewer","logs","macos","swift","swiftui"],"latest_commit_sha":null,"homepage":"https://github.com/thefinder808/TraceView","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/thefinder808.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"buy_me_a_coffee":"thefinder808"}},"created_at":"2026-04-06T14:43:59.000Z","updated_at":"2026-04-24T16:22:19.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/thefinder808/TraceView","commit_stats":null,"previous_names":["thefinder808/traceview"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/thefinder808/TraceView","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thefinder808%2FTraceView","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thefinder808%2FTraceView/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thefinder808%2FTraceView/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thefinder808%2FTraceView/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/thefinder808","download_url":"https://codeload.github.com/thefinder808/TraceView/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thefinder808%2FTraceView/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32321940,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-26T23:26:28.701Z","status":"online","status_checked_at":"2026-04-27T02:00:06.769Z","response_time":128,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cmtrace","log-viewer","logs","macos","swift","swiftui"],"created_at":"2026-04-27T04:02:44.811Z","updated_at":"2026-04-27T04:02:54.596Z","avatar_url":"https://github.com/thefinder808.png","language":"Swift","funding_links":["https://buymeacoffee.com/thefinder808"],"categories":[],"sub_categories":[],"readme":"# TraceView\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n[![macOS 14+](https://img.shields.io/badge/macOS-14%2B-black.svg?logo=apple)](#requirements)\n[![Buy Me a Coffee](https://img.shields.io/badge/Buy_Me_A_Coffee-FFDD00?logo=buy-me-a-coffee\u0026logoColor=black)](https://buymeacoffee.com/thefinder808)\n\nA native macOS log viewer for admins, developers, and anyone who reads too many log files. Inspired by Microsoft's CMTrace.\n\nReal-time file following, severity-aware highlighting, built-in error-code lookup, and a Console.app-style browser for system reports — all in a SwiftUI interface that feels at home on macOS 14+.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/screenshot.gif\" alt=\"TraceView in motion: split view live-tailing two log files side-by-side with severity summary chips, density histograms, and a sidebar browsing /var/log plus crash/diagnostic/spin reports\" width=\"900\"/\u003e\n\u003c/p\u003e\n\n## Features\n\n- **Real-time following** — new lines auto-scroll into view. Scroll up to investigate, scroll back down to resume. Kernel-level file watching (`DispatchSource`), no polling.\n- **Severity highlighting** — errors get red row backgrounds, warnings get yellow, critical rows are deeper red. Detected from structured formats (`messageType`, JSON `level`, SCCM `type`) and fallback keyword heuristics for plain text.\n- **Severity summary chips** — live per-level counts (`Critical 4 · Error 127 · Warning 342 · …`). Click to filter.\n- **Event histogram** — 60-bucket density strip above the table, stacked error/warn bars, trailing \"now\" marker. **Click any bucket to jump to that moment** — the click lands on the highest-severity entry in the bucket so a click on a red spike actually opens an error. **Spike preservation** keeps live-tail histograms readable: as the time range stretches, earlier spikes leave a faint shadow at their original height instead of fading into the noise floor. Auto-hides when timestamps aren't parseable.\n- **Expand-in-place drawer** — single-click any row to expand it with metadata, full message, and action pills (`Copy`, `Filter to component`, `Lookup error code`). Switchable to a bottom detail pane in Settings.\n- **Error-code lookup inspector** — built-in database for `errno`, `OSStatus`, `IOReturn`, Mach `kern_return_t`, and HTTP status codes. Accepts decimal, hex, symbolic, or auto-detect input. Inline error codes in log messages are tappable.\n- **Saved filter presets** — snapshot the current filter to a named pill in the filter bar. Persisted.\n- **Tabs** — multiple logs open in tabs with live-stream pulse dot.\n- **Split view with scroll-sync** — open two logs side by side, with optional pane scroll-sync (⇧⌘S) so scrolling one pane drives the other to the closest matching timestamp. Following state mirrors across panes when sync is on. Active pane is marked with a 2px theme-tinted top accent strip; menu shortcuts (⌘F, ⌘G, ⇧⌘G, ⌘D, ⌘⌥R) route to whichever pane has focus — set via row click, tab click, or filter-bar focus.\n- **Merged log view** — combine 2+ open logs into a single timeline sorted by timestamp. Each row tagged with its source; right-click to jump back to the original log. Per-source filter chips, drop-untimestamped, live-append from any source.\n- **Console-style sidebar** — browse `/var/log`, `~/Library/Logs`, `/Library/Logs`, plus `.ips` reports split into Crash / Diagnostic / Spin buckets by filename classification (same rule Console.app uses). Right-click any report to open it directly in the left or right pane.\n- **Bookmarks** — ⌘D bookmarks the selected row. The sidebar's Bookmarks section aggregates across every open doc, grouped by file, so you can jump back to any marked line regardless of which tab is active. Hover any bookmark for a one-click ✕ remove.\n- **Live unified log** — wraps `log stream --style ndjson` for real-time system log capture with optional predicate filtering.\n- **Multiple parsers** — PlainText, UnifiedLog (`log show/stream` JSON), JSONLines (including whole-file arrays), CSV, SCCM, IPS crash reports, and `.diag` diagnostic reports. Auto-detected by scoring the first ~50 lines of each file.\n- **Themes** — Console (default), Light, Dark, Neon.\n- **Keyboard shortcuts** — `Cmd+O` open · `Cmd+Shift+O` open in right pane · `Cmd+F` search · `Cmd+G` / `Cmd+Shift+G` next/previous match · `Cmd+D` toggle bookmark · `Cmd+Opt+R` toggle regex matching · `Cmd+Shift+L` error lookup · `Cmd+Shift+S` toggle pane sync · `Cmd+Shift+E` export · `Cmd+K` command palette · `Cmd+T` cycle theme. Full list in [spec.md](spec.md#keyboard-shortcuts).\n\n## Screenshots\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/screenshots/split-sync.png\" alt=\"Split view with scroll-sync enabled\"/\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/screenshots/combined-view.png\" alt=\"Merged log view combining two logs into one timeline\"/\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\u003csub\u003eSplit view with scroll-sync — both panes locked to the same timestamp\u003c/sub\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003csub\u003eMerged log view — two logs combined into a single sorted timeline with per-source filters\u003c/sub\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/screenshots/split-dual-filter.png\" alt=\"Split view with independent filters in each pane\"/\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/screenshots/split-err-filter.png\" alt=\"Split view with an ERROR-level filter applied to both panes\"/\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\u003csub\u003eSplit view with independent filters per pane\u003c/sub\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003csub\u003eFiltered to errors — histogram shows the cluster\u003c/sub\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/screenshots/dark-theme.png\" alt=\"TraceView in the Dark theme\"/\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/screenshots/single-err-filter.png\" alt=\"Single pane with histogram and error filter\"/\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\u003csub\u003eDark theme\u003c/sub\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003csub\u003eSingle pane — histogram and severity chips up close\u003c/sub\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n## Requirements\n\n- macOS 14 (Sonoma) or later\n- Swift 5.9 toolchain (ships with Xcode 15+)\n\n## Build\n\n```sh\n./build.sh run       # build .app and run with stdout visible (dev loop)\n./build.sh app       # build debug .app bundle → build/TraceView.app\n./build.sh release   # build release .app bundle\n./build.sh install   # build release and copy to /Applications\n./build.sh clean     # nuke build artifacts\n```\n\n`./build.sh run` is the normal dev command. It compiles with SPM, assembles a real `.app` around the binary, ad-hoc code-signs it, and execs the binary directly so `print()` output stays in your terminal. Running inside a proper bundle matters — some AppKit/SwiftUI APIs (menu bar, UserDefaults domain, TCC prompts, window restoration) misbehave for bare binaries.\n\n## Architecture\n\n```\nSources/TraceView/\n  App/               @main, scenes, commands, AppState, SettingsManager\n  Models/            LogEntry, LogLevel, LogDocument, LogFilter, LogFilterPreset\n  Parsing/           LogParser protocol + seven built-in parsers + auto-detect\n  Services/          FileWatcher, UnifiedLogStream, ErrorCodeLookup,\n                     LogBrowserService, ExportService\n  ViewModels/        LogDocumentViewModel, ErrorLookupViewModel\n  Theme/             AppTheme protocol, ThemeManager, Console/Light/Dark/Neon\n  Views/\n    Components/      CommandPalette, StatusBarView, LogLevelBadge\n    Sidebar/         SidebarView (Open Files / Reports / System Logs)\n    LogView/         NSLogTableView (AppKit-backed for perf), LogRowView,\n                     FilterBarView, SeveritySummaryBar, HistogramView,\n                     TabBarView, FilterPresetsView, InlineRowDetailView,\n                     DetailPaneView\n    ErrorLookup/     ErrorLookupPanel\n    ContentView, WelcomeView, SettingsView\n```\n\nThe log table is an `NSTableView` wrapped via `NSViewRepresentable` — SwiftUI's `LazyVStack` can't keep up with 100K+ line files or live-tail bursts. Everything else is pure SwiftUI.\n\nFull design + feature spec in [spec.md](spec.md).\n\n## Performance targets\n\n| Scenario | Target |\n|----------|--------|\n| Open 100K-line file | \u003c 2s to first render |\n| Scroll 100K lines | 60 fps |\n| Live tail at 100 lines/sec | Smooth, no lag |\n| Filter 100K lines | \u003c 500ms |\n| Memory (100K loaded) | \u003c 150 MB |\n\n## Status\n\nPhase 1 of the Console Dense redesign is shipped. Phase 2 (Clean Native / Observability / Editorial as selectable theme skins) is queued.\n\n## License\n\n[MIT](LICENSE) — use it, fork it, ship it. Attribution appreciated but not required.\n\n## Support\n\nTraceView is free and open source. If it saved you an hour of log-staring, you can [buy me a coffee](https://buymeacoffee.com/thefinder808) — zero pressure, always welcome.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthefinder808%2Ftraceview","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthefinder808%2Ftraceview","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthefinder808%2Ftraceview/lists"}