diff --git a/.github/workflows/deploy_website.yml b/.github/workflows/deploy_website.yml
index 97bd195ee3..febc08c42e 100644
--- a/.github/workflows/deploy_website.yml
+++ b/.github/workflows/deploy_website.yml
@@ -2,6 +2,9 @@ name: GitHub Pages
on:
workflow_dispatch:
+ release:
+ # Rebuild so the download page picks up the newly published (pre-)release.
+ types: [published]
push:
branches:
- main
@@ -46,6 +49,9 @@ jobs:
- name: Build website
run: yarn build
+ env:
+ # Used by scripts/fetch-release-data.mjs to raise the GitHub API rate limit.
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Deploy to GitHub Pages
uses: peaceiris/actions-gh-pages@v4
diff --git a/Website/docs/introduction.mdx b/Website/docs/introduction.mdx
index 4776ea1677..4f84e5ef36 100644
--- a/Website/docs/introduction.mdx
+++ b/Website/docs/introduction.mdx
@@ -4,55 +4,33 @@ description: "Explore NETworkManager, a free open-source Windows tool with 25+ b
keywords: [NETworkManager, network management, network tools, open source, Windows, IP scanner, port scanner, remote desktop, SSH, PuTTY, PowerShell, network troubleshooting]
---
+import ToolChips from "@site/src/components/ToolChips";
+import tools from "@site/src/data/tools";
+
# Introduction
NETworkManager is a powerful open-source tool for managing networks and troubleshooting network problems!

