Some checks failed
Test / test (push) Has been cancelled
M-Obs 4: @shade/widgets React library - ShadeProvider context with observer URL + token + theme - useShadeState (polling) + useShadeEvents (SSE) hooks - 7 widgets: IdentityCard, SessionList, PrekeyStock, RecentActivity, ServerStatus, FingerprintCompare, WidgetCatalog (meta-widget for user-selectable layout with localStorage persistence) - Self-contained CSS via inline styles, no external CSS conflicts - Light/dark/auto theme via tokens M-Obs 5: @shade/dashboard standalone SPA - Vite + React app composing all widgets into a full debugger layout - Login screen with token persistence to localStorage - Build script copies dist/ to @shade/observer/dist/ for embedded serving - 211 KB JS bundle (66 KB gzipped) M-Obs 6: Documentation + integration example - READMEs for @shade/observer and @shade/widgets - examples/06-observer-dashboard runnable demo: spins up prekey server + observer, runs Alice ↔ Bob conversation loop, dashboard at :3901 - Updated root README and docker-compose.yml with observer integration M-Obs 7: End-to-end verification - StateAggregator now drains buffered events on subscription, so identity.initialized fires before observer construction are still seen - Verified live: snapshot endpoint returns full state, dashboard serves, 401 without auth, sessions/messages/ratchet steps all tracked 220 tests passing, 0 failures. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Example 05: Dokploy / Docker Deployment
Production-ready docker-compose configuration for deploying the Shade Prekey Server to Dokploy or any Docker host.
What's here
docker-compose.yml— single-service deployment with persistent SQLitedocker-compose.postgres.yml— alternative with PostgreSQL backend- Persistent volume for the SQLite database
- Health checks, restart policy, structured logging
Deploy
# SQLite (zero-config, recommended for small deployments)
docker compose up -d
# PostgreSQL (for shared databases or HA)
docker compose -f docker-compose.postgres.yml up -d
After deployment, the prekey server is reachable at http://localhost:3900:
# Health check
curl http://localhost:3900/health
# Metrics
curl http://localhost:3900/metrics
# Anonymous bundle fetch (works without auth)
curl http://localhost:3900/v1/keys/bundle/some-address
Reverse proxy
For TLS termination, put the prekey server behind a reverse proxy like Caddy or Traefik. Dokploy handles this automatically when you set the domain in the project settings.
Backups
The persistent volume shade-data contains the SQLite database. Back it up with:
docker run --rm -v shade-data:/data -v $(pwd):/backup alpine \
tar czf /backup/shade-data-$(date +%Y%m%d).tar.gz /data
For PostgreSQL, use standard pg_dump against the postgres service.