Sign inSign up

vxcloud/vxnode

By vxcloud

•Updated about 1 month ago

vxcloud tenant node — multi-cloud provisioning, deploys, AI agents & SalesShift GTM, self-hosted

Image
Machine learning & AI
Developer tools
Web servers
0

2.8K

vxcloud/vxnode repository overview

⁠vxcloud/vxnode

The runtime node for the vxcloud⁠ platform — one hardened container that provisions multi-cloud infrastructure, deploys applications, runs governed AI agents, and powers the SalesShift go-to-market stack on your own VM.

Docker Pulls Image Size Arch License


⁠ℹ️ Image info

AttributeDetails
Docker imagevxcloud/vxnode:latest
Version2026.8.28 — same number as vxcli, the desktop app and every SDK
PublisherPRODXCLOUD
Tooling & sourcegithub.com/prodxcloud/vxnode⁠
SDKsgithub.com/prodxcloud/vxcloud⁠
Architectureslinux/amd64, linux/arm64 (AWS Graviton · Azure Ampere)
Exposed port8744 — HTTP API
Health checkGET /api/v2/health
Requiresa vxcloud account (tenant credentials)
Docsvxcloud.io/docs⁠
LicenseProprietary © PRODXCLOUD

⚠️ Needs your account credentials. This is the execution node for the vxcloud control plane — it serves its API immediately but stays inert until you supply tenant credentials (issued when you create a node). Get started at prodxcloud.com⁠.

⁠⚡ What it does

  • ☁️ Multi-cloud provisioning — AWS, Azure, Google Cloud, Linode, DigitalOcean — Terraform-native IaC
  • 🚢 App & container deployment — 14+ language stacks and Docker workloads over SSH, one-command HTTPS
  • 🤖 Agentic DevOps — policy-governed AI agents (Anthropic, OpenAI, Google Gemini)
  • 📈 SalesShift GTM — prospect pool, CRM, campaigns, opportunity signals and social distribution
  • 🔧 One unified API — CI/CD, networking, managed databases, storage, serverless, Kubernetes

⁠📈 SalesShift — the GTM stack, on your node

Beyond infrastructure, this node serves SalesShift: the go-to-market layer of the platform. Same API, same auth, same audit trail as everything else it runs.

SurfaceWhat it covers
Prospect poolSearch people and companies by seniority, department, headcount, geography. Addresses come back masked — revealing one spends quota, and you can price a batch before you spend it.
Leads → CRMA pool row is not mailable. Save it as a lead, convert it into a Contact, then it can be emailed.
Tracked emailSends through the org's own providers via a Go email worker — suppression gating, daily caps, warmup ramp, open/click tracking on a Kafka event stream.
CampaignsCreate, schedule, send, and pull a per-recipient report with an hourly timeline.
OpportunitiesA cross-tenant signal pool scraped from real sources. Save, dismiss, or push straight into a lead.
TasksGoal, progress and assignee on every row.
SocialOne goroutine per network — the fan-out reports a measured speedup, not a claimed one.
WebmasterURL inspect, robots.txt and sitemap checks, file generation.
BillingWhat the workspace pays for SalesShift: plans, subscription, seats, invoices, checkout.

Drive it from the CLI:

vxcli salesshift leads search --seniority c_level --country AU --limit 25
vxcli salesshift leads quota
vxcli salesshift leads reveal <pool-id>
vxcli salesshift leads convert-from-pool <pool-id>… --lifecycle-stage lead
vxcli salesshift leads enrich acme.com

vxcli salesshift email send --to [email protected] --subject "…" --html "<p>…</p>"
vxcli salesshift campaigns report <campaign-id>
vxcli salesshift contacts list
vxcli salesshift workflows test-run <id>
vxcli salesshift sequences list

vxcli salesshift opportunities list --source hn --min-score 70
vxcli salesshift opportunities push-to-lead <id>
vxcli salesshift tasks add --title "Follow up" --goal "Book a call"
vxcli salesshift social post --content "…" && vxcli salesshift social send <post-id>
vxcli salesshift webmaster inspect https://example.com
vxcli salesshift billing plans

…or from any SDK:

# Python
import vxsdk
ss = vxsdk.Client.load_from_vxcli().salesshift

page = ss.search_leads(filters={"seniority": ["c_level"], "country": ["AU"]}, limit=50)
ids  = [p["pool_person_id"] for p in page["results"][:10]]

