* fix: minor ui fixes (#1917) * feat: improve storage processing * fix: minor ui fixes * feat: add async post in gateway controller (#1963) * feat: ad label (#1966) * refactor: ad label desing refatroing * feat: add ad label settings processing * chore: fix ru translations * chore: minor fixes * chore: bump version (#1969) * fix: hide description (#1959) * fix: qt6 9 support (#1973) * Fix qt 6.9 support * add support android sdk 36 * feat: add support SafeMargins from Android * Fix black screen --------- Co-authored-by: NickVs2015 <nv@amnezia.org> * fix: iOS appstore publish fix (#1922) * fix: fix ui android issues (#1980) * Fix UI issues * Fix Screen Swipe * chore: bump version (#1982) * fix: fix self-hosted TextFields and Keyboard reset issue (#1983) Co-authored-by: vkamn <vk@amnezia.org> * fix: fix android crash (#1988) * chore: bump version (#1989) * fix: news fetch (#1994) * fix: fixed news nested qml call * feat: async proxy bypass * chore: bump version (#1997) * fix: clear qt cache on start app (#2008) * Fix/ Cache clear Android * Fix: Clear cache on start app * chore: bump version --------- Co-authored-by: vkamn <vk@amnezia.org> * fix: users search field clears on 'x' button or 'escape' key clicked (#1920) * fix: checked format after changing protocol (#1937) * fix: checked format after changing protocol * update: improved some lines * fix(ui): restore checkmark for connection format after switching protocol * fix: correct a typo * fix(ui): escape regex in client search filter * refactor: removed redundant lines --------- Co-authored-by: Mitternacht822 <sb@amnezia.org> * fix: GetBestRoute always returning 1231 error (#1981) * fix GetBestRoute always returning 1231 error * revert some changes because fix turned out to be simpler * fix: eye icon (#1985) Co-authored-by: vkamn <vk@amnezia.org> * feat: add right artifact name (#2018) * feat: added os signal handler (#2029) * fix: app freeze on quit (#1804) * fix: app freeze on quit * fix: typo in VpnConnection destructor * add trace info * add more trace info * set timelimit for flushDns * Refactor IpcClient::Interface access logic * cleanup unused variable * cleanup trace info * fix: remove second disconnect from VPN on app close * this object will be deleted at app close * Don't terminate VPN thread on Linux * Revert "Don't terminate VPN thread on Linux" This reverts commit 20e4ea2d4a2822a31959b1a4a87d350dfad7e52e. * disconnect all signals from vpnconnection on exit * add interruption request on vpnConnectionThread * use checktimer only for iOS * disconnect all signals from vpnconnection on exit * disconnect signals on exit before VPN disconnect * add disconnectSlots method * fix: add allow traffic rules on killswitch disable * wait for response from service before object destroy * change disconnect from vpn order * add delay for connection close * change disconnect method order * use stop method for protocol disconnecect * change disconnect method order * allow dns traffic after app close * delete tun on disconnect --------- Co-authored-by: vkamn <vk@amnezia.org> * fix: ipc call in macos ne (#1986) * fix: update or delete news on newsModel update (#2007) * fix: update or delete news on newsModel update * update: changed check for news editing * update: changed news edit updating * update: changed news model updating method * chore: add rich text support for news page --------- Co-authored-by: vkamn <vk@amnezia.org> * fix: clear file name to remove header (#1984) * fix: clear file name to remove header * update: clear on signal * removed uneccessary function * fix: clear filename on invalid config type --------- Co-authored-by: vkamn <vk@amnezia.org> * fix: fixed define name for linux os signal handler (#2030) * feat: add vless string on sharing screen (#1999) * feat: add vless config string and serialization * feat: add vless config string and serialization * feat: add network status check for awg/wg protocol (#1894) * Add network status check for AWG/WG protocol * Use service for PingSender * Cleanup unused code * Use networkchecker for all protocols * fix android build * add delay for ping checker stop * handle for interafe problems on windows * Restart IpcClient after OS suspend * Add DBus network checker for Linux * Use ping check for tun interfce * Windows suspend mode handler * MacOS suspend mode handler draft * Add delay for Linux wakeup reconnect * Add delay for Linux wakeup reconnect * Fix macOS wakeup/sleep prob Fix macOS not receiving wakeup/sleep events * fix done * Update deploy.yml fix CICD * Update vpnconnection.cpp update fix build CICD * Update vpnconnection.cpp update fix build cicd macos * Update deploy.yml fix CICD build macos * Update deploy.yml fix CICD macos * feat: implement SCP write buffer, improve network check and refactor macOS OpenGL support * feat: add tunnel addresses updated signal and handle network check based on gateway and local address availability * refactor: improve IpcClient connection handling and instance management * fix: scp revert. * fix: cmake reverted. * fix: submodules updated --------- Co-authored-by: Mykola Baibuz <mykola.baibuz@gmail.com> Co-authored-by: Yaroslav Yashin <yaroslav.yashin@gmail.com> Co-authored-by: vkamn <vk@amnezia.org> * feat: awg 2 support (#1836) * Add updated awg container * add missing files * Hide uninstalled AwgLegacy container * Fix resources file * Add role for allowed for installation containers * Add native config sharing for new Awg container * Fix not opening awg settings * Remove AwgLegacy from wizard manual installation page * Fix AmneziaWG settings * chore: update link to submodule * refactor: remove j1-j3 and itime * chore: return s3 s4 fields to ui * fix: awg2 native config compatability * chore: update packet size validation * feat: add awg2 support in self-hosted containers * fix: delete parameters from server config * feat: add H-parameters validation as a strings * chore: update link to submodule * chore: add containers type for awg 1.5 and awg 2 * chore: fixed s3/s4 visibility for awg 1 --------- Co-authored-by: aiamnezia <ai@amnezia.org> * feat: add timestamp to news list page (#2050) * feat: implement reconnection in AWG by turning the VPN off and on (#2046) * feat: msi installer and cli command (#2020) * feat: Add msi quite installer * chore: update code for new wix * feat: add cpack wix installer * feat: add gihub workflow for msi * chore: fix deploy script * chore: add wix logs * chore: fix msi build * chore: fix msi build * chore: add wix exts log * chore: add cpackwixpatch for registering the service * chore: fix build script * chore: fix wix fragment * feat: add closing app with reinstalling * chore: update version for test * chore: fix build script * feat: added cli commands --connect and --import (#1967) * fix: delete unused file and disable rollback after unsuccessful service start in msi installer * fix: Add deps to msi * fix: msi deps * feat: added os signal handler * fix: incorrect import at the empty client start (#2024) * chore: add force quit for os signal handler * feat: os signal handler improvements * fix: fixed --connection command --------- Co-authored-by: Mykola Baibuz <mykola.baibuz@gmail.com> Co-authored-by: aiamnezia <ai@amnezia.org> Co-authored-by: Mitternacht822 <sb@amnezia.org> * feat: native split-tunneling for xray (#1899) * feat: integrated xray as a library and added split-tunneling * fix: added copying amnezia_xray.dll to build dir * fix: changed path on darwin * chore: clean up getting default device * chore: removed WSAGetLastError from sockopt logging * fix: get rid of debug logs in xray handlers * fix: minor fixes and xray debugging capabilities * fix: macos default interface fix * fix: roll-back ipv6 sockopt for mac * fix: bind IPv6 on Windows * fix: (win) better IPv6 handling and router fixes * feat: prebuilts uploaded * fix: removed redundant cmake definitions * feat: moved xray to service process, reworked errors * fix: return values in networkUtilities * fix: macos build fixes * fix: (windows) cmake fixes * fix: (windows) compilation fix * fix: (windows) changed location of amnezia_xray.dll * feat: xray logs added to system service * chore: bump xray&tun2socks versions for android * chore: cleanup of XrayProtocol class * removed killswitch * removed redundant members and basic cleanup * feat: support split-tunneling in iOS and macOS NE * chore: update active interface index based on network path and available interfaces * refactor: update network path handling and logging in PacketTunnelProvider * chore: bump xray deps --------- Co-authored-by: Yaroslav Yashin <yaroslav.yashin@gmail.com> * feat: switch to qt 6.10.1 (#2057) * feat: switch to qt 6.10.1 * feat: switch to qt 6.10.1 remove touch * fix: make ipc connection a singleton (#2069) * feat: update GitHub workflow to use latest macOS, Xcode, and Qt versions, and add Go installation and gomobile setup (#2073) * fix: iPad startup crash fix (#2071) * fix: make ipc client thread-safe (#2075) * feat: add qt 6.10.1 support (#2065) * feat: switch to qt 6.10.1 * feat: switch to qt 6.10.1 remove touch * fix: fixed awg2 container processing (#2067) * feat: ios in-app purchase methods (#1652) * Add in-app purchase methods * fix: init StoreKit controller on startup * fix: Add transaction details to StoreKit callbacks * nullpointer access fixed * feat: in app purchase for ios * feat: add IAP product fetching and logging for iOS platform * feat: iOS Simulator building pipeline made * feat: add support for multiple IAP product IDs and attempt purchase of the first valid one * feat: add support for retrieving Base64-encoded app receipt after successful IAP purchase * refactor: inapp-purchase code cleanup * feat: iap processing * refactor: move to storekit 2 * feat: add request to billing * chore: add ios ifdef * feat: remove iOS simulator specific code and exclusions * refactor: remove unused StoreKit 2 transaction observer and simplify IAP product fetching logic * feat: implement StoreKit 2 for iOS and macOS, add restore purchases functionality * fix: Restore Purchases button appearance updated * feat: enhance error handling and duplicate config detection in ApiConfigsController * feat: add support for Mac OS NE in-app purchases and StoreKitController * ci-cd fix * Revert "ci-cd fix" This reverts commit f22fd7a13bb093205a81561e4e397d2075776646. --------- Co-authored-by: vladimir.kuznetsov <nethiuswork@gmail.com> Co-authored-by: vkamn <vk@amnezia.org> Co-authored-by: spectrum <yyy@amnezia.org> * fix: safe IpcClient calls (#2076) * fix: safe IpcClient calls * fix: double free by specifying parent * fix: windows includes for ikev2 * chore: bump version (#2080) * fix: cannot connect to IPC on Windows (#2083) * fix: replace localsocket by QtRO-embedded one * fix: make IpcClient initialization lazy * chore: bump awg version (#2088) * chore: improved retrieving of images list (#2084) Improved retrieving list of images named amnezia for Docker Engine 29.1.3 cleanup. * chore: ru translation (#2086) * fix: replace arm64 macos awg blob with amd64 one (#2096) * fix: minor fixes (#2099) * fix: fixed saving i1-i5 fields * fix: fixed default value for s4 * fix: fixed server name when sharing admin config * refactor: move iOS/macOS NE specific disconnect logic to the top of disconnectFromVpn method (#2100) * chore: is-test-flight processing (#2093) * fix: context menu fixes for qt6.9 * chore: is-test-flight porcessing * chore: bump version and minor build fixes * refactor: moved test purchase processing on client side * fix: fixed free import on ios * chore: bump qt version in deploy.yml * fix: minor fixes * fix(): set desktopFileName for Wayland (#2104) * feat: awg connection states (#2091) * Submodule amneziawg-apple updated * feat: add support for controlled junk and special handshake timeout in AWG configurator * refactor: improve AWG configurator and iOS controller logic * awg_configurator.cpp reverted * chore: bump version (#2108) * chore: bump version * chore: fix deploy.yml * chore: return jurplel/install-qt-action@v3 * chore: bump qt version * chore: disable cache * chore: fix qt bin folder path * chore: downgraded qt version for linux * chore: disable gradle cache * chore: use large runner for linux and android * chore: change runner name for android and linux * fix: change github runner label * fix: set github runner specific os version in label * chore: add self-hosted runner ubuntu-24.04-4cores * fix: changed label to self-hosted for github runners * fix: changed label to 4-core for github runners * fix: fixed app closing delay * fix: fixed awg description * chore: bump version --------- Co-authored-by: irvinklause <ik@amnezia.org> * fix: minor fixes (#2137) * refactor: removed premv1 migration code * fix: i1-i5 parsing when scaning server * chore: bump version * fix: remove redundant gateway from xrayprotocol (#2147) * chore: remove redundant gateway (#2148) * chore: runners (#2150) * chore: change runner for linux and android * chore: add libsecret to linux build * chore: bump version * chore: bump qt version for linux build (#2157) * fix: add +x permissions to wireguard-go on linux (#2159) * chore: revoke #2148 (#2160) * feat: checking linux kernel version when installing amneziawg-go (#2098) * Checking Linux kernel version when installing amneziawg-go print the Linux kernel version to stdOut for subsequent checking by the server controller. * Add error for old linux kernel Add error 214 ServerLinuxKernelTooOld * Add case for old linux kernel Add case for error 214 ServerLinuxKernelTooOld * Added kernel check for Awg2 Added Linux kernel version check and introduced corresponding ServerLinuxKernelTooOld error for Awg2. * feat: implement service kickstart and improve macos post install script (#2131) * feat: add support open files by atv (#2082) * fix: fixed cipher selection (#2110) * feat: news notifications switch (#2126) * feat: news notifications switch * update: text changes * fix: notifications enabled by default * fix: keyboard navigation (#2023) * fix: self-hosted easy install card * fix: label double click when enter/return pressed * fix: change drawer parents interactivity (#2004) * fix: change drawer parents interactivity * update: better vars names * chore: fix artifacts upload (#1961) * fix: update tag deploy (#2168) --------- Co-authored-by: MrMirDan <58086007+MrMirDan@users.noreply.github.com> Co-authored-by: NickVs2015 <nv@amnezia.org> Co-authored-by: Yaroslav <yaroslav.yashin@gmail.com> Co-authored-by: Mitternacht822 <sb@amnezia.org> Co-authored-by: VoyNaLunu <93346826+VoyNaLunu@users.noreply.github.com> Co-authored-by: Mykola Baibuz <mykola.baibuz@gmail.com> Co-authored-by: AnhTVc <tranvietanh.hust@gmail.com> Co-authored-by: aiamnezia <ai@amnezia.org> Co-authored-by: albexk <albexk@proton.me> Co-authored-by: Yaroslav Gurov <31506978+ygurov@users.noreply.github.com> Co-authored-by: yyy-amnezia <yyy@amnezia.org> Co-authored-by: vladimir.kuznetsov <nethiuswork@gmail.com> Co-authored-by: lunardunno <126363523+lunardunno@users.noreply.github.com> Co-authored-by: Artyom Titov <justblender@users.noreply.github.com> Co-authored-by: irvinklause <ik@amnezia.org> Co-authored-by: dpamnezia <dp@amnezia.org>
Amnezia VPN
The best client for self-hosted VPN
English | Русский
Amnezia is an open-source VPN client, with a key feature that enables you to deploy your own VPN server on your server.
Website | Alt website link | Documentation | Troubleshooting
Tip
If the Amnezia website is blocked in your region, you can use an Alternative website link.
Features
- Very easy to use - enter your IP address, SSH login, password and Amnezia will automatically install VPN docker containers to your server and connect to the VPN.
- Classic VPN-protocols: OpenVPN, WireGuard and IKEv2 protocols.
- Protocols with traffic Masking (Obfuscation): OpenVPN over Cloak plugin, Shadowsocks (OpenVPN over Shadowsocks), AmneziaWG and XRay.
- Split tunneling support - add any sites to the client to enable VPN only for them or add Apps (only for Android and Desktop).
- Windows, MacOS, Linux, Android, iOS releases.
- Support for AmneziaWG protocol configuration on Keenetic beta firmware.
Links
- https://amnezia.org - Project website | Alternative link (mirror)
- https://docs.amnezia.org - Documentation
- https://www.reddit.com/r/AmneziaVPN - Reddit
- https://t.me/amnezia_vpn_en - Telegram support channel (English)
- https://t.me/amnezia_vpn_ir - Telegram support channel (Farsi)
- https://t.me/amnezia_vpn_mm - Telegram support channel (Myanmar)
- https://t.me/amnezia_vpn - Telegram support channel (Russian)
- https://vpnpay.io/en/amnezia-premium/ - Amnezia Premium
Tech
AmneziaVPN uses several open-source projects to work:
- OpenSSL
- OpenVPN
- Shadowsocks
- Qt
- LibSsh - forked from Qt Creator
- and more...
Checking out the source code
Make sure to pull all submodules after checking out the repo.
git submodule update --init --recursive
Development
Want to contribute? Welcome!
Help with translations
Download the most actual translation files.
Go to "Actions" tab, click on the first line. Then scroll down to the "Artifacts" section and download "AmneziaVPN_translations".
Unzip this file. Each *.ts file contains strings for one corresponding language.
Translate or correct some strings in one or multiple *.ts files and commit them back to this repository into the client/translations folder.
You can do it via a web-interface or any other method you're familiar with.
Building sources and deployment
Check deploy folder for build scripts.
How to build an iOS app from source code on MacOS
-
First, make sure you have XCode installed, at least version 14 or higher.
-
We use QT to generate the XCode project. We need QT version 6.6.2. Install QT for MacOS here or QT Online Installer. Required modules:
- MacOS
- iOS
- Qt 5 Compatibility Module
- Qt Shader Tools
- Additional Libraries:
- Qt Image Formats
- Qt Multimedia
- Qt Remote Objects
-
Install CMake if required. We recommend CMake version 3.25. You can install CMake here
-
You also need to install go >= v1.16. If you don't have it installed already, download go from the official website or use Homebrew. The latest version is recommended. Install gomobile
export PATH=$PATH:~/go/bin
go install golang.org/x/mobile/cmd/gomobile@latest
gomobile init
- Build the project
export QT_BIN_DIR="<PATH-TO-QT-FOLDER>/Qt/<QT-VERSION>/ios/bin"
export QT_MACOS_ROOT_DIR="<PATH-TO-QT-FOLDER>/Qt/<QT-VERSION>/macos"
export QT_IOS_BIN=$QT_BIN_DIR
export PATH=$PATH:~/go/bin
mkdir build-ios
$QT_IOS_BIN/qt-cmake . -B build-ios -GXcode -DQT_HOST_PATH=$QT_MACOS_ROOT_DIR
Replace PATH-TO-QT-FOLDER and QT-VERSION to your environment
If you get gomobile: command not found make sure to set PATH to the location
of the bin folder where gomobile was installed. Usually, it's in GOPATH.
export PATH=$(PATH):/path/to/GOPATH/bin
- Open the XCode project. You can then run /test/archive/ship the app.
If the build fails with the following error
make: ***
[$(PROJECTDIR)/client/build/AmneziaVPN.build/Debug-iphoneos/wireguard-go-bridge/goroot/.prepared]
Error 1
Add a user-defined variable to both AmneziaVPN and WireGuardNetworkExtension targets' build settings with
key PATH and value ${PATH}/path/to/bin/folder/with/go/executable, e.g. ${PATH}:/usr/local/go/bin.
if the above error persists on your M1 Mac, then most probably you need to install arch based CMake
arch -arm64 brew install cmake
Build might fail with the "source files not found" error the first time you try it, because the modern XCode build system compiles dependencies in parallel, and some dependencies end up being built after the ones that require them. In this case, simply restart the build.
How to build the Android app
Tested on Mac OS
The Android app has the following requirements:
- JDK 11
- Android platform SDK 33
- CMake 3.25.0
After you have installed QT, QT Creator, and Android Studio, you need to configure QT Creator correctly.
- Click in the top menu bar on
QT Creator->Preferences->Devicesand select the tabAndroid. - Set path to JDK 11
- Set path to Android SDK (
$ANDROID_HOME)
In case you get errors regarding missing SDK or 'SDK manager not running', you cannot fix them by correcting the paths. If you have some spare GBs on your disk, you can let QT Creator install all requirements by choosing an empty folder for Android SDK location and clicking on Set Up SDK. Be aware: This will install a second Android SDK and NDK on your machine!
Double-check that the right CMake version is configured: Click on QT Creator -> Preferences and click on the side menu on Kits. Under the center content view's Kits tab, you'll find an entry for CMake Tool. If the default selected CMake version is lower than 3.25.0, install on your system CMake >= 3.25.0 and choose System CMake at <path> from the drop-down list. If this entry is missing, you either have not installed CMake yet or QT Creator hasn't found the path to it. In that case, click in the preferences window on the side menu item CMake, then on the tab Tools in the center content view, and finally on the button Add to set the path to your installed CMake.
Please make sure that you have selected Android Platform SDK 33 for your project: click in the main view's side menu on Projects, and on the left, you'll see a section Build & Run showing different Android build targets. You can select any of them, Amnezia VPN's project setup is designed in a way that all Android targets will be built. Click on the targets submenu item Build and scroll in the center content view to Build Steps. Click on Details at the end of the headline Build Android APK (the Details button might be hidden in case the QT Creator Window is not running in full screen!). Here we are: Choose android-33 as Android Build Platform SDK.
That's it! You should be ready to compile the project from QT Creator!
Development flow
After you've hit the build button, QT-Creator copies the whole project to a folder in the repository parent directory. The folder should look something like build-amnezia-client-Android_Qt_<version>_Clang_<architecture>-<BuildType>.
If you want to develop Amnezia VPNs Android components written in Kotlin, such as components using system APIs, you need to import the generated project in Android Studio with build-amnezia-client-Android_Qt_<version>_Clang_<architecture>-<BuildType>/client/android-build as the projects root directory. While you should be able to compile the generated project from Android Studio, you cannot work directly in the repository's Android project. So whenever you are confident with your work in the generated project, you'll need to copy and paste the affected files to the corresponding path in the repository's Android project so that you can add and commit your changes!
You may face compiling issues in QT Creator after you've worked in Android Studio on the generated project. Just do a ./gradlew clean in the generated project's root directory (<path>/client/android-build/.) and you should be good to go.
License
GPL v3.0
Donate
Patreon: https://www.patreon.com/amneziavpn
Bitcoin: bc1qmhtgcf9637rl3kqyy22r2a8wa8laka4t9rx2mf
USDT BEP20: 0x6abD576765a826f87D1D95183438f9408C901bE4
USDT TRC20: TELAitazF1MZGmiNjTcnxDjEiH5oe7LC9d
XMR: 48spms39jt1L2L5vyw2RQW6CXD6odUd4jFu19GZcDyKKQV9U88wsJVjSbL4CfRys37jVMdoaWVPSvezCQPhHXUW5UKLqUp3
TON: UQDpU1CyKRmg7L8mNScKk9FRc2SlESuI7N-Hby4nX-CcVmns
Acknowledgments
This project is tested with BrowserStack. We express our gratitude to BrowserStack for supporting our project.

