Commit Graph
13 Commits
Author SHA1 Message Date
nmemmertandClaude Sonnet 4.6 99efd4be55 docs: update README for P-256 ECDH, first admin setup, release filenames
Build & Release / Docker / backend (push) Successful in 1m32s
Build & Release / Docker / frontend (push) Successful in 1m32s
Build & Release / Desktop / Linux & Windows (push) Successful in 18m38s
Build & Release / Deploy to server (push) Successful in 2m49s
Build & Release / Create release (push) Has been skipped
- Replace X25519 references with ECDH P-256 throughout encryption model
- Expand first admin user section: register normally, promote via SQL,
  then manage further admins through the UI
- Update desktop install table with actual DMG filenames and Mac entries

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-28 11:44:03 -04:00
nmemmertandClaude Sonnet 4.6 7351f9048a fix: replace X25519 with ECDH P-256 for Electron compatibility
Build & Release / Docker / backend (push) Has been cancelled
Build & Release / Docker / frontend (push) Has been cancelled
Build & Release / Desktop / Linux & Windows (push) Has been cancelled
Build & Release / Deploy to server (push) Has been cancelled
Build & Release / Create release (push) Has been cancelled
X25519 Web Crypto support is not available in Electron's Chromium build
despite being in Chrome 113+. P-256 ECDH is universally supported across
all browsers and Electron versions with equivalent security.

- Replace { name: 'X25519' } with { name: 'ECDH', namedCurve: 'P-256' }
  throughout the keypair generation, sealing, and opening functions
- Wire format updated: ephemeral pub key grows from 32 to 65 bytes
  (uncompressed P-256 point: 0x04 || x || y)
- Existing accounts with X25519 keys must re-register

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-28 11:41:11 -04:00
nmemmertandClaude Sonnet 4.6 84ff218a30 fix: support both docker compose (v2) and docker-compose (v1) in deploy
Build & Release / Docker / backend (push) Successful in 1m7s
Build & Release / Docker / frontend (push) Successful in 1m14s
Build & Release / Desktop / Linux & Windows (push) Successful in 18m15s
Build & Release / Deploy to server (push) Successful in 18s
Build & Release / Create release (push) Has been cancelled
The target server has Docker Compose V1 (standalone binary) not the V2
plugin, so 'docker compose' fails. Detect which is available at runtime
and use the appropriate command.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-28 11:27:03 -04:00
nmemmertandClaude Sonnet 4.6 3e89775e60 fix: downgrade upload/download-artifact to v3 for Gitea Actions compatibility
Build & Release / Docker / backend (push) Has been cancelled
Build & Release / Docker / frontend (push) Has been cancelled
Build & Release / Desktop / Linux & Windows (push) Has been cancelled
Build & Release / Deploy to server (push) Has been cancelled
Build & Release / Create release (push) Has been cancelled
actions/upload-artifact@v4 uses a new artifact API that requires
specific runner-side configuration not present in all act_runner setups.
v3 uses the simpler API that works reliably with self-hosted Gitea runners.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-28 11:24:55 -04:00
nmemmertandClaude Sonnet 4.6 334d0d519f chore: add generated icon assets (icns, png, tray) for desktop app
Build & Release / Docker / backend (push) Has been cancelled
Build & Release / Docker / frontend (push) Has been cancelled
Build & Release / Desktop / Linux & Windows (push) Has been cancelled
Build & Release / Deploy to server (push) Has been cancelled
Build & Release / Create release (push) Has been cancelled
Rendered from icon.svg using qlmanage + sips + iconutil on macOS.
Required by electron-builder for all three platforms.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-28 11:16:42 -04:00
nmemmertandClaude Sonnet 4.6 d7771aef1f fix: add repository/author to desktop package.json, use --publish never in CI
Build & Release / Docker / backend (push) Successful in 1m5s
Build & Release / Docker / frontend (push) Successful in 4m26s
Build & Release / Desktop / Linux & Windows (push) Failing after 13m30s
Build & Release / Create release (push) Has been cancelled
Build & Release / Deploy to server (push) Has been cancelled
electron-builder auto-detects CI and tries to publish to a release,
requiring a repository field and failing when none is found.
- Add repository and author fields to desktop/package.json
- Pass --publish never to electron-builder in the workflow so it builds
  installers without attempting any publish step

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-28 11:03:47 -04:00
nmemmertandClaude Sonnet 4.6 e2d9bf1514 fix: resolve TypeScript 5.5 Uint8Array generic errors and missing vite/client types
Build & Release / Docker / frontend (push) Has been cancelled
Build & Release / Desktop / Linux & Windows (push) Has been cancelled
Build & Release / Deploy to server (push) Has been cancelled
Build & Release / Create release (push) Has been cancelled
Build & Release / Docker / backend (push) Has been cancelled
TS 5.5 made typed arrays generic — Uint8Array now defaults to
Uint8Array<ArrayBufferLike>, which no longer satisfies Web Crypto's
BufferSource (requires ArrayBufferView<ArrayBuffer>).

- Add u8() helper that wraps .slice() results in new Uint8Array(),
  producing Uint8Array<ArrayBuffer> throughout crypto/index.ts
