Tenvy is a modular, high-performance remote administration framework consisting of:
- tenvy-server — controller and UI built with Svelte 5 (Runes Mode), SvelteKit, TypeScript, TailwindCSS v4, shadcn-svelte, lucide, and Bun.
- tenvy-client — lightweight Go-based agent designed for persistent and adaptive communication with the controller.
Tenvy is designed around two synchronized components: | Component | Language / Framework | Role | |----------------|---------------------------------------------|------------------------| | tenvy-server | SvelteKit + TypeScript + Tailwind v4 | Controller & Interface | | tenvy-client | Go | Agent / Target Node |
Agents operate as modular runtime units capable of system interaction, management, and control.
The server handles orchestration, visualization, and plugin management.
Tenvy aims for a complete modular agent architecture with the following feature categories:
Each feature group is represented as a module, dynamically managed and executed from the controller UI.
| Layer | Technology |
|---|---|
| Controller Core | SvelteKit |
| Frontend | Svelte 5 (Runes Mode), SvelteKit, TypeScript |
| Styling | TailwindCSS v4, shadcn-svelte, lucide |
| Runtime | Bun |
| Agent | Go |
Wayland sessions on Linux now rely on a virtual input device created via /dev/uinput. To allow the agent to inject keyboard and pointer events:
uinput kernel module is available and /dev/uinput is writable by the agent process (typically by adding the user to the input group or configuring udev rules).Remote desktop clips now prefer platform encoders before falling back to ffmpeg. Building those native backends requires the following toolchains in addition to a Go toolchain with CGO_ENABLED=1:
| Platform | Required SDKs / Packages | Notes |
|---|---|---|
| Windows | Windows 10 (or later) SDK with Media Foundation headers and mfplat.lib on the link path. |
Builds must run in a Visual Studio Developer Command Prompt or have VCINSTALLDIR/WindowsSdkDir exported so go build can find the libraries. |
| macOS | Xcode Command Line Tools (or full Xcode) providing VideoToolbox.framework. |
CGO_CFLAGS/CGO_LDFLAGS should include -framework VideoToolbox when cross-compiling. |
| Linux | VA-API development headers (libva-dev or distribution equivalent) and access to /dev/dri/renderD128. |
When VA-API is unavailable the agent falls back to the software encoder path. |
Cross-compiling the agent should add the relevant SDK paths via PKG_CONFIG_PATH/CGO_CFLAGS/CGO_LDFLAGS. When these prerequisites are missing, the encoder factory records telemetry and the runtime transparently falls back to the existing ffmpeg worker.
When running the server locally a development voucher is created automatically so you can complete the onboarding flow without touching the database manually. The default code is TEN-VY-DEV-ACCESS-0000, but you can override it by setting the DEV_VOUCHER_CODE environment variable before starting the server.
/api/agents/stream that now fans out registry changes to every connected admin session. Subscriptions are persisted in the registry_subscription table so that new dashboards hydrate directly from the authoritative snapshot before replaying live updates.src/lib/stores/registry-events.ts) which reconciles optimistic agent mutations as the server confirms them.tenvy-server/tests/registry-broadcast.test.ts; run it with npm run test:unit -- --run tests/registry-broadcast.test.ts.Tenvy supports a unified plugin structure for both server and client sides. Plugins are dynamically loadable and communicate via defined message schemas.
| Plugin Type | Description |
|---|---|
| Server Plugin | Extends controller UI or backend logic |
| Client Plugin | Adds new system modules or command handlers |
| Shared Plugin | Implements both UI and agent-side logic |
Client-side plugins that live in this repository now share a reproducible build target. The workflow compiles each manifest-backed plugin, stages its files into a deterministic ZIP archive, and refreshes the published metadata so the server can serve the exact bits that were produced locally or in CI.
zip CLI are available. Pass --goos/--goarch if you need to cross-compile (defaults to the host platform).bun scripts/build-plugins.ts to build every manifest with a registered recipe (currently remote-desktop-engine).tenvy-server/resources/plugin-artifacts/, recomputes SHA256 hashes and sizes, and rewrites the matching entries in tenvy-server/resources/plugin-manifests/*.json.Commit the refreshed ZIPs and manifest updates so that the server distribution and metadata always stay in sync.
The controller now persists published plugin manifests in a registry table. Developers upload new builds through /api/plugins; each submission records the manifest, metadata, and publisher in the registry. Admins can approve or revoke entries directly from Plugins → Plugin registry in the UI, which updates agent eligibility in real time. Agents fetch the registry feed to block unapproved or pending versions during telemetry syncs, ensuring only reviewed builds remain active.
This project is licensed under the MIT License.