{"id":51121628,"url":"https://github.com/alex-poor/alavai","last_synced_at":"2026-06-25T03:01:23.665Z","repository":{"id":367045337,"uuid":"1277428226","full_name":"alex-poor/alavai","owner":"alex-poor","description":"A lightweight, distro-agnostic Tailscale client for Linux with one-click tailnet switching","archived":false,"fork":false,"pushed_at":"2026-06-24T09:46:05.000Z","size":1314,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-24T11:19:56.097Z","etag":null,"topics":["gui","iced","ksni","linux","mesh-vpn","rust","system-tray","tailnet","tailscale","tray","vpn","wireguard"],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/alex-poor.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","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-06-22T22:18:36.000Z","updated_at":"2026-06-24T09:46:09.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/alex-poor/alavai","commit_stats":null,"previous_names":["alex-poor/alavai"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/alex-poor/alavai","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alex-poor%2Falavai","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alex-poor%2Falavai/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alex-poor%2Falavai/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alex-poor%2Falavai/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/alex-poor","download_url":"https://codeload.github.com/alex-poor/alavai/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alex-poor%2Falavai/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34757355,"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-25T02:00:05.521Z","response_time":101,"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":["gui","iced","ksni","linux","mesh-vpn","rust","system-tray","tailnet","tailscale","tray","vpn","wireguard"],"created_at":"2026-06-25T03:01:22.527Z","updated_at":"2026-06-25T03:01:23.656Z","avatar_url":"https://github.com/alex-poor.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# alavai\n\nA lightweight, distro-agnostic **Tailscale client for Linux**, with **one-click\ntailnet switching** built in from the start. Written in Rust — a single\nself-contained binary, no GTK/Qt system dependencies, at home in any desktop\nenvironment or window manager.\n\n[![CI](https://github.com/alex-poor/alavai/actions/workflows/ci.yml/badge.svg)](https://github.com/alex-poor/alavai/actions/workflows/ci.yml)\n[![License: GPL v3](https://img.shields.io/badge/license-GPLv3-blue.svg)](LICENSE)\n[![Made with Rust](https://img.shields.io/badge/made%20with-Rust-orange.svg)](https://www.rust-lang.org/)\n[![PRs welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](CONTRIBUTING.md)\n\n\u003e Status: **early but functional.** The system tray and main window are usable\n\u003e today — see [Features](#features). A few features that depend on tailnet\n\u003e settings we couldn't test against (Taildrop, Mullvad) are scoped but not yet\n\u003e built. Roadmap and progress: [docs/PLAN.md](docs/PLAN.md).\n\n![alavai main window](docs/screenshot.png)\n\n## Why\n\nThere's no official Tailscale GUI for Linux. alavai is a native, pure-Rust one\nbuilt to be **lightweight and universal** — a single binary that's at home on any\ndistro and desktop — and to make the thing multi-account users do most,\n**switching tailnets**, a one-click, front-and-centre action in both the tray and\nthe window. The excellent [trayscale](https://github.com/DeedleFake/trayscale)\n(GTK/Go) showed what a good Linux Tailscale GUI looks like and is our feature\nreference.\n\n## Features\n\n- **One-click tailnet switching** — right-click the tray icon (or use the\n  in-window switcher) and pick a configured tailnet. Add, manage, and log in to\n  tailnets from the GUI.\n- **System tray** — a StatusNotifierItem icon with live status (connected /\n  disconnected / exit-node-active), connect/disconnect, and the tailnet switcher.\n- **Live main window** — sidebar of peers + detail pane, updating instantly from\n  the Tailscale event bus. Light and dark themes.\n- **Exit nodes** — pick a peer (or \"Automatic\"), keep LAN access, advertise this\n  machine as an exit node.\n- **Routes** — accept subnet routes; advertise your own (add/remove CIDRs).\n- **Per-peer detail** — addresses, online/last-seen, connection type, routes,\n  copy-to-clipboard.\n- **Diagnostics** — built-in `netcheck` (UDP, IPv4/IPv6, NAT traversal, captive\n  portal, relay latencies).\n- **Robust states** — operator-permission banner, daemon-down, and logged-in /\n  logged-out flows.\n- **Responsive** — adapts from a wide sidebar+detail layout down to a narrow\n  single-column view for tiling WMs.\n- **A small CLI** — `status`, `tailnets`, `switch`, `peers`, `netcheck`, and more.\n\n## How it works\n\nalavai talks directly to the local `tailscaled` daemon over its unix-socket\n**LocalAPI** (`/run/tailscale/tailscaled.sock`) — no Go, no bundled Tailscale\nlibrary. As with trayscale, the current user must be the Tailscale *operator*:\n\n```sh\nsudo tailscale set --operator=$USER\n```\n\n## Install\n\n### Build from source\n\nRequirements: **Rust** (2024 edition — 1.85+) and the Tailscale CLI/daemon.\n\n```sh\ngit clone https://github.com/alex-poor/alavai\ncd alavai\ncargo build --release\n./target/release/alavai tray   # run the tray daemon\n```\n\nThe tray needs a StatusNotifierItem host — KDE, GNOME with the AppIndicator\nextension, or most tray-capable window managers.\n\nA man page is provided at [`man/alavai.1`](man/alavai.1) (install to\n`$(mandir)/man1/`).\n\n## Usage\n\n```sh\nalavai tray        # system-tray daemon (one-click tailnet switching)\nalavai gui         # open the main window\nalavai switch karo # switch tailnet by id, name, or domain\n\nalavai status      # connection status + active tailnet\nalavai tailnets    # list configured tailnets (● = active)\nalavai peers       # list peers (online, IP, relay, routes, traffic)\nalavai netcheck    # connectivity diagnostics\nalavai autostart on # launch the tray on login (off / omit to disable / query)\n```\n\nRun `alavai --help` for the full command list.\n\n## Tech stack\n\n| Concern       | Choice                                                   |\n| ------------- | -------------------------------------------------------- |\n| Tailscale I/O | a custom LocalAPI client over the unix socket (no Go)    |\n| Event stream  | a blocking `watch-ipn-bus` reader (no async runtime)     |\n| Tray          | [`ksni`](https://crates.io/crates/ksni) (StatusNotifierItem) |\n| GUI           | [`iced`](https://iced.rs), tiny-skia software renderer (no GPU dep) |\n| Icons         | bundled SVGs rendered with `resvg`                       |\n\nNo `tokio`, no GTK/Qt, no wgpu. See [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md).\n\n## Contributing\n\nContributions are very welcome — see **[CONTRIBUTING.md](CONTRIBUTING.md)** for how\nto build, run, and submit changes, and **[good first issues](https://github.com/alex-poor/alavai/labels/good%20first%20issue)**\nto get started. Please also read the [Code of Conduct](CODE_OF_CONDUCT.md).\n\n## Documentation\n\n- [docs/PLAN.md](docs/PLAN.md) — roadmap and feature-parity matrix\n- [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) — how it's wired\n- [docs/design/DESIGN.md](docs/design/DESIGN.md) — the UI design system\n\n## Acknowledgements\n\n- [trayscale](https://github.com/DeedleFake/trayscale) by DeedleFake — an\n  inspiration and feature reference.\n- [Tailscale](https://tailscale.com) — the mesh VPN alavai is a client for\n  (alavai is unofficial and not affiliated with Tailscale).\n- [Lucide](https://lucide.dev) — the symbolic icon set (ISC).\n\n## License\n\n[GPL-3.0-or-later](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falex-poor%2Falavai","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falex-poor%2Falavai","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falex-poor%2Falavai/lists"}