Xeonr Developer Docs

Quickstart

Create a function, edit it in the browser, deploy it, then point it at a repository.

1. Sign in and pick a team

Open functions.xeonr.io and sign in with your Xeonr account. Every function belongs to exactly one team, and the console is scoped to one team at a time — the team picker is the entry point, and each URL is /<team-slug>/….

If you belong to no team yet, create one. You become its owner.

2. Create a function

Functions → New function. You choose two things:

  • Name — what you will call it. It does not have to be unique and nothing routes on it.
  • Kind — Node.js, Go or Static. This is fixed after creation: it decides how your source is built and which settings apply, so a function that needs a different kind is a different function.

The hostname is assigned for you — something like quiet-heron-4f2a.fns.xnr.app.

A new function is scaffolded with a working hello-world for the kind you chose, so "created" and "deployable" are the same state. You can deploy it immediately and get a working URL before writing anything.

3. Edit and deploy

The Code tab is a file tree and an editor over the function's workspace. The workspace is the working copy; a deploy freezes it into an immutable snapshot and builds that.

Deploy from the console when you are ready. What happens next depends on the kind:

  • Static — nothing is built. The version is ready immediately and goes live as soon as it is promoted.
  • Node.js / Go — an image build starts and the deploy answers straight away with a BUILDING version. Builds run in the background because a cold dependency install takes minutes; the version promotes itself when the build succeeds. Watch the output on the Logs tab of the deploy.

Your first successful deploy is what makes the URL work. A function with nothing promoted exists but serves 404.

4. Listen on $PORT

For Node.js and Go, that is the only runtime rule:

// server.js
import { createServer } from "node:http";
createServer((_, res) => res.end("hello")).listen(process.env.PORT);
func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, _ *http.Request) {
        fmt.Fprintln(w, "hello")
    })
    http.ListenAndServe(":"+os.Getenv("PORT"), nil)
}

An app that ignores $PORT and hardcodes a different port starts cleanly, logs nothing wrong, and never becomes ready — the readiness probe watches the port the platform told it to expect. If a deploy hangs and then times out, check this first.

5. Connect a repository (optional)

Push-to-deploy is one button on the Settings tab: install the GitHub App, or authorise GitLab once. The webhook is registered for you and, on GitHub, nothing long-lived is stored at all. See Git integration.

Connecting a repository makes the browser editor read-only. Every push replaces the workspace, so an edit made in the console would be destroyed later by something you would not connect to your edit.

Next steps

On this page