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.
- 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.
- 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.
- 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. - 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. - 03
Sign the CLI in
kracht login, then paste the key.kracht whoamiconfirms who you are and shows your balance. - 04
Launch
kracht launch --gpu 1 --sshrents 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. - 05
Connect
kracht ssh <instance>for a shell, orkracht connect <instance>for the details. Inside you are root on Ubuntu 24.04 with a read-only root filesystem;/workspaceis your writable scratch. - 06
Stop
kracht stop <instance>, orDELETE /v1/instances/:id. The meter stops with it. Stop with a snapshot from the console to keep/workspacefor 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 whoami02Launch
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 --ssh03Stop
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
- kfdmeasured: observed once, at a stated time, as of 2026-08-03, source #199
dri
- card1measured: observed once, at a stated time, as of 2026-08-03, source #199
- renderD128measured: observed once, at a stated time, as of 2026-08-03, source #199
- card0measured: observed once, at a stated time, as of 2026-07-27, source docs/AUDIT.md
workspace
- markermeasured: observed once, at a stated time, as of 2026-08-03, source #186
root/.ssh
- authorized_keysmeasured: 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.
- 01
Register the machine
Add a host at /app/machines, orPOST /v1/me/hosts. You get an agent token, shown once, bound to that machine from the moment it exists. - 02
Run the installer
One line, as root, on Ubuntu. Idempotent: re-running it upgrades the agent. It installs Docker, creates thekracht-agentuser, installs the systemd unit, sets up the isolated session network and builds the rentable instance image on your box. - 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. - 04
It appears in your fleet
The agent registers itself and heartbeats every 15 seconds.sudo systemctl status kracht-node-agenton the box says whether it is up;GET /v1/me/hostssays whether Kracht can see it.
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
| Flag | What it does |
|---|---|
--control-plane-url URL | Where the agent reports to. https://cp.kracht.ai in production. |
--agent-token TOKEN | This 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 DIR | Install from a local checkout instead of downloading the agent source from the control plane. |
--agent-user NAME | The unprivileged system user the agent runs as. Default kracht-agent. |
--harden-ssh | Key-only SSH, no root login. |
--userns-remap | Docker user-namespace remapping, so a renter's container cannot map to root on your host. |
--firewall | An 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/earningsreturns total, paid out and available, in EUR, derived from the ledger.GET /v1/me/payoutsis 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.
- 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.
brew trust kracht-ai/tap
brew tap Kracht-AI/tap
brew install --cask kracht| Command | What it does |
|---|---|
kracht login [--key KEY] | Save an API key from kracht.ai/app/settings/keys |
kracht whoami | Who you are signed in as, and your balance |
kracht ls | Your 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 version | The version you installed |
Launch flags
| Flag | What it does |
|---|---|
--gpu N | GPUs required (default 1) |
--image REF | Container 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 CODE | Restrict to a region, e.g. eu-nl |
--max-price EUR | Refuse anything dearer, per hour |
--ssh | Open a shell once it is ready |
Environment
| Variable | What it does |
|---|---|
KRACHT_API_KEY | Use this key instead of the saved one |
KRACHT_API | Point at a different control plane (default https://cp.kracht.ai) |
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/healthzanswers 200 when the control plane is up.
Renting
| Method | Path | What it does | Per min |
|---|---|---|---|
GET | /v1/me | The signed-in account and its balance, in EUR. | 60 |
GET | /v1/gpus | Browse available inventory: one row per active listing. | 120 |
GET | /v1/listings | GPUs rentable right now. Filters: model, region, max_price_per_hour, limit. | 60 |
GET | /v1/instances | Your own instances. | 60 |
POST | /v1/instances | Launch: request, match, instance. The paying account comes from your credential, never from the body. | 60 |
GET | /v1/instances/:id | Status of one rental. | 120 |
DELETE | /v1/instances/:id | Stop it. The meter stops with it. | 120 |
GET | /v1/instances/:id/connect | How 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/telemetry | Per-card readings for one rental, oldest first. | 60 |
GET | /v1/usage | Metered spend, filterable by instance and time range. | 60 |
GET | /v1/me/spend/by-rental | What each rental cost, summed over the whole ledger. since, until and limit pass through. | 60 |
GET | /v1/me/ledger | The append-only ledger: deposits, holds, usage charges, earnings, payouts. Newest first. | 60 |
GET | /v1/me/snapshots | Archived workspaces, with state, size and when each was taken. | 60 |
DELETE | /v1/me/snapshots/:id | Remove an archived workspace and stop its storage charge. | 60 |
GET | /v1/me/storage | What you are storing and the monthly charge it implies. | 60 |
Providing
| Method | Path | What it does | Per min |
|---|---|---|---|
GET | /v1/me/hosts | The machines this account lends to Kracht. | 20 |
POST | /v1/me/hosts | Register a new one and receive its agent token, once. | 20 |
PUT | /v1/me/hosts/:id/listing | Set your own price and availability. Never touches a running rental. | 20 |
GET | /v1/me/hosts/:id/telemetry/daily | What one machine's cards were doing, per UTC day. days passes through. | 60 |
GET | /v1/me/earnings | total, paid_out and available, in EUR, derived from the ledger. | 60 |
GET | /v1/me/payouts | Settlement history: amount, period, status, processor reference. | 60 |
Account and members
| Method | Path | What it does | Per min |
|---|---|---|---|
GET | /v1/me/members | Who can act for this account, and in what role. | 30 |
POST | /v1/me/members | Add somebody who already has a Kracht account, by user id. | 30 |
PATCH | /v1/me/members/:user_id | Change what somebody may do. | 30 |
DELETE | /v1/me/members/:user_id | Remove them, or leave yourself. An account keeps at least one owner. | 30 |
GET | /v1/me/invitations | Who has been asked to join and has not yet. | 20 |
POST | /v1/me/invitations | Invite an email address onto this account. | 20 |
POST | /v1/me/invitations/accept | Join an account you were invited to. The token goes in the body, never the query string. | 10 |
DELETE | /v1/me/invitations/:id | Withdraw 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.
| Method | Path | What it does | Per min |
|---|---|---|---|
POST | /v1/hosts | Host-agent registration. Authenticated with the host's agent token, not a user API key. | 20 |
POST | /v1/hosts/:id/heartbeat | Liveness, telemetry, metering, and the agent's commands. One beat every 15s per host. | 120 |
Errors
| Status | Code | Meaning |
|---|---|---|
| 401 | unauthorized | No bearer token, or a bad one. Without a token this is the healthy answer from every /v1 route. |
| 402 | insufficient_funds | The account cannot cover the launch. |
| 403 | forbidden | Your role does not allow it. |
| 404 | not_found | Also the answer for an id that exists and is not yours: the id space is not enumerable. |
| 409 | conflict | Placement found no host. The body carries the per-host rejection reasons. |
| 429 | rate_limited | Over the per-minute limit for that route, per caller IP. Retry-After says when. |
| 503 | unavailable | The control plane is unreachable from the web tier. |
| 501 | not_implemented | The 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.
| Property | Result |
|---|---|
| SSH login with your key | Root shell on Ubuntu 24.04, including on a GPU rental on a userns-remapped box. |
| Wrong SSH key | Permission denied (publickey). |
| Without the WireGuard tunnel | Unreachable. Private by construction. |
| Root filesystem | Read-only inside the instance. Install into /workspace, or bring an image. |
| /workspace scratch | Writable, and wiped on teardown. |
| The provider's LAN, from inside | Blocked. |
| Capabilities | cap-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. |
| Disk | Capped 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 keys | You 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.
| Signal | State | Detail |
|---|---|---|
| Host heartbeats | Every provider machine reports in on a schedule. When one goes silent the worker marks it offline and rescues the rentals stranded on it. | |
| Metered settlement | Usage is metered per second and settled to the microeuro, with the split applied at exact integers. | |
| Spend limits | Account 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 metrics | The control plane answers /healthz and renders Prometheus metrics from database state. Nothing collects them yet. | |
| Uptime | Uptime, for any component. There is no probe and no history. | |
| Latency | Latency, per region or otherwise. | |
| Regional health | Regional health. | |
| Incident history | Incident history. |
Known limits
| Limit | Detail |
|---|---|
| Read-only root filesystem | apt 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 image | Jupyter and VS Code have ports allocated but no server in the base image yet. |
| First connect can lag | A freshly launched session's relay can time out on its first requests and then work. Poll until it answers. |
| Renters behind NAT | Both sides behind residential NAT cannot peer directly and go through the public relay. |
09FAQ
FAQ
Questions the site already answers, each on the page that answers it. The help centre has a search box over every one of them.
- Which parts of Kracht actually work today?
- Is any real money moving yet?
- Do I need a credit card to start?
- What do I need before I can connect?
- Can I bring my own Docker image?
- Can I snapshot a rental and come back to it?
- How do I stop paying?
- Is there an uptime SLA?
- How exactly am I billed?
- Can a provider raise the price while I am running?
- What does a provider earn?
- Whose hardware am I running on?
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