notedeck

One damus client to rule them all
git clone git://jb55.com/notedeck
Log | Files | Refs | README | LICENSE

issues.jsonl (26094B)


      1 {"id":"notedeck-0mh","title":"Remote NIP-50 search","description":"GitHub #1110: Implement remote search using NIP-50 protocol. See https://github.com/damus-io/notedeck/issues/1110","status":"open","priority":2,"issue_type":"feature","owner":"jb55@jb55.com","created_at":"2026-01-30T12:50:41.013086749-08:00","created_by":"William Casarin","updated_at":"2026-01-30T12:50:41.013086749-08:00","labels":["columns"]}
      2 {"id":"notedeck-13z","title":"Break down sync_scene() in lib.rs","description":"sync_scene() is 116 lines (lib.rs:554-669) handling multiple responsibilities:\n- Sync room objects to scene graph\n- Read avatar position/yaw from controller\n- Compute avatar offset\n- Lerp avatar yaw\n- Dead reckoning + position smoothing for remote users\n- Sync user avatars to scene\n\nExtract standalone functions:\n- fn update_remote_user_positions(users: \u0026mut [RoomUser], dt: f32, now: f64)\n- fn compute_avatar_transform(user: \u0026RoomUser, avatar_y_offset: f32, smooth_yaw: f32) -\u003e Transform\n\nComplexity: high","status":"closed","priority":2,"issue_type":"task","owner":"jb55@jb55.com","created_at":"2026-02-25T13:56:36.399642717-08:00","created_by":"William Casarin","updated_at":"2026-02-25T14:20:39.380225102-08:00","closed_at":"2026-02-25T14:20:39.380225102-08:00","close_reason":"Broke down sync_scene() into sync_objects_to_scene, lerp_yaw, update_remote_user_positions, sync_users_to_scene","labels":["nostrverse","refactor"]}
      3 {"id":"notedeck-27x","title":"Auto-steal focus should return to original session","description":"In crates/notedeck_dave, when an agent steals focus from another agent to ask a question, I want it to focus back to where it was after the interaction completes.","status":"closed","priority":2,"issue_type":"task","owner":"jb55@jb55.com","created_at":"2026-01-30T11:38:44.526107651-08:00","created_by":"William Casarin","updated_at":"2026-01-30T22:35:00.825936422-08:00","closed_at":"2026-01-30T22:35:00.825936422-08:00","close_reason":"Auto-steal focus now returns to original session after interaction completes","labels":["dave"]}
      4 {"id":"notedeck-2yj","title":"Profile search","description":"GitHub #1111: Extend search functionality to include profile lookups. See https://github.com/damus-io/notedeck/issues/1111","status":"open","priority":2,"issue_type":"feature","owner":"jb55@jb55.com","created_at":"2026-01-30T12:50:36.780164431-08:00","created_by":"William Casarin","updated_at":"2026-01-30T12:50:36.780164431-08:00","labels":["columns"]}
      5 {"id":"notedeck-3ns","title":"Approve/deny view text not wrapping - goes off screen","description":"The approve/deny view for tool calls doesn't wrap text properly. Long descriptions go all the way off the screen, making them unreadable.","status":"closed","priority":2,"issue_type":"bug","owner":"jb55@jb55.com","created_at":"2026-01-30T12:52:24.878602874-08:00","created_by":"William Casarin","updated_at":"2026-02-19T08:32:39.395960931-08:00","closed_at":"2026-02-19T08:32:39.395960931-08:00","close_reason":"Fixed by making handle_new_chat() check ai_mode - in chat mode, sessions are created directly without the directory picker overlay","labels":["dave"]}
      6 {"id":"notedeck-4no","title":"Follow packs show blank profiles","description":"GitHub #1107: Some profiles in follow packs display blank. See https://github.com/damus-io/notedeck/issues/1107","status":"closed","priority":2,"issue_type":"bug","owner":"jb55@jb55.com","created_at":"2026-01-30T12:46:44.374295002-08:00","created_by":"William Casarin","updated_at":"2026-02-18T16:19:08.222622866-08:00","closed_at":"2026-02-18T16:19:08.222622866-08:00","close_reason":"Closing - not a priority right now","labels":["columns"]}
      7 {"id":"notedeck-63y","title":"Extract session-detail-application pattern in lib.rs","description":"The same session detail application logic is repeated 3 times in lib.rs:\n\n1. restore_sessions_from_ndb() lines 1613-1650\n2. poll_session_state_events() lines 1806-1867\n3. poll_remote_conversation_events() (inline)\n\nEach applies hostname, custom_title, home_dir, sets up subscriptions, and seeds live threading data.\n\n## Related duplications\n- Live conversation subscription setup: repeated 4x (1630-1650, 1846-1866, 828-849, permission subs)\n- Remote session detection (hostname mismatch): duplicated at 1589-1596 and 1820-1827\n- Note polling boilerplate (poll-\u003etxn-\u003eiterate-\u003eget_note): repeated 3x at 1318-1327, 1670-1693, 1910-1925\n- Session state timestamp comparison: duplicated at 1614-1616 and 1750-1751\n\n## Approach\nExtract standalone functions:\n- apply_loaded_session_config()\n- setup_conversation_subscription()\n- is_session_remote(state, hostname)\n- Note-polling iterator helper","status":"closed","priority":2,"issue_type":"chore","owner":"jb55@jb55.com","created_at":"2026-02-24T18:13:12.475093101-08:00","created_by":"William Casarin","updated_at":"2026-02-25T12:33:35.800606742-08:00","closed_at":"2026-02-25T12:33:35.800619293-08:00"}
      8 {"id":"notedeck-7kd","title":"Extract build_object_cell() from build_space() in convert.rs","description":"build_space() is 95 lines (convert.rs:111-205). The per-object loop body (lines 148-197) builds a Cell with attributes for each RoomObject.\n\nExtract:\n  fn build_object_cell(obj: \u0026RoomObject) -\u003e (Cell, Vec\u003cAttribute\u003e)\n\nThis would reduce build_space() to ~40 lines of orchestration.\n\nComplexity: medium","status":"closed","priority":2,"issue_type":"task","owner":"jb55@jb55.com","created_at":"2026-02-25T13:56:53.056741144-08:00","created_by":"William Casarin","updated_at":"2026-02-25T14:20:39.047258493-08:00","closed_at":"2026-02-25T14:20:39.047258493-08:00","close_reason":"Extracted build_object_cell() and object_type_to_cell() from build_space() in convert.rs","labels":["nostrverse","refactor"]}
      9 {"id":"notedeck-84e","title":"Link previews (OpenGraph)","description":"GitHub #992: Display link previews using OpenGraph metadata. See https://github.com/damus-io/notedeck/issues/992","status":"open","priority":3,"issue_type":"feature","owner":"jb55@jb55.com","created_at":"2026-01-30T12:51:46.117752018-08:00","created_by":"William Casarin","updated_at":"2026-01-30T12:51:46.117752018-08:00","labels":["columns"]}
     10 {"id":"notedeck-ajn","title":"Contact lists aren't updated periodically","description":"GitHub #575: Contact lists don't refresh periodically as they should. See https://github.com/damus-io/notedeck/issues/575","status":"open","priority":2,"issue_type":"bug","owner":"jb55@jb55.com","created_at":"2026-01-30T12:49:46.741346469-08:00","created_by":"William Casarin","updated_at":"2026-01-30T12:49:46.741346469-08:00","labels":["columns"]}
     11 {"id":"notedeck-ax6","title":"Extract shared backend logic into backend/shared.rs","description":"messages_to_prompt() and get_pending_user_messages() are identical in claude.rs and codex.rs. Permission request handling (~70 lines) is nearly identical across both. Session command spawning, subagent creation/completion, and tool result summary generation are also duplicated.\n\n## Files\n- crates/notedeck_dave/src/backend/claude.rs\n- crates/notedeck_dave/src/backend/codex.rs\n\n## Specific duplications\n- messages_to_prompt(): claude.rs:76-114, codex.rs:1152-1178\n- get_pending_user_messages(): claude.rs:119-131, codex.rs:1181-1193\n- Permission request handling: claude.rs:335-418, codex.rs:715-761\n- Session command spawning: claude.rs:707-718, codex.rs:1260-1271\n- Subagent creation: claude.rs:430-455, codex.rs:499-521\n- Tool result summary: claude.rs:547-551, codex.rs:673-682,796-805,828-843\n\n## Approach\nCreate a new backend/shared.rs module with standalone functions. Update claude.rs and codex.rs to call into the shared module.","notes":"Extracted messages_to_prompt(), get_pending_user_messages(), prepare_prompt(), SessionCommand, and SessionHandle into backend/shared.rs. Both claude.rs and codex.rs now import from the shared module. All 219 tests pass. Remaining duplication (permission handling, subagent utils, tool result summary) can be done in a follow-up.\nSecond commit: extracted send_tool_result() and complete_subagent() to shared.rs. Eliminated 4 repeated tool result construction sites and 2 subagent completion sites. Remaining: permission request handling duplication.","status":"closed","priority":2,"issue_type":"chore","owner":"jb55@jb55.com","created_at":"2026-02-24T18:13:11.701612468-08:00","created_by":"William Casarin","updated_at":"2026-02-24T18:52:54.342308465-08:00","closed_at":"2026-02-24T18:52:54.342308465-08:00","close_reason":"Extracted 5 shared utilities (messages_to_prompt, get_pending_user_messages, prepare_prompt, SessionCommand/SessionHandle, send_tool_result, complete_subagent, should_auto_accept, forward_permission_to_ui) into backend/shared.rs across 3 commits. Net ~100 lines removed from claude.rs/codex.rs."}
     12 {"id":"notedeck-azp","title":"Column requires opening app twice to show new notes","description":"GitHub #780: Columns require opening notedeck twice to display new notes on initial launch. See https://github.com/damus-io/notedeck/issues/780","status":"closed","priority":2,"issue_type":"bug","owner":"jb55@jb55.com","created_at":"2026-01-30T12:49:39.093911034-08:00","created_by":"William Casarin","updated_at":"2026-02-18T16:07:26.357794127-08:00","closed_at":"2026-02-18T16:07:26.357794127-08:00","close_reason":"Closing - not a priority right now","labels":["columns"]}
     13 {"id":"notedeck-bce","title":"Handle ExitPlanMode tool call","description":"Handle ExitPlanMode which simply exits plan mode. Claude-code sends this when it's done its planning phase.","status":"closed","priority":2,"issue_type":"task","owner":"jb55@jb55.com","created_at":"2026-01-30T11:40:17.311242243-08:00","created_by":"William Casarin","updated_at":"2026-01-30T12:38:19.839039601-08:00","closed_at":"2026-01-30T12:38:19.839039601-08:00","close_reason":"Implemented ExitPlanMode UI with Approve/Reject buttons. When approved, exits plan mode and allows the tool call. UI shows PLAN badge with 'Plan ready for approval' message.","labels":["dave"]}
     14 {"id":"notedeck-c3p","title":"Implement multiline message composer (Signal-style)","description":"Replaced singleline TextEdit with multiline, using Signal-style keybindings: Enter to send, Shift+Enter for newline. Based on existing dave.rs implementation.","status":"closed","priority":2,"issue_type":"task","owner":"jb55@jb55.com","created_at":"2026-01-30T12:32:45.563930191-08:00","created_by":"William Casarin","updated_at":"2026-01-30T12:33:07.061369966-08:00","closed_at":"2026-01-30T12:33:07.061369966-08:00","close_reason":"Implemented: Changed TextEdit from singleline to multiline with Signal-style keybindings (Enter=send, Shift+Enter=newline) in convo.rs"}
     15 {"id":"notedeck-ce1","title":"Unify RoomSubscription and PresenceSubscription","description":"RoomSubscription and PresenceSubscription in subscriptions.rs have identical new() and poll() implementations differing only by the kind constant.\n\nExtract a shared helper or generic:\n- fn create_kind_subscription(ndb: \u0026Ndb, kind: u64) -\u003e Subscription\n- fn poll_subscription(sub: \u0026Subscription, ndb: \u0026Ndb, txn: \u0026Transaction) -\u003e Vec\u003cNote\u003e\n\nOr use a single generic NoteSubscription\u003cconst KIND: u16\u003e struct.\n\nFile: subscriptions.rs lines 18-76\n\nComplexity: low","status":"closed","priority":2,"issue_type":"task","owner":"jb55@jb55.com","created_at":"2026-02-25T13:56:23.105277151-08:00","created_by":"William Casarin","updated_at":"2026-02-25T14:08:20.404039407-08:00","closed_at":"2026-02-25T14:08:20.404039407-08:00","close_reason":"Implemented in commit f84c97686e50","labels":["nostrverse","refactor"]}
     16 {"id":"notedeck-cf0","title":"Preserve edit view after approval/denial","description":"When approving or denying an edit, keep the diff visible instead of making it disappear. Allows reviewing what was changed even after responding.","status":"closed","priority":2,"issue_type":"task","owner":"jb55@jb55.com","created_at":"2026-01-30T11:41:04.789975491-08:00","created_by":"William Casarin","updated_at":"2026-02-18T16:19:07.895887047-08:00","closed_at":"2026-02-18T16:19:07.895887047-08:00","close_reason":"Closing - not a priority right now","labels":["dave"]}
     17 {"id":"notedeck-dx2","title":"Multi column image reply bug","description":"GitHub #1104: Images in multi-column replies appear in wrong column. See https://github.com/damus-io/notedeck/issues/1104","status":"closed","priority":2,"issue_type":"bug","owner":"jb55@jb55.com","created_at":"2026-01-30T12:47:15.806023697-08:00","created_by":"William Casarin","updated_at":"2026-02-18T16:19:08.325125975-08:00","closed_at":"2026-02-18T16:19:08.325125975-08:00","close_reason":"Closing - not a priority right now","labels":["columns"]}
     18 {"id":"notedeck-fs8","title":"Ctrl+P not dropping from NeedsInput to Done","description":"Commit c6a96d8dbfef is supposed to enable dropping from NeedsInput to Done with Ctrl+P, but it's not working. The commit message says Ctrl+P should navigate backward within a priority group and drop to the next lower priority level when at the first item (NeedsInput → Error → Done).","status":"closed","priority":2,"issue_type":"task","owner":"jb55@jb55.com","created_at":"2026-01-30T11:42:27.63658035-08:00","created_by":"William Casarin","updated_at":"2026-01-30T11:57:51.25992885-08:00","closed_at":"2026-01-30T11:57:51.25992885-08:00","close_reason":"Fixed swapped keybindings in keybindings.rs:82-90 - Ctrl+N now returns FocusQueueNext (higher priority) and Ctrl+P returns FocusQueuePrev (lower priority)","labels":["dave"]}
     19 {"id":"notedeck-gj0","title":"Timeline carousel does not work","description":"GitHub #1006: Image carousel swiping functionality needs implementation or repair for navigating images. See https://github.com/damus-io/notedeck/issues/1006","status":"closed","priority":2,"issue_type":"bug","owner":"jb55@jb55.com","created_at":"2026-01-30T12:47:49.42410683-08:00","created_by":"William Casarin","updated_at":"2026-02-18T16:19:08.434225926-08:00","closed_at":"2026-02-18T16:19:08.434225926-08:00","close_reason":"Closing - not a priority right now","labels":["columns"]}
     20 {"id":"notedeck-h9s","title":"Note not ingesting when sending locally (offline)","description":"GitHub #1050: Offline notes fail to sync when device reconnects; messages aren't appearing even after network restored. See https://github.com/damus-io/notedeck/issues/1050","status":"closed","priority":2,"issue_type":"bug","owner":"jb55@jb55.com","created_at":"2026-01-30T12:47:34.188084601-08:00","created_by":"William Casarin","updated_at":"2026-02-17T17:11:00.7604656-08:00","closed_at":"2026-02-17T17:11:00.7604656-08:00","close_reason":"Added local ndb ingestion in post.rs execute(). Notes are now ingested into the local database before sending to relays, so they appear immediately even when offline. Commit: baa1655c55ce","labels":["columns"]}
     21 {"id":"notedeck-hav","title":"Add auto-accept mode for agent tool calls","description":"Add a toggle that automatically approves agent tool calls without requiring manual confirmation. Useful for trusted tasks or batch mode. Could be global or per-agent.","status":"closed","priority":2,"issue_type":"task","owner":"jb55@jb55.com","created_at":"2026-01-30T11:40:00.952701242-08:00","created_by":"William Casarin","updated_at":"2026-02-18T16:19:07.675673345-08:00","closed_at":"2026-02-18T16:19:07.675673345-08:00","close_reason":"Closing - not a priority right now","labels":["dave"]}
     22 {"id":"notedeck-i40","title":"Quoted note target changes depending on wide or selected mode","description":"GitHub #1117: Quoted note references inconsistent based on view mode. See https://github.com/damus-io/notedeck/issues/1117","status":"closed","priority":2,"issue_type":"bug","owner":"jb55@jb55.com","created_at":"2026-01-30T12:45:42.264025111-08:00","created_by":"William Casarin","updated_at":"2026-02-18T16:19:08.112313115-08:00","closed_at":"2026-02-18T16:19:08.112313115-08:00","close_reason":"Closing - not a priority right now","labels":["columns"]}
     23 {"id":"notedeck-ipm","title":"Break down render_editing_panel() in room_view.rs","description":"render_editing_panel() is 241 lines (room_view.rs:547-787). Combines space properties, object list, inspector, grid snap controls, and scene display.\n\nExtract standalone functions:\n- fn show_object_list(ui, state) -\u003e Option\u003cNostrverseAction\u003e\n- fn show_object_inspector(ui, obj, snap_enabled, snap_deg) -\u003e bool\n- fn show_grid_snap_controls(ui, state)\n- fn show_scene_display(ui, state)\n\nComplexity: high","status":"closed","priority":2,"issue_type":"task","owner":"jb55@jb55.com","created_at":"2026-02-25T13:56:47.480537758-08:00","created_by":"William Casarin","updated_at":"2026-02-25T14:24:37.879441024-08:00","closed_at":"2026-02-25T14:24:37.879441024-08:00","close_reason":"Extracted render_object_list, render_object_inspector, render_grid_snap_controls, render_scene_preview from render_editing_panel","labels":["nostrverse","refactor"]}
     24 {"id":"notedeck-j8c","title":"Chat sidebar should show last message from user or AI","description":"Chat sidebar text should show the user's or AI's last message, not our last message.","status":"closed","priority":2,"issue_type":"task","owner":"jb55@jb55.com","created_at":"2026-01-30T11:39:11.482262998-08:00","created_by":"William Casarin","updated_at":"2026-02-18T16:19:07.562465153-08:00","closed_at":"2026-02-18T16:19:07.562465153-08:00","close_reason":"Closing - not a priority right now","labels":["dave"]}
     25 {"id":"notedeck-kpa","title":"Zap notification","description":"GitHub #1037: Notify users when zapped, showing zap amount, sender, and zapped content details. See https://github.com/damus-io/notedeck/issues/1037","status":"in_progress","priority":3,"issue_type":"feature","owner":"jb55@jb55.com","created_at":"2026-01-30T12:51:29.181749931-08:00","created_by":"William Casarin","updated_at":"2026-02-19T08:33:39.25553682-08:00","labels":["columns"]}
     26 {"id":"notedeck-os4","title":"Consolidate session module duplications","description":"Several duplications exist across the session_*.rs files.\n\n## SessionState construction (verbatim copy)\n- session_loader.rs:292-304 (load_session_states)\n- session_loader.rs:338-350 (latest_valid_session)\nExtract: build_session_state_from_note(note, session_id) -\u003e SessionState\n\n## Truncation functions (identical implementations)\n- session_loader.rs:353-359 truncate()\n- session_jsonl.rs:306-313 truncate_str()\n- session_discovery.rs:62-68 and 74-79 (inline)\nConsolidate into a single shared utility.\n\n## Builder tag patterns in session_events.rs\n- build_permission_request_event() lines 655-671\n- build_permission_response_event() lines 702-721\n- build_session_state_event() lines 760-765\nAll share identical source/t-tag addition logic.\nExtract: add_common_event_tags(), add_permission_base_tags()\n\n## Large functions to break up\n- build_events() (130 lines, 221-350)\n- build_single_event() (94 lines, 419-512)\n- load_session_messages() (153 lines, 92-244)","status":"closed","priority":3,"issue_type":"chore","owner":"jb55@jb55.com","created_at":"2026-02-24T18:13:12.82235796-08:00","created_by":"William Casarin","updated_at":"2026-02-25T12:43:35.691011308-08:00","closed_at":"2026-02-25T12:43:35.691024689-08:00"}
     27 {"id":"notedeck-p1n","title":"NIP-05 validation not working as intended","description":"GitHub #1274: NIP-05 validation feature is malfunctioning. See https://github.com/damus-io/notedeck/issues/1274","status":"closed","priority":2,"issue_type":"bug","owner":"jb55@jb55.com","created_at":"2026-01-30T12:38:30.276030933-08:00","created_by":"William Casarin","updated_at":"2026-02-18T14:45:59.805875423-08:00","closed_at":"2026-02-18T14:45:59.805875423-08:00","close_reason":"Already fixed","labels":["columns"]}
     28 {"id":"notedeck-pj7","title":"Like button not visible in light theme","description":"GitHub #1246: Like button rendering visibility issue when switching to light theme mode. See https://github.com/damus-io/notedeck/issues/1246","status":"closed","priority":2,"issue_type":"bug","owner":"jb55@jb55.com","created_at":"2026-01-30T12:41:16.601075159-08:00","created_by":"William Casarin","updated_at":"2026-01-30T13:38:50.529278612-08:00","closed_at":"2026-01-30T13:38:50.529278612-08:00","close_reason":"Fixed by applying text color tint unconditionally in like_button()","labels":["columns"]}
     29 {"id":"notedeck-uby","title":"Extract parse_vec3 helper in nostr_events.rs","description":"parse_presence_position() and parse_presence_velocity() share nearly identical Vec3 parsing logic: split whitespace, parse three f32 values, construct Vec3.\n\nExtract:\n  fn parse_vec3(s: \u0026str) -\u003e Option\u003cVec3\u003e\n\nThen both callers become one-liners.\n\nFile: nostr_events.rs lines 107-127\n\nComplexity: low","status":"closed","priority":3,"issue_type":"task","owner":"jb55@jb55.com","created_at":"2026-02-25T13:56:28.246407871-08:00","created_by":"William Casarin","updated_at":"2026-02-25T14:08:20.400624672-08:00","closed_at":"2026-02-25T14:08:20.400624672-08:00","close_reason":"Implemented in commit f84c97686e50","labels":["nostrverse","refactor"]}
     30 {"id":"notedeck-war","title":"MacOS crash on PFP → Side menu Accounts","description":"GitHub #1270: Application crashes when navigating to Accounts via profile picture menu due to 'layer_id change panic'. See https://github.com/damus-io/notedeck/issues/1270","status":"closed","priority":1,"issue_type":"bug","owner":"jb55@jb55.com","created_at":"2026-01-30T12:41:09.082890703-08:00","created_by":"William Casarin","updated_at":"2026-02-18T16:19:08.002872446-08:00","closed_at":"2026-02-18T16:19:08.002872446-08:00","close_reason":"Closing - not a priority right now","labels":["columns"]}
     31 {"id":"notedeck-xer","title":"Persist conversation across app restarts","description":"Save and restore conversation state so it survives app restarts.","status":"closed","priority":2,"issue_type":"task","owner":"jb55@jb55.com","created_at":"2026-01-30T11:40:11.196068397-08:00","created_by":"William Casarin","updated_at":"2026-02-18T16:19:07.782704625-08:00","closed_at":"2026-02-18T16:19:07.782704625-08:00","close_reason":"Closing - not a priority right now","labels":["dave"]}
     32 {"id":"notedeck-xh9","title":"Extract self_user()/self_user_mut() helpers on NostrverseState","description":"The pattern `self.state.users.iter().find(|u| u.is_self)` appears 3+ times in lib.rs.\n\nAdd helpers to NostrverseState:\n- `fn self_user(\u0026self) -\u003e Option\u003c\u0026RoomUser\u003e`\n- `fn self_user_mut(\u0026mut self) -\u003e Option\u003c\u0026mut RoomUser\u003e`\n\nLocations: lib.rs lines ~279, ~437-443, ~532-533\n\nComplexity: low","status":"closed","priority":2,"issue_type":"task","owner":"jb55@jb55.com","created_at":"2026-02-25T13:56:16.683125787-08:00","created_by":"William Casarin","updated_at":"2026-02-25T14:08:20.402708213-08:00","closed_at":"2026-02-25T14:08:20.402708213-08:00","close_reason":"Implemented in commit f84c97686e50","labels":["nostrverse","refactor"]}
     33 {"id":"notedeck-z5q","title":"Break up Dave::update() and Dave::process_events()","description":"Dave::update() (~412 lines, lib.rs:2456-2868) and Dave::process_events() (~387 lines, lib.rs:594-981) are the two largest methods in the codebase. Each contains multiple distinct phases that could be standalone functions.\n\n## update() extractions\n- process_negentropy_sync() (~75 lines, 2463-2529)\n- handle_archive_conversion() (~80 lines, 2631-2711)\n- poll_message_load() (~30 lines, 2713-2742)\n- process_session_states() (~45 lines, 2799-2820)\n- publish_relay_events() (~25 lines, 2777-2791)\n\n## process_events() extractions\n- process_session_tokens() (~65 lines, 609-681)\n- handle_tool_call_execution() (~80 lines, 687-716)\n- handle_permission_request_event() (~45 lines, 719-776)\n- handle_stream_completion() (~55 lines, 923-969)\n\n## Also large in lib.rs\n- poll_remote_conversation_events() (~219 lines, 1886-2105)\n- poll_session_state_events() (~212 lines, 1665-1877)\n- restore_sessions_from_ndb() (~113 lines, 1546-1659)\n- poll_remote_permission_responses() (~103 lines, 1300-1403)\n\n## Approach\nExtract into standalone functions that take explicit parameters rather than \u0026mut self where possible, improving testability and making data flow explicit.","status":"closed","priority":2,"issue_type":"chore","owner":"jb55@jb55.com","created_at":"2026-02-24T18:13:12.129104216-08:00","created_by":"William Casarin","updated_at":"2026-02-25T12:22:33.668093418-08:00","closed_at":"2026-02-25T12:22:33.668095118-08:00"}
     34 {"id":"notedeck-ze8","title":"Break down show_room_view() in room_view.rs","description":"show_room_view() is 340 lines (room_view.rs:173-512) — the largest function in the crate. It mixes input handling, camera control, and rendering.\n\nExtract standalone functions:\n- fn handle_drag_input(ui, response, rect, state, r) -\u003e Option\u003cNostrverseAction\u003e\n- fn handle_click_input(response, rect, state, r) -\u003e Option\u003cNostrverseAction\u003e\n- fn handle_keyboard_input(ui, state) -\u003e Option\u003cNostrverseAction\u003e\n- fn handle_camera_input(ui, response, r)\n\nComplexity: high","status":"closed","priority":2,"issue_type":"task","owner":"jb55@jb55.com","created_at":"2026-02-25T13:56:42.280838595-08:00","created_by":"William Casarin","updated_at":"2026-02-25T14:24:37.554704026-08:00","closed_at":"2026-02-25T14:24:37.554704026-08:00","close_reason":"Extracted handle_drag_start, compute_initial_drag, apply_drag_update, handle_keyboard_input from show_room_view","labels":["nostrverse","refactor"]}
     35 {"id":"notedeck-zg7","title":"Quote notification","description":"GitHub #1041: Implement notifications when users' posts are quoted by others. See https://github.com/damus-io/notedeck/issues/1041","status":"open","priority":3,"issue_type":"feature","owner":"jb55@jb55.com","created_at":"2026-01-30T12:50:58.370192754-08:00","created_by":"William Casarin","updated_at":"2026-01-30T12:50:58.370192754-08:00","labels":["columns"]}