What the host needs
These are the figures Kodela runs on, not a sizing guarantee. Plan about 2 GB of memory per active workspace, and about 1 GB more for each person using the browser IDE. There is no Kubernetes, managed database or cloud account to set up: one Linux host is the whole install. More on the deployment page.
Getting the code: the repository is shared on request with pilot teams. It is not public, and there is no installer package yet. Ask about a pilot
Seven steps
Check the host (preflight)
Provisioning runs from a checkout on your own machine and reaches the host over key-based ssh; nothing on the host needs GitHub credentials. Start with the read-only check. It reports
ok,missorbadfor each prerequisite and changes nothing.$ bin/provision-host --host 203.0.113.10 --user ops --checkProvision the serving tier
This ships the commit you are on, installs prerequisites when you ask it to, builds the workspace image, installs the firewall's boot unit and starts the serving tier as a systemd unit. It prompts for the front-door and operator passwords; secrets never go on a command line.
$ bin/provision-host --host 203.0.113.10 --user ops \ --base-url https://kodela.example.com \ --operator-email you@example.com --install-prereqsprovision-host is new. Its happy path has not yet been recorded against a second machine. On the host itself,
start-ui.shbrings the front door and console up by hand.Confirm it is ready
Readiness answers 503 and names the failing check until everything is in place.
bin/deploy verifyexits 0 when the live tree is the commit you pushed.$ curl -s http://127.0.0.1:5000/api/readyz $ bin/deploy verifyCreate the first operator
The serving tier creates the first operator from
OPERATOR_EMAILandOPERATOR_PASSWORD, once, and never overwrites a password changed later in the console. To create another operator, or reset one, run the command yourself on the host from the checkout. The password comes from--passwordor theOPERATOR_PASSWORDvariable and must be at least 12 characters; reading it into the variable keeps it out of your shell history.$ read -rs OPERATOR_PASSWORD && export OPERATOR_PASSWORD $ python3 proxy.py create-operator --email you@example.comSign in and create an organisation
Open the console at
/admin/and sign in as the operator. Create an organisation: it gets its own network, egress in observe and the Guarded security level.ConsoleOrganisationsNew
Invite a member
Invite by email and pick a role: owner, admin, member or auditor. The invitation lasts 7 days. The person claims it and sets a password. Until mail is configured, the console shows you the link to send yourself.
OrganisationsacmeMembersInvite
Create a workspace and open it
From the organisation's Workspaces tab, or on the host. Creation is refused unless the firewall has verified the organisation's network and a DNS gateway exists. The member signs in at
/portal/and opens it: a terminal, VS Code in the browser, the Git panel and the agent chat. Every outbound connection from this workspace on your host already goes through the egress proxy, in observe. (If your organisation later turns on members' own computers, egress there is observed, not enforced.)$ bin/workspace-agent create --tenant acme --workspace dev01 \ --owner dev@example.test --repo owner/name --ide
Know this first
- TLS is yours to put in front. The front door ships without it and there is no automatic certificate. Use a TLS front end or a tunnel before anyone signs in over a network.
- Egress starts in observe. It logs and lets through. Promote it to deny once the allowlist stops surprising you.
- Mail is off until you configure SMTP, so invitation and reset emails do not arrive out of the box.
- Nothing schedules backups.
bin/backupexists; add the timer yourself. - The shared front-door password is not tied to a person until “require identity” is turned on. Turn it on once everyone has an account.
Next
Verified against the main branch, 4 Oct 2026.