- TypeScript 79.9%
- Python 6.8%
- Shell 4.1%
- JavaScript 3.2%
- Svelte 3%
- Other 3%
| .forgejo/workflows | ||
| docs/adr | ||
| runtime | ||
| src | ||
| .gitignore | ||
| CONTEXT.md | ||
| Dockerfile | ||
| package-lock.json | ||
| package.json | ||
| platform.py | ||
| preview.html | ||
| provider-auth-worker | ||
| README.md | ||
| RUNTIME-EXTRACTION-PLAN.md | ||
| svelte.config.js | ||
| vite.config.js | ||
Botto app
Standalone Botto web app built with SvelteKit.
Local dev
For fast iteration on minel, run the app locally and bind it to a pooled dev preview slot instead of rebuilding the production image.
npm install
export BOTTO_CONFIG_PATH=/srv/botto/config/botto-config.json
export BOTTO_CONTROL_SOCKET=/run/botto-control/botto-control.sock
export BOTTO_AVATARS_PATH=/srv/botto/state/avatars
export SYNAPSE_ADMIN_TOKEN_FILE=/srv/botto/secrets/synapse-admin-token
export BOTTO_OIDC_BASE_URL=https://auth.el.nay.network
export BOTTO_OIDC_CLIENT_ID=botto
export BOTTO_OIDC_CLIENT_SECRET="..."
export BOTTO_SESSION_SECRET="..."
npm run dev
Then expose the local server on a dev slot:
app-dev-bind-port-owned --app botto --port 4448 --health-path /health
That gives you a live preview URL like https://dev3.storel.xyz backed by your local dev server.
Use the full image build + digest repin + nixos-rebuild switch path only when you want to validate the shipped deployment.
The standalone app now uses app-managed OIDC with signed session cookies, not forwarded auth headers.
Key env vars:
BOTTO_CONFIG_PATHBOTTO_CONTROL_SOCKETBOTTO_AVATARS_PATHSYNAPSE_URLSYNAPSE_SERVER_NAMESYNAPSE_ADMIN_TOKEN_FILEOLLAMA_LOCAL_URLBOTTO_OIDC_BASE_URLBOTTO_OIDC_CLIENT_IDBOTTO_OIDC_CLIENT_SECRETBOTTO_OIDC_REDIRECT_PATHBOTTO_OIDC_SCOPESBOTTO_OIDC_LOGOUT_URLBOTTO_SESSION_SECRET
Notes:
- The app reads all user/service/UI state from
BOTTO_CONFIG_PATH. - Mutations go through the local control API on
BOTTO_CONTROL_SOCKET. - Provider auth/default-model state also flows through the control API.
Transitional backend location
The Botto control/export backend now also lives in this repo as:
platform.pyprovider-auth-worker
During the current extraction phase, nix-setup is wired to prefer these files when present on minel, with a fallback to its in-repo copies during transition.
That means the first backend slices have moved here, but the deployment/wiring in nix-setup is still temporarily responsible for launching them.
Host adapter contract direction
The target contract is:
- host exports a list of candidate users
- host exports an integration capability catalog
- standalone Botto owns enable/disable state and runtime behavior
- the app/backend uses allowlisted wrapper IDs and action IDs, not raw shell commands
Current exported config now includes a transitional host adapter section:
hostAdapter.candidateUsershostAdapter.integrationCatalog
The older users and services sections are still exported for compatibility while the app is being aligned to the cleaner contract.