diff --git a/docs/content/config/migrate/from-14-to-15.md b/docs/content/config/migrate/from-14-to-15.md
new file mode 100644
index 00000000..b471fa18
--- /dev/null
+++ b/docs/content/config/migrate/from-14-to-15.md
@@ -0,0 +1,47 @@
+---
+title: Migrate from v14 to v15
+---
+
+This guide will help you migrate from `v14` to version `v15` of `wg-easy`.
+
+## Changes
+
+This is a complete rewrite of the `wg-easy` project. Therefore the configuration files and the way you interact with the project have changed.
+
+## Migration
+
+### Backup
+
+Before you start the migration, make sure to backup your existing configuration files.
+
+Go into the Web Ui and click the Backup button, this should download a `wg0.json` file.
+
+Or download the `wg0.json` file from your container volume to your pc.
+
+You will need this file for the migration
+
+### Remove old container
+
+1. Stop the running container
+
+If you are using `docker run`
+
+```shell
+docker stop wg-easy
+```
+
+If you are using `docker-compose`
+
+```shell
+docker-compose down
+```
+
+### Start new container
+
+Follow the instructions in the [Getting Started](../../usage.md) or [Basic Installation](../../examples/tutorials/basic-installation.md) guide to start the new container.
+
+In the setup wizard, select that you already already have a configuration file and upload the `wg0.json` file you downloaded in the backup step.
+
+### Done
+
+You have now successfully migrated to `v15` of `wg-easy`.
diff --git a/docs/content/examples/tutorials/basic-installation.md b/docs/content/examples/tutorials/basic-installation.md
index 2ec62572..534bccec 100644
--- a/docs/content/examples/tutorials/basic-installation.md
+++ b/docs/content/examples/tutorials/basic-installation.md
@@ -4,4 +4,49 @@ title: Basic Installation
-TODO
+## Requirements
+
+1. You need to have a host that you can manage
+2. You need to have a domain name or a public IP address
+3. You need a supported architecture (x86_64, arm64)
+4. You need curl installed on your host
+
+## Install Docker
+
+Follow the Docs here: and install Docker on your host.
+
+## Install `wg-easy`
+
+1. Create a directory for the configuration files (you can choose any directory you like):
+
+ ```shell
+ DIR=/docker/wg-easy
+ sudo mkdir -p $DIR
+ ```
+
+2. Download docker compose file
+
+ ```shell
+ sudo curl -o $URL/docker-compose.yml https://raw.githubusercontent.com/wg-easy/wg-easy/master/docker-compose.yml
+ ```
+
+3. Start `wg-easy`
+
+ ```shell
+ sudo docker-compose -f $DIR/docker-compose.yml up -d
+ ```
+
+## Setup Firewall
+
+If you are using a firewall, you need to open the following ports:
+
+- UDP 51820 (WireGuard)
+- TCP 51821 (Web UI)
+
+These ports can be changed, so if you change them you have to update your firewall rules accordingly.
+
+## Access the Web UI
+
+Open your browser and navigate to `https://:51821` or `https://:51821`.
+
+Follow the instructions to set up your WireGuard VPN.
diff --git a/docs/content/examples/tutorials/podman.md b/docs/content/examples/tutorials/podman.md
index bd1d6982..7e908d86 100644
--- a/docs/content/examples/tutorials/podman.md
+++ b/docs/content/examples/tutorials/podman.md
@@ -2,8 +2,6 @@
title: Podman
---
-# Podman
-
This guide will show you how to run `wg-easy` with rootful Podman and nftables.
## Requirements
@@ -82,16 +80,17 @@ In the Admin Panel of your WireGuard server, go to the `Hooks` tab and add the f
1. PostUp
-```shell
-apk add nftables; nft add table inet wg_table; nft add chain inet wg_table postrouting { type nat hook postrouting priority 100 \; }; nft add rule inet wg_table postrouting ip saddr {{ipv4Cidr}} oifname {{device}} masquerade; nft add rule inet wg_table postrouting ip6 saddr {{ipv6Cidr}} oifname {{device}} masquerade; nft add chain inet wg_table input { type filter hook input priority 0 \; }; nft add rule inet wg_table input udp dport {{port}} accept; nft add chain inet wg_table forward { type filter hook forward priority 0 \; }; nft add rule inet wg_table forward iifname "wg0" accept; nft add rule inet wg_table forward oifname "wg0" accept;
-```
+ ```shell
+ apk add nftables; nft add table inet wg_table; nft add chain inet wg_table postrouting { type nat hook postrouting priority 100 \; }; nft add rule inet wg_table postrouting ip saddr {{ipv4Cidr}} oifname {{device}} masquerade; nft add rule inet wg_table postrouting ip6 saddr {{ipv6Cidr}} oifname {{device}} masquerade; nft add chain inet wg_table input { type filter hook input priority 0 \; policy drop \; }; nft add rule inet wg_table input udp dport {{port}} accept; nft add chain inet wg_table forward { type filter hook forward priority 0 \; policy drop \; }; nft add rule inet wg_table forward iifname "wg0" accept; nft add rule inet wg_table forward oifname "wg0" accept;
+ ```
2. PostDown
-```shell
-nft delete table inet wg_table
-```
+ ```shell
+ nft delete table inet wg_table
+ ```
diff --git a/docs/content/usage.md b/docs/content/usage.md
index 50d3140a..5d4717fd 100644
--- a/docs/content/usage.md
+++ b/docs/content/usage.md
@@ -46,8 +46,11 @@ All workflows are using the tagging convention listed below. It is subsequently
| `cron` on `master` | `nightly` |
| `push` a tag (`v1.2.3`) | `1.2.3`, `1.2`, `1`, `latest` |
+When publishing a tag we follow the [Semantic Versioning][semver] specification. The `latest` tag is always pointing to the latest stable release. If you want to avoid breaking changes, use the major version tag (e.g. `15`).
+
[github-ci]: https://github.com/wg-easy/wg-easy/actions
[ghcr-image]: https://github.com/wg-easy/wg-easy/pkgs/container/wg-easy
+[semver]: https://semver.org/
### Get All Files