123 Commits

Author SHA1 Message Date
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
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
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
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
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
Dorian
5b08aa515d test: add RPC client unit tests with 13 test cases
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 23:35:26 +00:00
Dorian
e6cd18d8ea test: install Vitest and configure frontend test runner
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 23:34:14 +00:00
Dorian
d69c0d6724 changes for build for sxsw 2026-03-10 23:29:05 +00:00
Dorian
dbd4cf59d2 fix: skip JSON body parsing for filebrowser upload routes
express.json() middleware was consuming the binary file body before the
upload handler could drain it, causing 404/parse errors on file uploads.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 21:27:26 +00:00
Dorian
62cdddfab0 fix: ensure client_max_body_size 0 via entrypoint script
The entrypoint now injects client_max_body_size 0 at runtime if missing,
as a safety net against Docker layer caching of the nginx config.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 20:21:01 +00:00
Dorian
718dceb0ca fix: set client_max_body_size 0 at http level in demo nginx
Location-level override wasn't sufficient. Setting at http block
disables the body size limit globally for the demo.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 20:13:14 +00:00
Dorian
a6c1820a83 fix: mobile onboarding viewport + filebrowser demo fixes
Onboarding:
- Fixed viewport to use dvh units with position:fixed container
- All views use scrollable glass containers that fit within viewport
- Responsive typography and spacing (mobile-first breakpoints)
- Tighter padding/margins on small screens
- RootRedirect checks localStorage first for instant redirect
- Spinner only appears after 500ms delay to avoid flash

Filebrowser:
- Fix CloudFolder null initialPath crash (watch both useNativeUI + section)
- Remove unused `host` computed (was causing TS error)
- Add mock GET /app/filebrowser/ landing page
- Increase express.json limit to 50mb

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 19:32:28 +00:00
Dorian
4bc0c4b483 fix: use proxy paths for filebrowser URLs to avoid mixed content on HTTPS
Mock backend lan-address now uses localhost so hostname replacement works
correctly. CloudFolder external URLs use origin-relative proxy paths.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 18:49:20 +00:00
Dorian
e7b1a772b7 fix: demo filebrowser uploads — increase nginx body size limit and add mock handlers
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 18:12:28 +00:00
Dorian
a2aa9657b1 fix: prevent My Apps crash when installing apps + add filebrowser to demo
The My Apps page went blank after installing apps because pkg['static-files'].icon
was accessed without optional chaining on dynamically installed packages that lack
the static-files property.

- Make static-files optional in PackageDataEntry type
- Add defensive ?.icon access with fallback in Apps.vue and AppDetails.vue
- Add filebrowser to mock backend staticDevApps (enables Cloud page in demo)
- Expand portMappings and marketplaceMetadata for all marketplace apps
- installPackage now uses staticApp() format for consistent data shape

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 17:09:59 +00:00
Dorian
9c7ffbb263 feat: enrich mock backend for demo — add all missing RPC handlers and demo data
Fixes "Method not found: identity.create" on demo onboarding. Adds handlers
for all identity, nostr, content, network, router, and peer RPC methods so
no method-not-found errors occur anywhere in the demo. Expands marketplace
from 2 to 12 apps, adds 5 static dashboard apps, randomizes metrics, and
populates peer/message data for a richer demo experience.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 13:03:53 +00:00
Dorian
0fb373273a fix: disable HTTP keep-alive and update nginx proxy config
- Set http1_keep_alive(false) on hyper server to prevent connection
  reuse issues with nginx reverse proxy
- Clean up nginx proxy config: remove upstream block, use direct
  proxy_pass to 127.0.0.1:5678
- Update AppLauncherOverlay and appLauncher store with UI fixes

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 09:54:15 +00:00
Dorian
e3aa95a103 fix: prevent tokio runtime deadlock in credential issue/verify
The credential issuance and verification handlers used
Handle::block_on() directly inside the tokio runtime, causing a
deadlock. Wrapped with block_in_place() to properly yield the
runtime thread.

