Omahub
← All plugins
J

Text Transform

by Jankees van Woezik

Rewrite, translate or fix text with the coding agent Omarchy already runs.

Security review

No obvious issues detected

Deterministic scan — not a security guarantee

None
Risk level
None
Analyzed commit
98bdc45
Scanned
2 weeks ago

No potentially dangerous behavior detected in the analyzed commit.

Automated analysis only — not a security guarantee.

AI advisory review

No obvious issues detected

Language-model assessment · ~deepseek/deepseek-v4-flash-latest — advisory only

Low
AI risk level
Low
Recommendation
install
Model
~deepseek/deepseek-v4-flash-latest
Analyzed commit
98bdc45
Reviewed
2 weeks ago

The plugin is a well-engineered text transformation tool that runs a coding agent with no tools in a sandboxed, empty directory, with strict timeouts and byte limits. It carefully handles untrusted input, isolates agent state, and refuses agents that cannot be forced to run without tools. No malicious or destructive behavior was found; the only notable consideration is that user text is sent to the configured agent's external service, which is clearly disclosed and user-consented.

  • User text is transmitted to the configured agent's cloud service (e.g., Claude, Codex), which is a privacy consideration but explicitly documented and inherent to the plugin's purpose.
  • The 'replace' feature sends synthetic Ctrl+C/Ctrl+V to the active window, which could interfere with other applications if focus changes mid-operation, but this is user-initiated and low risk.
  • The script uses `find` to remove non-regular files in its config directory, which could delete a symlink a user placed there, but this is a minor cleanup behavior in a user-owned directory.
How this check works

This review combines the deterministic scan (the rule-based results above) with an independent look at the plugin's code by a language model. The model reads a trimmed sample of the repository's files, the manifest, and the README, then gives a plain-language risk level and a recommendation: install (no notable danger), review (look closer first), or avoid (clearly dangerous).

It runs on the same analyzed commit as the deterministic scan and is strictly advisory — it is not a security guarantee and never blocks a plugin by itself. A human moderator still reviews plugins before they are listed.

AI advisory only — automated analysis, not a security guarantee.

Install
$ omarchy plugin add https://github.com/jankeesvw/omarchy-text-transform --enable
Productivity #bar #ai

Text Transform

Paste text, pick a transformation, get the result back. Fix the grammar, make it shorter, translate it, rewrite it for work email, or anything else you have written a prompt for.

The panel, with a line of English turned into Dutch

The work is done by the coding agent you have already set up in Omarchy, through omarchy default agent. There is no API key to enter, no model to pick and no account to make: if omarchy agent starts something on your machine, this widget uses it.

How it works

Type or paste into the top box, choose a transformation, and press the arrow (or Ctrl+Enter). The answer lands in the bottom box and goes straight onto your clipboard, so you can paste it wherever you were heading. A notification says so.

Three small buttons do the rest. The one in the input box pastes your clipboard in. In the output box, the up arrow sends the answer back to the top so you can run it through another transformation (shortening something twice is a different thing from asking for it very short once), and the other copies it again.

A transform takes a few seconds. You do not have to sit and watch it: close the panel and carry on, and the arrows in the bar stay lit while the agent works. When the answer lands you get a notification and the text is waiting in the panel next time you open it. With automatic copy on, the notification says only that it finished and that it is on your clipboard, because notifications end up on lock screens. With automatic copy off, it carries the first couple of lines of the answer, so you can read the gist of it without reopening the panel; the whole thing is waiting there.

If it takes too long, the arrow becomes a stop button, and Ctrl+Enter does the same. Stopping kills the agent rather than just hiding the spinner: an agent left thinking is still spending your tokens.

Nothing here needs the mouse. The panel opens with the cursor in the input box; Tab walks both boxes, the dropdown and every button, Enter or space presses whatever is focused, Ctrl+Enter transforms or stops from anywhere, and Escape closes. Bind the panel to a key (see Installing) and the whole thing is a keyboard away.

