dumbtv
dumbtv가 ADB로 Fire TV에서 광고·추적·업데이트 알림을 제거, 루트·앱 변경 없이, 무료 오픈소스
NuggetVPN: 구독용 무료 오픈소스 VPN 클라이언트
A free, open-source VPN client for your subscription. Works with VLESS + Reality, VMess, Trojan, Shadowsocks, Hysteria2, TUIC and WireGuard, and with Remnawave, Marzban and 3x-ui subscriptions. For Wi
보안TypeScript · GoGitHub @Rigby-Foundation온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
NuggetVPN is a modern, lightweight, and fast VPN client built with Wails v3 and React 19.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
A fast, good-looking VPN client for Windows, macOS, Linux, Android and iOS, built with
Wails v3 and React 19.
Every proxy core it can run is compiled into the app as a Go library.
There is no bundled executable, nothing is downloaded at runtime, and
nothing is shelled out to.README 전문 보기 ↗A fast, good-looking VPN client for Windows, macOS, Linux, Android and iOS, built with Wails v3 and React 19.
Every proxy core it can run is compiled into the app as a Go library. There is no bundled executable, nothing is downloaded at runtime, and nothing is shelled out to.
Windows (PowerShell):
irm https://raw.githubusercontent.com/Rigby-Foundation/NuggetVPN/main/scripts/install.ps1 | iex
macOS and Linux:
curl -fsSL https://raw.githubusercontent.com/Rigby-Foundation/NuggetVPN/main/scripts/install.sh | sh
Both fetch the latest release from GitHub, check it against the SHA-256
GitHub publishes for it, install it, and start the app; running them again
updates. On Linux the .deb or .rpm is used when apt, dnf or zypper is
there, the AppImage otherwise. Or download from
Releases: on
Windows, …-silent-installer.exe installs with no questions asked, and the
regular installer takes /S for the same.
[!WARNING] iOS: you sign it yourself. NuggetVPN is not on the App Store. Each release has an unsigned
…-ios-unsigned.ipa(iOS 15 and newer) for you to sign with your own certificate, in a signing app or with TrollStore. The certificate must allow VPN apps (Network Extensions, packet tunnel): one from a free Apple ID doesn't, so with it the app installs but never connects.
vless://, vmess://, ss:// and others),
full sing-box configs, and Clash configs are all accepted.nuggetvpn:// links and links copied
to the clipboard are offered for import..vflow files for
sharing a whole routing setup.NuggetVPN status, connect Tokyo, disconnect and
more control the running app from a terminal or a script. See
docs/cli.md.Plugins can bring themes, fonts and routing setups, and add pages of their
own. A plugin’s code runs in a sandbox, sealed off from the app and your
files, and can only do what you allow when you install it. See
docs/plugins to write one, and
examples/plugins/glance for an example.
The core is the engine that carries the traffic. You choose it under Settings → Core.
| Core | What it is | Differences |
|---|---|---|
| Built-in (default) | TodayCore: sing-box 1.15 with Xray's XHTTP transport, REALITY with the X25519MLKEM768 key share, and VLESS post-quantum encryption | None. Everything in the app is built for it. |
| Official sing-box | SagerNet's sing-box 1.15.0-alpha.9, unmodified apart from its module path | No XHTTP servers. |
| mihomo | Clash Meta 1.19. It runs complete Clash configs as they are. | Rules on a detected protocol and sing-box-format rule lists are skipped. It uses its own geo data. TLS fragmentation doesn't apply. |
| Xray | Xray-core 26.3. It handles the servers, while the built-in core keeps the tunnel, DNS and routing. | No Hysteria, TUIC or SSH servers. No Shadowsocks plugins. |
All four are linked into the same binary and run in the same privileged process, so switching between them is instant.
replace directive.third_party/ under a module path of its
own, so both can coexist. third_party/README.md
explains what that took.The app is a single binary with two modes:
NuggetVPN the GUI (runs as your user)
NuggetVPN --core-service the privileged core (started by the GUI)
Creating a TUN interface requires root, but a browser engine should never
run as root. So the GUI re-runs itself behind the platform's authorization
prompt: osascript on macOS, pkexec on Linux and UAC on Windows. It then
drives that process over a socket. Both sides are the same executable, so
the UI and the tunnel can never drift apart in version.
┌────────────────┐ socket ┌──────────────────────────┐
│ GUI (user) │ ───────────────► │ --core-service (root) │
│ React + Wails │ JSON lines │ the cores, as libraries │
│ │ ◄─────────────── │ TUN + routing + DNS │
└────────────────┘ logs/state/stats └──────────────────────────┘
Starting a profile is a function call inside the service, not a config file plus a process spawn. Logs, connection state, byte counters and the connection list come back over the same socket. Quitting the GUI shuts the service down, and the service also watches the GUI's process. A crash therefore cannot leave a root process holding your routing table.
Anything that can talk to that socket can hand a config to a root process.
File permissions are not enough on their own, because chmod and chown do
nothing for AF_UNIX on Windows. So every connection must open with a
256-bit per-session token:
0600 file.The token travels through a file rather than a command-line argument because argv is world-readable on Linux.
Every counter and connection list is read in-process. None of the cores gets an HTTP controller. Opening one would give every local program, and through permissive CORS every web page you visit, a view of your live connections and a way to drive a root process. For the same reason, any API a Clash config asks for is dropped before mihomo sees it.
go install github.com/wailsapp/wails/v3/cmd/[email protected]
Keep the CLI, Go module and @wailsio/runtime on the same version.xcode-select --install).libgtk-4-dev and libwebkitgtk-6.0-dev. At runtime, pkexec
(polkit).git clone https://github.com/Rigby-Foundation/NuggetVPN.git
cd NuggetVPN
make dev # run with hot reload
make build # compile into bin/
make test # Go test suite, with the right build tags
make vet
The first time you connect, the app asks for administrator rights to create the TUN interface. It asks once per app session, not once per connection.
| Command | Produces |
|---|---|
make dmg | bin/NuggetVPN.dmg |
make dmg-universal | a universal (arm64 + amd64) .dmg |
make linux-packages | .deb, .rpm and .AppImage in bin/ |
make package (Windows) | NuggetVPN.exe and an NSIS installer |
Wails ships the .app, .deb, .rpm and AppImage packagers. The DMG
script is ours, in build/darwin/make-dmg.sh, and it only uses hdiutil and
osascript.
The same app, on Wails' Android support: the Go code is built into a shared
library that a small Java host (build/android) loads into a WebView. You
need the Android NDK (ANDROID_NDK_HOME), and for the APK a JDK 17 and the
Android SDK (ANDROID_HOME).
wails3 task android:apk # debug APK for arm64, in bin/
wails3 task android:package # release APK for arm64 and x86_64
wails3 task android:run:device # debug build on a connected phone
How it differs from the desktop:
internal/android gives sing-box the tunnel, keeps the
core's own sockets out of it, and reports the network in use.Release APKs are signed with the key from the ANDROID_KEYSTORE_* secrets;
see .github/workflows/release.yml.
The System theme extracts colours from the primary display's wallpaper on Windows and macOS. Linux supports GNOME, KDE Plasma, Xfce, Cinnamon and MATE. Colours refresh on focus and every 30 seconds while System is selected, and light/dark mode follows the OS. GNOME timed XML wallpapers use the first still image. If a wallpaper cannot be read, System uses the default light/dark colours. A manually chosen accent still takes priority.
sing-box gates features behind build tags, and a missing tag makes the feature disappear silently at runtime:
| Tag | Without it |
|---|---|
with_utls | Reality does not work |
with_quic | no Hysteria, Hysteria2 or TUIC |
with_wireguard | no WireGuard |
with_clash_api | no traffic counters. The accounting is built with this tag and read in-process; no listener is opened. |
with_gvisor | no legacy gVisor stack. The generated config doesn't use it; only a hand-written config that names it needs it. |
buildtags.go turns a missing tag into a compile error. The list lives in
Taskfile.yml as SING_BOX_TAGS, and every build task applies it, including
a bare wails3 build. To pass the tags by hand:
go build -tags "$(make -s tags)" .
| macOS | Linux | Windows | |
|---|---|---|---|
| Profiles and settings | ~/Library/Application Support/org.rigbyfoundation.nuggetvpn | $XDG_DATA_HOME/org.rigbyfoundation.nuggetvpn | %APPDATA%\org.rigbyfoundation.nuggetvpn |
| Logs | ~/Library/Logs/org.rigbyfoundation.nuggetvpn | $XDG_DATA_HOME/.../logs | %LOCALAPPDATA%\...\logs |
| Generated core config | ~/Library/Caches/org.rigbyfoundation.nuggetvpn/ | $XDG_CACHE_HOME/... | %LOCALAPPDATA%\...\runtime |
| Core data (admin-only) | /Library/Application Support/NuggetVPN/cores | /var/lib/nuggetvpn/cores | %ProgramData%\NuggetVPN\cores |
main.go: the entry point. It chooses between the GUI and the core
service, and sets up the window and system tray.internal/app/: everything the frontend can call, split by concern.
It is a separate package on purpose. Wails names a bound service after its
package path, and package main reports that path differently in a binary
than in a test.internal/core/: the privileged service, its client, and the
in-process runtimes for each core.internal/sbconfig/: turns a profile plus settings into a sing-box
config. route.go compiles the routing graph.internal/cores/: translation for the other cores. mihomo/ builds a
Clash config, and xray/ builds Xray's server config.internal/link/: parses share links, sing-box JSON and Clash YAML.internal/remote/: subscriptions and the optional profile sync server.internal/probe/: latency and connectivity checks.internal/stats/, internal/speedtest/: statistics kept over
time, and the speed test.internal/wifi/: reads the Wi-Fi network's name on each system.internal/cli/: the command line, and the socket the app answers it
on.internal/geodat/, internal/vflow/: geo files and the .vflow
routing format.internal/autostart/: launch at login.internal/plugins/: reading, installing and serving plugins, the
sandbox policy for their pages, and the SDK (sdk/nugget.js). The window
side is frontend/src/lib/plugin-host.ts.cmd/nuggetplugin/: builds a .nuggetplugin from a folder.internal/storage/, internal/models/: persistence and shared
types.third_party/: official sing-box and its sing-tun, vendored under
their own module paths.docs/ has guides for writing plugins and using the
command line.
The app is not signed with an Apple Developer certificate, so Gatekeeper may block it:
xattr -cr /Applications/NuggetVPN.app
rigby:// profiles don't connect. That protocol only exists in the
clash-rs fork. Such profiles are still listed, and they show a clear error
when you try to connect.frontend/src/lib/backend.tssrc/locales/Taskfile.yml, build/: the Wails build and packaging pipeline.