Top Related Projects
An open source, self-hosted implementation of the Tailscale control server
A simple WireGuard VPN server GUI
Set up a personal VPN in the cloud
Enterprise-ready zero-trust access platform built on WireGuard®.
An all-in-one WireGuard VPN solution with a web ui for connecting devices
CasaOS - A simple, easy-to-use, elegant open-source Personal Cloud system.
Quick Overview
WireGuard UI (wg-ui) is a web-based management interface for WireGuard VPN servers. It provides a user-friendly way to configure and manage WireGuard connections, users, and settings through a web browser, simplifying the process of setting up and maintaining a WireGuard VPN server.
Pros
- Easy-to-use web interface for managing WireGuard configurations
- Supports multiple users and devices with separate configurations
- Integrates with OAuth providers for authentication
- Provides real-time status monitoring of WireGuard connections
Cons
- Requires additional setup compared to using WireGuard directly
- May introduce potential security vulnerabilities if not properly configured
- Limited customization options compared to manual configuration
- Depends on external services for some features (e.g., OAuth providers)
Getting Started
To set up WireGuard UI, follow these steps:
- Install WireGuard on your server
- Download the latest release of wg-ui from the GitHub repository
- Configure the
config.inifile with your desired settings - Run the wg-ui binary:
./wg-ui
- Access the web interface at
http://your-server-ip:8080 - Log in and start configuring your WireGuard VPN
Note: For production use, it's recommended to set up HTTPS and configure authentication methods as described in the project documentation.
Competitor Comparisons
An open source, self-hosted implementation of the Tailscale control server
Pros of headscale
- More comprehensive Tailscale-compatible server implementation
- Supports multiple users and namespaces
- Offers OIDC integration for authentication
Cons of headscale
- More complex setup and configuration
- Requires additional infrastructure (e.g., database)
- May have a steeper learning curve for new users
Code comparison
headscale (Go):
func (h *Headscale) CreatePreAuthKey(ctx context.Context, user *User, reusable bool, ephemeral bool, expiration *time.Time) (*PreAuthKey, error) {
key := GenerateKey()
preAuthKey := PreAuthKey{
User: user,
Key: key,
Reusable: reusable,
Ephemeral: ephemeral,
Expiration: expiration,
}
// ... (additional logic)
}
wg-ui (JavaScript):
async function createClient(name) {
const { publicKey, privateKey } = await generateKeyPair();
const client = {
name,
publicKey,
privateKey,
allowedIPs: [],
};
clients.push(client);
await saveConfig();
return client;
}
The code snippets show different approaches: headscale implements a more complex pre-authentication system, while wg-ui focuses on simpler client creation and management.
A simple WireGuard VPN server GUI
Pros of Subspace
- More comprehensive VPN solution with built-in DNS management and email notifications
- Supports multiple VPN protocols (WireGuard, OpenVPN, IKEv2)
- Includes a mobile app for easier management on-the-go
Cons of Subspace
- More complex setup and configuration process
- Requires more system resources due to additional features
- Less focused on WireGuard specifically, which may not be ideal for users only interested in that protocol
Code Comparison
wg-ui:
func (s *Server) CreateUser(w http.ResponseWriter, r *http.Request) {
var user User
err := json.NewDecoder(r.Body).Decode(&user)
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
// ... (user creation logic)
}
Subspace:
func (h *Handler) CreateUser(c echo.Context) error {
u := new(models.User)
if err := c.Bind(u); err != nil {
return echo.NewHTTPError(http.StatusBadRequest, err.Error())
}
// ... (user creation logic)
return c.JSON(http.StatusCreated, u)
}
Both projects use Go for backend implementation, but Subspace utilizes the Echo framework for handling HTTP requests, while wg-ui uses the standard net/http package.
Set up a personal VPN in the cloud
Pros of algo
- More comprehensive VPN solution, including server setup and management
- Supports multiple VPN protocols (WireGuard, IPsec/IKEv2)
- Includes additional security features like DNS-based ad blocking
Cons of algo
- More complex setup process
- Requires more technical knowledge to configure and maintain
- Less user-friendly interface for end-users
Code comparison
algo (setup script excerpt):
#!/usr/bin/env bash
set -e
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
cd "${SCRIPT_DIR}"
# Check for dependencies
if ! command -v python3 >/dev/null 2>&1; then
echo "Python 3 is not installed. Please install it and try again."
exit 1
fi
wg-ui (main.go excerpt):
func main() {
flag.Parse()
if *version {
fmt.Printf("wg-ui version %s\n", Version)
return
}
log.Printf("Starting wg-ui %s", Version)
}
The code comparison shows that algo uses a bash script for setup, while wg-ui is written in Go. This reflects the difference in complexity and approach between the two projects.
Enterprise-ready zero-trust access platform built on WireGuard®.
Pros of Firezone
- More comprehensive VPN solution with built-in authentication and user management
- Supports multiple VPN protocols (WireGuard, OpenVPN)
- Actively maintained with regular updates and a growing community
Cons of Firezone
- More complex setup and configuration compared to wg-ui
- Requires more system resources due to its broader feature set
- Steeper learning curve for administrators new to VPN management
Code Comparison
wg-ui (JavaScript):
const createConfig = async (req, res) => {
const { name, email } = req.body;
const config = await generateWireGuardConfig(name, email);
res.json({ config });
};
Firezone (Elixir):
def create_device(attrs \\ %{}) do
%Device{}
|> Device.changeset(attrs)
|> Repo.insert()
|> case do
{:ok, device} -> {:ok, device}
{:error, changeset} -> {:error, changeset}
end
end
While both projects aim to simplify WireGuard VPN management, Firezone offers a more feature-rich solution with multi-protocol support and built-in user management. However, this comes at the cost of increased complexity and resource requirements. wg-ui provides a simpler, more focused approach to WireGuard configuration, which may be preferable for smaller deployments or users seeking a lightweight solution.
An all-in-one WireGuard VPN solution with a web ui for connecting devices
Pros of wg-access-server
- More active development with recent updates and contributions
- Built-in OIDC support for authentication
- Includes a CLI tool for easier management
Cons of wg-access-server
- Less intuitive UI compared to wg-ui
- Requires more configuration and setup
- Limited documentation for advanced features
Code Comparison
wg-access-server:
func (s *Server) Start() error {
s.wg.Add(2)
go s.startHTTPServer()
go s.startUDPServer()
return nil
}
wg-ui:
async function startServer() {
await initializeDatabase();
app.listen(config.port, () => {
console.log(`Server started on port ${config.port}`);
});
}
The code snippets show different approaches to starting the server. wg-access-server uses goroutines for concurrent HTTP and UDP server initialization, while wg-ui follows a more straightforward asynchronous approach in JavaScript.
Both projects aim to provide a user-friendly interface for managing WireGuard VPN configurations, but they differ in implementation details and feature sets. wg-access-server offers more advanced features and authentication options, while wg-ui focuses on simplicity and ease of use. The choice between the two depends on specific requirements and user preferences.
CasaOS - A simple, easy-to-use, elegant open-source Personal Cloud system.
Pros of CasaOS
- Comprehensive home server solution with a wide range of features
- User-friendly interface for managing various services and applications
- Active development and community support
Cons of CasaOS
- More complex setup and configuration compared to wg-ui
- Potentially higher resource usage due to its broader feature set
- May include unnecessary features for users only interested in WireGuard management
Code Comparison
While a direct code comparison is not particularly relevant due to the different scopes of these projects, we can highlight some key differences in their implementation:
wg-ui (Go):
func (s *Server) CreateClient(ctx context.Context, client *Client) error {
// WireGuard-specific client creation logic
}
CasaOS (Go):
func (s *System) InstallApp(ctx context.Context, app *App) error {
// Broader application installation logic
}
CasaOS offers a more extensive API for managing various aspects of a home server, while wg-ui focuses specifically on WireGuard VPN management. The code structures reflect their respective scopes and purposes.
Convert
designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual CopilotREADME
WG UI
A basic, self-contained management service for WireGuard with a self-serve web UI.
Current stable release: v1.3.0
Features
- Self-serve and web based
- QR-Code for convenient mobile client configuration
- Optional multi-user support behind an authenticating proxy
- Simple authentication support
- Zero external dependencies - just a single binary using the wireguard kernel module
- Binary and container deployment

