{"id":50000865,"url":"https://github.com/annamedv/red","last_synced_at":"2026-05-24T01:01:09.278Z","repository":{"id":56729719,"uuid":"176564343","full_name":"annamedv/red","owner":"annamedv","description":"Red Analytics Tool","archived":false,"fork":false,"pushed_at":"2026-05-12T14:21:46.000Z","size":29,"stargazers_count":1484,"open_issues_count":0,"forks_count":51,"subscribers_count":15,"default_branch":"master","last_synced_at":"2026-05-12T16:07:49.779Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Go","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/annamedv.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},"funding":{"github":"antonmedv"}},"created_at":"2019-03-19T17:23:44.000Z","updated_at":"2026-05-12T14:55:31.000Z","dependencies_parsed_at":"2024-05-20T22:59:31.639Z","dependency_job_id":"e4b5bda0-9e0c-47ac-b2b8-dfaab9499e12","html_url":"https://github.com/annamedv/red","commit_stats":null,"previous_names":["antonmedv/red","maml-dev/maml","annamedv/red"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/annamedv/red","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/annamedv%2Fred","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/annamedv%2Fred/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/annamedv%2Fred/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/annamedv%2Fred/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/annamedv","download_url":"https://codeload.github.com/annamedv/red/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/annamedv%2Fred/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33417489,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-23T22:14:44.296Z","status":"ssl_error","status_checked_at":"2026-05-23T22:14:43.778Z","response_time":53,"last_error":"SSL_read: 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":[],"created_at":"2026-05-19T12:00:36.768Z","updated_at":"2026-05-24T01:01:09.272Z","avatar_url":"https://github.com/annamedv.png","language":"Go","funding_links":["https://github.com/sponsors/antonmedv"],"categories":["Go"],"sub_categories":[],"readme":"# red\n\n![red](https://user-images.githubusercontent.com/141232/54882450-bb85b200-4e8c-11e9-8bd9-37cf43b5b1ed.gif)\n\n_Red_ is a terminal log analysis tools.\n\n## Usage\n\nPipe JSON stream logs into _red_ and specify a few fields to display. For example using with kubernetes:\n\n```bash\nkubectl logs ... | red level message\n```\n\nYou will see combined logs with trend sparkline and total count.\n\n## Install\n\n```bash\ngo install github.com/antonmedv/red@latest\n```\n\n## Usage\n\nPipe newline-delimited JSON into `red` and list fields to group by:\n\n```bash\n... | red \u003cfield\u003e [\u003cfield\u003e ...]\n```\n\nKeys:\n\n- `↑` / `↓` — select a row\n- `Enter` — open detail view for the selected row\n- `Esc` — close detail view\n\nFlags:\n\n- `-trend \u003cduration\u003e` — trend window (default `10s`)\n- `-distance \u003cn\u003e` — Levenshtein distance for grouping (default `3`)\n\n## Kubernetes\n\n```bash\nkubectl logs -f deploy/api | red level message\n```\n\n## Caddy access logs\n\nCaddy's default access log is JSON, so it works directly. Most useful fields\nare nested under `request`, so flatten them with `jq` first.\n\nEnable JSON access logs in your Caddyfile:\n\n```caddyfile\nexample.com {\n    log {\n        output file /var/log/caddy/access.log\n        format json\n    }\n    reverse_proxy localhost:8080\n}\n```\n\nThen watch live traffic:\n\n```bash\ntail -F /var/log/caddy/access.log \\\n  | jq -c '{status, method: .request.method, uri: .request.uri, ip: .request.client_ip}' \\\n  | red status method uri\n```\n\n### Visitor stats recipes\n\nTop requested paths:\n\n```bash\ntail -F /var/log/caddy/access.log \\\n  | jq -c '{uri: .request.uri}' \\\n  | red uri\n```\n\nTop client IPs (visitors):\n\n```bash\ntail -F /var/log/caddy/access.log \\\n  | jq -c '{ip: .request.client_ip}' \\\n  | red ip\n```\n\nStatus code distribution:\n\n```bash\ntail -F /var/log/caddy/access.log \\\n  | jq -c '{status}' \\\n  | red status\n```\n\nTop user agents (with longer trend window):\n\n```bash\ntail -F /var/log/caddy/access.log \\\n  | jq -c '{ua: (.request.headers.\"User-Agent\"[0] // \"-\")}' \\\n  | red -trend 1m ua\n```\n\n## Nginx access logs\n\nNginx's default log format is plain text. Convert to JSON first — either by\nconfiguring nginx to emit JSON, or by piping through a parser.\n\nConfigure nginx for JSON access logs in `nginx.conf`:\n\n```nginx\nlog_format json_combined escape=json\n  '{'\n    '\"time\":\"$time_iso8601\",'\n    '\"remote_addr\":\"$remote_addr\",'\n    '\"method\":\"$request_method\",'\n    '\"uri\":\"$request_uri\",'\n    '\"status\":$status,'\n    '\"bytes_sent\":$bytes_sent,'\n    '\"referer\":\"$http_referer\",'\n    '\"user_agent\":\"$http_user_agent\"'\n  '}';\n\naccess_log /var/log/nginx/access.log json_combined;\n```\n\nThen:\n\n```bash\ntail -F /var/log/nginx/access.log | red status method uri\n```\n\nTop visitor IPs:\n\n```bash\ntail -F /var/log/nginx/access.log \\\n  | jq -c '{remote_addr}' \\\n  | red remote_addr\n```\n\n## Ideas for visitors analytics UI\n\nNow red show one table only. For watching site visitors in live mode, more\nnice UI can help very much. Here is some simple ideas — written by simple\nwords, without difficult terms.\n\n### Big numbers on top\n\nShow some big numbers on top of screen, so you can see most important\ninformations from one look:\n\n- **Visitors now** — how many peoples was on site in last 5 minutes\n- **Page views per minute** — how much site is busy\n- **Errors per minute** — how many 4xx and 5xx answers from server\n- **Middle page time** — how fast pages is loading\n\nThis numbers change in live time when new logs is coming.\n\n### Divide screen on panels\n\nInstead of one table, show many small panels near each other:\n\n```\n┌─────────────────────┬──────────────────────┐\n│  Top pages          │  Top countries       │\n│  /                  │  USA                 │\n│  /blog              │  Great Britain       │\n│  /pricing           │  Germany             │\n├─────────────────────┼──────────────────────┤\n│  Status codes       │  Visitors now: 42    │\n│  ▇▇▇▇▇ 200 (89%)    │  Page views: 1.2k/m  │\n│  ▇ 404 (8%)         │  Errors: 3/m         │\n│  ▏ 500 (3%)         │  Middle load: 240ms  │\n└─────────────────────┴──────────────────────┘\n```\n\nEvery panel watch one thing. You see all picture without scrolling.\n\n### Colors with sense\n\nUse colors, so problems is visible:\n\n- **Green** — all good (200 OK)\n- **Yellow** — be careful (404 Not Found, slow pages)\n- **Red** — bad (500 errors, very very slow pages)\n\nWhen you see many red — something is broken. When all green — everything\nworks in normal mode.\n\n### Map of world for visitors\n\nDraw small ASCII map of world. Make light countries where visitors are\nsitting right now. More bright color means more peoples from this country.\n\nFor this need IP-to-country base (free MaxMind GeoLite2 is good and works\nwithout problems).\n\n### Click for go deeper\n\nClick on row in \"Top pages\" — and other panels make filter only for this\npage. Click on country — see visitors only from there. Press Esc for come\nback.\n\nSo red become not only viewer, but tool for research.\n\n### Pause and back in time\n\nPause button for stop screen. Very comfortable when something interesting\nhappen and you want look on it without new logs running up.\n\nSmall time slider for scroll back on last few minutes.\n\n### Find strange traffic\n\nMark rows what look not normal:\n\n- Same IP open many pages very fast (maybe is bot)\n- Many 404 from one IP (somebody search secret files)\n- Sudden big quantity of one user agent\n- New country what never was before\n\nShow small warning icon near row. Click on it for see why.\n\n### Browsers and devices\n\nPanel what show what peoples use:\n\n```\nBrowsers           Devices\nChrome   ▇▇▇▇ 62%   Mobile  ▇▇▇ 48%\nSafari   ▇▇ 24%     Desktop ▇▇▇ 45%\nFirefox  ▇ 10%      Tablet  ▏ 7%\nOther    ▏ 4%\n```\n\nThis data is parsing from User-Agent header.\n\n### Search line\n\nSearch line on top. Write path, IP or status code, and all UI make filter\nfor this. Press Esc for clean.\n\n### Web UI with login and tracking script\n\nTerminal is good for engineers, but not all peoples like black window with\ntext. Web UI in browser can be much more friendly for everybody.\n\nHow it can work:\n\n1. **Tracking script** — small JavaScript file (like 1-2 kilobyte), site\n   owner put it on every page:\n\n   ```html\n   \u003cscript defer src=\"https://red.example.com/track.js\"\n           data-site=\"my-blog\"\u003e\u003c/script\u003e\n   ```\n\n   Script send small ping when visitor open page. Ping contain: page URL,\n   referer, screen size, language, user agent. No cookies, no personal\n   datas — so GDPR is happy.\n\n2. **Server part** — red receive this pings on endpoint like\n   `/api/event`, save them on disk or in small base (SQLite works fine\n   without big setup).\n\n3. **Login page** — simple form with email and password. After login user\n   see dashboard. One account can watch many sites.\n\n   ```\n   ┌──────────────────────────────┐\n   │     Welcome to red           │\n   │                              │\n   │  Email:    [______________]  │\n   │  Password: [______________]  │\n   │                              │\n   │         [  Sign in  ]        │\n   │                              │\n   │  Forgot password? Register   │\n   └──────────────────────────────┘\n   ```\n\n   For begin can be enough one admin user from config file. Later — make\n   normal registration with email confirm.\n\n4. **Dashboard in browser** — same ideas like terminal UI (big numbers,\n   panels, map, colors), but with mouse, animation and more space. Charts\n   can be drawn beautiful with library like Chart.js or just SVG by hand.\n\n5. **Share link** — generate public link what show statistics for one\n   site, without login. Useful when you want show numbers to client or\n   on Twitter.\n\nWhy this is good:\n\n- Site owner not need to keep terminal open all day\n- Can open dashboard from phone in bus\n- Can give access to colleagues without SSH key\n- Looks more professional for non-technical peoples\n\nWhat red already have for this — JSON logs processing and grouping logic.\nNeed to add: HTTP server, tracking endpoint, login system, HTML pages.\nBig job, but very interesting.\n\n### Why this is important\n\nNow red is good for engineers what read logs. With this ideas it can also\nhelp to not-engineers — product peoples, marketing, support — for see what\nis happening on site, and not learn terminal commands.\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fannamedv%2Fred","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fannamedv%2Fred","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fannamedv%2Fred/lists"}