{"id":50746468,"url":"https://github.com/msune/l2radar","last_synced_at":"2026-06-10T21:32:29.799Z","repository":{"id":339004868,"uuid":"1157454329","full_name":"msune/l2radar","owner":"msune","description":"An eBPF L2 neighbour tracker","archived":false,"fork":false,"pushed_at":"2026-02-28T01:21:07.000Z","size":7111,"stargazers_count":11,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-28T05:46:23.207Z","etag":null,"topics":["ebpf","l2","security","sniffing"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/msune.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-02-13T20:52:19.000Z","updated_at":"2026-02-28T04:21:51.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/msune/l2radar","commit_stats":null,"previous_names":["msune/l2radar"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/msune/l2radar","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/msune%2Fl2radar","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/msune%2Fl2radar/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/msune%2Fl2radar/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/msune%2Fl2radar/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/msune","download_url":"https://codeload.github.com/msune/l2radar/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/msune%2Fl2radar/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34172196,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-10T02:00:07.152Z","response_time":89,"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":["ebpf","l2","security","sniffing"],"created_at":"2026-06-10T21:32:28.057Z","updated_at":"2026-06-10T21:32:29.794Z","avatar_url":"https://github.com/msune.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"right\"\u003e\n  \u003ca href=\"https://code.claude.com/docs/en/\" target=\"_blank\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/Built%20with-Claude%20Code-blueviolet?logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0id2hpdGUiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQxIDAtOC0zLjU5LTgtOHMzLjU5LTggOC04IDggMy41OSA4IDgtMy41OSA4LTggOHoiLz48L3N2Zz4=\" alt=\"Built with Claude Code\" height=\"28\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/msune/l2radar/actions\" target=\"_blank\"\u003e\u003cimg src=\"https://github.com/msune/l2radar/actions/workflows/ci.yml/badge.svg\" alt=\"CI\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/img/logo_wiki.png\" alt=\"L2 Radar\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cem\u003e(Mostly) generated \u003ca href=\"https://code.claude.com/docs/en/\" target=\"_blank\"\u003eClaude Code\u003c/a\u003e · Directed \u0026 reviewed by a human \u003c/em\u003e 🧑\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n\u003c/p\u003e\n\n# 📡 `l2radar`\n\n**Passive L2 neighbour monitor powered by eBPF.** See every device on your\nnetwork — MACs, IPs, vendors — without sending a single packet.\n\nL2 Radar attaches eBPF probes to your network interfaces via\n[TCX ingress](https://docs.kernel.org/bpf/), silently observes regular traffic,\nARP and NDP traffic, and presents everything in a slick dark-themed dashboard.\n\n## 🎬 Demo\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/msune/l2radar/releases/latest/download/demo.gif\" alt=\"L2Radar dashboard demo\" width=\"900\"\u003e\n\u003c/p\u003e\n\n## ✨ Features\n\n- 🐝 **eBPF-powered** — zero packet injection, zero interference, zero overhead\n- 🔍 **ARP + NDP parsing** — discovers IPv4 and IPv6 neighbours automatically\n- 🏭 **OUI vendor lookup** — resolves MAC addresses to manufacturer names\n- 🌐 **Web dashboard** — real-time, searchable, sortable, mobile-friendly\n- 🔒 **HTTPS + auth** — TLS and basic auth out of the box\n\n## 🚀 Quick Start\n\n**1. Install `l2rctl`:**\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/msune/l2radar/latest/install-l2rctl.sh | bash\n```\n\nTo install a specific version:\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/msune/l2radar/latest/install-l2rctl.sh | bash -s -- v0.1.0\n```\n\n**2. Start everything:**\n\n```bash\nl2rctl start\n```\n\n**3. Open the dashboard:**\n\n👉 **https://localhost** (accept the self-signed cert)\n\nThat's it! L2 Radar is now watching all your external interfaces. 🎉\n\n## 📖 Usage\n\n```bash\n# Start only the probe (headless)\nl2rctl start probe --iface eth0 --iface wlan0\n\n# Start with custom TLS certs\nl2rctl start --tls-dir /etc/mycerts --user admin:secret\n\n# Check what's running\nl2rctl status\n\n# Dump the neighbour table from the terminal\nl2rctl dump --iface eth0\n\n# Stop everything\nl2rctl stop\n```\n\n### Interface Keywords\n\n| Keyword | Meaning |\n|---------|---------|\n| `external` (default) | All external interfaces (skips docker, veth, bridges) |\n| `any` | Every non-loopback L2 interface (includes docker, veth, bridges) |\n\n## 🏗️ Architecture\n\nL2 Radar has three components:\n\n| Component | Container | What it does |\n|-----------|-----------|-------------|\n| **eBPF Probe** | `l2radar` | Attaches to NICs, writes neighbour data to BPF maps, exports JSON |\n| **Web UI** | `l2radar-ui` | nginx + React dashboard, serves JSON data read-only |\n| **l2rctl** | _(host binary)_ | Orchestrates the containers via Docker CLI |\n\nThe probe and UI communicate through **JSON files on a shared Docker named\nvolume** (default `l2radar-data`, mounted at `/var/lib/l2radar` in both\ncontainers) — no network calls between them.\n\n```\n ┌──────────────────────┐     l2radar-data volume       ┌──────────────────────┐\n │     eBPF Probe       │       neigh-eth0.json         │       Web UI         │\n │                      │──────────────────────────────▶│                      │\n │  TCX ingress hooks   │      neigh-wlan0.json         │  nginx + React SPA   │\n │  ARP/NDP parsing     │──────────────────────────────▶│  auto-refresh polls  │\n │  JSON export loop    │         (read-only)           │  OUI vendor lookup   │\n └──────────────────────┘                               └──────────────────────┘\n        privileged                                          ports 443 (80)\n        --network=host                                      unprivileged\n```\n\n📚 **[Full architecture docs →](docs/architecture.md)**\n\n## 📋 Requirements\n\n- Linux with kernel **6.6+** (for TCX)\n- Docker\n- Go 1.24+ (for installing `l2rctl`)\n\n## 🛠️ Development\n\nTODO\n\n## 📄 License\n\nBSD 2-Clause. eBPF code (`probe/bpf/`) is dual-licensed BSD-2-Clause OR\nGPL-2.0. See [LICENSE](LICENSE).\n\n\u003cp align=\"center\"\u003e\n  \u003csub\u003eMade with ❤️ from Barcelona · Powered by 🐝 eBPF\u003c/sub\u003e\n\u003c/p\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmsune%2Fl2radar","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmsune%2Fl2radar","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmsune%2Fl2radar/lists"}