Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/publish-edge.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: publish-edge

# Continuously publish beta images to GHCR on every push to master, so testers
# Continuously publish edge images to GHCR on every push to master, so testers
# can track the latest build without waiting for a tagged release. Tagged
# releases (release.yaml, triggered by v* tags) remain the recommended,
# version-pinned install path; this is the rolling "edge" channel.
Expand Down
24 changes: 17 additions & 7 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,14 @@ reaches `1.0.0`. Pre-1.0 minor versions may contain breaking changes.

## [Unreleased]

## [0.3.0] — 2026-10-05

The first Gameplane release without a pre-release suffix, a pre-v1 release. It
contains every change made since v0.2.0-beta.8, including the changes first
previewed in v0.3.0-rc.1 and the pre-release audit fixes summarized under
0.3.0-rc.2 below. It does not claim v1 or production support; see
[`docs/roadmap.md`](docs/roadmap.md).

### Upgrade Notes

- **Network capture feature adds an emptyDir volume to every game pod:** The
Expand Down Expand Up @@ -350,11 +358,12 @@ reaches `1.0.0`. Pre-1.0 minor versions may contain breaking changes.
- **gameaction:** hardened console action parameter validation against shell and RCON metacharacters.
- **operator:** hardened tunnel credential handling: a credentials Secret not owned by its GameServer is now refused, the tunnel is scaled to zero, and TunnelReady=False (reason TunnelCredentialRefused) reports why.

## [0.3.0-rc.2] — Unreleased
## [0.3.0-rc.2] — not tagged

