DEV Community

David
David

Posted on Originally published at locallyuncensored.com

Reverse engineering with a local model: what it took to make a 27B model finish the job

Locally Uncensored is an open source desktop app (AGPL-3.0) that runs AI models on your own machine. Version 3.0.7 came out today, and one of the new things is a plugin called REA, short for Reverse Engineer Anything. It's an MIT-licensed MCP server by morluto, and in LU it gives the Agent and Code modes tools to look inside apps and files.

Getting it to work with a local model was harder than wiring up the server. Here's what I ran into.

how it starts

There's one switch under Plugins in the composer, off by default, desktop app only. When you flip it, LU fetches one pinned version of the package and checks it:

package:   rea-agents 6.5.0 (npm tarball)
check:     against the checksum the npm registry publishes
again:     before every start
never run: REA's own setup (it writes other apps' settings)
node:      22.19+ within 22, 24.11+ within 24, or 26+
Enter fullscreen mode Exit fullscreen mode

npx gets the checked file, never a package name. If Node.js is missing or too old, the row says which version it found.

The first start has a catch: npx installs REA's dependencies before the server answers the MCP initialize. Every MCP request in LU waited 30 seconds, and on a slow line on a Windows test machine that ended every first start with "Request initialize timed out". The same start by hand answered after 111 seconds. REA now gets ten minutes for that handshake, every other server keeps 30 seconds. The second start, from npm's cache, came up in 22 seconds with 207 tools.

207 tools is too many for a local model

Hand 207 tool schemas to a local model and its context is gone before the first question. So a turn only gets the REA tools its words point at. Ask about an Electron app and the model sees the JavaScript and Electron tools, not the .NET ones.

Each REA tool sits behind the same confirmation as any external tool in LU. The model proposes a call, you approve it, then it runs.

the run that found every step and never answered

My first real run was Qwen 3.8 27B on Ollama, 64K context, on a Mac, against a small test app. It picked the right tools in the right order. It never wrote an answer. Two reasons:

The schema invited the model to copy huge records. Tools that work on an earlier result take that evidence record either complete or as a reference:

{"kind": "retained-evidence", "evidence_id": "ev_..."}
Enter fullscreen mode Exit fullscreen mode

The schema listed the complete record first, about 7,000 characters of it. The model kept trying to reproduce records it had never seen in full, and REA refused each one. LU's version of the schema now offers only the reference, which is also what REA's own guide recommends, and LU holds the model's call to that form.

The results were mostly provenance. One analyze_javascript_application call on a four-file app returned 343,583 characters. The interesting part, the sync endpoint, sat at character 230,308. LU's general cap keeps the first 40,000 and the last 20,000 characters, so the model never saw it. Now the model gets the facts from each record instead, about a tenth of the size, plus the evidence_id, so a later tool can still ask REA for the full record.

After both fixes, the same model took the test app apart and wrote a complete answer in 3 minutes 15 seconds. Qwen 3.5 9B at 32K still ran out of context before it got there.

what REA reads

By itself: JavaScript and Electron apps, .NET, Go and Rust programs, Flutter, SQLite and WebAssembly. It uses Ghidra, Hopper, JADX and Frida if you have them installed. LU installs none of them.

limits

  • The complete answer came from LU's tool code outside the app, on one Mac. A full run from the built app hasn't been tried yet, and neither have analysis runs on Windows and Linux or cloud models.
  • Pick a model of about 27B with 64K context or more. Smaller ones tend to stop before an answer.
  • Use it on software you own or are allowed to examine.

Short version

  • REA is a plugin in LU 3.0.7 that gives Agent and Code 207 reverse engineering tools, with only the relevant ones shown per turn.
  • The pinned package is checked against its npm checksum before every start, and the first start gets ten minutes to install.
  • A local 27B model only finished once it got references instead of 7,000-character records and facts instead of 340K-character results.

The app is on GitHub, and the user guide for the plugin is on locallyuncensored.com.

AI-assisted: I wrote this with help from an AI model and checked the facts against the code and the changelog.

Top comments (0)