Skip to content

Documentation

Kracht documentation

How to rent a GPU by the second, how to lend one, and the CLI, API and money rules under both. Everything here is read from the code that runs; where a surface is still being built, it says so.

Billing
Per second, in EUR
Provider split
85 / 15, exact
API
/v1, bearer key
Payments
Not switched on yet

01Overview

Overview

Kracht is a two-sided marketplace for GPU compute. Renters launch a GPU and pay per second while it runs; providers list idle hardware and keep 85% of what it earns. Both sides talk to one control plane over a REST API under /v1, from the console, the CLI or raw HTTP. What follows is what the platform does today, section by section, with the parts that are not finished named as such.

Proven
Launch, meter and settle on real hardware; a renter SSH login to a GPU rental with one card scoped in; snapshot and restore; the provider bootstrap on an untended Ubuntu box. exercised against the live stack
Not yet
Payments run against a mock provider, so no real money has moved. Studio and Autopilot are planned surfaces on the same meter, and their pages will be written when there is behaviour to document. payments off studio, autopilot
Where it runs
The site on kracht.ai; the control plane at cp.kracht.ai, in Frankfurt; one Postgres database behind both.

02Rent a GPU

Rent a GPU

Six steps from nothing to a shell on a GPU, and one to stop paying. The console at /app/launch and the CLI drive the same API, so either works at every step.

  1. 01

    Sign up

    Create an account at /sign-up. Sign-up creates the account, the profile and the owner membership in one go. You can look around before adding any credit.
  2. 02

    Create an API key

    At /app/settings/keys. Keys are stored only as a hash and are never echoed back, so copy it when it is shown.
  3. 03

    Sign the CLI in

    kracht login, then paste the key. kracht whoami confirms who you are and shows your balance.
  4. 04

    Launch

    kracht launch --gpu 1 --ssh rents a machine and opens a shell once it is ready. Two keys are involved, not one: your SSH key is the login and your WireGuard key is the route in, because providers sit behind NAT. Both keypairs are generated on your machine and only the public halves are sent. A launch missing either is refused.
  5. 05

    Connect

    kracht ssh <instance> for a shell, or kracht connect <instance> for the details. Inside you are root on Ubuntu 24.04 with a read-only root filesystem; /workspace is your writable scratch.
  6. 06

    Stop

    kracht stop <instance>, or DELETE /v1/instances/:id. The meter stops with it. Stop with a snapshot from the console to keep /workspace for a later rental; otherwise it is wiped.

The whole path, in the CLI

kracht login
kracht launch --gpu 1 --ssh
kracht ls
kracht stop <instance>

01Sign in

One key, saved once.

Paste an API key from the console. Everything after this call is scoped to the account that key belongs to; the account never comes from a parameter.

kracht login
kracht whoami

02Launch

A card, matched and metered.

The request names what it needs, never where to go. The rate is frozen at match and the meter starts when the container does.

kracht launch --gpu 1 --ssh

03Stop

Stopping is giving the card back.

The meter stops with the rental, the hold is released, and the split is appended to the ledger once. A settled rental does not come back.

kracht stop <instance>

Bring your own image

Pass --image REF with any image the host can pull. A custom image usually needs --command too: most base images run a default entrypoint that exits at once, and a container that exits ends the rental you just paid for. The default image exists because it ships an sshd, which stock framework images do not.

Instance
A rental: a whole host, or one card on it, billed by the second. It moves through requested, provisioning, running, stopping and settled. A rental whose host vanished is closed as interrupted rather than left open, and a job that ends on its own as completed.
Storage
Each rental gets scratch space at /workspace that is destroyed when the rental ends. There is no automatic checkpointing and no persistent storage: move results off before you stop, or take a snapshot. Snapshot and restore are opt-in, not automatic.
Networking
Your SSH key is the login; your WireGuard key is the route in. Without the tunnel nothing is published on any address. Traffic between services is TLS, and egress is off by default.
What you pay
The frozen rate for the card, per second. An H100 80GB listed at €2.89 per hour bills €0.000803 per second, and the meter runs from the moment the instance is running to the moment you stop it.

