tenxo

Overview

Tenxo documentation

Tenxo is a decentralized GPU compute grid that connects hardware providers with AI developers. Jobs are end-to-end encrypted, billed per-second, and routed through a zero-knowledge matchmaker that never sees your data or encryption keys.

1. Providers register GPUs

Hardware owners install the Rust edge agent to advertise idle GPU capacity to the matchmaker.

2. Developers submit jobs

Encrypted payloads are uploaded, keys are exchanged via ECDH, and the matchmaker routes work to available agents.

3. Zero-knowledge execution

The matchmaker never possesses the AES encryption key. Only the client and GPU agent can decrypt the payload.

Reference architecture

                    +---------+       +------------+       +------------+
                    |  Client |       | Matchmaker |       |    GPU     |
                    | (Alice) |       |  (Go HTTP) |       |  Provider  |
                    +---------+       +------------+       +------------+
                         |                   |                   |
    1. Install/Sign in   |                   |                   |
       ─────────────────>|                   |                   |
       POST /presign     |                   |                   |
       <────── URLs ─────|                   |                   |
    2. Upload encrypted   |                   |                   |
       payload (PUT)      |                   |                   |
       ──────────────────|──────────────────>|                   |
                          |  (stores .enc)    |                   |
    3. ECDH key exchange  |                   |                   |
       via signaling     |                   |                   |
       ─────────────────────────────────────>|─ ─ ─ ─ ─ ─ ─ ─ >|
                          |                   |                   |
    4. Agent decrypts     |                   |                   |
       & runs job         |                   |                   |
       <──────────────────────────────────────|──────────────────|
                          |                   |                   |
    5. Download results   |                   |                   |
       <──────────────────|                   |                   |

  ┌──────────────────────────────────────────────────────────────────────┐
  │                    ZERO-KNOWLEDGE PROPERTY                           │
  │                                                                      │
  │  Client: AES_key = HKDF(ECDH(client_priv, agent_pub))                │
  │  Client sends: AES_key XOR ECDH(client_priv, agent_pub)              │
  │  Agent recovers: ECDH(agent_priv, client_pub) XOR received_value     │
  │                                                                      │
  │  Matchmaker sees only the XOR'd value — never the plain AES key.     │
  └──────────────────────────────────────────────────────────────────────┘

Quickstart

Get started in two paths

Choose your role below. Developers submit compute jobs. Providers supply GPU capacity.

For developers

Run AI workloads on the decentralized grid. Sign in with Supabase, get an API key auto-generated, then submit encrypted jobs through the CLI or dashboard.

Read developer guide →

For providers

Turn idle GPU hardware into billable compute capacity. Install the Rust agent, register your node, and start earning when jobs are routed to your machine.

Read provider guide →

Developer Guide

Submitting compute jobs

1Sign in to the console

Visit the Tenxo Console and sign in with Supabase (GitHub or email). Once authenticated, an API key with txn_ prefix is auto-generated for your account.

2Create a presigned upload

Use your Supabase JWT or API key to call POST /presign. This returns upload URLs and a server-generated job ID. An encryption key is derived automatically.

curl -X POST https://matchmaker.tenxo.ai/presign   -H "Authorization: Bearer $TENXO_TOKEN"   -H "Content-Type: application/json"   -d '{"enc_key_b64": ""}'

3Upload encrypted payload

Encrypt your workload with the AES-256-GCM key, then PUT it to the upload_url.

# Python SDK handles encryption automatically: tenxo run payload.tar.gz --gpu a5000 # Manual: curl -X PUT "$UPLOAD_URL" \ -H "Content-Type: application/octet-stream" \ --data-binary @encrypted_payload.bin

4Check job status & download results

Poll GET /jobs/<job_id> for status changes. Once complete, download from the result URL and decrypt with your AES key.

curl -H "Authorization: Bearer $TENXO_TOKEN"   https://matchmaker.tenxo.ai/jobs/job-a1b2c3d4

# Response:
# {"job_id":"job-a1b2c3d4","status":"completed","result_url":"..."}

Billing & credits

Tenxo uses a pre-paid credits model (RunPod model). Add credits via Razorpay (card or UPI), and usage is deducted per-second while your job runs. Failed jobs are billed only for actual compute time.

Per-second billing

Only pay for what you use. 1 second minimum.

Pre-paid credits

Top up your balance before submitting jobs.

Auto-stop

Jobs that fail are stopped automatically — no surprise charges.

Available GPU tiers

GPUVRAMUse casePrice / hr
RTX 409024 GBFine-tuning, inference$0.15
RTX A500024 GBStable training runs$0.22
A10040 GBLarge model training$0.75

