Hosting

NixOS

Options of the Pointy NixOS modules.

NixOS module options

Import pointy.nixosModules.pointy-host to install the backend service, nginx virtual host, and agent runtime, and pointy.nixosModules.single-node-slurm for a local Slurm runtime. The modules provide these options:

OptionDefaultPurpose
services.pointy-host.hostname(required)nginx virtual host name, and the ACME certificate name when tls is on.
services.pointy-host.tlstrueTerminate HTTPS in the virtual host with an ACME certificate and redirect HTTP. Turn it off behind a proxy that terminates TLS, or for plain-HTTP local use.
services.pointy-host.frontendPackagenullBuilt frontend package served at /. When null, the virtual host serves no frontend, as in the development VM.
services.pointy-host.basicAuthFilenullOptional htpasswd file protecting the application virtual host.
services.pointy-host.tokenAuthnullOptional session-token login gate. Its sub-options are loginUrl (required), audience (required), and publicKeyFile (required, an Ed25519 public key in PEM). See Login gate.
services.pointy-host.linkedDataBasenullOrigin written as the @base of artifact Turtle. null leaves IRIs relative to the requesting URL.
services.pointy-host.docsPackagenullOptional documentation package served at /docs/; this location disables both the basic-auth and token-auth gates.
services.pointy-backend.user, .group, .homebackend, backend, /home/backend (read-only)The account the backend, agents and builds run as, and its home. Refer to these when granting the backend host resources or placing secrets such as config.toml.
services.pointy-backend.listenHost127.0.0.1Address the backend HTTP listener binds. The supplied vhost and hook still use 127.0.0.1:<listenPort>.
services.pointy-backend.listenPort8081Backend HTTP listener port, also used by the supplied vhost and job-completion hook.
services.pointy-backend.agentEnvFilenullRuntime KEY=VALUE secret file sourced by systemd, suitable for a sops-nix or agenix path. The runner receives only the chat provider's key.
services.pointy-backend.piConfigDirPointy's backend/piPi configuration copied to /home/backend/.pi before the backend starts. Models and settings inside it are regenerated from config.toml.
services.pointy-backend.ingestPackagebuilt-in pointy-ingest (nix store add + jq)Package providing bin/pointy-ingest DIR NAME, which turns a directory into a content-addressed store path. See Data ingest and scratch space.
services.pointy-backend.storeUrlnullNix store for the backend, its evaluators, the agent sandboxes and Slurm builds, exported as NIX_REMOTE. null uses the host store.
services.pointy-backend.coldStorage.packagenullOptional package providing the cold-storage command, whose status and prefetch subcommands the backend runs for cold storage. null disables cold status and prefetch.
services.pointy-backend.coldStorage.ingestSocketnullIngest socket of the cold-storage store, exported as POINTY_COLD_STORE_SOCKET. null disables cold status and prefetch.
services.pointy-backend.scratchDirectorynullDirectory users browse to wrap a whole subdirectory into a file-upload step. null hides the feature.
services.pointy-backend.uploadDirectorynullWhere uploads are staged before ingest. null uses the system temporary directory.
services.pointy-backend.agentMemoryMax24GMemory limit shared by every agent sandbox, including sandbox /tmp. null leaves them unlimited. See Sandbox and credential boundaries.
services.pointy-backend.slurm.packageconfig.services.slurm.packageSlurm package whose client commands the backend runs.
services.pointy-backend.slurm.confFilethe host's services.slurm slurm.confCluster configuration the backend submits to, exported as SLURM_CONF.
services.pointy-backend.slurm.realiseCommandgenerated pointy-realiseExecutable on every compute node, run as <command> <derivation>. The default runs nix build --no-link, passing --store when storeUrl is set. See Build execution and GC roots.
services.pointy-backend.slurm.jobCompletionHook(read-only)Script the cluster runs as JobCompLoc with JobCompType=jobcomp/script; single-node-slurm wires it.

For a plain multi-node cluster:

OptionDefaultPurpose
services.pointy-hub.enablefalseEnable the hub Nix store and build-log receiver.
services.pointy-hub.nodeKeys[]Compute nodes' SSH public keys, used for both the store and the log receiver.
services.pointy-hub.nodePublicKeys[]Compute nodes' Nix signing public keys; the untrusted store user may only add paths signed by one of these.
services.pointy-hub.logUserpointy-logSystem user that receives build logs.
services.pointy-hub.realiseCommand/run/current-system/sw/bin/pointy-realise-hub (read-only)Command installed by pointy-node; set the backend's slurm.realiseCommand to it when the backend runs on the hub.
services.pointy-node.enablefalseEnable the compute-node integration.
services.pointy-node.signingKeyFile(required)Secret Nix signing key for this node's outputs; the Slurm build user must be able to read it.
services.pointy-node.nodePublicKeys[]Nix public signing keys of all compute nodes, used to verify hub-substituted paths.
services.pointy-node.hub.host(required)Hub hostname or address.
services.pointy-node.hub.usernix-sshSSH user of the hub's Nix store.
services.pointy-node.hub.logUserpointy-logSSH user of the hub's build-log receiver.
services.pointy-node.hub.portnullHub SSH port; null uses the OpenSSH default.
services.pointy-node.hub.sshKeyFile(required)Private SSH key this node presents to the hub; the Slurm build user must be able to read it.
services.pointy-node.hub.hostPublicKeynullBase64 SSH host public key used to pin the hub. null uses the node's known hosts.

The nginx configuration keeps /backend/ SSE responses unbuffered and allows hour-long reads. If you replace the supplied reverse proxy, preserve those settings for the status, ingest, cluster, and agent-turn streams.

NixOS integration

Use services.pointy-backend.agentEnvFile for provider API keys and services.pointy-backend.piConfigDir for extensions and static Pi configuration; both options are described under NixOS module options.

The service copies piConfigDir to /home/backend/.pi before each start, makes it readable only by the backend account, and adds the bundled question and glovebox extensions. Entries under agent/extensions/ reach chat sessions; add a custom extension there. The backend regenerates .pi/agent/models.json and .pi/agent/settings.json from [[providers]] and [models.chat], so edits to those two files in piConfigDir do not survive. Make durable configuration changes in the source directory, not in the generated copy. A missing optional environment file does not prevent service startup, so a running service does not prove the chat provider key was loaded.