In the base image

  • Ubuntu 24.04the base image
  • Python 3python3, pip
  • OpenSSHyour key, root shell
  • /workspacescratch, snapshottable
  • one card/dev/kfd, renderD128
  • WireGuardthe route in

In your image, if you bring it

  • PyTorchvia your image
  • TensorFlowvia your image
  • JAXvia your image
  • Jupytervia your image
  • vLLMvia your image
  • Dockerany image the host can pull

from a shell inside the rental

/
  • dev
    • kfdopenable, read-writemeasured: observed once, at a stated time, as of 2026-08-03, source #199
    • dri
      • card1the one card scoped inmeasured: observed once, at a stated time, as of 2026-08-03, source #199
      • renderD128its render nodemeasured: observed once, at a stated time, as of 2026-08-03, source #199
      • card0the host's iGPU, not visiblemeasured: observed once, at a stated time, as of 2026-07-27, source docs/AUDIT.md
  • workspace
    • markerwritten by the first rental, served back by the restoremeasured: observed once, at a stated time, as of 2026-08-03, source #186
  • root/.ssh
    • authorized_keysthe renter's key; the login, and nothing elsemeasured: observed once, at a stated time, as of 2026-08-03, source #199

03Provide hardware

Provide hardware

Lending a machine is one command on a fresh Ubuntu box. The agent runs as an unprivileged system user, isolates each rental in its own container and session network, and reports capacity so the marketplace can match it. Register first: the installer needs a token that only registration issues.

  1. 01

    Register the machine

    Add a host at /app/machines, or POST /v1/me/hosts. You get an agent token, shown once, bound to that machine from the moment it exists.
  2. 02

    Run the installer

    One line, as root, on Ubuntu. Idempotent: re-running it upgrades the agent. It installs Docker, creates the kracht-agent user, installs the systemd unit, sets up the isolated session network and builds the rentable instance image on your box.
  3. 03

    Set your price

    PUT /v1/me/hosts/:id/listing, or the controls on the host in the console. Changing the price never touches a rental already running: the rate was frozen onto it at match time.
  4. 04

    It appears in your fleet

    The agent registers itself and heartbeats every 15 seconds. sudo systemctl status kracht-node-agent on the box says whether it is up; GET /v1/me/hosts says whether Kracht can see it.
Install the agentUbuntu · sudo
curl -fsSL https://cp.kracht.ai/install.sh | sudo bash -s -- \
  --control-plane-url https://cp.kracht.ai \
  --enrollment-token <YOUR_TOKEN>

<YOUR_TOKEN> is issued when you register a machine, and shown once. It is bound to that machine from the moment it exists, so a leaked token cannot enroll someone else's box as a host.

What this script does to your machine
  • Installs prerequisites with apt, including Docker.
  • Creates an unprivileged system user, kracht-agent. Nothing runs as root after setup.
  • Installs the node agent as a systemd service so it survives a reboot.
  • Sets up an isolated session network, reapplied at every boot.
  • Optionally hardens SSH to key-only with no root login (--harden-ssh).
  • Optionally configures an nftables firewall, default-deny inbound (--firewall).
  • Optionally enables Docker user-namespace remapping, so a renter's container cannot map to root on your host.

Installer flags

Installer flags
FlagWhat it does
--control-plane-url URLWhere the agent reports to. https://cp.kracht.ai in production.
--agent-token TOKENThis host's long-lived credential, issued once when the host is registered and shown only that once. --enrollment-token is accepted as the same flag.
--source DIRInstall from a local checkout instead of downloading the agent source from the control plane.
--agent-user NAMEThe unprivileged system user the agent runs as. Default kracht-agent.
--harden-sshKey-only SSH, no root login.
--userns-remapDocker user-namespace remapping, so a renter's container cannot map to root on your host.
--firewallAn nftables host firewall, default-deny inbound.
Install dir
/opt/kracht-node-agent
State
/var/lib/kracht-node-agent
Config
/etc/kracht-node-agent
Service
kracht-node-agent
WireGuard port
51820/udp
Instance image
kracht/instance-base:latest, built on your box by the installer

