Technology

How FeatherPanel
is put together.

FeatherPanel is a control plane, not a single monolith that talks to Docker only. A PHP 8.5 API (largest share of the panel codebase) and aNext.js 16 UI keep state in MariaDB and Redis, then fan out: game power and files to FeatherWings, VDS work to a Rust async-runner over Proxmox, sites toFeatherQuilld, and operator migrations to FeatherCli.

How it worksContainersProxmox VDSFeatherQuilldFeatherCliLanguagesTech stack

Core terminology

Terms if you know Pterodactyl,
plus FeatherPanel names.

If you know Pterodactyl: Realms ≈ Nests, Spells ≈ Eggs, FeatherWings ≈ Wings. FeatherPanel also adds web and Proxmox planes that Wings never owned.

Core components

Panel

The control plane: a Next.js UI and a PHP API. Admins and clients manage users, game nodes, WebSpaces, and Proxmox VDS from here.

Node

A machine that runs FeatherWings (or Calagopus) for games, or FeatherQuilld for web hosting. The Panel talks to nodes over authenticated APIs.

FeatherWings

The recommended game-node daemon. It owns Docker lifecycle, SFTP, console, backups, and extras like firewall, FastDL, and self-update. Calagopus wings-rs is also supported.

Server

A game instance on a Node (Minecraft, Rust, CS2, and others) running in an isolated Docker container defined by a Spell.

Web hosting

FeatherQuilld

