Damus Android

Changes from 2025-03-30 to 2026-03-30

Stats

name                    added    removed  commits
William Casarin         +107246  -34699   958
kernelkind              +61170   -17030   625
Terry Yiu               +9886    -1225    23
Fernando López Guevara  +4129    -2090    46
Martti Malmi            +1424    -375     20
alltheseas              +969     -169     45
e                       +138     -10      3
Claude Opus 4.5         +104     -8       1
d3vv3r                  +46      -6       1
Jakub Gladysz           +27      -22      2
Sergey B.               +11      -2       1
M                       +2       -2       1
[email protected]      +1       -1       1
Fernando López Guevara  +1       -1       1

Log

William Casarin (958):
      accounts: subscribe to giftwraps
      add CLAUDE.md with Linear integration guidelines
      add clickable toggle for permission feedback on mobile
      add_column: replace manual key input with profile search
      Add custom beads PRIME.md with subproject labeling rules
      Add giftwrap support
      add input context menu helper
      add is_root_note helper
      add live conversation polling and dedup for remote sessions
      add NotedeckOptions and feature flags, add notebook feature
      add profile search to notification column selection
      add remote-only backend for lite client mode
      add SessionSource (Local/Remote) for lite client remote mode
      add source hostname to session state events and session list UI
      add syntax highlighting to code blocks
      add tool-name tag to tool_call/tool_result nostr events
      agentium: fix keybindings
      agents.md: remove old/wrong/outdated stuff
      agents: mention `cargo lint`
      algo: add people list support to last-per-pubkey feed
      andriod: add app icons
      android: add initial ci
      android: arboard clipboard support
      android: default app to columns
      android: enable messages feature in jni build
      android: exclude notedeck_release from android build (DECK-468)
      android: fix back button
      android: fix build
      android: fix build
      android: fix crash on mobile
      android: fix dark/light mode and folding screen crash
      android: fix remaining keyboard issues
      android: hide chrome sidebar by default
      android: hide new post button when navigating
      android: hover post button when narrow
      android/input: add copy/paste context to post input
      android: prep for app store release
      android: reapply keyboard changes
      android: remove special load arguments
      android: vibrate on NeedsInput status
      anim: animate on compose button hide
      anim: animate show/hide of compose button
      anim: reduce gif fps
      app: initial dashboard app
      app: route both TOS and Welcome screens at startup
      app: split App trait into update() + render()
      args: add --locale option
      args: parse hashtag columns from cli
      args: switch to oot_bitset for arg flags
      assets: add columns app icon
      assets: update columns app icon
      auto_accept: add `beads list` to auto-approved commands
      auto-focus Done sessions in the focus queue
      battery: disable render every 100ms
      build: convert apps into compile-time feature flags
      changelog: scope entries by subcrate using git diff-tree
      changelog: section-first layout with crate prefix on entries
      chore: beads
      chore: bump workspace version to 0.8.0
      chore/messages: fix lint
      chore: remove todos.txt, migrated to beads
      chrome: add --no-columns-app
      chrome: add startup sound
      chrome: add two-tier keybinding system with F11 for side menu
      chrome: add virtual keyboard ui
      chrome: collapsible side panel
      chrome: extract method to function
      chrome: extract more non-methods
      chrome: fix notebook build
      chrome: fix settings view
      chrome: fix support route
      chrome: fix theme persistence
      chrome: fix wallet button
      chrome: fix wasm build
      chrome: greatly improve soft-keyboard visibility & layout handling
      chrome: hook up toolbar actions
      chrome: initial action handling
      chrome: make toolbar smaller
      chrome: move mobile toolbar from Columns to Chrome level
      chrome: only call update() on apps that have been opened
      chrome: painter-drawn toolbar icons with active/filled state
      chrome/readme: mention signer
      chrome: remove dev log
      chrome: remove duplication in app setup
      chrome: remove unnecessary i32 cast in toolbar tab count
      chrome: switch from ALPHA to BETA
      chrome: toggle side menu with Escape key from any app
      chrome: use actual columns noteaction executor
      ci: add local CI runner that parses GitHub workflow YAML
      ci: add release tarballs and GitHub Release upload job
      ci: add snapshot-test to ci-local on Linux
      ci: bump ubuntu runner
      ci: enforce Changelog trailers on commits
      ci: exclude notedeck_release from packaging cross-builds
      ci: install alsa-dev for aarch64 cross-compilation
      ci: limit local CI parallelism to avoid OOM from linker
      claude-agent-sdk: fix url
      CLAUDE: fix "In Review" status name
      claude: instruct to lint before committing
      claude-sdk: make relative to project for now
      claude: slight tweak
      claude: switch issue tracking from Linear to GitHub Issues
      clippy: fix
      clippy: fix collapsible_if and too_many_arguments
      clippy fixes
      clippy fixes
      clippy fixes
      clippy fixes
      clippy: fixes
      clippy: fix large enum.
      clippy: fix large enum.
      clippy: fix lint errors
      clippy: fix lint related to iterator
      clippy: quick lint fix
      clndash: add readme
      clndash: channels ui
      clndash: clippy fix
      clndash: configurable host
      clndash: dont forget CLNDASH_ID
      clndash: fix invoice order, return more stuff
      clndash: include listpeerchannel errors
      clndash: initial peer channel listing
      clndash: invoice loading
      clndash: readme
      clndash: reorganize
      clndash: specify you need --clndash
      clndash: summary cards
      clndash: tweak links in readme
      clndash: tweak readme
      clndash: zap rendering
      codex: add Codex backend via app-server JSON-RPC protocol
      codex: add integration tests and fix protocol bugs
      columns: accept querystring format in --filter arg
      columns: add more privately text
      columns/add: move home and notifications to top
      columns: add NIP-51 people list support (kind 30000)
      columns: add people list creation UI
      columns: add refresh button for one-shot algo feeds
      columns: add sound effects subsystem with UI interaction sounds
      columns: add welcome bottom sheet for new users
      columns: async initial timeline loading to avoid UI stalls
      columns: auto-hide toolbar+header when scrolling
      columns: clean up flags, refactor content rendering
      columns/decks: add home and notifications for new accounts
      columns: enable toolbar scroll to top
      columns: fix double reference
      columns: fix selected column index if we remove it
      columns: implement Generic filter timelines with querystring serialization
      columns/nav: ocd nevernest
      columns: never truncate notes you're replying to
      columns/profile: only mutate profile state after navigating
      columns/profile: rename process -> process_profile_action
      columns: remove commented out file
      columns: remove spamming info logs about writing to cache
      columns: remove thread warning
      columns: switch to bitflag app options
      columns/timeline: include column index in timeline view_id
      columns: use HybridFilter for algo feeds, query all contacts locally
      columns: use per-pubkey filters for local algo feed queries
      composer: implement multiline input with Signal-style keybindings
      config: make PNS relay URL configurable via DAVE_RELAY env var
      consolidate mention search to use search_profiles()
      contacts_list: simplify ContactsListView with generic iterator
      context: fix capitalization
      context: implement note broadcasting
      dashboard: add kittest snapshot test
      dashboard: add manual refresh button
      dashboard: add rolling range buckets for daily/weekly/monthly reports
      dashboard: apply design system tokens and semantic colors
      dashboard: card sizing hierarchy and responsive layout
      dashboard: client charts
      dashboard: default to monthly
      dashboard: faster reports via table scan query plan
      dashboard: monthly kind1 post report
      dashboard: new contact list creations by client
      dashboard: responsive ui on mobile
      dashboard: track clients by unique pubkeys (DECK-868)
      dashboard: trigger repaints in the worker
      dave: abbreviate home dir with ~ and add session header to chat view
      dave: add a bit of spacing, fix sned
      dave: add a few docs
      dave: add a few tool docs
      dave: add AiMode enum for Chat vs Agentic modes
      dave: add AI provider settings UI
      dave: add "Allow Always" for per-session runtime permission allowlist
      dave: add auto-steal focus mode with cursor position restore
      dave: add backend brand icons and tracing for picker flow
      dave: add background to user messages
      dave: add chrome toggle button
      dave: add Claude SDK integration tests and fix stderr blocking
      dave: add codex tool events, token usage, and manual compaction
      dave: add Compact & Approve button for ExitPlanMode
      dave: add context window usage bar to status bar
      dave: add copy/paste context menus for messages and input box
      dave: add Ctrl+G keybinding to open external editor for input
      dave: add debug logging for compact_boundary data
      dave: add Delete key binding for classic view
      dave: add diff renderer for Edit/Write tool permission requests
      dave: add duplicate option to session context menu
      dave: add Escape key to interrupt AI operations
      dave: add file_update to ExecutedTool for diff rendering
      dave: add focus queue indicator dots to scene view
      dave: add focus queue NEXT badge for mobile navigation
      dave: add git status bar for session working directory
      dave: add home_dir to session state events for remote cwd abbreviation
      dave: add interactive permission handling for Claude Code tools
      dave: add interrupt/stop functionality for AI operations
      dave: add keybind hint support to StatusBadge widget
      dave: add KeybindHint widget for visual keybinding indicators
      dave: add keybindings and hints for session actions
      dave: add keyboard shortcuts for permission requests and agent navigation
      dave: add ModelConfig::trial() and make config module public
      dave: add mouseover tooltips to keybind hint buttons
      dave: add multiple session support with sidebar
      dave: add new chat button
      dave: add N keybinding to spawn new agent and focus input
      dave: add notification dot on hamburger menu for pending permissions
      dave: add OpenAI trial key integration test
      dave: add pending placeholder sessions for remote spawn commands
      dave: add permission callback tests (disabled pending SDK support)
      dave: add plan mode toggle with Ctrl+P
      dave: add pluggable AI backend abstraction with Claude support
      dave: add query rendering, fix author queries
      dave: add queued indicator for messages sent while working
      dave: add readme
      dave: add reset option and keybind hints to session context menu
      dave: add RTS-style scene view for multi-agent visualization
      dave: add screenshot to readme
      dave: add session handling with --continue for conversation context
      dave: add shadcn-style status badge widget for plan mode
      dave: add Shift+1/2 to approve/deny with custom message
      dave: add status colors to classic view, show keybinds only with Ctrl
      dave: add "Summarize Thread" context menu action
      dave: add tests for shared utilities, session management, IPC, and bug fix regressions
      dave: add tool result metadata display from message stream
      dave: add trial mode
      dave: add word boundary matching to auto-accept and add bd command
      dave: allow message queuing while Claude is working
      dave: allow Tab/Shift+Tab agent cycling even with text input focus
      dave: auto-accept read-only gh CLI commands
      dave: auto-accept small edits (2 lines or less)
      dave: auto-accept WebSearch and WebFetch tools
      dave: auto-focus input when switching agents via Tab/number keys
      dave: auto-reply, initial avatar anim
      dave: auto-shrink diff ScrollArea to fit content
      dave: better initial rotation
      dave: break up Dave::update() and Dave::process_events()
      dave: bubble note actions to chrome
      dave: bump negentropy sync rounds from 5 to 20
      dave: cache diff computation in FileUpdate to avoid per-frame recalculation
      dave: change scene view to 50/50 split
      dave: check for .exe extension in PATH lookup on Windows
      dave: clamp input box height to prevent overflow off-screen
      dave: cleanly separate ui from logic
      dave: clear Done indicator based on session type
      dave: clear done indicator from focus queue after auto-steal switch
      dave: click Done indicator dot in session list to dismiss it
      dave: consolidate session module duplications
      dave: constrain power for now
      dave: create chat session directly in chat mode, skip directory picker
      dave: cube lighting
      dave: cycle focus queue navigation within same priority level
      dave: cycle permission mode badge through Default/Plan/AcceptEdits
      dave: default to list view, rename Classic to List
      dave: default to OpenAI backend instead of Remote when no API key
      dave: disconnects
      dave: display model in session header and add model picker (DECK-879)
      dave: don't handle 1/2 keybinds when text input has focus
      dave: don't make dave active yet
      dave: ensure system prompt is included when reset
      dave: expand markdown table columns to fill available width
      dave: extract abbreviate_path into shared path_utils module
      dave: extract duplicated session helpers in lib.rs
      dave: extract InputboxLayout for shared use between UI and tests
      dave: extract permission forwarding to shared.rs
      dave: extract process_conversation_notes and add integration test
      dave: extract process_events() match arms into standalone functions
      dave: extract search_call ui
      dave: extract send_tool_result and complete_subagent to shared.rs
      dave: extract shared backend logic into backend/shared.rs
      dave: extract standalone helper functions into update.rs module
      dave: extract standalone UI functions into ui module
      dave: fix ActionButton keybind hint position and style
      dave: fix android build
      dave: fix box-selection coordinate space mismatch
      dave: fix bugs
      dave: fix can_use_tool callback by using ClaudeClient
      dave: fix classic view real-time status updates and auto-focus
      dave: fix Claude subprocess cleanup on session delete
      dave: fix codex assistant messages not replicating to nostr
      dave: fix codex backend error extraction, model selection, and nostr replication
      dave: fix compact button using wrong session ID format
      dave: fix compact input bottom margin
      dave: fix context fill bar to use input_tokens only
      dave: fix Ctrl+number bindings taking precedence over permission keys
      dave: fix Ctrl+P losing input focus
      dave: fix Ctrl+Shift+Tab keybinding order
      dave: fix diff UI issues
      dave: fix diff view max_height inside ScrollArea
      dave: fix duplicate/reset for remote sessions
      dave: fix external editor on macOS by opening in new terminal window
      dave: fix image in readme
      dave: fix inline code baseline alignment and add accent color
      dave: fix input box
      dave: fix input losing focus when Ctrl is pressed
      dave: fix keybind hints to match actual Ctrl+N shortcuts
      dave: fix markdown tables breaking layout on small screens
      dave: fix markdown tables breaking layout on small screens
      dave: fix multi-line command bypass in auto-accept rules
      dave: fix N key spawning duplicate agents
      dave: fix ollama config if enabled
      dave: fix prompt and token concat
      dave: fix queued message handling and batch dispatch
      dave: fix remote session dispatch spam and hostname sync
      dave: fix RTS scene bugs and improve multi-agent status updates
      dave: fix scene panel overflow with StripBuilder and clipping
      dave: fix scroll ID conflict between chat and session list
      dave: fix session header to render outside scroll area
      dave: fix sidebar click
      dave: fix spacing on permission ui
      dave: fix subagent tool dropdown by hoisting egui expand ID
      dave: fix tool responses for non-active sessions
      dave: fix tool result and subagent completion detection
      dave: fix tool result and subagent completion detection
      dave: fix tool results without parent_task_id silently dropped
      dave: focus another node after deleting selected nodes
      dave: focus camera on new agent when spawned via N key
      dave: gate rfd dependency for Android compatibility
      dave: give dave a new home in the sidebar
      dave: give present notes a proper tool response
      dave: give up on plaintext formatting
      dave: group agent sessions by hostname in session list
      dave: handle codex error events to prevent redispatch loop
      dave: handle send result for tool calls to prevent panic
      dave: handle System message and Task tool subagents
      dave: hide agentic-only actions from chat sessions
      dave: hide git status expand button when repo is clean
      dave: hide media in dave note previews
      dave: honor backend tags for relay sessions
      dave: implement AskUserQuestion tool support
      dave: implement focus queue system
      dave: implement persistent ClaudeClient per session with actor pattern
      dave: improve AskUserQuestion UI
      dave: improve design
      dave: improve docs with ai
      dave: improve executed tool diff UX
      dave: improve multi-note display
      dave: improve permission request UX with response state tracking
      dave: improve query tool
      dave: include anonymous user identifier in api call
      dave: increase Ask/Stop button min size for mobile touch targets
      dave: increase chat panel width from 50% to 75% in scene view
      dave: initial android fixes
      dave: initial note rendering
      dave: inject user message into conversation on Allow with message
      dave: integrate keybind hints into Allow/Deny buttons
      dave: introduce model config
      dave is alive
      dave: keep Done focus cue until user manually focuses session
      dave: keep Done indicator dot on completed sessions
      dave: make auto-steal focus transition-based instead of per-frame
      dave: make /clear behave like Clear menu command
      dave: make external editor non-blocking with async polling
      dave: make it merge friendly
      dave: make session keybindings match visual order
      dave: merge ToolResult into ToolResponse as ExecutedTool variant
      dave: more flexible env config
      dave: move approve/deny buttons to bottom right of diff view
      dave: move compaction status to chat area with spinner
      dave: move focus queue indicator to chat listing dots
      dave: move keybindings from update() to render()
      dave: move quaternion to its own file
      dave: move shortcut hint to far right of chat listing
      dave: move subagent UI into chat history
      dave: nudge avatar when you click
      dave: only re-render dave if he's moving
      dave: only search non-replies
      dave: optimistically set remote status after permission response
      dave: organize
      dave: per-session backend selection with backend picker UI
      dave: persist backend type in nostr session state events
      dave: persist focus indicator in kind-31988 session notes
      dave: persist settings to dave_settings.json
      dave: plan status badge changes
      dave: prepare for android
      dave: prevent NeedsInput for runtime-allowed permissions
      dave: propagate compaction events to remote sessions
      dave: raise OS window when auto-steal focus switches sessions
      dave: redesign git status bar to match UI style
      dave: refactor a bit
      dave: refactor overlay into state machine, fix backend picker ordering
      dave: refactor update fn into smaller focused helper functions
      dave: remote session creation via host picker and spawn commands
      dave: remove default property value and add to description
      dave: remove git refresh button from status bar
      dave: remove old file
      dave: remove redundant t tag filter from session state queries
      dave: remove scroll area from diff view, use natural height
      dave: remove shader since we do it inline now
      dave: render plan view with markdown instead of plain text
      dave: render session header inline with top buttons
      dave: reorganize ModelConfig
      dave: replace DaveUi bool fields with DaveUiFlags bitflags
      dave: replace dispatched_user_count with DispatchState state machine
      dave: replace new chat button with icon in sidebar
      dave: require Ctrl modifier for picker keyboard shortcuts
      dave: require double-Escape to confirm interrupt
      dave: restore input focus after permission response
      dave: restore shift highlight on permission message link
      dave: restrict scene zoom to max 1.0
      dave: restyle session list sidebar with ChatGPT-like design
      dave: return tool errors back to the ai
      dave: rotation tweaks
      dave: send Failed response when create_stream errors
      dave: separate agentic-only fields into AgenticSessionData
      dave: show agent number instead of letter in scene view
      dave: show compaction result message in chat
      dave: show compaction status indicator when /compact runs
      dave: show cwd in session list and scene view
      dave: show keybinding hints only when Ctrl is held
      dave: show last activity timestamp in status bar
      dave: show last message in chat listing instead of last user message
      dave: show number of messages in current session
      dave: show plan mode keybind hint when Ctrl is held
      dave: show spinner status for both working and compacting states
      dave: show summary view for answered AskUserQuestion
      dave: simplify focus_queue
      dave: skip input auto-focus on mobile, dismiss Done on focus queue nav
      dave: small cleanup
      dave: switch C to K keybinding for clear
      dave: switch to logical time
      dave: switch to use standard vertex/index buffers
      dave: sync permission mode between host and observer via nostr
      dave: toolcall parsing
      dave: tools working even better
      dave: treat compaction as done state for session status
      dave: truncate oversized permission request events for relay sync
      dave: tweak prompt
      dave: tweak prompt
      dave: tweak prompt
      dave: tweak search tool to include limit arg
      dave: unfocus input when permission request is pending
      dave: update default codex model to gpt-5.3-codex
      dave: update to custom filters nostrdb
      dave: use [1] Yes / [2] No for permission buttons
      dave: use activateWithOptions and orderFrontRegardless on macOS
      dave: use Allow/Deny labels with keybind hint widgets
      dave: use auto_shrink for markdown table column sizing
      dave: use bare 1/2 keys for permission responses
      dave: use Ctrl modifier for all keybindings to avoid input conflicts
      dave: use darker code background for both inline and block code
      dave: use Delete key only for agent deletion, not Backspace
      dave: use focus queue priority color for hamburger notification dot
      dave: use last user message for scene node title instead of first
      dave: use local llama for testing for now
      dave: use NSApplication activate to bring app to front on macOS
      dave: use push_str for token append to avoid O(n²) string growth
      dave: use StreamEvent for incremental text display
      dave: use unique temp file names for external editor
      dave: wrap user messages
      db: fix bad query bug in author-kind queries
      debug: add memory debug window
      debug: add repaint causes debug tool
      debug: add startup query debug log
      debug: add tracing for compact session dispatch
      debug: fix memory debug builds
      debug: fix memory debugger
      deduplicate replaceable events using ndb.fold in session loading
      default logs
      deps: add webpki-roots feature to hyper-rustls
      deps: switch to damus-io egui-nav
      design: add centralized design tokens module
      design: add semantic color API and theme context helper
      design: replace hardcoded UI values with design tokens and semantic colors
      diff: add expandable context for local sessions
      diff: add syntax highlighting to file diffs
      diff: fix clippy collapsible_if warnings
      disable relay publishing until PNS wrapping is implemented
      docs: add notedeck_chrome docs
      docs: add notedeck_columns readme
      docs: add notedeck docs
      docs: add README for notedeck_release crate
      docs: add some ui-related guides
      docs: add tokenator docs
      docs(dave): update README with agentium branch features
      docs: improve top-level docs
      docs: remove test hallucination
      egui-md-stream: fix O(n²) collapse_text_elements
      enable PNS-wrapped relay publishing for AI conversation events
      enostr: add NIP-PNS (Private Note Storage) crypto module
      enostr: more detailed multicast debugging
      enostr: remove raw event type
      enostr: rename to_bech to npub
      enostr: return negentropy sync stats
      enostr: show unrecognized message in log
      evolve dave into a swarm
      feat: cache downloaded artifacts by content hash
      feat(dave): add Ctrl+Shift+T to clone agent with same working directory
      feat(dave): add incremental markdown rendering for assistant messages
      feat(dave): add keyboard shortcuts to settings and directory picker overlays
      feat(dave): add notedeck-spawn CLI for spawning agents externally
      feat(dave): add rules-based auto-accept system for permissions
      feat(dave): add shift-click message support to ExitPlanMode UI
      feat(dave): change Ctrl+D to toggle Done status in focus queue
      feat(dave): expand auto-accept rules for read-only bash commands
      feat(dave): handle ExitPlanMode tool with custom UI
      feat(dave): require cwd selection when creating new sessions
      feat: default to latest GitHub release when --version is omitted
      feature: rename wasm_apps to wasm
      filter: fix small abstraction leak
      filter: reservoir sample the algo feed
      fix: add Default impl for ClaudeBackend, suppress unused var warning
      fix: add seq tags to permission_request events for correct ordering
      fix android-activity crash on unhandled app cmds
      fix: auto-steal focus retries across frames via AutoStealState enum
      fix: center Ask button text vertically in Dave inputbox
      fix: center text in Stop and Ask buttons in Dave inputbox
      fix: clear async load tracking when popping timeline routes
      fix clippy lints: too_many_arguments and question_mark
      fix(dave): auto-steal returns to original session, not queue cursor
      fix(dave): correct Ctrl+P/N keybinding action mapping
      fix(dave): count changed lines, not total lines in is_small_edit
      fix(dave): Ctrl+P drops to lower priority, Ctrl+N jumps to highest
      fix(dave): Ctrl+P drops to lower priority, Ctrl+N jumps to highest
      fix(dave): exit plan mode when tentative-accepting ExitPlanMode
      fix(dave): fix Ctrl+G external editor on Linux
      fix(dave): fix model picker test to use real session creation path
      fix(dave): preserve requested model when cloning sessions
      fix(dave): prevent focus queue wrap-around on navigation
      fix(dave): swap Ctrl+N/P focus queue navigation direction
      fix(dave): wake UI immediately when IPC spawn request arrives
      fix diff view overflow and move permission buttons to bottom left
      fix duplicate messages on phone and enable phone-to-desktop messaging
      fix: enable remote session kickstart via ndb subscriptions
      fix(enostr): fix unreachable relay test flake on Windows
      fix: handle all artifact naming patterns in platform_tag_from_name
      fix: include prereleases when fetching latest GitHub release
      fix missing relay events and duplicate sessions in dave app
      fix missing zap button
      fix nostrdb-rs platform independence
      fix note response regression
      fix one missing home string
      fix PLAN/AUTO badges not showing on remote sessions
      fix plan markdown not rendering for remote sessions
      fix PNS ingest: wrap as ["EVENT", {...}] for process_client_event
      fix PNS key derivation: use HKDF-Extract only, not Extract+Expand
      fix PNS relay URL trailing slash mismatch
      fix: preserve model on clone_session and decode permission response decisions
      fix: prevent console windows from flashing on Windows
      fix Q&A answer submit not working for remote sessions
      fix query_replaceable_filtered not handling arbitrary fold order
      fix remote messages clobbering in-flight streams
      fix remote messages not received until local message sent
      fix remote session status using stale replaceable event revisions
      fix: remove sync NDB queries that defeated async timeline loading
      fix: resolve macOS linker errors for local CI
      fix scroll position when switching sessions
      fix: separate Nostr event identity from CLI session ID for remote spawn
      fix: silence unused return value and unused mut warnings in tests
      fix: skip snapshot tests when no GPU adapter is available
      fix: skip snapshot tests when no GPU adapter is available
      fix: skip wgpu snapshot tests on CI
      fix support section: load logs on view and limit log file growth
      fix target sdk
      fix tentative permission buttons: show Send when composing message
      fix text clipping in chat by overriding StripBuilder truncate mode
      Fix text wrapping issues
      fix: toolbar gap fixed for realsies this time ;_;
      fix: toolbar gap, mobile scroll visibility, and welcome screen overlap
      fix: use hostname matching for local vs remote session detection
      fix: use max_completion_tokens instead of deprecated max_tokens
      fix: UTF-8 panics in tool_summary and session, fix double paren in tool descriptions
      fix zombie deleted sessions from out-of-order replaceable event batches
      fmt: rustfmt fixups
      force oled with --mobile flag
      Fullscreen MediaViewer refactor
      gif: disable continuous gif rendering
      giftwraps: support private reaction notifications
      github: ensure CI is always set
      gitignore: add beads
      gitignore: add .claude/
      gitignore: add claude
      gitignore: ds_store
      gitignore: ignore logcat
      gitignore: include junk so that `git clean` can handle it
      gitignore: remove cache
      hashtag: improve sanitization function
      header: fix auto-hide regression in narrow mode
      header: fix auto-hide regression in narrow mode
      header: skip hide animation on wide screens
      hide CWD and status bar for remote sessions in session list
      hide git status and interrupt hint for remote sessions
      i18n: always have en-XA available
      i18n: disable bidi for tests
      i18n: disable broken tests for now
      i18n: make localization context non-global
      icons: add new_message icon
      images: always resize large images
      images: disable useless animation frame log
      Implement soft keyboard visibility on Android
      ingest events via PNS wrapping so 1080 events exist in ndb
      Initial tab bar
      init notebook
      input: disable ctrl-forward/back nav when typing
      input: halve long press input duration
      input: support vi-like key nav as well
      introduce HybridFilter
      kittest: add first UI test for search_input_box (DECK-670)
      link tool results to their parent subagent
      lint: fix clippy and fmt issues
      lint: fix format issue
      lint: small lint fix
      lockfile: fixup
      log: changed urlcache log to debug
      log: less verbose unknown id logging
      log: make some routing logs into debug logs
      log: silence gif log
      macos: fix build script
      macos: fix sidebar spacing
      make clippy happy
      make PLAN/AUTO badges clickable and move to status bar
      markdown_ui: fix multiple tables clashing by adding id_salt
      md-stream: add markdown table parsing and rendering
      md-stream: add README
      md-stream: fix code block detection after paragraph with single newline
      md-stream: fix paragraph break detection when streaming char-by-char
      md-stream: fix truncated code fence language when streaming
      md-stream: zero-copy parser using Span indices instead of String allocations
      media: change is_narrow logic to is_scaled
      media: less blurry media
      media/trust: always show if its yourself
      media/viewer: click anywhere to close
      mediaviewer: decrease transition anim from 500ms to 300ms
      media/viewer: fix broken culling
      media/viewer: fix flicker on escape-close
      media/viewer: fullscreen transition animations
      media/viewer: handle click-to-close interactions
      media/viewer: provide image-click provenance
      media/viewer: slower animation
      mention: show username instead of display_name
      messages: add copy context menus for chat bubbles
      messages: add escape key to go back from create conversation
      messages: add input_context to conversation composer
      messages: add profile search to create conversation UI
      messages: always stick scroll to bottom
      messages: fix hang on startup
      messages: fix invisible text selection in self-sent chat bubbles
      messages: load conversations via async ndb.fold
      messages: make text selectable
      messages: move giftwrap processing to initialize
      messages: tweak style
      misc: driveby fixes
      model_picker: use Model enum, let backends pick their own default
      move all permission buttons to their own line below tool info
      move permission buttons to left-to-right layout
      multicast: broadcast context
      multi_subscriber: switch to debug statements
      mute: add mute user action from note and profile context menus
      name: display_name before name in NostrName
      nav: make the active column the one that is navigating
      nav: nav to accounts view for actions that require key
      nav: remove toolbar_visible auto-hide on scroll
      nav: reset toolbar visibility on navigation
      neg: add NIP-77 negentropy sync with multi-round fetching
      negentropy: fix infinite sync loop with dedup and richer results
      negentropy: limit sync to last 7 days
      negentropy: wait for fetched events to be ingested before next round
      net: switch ping/pong messages to trace
      nip05: add async validation for verified checkmark
      nip05: add async validation for verified checkmark
      nip10: switch to NoteReply instead of handrolled logic
      nip51: add docstring for apply_select_all_to_pack
      nip51: add docstring for entry_for_pack
      nip51: add docstring for RenderPackResponse
      nip51: add docstring for select_all_ui
      nip51: pluralize collapse header
      nip51: refactor and simplify ui collapse logic
      nip51: route card clicks to checkbox
      nip51: weak text color for about
      nit: remove mut match
      nit: rename to pop_to_root
      nix: add $ANDROID_JAR helper to shell
      nix: android: move gradle to android deps
      nix: cmake is needed now
      nix: emulator
      nix: use sccache
      nostrdb: bump to v0.7.0
      nostrdb: fix algo feeds
      nostrdb: fix double free on giftwrap relay strings
      nostrdb: fix ingester crash
      nostrdb: fix on windows
      nostrdb: fix windows build
      nostrdb: fix windows build
      nostrdb: only use 2 ingester threads
      nostrdb: update for windows and memleak fixes
      nostrdb: update for windows fix
      nostrverse: add accurate dimensions to all scene objects
      nostrverse: add click-to-select and drag-to-move objects in 3D viewport
      nostrverse: add dedicated relay support for multiplayer sync
      nostrverse: add drag-to-snap for placing objects on surfaces
      nostrverse: add furnished demo rooms with low-poly models
      nostrverse: add grid snap, parented object dragging with breakaway
      nostrverse: add object duplication (Ctrl+D)
      nostrverse: add outline shader for selected object highlighting
      nostrverse: add padding to editor panel
      nostrverse: add presence, structured locations, and AABB position resolver
      nostrverse: add reset button and richer demo tilemap
      nostrverse: add R key rotation controls for objects
      nostrverse: add room editing UI and save-to-nostrdb flow
      nostrverse: add rotation snap when grid snap is enabled
      nostrverse: add syntax-highlighted scene body to editor panel
      nostrverse: add third-person avatar with water bottle placeholder
      nostrverse: add tilemap path between rooms and URL-based tilesets
      nostrverse: add tilemap support with texture atlas rendering
      nostrverse: add velocity-based dead reckoning for presence interpolation
      nostrverse: add virtual rooms as standalone crate
      nostrverse: add WASD keyboard movement for fly camera
      nostrverse: break down build_space and sync_scene into focused helpers
      nostrverse: break down show_room_view and render_editing_panel
      nostrverse: change default container from room to space
      nostrverse: clean up dead code and hardcoded values
      nostrverse: clean up scene objects when expiring stale users
      nostrverse: defer relay subscription until connection is open
      nostrverse: fix avatar ground placement and smooth yaw rotation
      nostrverse: fix blank scene after reset
      nostrverse: fix deleted objects remaining rendered in scene
      nostrverse: fix editing panel layout by using vertical layout
      nostrverse: fix model scales to use 1 unit = 1 meter
      nostrverse: fix outline thickness and drag-start selection highlight
      nostrverse: fix rotation editor euler decomposition and tilemap z-fighting
      nostrverse: fix use-after-free in nostr_events tests
      nostrverse: follow protoverse conventions in demo scene
      nostrverse: integrate renderbud 3D renderer for room views
      nostrverse: let subscription handle demo room load after ingest
      nostrverse: load rooms through nostr events via nostrdb
      nostrverse: persist rotation as human-readable Euler degrees
      nostrverse: quick refactors — parse_vec3, self_user, subscription dedup
      nostrverse: refactor tilemap textures to data-driven TileStyle
      nostrverse: reject out-of-order presence events
      nostrverse: remove auto-snap-to-parent during free drags
      nostrverse: use remote urls for models
      nostrverse: use scene graph parenting for relative object placement
      note/action: add ScrollInfo
      notebook: draw edges and arrows
      notebook: fix heights of nodes
      notebook: fix node sizes
      notebook: move ui code into its own file
      notebook: remove redundant closure
      note: cleanup wide/standard implementation
      notedeck app: add clndash
      notedeck: include frame history
      note: fix from_hex crash on bad note ids
      note_follows: remove unneeded derefence
      note/options: made wide the default
      note/options: remove redundant has function
      note/options: simplify flag logic
      note: small doc fix
      note: turn off full date view for previews
      note/ui: fix reply line when replying in narrow mode
      onboarding: restore demo deck
      perf: a few micro optimizations
      perf: profile a few more things
      persist active sessions via kind-31988 replaceable nostr notes
      persist permission responses as nostr events for all sessions
      post: fix bug where send shortcut send unfocused inputs
      post: ingest notes locally so they appear immediately
      post: set client tag to Damus Android on android
      previews: disable for now
      profile: fetch new metadata when visiting profiles
      profile: fix crash with ProfileState defaults
      profile: rename to add as column
      protoverse: add s-expression parser crate
      protoverse: fix f32→f64 precision noise in serialized numbers
      protoverse: remove bad test
      publish deleted state event when session is removed
      readme: fix link
      readme: tweaks
      readme: we're in beta status
      reduce excessive chat margins for tablet and smaller screens
      refactor: collapse client label settings; drop CLI/settings toggles
      refactor: consolidate permission state into PermissionTracker struct
      refactor(dave): extract inline code into separate modules
      refactor(dave): replace egui::Window modals with full-panel overlays
      refactor: extract decode_permission_response to eliminate duplicate JSON parsing
      refactor: extract input_ui into its own function
      refactor: extract queue_built_event to deduplicate event publish pattern
      refactor: extract shared helpers to reduce duplication in dave crate
      refactor: migrate release protocol from NIP-94 to NIP-82 (zapstore)
      refactor: move auto-updater from Notedeck to Chrome
      refactor: move hashtag counting out of mutes
      refactor: move input buttons ui into its own fn
      refactor: move release_sub into Updater
      refactor: nevernest get_display_name
      refactor: ocd unnecessary pass by value
      refactor: rename process to process_router_action
      refactor: rename process to process_selection
      refactor: replace notification bool prop drill with note option
      refactor: unify permission publish data into PermissionPublish struct
      refactor: unify permission resolution into PermissionTracker::resolve()
      relay: make multicast a desired relay
      release: changelog
      Release Notedeck Beta v0.4.0
      release: update to com.damus.notedeck to match appid
      remove beads
      Remove Claude permission timeout
      remove explicit loop continue
      remove hjkl bindings
      remove unused html file
      rename Chats to Agents in session list view
      rename Contacts to Home
      rename egui-md-stream to md-stream
      renderbud: fix clippy warnings
      reply: add some space after reply box
      report: add NIP-56 report events from note and profile context menus
      re-subscribe to PNS relay on reconnect and fix duplicate sessions
      Revert "android: fix remaining keyboard issues"
      Revert "feat(note-actionbar): refine icons"
      Revert "fix(columns): render wide notes on narrow screen"
      Revert "fix zombie deleted sessions from out-of-order replaceable event batches"
      Revert "hide CWD and status bar for remote sessions in session list"
      Revert "nip51: pluralize collapse header"
      Revert "relay: make multicast a desired relay"
      Revert "timeline: rebuild filter when contact list changes"
      Revert "Unify sub for contacts in accounts & timeline"
      ripgrep: add ignore file for ftl files
      route: centralize resource cleanup for popped routes
      router: fix router selection
      sand-themed syntax highlighting with tokenizer tests
      scroll: simple fix
      search: add nevent1 bech32 support
      search: fix repeated focus on input
      session_events: fix timestamp inheritance, subscription-based archive loading
      session_events: generate kind-1988 events in real-time during live conversations
      session_events: lossless round-trip with seq, split, tool-id, cwd tags
      session_events: permission events + relay publishing + remote response polling
      session_events: seed live threading from archive events on resume
      session_events: skip redundant archive conversion, fix threading root selection
      session_events: split source-data to kind 1989, wire archive into resume flow
      session_loader: use seq tag as tiebreaker for message ordering
      settings: add database compaction UI
      settings: add note preview to appearance section for zoom preview
      settings: add TOS compliance data structures
      settings: fix route to relay
      settings: remove font size setting, use zoom level only
      shell: add mako and requests to python packages
      shrink sidebar on medium screens for better chat area on tablets
      side_panel: add menu items, relay indicator, and active route highlighting
      side_panel: improve connectivity indicator with signal bars
      skip old JSON-content session state events during restore
      subscribe to PNS events on relays for remote session discovery
      suppress auto-steal focus while user is typing
      test: add real self-replace + relaunch integration tests
      test: add snapshot test for auto-update bar via Notedeck::tick()
      test(dave): add focus queue tests
      test(dave): add integration tests for poll_editor_job
      test: fix flaky test_find_latest_release by using unique event ids
      test: fix flaky test_find_latest_release with wait_for_all_notes
      test: fix github_dry_run to find latest release with assets
      test: fix relay message tests
      test: mark github_dry_run as #[ignore] until release has artifacts (DECK-468)
      test: update snapshots for design system token changes
      test: use software rendering for deterministic snapshot tests
      thread: enable selectable text in threads
      thread: move comment to the correct place
      threads: disable wide in threads
      thread: selected thread notes should be... selectable
      timeline: fix slop regression with should_subscribe_locally
      timeline: only mark unseen if we had a non-merge insert
      timeline: return MergeResponse on insert
      timeline: show media on universe timeline
      time: more time-ago granularity in months/years
      todos
      toolbar: go to route root when clicking active toolbar button
      toolbar: process actions
      tos: add TOS acceptance screen shown on first launch
      tos: add TOS acceptance screen shown on first launch
      tweak follow pack design
      tweak minSdk
      ui: add AnimationMode to control GIF rendering behavior
      ui: add note truncation
      ui: add ProfilePic::from_profile_or_default
      ui: add rolling number function
      ui: add some margin to chrome sidebar
      ui: apply context menu padding globally via context_menu helper (DECK-884)
      ui/carousel: refactor to use indices
      ui/column: include pfp in back response
      ui/column: remove move/remove column buttons on narrow
      ui: consolidate profile search into shared notedeck_ui widgets
      ui crate and chrome sidebar
      ui: don't auto-repaint that often
      ui: fix a bunch of missing hover pointers
      ui: fix broken note previews
      ui: fix like button not visible in light theme
      ui: improve search button and chat button toolbar icons
      ui: increase context menu padding for better touch targets (DECK-884)
      ui: keep original design on non-narrow
      ui: make post replies selectable
      ui/mention: fix weird mention text size
      ui: move debug slider to ui crate
      ui: move note and profile rendering to notedeck_ui
      ui/narrow: restore padding
      ui/note: fix actionbar note responses
      ui/note: fix another reply_desc wrapping issue
      ui/note: fix extra padding in block renderer
      ui/note: fix indented actionbar in non-wide mode
      ui/note: fix reply description item spacing
      ui/note: fix weird ... placement regression
      ui/note: fix width instabilities because of spacing_mut
      ui/note: make buttons larger
      ui: note metadata stats
      ui/note: refactor reply line into a function
      ui/note: show full link type in unhandled mentions
      ui/note: simplify weird hack and make note of it
      ui/note: slightly more spacing between blocks
      ui/note: small refactor to use returns instead of break
      ui/note: use rolling numbers for note stats
      ui/profile: fix dubious profile editing
      ui: remove show_pointer
      ui: rename actionbar function
      ui/replydesc: quick TextSegment cleanup/optimize
      ui/settings: fix small double clone nit
      ui/timeline: make notification text smaller
      ui/wallet: small refactor to use return instead of break
      ui: wrap reply description
      universe: add full tabs
      update dashboard snapshots
      update lock
      update nostrdb
      updater: add auto-update feature flag and notedeck-release CLI tool (DECK-468)
      updater: add auto-update from GitHub Releases (DECK-468)
      updater: replace GitHub API with Nostr-based release discovery (DECK-468)
      use dedicated PNS relay (ws://relay.jb55.com) instead of broadcasting
      use horizontal-only scroll for diff view
      use tags instead of JSON content for session state events
      v0.5.1
      v0.5.2
      v0.5.3
      v0.5.4
      v0.5.5
      v0.5.6
      v0.5.7
      v0.5.8
      v0.5.9 - Better Media!
      v0.6.0
      v0.7.0
      v0.7.1
      vendor: add renderbud 3D renderer crate
      wallet: fix nwc copy/paste
      wallet: remove unused flag in note context
      wasm: add drawing primitives, layout queries, and extract run_wasm_frame
      wasm: add notedeck_wasm crate with safe command buffer runtime
      windows: don't show terminal window
      windows: fix time overflow crash
      wip: AI conversation nostr notes (shelved for redesign)
      wip codex debugging
      wip(dave): add session resume support (untested)
      wire PNS into dave startup, bump nostrdb to nip-pns branch
      zaps: fix invalid zaps

kernelkind (625):
      Address CodeRabbit docs and fixture-kind cleanups
      Clarify & enforce selected-only behavior in `Accounts` subscription
      Fix flaky test_zap_event
      Handle Codex requestUserInput prompts in Dave UI
      Harden Notedeck teardown ordering and test mapsize
      Harden messages E2E relay and teardown behavior
      Harden participant relay prefetch E2E readiness
      Join background workers during Messages teardown
      NoteUnits: use `UnitKey` instead of just `NoteKey`
      Reduce Windows test-runner NDB mapsize
      Reduce Windows testrunner NDB mapsize for E2E
      Revert "feat: transitively trust images from parent note"
      Revert "fix: nav drawer shadow extends all the way vertically"
      Revert "tmp: temporary AccountCache"
      Run messages E2E serially in CI
      Stabilize high-volume messages E2E convergence checks
      Stabilize messages E2E convergence polling
      Stabilize messages E2E harness waits
      TMP: new egui-nav
      TMP: temporary author for trusted pks list
      TMP: update egui for better TextInputState handling
      TMP: update egui-nav
      TMP: use new egui-nav to fix scroll offset issues
      TMP: use new egui-nav with popup
      Tighten relay-visibility startup E2E device lifecycle
      Unify sub for contacts in accounts & timeline
      UserAccount use builder pattern
      `AccountData`: decouple query from constructor
      `ImagePulseTint` -> `PulseAlpha`
      `Wallet` token parser shouldn't parse all
      accounts: check if selected account has wallet
      accounts: make fallback pk non optional
      accounts: move accounts to own module
      accounts: move mute stuff to own module
      accounts: move relay stuff to own file
      accounts: update & optimised find
      actionbar: don't early return
      actionbar: reintroduce error messages
      add ChromePanelAction::Profile & use for pfp
      add Nip51SetCache helper methods
      add ReactionFragment error msg
      add Repost to composite unit & fragment
      add UI for (un)follow
      add `AccountCache`
      add `Accounts` to `NoteContext`
      add `AnimationHelper::scaled_rect`
      add `CompositeType::Repost`
      add `Contacts`
      add `CustomZapView`
      add `DragSwitch`
      add `LNUrlPayResponse`
      add `NoteId::from_bech` method
      add `NoteId` hashbrown `Equivalent` impl
      add `NotePayload::noteref` helper
      add `NotesFreshness` to `TimelineTab`
      add `NotesOpenResult`
      add `ProfileContext`
      add `RelayDefaults`
      add `RenderNavAction::RepostAction` & render `RepostDecisionView`
      add `RepostUnit` & `RepostFragment`
      add `SearchType`
      add `SingletonRouter`
      add `TexturesCache`
      add `ThreadNote::set_scroll_offset`
      add `ThreadSubs` for managing local & remote subscriptions
      add `TimelineCache` helper methods
      add `TimelineUnits`
      add `Wallet` to `UserAccount`
      add `Zap`
      add `after_action` to `SingletonRouter`
      add `load_texture_checked`
      add `route_uses_frame`
      add `scroll_id` for all views with vertical scroll
      add `scroll_offset` to `NoteAction::Note`
      add `trust_media_from_pk2` method
      add actions for follow/unfollow
      add blurhash dependency
      add clippy rule to disallow the usage of `load_texture`
      add constructor for `AccountData`
      add copy to clipboard img
      add default zap
      add flags to `ScaledTexture`
      add get wallet method
      add hashbrown
      add hashbrown
      add human_format dep
      add impl for `ScaledTextureFlags::RESPECT_MAX_DIMS`
      add info statements
      add keys section to settings
      add muted helper
      add nav drawer router
      add new Accounts button to chrome sidebar
      add nip51 set caching structs
      add nwc dependency
      add onboarding 'manager'
      add onboarding related state to app
      add onboarding view
      add one shot error message
      add overlay conception to `Router`
      add overlay to `RouterAction`
      add pfp bounding box to `NoteResponse`
      add preview flag to `NoteAction`
      add reactions kind to notifications filter
      add repost fns
      add search improvements
      add select_by_route
      add threads impl
      add tokio dep to notedeck package
      add toolbar defaults
      add toolbar icons to `notedeck_ui`
      add toolbar related logic
      add tracy support
      add unread note indicator option to `NoteView`
      add virtual list to `Onboarding`
      add wallet ui
      allow body on unknown profile
      allow removal of Damoose account
      allow reposts in "Notes" timeline tab
      appease clippy
      appease clippy
      appease clippy
      appease clippy
      appease clippy
      assets: add accounts image
      bugfix: properly sub to new selected acc after removal of selected
      bugfix: txn failed
      bugfix: unsubscribe all decks when log out account
      bugfix: unsubscribe from timelines on deck deletion
      bump nostrdb
      cargo: add `android-keyring`
      cargo: add `keyring`
      cargo: expose egui-nav to chrome
      chore(profiling): markup composite render path
      chore(tracy): repaint every frame
      chore: update Docker test config to match CI environment
      chrome: method to find whether there are unseen notifications
      chrome: readd click to toggle nav drawer
      chrome: ui polish
      clippy: allow collapsible match
      construct NoteBuilder from existing note
      copy toolbar rendering to `notedeck_ui`
      custom-zap: dont force keyboard
      dave: custom session titles with cross-device sync
      dave: normalize DAVE_RELAY url to always have a trailing slash
      decouple `RelayView` UI from state mutation
      display name should wrap
      don't expose mutable access to `UserAccount`
      don't show zap button if no wallet
      drawer: only use drag on mobile
      enforce scroll_id for `ThreadView`
      enostr: add equivalence between Pubkey & bytes
      expose `AccountCache::falback`
      expose `AccountSubs`
      expose indexmap to notedeck
      extend `ZapAction`
      extract a pub `render_media` from image_carousel
      extract notifications filter to own method
      feat(ContactsListView): add ability to use HashSet as well
      feat(TMP): TimelineSub::dependers shim (for commit history)
      feat(accounts): add advertised relay helper
      feat(action): add `NoteAction::React`
      feat(action): add `ReactAction`
      feat(android-keyring): use correct android keyring builder
      feat(assets): add like icon
      feat(blur): add BlurCache
      feat(cargo): add crossbeam
      feat(cargo): add messages deps
      feat(chrome): add --title CLI flag to show native window titlebar
      feat(composite-cluster): do culling for pfps
      feat(conv-renderable): add `ConversationRenderable`
      feat(convo-cache): add `ConversationCache`
      feat(convo-state): add `ConversationStates`
      feat(dave): add Ctrl+` shortcut to open a new terminal window
      feat(dave): add Exit button to deny tool call and cancel the turn
      feat(dave): add named run configurations with Nostr sync
      feat(dave): add right-click "New Session" on CWD folder headers
      feat(dave): add worktree creator
      feat(dave): clipboard image paste via right-click context menu
      feat(dave): group session list by host and cwd with collapsible folders
      feat(dave): persist collapse state across app restarts
      feat(dave): suggest existing run configs in the run config editor
      feat(dave): truncate long paths from the start for cwd/host text
      feat(dave): use intuitive symbols for git status display
      feat(dm-relay-list): send default DMs relay list on acc creation
      feat(enostr): add profiling crate
      feat(enostr-relay): add NIP-11 fetch lifecycle and limit application
      feat(error): add `Error::Keyring`
      feat(event): add `send_reaction_event`
      feat(gif): add AnimatedImgTexCache
      feat(gif): new Animation
      feat(gif): new ProcessedGifFrame
      feat(giftwrap): make sure to sub init filter
      feat(hyper): install crypto provider
      feat(images): new TextureState
      feat(img-parsing): new parse_img_response
      feat(job-cache): new JobCache
      feat(jobs): add `schedule_receivable`
      feat(jobs): mpsc -> mpmc
      feat(jobs): structs for new JobCache
      feat(jobs-media): basic media jobs structs
      feat(key-store): upgrade key storage to use OS secure store
      feat(keyring): add keyring helper
      feat(media-job): pre & post actions
      feat(media-jobs): add media JobCache to app
      feat(media-loading): Images helpers
      feat(media-loading): add TexturesCache to Images
      feat(media-loading): new Images::latest_texture
      feat(media-loading): new TexturesCache
      feat(media-loading): wire new media loading cache
      feat(media-rendering): add helpers for various media rendering configs
      feat(message-store): add MessageStore
      feat(messages): conversation ID registry
      feat(messages): ensure selected account DM relay list
      feat(messages): prefetch participant DM relay lists and route outgoing messages
      feat(messages-app): app wiring
      feat(mime-cache): upgrade UrlMimes
      feat(msgs-nav): process responses/actions
      feat(msgs-ui): add `ConversationListUi`
      feat(msgs-ui): add `ConversationUi`
      feat(msgs-ui): add `CreateConvoUi`
      feat(msgs-ui): add navigation UI
      feat(msgs-ui): helpers
      feat(msgs-ui): main UI
      feat(msgs-ui): messages UI
      feat(network): add hyper
      feat(network): hyper networking
      feat(nip17): Nip17 helpers
      feat(nip17): dm relay list helpers
      feat(nip17): send conversation message
      feat(nip44): add nostr crate nip44 feature
      feat(note): helper to get all p tags from note
      feat(notedeck): wire relay NIP-11 jobs and status-aware fetch
      feat(notedeck-ui): HorizontalHeader
      feat(outbox): add `BroadcastRelay`
      feat(outbox): add `CompactionRelay`
      feat(outbox): add `MulticastRelayCache`
      feat(outbox): add `NotedeckRef`
      feat(outbox): add `OutboxPool::start_session` helper
      feat(outbox): add `OutboxPool`
      feat(outbox): add `OutboxSessionHandler`
      feat(outbox): add `OutboxSession`
      feat(outbox): add `OutboxSubscriptions`
      feat(outbox): add `QueuedTasks`
      feat(outbox): add `RelayCoordinator`
      feat(outbox): add `TransparentRelay`
      feat(outbox): add `Wakeup` trait
      feat(outbox): add `WebsocketConn::from_wakeup`
      feat(outbox): add relay limit objects
      feat(outbox): concrete Wakeup impl for `Outbox`
      feat(outbox): id types for outbox
      feat(outbox): improve reconnect backoff handling
      feat(outbox): misc types
      feat(outbox-int): Notedeck::init pass along `OutboxSession`
      feat(outbox-int): add `OutboxPool` & `ScopedSubsState` to `Notedeck`
      feat(outbox-int): integrate outbox into relay view
      feat(outbox-int): integration outbox ingestion
      feat(outbox-int): migrate accounts to use outbox
      feat(outbox-int): migrate nostrverse to use outbox
      feat(outbox-int): migrate onboarding to use outbox
      feat(outbox-int): move remote timeline ownership to scoped subs
      feat(outbox-int): only use one FilterState for timeline
      feat(outbox-int): process outbox events
      feat(outbox-int): route remote thread subs through scoped subs
      feat(outbox-int): use `Outbox` for following
      feat(outbox-int): use outbox for broadcasting note
      feat(outbox-int): use outbox for people list
      feat(outbox-int): use outbox for sending mutes, unmutes & reports
      feat(outbox-int): use outbox for sending posts
      feat(outbox-int): use outbox for sending reactions & zaps
      feat(outbox-int): use outbox for sending repost
      feat(outbox-int): use outbox to send nip17 message
      feat(perf): add profiling macros
      feat(reaction): user can send reactions
      feat(reactions): use ProfileKey when possible for performance
      feat(relay): support CLOSED message
      feat(router): move route_to_replaced to Router & add other impl
      feat(scoped-sub): add scoped sub owner keys
      feat(scoped-subs): add `RemoteApi`
      feat(scoped-subs): add account-aware oneshot and publish APIs
      feat(scoped-subs): add core runtime and key model
      feat(scoped-subs): add owner slots and app-facing facade
      feat(static-imgs): add StaticImgTexCache
      feat(ui): add like button
      feat(ui-state): add `reaction_sent_id`
      feat: "All" & "Mentions" notifications tabs like Damus iOS
      feat: copy damus.io link to clipboard
      feat: enable transitive trust for repost
      feat: transitively trust images from parent note
      fetch zap invoice
      filter: add repost kind to `FilteredTags::into_filter`
      filter: remove unused code
      fix `NoteUnits` front insertion logic
      fix blank thread from notifications
      fix contact list bug
      fix duplicate ReactionUnit for multiple kth indices
      fix log messages
      fix reaction target bug
      fix scroll regression
      fix zaps networking tests
      fix(android): fix build problem
      fix(android): fix build problem
      fix(clippy): appease
      fix(dave): add paragraph breaks between codex agent messages
      fix(dave): deny permission when user condition injection fails
      fix(dave): fail closed when approval UI is unavailable
      fix(dave): finish queued session and permission reliability items
      fix(dave): git status color codes on macOS
      fix(dave): include JSON-RPC code in rejection responses
      fix(dave): include cache tokens in context bar (Claude only)
      fix(dave): infinite "computing..." by adding timeouts to backend awaits
      fix(dave): reject malformed requestUserInput RPCs
      fix(dave): wrap input textbox in ScrollArea for overflow scrolling
      fix(enostr): add exponential backoff to multicast broadcast queue flush
      fix(media): persist full-resolution content for fullscreen quality
      fix(messages): DMs sometimes fail to load
      fix(messages): Wait for both giftwraps (self-copy + recipient) in relay sync points
      fix(messages): add limit and since to giftwrap filter
      fix(messages): fix relay list race and EOSE readiness in E2E tests
      fix(nav-drawer): shadow extends all the way vertically
      fix(nav-drawer): spacing issue
      fix(notif-indicator): more performant impl
      fix(thread): remove flicker on opening thread
      fix(thread): remove flicker on opening thread
      fix(thread-subs): roll back local state on unsubscribe failure
      fix(timeline-subs): preserve local state on ndb unsubscribe failure
      fix(toolbar): always display toolbar at small scroll height
      fix: WalletView don't request keyboard focus if narrow
      fix: add tag for hashtag in reply
      fix: address CodeRabbit changes
      fix: can upload photo from reply or quote
      fix: correct --no-keystore flag and make --testrunner imply no-keystore
      fix: crash on startup
      fix: custom zap wrapping
      fix: detect stale relay connections via pong timeout
      fix: don't exit early in account retrieval
      fix: don't reset scroll position when switching toolbar
      fix: image shimmer bug
      fix: improve messages relay discovery and remove giftwrap since optimization
      fix: increase relay event processing limit per frame
      fix: join background threads on drop to prevent resource leaks
      fix: nav drawer shadow extends all the way vertically
      fix: no longer make the scroll position jump oddly
      fix: profile wrapping
      fix: re-add debug features
      fix: repost desc text size on newline
      fix: resolve clippy warnings and update Cargo.lock
      fix: resolve clippy warnings for unnecessary unsafe and missing Default
      fix: sometimes most recent contacts list wasn't used
      get scroll id for `Route`
      hotfix: can login again
      image: `repost_image` wrapper
      images: make `MediaCache` hold `MediaCacheType`
      images: make promise payload optional to take easily
      images: move fetch to fn
      implement blurring
      increment sub count when necessary
      insert space after mention selection
      integrate global wallet into app
      integrate new threads conception
      integrate onboarding
      introduce & use `JobPool`
      introduce JobsCache
      introduce `ImagePulseTint`
      introduce `NdbQueryPackages`
      introduce `PayCache`
      introduce `TokenHandler`
      introduce `ZapWallet`
      introduce `Zaps`
      introduce blur
      introduce failing test for reaction duplication bug
      log: info -> debug for ndb can't find repost
      make `Contacts::is_following` use bytes instead of `Pubkey`
      make `TimelineCache::notes` private
      make `TimelineCache::timelines` private
      make `UserAccount` cloneable
      make `Widget` impl `ProfilePic` mutably
      make `get_reposted_note` pub
      make `get_users_zap_address` `Result`
      make `tabs_ui` return `InnerResponse`
      make compose button animate horiz rather than vert
      make endpoint error into struct
      make eye button public
      make notifications sub transparent
      make search icon more customizable
      make selected accounts non optional
      make since optimize accept Option<&NoteRef> instead of notes
      make styled button toggleable
      make update return AppResponse instead of Option<AppAction>
      mention-picker: re-add spacing from inner_margin
      mentions: don't lose focus after select mention
      method to get current default zap amount
      migrate accounts to be referenced through pks instead of indices
      migrate to check following through `Contacts::is_following`
      move (de)serialization of wallets & accounts to own structs
      move `AcountData` into `UserAccount`
      move `FALLBACK_PUBKEY`
      move `HybridSet` to own file
      move `WalletState` to UI
      move `ZapAddress` to `zaps/mod.rs`
      move `close_button` to `ui/widgets.rs` as `x_button`
      move `modify_advertised_relays` into accounts/relay.rs
      move `sized_button` into `ui/widgets` as `styled_button`
      move `styled_button_toggleable` to notedeck_ui
      move `update_relay_configuration` to account/relay.rs
      move aux code to bottom
      move error out of `AnyZapState`
      move polling responsibility to `AccountData`
      move select account logic to own method
      move switching related actions from notedeck -> columns
      nav: move action processing to own method
      nav: move process nav response to own method
      nav: reduce back nav threshold from 1/2 to 1/4
      new `egui`
      nip 51 set widget
      note media: only show full screen when loaded
      note media: unnest full screen media
      note zap button
      note: account for mutes in the notifications dot
      note: refactor to use action composition & reduce nesting
      note: remove repost from note ui
      note: remove unnecessary derive macros from `NoteAction`
      notedeck_ui: move carousel to `note/media.rs`
      only deserialize first route in each column
      paint unseen indicator
      pass `NoteAction` by value instead of reference
      perf(carousel): downscale from disk if possible
      perf-fix(banner): use our custom img loader via jobs for banner
      perf: improve filter generation performance
      post: unnest
      process popup after action
      process repost notes
      process wallet action
      process zaps in `Notedeck`
      profiling: add more profile markup
      prop `Onboarding` as mut
      prop `UnknownIds` for initial timeline
      prop drag id through responses instead of manual wiring
      propagate `DefaultZapState` to wallet ui
      propagate `Images` to actionbar
      propagate `JobsCache`
      propagate current account
      pulse pending zap button
      refactor scrolling for post, reply & quote views
      refactor(ContactsListView): generify action naming
      refactor(ContactsListView): migrate away from NoteContext
      refactor(ContactsListView): move to notedeck_ui crate
      refactor(NoteFreshness): remove now unnecessary `NoteFreshness`
      refactor(TMP): pool -> legacy pool shim for commit history
      refactor(assets): previous icon had weird artifacts on border
      refactor(assets): rename like icon -> filled version
      refactor(clippy): appease
      refactor(clippy): appease
      refactor(columns): share code `attach_timeline_column`
      refactor(dave): split session_item_ui into agent_row_ui and chat_row_ui
      refactor(egui-nav): bump
      refactor(enostr): add FlushBackoff to backoff module
      refactor(enostr): expose outbox objects
      refactor(enostr): extract backoff into own module
      refactor(gif): extract processed frame collection
      refactor(gif): nevernest process_gif_frame
      refactor(jobs): move related jobs things to own module
      refactor(media): key texture requests by variant
      refactor(media): make `ImageType` more obvious it uses pixels
      refactor(messages): Improve E2E test reliability and consistency
      refactor(messages): Stabilize messages E2E test linux
      refactor(messages): new event prop Note instead of String
      refactor(messages): remove unused conversation cache loaders
      refactor(multicast): move multicast to own file
      refactor(nav): Move BodyResponse to notedeck crate
      refactor(nav): move chevron to notedeck_ui
      refactor(nav): rename BodyResponse -> DragResponse
      refactor(nip51-set): extract local cache/sub loader
      refactor(outbox-int): key local thread state by account
      refactor(outbox-int): manage scoped owners per thread scope depth
      refactor(outbox-int): remove legacy `Subscriptions`
      refactor(process-event): extract shared logic to notedeck crate
      refactor(route): extract Router to notedeck core
      refactor(search): remove unnecessary params
      refactor(thread-subs): extract unsubscribe helpers
      refactor(timeline): split multi_subscriber into thread & timeline subs
      refactor(timeline-subs): key local timeline subs by account
      refactor(websocket): add comments & helper
      refactor(websocket): move `Relay` from mod.rs -> websocket.rs
      refactor(websocket): move `WebsocketRelay` -> websocket.rs
      refactor(websocket): rename `Relay` -> `WebsocketConn`
      refactor(websocket): rename member variable relay -> conn
      refactor: appease clippy
      refactor: appease clippy
      refactor: appease clippy
      refactor: clippy
      refactor: expose configurable pong timeout on OutboxPool
      refactor: impl transitive trust via `NoteOptions::TrustMedia`
      refactor: move `galley_centered_pos` to notedeck_ui
      refactor: move `profile_body` to fn
      refactor: move legacy RelayPool usage exclusively to dave
      refactor: move legacy event processing to dave
      refactor: move profile.rs -> url.rs to new module
      refactor: move shared context stuff up in scope
      refactor: remove unnecessary code
      refactor: remove unnecessary old JobsCache code
      refactor: rename `NoteAction::Quote` -> `Repost`
      refactor: rename assets
      remove `MuteFun` prop
      remove commented out code...
      remove duplicate `UnknownIds` initialization
      remove unnecessary FilterState::NeedsRemote filter
      remove unnecessary `#[allow(dead_code)]`
      remove unnecessary `DragSwitch`
      remove unnecessary method
      rename `LNUrlPayRequest` -> `LNUrlPayResponseRaw`
      rename `SearchResultsView` => `MentionPickerView`
      rename `get_users_zap_endpoint` -> `get_users_zap_address`
      render chrome nav drawer
      render follow pack by index from virtual list
      render profile context button
      replace `HybridSet` with `NoteUnits`
      replace `MultiSubscriber` with `TimelineSub`
      route: add CloseSheetThenRoute `RouterAction`
      route: add `RepostDecision`
      send contact list event on account creation
      send kind 3 event
      set fresh from `TimelineCache`
      set scroll offset when routing to thread
      set variable for scroll offset
      split `AccountStorage` into reader & writer
      split popup correctly for repost & update egui-nav
      stop error log spam
      test(chrome): cover CLI title startup behavior
      test(dave): cover codex paragraph breaks
      test(dave): cover collapse state persistence
      test(dave): cover cwd header new-session menu
      test(dave): cover exit tool call button
      test(dave): cover request user input prompts
      test(dave): cover run config suggestions
      test(dave): cover session collapse navigation
      test(dave): cover terminal shortcut launch flow
      test(dave): fix terminal override cwd test on Windows
      test(enostr-relay): cover NIP-11 lifecycle and outbox backoff flows
      test(messages): add isolated relay delivery tests
      test(nip17): dm relay list helpers
      test(notedeck): add local NIP-11 fetch networking coverage
      test(outbox): `CompactionRelay`
      test(outbox): `OutboxPool`
      test(outbox): `OutboxSession`
      test(outbox): `OutboxSubscriptions`
      test(outbox): `RelayCoordinator`
      test(outbox): `TransparentRelay`
      test(outbox): add multi-relay eose cleanup regression
      test(outbox): add outbox integration tests
      test(outbox): add reconnect backoff and jitter bound coverage
      test(outbox): limits
      test(outbox): misc types
      test(outbox): outbox ids
      test(outbox): utils
      test(refactor): remove legacy RelayPool generator
      test(scoped-subs): cover runtime upsert, ownership, and account-switch semantics
      test(scoped-subs): validate relay targeting for oneshot and publish APIs
      test(scoped-subs): verify owner-slot stability and lifecycle drop
      test: NoteUnits repost test
      test: add E2E test infrastructure and messages/columns test suites
      test: add Messages UI hooks for end-to-end coverage
      test: better naming for NoteUnits tests
      test: secure store key mgmt
      test: tighten denied Claude stream assertions
      thread UI
      threads: fix other replies not rendering in presence of one muted
      tmp(refactor): Animation -> AnimationOld
      tmp(refactor): Images::latest_texture -> latest_texture_old
      tmp(refactor): MediaRenderState -> MediaRenderStateOld
      tmp(refactor): ObfuscatedTexture -> ObfuscatedTextureOld
      tmp(refactor): ProcessedGifFrame -> ProcessedGifFrameOld
      tmp(refactor): TextureState -> TextureStateOld
      tmp(refactor): TexturesCache -> TexturesCacheOld
      tmp(refactor): parse_img_response -> parse_img_response_old
      tmp(refactor): rename current jobs stuff to Old
      tmp: accounts shim
      tmp: temporary AccountCache
      tmp: upgrade `egui-nav` to use `ReturnType`
      toggle messages app ON by default
      track all timeline related subscriptions in `TimelineSub`
      ui: add `ProfileContextWidget`
      ui: add `RepostDecisionView`
      ui: add `hline_with_width`
      ui: add like icon
      ui: add rendering for `NoteUnit`s
      ui: add support for non-notification composite rendering
      ui: minor tweaks
      ui: modularize composite entry rendering & fix tr
      ui: reactions closer approximation of iOS design
      ui: remove unnecessary reverse
      ui: render repost cluster impl
      ui: repost description impl
      ui: show default zap amount in wallet view
      unknownids: use pk bytes
      unknowns: use unowned noteid instead of owned
      update egui-nav
      update egui_nav
      upgrade `TimelineOpenResult` to hold new pubkeys too
      use UserAccount for account storage
      use `AccountSubs` for timeline contact sub
      use `Contacts` in `AccountData`
      use `CustomZapView`
      use `DragSwitch` in `Column`
      use `DragSwitch` to allow dragging anywhere in navigation
      use `NdbQueryPackage` to call ndb::query multiple times
      use `NwcError` instead of nwc::Error
      use `PayCache` when zapping
      use `TimelineUnits` instead of `Vec<NoteRef>`
      use `ZapWallet`
      use `Zaps`
      use `load_texture_checked` over `load_texture`
      use default zap amount for zap
      use indexmap
      use popup sheet for `CustomZapView`
      use router action
      use saturating sub
      use the onboarding follow pack curator pubkey
      use toolbar in columns rather than chrome
      use unseen notification indicator
      wallet
      wallet route
      wallet side panel button
      wallet: helper method to get current wallet
      wallet: remove unnecessary mut
      zap: add requirements for zapping user

Fernando López Guevara (46):
      chore(macos): fix cargo-bundle
      feat(app_images): add module to manage static app image assets
      feat(column): add tooltip on remove column button
      feat(full-screen-media): add image URL in top bar and navigation dots in bottom bar
      feat(full-screen-media): add swipe navigation
      feat(hashtag-column): handle new hashtag on Enter key press
      feat(image_carousel): navigate media with arrow left/right keys
      feat(mobile): improve layout and behavior on narrow screens
      feat(note): created at show full date format
      feat(note): show full created date format on selected notes
      feat(note-actionbar): refine icons
      feat(note-view): show note client
      feat(notedeck): add cross-platform URI opener
      feat(profile): add tooltip on copy npub
      feat(profile-view): split nip05 when is_narrow
      feat(profile-view): split profile info entries when is_narrow
      feat(profile_view): add profile column from context options only when it’s missing
      feat(settings): add settings view
      feat(settings): allow sorting thread replies newest first
      feat(settings): persist settings to storage
      feat(settings): persist settings to storage
      feat(settings): persist settings to storage
      feat(settings): show note full date
      fix(add_column): add vertical scroll
      fix(chrome): add hover text and pointer cursor to sidebar elements
      fix(columns): prevent crash when switching to account with no columns
      fix(columns): render wide notes on narrow screen
      fix(compose-button): apply icon_color to compose button edge circles & add hover text
      fix(content): handle case where notes are not loaded
      fix(deck): show column picker when deck has no columns
      fix(media): add spacing
      fix(media): edge-to-edge image display on narrow screen
      fix(media): use ScaledTexture
      fix(note-content): avoid empty text blocks
      fix(note_actionbar): add invisible label to stabilize section width ¯\_(ツ)_/¯
      fix(profile): split always
      fix(search): make input background gray in light mode
      fix(settings): use localization
      fix(settings): use localization
      fix: skip blurring for user's own images
      hashtag-column: allow multiple hashtags
      media: handle upload on android
      refactor(settings): add settings sections methods
      refactor: use Margin:ZERO
      settings: use timed serializer, handle zoom properly, use custom text style for note body font size, added font size slider, added preview note
      update i18n comments for source client options

alltheseas (45):
      Add AccessKit labels to icon buttons and interaction tests
      Add AGENTS.md agent overview
      Add collapsible follow pack members
      Add configurable max hashtags per note setting
      Add guidelines for inspecting notedeck code
      Add light mode snapshot test
      Add real Notedeck/Damus widget tests with kittest harness
      Add responsive viewport snapshot tests
      Add UI control for max hashtags per note setting
      Add widget-level snapshot tests to notedeck_ui
      AGENTS.md: added global variables as anti-pattern
      AGENTS.md: added requirement for human readable and reviewable code
      AGENTS.md: add nevernesting requirement
      chrome: fix debug mode crash on macOS
      docs: add coding pattern for cherry-picking commits
      docs: add coding pattern for frame-aware animations
      docs: add coding pattern for Mutex avoidance
      docs: add coding pattern for per-frame UI constraints
      docs: add Concurrency & Thread Safety section
      docs: add profiling annotation guidance
      docs: remove outdated job pool references
      docs: update Async & Background Work section
      Filter out future-dated notes
      Fix formatting issues from CI
      Format with cargo fmt
      Implement hashtag count filtering in muting system
      Include relay hints when copying note IDs
      Refine nevent relay hints
      Rename note copy actions to nevent
      Run cargo fmt
      Switch Copy Note ID to nevent
      Update AGENTS.md
      Update context.rs
      Updated AGENTS.md with coding patterns section
      Updated coding requirements in AGENTS.MD
      Update README.md with deepwiki badge (#875)
      Update README.md with reference plans to support building on notedeck
      Update time.rs

Terry Yiu (23):
      Add Fluent-based localization manager and add script to export source strings for translations
      Add French, German, Simplified Chinese, and Traditional Chinese translations
      Add human-readable names to locales in settings
      Add Japanese and Portuguese (Portugal) languages
      Add localization documentation to notedeck DEVELOPER.md
      Add missing localized strings and export strings for translation
      Add Portuguese (Brazil) language and translations
      Add Spanish (Latin America and Spain) translations
      Add Thai translations
      Clean up time_ago_since, add tests, and internationalize strings
      Export strings for translation
      Fix export_source_strings.py to adjust for tr! and tr_plural! macro signature changes
      Fix localization issues and export strings for translation
      Import Spanish translations
      Import translations
      Internationalize ShowNoteClientOptions labels
      Internationalize user-facing strings and export them for translations
      Remove unused strings from translation files
      Update Chinese, French, and German translations

Martti Malmi (20):
      add view as to profile dropdown menu
      allow to disable transition animation
      app draggable by whole header area
      autofocus new post form
      back fwd nav with ctrl/cmd + arrows
      badge on recent searched profiles
      fix build errors
      fix fwd nav to profile, profile avatar at sidebar bottom
      fix profiles not showing up in search
      fix warnings
      follows list
      follows view
      fwd function (not working for profile views)
      handle mouse back button
      placeholder: Search posts, @users, #hashtags...
      recent searches, autofocus on back / fwd nav
      remove comments and fix warnings
      search: user results by default, search posts btn
      use egui-nav with animate_transitions support

e (3):
      filter: add contact_list_timestamp tracking to FilterStates
      timeline: add reset methods for subscription and view cleanup
      timeline: rebuild filter when contact list changes Closes #1225

Jakub Gladysz (2):
      ui: add follow button
      Do not crash on unknown arg

Claude Opus 4.5 (1):
      dashboard: add top posters widget

Fernando López Guevara (1):
      Update crates/notedeck/src/persist/settings_handler.rs

M (1):
      fix(android): use try_init for tracing subscriber to prevent panic

Sergey B. (1):
      media_upload: use io::Error for HTTP error responses

d3vv3r (1):
      fix(windows): use ring crypto provider instead of aws-lc-rs

[email protected] (1):
      Changed line 683 from Persisted to temp per Minor bug #888