reindeer reads this manifest to generate the Buck2 third-party graph.
11[dependencies]
bot.log rotation (apps/native): a dedicated pipe-reading thread owns the file, so rotation can never race the C bot's own printf.
SaveWriter's serialized methods are generic over bincode's traits, so an implementor names them. Same major as jgenesis, so one copy in the graph.
2.0.1 is the last bincode that compiles. 3.0.0 on crates.io is a tombstone:
a README announcing the crate is unmaintained and a lib.rs that is one
compile_error! (downloaded and read 2026-09-20). Leaving bincode means
jgenesis leaving it first, since these are ITS trait bounds.
25bincode = "2"
The native window (and later the web page): one immediate-mode UI that builds for both. wgpu rather than glow so the picture path is the same API on desktop (Vulkan/GL) and in the browser (WebGPU/WebGL2).
Audio out. pulseaudio is cpal's pure-Rust PulseAudio client, and cpal
prefers it over ALSA when it answers: WSLg's sound server IS PulseAudio
($PULSE_SERVER), and nothing on this host routes ALSA into it.
35cpal = { version = "0.18", features = ["pulseaudio"] }
The emulator thread of control fills this and cpal's realtime callback
drains it; a callback must never block, so the queue is lock-free. This is
the crate cpal's own feedback example uses.
39ringbuf = "0.5"
Color is repr(C) and Pod, so a frame IS its RGBA bytes; this is how
that gets said without a copy. Already in the graph through jgenesis.
42bytemuck = "1"
The core's own CRC crate, for naming the cartridge a snapshot belongs to.
44crc = "3.4.0"
Server: the window, over HTTP, and native mcp, over stdio. Client: what
native mcp reaches the window with. reqwest comes in without a TLS stack,
which loopback does not need.
48rmcp = { version = "3.4.0", default-features = false, features = ["server", "client", "macros", "transport-streamable-http-server", "transport-streamable-http-client-reqwest", "transport-io"] }
SessionStore is an async trait in rmcp's terms. Already in the graph
through rmcp.
Jev: ~/jevcrates, as the git submodule beside this file, pinned by its
gitlink. jev-http speaks HTTP/2 itself over rustls with the RustCrypto
provider - pure Rust, no C, no cmake, the same choice ~/dashboard's HTTPS
transport makes - and the compiled-in Mozilla roots, not /etc/ssl.
packages/mcp names rustls and the provider directly as well.
59jev-protocol = { path = "jevcrates/jev-protocol" } 60jev-client = { path = "jevcrates/jev-client" } 61jev-http = { path = "jevcrates/jev-http" } 62rustls = { version = "0.23", default-features = false, features = ["std", "tls12"] } 63rustls-rustcrypto = { git = "https://github.com/RustCrypto/rustls-rustcrypto", branch = "master" }
zstd over packages/replay's XOR keyframe deltas. ruzstd is a pure-Rust
zstd (real zstd frames), so no C and no cmake, the same reasoning as the
TLS stack above. Its encoder implements only Fastest (about zstd level
1), which is enough on deltas that are mostly zero. Already in the graph
through object, so this adds no crate.
Subsecond hot-patching (see research/subsecond-patch-build.md): subsecond
is what a patched-in-place binary links (call/try_call/apply_patch/
aslr_reference); subsecond-types is the JumpTable the patch tool
serializes and the running binary deserializes. Pinned to the newest 0.7.x
(0.8 is alpha-only on crates.io as of 2026-09-20).
tools/hotpatch builds the stub object + jump table with these: object
for reading/writing ELF symbol tables (same crate dx itself uses,
packages/cli/Cargo.toml), ar for pulling .o members out of a .rlib
when a patch spans more than the tip crate, libc to reset SIGPIPE
(code-rust.md's CLI hygiene rule) - already in the graph transitively via
subsecond, named here directly so it gets a plain third-party alias.