Files
punktfunk/docs-site/content/docs/host-cli.md
T
enricobuehler 9c8fa9340c
apple / swift (push) Failing after 40s
audit / cargo-audit (push) Failing after 1m12s
windows-msix / package (push) Successful in 1m37s
windows / build (push) Successful in 1m14s
android / android (push) Successful in 4m48s
ci / web (push) Successful in 27s
ci / rust (push) Successful in 4m21s
ci / docs-site (push) Successful in 31s
ci / bench (push) Successful in 4m39s
decky / build-publish (push) Successful in 11s
docker / build-push (--build-arg FEDORA_VERSION=44, ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora44-rpm) (push) Successful in 5s
docker / build-push (., web/Dockerfile, punktfunk-web) (push) Successful in 4s
docker / build-push (ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora-rpm) (push) Successful in 4s
docker / build-push (ci, ci/rust-ci.Dockerfile, punktfunk-rust-ci) (push) Successful in 4s
docker / build-push (docs-site, docs-site/Dockerfile, punktfunk-docs) (push) Successful in 19s
deb / build-publish (push) Successful in 6m3s
flatpak / build-publish (push) Successful in 4m13s
rpm / build-publish (bazzite, punktfunk-fedora-rpm) (push) Successful in 8m15s
rpm / build-publish (fedora-44, punktfunk-fedora44-rpm) (push) Successful in 8m16s
docker / deploy-docs (push) Successful in 18s
refactor: drop milestone names + consolidate clients; loss-recovery & rumble fixes
Two bodies of work in one commit (the rename moved files the fixes also touched).

Naming/structure cleanup (pre-launch):
- Host modules m3.rs->punktfunk1.rs, m0.rs->spike.rs; CLI m3-host->punktfunk1-host,
  m0->spike; bare `punktfunk-host` now prints help. Types M3Options/M3Source->
  Punktfunk1Options/Punktfunk1Source.
- Clients consolidated out of crates/ into clients/: punktfunk-client-rs->
  clients/probe (crate punktfunk-probe), client-linux->clients/linux,
  client-windows->clients/windows, punktfunk-android->clients/android/native
  (crate punktfunk-client-android; kept [lib] name=punktfunk_android so the JNI
  contract is unchanged). crates/ now holds only core + host.
- Milestone codes M0-M4 purged from code/CLI/CLAUDE.md/README/docs/docs-site,
  kept only in docs/implementation-plan.md. docs/m2-plan.md->
  docs/gamestream-host-plan.md. CI/gradle/flatpak paths updated.

Client loss-recovery (video froze and never recovered after a brief drop):
- Export punktfunk_connection_frames_dropped through the C ABI (the core already
  tracked it for the client keyframe-recovery loop; it was never reachable from
  the ABI clients). Regenerated punktfunk_core.h.
- Apple (StreamPump + Stage2Pipeline) and Android (decode.rs) now poll
  frames_dropped and request a keyframe when it climbs -- the same loss-driven
  recovery Linux/Windows already had. Under infinite GOP the decoder silently
  conceals reference-missing frames, so the decode-error trigger rarely fires.

Apple rumble robustness (worked then went spotty -- DualSense + Xbox):
- Add CHHapticEngine stopped/reset handlers (rebuild on app background / audio
  interruption / server reset) and drop the permanent `broken` latch on a
  transient drive failure; latch only when the controller truly has no haptics.
- Surface swallowed SDL set_rumble errors on Linux/Windows + diagnostic logging.

Verified: cargo build/clippy/fmt --workspace, C-ABI harness, header drift.
Not runnable on this box (verify in CI): Gitea workflows, gradle/Android,
flatpak, Swift/decky.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 21:05:58 +00:00

3.2 KiB

title, description
title description
Host CLI The punktfunk-host commands and the flags you'll actually use.

The host is one binary, punktfunk-host. Most of the time you'll run a single command; the rest reads its settings from host.env.

serve --native

The normal way to run a host. Starts the unified host: the GameStream server (for Moonlight) and the native punktfunk/1 server, plus the management API/web console — all in one process.

punktfunk-host serve --native
Flag Meaning
--native Also run the native punktfunk/1 server (recommended; enables the Apple app and discovery).
--native-port <PORT> Native QUIC port (default 9777).
--open Don't require pairing — serve any device on the network. Off by default; only for trusted single-user setups.
--mgmt-bind <IP:PORT> Management API address (default loopback 127.0.0.1:47990).
--mgmt-token <TOKEN> Override the bearer token for the management API.

These are the only flags serve accepts.

The management API is always HTTPS with bearer-token auth. If you don't pass --mgmt-token, a token is auto-generated and persisted to ~/.config/punktfunk/mgmt-token; --mgmt-token only overrides it. A token is required when you bind the API off loopback with --mgmt-bind.

By default the host requires pairing — see Pairing & Trust. On serve --native you arm pairing from the web console (or mgmt API); the host then displays a 4-digit PIN. Pass --open to turn off the mandatory-pairing default and serve any device on the network (trusted single-user setups only). The pairing flags below are punktfunk1-host-only and do not apply to serve.

punktfunk1-host

A standalone native-only host, mainly for testing the punktfunk/1 path without the GameStream server or web console.

punktfunk-host punktfunk1-host --source virtual
Flag Meaning
--port <N> QUIC listen port (default 9777).
--source synthetic · virtual virtual uses a real virtual display + NVENC; synthetic emits test frames.
--seconds <N> / --frames <N> Bound each session by wall-clock seconds or frame count.
--max-concurrent <N> Stream at most N sessions at once (default 4); overflow waits in the queue.
--max-sessions <N> Exit after N sessions (0 = serve forever).
--allow-pairing Accept PIN pairing; the host prints a PIN when a client pairs.
--require-pairing Only serve paired devices (implies --allow-pairing).

--max-concurrent, --allow-pairing, and --require-pairing are punktfunk1-host-onlyserve does not accept them. On serve --native you arm pairing from the web console instead, and concurrency is not yet capped from the command line.

Both serve --native and punktfunk1-host advertise the host on the network so clients can discover it. List hosts from another machine with punktfunk-probe --discover.

Environment

Most behaviour (compositor, video source, input backend, zero-copy) is set in host.env, not on the command line. When running as a service, the unit loads host.env for you.