Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
95 changes: 95 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -327,6 +327,45 @@ jobs:
working-directory: apps/desktop/src-tauri
run: cargo check --no-default-features --features fuse

cargo-check-linux:
name: Cargo Check (Linux)
needs: [changes, lint]
if: |
!failure() && !cancelled() &&
(github.event_name == 'push' || needs.changes.outputs.desktop == 'true')
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4

- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y \
libwebkit2gtk-4.1-dev \
libayatana-appindicator3-dev \
librsvg2-dev \
libssl-dev \
libxdo-dev \
libfuse3-dev \
pkg-config \
build-essential

- name: Install Rust toolchain
run: rustup default stable

- uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
apps/desktop/src-tauri/target
key: linux-cargo-${{ hashFiles('apps/desktop/src-tauri/Cargo.lock') }}
restore-keys: linux-cargo-

- name: Cargo check with fuse feature
working-directory: apps/desktop/src-tauri
run: cargo check --no-default-features --features fuse

build-desktop-windows:
name: Build Windows Desktop
needs: [changes, cargo-check-windows, typecheck]
Expand Down Expand Up @@ -428,3 +467,59 @@ jobs:
projectPath: apps/desktop
tauriScript: pnpm tauri
args: -- --no-default-features --features fuse

build-desktop-linux:
name: Build Linux Desktop
needs: [changes, cargo-check-linux, typecheck]
if: |
!failure() && !cancelled() &&
(github.event_name == 'push' || needs.changes.outputs.desktop == 'true')
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4

- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y \
libwebkit2gtk-4.1-dev \
libayatana-appindicator3-dev \
librsvg2-dev \
libssl-dev \
libxdo-dev \
libfuse3-dev \
pkg-config \
build-essential

- name: Install Rust toolchain
run: rustup default stable

- uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
apps/desktop/src-tauri/target
key: linux-cargo-${{ hashFiles('apps/desktop/src-tauri/Cargo.lock') }}
restore-keys: linux-cargo-

- uses: pnpm/action-setup@v4
with:
version: 10

- uses: actions/setup-node@v4
with:
node-version: '22'
cache: 'pnpm'

- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Build crypto package
run: pnpm --filter @cipherbox/crypto build

- uses: tauri-apps/tauri-action@v0
with:
projectPath: apps/desktop
tauriScript: pnpm tauri
args: -- --no-default-features --features fuse
4 changes: 2 additions & 2 deletions .planning/REQUIREMENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ Requirements for production release. Each maps to roadmap phases 12+.

### Cross-Platform Desktop

- [ ] **PLAT-01**: Linux desktop app (Tauri + AppImage/deb, FUSE mount via libfuse)
- [x] **PLAT-01**: Linux desktop app (Tauri + AppImage/deb, FUSE mount via libfuse)
- [x] **PLAT-02**: Windows desktop app (Tauri + MSI/NSIS, virtual drive via WinFsp/Dokany)

### Cross-Platform E2E Testing
Expand Down Expand Up @@ -363,7 +363,7 @@ Which phases cover which requirements. Updated during roadmap creation.
| SYNC-05 | Phase 16 | Pending |
| SYNC-06 | Phase 16 | Pending |
| TEE-06 | Phase 17 | Pending |
| PLAT-01 | Phase 11.3 | Pending |
| PLAT-01 | Phase 11.3 | Complete |
| PLAT-02 | Phase 11 | Complete |
| E2E-01 | Phase 11.4 | Pending |
| E2E-02 | Phase 11.4 | Pending |
Expand Down
15 changes: 11 additions & 4 deletions .planning/ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ See `.planning/archive/m1-ROADMAP.md` for full M1 phase details and plan lists.

