Skip to Content
Web ClientRunning it

Running the web client

The web client lives in packages/_skillet_webclient. It builds a static front-end with Vite and serves it from an Express server run with tsx.

Install

cd packages/_skillet_webclient npm install

Environment

The server loads its configuration from the _skillet_agent package’s .env (packages/_skillet_agent/.env), not from a .env in the webclient folder — so the same file that configures the CLI also configures the web app. Set at least:

VariableRequiredDefaultPurpose
OPENAI_API_KEYyesChecked at boot; the server exits without it. Also gates whether OpenAI models appear in the picker.
SESSION_SECRETyesSecret used to sign express-session cookies. The server refuses to start without it.
PORTno5173Port the server listens on.
GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRETnoSet both to enable Google OAuth; otherwise only local email/password sign-in is available. See Authentication.
SKILLET_JOB_DBno…/outputs/.skillet_jobs.sqlitePath to the shared job board; must match the dispatcher’s.
LMSTUDIO_BASE_URLnohttp://localhost:1234/v1Probed to list local LMStudio models in the picker.

Develop

npm run dev

This runs two watchers concurrently: vite build --watch (rebuilds the front-end into dist/ on change) and tsx watch on the server (which also watches ../_skillet_agent/src, so engine changes restart it too). There is no Vite dev-server middleware — the Express server always serves the built dist/, so the vite build --watch half must be running for the pages to load.

Production

npm run build # vite build + tsc -p tsconfig.build.json npm run start # web:build, then run the server with tsx

start (and server:start) build the front-end and then run the server. The model is the same as dev: compile to dist/, serve dist/.

Run the dispatcher alongside

The web server is only the UI/API layer — it does not execute jobs. For queued and scheduled work to actually run, start a dispatcher from the _skillet_agent package, pointed at the same board:

cd ../_skillet_agent npm run dev:jobs:dispatcher

Make sure both processes resolve the same SKILLET_JOB_DB (they share the default under _skillet_agent/outputs/ out of the box).

Last updated on