| Crates.io | exfiltrate |
| lib.rs | exfiltrate |
| version | 0.2.1 |
| created_at | 2025-09-02 22:45:08.963688+00 |
| updated_at | 2025-12-21 01:39:52.991258+00 |
| description | An embeddable debug tool for Rust. |
| homepage | https://sealedabstract.com/code/exfiltrate |
| repository | https://github.com/drewcrawford/exfiltrate |
| max_upload_size | |
| id | 1821746 |
| size | 57,383 |
Exfiltrate is a remote debugging framework for Rust applications.
It allows you to inspect and control a running application (even in WASM/browser environments) from a CLI tool. This is particularly useful when trying to debug programs with agents such as Claude Code, Codex, Gemini, etc.

Exfiltrate provides a simple, self-contained, and embeddable server implementation, primarily motivated by the need to embed in debuggable programs. It is designed to be easy to use, easy to extend with custom commands, and easy to integrate with existing Rust codebases,
Unlike traditional debuggers (gdb, lldb) which require ptrace/OS support, exfiltrate works by embedding a small server thread into your application. This allows it to work in constrained environments like WebAssembly, mobile devices, on remote machines, in sandboxes, etc.
logwise for controlled log capture.Exfiltrate is the answer to these frequently-asked questions:
claude "Run the exfiltrate_cli command, then integrate the library into my program."
A key design philosophy is to use a feature similar to agent skills to progressively disclose information useful to a task. When exfiltrate starts up, it provides a helpful menu of topics that can be perused by either humans or agents at their leisure.
Use exfiltrate list in the CLI to see all available commands (both built-in and custom),
and exfiltrate help <command> to get detailed information about any command.
I recommend instructing agents explicitly to use the exfiltrate command prior to debugging a Rust program.
exfiltrate as a dependency.exfiltrate::begin() at the start of your program.exfiltrate CLI to connect and run commands.use exfiltrate::command::{Command, Response};
struct HelloCommand;
impl Command for HelloCommand {
fn name(&self) -> &'static str {
"hello"
}
fn short_description(&self) -> &'static str {
"Greets a user"
}
fn full_description(&self) -> &'static str {
"Greets a user. Usage: hello [name]"
}
fn execute(&self, args: Vec<String>) -> Result<Response, Response> {
let name = args.get(0).map(|s| s.as_str()).unwrap_or("World");
Ok(format!("Hello, {}!", name).into())
}
}
// Register the command
exfiltrate::add_command(HelloCommand);
Many Rust networking libraries depend on tokio or other async runtimes. This makes sense for
high-concurrency servers, but it adds significant weight and complexity when you just want
to debug a program.
This codebase has no dependency on tokio. Instead, it just uses threads. Threads for everyone.
WebAssembly applications running in a browser cannot open raw TCP sockets. To support debugging
these applications, exfiltrate uses a proxy architecture:
exfiltrate_proxy) via WebSockets.exfiltrate CLI connects to the same proxy via TCP.logwise - Enables integration with the logwise logging framework for log capture.Commands can return different response types:
FileInfoImageInfoFor file and image responses, use the types from command module. Images use
RGBA8 from the re-exported rgb crate.
For integration guidance, run exfiltrate help integration. For detailed examples of
all response types, run exfiltrate help custom_commands in the CLI.