print(ss.reveal_quota())              # allowance / remaining / unlimited
print(ss.preview_reveal_cost(ids))    # what this batch WOULD cost, before spending
ss.save_leads(ids)
print(vxsdk.describe_convert(ss.convert_from_pool(ids, lifecycle_stage="lead")))
// TypeScript
import { VxCloud } from '@vxcloud/sdk';
const c = new VxCloud({ apiKey: process.env.VX_API_KEY! });

const page = await c.leads.searchLeads({ filters: { country: ['AU'] }, limit: 50 });
const { job } = await c.social.distribute(postId);
console.log(`${job.speedup}x vs sequential`);

// Every delivery carries `simulated` — a deployment holding no social API
// credentials still returns delivery records. Surface it; never report a
// simulated post as published.
for (const d of job.deliveries) console.log(d.channel, d.simulated ? 'SIMULATED' : 'published');

Every quota field is null when unlimited, never 0 — a plain zero would read as "no allowance", the exact opposite of what the API means.

⁠🐳 Run the container

Create a .env with the tenant credentials from your vxcloud account (names only — values are issued to you):

# .env
VAULT_ADDR=https://vault.vxcloud.io
VAULT_ROLE_ID=<your-approle-role-id>
VAULT_SECRET_ID=<your-approle-secret-id>
TENANT_ORGANIZATION=<your-org>
TENANT_WORKSPACE=<your-workspace>
GIN_MODE=release
PORT=8744

docker run

docker run -d --name vxcloud-vxnode \
  --env-file .env \
  -p 8744:8744 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  --restart unless-stopped \
  vxcloud/vxnode:latest

curl http://localhost:8744/api/v2/health      # -> {"status":"ok", ...}

docker-compose.yml

services:
  vxnode:
    image: vxcloud/vxnode:latest
    container_name: vxcloud-vxnode
    restart: unless-stopped
    env_file: .env
    environment:
      - GIN_MODE=release
      - PORT=8744
    ports:
      - "8744:8744"            # use "127.0.0.1:8744:8744" if fronting with Nginx/TLS
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./generated:/app/generated
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8744/api/v2/health"]
      interval: 15s
      timeout: 5s
      retries: 3
    security_opt:
      - no-new-privileges:true
    cap_drop: [ALL]
    cap_add:  [NET_BIND_SERVICE]
docker compose up -d

TLS is terminated by Nginx + Let's Encrypt on the host, not inside the container. Full provisioning, reverse-proxy, and fleet auto-update tooling: github.com/prodxcloud/vxnode⁠.

⁠🎮 Drive it from your machine

CLI

curl -fsSL https://vxcloud.io/download/cli/install.sh | sh   # macOS / Linux
irm https://vxcloud.io/download/cli/install.ps1 | iex         # Windows
vxcli version                                                 # -> 2026.8.28

SDKs — same wire contract, same auth model, same error taxonomy in every language.

LanguagePackageInstall
Pythonvxsdk⁠ · vxcloud⁠pip install vxsdk
TypeScript / Node@vxcloud/sdk⁠npm install @vxcloud/sdk
Gogithub.com/prodxcloud/vxcloud⁠go get github.com/prodxcloud/vxcloud
C++cpp/⁠CMake, or drop in two files (libcurl, C++17)
Javajava/⁠Maven, io.vxcloud:vxsdk (JDK 11+, zero deps)

The node, the CLI, the desktop app and all six SDKs share one version number — 2026.8.28.

⁠🏷️ Tags

TagDescription
latestThe only published tag — current production build, multi-arch manifest (amd64 + arm64)

One moving tag, on purpose: a second alias is one more thing that can quietly fall behind and hand somebody a stale node. If you need a build to stay put, pin the digest rather than trusting a tag not to move.

Pin by digest if you need a build to stay put:

docker pull vxcloud/vxnode@sha256:<digest>     # from `docker buildx imagetools inspect vxcloud/vxnode:latest`

⁠👤 Author

Built and maintained by Joel O. Wembo


vxcloud.io⁠ · Docs⁠ · CLI⁠ · SDK⁠ · Dashboard⁠

© PRODXCLOUD — built for regulated, multi-cloud enterprises.

Tag summary

Content type

Image

Digest

sha256:0c5792e4c…

Size

200.6 MB

Last updated

about 1 month ago

docker pull vxcloud/vxnode