Nodevisor
Automate any server with TypeScript.
Deploy Docker clusters, manage packages, configure firewalls — agentless over SSH with nothing to install. Cross-platform across Linux, macOS, and Windows.
import $, { Packages, Users, UFW, Docker, endpoints } from 'nodevisor';
const $server = $.connect({ host: '10.0.0.10', username: 'root' });
await $server(Packages).install(['curl', 'git']);
await $server(Users).add('runner');
await $server(UFW).allow([endpoints.ssh, endpoints.web]);
await $server(Docker).install();npm install nodevisorAgentless remote execution
SSH into any server with nothing to install. Run commands locally or remotely with the same API. Variables are auto-escaped to prevent injection.
const $server = $.connect({ host: '10.0.0.10', username: 'root' });
// Safe — variables are automatically escaped
const name = 'my-dir; rm -rf /';
await $server`mkdir ${name}`;
// Parse output as text, JSON, lines, or boolean
const hostname = await $server`hostname`.text();
const config = await $server`cat config.json`.json();Cross-platform typed modules
One API for Linux, macOS, and Windows. Auto-detects apt, yum, brew, or winget. Full type safety and autocomplete in your editor.
// Auto-detects apt, yum, brew, or winget
await $server(Packages).install(['nginx', 'curl']);
// Create users, set passwords, manage SSH keys
await $server(Users).add('deploy');
await $server(AuthorizedKeys).write(publicKey);
// Firewall with predefined endpoints
await $server(UFW).allow([endpoints.ssh, endpoints.web]);Docker cluster deployment
Define your entire production stack in TypeScript. Build, push, and deploy to Docker Swarm with one command.
const cluster = new DockerCluster({
name: 'production',
nodes: [new DockerNode({ host: '10.0.0.1' })],
});
cluster.addDependency(new Traefik({ ssl: { email: '[email protected]' } }));
cluster.addDependency(new Postgres({ password: process.env.DB_PASS! }));
cluster.addDependency(new NodeWeb({ appDir: './app', port: 3000 }));
await cluster.deploy();Why not YAML?
Ansible needs YAML playbooks, Jinja templates, and inventory files. Nodevisor is just TypeScript — use loops, conditionals, async/await, and the full npm ecosystem.
# ansible/playbook.yml
---
- hosts: webservers
become: yes
tasks:
- name: Install packages
apt:
name: "{{ item }}"
state: present
loop:
- curl
- git
- docker.io
- name: Create deploy user
user:
name: runner
shell: /bin/bash
- name: Configure UFW
ufw:
rule: allow
port: "{{ item }}"
proto: tcp
loop:
- "22"
- "80"
- "443"
- name: Enable UFW
ufw:
state: enabled// .nodevisor/setup.ts
import $, { Packages, Users, UFW, Docker, endpoints } from 'nodevisor';
const $server = $.connect({ host: '10.0.0.10', username: 'root' });
await $server(Packages).install(['curl', 'git']);
await $server(Users).add('runner');
await $server(UFW).allow([endpoints.ssh, endpoints.web, endpoints.webSecure]);
await $server(UFW).start();
await $server(Docker).install();Ready to automate?
One package. Full infrastructure control.