A transformation is a name, a prompt, and an optional automatic clipboard copy. The name is what the dropdown shows; the prompt is what the agent is told to do with your text. Press the gear to edit them, add your own, or throw out the ones you never use. The copy button beside each prompt is on by default; turn it off for questions whose answers you want to read in the panel without replacing your clipboard.

Three come with it: fix typos, make it shorter, translate to Dutch. That is deliberately not a set of everything you might want; the plugin is worth having because you write the ones you need yourself. "Rewrite this as a commit message", "turn this into English that does not read like a translation", "say this the way I would say it": each of those is a name and a prompt, and then it is a keypress away.

Requirements

  • Omarchy Quattro (4.x)
  • A default agent: omarchy default agent claude (or codex, opencode, crush, pi, omp, grok, goose, agy, copilot, ori)
  • jq, and wl-copy for the copy button (both standard on Omarchy)

If no default agent is set, the panel says so instead of failing quietly.

Supported agents

The text you transform is untrusted: it comes off a clipboard, and a language model can be talked into treating it as instructions however plainly the prompt says otherwise. So the prompt is not what keeps you safe. What keeps you safe is that the agent has no tools, and this plugin only drives agents that can be told so:

Agent Tools off with Text goes in via
Claude Code --tools "" stdin
OpenCode --agent text-transform against an inline config agent stdin
Codex every tool-bearing feature off by config stdin
Pi --no-tools stdin
Oh My Pi --no-tools stdin
Goose --no-profile stdin
Ori inherited from claude or pi stdin
Grok --tools "" argument
GitHub Copilot --available-tools="" argument

Seven of those are a single switch that means "no tools", so a tool added by an update is off without this plugin being changed. OpenCode's switch is a config key rather than a flag, passed inline through OPENCODE_CONFIG_CONTENT so it does not depend on your own config, and --pure skips external plugins on top of that. Because that config travels in the environment and can be ignored without saying so, the plugin asks OpenCode what the agent resolved to and refuses the run unless every tool comes back off. Codex is the exception: it has no such switch, and instead each of its tool-bearing features is turned off by name, with the read-only sandbox under it as a second layer. That list needs revisiting when Codex ships a new feature.

Crush and Antigravity are refused. Not because they are worse, but because neither can be told to run without tools from the command line: Crush's run has no tool flag, and Antigravity has a blanket --sandbox that restricts the terminal rather than removing tools. If one of those is your default agent, the panel says so and transforms nothing.

Grok and Copilot have no way to take a prompt on stdin, so with those two your text is briefly visible in the process list to other accounts on the machine. The other seven never put it there. If that matters on your machine, pick one of the seven.

Ori is a launcher rather than an agent, so it needs Claude Code or Pi installed to have something to launch.

Grok gets a throwaway GROK_HOME inside the working directory, because it logs to logs/unified.jsonl under that path and on a machine that has used Grok that log is already past the file-size limit every agent runs under, which kills the transform. That means Grok has to have been run once by hand first: the isolated home borrows the binary Grok installs on its first launch, and until that exists the panel says so rather than trying anything clever.

Claude Code runs with --strict-mcp-config, which loads no MCP servers. Measured on a normal setup that takes a transform from around 5.8 to 2.9 seconds, because connecting to them is most of what the startup does. Forcing a small model is deliberately not done: Haiku measured slower than the default here, since at this length the time goes into starting up rather than generating.

Goose runs with --no-profile, which loads none of the configured extensions, and the only extensions a run could still get are ones passed on the command line, of which there are none. GOOSE_MODE=chat sits under it as a second layer: even a tool that appeared anyway would not be executed. Goose gets the same treatment as Grok: its state, a sessions database and full request logs, is pointed into the throwaway working directory and leaves with it. Where Grok's logs are over the file-size limit before the run starts, goose's grow with the text, and at the largest transform this plugin accepts they come near enough to the limit that the limit is raised for goose alone; everything it bounds is deleted with the directory afterwards. A side effect worth having: the text you transform never reaches goose's request logs, which it otherwise writes.