What you earn

Share
85% of what the card makes, credited to your account's ledger as each usage tick settles. The remaining 15% is the take rate.
Earnings
GET /v1/me/earnings returns total, paid out and available, in EUR, derived from the ledger. GET /v1/me/payouts is the settlement history.
Payouts
Only earned money leaves to a bank account. What is payable is the lower of your earnings less payouts already taken and your account's actual balance, so earnings you spent renting cannot also be withdrawn.
Today
Payments are not switched on: the provider is a mock, no bank account is connected and no real money has moved. The split is applied and proven in the ledger. payments off
Your disk
A renter is capped at the lower of what they asked for and your max_disk_gb. A request larger than your cap is rejected outright, and an unspecified request never means unlimited.

04CLI

CLI

One binary, eight commands. kracht launch starts billing per second and kracht stop ends it; kracht ls is the honest answer to whether you are still being charged. Homebrew on macOS, or one shell line on macOS and Linux; Windows builds are downloadable from the install page.

macOS

brew trust kracht-ai/tap
brew tap Kracht-AI/tap
brew install --cask kracht
CLI commands
CommandWhat it does
kracht login [--key KEY]Save an API key from kracht.ai/app/settings/keys
kracht whoamiWho you are signed in as, and your balance
kracht lsYour rentals
kracht launch [flags]Rent a machine
kracht stop <instance>Stop a rental and stop paying for it
kracht connect <instance>Connection details for a rental
kracht ssh <instance>Open a shell on a rental
kracht versionThe version you installed

Launch flags

Launch flags
FlagWhat it does
--gpu NGPUs required (default 1)
--image REFContainer image (default kracht/instance-base:latest)
--command ...What to run in it; everything after this flag is the command. A custom --image usually needs one: most base images run a default entrypoint that exits at once, and a container that exits ends the rental you just paid for.
--region CODERestrict to a region, e.g. eu-nl
--max-price EURRefuse anything dearer, per hour
--sshOpen a shell once it is ready

Environment

