Skip to content

feat: add ujust get-couchside (phone remote & dashboard for the couch) - #5352

Open
emerytech wants to merge 1 commit into
ublue-os:mainfrom
emerytech:feat/ujust-get-couchside
Open

feat: add ujust get-couchside (phone remote & dashboard for the couch)#5352
emerytech wants to merge 1 commit into
ublue-os:mainfrom
emerytech:feat/ujust-get-couchside

Conversation

@emerytech

Copy link
Copy Markdown

Adds a get-couchside recipe to 82-bazzite-apps.just, following the
get-emudeck shape exactly: status | install | uninstall plus the
interactive ugum menu when run bare. No yafti/portal change in this PR —
recipe only.

What Couchside is

Couchside turns a phone (iOS/Android) into the
dashboard, remote console, and game controller for a living-room Bazzite/
SteamOS machine: launch games, switch Game Mode ↔ Desktop, trackpad +
keyboard input, volume/TV control, power. LAN-only, bearer-token
authenticated, no cloud, no accounts, no analytics.
The box-side agent is
MIT licensed, pure Python 3 stdlib, and runs as the desktop user (not root).

Why this shape

  • Same install mechanism as Decky Loader's recipe: curl | bash of an
    installer that sets up a systemd service. The installer verifies an
    Ed25519 signature over every fetched file
    (SHA256SUMS + SHA256SUMS.sig
    against a pinned public key) before installing anything — a corrupted or
    tampered fetch refuses to install. Verification code is in the installer
    itself: https://github.com/emerytech/couchside/blob/main/install.sh
  • status checks the systemd unit + installed daemon — what the installer
    actually creates, not a filename heuristic.
  • uninstall is complete and testable (ujust get-couchside uninstall):
    service, privileged helper + its units, udev rules, sudoers (prompted),
    Steam tile, Wake-on-LAN link.

Anticipating the review questions

  • Privileged surface: the agent executes only a frozen allowlist — client
    input selects entries, never becomes a command/path/shell string. Since
    2.9.69 the root-side work goes through a small socket-gated helper (eight
    fixed verbs, SO_PEERCRED-checked) rather than broad sudo rules.
  • Blast radius: it can reboot/suspend the machine and switch sessions —
    that is the product. It is reachable only on the LAN and only with the
    pairing token the box displays.
  • Maintenance: I maintain the recipe; the project ships weekly and the
    installer URL is stable (it is a signed release asset mirrored at
    couchside.tv).

Happy to adjust naming, grouping, or scope to fit — and no hard feelings if
the portal bar is "come back with more users"; the recipe alone already
gives Bazzite users a one-liner.

Adds a get-couchside recipe following the get-emudeck pattern
(status | install | uninstall + interactive ugum menu). Couchside is a
phone app (iOS/Android) whose box-side agent turns the machine into a
phone-controlled console: launch games, switch between Game Mode and
Desktop, trackpad/keyboard input, volume, and power — LAN-only, token
authenticated, no cloud accounts. The agent is MIT licensed, pure
Python stdlib, and the installer verifies an Ed25519 signature over
every fetched file before installing (same curl|sh + systemd service
shape as Decky Loader). Uninstall removes the service, the privileged
helper and its units, udev rules, and the Steam tile.

Status detection checks the systemd unit plus the installed daemon,
matching what the installer actually creates.
@codacy-production

Copy link
Copy Markdown

Up to standards ✅

🟢 Issues 0 issues

Results:
0 new issues

View in Codacy

NEW Get contextual insights on your PRs based on Codacy's metrics, along with PR and Jira context, without leaving GitHub. Enable AI reviewer
TIP This summary will be updated as you push new changes.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant