Hi everyone!
I’m popping over from the Whonix community. Lately, we’ve been running into a bit of a headache with integrating downstream Pluggable Transports (PTs). Right now, whenever a new transport like WebTunnel drops, downstream projects have to manually hard-code all the updates for UI menus and AppArmor profiles. It honestly causes a pretty big lag across release cycles!
To fix this and make Lyrebird way easier to integrate right out of the box, I’d love to propose adding a simple discovery flag to the binary—something like lyrebird --capabilities.
If Lyrebird could just spit out a JSON spec to stdout and exit (bypassing the strict environment variable checks that usually keep it from running on its own), downstream projects could figure out what’s supported dynamically! Since Lyrebird has such a nice, modular Go architecture, it feels like this could be added cleanly right in main.go. We could just use the standard flag and encoding/json libraries without needing any extra external dependencies.
Proposed Schema:
{
"version": "0.8.1",
"supported_transports": ["obfs4", "webtunnel", "snowflake", "meek"],
"env_vars_required": [
"TOR_PT_MANAGED_TRANSPORT_VER",
"TOR_PT_STATE_LOCATION",
"TOR_PT_CLIENT_TRANSPORTS"
],
"sandbox_requirements": {
"network": ["tcp", "udp"],
"rw_paths": ["$TOR_PT_STATE_LOCATION"]
}
}
Why this helps downstream:
-
Zero-Touch UIs: Integrators can easily parse
supported_transportsto auto-populate Tor connection menus. That means day-one support for new PTs! -
Automated Sandboxing: Instead of guessing or relying on hardcoded state paths, hardened environments can generate AppArmor or SELinux rules dynamically using the exposed
rw_paths. -
Pre-Execution Validation: Front-end launchers can double-check the required environment variables before running the daemon, which stops those annoying silent crashes.
I just wanted to float the idea here first to see if it matches up with the team’s roadmap. Would a JSON flag like this work for you guys, or do you think extending the official PT spec is a better way to go?