getbased is a pure ES-module web app with no build step and no bundler. The production runtime is a folder of static files — HTML, CSS, and JavaScript — that any HTTP server can serve. You can be running your own instance in under two minutes.Documentation Index
Fetch the complete documentation index at: https://docs.getbased.health/llms.txt
Use this file to discover all available pages before exploring further.
Quick start
No build tools, no
npm install, no compilation. The app is installable as a PWA and works fully offline for non-AI features — labs, charts, custom markers, wearable data, and all local encryption are available without a network connection after the first load.
Wearable OAuth apps
The OAuthclient_id values baked into the app belong to the maintainer’s registered apps, which are authorized for *.getbased.health redirect URIs only. If you self-host under a different domain, the provider returns invalid_client when the bundled credentials are paired with your redirect URI.
To run wearable OAuth on your own host, register your own OAuth app with each provider you want to support and supply the credentials via environment variables.
Register your OAuth apps
| Provider | Developer portal |
|---|---|
| Oura | cloud.ouraring.com/oauth/applications |
| Withings | developer.withings.com/dashboard |
| Polar | admin.polaraccesslink.com |
| Fitbit | dev.fitbit.com/apps/new |
| WHOOP | WHOOP partner credentials (gated — hidden until validated) |
| Ultrahuman | Ultrahuman partner credentials (gated — hidden until validated) |
http://localhost:8000/app) and your production hostname (e.g. https://your-host.example/app) to the allowed redirect URI list in each provider’s portal — the URIs must match character-for-character.
Environment variables
Create a.env.local file in the repo root (copy .env.local.example as a starting point):
Apple Health is file-import only — no OAuth, no credentials, no portal registration. It works identically on every self-hosted install.
client_id values from /api/proxy. When the env vars are set, your own IDs are used for both the authorize URL and the token exchange. When unset, the hardcoded maintainer defaults are used and hosted users see no change.
Deploying to Vercel
Avercel.json is already present in the repo root — no extra configuration is needed.
Import the repository on Vercel
In the Vercel dashboard, click Add New → Project and import your fork of
get-based. Vercel detects vercel.json automatically.Set environment variables
Go to Project → Settings → Environment Variables and add your wearable credentials. Mark each
*_CLIENT_SECRET value as Sensitive. The *_CLIENT_ID values for PKCE clients (Fitbit, WHOOP) do not need a secret.Running your own sync relay
Cross-device sync uses a relay — a blind store-and-forward server that holds encrypted blobs. The relay never sees your plaintext data. By default, getbased connects towss://sync.getbased.health. You can run your own.
Start the relay container
The relay runs as a single Docker container with an embedded SQLite database — no external dependencies:This starts the relay on port 4000 (WebSocket only).
Add TLS with Caddy
Install Caddy and create The Caddy provisions a TLS certificate via Let’s Encrypt automatically.
/etc/caddy/Caddyfile:versions h1 directive is required — WebSocket upgrades need HTTP/1.1. Restart Caddy:Minimum server spec: any Linux VPS with 1 CPU, 1 GB RAM (~$5/month), Docker, and a domain with TLS.
Local AI with a self-hosted instance
getbased supports any OpenAI-compatible local AI server — Ollama, LM Studio, Jan, llama.cpp, and others — via the Local AI provider in Settings → AI. Enter your server’s base URL and the app routes all AI calls there. Nothing leaves your machine.Tor access
A.onion address is available for getbased. When you access the app via Tor Browser, the sync relay automatically switches to the .onion address (ws:// — no TLS needed over Tor’s end-to-end encryption). No additional configuration is required.