docs: v0.8.109 Phase 144 roadmap, discovery, threads, voice, onboarding

Mark Phase 144 complete and plan Phase 145. Update ARCHITECTURE,
DISCOVERY (hotkey + create listing toggle), THREADS_PANEL open restore,
VOICE filter a11y, IPC create-guild, ONBOARDING, AUTOMATED_TESTING.

Co-authored-by: Cursor <[email protected]>
This commit is contained in:
Raven Scott
2026-05-22 15:20:59 -04:00
co-authored by Cursor
parent 0ecf3a4bbe
commit 4962acd740
8 changed files with 35 additions and 9 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
# Pearcord architecture
**Current release:** v0.8.108 (desktop app `apps/pearcord`). Phase history and checklists live in [PLATFORM_ROADMAP.md](./PLATFORM_ROADMAP.md). Gap vs a centralized chat product is tracked in [PEARCORD_PARITY.md](./PEARCORD_PARITY.md).
**Current release:** v0.8.109 (desktop app `apps/pearcord`). Phase history and checklists live in [PLATFORM_ROADMAP.md](./PLATFORM_ROADMAP.md). Gap vs a centralized chat product is tracked in [PEARCORD_PARITY.md](./PEARCORD_PARITY.md).
Pearcord is a **100% peer-to-peer** community chat client on [Pear](https://pear.holepunch.to) / Bare. There is no Pearcord-operated message server: guilds, DMs, discovery listings, and bot events replicate over **Hyperswarm** topics with **protomux** framing.
+5 -1
View File
@@ -298,7 +298,11 @@ Pearcord validates itself without manual QA.
| `npm run test:join-explore-baseline-paste` | Join modal explore baseline (`JOIN_EXPLORE_BASELINE_PASTE_SMOKE_OK`) |
| `npm run test:threads-filter-prefs` | Thread filter USER_PREFS (`THREADS_FILTER_PREFS_SMOKE_OK`) |
| `npm run test:voice-roster-filter-self` | Voice filter when self in VC (`VOICE_ROSTER_FILTER_SELF_SMOKE_OK`) |
| `npm run test:boot` | `pear run` pre-run (`BOOT_OK`) then Phase 124143 smokes + `test:companion-boot` |
| `npm run test:explore-hotkey` | Explore shortcut key detection (`EXPLORE_HOTKEY_SMOKE_OK`) |
| `npm run test:create-guild-discovery-toggle` | Create guild without public listing (`CREATE_GUILD_DISCOVERY_TOGGLE_SMOKE_OK`) |
| `npm run test:threads-panel-open-restore` | Threads filter restore on panel open (`THREADS_PANEL_OPEN_RESTORE_SMOKE_OK`) |
| `npm run test:voice-roster-filter-a11y` | Voice roster count for a11y (`VOICE_ROSTER_FILTER_A11Y_SMOKE_OK`) |
| `npm run test:boot` | `pear run` pre-run (`BOOT_OK`) then Phase 124144 smokes + `test:companion-boot` |
| `npm run test:server-folder-prefs-mesh` | Live folder prefs mesh (optional; run manually — can exceed 150s on DHT) |
| `npm run test:profile` | Profile update + persist (`PROFILE_SMOKE_OK`) |
| `npm run test:e2e` | Full journey host+guest (`E2E_SMOKE_OK`) |
+4
View File
@@ -73,6 +73,10 @@ While the Explore modal is open, each `state` push with new `publicListings` or
**Join modal baseline paste (v0.8.108):** Paste `pearcord://explore?…` in **Join a server** (or `join-invite` IPC) → same as `navigate-deep-link` with `preserveBaseline`. Smoke: `npm run test:join-explore-baseline-paste`.
**Explore hotkey (v0.8.109):** `Ctrl+Shift+E` / `⌘⇧E` opens Explore (when onboarded and not typing in a field). Explore buttons show shortcut in `title`. Smoke: `npm run test:explore-hotkey`.
**Create server listing toggle (v0.8.109):** Create server modal checkbox → `create-guild` IPC `publicListing`; `createGuild({ publicListing: false })` skips `announceGuild`. Smoke: `npm run test:create-guild-discovery-toggle`.
## Explore filters (v0.6.5)
`filterPublicListings(listings, { query, sort, minMembers })` — local filter (no network):
+1
View File
@@ -23,6 +23,7 @@ JSON lines over `pear-pipe` between `ui/app.js` and `apps/pearcord/index.js`. Ha
| `navigate-deep-link` | `url` | Supports `pearcord://explore?baseline=&at=` → open Explore (v0.8.107) |
| `mark-onboarding-explore-shown` | — | Clears `onboardingExplorePending`; sets `onboardingExploreShown` pref (v0.8.108) |
| `join-invite` | `code` | Accepts `pearcord://explore?…` → deep-link explore result (v0.8.108) |
| `create-guild` | `name`, `publicListing?` | `publicListing: false` skips discovery announce (v0.8.109) |
| `create-invite` | — | Create invite for active guild |
| `select-guild` | `guildId` | Load guild + mesh |
| `select-channel` | `channelId` | Set active text channel (voice IDs join voice) |
+1 -1
View File
@@ -9,7 +9,7 @@ Pearcord onboarding is fully local — no account server.
| 1 | Welcome card + display name | `register` | `@pearcord/users` |
| 2 | Main app (no server) | `state.needsGuild` | — |
| 2b | Auto “Add a server” modal | — | Shown once when `needsGuild` |
| 3a | Create Server modal | `create-guild` | guild + default channels + member |
| 3a | Create Server modal | `create-guild` (`name`, optional `publicListing`) | guild + default channels + member; listing toggle v0.8.109 |
| 3b | Join modal (`pcd_…`) | `join-invite` | guild bootstrap from portable invite |
| 4 | #general chat | `send-message` | messages + gossip |
+20 -6
View File
@@ -413,16 +413,29 @@ When completing work, change `[ ]` → `[x]` and add a one-line note under **Cha
---
### Phase 144 — Parity polish (planned)
### Phase 144 — Parity polish (v0.8.109)
| ID | Item | Status |
|----|------|--------|
| P144-1 | Explore: keyboard shortcut `Ctrl+Shift+E` / `⌘⇧E` to open modal | [ ] |
| P144-2 | Threads: restore filter on panel open from prefs | [ ] |
| P144-3 | Voice: filter bar aria-label + live region for roster count | [ ] |
| P144-4 | Onboarding: optional “List on discovery” toggle on create server modal | [ ] |
| P144-1 | Explore: keyboard shortcut `Ctrl+Shift+E` / `⌘⇧E` to open modal | [x] |
| P144-2 | Threads: restore filter on panel open from prefs | [x] |
| P144-3 | Voice: filter bar aria-label + live region for roster count | [x] |
| P144-4 | Onboarding: optional “List on discovery” toggle on create server modal | [x] |
**Next:** Explore hotkey · threads filter restore UX · voice filter a11y · create-server listing toggle.
**Next:** ~~Explore hotkey · threads filter restore UX · voice filter a11y · create-server listing toggle~~ (Phase 144).
---
### Phase 145 — Discovery & threads UX (planned)
| ID | Item | Status |
|----|------|--------|
| P145-1 | Explore: show shortcut hint in empty guild banner | [ ] |
| P145-2 | Threads: `aria-live` when filter changes (chip selection) | [ ] |
| P145-3 | Voice: persist expanded voice roster rows in USER_PREFS | [ ] |
| P145-4 | Discovery: unlisted guild badge in server settings | [ ] |
**Next:** Explore banner hint · thread filter live region · voice roster expand prefs · unlisted badge.
---
@@ -1855,6 +1868,7 @@ When completing work, change `[ ]` → `[x]` and add a one-line note under **Cha
### Changelog
- **2026-05-22** — v0.8.109: Phase 144 — Explore `Ctrl+Shift+E` / `⌘⇧E`, threads filter restore on panel expand, voice filter `aria-live` roster count, create-server discovery listing toggle (`test:explore-hotkey`, `test:create-guild-discovery-toggle`, `test:threads-panel-open-restore`, `test:voice-roster-filter-a11y`). Phase 145 planned.
- **2026-05-22** — v0.8.108: Phase 143 — post-onboarding Explore prompt, Join modal `pearcord://explore` paste, `threadsPanelFilter` USER_PREFS, voice filter bar when self in VC (`test:onboarding-explore-prompt`, `test:join-explore-baseline-paste`, `test:threads-filter-prefs`, `test:voice-roster-filter-self`). Phase 144 planned.
- **2026-05-22** — v0.8.107: Phase 142 — thread chip focus ring, voice filter bar when occupants only, folder head full-name tooltip, `pearcord://explore?baseline&at` deep link + copy (`test:explore-baseline-deep-link`, `test:voice-roster-filter-occupancy`, `test:server-folder-head-tooltip`, `test:threads-chip-focus`). Phase 143 planned.
- **2026-05-22** — v0.8.106: Phase 141 — thread chip `aria-label` shortcuts, voice combined filter preset, folder stack color in tooltip, live Explore baseline hint refresh (`test:threads-chip-aria`, `test:voice-roster-combined-filter`, `test:discovery-baseline-live-hint`). Phase 142 planned.
+1
View File
@@ -47,6 +47,7 @@ Unread uses existing `READ_STATE` per thread channel (same as text channels).
- **Aria shortcuts (v0.8.106):** Each chip has `aria-label` (e.g. “Active threads, press 1”) and `aria-pressed`. Smoke: `npm run test:threads-chip-aria`
- **Focus ring (v0.8.107):** Active chip uses accent outline + `:focus-visible` for keyboard users. Smoke: `npm run test:threads-chip-focus`
- **Filter prefs (v0.8.108):** `setThreadsPanelFilter` writes `threadsPanelFilter` to USER_PREFS; restored on boot. Smoke: `npm run test:threads-filter-prefs`
- **Open restore (v0.8.109):** Expanding the collapsed threads panel re-sends `set-threads-panel-filter` with the saved pref so the list matches the active chip. Smoke: `npm run test:threads-panel-open-restore`
## Module
+2
View File
@@ -68,6 +68,8 @@ Per-channel overwrites apply via `pearcord-channel-permissions` (see [CHANNEL_PE
**v0.8.108:** **Self in VC** — filter bar also shows when `view.myVoiceChannelId` is set (solo in voice). Smoke: `npm run test:voice-roster-filter-self`.
**v0.8.109:** **Filter bar a11y**`role="region"` + `aria-label="Voice roster filters"`; `#voice-roster-filter-status` `aria-live="polite"` announces member count in voice. Smoke: `npm run test:voice-roster-filter-a11y`.
## Tests
- `npm run test:voice`