<feed xmlns='http://www.w3.org/2005/Atom'>
<title>ida-tui.git/idatui/tui.py, branch main</title>
<subtitle>tui for headless ida</subtitle>
<id>https://git.sl0p.foo/ida-tui.git/atom/idatui/tui.py?h=main</id>
<link rel='self' href='https://git.sl0p.foo/ida-tui.git/atom/idatui/tui.py?h=main'/>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/ida-tui.git/'/>
<updated>2026-07-10T13:10:25Z</updated>
<entry>
<title>rpc: unix-socket puppeteering server (raw keys + introspection + screen)</title>
<updated>2026-07-10T13:10:25Z</updated>
<author>
<name>blasty</name>
<email>blasty@local</email>
</author>
<published>2026-07-10T13:10:25Z</published>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/ida-tui.git/commit/?id=690a34512eaed933917f2d2c1cf12327923b39ac'/>
<id>urn:sha1:690a34512eaed933917f2d2c1cf12327923b39ac</id>
<content type='text'>
Run the TUI with --rpc &lt;sock&gt; and it renders normally while an asyncio
listener on the same loop lets another process drive it. Handlers touch
the UI directly (same loop, no thread hop), so every injected key has the
identical on-screen effect a keyboard would — the point for livestreaming.

Newline-delimited JSON. v1 methods: keys/text (raw injection, via the same
_press_keys the pilot uses; text can interleave wait:&lt;ms&gt; for a typed-out
look), state/view/screen/functions (introspection; screen() is a full
plain-text render of exactly what the viewer sees). No auth by design —
the socket is 0600, local only.

tests/rpc_smoke.py drives it end-to-end over a real socket (7 green).
</content>
</entry>
<entry>
<title>tui: --open PATH to create/attach a session for an arbitrary binary</title>
<updated>2026-07-09T10:15:42Z</updated>
<author>
<name>blasty</name>
<email>blasty@local</email>
</author>
<published>2026-07-09T10:15:42Z</published>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/ida-tui.git/commit/?id=3527cb15cf02a7c50d976c52b39ec73e0adf760d'/>
<id>urn:sha1:3527cb15cf02a7c50d976c52b39ec73e0adf760d</id>
<content type='text'>
- app: when open_path is set, idb_open (idle_ttl=1e9, long timeout) and pin the
  returned session; clean status on failure (e.g. non-writable dir)
- tui.py: --open flag + usage docs (attach vs open)
- verified: --open targets/cat -&gt; new session, 161 funcs loaded
</content>
</entry>
<entry>
<title>Phase 1 TUI: two-pane functions&lt;-&gt;disasm, virtualized listing, nav backbone</title>
<updated>2026-07-09T10:05:24Z</updated>
<author>
<name>blasty</name>
<email>blasty@local</email>
</author>
<published>2026-07-09T10:05:24Z</published>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/ida-tui.git/commit/?id=8d67549eaa927c7ffc48c57f3ebc438c0fe7da09'/>
<id>urn:sha1:8d67549eaa927c7ffc48c57f3ebc438c0fe7da09</id>
<content type='text'>
- idatui/app.py: keyboard-first Textual app
  * FunctionsPanel: lazy-streamed function list (DataTable) with glob filter
  * DisasmView: line-VIRTUALIZED ScrollView -- paints from domain block cache,
    background-fetches misses, prefetches neighbors. Proven: 52,120-insn func,
    jump-to-bottom in 0.31s with only ~6 blocks (~1.5k lines) ever materialized.
  * address-history nav stack (Enter follow / Esc back); goto by name or 0xADDR
  * bump_idle_ttl + KeepAlive on startup so the session never idles out
  * all MCP work on Textual worker threads; UI never blocks
- idatui/tui.py: launcher (python -m idatui.tui / console script 'idatui')
- tests/test_tui.py: headless Pilot test, 9/9 (boot, load 10k funcs, open,
  scroll, bg-cache, goto-bottom, filter)
- pyproject: textual extra + idatui script entry
</content>
</entry>
</feed>
