mesh-avatar-studio
일러스트를 코딩 에이전트와 로컬 편집기로 2D 메쉬 애니메이션 아바타로 변환
링크는 주소, 파일은 종료 시 제공. 앱 없이 브라우저나 헤드셋에서 열리는 공간
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.
디자인JavaScript · HTMLGitHub @dob-0온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
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.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
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.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.