mesh-avatar-studio
Turn one illustration into an animated 2D mesh avatar with a coding agent and a local editor
Make a space, hand out the address — a link while it runs, a file when it ends. No app, no store, nothing to install; it opens in a browser, or in a headset.
DesignJavaScript · HTMLGitHub @dob-0OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
di.iiii — public spaces on the open web. Make a space, hand out the address: a link while it runs, a file when it ends. No app, nothing to install; opens in a browser or a headset.
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
di.iiii hosts 3D spaces on the web
You sign in, get an address, build a scene in the browser, mark one project live, and hand out the link — it opens on a phone, a laptop or a headset with nothing to install, and exports as a file when it ends. The editor runs in the browser; the backend owns persistence, auth, and publish state; spaces are the public unit. No native installs, no engine lock-in, creator-owned data.Read the full README ↗You sign in, get an address, build a scene in the browser, mark one project live, and hand out the link — it opens on a phone, a laptop or a headset with nothing to install, and exports as a file when it ends. The editor runs in the browser; the backend owns persistence, auth, and publish state; spaces are the public unit. No native installs, no engine lock-in, creator-owned data.
Studio/<space>/raw (src/raw/)V1serverXRspaceprojectpublishedProjectIddev branch → dev.diiii.xyz, the dev tier (rehearsal — work and verify here)main branch → diiii.xyz, prod (live — promote dev -> main only after the dev tier is verified)22.x, npm 10.xProject links:
This is the shipped, working reality of the repo today.
Studio is the stable main editor./<space>/raw (src/raw/) is where recursive node-first work happens.V1 remains for compatibility, fallback behavior, and migration-sensitive work.serverXR is authoritative for spaces, projects, assets, ops, SSE, presence, and edit enforcement./<space> for the live published view, with /<space>/studio, /<space>/raw, and /admin?space=<space> for editing and ops/<space>/<project>/studio, or /<space>/<project>/raw. A shortcut, not a second address — it redirects to the editor's canonical path, so nothing new has to be kept alive forever/spaces for your spaces, /<space>/projects for what a space shows its visitors. The tool-named forms (/<space>/studio, /<space>/raw/projects) are the one working list a space's makers use — drafts, shelves and the trash — the same list at both, a card opening in Studio or in NodesThis is where the project is going, but not all of it is fully shipped yet.
Use this as the default path for new work in a space:
/<space>/studio for the main editor. Create new projects there, import legacy scenes, and keep the long-term working copy./<space>/raw for node-first work when the project needs research-style iteration.publishedProjectId for the space; /<space> then shows the live project viewer.Important distinction:
Current Truth = what is real in the repo nowDirection = where new work should leanspace
/<space>, /<space>/studio, and /<space>/rawproject
publishedProjectId
rootNodeIdnodes[]edges[]assets[]templates[]workspaceState| Path | Role | Use It For |
|---|---|---|
src/studio/ | stable main editor | main user-facing product work |
src/raw/ | the node editor | research and recursive-node work |
src/project/ | shared project logic center | document state, sync, presence, asset flow, shared editor/viewer logic |
src/shared/ and shared/ | cross-runtime schema and contracts | canonical schema/runtime definitions |
serverXR/ | backend runtime | auth, persistence, assets, presence, SSE, publish state |
docs/architecture/ | deeper architecture docs | repo intent, direction, and system explanations |
src/components/ and src/hooks/ | older orchestration surfaces that still matter | active behavior, but not always best home for new permanent logic |
Use these defaults unless the task clearly says otherwise.
Studio for main product worksrc/project/ for shared document or collaboration logicsrc/raw/) only when the task is intentionally node-firstworldState, windowLayout, and older entity structures as compatibility bridgesV1 work as compatibility work unless the task is explicitly about migration or legacy supportCommon mistakes to avoid:
Studio.env files, or host-specific deployment secrets into the public repoFor AI task assignments, use the task request template in AGENTS.md.
Local setup:
nvm use
npm install
npm --prefix serverXR install
Normal start-of-session flow:
git switch dev
git pull --ff-only origin dev
npm run dev
Core commands:
npm run dev
npm run lint
npm run build
npm run test
npm run test:server-contracts
Useful local routes:
http://localhost:5173/mainhttp://localhost:5173/main/studiohttp://localhost:5173/main/rawhttp://localhost:5173/admin?space=mainhttp://localhost:4000/serverXR/api/healthThere are two doors, and most people only need the first:
npm run dev, and setting up Claude Code with the project's checked-in AI workflow (don't start a fresh one — see ONBOARDING §8).The code path is fork-based:
dob-0/di.iiii, clone your fork, work there freelynpm run lint && npm run build && npm run testdev branch (or let docs/templates/fork-auto-pr.yml open it for you automatically on push, once set up)dev from the upstream sideAn AI agent working in your own fork can validate, commit, and push on its own once a task is done — pushing only ever updates your fork, never dob-0/di.iiii directly, so this is safe to leave unattended. Merging into dev/main always stays an explicit, human-requested action.
For running more than one agent/contributor at once without anyone's edits colliding (git worktrees, role-scoped file ownership, fork isolation), see docs/ai/parallel-agents.md.
Normal promotion path:
devdev — it deploys the dev tier (dev.diiii.xyz)mainDeploys are driven by pushes, via GitHub Actions (GHCR build + SSH to the Hetzner VPS):
git push origin dev # deploys the dev tier (dev.diiii.xyz) — see .github/workflows/deploy-vps-dev.yml
git push origin main # deploys to VPS production — see .github/workflows/deploy-vps.yml
Both wired up and verified end-to-end (2026-07-16): GitHub secrets/variables are set, both
workflows sync tracked config from git and reload Caddy as needed. See
docs/deploy/VPS_DOCKER_DEPLOY.md for the full setup this relies on.
npm run deploy:* (scripts/deploy.mjs) is the older cPanel-era path, kept only as a documented
fallback (see docs/deploy/legacy/) — it is not how di-studio.xyz is deployed today.
Rules:
devmainmain directly only for emergency production hotfixesFor pushing teaser pages, multi-file experiences, or project packages to a live /<space> route, see the Publish Workflow. Options: in-app update, branch-hosted URL, ZIP import, full code deploy.
flowchart LR
work["Daily work"] --> dev["dob-0/di.iiii<br/>primary public repo"]
dev --> branchDev["dev branch"]
dev --> branchMain["main branch"]
branchDev --> ghcrDev["GHCR build<br/>deploy-vps-dev.yml"]
branchMain --> ghcrProd["GHCR build<br/>deploy-vps.yml"]
ghcrDev --> vpsDev["Hetzner VPS<br/>dev tier Compose project<br/>→ dev.diiii.xyz"]
ghcrProd --> vpsProd["Hetzner VPS<br/>production Compose project<br/>→ di-studio.xyz"]
branchMain -.disabled fallback.-> release["cpanel-* release branches"]
release -.-> hosting["cPanel hosting<br/>(legacy, workflow_dispatch-only)"]
By task:
/wiki + landing teaser, single source of truth): src/wiki/wikiContent.jsKeep this README focused on durable repo truth:
Put dated milestones, application-specific notes, and time-sensitive movement into supporting docs instead of this root entrypoint.