Running
The easiest way to run wg-ui is using the container image. To test it, run:
docker run --rm -it --privileged --entrypoint "/wireguard-ui" -v /tmp/wireguard-ui:/data -p 8080:8080 embarkstudios/wireguard-ui:latest --data-dir=/data --log-level=debug
When running in production, we recommend using the latest release as opposed to latest.
Important to know is that you need to have WireGuard installed on the machine in order for this to work, as this is 'just' a UI to manage WireGuard configs.
Configuration
You can configure wg-ui using commandline flags or environment variables. To see all available flags run:
docker run --rm -it embarkstudios/wireguard-ui:latest -h
./wireguard-ui -h
You can alternatively specify each flag through an environment variable of the form WIREGUARD_UI_<FLAG_NAME>, where <FLAG_NAME> is replaced with the flag name transformed to CONSTANT_CASE, e.g.
docker run --rm -it embarkstudios/wireguard-ui:latest --log-level=debug
and
docker run --rm -it -e WIREGUARD_UI_LOG_LEVEL=debug embarkstudios/wireguard-ui:latest
are the same.
Authentication
You can configure basic authentication using the flags/environment variables --auth-basic-user=<user> and --auth-basic-pass=<bcrypt hash> The password is
a bcrypt hash that you can generate yourself using the docker container:
$ docker run -it embarkstudios/wireguard-ui:latest passwd mySecretPass
INFO[0001] Password Hash: $2a$14$D2jsPnpJixC0U0lyaGUd0OatV7QGzQ08yKV.gsmITVZgNevfZXj36
Docker images
There are two ways to run wg-ui today, you can run it with kernel module installed on your host which is the best way to do it if you want performance.
docker pull embarkstudios/wireguard-ui:latest
If you however do not have the possibility or interest in having kernel module loaded on your host, there is now a solution for that using a docker image based on wireguard-go. Keep in mind that this runs in userspace and not in kernel module.
docker pull embarkstudios/wireguard-ui:userspace
Both images are built for linux/amd64, linux/arm64 and linux/arm/v7. If you would need it for any other platform you can build wg-ui binaries with help from the documentation.
Install without Docker
You need to have WireGuard installed on the machine running wg-ui.
Unless you use the userspace version with docker you're required to have WireGuard installed on your host machine.
A few installation guides:
Ubuntu 20.04 LTS
CentOS 8
Debian 10
Go installation (Debian)
Install latest version of Go from (https://golang.org/dl/)
sudo tar -C /usr/local -xzf go$VERSION.$OS-$ARCH.tar.gz
Setup environment
Bash: ~/.bash_profile
ZSH: ~/.zshrc
export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin
export GOPATH=$HOME/go
Install LTS version of nodejs for frontend.
sudo apt-get install curl software-properties-common
curl -sL https://deb.nodesource.com/setup_12.x | sudo bash -
sudo apt-get install nodejs
Fetch wg-ui
git clone https://github.com/EmbarkStudios/wg-ui.git && cd wg-ui
Build binary with ui
make build
Crosscompiling
make build-amd64
make build-armv5
make build-armv6
make build-armv7
Build step by step
make ui
make build
Developing
Start frontend server
npm install --prefix=ui
npm run --prefix=ui dev
Use frontend server when running the server
make build
sudo ./bin/wireguard-ui --log-level=debug --dev-ui-server http://localhost:5000
Contributing
We welcome community contributions to this project.
Please read our Contributor Guide for more information on how to get started.
License
Licensed under either of
- Apache License, Version 2.0, (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
at your option.
Top Related Projects
An open source, self-hosted implementation of the Tailscale control server
A simple WireGuard VPN server GUI
Set up a personal VPN in the cloud
Enterprise-ready zero-trust access platform built on WireGuard®.
An all-in-one WireGuard VPN solution with a web ui for connecting devices
CasaOS - A simple, easy-to-use, elegant open-source Personal Cloud system.
Convert
designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual Copilot