# AGENTS.md — OpenVibe.Studio ## Project overview OpenVibe.Studio is the network's creative-app host at `https://openvibe.studio`. It serves two open-source native editors compiled to WebAssembly — **Photo** (PhotoCraft, a layered photo editor) and **Light** (LightCraft, a photo library and RAW developer) — inside an OpenVibe account, plus the signed-in hand-offs from Video and Cam and the Pics image tools. - **Entry:** `server/index.js` (`node server/index.js`); app in `server/app.js`; config `server/config.js`; port `5155`, drill port `15155`, service id `studio`. - **Pages and API:** `server/pages.js` (the app pages and `/edit`), `server/api.js` (`/api/v1/studio/*`: file bytes, media bytes, publish, image edits), `server/app.js` mounts health, `/auth`, `/shared`, discovery (`/robots.txt`, `/sitemap.xml`, `/llms.txt`, `/llms-full.txt`, `/.well-known/agent.json`) and `/openapi.json`. - **Adapters:** `server/adapters/` — `contract.js`, `index.js`, `photo.js`, `light.js`. One adapter per app keeps the same contract (`open(file)`, `save()`, `commands()`) so a base can be swapped. - **OpenVibe clients:** `server/openvibe/media.js`, `pics.js`, `video.js` — each call is scoped to the person's own Network token. - **Browser:** `public/js/drivers.js` (one driver per app), `studio.js`, `edit-video.js`, `image-tools.js`; own CSS in `public/css`. The apps run in a same-origin iframe with the shared navbar outside it. No bundler for our layer. - **Bundles:** `scripts/build-bundles.sh`, `scripts/fetch-bundles.sh`, `scripts/smoke.js`; the `bundles` GitHub workflow builds from pinned upstream tags and publishes an artifact with a checksum file. A bundle is never committed. ## Owns, does not own Owns the service layer, the adapter contract, the signed-in hand-off routes, the Pics image-edit endpoint and the `STUDIO_BUNDLE_ROOT` bundle upload/fetch path. It does not own the editors: Photo is [PhotoCraft](https://github.com/storytold/photocraft), Light is [LightCraft](https://github.com/storytold/lightcraft), both MIT OR Apache-2.0, built from pinned release tags; the licence and attribution stay with every build (`ATTRIBUTION.md`, `NOTICE`, `STATUS.json`). It does not own media bytes (Media/Video), pictures (Pics), the download drive (Download) or identity (Network). ## Who calls it, what it calls A signed-in person opens the app pages; Video and Cam send them to `GET /edit?media=