Commit Graph

203 Commits

Author SHA1 Message Date
Dorian
45cd28bb04 perf: mark FINAL-04 complete — all benchmarks pass
Results:
- RPC echo: <1ms (target: <100ms)
- system.stats: <0.5ms (target: <100ms)
- Nginx TTFB: <1ms (target: <2s)
- Main JS bundle: 107KB gzipped, lazy-loaded routes
- All performance targets exceeded

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 17:43:36 +00:00
Dorian
0fe5a80a95 fix: add session auth to SearXNG web search proxy (FINAL-02)
Security audit findings — zero critical/high issues:
- Fixed: SearXNG API proxy was missing session cookie check
- Verified: RPC endpoints use session auth + CSRF tokens + rate limiting
- Verified: Cookies use HttpOnly + SameSite=Strict + Secure (prod)
- Verified: Secrets encrypted with AES-256-GCM, 0600 permissions
- Verified: Container isolation with capability dropping, readonly root
- Verified: Nginx has security headers (CSP, X-Frame-Options, etc.)
- Verified: CORS validates against allowlist (no wildcard)
- Low findings documented: legacy plaintext secret fallback, v-html for TOTP QR

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 17:43:25 +00:00
Dorian
6cea156df6 fix: polish UX error handling across views (FINAL-01)
- AppDetails: replace alert() with dismissible toast, add error feedback
  for start/stop/restart/uninstall actions
- GoalDetail: add error toast for install failures instead of silent catch
- Apps: add loading skeleton when WebSocket data hasn't arrived yet
- Add appDetails.noLaunchUrl i18n key

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 17:33:42 +00:00
Dorian
2d0ac12a6a docs: finalize ADRs with 4 new records (FINALDOC-03)
ADR-006: Nostr relays for decentralized marketplace discovery
ADR-007: DID-based bilateral federation trust
ADR-008: Dual key strategy (Ed25519 + secp256k1)
ADR-009: Manifest-level container security enforcement

Total: 9 ADRs covering all significant architectural decisions.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 17:23:40 +00:00
Dorian
1f178a2dcb docs: add user walkthrough with screenshot placeholders (FINALDOC-02)
Complete user flow documentation from hardware prep through daily use.
6 parts: hardware, installation, onboarding, dashboard, advanced ops,
and maintenance. Ready for screenshot capture and video production.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 17:21:40 +00:00
Dorian
2b19ca9641 docs: add comprehensive troubleshooting guide (FINALDOC-01)
20 issues covering connection, apps, Bitcoin sync, backup, updates,
kiosk mode, network, performance, and emergency recovery. Each with
diagnostic commands and step-by-step solutions.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 17:20:21 +00:00
Dorian
02b2746203 test: achieve 80%+ branch/function coverage on frontend logic (E2E-03)
515 tests across 38 files. Branch coverage 88%, function coverage 83%
on testable logic (stores, composables, api, utils, services, router).

New test files: websocket, useLoginSounds, useMobileBackButton,
useControllerNav, routes. Extended: rpc-client (99.5%), container store
(100%). Fixed: useNavSounds AudioContext mock, type errors across tests.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 17:18:37 +00:00
Dorian
4234fb3343 test: add golden path E2E test suite (E2E-01)
14-phase test covering boot, auth, identity, containers, Bitcoin,
LND, BTCPay, backup, DWN, network, monitoring, webhooks, security
(CSRF + auth), and session lifecycle. Handles rate limiting and
transient 502s gracefully. 25/27 pass on live server.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 14:58:21 +00:00
Dorian
4995dc2656 feat: add per-endpoint rate limiting for sensitive operations (PENTEST-04)
New EndpointRateLimiter in session.rs tracks requests per (method, IP)
with configurable limits and time windows:

Financial operations (5 req/5min):
- wallet.send, lnd.sendcoins, lnd.payinvoice, lnd.create-psbt,
  lnd.finalize-psbt, wallet.ecash-send

Channel operations (3 req/5min):
- lnd.openchannel, lnd.closechannel

Backup operations (2-3 req/10min):
- backup.create, backup.restore

Container/package installs (5 req/5min):
- container-install, package.install

System operations (2 req/5min):
- system.reboot, system.shutdown, update.apply

