infra-chrome-remote-desktop

Diagnose and repair Chrome Remote Desktop host failures on Linux systems.

1|Updated Jun 23, 2026
One-click install
npx skills add https://github.com/bitranox/bitranox-skills --skill infra-chrome-remote-desktop-bitranox
Or copy as Structured Prompt for Agent▼
Please help me install this Agent Skill.
Skill: infra-chrome-remote-desktop
Source: https://github.com/bitranox/bitranox-skills/tree/main/plugins/bitranox/skills/infra-chrome-remote-desktop
Command: npx skills add https://github.com/bitranox/bitranox-skills --skill infra-chrome-remote-desktop-bitranox

SYSTEM DOCUMENTATION & REQUIREMENTS

What problem does it solve? Chrome Remote Desktop reports several unrelated Linux host failures through one misleading message, so a "PIN is not valid" error, an instantly dropped session, or a failed registration sends administrators down expensive wrong turns like re-registering the host and burning single-use OAuth codes. This Skill maps each symptom to its real cause and gives the verified repair path. ## Core Features & Use Cases - Symptom-to-cause diagnosis: Reads the host journal during a connection attempt to distinguish PAM account-check failures, dead services, and registration problems before any destructive action. - PAM and /etc/shadow repair: Fixes the root:shadow group ownership that breaks unix_chkpwd, then verifies with a pamtester positive/negative control pair run as the unprivileged user, never as root. - Registration discipline: Runs start-host as the target user with a trap-cleaned temporary sudoers grant, checks every precondition before spending a single-use OAuth code, and archives half-written configs instead of stacking new ones. - Use Case: A user reports "PIN is not valid" on a freshly imaged LXC container. The Skill guides you to the journal, identifies pam_acct_mgmt error 7, corrects /etc/shadow ownership to root:shadow 0640, and confirms the fix with pamtester - all without consuming an OAuth code. ## Quick Start Diagnose why my Chrome Remote Desktop host on this Linux VM says "PIN is not valid" even though the PIN is correct, and fix it without re-registering the host.

Frequently Asked Questions about infra-chrome-remote-desktop

High-intent search queries and answers about installing and using this skill.

FAQPage Schema
Why does Chrome Remote Desktop say "PIN is not valid" when the PIN is correct?▼

The "PIN is not valid" message is how the web client renders a failed PAM account check, not a PIN problem. Chrome Remote Desktop runs pam_acct_mgmt for the connecting user on every connection, and the journal shows "pam_acct_mgmt() returned error 7" when it fails.

How do I fix Chrome Remote Desktop PAM authentication failures on Linux?▼

Check that /etc/shadow, /etc/shadow-, /etc/gshadow, and /etc/gshadow- are owned root:shadow with mode 0640, since unix_chkpwd is setgid shadow and cannot read root:root files. Verify the fix with pamtester run as the unprivileged user, never as root.

Why does start-host fail with "The no new privileges flag is set"?▼

Running start-host as root causes the Chromium binary to set PR_SET_NO_NEW_PRIVS on itself, so its own sudo call to write the config is refused. Run start-host as the target user instead; the --user-name flag does not avoid this.

Can I reuse a Chrome Remote Desktop OAuth code after a failed registration?▼

No, the OAuth code is single-use and is consumed by the token exchange before the config is written. A run that dies at "Failed to set new config" has already spent it, so obtain a fresh code and clear the half-written host config before retrying.

How do I verify which PIN is stored in a Chrome Remote Desktop host config?▼

The stored value is "hmac:" plus base64 of HMAC-SHA256 with host_id as the key and the PIN as the message. Always run a positive control with a known PIN first, because swapping the key and message arguments returns False for every input.

Why does a cloned Linux machine show a dead Chrome Remote Desktop entry?▼

A cloned image inherits the source host's host_id and private_key in its config, so the clone fights the original for the same device entry. Remove the inherited host#*.json files so exactly one config remains, then re-register.