Self-hosted · MIT licensed · Open sourceBETA

Game server management
built for operators.

AirLink runs on your hardware. The panel lives in your browser, the daemon runs on each node. Install takes minutes and runs indefinitely — you own every bit of it.

What AirLink does

Install on your own machines, manage game servers through a web interface. No third-party control, no usage limits, no lock-in.

Server Management

Create game servers with CPU, RAM, and disk limits. Start, stop, restart, and kill Docker containers in real time. Assign servers to specific nodes and users.

The admin dashboard shows every server across every node with owner, status, and live resource usage. One-click server creation from any configured image. Duplicate servers, migrate between nodes, and manage power states without touching the command line.

Server Management

Console

Live terminal output streamed over WebSockets. Send commands, view logs, and interact with running servers directly from the browser.

Full PTY support for interactive server consoles. Command history, auto-scroll, and copy-to-clipboard. No page refreshes — output appears as the server produces it.

Console

File Manager

Browse, upload, download, edit, and delete server files. Inline code editor with syntax highlighting for config files and source code.

Full directory tree navigation with drag-and-drop uploads. Create folders, rename, move, and compress files. Edit configuration files in-browser without downloading or using external tools.

File Manager

Multi-Node

Add as many machines as you need. Each node runs its own daemon instance and reports resources back to the panel.

The panel distributes servers across nodes based on resource availability. One control plane, unlimited machines. Monitor node health, allocations, and connected servers from a single dashboard.

Nodes

SFTP

Built-in SFTP server on every node. No external FTP software needed — connect with any standard SFTP client.

Per-server SFTP access with sandboxed directories. Users authenticate through the panel with their existing credentials. Upload, download, and manage files over an encrypted connection without opening additional ports.

SFTP

Docker Containers

Every server runs in an isolated Docker container with enforced resource limits. CPU, RAM, and disk quotas are configured per server.

Containers are ephemeral — recreate without data loss. Pull and manage Docker images from the panel. Set environment variables, start commands, and working directories without editing config files on disk.

Docker

User Management

Granular permissions let you assign servers to specific users. Admin and regular user roles with sub-user access control for team management.

19 independent permissions per sub-user. Two-factor authentication for all accounts. API keys with scoped access for programmatic control. Invite users and manage their server assignments from the admin panel.

Users

REST API

Full programmatic access to every panel feature. Build custom tools, dashboards, and integrations using the same API the frontend uses.

Token-based authentication with HMAC signing. Paginated responses for large datasets. Webhook support for server events like start, stop, and crash. OpenAPI spec available for code generation and client libraries.

API

Addons

Community-built extensions that extend AirLink without modifying core code. Install from the addon marketplace or build your own.

Modrinth Store for Minecraft mods and modpacks, Parachute for Google Drive backups, and more. Addons run server-side with full API access. Create addons using the documented API — no forking required.

Addons

Add-ons

Extend AirLink with community addons.

Modrinth Store

v1.6.23

Browse and install Minecraft mods and modpacks from Modrinth directly in the panel. Search, one-click install, real-time download progress.

Parachute

v1.0.0

Google Drive backups for servers. OAuth connection per server, upload, download, restore. Optional encryption and per-server UUID isolation.

Build your own

Read the docs

The addon docs walk you through creating an addon from scratch. Includes a full tutorial and API reference.

Two repos, one system

Panel is the web interface. Daemon runs on each node and handles the real work. They talk over HMAC-signed HTTP, so one panel can talk to as many nodes as you need.

Highly Unstable — Beta Software

AirLink is in early development. Expect breaking changes, incomplete features, and potential data loss. Not recommended for production use.

By continuing, you acknowledge this is pre-release software.

One command to install

Works on Ubuntu, Debian, Fedora, RHEL, Arch, and Alpine. The installer sets up Node.js, Docker, the panel, and daemon. An interactive TUI walks you through each step.