The second release candidate for v0.3.0. It adds the changes merged since
The second release candidate for v0.3.0 was not tagged separately; its changes
shipped in [0.3.0](#030--2026-10-05). It covers the changes merged since
v0.3.0-rc.1, mostly fixes from the v0.3 pre-release audit. They are listed
under [Unreleased](#unreleased) above, which also holds the rc.1 changes;
under [0.3.0](#030--2026-10-05) above, which also holds the rc.1 changes;
the Highlights below summarize what is new since rc.1.

### Highlights
Expand Down Expand Up @@ -390,8 +399,8 @@ the Highlights below summarize what is new since rc.1.

The first release candidate for v0.3.0, the first Gameplane release without a
beta suffix. It contains the changes made since v0.2.0-beta.8 up to
2026-09-23; the entries under Unreleased above that come from later PRs
(the pre-release audit fixes) are in 0.3.0-rc.2, not in this release.
2026-09-23; the entries under 0.3.0 above that come from later PRs
(the pre-release audit fixes) are in 0.3.0, not in this release.
Release candidates are for testing against diverse workloads and deployment
topologies before the v1-ready v0.3.0 GA; pre-releases are
published and listed in the GitHub releases page.
Expand Down Expand Up @@ -1077,8 +1086,9 @@ testing. Not yet recommended for unattended production workloads — see
runner (retry + longer readiness window), eliminating a cascade of flaky
API e2e failures.

[Unreleased]: https://github.com/ValgulNecron/gameplane/compare/v0.2.0-beta.8...HEAD
[0.3.0-rc.2]: https://github.com/ValgulNecron/gameplane/compare/v0.3.0-rc.1...HEAD
[Unreleased]: https://github.com/ValgulNecron/gameplane/compare/v0.3.0...HEAD
[0.3.0]: https://github.com/ValgulNecron/gameplane/compare/v0.3.0-rc.1...v0.3.0
[0.3.0-rc.2]: https://github.com/ValgulNecron/gameplane/compare/v0.3.0-rc.1...v0.3.0
[0.3.0-rc.1]: https://github.com/ValgulNecron/gameplane/compare/v0.2.0-beta.8...v0.3.0-rc.1
[0.2.0-beta.8]: https://github.com/ValgulNecron/gameplane/compare/v0.2.0-beta.7...v0.2.0-beta.8
[0.2.0-beta.7]: https://github.com/ValgulNecron/gameplane/compare/v0.2.0-beta.6...v0.2.0-beta.7
Expand Down
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

Architecture, commands, and binding rules for AI agents. Humans: [`README.md`](README.md), [`docs/contributing.md`](docs/contributing.md).

**Gameplane:** Kubernetes-native game server control panel (CubeCoders AMP alternative); identical on single-node k3s and multi-node clusters. **Status:** beta `v0.2.0-beta.8`; v1 scope feature-complete, stabilizing.
**Gameplane:** Kubernetes-native game server control panel (CubeCoders AMP alternative); identical on single-node k3s and multi-node clusters. **Status:** Pre-v1 release (`v0.3.0`); v1 scope feature-complete, stabilizing.

## ⏳ Session start: blocked dependency upgrades (delete an entry once unblocked)

Expand Down
12 changes: 6 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ A Kubernetes-native game server control panel. Open-source alternative to
Docker — scales from a single-node k3s homelab to multi-node production
clusters without changing the operational model.

> Status: **beta** (`v0.2.0-beta.8`). The operator, API, agent, and dashboard
> Status: **pre-v1 release** (`v0.3.0`). The operator, API, agent, and dashboard
> are feature-complete for the v1 scope and stabilized for external testing.
> See [Beta status & known limitations](#beta-status--limitations) before
> See [Pre-v1 status & known limitations](#pre-v1-status--limitations) before
> running it for anything you can't afford to lose.

**Website:** <https://valgulnecron.github.io/gameplane-website/> — features,
Expand All @@ -34,9 +34,9 @@ Screenshots are captured against mocked data for consistency and reproducibility
| ![Live console for a Minecraft server streaming startup, player join, and auto-save lines over WebSocket with Clear, Download, and Fullscreen controls](docs/img/server-console.jpg) | ![Admin Settings Mod registries section showing CurseForge and Steam Workshop configured and Nexus Mods not configured](docs/img/admin-mod-registries.jpg) |
| Console — live output over WebSocket | Admin Settings — Mod registries |

## Beta Status & Limitations
## Pre-v1 Status & Limitations

Gameplane is currently in **beta** (`v0.2.0-beta.8`). Core workflows — server deployment, live consoles, file management, backups/restores, game modules, multi-cluster management, and RBAC — work end-to-end and are verified by automated unit, integration, upgrade, and end-to-end test suites on every commit.
Gameplane is a **pre-v1 release** (`v0.3.0`). Core workflows — server deployment, live consoles, file management, backups/restores, game modules, multi-cluster management, and RBAC — work end-to-end and are verified by automated unit, integration, upgrade, and end-to-end test suites on every commit.

Here are a few items to keep in mind:

Expand All @@ -58,7 +58,7 @@ and Agones (a Kubernetes operator library). While not direct competitors,
Agones is included as a reference point for teams building on Kubernetes
primitives.

Status: **beta** (`v0.2.0-beta.8`). The operator, API, agent, and dashboard
Status: **pre-v1 release** (`v0.3.0`). The operator, API, agent, and dashboard
are feature-complete for the v1 scope and stabilized for external testing.

| Dimension | Gameplane | Pterodactyl | CubeCoders AMP | Agones |
Expand Down Expand Up @@ -213,7 +213,7 @@ helm upgrade --install gameplane oci://ghcr.io/valgulnecron/charts/gameplane \
```

The chart pins matching `ghcr.io/valgulnecron/gameplane/{operator,api,agent}`
images by `appVersion`. To track the rolling beta instead of a tagged release,
images by `appVersion`. To track the rolling edge build instead of a tagged release,
add `--set image.tag=edge`. Then seed an admin user and log in — see
[`docs/install.md`](docs/install.md) for the full flow, OIDC, Postgres, and
values reference. For address pool configuration (pinning servers to specific
Expand Down
2 changes: 1 addition & 1 deletion agent/specs.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# agent — Specification

**Status:** beta (v0.2.0-beta.8)
**Status:** pre-v1 (v0.3.0)
**Module / package:** `github.com/ValgulNecron/gameplane/agent`

## Purpose
Expand Down
2 changes: 1 addition & 1 deletion api/specs.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# api — Specification

**Status:** beta (v0.2.0-beta.8)
**Status:** pre-v1 (v0.3.0)
**Module / package:** github.com/ValgulNecron/gameplane/api

## Purpose
Expand Down
2 changes: 1 addition & 1 deletion audit-syslog-bridge/specs.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# audit-syslog-bridge — Specification

**Status:** beta (v0.2.0-beta.8)
**Status:** pre-v1 (v0.3.0)
**Module / package:** `github.com/ValgulNecron/gameplane/audit-syslog-bridge`

## Purpose
Expand Down
2 changes: 1 addition & 1 deletion capture-sidecar/specs.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# capture-sidecar — Specification

**Status:** beta (v0.2.0-beta.8), Phase 2 Foundational (implementation complete)
**Status:** pre-v1 (v0.3.0), Phase 2 Foundational (implementation complete)
**Module / command:** `github.com/ValgulNecron/gameplane/capture-sidecar`
**Dependencies (current):** stdlib + external libraries for packet capture and filtering (github.com/gopacket/gopacket v1.7.2, github.com/packetcap/go-pcap, golang.org/x/net)

Expand Down
4 changes: 2 additions & 2 deletions charts/gameplane/Chart.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ apiVersion: v2
name: gameplane
description: Kubernetes-native game server control panel (open-source alternative to CubeCoders AMP).
type: application
version: 0.2.0-beta.8
appVersion: "0.2.0-beta.8"
version: 0.3.0
appVersion: "0.3.0"
home: https://github.com/ValgulNecron/gameplane
sources:
- https://github.com/ValgulNecron/gameplane
Expand Down
2 changes: 1 addition & 1 deletion charts/gameplane/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -579,7 +579,7 @@ defaultModuleSource:
# own cluster). Bump this ref only in lockstep with a chart release that
# was actually tested against the matching module-repo tag. Set to
# "main" explicitly if you want the bleeding edge instead.
ref: v0.2.0-beta.6
ref: v0.3.0
subPath: "" # module directories live at the repo root
oci:
url: ghcr.io/valgulnecron/gameplane-modules
Expand Down
2 changes: 1 addition & 1 deletion docs/comparison-sources.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ verified.
**Source ID**: G-a
**Evidence**: README.md:8; operator/api/v1alpha1/gameserver_types.go:1–50
**Checked on**: 2026-09-02
**What was verified**: README status line confirms project is beta; GameServer CRD types and controller-runtime operator documented in operator module with support for k3s and multi-node clusters.
**What was verified**: README status line confirms project is a pre-v1 release (`v0.3.0`; status line re-checked 2026-10-05); GameServer CRD types and controller-runtime operator documented in operator module with support for k3s and multi-node clusters.
**Last-known URL**: https://github.com/ValgulNecron/Gameplane

<a id="gameplane-row-b"></a>
Expand Down
6 changes: 3 additions & 3 deletions docs/dependencies.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,11 @@ to find call sites (or `go mod why -m <path>` from inside the module). For
Toolchain versions come from `Makefile`, `.github/workflows/*.yaml`, and
`.devcontainer/post-create.sh`.

Accurate as of **2026-09-02**, repo state `v0.2.0-beta.8`; the `gameproto`,
Accurate as of **2026-09-02**, repo state `v0.3.0`; the `gameproto`,
`svcutil`, `sentinel`, `capture-sidecar`, `tunnel`, and `gp-module` sections
were added and verified on **2026-09-26**.

> **Note:** The dependency versions listed in the table below reflect the state at v0.2.0-beta.8. For the most current versions, refer to [CHANGELOG.md](../CHANGELOG.md).
> **Note:** The dependency versions listed in the table below reflect the state at v0.3.0. For the most current versions, refer to [CHANGELOG.md](../CHANGELOG.md).

## At a glance

Expand Down Expand Up @@ -317,7 +317,7 @@ package a game module before publishing it. Direct deps from
### web

React 18 + TypeScript strict + Vite dashboard (`web/package.json` version
`0.2.0-beta.8`, matching the repo version):
`0.3.0`, matching the repo version):

**Framework / core**
- `react` `^19.2.8`, `react-dom` `^19.2.8` — base UI framework, rendered via `createRoot` in `src/main.tsx`, used throughout every component.
Expand Down
6 changes: 3 additions & 3 deletions docs/install.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

The chart and its images are published to the GitHub Container Registry (GHCR)
as OCI artifacts — no `helm repo add` needed. Install a tagged release straight
from the registry (replace `<version>` with a release, e.g. `0.2.0-beta.8`):
from the registry (replace `<version>` with a release, e.g. `0.3.0`):

```sh
helm upgrade --install gameplane oci://ghcr.io/valgulnecron/charts/gameplane \
Expand All @@ -31,7 +31,7 @@ belong to is enabled (and, for `sentinel` and `capture-sidecar`, only for
GameServers that opt in). See each component's values block for its enable
flag.

### Edge channel (latest beta)
### Edge channel (latest edge build)

Every push to `master` publishes rolling `:edge` images. To track them, install
the chart and point images at the edge tag:
Expand Down Expand Up @@ -634,7 +634,7 @@ GameServers intact.
`helm` instead of skipping existing CRDs, so a `helm install` over leftover
CRDs updates them itself (stamp included) and the hook stays pre-upgrade
only. The hook applies under the same `helm` field manager so that apply
never conflicts with it. Releases up to `0.2.0-beta.8` applied under
never conflicts with it. Releases up to and including `0.2.0-beta.8` applied under <!-- doc-versions: historical -->
kubectl's default manager (`kubectl`); if CRDs such a release upgraded were
left behind, a Helm 4 `helm install` stops with `conflict with "kubectl" …
.spec.versions`. Re-run it with `--force-conflicts` to take them over:
Expand Down
16 changes: 8 additions & 8 deletions docs/roadmap.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
# Roadmap to v1

Gameplane is currently **`v0.2.0-beta.8`**. The CRDs, operator, API, agent, and
Gameplane is currently **`v0.3.0`**. The CRDs, operator, API, agent, and
dashboard are feature-complete for the v1 scope and stabilized for external
testing, but the project is not yet recommended for unattended production. This
page tracks what stands between beta and a v1 GA release.
page tracks what stands between v0.3 and a v1 GA release.

It is a living document: items move out of it as they ship, and anything
discovered along the way gets added. For what already works today, see
Expand Down Expand Up @@ -73,7 +73,7 @@ remaining gap and is a candidate future hardening, not yet implemented.

Threat-model context lives in [`security.md`](security.md#audit-log-integrity).

### Upgrade testing (`e2e upgrade` bucket) (shipped v0.2.0-beta.8)
### Upgrade testing (`e2e upgrade` bucket) (shipped v0.2.0-beta.8) <!-- doc-versions: historical -->

`helm upgrade` was the most dangerous operation a user performs and the only
one CI never exercised. It now runs on every PR, on both amd64 and arm64:
Expand All @@ -97,7 +97,7 @@ while, but [`install.md`](install.md#helm-crd-caveat) still told users to run

Not yet covered: upgrades skipping several releases at once, and Postgres [experimental].

### Idle auto-sleep (backend PR #180, dashboard PR #182) (shipped v0.2.0-beta.8)
### Idle auto-sleep (backend PR #180, dashboard PR #182) (shipped v0.2.0-beta.8) <!-- doc-versions: historical -->

Opt-in per server (`spec.idle`): the operator scales a GameServer to zero once
it has reported no online players for `afterMinutes`, and brings it back on a
Expand Down Expand Up @@ -140,7 +140,7 @@ browser would duplicate scheduling semantics the operator owns (rule 10).
Persisting it on status is the right fix, and is a CRD change rather than a
dashboard one.

### Wake-on-connect for idle auto-sleep (shipped v0.2.0-beta.8)
### Wake-on-connect for idle auto-sleep (shipped v0.2.0-beta.8) <!-- doc-versions: historical -->

A sentinel [optional] component holds advertised ports while a server is asleep and wakes
it on a genuine connection attempt. Opt-in per server via `spec.idle.wakeOnConnect`
Expand Down Expand Up @@ -186,7 +186,7 @@ A new optional component [optional] (distroless Docker image, Helm toggle) expos
"Propose a fix" returns suggested YAML or `kubectl` invocations as text — no
create/update/delete/patch tool exists. See [`mcp-server/README.md`](../mcp-server/README.md).

### Module signing: active for official bundles (ECDSA P-256, Rekor-logged) (shipped v0.2.0-beta.8)
### Module signing: active for official bundles (ECDSA P-256, Rekor-logged) (shipped v0.2.0-beta.8) <!-- doc-versions: historical -->

The keyed-cosign signing mechanism is implemented and e2e-proven, and
`ModuleSource.spec.verify` can require a valid signature. It is now **active**
Expand All @@ -201,7 +201,7 @@ fail-closed when the key is absent. The operator's verify path remains
offline/keyed, preserving air-gapped functionality. See
[Signing official bundles](module-authoring.md#signing-official-bundles).

### Hermetic module images (gameplane-module#35, docs in #178) (shipped v0.2.0-beta.8)
### Hermetic module images (gameplane-module#35, docs in #178) (shipped v0.2.0-beta.8) <!-- doc-versions: historical -->

Every shipped module's default image is now pinned by digest, so a server
binary can no longer change underneath a user on pod restart with no version
Expand All @@ -220,7 +220,7 @@ opt-out), and a monthly workflow refreshes the pins. Authoring rules live in

## Blocking v1

Nothing hard-blocks v1 anymore. What stands between beta and a v1 GA is the
Nothing hard-blocks v1 anymore. What stands between v0.3 and a v1 GA is the
production-readiness hardening below — tracked items, not code gaps.

---
Expand Down
2 changes: 1 addition & 1 deletion gameaction/specs.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# gameaction — Specification

**Status:** beta (v0.2.0-beta.8)
**Status:** pre-v1 (v0.3.0)
**Module / package:** `github.com/ValgulNecron/gameplane/gameaction`
**Dependencies:** stdlib only (Go 1.26+)

Expand Down
2 changes: 1 addition & 1 deletion gameproto/specs.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# gameproto — Specification

**Status:** beta (v0.2.0-beta.8)
**Status:** pre-v1 (v0.3.0)
**Module / package:** `github.com/ValgulNecron/gameplane/gameproto`
**Dependencies:** stdlib only (Go 1.26+)

Expand Down
12 changes: 6 additions & 6 deletions hack/check-links.sh
Original file line number Diff line number Diff line change
Expand Up @@ -57,14 +57,14 @@
# (in document order), append -1, -2, ... to disambiguate, matching
# GitHub's own de-duplication behavior.
#
# Worked example: "## Beta Status & Limitations"
# -> strip marker: "Beta Status & Limitations"
# Worked example: "## Pre-v1 Status & Limitations"
# -> strip marker: "Pre-v1 Status & Limitations"
# -> no markdown link, no backticks
# -> remove '&' (its surrounding spaces are untouched by the removal,
# since only the '&' character itself is deleted):
# "Beta Status Limitations" (two spaces)
# -> lowercase: "beta status limitations"
# -> spaces -> hyphens: "beta-status--limitations" (two hyphens)
# "Pre-v1 Status Limitations" (two spaces)
# -> lowercase: "pre-v1 status limitations"
# -> spaces -> hyphens: "pre-v1-status--limitations" (two hyphens)
#
# Explicit HTML anchors `<a id="x">` / `<a name="x">` (case-insensitive tag
# and attribute name; single or double quoted value) are also valid anchor
Expand Down Expand Up @@ -208,7 +208,7 @@ self_test() {
# Regression: existing ASCII behavior (worked example in the header
# comment) must not change.
_assert_slug "ASCII punctuation (regression)" \
"Beta Status & Limitations" "beta-status--limitations"
"Pre-v1 Status & Limitations" "pre-v1-status--limitations"

# Unicode arrow: only the arrow itself is dropped, surrounding spaces
# are untouched (so two spaces -> two hyphens), matching GitHub.
Expand Down
2 changes: 1 addition & 1 deletion mcp-server/specs.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# mcp-server — Specification

**Status:** beta (v0.2.0-beta.8)
**Status:** pre-v1 (v0.3.0)
**Module / package:** `github.com/ValgulNecron/gameplane/mcp-server`

## Purpose
Expand Down
2 changes: 1 addition & 1 deletion netguard/specs.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# netguard — Specification

**Status:** beta (v0.2.0-beta.8)
**Status:** pre-v1 (v0.3.0)
**Module / package:** github.com/ValgulNecron/gameplane/netguard

## Purpose
Expand Down
2 changes: 1 addition & 1 deletion operator/specs.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# operator — Specification

**Status:** beta (v0.2.0-beta.8)
**Status:** pre-v1 (v0.3.0)
**Module / package:** github.com/ValgulNecron/gameplane/operator
**Go version:** 1.26.0

Expand Down
2 changes: 1 addition & 1 deletion sentinel/specs.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# sentinel — Specification

**Status:** beta (v0.2.0-beta.8)
**Status:** pre-v1 (v0.3.0)
**Module / command:** `github.com/ValgulNecron/gameplane/sentinel`
**Dependencies:** Kubernetes `client-go` (dynamic client, in-cluster config), `k8s.io/apimachinery`, gameproto

Expand Down
4 changes: 2 additions & 2 deletions telemetry-receiver/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ a day when the admin has enabled **Admin Settings → Telemetry → Send
anonymous usage metrics**:

```json
{ "version": "0.2.0-beta.8", "servers": 3, "templates": 7 }
{ "version": "0.3.0", "servers": 3, "templates": 7 }
```

No names, namespaces, hostnames, or identifiers of any kind — the
Expand All @@ -25,7 +25,7 @@ are never stored.
Metrics:

```
gameplane_telemetry_reports_total{version="0.2.0-beta.8"} # reports by reported version
gameplane_telemetry_reports_total{version="0.3.0"} # reports by reported version
gameplane_telemetry_servers # histogram of GameServer counts
gameplane_telemetry_templates # histogram of GameTemplate counts
```
Expand Down
Loading
Loading