{"id":47982343,"url":"https://github.com/outlook84/journal-scope","last_synced_at":"2026-04-25T07:01:13.198Z","repository":{"id":349110952,"uuid":"1201098528","full_name":"outlook84/journal-scope","owner":"outlook84","description":"Modern, lightweight web interface for systemd-journald","archived":false,"fork":false,"pushed_at":"2026-04-04T11:07:21.000Z","size":804,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-04T11:40:02.775Z","etag":null,"topics":["journald","journald-logs","log","logging","systemd"],"latest_commit_sha":null,"homepage":"","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/outlook84.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":"2026-04-04T07:55:05.000Z","updated_at":"2026-04-04T11:07:26.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/outlook84/journal-scope","commit_stats":null,"previous_names":["outlook84/journal-scope"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/outlook84/journal-scope","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/outlook84%2Fjournal-scope","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/outlook84%2Fjournal-scope/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/outlook84%2Fjournal-scope/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/outlook84%2Fjournal-scope/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/outlook84","download_url":"https://codeload.github.com/outlook84/journal-scope/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/outlook84%2Fjournal-scope/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32253251,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-25T04:23:17.126Z","status":"ssl_error","status_checked_at":"2026-04-25T04:21:53.360Z","response_time":59,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["journald","journald-logs","log","logging","systemd"],"created_at":"2026-04-04T11:10:51.583Z","updated_at":"2026-04-25T07:01:13.139Z","avatar_url":"https://github.com/outlook84.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Journal Scope\n\n### Modern, lightweight web interface for systemd-journald\n\n[简体中文](docs/README.zh-CN.md)\n\nJournal Scope provides a fast, easy-to-deploy alternative to powerful but complex log management stacks, allowing you to view logs pulled from `systemd-journal-gatewayd` directly in your browser.\n\n![Log Viewer](docs/images/log.png)\n\n\u003cdetails\u003e\n\u003csummary\u003eClick to expand: More Screenshots (Backend, Mobile, etc.)\u003c/summary\u003e\n\u003cbr/\u003e\n\n![Backend View](docs/images/backend.png)\n\n![Mobile View](docs/images/mobile.png)\n\n\u003c/details\u003e\n\n---\n\n## 🚀 Key Features\n\n- **Live Tail**: View logs in real-time directly in your browser.\n- **Filtering**: Support for filtering by Unit, Syslog ID, Hostname, Boot ID, Transport, and log levels.\n- **Multi-Gateway Switching**: Easily switch between multiple Journal Gateway targets.\n- **PWA \u0026 Mobile Support**: Responsive design with PWA support, installable as an app on desktop and mobile.\n- **Low Footprint**: Lightweight Go backend with embedded static assets—no complex runtime required.\n\n---\n\n## 🚀 Deployment \u0026 Setup\n\n### 1. Prerequisites: Enable Journal Gateway\n\nJournal Scope relies on `systemd-journal-gatewayd` to fetch logs.\n\n```bash\n# Install the component (example for Debian/Ubuntu)\nsudo apt install systemd-journal-remote\n\n# Start and enable the Socket\nsudo systemctl enable --now systemd-journal-gatewayd.socket\n```\n*Note: This service listens on port 19531 on all interfaces by default. To restrict it (e.g., to localhost only), run `sudo systemctl edit systemd-journal-gatewayd.socket` and add:*\n\n```ini\n[Socket]\nListenStream=\nListenStream=127.0.0.1:19531\n```\n\u003e [!TIP]\n\u003e Configuring mTLS is a more secure option. However, please note that `systemd-journal-gatewayd` in Debian currently has a known bug that prevents mTLS from working correctly (see [Debian Bug #1100729](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1100729)).\n\n### 2. Run Journal Scope\n\n#### Option A: Using Docker\n```bash\ndocker run --name journal-scope -d -p 3030:3030 \\\n  -v ./journal-scope-data:/data \\\n  ghcr.io/outlook84/journal-scope:latest\n```\n\n#### Option B: Using Binary\nDownload the binary for your system from the [Releases](https://github.com/anshi/stitch/releases) page:\n```bash\n# Run it\n./journal-scope\n```\nOnce started, access the Web UI. After logging in with the `admin` access code, click the **Backend** option in the top-right menu to add a Journal Gateway address.\n\n\u003e [!IMPORTANT]\n\u003e **First Run**: The initial `admin` and `viewer` access codes are printed directly to the **terminal output** or **Docker logs**.\n\u003e \n\u003e **Lost your Admin code?**\n\u003e 1. Stop Journal Scope.\n\u003e 2. Edit the `data/config.json` file (default path).\n\u003e 3. Set the `admin_code_hash` value to `\"\"` (empty string) and save.\n\u003e 4. Restart the service; a new admin code will be generated and printed to stdout.\n\n---\n\n## ⚙️ Environment Variables\n\n### Server Settings\n| Variable | Description | Default |\n| :--- | :--- | :--- |\n| `JOURNAL_SCOPE_LISTEN_ADDR` | Server listen address | `127.0.0.1:3030` |\n| `JOURNAL_SCOPE_DATA_DIR` | Directory for persistent state | `data` |\n| `JOURNAL_SCOPE_TRUST_PROXY_HEADERS` | Trust `X-Forwarded-For` from reverse proxies | `false` |\n\n\u003cdetails\u003e\n\u003csummary\u003eClick to expand: More Environment Variables\u003c/summary\u003e\n\u003cbr/\u003e\n\n### Security \u0026 Auth\n| Variable | Description | Default |\n| :--- | :--- | :--- |\n| `JOURNAL_SCOPE_MASTER_SECRET` | Deployment-level root secret (auto-generated if unset) | *auto* |\n| `JOURNAL_SCOPE_BOOTSTRAP_ADMIN_CODE` | Initial admin access code (first start only) | *auto* |\n| `JOURNAL_SCOPE_SESSION_TTL` | Session duration | `168h` |\n| `JOURNAL_SCOPE_COOKIE_SECURE` | Set `Secure` attribute on cookies (recommended over HTTPS) | `false` |\n\n### Journal Gateway Connectivity\n| Variable | Description |\n| :--- | :--- |\n| `JOURNAL_SCOPE_GATEWAY_CA_FILE` | PEM CA bundle for Gateway mTLS connections |\n| `JOURNAL_SCOPE_GATEWAY_CLIENT_CERT_FILE` | PEM client certificate for Gateway mTLS connections |\n| `JOURNAL_SCOPE_GATEWAY_CLIENT_KEY_FILE` | PEM client private key for Gateway mTLS connections |\n\n\u003c/details\u003e\n\n---\n\n## 📝 Usage Notes\n\n- **Log Limit**: Currently, a maximum of 10,000 log entries are pulled from the Journal Gateway.\n- **Filtering Logic**:\n    - Filtering between **different fields** (e.g., Unit and Priority) uses **AND** logic.\n    - Multiple values for the **same field** use **OR** logic.\n- **Keyword Filtering**: The keyword search only filters through the logs that have already been pulled into the client.\n    - Space-separated terms use **AND** logic: `error timeout`\n    - Double quotes keep literal phrases together: `\"connection reset\"`\n    - Prefix with `-` to exclude a term or phrase: `error -timeout`, `-\"retry later\"`\n    - Unquoted `FIELD=value` tokens are parsed as field filters, while quoted forms stay keyword literals: `SYSLOG_IDENTIFIER=sshd`, `\"SYSLOG_IDENTIFIER=sshd\"`\n    - Use `FIELD=\"value with spaces\"` when the field value itself contains spaces: `MESSAGE=\"connection reset by peer\"`\n\n---\n\n## 📄 License\nThis project is licensed under the MIT License.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foutlook84%2Fjournal-scope","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foutlook84%2Fjournal-scope","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foutlook84%2Fjournal-scope/lists"}