FreeStyle is currently narrowed to two product-facing pages while the fitting workflow is rebuilt:
/implements the supplied Home reference as code-native UI./app/closetimplements the supplied Closet reference as code-native UI.
Canvas, Community, Profile, Login, Share, and Lab web pages are intentionally removed until the fitting experience is ready.
The merchant-embeddable fitting product is built separately in apps/widget and packages/widget-sdk; it must call the
backend control plane directly and must not depend on /app/closet.
The product UI follows the reference images in docs/reference/:
freestyle-design-system.pngfreestyle-home.pngfreestyle-closet.pngfreestylelogodesign.pnglogomark.png
The screenshots are design specifications, not rendered page assets. Home and Closet are built from React, CSS modules, SVG icons, generated Home imagery, the local runtime-3d Closet mannequin/model plane, and code-native product artwork so the UI can become interactive without reintroducing the old design. The reference-sized surfaces scale to the browser viewport instead of requiring page scrolling.
/ Home reference surface
/app redirects to /app/closet
/app/closet Closet reference surface
/internal/unreal-stream internal Unreal/render-cache QA onlyRetired product routes return 404 unless explicitly listed in apps/web/route-map.mjs as a compatibility redirect to Closet.
The internal route is not public navigation and is production-gated by INTERNAL_TOOLS_ENABLED=true.
Private personal deployments can be hidden behind an app-level Basic Auth gate by setting
PRIVATE_DEPLOYMENT_ENABLED=true with PRIVATE_DEPLOYMENT_USERNAME and PRIVATE_DEPLOYMENT_PASSWORD on the web
deployment. Use this alongside Vercel Deployment Protection when available. This only restricts access to the web UI; it
does not change the publish gate for generated garments or render-cache assets.
Vercel Git auto-deployments are disabled in vercel.json, apps/web/vercel.json, and apps/admin/vercel.json.
Pushing or merging main must not publish web or admin deployments automatically. Deploy only after an explicit manual
operator action, for example a Vercel Dashboard deploy or a local CLI deploy after npm run check passes. Railway
GitHub autodeploy is managed in Railway service settings, not by repo config; keep it disabled there and use Railway's
manual "Deploy Latest Commit" operator action for API/worker releases.
The fitting control plane remains active under /v2/tryon/* and /v2/render-cache/*. Retired public or legacy API
surfaces are disabled by default in production unless explicitly re-enabled:
ENABLE_CANVAS_API=false
ENABLE_COMMUNITY_API=false
ENABLE_LAB_API=false
ENABLE_LEGACY_API=false
ENABLE_TRYON_V2_API=true
ENABLE_RENDER_CACHE_API=trueProduct URL intake is now an admin-only active-path entrypoint:
POST /v1/admin/product-intake/from-url
GET /v1/admin/product-intake/:id
POST /v1/admin/product-intake/:id/authoring-planIt creates ProductEvidenceBundle, BrandGarmentIntakeCandidate, and controlled GarmentAuthoringPlan records. The
authoring plan is size-slot aware and must preserve product x color x size x bodyArchetype x qualityTier traceability
before handing Musinsa evidence into CLO-local, Blender-template, and Unreal import/capture scripts. It does not publish
assets, create public pages, or make Pixel Streaming the default Closet runtime.
Merchant widget configuration remains active under:
GET /v1/widget/config
POST /v1/widget/events
GET /widget/sdk.js
GET /widget/frameThe SDK mount API is
FreestyleFit.mount({ tenantId, productId, variantId, placement, locale, isolation }), with optional
selectedSizeLabel, sizeSlotId, and colorSlug when the merchant PDP has explicit size/color context. The API-served
/widget/sdk.js also keeps FreeStyleWidget.init compatibility. Public render-cache lookups default to
allowFallback=false; the widget config includes frame_url, preserving tenant/product/variant/size/color/locale query
state so iframe embeds follow the server route contract instead of hard-coding an asset path. Trace-aware render-cache
artifact paths include size/color slots, while the old untraced artifact route remains compatibility-only. Placeholder
generation is limited to internal/development paths and the shared public certified preview gate requires QC, approval,
license, source URL, manifest, front/side/back images, approved capture source, and exact
product x color x size x bodyArchetype x qualityTier trace metadata before Closet or widget display.
The first Musinsa fitting MVP is fixed in docs/musinsa-fitting-mvp.md: body presets, standing neutral pose,
front/side/back rotation, CLO-authored assets, Blender web cleanup, and certified render-cache previews before public
Closet display.
Core verification:
npm run lint
npm run typecheck
npm run test:core
npm run build
npm run checkLocal Closet fitting MVP:
npm run authoring:musinsa-set-runtime-pipeline
npm run authoring:musinsa-set-poc:verify
npm run authoring:clo-readiness
npm run authoring:clo-no-manual-slot
npm run authoring:clo-post-export-resume
npm run render-cache:unreal-capture:publish:musinsa-set-pocLocal UI smoke for the private Musinsa POC should use same-origin API rewrites:
HOST=127.0.0.1 PORT=8181 \
ENABLE_RENDER_CACHE_API=true ENABLE_TRYON_V2_API=true \
RENDER_CACHE_STORE_PATH=.data/render-cache.json \
RENDER_CACHE_ARTIFACT_ROOT=.data/render-cache-artifacts \
npm run dev:api
env -u NEXT_PUBLIC_API_BASE_URL \
PORT=3215 BACKEND_ORIGIN=http://127.0.0.1:8181 \
NEXT_PUBLIC_CLOSET_LOCAL_MUSINSA_POC_ENABLED=true \
npm --prefix apps/web run devSee docs/DEVELOPMENT_GUIDE.md and docs/MAINTENANCE_PLAYBOOK.md for the full CLO/Blender/Unreal operator command
catalog. The README keeps only the commands needed to verify the active product path.
docs/design-system.mddocs/musinsa-fitting-mvp.mddocs/active-closet-fitting-path.mddocs/cleanup-deletion-inventory.mddocs/api-surface-audit.mddocs/security-cleanup-notes.mddocs/closet-viewer-active-path.mddocs/env-var-usage-audit.mddocs/cloud-cleanup-inventory.mddocs/supabase-cleanup-inventory.mddocs/DEVELOPMENT_GUIDE.mddocs/MAINTENANCE_PLAYBOOK.mddocs/TECH_WATCH.mddocs/internal-unreal-control-plane.mddocs/unreal-editor-smoke.mddocs/render-cache-pipeline.mddocs/workstation-migration.mddocs/commercial-fitting-options.mddocs/product-url-asset-intake.md