Web-node daemon (C# / .NET 10). Details and request flow are in the FeatherQuilld section below.

WebSpace

One tenant site on a Quill node: filesystem, domains, and runtime identity the Panel tracks by UUID.

Reverse proxy

Caddy, nginx, or Traefik. Quill writes the vhosts; the proxy terminates TLS for visitors.

Infrastructure

Docker

Runtime for container-based game hosting. Each server is a container with hard CPU, memory, disk, and port limits.

Proxmox VE

Hypervisor for VDS: full QEMU/KVM VMs or LXC. Managed through FeatherPanel VmNodes, separate from game Docker nodes.

Async runner

A Rust worker (Tokio) that drains Redis queues for mail and Proxmox tasks so long jobs do not block the PHP request path.

Spell system

Realm

FeatherPanel's Nest: a category that groups related Spells (for example all Minecraft server types).

Spell

FeatherPanel's Egg: install script, Docker images, startup command, config files, and variables. Pterodactyl eggs can be imported.

Yolks / images

Docker base images Spells run on (often community yolks). The Spell picks the image; Wings starts the container from it.

Visualizations

Hierarchy overview

One Panel manages many Nodes. Each Node hosts many Servers. That relationship is the base of container game hosting.

graph TD
    Panel[Panel]:::panel

    subgraph Nodes [Nodes and Servers]
        direction TB
        Node1[Node 1]:::node
        Node2[Node 2]:::node
        NodeN[Node n]:::node

        Server1[Server 1]:::server
        Server2[Server 2]:::server
        Server3[Server 3]:::server
        ServerN[Server n]:::server
    end

    Panel --> Node1
    Panel --> Node2
    Panel --> NodeN

    Node1 --> Server1
    Node1 --> Server2
    Node2 --> Server3
    NodeN --> ServerN

    classDef panel fill:#3b82f6,stroke:#2563eb,color:#fff,stroke-width:2px;
    classDef node fill:#10b981,stroke:#059669,color:#fff,stroke-width:2px;
    classDef server fill:#f59e0b,stroke:#d97706,color:#fff,stroke-width:2px;
Panel → Nodes → Servers (container data plane)

System architecture

Every product surface shares one login and one API. Side effects leave that request on purpose: Docker games hit Wings, VDS tasks enqueue on Redis for the Rust runner, and web sites talk to Quill on their own HTTP path. Mail shares the runner channel so PHP does not sit on SMTP.

flowchart TB
    Client["Browser · API Client\nNext.js UI"]
    Cli["FeatherCli\nC# · .NET 10"]

    subgraph CONTROL["Control plane - FeatherPanel"]
        direction LR
        Web["Nginx / Apache\nTLS :443"]
        API["PHP 8.5 API\nSymfony Routing\nXChaCha20 secrets"]
        FE["Next.js 16 UI\nReact 19 · Tailwind"]
        DB["MariaDB"]
        Redis["Redis\nCache · Pub/Sub · Queues"]
        Runner["Rust async-runner\nMail · Proxmox tasks"]
        Web --> API
        FE --> API
        API --> DB
        API <--> Redis
        Runner <--> Redis
        Runner --> DB
    end

    subgraph GAME["Data plane A - Containers"]
        Wings["FeatherWings\nor Calagopus wings-rs"]
        Docker["Docker"]
        GameCtr["Game containers\nSpells · Limits · Allocations"]
        Wings --> Docker --> GameCtr
    end

    subgraph VDS["Data plane B - Virtualization"]
        PVE["Proxmox VE API"]
        Qemu["QEMU / KVM VMs"]
        Lxc["LXC containers"]
        PVE --> Qemu
        PVE --> Lxc
    end

    subgraph WEB["Data plane C - Web hosting"]
        Quill["FeatherQuilld\nC# · .NET 10"]
        Proxy["Reverse proxy\nCaddy / nginx / Traefik"]
        Spaces["WebSpaces\nSites · SSL · SFTP/FTP"]
        Quill --> Proxy --> Spaces
    end

    Client --> Web
    Client --> FE
    Cli -->|"migrate · server · account"| API
    Cli -->|"SQL dump / APP_KEY"| DB
    API <-->|"REST · WebSockets · mTLS"| Wings
    API <-->|"REST · WebSockets"| Quill
    Runner -->|"API token"| PVE
Control plane + containers + Proxmox + FeatherQuilld web

1. UI hits the API

Next.js calls /api/*. PHP middleware owns auth, admin, server, and remote daemon routes for each data plane.

2. State in MariaDB + Redis

Servers, spells, allocations, WebSpaces, and VmInstances live in MariaDB. Redis caches, rate-limits, and publishes job events.

3. Side effects leave the request

Games go to Wings. Sites go to Quill. Mail and Proxmox clone/power drain on async-runner so the API stays thin under load.

Note

Panel and Wings on the same machine

You can run FeatherWings on the Panel host. That machine is both control plane and a game node. This is common for demos, homelabs, and small fleets. Proxmox usually stays on dedicated hypervisor hardware.

Container-based hosting

Docker game servers
through FeatherWings.

The classic Wings model, reimplemented and extended: isolation, port allocations, and Spell blueprints.

Container hosting is for game processes that should be lightweight, dense, and disposable. FeatherPanel does not SSH into the box to start Minecraft. It asks FeatherWings, and Wings asks Docker.

01

Pick a Spell

A Spell (egg-compatible) defines the Docker image, install script, startup command, stop signal, and variables.

02

Claim resources

The Panel assigns a Node allocation (IP:port) and stores CPU, memory, disk, swap, IO weight, and thread limits on the server.

03

Wings builds the container

FeatherWings pulls the image, mounts the server filesystem, applies limits, and wires ports. Install scripts run once inside the container.

04

Operate live

Power, console (WebSocket), files, backups, schedules, and transfers go Panel to Wings to Docker. Proxmox is not involved on this path.

flowchart LR
    Admin["Admin / User"]
    Panel["FeatherPanel\nServer + Spell + Allocations"]
    Wings["FeatherWings on Node"]
    Spell["Spell blueprint\nimage · startup · install"]
    Docker["Docker Engine"]
    Ctr["Isolated container\nCPU · RAM · disk · ports"]

    Admin --> Panel
    Panel -->|"create / power / files"| Wings
    Panel --> Spell
    Spell --> Wings
    Wings --> Docker
    Docker --> Ctr
Admin → Panel → Wings → Docker → container

Hard limits

Memory, swap, CPU %, threads, disk, IO weight, and OOM policy are stored on the server and sent to Wings as the container build.

Allocations

IP:port mappings bind the container to the network. Default allocation plus extras for query ports, RCON, and similar services.

Egg compatible

Import Pterodactyl eggs into Spells. Realms group them. Images (yolks) stay Docker; Wings pulls what the Spell declares.

Virtual machine hosting

Proxmox VDS
QEMU and LXC.

Real hypervisor guests managed through queued API tasks, next to your game fleet.

flowchart LR
    User["Admin / VDS user"]
    Panel["FeatherPanel\nVmNode · VmInstance · VmTask"]
    Redis["Redis\nfeatherpanel:vm:pending"]
    Runner["Rust async-runner"]
    PVE["Proxmox VE\n/api2/json"]
    Guest["QEMU VM or LXC\nfrom template"]

    User --> Panel
    Panel -->|"enqueue task"| Redis
    Redis --> Runner
    Runner -->|"clone · resize · net · power"| PVE
    PVE --> Guest
Panel → Redis VmTask → Rust runner → Proxmox API → guest

VDS lives on VmNodes, not Wings nodes. When you create an instance, PHP records the intent and enqueues aVmTask. The Rustasync-runner performs the Proxmox calls: clone template, resize disk, attach bridge/cloud-init, power on. Then the panel reflects status.

01

Register a VmNode

Connect Proxmox with an API token. FeatherPanel stores the node separately from game Wings nodes.

02

Enqueue a VmTask

Creating a VDS writes a VmInstance and a VmTask (create/reinstall/backup/...). Redis notifies featherpanel:vm:pending.

03

Rust runner calls Proxmox

async-runner clones a QEMU or LXC template, resizes disk, applies network/cloud-init, then powers the guest.

04

Day-2 ops

Start/stop/reboot, console users, backups, restore, and delete stay on the VDS path and stay independent of Docker game servers.

QEMU / KVM

Full virtual machines

Hardware-virtualized guests with their own kernel. Best when tenants need custom kernels, nested virt, or strong isolation for general-purpose VPS product lines.

LXC

System containers on Proxmox

Shared-kernel Linux containers managed by Proxmox. Denser than QEMU, still a VDS product, and a different path from FeatherWings game Docker containers.

Containers vs Proxmox vs web

Docker + Spells for game servers: egg ecosystem, hard limits, fast churn.Proxmox VDS when tenants need a full OS or classic VPS semantics.WebSpaces when the product is a site or app (proxy + TLS + files), not a game container. One UI; three data planes.

Web hosting daemon

FeatherQuilld
how the web plane works.

C# / .NET 10 on the node. Panel owns desired state; Quill owns filesystem, proxy, and tenant file access.

Game panels stop at Docker. FeatherPanel needed a second node daemon for sites that are not Minecraft containers: document roots, hostnames, certificates, and SFTP without giving every client a shell on the host.FeatherQuilld is that daemon. It sits beside Wings on the fleet map, not inside it.

The Panel stores WebSpace UUIDs and config in MariaDB the same way it stores game servers. Runtime work (create root, install, wire Caddy/nginx/Traefik, serve files over SFTP/FTP) happens on Quill over an authenticated HTTP API. Visitors never hit the Panel; they hit the reverse proxy Quill configured.

Request path

Admin traffic and visitor traffic stay split. The Panel only talks to Quill; browsers only talk to the proxy.

flowchart LR
    Admin["Admin / client"]
    Panel["FeatherPanel\nPHP API"]
    Quill["FeatherQuilld\non web node"]
    Proxy["Caddy / nginx / Traefik"]
    Space["WebSpace\nfiles · process"]
    Visitor["Site visitor"]

    Admin -->|"create · files · status"| Panel
    Panel -->|"HTTP API"| Quill
    Quill --> Space
    Quill -->|"vhost · TLS"| Proxy
    Visitor -->|"HTTPS"| Proxy
    Proxy --> Space
Panel API → FeatherQuilld → WebSpace + reverse proxy → visitors

Provision lifecycle

Create, optional install, publish the hostname, then day-2 file ops, all reported back as status the UI can poll.

sequenceDiagram
    participant P as FeatherPanel
    participant Q as FeatherQuilld
    participant FS as WebSpace FS
    participant PX as Reverse proxy

    P->>Q: PUT WebSpace uuid + config
    Q->>FS: create root · permissions
    alt install required
        Q->>FS: run install job
        Q-->>P: status installing
    end
    Q->>PX: route domain · ACME cert
    Q-->>P: status running
    P->>Q: SFTP/FTP or file API
    Q->>FS: read / write tenant files
WebSpace create → install → proxy/TLS → file access

Operator steps

01

Link a Quill node

Install the daemon, point it at the Panel, and authenticate. That machine is only the web data plane. It does not run Wings or Proxmox.

02

Allocate a WebSpace

Panel issues a UUID and desired state. Quill creates the filesystem layout and runs install when the blueprint says so.

03

Publish the hostname

Quill updates the reverse proxy and completes ACME so the domain answers on HTTPS without a separate cert bot.

04

Day-2 from the UI

File manager, schedules, transfers, and status polls hit Quill. Minecraft containers and VMs never share this path.

Isolation per WebSpace

Each site gets its own root on disk, utilization counters, and status machine (installing, running, reinstalling) instead of sharing one document root.

Proxy control plane

Quill is the source of truth for vhosts. It pushes routes and certificates into Caddy, nginx, or Traefik so operators are not editing configs by hand.

Tenant file planes

SFTP and FTP land inside the WebSpace root. Clients never need SSH on the host; the Panel still drives uploads and edits over the same HTTP API.

Not Wings

Different job than game Docker

Wings manages containers, allocations, and game console WebSockets. Quill manages site roots, vhosts, and tenant file protocols. Mixing those into one daemon would couple unrelated failure domains.

Same Panel

One UI for hosts who sell both

Clients still open one FeatherPanel. Admins register Quill nodes next to Wings nodes. Permissions and billing plugins can treat WebSpaces like any other product object without a second control plane.

Built with

ASP.NET Core · Certes (ACME) · FxSsh · FubarDev.FtpServer · Caddy / nginx / Traefik drivers

FeatherQuilld source

The tradeoff

Why FeatherPanel
uses more memory.

Next.js, Redis queues, Rust workers, the IDE, and three data planes all use RAM. They run features Pterodactyl does not have, such as the Web IDE, VM hosting and web hosting. The same weekly benchmark measured higher throughput and lower latency than Pterodactyl.

Higher RAM usage

In our latest weekly run (23 Oct 2026, 01:10 UTC, 4 CPUs) FeatherPanel peaked at 193 MiB and Pterodactyl at 118 MiB. FeatherPanel keeps the Next.js UI, queues, mail, IDE, and Proxmox hooks loaded in memory.

Higher throughput and lower latency

Same run: 2,177 vs 187 peak req/s (higher) and 15 ms vs 166 ms average latency (lower) against Pterodactyl.

Queued mail

A DB-backed mail queue drained by the Rust runner over SMTP, instead of sending mail inside the PHP request.

Async jobs beyond Wings

Installs, schedules, transfers, mail, and Proxmox tasks run async so API requests stay responsive under load.

Container game fleets

Docker isolation with Spell blueprints, allocations, and hard limits. This is the usual path for game hosts.

Proxmox VDS in the same panel

Full VMs and LXC sit beside game nodes. One login for games and virtualization; separate data planes underneath.

Plugins without forking

Events and addons extend billing, branding, and workflows. You keep upstream FeatherPanel instead of maintaining a private fork.

Operator tooling

FeatherCli
C# · .NET 10

The official CLI for migrations and day-to-day panel tasks. It is a native .NET binary.

FeatherCli is a self-containedC# / .NET 10 binary. It owns Pterodactyl to FeatherPanel migrations (live panel dir or SQL dump + APP_KEY), decrypts Laravel secrets when needed, and drives the same client API the UI uses for servers, files, backups, schedules, and accounts.

Pterodactyl migrations

Import users, nodes, nests/eggs to realms/spells, servers, allocations, databases, schedules, backups, SSH keys, and settings from a live install or SQL dump + APP_KEY.

Staging-safe dumps

Load a mariadb-dump into a staging DB, decrypt Laravel secrets when needed, then push into FeatherPanel over the API.

Day-to-day ops

feathercli server list|start|stop|files|backups|databases|schedules and account tools, using the same client API as the panel UI.

# migrate from a live Pterodactyl install

feathercli config setup

feathercli migrate --pterodactyl-dir /var/www/pterodactyl

# or from a SQL dump + env

feathercli migrate \

--sql-dump ./panel.sql \

--env-file ./panel.env \

--staging-db-host 127.0.0.1 …

# day-to-day ops

feathercli server list

feathercli server start --uuid <id>

feathercli server backups create --uuid <id>

Packages

System.CommandLine · Microsoft.Extensions.* · Spectre.Console · Newtonsoft.Json · MySqlConnector

FeatherCli source

Languages & packages

Languages in the
main repos.

In the main FeatherPanel repo, PHP leads (~148k lines) because the API, plugins, and daemon clients live there. TypeScript/TSX (~140k) is the UI + FeatherIDE. Go, Rust, and C# show up in the daemons and CLI repos around it.

LanguageRankScaleWhere it runs
PHPMost used~148k

Panel API, auth, Wings and FeatherQuilld clients, Proxmox orchestration, plugins, cron

TypeScript / TSX2nd~140k

Next.js 16 UI, FeatherIDE, consoles, admin and client dashboards

GoDaemonFeatherWings

Node agent: Docker lifecycle, SFTP, console, backups (separate repo)

C#CLI + webFeatherCli / FeatherQuilld

FeatherCli migrations and ops; FeatherQuilld web hosting daemon (WebSpaces, proxy, SFTP/FTP)

RustWorkers~3.5k

async-runner: mail queue drain and Proxmox VmTask execution

SQL / YAMLConfig~9k

Schema migrations, compose, spell/egg definitions, deploy config

Packages by area

PHP 8.5

Backend (PHP)

  • symfony/routing · http-foundation · yaml · mime
  • predis/predis · ext-redis
  • guzzlehttp/guzzle
  • firebase/php-jwt · web-auth/webauthn-lib · pragmarx/google2fa
  • phpmailer/phpmailer
  • cloudflare/sdk · softcreatr/gameq · zircote/swagger-php
  • vlucas/phpdotenv · ext-sodium (XChaCha20)
TypeScript · Next.js 16 · React 19

Frontend

  • next · react · react-dom
  • tailwindcss · @radix-ui/* · @headlessui/react
  • @monaco-editor/react · @uiw/react-codemirror · @xterm/xterm
  • @simplewebauthn/browser · recharts · three / R3F
  • pnpm workspaces
Rust (Tokio)

Async runner

  • tokio · redis · sqlx (MySQL)
  • lettre (SMTP) · reqwest
  • chacha20poly1305 · serde · tracing
C# · .NET 10

FeatherCli

  • System.CommandLine
  • Microsoft.Extensions.* (DI, Config, Http, Logging)
  • Spectre.Console · Newtonsoft.Json · MySqlConnector
C# · .NET 10

FeatherQuilld

  • ASP.NET Core · OpenAPI
  • Docker.DotNet · Certes (ACME)
  • Caddy / nginx / Traefik reverse proxy
  • SFTP / FTP (FxSsh · FubarDev.FtpServer)
Go (FeatherWings)

Node daemon

  • Docker Engine API
  • SFTP / WebSocket console stack
  • mTLS panel remote API
Infra

Data & edge

  • MariaDB / MySQL
  • Redis
  • Nginx or Apache
  • Docker · Proxmox VE API

What we build with

Stack by layer
across the repos.

Each layer is a real process you can deploy and reason about: PHP API, Next.js UI, MariaDB/Redis, then the daemons and runners that leave the request path.

We did not collapse everything into one language. The panel API stays PHP for plugins and speed of iteration. The UI is Next.js because consoles, FeatherIDE, and admin surfaces need a modern React tree. Game nodes stay Go (FeatherWings). Web nodes stay C# (Quill). Long Proxmox and mail jobs stay Rust. Operators get FeatherCli in C# for migrations without SSHing into the panel box for every dump.

API

PHP 8.5 · custom core

MythicalSystems PHP control plane with Symfony Routing and HttpFoundation, JWT, WebAuthn, Guzzle, and Predis. Secrets at rest use XChaCha20-Poly1305. The API is custom PHP, not Laravel or a Pterodactyl fork.

UI

Next.js 16 · React 19

frontendv2: Tailwind, Radix/Headless UI, xterm consoles, Monaco and CodeMirror (FeatherIDE), charts, and WebAuthn passkeys.

Data

MariaDB + Redis

MariaDB holds panel state (servers, spells, VMs, mail queue). Redis handles cache, rate limits, pub/sub, and async-runner job channels.

Daemon

FeatherWings (+ Calagopus)

Game data plane. The Panel Wings client issues power, files, backups, and install jobs. FeatherWings is preferred; Calagopus wings-rs stays compatible.

Web

FeatherQuilld · C# / .NET 10

Separate web data plane on the node. Full request path, lifecycle, and proxy wiring are covered in the FeatherQuilld section.

Workers

Rust async-runner

Tokio, sqlx, lettre, and reqwest. Listens on Redis for mail and VmTasks, then talks to SMTP or the Proxmox API so PHP stays lean under load.

CLI

FeatherCli · C# / .NET 10

Official operator CLI: Pterodactyl to FeatherPanel migrations (SQL dump or live dir), plus server power, files, backups, schedules, and account tools over the client API.

Containers

Docker + Spells

Realms and Spells define images and startup. Allocations map IP:ports. Limits (CPU, RAM, disk, IO, OOM) ship to Wings as the container build.

VDS

Proxmox QEMU / LXC

VmNodes, VmInstances, and VmTemplates. Create clones, resize disks, attach nets/cloud-init, power cycle, and backup through queued VmTasks.

Extensibility

Plugins & events

Addon system with events for billing, branding, and custom workflows, without forking the core.

Security

Auth & edge

Passkeys, TOTP, OIDC/LDAP options, CSRF, rate limits, AbuseIPDB/Cloudflare hooks, Zero Trust paths, and mTLS to daemons.

Want the raw numbers?

Our weekly benchmark compares FeatherPanel to Pterodactyl, Pelican and Hydrodactyl on one shared machine. Last run: 23 Oct 2026, 01:10 UTC.