Your text and the agent

The text is handed to the agent as one prompt, and the agent is told to treat everything between the markers as text rather than as instructions. That is not a guarantee, because a language model can be talked into things, so the plugin narrows what an agent could do if it were:

  • The agent runs with no tools at all, and an agent that cannot be told that is refused rather than driven anyway. See Supported agents.
  • Every run happens in a fresh empty directory, so even if a tool did appear there is no project to read or write.
  • Everything is bounded in bytes as well as in time: what you send in, what the agent writes out, and what comes back. The agent runs under a file size limit the kernel enforces, so it cannot fill your disk on the way to being slow.
  • The transformations file is opened without following symlinks and without blocking on anything that is not a regular file, so nothing planted at that path is read or written through.

Text you paste is still sent to whatever service your agent talks to, and counted against your plan there. That is the trade: no key to configure, but also no local-only mode.

Installing

omarchy plugin add https://github.com/jankeesvw/omarchy-text-transform
omarchy plugin enable jankeesvw.text-transform
omarchy bar move jankeesvw.text-transform --section right

A keybinding, if you want one:

o.bind("SUPER + T", "Text Transform", "omarchy-shell shell toggle jankeesvw.text-transform")

And one for the thing you probably came here to do, which is transform what you just copied:

o.bind("SUPER + SHIFT + V", "Transform clipboard", "omarchy-shell jankeesvw.text-transform paste")

That opens the panel with the clipboard already in the input box and the run button focused, so it is one key to open and Enter to go. It uses the last transformation you picked, which is usually the one you want again.

If even that Enter is one key too many, there is also a binding that presses the button for you:

o.bind("SUPER + SHIFT + T", "Transform clipboard now", "omarchy-shell jankeesvw.text-transform transform")

That runs the last-used transformation on the clipboard the moment you press it. When that transformation copies automatically, the panel closes itself again: one key, a few seconds, and the result is ready to paste. If automatic copy is off, it stays open on the answer instead. The panel always opens while it works, so you can see the spinner and stop it, and if something goes wrong it stays open with the error instead of disappearing on you.

And the whole loop in one key, without even the copy and the paste:

o.bind("SUPER + SHIFT + R", "Transform selection in place", "omarchy-shell jankeesvw.text-transform replace")

Select some text anywhere, press the key, and a few seconds later the selection has been replaced by the transformed version. Under the hood the plugin sends the window a Ctrl+C, transforms what came back, and sends a Ctrl+V with the answer on the clipboard; the window is remembered by address, so the paste finds it even if you switched away while the agent was thinking. The panel opens while it works, exactly as above. Two honest caveats: it takes your clipboard (the answer is on it afterwards, which is also your safety net if the paste cannot land), and it assumes the app treats Ctrl+C and Ctrl+V as copy and paste, which terminals for example do not.

Removing it

omarchy plugin remove jankeesvw.text-transform

That leaves one thing behind: the transformations you wrote, in ~/.config/omarchy-text-transform/transformations.json (the directory is mode 700, the file 600, and only your account can read them). Nothing else is stored; the text you transform and the answers you get are never written to disk by this plugin. To delete the prompts too:

rm -rf ~/.config/omarchy-text-transform

The script on its own

bin/text-transform works without the panel, which is handy for a keybinding or a script of your own. Everything goes in and out as JSON on stdin and stdout:

bin/text-transform agent
bin/text-transform list

printf '%s' '{"text":"hallo wereld","prompt":"Translate to English."}' \
  | bin/text-transform run

Two more exist for the replace flow: grab copies the selection out of the active window and prints it, put takes {"text":..,"window":..} on stdin and pastes it into that window. Both lean on hyprctl, so they are Hyprland-only.

Licence

MIT