bash <(curl -s https://raw.githubusercontent.com/airlinklabs/panel/refs/heads/main/installer.sh)

Install everything at once, or choose individual components. Run with--help to see options.

Recent changes

Commits across panel and daemon, sorted by date.

View all
feat: configurable beta badge + install warning overlay with smooth zoom animations
+257-53310 files
airlinklabs/homebthavanish
chore:update README.md
+262-100362 files
airlinklabs/panelbthavanish
feat: complete codebase cleanup, config expansion, CI consolidation, and test fixes (#124) * chore:checkpoint commit too many changes rn * chore:checkpoint commit 2 * feat: config system, i18n, CSS extraction, views restructure, source cleanup - Config system: src/config/ with context-specific modules (timeouts, limits, auth, server, daemonTimeouts, urls, mime, ui) + barrel defaults.ts + backwards-compat constants.ts - i18n service: src/services/i18n.ts with t(), tn(), logT(), req.translations Proxy, i18nMiddleware - English lang.json: deduplicated 59 duplicate keys, 2096 canonical keys - EJS templates: hardcoded strings replaced with i18n calls (admin, user, server views) - CSS: extracted ~40 hardcoded values to :root custom properties (tw.css, layout-animations.css, motion.css) - Views: renamed camelCase to kebab-case, moved admin/mounts/index.ejs → mounts.ejs, extracted settings script - Source: barrel index.ts files, merged platform/daemon/dtos, Alternative → legacy - Fix: CSP upgradeInsecureRequests only when HTTPS, doubled import prefixes, as const assertion - Fix: i18n logger import path, middleware types, LANG_DIR path - Fix: playerStatsCollector/daemonRequest/wsToken config import names - DB: prisma db push synced schema to PostgreSQL * fix: seed default roles on startup, conditional CSP upgradeInsecureRequests - Seed owner/admin/user roles when Role table is empty (fixes fresh DB registration FK violation) - Only enable upgradeInsecureRequests CSP directive when running HTTPS (fixes blank page on remote access via HTTP) * feat: expand env config, Dockerfile, Playwright, remove onboarding, codebase cleanup - Expand .env with 20+ configurable fields (TLS, SMTP, rate limits, CSP, proxy, cookies, storage, logging) - Add parsePositiveInt/parseBytes to config.ts for env parsing - Wire all new env options into app.ts (TLS HTTPS, trust proxy, session, rate limiting) - Update templateConfig.ts to expose all panel config fields to EJS - Fix envLoader.ts comment-line parsing in example.env scanner - Bundle @tanstack/query-core as IIFE vendor script - Create Dockerfile (node:22-bookworm test image) + .dockerignore - Create playwright.config.ts with chromium webServer setup - Update setup.mjs with 11 new CLI flags for all env options - Update installer.sh with 7 new args, TUI prompts, full .env generation - Fix CSP test (cspEnabled check + unsafe-eval) - Fix migration-invariants test (query-core path) - Fix responsiveA11y test (aria-label partial match) - Remove onboarding system (schema, routes, views, JS, i18n keys) - Remove old admin-settings JS bundles (replaced by new builds) - Clean up Prisma generated types and API modules - Remove stale dashboard/settings/ejs views * refactor: clean up package.json, move Docker test infra to tests/docker/, merge e2e into ci.yml - package.json: add keywords, homepage, bugs, description; add db:* scripts (generate, push, migrate, seed, reset, drop, studio, status); add test:e2e, test:docker, test:all; remove dead installer/build-vendor refs - Move Dockerfile + entrypoint.sh + docker-compose.test.yml → tests/docker/ - Add e2e Playwright job to ci.yml (depends on build, uploads report artifact) - Add top-level env vars (NODE_VERSION, PNPM_VERSION) to ci.yml for DRY - Fix migrate:deploy → db:migrate:deploy in ci.yml - Delete redundant test.yml workflow * fix(ci): remove pnpm version conflict — let action read from packageManager * fix: resolve all CI failures — lint, tests, build job - Fix eslint: singlequotes in app.ts, curly braces in config.ts (eslint --fix) - Fix CI build job: db:migrate:deploy → db:push (no migration files exist) - Fix cspHeaders test: match escaped unsafe-eval string - Fix featureRegistry test: api/alternative → api/legacy (renamed module) - Skip apiAlternativeValidator + daemonDtos tests (modules deleted in cleanup) - Fix activityLogger + adminUsersHtmx tests: add res.locals.t/tn mock, update assertions for i18n keys * fix(tests): mock realtime/events in adminNodesServers to prevent Redis cascade Missing mock caused emitRealtime to hit real Redis → Connection closed → timeouts in adminUsersHtmx and backupsBackend via parallel runner. * fix(ci): add Redis service + .env to UT job, mock realtime/events in 4 tests CI Unit Tests had no Redis service and no .env file — tests that import modules using emitRealtime (shared, backups, schedules, files) hit real Redis, got MaxRetriesPerRequestError, cascading timeouts. - Add Redis 7 service container to CI test job - Write full .env mirroring setup.mjs output (session, redis, db, smtp) - Mock realtime/events in resourceRelease, filesBackend, schedulesBackend, adminNodesServers to prevent real Redis connections in unit tests * fix: remove type:module (breaks CJS build output), drop E2E from CI gate - Replace "type": "module" with "main": "dist/app.js" — tsconfig outputs CommonJS, module:module makes Node treat .js as ESM → crash - Remove E2E from ci-gate needs/results — no Playwright test files exist yet, so E2E always fails and blocks the pipeline * chore :add generated dir * fix: use SUPPORTED_LANGUAGES constant in account.ejs language selector - Template referenced undefined 'supportedLanguages' variable - Matches res.locals.SUPPORTED_LANGUAGES set by templateConfig.ts - Fixes ReferenceError crash on /account page
+124907-10340135247 files
airlinklabs/panelThavan
Update deploy.yml
+1-12 files
airlinklabs/homeThavan
chore : update build workflow
+136-7143 files
airlinklabs/homeThavan