You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit d39c62b
Browse filesBrowse the repository at this point in the historyBrowse files
Copy file name to clipboardExpand all lines: PLAN.md
+2-2Lines changed: 2 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,7 +2,7 @@
2
2
3
3
## Current Stage
4
4
5
-
Implementation is past the local-shell phase and currently sits at a DB-first, live WhatsApp client with remote history/media support, outbound text, single-attachment media send, recent-sticker send, protocol-backed read receipts, reactions with a quick picker, own-message text editing, own-message delete-for-everybody, replies, quote-jump, a right-edge reply gesture in the message pane, typing presence, hybrid fuzzy group-member mention autocomplete, accent-aware search, visible-first chat-avatar sync/rendering with full profile images, first-class sticker receive/render/download behavior, app-state-backed muted/pinned chat settings, stable pending/paused/resumed pixel overlays for media/avatar/sticker rendering, direct-chat PN/LID canonicalization plus split-thread repair, desktop notifications with cached chat-avatar icons where supported plus a local global mute key/right-side configurable status-bar indicator, immediate DB catch-up sync overlay blocking with non-blocking startup app-state sync, async store/protocol-backed TUI actions for sends, lazy loads, filters, read receipts, reactions, retries, stickers, drafts, and mentions, denormalized chat-list previews, media retry UX, first-use-state logout reset, temp-backed non-exported chat media caches, clipboard attachment paste with Windows file-drop support, a persistent in-chat new-message divider, hardened Windows inline preview defaults, composer tail-follow scrolling, detached Shift+Enter external media launch, and the planned media/export CLI helpers. The next major gaps are live validation/polish of the notification and media-send paths on real chats, especially desktop delivery on fresh Linux and Windows installs, notification backend default resolution on a fresh config, audio/document fallback behavior, the new avatar/sticker behavior under daily use, plus attachment draft persistence and follow-on resend polish for failed rows.
5
+
Implementation is past the local-shell phase and currently sits at a DB-first, live WhatsApp client with remote history/media support, outbound text, single-attachment media send, recent-sticker send, external-editor draft composition, protocol-backed read receipts, reactions with a quick picker, own-message text editing, own-message delete-for-everybody, replies, quote-jump, a right-edge reply gesture in the message pane, typing presence, hybrid fuzzy group-member mention autocomplete, accent-aware search, visible-first chat-avatar sync/rendering with full profile images, first-class sticker receive/render/download behavior, app-state-backed muted/pinned chat settings, stable pending/paused/resumed pixel overlays for media/avatar/sticker rendering, direct-chat PN/LID canonicalization plus split-thread repair, desktop notifications with cached chat-avatar icons where supported plus a local global mute key/right-side configurable status-bar indicator, immediate DB catch-up sync overlay blocking with non-blocking startup app-state sync, async store/protocol-backed TUI actions for sends, lazy loads, filters, read receipts, reactions, retries, stickers, drafts, and mentions, denormalized chat-list previews, media retry UX, first-use-state logout reset, temp-backed non-exported chat media caches, clipboard attachment paste with Windows file-drop support, a persistent in-chat new-message divider, hardened Windows inline preview defaults, composer tail-follow scrolling, detached Shift+Enter external media launch, and the planned media/export CLI helpers. The next major gaps are live validation/polish of the notification and media-send paths on real chats, especially desktop delivery on fresh Linux and Windows installs, notification backend default resolution on a fresh config, audio/document fallback behavior, the new avatar/sticker behavior under daily use, plus attachment draft persistence and follow-on resend polish for failed rows.
6
6
7
7
### Implemented now
8
8
@@ -11,7 +11,7 @@ Implementation is past the local-shell phase and currently sits at a DB-first, l
11
11
- GitHub Actions CI validates Linux tests/vet, checks the Windows build graph, uploads Windows amd64/arm64 binaries for machines where local Windows builds are not available, and publishes a stable branch-build `windows-latest` release for direct tester updates.
12
12
- SQLite-backed local state with migrations, chat/message/media/draft storage, denormalized chat previews, startup cache/mmap pragmas, stats, and FTS-backed search.
13
13
- Bubble Tea TUI with modal interaction (`normal`, `insert`, `visual`, `command`, `search`), chat list, message viewport, optional info pane, composer, filters, and help.
14
-
- Local draft persistence, local outgoing message persistence, normal/visual message yanking, text clipboard integration, clipboard image copy plus clipboard attachment paste/file-drop staging, attachment staging, message delete flow, and search routing by pane.
14
+
- Local draft persistence, external-editor draft composition through configurable `$EDITOR`/`editor`, local outgoing message persistence, normal/visual message yanking, text clipboard integration, clipboard image copy plus clipboard attachment paste/file-drop staging, attachment staging, message delete flow, and search routing by pane.
15
15
- Media backend detection and in-chat preview behavior with Unix `ueberzug++`, Windows-only `sixel`, `chafa`, compact audio playback rows, foreground and detached external media launch, plus native external open/save fallback paths. Linux auto preview uses `ueberzug++` pixel overlays before falling back to `chafa`/external openers and never selects Sixel; Windows auto preview still prefers Sixel in WezTerm when a Sixel renderer is installed, falls back to inline `chafa` before external openers when `preview_backend = "auto"`, draws Sixel out-of-band instead of embedding image escape payloads in Bubble Tea text frames, and explicit backend config wins when the requested backend is available on that platform.
16
16
- Real `whatsmeow` session store, QR login, logout, rejected-session cleanup, first-use-state local reset on logout, and `doctor` session status reporting.
17
17
- Live WhatsApp connection bootstrap from a paired session, protocol event subscription, inbound chat/message/receipt/media metadata ingestion into SQLite, DB-first UI refreshes, and visible connection state.
Copy file name to clipboardExpand all lines: README.md
+4Lines changed: 4 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -174,6 +174,7 @@ key_normal_open = "enter"
174
174
key_normal_open_media = "o"
175
175
key_normal_yank_message = "y"
176
176
key_normal_edit_message = "leader e"
177
+
key_normal_compose_editor = "leader c e"
177
178
key_normal_pick_sticker = "leader t"
178
179
key_normal_copy_image = "leader y"
179
180
key_normal_save_media = "leader s"
@@ -218,6 +219,7 @@ Useful command-mode actions:
218
219
:paste-image
219
220
:attach
220
221
:attach <path>
222
+
:compose-editor
221
223
:edit-message
222
224
:sticker
223
225
:delete-message
@@ -235,6 +237,8 @@ Useful command-mode actions:
235
237
236
238
Image clipboard paste/copy is image-only. `key_insert_paste_image` stages the current clipboard image as the composer attachment, preserving composer text as the caption. `key_normal_copy_image` copies the focused image message to the clipboard and auto-downloads remote image media first when possible. The default image clipboard commands auto-detect Wayland/X11 tools; set `clipboard_image_paste_command` or `clipboard_image_copy_command` to override them. Paste commands may write to `{path}` or stdout, and copy commands may use `{path}` and `{mime}` or receive image bytes on stdin.
237
239
240
+
External editor composition uses `key_normal_compose_editor` or `:compose-editor`. It opens the active chat draft in `editor`, writes the saved result back into the inline composer, persists it as the draft, and does not send until the normal composer send key is pressed. Editor commands are argv templates; if `{path}` is absent, vimwhat appends the temp draft file path.
241
+
238
242
Sticker sending uses `key_normal_pick_sticker` or `:sticker`. Linux defaults to `sticker_picker_command = "nsxiv -t -o -p {files}"`; commands may use `{files}` for the temporary sticker file list, `{dir}` for the picker directory, and `{chooser}` for a chooser-output file. WebP stickers are selectable in v1; Lottie/TGS stickers are cached as metadata but skipped by the current picker/send path.
239
243
240
244
All TUI action keys are configurable in `config.toml` using flat `key_<mode>_<action>` variables. Bindings accept printable single keys plus named tokens such as `space`, `enter`, `shift+enter`, `esc`, `tab`, `shift+tab`, `backspace`, `ctrl+x`, `alt+x`, `alt+enter`, and leader sequences. Duplicate bindings in the same mode and prefix conflicts such as binding both `space` and `leader s` are rejected at startup with a config error. Composer `shift+enter` only works when the terminal reports it distinctly; `ctrl+j` is the reliable newline fallback.
0 commit comments