-## Features
-
-NETworkManager comes with various built-in tools. See the documentation for detailed information about each feature:
-
-- [Dashboard](./application/dashboard)
-- [Network Interface](./application/network-interface) - Information, Bandwidth, Configure
-- [WiFi](./application/wifi) - Networks, Channels
-- [IP Scanner](./application/ip-scanner)
-- [Port Scanner](./application/port-scanner)
-- [Ping Monitor](./application/ping-monitor)
-- [Traceroute](./application/traceroute)
-- [DNS Lookup](./application/dns-lookup)
-- [Remote Desktop](./application/remote-desktop)
-- [PowerShell](./application/powershell)
-- [PuTTY](./application/putty) (requires [PuTTY](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html))
-- [TigerVNC](./application/tigervnc) (requires [TigerVNC](https://tigervnc.org/))
-- [Web Console](./application/web-console)
-- [SNMP](./application/snmp) - Get, Walk, Set
-- [Hosts File Editor](./application/hosts-file-editor)
-- [Firewall](./application/firewall)
-- [SNTP Lookup](./application/sntp-lookup)
-- [Discovery Protocol](./application/discovery-protocol) - LLDP, CDP
-- [Wake on LAN](./application/wake-on-lan)
-- [Whois](./application/whois)
-- [Subnet Calculator](./application/subnet-calculator) - Calculator, Subnetting, Supernetting
-- [Bit Calculator](./application/bit-calculator)
-- [Lookup](./application/lookup) - OUI, Port
-- [Connections](./application/connections)
-- [Listeners](./application/listeners)
-- [Neighbor Table](./application/neighbor-table)
-
-## Groups and Profiles
+## 🧰 Features
+
+NETworkManager comes with **{tools.length} built-in tools** — everything a network engineer needs, in one place. Select a tool to jump to its documentation:
+
+
+
+## 🗂️ Groups and Profiles
Organize hosts and networks in profiles with individual settings and use them seamlessly across all features. Keep sensitive data secure with encrypted profile files, and manage different customers or environments using separate profile files. See the [Groups and Profiles](./groups-and-profiles.md) section for more information.
-## System-Wide Policies
+## 🏢 System-Wide Policies
Administrators can enforce specific settings for all users on a machine using system-wide policies. Policies are defined in a `config.json` file placed in the application installation directory, and override user-specific settings to provide centralized control in enterprise environments. See the [System-Wide Policies](./system-wide-policies.md) section for more information.
-## Customization
+## 🎨 Customization
NETworkManager comes with dark and light themes and multiple accent colors. You can also provide custom theme files. See the [Appearance settings](./settings/appearance.md) for more information.
-## Languages
+## 🌐 Languages
Thanks to the community, NETworkManager is available in more than 16 [languages](https://app.transifex.com/BornToBeRoot/NETworkManager/dashboard/). If you want to help translate NETworkManager, you can find everything to get started in the [contributing guidelines](https://github.com/BornToBeRoot/NETworkManager/blob/main/CONTRIBUTING.md).
diff --git a/Website/package.json b/Website/package.json
index bcb49e381b..b03ee45e7c 100644
--- a/Website/package.json
+++ b/Website/package.json
@@ -4,6 +4,9 @@
"private": true,
"scripts": {
"docusaurus": "docusaurus",
+ "fetch-release-data": "node scripts/fetch-release-data.mjs",
+ "prestart": "node scripts/fetch-release-data.mjs",
+ "prebuild": "node scripts/fetch-release-data.mjs",
"start": "docusaurus start",
"build": "docusaurus build",
"swizzle": "docusaurus swizzle",
diff --git a/Website/scripts/fetch-release-data.mjs b/Website/scripts/fetch-release-data.mjs
new file mode 100644
index 0000000000..28f7baa88d
--- /dev/null
+++ b/Website/scripts/fetch-release-data.mjs
@@ -0,0 +1,183 @@
+// Pre-fetches release data at build time and writes it to src/data/*.json:
+// - release.json : current stable release (version, date, downloads, checksums)
+// - prerelease.json : latest pre-release (version, date, downloads, checksums)
+//
+// Both files use the exact same shape and are built the same way — there is
+// nothing to bump by hand. The committed JSON files only act as an offline
+// fallback (last known values); every real build overwrites them with fresh data.
+//
+// Why build-time instead of client-side:
+// - The GitHub API (api.github.com) supports CORS but is rate limited
+// (60 requests/hour per IP for unauthenticated users) — doing it per visitor
+// risks hitting that limit.
+// - The release asset host (release-assets.githubusercontent.com) is NOT rate
+// limited but sends no Access-Control-Allow-Origin header, so a browser
+// fetch() of the SHA256SUMS file is blocked by CORS.
+// - Node has no CORS restriction and runs once per build, so fetching here is
+// reliable, includes the checksums, and adds zero per-visitor requests.
+//
+// Freshness: the website is rebuilt on every published (pre-)release (see the
+// `release` trigger in .github/workflows/deploy_website.yml), so the prefetched
+// data stays current without any client-side requests.
+import { writeFile } from "node:fs/promises";
+import { existsSync } from "node:fs";
+import { fileURLToPath } from "node:url";
+import { dirname, resolve } from "node:path";
+
+const __dirname = dirname(fileURLToPath(import.meta.url));
+const dataDir = resolve(__dirname, "..", "src", "data");
+const changelogDir = resolve(__dirname, "..", "docs", "changelog");
+const releasePath = resolve(dataDir, "release.json");
+const prereleasePath = resolve(dataDir, "prerelease.json");
+
+const REPO = "BornToBeRoot/NETworkManager";
+
+// Changelog category index — used when a release has no dedicated changelog page
+// yet, so the link never points at a non-existent doc (onBrokenLinks: "throw").
+const CHANGELOG_FALLBACK = "/docs/category/changelog";
+
+// Maps the data keys to the asset filename suffixes.
+const ASSET_SUFFIXES = {
+ setup: "_Setup.msi",
+ portable: "_Portable.zip",
+ archive: "_Archive.zip",
+};
+
+function ghHeaders() {
+ const headers = {
+ "User-Agent": "NETworkManager-website-build",
+ Accept: "application/vnd.github+json",
+ };
+ // Authenticate when a token is available (CI) to raise the rate limit.
+ const token = process.env.GITHUB_TOKEN;
+ if (token) headers.Authorization = `Bearer ${token}`;
+ return headers;
+}
+
+function formatDate(iso) {
+ const d = new Date(iso);
+ const dd = String(d.getDate()).padStart(2, "0");
+ const mm = String(d.getMonth() + 1).padStart(2, "0");
+ return `${dd}.${mm}.${d.getFullYear()}`;
+}
+
+async function writeJson(path, data) {
+ await writeFile(path, JSON.stringify(data, null, 2) + "\n");
+}
+
+// Downloads and parses the "" SHA256SUMS asset into a
+// { setup, portable, archive } map. Throws if any variant is missing.
+async function fetchChecksumMap(version) {
+ const url = `https://github.com/${REPO}/releases/download/${version}/NETworkManager_${version}_SHA256SUMS`;
+ const res = await fetch(url);
+ if (!res.ok) throw new Error(`HTTP ${res.status} for ${url}`);
+ const text = await res.text();
+
+ const map = {};
+ for (const line of text.split(/\r?\n/)) {
+ const m = line.trim().match(/^([0-9a-fA-F]{64})\s+(.+)$/);
+ if (!m) continue;
+ for (const [key, suffix] of Object.entries(ASSET_SUFFIXES)) {
+ if (m[2] === `NETworkManager_${version}${suffix}`) {
+ map[key] = m[1].toUpperCase();
+ }
+ }
+ }
+ for (const key of Object.keys(ASSET_SUFFIXES)) {
+ if (!map[key]) throw new Error(`Missing ${key} checksum for ${version}`);
+ }
+ return map;
+}
+
+// Resolves the changelog link for a stable version: its dedicated page if the
+// doc exists ("2026.2.22.0" -> /docs/changelog/2026-2-22-0), else the fallback.
+function stableChangelogUrl(version) {
+ const slug = version.replace(/\./g, "-");
+ return existsSync(resolve(changelogDir, `${slug}.md`))
+ ? `/docs/changelog/${slug}`
+ : CHANGELOG_FALLBACK;
+}
+
+// Builds the unified data object (download URLs + checksums + changelog link)
+// from a GitHub release object. Used identically for both stable and pre-release.
+async function buildData(release, changelog) {
+ const version = release.tag_name;
+
+ const downloads = {};
+ for (const [key, suffix] of Object.entries(ASSET_SUFFIXES)) {
+ const asset = release.assets.find((a) => a.name.endsWith(suffix));
+ if (asset) downloads[key] = asset.browser_download_url;
+ }
+
+ // Checksums are best-effort — older releases may not ship a SHA256SUMS file.
+ let checksums = null;
+ try {
+ checksums = await fetchChecksumMap(version);
+ } catch (err) {
+ const msg = err instanceof Error ? err.message : String(err);
+ console.warn(`[release-data] Checksums unavailable for ${version}: ${msg}`);
+ }
+
+ return {
+ available: true,
+ version,
+ releaseDate: formatDate(release.published_at),
+ changelog,
+ downloads,
+ checksums,
+ };
+}
+
+async function updateStable(releases) {
+ // Newest published, non-draft, non-pre-release.
+ const stable = releases.find((r) => !r.draft && !r.prerelease);
+ if (!stable) throw new Error("No stable release found");
+ await writeJson(
+ releasePath,
+ await buildData(stable, stableChangelogUrl(stable.tag_name)),
+ );
+ console.log(`[release-data] Stable updated to ${stable.tag_name}`);
+}
+
+async function updatePrerelease(releases) {
+ // The newest non-draft release; only show it if it is actually a pre-release
+ // (i.e. newer than the latest stable). Otherwise the section is hidden.
+ const latest = releases.find((r) => !r.draft);
+ if (!latest || !latest.prerelease) {
+ await writeJson(prereleasePath, { available: false });
+ console.log("[release-data] No pre-release available");
+ return;
+ }
+ // Pre-release changes are documented on the rolling "next release" page.
+ await writeJson(
+ prereleasePath,
+ await buildData(latest, "/docs/changelog/next-release"),
+ );
+ console.log(`[release-data] Pre-release updated to ${latest.tag_name}`);
+}
+
+async function main() {
+ const apiUrl = `https://api.github.com/repos/${REPO}/releases?per_page=30`;
+ const res = await fetch(apiUrl, { headers: ghHeaders() });
+ if (!res.ok) throw new Error(`HTTP ${res.status} for ${apiUrl}`);
+ const releases = await res.json();
+
+ // Each step is independent so a single failure keeps that file's committed
+ // fallback instead of failing the whole build.
+ for (const [label, fn] of [
+ ["stable", updateStable],
+ ["pre-release", updatePrerelease],
+ ]) {
+ try {
+ } catch (err) {
+ const msg = err instanceof Error ? err.message : String(err);
+ console.warn(`[release-data] ${label} skipped: ${msg}`);
+ }
+ }
+}
+
+main().catch((err) => {
+ // Non-fatal: keep all committed fallbacks so offline / CI builds still succeed.
+ const msg = err instanceof Error ? err.message : String(err);
+ console.warn(`[release-data] Skipped update: ${msg}`);
+});
diff --git a/Website/src/components/CopyButton/index.js b/Website/src/components/CopyButton/index.js
new file mode 100644
index 0000000000..81c73f365a
--- /dev/null
+++ b/Website/src/components/CopyButton/index.js
@@ -0,0 +1,49 @@
+import { useEffect, useRef, useState } from "react";
+import clsx from "clsx";
+import styles from "./styles.module.css";
+
+// Copies a value to the clipboard with brief visual feedback. Used for the
+// SHA-256 checksums on the download cards — the hash itself is never rendered,
+// which keeps the cards compact and mobile-safe.
+export default function CopyButton({
+ value,
+ idleLabel = "📋 Copy SHA-256",
+ copiedLabel = "✅ Copied",
+ className,
+}) {
+ const [copied, setCopied] = useState(false);
+ const timeoutRef = useRef(null);
+
+ useEffect(() => {
+ return () => {
+ if (timeoutRef.current) clearTimeout(timeoutRef.current);
+ };
+ }, []);
+
+ async function handleCopy() {
+ try {
+ await navigator.clipboard.writeText(value);
+ setCopied(true);
+ if (timeoutRef.current) clearTimeout(timeoutRef.current);
+ timeoutRef.current = setTimeout(() => setCopied(false), 1500);
+ } catch {
+ // Clipboard API unavailable (e.g. insecure context) — silently ignore.
+ }
+ }
+
+ return (
+
+ );
+}
diff --git a/Website/src/components/CopyButton/styles.module.css b/Website/src/components/CopyButton/styles.module.css
new file mode 100644
index 0000000000..bf67f0d3d6
--- /dev/null
+++ b/Website/src/components/CopyButton/styles.module.css
@@ -0,0 +1,16 @@
+.copyButton {
+ margin-top: 12px;
+ padding: 4px 10px;
+ background: transparent;
+ border: none;
+ border-radius: 8px;
+ cursor: pointer;
+ font-size: 13px;
+ color: var(--ifm-color-emphasis-600);
+ transition: color 0.15s, background 0.15s;
+}
+
+.copyButton:hover {
+ color: var(--ifm-color-primary);
+ background: var(--ifm-color-emphasis-200);
+}
diff --git a/Website/src/components/DownloadCard/index.js b/Website/src/components/DownloadCard/index.js
new file mode 100644
index 0000000000..93fdec4220
--- /dev/null
+++ b/Website/src/components/DownloadCard/index.js
@@ -0,0 +1,42 @@
+import Link from "@docusaurus/Link";
+import clsx from "clsx";
+import CopyButton from "@site/src/components/CopyButton";
+import styles from "./styles.module.css";
+
+// Responsive grid wrapper for a row of elements.
+export function DownloadGrid({ children }) {
+ return
{children}
;
+}
+
+// A single download option. `description` and `recommended` are optional, so the
+// same card renders both the detailed stable variant and the compact
+// pre-release variant. When a `checksum` is given, a copy button is shown.
+export default function DownloadCard({
+ icon,
+ label,
+ sub,
+ color = "primary",
+ description,
+ recommended = false,
+ downloadUrl,
+ checksum,
+}) {
+ return (
+
>
);
diff --git a/Website/src/components/ReleaseHero/index.js b/Website/src/components/ReleaseHero/index.js
new file mode 100644
index 0000000000..af4c7c1aeb
--- /dev/null
+++ b/Website/src/components/ReleaseHero/index.js
@@ -0,0 +1,31 @@
+import Link from "@docusaurus/Link";
+import clsx from "clsx";
+import styles from "./styles.module.css";
+
+// Dark banner showing a release version + date and a changelog link. Used for
+// both the stable download (full size) and the pre-release (compact, tagged).
+export default function ReleaseHero({
+ version,
+ releaseDate,
+ changelog,
+ changelogLabel,
+ tag,
+ compact = false,
+}) {
+ return (
+
+ );
+}
diff --git a/Website/src/components/ToolChips/styles.module.css b/Website/src/components/ToolChips/styles.module.css
new file mode 100644
index 0000000000..f1a6a4f2ed
--- /dev/null
+++ b/Website/src/components/ToolChips/styles.module.css
@@ -0,0 +1,28 @@
+.toolChips {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 10px;
+ justify-content: center;
+ max-width: 900px;
+ margin: 0 auto 32px;
+}
+
+.toolChip {
+ background: var(--ifm-color-emphasis-100);
+ border: 1px solid var(--ifm-color-emphasis-300);
+ border-radius: 20px;
+ padding: 6px 16px;
+ font-size: 14px;
+ font-weight: 500;
+ color: var(--ifm-font-color-base);
+ white-space: nowrap;
+ text-decoration: none;
+ transition: background 0.15s, border-color 0.15s;
+}
+
+.toolChip:hover {
+ background: var(--ifm-color-emphasis-200);
+ border-color: var(--ifm-color-primary);
+ color: var(--ifm-color-primary);
+ text-decoration: none;
+}
diff --git a/Website/src/data/prerelease.json b/Website/src/data/prerelease.json
new file mode 100644
index 0000000000..24a5f6a3b0
--- /dev/null
+++ b/Website/src/data/prerelease.json
@@ -0,0 +1,16 @@
+{
+ "available": true,
+ "version": "2026.6.15.0",
+ "releaseDate": "15.06.2026",
+ "changelog": "/docs/changelog/next-release",
+ "downloads": {
+ "setup": "https://github.com/BornToBeRoot/NETworkManager/releases/download/2026.6.15.0/NETworkManager_2026.6.15.0_Setup.msi",
+ "portable": "https://github.com/BornToBeRoot/NETworkManager/releases/download/2026.6.15.0/NETworkManager_2026.6.15.0_Portable.zip",
+ "archive": "https://github.com/BornToBeRoot/NETworkManager/releases/download/2026.6.15.0/NETworkManager_2026.6.15.0_Archive.zip"
+ },
+ "checksums": {
+ "setup": "A00E9B3DD49B95A1D0607B98D14F2108906AB7EC8D6680F1AD172A91551FDDF2",
+ "portable": "31AB794ACC6FC74497FAB23F0CF8A02823E19370E1049FCF3A602754D2005FB8",
+ "archive": "F0D0137957464C938C7E3684E89F448BBBB84062858601C53118B31C91C533F9"
+ }
+}
diff --git a/Website/src/data/release.json b/Website/src/data/release.json
new file mode 100644
index 0000000000..0fb7a0e369
--- /dev/null
+++ b/Website/src/data/release.json
@@ -0,0 +1,16 @@
+{
+ "available": true,
+ "version": "2026.2.22.0",
+ "releaseDate": "22.02.2026",
+ "changelog": "/docs/changelog/2026-2-22-0",
+ "downloads": {
+ "setup": "https://github.com/BornToBeRoot/NETworkManager/releases/download/2026.2.22.0/NETworkManager_2026.2.22.0_Setup.msi",
+ "portable": "https://github.com/BornToBeRoot/NETworkManager/releases/download/2026.2.22.0/NETworkManager_2026.2.22.0_Portable.zip",
+ "archive": "https://github.com/BornToBeRoot/NETworkManager/releases/download/2026.2.22.0/NETworkManager_2026.2.22.0_Archive.zip"
+ },
+ "checksums": {
+ "setup": "AD3A107D76B9391C88C4427717F243C64309F4D66FEA9775AAB75C1CD51A2D4E",
+ "portable": "68F2B9F2908D3725633DF2CD91FE7B4D21390CE2E39457B9DBFA2AC80ABE05E8",
+ "archive": "E535D411472F45420BB3C42EDA45470BD05EECA989074ED68D9F5A4290C3711D"
+ }
+}
diff --git a/Website/src/data/tools.js b/Website/src/data/tools.js
new file mode 100644
index 0000000000..86465d2695
--- /dev/null
+++ b/Website/src/data/tools.js
@@ -0,0 +1,46 @@
+// Single source of truth for the built-in tools list, shared by the homepage
+// tool grid and the docs introduction. Sorted by sidebar_position.
+// `note` (optional) is shown as a tooltip on the chip.
+const tools = [
+ { name: "Dashboard", to: "/docs/application/dashboard" },
+ {
+ name: "Network Interface",
+ to: "/docs/application/network-interface",
+ note: "Information, Bandwidth, Configure",
+ },
+ { name: "WiFi", to: "/docs/application/wifi", note: "Networks, Channels" },
+ { name: "IP Scanner", to: "/docs/application/ip-scanner" },
+ { name: "Port Scanner", to: "/docs/application/port-scanner" },
+ { name: "Ping Monitor", to: "/docs/application/ping-monitor" },
+ { name: "Traceroute", to: "/docs/application/traceroute" },
+ { name: "DNS Lookup", to: "/docs/application/dns-lookup" },
+ { name: "Remote Desktop", to: "/docs/application/remote-desktop" },
+ { name: "PowerShell", to: "/docs/application/powershell" },
+ { name: "PuTTY", to: "/docs/application/putty", note: "Requires PuTTY" },
+ { name: "TigerVNC", to: "/docs/application/tigervnc", note: "Requires TigerVNC" },
+ { name: "Web Console", to: "/docs/application/web-console" },
+ { name: "SNMP", to: "/docs/application/snmp", note: "Get, Walk, Set" },
+ { name: "SNTP Lookup", to: "/docs/application/sntp-lookup" },
+ { name: "Hosts File Editor", to: "/docs/application/hosts-file-editor" },
+ { name: "Firewall", to: "/docs/application/firewall" },
+ {
+ name: "Discovery Protocol",
+ to: "/docs/application/discovery-protocol",
+ note: "LLDP, CDP",
+ },
+ { name: "Wake on LAN", to: "/docs/application/wake-on-lan" },
+ { name: "Whois", to: "/docs/application/whois" },
+ { name: "IP Geolocation", to: "/docs/application/ip-geolocation" },
+ {
+ name: "Subnet Calculator",
+ to: "/docs/application/subnet-calculator",
+ note: "Calculator, Subnetting, Supernetting",
+ },
+ { name: "Bit Calculator", to: "/docs/application/bit-calculator" },
+ { name: "Lookup", to: "/docs/application/lookup", note: "OUI, Port" },
+ { name: "Connections", to: "/docs/application/connections" },
+ { name: "Listeners", to: "/docs/application/listeners" },
+ { name: "Neighbor Table", to: "/docs/application/neighbor-table" },
+];
+
+export default tools;
diff --git a/Website/src/pages/download.mdx b/Website/src/pages/download.mdx
index eb00563079..b22361e594 100644
--- a/Website/src/pages/download.mdx
+++ b/Website/src/pages/download.mdx
@@ -5,81 +5,47 @@ keywords: [NETworkManager download, network manager download, free network tool,
---
import Link from "@docusaurus/Link";
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
import styles from "./styles.module.css";
+import DownloadSection from "@site/src/components/DownloadSection";
import LatestPrerelease from "@site/src/components/LatestPrerelease";
# Download
-
-
-
2026.2.22.0
-
-
Release Date: 22.02.2026
-
-
-
-
- Setup
-
-
- Portable
-
-
- Archive
-
-
-
-
-
- ✨ What's new?
-
-
+
-
+
🙏 Thank you for using NETworkManager!
NETworkManager is open source, free and without ads — developed in my spare time for you.
If you enjoy it, please consider supporting its development — whether by
- leaving a star on GitHub,
+ leaving a star on GitHub,
making a donation, or simply sharing it with others.
Your support helps keep the project going and growing. Thank you for being part of the journey!
@@ -97,83 +63,78 @@ import LatestPrerelease from "@site/src/components/LatestPrerelease";
-
-
## Which version should I download?
-NETworkManager is available in three different versions:
+The download cards above summarize each variant. This table compares where settings and profiles are stored and what each version is best suited for:
-| Version | Description |
-|---|---|
-| **Setup** (MSI Installer) | Recommended for most users. Installs system-wide and requires administrator privileges. Settings and profiles are stored in `~\Documents\NETworkManager`. Suitable for centralized deployment via Intune, SCCM, etc. |
-| **Portable** (ZIP Archive) | Run without installation — ideal for a USB stick or network share. Settings and profiles are stored next to the executable. To upgrade, copy the `Profiles` and `Settings` directories to the new version. |
-| **Archive** (ZIP Archive) | Similar to Portable, but stores settings and profiles in `~\Documents\NETworkManager`. Useful for custom deployment scenarios (e.g. Terminal Server). |
+| Version | Settings & profiles stored in | Best for |
+|---|---|---|
+| **Setup** (MSI) | `~\Documents\NETworkManager` | Most users — system-wide install, central deployment (Intune, SCCM) |
+| **Portable** (ZIP) | Next to the executable | USB stick / network share. To upgrade, copy the `Profiles` and `Settings` directories to the new version |
+| **Archive** (ZIP) | `~\Documents\NETworkManager` | Custom scenarios (e.g. Terminal Server) — portable, but Documents-based |
## System requirements
-- Windows 10 / Server x64 (22H2 or later)
-- [.NET Desktop Runtime 10.0 (LTS) - x64](https://dotnet.microsoft.com/en-us/download/dotnet/10.0/runtime)
+- 🪟 **Windows 10 / Server x64** (22H2 or later)
+- ⚙️ [**.NET Desktop Runtime 10.0 (LTS) - x64**](https://dotnet.microsoft.com/en-us/download/dotnet/10.0/runtime)
-## Silent install
+## Package Manager
-Install the Setup (MSI) silently using the following command:
+NETworkManager is available through the following package managers:
-```
-.\NETworkManager_{VERSION}_Setup.msi /quiet /norestart
-```
+
+
-## Enterprise Deployment / Policies
+```powershell
+winget install BornToBeRoot.NETworkManager
+```
-NETworkManager supports system-wide policies that allow administrators to enforce specific settings for all users on a machine — for example, disabling the automatic update check at startup. Policies are defined in a `config.json` file placed in the application installation directory and can be deployed via Group Policy, Intune, SCCM, or any other configuration management tool.
+Source: [github.com/microsoft/winget-pkgs](https://github.com/microsoft/winget-pkgs/tree/master/manifests/b/BornToBeRoot/NETworkManager/)
-See the [System-Wide Policies](/docs/system-wide-policies) documentation for details on available policy options and how to configure them.
+
+
-## Package Manager
+```powershell
+choco install networkmanager
+```
-NETworkManager is available through the following package managers:
+Source: [chocolatey.org/packages/NETworkManager](https://chocolatey.org/packages/NETworkManager)
-### Chocolatey
+
+
```powershell
-# Install via Chocolatey
-choco install networkmanager
+Get-EvergreenApp -Name NETworkManager | Save-EvergreenApp -Path $env:USERPROFILE\Downloads\
```
-Chocolatey package: [chocolatey.org/packages/NETworkManager](https://chocolatey.org/packages/NETworkManager)
+Source: [github.com/aaronparker/evergreen](https://github.com/aaronparker/evergreen)
+
+
+
+
+## Verify your download
-### WinGet
+Each download is published with a SHA-256 checksum. Use the **📋 Copy SHA-256** button on a download card to copy its expected hash, then compute the hash of the downloaded file and compare the two:
```powershell
-# Install via WinGet
-winget install BornToBeRoot.NETworkManager
+Get-FileHash -Path .\NETworkManager_{VERSION}_Setup.msi -Algorithm SHA256
```
-WinGet source: [github.com/microsoft/winget-pkgs](https://github.com/microsoft/winget-pkgs/tree/master/manifests/b/BornToBeRoot/NETworkManager/)
+The computed hash must match the copied checksum. The full list of checksums is also published on the [GitHub releases page](https://github.com/BornToBeRoot/NETworkManager/releases).
-### Evergreen
+## Silent install
-```powershell
-# Get release via Evergreen
-Get-EvergreenApp -Name NETworkManager
+Install the Setup (MSI) silently using the following command:
-# Get release via Evergreen and save the setup file to disk
-Get-EvergreenApp -Name NETworkManager | Save-EvergreenApp -Path C:\Users\$env:Username\Downloads\
+```
+.\NETworkManager_{VERSION}_Setup.msi /quiet /norestart
```
-Evergreen PowerShell module: [github.com/aaronparker/evergreen](https://github.com/aaronparker/evergreen)
+## Enterprise Deployment / Policies
+
+NETworkManager supports system-wide policies that allow administrators to enforce specific settings for all users on a machine — for example, disabling the automatic update check at startup. Policies are defined in a `config.json` file placed in the application installation directory and can be deployed via Group Policy, Intune, SCCM, or any other configuration management tool.
+
+See the [System-Wide Policies](/docs/system-wide-policies) documentation for details on available policy options and how to configure them.
## Pre-release
diff --git a/Website/src/pages/index.js b/Website/src/pages/index.js
index b3f2fc99a5..1aae297d0f 100644
--- a/Website/src/pages/index.js
+++ b/Website/src/pages/index.js
@@ -2,43 +2,15 @@ import React from "react";
import Link from "@docusaurus/Link";
import Layout from "@theme/Layout";
import HomepageFeatures from "@site/src/components/HomepageFeatures";
+import ToolChips from "@site/src/components/ToolChips";
+import tools from "@site/src/data/tools";
+import release from "@site/src/data/release.json";
import ImageGalleryDashboard from "@site/docs/img/dashboard.png";
import Heading from "@theme/Heading";
import styles from "./styles.module.css";
-// Sorted by sidebar_position
-const tools = [
- { name: "Dashboard", to: "/docs/application/dashboard" },
- { name: "Network Interface", to: "/docs/application/network-interface" },
- { name: "WiFi", to: "/docs/application/wifi" },
- { name: "IP Scanner", to: "/docs/application/ip-scanner" },
- { name: "Port Scanner", to: "/docs/application/port-scanner" },
- { name: "Ping Monitor", to: "/docs/application/ping-monitor" },
- { name: "Traceroute", to: "/docs/application/traceroute" },
- { name: "DNS Lookup", to: "/docs/application/dns-lookup" },
- { name: "Remote Desktop", to: "/docs/application/remote-desktop" },
- { name: "PowerShell", to: "/docs/application/powershell" },
- { name: "PuTTY", to: "/docs/application/putty" },
- { name: "TigerVNC", to: "/docs/application/tigervnc" },
- { name: "Web Console", to: "/docs/application/web-console" },
- { name: "SNMP", to: "/docs/application/snmp" },
- { name: "SNTP Lookup", to: "/docs/application/sntp-lookup" },
- { name: "Hosts File Editor", to: "/docs/application/hosts-file-editor" },
- { name: "Firewall", to: "/docs/application/firewall" },
- { name: "Discovery Protocol", to: "/docs/application/discovery-protocol" },
- { name: "Wake on LAN", to: "/docs/application/wake-on-lan" },
- { name: "Whois", to: "/docs/application/whois" },
- { name: "IP Geolocation", to: "/docs/application/ip-geolocation" },
- { name: "Subnet Calculator", to: "/docs/application/subnet-calculator" },
- { name: "Bit Calculator", to: "/docs/application/bit-calculator" },
- { name: "Lookup", to: "/docs/application/lookup" },
- { name: "Connections", to: "/docs/application/connections" },
- { name: "Listeners", to: "/docs/application/listeners" },
- { name: "Neighbor Table", to: "/docs/application/neighbor-table" },
-];
-
function HomepageHeader() {
return (