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
| Source | What Stedhold needs | Limits |
|---|---|---|
| Git repository | A public GitHub repo, as owner/repo | Private repos are planned |
| Zip | The project folder, zipped | 50 MB upload; 500 MB and 20,000 files unpacked |
| Existing server | Its public https or http address | No 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.
| App | Detected by | Starts with |
|---|---|---|
| Streamlit | streamlit in requirements.txt or pyproject.toml, or streamlit_app.py | streamlit run on the main file, port 8501 |
| Gradio | gradio in requirements.txt or pyproject.toml | python app.py or main.py, port 7860 |
| FastAPI | fastapi or uvicorn in requirements.txt or pyproject.toml | uvicorn on the file that creates FastAPI(), port 8000 |
| Flask | flask in requirements.txt or pyproject.toml | gunicorn if listed, else flask run, port 8000 |
| Django | django in requirements.txt, and manage.py | manage.py runserver, port 8000 (SQLite is set up on each start) |
| Next.js | next in package.json, or next.config | next start, port 3000 |
| Vite (Lovable, Bolt, v0) | vite in package.json, or vite.config | vite preview, port 5173 |
| Node server | a start script in package.json, or server.js, index.js or app.js | npm start; listen on PORT |
| Static site | index.html at the top or in dist, build, out, public, site or docs, and no package.json | a 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:
| Setting | Who can open the app |
|---|---|
| Entire workspace | Everyone in the workspace |
| Specific people | Only the people you pick |
| 24-hour guest pass | Anyone 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.