Identity/auth (3-10 req/5min):
- identity.create, identity.issue-credential, auth.changePassword

Returns HTTP 429 with Retry-After header when limits exceeded.
Verified on live server: auth.changePassword blocks at 4th request,
lnd.sendcoins blocks at 6th request.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 14:46:25 +00:00
Dorian
ec92e5e756 fix: harden container isolation in first-boot script (PENTEST-03)
Add --cap-drop ALL and --security-opt no-new-privileges:true to all
containers in first-boot-containers.sh that were missing it:
- Bitcoin Knots, LND, Fedimint, Fedimint Gateway (+ CHOWN/SETUID/SETGID)
- BTCPay Server, Home Assistant (+ CHOWN/SETUID/SETGID/DAC_OVERRIDE)
- Nextcloud (+ CHOWN/SETUID/SETGID/DAC_OVERRIDE)
- Grafana, Uptime Kuma, PhotoPrism, Ollama, Vaultwarden, FileBrowser
  (zero extra caps + --read-only + tmpfs for /tmp and /run)
- Jellyfin (zero extra caps)

Tailscale retains --privileged (required for TUN/iptables/routing).
SearXNG, OnlyOffice, Nginx Proxy Manager, Portainer already hardened.

The Rust RPC layer already applies equivalent hardening for all UI
installs; this brings the ISO first-boot path to parity.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 14:40:04 +00:00
Dorian
89acc3ed5c fix: harden input validation across all RPC endpoints (PENTEST-02)
Manual security audit of 130+ RPC endpoints. Critical fixes:
- LND: validate pubkey (66-char hex), Bitcoin addresses, channel points,
  amount bounds, payment request format, memo length, peer address
- Package: validate_app_id on start/stop/restart/bundled-app handlers,
  validate volume host paths (must be under /var/lib/archipelago/),
  validate Docker image in bundled-app-start
- Container: validate_app_id on all 6 handlers, canonicalize manifest paths
- Network: path traversal prevention in connection request deletion
- Backup: backup ID validation in delete handler
- Webhooks: URL scheme validation, SSRF prevention for private IPs
- Security: validate app_id in secret rotation
- Interfaces: WiFi password length/null validation, strict IP/gateway/DNS
  parsing for static ethernet config

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 14:32:49 +00:00
Dorian
daa33d098b test: enhance automated pentest suite (PENTEST-01)
Rewrite verify-pentest-fixes.sh and test-security.sh with comprehensive
security tests covering auth bypass, CSRF protection, rate limiting,
input validation (SQL injection, command injection, path traversal),
session fixation, SSRF, container isolation, and session lifecycle.
Both scripts now pass all checks (35/35 and 14/14).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 14:15:53 +00:00
Dorian
d15e90c26d feat: add vue-i18n infrastructure and externalize all UI strings (A11Y-03)
Set up vue-i18n with English locale file containing 500+ keys organized
by view namespace. All 15 views converted to use t() calls instead of
hardcoded strings. Infrastructure ready for community translations.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 13:45:59 +00:00
Dorian
c1131251f9 feat: add keyboard navigation, escape-to-close modals, skip-to-content (A11Y-02)
All modals now close with Escape key. Interactive card divs respond to
Enter key. Skip-to-content link added to Dashboard layout. All Web5 and
Settings modals get role=dialog, aria-modal, and escape handlers.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 13:11:45 +00:00
Dorian
46747607ea feat: add ARIA labels, roles, and live regions across all views (A11Y-01)
Systematic accessibility pass: aria-label on icon-only buttons, role=dialog
and aria-modal on modals, role=tab/tablist on tab switchers, role=switch
on toggles, aria-live on dynamic status/error regions, aria-hidden on
decorative SVGs, aria-label on search inputs, and nav landmarks.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 13:04:31 +00:00
Dorian
224681f1e0 feat: add webhook notification system with Settings UI (REMOTE-03)
Webhook module with HTTP delivery, HMAC-SHA256 signing, and event
filtering. RPC handlers for get-config, configure, and test endpoints.
Settings page gains webhook configuration section with URL, secret,
event toggles, and test button.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 12:55:13 +00:00
Dorian
f7ed67bac9 fix: improve mobile touch targets and responsive layouts (REMOTE-02)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 12:46:02 +00:00
Dorian
8ffa89ba16 feat: add Tailscale remote access setup RPC (REMOTE-01)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 12:42:05 +00:00
Dorian
980fc3af6d feat: add metrics export as CSV/JSON (MON-04)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 12:33:19 +00:00
Dorian
1b8a8cfd32 feat: add alerting system with configurable rules and UI (MON-02, MON-03)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 12:28:44 +00:00
Dorian
592548066e feat: add real-time metrics collection with ring buffer storage (MON-01)
Implements monitoring/collector.rs that collects per-container CPU/RAM/network/disk,
system-wide metrics, RPC latency, and WebSocket connection count every 60 seconds.
Data stored in dual ring buffers: 1-min resolution (24h) and 15-min resolution (7d).
Three new RPC endpoints: monitoring.current, monitoring.history, monitoring.containers.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 11:11:02 +00:00
Dorian
45032d937b feat: add community infrastructure and update server setup
- releases/manifest.json: Seed release manifest for update server
- update.rs: Make UPDATE_MANIFEST_URL configurable via ARCHIPELAGO_UPDATE_URL env var
- CONTRIBUTING.md: Comprehensive contribution guidelines covering code style,
  PR process, testing, security disclosure, and app submission