- [x] **Phase 11: Windows Desktop** - Windows desktop app with WinFsp virtual filesystem (Tauri + NSIS installer)
- [x] **Phase 11.1: macOS Desktop Catch-Up** - Close all desktop gaps from Phases 12-12.6 before cross-platform expansion (INSERTED)
- [ ] **Phase 11.3: Linux Desktop** - Linux desktop app with libfuse FUSE mount (Tauri + AppImage/deb) (INSERTED)
- [x] **Phase 11.3: Linux Desktop** - Linux desktop app with libfuse FUSE mount (Tauri + AppImage/deb) (INSERTED)
- [ ] **Phase 11.4: Cross-Platform E2E Testing** - Validate each desktop client against API/web with native Postgres + IPFS per runner (INSERTED)
- [x] **Phase 12: Core Kit Identity Provider Foundation** - Replace PnP Modal SDK with MPC Core Kit, CipherBox as identity provider
- [x] **Phase 12.1: AES-CTR Streaming Encryption** - AES-256-CTR for media files with byte-range decryption and in-browser playback (INSERTED)
Expand Down Expand Up @@ -105,13 +105,20 @@ Plans:
**Goal**: CipherBox desktop app runs on Linux with native FUSE filesystem integration via libfuse, full feature parity with macOS and Windows (system tray, credential storage, background sync, auto-start, headless mode)
**Depends on**: Phase 11 (Windows Desktop — platform abstraction layer reused), Phase 11.1 (macOS catch-up), Phase 11.2 (v1 removal)
**Requirements**: PLAT-01
**Research flag**: NEEDS `/gsd:research-phase` -- Linux FUSE (libfuse) packaging differences from macOS fuser, AppImage/deb packaging, Linux system tray (libappindicator vs StatusNotifierItem), Linux keyring (Secret Service API), CI Linux runner requirements
**Research flag**: COMPLETE -- fuser crate reuse confirmed, Linux mount options/unmount, keyring Secret Service API, Tauri Linux bundling (deb+AppImage), CI system dependencies researched
**Success Criteria** (what must be TRUE):

1. Linux user can install CipherBox via AppImage or .deb, log in, and access a FUSE mount at ~/CipherBox
2. Background sync, system tray, and keyring storage work on Linux (parity with macOS/Windows)
3. CI builds and packages Linux desktop app (adds to existing macOS + Windows matrix)
**Plans**: TBD

**Plans:** 3 plans

Plans:

- [x] 11.3-01-PLAN.md — Rust code: Linux cfg gates for mount options, unmount, tray, registry, platform special files + .cargo/config.toml + Cargo.toml keyring feature
- [x] 11.3-02-PLAN.md — tauri.conf.json Linux bundle config (deb + AppImage) + CI workflow (cargo-check-linux + build-desktop-linux jobs)
- [x] 11.3-03-PLAN.md — Local build, run, and UAT against staging API (cargo build, FUSE mount, file ops, tray, keyring, sync)

### Phase 11.4: Cross-Platform E2E Testing (INSERTED)

Expand Down Expand Up @@ -503,7 +510,7 @@ Parallel phases:
| 15.1 Client-Side Search | M2 | 3/3 | Complete | 2026-02-24 |
| 16. Advanced Sync | M2 | 0/TBD | Not started | - |
| 11. Windows Desktop | M2 | 3/3 | Complete | 2026-02-22 |
| 11.3 Linux Desktop | M2 | 0/TBD | Not started | - |
| 11.3 Linux Desktop | M2 | 3/3 | Complete | 2026-02-28 |
| 11.4 Cross-Platform E2E | M2 | 0/TBD | Not started | - |
| 17. AWS Nitro TEE | M2 | 0/TBD | Not started | - |
| 18. Billing Infrastructure | M3 | 0/TBD | Not started | - |
Expand Down
31 changes: 19 additions & 12 deletions .planning/STATE.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,24 +5,24 @@
See: .planning/PROJECT.md (updated 2026-02-11)

**Core value:** Zero-knowledge privacy - files encrypted client-side, server never sees plaintext
**Current focus:** Milestone 2 -- Phase 15.1 COMPLETE (Client-Side Search)
**Current focus:** Milestone 2 -- Phase 11.3 complete (Linux Desktop)

## Current Position

Phase: 15.1 (Client-Side Search)
Phase: 11.3 (Linux Desktop)
Plan: 3 of 3
Status: Phase complete
Last activity: 2026-02-27 -- Started todo: E2E MFA flow test coverage
Last activity: 2026-02-28 -- Completed 11.3-03-PLAN.md (local build + UAT, 18/18 pass)

