nostui

June 25, 2026 · View on GitHub

crates.io CI codecov

A TUI client for Nostr

screenshot

Current Features

  • Timeline
  • Mention timeline
  • Post, reply, react and repost
  • Open per-user timelines as tabs
  • Broadcast the currently playing track as a music status (NIP-38)

Getting Started

Dowonload binaries from the release page.

Or, install manually via crates.io:

cargo install nostui

On NetBSD, a package is available from the official repositories. To install it, simply run:

pkgin install nostui

Setup

Note

Other extensions supported are .json5, .yaml, .toml and .ini.

  1. Create a config.json to the following path:
  • Linux: ~/.config/nostui/config.json
  • Windows: ~\AppData\Roaming\0m1\nostui\config.json
  • macOS: ~/Library/Application Support/io.0m1.nostui/config.json
  1. Add your key to the config.json:
{
    "key": "nsec1...", // or "npub..." for readonly mode
    "relays": ["wss://nos.lol"], // optional
    "nip-38": { "enabled": true } // optional, broadcasts the currently playing track as a status (default: false)
}

Usage

Commands

nostui [OPTIONS]

Options:
  -t, --tick-rate <FLOAT>   Tick rate, i.e. number of ticks per second [default: 16]
  -f, --frame-rate <FLOAT>  Frame rate, i.e. number of frames per second [default: 16]
  -h, --help                Print help
  -V, --version             Print version

Default Keybindings

KeybindingDescription
k upScroll up
j downScroll down (load more at bottom)
home gScroll to top
end Shift-gScroll to bottom
escUnselect
nNew text note
Ctrl-pSubmit text note
rReply to the selected note
fSend reaction
tRepost
iOpen the author's timeline as a tab
mOpen the mention timeline as a tab
h leftSwitch to the previous tab
l rightSwitch to the next tab
Ctrl-wClose the current tab
q Ctrl-c Ctrl-dQuit

Customizing Keybindings

You can override or add keybindings in your config file under keybindings.Home. Your settings are merged on top of the defaults, so you only need to list the keys you want to change.

{
    "keybindings": {
        "Home": {
            "<Ctrl-r>": "Repost",  // bind an additional key to an action
            "<t>": "ScrollToTop"   // override an existing default
        }
    }
}

Each key is written between < and >. Modifiers are joined with - (e.g. <Ctrl-p>, <Shift-g>, <Alt-Enter>). Special keys such as up, down, home, end, esc, enter, tab and space are also supported.

Note

Because your settings are merged on top of the defaults, default keybindings cannot be removed. You can only add new keys or rebind a key to a different action.

The following actions are available:

ActionDescription
ScrollUpScroll up
ScrollDownScroll down (load more at bottom)
ScrollToTopScroll to top
ScrollToBottomScroll to bottom
UnselectUnselect the selected note
NewTextNoteShow the text note input form
ReplyTextNoteReply to the selected note
SubmitTextNoteSubmit the text note on input form
ReactSend a reaction to the selected note
RepostRepost the selected note
OpenAuthorTimelineOpen the author's timeline as a tab
OpenMentionTabOpen the mention timeline as a tab
CloseCurrentTabClose the current tab
PrevTabSwitch to the previous tab
NextTabSwitch to the next tab
QuitQuit the application

Architecture

For how the codebase is organised — the layers, their dependency direction, and the contracts between them — see docs/architecture.md.