# Design Studio AI > Design Studio AI is an open-source, agent-first workspace for structured web interfaces, slides, reports, wireframes, 3D scenes, and timeline video. People and agents share one revision-checked document through the web UI, REST, CLI, MCP, and experimental WebMCP. Documentation is public. Project, asset, credential, and provider operations require owner authorization. Examples use secure environment injection, never real keys. Generation requires BYOK. REST design generation returns a proposal; the guided UI explicitly saves its first validated draft after scope approval. Publication is separate. ## Start here - [Beginner guide](https://studio.datxanhmientrung.ai/guide.md): Visual workflow, useful briefs, review, export, and agent connections. - [Quickstart](https://studio.datxanhmientrung.ai/docs/quickstart.md): Install the released CLI, inspect templates, and create a project. - [Documents and revisions](https://studio.datxanhmientrung.ai/docs/revisions.md): Schema, targeted edits, expectedRevision, and conflicts. ## Reference - [REST API](https://studio.datxanhmientrung.ai/docs/api.md): The complete HTTP surface for projects, assets, generation, and delivery. - [CLI commands](https://studio.datxanhmientrung.ai/docs/cli.md): A stateless, scriptable interface built for your agent workflow. - [Network MCP](https://studio.datxanhmientrung.ai/docs/mcp.md): Connect remote agents through Streamable HTTP and OAuth. - [Browser WebMCP](https://studio.datxanhmientrung.ai/docs/webmcp.md): Let an in-browser agent work with the open, unsaved canvas. - [API keys & access](https://studio.datxanhmientrung.ai/docs/api-keys.md): Create, inject, and revoke credentials for your own workspace. - [Activity & usage](https://studio.datxanhmientrung.ai/docs/observability.md): Trace actions, investigate errors, and inspect measured provider usage. - [Live JSON Schemas](https://studio.datxanhmientrung.ai/api/schema): Document, targeted-operation, interview, and scope transport schemas; semantic validation also runs on writes. - [Live catalog](https://studio.datxanhmientrung.ai/api/catalog): Templates, themes, and reusable blocks. ## Optional - [Self-hosting and resources](https://studio.datxanhmientrung.ai/docs/self-hosting.md): Docker, Node, Cloudflare, backups, and capability boundaries. - [Full documentation](https://studio.datxanhmientrung.ai/llms-full.txt): All documentation inline in one text file. - [Source and releases](https://github.com/bestagentkits/design-studio-ai): MIT source, CLI tarball, and installable agent skill. --- Source: https://studio.datxanhmientrung.ai/docs/community # Community > Publish, discover, download and remix shared designs. [Community](https://studio.datxanhmientrung.ai/community) is a free place to discover, download and remix designs. Your private projects remain private until you explicitly publish a reviewed version. ## Find something worth making your own Search titles, descriptions, tags and creator names. Combine category, format, time and creator filters with Trending, Newest, Most used, Most downloaded or Relevance. Most used and Most downloaded count eligible unique people, not raw transfers. Search and filters stay in the URL. Cmd+K or Ctrl+K searches your projects on Home and community designs on Community. The visible Search control works without a keyboard. Save designs to a private collection when signed in. ## Publish with confidence - Save the project and choose Publish to Community. - Create your public creator profile, choose a title, description, tags, cover and download formats. - Review the public projection and source disclosures. Hidden content, notes and unrelated media are removed; painting is shared as a composite. - Confirm that you can share the included material under CC-BY-4.0 and explicitly approve public publication. - Follow the durable job until it succeeds. Its operation ID lets an uncertain request be retried without publishing twice. Private edits do not change the published version. Publish an update deliberately. Unlisting stops new public requests; files already downloaded and completed private remixes remain available. The existing Share link is managed separately. Under Download formats, All selects or clears every available optional format; the Studio project package is always included. PNG sequence and spritesheet show a Frame archive FPS setting. Its recommended default keeps the full animation and original dimensions within the render budget; video downloads stay at 30 fps. Review this frame rate before confirming. Unsupported frame budgets are rejected during preflight, before a publication build starts. After confirmation, the dialog shows build progress. Congratulations appears only when all selected files are ready and the design is live, with a link to view it. A failed build shows its error and lets you return to the details to correct it. ## Draft your public profile with AI Choose Generate with AI to suggest a public display name, handle and bio. The first configured text provider is selected automatically; you can choose another connection and add optional writing instructions. Only the entered profile fields and instructions are sent, using your saved provider model. Provider usage may incur charges. Your account email and private projects are not added as context. Review the suggestion, choose Use suggestion, edit if needed, then Save public profile. Generating does not save or publish. If you edit the form while generation is running, review those changes before applying a new suggestion. Handles are checked for availability when generated and again when saved. You can always fill in the form manually; connect a text provider in Settings to enable AI drafting. ## Draft listing details with AI Generate with AI is also available alongside Title, Description and Tags in the Publish dialog. It selects your first configured text provider and saved model, or you can choose another connection. Add optional writing instructions to set the language or tone. The provider receives your entered fields and a bounded summary of visible text and structure from the saved design. Notes, hidden content, account identity and media URLs are excluded. This drafts from text and structure, without inspecting the cover image; provider usage may incur charges. Review the separate suggestion, then choose Use suggestion to fill the editable fields. Nothing is saved or published. Applying a suggestion clears the previous publication review and consent, so run preflight again. Manual edits or a changed saved revision block stale suggestions. You can retry generation, load the current saved revision, connect a provider in Settings, or continue manually. Agents use `community_generate_metadata`, `studio_community_generate_metadata`, or `dsa community generate-metadata --file request.json`. Supply the owned `projectId` and observed `expectedProjectRevision`, plus optional provider, title, description, tags and prompt. Review the returned suggestion before a separate preflight and explicit publication. ## Download, import and remix Guests can download already-built files. A portable design ZIP contains the canonical document, included assets, license and attribution. Import creates a new private project with its own asset copies. Packages allow up to 20 MiB compressed, 64 MiB expanded and 1,000 entries. External media dependencies must be imported before publication; packages never fetch source media during import. Signed-in Remix also creates an independent private project with attribution. Publishing that remix is a separate confirmation. Imported attribution is marked unverified; an archive cannot grant creator milestones. ## Recognition that reflects usefulness Your Impact view shows server-confirmed downloads and remixes, plus contribution milestones. Self-actions and repeated actions from the same account do not inflate qualifying counts. Curated collections give useful work another way to be discovered. Reporting a design sends the selected version and your reason to authorized moderators. ## Agent workflow Discover `/api/schema → community`, `community_capabilities` over MCP, or `studio_community_capabilities` in a supported Community browser tab. MCP and WebMCP expose the same named operations as `dsa community --help`. Community WebMCP tools are scoped to Community pages. ``` dsa community search --q "portfolio" --kind web --sort relevance dsa community get LISTING_ID dsa community preflight --file preflight.json # Show the projection, disclosures and license to the author first. dsa community publish --file confirmed-publication.json dsa community job OPERATION_ID dsa community download LISTING_ID VERSION FILE_ID --out design.zip dsa community import --file design.zip --operation-id UNIQUE_ID ``` JSON mutation files use the canonical schema and observed revisions. Never invent a digest, substitute a newer revision, or treat preflight as consent. MCP and WebMCP base64 package import is limited to 12 MiB; use CLI or the browser file picker for larger packages. MCP binary results above 12 MiB also use CLI downloads. ## Hosting and moderation Enable `COMMUNITY_ENABLED=true` after applying migrations. Moderation uses `COMMUNITY_ADMIN_IDS` for existing account IDs. Optional `COMMUNITY_ADMIN_EMAILS` pregrants are claimed only after GitHub verifies those email identities. Password registration alone does not claim a pregrant. Keep those settings private and separate from observability admins. Moderator actions require a session or API key; OAuth never grants moderation. --- Source: https://studio.datxanhmientrung.ai/docs # Quickstart > Connect your agent and create your first editable design. THE DEVELOPER WORKSPACE ## One design. Every way to work. Give your agent the same canvas, assets, and revision history you use in the studio. Structured document Targeted edits Real output ## Working in the editor Edit and Preview stay visible in the toolbar. Save your latest edits before using Share to publish a snapshot. Design JSON downloads the current local document without saving to the server. If a document save times out, export JSON to preserve local edits, then reload and reconcile the saved revision before saving or sharing again. Use Shift-click for multiple selection, drag layer grips to reorder, and drop in the center of a container to nest. Assets → Components includes visual icons; select an instance to edit labels, values, options, variants and other supported properties. Collapse sidebars or the timeline to make room for the canvas. Space plays or pauses motion while the canvas or timeline has focus. Project, page, panel, preview, presentation and settings destinations preserve browser history. Saved project cards render a thumbnail of the actual design. For 3D, choose a material finish, import a color texture, and edit UVs through Mesh / UV / Rig. Camera and lighting have separate collapsible sections. Ordered 2D captions and 3D scene layers are composed together in the editor, raster export and shared viewer. Static SVG remains symbolic for 3D; GLB/glTF excludes 2D captions. The catalog includes dashboard, commerce, workshop, proposal, booking, product visualization and social-motion starters. Ant, shadcn, Material, Carbon and Atlassian inspired presets adapt visual foundations to supported studio components; they are not official implementations. Discover IDs through `/api/catalog` or `dsa templates list` and `dsa themes list`. **Draw, diagram, Elements and Paint** Choose New Board in the workspace, then switch between Draw, Diagram and Elements. Boards support transforms, grouping, paste and flowchart, architecture, user-flow and mind-map layouts. Native diagrams offer Sketch/Clean styles, handwriting and customizable typography, hatched fills, direct label editing and draggable connection handles. Patrick Hand, Noto Sans, Lora and Roboto Mono include embedded Vietnamese fonts for offline SVG. Use Appearance to style a selection, the diagram or new objects, and save named presets. The shared diagram-style operation exposes the same controls to agents; discover its live schema before applying. Elements includes original MIT artwork, emoji variants and owned images/GIFs; imported SVG is safely flattened to PNG with a notice. Painting supports layers, groups, masks, selection, feathering, fill and resize. For agent-rendered pixels, discover `paintingCommand` at `/api/schema` and use `POST /api/projects/{id}/paint`, MCP `paint_document`, or `dsa projects paint PROJECT_ID --file command.json`. Preserve the observed revision, painting generation and exact retry operation ID. GIF playback and timed browser exports use decoded frames; static output uses the saved poster. Reduced motion uses a still image. Local browser results do not establish physical iPad/Pencil performance. ## From a brief to a saved design 01 ### Connect your agent Sign in to the studio, create an API key, and inject it into your agent environment. [Manage API keys](https://studio.datxanhmientrung.ai/?settings=agents) 02 ### Choose a starting point Inspect templates, themes, and the document schema. Use existing page and node IDs. [Explore the CLI](https://studio.datxanhmientrung.ai/docs/cli) 03 ### Edit, inspect, export Make focused changes, save against the revision you read, and inspect the actual artifact. [Understand revisions](https://studio.datxanhmientrung.ai/docs/revisions) ``` npm install -g https://github.com/bestagentkits/design-studio-ai/releases/download/v0.4.3/bestagentkits-design-studio-ai-0.4.3.tgz # Inject DESIGN_STUDIO_API_KEY using your secret manager. export DESIGN_STUDIO_URL=https://studio.datxanhmientrung.ai dsa health dsa templates list dsa schema dsa projects list ``` ``` dsa projects create --name "Product story" --template product-deck # Use the ID and revision returned by the server. dsa projects get PROJECT_ID dsa projects export PROJECT_ID --format png --revision OBSERVED_REVISION --output preview.png ``` **Bring your own provider, when you need one** Templates and direct edits do not need an AI-provider key. Text or media generation uses your configured BYOK connection and can incur provider charges. A proposal is never silently saved over your project. [Live template & theme catalog](https://studio.datxanhmientrung.ai/api/catalog)[Installable agent skill](https://github.com/bestagentkits/design-studio-ai/releases/download/v0.4.3/design-studio-ai-skill.zip)[Live document, operation & interview schemas](https://studio.datxanhmientrung.ai/api/schema)[Create your API key](https://studio.datxanhmientrung.ai/?settings=agents) --- Source: https://studio.datxanhmientrung.ai/docs/revisions # Documents & revisions > Make focused changes while keeping human and agent work in sync. A project has a saved `revision`; its document has a separate `schemaVersion`. Read the revision before changing the design. Every full-document save checks it atomically. - **Read.** Get the document and revision together. - **Change.** Apply a small operation array to the actual node IDs. - **Save.** Send the observed revision, not a guessed newer number. - **Reconcile.** On 409, read the current design and adapt your edit. ``` [ { "op": "update-node", "nodeId": "ACTUAL_NODE_ID", "changes": { "text": "The next chapter" } } ] ``` ``` dsa projects get PROJECT_ID dsa schema --operations dsa projects document patch PROJECT_ID \ --revision OBSERVED_REVISION --file operations.json ``` **The document is shared, not duplicated per client** REST, MCP, WebMCP, and the CLI all use DesignDocument v1 or v2. Character rigs, boards and paintings require v2; downgrades are rejected. The schema validates IDs, page parents, geometry, asset ownership, and timeline references. Keep the project ID and kind. Never use full regeneration to bypass a conflict. ## Proposal versus saved work ``` dsa generate PROJECT_ID --provider openai \ --revision OBSERVED_REVISION --prompt-file brief.txt --output proposal.json # Inspect the proposal before this separate write. dsa projects document put PROJECT_ID \ --revision OBSERVED_REVISION --file proposal.json ``` Media generation and uploads return assets independently of the document. Add the asset reference and node, inspect the result, then save. Publishing exposes a frozen snapshot of the saved revision; it does not automatically publish later edits. ## Interview, scope, and explicit approval The brief stores the original request, contextual questions, answers, and scope separately from the design. Its `revision` is independent of the document revision; use zero only to create the first brief. Read the actual brief before every update. - Save a clear request. An external agent can supply its own interview, or call the configured BYOK provider to ask contextual questions. - Show the questions to the human. Save their answers; never manufacture an answer to make the workflow pass. - Review a scope covering objective, audience, visual direction, deliverables, constraints, and acceptance criteria. - Approve only after explicit human agreement. Every later brief or scope edit invalidates that approval. - Generate and inspect the design as a separate action. Scope approval never publishes anything. ``` { "request": "Create a six-slide product introduction. Ask me for missing facts." } ``` ``` dsa brief put PROJECT_ID --revision 0 --file brief.json dsa brief get PROJECT_ID # Optional: invokes your configured provider and may incur charges. dsa brief interview PROJECT_ID --revision OBSERVED_BRIEF_REVISION --provider openai # After explicit human approval of the current answered scope: dsa brief approve PROJECT_ID --revision OBSERVED_BRIEF_REVISION ``` Read the [live interview and scope schemas](https://studio.datxanhmientrung.ai/api/schema) before supplying an external agent's structured response. Questions support text, one choice, or multiple choices. On a brief conflict, reload and reconcile its current questions and answers. ## Inspect before delivery ``` dsa projects check PROJECT_ID ``` Preflight returns actionable findings with node/page IDs, severity, counts, and limitations. It estimates overflow, text fit, opaque-hex contrast, media readiness, and export duration. It does not composite overlapping backgrounds, measure every font, inspect animated extremes, or certify accessibility. Review the rendered design and actual export. ## Reusable design systems In the editor, choose **Manage design systems** to create a library of tokens, component variants and reusable compositions. Capture the selected component or current page, edit its saved definition, then create a version before applying or inserting it. Library `version` and project `revision` are separate. Applying a saved version copies its tokens/system into the project while retaining authored component overrides and records the pinned library version. Later library edits do not change existing projects automatically. Inserting a composition copies its hierarchy with fresh IDs; deleting a library leaves previously embedded project content intact. Use `dsa design-systems schema`, the [live shared schemas](https://studio.datxanhmientrung.ai/api/schema), or [OpenAPI reference](https://studio.datxanhmientrung.ai/api/openapi) for complete validated definitions and request shapes. On a version conflict, read the current definition and reconcile changes before saving. [Targeted operation implementation](https://github.com/bestagentkits/design-studio-ai/blob/main/src/shared/operations.ts) --- Source: https://studio.datxanhmientrung.ai/docs/3d # 3D characters > Imported clips, editable GLB conversion, winged rigs, lighting, sound and animated shot review. ## Build an editable 3D character Open a 3D project and choose Character authoring. Human controls and agent tools use the same validated geometry, skeleton and animation data. - **Shape.** Remesh unparented sphere primitives or closed document meshes into a continuous surface. Preview first; applying keeps source objects hidden. Use joint-ring lofts for controlled limb topology. Imported asset nodes need editable document geometry first. - **Rig.** Create a quadruped or winged quadruped skeleton from explicit landmarks. For wings, mark shoulder, elbow, wrist and 3–5 finger base/tip pairs on each side, plus jaw and jaw tip. The tool does not infer anatomy. Auto-bind the continuous mesh, inspect the heatmap and smooth or mirror weights. Attach eyes and accessories to a named bone. - **Animate.** Pose with FK or bounded IK, then add idle, wag, walk, wing-flap or roar clips. Wing-flap includes adjustable wrist lag; roar animates the skeleton and needs a separate sound cue. Presets reject missing native bones rather than retargeting arbitrary imported rigs. Inspect contact and deformation across the timeline. Morph targets add editable expressions. - **Finish.** Cut and pack UV islands, paint layered color, normal and roughness maps at 256–2048px and inspect topology/weights. Export GLB/glTF and reopen the file to verify meshes, skeletons, morph targets, textures and clips. ## Import a rigged model Upload a GLB in Assets, then explicitly insert it. Upload only adds the file to the library. **Imported model & animation** shows mesh, bone, morph and clip inventory. Add an observed clip name and set start/end, speed, weight and loop; placements persist in `scene.importedClips` and use the same sampled playback in the editor and exports. **Preview editable conversion** reports what can become native meshes, PBR maps, skinning, position morphs and sampled animation; **Apply** retains the original GLB asset in a hidden, locked source checkpoint. Conversion rejects nonunit rest or animated bone scale, unsupported physical material extensions such as clearcoat/transmission, authored morph normals/tangents, instancing and unsupported UV channels. Geometry, texture and animation budgets also apply. Keep complex source work in Blender or another authoring tool and retain imported playback when conversion is rejected. Saved-state export `editable-scene` requires `pageIndex` and the imported model's `nodeId`. It returns canonical document JSON without saving it; review and write it through the existing revision-checked document API. This JSON keeps project asset references, including the source GLB, rather than packaging portable asset bytes. CLI: `dsa projects export PROJECT --format editable-scene --node NODE --page 0 --revision N --output editable.json`. Assets **Replace uses** and the shared `replace-asset` operation update references to an existing asset of the same media kind while retaining placements/timing and both library assets; check clip names and duration afterward. ## Materials Select a 3D object to open **Material** in the inspector. The values persist on the object as `scene.material`, so the viewport, the raster exports and GLB read the same record. - **Presets** are starting points: Matte (metalness 0, roughness 0.85), Ceramic (0, 0.2), Metal (1, 0.25) and Polished (0.9, 0.08). - **Material color** takes a hex value or a theme token such as `$accent`. **Metalness** and **roughness** run from 0 to 1; the object's own data supplies the starting value, so the built-in 3D template begins at 0.25 and 0.25. - **Wireframe** draws edges instead of surfaces. **Double sided** also renders back faces; keep it for open or imported single-surface meshes, since closed solids do not need it. - Stored vertex colors multiply the material color, and a painted base-color map replaces it. Edit these in the inspector or with `update-node`. A `scene` object is replaced rather than merged, so read it first and send the fields you are not changing back unchanged. **Emissive color** and **Emissive intensity** control the material's glow contribution. Select owned images for normal, roughness, metalness, emissive and occlusion maps alongside the color texture. These are material maps; bloom remains a page rendering setting. ## Textures and UV paint Textures are owned project assets. Importing a PNG, JPEG or WebP in **Color texture** uploads it to the project and references it as `scene.material.textureAssetId`; previews and exports read that asset. An imported model that still carries its own texture offers its original model texture, and external media must be imported before cloud rendering. - **Unwrap.** Add seam edges and unwrap the islands, or use a mesh that already has UVs. Painting is rejected without them. - **Layer.** Create a layer with a name and one map type — `color`, `normal` or `roughness` — plus opacity and visibility. A layer keeps its map type; edit the name, opacity or visibility instead. Up to eight layers persist per object. - **Paint.** A stroke stores a UV point, a radius and a hex color, and a layer keeps at most 256. Strokes stay vector data in the document and are rasterized into the maps whenever the scene is built or exported. - **Resolution.** Choose 256, 512, 1024 or 2048px. One resolution applies to every map on that object. - **Clear before changing UVs.** Strokes are stored in UV space, so unwrapping refuses to run while any layer still holds strokes; clear the layers you no longer need first. The UV view draws the islands with an optional distortion tint. Red marks area stretch; it is not proof that islands do not overlap. A stroke sent without a layer writes to the legacy single color map, which has the same 256-stroke budget. GLB/glTF embeds the rasterized maps. ## Lighting, camera and effects Deselect every object to edit the page's **Camera** and **Lighting** in `page.scene`. Change them in the inspector or with `update-page`, preserving the nested fields already present. - **Camera:** position, target, field of view from 10° to 120°, and `safeFrame` margin from 0 to 0.3. Fit animated subject samples selected subjects' posed bounds across the timeline. Portrait/square shot duplication creates a page with its own camera and shared asset files. Check intermediate wing/tail extremes and overlays; sampled fitting is not a continuous clipping guarantee. - **Lighting:** retain ambient and the original directional light, and add up to eight point, spot or directional lights. Per-light shadow controls and page rendering settings persist with the scene. - **Effects:** fog, exposure, generated environment lighting, shadows, bloom and up to eight seeded particle emitters share the editor, published viewer and raster/video renderer. Emitters have explicit position, spread, velocity, lifetime, count and active interval. GLB/glTF carries supported geometry, PBR materials, embedded maps, skins and sampled animations; punctual lights use `KHR_lights_punctual`. Ambient/environment lighting, fog, bloom, exposure, cast-shadow settings and timed particle behavior are Studio rendering settings rather than a portable glTF effect stack. Review the file under the destination viewer's lighting. ## Timeline sound Insert an owned audio asset, then use waveform, trim, gain, loop, mute and event controls. Audio/video node `data` stores `audioStart`, `audioEnd`, `audioOffset` in seconds, `audioGain` from 0 to 4, `audioMuted`, `audioLoop` and `audioEvent`. Events are labels, not synthesized sounds. Editor/viewer playback and browser/cloud motion exports share cue timing and mixing. Enable audio when browser autoplay is blocked and listen to the actual exported WebM/MP4. Still images and GLB do not carry a soundtrack. ## Agent workflow Discover `sceneCommands` through `studio_capabilities` or `/api/schema`. WebMCP `studio_scene_command` accepts a page ID and command, previews by default, and applies with `preview:false`. `studio_inspect_scene` returns compact diagnostics at a requested time without transferring vertex buffers. Saved-state equivalents are REST GET/POST `/api/projects/:id/scene`, MCP `inspect_scene`/`author_scene`, and CLI `dsa scene inspect`/`dsa scene command`. Writes require the observed revision. CLI commands are available in the current source build; an older release archive may not include them. WebMCP `studio_imported_model` accepts `pageId` and `nodeId` for inventory; add `convert:true` to preview conversion and `preview:false` to apply. `studio_frame_scene_shot` takes `pageId`, `nodeIds`, optional `samples` (2–61, default 17) and `aspect` (portrait/square); it previews by default and applies with `preview:false`. These are open-editor tools. Network clients use existing document/operations and `editable-scene` export; discover exact schemas at [/api/schema](https://studio.datxanhmientrung.ai/api/schema). ## What the tools check Reports flag degenerate triangles, boundary or non-manifold edges, inconsistent winding, unnormalized skin weights and severe edge stretching in sampled poses. They do not certify self-intersection freedom or animation quality. UV seams can intentionally split vertices. Remeshing uses bounded surface sampling rather than semantic quad retopology. Quadruped landmarks and nearest-segment weights are editable starting points. One-shot IK uses mesh-local targets. Persistent two-bone contacts use world targets, bend poles, horizontal ground height, time ranges and rotation limits; inspect measured error for unreachable targets. Explicit UV islands use planar projection and need a distortion/overlap check. Color paint replaces the base-color map. Sculpt, edge splits and plane-cut loops preserve vertex attributes; legacy remesh/relax reject bound geometry. Save a mesh checkpoint before refinement. ## Shared rigs, clips and repair Share skeleton with attachments explicitly converts compatible legacy copies to one rig reference. Named clip controls adjust speed, amplitude, loop count and blend without rewriting source keys. Later tracks blend over earlier tracks; outside clip intervals the stored pose applies. Joint gizmos edit rest or pose. `joint-limits` saves per-axis named-bone rotation bounds and optional mirror partner; `mirror-pose` reflects onto that partner. FK and sampled animation respect those limits. Weight brushes support mirrored stamps, locked joints/vertices and heatmaps. Complete-animation diagnostics return issue IDs, affected vertices/faces and times, plus contact drift and floor penetration. Click a warning to select its region and pose; compare the next scan with the previous count. Informational coincident seam boundaries are distinguished from defects and appear only in the first scan frame; warning locations remain time-indexed. ## Review angles across time Export `scene-angles` with `start` alone for front/right/back/left PNGs and `views.json`. Add `end` greater than start and `reviewSamples` (2–25, default 5) for four actual views at each sampled time, `contact-sheet.png` and camera/node/time diagnostics, including posed bounds, clipping, geometry counts and measured capture costs. Images and the sheet together must fit 64 megapixels. Clipping measurements do not establish absence of occlusion; view the actual images. REST export and MCP `export_project` use `start`, `end`, `reviewSamples`, `pageIndex` and optional `expectedRevision`. CLI: `dsa projects export PROJECT --format scene-angles --start 0 --end 4 --review-samples 5 --page 0 --revision N --output review.zip`. This count differs from scan/framing `samples` and frame-archive `fps`. ## Recover long saves and exports Use durable operations with a stable ID: POST `/api/projects/:id/operations`, poll GET `/api/projects/:id/operations/:operationId`, then download `/result`. An uncertain response must reuse the same ID and payload. Jobs retain owner authorization and observed revisions; export pins the accepted document snapshot. WebMCP `studio_start_save` returns immediately; poll the operation then use `studio_reconcile_save`. Network MCP exposes `start_operation`, `get_operation` and `get_operation_result`; CLI exposes `dsa operations start/status/result`. The editor Operations control recalls the latest ID. Save receipts and export artifacts remain private until project deletion. Live collaborative merging retains its separate merge contract. --- Source: https://studio.datxanhmientrung.ai/docs/motion # Character motion > Rig, animate and compose reusable 2D characters. Open **Character Motion** below the canvas or in Assets. A character is reusable artwork with bones, slots, attachments, skins and animation clips. Scene nodes hold independent instances. ## Author a character - **Setup:** create a character, import PNG layers, then arrange offsets and pivots. Cropped layers start at the root and need positioning. Add bones, choose parents, and attach images. Keep world pose refuses transforms that would introduce unsupported shear. - **Animate:** create a clip, scrub local time and key a pose. Auto-key starts off. Each property channel has its own outgoing curve; select keys to copy, shift or scale timing. Collisions fail without replacing existing keys. Ghosting shows adjacent poses. - **Compose:** choose the instance skin, place clips on scene time, set speed, fades, weight and additive/override blending. Bone masks include descendants; placements blend in list order. ## Meshes and controls Mesh tools create a regular grid, edit vertices/UVs and paint normalized weights with up to four influences. Linked skin variants share source geometry. Deformation channels specify topology version; changing topology while incompatible keys remain is rejected. Clipping supports up to eight masks, including inverse masks. Sequence attachments choose images at their authored FPS. Constraints include one/two-bone IK, transform, cubic paths, spring physics and pose sliders. Physics uses fixed 1/120-second steps for repeatable seeks. A zero-scale parent cannot be inverted. Setup and animation poses stay separate; project undo and revision checks protect saved edits. ## Agents and proposals Document v2 adds characters while v1 remains readable. Old clients cannot save v1 over a v2 project. Discover operations through [the live schema](https://studio.datxanhmientrung.ai/api/schema). Use `inspect_motion` in MCP, `dsa motion PROJECT_ID --node NODE_ID --time 1`, or GET `/api/projects/PROJECT_ID/motion`. Generation mode `motion` returns validated operations and a preview document with `baseRevision` and `baseBriefRevision`. Apply only after review, using the returned document revision and `expectedBriefRevision` on document PUT. A stale document or brief returns 409; re-read before generating again. ## Export Native `motion` ZIP contains the editable document, manifest and bundled player. Import this ZIP through Character Motion to copy rigs and images into the current project. Imports validate bounded ZIP/JSON and never execute bundled scripts. It is a Studio format; Spine/PSD and game-engine adapters are not supported. HTML and React retain the native player. PNG sequence and spritesheet exports contain actual PNGs and a frame manifest; set start/end/FPS. The end boundary is exclusive, limited to 300 frames and 64 megapixels total. Imported assets are embedded; portable packages reject remote media. Video retains the existing 60-second limit and encoder requirements. WebGL renders interactive characters; Canvas2D handles multiply blending and is the fallback, with the same pose/mesh evaluator. SVG is a static vector/texture representation and may be slower for dense meshes. --- Source: https://studio.datxanhmientrung.ai/docs/api # REST API > The complete HTTP surface for projects, assets, generation, and delivery. Base URL: https://studio.datxanhmientrung.ai. Bodies are JSON unless stated otherwise. Use Authorization: Bearer with a securely injected API key. Cookie writes require a trusted Origin. MCP OAuth cannot manage permanent credentials or provider keys. Replace path IDs and illustrative placeholders with values read from the API. ## POST /api/projects/:id/inspect Visually inspect a saved page or project Authentication: Session or Bearer token; project owner. ### Request ``` JSON: mode page|overview (default overview), pageId or zero-based pageIndex (page mode only), expectedRevision, time 0–3600 (default 0), offset (default 0), limit 1–12 (default 6), columns 1–4 (default 3), tileSize 160–800 (default 400), maxDimension 256–2048 (default 1600). Discover visualInspection in /api/schema. ``` ### Response ``` { scope: page|project, source: saved, total, offset, nextOffset, items, images }; PNG base64 in images[].data. Items map project/page IDs, revision, original dimensions, time and pixel bounds to imageIndex. ``` Private read-only rendering; no publication, provider call, or document/brief mutation. Page selectors are exclusive; page mode defaults to the first page. Overview paginates pages. Save unsaved browser edits first. Decode and actually view the PNG before claiming visual review. Renderer limits apply; invalid selections, stale revisions and rendering failures are explicit errors. ## POST /api/projects/inspect Visually inspect workspace covers Authentication: Session or Bearer token; owned projects only. ### Request ``` JSON: offset (default 0), limit 1–12 (default 6), time 0–3600 (default 0), tileSize 160–800 (default 400). Discover workspaceInspection in /api/schema. ``` ### Response ``` { scope: workspace, source: saved, total, offset, nextOffset, items, images }; first-page PNG covers with per-project saved revisions. Empty results have no items/images. ``` Projects ordered by ID. Follow nextOffset until null for remaining covers; concurrent creation/deletion can change offset pagination. Revisions describe individual project snapshots, not one atomic workspace snapshot. No publication or AI provider call. Use project page/overview inspection for the other pages. ## GET /api/community/taxonomy Discover Community categories, formats and limits Authentication: Public. ### Request ``` No body. ``` ### Response ``` Validated JSON response; asynchronous writes return durable job status. ``` ## GET /api/community/listings Search live community designs with category, tags, formats, sort and cursor filters Authentication: Public. ### Request ``` q, kind, tags, format, period, creator, collection, sort, cursor, limit. ``` ### Response ``` Validated JSON response; asynchronous writes return durable job status. ``` ## GET /api/community/listings/{id} Read a live design and its download files Authentication: Public. ### Request ``` No body. ``` ### Response ``` Validated JSON response; asynchronous writes return durable job status. ``` ## GET /api/community/creators/{handle} Read a public creator profile Authentication: Public. ### Request ``` No body. ``` ### Response ``` Validated JSON response; asynchronous writes return durable job status. ``` ## GET /api/community/collections List curated Community collections Authentication: Public. ### Request ``` No body. ``` ### Response ``` Validated JSON response; asynchronous writes return durable job status. ``` ## GET /api/community/collections/{id} Read a curated Community collection Authentication: Public. ### Request ``` No body. ``` ### Response ``` Validated JSON response; asynchronous writes return durable job status. ``` ## GET /api/community/listings/{id}/versions/{version}/preview Get sandboxed HTML preview of a retained live version Authentication: Public. ### Request ``` No body. ``` ### Response ``` Ready file bytes; Content-Type identifies the actual format. ``` ## GET /api/community/listings/{id}/versions/{version}/files/{fileId} Download real ready file bytes; first eligible download contributes to creator impact Authentication: Public. ### Request ``` No body. ``` ### Response ``` Ready file bytes; Content-Type identifies the actual format. ``` ## POST /api/community/preflight Review the public projection, disclosures, formats and digest before publishing Authentication: Session or Bearer token; owner checks apply. ### Request ``` Canonical request in /api/schema → community. JSON body requires the fields listed there. ``` ### Response ``` Validated JSON response; asynchronous writes return durable job status. ``` ## POST /api/community/metadata/generate Draft a listing title, description and tags using an owned saved project revision and configured text provider. Sends bounded visible text/structure plus entered fields/instructions, incurs provider usage, and never saves or publishes. Defaults to the first configured text connection. Review the suggestion and run preflight with the approved fields before publication. Authentication: Session or Bearer token; owner checks apply. ### Request ``` Canonical request in /api/schema → community. JSON body requires the fields listed there. ``` ### Response ``` Validated JSON response; asynchronous writes return durable job status. ``` ## POST /api/community/listings Explicitly confirm CC-BY-4.0 and public disclosure to publish the reviewed revision; reuse exact operation ID and payload on retry Authentication: Session or Bearer token; owner checks apply. ### Request ``` Canonical request in /api/schema → community. JSON body requires the fields listed there. ``` ### Response ``` Validated JSON response; asynchronous writes return durable job status. ``` ## POST /api/community/listings/{id}/releases Publish a new immutable release at the reviewed project and listing revisions Authentication: Session or Bearer token; owner checks apply. ### Request ``` Canonical request in /api/schema → community. JSON body requires the fields listed there. ``` ### Response ``` Validated JSON response; asynchronous writes return durable job status. ``` ## POST /api/community/listings/{id}/unlist Revoke public access to all listing versions at the observed listing revision Authentication: Session or Bearer token; owner checks apply. ### Request ``` Canonical request in /api/schema → community. JSON body requires the fields listed there. ``` ### Response ``` Validated JSON response; asynchronous writes return durable job status. ``` ## GET /api/community/jobs/{operationId} Read your durable Community operation status and result Authentication: Session or Bearer token; owner checks apply. ### Request ``` No body. ``` ### Response ``` Validated JSON response; asynchronous writes return durable job status. ``` ## GET /api/community/jobs/{operationId}/preview Read your private staged publication preview Authentication: Session or Bearer token; owner checks apply. ### Request ``` No body. ``` ### Response ``` Ready file bytes; Content-Type identifies the actual format. ``` ## GET /api/community/jobs/{operationId}/files/{fileId} Download your private staged file Authentication: Session or Bearer token; owner checks apply. ### Request ``` No body. ``` ### Response ``` Ready file bytes; Content-Type identifies the actual format. ``` ## POST /api/community/listings/{id}/remix Create an independent private project with owned assets and attribution from a pinned public version Authentication: Session or Bearer token; owner checks apply. ### Request ``` Canonical request in /api/schema → community. JSON body requires the fields listed there. ``` ### Response ``` Validated JSON response; asynchronous writes return durable job status. ``` ## POST /api/community/imports Import a portable ZIP into an independent private project; operationId makes exact retries safe Authentication: Session or Bearer token; owner checks apply. ### Request ``` Multipart file ZIP and operationId; 20 MiB package limit. ``` ### Response ``` Validated JSON response; asynchronous writes return durable job status. ``` ## GET /api/community/me/listings List your publications including private management states Authentication: Session or Bearer token; owner checks apply. ### Request ``` No body. ``` ### Response ``` Validated JSON response; asynchronous writes return durable job status. ``` ## GET /api/community/me/bookmarks List your private saved Community designs Authentication: Session or Bearer token; owner checks apply. ### Request ``` No body. ``` ### Response ``` Validated JSON response; asynchronous writes return durable job status. ``` ## GET /api/community/me/impact Read server-confirmed creator impact and milestone badges Authentication: Session or Bearer token; owner checks apply. ### Request ``` No body. ``` ### Response ``` Validated JSON response; asynchronous writes return durable job status. ``` ## GET /api/community/me/profile Read your opt-in Community profile and revision Authentication: Session or Bearer token; owner checks apply. ### Request ``` No body. ``` ### Response ``` Validated JSON response; asynchronous writes return durable job status. ``` ## PUT /api/community/me/profile Create or update your public profile at its observed revision Authentication: Session or Bearer token; owner checks apply. ### Request ``` Canonical request in /api/schema → community. JSON body requires the fields listed there. ``` ### Response ``` Validated JSON response; asynchronous writes return durable job status. ``` ## POST /api/community/me/profile/generate Use your configured text provider to suggest a public display name, handle and bio. Incurs provider usage; sends only supplied fields/instructions, defaults to your first configured text connection, and never saves or publishes. Review before set-profile; handle availability is checked again when saving. Authentication: Session or Bearer token; owner checks apply. ### Request ``` Canonical request in /api/schema → community. JSON body requires the fields listed there. ``` ### Response ``` Validated JSON response; asynchronous writes return durable job status. ``` ## PUT /api/community/listings/{id}/bookmark Idempotently save a live design to your private bookmarks Authentication: Session or Bearer token; owner checks apply. ### Request ``` No body. ``` ### Response ``` Validated JSON response; asynchronous writes return durable job status. ``` ## DELETE /api/community/listings/{id}/bookmark Idempotently remove a private bookmark Authentication: Session or Bearer token; owner checks apply. ### Request ``` No body. ``` ### Response ``` Validated JSON response; asynchronous writes return durable job status. ``` ## POST /api/community/listings/{id}/reports Report a pinned design version with a reason and exact-retry operation ID Authentication: Session or Bearer token; owner checks apply. ### Request ``` Canonical request in /api/schema → community. JSON body requires the fields listed there. ``` ### Response ``` Validated JSON response; asynchronous writes return durable job status. ``` ## GET /api/community/moderation/reports Operator session/API key only: list private reports Authentication: Operator session or API key; no OAuth. ### Request ``` No body. ``` ### Response ``` Validated JSON response; asynchronous writes return durable job status. ``` ## GET /api/community/moderation/collections Operator only: list collections including unavailable reviewed items Authentication: Operator session or API key; no OAuth. ### Request ``` No body. ``` ### Response ``` Validated JSON response; asynchronous writes return durable job status. ``` ## GET /api/community/moderation/reports/{id} Operator only: inspect a pinned report and content availability Authentication: Operator session or API key; no OAuth. ### Request ``` No body. ``` ### Response ``` Validated JSON response; asynchronous writes return durable job status. ``` ## GET /api/community/moderation/reports/{id}/preview Operator only: preview retained reported content Authentication: Operator session or API key; no OAuth. ### Request ``` No body. ``` ### Response ``` Ready file bytes; Content-Type identifies the actual format. ``` ## GET /api/community/moderation/reports/{id}/files/{fileId} Operator only: download retained evidence bound to the report Authentication: Operator session or API key; no OAuth. ### Request ``` No body. ``` ### Response ``` Ready file bytes; Content-Type identifies the actual format. ``` ## POST /api/community/moderation/reports/{id}/resolve Operator only: hide, restore or dismiss with observed report/listing revisions and a reason Authentication: Operator session or API key; no OAuth. ### Request ``` Canonical request in /api/schema → community. JSON body requires the fields listed there. ``` ### Response ``` Validated JSON response; asynchronous writes return durable job status. ``` ## POST /api/community/moderation/collections Operator only: curate explicitly reviewed listing versions Authentication: Operator session or API key; no OAuth. ### Request ``` Canonical request in /api/schema → community. JSON body requires the fields listed there. ``` ### Response ``` Validated JSON response; asynchronous writes return durable job status. ``` ## PUT /api/community/moderation/collections/{id} Operator only: update ordered curation at the observed collection revision Authentication: Operator session or API key; no OAuth. ### Request ``` Canonical request in /api/schema → community. JSON body requires the fields listed there. ``` ### Response ``` Validated JSON response; asynchronous writes return durable job status. ``` ## GET /api/projects/:id/scene Inspect 3D mesh and rig Authentication: Session or Bearer token; project owner. ### Request ``` Optional pageId and time (seconds). ``` ### Response ``` Revision, topology diagnostics, bones and sampled deformation bounds. ``` ## POST /api/projects/:id/scene Author 3D character Authentication: Session or Bearer token; project owner. ### Request ``` pageId, command, expectedRevision, preview (default true). Discover sceneCommands in /api/schema. ``` ### Response ``` Preview or applied revision with compact diagnostics. Apply uses atomic owner/revision validation. ``` ## GET /api/projects/:id/thumbnail Load a persisted project cover Authentication: Session or Bearer token; project owner. ### Request ``` Optional query revision: positive saved revision; defaults to current. ``` ### Response ``` 200 image/png (maximum 480px per side); 202 {status: rendering, revision} with Retry-After: 2 while another render is active. ``` Owner-only. Cache misses render once using the isolated server renderer; project summaries expose thumbnailUrl for the current revision and thumbnailRevision for the latest ready cover. Retains two latest completed revisions; older missing covers return 404. Failures preserve the previous cover, with a 30-second retry cooldown. Import external media into the project first. No AI provider call. ## GET /api/projects/:id/motion Inspect character motion Authentication: Session or Bearer token; project owner. ### Request ``` Optional query: characterId, nodeId, time (seconds). ``` ### Response ``` Revision, rigs, clips, skins, constraints and optional sampled pose. ``` ## GET /api/observability/summary Summarize account activity and measured usage Authentication: Session or Bearer; owner default, configured operator for scope=all. ### Request ``` Query: scope=owner|all; days=1..30 (default7); projectId, actorId (all only), channel, kind, status, action. ``` ### Response ``` { scope, days, totals, usage, byAction, byActor, byProvider, coverage } ``` Unknown measurements remain null. OAuth cannot read all-account scope. ## GET /api/observability/events Read paginated activity logs Authentication: Session or Bearer; owner default. ### Request ``` Summary filters plus limit=1..100 (default50), cursor from previous page. ``` ### Response ``` { events, nextCursor }; safe metadata only, 30-day retention. ``` ## GET /api/observability/trace/:id Follow correlated request steps Authentication: Session or Bearer; owner default. ### Request ``` Trace ID from X-Request-ID or event. Query: scope, days (default7; maximum30). ``` ### Response ``` { traceId, events, truncated }; 404 for unavailable traces. ``` ## POST /api/observability/client-events Record an allowlisted browser event Authentication: Same-origin browser; owned project/correlation when supplied. ### Request ``` { event, page?, action?, projectId?, requestId?, outcome?, errorCode? }; strict enums in OpenAPI schema. ``` ### Response ``` Accepted telemetry; optional PostHog forwarding is isolated from product operations. ``` Never send arbitrary text, credentials, names, URLs or exception messages. Not exposed as an agent mutation tool. ## GET /api/health Check service health Authentication: Public. ### Request ``` No body. ``` ### Response ``` { "ok": true, "service": "design-studio-ai", "revision": " | null" } ``` revision is the commit stamped into the built site; it is null for local and self-hosted builds that have no release marker. ## GET /api/schema Read live JSON Schemas Authentication: Public. ### Request ``` No body. ``` ### Response ``` { document: JSONSchema, operations: JSONSchema, designSystem: JSONSchema, interview: JSONSchema, scope: JSONSchema }; semantic validation still runs on writes. ``` ## GET /api/openapi Discover API operations and request schemas Authentication: Public. ### Request ``` No body. ``` ### Response ``` OpenAPI document with path/query parameters, multipart uploads, and shared component schemas. ``` ## GET /api/design-systems List your design systems Authentication: Session or Bearer token; library owner. ### Request ``` No body. ``` ### Response ``` { systems: DesignSystem[] }; latest saved versions for this owner. ``` ## POST /api/design-systems Create a reusable design system Authentication: Session or Bearer token; library owner. ### Request ``` Definition object matching /api/schema → designSystem. ``` ### Response ``` 201 { system }; initial version is 1. ``` Includes theme tokens, component variants and reusable page compositions. Private media references cannot be captured; embed media or use public HTTPS URLs. ## GET /api/design-systems/:id Read a library version Authentication: Session or Bearer token; library owner. ### Request ``` Optional positive integer query: version. Omit for latest. ``` ### Response ``` { system: { id, version, definition, createdAt } } ``` ## GET /api/design-systems/:id/versions List immutable library versions Authentication: Session or Bearer token; library owner. ### Request ``` No body. ``` ### Response ``` { versions: [{ version, createdAt }] }; newest first. ``` ## PUT /api/design-systems/:id Append a library version Authentication: Session or Bearer token; library owner. ### Request ``` { expectedVersion, definition }; read the definition and its version first. ``` ### Response ``` { system }; stale expectedVersion returns 409. ``` Previous definitions stay immutable. Never substitute a newer version number to force stale content through a conflict. ## POST /api/design-systems/:id/apply Apply a saved design system Authentication: Session or Bearer token; project owner. ### Request ``` { projectId, expectedRevision, version? } ``` ### Response ``` { project }; project revision increments. ``` Own both library and project. Optional version selects a saved library version. Applies tokens/system while preserving authored component overrides; pins the library version in the project. ## POST /api/design-systems/:id/insert Insert a library item Authentication: Session or Bearer token; project owner. ### Request ``` { projectId, expectedRevision, pageId, itemId, version? } ``` ### Response ``` { project }; inserts the saved component/composition with fresh node IDs and remapped hierarchy/interactions. ``` ## DELETE /api/design-systems/:id Delete a design-system library Authentication: Session or Bearer token; library owner. ### Request ``` No body. ``` ### Response ``` { "ok": true } ``` Deletes this owned library and its versions. Previously applied project content remains embedded. ## GET /api/fonts Discover Google Fonts Authentication: Session or Bearer token. ### Request ``` Optional q query, maximum 200 characters; matches family/category without case sensitivity. ``` ### Response ``` { fonts, source, message, fetchedAt? }; source is live, cache, or fallback. ``` The full catalog uses an operator Google Fonts API key. Without it, returns clearly labeled curated starter families. Choosing a Google font loads its face separately. ## GET /api/providers/:provider/models Discover provider model IDs Authentication: Account session or API key. ### Request ``` Provider: openai|anthropic|gemini|openrouter|fal|deepseek|leonardo|grok|custom-. Optional q query, maximum 200 characters; matches ID/name/category. ``` ### Response ``` { models, source, message, fetchedAt?, truncated? } ``` Uses the saved provider connection. Custom endpoints and unavailable connections return labeled starter suggestions; manual model IDs remain available. OAuth MCP credentials cannot call this endpoint. No raw provider key is returned. ## GET /api/catalog Read built-in design resources Authentication: Public. ### Request ``` No body. ``` ### Response ``` { themes, templates, blocks } ``` ## GET /api/config Read public configuration Authentication: Public. ### Request ``` No body. ``` ### Response ``` Public feature configuration, including googleClientId, allowRegistration, githubEnabled, observability eligibility/retention, and analytics availability. Never includes provider keys or server secrets. ``` ## POST /api/auth/register Create an account Authentication: Public; matching Origin header. ### Request ``` { "email": "you@example.com", "password": "<12–128 characters>", "name": "Your name" } ``` ### Response ``` 201 { user: { id, email, name } } + HttpOnly session cookie. ``` Registration must be enabled by the operator. Email is normalized; name is optional. Rate limited. ## POST /api/auth/login Start an email/password session Authentication: Public; matching Origin header. ### Request ``` { "email": "you@example.com", "password": "" } ``` ### Response ``` { user: { id, email, name } } + HttpOnly session cookie. ``` ## GET /api/auth/me Read the current account Authentication: Optional session or Bearer token. ### Request ``` No body. ``` ### Response ``` { user: { id, email, name } | null } ``` ## GET /api/auth/github Start GitHub sign-in Authentication: Public browser navigation; configured GitHub OAuth app. ### Request ``` Navigate using the sign-in button. No request body. ``` ### Response ``` Redirects to GitHub authorization with browser-bound state and S256 PKCE; configuration errors redirect to /?auth_error=…. ``` ## GET /api/auth/github/callback Complete GitHub sign-in Authentication: Valid one-use state and initiating browser cookie. ### Request ``` GitHub supplies code and state, or an authorization error. ``` ### Response ``` Issues the studio session and redirects home on success. Errors redirect to /?auth_error=…. ``` This is an OAuth callback, not an endpoint to call manually. Existing email/password accounts are not automatically linked by email. ## GET /api/auth/github/status Read your GitHub connection Authentication: Account browser session only. ### Request ``` No body. ``` ### Response ``` { enabled: boolean, connected: boolean, login: string | null } ``` ## POST /api/auth/github/link Connect GitHub to your existing account Authentication: Account browser session; matching Origin. ### Request ``` No body. ``` ### Response ``` { url }; navigate to the returned GitHub authorization URL. ``` The callback must complete in the same signed-in session. A GitHub identity already linked to another account is rejected. ## POST /api/auth/logout End a browser session Authentication: Session; matching Origin for cookie authentication. ### Request ``` No body. ``` ### Response ``` { "ok": true }; clears the session cookie. ``` Logging out of a browser does not revoke API keys. ## GET /api/projects Search and list projects Authentication: Session or Bearer token. ### Request ``` Query: q (name/description), kind (web|slides|report|wireframe|3d|video), sort (updated|created|name). ``` ### Response ``` { projects: ProjectSummary[] }; up to 500 owned projects. Summaries exclude document. ``` ## POST /api/projects Create or clone a project Authentication: Session or Bearer token. ### Request ``` { "name": "Product story", "kind": "slides", "templateId": "product-deck" } ``` ### Response ``` 201 { project: Project }; initial revision is 1. ``` Optional description, themeId, templateId, document. Supplying an owned document creates a new project and copies owned asset bytes; there is no separate REST clone route. ## GET /api/projects/:id Read a project and revision Authentication: Session or Bearer token; project owner. ### Request ``` Replace :id with an actual project ID. ``` ### Response ``` { project: { id, name, description, kind, document, revision, createdAt, updatedAt, publishedUrl? } } ``` ## PATCH /api/projects/:id Update project metadata Authentication: Session or Bearer token; project owner. ### Request ``` { "name": "Updated name", "description": "Updated description" } ``` ### Response ``` { project: Project }; increments revision. ``` Both fields are optional. This metadata route checks the revision read by the server; use document PUT or CLI rename for an explicit client expectedRevision. ## PUT /api/projects/:id/document Save the canonical document Authentication: Session or Bearer token; project owner. ### Request ``` { "document": "", "expectedRevision": 1 } ``` ### Response ``` { project: Project }; revision increments atomically. A stale expectedRevision returns 409. ``` document is an object, not a string: replace the illustrative placeholder. Optional expectedBriefRevision guards reviewed proposals against brief changes. Preserve project ID/kind. Owned asset references must belong to this project. Targeted patch operations are available through CLI/MCP, which reuse this save contract. ## POST /api/projects/:id/merge Merge concurrent human and agent edits Authentication: Session or Bearer token; project owner. ### Request ``` { baseRevision, base, document }; base is the complete document originally read, document is your edited copy. ``` ### Response ``` { project: Project }; saves the reconciled document. Overlapping edits return 409 with error.code merge_conflict and error.details.paths. ``` baseRevision is the positive project revision originally read, separate from the brief revision. Preserve the exact base and project ID/kind. Never alter the base or invent its revision to force a merge; resolve overlapping changes explicitly. ## GET /api/projects/:id/changes Observe the saved project revision Authentication: Session or Bearer token; project owner. ### Request ``` Optional query: since, the last observed nonnegative project revision; default 0. ``` ### Response ``` { revision, unchanged: true } when since equals the saved revision; otherwise { revision, project: Project }. ``` Returns the current saved project when changed, not a history or operation log. Does not include unsaved browser edits. ## DELETE /api/projects/:id Delete a project Authentication: Session or Bearer token; project owner. ### Request ``` No body. ``` ### Response ``` { "ok": true } ``` Deletes the project, stored assets, and publications. This is destructive. ## GET /api/projects/:id/checks Inspect the saved design Authentication: Session or Bearer token; project owner. ### Request ``` No body. ``` ### Response ``` { projectId, revision, issues, counts: { warnings, information, total }, truncated, limitations } ``` Read-only deterministic preflight with node/page IDs and suggestions. Estimates bounds, text fit, opaque-hex contrast, missing/remote media, chart data, and duration limits. Does not certify accessibility or visual quality; inspect the actual preview. ## GET /api/projects/:id/brief Read the design brief and scope Authentication: Session or Bearer token; project owner. ### Request ``` No body. ``` ### Response ``` { brief: DesignBrief | null } ``` A brief has its own revision, separate from the document revision, plus request, status, message, questions, answers, scope, approvedAt, and updatedAt. ## PUT /api/projects/:id/brief Save a brief, interview, answers, or scope Authentication: Session or Bearer token; project owner. ### Request ``` { "expectedRevision": 0, "request": "Create a six-slide introduction for our team." } ``` ### Response ``` { brief: DesignBrief }; increments the brief revision. Stale revisions return 409. ``` Revision 0 creates a brief and requires request. Supply at least one of request, interview, answers, or scope. Read interview/scope JSON Schemas at /api/schema. Answers map question IDs to text or multiple-choice arrays. Every edit invalidates prior approval. External agents can supply their own interview and scope without server BYOK. ## POST /api/projects/:id/brief/interview Generate contextual interview questions or scope Authentication: Session or Bearer token; project owner. ### Request ``` { "expectedRevision": 1, "provider": "openai" } ``` ### Response ``` { brief: DesignBrief }; saves the validated provider response with revision protection. ``` Requires an existing brief and configured text-provider BYOK; charges may apply. Providers: openai, anthropic, gemini, openrouter, deepseek, custom-; model is optional. Returns up to eight contextual questions or a concrete scope. Invalid provider responses leave the saved brief unchanged. ## POST /api/projects/:id/brief/approve Approve the current scope Authentication: Session or Bearer token; project owner. ### Request ``` { "expectedRevision": 2 } ``` ### Response ``` { brief: DesignBrief }; status becomes approved and approvedAt is recorded. ``` Requires a scope and answers to all required questions. Obtain explicit human approval of the current scope before calling. Approval increments the brief revision; it does not generate a design, save the document, or publish. ## GET /api/projects/:id/assets List project assets Authentication: Session or Bearer token; project owner. ### Request ``` No body. ``` ### Response ``` { assets: [{ id, name, type, mimeType, url, size }] } ``` ## POST /api/projects/:id/assets Upload private media Authentication: Session or Bearer token; project owner. ### Request ``` multipart/form-data with a file field. Let your HTTP client set the multipart boundary. ``` ### Response ``` { asset: { id, name, type, mimeType, url, size } } ``` Maximum 20 MB. PNG/JPEG/WebP/GIF, MP3/WAV/OGG, MP4/WebM, and GLB are supported with signature validation. Upload does not place a node on the canvas. ## GET /api/assets/:id Download private asset bytes Authentication: Session or Bearer token; asset owner. ### Request ``` Replace :id with an actual asset ID. ``` ### Response ``` Binary response with the stored MIME type. ``` ## GET /api/projects/:id/messages Read saved conversation Authentication: Session or Bearer token; project owner. ### Request ``` No body. ``` ### Response ``` { messages: [{ id, role, text, createdAt }] }; latest 200 messages in chronological order. ``` ## POST /api/projects/:id/messages Append a conversation message Authentication: Session or Bearer token; project owner. ### Request ``` { "role": "user", "text": "Make the title more concise." } ``` ### Response ``` 201 { message: { id, role, text, createdAt } } ``` role is user or assistant; text is 1–30,000 characters. This stores a message; it does not invoke a provider. ## POST /api/projects/:id/generate Generate a design proposal Authentication: Session or Bearer token; project owner. ### Request ``` { "provider": "openai", "prompt": "Make the opening slide more spacious.", "expectedRevision": 1 } ``` ### Response ``` { document: DesignDocument, usage? } ``` Optional model. Providers: openai, anthropic, gemini, openrouter, deepseek, custom-. Requires configured BYOK, may incur charges, and does not save. Prompt maximum 12,000 characters. Inspect, then save with the original revision. ## POST /api/projects/:id/media Generate or transform media Authentication: Session or Bearer token; project owner. ### Request ``` { "provider": "fal", "kind": "audio", "prompt": "Warm ambient instrumental music", "durationSeconds": 30 } ``` ### Response ``` OpenAI, Gemini, Grok, custom: { asset }. fal and Leonardo: 202 { job: { id, status: "queued" } }. ``` kind: image|audio|video. Optional model, voice, sourceAssetId, durationSeconds, strength. Sources must belong to this project. OpenAI image/edit/speech; Gemini, Grok and Leonardo prompt-only images; custom OpenAI/Gemini compatible prompt-only images; fal image/edit, video/edit, music/effects/audio transformation. Requires BYOK and can incur charges. ## GET /api/projects/:id/media/:jobId Poll a media job Authentication: Session or Bearer token; project owner. ### Request ``` Use the project ID and returned job ID. ``` ### Response ``` { status: "queued" | "processing" } or { status: "completed", asset }. ``` Supports all fal media kinds. A completed result is reused on later polls. Failures return actionable errors; queued is not completed. ## POST /api/projects/:id/export Download a rendered file Authentication: Session or Bearer token; project owner. ### Request ``` { "format": "png", "pageIndex": 0, "expectedRevision": 1 } ``` ### Response ``` File bytes with Content-Type and Content-Disposition. No JSON success envelope. ``` Formats: json, html, svg, png, pdf, pptx, webm, mp4, react, glb, gltf, motion, png-sequence, spritesheet, scene-angles, editable-scene. scene-angles at start returns four PNGs; adding end and reviewSamples (2–25, default 5) returns four views per sampled time, contact-sheet.png and views.json diagnostics. editable-scene requires nodeId and returns canonical JSON with a hidden original-GLB checkpoint, without saving; project asset references remain. Frame ZIPs accept start/end/fps. React returns a runnable frontend ZIP for Web/App or wireframe projects. GLB/glTF export the selected scene with geometry/materials/animation. pageIndex defaults to 0; expectedRevision is optional. PDF/PPTX include all pages. Import remote media before isolated cloud rendering. React source export does not require Chromium; GLB/glTF and raster/video formats use the configured browser renderer. Size and encoder limits apply. ## POST /api/projects/:id/google-slides Create Google Slides Authentication: Session or Bearer token; project owner. ### Request ``` { "accessToken": "" } ``` ### Response ``` { url, presentationId } ``` Requires real Google authorization. Native text/shapes/HTTPS images are supported; unsupported complex nodes and private image URLs fail explicitly. Do not put the token in source files. ## POST /api/projects/:id/publish Publish an immutable snapshot Authentication: Session or Bearer token; project owner. ### Request ``` No body. ``` ### Response ``` { url, revision } ``` Makes this saved design and its referenced snapshot assets public. Later private edits do not change it. ## DELETE /api/projects/:id/publish Unpublish a project Authentication: Session or Bearer token; project owner. ### Request ``` No body. ``` ### Response ``` { "ok": true }; removes all public snapshots of this project. ``` ## POST /api/projects/:id/preview Create a public preview link Authentication: Session or Bearer token; project owner. ### Request ``` No body. ``` ### Response ``` { url, revision } ``` Creates the same immutable public snapshot as publish, under the preview naming used by agents. Later private edits do not change it. ## DELETE /api/projects/:id/preview Remove preview links Authentication: Session or Bearer token; project owner. ### Request ``` No body. ``` ### Response ``` { "ok": true }; removes all public snapshots of this project. ``` ## POST /api/projects/:id/share Create a public share link Authentication: Session or Bearer token; project owner. ### Request ``` No body. ``` ### Response ``` { url, revision } ``` Creates the same immutable public snapshot as publish, under the share naming used by agents. ## DELETE /api/projects/:id/share Remove share links Authentication: Session or Bearer token; project owner. ### Request ``` No body. ``` ### Response ``` { "ok": true }; removes all public snapshots of this project. ``` ## GET /published/:slug View a published snapshot Authentication: Public. ### Request ``` Use the slug from a publish response. ``` ### Response ``` HTML snapshot, including the trusted 3D/timeline viewer where applicable. ``` ## GET /published/:slug/assets/:id Read a snapshot asset Authentication: Public, scoped to this snapshot. ### Request ``` Use the snapshot asset URL. Private API asset URLs do not become public. ``` ### Response ``` Asset bytes only when this publication references the asset. ``` ## GET /api/providers List masked provider settings Authentication: Account session or API key. ### Request ``` No body. ``` ### Response ``` { providers: [{ provider, name, baseUrl, model, protocol, authMethod, authHeader, configured, apiKey: "••••••••" }] } ``` API-key MCP clients can use list_provider_connections for these masked IDs. MCP OAuth tokens cannot access provider settings. ## PUT /api/providers/:provider Save a BYOK connection Authentication: Account session or API key. ### Request ``` { "apiKey": "", "model": "" } ``` ### Response ``` { provider, name, baseUrl, model, protocol, authMethod, authHeader, configured: true, apiKey: "••••••••" } ``` Providers: openai, anthropic, gemini, openrouter, fal, deepseek, leonardo, grok or custom-. Custom connections require name, baseUrl and model; protocol is openai, anthropic or gemini. authMethod: bearer, api-key (authHeader), basic (username:password credential), none. HTTPS origins must be operator-allowlisted. Omit apiKey to retain it; endpoint/auth changes require a new credential. Secrets are encrypted. Prefer CLI --key-env or --key-stdin; ChatGPT subscriptions do not include OpenAI API access. ## DELETE /api/providers/:provider Remove a BYOK connection Authentication: Account session or API key. ### Request ``` No body. ``` ### Response ``` { "ok": true } ``` ## GET /api/tokens List API-key metadata Authentication: Account session or API key. ### Request ``` No body. ``` ### Response ``` { tokens: [{ id, name, createdAt, lastUsedAt }] } ``` Raw keys are never returned by list. MCP OAuth cannot manage permanent credentials. ## POST /api/tokens Create an API key Authentication: Account session or API key. ### Request ``` { "name": "Local design agent" } ``` ### Response ``` 201 { id, token }; raw token is returned once. ``` Treat this response as a secret. Use the signed-in key-management UI to create your first key. ## DELETE /api/tokens/:id Revoke an API key Authentication: Account session or API key. ### Request ``` Use the key ID from the metadata list, not the secret value. ``` ### Response ``` { "ok": true }; revoked keys no longer authenticate. ``` ## Errors and concurrency Application errors use {error:{code,message,details?}}. OAuth errors use {error,error_description}. Handle 400 invalid input, 401 authentication, 403 origin/scope, 404 unavailable ownership-scoped resources, 409 revision conflicts, 413 byte/pixel limits, 429 rate limits, and 502/503 upstream/configuration failures. Read and reconcile on a revision conflict; never blindly raise expectedRevision. --- Source: https://studio.datxanhmientrung.ai/docs/cli # CLI commands > A stateless, scriptable interface built for your agent workflow. **CLI release and source reference** The command reference below follows the current source. The v0.4.3 CLI includes visual inspection, scene authoring, Community, creative-board and diagram operations, generation-checked painting layers, real raster stroke/fill commands, and persistent revision thumbnail downloads. Check installed command help before automation. To build from source, run `npm ci`, `npm ci --prefix packages/cli`, and `npm run build:cli`, then `node packages/cli/dist/dsa.js --help`. `dsa` is a standalone Node 24+ CLI with bundled validation, templates, and static rendering. It prints JSON by default and writes actionable errors to stderr. It stores no configuration, login session, or credentials. ``` npm install -g https://github.com/bestagentkits/design-studio-ai/releases/download/v0.4.3/bestagentkits-design-studio-ai-0.4.3.tgz dsa --help dsa projects export --help dsa media generate --help ``` **Secrets stay outside command history** Inject `DESIGN_STUDIO_API_KEY` and optionally `DESIGN_STUDIO_URL`. Global flags are `--url`, `--api-key`, `--timeout` (milliseconds, default 180000), and `--json`. Prefer environment injection to typing a key as a flag. HTTP is allowed only for loopback development. ## Command reference All commands below begin with `dsa`. Options without “required” are optional. Use command `--help` for the installed version. Document/operation input accepts `--file -` for stdin; prompt input accepts `--prompt-file -`. | Command | Options | Behavior | | --- | --- | --- | | community schema | No options | Discover every Community command and canonical request shape. | | community taxonomy | No options | Discover Community categories, formats and limits | | community search | --q TEXT --kind KIND --tags TAGS --format FORMAT --period PERIOD --creator HANDLE --collection ID --sort SORT --cursor CURSOR --limit N | Search live community designs with category, tags, formats, sort and cursor filters | | community get ID | No options | Read a live design and its download files | | community creator HANDLE | No options | Read a public creator profile | | community collections | No options | List curated Community collections | | community collection ID | No options | Read a curated Community collection | | community preview ID VERSION | --out FILE | Get sandboxed HTML preview of a retained live version | | community download ID VERSION FILEID | --out FILE | Download real ready file bytes; first eligible download contributes to creator impact | | community preflight | --file request.json | Review the public projection, disclosures, formats and digest before publishing | | community generate-metadata | --file request.json | Draft a listing title, description and tags using an owned saved project revision and configured text provider. Sends bounded visible text/structure plus entered fields/instructions, incurs provider usage, and never saves or publishes. Defaults to the first configured text connection. Review the suggestion and run preflight with the approved fields before publication. | | community publish | --file request.json | Explicitly confirm CC-BY-4.0 and public disclosure to publish the reviewed revision; reuse exact operation ID and payload on retry | | community release ID | --file request.json | Publish a new immutable release at the reviewed project and listing revisions | | community unlist ID | --file request.json | Revoke public access to all listing versions at the observed listing revision | | community job OPERATIONID | No options | Read your durable Community operation status and result | | community job-preview OPERATIONID | --out FILE | Read your private staged publication preview | | community job-file OPERATIONID FILEID | --out FILE | Download your private staged file | | community remix ID | --file request.json | Create an independent private project with owned assets and attribution from a pinned public version | | community import | --file design.zip --operation-id ID | Import a portable ZIP into an independent private project; operationId makes exact retries safe | | community my-listings | No options | List your publications including private management states | | community bookmarks | No options | List your private saved Community designs | | community impact | No options | Read server-confirmed creator impact and milestone badges | | community profile | No options | Read your opt-in Community profile and revision | | community set-profile | --file request.json | Create or update your public profile at its observed revision | | community generate-profile | --file request.json | Use your configured text provider to suggest a public display name, handle and bio. Incurs provider usage; sends only supplied fields/instructions, defaults to your first configured text connection, and never saves or publishes. Review before set-profile; handle availability is checked again when saving. | | community save ID | No options | Idempotently save a live design to your private bookmarks | | community unsave ID | No options | Idempotently remove a private bookmark | | community report ID | --file request.json | Report a pinned design version with a reason and exact-retry operation ID | | community reports | No options | Operator session/API key only: list private reports | | community moderation-collections | No options | Operator only: list collections including unavailable reviewed items | | community report-detail ID | No options | Operator only: inspect a pinned report and content availability | | community report-preview ID | --out FILE | Operator only: preview retained reported content | | community report-file ID FILEID | --out FILE | Operator only: download retained evidence bound to the report | | community resolve-report ID | --file request.json | Operator only: hide, restore or dismiss with observed report/listing revisions and a reason | | community create-collection | --file request.json | Operator only: curate explicitly reviewed listing versions | | community update-collection ID | --file request.json | Operator only: update ordered curation at the observed collection revision | | scene schema | No options | Discover bounded mesh, rig, pose, animation and UV commands. | | scene inspect PROJECT | --page PAGE --time SECONDS | Inspect saved 3D topology and sampled pose. | | scene command PROJECT | --page PAGE --revision N --file command.json [--apply] | Preview by default; --apply saves against the observed revision. | | observability summary | --scope owner\|all --days N --project-id ID --actor-id ID --channel NAME --kind NAME --status NAME --action ACTION | Read activity/usage/coverage. All-account scope requires configured operator; actor filter only in all scope. | | observability events | Summary filters plus --limit N --cursor CURSOR | Read safe paginated activity events. | | observability trace ID | --scope owner\|all --days N | Read correlated request steps within 1–30 days; default7. | | health · config | No required options | Read public health/configuration; never persist credentials. | | schema | --operations | Print document JSON Schema or targeted-operation schema. | | motion PROJECT_ID | --character ID --node ID --time SECONDS | Inspect reusable rigs and sample an instance pose without a provider call. | | catalog | No options | List bundled themes, templates, and blocks. | | themes list · get ID | No required options | Inspect design tokens and palettes. | | templates list · get ID | list: --kind KIND | Inspect supported starters. | | templates instantiate ID | --name NAME --theme ID --output FILE | Create a local document with fresh IDs; no server write. | | blocks list · get ID | get: --offset PIXELS | Inspect reusable node groups. | | design-systems schema · list | No required options | Discover the shared definition schema or your saved libraries. | | design-systems get ID | --system-version N | Read the latest or an immutable saved version. | | design-systems versions ID | No required options | List saved library versions. | | design-systems create | --file FILE required | Create a library from a validated definition; accepts stdin with --file -. | | design-systems update ID | --system-version N --file FILE required | Append a version using the version of the definition actually read; conflicts require reconciliation. | | design-systems apply ID PROJECT_ID | --revision N required; --system-version N | Apply saved tokens/system to an owned project and pin the selected library version. | | design-systems insert ID PROJECT_ID | --revision N --page PAGE_ID --item ITEM_ID required; --system-version N | Insert a saved component or composition into a project. | | design-systems remove ID | No required options | Delete the library and history; existing project designs remain intact. | | fonts | --query TEXT | Search Google font families/categories; inspect source for live/cache/fallback provenance. | | providers models ID | --query TEXT | Search the saved connection model catalog; custom endpoints retain manual IDs and labeled suggestions. | | projects list | --query TEXT --kind KIND --sort updated\|created\|name | Search persisted owned projects. | | projects check ID | No required options | Inspect saved design bounds, text fit, estimated contrast, media, and export limitations; never an accessibility certification. | | projects inspect ID | --output FILE required; --mode page\|overview --page INDEX or --page-id ID --revision N --time SECONDS --offset N --limit N --columns N --tile-size PX --max-dimension PX | Write one saved-page PNG or project contact sheet, plus JSON metadata without base64. Page selectors require page mode; default overview returns six pages. Follow nextOffset. | | projects overview | --output-dir DIR required; --offset N --limit N --time SECONDS --tile-size PX | Write owner-workspace first-page covers and JSON metadata. Default six projects in ID order; follow nextOffset. Empty results write no files. | | projects get ID | No required options | Read document and saved revision. | | projects create | --name NAME required; --description TEXT --kind KIND --template ID --theme ID --file FILE | Create a persisted project. Choose --file or --template. | | projects rename ID NAME | --revision N required | Rename with an explicit observed revision. | | projects clone ID | --name NAME | Create an independent project, copying owned media bytes. | | projects delete ID | No required options | Delete project, assets, and publications. | | brief get ID | No required options | Read the persisted interview, answers, scope, and independent brief revision. | | brief put ID | --revision N --file FILE required | Save request/interview/answers/scope; revision 0 creates. Input file excludes expectedRevision. Invalidates approval. | | brief interview ID | --revision N --provider ID required; --model ID | Generate and persist contextual questions/scope using configured BYOK; charges may apply. | | brief approve ID | --revision N required | Record explicit human approval of the current answered scope. Does not generate or publish. | | projects paint ID | --file FILE required | Render a stroke/fill with the paintingCommand revision, generation and operationId guards. | | projects document get ID | --output FILE | Read the canonical document. | | projects document put ID | --file FILE --revision N required; --brief-revision N for proposals | Save a complete validated document with atomic concurrency protection. | | projects document patch ID | --file FILE --revision N required | Apply a targeted operation array and save atomically. | | projects document merge ID | --file FILE required | Merge JSON {base, document, baseRevision} against the exact document/revision originally read; overlapping edits require reconciliation. Accepts - for stdin. | | projects document changes ID | --since N (default 0) | Read the current saved revision and project when changed, or unchanged: true at the observed revision. N must be nonnegative. | | projects import | --file FILE required; --name NAME | Create a new project from canonical JSON. | | projects thumbnail ID | --output FILE required; --revision N | Download a persisted private PNG cover. A busy request returns rendering status and retryAfterSeconds; retry before claiming a file exists. | | projects export ID | --format FORMAT required; --output FILE / --out FILE --page INDEX --revision N --start SECONDS --end SECONDS --fps FPS --review-samples COUNT --node ID | Download real server bytes. scene-angles uses end/review-samples (2–25); editable-scene uses node for canonical JSON. REST/MCP fields are reviewSamples and nodeId. Binary formats require a file. | | render | --file FILE --format json\|html\|svg required; --output FILE --page INDEX --time SECONDS | Render offline; preserves references without fetching private media. | | assets list PROJECT_ID | No required options | List stored assets. | | assets upload PROJECT_ID | --file FILE required; --mime TYPE | Upload media; placing it is a separate edit. | | assets download ASSET_ID | --output FILE required | Download authenticated bytes to a file. | | generate PROJECT_ID | --provider ID --revision N required; --prompt TEXT or --prompt-file FILE; --model ID --output FILE --mode document\|motion | Generate a proposal without saving; BYOK charges may apply. | | providers list · remove ID | No required options | Read masked configurations or remove a connection. | | providers set ID | --key-env VARIABLE or --key-stdin or --keep-key; --base-url URL --model ID; custom: --name NAME --protocol FORMAT --auth-method METHOD --auth-header HEADER | Otherwise reads PROVIDER_API_KEY, e.g. OPENAI_API_KEY. | | tokens list · revoke ID | No required options | List metadata or revoke access. | | tokens create | --name NAME required | Returns the newly created secret once. | | publish · unpublish PROJECT_ID | No required options | Create a public snapshot or remove all project snapshots. | | preview · unpreview PROJECT_ID | No required options | Create a public preview link or remove all project snapshots. | | share · unshare PROJECT_ID | No required options | Create a public share link or remove all project snapshots. | | media generate PROJECT_ID | --kind KIND --provider ID required; --prompt TEXT or --prompt-file FILE; --model ID --voice ID --source-asset ID --duration SECONDS --strength NUMBER | Generate/edit image, video, speech, music, or effects using compatible modes. | | media status PROJECT_ID JOB_ID | No required options | Poll queued fal media or Leonardo images. | | google-slides PROJECT_ID | --key-env VARIABLE or --key-stdin | Defaults to GOOGLE_ACCESS_TOKEN; creates a real supported presentation. | | api METHOD /api/path | --file FILE | Same-origin REST escape hatch; no JSON body for GET/HEAD. | ## See the saved design Visual inspection returns private rendered PNGs with project/page identity, saved revision, dimensions, sampled time, image index and pixel bounds. It does not publish, call an AI provider, or change the document or brief. Save and verify local browser changes first. ``` dsa projects inspect PROJECT_ID --revision OBSERVED_REVISION --output pages.png dsa projects inspect PROJECT_ID --mode page --page 0 --revision OBSERVED_REVISION --output page.png dsa projects overview --output-dir review ``` Project inspection defaults to a six-page contact sheet; workspace overview returns first-page covers of six owned projects in ID order. Follow non-null `nextOffset` with `--offset` to cover the rest. Use page mode for text and detail, selecting either `--page` or `--page-id`. Add `--time` to sample motion. A workspace result carries individual project revisions, not an atomic workspace snapshot. Open the returned PNG files with an image viewer before claiming visual review. CLI stdout contains metadata and `images[].path`/`bytes`, never raw base64. Workspace files use `workspace-OFFSET-IMAGE_INDEX.png`; repeating the same output replaces them. Failed API requests create no image files; empty results write none. A still image does not prove responsive behavior, playback, sound, or browser compatibility. Discover current limits through command help and [visualInspection/workspaceInspection schemas](https://studio.datxanhmientrung.ai/api/schema). Renderer asset and resource limits apply; failures are explicit. [REST](https://studio.datxanhmientrung.ai/docs/api) returns PNG base64; [MCP](https://studio.datxanhmientrung.ai/docs/mcp) and [WebMCP](https://studio.datxanhmientrung.ai/docs/webmcp) return real image blocks. The [agent review workflow](https://github.com/bestagentkits/design-studio-ai/blob/main/skills/design-studio-ai/references/visual-inspection.md) explains coverage and evidence. ## Files and exit codes JSON is the default for metadata. Document/template/export content sent to stdout is raw. `--output` writes the file and returns metadata; binary exports require a filename. Exit codes: **0** success, **1** input/API/conflict, **2** authentication/authorization, **3** network/invalid response, **4** local file/runtime error. ``` dsa providers set openai --key-env OPENAI_API_KEY dsa media generate PROJECT_ID --kind image --provider openai \ --source-asset ASSET_ID --prompt-file edit.txt dsa providers set fal --key-env FAL_API_KEY dsa media generate PROJECT_ID --kind audio --provider fal \ --duration 30 --prompt-file music.txt dsa media status PROJECT_ID JOB_ID ``` Source type selects a compatible default model. `--strength` is for fal image/audio transformations, `--voice` for OpenAI speech. All fal modes and Leonardo images queue real jobs; poll to completion before claiming an asset exists. The package is distributed through GitHub Releases, not the npm registry. [Command implementation](https://github.com/bestagentkits/design-studio-ai/blob/main/packages/cli/src/dsa.ts) --- Source: https://studio.datxanhmientrung.ai/docs/mcp # Network MCP > Connect remote agents through Streamable HTTP and OAuth. Connect a remote MCP client to the studio. Network tools work on persisted projects using your API key or an OAuth access token; they do not require an open editor tab. Streamable HTTP endpoint `https://studio.datxanhmientrung.ai/mcp`Authenticated · POST ## Connect with an API key In your client's remote-server configuration, choose HTTP/Streamable HTTP, enter the endpoint above, and configure `Authorization: Bearer` using your secure token input. Client configuration-file formats and environment interpolation vary; these are the connection parameters, not a universal import file. ``` URL: https://studio.datxanhmientrung.ai/mcp Transport: Streamable HTTP Authorization: Bearer Protocol: 2025-11-25 ``` ``` curl "$DESIGN_STUDIO_URL/mcp" \ -H "Authorization: Bearer $DESIGN_STUDIO_API_KEY" \ -H "Content-Type: application/json" \ -H "Accept: application/json, text/event-stream" \ -H "MCP-Protocol-Version: 2025-11-25" \ --data '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"my-design-agent","version":"1.0.0"}}}' ``` Use `get_design_brief` and `update_design_brief` to interview the human with your own agent model. `interview_design_brief` instead invokes the owner's configured BYOK provider. `approve_design_brief` requires explicit human approval of the current answered scope and its independent brief revision. `inspect_design` reads deterministic preflight findings; it is not a visual-quality certification. ## Inspect real images Call `inspect_project` with `projectId` and `mode: page` or `overview`, or call `inspect_workspace` for owned-project covers. The results contain PNG image blocks alongside text metadata, saved revisions and `nextOffset`. View the image blocks before judging quality; follow pagination and use page mode for fine details. These private reads render saved state without publishing or provider calls. See the [visual review workflow](https://studio.datxanhmientrung.ai/docs/cli) and live tool schemas for selection, sampling and limits. ## Connect with OAuth - Use the same remote URL and choose OAuth in a compatible client. - The client discovers the protected resource and authorization server, registers its redirect URI, and requests the `studio` scope. - Sign in to the studio and approve consent in the browser. Consent requires your account session. - The client exchanges the one-use code with S256 PKCE for access/refresh tokens, bound to the canonical `/mcp` resource. | Method | OAuth path | Purpose | | --- | --- | --- | | GET | /.well-known/oauth-protected-resource | Resource and authorization-server discovery | | GET | /.well-known/oauth-protected-resource/mcp | Path-specific resource discovery | | GET | /.well-known/oauth-authorization-server | Endpoints, grant types, PKCE, scope | | POST | /oauth/register | JSON client_name and redirect_uris; returns client_id | | GET / POST | /oauth/authorize | Browser consent; exact redirect, state, S256 challenge, resource | | POST | /oauth/token | Form-encoded authorization_code or refresh_token grant | | POST | /oauth/revoke | Form-encoded token and client_id; revokes its token family | Use HTTPS redirects or HTTP loopback for local clients. Resource must equal the canonical MCP endpoint. Access tokens last one hour; refresh tokens rotate. OAuth tokens cannot create/manage permanent API keys or provider credentials. GET event streams and protocol sessions are not used; supported versions are 2025-11-25 and the SDK's 2025-06-18/2025-03-26 compatibility. The newer 2026 transport is not advertised. ## Observe and reconcile human edits Use `get_design_changes` to observe saved revisions. Keep the exact document and revision you read as the base for `merge_design`; independent edits can merge, while overlapping changes return conflict paths. Resolve those changes explicitly. Never alter the base or invent a revision to bypass a conflict. ## Discover tools and resources Call `tools/list` to get the live input schemas. Tool names below are implemented; their descriptions identify reads, writes, publication, and potentially paid provider calls. ### Projects `list_projects``inspect_project``inspect_workspace``get_project_thumbnail``get_project``create_project``update_document``patch_document``delete_project` ### Collaboration `get_design_changes``merge_design` ### Brief and scope `get_design_brief``update_design_brief``interview_design_brief``approve_design_brief` ### Design resources `inspect_design``list_themes``list_templates``list_components``apply_theme` ### Design-system libraries `list_design_systems``get_design_system``list_design_system_versions``create_design_system``update_design_system``apply_design_system``insert_design_system_item``delete_design_system` ### Discovery `list_google_fonts``list_provider_models` ### Assets and delivery `upload_asset``list_assets``preview_project``unpreview_project``share_project``unshare_project``publish_project``unpublish_project``export_project` ### Generation `generate_design``generate_media``get_media_job` ``` curl "$DESIGN_STUDIO_URL/mcp" \ -H "Authorization: Bearer $DESIGN_STUDIO_API_KEY" \ -H "Content-Type: application/json" \ -H "Accept: application/json, text/event-stream" \ -H "MCP-Protocol-Version: 2025-11-25" \ --data '{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}' ``` Resources: `studio://schema`, `studio://operations`, and `studio://projects/{projectId}`. Writes such as `update_document`, `patch_document`, and `apply_theme` require `expectedRevision`. Library updates use expectedVersion; apply/insert use the observed project expectedRevision and an optional saved library version. Discovery query matches names/IDs/categories and reports live/cache/fallback provenance; provider model discovery requires an API key rather than MCP OAuth. React ZIP and GLB/glTF are returned as base64 resources by export_project, which also accepts optional expectedRevision. Binary MCP responses are limited to 20 MB; use CLI export for larger files. [Configure agent access](https://studio.datxanhmientrung.ai/?settings=agents) --- Source: https://studio.datxanhmientrung.ai/docs/webmcp # Browser WebMCP > Let an in-browser agent work with the open, unsaved canvas. EXPERIMENTAL BROWSER CAPABILITY WebMCP lets an in-browser agent work with the open editor, including its unsaved design. It is separate from the remote MCP server and uses the current signed-in browser session. **Feature detection, not a browser requirement** The editor detects `document.modelContext`, with `navigator.modelContext` as a legacy fallback. Open-document tools register while an editor is open; saved visual-inspection API tools also register in the signed-in workspace. Tools are cleaned up when their owning view changes or unmounts. Unsupported browsers retain the full workspace and network MCP. ## Open-document tools | Tool | Input | Effect | | --- | --- | --- | | studio_get_brief | {} | Read the saved interview, answers, scope, and independent brief revision. | | studio_update_brief | { expectedRevision, request?, interview?, answers?, scope? } | Persist a brief update, with revision zero for creation. Invalidates approval and opens the interview workspace. | | studio_approve_brief | { expectedRevision } | Approve the current answered scope only after explicit human agreement. Does not generate or publish. | | studio_inspect_design | {} | Read preflight hints for the current unsaved document. Does not change or save it; does not certify accessibility. | | studio_get_design | {} | Read the current unsaved document and saved revision. | | studio_update_node | { nodeId, patch } | Edit one existing node locally. Patch permits text, x, y, width, height, opacity, and rotation. Edits locally; live mode autosaves. | | studio_set_design | { document } | Replace the local document after full validation. Keep the open project's ID and kind. Edits locally; live mode autosaves. | | studio_save_design | {} | Save the current local document using the saved revision. Conflicts do not silently overwrite newer work. | ## 3D character authoring `studio_scene_command` previews or applies mesh conversion, remesh, joint lofts, explicit quadruped/winged rigs, named joint limits, weights, IK, wing-flap/roar clips, expressions and UV paint. Discover `sceneCommands` with `studio_capabilities`. Preview defaults true; set it false to apply locally. `studio_inspect_scene` reads topology and sampled pose diagnostics. Native geometry needs no provider key. Saved-state equivalents: REST GET/POST `/api/projects/:id/scene`, MCP `inspect_scene`/`author_scene`, and CLI `dsa scene inspect`/`dsa scene command`. Server commands require the observed revision; CLI previews unless `--apply` is supplied. `studio_imported_model` takes `pageId` and `nodeId` for GLB inventory; `convert:true` previews editable conversion and `preview:false` applies. `studio_frame_scene_shot` takes `pageId`, `nodeIds`, optional `samples` (2–61, default 17) and portrait/square `aspect`; it previews by default. Network clients use existing document/operations and editable-scene export. See [3D characters](https://studio.datxanhmientrung.ai/docs/3d) for conversion limits, importedClips, lighting/effects, framing, sound and timed review exports. ## Inspect saved images In the signed-in workspace and editor, `studio_api_post_projects_id_inspect` returns a page image or project contact sheet; `studio_api_post_projects_inspect` returns workspace covers. Both return actual PNG image blocks plus metadata. These API tools inspect saved content, so save and verify local changes first. They do not publish or invoke a provider. Follow `nextOffset` and actually view the images before claiming review. ``` { "parameters": { "id": "PROJECT_ID" }, "body": { "mode": "page", "pageIndex": 0, "expectedRevision": 1 } } ``` Use the revision actually read. Workspace input needs only `body` with optional offset, limit, time and tileSize. Discover exact schemas before calling; unsupported browsers can use network MCP or CLI. ## Shared operations and authenticated API tools Operation batches and document writes register compact input envelopes to fit browser host limits. Call `studio_capabilities` for the full nested schemas before writing. Execution still runs the canonical validators. `studio_apply_operations` accepts the shared operation schema for structured layouts, components, pages, meshes and timelines. `studio_capabilities` returns current schemas and documented endpoints. Tools named `studio_api_…` operate on saved server state, including library CRUD/version/apply/insert, discovery, export and asset upload. Pass path values in `parameters`, URL filters or pinned versions in `query`, and request payloads in `body`. For the asset-upload tool, pass `{ name, mimeType, base64 }` as body; it creates the real multipart file request. Uploading adds to the library without placing a node. Insert explicitly, or use shared `replace-asset` with observed `assetId` and `replacementId` to replace existing uses. Server ownership and revision checks still apply. ``` { "query": { "q": "Roboto" } } ``` Discover exact tool names and request schemas from the browser registry or [live OpenAPI reference](https://studio.datxanhmientrung.ai/api/openapi); registration follows the documented API surface. ``` { "nodeId": "ACTUAL_NODE_ID", "patch": { "text": "A clearer headline", "x": 64 } } ``` Read first, apply focused edits, and inspect the canvas. Save explicitly when live autosave is off; API tools always operate on saved server state. A browser agent does not receive provider secrets or permanent API keys through these tools. Check Settings → Agent access for the browser capability state. [Open the editor](https://studio.datxanhmientrung.ai/)[Check agent connections](https://studio.datxanhmientrung.ai/?settings=agents) --- Source: https://studio.datxanhmientrung.ai/docs/api-keys # API keys & access > Create, inject, and revoke credentials for your own workspace. ## One key for your agent's workspace. Create a named key in your signed-in account. Give each agent or environment its own key so you can revoke it independently. [Open API-key management](https://studio.datxanhmientrung.ai/?settings=agents) - Open Settings → Agent access and create a key with a recognizable name. - Copy the secret when shown. The list keeps metadata, not retrievable raw keys. - Store it in your agent's secret manager or environment as `DESIGN_STUDIO_API_KEY`. - Use the key ID to revoke it from Settings, CLI, or REST when access is no longer needed. ``` # DESIGN_STUDIO_API_KEY is supplied by your environment. dsa tokens list dsa tokens revoke TOKEN_ID ``` ## Know which credential you are using | Credential | Purpose | Management | | --- | --- | --- | | Application API key | Agent access to your studio account and projects. | Settings → Agent access; named, hashed at rest, revocable. | | Provider BYOK key | Authorize paid text/image/audio/video calls to your provider. | Settings → provider connections; encrypted at rest, masked on reads. | | MCP OAuth token | Scoped client authorization to project workflows. | OAuth consent/refresh/revocation; cannot manage permanent credentials. | | Browser session | Signed-in human UI and browser WebMCP. | HttpOnly cookie; cookie writes check the trusted Origin. | **Try authenticated requests in the REST playground** The REST playground can use a key held only in page memory, or your signed-in session. Executing a write changes the selected project. Clear the key after use. Never paste them into design prompts, public documents, source control, or published snapshots. --- Source: https://studio.datxanhmientrung.ai/docs/observability # Activity & usage > Trace actions, investigate errors, and inspect measured provider usage. Open [Activity & usage](https://studio.datxanhmientrung.ai/activity) to inspect your account’s request log, provider measurements and correlated traces. Templates and design systems have stable links at [/templates](https://studio.datxanhmientrung.ai/templates) and [/design-systems](https://studio.datxanhmientrung.ai/design-systems); opening these pages does not create or modify a project. ## Find a failed action - Choose a period, channel, operation kind or status. Project IDs narrow the view to a saved design. - Open a trace from the log, or paste the request ID shown in an API error. Instrumented responses return `X-Request-ID`. - Inspect HTTP, MCP tool, provider and export steps. A provider success can be followed by a document validation failure; reported usage remains visible. - Fix the diagnostic code or conflict before retrying. A running operation is different from a recently active account. Stale operations become interrupted/unknown. ## Usage without invented numbers Input/output tokens and USD costs come from explicit provider response fields. “Not reported” means unavailable, not zero. Coverage shows how many calls have measurements; sums may be partial. Media polling does not count as another generation. Latency and failure rates help identify slow or unreliable actions; they do not measure design quality. ## Agent access ``` dsa observability summary --days 7 dsa observability events --status error --limit 25 dsa observability trace REQUEST_ID --days 30 ``` REST uses `GET /api/observability/summary`, `GET /api/observability/events`, and `GET /api/observability/trace/:id`. Network MCP tools are `get_observability_summary`, `list_activity_events`, and `get_activity_trace`. Browser WebMCP exposes `studio_api_get_observability_summary`, `studio_api_get_observability_events`, and `studio_api_get_observability_trace_id`. All use the same server authorization. ## Privacy and operator access The default `scope=owner` shows your account. All-account inspection requires an account ID explicitly listed in server `OBSERVABILITY_ADMIN_IDS` plus session or API-key authentication. MCP OAuth cannot use `scope=all`. Logs retain safe metadata for 30 days; they exclude prompts, design text, raw exception messages, credentials and arbitrary URLs. ## PostHog and coverage First-party browser events use the strict schema on `POST /api/observability/client-events`. Optional PostHog forwarding requires `POSTHOG_PROJECT_KEY` and the project’s verified `POSTHOG_HOST`. Cloud hosts are `https://us.i.posthog.com` and `https://eu.i.posthog.com`. No DOM autocapture, session replay or email identification is enabled. This follows the [PostHog capture API](https://posthog.com/docs/api/capture). Coverage reports storage state, dropped writes and PostHog delivery failures. Runtime health counters reset when an instance restarts and do not represent a global durable outage history. Tracking failure never retries a billed design operation. ## Editor controls Shift-click canvas objects or layers to build a selection. Use the editor’s keyboard-shortcut help for select all, duplicate, grouping, undo/redo, delete and coarse/fine nudging. Text editing preserves canvas typography; font search previews the visible families. Install the complete `skills/design-studio-ai` directory, including its design-kind references, so agents use the matching layout and quality guidance. --- Source: https://studio.datxanhmientrung.ai/docs/self-hosting # Self-hosting & resources > Run the same studio on your own infrastructure. The same API runs on Cloudflare D1/R2 with Browser Rendering, or on Node 24+ with SQLite, files, and Chromium. Use the public studio or deploy your own copy under the MIT license. ``` npm ci npm ci --prefix packages/cli npm run build:cli npx playwright install chromium npm run build # Set a stable 32-byte base64 ENCRYPTION_KEY and APP_URL # in the server process environment before starting. npm start ``` Node does not automatically load dotenv files. Keep the encryption key stable across restarts to retain access to encrypted provider keys. Set `APP_URL` to the canonical external origin and preserve `DATA_DIR` with its database and assets. ``` # Supply ENCRYPTION_KEY and APP_URL in the Compose environment. docker compose up --build -d docker compose logs --tail=100 studio ``` The container binds to `0.0.0.0:8787`; Compose persists `/data` in a named volume. Use HTTPS at a reverse proxy for public hosting. Cloudflare operators provision their own D1/R2/browser bindings, apply migrations, and set secrets before deploying. ## Export boundaries - Import remote media before cloud binary export; the renderer has no external network access. - Rendering is bounded by bytes and pixels: 16 megapixels per checked object/page and 64 megapixels per workload. - WebM records actual motion; MP4 requires a supported encoder. Cloud motion is limited to 60 seconds. Browser and cloud motion exports share timeline audio cue timing and mixing; listen to the actual output. - SVG is static. HTML may include the trusted interactive viewer. PPTX preserves legacy editable text/primitives and rasterizes structured layouts/components. React exports runnable frontend source with the document, component runtime and embedded media; GLB/glTF export scene geometry, materials, skinning and sampled animation. - Selected Google Fonts are fetched from official font hosts with byte/time limits and embedded before isolated rendering. Local fonts need no font request; unavailable selected Google fonts return an explicit export error. - Google Slides supports native text/shapes/HTTPS images; unsupported complex/private-image content fails explicitly. - Provider and Google success require your credentials and account access. Browser WebMCP remains experimental. [Deployment, secrets & backups](https://github.com/bestagentkits/design-studio-ai/blob/main/docs/deployment.md)[BYOK model capabilities](https://github.com/bestagentkits/design-studio-ai/blob/main/docs/providers.md)[CLI and skill release](https://github.com/bestagentkits/design-studio-ai/releases/tag/v0.4.3)[MIT license](https://github.com/bestagentkits/design-studio-ai/blob/main/LICENSE) Dependency audit findings and their runtime boundaries are disclosed in the deployment guide. Successful rendering tests do not mean the dependency tree is audit-clean. --- Source: https://studio.datxanhmientrung.ai/guide # Your first idea, made visible. You bring the intent. Your agent helps with the design. A few thoughtful steps turn the conversation into something you can use. [Let's make something](https://studio.datxanhmientrung.ai/guide#start)Describe it Refine it Share it A little more room for a good idea. Start with what you want to say. [0 1 Choose a starting point](https://studio.datxanhmientrung.ai/guide#start)[0 2 Describe the outcome](https://studio.datxanhmientrung.ai/guide#brief)[0 3 Refine through conversation](https://studio.datxanhmientrung.ai/guide#conversation)[0 4 Make it yours](https://studio.datxanhmientrung.ai/guide#preview)[0 5 Export or share](https://studio.datxanhmientrung.ai/guide#deliver)[0 6 Connect an agent](https://studio.datxanhmientrung.ai/guide#agents) 01 BEGIN WITH A CANVAS ## Choose a starting point. Open the studio and sign in. Write your idea on the homepage and choose Let’s create to save a project and begin its design interview. You can also start from a template when its structure suits your idea, or choose a blank project. Websites, slides, reports, wireframes, 3D scenes, and videos share the same editable workspace. **No provider key needed to explore.** Templates and manual edits work on their own. Add your own AI-provider connection in Settings when you're ready to generate a design or media. Design Studio AI ![The Design Studio project library and template choices on a desktop screen](https://studio.datxanhmientrung.ai/guide/assets/home-desktop.png) Choose the kind of work you want to make, then open a starter or a blank project. 02 MAKE THE BRIEF USEFUL ## Describe the outcome, not every pixel. A useful brief explains who this is for, what they should understand or do, what content is real, and how the design should feel. Give the agent your constraints before asking it to fill the canvas. WHO ### Who is looking? A first-time visitor, a customer, your team, or an investor? WHAT ### What should happen? Understand an idea, compare options, book a class, or take a next step? WITHIN ### What must stay true? Your approved copy, actual data, brand, dimensions, deadline, and assets. STARTER BRIEF Create a calm, welcoming landing page for a neighborhood ceramics studio. Help beginners understand the classes and book their first workshop. Use warm ivory, clay accents, large readable type, and generous spacing. Include a short introduction, three class options, and a clear booking button. Start with a desktop layout, then check it at a smaller viewport. Adapt the details to your real project. If you're unsure, ask the agent to interview you first: “Ask me the few questions you need to clarify the audience, scope, content, and success criteria.” The studio saves your brief, questions, answers, and scope so you or a connected agent can continue later. 03 WORK THROUGH THE CONVERSATION ## Agree on the scope. Then make the first draft. Choose Ask AI to start the interview with a configured text provider. Answer the contextual questions, choose Save answers, and Continue interview until the direction is clear. If you prefer another agent, choose Use your own agent; you can also Write scope manually. **Make approval a deliberate step.** Review Objective, Audience, Visual direction, Deliverables, Constraints, and Acceptance criteria. Use Save scope, then Approve scope. Editing the brief again requires fresh approval. The separate Generate design action creates and saves the first validated draft; it does not publish. You can Open editor to work manually while the brief remains unapproved. Reload latest brief picks up changes from an external agent. Once a draft exists, use project chat for focused refinements, then review a proposal before applying and saving it. EXAMPLE REFINEMENT REQUESTS You Keep the layout. Make the headline shorter and give the introduction more breathing room. You Use the same type scale on every slide. Keep the approved product copy unchanged. You Before we add another section, tell me whether it helps the visitor book a class. Ask for focused changes instead of starting over each time. Treat facts, figures, and product claims as your source material; ask the agent to request missing information rather than invent it. **Generation uses your provider account.** Text, image, speech, music/effects, and video calls need compatible BYOK connections and may incur charges. Creating or editing media sends your selected source to that provider; it doesn't automatically publish the source. 04 KEEP YOUR HAND ON THE DESIGN ## Inspect it. Make it yours. Select an object to refine its text, position, dimensions, color, or other supported properties. Use pages and layers to navigate a larger design, switch themes for a coherent starting palette, and save once the result feels right. Design Studio AI ![The Design Studio editor showing the conversation panel, editable preview, and object inspector](https://studio.datxanhmientrung.ai/guide/assets/editor-desktop.png) Conversation, preview, and manual controls stay close together so you can inspect a change before saving. ### A quick quality pass Can you read every headline and body line at the intended size? Do spacing, alignment, and typography feel consistent? Are real images, data, and approved words preserved? Does the main action stand out without competing messages? Does the design still work at a smaller viewport? For motion, are captions readable and timing intentional? The design preflight can flag likely overflow, text fitting, estimated contrast, and missing media. Use these findings to guide inspection; automated checks do not certify accessibility or aesthetics. Another person or agent may edit the same project. If saving reports a revision conflict, reload and reconcile the changes. Don't overwrite newer work blindly. In 3D, geometry/material/object rotation persist; orbit-camera changes are temporary preview state. 05 MAKE THE OUTPUT USEFUL ## Export the file. Share the right version. Choose an output for the person who will use it. Open the exported file and check its contents. Save before exporting or publishing so you're delivering the revision you inspected. ### For a visual PNG for a rendered page. SVG for supported static vector structure. ### For a document PDF for pages. PowerPoint for editable text/shapes with complex content rasterized. ### For the web HTML for a standalone design, including the trusted 3D/timeline viewer where supported. ### For motion [Character rigging, clips, skins and native motion packages](https://studio.datxanhmientrung.ai/docs/motion) WebM for recorded timeline output. MP4 when the runtime has a supported encoder. ### Publishing makes a public snapshot. It includes referenced snapshot assets. Later private edits don't change that link. Use Unpublish to remove the project's public snapshots. Cloud binary export needs imported project assets for remote media and enforces size limits. Motion is limited to 60 seconds. Cloud recordings mix imported audio/video; browser fallback is silent. Google Slides needs Google authorization and supports native text/shapes/HTTPS images, with explicit errors for unsupported content. 06 LET YOUR AGENT JOIN THE WORKSPACE ## The same design, from another tool. Use the studio directly, or connect the agent you already work with. Your agent reads the same project, makes targeted edits, and saves with the same revision protection. [### API key & CLI Create a named key, inject it securely, and use the released dsa CLI. Manage access](https://studio.datxanhmientrung.ai/?settings=agents)[### Remote MCP Connect through Streamable HTTP with an API key or OAuth consent. Connection guide](https://studio.datxanhmientrung.ai/docs/mcp)[### Browser WebMCP In supported browsers, let an agent edit the open canvas and save explicitly. Browser tools](https://studio.datxanhmientrung.ai/docs/webmcp) ## Share something useful. Publish a reviewed design to [Community](https://studio.datxanhmientrung.ai/community), explore by category, or download a design package to make your own. Your private work stays private until you confirm the public version and license. [Learn about publishing and remixing](https://studio.datxanhmientrung.ai/docs/community). A FEW THINGS YOU MIGHT WONDER ## Before you begin. ### Do I need to know how to code? No. You can create from a template, describe changes in chat, and use the manual editor. The CLI and APIs are available when you want to connect another agent or automate a workflow. ### Is an AI-provider key included? No. You bring your own provider credentials and model access. Template selection and manual editing work without a provider. Generation calls use your account and may incur charges. ### Will the agent automatically publish my work? Generating a proposal, saving a project, and publishing a public snapshot are separate operations. Tell your agent what sharing is authorized, and inspect the saved version before publication. ### Can I edit a generated image or video? Compatible OpenAI/fal modes accept a source asset owned by the project. Image, video, and audio transformations have provider-specific requirements. Check the provider guide before choosing a model or source. ### Why does an exported file look different? Different formats preserve different structures. SVG is static, PowerPoint rasterizes complex nodes, and Google Slides supports a smaller set of native elements. Always inspect the actual file; export support does not mean full editable parity. ## Start with one clear idea. You can refine the details together. [Open Design Studio](https://studio.datxanhmientrung.ai/)[Or explore the documentation](https://studio.datxanhmientrung.ai/docs) [Design Studio AI](https://studio.datxanhmientrung.ai/)Open source · MIT licensed [Documentation](https://studio.datxanhmientrung.ai/docs)