Claude Code skill — remote browser access from any device (iPad/phone) via ttyd + Cloudflare tunnels + QR codes
SaferSkills independently audited claude-web-remote (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Set up remote access to Claude Code + dev site preview from any browser, with scannable QR codes and basic authentication.
Check and install if missing:
macOS:
brew install ttyd cloudflared qrencodeLinux:
# ttyd: https://github.com/tsl0922/ttyd/releases
# cloudflared: https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/downloads/
sudo apt install qrencode#!/bin/bash
# Claude Web Remote — access Claude Code + site preview from anywhere
# Uses ttyd (web terminal) + Cloudflare quick tunnels + QR codes
# Auth: ttyd basic auth protects terminal access
set -euo pipefail
CLAUDE_PORT=7682
SITE_PORT=3000 # Adapt: match your dev server port
CLAUDE_TUNNEL_LOG=$(mktemp)
SITE_TUNNEL_LOG=$(mktemp)
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
# --- Authentication ---
# Generate random credentials for this session
TTYD_USER="claude"
TTYD_PASS=$(LC_ALL=C tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 16 || true)
PIDS=()
cleanup() {
echo ""
echo "Shutting down..."
for pid in "${PIDS[@]}"; do
kill "$pid" 2>/dev/null || true
done
rm -f "$CLAUDE_TUNNEL_LOG" "$SITE_TUNNEL_LOG"
wait 2>/dev/null
echo "All processes stopped."
}
trap cleanup EXIT INT TERM
# --- Claude Code terminal (with basic auth) ---
echo "Starting Claude Code web terminal on port $CLAUDE_PORT..."
ttyd -W -p $CLAUDE_PORT \
-c "${TTYD_USER}:${TTYD_PASS}" \
-t fontSize=14 \
-t 'theme={"background":"#1a1a2e","foreground":"#e0e0e0"}' \
bash -c "cd $SCRIPT_DIR && claude" &
PIDS+=($!)
sleep 2
if ! kill -0 "${PIDS[-1]}" 2>/dev/null; then
echo "Failed to start ttyd"
exit 1
fi
# --- Dev server ---
echo "Starting dev server on port $SITE_PORT..."
# Adapt: change this to your dev server start command
cd "$SCRIPT_DIR" && npm run dev &
PIDS+=($!)
cd "$SCRIPT_DIR"
echo "Waiting for dev server to start..."
sleep 8
# --- Tunnels ---
echo "Creating Cloudflare tunnels..."
cloudflared tunnel --url http://localhost:$CLAUDE_PORT > "$CLAUDE_TUNNEL_LOG" 2>&1 &
PIDS+=($!)
cloudflared tunnel --url http://localhost:$SITE_PORT > "$SITE_TUNNEL_LOG" 2>&1 &
PIDS+=($!)
# Wait for both tunnel URLs
echo "Waiting for tunnel URLs..."
get_tunnel_url() {
local logfile="$1"
for i in $(seq 1 30); do
local url
url=$(grep -oE 'https://[a-z0-9-]+\.trycloudflare\.com' "$logfile" 2>/dev/null | head -1 || true)
if [ -n "$url" ]; then
echo "$url"
return 0
fi
sleep 1
done
echo "FAILED"
return 1
}
CLAUDE_URL=$(get_tunnel_url "$CLAUDE_TUNNEL_LOG")
SITE_URL=$(get_tunnel_url "$SITE_TUNNEL_LOG")
echo ""
echo "================================================"
echo " CLAUDE WEB REMOTE"
echo "================================================"
echo ""
if [ "$CLAUDE_URL" != "FAILED" ]; then
echo " Claude Code: $CLAUDE_URL"
echo " Login: $TTYD_USER / $TTYD_PASS"
else
echo " Claude Code: FAILED (check $CLAUDE_TUNNEL_LOG)"
fi
if [ "$SITE_URL" != "FAILED" ]; then
echo " Site Preview: $SITE_URL"
else
echo " Site Preview: FAILED (check $SITE_TUNNEL_LOG)"
fi
echo ""
echo "================================================"
if [ "$CLAUDE_URL" != "FAILED" ]; then
echo ""
echo "--- Claude Code QR ---"
qrencode -t ANSIUTF8 "$CLAUDE_URL"
fi
if [ "$SITE_URL" != "FAILED" ]; then
echo ""
echo "--- Site Preview QR ---"
qrencode -t ANSIUTF8 "$SITE_URL"
fi
echo ""
echo "Press Ctrl+C to stop"
echo ""
waitchmod +x claude-remote.sh
./claude-remote.shSITE_PORT=3000, dev command = npm run devSITE_PORT=5173, dev command = npm run devSITE_PORT=5000, dev command = python app.py (use 5050 if 5000 is taken by AirPlay on macOS)SITE_PORT=8000, dev command = python manage.py runserverpython3 -m http.server $SITE_PORT --directory ./public &-c user:pass flag for basic authentication. A random 16-character password is generated each session.-W flag on ttyd enables writable/interactive modetmux before running~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.