- Annotate all Uint8Array parameters/returns with <ArrayBuffer>
- Add 'vite/client' to tsconfig types so import.meta.env is recognized
- ws.ts: change socket.on() cleanup return to void (fixes useEffect type)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-28 10:56:34 -04:00
nmemmertandClaude Sonnet 4.6 d92e899fc7 docs: comprehensive README covering architecture, encryption model, deployment, CI/CD, and desktop app
Build & Release / Docker / backend (push) Has been cancelled
Build & Release / Docker / frontend (push) Has been cancelled
Build & Release / Desktop / Linux & Windows (push) Has been cancelled
Build & Release / Deploy to server (push) Has been cancelled
Build & Release / Create release (push) Has been cancelled
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-28 10:48:46 -04:00
nmemmertandClaude Sonnet 4.6 66973da859 chore: add package-lock.json files required for npm ci in Docker builds
Build & Release / Docker / backend (push) Successful in 2m28s
Build & Release / Docker / frontend (push) Failing after 3m16s
Build & Release / Desktop / Linux & Windows (push) Failing after 10m50s
Build & Release / Deploy to server (push) Has been skipped
Build & Release / Create release (push) Has been cancelled
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-28 10:46:07 -04:00
nmemmertandClaude Sonnet 4.6 2823b8e10e feat: Gitea Actions CI/CD, Docker registry images, drive drag-and-drop
Build & Release / Docker / backend (push) Failing after 1m31s
Build & Release / Docker / frontend (push) Failing after 1m42s
Build & Release / Deploy to server (push) Has been cancelled
Build & Release / Create release (push) Has been cancelled
Build & Release / Desktop / Linux & Windows (push) Has been cancelled
- Add .gitea/workflows/docker-build.yml: builds backend and frontend
  Docker images on every push, pushes to Gitea Container Registry
  (git.necloud.us/nate/cloudlink/{backend,frontend}:latest + SHA tag)
- Add desktop build job: Linux AppImage and Windows NSIS installer via
  Wine cross-compilation, uploaded as workflow artifacts
- Add release job: creates a Gitea release with installers attached when
  a v* tag is pushed
- Add deploy job: SSH pull + restart on pushes to master
- docker-compose.yml: add image: fields alongside build: so the server
  can pull pre-built images with docker compose pull
- DrivePage: add drag-and-drop upload with full-screen drop overlay;
  refactor upload logic into a shared uploadFile callback

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-28 10:41:39 -04:00
nmemmertandClaude Sonnet 4.6 9b57dd9b94 feat: real-time messaging, Electron desktop app, admin drive portal
Messaging:
- Optimistic UI: message appears instantly in sender's view on send
- Skip WS relay-back of own messages to avoid duplicates
- Fix sent_at field name mismatch (sentAt → sent_at fallback)

Admin portal:
- /admin route: list all users, storage used vs quota, file count
- Inline-edit per-user storage quota (MB) and admin flag
- Stats header: total users, total storage, total files
- is_admin + storage_quota_mb columns added to users table
- Login response now includes isAdmin; sidebar shows Admin link for admins
- requireAdmin middleware on all /admin/* routes

Electron desktop app (desktop/):
- BrowserWindow with native title bar, system tray, hide-to-tray on close
- First-run setup dialog to configure self-hosted server URL
- Persists server URL via electron-store
- Tray menu: Open, Change server URL, Quit
- IPC: showNotification for future native push notifications
- electron-builder config for macOS (DMG), Windows (NSIS), Linux (AppImage)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-28 10:31:41 -04:00
nmemmertandClaude Sonnet 4.6 46f0a4b71e feat: X25519 ECDH sealed-box E2E encryption, zero-knowledge key exchange
- Replace libsodium with pure Web Crypto X25519 ECDH for key exchange
- Sealed-box pattern: ephemeral keypair + HKDF + AES-256-GCM for each recipient
- Store encrypted conversation key per-user so each party decrypts with their own private key
- PBKDF2-derived master key wraps X25519 private key (pkcs8) server-side for cross-device login
- Fix health endpoint ordering so it never hits auth middleware (401 bug)
- Fix postgres port exposure in docker-compose for backend connectivity
- Fix DrivePage react-query v5 onSuccess → useEffect migration
- Fix MessagesPage: use <Link> instead of <a href> to avoid page reload losing in-memory keys
- Fix formatDistanceToNow crash on WebSocket messages lacking sent_at (add fallback + null guard)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-28 10:10:40 -04:00
nmemmertandClaude Sonnet 4.6 937bf8ad2d Initial CloudLink scaffold: E2E encrypted PWA with messaging and cloud drive
- Zero-knowledge architecture: all encryption/decryption client-side via Web Crypto API
- AES-GCM 256 for messages, files, and key wrapping; PBKDF2 for password-based key derivation
- Node.js/TypeScript backend: JWT auth with refresh rotation, argon2id passwords, TOTP 2FA
- PostgreSQL schema: encrypted blobs only, server never stores plaintext
- Real-time messaging via WebSocket relay (server routes ciphertext, cannot read it)
- Encrypted file upload/download with per-file keys wrapped by user master key
- React PWA frontend: Vite + Tailwind + service worker for offline support
- Docker Compose: postgres + backend + frontend + nginx with TLS

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-28 09:41:18 -04:00