Skip to content
Scava Docs Join the waitlist

Scava opens soon. These docs describe how it works at launch. Join the waitlist

All chapters

For IT and security

Security of apps hosted on Scava - what IT should know

This page is for the people who decide whether internal tools built with AI agents may run on Scava. It states what Scava does, in checkable terms, and at the end what it does not have. Scava is a hosting service for small web apps. Its protections are designed for two things: protecting the people who open apps, and keeping apps apart from each other.

The basic design #

Scava stores an app as files and sends them to browsers. The page code of an app runs only in the browser of the people who open it. The server code of an app, when it has one, never runs inside Scava's own system. It runs in an isolated environment of its own for that app (see below). An app therefore cannot attack Scava "from inside". There is no server, operating system or shell that an app can reach.

How apps are separated #

WhatHow
Own address per appEach app is served at its own address, for example team-vacation-k3x9.scava.site. Each address is a separate origin in the browser.
Accounts apart from appsAccounts live at scava.ai, apps at a different domain, so an app can never act in the context of the account pages.
Own cookiesEach app has its own session cookie, set for exactly that host. The cookies are HttpOnly, Secure and SameSite, and use the __Host- prefix, which means no other address can set or overwrite them. Cookies without the prefix are ignored.
An app talks only to itselfThe content security policy allows requests only to the app's own address. See Host an internal tool.
Not embeddableframe-ancestors 'none' and X-Frame-Options: DENY. Other security headers include X-Content-Type-Options: nosniff, a strict referrer policy, same-origin opener and resource policies, and HSTS.
Browser features offCamera, microphone, location, payment and USB are switched off for apps by a permissions policy.
Writes only from the appChanging requests need a special header that other websites cannot set, and the origin of the app.
No cross-app dataEach app has a database of its own. Files are kept per app. No call of one app can reach another app's data.

Sign-in and access #

Permissions are enforced on the server #

Rules in scava.json (all, own, owner, group, and rules per field) are checked by Scava's server on every read and write, for the browser and for server code. A changed page, a modified request or a script in the console cannot widen them. See Permission rules.

Stored text does not run as code #

The most dangerous gap in small apps is stored code: someone saves <img src=x onerror=...> in a form, and the app shows it with innerHTML to everyone, including the owner. Scava closes this independently of how an app is built.

The protection was tested in a real browser against twenty known attack strings stored by another user, with and without Trusted Types, and the same test fails when the filter is removed.

Limit: an app that deliberately executes stored text itself, for example with eval(entry), stays the responsibility of its creator. And an owner who sets write: "all" allows everyone to change everything.

Checks on every upload #

Before a version goes live, Scava refuses programs and installers (by name and by content), files with secrets, API keys and private keys in code, password fields, bad paths, an invalid rules file and server code that breaks its rules. Details are in Host an internal tool.

What people type into Scava is cleaned #

Everything typed into Scava, such as change requests, notes, reports, app names and file names, is cleaned before it is saved. Only normal characters are kept. Invisible and direction-reversing characters are removed. Links are not accepted where they are not needed. Texts that try to give instructions to an AI are refused. This is a filter and not a guarantee, so there are more layers:

Server code #

Server code is the riskiest part of an app, so it is the most fenced.

WhatHow
IsolationEach app's server code runs in its own isolated environment with its own memory and compute time. It has no access to Scava's database, files, keys or other apps.
What it getsOnly env.SCAVA (its own data, files, mail, AI, heavy work) and its own secrets. Every env.SCAVA call carries a signature that is valid only for this app and expires.
Who can call itOnly signed-in people with access to the app, and only from the app's own pages.
What it never seesScava's cookies, Scava's internal headers, the visitors' IP addresses.
SecretsStored encrypted. Nobody sees a value again after saving it. Bound secrets reach only the services they are bound to.
Outside callsAllowed, but every call is recorded per app and host, and the owner sees which services an app talks to. The owner's house rules can restrict this. Scava's own addresses are blocked.
MailOnly to people who may open the app. Links only to the app. A separate sender from the sign-in codes.
LimitsCompute time, calls, mails and heavy work per plan. At a limit what it covers stops until the month ends; the pages and data keep working.
Heavy workRuns in a container without a direct connection to the internet. All its web traffic goes through Scava, which records it and applies the owner's rules.

What Scava staff can and cannot see #

Logs #

Reporting abuse #

Every app has a "Report this app" link in the corner panel, and every invitation email has a report link. Administrators receive the reports. They can block an app (closed for everyone, including its owner) or an account (signed out everywhere, agents disconnected, all apps closed).

Limits against misuse #

Scava limits what one account or address can do to publish, share, invite, sign in and call server code, so a stolen key or a runaway script cannot flood the system or other people. When one of these protective limits is reached, the request is blocked and the administrators receive a warning. Normal use does not come near them.

Payments #

Cards and invoices stay with Stripe. Scava sees no card numbers. A plan changes only through signed messages from Stripe.

What does not exist yet #

An IT review should know these gaps.