Also completed full feature verification across all 25 test groups
(~175 checks) on live server.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 07:43:12 +00:00
Dorian
b581fb4126 fix: protocol-aware iframe vs new-tab behavior for all apps
Apps with absolute-path redirects (Jellyfin, Portainer, PhotoPrism,
OnlyOffice, Uptime Kuma, Fedimint) now correctly open in new tab on
HTTPS where subpath proxy breaks their redirects, but still use iframe
on HTTP where direct port access works fine.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 00:22:41 +00:00
Dorian
c45de13752 fix: add 6 missing apps to first-boot and fix penpot icon path
Added searxng, onlyoffice, filebrowser, nginx-proxy-manager, portainer,
and tailscale to first-boot-containers.sh so fresh ISO installs have all
marketplace apps ready. Fixed penpot icon path in Marketplace.vue to use
the correct app-icons directory.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 00:18:28 +00:00
Dorian
a5757d27f1 feat: electrs standalone install with bitcoin dependency + progress UI
- Add electrs to marketplace as standalone installable app
- Add dependency check: refuse install if no bitcoin node is running
- Use container DNS (bitcoin-knots:8332) on archy-net instead of host IP
- Auto-create bitcoin.conf with txindex + RPC on bitcoin-knots install
- Auto-build and start electrs-ui container post-install
- Show index size and estimated progress during initial sync
- Add /electrs-status and /health nginx proxy routes
- Remove Tailwind CDN from electrs-ui, use inline styles

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 02:16:02 +00:00
Dorian
825d082003 feat: add Ollama (local AI) integration for AIUI
- Create Ollama provider plugin in AIUI (ollama-provider.ts)
- Register Ollama alongside Claude in plugin system
- Auto-detect installed models via /api/tags endpoint
- Add Ollama proxy in mock backend (forwards to localhost:11434)
- Add nginx proxy rules for /aiui/api/ollama/ (both HTTP and HTTPS)
- Rebuild AIUI dist with Ollama provider included
- Qwen 2.5 Coder 3B installed on dev server via Ollama

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 01:48:23 +00:00
Dorian
00ad7a42f5 fix: map AIUI model IDs and add node-list-peers stub
- Map claude-haiku-4.5 → claude-haiku-4-5-20251001 in proxy
- Map claude-sonnet-4.5 → claude-sonnet-4-5-20250514 in proxy
- Add node-list-peers RPC stub (returns empty array)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 00:27:34 +00:00
Dorian
2938d8159b fix: strip AIUI-specific fields from Claude API proxy requests
Remove webSearch, webResults, context fields before forwarding to
Anthropic API — these are AIUI-internal and cause 400 errors.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 00:21:38 +00:00
Dorian
4bbae540ed fix: workbox precache conflict + clean up duplicate API routes
- Exclude assets/icon/** from workbox globPatterns (already in includeAssets)
- Remove duplicate /api/* and /aiui/api/web-search routes

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 00:02:37 +00:00
Dorian
255d0c2a78 chore: rebuild AIUI dist + add TMDB/API catch-all stubs for demo
- Rebuild AIUI with latest changes (haiku model fix, recipe panel, image fallbacks)
- Add /api/tmdb/* stub returning empty results
- Add /api/* catch-all returning JSON 404 (prevents HTML fallback errors)
- Improve Claude proxy error messages (include err.code fallback)
- Strip film images from dist to keep under 5MB

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 23:58:08 +00:00
Dorian
fabc7c78f7 fix: add web search stub and API catch-all for demo deployment
- Add /api/web-search stub returning empty results in demo mode
- Add /aiui/api/* catch-all returning JSON 404 instead of HTML fallback
- Fix nginx proxy to catch all /api/ routes (not just /aiui/api/web-search)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 23:24:27 +00:00
Dorian
87602f7887 fix: add max_tokens default and mock web-search endpoint for demo
- Inject max_tokens: 4096 in Claude API proxy when AIUI omits it
- Add /aiui/api/web-search stub returning empty results (no search backend in demo)
- Add nginx proxy rule for web-search endpoint

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 23:22:30 +00:00
Dorian
f8e5e947ec fix: route Claude API through backend instead of nginx envsubst
- Add Claude API proxy in mock-backend.js (reads ANTHROPIC_API_KEY from env)
- Supports SSE streaming via pipe
- Move ANTHROPIC_API_KEY to backend service in docker-compose.demo.yml
- Remove envsubst from entrypoint (no longer needed)
- nginx-demo.conf proxies /aiui/api/claude/ to backend

This fixes the 401 error when Portainer doesn't pass env vars to
nginx correctly — the Node.js backend reads process.env directly.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 23:07:38 +00:00
Dorian
08eb3b61e0 feat: add mock FileBrowser API and WebSocket fixes for demo
- Mock FileBrowser endpoints: login, list directories, read text files
- Demo content: Music (17 tracks), Documents, Photos, Videos
- Proxy /app/filebrowser/ to backend in nginx-demo.conf
- Add node-messages-received RPC stub (stops console errors)
- WebSocket heartbeat every 45s (prevents 60s disconnect loop)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 22:50:05 +00:00
Dorian
95a3687f0a fix: add missing RPC methods and WebSocket heartbeat to mock backend
- Add node-messages-received, node.messages, node.notifications stubs
- Send WebSocket heartbeat every 45s to prevent client disconnect at 60s

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 22:36:45 +00:00
Dorian
39cf5f2a2b feat: update AIUI dist (guide as default route) + fix marketplace heading clip
- Rebuild AIUI with guide page as default route (/ -> guide, /chat -> chat)
- Content and context panels start empty
- Fix App Store heading clipped by removing double md:-mt-4 negative margins

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 21:49:08 +00:00
Dorian
35be32711f fix: quote API key header in nginx-demo.conf to prevent empty-value crash
- Wrap ${ANTHROPIC_API_KEY} in quotes so envsubst produces valid nginx
  directive even when the variable is empty
- Skip Docker container polling when runtime is unavailable (stops
  log spam in demo/Portainer deployments)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 20:53:02 +00:00
Dorian
3613ca9325 fix: revert nginx.conf to non-demo config, finalize demo compose
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 20:02:53 +00:00
Dorian
1427dd47a3 feat: demo deployment with AIUI chat, SSH key auth, Quick Start fix
- Add AIUI pre-built dist to demo/ for Portainer deployment
- Add nginx-demo.conf with Claude API proxy (envsubst for API key)
- Add docker-entrypoint.sh for runtime API key injection
- Update Dockerfile.web to include AIUI and Claude proxy
- Update docker-compose.demo.yml with ANTHROPIC_API_KEY env var
- Switch deploy script from sshpass to SSH key auth
- Fix Quick Start Goals animating before other cards (stagger 5, opacity guard)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 19:52:33 +00:00
Dorian
5ae8708ff5 fix: correct app icon paths and add missing icons
- Fix 9 wrong/placeholder icon paths in backend (docker_packages.rs)
- Vaultwarden, Jellyfin, PhotoPrism, Immich: placeholder → correct icons
- Grafana, Morphos, Ollama, Penpot: wrong directory → app-icons/
- InDeeHub: external URL → local icon (CSP-safe)
- Add Tor app metadata entry with new icon
- Fix InDeeHub icon in Marketplace.vue

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 18:05:25 +00:00
Dorian
589adb8b18 fix: alpha release hardening — onboarding, security, and ISO build
- Convert "Choose Your Path" screen to informative (read-only cards)
- Harden "Choose Your Setup" (gray out Coming Soon options, auto-select Fresh Start)
- Auto-fetch DID on mount with retry and auto-advance after success
- Improve backup download for mobile compatibility
- Add retry logic to verify step with graceful skip option
- Route verify → done → login for complete onboarding flow
- Add AIUI install confirmation via custom event (SEC-001)
- Add file path whitelist for AIUI file access (SEC-002)
- Add log redaction for container logs sent to AIUI (SEC-003)
- Add Secure flag to session cookie in production (SEC-004)
- Fix ISO build script to handle zstd compression errors gracefully
- Sync archipelago.service from live server

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 13:00:28 +00:00
Dorian
e55fd3baf0 feat: add TOTP 2FA, API key switcher, login progress bar, and alpha hardening plan
- TOTP 2FA: full setup/confirm/disable/login flow with Argon2id + ChaCha20-Poly1305
  encrypted secret storage, QR code generation, and bcrypt-hashed backup codes
- API key switcher: OAuth vs personal API key toggle in AIUI chat settings with
  status indicator, key validation, and help text
- Login progress bar: server startup detection with health check polling, form
  disabled until server is ready
- AI quarantine docs: comprehensive HTML page documenting all 6 security layers
- Settings: AI Data Access permission toggles with per-category control
- Alpha hardening plan: 28-task overnight automation plan across 7 phases
  (onboarding, login, app install, AIUI, UI polish, security, ISO build)
- Backlog: node discovery spatial map feature for alpha demo

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 12:23:57 +00:00
Dorian
0837b24a4b fix: replace Enable All text buttons with toggle card in AI Data Access
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 01:11:06 +00:00
Dorian
2818fe90fc fix: overhaul PWA icons with v2 suffix to bust all cache layers
- Redesign favicon SVG with gradient border matching splash screen
- Rename all icon files with -v2 suffix to bypass browser/SW/PWA caches
- Delete 9 old/duplicate icon files (~13MB removed)
- Add nginx cache-control headers for icons and manifest
- Rename assets-cache to assets-cache-v2 to orphan stale SW cache
- Update all HTML, manifest, and component icon references

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 01:11:00 +00:00
Dorian
1bb72dc87e feat: add AIUI node capabilities — file reading, log tailing, bitcoin/lnd deep data
Add readFileAsText() to filebrowser client, read-file and tail-logs action
handlers to context broker, bitcoin.getinfo and lnd.getinfo RPC enrichment
for context categories, and update AIUI protocol types.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 13:50:40 +00:00
Dorian
11cee9dc70 fix: resolve content clipping on mobile by moving tab padding to scroll container
Moves dynamic pt-20/pt-40 padding from perspective-container-wrapper (which
shrank the content area) to the inner scroll container via computed style.
Removes spacer divs in CloudFolder, AppDetails, MarketplaceAppDetails.
Reduces excessive bottom padding in Marketplace. Hides Cloud/Network tabs
in CloudFolder detail view. Teleports mobile back buttons to body to escape
CSS transform containing block.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 10:14:10 +00:00
Dorian
255b52eb6d fix: teleport mobile close button to body to escape CSS transform
The mobile close button uses position: fixed, which breaks inside
a CSS transform containing block. Wrapping in <Teleport to="body">
ensures correct fixed positioning relative to the viewport.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 08:56:23 +00:00
Dorian
0bc7251e22 feat: add container security hardening and Fedimint setup wizard
Add --cap-drop=ALL, --security-opt=no-new-privileges:true to all
non-privileged containers. Per-app capability grants for apps needing
CHOWN/SETUID/SETGID. Read-only root filesystem with tmpfs for
compatible apps (searxng, grafana, uptime-kuma, filebrowser,
photoprism, vaultwarden). Add Fedimint "Create a Community" goal
with 4-step wizard. Fix deploy script cp -rf for audio directory.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 08:24:56 +00:00
Dorian
da3bf44cdb feat: add DID creation and copy functionality to Web5 page
Create DID button generates a did:key identity (tries backend RPC first,
falls back to client-side Web Crypto P-256 key generation). DID stored in
localStorage. Copy DID button for sharing.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 08:14:47 +00:00
Dorian
36627ae1ac feat: wire context broker files category to FileBrowser, fix media state check
- sanitizeFiles() now fetches real data from FileBrowser (usage, folders, recent files)
- Fixed media state check to include 'running' and 'stopped' states, not just 'installed'
- Removed unused bottomPosition variable in CloudFolder.vue

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 08:09:45 +00:00