From nothing to a service of your own answering on the internet. Six steps, each one saying what you should see when it worked.
We are in preview, so accounts are created by invitation. Ask for one:
hello@nuved.io
The invitation email carries a link. Opening it creates your account: you choose a password there and confirm your email address.
You can sign in with that address.
Go to the sign-in page and sign in. The first time, you name your
organization: it is the short name your projects and addresses are built from, so
acme gives you acme-default and
hello-acme.nuved.io. It cannot be changed later.
Your console opens, with your organization's name at the top.
Your balance is what everything spends. Pick an amount in the console; the card form is Stripe's, and we never see the number.
€0.14 per vCPU-hour, €0.009 per GiB-hour, €0.08 per GB of disk a month, since 22 September 2026. A small service (0.25 vCPU, 512 MiB) costs about €29 a month, taken from the balance as it runs.
Free has 3 live shares at a time, for nothing; Pro has 10, with 3 reserved names and your own domain, for €4.00 a month from the balance. Hosting is charged on top of either.
Rates are what the machines cost us, divided by the capacity we can sell. They change only when our cost moves by more than 5%.
This platform is in test mode. Use the test
card 4242 4242 4242 4242, any future expiry, any CVC. Nothing is charged, and
the balance you get is real inside the platform.
The console shows a balance, and your first project appears within seconds.
curl -fsSL https://get.nuved.io/install.sh | sh nuved login
nuved login prints a short code and a link. Open the link, confirm the code, and
the CLI is signed in: it never asks you for a password, and no password ever passes through it.
nuved whoami prints your organization and your balance.
Point kubectl at your project. The file this writes reaches your projects and nothing else:
nuved kubeconfig acme-default -o ~/.kube/nuved export KUBECONFIG=~/.kube/nuved
Save this as hello.yaml. It asks for no CPU or memory: your project fills those in
for you, and you are charged for what it reserves.
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello
spec:
replicas: 1
selector:
matchLabels: { app: hello }
template:
metadata:
labels: { app: hello }
spec:
securityContext:
runAsNonRoot: true
runAsUser: 10001
seccompProfile: { type: RuntimeDefault }
containers:
- name: hello
image: hashicorp/http-echo:1.0
args: ["-listen=:8080", "-text=hello from acme"]
ports:
- containerPort: 8080
securityContext:
allowPrivilegeEscalation: false
capabilities: { drop: ["ALL"] }
---
apiVersion: v1
kind: Service
metadata:
name: hello
spec:
selector: { app: hello }
ports:
- port: 80
targetPort: 8080
kubectl apply -f hello.yaml kubectl get pods
kubectl get pods shows one pod, Running, 1/1.
In the console, press Expose on the service. Or from anywhere with a token:
curl -X POST https://api.nuved.io/v1/projects/acme-default/services/hello/expose \ -H "Authorization: Bearer $NUVED_TOKEN"
Open https://hello-acme.nuved.io and it answers.
The address is the console's to manage, not kubectl's: your credential cannot
list or write routes, so kubectl get httproute is refused by design. Expose and
unexpose here or through the API above.
Everything above works the same for your own code, with one requirement: it has to be a container image on a registry this cluster can pull. A public image needs nothing. A private one needs a pull secret, which you make in your own project:
kubectl create secret docker-registry regcred \
--docker-server=ghcr.io --docker-username=YOU --docker-password=YOUR_TOKEN
# then in the Deployment:
# spec.template.spec.imagePullSecrets: [{ name: regcred }]
Three things a project cannot do, whatever the manifest says:
A refusal always says which of these it was.
Give the agent a credential of its own, scoped to one project: in the console, Create
token for that project, then download that project's kubeconfig while signed in with it.
Paste this into your repository's CLAUDE.md or AGENTS.md:
## Deploying
This repo deploys to a Nuved project.
- kubeconfig: ~/.kube/nuved (use `kubectl --kubeconfig ~/.kube/nuved`)
- namespace: acme-default (everything you create goes here)
- give a service a public address:
curl -X POST https://api.nuved.io/v1/projects/acme-default/services/<service>/expose \
-H "Authorization: Bearer $NUVED_TOKEN"
You cannot top up, change caps, mint tokens, or reach another project with this
token. If a deploy is refused, the message says why: read it and fix the manifest
rather than trying another way in.
Better still, hand the agent the rules themselves: nuved skill install writes
them to .claude/skills/nuved/SKILL.md, or read them at
get.nuved.io/skill/SKILL.md.
Every endpoint, in detail: API docs. Back to your console or sign in.