Progress: [#########################] (M1 complete, M2 Phase 12 complete, Phase 12.2 complete, Phase 12.3 complete, Phase 12.3.1 complete, Phase 12.4 complete, Phase 12.5 complete, Phase 12.6 complete, Phase 12.1 complete, Phase 11.1: 7/7 COMPLETE, Phase 11.2: 3/3 COMPLETE, Phase 13: 5/5 COMPLETE, Phase 14: 6/6 COMPLETE, Phase 11: 3/3 COMPLETE, Phase 15: 4/4 COMPLETE, Phase 15.1: 3/3 COMPLETE)
Progress: [#########################] (M1 complete, M2 Phase 12 complete, Phase 12.2 complete, Phase 12.3 complete, Phase 12.3.1 complete, Phase 12.4 complete, Phase 12.5 complete, Phase 12.6 complete, Phase 12.1 complete, Phase 11.1: 7/7 COMPLETE, Phase 11.2: 3/3 COMPLETE, Phase 13: 5/5 COMPLETE, Phase 14: 6/6 COMPLETE, Phase 11: 3/3 COMPLETE, Phase 15: 4/4 COMPLETE, Phase 15.1: 3/3 COMPLETE, Phase 11.3: 3/3 COMPLETE)

## Performance Metrics

**Velocity:**

- Total plans completed: 137
- Average duration: 5.5 min
- Total execution time: 13.3 hours
- Total plans completed: 138
- Average duration: 5.6 min
- Total execution time: 15.0 hours

**By Phase (M1 summary):**

Expand All @@ -44,10 +44,11 @@ Progress: [#########################] (M1 complete, M2 Phase 12 complete, Phase
| M2 Phase 11 | 3/3 | 35 min | 11.7 min |
| M2 Phase 15 | 4/4 | 35 min | 8.8 min |
| M2 Phase 15.1 | 3/3 | 17 min | 5.7 min |
| M2 Phase 11.3 | 3/3 | 104 min | 34.7 min |

**Recent Trend:**

- Last 5 plans: 7m, 4m, 8m, 5m, 2m
- Last 5 plans: 8m, 5m, 12m, 2m, 90m
- Trend: Stable

Updated after each plan completion.
Expand Down Expand Up @@ -211,6 +212,11 @@ Recent decisions affecting current work:
| Module-level callback for cross-component search rebuild | 15.1-02 | registerRebuildCallback/triggerSearchIndexRebuild avoids prop drilling from AppShell to FileBrowser |
| Auth state transition watcher for search index cleanup | 15.1-02 | useRef tracks prev isAuthenticated; true->false triggers clearIndex; self-contained in useSearch hook |
| Unicode file type icons in search results | 15.1-02 | Terminal aesthetic consistency; no additional icon library needed |
| WinFsp resource glob left as-is for Linux builds | 11.3-02 | Placeholder MSI tracked in git; glob matches harmlessly on all platforms |
| ubuntu-22.04 pinned for Linux CI (not ubuntu-latest) | 11.3-02 | Ensures glibc 2.35 compatibility; prevents drift to 24.04 |
| AutoUnmount removed from Linux mount options | 11.3-03 | Requires user_allow_other in /etc/fuse.conf; explicit fusermount3 -u is more portable |
| FOPEN_DIRECT_IO + write_generation for O_TRUNC race | 11.3-03 | Linux kernel page cache causes stale reads after truncation; DIRECT_IO bypasses cache for written files |
| Green tray icon for Linux, icon_as_template macOS-only | 11.3-03 | Black template icons invisible on dark panels; macOS tinting does not work on Linux |

### Pending Todos

Expand Down Expand Up @@ -283,16 +289,17 @@ Recent decisions affecting current work:
- Phase 12.5 (MFA Polishing, UAT & E2E): COMPLETE -- all 3 plans done (SecurityTab wiring, wallet E2E tests, UAT final verification)
- Phase 12.6 (Per-File IPNS Metadata): COMPLETE -- all 5 plans done (crypto primitives, batch publish backend, frontend service layer, hooks & components, recovery tool + docs)
- Phase 13 (File Versioning): COMPLETE -- all 5 plans done (version entry types, creation service, desktop FUSE, version history UI, recovery tool + build verification)
- Phase 11.3 (Linux Desktop): COMPLETE -- 3/3 plans done (Rust platform support, packaging & CI, local UAT 18/18 pass)
- Phase 17 (Nitro TEE): NEEDS `/gsd:research-phase` -- Rust enclave, highest risk item

## Session Continuity

Last session: 2026-02-26
Stopped at: Completed quick task 022 (Fix MFA status detection false positive)
Last session: 2026-02-28
Stopped at: Completed 11.3-03-PLAN.md (Linux UAT 18/18 pass, Phase 11.3 complete)
Resume file: None
Next: Quick task 022 complete. Next phase TBD.
Next: All three desktop platforms validated (macOS, Windows, Linux). Ready for next phase.

---

_State initialized: 2026-01-20_
_Last updated: 2026-02-26 after quick task 022 complete (Fix MFA status detection false positive)_
_Last updated: 2026-02-28 after Phase 11.3 Plan 03 complete (Linux Local Build & UAT)_
Loading