ROADMAP.md
Rama main · réplica de lectura del repositorio original.
# ProxMate Roadmap
A living, prioritized list. ProxMate is a mature, production-ready multi-tenant Proxmox dashboard
running in production — this roadmap is about **closing cloud-provider parity gaps and
hardening for scale**, not fixing breakage. Tiers are rough priority bands, not commitments. Have an
idea? Open a [discussion](https://github.com/r0073d-l053r/ProxMate/discussions/categories/ideas).
The detailed notes for every release live in [`RELEASE_NOTES.md`](RELEASE_NOTES.md).
This file leads with **what's still open**, then **new ideas**, then a condensed **shipped** index.
---
## 🔜 Open — up next (pulled to the top)
### Live-cluster checks (lab session)
- **Verify the least-privilege role on Proxmox VE 8.** `deploy/proxmox-token.sh` was run end to end
on a Proxmox VE 9.2 cluster with every feature passing. The PVE 8 variant (`VM.Monitor` instead of
the `VM.GuestAgent.*` privileges) has not been run on real hardware yet.
- **Restore of an archive that names another guest's disk.** Restores refuse any disk that isn't the
guest's own; covered by tests, not yet exercised against a real archive on a live cluster.
- **Guest owner check on delete.** Delete confirms the guest carries the machine's own ownership tag;
covered by tests, not yet exercised on a live cluster. Both checks refuse when in doubt.
- **Pool-scoped token end to end.** `deploy/proxmox-token.sh --pool` on PVE 8.0, 8.1 and 8.2+ and
PVE 9: confirm Proxmox refuses the token on a guest outside the pool while every feature works inside
it, and that the restart reconciler can read every node's task list with that token.
- **v1.3.0 features on real hardware.** Android consoles over a pinned self-signed certificate,
view-only consoles (no input reaches the guest), file push on Debian and Alpine guests, upload
restore in pool mode, backend restarts mid-create and mid-restore, and automatic snapshots on
LVM-thin and ZFS.
### Placement & reliability
- **First-class Postgres support.** The Prisma schema is portable but the shipped migration history
is SQLite-locked (`migration_lock.toml`), and the built-in app-DB backup uses SQLite's
`VACUUM INTO`. Postgres today means `db push` + `pg_dump`; proper support wants a migration
history and a backup path of its own. SQLite stays the default.
- **Duplicate VM in the background.** Since v1.3.3, creating from an ISO, a template, an OS
template or an uploaded backup answers as soon as the machine is recorded and finishes in the
background. Duplicating a VM still runs inside the request, so a slow copy behind a reverse proxy
or tunnel can time out in the browser while it carries on.
- **IDE firewall rule follows the ingress setting.** The rule that lets ProxMate reach a VM's IDE is
added once, from the IDE ingress CIDR at the time of the first install. Changing the setting later
doesn't update existing VMs; a reinstall should bring the rule up to date, and an install with no
ingress CIDR on a firewalled VM should say so up front instead of waiting for the install timeout.
### Production hardening & ops
- **Pool mode: recovering a machine whose guest is gone.** With a pool-scoped token, a guest's
backups leave the pool when the guest is destroyed, so a rebuild that fails after destroying the
old guest leaves backups the token cannot list or restore (root can). Keep the old guest until the
new one exists, or give rebuild a restore path that works before the VMID is back in the pool.
- **Production validation passes.** The shipped OIDC SSO flow and the full 2FA/passkey matrix
(TOTP, recovery codes, passkeys, invite-enforced 2FA) each need a documented end-to-end QA pass
on a live deployment.
### IDE follow-ups
- **Wire the gateway as a provider for code-server's built-in Chat view** (inert today; OpenCode
runs as a terminal TUI instead). Needs a decision first: the IDE settings deliberately turn the
built-in chat off so OpenCode is the focus.
### Mobile
- **Android release signing and store listing.** The app ships in v1.3.0 as a debug build from CI; a
signed release APK is built on version tags once the four `ANDROID_*` signing secrets are set.
Still open: set those secrets, and decide on a Play Store or F-Droid listing.
### Deferred pending hardware
- **ARM guest builds (Phase 2).** The arch-aware *placement* guardrail shipped; building an ARM VM
doesn't yet set the ARM-specific Proxmox settings. The aarch64 VM-build path (`arch=aarch64`, `machine=virt`, OVMF + EFI disk) and an arch selector need a real ARM
(Pimox) node to validate.
- **The GPU on pve-4 (host project)** — the host is vfio/IOMMU-ready and the card is bound; running it
needs a fresh **q35 + OVMF + EFI-disk** VM (108 was installed under SeaBIOS). Owner's call when wanted.
### EDU / commercial layer (post-CE)
- **Usage-based billing & showback** — turn the `ResourceSample` history into per-tenant monthly
cost/showback reports (configurable $/vCPU-hr, $/GB-RAM, $/GB-disk) with CSV/PDF export.
- **Ephemeral / TTL VMs (auto-expiry)** — a VM (or an invite's VMs) gets a lifetime: auto-stop, then
auto-delete at expiry, with warning emails first. Builds on invites + power schedules + notifications.
- **IDE institutional layer** — instructor dashboards (visibility into student IDE sessions/activity),
per-class + per-student LLM-gateway quotas + token budgets, **assignment templates**
(pre-provisioned VMs with IDE + starter repos), bulk provisioning, LMS/roster + SCIM, support + SLAs.
---
## 💡 New ideas — proposed 2026-07-11
Fresh proposals; none built yet. Each stays inside the API-only + tenant-isolation model.
1. **Two-person approval for destructive admin actions.** Optional policy: a second admin must confirm
a bulk-delete / node-drain / firewall-disable before it runs. Rides the existing audit log. _EDU._
2. **Status page / scheduled reports.** A lightweight public/authed status page (node health, capacity,
incidents) and optional scheduled admin reports (capacity trend, top consumers) off the existing
`ResourceSample` + cluster-health data. _EDU._
---
## ✅ Shipped — condensed index
Full detail for each release in [`RELEASE_NOTES.md`](RELEASE_NOTES.md).
### Unreleased
_Nothing yet._
### Released
- **v1.3.5 — deleted users' invites stay used.** Deleting a user also deletes the invite they signed up
with, so its link can't be redeemed again.
- **v1.3.4 — Tailscale subnet-router guard.** Guests on a Proxmox node that is also a Tailscale subnet
router get their own firewall for tailnet traffic again (`deploy/proxmox-tailscale-guard.sh`), and
an IDE that installed but can't be reached says so; the text console connects again.
- **v1.3.3 — creates behind a proxy, setup banners.** Creating a machine answers once it is recorded
and finishes in the background; the cloud-init and IDE banners clear without a reload.
- **v1.3.2 — edition split.** Bulk deploys from a template moved to ProxMate Pro / EDU.
- **v1.3.1 — version fix.** Same as v1.3.0, with the version numbers the v1.3.0 tag missed.
- **v1.3.0 — projects, Android, notifications and reliability.** Projects with per-project usage and
power actions; a native Android app; view-only consoles for Viewer shares; the IDE install log and
file push through the guest agent; tenant emails, ntfy/Telegram and a weekly usage digest; importing
existing Proxmox guests; restored backups checked before use;
interrupted operations settled after a restart; automatic snapshots before risky changes; an
`ENCRYPTION_KEY` backup reminder; and an optional pool-scoped Proxmox token (not yet verified on a
live cluster).
- **v1.2.0 — sharing, placement and least privilege.** Share a VM with someone before they sign
up (pending shares, claimed only by a confirmed address); template deploys on shared storage
spread across nodes, respecting the cloud-init snippet storage; `deploy/proxmox-token.sh` for a
least-privilege Proxmox token, verified on a 7-node PVE 9.2 cluster, and a connection test that
checks every privilege ProxMate uses; start and restart wait for Proxmox like stop.
- **v1.1.1 — follow-up.** Personal API tokens of an account whose access window has ended answer
`403 access_expired`; Compose forwards `ALERT_COOLDOWN_MIN` and the public-token rate-limit
settings; non-numeric `PORT` / `RESTORE_UPLOAD_MAX_GB` fall back to defaults; the access-expiry
sweep is covered by tests.
- **v1.1.0 (2026-10-19) — security and reliability release.** A full code review, every finding closed:
**guest ownership tags** gate every guest action (existing guests tagged on upgrade, admin
**Unconfirmed machines** card for the rest); **owner-only IDE** with per-machine guest proof;
hardened sign-in (concurrent-safe lockout, per-account 2FA limits, server-side passkey
challenges, single-use links and codes); session-only account-security routes; verified-email SSO
linking; allowlisted upload restores with disk-ownership checks; quota-safe concurrent changes;
**SDN VNet and OVS bridge discovery** (#126); stop waits for Proxmox's verdict; delta resize; a
safer host updater with compose overrides; Node 22 images.
- **v1.0.0 (2026-08-11) — isolation milestone.** Per-tenant **VLAN placement** (network-layer
isolation beyond the per-VM firewall) + rogue-DHCP and IPv6-RA egress drops + firewall rule
reconciliation; **cloud-init passwords applied in-guest** via the QEMU guest agent (never written
to the seed drive); compute-access windows enforced on **passkey and SSO** login, not only
password; template deploys honour the admin default bridge/storage; built cloud-image templates
ship `qemu-guest-agent` (agentless builds recorded and flagged); the connection test rejects a
privilege-separated token that can authenticate but do nothing; axios client error objects are
sanitized before logging; a minimal **module seam** (`PROXMATE_MODULES`) for mounting optional API
routers; `deploy.agent_missing` notification; an admin storage-pinning/migratability report.
- **v0.9.0 / v0.9.1 (2026-08-01/02) — the installer arc.** One-command `install.sh` (dependency
bootstrap incl. Docker with explicit consent, LAN-IP autodetect, `--domain` mode, safe re-run over
an existing install), verified end-to-end on clean hardware; plain-HTTP CSP fix (+ scheme
detection behind proxies); **migration guardrails** in preflight (`cpu=host` across heterogeneous
CPU models, missing `cicustom` snippet storage on the target); placement/migration diagnostics;
app-DB backups fixed for `sudo` installs (backup dir ownership); `.gitattributes` pins LF so a
CRLF commit can't ship a dead installer.
- **v0.8.x (2026-07-16 → 07-29) — tenant controls + admin management + kiosk.** Share **permission
presets** (Viewer / Operator / Manager), **admin deploy-for-tenant** (node pin, optional
quota-exempt), admin-managed VMs **resize/rebuild-locked** to admins, Manager-share resizes billed
to the **owner's** quota, tenant activity feeds hide admin actions, IDE one-click **relocate** to
an AVX-capable node, custom AI-key endpoints admin-only; **compute access windows**
(invite-granted terms, suspend-never-delete, warning emails, enforcement across every auth path);
tabbed admin Settings; kiosk mode locked to **monitoring-only** with exit-gate hardening;
**scheduled app-DB backups** (nightly `VACUUM INTO`, rolling retention, host-directory support via
`PROXMATE_BACKUP_DIR`); `ide_ingress_cidr` admin field + reachability test; pinned
code-server/OpenCode installer versions.
- **v0.7.0 — ProxMate IDE (beta).** In-browser code-server + OpenCode AI agent installed natively in
each tenant VM; per-VM LLM gateway (allow-list, per-VM tokens, streaming, two-layer rate limiting);
managed isolation-consistent `:8080` firewall pinhole; min-spec guardrails (RAM floor, `cpu:host`/AVX);
install + cloud-init **deploy locks**; `DEPLOY_WITH_CLAUDE.md` agent-guided deploy runbook. Off by
default. See `docs/proxmate-ide.md`.
- **v0.6.x — GPU/PCI passthrough hardening + cluster ops.** Passthrough request→admin-attach workflow
with auto-migration to the device's node, live migration progress bar, and a pre-flight
host-readiness check (won't auto-start a GPU unless q35+OVMF — after two live node wedges);
migratability-aware balancer planning + migrate picker; backend security-hardening pass (SSRF guards,
fail-closed secrets, `/metrics` 404-in-prod, gateway rate limiting).
- **v0.5.0 — tenant-experience arc.** Console power actions + pop-out/keep-on-top terminal, live
Insights, reset guest password, rescue mode, per-VM resource alerts, duplicate VM, cloud-image
freshness/auto-refresh, single-use backup download links.
- **v0.4.x — LXC containers + passthrough requests.** Create/manage LXC alongside VMs (console,
isolation, quota, resize, backups; balancer pins them); GPU/PCI passthrough request workflow.
- **v0.3.x — sharing, scale & ops.** Share-a-VM (roles), public REST API + `pm_…` tokens + OpenAPI,
Cluster Balancer (DRS-style, memory-based, recommend→auto) + node-drain maintenance mode, VM
migration between nodes, extra data disks, quota-increase requests, live SSE stats, per-tenant
resource history, admin broadcast email, cloud-init "extras" + on-demand snippet writing.
- **v0.2.x — core platform.** Template Store + auto-scaling deploy, MateStates backups + retention,
secure external access (Cloudflare Tunnel / Tailscale, zero port-forwarding), admin monitor,
unified new-VM wizard, tags + bulk actions, event notifications, branded transactional email +
admin email invites, live resize/rebuild/per-VM backup policy.
- **Cross-cutting (done).** Structured logging (pino) + request IDs, deep health checks, Prometheus
`/metrics`, Proxmox retry/backoff on idempotent reads, write rate-limiting, Playwright E2E +
Vitest/RTL, ESLint/Prettier, CI security scanning (CodeQL/Trivy/npm-audit/SBOM), append-only audit
log, TOTP 2FA + passkeys + OIDC SSO, invite-enforced 2FA, AGPL open-core licensing (CE + CLA).
### Explicitly declined / not feasible (kept for the record)
- **Tenant self-service firewall rules** — declined by the owner (curated presets could revisit it).
- **Audit-log retention/export/SIEM streaming** — declined by the owner.
- **Custom cloud-init user-data editor** — dropped (arbitrary user-data needs a host snippet file the
API can't write).
- **Automated public ingress** — left as documented manual setup (collides with API-only + isolation).
- **S3/restic backup targets** — not feasible (Proxmox has no API to read vzdump bytes; NFS/CIFS/PBS
remote storage covers off-cluster backups instead).