PrivateApp
name: privateapp
by camopel · published 2026-03-22
$ claw add gh:camopel/camopel-privateapp---
name: privateapp
description: "Personal PWA dashboard server with plugin apps. Use when: (1) installing or setting up PrivateApp, (2) starting/stopping/restarting the service, (3) building frontends after changes, (4) adding new app plugins, (5) configuring push notifications. Requires Python 3.9+, Node.js 18+. Runs as systemd user service or launchd plist."
---
# PrivateApp
Personal PWA dashboard — FastAPI backend + React/Vite frontend with plugin apps.
Screenshots



Setup
# Clone and install (creates venv, builds frontends, sets up systemd/launchd)
git clone https://github.com/camopel/PrivateApp.git ~/Workspace/PrivateApp
cd ~/Workspace/PrivateApp
bash scripts/install.sh [--port 8800]Copy `scripts/config.example.json` → `scripts/config.json` and edit:
{
"host": "0.0.0.0",
"port": 8800,
"data_dir": "~/.local/share/privateapp",
"file_browser": { "root": "~" },
"push": { "vapid_email": "you@example.com" }
}Service Management
# Linux (systemd user service)
systemctl --user start privateapp
systemctl --user stop privateapp
systemctl --user restart privateapp
systemctl --user status privateapp
# macOS (launchd)
launchctl load ~/Library/LaunchAgents/com.privateapp.server.plist
launchctl unload ~/Library/LaunchAgents/com.privateapp.server.plist
# Manual
.venv/bin/python3 scripts/server.py --host 127.0.0.1 --port 8800Build Frontends
After any frontend change, rebuild:
# Build shell (home screen)
cd frontend && npm run build
# Build all app frontends
for app_dir in apps/*/frontend; do
[ -f "$app_dir/package.json" ] && (cd "$app_dir" && npm install && npm run build)
done
# Or use the install script which builds everything
bash scripts/install.shThen restart the service.
Built-in Apps
| App | Shortcode | Description |
|-----|-----------|-------------|
| 📊 System | `sysmon` | CPU, RAM, disk, GPU stats and service health |
| 📁 Files | `files` | Browse, preview, and share files |
Adding a New App
Create `apps/{app-id}/` with:
Shortcode must be unique. The app loader auto-discovers on startup.
See the existing apps for reference patterns. Key conventions:
Push Notifications
Apps can send push via `commons.push_client`:
from commons.push_client import send_push
await send_push(title="Alert", body="Something happened", url="/app/my-app/")Data
~/.local/share/privateapp/
├── privateapp.db # Settings, preferences, push subscriptions
├── vapid_private.pem # VAPID signing key
└── vapid_public.txt # VAPID public keyKey APIs
More tools from the same signal band
Order food/drinks (点餐) on an Android device paired as an OpenClaw node. Uses in-app menu and cart; add goods, view cart, submit order (demo, no real payment).
Sign plugins, rotate agent credentials without losing identity, and publicly attest to plugin behavior with verifiable claims and authenticated transfers.
The philosophical layer for AI agents. Maps behavior to Spinoza's 48 affects, calculates persistence scores, and generates geometric self-reports. Give your...