diff --git a/.gitignore b/.gitignore
index d31ddbe..51a1266 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,6 +6,8 @@ bin/
configs/config.json
configs/remnawave-api.json
configs/account.json
+# Baked panel credentials (copied by build.bat; never commit)
+internal/remnawave/embeddedcfg/remnawave-api.json
dist/navis-release/windows/configs/
# Runtime-downloaded protocol cores + local packaging artifact (not release sources)
dist/navis-release/windows/bin/
@@ -17,8 +19,11 @@ cmd/vpnapp/resource.syso
navis-update.bat
Navis.exe.new
Navis-pending.exe
+EvilFox.exe.new
+EvilFox-pending.exe
*.bak
Navis.exe.bak
+EvilFox.exe.bak
# MSIX staging / local packages
packaging/msix/_staging/
diff --git a/README.md b/README.md
index 4a76555..683cdaa 100644
--- a/README.md
+++ b/README.md
@@ -1,12 +1,14 @@
-# Navis
+# EvilFox
-Клиент [NaiveProxy](https://github.com/klzgrad/naiveproxy) + [Hysteria 2](https://github.com/apernet/hysteria) + [AmneziaWG 2.0](https://docs.amnezia.org/documentation/amnezia-wg/) + [Xray](https://github.com/XTLS/Xray-core) (VLESS / VMess / Trojan) с профилями, пингом, URL-подпиской / **Remnawave API** и автообновлением.
+Клиент [NaiveProxy](https://github.com/klzgrad/naiveproxy) + [Hysteria 2](https://github.com/apernet/hysteria) + [AmneziaWG 2.0](https://docs.amnezia.org/documentation/amnezia-wg/) + [Xray](https://github.com/XTLS/Xray-core) (VLESS / VMess / Trojan) с профилями, пингом, централизованной выдачей конфигов (Remnawave) и автообновлением.
+
+> Ранее приложение называлось **Navis**. С 4.0.0 бинарник — `EvilFox.exe`. Каталог релиза `dist/navis-release/` и URL-путь сохранены, чтобы клиенты 3.x продолжали обновляться; в той же папке лежит и `Navis.exe` (копия `EvilFox.exe`) как совместимый алиас.
## Платформы
| OS | Артефакты | UI |
|----|----------|----|
-| Windows amd64 | `Navis.exe` | GUI (WebView2) |
+| Windows amd64 | `EvilFox.exe` (+ `Navis.exe` alias) | GUI (WebView2) |
| macOS universal | `Navis.dmg` · `Navis.app.zip` | **GUI** (как Windows) |
| macOS arm64 / amd64 | `Navis` · DMG · `Navis-cli` | GUI + CLI |
| Android | `Navis.apk` | GUI (VpnService) |
diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts
index 67ddd0c..f77521d 100644
--- a/android/app/build.gradle.kts
+++ b/android/app/build.gradle.kts
@@ -13,8 +13,8 @@ android {
minSdk = 26
targetSdk = 35
// versionCode = major*1_000_000 + minor*10_000 + patch*100 + build
- versionCode = 3_100_001
- versionName = "3.10.0+1"
+ versionCode = 4_000_001
+ versionName = "4.0.0+1"
vectorDrawables.useSupportLibrary = true
ndk {
abiFilters += listOf("arm64-v8a", "armeabi-v7a", "x86_64")
diff --git a/android/app/src/main/java/win/evilfox/navis/ui/NavisScreen.kt b/android/app/src/main/java/win/evilfox/navis/ui/NavisScreen.kt
index f41253a..38fb80f 100644
--- a/android/app/src/main/java/win/evilfox/navis/ui/NavisScreen.kt
+++ b/android/app/src/main/java/win/evilfox/navis/ui/NavisScreen.kt
@@ -94,7 +94,7 @@ fun NavisScreen(
.padding(18.dp)
) {
Row(verticalAlignment = Alignment.CenterVertically) {
- Text("Navis", fontSize = 28.sp, fontWeight = FontWeight.Black, color = Ink)
+ Text("EvilFox", fontSize = 28.sp, fontWeight = FontWeight.Black, color = Ink)
Spacer(Modifier.width(8.dp))
Surface(color = Soft, shape = RoundedCornerShape(999.dp)) {
Text("2.6.1", Modifier.padding(horizontal = 8.dp, vertical = 2.dp), fontSize = 12.sp, fontWeight = FontWeight.Bold, color = AccentDeep)
diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml
index 9ad5410..4a4120a 100644
--- a/android/app/src/main/res/values/strings.xml
+++ b/android/app/src/main/res/values/strings.xml
@@ -1,7 +1,7 @@
- Navis
- Navis VPN
+ EvilFox
+ EvilFox VPN
Подключено
VPN
diff --git a/build.bat b/build.bat
index 9af32e4..a5ee9c6 100644
--- a/build.bat
+++ b/build.bat
@@ -14,22 +14,37 @@ if errorlevel 1 (
goversioninfo -64 -icon assets\navis.ico -manifest assets\app.manifest -o cmd\vpnapp\resource.syso versioninfo.json
if errorlevel 1 exit /b 1
-echo Building Navis GUI and CLI...
-go build -ldflags="-H windowsgui -s -w" -trimpath -o Navis.exe ./cmd/vpnapp
+REM Bake Remnawave panel credentials into the binary (NordVPN-style centralized provisioning).
+REM Source of truth: configs\remnawave-api.json (gitignored). Never commit the embedded copy.
+if exist "configs\remnawave-api.json" (
+ mkdir "internal\remnawave\embeddedcfg" 2>nul
+ copy /Y "configs\remnawave-api.json" "internal\remnawave\embeddedcfg\remnawave-api.json" >nul
+ echo Embedded panel credentials from configs\remnawave-api.json
+) else (
+ echo WARNING: configs\remnawave-api.json missing — build will use external file / no auto-provision
+)
+
+echo Building EvilFox GUI and CLI...
+go build -ldflags="-H windowsgui -s -w" -trimpath -o EvilFox.exe ./cmd/vpnapp
if errorlevel 1 exit /b 1
-go build -ldflags="-s -w" -trimpath -o vpnclient.exe ./cmd/vpnclient
+go build -ldflags="-s -w" -trimpath -o evilfox-cli.exe ./cmd/vpnclient
if errorlevel 1 exit /b 1
mkdir "dist\navis-release\windows" 2>nul
-copy /Y Navis.exe "dist\navis-release\windows\Navis.exe" >nul
-copy /Y vpnclient.exe "dist\navis-release\windows\vpnclient.exe" >nul
+copy /Y EvilFox.exe "dist\navis-release\windows\EvilFox.exe" >nul
+REM Keep Navis.exe path for existing 3.x clients that fetch the old feed URL.
+copy /Y EvilFox.exe "dist\navis-release\windows\Navis.exe" >nul
+copy /Y evilfox-cli.exe "dist\navis-release\windows\evilfox-cli.exe" >nul
+copy /Y evilfox-cli.exe "dist\navis-release\windows\vpnclient.exe" >nul
echo.
echo Done:
-echo Navis.exe
-echo vpnclient.exe
-echo dist\navis-release\windows\Navis.exe
+echo EvilFox.exe
+echo evilfox-cli.exe
+echo dist\navis-release\windows\EvilFox.exe
+echo dist\navis-release\windows\Navis.exe (compat alias for 3.x updater)
+echo dist\navis-release\windows\evilfox-cli.exe
echo dist\navis-release\windows\vpnclient.exe
echo assets\navis.ico
endlocal
diff --git a/cmd/vpnapp/main_darwin.go b/cmd/vpnapp/main_darwin.go
index 70e111f..41c7dbe 100644
--- a/cmd/vpnapp/main_darwin.go
+++ b/cmd/vpnapp/main_darwin.go
@@ -71,7 +71,7 @@ func main() {
log.Printf("open UI: %v — откройте вручную: %s", err, uiURL)
fmt.Println(uiURL)
} else {
- log.Printf("Navis UI: %s", uiURL)
+ log.Printf("EvilFox UI: %s", uiURL)
}
sig := make(chan os.Signal, 1)
@@ -96,7 +96,7 @@ func openAppWindow(uiURL string) error {
func fatalf(format string, args ...any) {
msg := fmt.Sprintf(format, args...)
log.Println(msg)
- _ = exec.Command("osascript", "-e", fmt.Sprintf(`display alert "Navis" message %q`, msg)).Run()
+ _ = exec.Command("osascript", "-e", fmt.Sprintf(`display alert "EvilFox" message %q`, msg)).Run()
os.Exit(1)
}
diff --git a/cmd/vpnapp/main_other.go b/cmd/vpnapp/main_other.go
index 66ae7be..249dc2f 100644
--- a/cmd/vpnapp/main_other.go
+++ b/cmd/vpnapp/main_other.go
@@ -8,7 +8,7 @@ import (
)
func main() {
- fmt.Fprintln(os.Stderr, "Navis GUI supports Windows (WebView2) and macOS.")
- fmt.Fprintln(os.Stderr, "On this OS use the CLI: ./Navis connect | install-core | check-update")
+ fmt.Fprintln(os.Stderr, "EvilFox GUI supports Windows (WebView2) and macOS.")
+ fmt.Fprintln(os.Stderr, "On this OS use the CLI: ./evilfox-cli connect | install-core | check-update")
os.Exit(1)
}
diff --git a/cmd/vpnapp/main_windows.go b/cmd/vpnapp/main_windows.go
index cf49fd2..5c70b06 100644
--- a/cmd/vpnapp/main_windows.go
+++ b/cmd/vpnapp/main_windows.go
@@ -117,7 +117,7 @@ func main() {
AutoFocus: true,
DataPath: dataPath,
WindowOptions: webview2.WindowOptions{
- Title: "Navis 2",
+ Title: "EvilFox",
Width: 920,
Height: 680,
Center: true,
@@ -160,12 +160,32 @@ func main() {
mustBind(w, "getLogs", a.getLogs)
go a.autoCheckUpdate()
+ go a.autoProvision()
mgr.StartAutoRenew(6 * time.Hour)
w.SetHtml(appui.IndexHTML)
w.Run()
}
+// autoProvision quietly issues a panel account + imports configs on first run
+// (NordVPN-style centralized provisioning — users never edit the panel).
+func (a *app) autoProvision() {
+ if !a.mgr.ProvisionConfigured() {
+ return
+ }
+ time.Sleep(2 * time.Second)
+ out, err := a.mgr.EnsureAutoProvision()
+ if err != nil {
+ fmt.Fprintf(a.logBuf, "auto-provision: %v\n", err)
+ return
+ }
+ if out.Created {
+ fmt.Fprintf(a.logBuf, "auto-provision: создан %s · серверов %d\n", out.Username, out.Imported)
+ } else if out.Imported > 0 {
+ fmt.Fprintf(a.logBuf, "auto-provision: обновлены конфиги %s · серверов %d\n", out.Username, out.Imported)
+ }
+}
+
func mustBind(w webview2.WebView, name string, fn interface{}) {
if err := w.Bind(name, fn); err != nil {
fatalDialog("bind %s: %v", name, err)
@@ -503,12 +523,12 @@ func (a *app) applyUpdate() (string, error) {
return "", err
}
_ = a.mgr.Disconnect()
- // Hard-exit so Windows unlocks Navis.exe; do not wait on webview.Terminate (can hang).
+ // Hard-exit so Windows unlocks EvilFox.exe; do not wait on webview.Terminate (can hang).
go func() {
time.Sleep(300 * time.Millisecond)
os.Exit(0)
}()
- return "Устанавливается v" + latest + "… Navis перезапустится.", nil
+ return "Устанавливается v" + latest + "… EvilFox перезапустится.", nil
}
func (a *app) autoCheckUpdate() {
diff --git a/cmd/vpnapp/msgbox_windows.go b/cmd/vpnapp/msgbox_windows.go
index 2a77543..dfc1bac 100644
--- a/cmd/vpnapp/msgbox_windows.go
+++ b/cmd/vpnapp/msgbox_windows.go
@@ -10,7 +10,7 @@ import (
func messageBox(text string) {
user32 := syscall.NewLazyDLL("user32.dll")
proc := user32.NewProc("MessageBoxW")
- title, _ := syscall.UTF16PtrFromString("Navis")
+ title, _ := syscall.UTF16PtrFromString("EvilFox")
body, _ := syscall.UTF16PtrFromString(text)
proc.Call(0, uintptr(unsafe.Pointer(body)), uintptr(unsafe.Pointer(title)), 0x10) // MB_ICONERROR
}
diff --git a/cmd/vpnclient/main.go b/cmd/vpnclient/main.go
index 8ff9b49..14f3db2 100644
--- a/cmd/vpnclient/main.go
+++ b/cmd/vpnclient/main.go
@@ -59,16 +59,16 @@ func main() {
}
func printUsage() {
- fmt.Fprintf(os.Stderr, `Navis VPN client (Naive / Hy2 / AWG / VLESS / VMess / Trojan) — Windows / macOS
+ fmt.Fprintf(os.Stderr, `EvilFox VPN client (Naive / Hy2 / AWG / VLESS / VMess / Trojan) — Windows / macOS
Usage:
- navis init [-config configs/config.json]
- navis install-core [-config configs/config.json]
- navis set-proxy [-config configs/config.json]
- navis connect [-config configs/config.json] [-profile name] [-no-sysproxy] [-probe]
- navis probe [-config configs/config.json] [-profile name] [-url URL]
- navis check-update
- navis apply-update
+ evilfox-cli init [-config configs/config.json]
+ evilfox-cli install-core [-config configs/config.json]
+ evilfox-cli set-proxy [-config configs/config.json]
+ evilfox-cli connect [-config configs/config.json] [-profile name] [-no-sysproxy] [-probe]
+ evilfox-cli probe [-config configs/config.json] [-profile name] [-url URL]
+ evilfox-cli check-update
+ evilfox-cli apply-update
Share links: naive+https://… hysteria2://… vless://… vmess://… trojan://… awg .conf
diff --git a/dist/navis-release/update.json b/dist/navis-release/update.json
index 30e0641..86f6375 100644
--- a/dist/navis-release/update.json
+++ b/dist/navis-release/update.json
@@ -1,16 +1,16 @@
{
- "version": "3.10.0",
- "notes": "3.10.0+2: новый интерфейс с боковым меню (Главная / Профили / Настройки / Логи / О программе), аккаунт с продлением 50 ГБ / +30 дней и автопродлением, режим VPN на Windows (TUN, весь трафик, нужны права администратора и wintun.dll). Обновления теперь с git.de4ima.uk. Windows 3.10.0.2.",
+ "version": "4.0.0",
+ "notes": "4.0.0+1: ребрендинг Navis → EvilFox; централизованная автовыдача конфигов (как NordVPN — панель вшита, пользователь только выбирает сервер и продлевает); из интерфейса убраны настройки Remnawave API. Windows 4.0.0.1. Клиенты 3.x обновляются по этому фиду; Navis.exe в релизе — совместимый алиас EvilFox.exe.",
"platform": "windows-amd64",
"os": "windows",
"arch": "amd64",
- "url": "https://git.de4ima.uk/Evilfox/navi/raw/branch/Windows/dist/navis-release/windows/Navis.exe",
- "sha256": "55ba57898ffc23ce1cb14172643513f70a2ae972c00181b2d3d889430bce1eb3",
+ "url": "https://git.de4ima.uk/Evilfox/navi/raw/branch/Windows/dist/navis-release/windows/EvilFox.exe",
+ "sha256": "869b37310526003143c5db8ea3ad6d4468173e9053cf585f06c162a861d5c49c",
"mandatory": false,
"platforms": {
"windows-amd64": {
- "url": "https://git.de4ima.uk/Evilfox/navi/raw/branch/Windows/dist/navis-release/windows/Navis.exe",
- "sha256": "55ba57898ffc23ce1cb14172643513f70a2ae972c00181b2d3d889430bce1eb3",
+ "url": "https://git.de4ima.uk/Evilfox/navi/raw/branch/Windows/dist/navis-release/windows/EvilFox.exe",
+ "sha256": "869b37310526003143c5db8ea3ad6d4468173e9053cf585f06c162a861d5c49c",
"os": "windows",
"arch": "amd64"
},
diff --git a/dist/navis-release/windows/EvilFox.exe b/dist/navis-release/windows/EvilFox.exe
new file mode 100644
index 0000000..53b8ade
Binary files /dev/null and b/dist/navis-release/windows/EvilFox.exe differ
diff --git a/dist/navis-release/windows/Navis.exe b/dist/navis-release/windows/Navis.exe
index bf07c02..53b8ade 100644
Binary files a/dist/navis-release/windows/Navis.exe and b/dist/navis-release/windows/Navis.exe differ
diff --git a/dist/navis-release/windows/evilfox-cli.exe b/dist/navis-release/windows/evilfox-cli.exe
new file mode 100644
index 0000000..5ef29bc
Binary files /dev/null and b/dist/navis-release/windows/evilfox-cli.exe differ
diff --git a/dist/navis-release/windows/vpnclient.exe b/dist/navis-release/windows/vpnclient.exe
index 7e545e0..5ef29bc 100644
Binary files a/dist/navis-release/windows/vpnclient.exe and b/dist/navis-release/windows/vpnclient.exe differ
diff --git a/dist/update.json b/dist/update.json
index 30e0641..86f6375 100644
--- a/dist/update.json
+++ b/dist/update.json
@@ -1,16 +1,16 @@
{
- "version": "3.10.0",
- "notes": "3.10.0+2: новый интерфейс с боковым меню (Главная / Профили / Настройки / Логи / О программе), аккаунт с продлением 50 ГБ / +30 дней и автопродлением, режим VPN на Windows (TUN, весь трафик, нужны права администратора и wintun.dll). Обновления теперь с git.de4ima.uk. Windows 3.10.0.2.",
+ "version": "4.0.0",
+ "notes": "4.0.0+1: ребрендинг Navis → EvilFox; централизованная автовыдача конфигов (как NordVPN — панель вшита, пользователь только выбирает сервер и продлевает); из интерфейса убраны настройки Remnawave API. Windows 4.0.0.1. Клиенты 3.x обновляются по этому фиду; Navis.exe в релизе — совместимый алиас EvilFox.exe.",
"platform": "windows-amd64",
"os": "windows",
"arch": "amd64",
- "url": "https://git.de4ima.uk/Evilfox/navi/raw/branch/Windows/dist/navis-release/windows/Navis.exe",
- "sha256": "55ba57898ffc23ce1cb14172643513f70a2ae972c00181b2d3d889430bce1eb3",
+ "url": "https://git.de4ima.uk/Evilfox/navi/raw/branch/Windows/dist/navis-release/windows/EvilFox.exe",
+ "sha256": "869b37310526003143c5db8ea3ad6d4468173e9053cf585f06c162a861d5c49c",
"mandatory": false,
"platforms": {
"windows-amd64": {
- "url": "https://git.de4ima.uk/Evilfox/navi/raw/branch/Windows/dist/navis-release/windows/Navis.exe",
- "sha256": "55ba57898ffc23ce1cb14172643513f70a2ae972c00181b2d3d889430bce1eb3",
+ "url": "https://git.de4ima.uk/Evilfox/navi/raw/branch/Windows/dist/navis-release/windows/EvilFox.exe",
+ "sha256": "869b37310526003143c5db8ea3ad6d4468173e9053cf585f06c162a861d5c49c",
"os": "windows",
"arch": "amd64"
},
diff --git a/internal/apphost/app.go b/internal/apphost/app.go
index 4d6748e..07f5c2c 100644
--- a/internal/apphost/app.go
+++ b/internal/apphost/app.go
@@ -76,6 +76,18 @@ type PingBestResult struct {
func New(mgr *core.Manager, cfgPath string, logBuf *bytes.Buffer) *App {
// Monthly plan upkeep: check at start and then periodically.
mgr.StartAutoRenew(6 * time.Hour)
+ // NordVPN-style: silently issue a panel account + import configs.
+ go func() {
+ time.Sleep(2 * time.Second)
+ if !mgr.ProvisionConfigured() {
+ return
+ }
+ if out, err := mgr.EnsureAutoProvision(); err != nil {
+ fmt.Fprintf(logBuf, "auto-provision: %v\n", err)
+ } else if out.Created {
+ fmt.Fprintf(logBuf, "auto-provision: создан %s · серверов %d\n", out.Username, out.Imported)
+ }
+ }()
return &App{
Mgr: mgr,
CfgPath: cfgPath,
@@ -410,7 +422,7 @@ func (a *App) ApplyUpdate() (string, error) {
os.Exit(0)
}()
}
- return "Устанавливается v" + latest + "… Navis перезапустится.", nil
+ return "Устанавливается v" + latest + "… EvilFox перезапустится.", nil
}
func (a *App) AutoCheckUpdate() {
diff --git a/internal/appui/index.html b/internal/appui/index.html
index 0094648..a48fbee 100644
--- a/internal/appui/index.html
+++ b/internal/appui/index.html
@@ -3,7 +3,7 @@
- Navis
+ EvilFox