Child-friendly, parent-guided Wayland desktop environment alternative that puts parents, not platforms, in control
  • Rust 78.4%
  • Kotlin 9.3%
  • Shell 9%
  • TypeScript 3%
  • Java 0.2%
  • Other 0.1%
Find a file
Albert Armea 74674f9a5a
All checks were successful
CI / Version harmony (push) Successful in 12s
CI / Arch neutrality (push) Successful in 11s
CI / ShellCheck (push) Successful in 16s
CI / CI image (push) Successful in 22s
CI / CI image (Android) (push) Successful in 21s
CI / CI images (push) Successful in 0s
CI / Rustfmt (push) Successful in 24s
CI / Warm cargo registry (push) Successful in 27s
CI / Android media (cargo-ndk build) (push) Successful in 52s
CI / Android companion (unit tests) (push) Successful in 2m11s
CI / Clippy (push) Successful in 1m29s
CI / Build (push) Successful in 3m22s
CI / Firewall E2E (push) Successful in 4m4s
CI / Test (push) Successful in 3m49s
CI / E2E (push) Successful in 3m31s
CI / Package (.deb smoke build) (push) Successful in 2m53s
Merge pull request 'Fix touch/mouse bridge offset' (#134) from fix/touch-bridge-grabs-clickpad into main
Reviewed-on: #134
2026-08-19 05:58:56 +00:00
.ci ci(release): restore parallel build jobs; bake cargo-ndk into the image 2026-07-11 06:43:38 -04:00
.claude/skills docs(headless-dev): note that dev stop can't clear a stale session 2026-08-18 23:57:40 -04:00
.github/workflows feat(fdroid): metadata, validation, and docs for the F-Droid repo (#110) 2026-07-26 20:14:11 -04:00
companion-android Merge pull request 'feat(admin): install the companion and media apps from the admin script' (#131) from feat/admin-installs-android-apps into main 2026-08-17 23:26:32 +00:00
crates fix(input): only grab direct touchscreens, and normalize per device 2026-08-19 01:43:31 -04:00
dist feat(install): ship the bluetoothd drop-in shepherd's bearer pin needs 2026-08-17 22:57:16 -04:00
docs docs(input): record how the clickpad-range bug was caught 2026-08-19 01:43:31 -04:00
scripts fix(install): never delete files an installed package owns 2026-08-19 01:05:07 -04:00
shepherd-webui bump to 0.3.7 2026-08-19 00:05:53 -04:00
.dockerignore fix(ci): don't let the version probes abort the install under set -e 2026-08-15 00:06:55 -04:00
.gitignore feat(fdroid): metadata, validation, and docs for the F-Droid repo (#110) 2026-07-26 20:14:11 -04:00
AGENTS.md fix(hud): keep the "End session" confirm popover on-screen (#97) 2026-07-19 02:05:40 -04:00
Cargo.lock bump to 0.3.7 2026-08-19 00:05:53 -04:00
Cargo.toml bump to 0.3.7 2026-08-19 00:05:53 -04:00
CLAUDE.md Fix Claude Code integration 2026-04-19 19:57:06 -04:00
clippy.toml Add CI 2025-12-28 22:07:23 -05:00
config.example.toml feat(ble): let the config pick which Bluetooth controller to use 2026-08-10 23:40:05 -04:00
CONTRIBUTING.md feat(admin): install the companion and media apps from the admin script 2026-08-17 18:58:00 -04:00
LICENSE.md Design goals README 2025-12-21 23:52:15 -05:00
movies-library.example.toml Make shepherd-media available from ./run-dev 2026-05-03 08:35:00 -04:00
README.md feat(limits): skip the cooldown after a session that barely ran 2026-07-27 20:41:32 -04:00
run-dev Add setup scripts 2026-01-01 13:48:17 -05:00
sway.conf External monitor/docking support (#87) 2026-07-04 13:13:35 -04:00
VERSION bump to 0.3.7 2026-08-19 00:05:53 -04:00

shepherd-launcher

A child-friendly, parent-guided desktop environment alternative for Wayland, allowing supervised access to applications and content that you define.

Its primary goal is to return control of child-focused computing to parents, not software or hardware vendors, by providing:

  • the ease-of-use of game consoles
  • access to any application that can be run, emulated, or virtualized in desktop Linux
  • with granular access controls inspired by and exceeding those in iOS Screen Time

While this repository provides some examples for existing software packages (including non-free software and abandonware), shepherd-launcher is non-prescriptive: as the end user, you are free to use them, not use them, or write your own.

Screenshots

Home screen

shepherd-launcher presents a list of activities for the user to pick from.

Home screen at 3:00 PM showing the following set of activities: Tux Math, Putt Putt Joins the Circus, Secret of Monkey Island, GCompris, Minecraft, Celeste, A Short Hike, Big Buck Bunny, and Lofi Beats.

The flow of manually opening and closing activities should be familiar.

Activities can be made selectively available at certain times of day.

Home screen at 9:00 PM showing Lofi Beats as the only available activity.

This example, shown at 9 PM, has limited activities as a result.

Time limits

Activities can have configurable time limits, including:

  • individual session length
  • total usage per day
  • cooldown periods before that particular activity can be restarted (skipped when the activity only ran for a moment, so a crash on launch costs nothing)

Anything on Linux

If it can run on Linux in any way, shape, or form, it can be supervised by shepherd-launcher.

"Big Buck Bunny" hosted within shepherd-launcher UI

Big Buck Bunny playing locally via mpv

For collections of media files (local or YouTube), the bundled shepherd-media launcher reads a declarative .toml library file and presents either a single direct-play activity or a browseable poster grid.

"Putt Putt Joins the Circus" hosted within shepherd-launcher UI

Putt Putt Joins the Circus running via ScummVM

"The Secret of Monkey Island" hosted within shepherd-launcher UI

The Secret of Monkey Island running via ScummVM

Minecraft hosted within shepherd-launcher UI

Minecraft running via the Prism Launcher Flatpak

Celeste hosted within shepherd-launcher UI

Celeste running via Steam

A Short Hike hosted within shepherd-launcher UI

A Short Hike running via Steam

Local management

shepherd-launcher optionally runs a management UI and API that can be used to apply temporary overrides.

"Now" screen showing time adjustment and "Stop Session" buttons

"Activities" screen showing the configured activities and manual enable/disable overrides

Core concepts

  • Launcher-first: only one foreground activity at a time
  • Time-scoped execution: applications are granted time slices, not unlimited sessions
  • Parent-defined policy: rules live outside the application being run
  • Wrappers, not patches: existing software is sandboxed, not modified
  • Revocable access: sessions end predictably and enforceably

Non-goals

  1. Modifying or patching third-party applications
  2. Circumventing DRM or platform protections
  3. Replacing parental involvement with automation or third-party content moderation
  4. Remotely monitoring users with telemetry
  5. Collecting, storing, or reporting personally identifying information (PII)

Regarding age verification

shepherd-launcher may be considered "operating system software" under the Digital Age Assurance Act and similar legislation, and therefore subject to an age verification requirement.

As legislated, such requirements are fundamentally incompatible with non-goals 3, 4, and 5.

shepherd-launcher will never collect telemetry or PII, and as such, it will never implement this type of age verification.

As a result, shepherd-launcher is not licensed for use in any region that requires OS-level age verification by law. If you reside in any such region, you may not download, install, or redistribute shepherd-launcher.

This includes, but is not limited to:

The US as a whole and individual states are considering similar legislation.

If you disagree with this assessment and you reside in an affected region, please contact your representatives.

Installation

shepherd-launcher is pre-alpha and in active development. The helper at ./scripts/shepherd can be used to build and install a fully functional local kiosk setup from source:

Check out this repository and run ./scripts/shepherd --help or see INSTALL.md for more.

Example configuration

All behavior shown above is driven entirely by declarative configuration.

For the Minecraft example shown above:

# Prism Launcher - Minecraft launcher (Flatpak)
# Install: flatpak install flathub org.prismlauncher.PrismLauncher
[[entries]]
id = "prism-launcher"
label = "Prism Launcher"
icon = "org.prismlauncher.PrismLauncher"

[entries.kind]
type = "flatpak"
app_id = "org.prismlauncher.PrismLauncher"

[entries.availability]
[[entries.availability.windows]]
days = "weekdays"
start = "15:00"
end = "18:00"

[[entries.availability.windows]]
days = "weekends"
start = "10:00"
end = "20:00"

[entries.limits]
max_run_seconds = 1800  # 30 minutes (roughly 3 in-game days)
daily_quota_seconds = 3600  # 1 hour per day
cooldown_seconds = 600  # 10 minute cooldown

[[entries.warnings]]
seconds_before = 120
severity = "warn"
message = "2 minutes remaining - save your game!"

[[entries.warnings]]
seconds_before = 30
severity = "critical"
message = "30 seconds! Save NOW!"

See config.example.toml and the Wiki for more.

Development

Build instructions and contribution guidelines are described in CONTRIBUTING.md.

If you'd like to help out, you can find potential work items on the Issues page. You may email me patch sets at shepherd-launcher-patch@albertarmea.com.

Written in 2025, responsibly

This project stands on the shoulders of giants in systems software and compatibility infrastructure:

  • Wayland and Sway
  • Rust
  • Flatpak and Snap
  • Proton and WINE

This project was written with the assistance of generative AI-based coding agents. Substantial prompts and design docs provided to agents are disclosed in docs/ai.