Trust

Security

Nodus is the infrastructure execution layer for AI workloads. Customer-visible state (workloads, events, ledger, artifacts) is durable, tenant-isolated, and recoverable. This page describes what the system enforces today, not what we intend.

We are in pilot. No SOC 2, no ISO certification, no third-party penetration test, no external security assessment, and no claim to any of them. Where a control is pilot-stage rather than production-grade, it says so.

Controls in place

Data in transit

API, console, and this site are HTTPS only. Runner traffic (heartbeats, checkpoint prepare, commit, open) uses the same TLS endpoints as the customer API.

Site and console send Strict-Transport-Security with a two-year max-age, includeSubDomains, and preload, so a browser that has seen us once never falls back to plaintext. Responses also set X-Content-Type-Options: nosniff, X-Frame-Options: DENY, a referrer policy, and a permissions policy denying camera, microphone, and geolocation. Private routes under /n/ add no-store and noindex.

The pilot has no private networking, VPC peering, IP allowlisting, or customer-managed encryption keys. Data at rest sits in managed Postgres and object storage under the provider’s encryption, not a key you hold. If diligence requires any of it, tell us before you sign. We would rather scope it than imply it.

Credentials

API keys are bearer credentials. Treat one as a password for your tenant. Anything done with it is attributed to you.

Tenant isolation

Every authenticated request resolves the bearer key to a principal, a tenant ID and a key ID, before any handler runs. Workload, event, ledger, artifact, webhook, and billing handlers then scope every read and write to that tenant. Asking for another tenant’s workload by ID is a miss rather than a leak: the record is never in scope to return.

Signup is invite-gated and never lets a caller choose their tenant. Identifiers are assigned by Nodus with random entropy, a request supplying one is rejected, and an existing identifier is refused rather than joined. Probing tenants that are not yours violates the Terms. Report the hole instead; see disclosure below.

People join an existing tenant only by redeeming an invitation issued by one of its admins. The invited address is taken from the invitation, never from the request that redeems it, so one link cannot become an account for a different email. Invitations are single-use, expire in 72 hours, and are stored as a hash. Password reset tokens work the same way over two hours, and consuming one signs out every session that account already had.

Checkpoint integrity

A checkpoint is only useful if you trust it enough to restart from it. Every object in a manifest carries a SHA-256 digest, and on commit the control plane verifies each against the bytes it actually holds before accepting the manifest.

A mismatch rejects the commit and fences the generation. That is deliberate. A corrupt checkpoint is worse than a missing one, so recovery falls back to the last manifest that verified.

Generation fencing backs this up. Prepare hands out a fencing token and commits from a superseded generation are refused with a conflict, so at most one generation writes durable progress per stage even when a reclaimed machine comes back late.

Webhook signing

Webhook requests carry X-Nodus-Timestamp and X-Nodus-Signature. The signature is the hex HMAC-SHA256 of the timestamp, a period, and the exact raw body, keyed with the endpoint secret. Verify against raw bytes; re-serializing the JSON first will not match.

Comparison is constant-time, and any timestamp more than five minutes from now is rejected regardless of signature, which bounds replay. Inbound supplier events are also deduplicated on X-Nodus-Event-Id and capped at a 1 MB body. On your side: verify before you parse, and treat a delivery you have seen as a no-op.

Reporting a vulnerability

Report to nodus.infrastructure@gmail.com with what you did, what you saw, and the tenant ID you used. Time-sensitive findings should say so in the subject line.

We acknowledge within three business days, return a triage result and fix plan within ten, and tell you when it ships. No bounties during the pilot. We will credit you by name if you want it.

Good-faith research is welcome and we will not pursue legal action over it. To stay in good faith: test only your own tenant, stop at proof, and do not exfiltrate, alter, or destroy data. No denial-of-service, load testing, spam, or social engineering of our team or vendors. Give us reasonable time to fix before disclosing.