A calm, low-stimulation video player for kids — built as a single Cloudflare Worker. Grayscale, warm-tone, slow-playback presets designed to reduce sensory overload. Search YouTube (no API key) or play your own local/HTTP/NAS files.
PipPad turns any cheap screen (a Raspberry Pi, an old tablet, any browser) into a de-stimulation video station. It was built for a neurodivergent kid who gets overwhelmed by the saturated, fast, dopamine-spike design of modern kids' media — so every default leans calm: muted color, reduced contrast, gentler speed, lower volume.
It's one file, no build step, no database server, and no YouTube API key required.
A self-contained Cloudflare Worker that serves three things from one URL:
/player— the video player UI (YouTube search + local/HTTP/NAS playback)/— "PipOS" shell: boots straight to the player in child mode, or shows a minimal home screen in parent mode/admin— PIN-gated settings (presets, defaults, media config)
Settings persist per-device in a Cloudflare KV namespace. That's the only binding you need.
- De-stimulation engine — CSS-filter overlay applies grayscale / contrast / brightness / warm-tone / saturation over any video (YouTube embeds and local files).
- Three presets —
Calm·Focus·Sleep— each tuned for color, speed, and volume. Plus full manual sliders. - YouTube search with no API key — uses YouTube's public InnerTube endpoint server-side, proxied as clean JSON. Embeds via privacy-friendly
youtube-nocookie.com. - Play your own media — local files (
<input type=file>), direct HTTP.mp4URLs, or NAS/SMB shares (via a tiny local HTTP server on the device — instructions included). - Parent / child mode — child mode locks to the player; a hidden corner tap + 4-digit PIN unlocks the parent home screen.
- Kiosk-ready — pairs with Chromium kiosk mode on a Raspberry Pi for a dedicated appliance.
your-domain.com
│
┌────────▼─────────┐
│ pip-player-worker │ (single CF Worker, ~1.2k lines)
│ │
GET / │ PipOS shell │ parent/child auto-boot
GET /player │ Player UI │ search + filters + controls
GET /admin │ Settings (PIN) │
/api/yt/* │ YouTube proxy │──▶ youtube.com InnerTube (no key)
/api/settings │ KV read/write │──▶ ┌──────────┐
└────────────────────┘ │ PIP_KV │ (settings, PIN)
└──────────┘
Optional device: Raspberry Pi → Chromium kiosk → your-domain.com
NAS/SMB → mounted locally → tiny HTTP server → player
You need a free Cloudflare account and wrangler.
# 1. Clone
git clone https://github.com/indicaindependent/pippad-player.git
cd pippad-player
# 2. Create the KV namespace and copy the returned id into wrangler.toml
npx wrangler kv namespace create PIP_KV
# 3. Deploy
npx wrangler deployOpen your worker URL, tap into /admin, set a 4-digit PIN, pick a default preset — done. For the Raspberry Pi kiosk + NAS/SMB setup, see the in-app /admin instructions panel.
Security note:
/adminis PIN-gated in-app, but the PIN is a child-resistance measure, not a security boundary. If you expose this publicly, put the/adminroute behind real access control (e.g. Cloudflare Zero Trust Access). See SECURITY.md.
Forks and PRs welcome — see CONTRIBUTING.md. This started as a one-kid project; if it helps yours, that's the whole point.
MIT © 2026 Indica Independent
Built by @indicaindependent · part of an indie tooling stack for people who'd rather own their software than rent it.
This is free, ad-free, independent infrastructure — no VC, no gov funding, no strings. If it served you, a tip keeps it alive and funds the next tool.
🧡 Sovereign Lightning + on-chain via SkyGive. Your sats fund uptime, not ads.