- .github/ISSUE_TEMPLATE/: Bug report, feature request, and app submission
  issue templates with structured forms
- .github/pull_request_template.md: PR template with checklist

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 10:57:33 +00:00
Dorian
112b15b4ea fix: polish form validation and feedback across views
- Server.vue: Add loading/disabled state to WiFi connect button,
  success toast on WiFi connection
- Credentials.vue: Disable verify button when input empty, add
  disabled styles

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 10:49:26 +00:00
Dorian
1ca83f97ec fix: polish error handling across frontend views
- Server.vue: Add user feedback for disk cleanup and restart operations
- Credentials.vue: Add clipboard fallback, better identity load error handling
- Federation.vue: Add clipboard fallback for invite code copy
- ContainerApps.vue: Wrap polling intervals in try-catch to prevent
  unhandled promise rejections from background refresh

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 10:44:56 +00:00
Dorian
1a07862559 fix: add loading state to Cloud file counts
All 30 UX audit findings verified resolved. Added the last missing
loading indicator for Cloud.vue file count fetching. All P0, P1, and P2
items from docs/ux-audit-2026-03.md are now addressed across Login,
Home, Apps, Server, Chat, Federation, Credentials, Settings, Marketplace,
Web5, SystemUpdate, and Cloud views.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 10:40:26 +00:00
Dorian
754763d9cd docs: complete UX audit of all 12 pages
Found 30 issues: 3 P0 (broken), 13 P1 (confusing), 14 P2 (polish).
Key findings: Apps empty state hardcoded off, credentials parse error,
persistent unhealthy banners, dead links, no-op buttons, silent failures.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 10:13:36 +00:00
Dorian
149a216590 chore: mark PREREL-04 complete
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 10:09:29 +00:00
Dorian
36e1fd0727 chore: write v0.8.0-rc1 changelog
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 10:08:51 +00:00
Dorian
8e0b938dc0 test: fix and run visual regression screenshot suite for all 12 pages
Fixed splash screen blocking login (set localStorage before navigation),
replaced full page reloads with in-page pushState navigation to preserve
SPA session, added page-specific content waits for reliable screenshots.
Increased Playwright timeout to 60s. Baseline screenshots captured for:
login, home, apps, marketplace, cloud, network, web5, settings, chat,
federation, credentials, system update.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 10:06:54 +00:00
Dorian
bc879b3581 fix: add dev-mode warnings to all 24 silent catch blocks
Every empty/comment-only catch block now logs a descriptive warning
in dev mode via `if (import.meta.env.DEV) console.warn(...)`. Covers
15 files across views, stores, components, and utils. Zero silent
catches remaining.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 00:58:55 +00:00
Dorian
7a7cbf1da3 docs: record quality baseline — 22 silent catches, 78 console stmts, 15 any types
41 tests passing, type-check and build clean. This becomes the
regression target — counts must only go down.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 00:56:51 +00:00
Dorian
5bad457922 fix: remove wildcard CORS from nginx electrs-status, verify security headers
Security headers already present in nginx config (X-Content-Type-Options,
X-Frame-Options, CSP, Referrer-Policy, Permissions-Policy). Removed
Access-Control-Allow-Origin: * from electrs-status — CORS is now handled
by the backend with origin validation. Deployed and verified all headers.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 00:54:41 +00:00
Dorian
2bfc36baa0 fix: restrict CORS to same-origin with explicit origin validation
Replace blanket cors_origin() with validate_origin() that checks the
incoming Origin header against allowed origins (host IP + dev server).
Unknown origins no longer receive Access-Control-Allow-Origin headers.
Also added X-CSRF-Token to allowed CORS headers.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 00:53:51 +00:00
Dorian
a7653d4c8b feat: implement CSRF protection on RPC layer
Double-submit cookie pattern: backend generates csrf_token cookie on login
(non-HttpOnly so JS can read it), validates X-CSRF-Token header matches
cookie on all authenticated RPC calls. Returns 403 if missing/mismatched.
Frontend reads cookie and sends header automatically.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 00:46:52 +00:00
Dorian
b9efd1b3d0 feat: add Network Interfaces section and WiFi scan modal to Server.vue
Shows detected physical interfaces (ethernet/wifi) with IP, MAC, and
status. WiFi scan button opens a modal with signal strength bars and
password-protected connection flow. Uses network.list-interfaces and
network.scan-wifi RPC endpoints.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 00:35:55 +00:00
Dorian
d26b95e256 feat: add network interface management RPC endpoints
Add network.list-interfaces, network.scan-wifi, network.configure-wifi,
and network.configure-ethernet endpoints using ip and nmcli commands.
Includes input validation to prevent command injection. Deployed and
verified — list-interfaces returns real interface data.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 00:34:17 +00:00
Dorian
fce67baa9c feat: add system stats card to Dashboard with CPU/RAM/Disk gauges
Full-width card with color-coded progress bars (green <70%, orange
70-90%, red >90%) and uptime display. Calls system.stats RPC on
mount and refreshes every 30s. Deployed and verified.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 00:24:59 +00:00
Dorian
e12a50f938 feat: add system monitoring RPC endpoints (system.stats, system.processes, system.temperature)
Read real metrics from /proc/stat, /proc/meminfo, /proc/uptime, /proc/loadavg,
df, ps, and /sys/class/thermal/. CPU usage computed via dual-sample jiffies.
Deployed and verified on live server — all three endpoints return real data.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 00:22:57 +00:00
Dorian
5dbc29d19c feat: replace fake Web3 card data with Coming Soon badges
The Web3 card showed hardcoded values (3 active, Valid, 2.4 GB, 1
configured) for features that don't exist yet. Replace with subtle
"Coming Soon" pill badges to avoid misleading users.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 00:05:12 +00:00
Dorian
4874f59e1d feat: wire real RPC data to Server.vue Local Network card
Replace hardcoded values with live data from network.diagnostics and
router.list-forwards RPC calls. Add skeleton loading states and
graceful N/A fallbacks when endpoints are unavailable.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 00:04:26 +00:00
Dorian
38b29dd2fd refactor: remove duplicate network diagnostics from Settings, add link to Server page
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 00:01:15 +00:00
Dorian
76269a50fa chore: verify Web5 top bar already matches Server pattern (UI-02)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 23:59:20 +00:00
Dorian
55a12e9bec fix: replace path-option-card with glass-card in Settings.vue
Also fix TypeScript errors in test files.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 23:58:33 +00:00
Dorian
98b2c098aa test: add CI-compatible test runner script
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 23:56:10 +00:00
Dorian
0301274054 test: add identity module unit tests (9 test cases)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 23:55:11 +00:00
Dorian
615ce4f939 test: add auth and session unit tests (20 test cases)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 23:54:14 +00:00
Dorian
05ed3b7bcf test: add backend integration test scaffolding with 3 RPC tests
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 23:51:22 +00:00
Dorian
7c09c19e8e test: add router guards unit tests with 9 test cases
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 23:38:39 +00:00
Dorian
d214ba38c6 test: add container store unit tests with 8 test cases
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 23:37:41 +00:00
Dorian
fe0413a124 test: add app store unit tests with 11 test cases
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 23:36:42 +00:00