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 nodevisor

Agentless 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
# 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
// .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.