Your agent writes a wall of text, you don't need to read it all.
Replies arrive short: one clause per paragraph or list item. Pick a linked phrase and its detail grows right where it stands; pick « and it shrinks back. At the bottom of a stretch, pick ✦ and the model writes more right there. The model is told which parts you opened, so it doesn't assume you read the rest. In Tern you pick by clicking. In a plain terminal you press omp's link hint key (Alt+O by default) and type the letter tagged on the phrase, or click it with omp's mouse mode on; press the key twice to pick stretches that have scrolled off screen.
Shamelessly copying cc-stretch, the stretchtext plugin for Claude Code, brought to omp, in Tern and in plain terminals.
omp plugin marketplace add materemias/omp-stretch
omp plugin install omp-stretch@omp-stretchThen set it up for where you run omp:
-
Plain terminal (kitty, Ghostty, WezTerm, tmux, …), omp 18.17.0 or newer: turn on Tools → Extensions → Extension Reply Renderers in omp's settings, or add this to
~/.omp/agent/config.yml:extensionRenderers: assistantText: true
Then pick how you open stretches. omp's link hint key (
app.links.hint,Alt+Oby default) works out of the box. To click them instead, also turn on Appearance → Display → Mouse Click-to-Focus, or addmouse: trueundertui:inconfig.yml. While mouse mode is on, omp takes over the mouse: select text withShift+drag and scroll withShift+wheel. -
Tern, omp 18.11.0 or newer: link the Tern plugin, which opens stretches on click:
tern plugin link ~/.omp/plugins/node_modules/omp-stretch/tern-plugin
Restart omp, then run /stretch status. Its Clicks: line should say on; if it says off, it lists what a plain terminal needs. Until then, stretches show fully open and the model isn't asked to write them.
Using omp on another machine through Tern remoting? Install the Tern plugin on both: on the machine running omp as above, and on the one whose Tern window you click in. The window side needs no omp:
tern plugin install github.com/materemias/omp-stretch/tern-pluginIf you use omp's advisor, add this line to ~/.omp/agent/WATCHDOG.md so it knows the {{short|long}} markup is the reply format and doesn't ask the agent to remove it:
@~/.omp/plugins/node_modules/omp-stretch/advisor.md
To update, run omp plugin upgrade omp-stretch@omp-stretch. In Tern, run the tern plugin link line again too: Tern remembers the versioned folder the link pointed to.
/stretch <mode> sets how much of each reply stays in view. The choice applies to every omp session; /stretch status shows what's in effect.
| Mode | In view |
|---|---|
dense (default) |
Each paragraph's gist only; the model uses stretches heavily. |
light |
A sentence or two per paragraph; the model uses stretches sparingly. |
section (experimental) |
One line per section under a heading; opening one shows that section in dense form. |
off |
Plain replies, no stretches. |
You read about 40% fewer words before opening anything: 157 words per reply against 263 before, across my recent sessions. The detail is one pick away, and details can hold further details. The cost is about 0.3% of a session's cost: the model writes every level up front, so you read less, but you don't pay less.
Deep in a long session the model tends to stop writing stretches, and one plain reply tends to be followed by more. So when a reply comes back with 800 or more characters of prose (code blocks aside) and no stretches, your next message carries a one-line reminder, about 30 tokens.
When a stretch and every stretch inside it are open, it ends in ✦ «. Pick ✦ and the model writes what comes next in that section, right there, as another stretch you can open further or deepen again. It runs as a side question over the whole conversation, like /btw, so the transcript stays as it was; the model hears what it added with your next message. Answers are saved with the session.
A press is a model call. It reuses the conversation's prompt cache and is capped at 1,500 output tokens where the model allows a cap; on Codex, Cursor and budget-thinking models with thinking on, it runs uncapped.
tern-awui, the phone and browser companion for omp in Tern, shows the same stretches as links. Open one on the phone and it opens in the Tern pane too, and the reverse; ✦ works from the phone as well, with the pane's model. The model's read note counts what you opened on either side. Each app works without the other.
- In Tern, it can break with any omp release. Tern draws and clicks through a patch of an internal omp method and the Tern plugin. If that method is gone, the extension turns itself off; if it changes, the worst case is the raw
{{short|long}}markup. Your sessions always keep the full text. - In a plain terminal, the links and picks go through omp's extension API and keep working without the patch. The patch only keeps replies readable while Extension Reply Renderers is off: without it, they show the raw markup there.
- In a plain terminal, a stretch opens at once instead of growing word by word, and a ✦ answer appears when it's finished while the footer counts the seconds: redrawing a reply in scrollback rebuilds the whole scrollback, so neither can animate there.
- Which stretches are open is forgotten when omp restarts.
/btwanswers come plain, since that panel can't open stretches.- A literal placeholder without a pipe, such as
{{name}}, stays unchanged. Put template expressions containing pipes in code spans so they are not mistaken for stretches. - omp's "Copy answer" copies the reply as drawn: closed stretches stay short, and their links only work in this omp.
MIT. The parser, the growth logic and the guide are ported from cc-stretch (MIT).