Provider Guide

Connecting your GPU hardware

1Prerequisites

  • Linux machine (Ubuntu 22.04+ recommended)
  • NVIDIA GPU with drivers installed (nvidia-smi works)
  • Docker installed (for sandboxed job execution)
  • Open port 8080 for WebSocket communication
  • A Tenxo account (sign up at console.tenxo.ai)

2Install the edge agent

Run the one-command installer. It downloads the Rust binary, sets up a systemd service, and connects to the Tenxo matchmaker.

curl -fsSL https://tenxo-api.onrender.com/install.sh | bash -s -- --owner YOUR_USER_ID

Your user ID is available in the Provider Console after signing in.

3Heartbeat & liveness

Once running, the agent sends heartbeat signals every 30 seconds. Your node appears in the marketplace as idle and becomes available for job routing.

Agent heartbeat format

{
  "type": "heartbeat",
  "payload": {
    "node_id": "gpu-node-001",
    "gpu_model": "RTX 4090",
    "gpu_vram_mb": 24576,
    "tee_attested": true,
    "load": 0.0
  }
}

4TEE attestation (optional)

If your machine supports AMD SEV-SNP or Intel TDX, the agent automatically generates an attestation quote during the signaling handshake. Verified nodes display aVerified badge in the marketplace.

With TEE

Full challenge-response attestation. report_data[32..64] verified.

Without TEE

Node runs as "Unverified". Jobs still accepted — no badge.

5Monitor your fleet

Visit the Provider Console to see all your registered nodes, their current status, GPU specs, TEE verification state, and heartbeat TTLs.

Provider earnings

Providers earn 93% of the compute price paid by developers. Payouts are processed weekly via Stripe Connect (minimum $50 threshold). Earnings accumulate per-second based on actual job execution time.

93% payout share

You keep almost all of the compute revenue.

Weekly payouts

Automatic transfers every Monday.

$50 minimum

Payouts trigger once earnings exceed $50.

CLI Reference

Python SDK & CLI

The tenxo Python package handles encryption, key exchange, and job submission from the command line.

Installation

pip install tenxo

Available commands

CommandDescription
tenxo run <file>Encrypt and submit a job to the grid
tenxo status <job_id>Check the status of a submitted job
tenxo download <job_id>Download and decrypt job results
tenxo listList all your active and completed jobs
tenxo config set --key <key>Set your API key for authentication
tenxo nodesList available GPU nodes on the grid

Example workflow

# Authenticate
tenxo config set --key txn_your_api_key_here

# Submit a fine-tuning job
tenxo run model.tar.gz --gpu a5000 --watch

# List available GPUs
tenxo nodes

# Download results
tenxo download job-a1b2c3d4

API Reference

REST endpoint reference

All authenticated endpoints require a Bearer token (Supabase JWT or txn_ API key) in the Authorization header.

Authentication

MethodEndpointDescription
GET/api/keysList API keys (auto-generates first key)
DELETE/api/keys/:hashRevoke an API key
PATCH/api/keys/:hashRename an API key

Jobs & compute

MethodEndpointDescription
POST/presignCreate a presigned upload URL and job ID
GET/jobs/:idGet job status and result URL
GET/nodesList all available GPU nodes
GET/my-nodesList provider's own registered nodes
POST/jobsSubmit a job for execution

Billing

MethodEndpointDescription
POST/billing/setup-intentCreate a Razorpay order for adding credits
POST/billing/verify-paymentVerify payment and save payment token
POST/billing/chargeCharge saved payment method
GET/billing/usageGet current billing usage and balance

Troubleshooting

Common issues & solutions

Agent won't connect — 'unauthorized' error

Verify your user ID is correct. Find it in the Provider Console after signing in. Provider accounts use your Supabase user ID.

Node shows 'unverified' TEE status

TEE attestation is optional. Nodes without AMD SEV-SNP or Intel TDX hardware run as 'Unverified' — jobs still execute. To enable attestation, ensure /dev/sev-guest is accessible (requires kernel support).

Job stuck in 'created' status

No available GPU node matched your job requirements. Check /nodes to see current supply. Try a different GPU tier (e.g., RTX 4090 instead of A100).

Billing charge failed

Ensure your Razorpay payment method has sufficient funds. Pre-paid credits are deducted per-second. If auto-charge fails, add credits manually in the billing settings.

API key not working

API keys are auto-generated on first visit to the Developer Console. If revoked, a new key is generated on your next API request. Make sure you're using the txn_ prefix.

Still need help?

Open an issue on GitHub or reach out to the team.