Changes from 2025-03-30 to 2026-03-30
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
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