{"id":49857846,"url":"https://github.com/abra5umente/logninja","last_synced_at":"2026-05-14T20:35:17.928Z","repository":{"id":309910334,"uuid":"1037948561","full_name":"abra5umente/logninja","owner":"abra5umente","description":"A fast, local, and powerful log viewer and parser, available in your browser.","archived":false,"fork":false,"pushed_at":"2025-11-03T06:59:44.000Z","size":569,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-11-03T07:07:04.466Z","etag":null,"topics":["logs","logviewer","opensource-apps","parsing","webapp"],"latest_commit_sha":null,"homepage":"https://logninja.midgard-realm.xyz","language":"TypeScript","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/abra5umente.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"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}},"created_at":"2025-08-14T11:25:57.000Z","updated_at":"2025-11-03T06:59:47.000Z","dependencies_parsed_at":"2025-08-14T14:34:02.918Z","dependency_job_id":"17bc1e87-5920-4798-bde6-11cf04f71738","html_url":"https://github.com/abra5umente/logninja","commit_stats":null,"previous_names":["abra5umente/logninja"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/abra5umente/logninja","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abra5umente%2Flogninja","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abra5umente%2Flogninja/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abra5umente%2Flogninja/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abra5umente%2Flogninja/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/abra5umente","download_url":"https://codeload.github.com/abra5umente/logninja/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abra5umente%2Flogninja/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33042394,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-13T13:14:54.681Z","status":"online","status_checked_at":"2026-05-14T02:00:06.663Z","response_time":57,"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":["logs","logviewer","opensource-apps","parsing","webapp"],"created_at":"2026-05-14T20:35:17.097Z","updated_at":"2026-05-14T20:35:17.923Z","avatar_url":"https://github.com/abra5umente.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# LogNinja\n\u003cimg width=\"1723\" height=\"895\" alt=\"Untitled\" src=\"https://github.com/user-attachments/assets/d29c693d-6035-4fbd-a5f9-b3d6ca9bbb4f\" /\u003e  \nA fast, client‑side log viewer built with Vite + React + TypeScript. Drag and drop logs, filter by level/text/regex, browse a timeline, and export results. Designed to work entirely in the browser (no uploads).  \n\n## Features\n\n### UI \u0026 Layout\n- **Three-column layout**: Controls on left, log viewer center, search/files on right\n- **Clean initial state**: When no files are loaded, only the LogNinja logo and file browser are shown - all other UI elements appear after loading\n- **Loading animations**: Smooth blur overlay with animated logo and spinner during file processing, with checkmark completion state\n- **Global drag \u0026 drop**: Drop `.log/.txt/.csv` files anywhere on the window (UTF‑8/UTF‑16 BOM aware)\n- **Modal interactions**: Settings sidebar, Airlock summary modal with ESC/click-outside to dismiss\n\n### Log Viewing\n- **High-performance virtual scrolling**: Handles millions of log entries smoothly\n  - True infinite scrolling (no pagination)\n  - Dynamic line wrapping with auto-height rows\n  - **Wrap toggle**: Switch between single-line (horizontal scroll) and multi-line (auto-wrap) views\n- **Multi-file support**: Load multiple log files with color-coded file indicators\n- Basic log summary view on upload\n- Row selection + Ctrl/Cmd+C to copy the full raw line\n  - Selected rows persist across filter changes (auto-scrolls to keep selected row visible)\n\n### Search \u0026 Filtering\n- **Search**: plain text or regex, with match highlighting\n  - Filter or highlight-only modes\n  - Clear button to quickly reset search\n  - Search presets for common queries\n- **File filtering** (multi-file support):\n  - Click a file → filter to show only that file's entries\n  - Ctrl+Click files → multi-select mode (toggle multiple files on/off)\n  - Click selected file again → deselect it (shows all files)\n  - Visual feedback: selected files at full opacity, unselected dimmed\n- **Level filtering**: ERROR, WARN, INFO, DEBUG, TRACE, UNKNOWN\n  - Dynamically shows only levels present in loaded/filtered files\n  - Click a level → filter to that level only\n  - Ctrl+Click levels → multi-select mode (toggle multiple levels on/off)\n  - Visual feedback: selected levels highlighted, unselected dimmed\n- **Time range filtering** via timeline drill-down\n- **Reset button**: Clears all filters (search, files, levels, time range) at once\n\n### Timeline \u0026 Navigation\n- **Hierarchical timeline with drill-down**: Navigate long time spans efficiently\n  - Auto-detects starting level (Day for \u003e24hr spans, Hour for ≤24hr)\n  - Five levels: Day → Hour → 15min → Minute → Second\n  - **Filters log view at every drill level** - not just at the deepest level\n  - Incremental back navigation: \"← Back to Hours\", \"← Back to Days\", etc.\n  - Card-based bin design with event counts inside each bin\n  - Horizontal date/time labels for easy reading\n  - Visual histogram showing log level breakdown for each time bin\n  - Fixed statistics panel prevents layout shift during navigation\n  - Optimized for large time spans (handles year+ log files without stack overflow)\n\n### Bookmarks \u0026 Export\n- Bookmarks: star lines and export them (CSV/Markdown includes \"Bookmarked Lines\")\n  - **Bookmark-only view**: Show only bookmarked lines with configurable context (±1, 3, 5, or 10 lines)\n- Export to CSV or Markdown\n- Copy all filtered entries to clipboard\n\n### Special Features\n- **Airlock summary**: Auto-detected for Airlock Digital logs (modal with 21 metadata fields; Windows + Linux agents)\n\n## Screenshots\nEnhanced Airlock Digital log support:\n\u003cimg width=\"1722\" height=\"898\" alt=\"Untitled\" src=\"https://github.com/user-attachments/assets/07732c55-1641-40c9-b96c-7559745a7d94\" /\u003e  \nLog Summary view:\n\u003cimg width=\"1723\" height=\"895\" alt=\"Untitled\" src=\"https://github.com/user-attachments/assets/d29c693d-6035-4fbd-a5f9-b3d6ca9bbb4f\" /\u003e  \nMarkdown Summary export view:\n\u003cimg width=\"1722\" height=\"892\" alt=\"Untitled\" src=\"https://github.com/user-attachments/assets/ea9e6e09-a7a4-4ef9-9080-07ba479a41dc\" /\u003e  \nSettings with light/dark mode themes and accent colour picker:\n\u003cimg width=\"1723\" height=\"896\" alt=\"Untitled\" src=\"https://github.com/user-attachments/assets/57ec2c79-c6da-499e-b930-806a8770eaba\" /\u003e  \nHighlight search mode:\n\u003cimg width=\"1723\" height=\"899\" alt=\"Untitled\" src=\"https://github.com/user-attachments/assets/4b4c73d2-a22a-4311-94e7-e64f9f58b847\" /\u003e  \n\n## Supported Formats (non‑exhaustive)\n- ISO/RFC3339, `YYYY-MM-DD HH:mm:ss[.SSS|,SSS]`\n- `YYYY/MM/DD HH:mm:ss[.SSS|,SSS]`\n- DMY/MDY `dd/MM/yyyy HH:mm:ss[.SSS][ AM|PM]` (inferred)\n- `dd Mon yyyy HH:mm:ss[.SSS]`\n- Apache/Nginx combined: `dd/Mon/yyyy:HH:mm:ss Z`\n- Redis: `PID:Role dd Mon yyyy HH:mm:ss.mmm \u003clevel-symbol\u003e ...`\n- Resque: `name: [LEVEL] \u003cISO ts\u003e: message`\n- Ruby logger lines: `W, [ISO ts #pid] WARN -- : message`\n- MongoDB structured JSON `{ \"t\": { \"$date\": ... }, \"s\": \"I\", \"msg\": ... }`\n- MSI: `MSI (c|s) (...) [HH:mm:ss:SSS]` (time‑only; date inferred from file), or `[YYYY-MM-DD HH:mm:ss:SSS]`\n\n## Getting Started\n\n**Local Install**\n- Requirements: Node.js 18+ and npm\n- Install: `npm install`\n- Dev: `npm run dev` (binds `0.0.0.0`), then visit `http://localhost:5173` or `http://yourip:5173` from network devices\n- Build: `npm run build`\n\n**Docker (recommended)**\n- Clone repo\n- Build the image: `docker build -t logninja .`\n- Run the container: `docker run --rm -p 8080:80 logninja`\n- Open http://localhost:8080\n\nAlternatively, run the container using `docker run --rm -p 8080:80 alexschladetsch/logninja:latest`\n \n## Keyboard \u0026 Tips\n- `/` focuses search, `Ctrl/Cmd+K` opens command palette\n- Click a row, then `Ctrl/Cmd+C` to copy its full raw text\n- **Wrap toggle**: Enable for multi-line rows that adapt to content length; disable for single-line rows with horizontal scrolling\n- **Timeline drill-down**: Click any bin to filter and explore deeper time ranges (Day → Hour → 15min → Minute → Second)\n- **Multi-select filtering**:\n  - `Ctrl/Cmd+Click` on files to select multiple files simultaneously\n  - `Ctrl/Cmd+Click` on log levels to select multiple levels simultaneously\n  - Click selected item again to deselect it\n- **Global drag \u0026 drop**: Drop log files anywhere on the page, not just the browse button\n- `ESC` or click outside to dismiss settings/Airlock modals\n- Virtual scrolling works smoothly in both wrap and no-wrap modes for optimal performance\n- Try and find the pizza-flavoured easter egg\n\n## Privacy\n\nThe app runs fully in your browser; logs are not uploaded. Exports are generated locally.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fabra5umente%2Flogninja","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fabra5umente%2Flogninja","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fabra5umente%2Flogninja/lists"}