Docs

What Stedhold runs, how access works, and the limits of each app.

Runtime
Python 3.12 or Node
Per app
0.25 vCPU · 512 MB
Sleeps after
15 min idle
Region
US East (Ohio)

Start

What you can host

SourceWhat Stedhold needsLimits
Git repositoryA public GitHub repo, as owner/repoPrivate repos are planned
ZipThe project folder, zipped50 MB upload; 500 MB and 20,000 files unpacked
Existing serverIts public https or http addressNo private or internal addresses

Leave node_modules, virtual environments and build output out of a zip. Stedhold installs dependencies itself.

A zip can hold the project's files at the top, or one folder with the project inside (what GitHub's Download ZIP and a Mac's Compress make). Paste a repository as owner/repo or as its github.com address.

Supported apps

Stedhold reads the project and picks the start command. No Dockerfile needed.

AppDetected byStarts with
Streamlitstreamlit in requirements.txt or pyproject.toml, or streamlit_app.pystreamlit run on the main file, port 8501
Gradiogradio in requirements.txt or pyproject.tomlpython app.py or main.py, port 7860
FastAPIfastapi or uvicorn in requirements.txt or pyproject.tomluvicorn on the file that creates FastAPI(), port 8000
Flaskflask in requirements.txt or pyproject.tomlgunicorn if listed, else flask run, port 8000
Djangodjango in requirements.txt, and manage.pymanage.py runserver, port 8000 (SQLite is set up on each start)
Next.jsnext in package.json, or next.confignext start, port 3000
Vite (Lovable, Bolt, v0)vite in package.json, or vite.configvite preview, port 5173
Node servera start script in package.json, or server.js, index.js or app.jsnpm start; listen on PORT
Static siteindex.html at the top or in dist, build, out, public, site or docs, and no package.jsona file server; unknown pages get index.html

With a Dockerfile, Stedhold uses only its CMD and EXPOSE lines.

Build

Python dependencies

  • Put dependencies in requirements.txt, one per line. Version pins are fine (pandas==2.2.3).
  • Only prebuilt wheels for CPython 3.12 on Linux x86_64 are installed. Nothing is compiled.
  • URL, local-path and extra-index lines are refused, and the message names the line.
  • If a package has no wheel, the build names it. Pin a version that ships one.

Node apps

  • Include package.json and package-lock.json.
  • Stedhold runs npm ci, then npm run build if there is a build script, in an isolated build sandbox (3 GB, 15 minutes).
  • Build-time values such as VITE_SUPABASE_URL go in Private settings and keys.

Private settings and keys

API keys and configuration, per app. The app reads them as environment variables.

  • Encrypted at rest and never shown again after saving.
  • Only that app receives them, at its next wake.
  • DATABASE_URL and names starting with AWS_, PG, POSTGRES_ or STRIPE_ are reserved.
  • Up to 50 per app, 4,096 characters each.

Access

Sign-in and access

Stedhold is invite-only. Owners and admins invite people by email. Each app has one access setting:

SettingWho can open the app
Entire workspaceEveryone in the workspace
Specific peopleOnly the people you pick
24-hour guest passAnyone with the guest link, for 24 hours, no account
  • Only the owner can turn on guest passes. A new pass key ends every earlier guest link.
  • Removing a person or changing access applies on their next request.

Who is signed in

Every request to your app carries signed headers, so the app can tell who opened it:

  • X-Stedhold-User-Email
  • X-Stedhold-Access-Mode (member or guest_pass)
  • X-Stedhold-Authenticated, X-Stedhold-Session-Expires, X-Stedhold-Signature

Guest-pass visits carry no email. Stedhold strips any X-Stedhold header a visitor sends.

If your app has its own sign-in, it can use the signed headers instead. If it sets its own login cookies, name them with the __Host- prefix (for example __Host-session). Every app shares apps.stedhold.com, and a __Host- cookie is the kind another app cannot set for yours. Your app's cookies reach it on page requests, not on live connections (WebSockets).

Run

Sleep when idle and rollback

  • An app sleeps after 15 minutes without requests. The next signed-in visit wakes it.
  • Up to 2 apps per workspace are awake at once.
  • A failed build never replaces a working one.
  • Rollback returns to an earlier build. The link stays the same.

The sandbox

  • Each app runs as its own task: 0.25 vCPU, 512 MB, at most 64 processes.
  • Files are not kept between wakes. Store data in your own database or storage.
  • Apps reach the public internet over HTTPS. They cannot reach Stedhold's database, internal network or cloud metadata.

Protect an existing server

Stedhold serves your server at a private link and forwards each signed-in request to it.

  • The address is re-checked on every connection, so it can't be pointed at a private network later.
  • Your server stays reachable at its own address. Close that route in your firewall if the link should be the only way in.

Rules

What Stedhold refuses

Every import is scanned before it is built. Refused:

  • Crypto miners and mining-pool connections
  • Phishing kits, including Telegram-bot credential collectors
  • Compiled programs and native binaries

Refused by mistake? Write to hello@stedhold.com.

Docs: host Streamlit, Next.js, Vite and FastAPI apps privately · Stedhold