Reader
socli opens the reader when both input and output are terminals and you pass neither --json nor --print. With more than one network signed in, the reader shows a merged timeline. Without an account, it opens a sign-in screen with an option to try the offline demo. socli --print writes the threads into the scrollback and, at a terminal, leaves a SoCLI> prompt. Add --no-prompt to print once and exit. The CLI reference covers output modes and the prompt's command syntax.
The reader has three sections: Home, Notifications and Search, and [ and ] step through them. Home, Discover and Saved are the tabs of the merged timeline. Home takes each network's primary feed, Discover takes For you on X, Discover on Bluesky and Trending on dev/null and Mastodon, and Saved takes bookmarks, plus the commits you starred on dev/null.
When the selection reaches the 10th post of the current page in a feed, a search, a profile, or mentions, the reader draws a loading card and fetches the next page. A shorter page starts on its last post. Each signed-in network is asked for at least 20 posts. Medium and rich put loading… in a box. Minimal and plain write the words only, and plain spells them loading.... That fetch runs while the keys still move. Pressing m loads one page the same way. ctrl-r and cmd-r reload the page on screen, and r still replies. An open thread has nothing further to fetch, and --demo stays on the posts it already has.
A post is a letter badge on a rail. Replies hang under the post, and a long thread folds until you press ⏎. In a feed that mixes networks the badge takes the network's color, and on a single network it takes a color from the author's handle, so the same account keeps the same color. The feed.color_by setting chooses what the badge follows.
On the website
The reader on the homepage is this program compiled to WebAssembly. With no account stored for the site, it opens the same welcome screen as a terminal. Bluesky, Mastodon, Threads and X sign in and read from the page. X and Threads open an approval page when this build includes SoCLI's app id. A build without that id says so. X on the page uses the official API, so For you is a search, and likes and follows can be refused. The local docs server forwards only api.x.com for the X token exchange, and a static host such as GitHub Pages does not. Threads sends the approval code to https://socli.sh/threads/token, which holds the app secret. The Threads app is published. dev/null signs in on the page as well: it opens the approval on dev-null.sh, and you paste the devnull:// callback. GitHub SSH signing stays in the terminal (socli auth devnull ssh). socli login x in a terminal still imports the browser session. The config, tokens included, is kept in this origin's local storage under socli.config. A terminal keeps its own file. Rich mode draws profile pictures and post images on the page, including a signed-in timeline, by loading each image from its URL. ui.images set to off keeps the image card. Drafts are not kept. kitty, iTerm2 and sixel stay in the terminal. A page fetch waits inside the reader worker, then the screen updates. The stage stays one column until the window can hold 124 columns, which is when the terminal splits the feed and the thread. The buttons above the reader can set a mobile, tablet, or desktop window instead, and full screen opens /web/. The welcome screen can still open the offline demo. If the WebAssembly file does not load, the page shows a smaller scripted feed instead.
Keys
The Keys reference lists reader shortcuts and the controls for the composer, pickers, share dialog, image viewer and Settings. Press ? in the reader to open its key overlay.
Detail levels
The detail level sets how much art the reader and --print draw. Pick it with --detail, SOCLI_DETAIL or ui.detail. With none of those set, a normal terminal opens at rich. An ESP terminal, or a TERM of dumb, unknown, ansi, vt52, vt100, vt102, vt220 or network, opens at plain.
| Level | What it draws |
|---|---|
plain | No color, ASCII chrome, and > marks the selected post |
minimal | No boxes or icons in posts, and a colored side line per network |
medium | Rails, letter badges and a one-line media row, drawn to the edges |
rich | Medium plus inline images, link preview images, profile pictures and turning spinners |
In the reader, d steps to the next level and D opens a picker. Either choice is written to ui.detail and used the next time you open SoCLI. --detail and SOCLI_DETAIL still win over that saved value. A narrow terminal changes the layout and never the level.
Link preview images come from the network's card data or from the page's og:image. Turn the page fetch off with the "Fetch link pages" setting or ui.unfurl. Rich previews appear in the full-screen reader and not in --print.
Split view
On a terminal at least 124 columns wide, the reader shows the feed on the left and the selected thread on the right. The right pane loads that conversation's replies, and the other posts stay on the left. --layout split lowers that width to 100 columns, --layout single turns it off, and the setting is ui.layout. ⏎ or → moves the keys into the thread, ⌫, ← or esc moves them back to the feed, and the side without the keys is dimmed. Below that width, ⏎ opens the thread on the one pane.
Profiles
u opens the profile of the selected post's author, and :user @handle opens the profile of any account. The frame holds the name, the handle, the bare profile URL and the biography, and a Posts section lists the loaded posts. o opens the profile page in a browser, and s shares the profile link.
Composer
n opens the composer. In the composer ⏎ sends, ctrl-j adds a newline and esc goes back. ⇧⏎ also adds a newline in terminals that report the kitty keyboard protocol. socli config set ui.enter newline, or the Enter in composer row in Settings, swaps the two, so ⏎ adds a newline and ctrl-s sends.
The text field moves and deletes whole characters, accents and emoji included. A paste goes in as text with its newlines and never sends. Composer and editing keys covers word movement, undo, destinations and saved drafts.
Leaving a composer that holds text asks whether to save a draft. A send writes the draft before it reaches any network and removes it once every network has taken the post, so after a failed send the draft keeps the text and the networks that failed. socli drafts lists the saved drafts and marks one may have posted when SoCLI stopped before it knew the outcome, and socli drafts rm <n> removes one.
Mouse
The reader takes the mouse. A click on a post selects it and a second click opens it, and a click on a name, a time, a link, a mention, a hashtag, a stats cell, a network chip, a feed tab, a nav section or a hint presses it, the same as moving the focus ring there and pressing ⏎. The wheel moves the selection, or the cursor of an open picker or dialog, and hovering over a picker row moves the cursor to it.
While SoCLI has the mouse, the terminal selects text only with Shift-drag, which is Option-drag in iTerm2. --mouse off, SOCLI_MOUSE=off, socli config set ui.mouse off or the Mouse row in Settings leaves the mouse to the terminal.
Themes
SoCLI ships auto (black or white, following the terminal background), native (the terminal's own colors and a transparent background), black, white and 27 named palettes adapted from opencode, such as nord, gruvbox and catppuccin. A named theme follows the terminal: it uses its light variant on a light terminal when it has one, and nord-dark or nord-light forces a variant.
socli config themes lists every name. Choose one with --theme, SOCLI_THEME, ui.theme, the Theme row in Settings, or :theme, which opens a picker that previews each theme as the cursor moves.
Next: Keys