Tenebra Divaaaan
winget install --id=Divaaaan.Tenebra -e Tenebra is an open-source VPN client for Windows built on the sing-box core. It provides a simple desktop interface for managing secure network connections.
winget install --id=Divaaaan.Tenebra -e Tenebra is an open-source VPN client for Windows built on the sing-box core. It provides a simple desktop interface for managing secure network connections.
A cross-platform VPN client built on sing-box. Desktop first — Windows is user-ready; macOS ships but is for advanced users (see below). A shared Go core is meant to extend to Linux, Android and iOS.
> Project status — early development. The desktop client is the current > focus. The core, the control protocol and the UI are in good shape and well > tested, but the real tunnel path (wintun + sing-box, which needs an elevated > live run) is still being validated end to end. Treat this as pre-release: > not yet "production-ready", and expect things to move around. See > Project status for the honest breakdown.
Most clients either lock you into a single protocol or are vague about what they do with your traffic. Tenebra:
Everything below is implemented in this repo today (the UI features are desktop):
.txt
file of links, clipboard paste, or a QR code (image file or pasted image).
Subscription bodies handle a Clash/Mihomo YAML config, base64, or plaintext
link lists and read the Subscription-Userinfo header for traffic used / total
and expiry.tenebra:// deep
links (import a subscription or connect a profile), launch at login (optionally
minimized to the tray), single-instance, live traffic graphs, light/dark themes,
and English / Russian UI.The kill-switch (drop proxied traffic instead of leaking when the tunnel drops) is a UI toggle — best-effort by design, with the exact guarantee described in the changelog; LAN bypass is a core routing option.
Windows — from the Windows Package Manager:
winget install Divaaaan.Tenebra
or grab Tenebra_x.y.z_x64-setup.exe from the
latest release. Either
way the installer sets up the background service and the in-app updater keeps
everything current.
macOS — download the universal DMG from the latest release, then read the macOS note first — the build currently needs a hand-installed root daemon.
Tenebra is a client — it ships no servers and hard-codes nothing. You bring your own endpoint and import it as a subscription or a share link. Two ways to get one:
| Area | State |
|---|---|
| Go core (parsing, profiles, routing, config gen, fallback, leak logic) | Implemented, unit-tested, no third-party deps |
| Control protocol (core ↔ UI) | Implemented; covered by Go tests and a real-binary e2e |
| Desktop UI (Tauri 2 + React) | Implemented: all screens, reactive tray, notifications, deep links, autostart, i18n, themes |
| Windows tunnel (wintun + sing-box) | Implemented — a background service runs the tunnel, so the app connects without an elevated GUI; installer sets it up, the in-app updater refreshes both app and service |
| macOS tunnel (utun + sing-box) | Builds and runs — universal .app/DMG — but see the macOS note below: it needs a hand-installed root daemon and is not yet a click-to-run product |
| Linux / Android / iOS | Planned — the core is shared and platform-agnostic |
| Release pipeline | Tag-triggered release workflow builds the Windows and macOS bundles, minisign-signs the in-app updater artifacts, and publishes a GitHub release |
| Code-signing | Not set up — the Windows installer is Authenticode-unsigned (SmartScreen warns) and the macOS build is unsigned/un-notarized (Gatekeeper needs a manual "Open Anyway") |
The macOS build is for advanced users right now, not a finished product. Two things are not yet in place, so a plain "download the DMG and drag to Applications" will not give you a working tunnel:
utun
device, so the app talks to a small root LaunchDaemon that owns the tunnel.
That daemon is currently installed by hand with a sudo script
(scripts/macos/install-daemon.sh) — there
is no in-app installer for it yet. Without it, the app runs but cannot connect.sudo bash scripts/macos/install-daemon.sh --from-app /Applications/Tenebra.app --allow-unsigned.The click-to-run macOS path — a signed, notarized build with an SMAppService
daemon bundled inside the app (so it installs and updates like the Windows
service) — needs an Apple Developer ID and is planned, not done. Until then,
use the DMG only if you're comfortable running the install script yourself.
Windows users are unaffected — the Windows installer sets up the service and
the updater keeps everything current automatically.
If you want to help close the gap, the macOS SMAppService path and the
non-desktop adapters are the highest-leverage places — see
CONTRIBUTING.md.
tenebra/
├── core/ Go. Platform-agnostic, stdlib-only, fully unit-tested.
│ ├── model/ Normalized proxy node + config types.
│ ├── subscription/ Parse vless/hysteria2/ss/trojan/vmess links + sub bodies.
│ ├── profile/ Named profiles and their atomic on-disk store.
│ ├── routing/ smart/global/direct + per-app split -> sing-box route/dns.
│ ├── singbox/ Build a full sing-box config as plain JSON (no sing-box dep).
│ ├── fallback/ Pure REALITY->Hysteria2->AmneziaWG fallback state machine.
│ └── control/ The line-delimited JSON protocol + the daemon.
├── adapters/
│ └── windows/ Spawn & supervise sing-box; traffic via its clash API.
├── cmd/
│ └── tenebra-core/ The sidecar entry point (talks the protocol on stdin/stdout).
├── ui-desktop/ Tauri 2 app: Rust shell (src-tauri) + React/TS front end (src).
├── scripts/
│ └── fetch-resources.ps1 Download pinned sing-box + wintun for bundling.
└── docs/ Architecture, control protocol, and the dev guide.
Requirements: Go 1.24+, Node 22+, and the Rust toolchain (for the desktop UI). Full walkthrough and troubleshooting in docs/development.md.
Core tests:
go test ./...
Desktop app (Windows):
# fetch the sing-box binary and wintun.dll into src-tauri/resources
powershell -File scripts/fetch-resources.ps1
# build the core sidecar where Tauri bundles it
go build -o ui-desktop/src-tauri/binaries/tenebra-core-x86_64-pc-windows-msvc.exe ./cmd/tenebra-core
# build the bundle
cd ui-desktop
npm install
npm run tauri build
Tenebra is maintained by one person in their spare time, so please keep support low-friction:
Response times vary — this is a side project, not a supported product. Thanks for your patience.
GPLv3 — see LICENSE. sing-box is GPLv3, so Tenebra is too. Bundled third-party components and their licenses are listed in THIRD-PARTY-NOTICES.md.