CLI environment variables
VariableWhat it does
KRACHT_API_KEYUse this key instead of the saved one
KRACHT_APIPoint at a different control plane (default https://cp.kracht.ai)

A Python SDK is planned and not published. Until it is, the REST API below is the programmatic surface.

05API

API

Every endpoint sits under /v1 and takes a bearer key. kracht.ai/v1/* forwards to the control plane; the CLI talks to cp.kracht.ai directly. Money is returned as strings in EUR so nothing is rounded in transit, and the account is always derived from your credential, never from a parameter.

curl -H "Authorization: Bearer $KRACHT_API_KEY" https://kracht.ai/v1/me
curl https://kracht.ai/v1/gpus        # 401 without a token: the healthy answer
Auth
Authorization: Bearer <api key>. Keys come from /app/settings/keys. The agent protocol uses the host's agent token in the same header.
Envelope
Success is { "data": ... }; failure is { "error": { "code", "message" } }, with the codes in the table below.
Limits
Per route, per caller IP, per minute, at the edge. The control plane has no limit of its own. Over the limit answers 429 with Retry-After.
Ownership
An id that is not yours answers 404, not 403, so the id space cannot be enumerated.
Health
GET https://cp.kracht.ai/healthz answers 200 when the control plane is up.

Renting

Renter endpoints
MethodPathWhat it doesPer min
GET/v1/meThe signed-in account and its balance, in EUR.60
GET/v1/gpusBrowse available inventory: one row per active listing.120
GET/v1/listingsGPUs rentable right now. Filters: model, region, max_price_per_hour, limit.60
GET/v1/instancesYour own instances.60
POST/v1/instancesLaunch: request, match, instance. The paying account comes from your credential, never from the body.60
GET/v1/instances/:idStatus of one rental.120
DELETE/v1/instances/:idStop it. The meter stops with it.120
GET/v1/instances/:id/connectHow to reach a rental you are paying for. A structured tunnel document, never a filled-in config: Kracht has never held your private key.60
GET/v1/instances/:id/telemetryPer-card readings for one rental, oldest first.60
GET/v1/usageMetered spend, filterable by instance and time range.60
GET/v1/me/spend/by-rentalWhat each rental cost, summed over the whole ledger. since, until and limit pass through.60
GET/v1/me/ledgerThe append-only ledger: deposits, holds, usage charges, earnings, payouts. Newest first.60
GET/v1/me/snapshotsArchived workspaces, with state, size and when each was taken.60
DELETE/v1/me/snapshots/:idRemove an archived workspace and stop its storage charge.60
GET/v1/me/storageWhat you are storing and the monthly charge it implies.60

Providing

Provider endpoints
MethodPathWhat it doesPer min
GET/v1/me/hostsThe machines this account lends to Kracht.20
POST/v1/me/hostsRegister a new one and receive its agent token, once.20
PUT/v1/me/hosts/:id/listingSet your own price and availability. Never touches a running rental.20
GET/v1/me/hosts/:id/telemetry/dailyWhat one machine's cards were doing, per UTC day. days passes through.60
GET/v1/me/earningstotal, paid_out and available, in EUR, derived from the ledger.60
GET/v1/me/payoutsSettlement history: amount, period, status, processor reference.60

Account and members

Account endpoints
MethodPathWhat it doesPer min
GET/v1/me/membersWho can act for this account, and in what role.30
POST/v1/me/membersAdd somebody who already has a Kracht account, by user id.30
PATCH/v1/me/members/:user_idChange what somebody may do.30
DELETE/v1/me/members/:user_idRemove them, or leave yourself. An account keeps at least one owner.30
GET/v1/me/invitationsWho has been asked to join and has not yet.20
POST/v1/me/invitationsInvite an email address onto this account.20
POST/v1/me/invitations/acceptJoin an account you were invited to. The token goes in the body, never the query string.10
DELETE/v1/me/invitations/:idWithdraw an invitation that has not been accepted.30

Agent protocol

Called by the node agent on a provider machine, never by a renter. Listed so the whole surface is in one place.

Agent protocol endpoints
MethodPathWhat it doesPer min
POST/v1/hostsHost-agent registration. Authenticated with the host's agent token, not a user API key.20
POST/v1/hosts/:id/heartbeatLiveness, telemetry, metering, and the agent's commands. One beat every 15s per host.120

Errors

Error codes
StatusCodeMeaning
401unauthorizedNo bearer token, or a bad one. Without a token this is the healthy answer from every /v1 route.
402insufficient_fundsThe account cannot cover the launch.
403forbiddenYour role does not allow it.
404not_foundAlso the answer for an id that exists and is not yours: the id space is not enumerable.
409conflictPlacement found no host. The body carries the per-host rejection reasons.
429rate_limitedOver the per-minute limit for that route, per caller IP. Retry-After says when.
503unavailableThe control plane is unreachable from the web tier.
501not_implementedThe database is not configured. It should never appear in production now; if it does, that is a regression.

06Billing and money

Billing and money

Everything is metered per second, in euro, from usage events, and drawn against a prepaid balance. The rules below are the ones the ledger enforces, not a pricing page: the prices themselves are on /pricing, and your own charges at /app/billing.

Unit
Per second, in euro, from usage events, while the instance is running. No hourly minimum and no egress charge.
Precision
Amounts are numeric(16,6) in the database and travel as strings, so nothing is rounded in transit. Settlement is exact to the microeuro.
Split
The take rate is 15%. A provider keeps 85% of what a card earns, and the split is exact-integer so no cent leaks in the rounding.
Price
The matched rate is frozen onto the rental at match time. Billing uses it, never the live listing, so a provider re-pricing cannot change a running rental.
Balance
A sum over an append-only ledger, never a column. Deposits, holds, charges, earnings and payouts are all entries.
Retries
Usage is unique on (instance, seq) and every ledger entry carries an idempotency key, so a retried heartbeat cannot bill twice.
Holds
Credit is held before compute runs and released in full when the rental ends. A session that fails at startup takes a hold, releases it, and produces no charge.
Ending
Terminal states are one-way. A late heartbeat describing an already-settled rental cannot reopen it and start billing again.
Snapshots
An archived workspace is charged per GB-month while it is ready. The rate comes from GET /v1/me/storage, and deleting the snapshot stops the charge.
Withdrawals
Only earned money leaves to a bank account. Topped-up credit is spendable on compute and is not withdrawable. What is payable is the lower of earnings less payouts and the account's actual balance.
Payments
Not switched on yet. The payment provider is a mock, so every balance today is credit granted by hand and no real money has moved. The ledger arithmetic is proven; the payment rail is not.

07Security and isolation

Security and isolation

A rental is single-tenant for its whole life: no time-slicing, no partition shared with a stranger, and the machine's owner gets no shell into it. The container and its scratch are destroyed at teardown. The table is what was verified on the test provider box; the security page covers encryption, disclosure and what is not covered yet.

Verified isolation properties
PropertyResult
SSH login with your keyRoot shell on Ubuntu 24.04, including on a GPU rental on a userns-remapped box.
Wrong SSH keyPermission denied (publickey).
Without the WireGuard tunnelUnreachable. Private by construction.
Root filesystemRead-only inside the instance. Install into /workspace, or bring an image.
/workspace scratchWritable, and wiped on teardown.
The provider's LAN, from insideBlocked.
Capabilitiescap-drop ALL. An SSH-enabled session adds back only SYS_CHROOT, SETUID, SETGID, CHOWN, DAC_OVERRIDE and AUDIT_WRITE, which sshd's privilege separation needs.
DiskCapped at the lower of your request and the provider's max_disk_gb. A hard quota where the storage driver supports it; the agent measures and stops the session everywhere else.
Private keysYou generate both keypairs locally and send only the public halves. Kracht never handles a private key.
Base image
Ubuntu 24.04 with OpenSSH, python3 and venv, git, curl, vim and htop. Key-only sshd, no passwords, no X11 forwarding. Your public key is injected at start; host keys persist for the life of the rental.
Encrypted
TLS on every call, encrypted at rest by the database provider, and every credential stored only as a hash.
Auditable
Every euro and every state change lands in an append-only ledger, exact to six decimals.

08Status and limits

Status and limits

What the platform observes about itself today, what it does not, and the limits a renter meets first. There is no uptime figure anywhere on this site because nothing measures one; the status page says the same in the same type size.

What is observed and what is not
SignalStateDetail
Host heartbeatsobservedEvery provider machine reports in on a schedule. When one goes silent the worker marks it offline and rescues the rentals stranded on it.
Metered settlementobservedUsage is metered per second and settled to the microeuro, with the split applied at exact integers.
Spend limitsobservedAccount spend caps are enforced by the worker rather than by the console, so a runaway job stops even when nobody is watching a screen.
A health endpoint and raw metricsobservedThe control plane answers /healthz and renders Prometheus metrics from database state. Nothing collects them yet.
Uptimenot measuredUptime, for any component. There is no probe and no history.
Latencynot measuredLatency, per region or otherwise.
Regional healthnot measuredRegional health.
Incident historynot measuredIncident history.

Known limits

Known limits
LimitDetail
Read-only root filesystemapt install does not work inside a rental. Install into /workspace (venvs, conda, source builds) or bring a custom image.
No persistence by default/workspace is wiped on teardown. Stop with a snapshot to keep it, and restore into a later rental.
SSH only, in the base imageJupyter and VS Code have ports allocated but no server in the base image yet.
First connect can lagA freshly launched session's relay can time out on its first requests and then work. Poll until it answers.
Renters behind NATBoth sides behind residential NAT cannot peer directly and go through the public relay.

09FAQ

FAQ

Commands on this page

One command per section: the thing each part of this page is about, ready to copy.

curl -fsSL https://kracht.ai/install | sh
kracht login
kracht whoami