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
| Phase | Name | Outcome | Plan |
|---|---|---|---|
| 0 | Foundation | Workspace, core types, desktop vdir + SQLite index | phase-0 |
| 1 | Desktop UI shell | Dioxus desktop: profiles, contact search/list, details (read-only) | TBD |
| 2 | Built-in pic sources | Pic source plugin API/host + Gravatar, GitHub, GitLab | Done |
| 3 | WASM pic sources | WASM loader, sample .pp-pic-source-plugin, manager UI | Done |
| 4 | Backup & import/export | Pre-write backup UI, aggregate VCF, profile bundle | Done |
| 5 | Cloud sync | Google + CardDAV push/pull, per-contact sync button | Done |
| 6 | Web PWA | Dioxus web, OPFS storage backend | Done |
| 7 | Background sync | Remote-change polling, pull prompts, conflict UI | Done |
| 8 | Release readiness | Clippy clean rewrite crates, docs sync, Phase 6 closure | In 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
vcardmodule) - Desktop vdir:
profiles/<slug>/contacts/<uuid>.vcf - SQLite contact search index
- Pre-write profile snapshot backup
-
ContactService::update_contactorchestration - Workspace tests passing (
cargo test --workspace; legacy crate warnings allowed)
Phase 1 — Desktop UI shell
-
profile-pulse-appcrate 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-apicrate -
profile-pulse-pic-source-plugin-hostwithBuiltinRuntime - 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-pluginmanifest 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-synccrate - 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+dxworkflow documented (dx serve --platform webfromcrates/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 warningsclean 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/.
Related docs
- DEVELOPMENT.md — setup and commands
- Brainstorming notes — decision log