Skip to content
هذه الصفحة غير متوفرة بلغتك بعد. يتم عرض النسخة الإنجليزية.

Air-Gapped and Offline Deployment

Every stylesheet, script, font and icon serves from your install, across all 14 templates including login and signup. Verified live at 62 requests, zero external.

Potato serves every stylesheet, script, font and icon from its own install. A machine with no route to the internet renders the same interface as one with a fast connection. Verified live on a rendered annotation page: 62 requests, zero external, including the login and signup pages.

This matters for secure research environments, clinical settings, field deployments, and any machine behind a strict proxy. It is a privacy property as much as an availability one.

Assets served from the install

Fabric.js (the image canvas), jQuery, Bootstrap, Font Awesome, the Outfit interface typeface, three.js (point clouds), OpenSeadragon (deep zoom), d3, Peaks.js (audio waveforms), PDF.js, and all of Potato's own CSS and JavaScript.

Two of these are required rather than cosmetic. Without jQuery, span annotation does not work at all. Without Fabric.js, the image canvas never initializes, so the drawing tools render but nothing can be drawn.

The font was a privacy leak

styles.css opened with an @import of Google Fonts. Beyond breaking offline, that sent every annotator's IP address and User-Agent to a third party on every page load, from a tool people self-host precisely so their data does not leave their infrastructure.

It had survived three previous air-gap audits, because every guard checked <script src> and <link href> in templates, and an @import inside a stylesheet is neither. The typeface is now vendored under the SIL Open Font License.

A third-party favicon on the login and signup pages was removed for the same reason: a request to another company's servers from the page where users type their credentials.

Coverage across all 14 templates

Coverage now includes login, signup, password reset and error pages. Those are the pages an air-gap audit is least likely to check and most likely to matter on.

Vendored files are checksum-verified

Everything vendored is verified against the hash its CDN publishes, and refused on mismatch. Vendored files are committed, so an unverified download would ship to every user of that release.

Both guard allowlists are empty, and the guards fail if an entry stops matching anything, so an exemption cannot quietly become permanent.

What "air-gapped" accurately means

The application needs no network. Models are a one-time transfer: run potato download-models on a connected machine and copy the directory across. Any hosted AI endpoint you configure, such as OpenAI, Anthropic or Gemini, obviously needs a route out.

So the accurate phrasing is "air-gapped once the weights are on the machine", not "air-gapped with no setup".