Profile Pulse Rewrite

August 29, 2026 · View on GitHub

Status: Phase 7 complete on mrdgh2821/feat/phase-7-background-sync
Architecture: 2026-08-22-rewrite-architecture-design.md
Implementation spec: 2026-08-22-rewrite-implementation-spec.md
Human plan: profile-pulse-app.md

Vision

Cross-platform desktop + web PWA app that keeps device/cloud contacts updated with profile pictures from social and web platforms. App-owned vdir contact store; Google / Outlook / CardDAV are sync adapters. Profile pictures come from built-in and user profile pic source plugins (WASM).

Phase overview

PhaseNameOutcomePlan
0FoundationWorkspace, core types, desktop vdir + SQLite indexphase-0
1Desktop UI shellDioxus desktop: profiles, contact search/list, details (read-only)TBD
2Built-in pic sourcesPic source plugin API/host + Gravatar, GitHub, GitLabDone
3WASM pic sourcesWASM loader, sample .pp-pic-source-plugin, manager UIDone
4Backup & import/exportPre-write backup UI, aggregate VCF, profile bundleDone
5Cloud syncGoogle + CardDAV push/pull, per-contact sync buttonDone
6Web PWADioxus web, OPFS storage backendDone
7Background syncRemote-change polling, pull prompts, conflict UIDone
8Release readinessClippy clean rewrite crates, docs sync, Phase 6 closureIn progress

Phase 0 — Foundation

  • Cargo workspace with profile-pulse-core, profile-pulse-storage
  • Legacy Iced app moved to legacy/iced-app (no new features)
  • Domain model: Contact, Profile, IDs, sync enums
  • vCard read/write via vCard 3.0 mapping (core vcard module)
  • Desktop vdir: profiles/<slug>/contacts/<uuid>.vcf
  • SQLite contact search index
  • Pre-write profile snapshot backup
  • ContactService::update_contact orchestration
  • Workspace tests passing (cargo test --workspace; legacy crate warnings allowed)

Phase 1 — Desktop UI shell

  • profile-pulse-app crate with Dioxus 0.7 desktop feature
  • Profile picker and create-profile flow
  • Contact search bar wired to ContactIndex::search
  • Contact list view
  • Contact details tab (read-only)
  • Placeholder tabs for editor and pic selector

Phase 2 — Built-in profile pic sources

  • profile-pulse-pic-source-plugin-api crate
  • profile-pulse-pic-source-plugin-host with BuiltinRuntime
  • Built-in: profile-pulse.builtin.gravatar-pic-source
  • Built-in: profile-pulse.builtin.github-pic-source
  • Built-in: profile-pulse.builtin.gitlab-pic-source
  • Pic selector tab: discover + preview + apply via ContactService::apply_profile_pic
  • Website link convenience actions in pic selector

Phase 3 — WASM profile pic sources

  • .pp-pic-source-plugin manifest parser (kind = "profile-pic-source")
  • Desktop WasmRuntime (wasmtime)
  • Sample plugin sample-hello-pic-source
  • Settings → Profile pic sources: list, enable/disable, install from file
  • Capability approval on install

Phase 4 — Backup & import/export

  • Contact editor tab (full CRUD)
  • VCF file import
  • Aggregate VCF export
  • Profile import/export bundle
  • Scheduled backup settings (desktop)
  • Backup browser UI

Phase 5 — Cloud sync

  • profile-pulse-sync crate
  • OAuth PKCE for Google Contacts
  • CardDAV adapter (app password / token)
  • Push-only default; explicit pull action
  • Per-contact Sync button
  • Multi-target link on profile create

Phase 6 — Web PWA

Reference: DIOXUS.md (aligned with Dioxus 0.7 getting started)

  • Dioxus web target build (cargo build --target wasm32-unknown-unknown --no-default-features --features web)
  • OpfsVdirBackend + WebContactIndex
  • Passphrase-encrypted secret vault (PROFILE_PULSE_VAULT_PASSPHRASE + localStorage)
  • Dioxus.toml + dx workflow documented (dx serve --platform web from crates/app)
  • Built-in pic sources on web (web_host); user WASM plugin install deferred to v1.1

Phase 7 — Background sync & conflicts

  • 15-minute remote-change poll while app active
  • Pull prompt listing changed targets
  • Per-contact conflict resolution: Keep local / Take remote / Review

Phase 8 — Release readiness

  • cargo clippy -D warnings clean on rewrite crates (core, storage, sync, app, pic-source-plugin-*)
  • Workspace tests passing (cargo test --workspace)
  • Phase 0 clippy clean for legacy/iced-app (optional; frozen crate)
  • ROADMAP status and Phase 6 closure documented

Explicitly out of scope (v1)

  • Mobile native apps
  • OS address book sync (desktop Linux / Windows / macOS)
  • Static hosting automation (GitHub Pages, CI deploy pipelines)
  • Native desktop user pic source plugins (v1.1)
  • Profile pic source marketplace / signing
  • User-installable sync plugins
  • Server-side backend for web

Legacy code

The pre-rewrite Iced application lives in legacy/iced-app/. It is frozen — all new work uses the workspace crates under crates/.