Lightweight remote control infrastructure for agent harnesses, securely connecting private TCP/UDP services through one public port.
Rust
75
253 commits
updated Sep 9, 2026
Remote control infrastructure for the agent harness era.
Agent harnesses can write code, run tools, and coordinate long workflows. They still need a narrow, durable path into private runtimes. pb-mapper provides that network primitive: expose one relay port, register any number of keyed TCP/UDP services behind it, and delegate access without publishing every service or sharing the relay's root credential.
pb-mapper transports bytes. The service behind a tunnel still owns its application-level authentication and authorization.
pbmt1_ credentials to
harnesses or workloads. Each credential receives an isolated namespace. private runtime A ── register "app" ──┐
private runtime B ── register "shell" ├──► pb-mapper relay :7666 ◄── agent harnesses
private runtime C ── register "tools" ┘ one public port
pb-mapper register runs beside a private TCP/UDP service and publishes a
service name to the relay.pb-mapper connect runs beside an agent or operator and exposes that service
on a local address.This makes a relay a useful rendezvous layer for remote agent runtimes, coding harnesses, private APIs, model gateways, browser-control endpoints, development machines, and operational tools.
Tell your agent:
Fetch and follow instructions from https://raw.githubusercontent.com/acking-you/pb-mapper/master/skills/pb-mapper-suite/INSTALL.md
| Credential | Intended holder | Authority |
|---|---|---|
| Administrator key | Relay operator or trusted provisioning automation | Issue, reveal, renew, revoke, rotate, inspect all namespaces |
Temporary pbmt1_ credential | One harness, tenant, device, or workload | Register, connect, and inspect only its own namespace |
Protocol v2 authenticates the encrypted first request without adding a separate
handshake round trip. Temporary credentials are derived from the administrator
key, persistent server instance ID, and key ID; the relay stores lifecycle
metadata rather than a copy of each temporary secret. Optional AES-256-GCM data
encryption is enabled with --codec when registering a service.
pb-mapper uses pre-shared credentials, not public-key identity. Use TLS or another application protocol when you also need certificate-based endpoint identity or protection against traffic analysis. See the authentication design for the exact boundary.
| Surface | What is available today |
|---|---|
| Unified CLI | server, register, connect, status, and admin roles |
| Agent Skills | Complete installation, relay, register/connect, and verification through pb-mapper-suite, plus a separate release workflow |
| Operations | Linux systemd units, install scripts, Docker image, status and administrator inventory |
| Native embedding | Rust crate pb-mapper (Client for register/connect/status/admin), C ABI for the Flutter UI, Node-API package under js/ |
| Networking | TCP and UDP, per-tunnel keep-alive, optional forwarded-data encryption |
pb-mapper = "0.5"
use pb_mapper::{Client, ClientConfig, RegisterRequest, Transport};
let client = Client::new(ClientConfig {
server: "relay.example.com:7666".into(),
credential: std::env::var("MSG_HEADER_KEY")?,
keep_alive: true,
namespace: None,
})?;
let registration = client.register(RegisterRequest {
key: "echo".into(),
local_addr: "127.0.0.1:8080".into(),
transport: Transport::Tcp,
codec: false,
force_namespace: false,
}).await?;
registration.wait_ready().await?;
Install the unified CLI directly from crates.io:
cargo install pb-mapper-cli --locked
The package is named pb-mapper-cli, and it installs one executable named
pb-mapper. That executable contains the server, register, connect,
status, and admin roles, so a separate server executable is not required.
The relay implementation is also published as the pb-mapper-server library
for applications that need to embed it.
npm install pb-mapper
import { Client } from "pb-mapper";
const client = new Client({
server: "relay.example.com:7666",
credential: process.env.MSG_HEADER_KEY!,
});
const admin = client.admin();
const issued = await admin.issueKey(3600, "agent");
The current release provides the secure network, a Rust client SDK, and a Node-API package. Remaining work:
pb-mapper-suite workflow;These are roadmap items, not yet part of the published compatibility contract.
make build-pb-mapper
cargo test
docs/user-guide.mddocs/authentication-v2.mdDOCKER_README.mdREADME.zh-CN.md, docs/user-guide.zh-CN.mdRepository layout:
crates/ — Rust workspace: core, auth, protocol, server, client, SDK facade (pb-mapper), Node-API (pb-mapper-node), CLI, and testkitjs/ — JS package wrapping the Node-API addon (built with bun)ui/ — Flutter UI and native C ABI bridgeskills/ — agent-readable deployment and release workflowsdocs/ — architecture, authentication, user guides, and project assetsdocker/, services/, scripts/ — packaging and operationsReleased under the MIT License.
253 commits
Rust
66.2%
Dart
21.8%
C++
2.9%
JavaScript
2.6%
Shell
2.4%
Python
1.3%
CMake
1.3%
Lightweight remote control infrastructure for agent harnesses, securely connecting private TCP/UDP services through one public port.
Rust
75
253 commits
updated Sep 9, 2026
Remote control infrastructure for the agent harness era.
Agent harnesses can write code, run tools, and coordinate long workflows. They still need a narrow, durable path into private runtimes. pb-mapper provides that network primitive: expose one relay port, register any number of keyed TCP/UDP services behind it, and delegate access without publishing every service or sharing the relay's root credential.
pb-mapper transports bytes. The service behind a tunnel still owns its application-level authentication and authorization.
pbmt1_ credentials to
harnesses or workloads. Each credential receives an isolated namespace. private runtime A ── register "app" ──┐
private runtime B ── register "shell" ├──► pb-mapper relay :7666 ◄── agent harnesses
private runtime C ── register "tools" ┘ one public port
pb-mapper register runs beside a private TCP/UDP service and publishes a
service name to the relay.pb-mapper connect runs beside an agent or operator and exposes that service
on a local address.This makes a relay a useful rendezvous layer for remote agent runtimes, coding harnesses, private APIs, model gateways, browser-control endpoints, development machines, and operational tools.
Tell your agent:
Fetch and follow instructions from https://raw.githubusercontent.com/acking-you/pb-mapper/master/skills/pb-mapper-suite/INSTALL.md
| Credential | Intended holder | Authority |
|---|---|---|
| Administrator key | Relay operator or trusted provisioning automation | Issue, reveal, renew, revoke, rotate, inspect all namespaces |
Temporary pbmt1_ credential | One harness, tenant, device, or workload | Register, connect, and inspect only its own namespace |
Protocol v2 authenticates the encrypted first request without adding a separate
handshake round trip. Temporary credentials are derived from the administrator
key, persistent server instance ID, and key ID; the relay stores lifecycle
metadata rather than a copy of each temporary secret. Optional AES-256-GCM data
encryption is enabled with --codec when registering a service.
pb-mapper uses pre-shared credentials, not public-key identity. Use TLS or another application protocol when you also need certificate-based endpoint identity or protection against traffic analysis. See the authentication design for the exact boundary.
| Surface | What is available today |
|---|---|
| Unified CLI | server, register, connect, status, and admin roles |
| Agent Skills | Complete installation, relay, register/connect, and verification through pb-mapper-suite, plus a separate release workflow |
| Operations | Linux systemd units, install scripts, Docker image, status and administrator inventory |
| Native embedding | Rust crate pb-mapper (Client for register/connect/status/admin), C ABI for the Flutter UI, Node-API package under js/ |
| Networking | TCP and UDP, per-tunnel keep-alive, optional forwarded-data encryption |
pb-mapper = "0.5"
use pb_mapper::{Client, ClientConfig, RegisterRequest, Transport};
let client = Client::new(ClientConfig {
server: "relay.example.com:7666".into(),
credential: std::env::var("MSG_HEADER_KEY")?,
keep_alive: true,
namespace: None,
})?;
let registration = client.register(RegisterRequest {
key: "echo".into(),
local_addr: "127.0.0.1:8080".into(),
transport: Transport::Tcp,
codec: false,
force_namespace: false,
}).await?;
registration.wait_ready().await?;
Install the unified CLI directly from crates.io:
cargo install pb-mapper-cli --locked
The package is named pb-mapper-cli, and it installs one executable named
pb-mapper. That executable contains the server, register, connect,
status, and admin roles, so a separate server executable is not required.
The relay implementation is also published as the pb-mapper-server library
for applications that need to embed it.
npm install pb-mapper
import { Client } from "pb-mapper";
const client = new Client({
server: "relay.example.com:7666",
credential: process.env.MSG_HEADER_KEY!,
});
const admin = client.admin();
const issued = await admin.issueKey(3600, "agent");
The current release provides the secure network, a Rust client SDK, and a Node-API package. Remaining work:
pb-mapper-suite workflow;These are roadmap items, not yet part of the published compatibility contract.
make build-pb-mapper
cargo test
docs/user-guide.mddocs/authentication-v2.mdDOCKER_README.mdREADME.zh-CN.md, docs/user-guide.zh-CN.mdRepository layout:
crates/ — Rust workspace: core, auth, protocol, server, client, SDK facade (pb-mapper), Node-API (pb-mapper-node), CLI, and testkitjs/ — JS package wrapping the Node-API addon (built with bun)ui/ — Flutter UI and native C ABI bridgeskills/ — agent-readable deployment and release workflowsdocs/ — architecture, authentication, user guides, and project assetsdocker/, services/, scripts/ — packaging and operationsReleased under the MIT License.
253 commits
Rust
66.2%
Dart
21.8%
C++
2.9%
JavaScript
2.6%
Shell
2.4%
Python
1.3%
CMake
1.3%