{
  "schemaVersion": "1.0",
  "item": {
    "slug": "sleek-design-mobile-apps",
    "name": "Desing mobile apps",
    "source": "tencent",
    "type": "skill",
    "category": "内容创作",
    "sourceUrl": "https://clawhub.ai/stefanofa/sleek-design-mobile-apps",
    "canonicalUrl": "https://clawhub.ai/stefanofa/sleek-design-mobile-apps",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/sleek-design-mobile-apps",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=sleek-design-mobile-apps",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-23T16:43:11.935Z",
      "expiresAt": "2026-04-30T16:43:11.935Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
        "contentDisposition": "attachment; filename=\"4claw-imageboard-1.0.1.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/sleek-design-mobile-apps"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/sleek-design-mobile-apps",
    "agentPageUrl": "https://openagent3.xyz/skills/sleek-design-mobile-apps/agent",
    "manifestUrl": "https://openagent3.xyz/skills/sleek-design-mobile-apps/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/sleek-design-mobile-apps/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Overview",
        "body": "sleek.design is an AI-powered mobile app design tool. You interact with it via a REST API at /api/v1/* to create projects, describe what you want built in plain language, and get back rendered screens. All communication is standard HTTP with bearer token auth.\n\nBase URL: https://sleek.design\nAuth: Authorization: Bearer $SLEEK_API_KEY on every /api/v1/* request\nContent-Type: application/json (requests and responses)\nCORS: Enabled on all /api/v1/* endpoints"
      },
      {
        "title": "Prerequisites: API Key",
        "body": "Create API keys at https://sleek.design/dashboard/api-keys. The full key value is shown only once at creation — store it in the SLEEK_API_KEY environment variable.\n\nRequired plan: Pro+ (API access is gated)"
      },
      {
        "title": "Key scopes",
        "body": "ScopeWhat it unlocksprojects:readList / get projectsprojects:writeCreate / delete projectscomponents:readList components in a projectchats:readGet chat run statuschats:writeSend chat messagesscreenshotsRender component screenshots\n\nCreate a key with only the scopes needed for the task."
      },
      {
        "title": "Security & Privacy",
        "body": "Single host: All requests go exclusively to https://sleek.design. No data is sent to third parties.\nHTTPS only: All communication uses HTTPS. The API key is transmitted only in the Authorization header to Sleek endpoints.\nMinimal scopes: Create API keys with only the scopes required for the task. Prefer short-lived or revocable keys.\nImage URLs: When using imageUrls in chat messages, those URLs are fetched by Sleek's servers. Avoid passing URLs that contain sensitive content."
      },
      {
        "title": "Handling high-level requests",
        "body": "When the user says something like \"design a fitness tracking app\" or \"build me a settings screen\":\n\nCreate a project if one doesn't exist yet (ask the user for a name, or derive one from the request)\nSend a chat message describing what to build — you can use the user's words directly as message.text; Sleek's AI interprets natural language\nFollow the screenshot delivery rule below to show the result\n\nYou do not need to decompose the request into screens first. Send the full intent as a single message and let Sleek decide what screens to create."
      },
      {
        "title": "Screenshot delivery rule",
        "body": "After every chat run that produces screen_created or screen_updated operations, always take screenshots and show them to the user. Never silently complete a chat run without delivering the visuals.\n\nWhen screens are created for the first time on a project (i.e. the run includes screen_created operations), deliver:\n\nOne screenshot per newly created screen (individual componentIds: [screenId])\nOne combined screenshot of all screens in the project (componentIds: [all screen ids])\n\nWhen only existing screens are updated, deliver one screenshot per affected screen.\n\nUse background: \"transparent\" for all screenshots unless the user explicitly requests otherwise."
      },
      {
        "title": "Quick Reference — All Endpoints",
        "body": "MethodPathScopeDescriptionGET/api/v1/projectsprojects:readList projectsPOST/api/v1/projectsprojects:writeCreate projectGET/api/v1/projects/:idprojects:readGet projectDELETE/api/v1/projects/:idprojects:writeDelete projectGET/api/v1/projects/:id/componentscomponents:readList componentsPOST/api/v1/projects/:id/chat/messageschats:writeSend chat messageGET/api/v1/projects/:id/chat/runs/:runIdchats:readPoll run statusPOST/api/v1/screenshotsscreenshotsRender screenshot\n\nAll IDs are stable string identifiers."
      },
      {
        "title": "Projects",
        "body": "List projects\n\nGET /api/v1/projects?limit=50&offset=0\nAuthorization: Bearer $SLEEK_API_KEY\n\nResponse 200:\n\n{\n  \"data\": [\n    {\n      \"id\": \"proj_abc\",\n      \"name\": \"My App\",\n      \"slug\": \"my-app\",\n      \"createdAt\": \"2026-01-01T00:00:00Z\",\n      \"updatedAt\": \"...\"\n    }\n  ],\n  \"pagination\": { \"total\": 12, \"limit\": 50, \"offset\": 0 }\n}\n\nCreate project\n\nPOST /api/v1/projects\nAuthorization: Bearer $SLEEK_API_KEY\nContent-Type: application/json\n\n{ \"name\": \"My New App\" }\n\nResponse 201 — same shape as a single project.\n\nGet / Delete project\n\nGET    /api/v1/projects/:projectId\nDELETE /api/v1/projects/:projectId   → 204 No Content"
      },
      {
        "title": "Components",
        "body": "List components\n\nGET /api/v1/projects/:projectId/components?limit=50&offset=0\nAuthorization: Bearer $SLEEK_API_KEY\n\nResponse 200:\n\n{\n  \"data\": [\n    {\n      \"id\": \"cmp_xyz\",\n      \"name\": \"Hero Section\",\n      \"activeVersion\": 3,\n      \"versions\": [{ \"id\": \"ver_001\", \"version\": 1, \"createdAt\": \"...\" }],\n      \"createdAt\": \"...\",\n      \"updatedAt\": \"...\"\n    }\n  ],\n  \"pagination\": { \"total\": 5, \"limit\": 50, \"offset\": 0 }\n}"
      },
      {
        "title": "Chat — Send Message",
        "body": "This is the core action: describe what you want in message.text and the AI creates or modifies screens.\n\nPOST /api/v1/projects/:projectId/chat/messages?wait=false\nAuthorization: Bearer $SLEEK_API_KEY\nContent-Type: application/json\nidempotency-key: <optional, max 255 chars>\n\n{\n  \"message\": { \"text\": \"Add a pricing section with three tiers\" },\n  \"imageUrls\": [\"https://example.com/ref.png\"],\n  \"target\": { \"screenId\": \"scr_abc\" }\n}\n\nFieldRequiredNotesmessage.textYes1+ chars, trimmedimageUrlsNoHTTPS URLs only; included as visual contexttarget.screenIdNoEdit a specific screen; omit to let AI decide?wait=true/falseNoSync wait mode (default: false)idempotency-key headerNoReplay-safe re-sends\n\nResponse — async (default, wait=false)\n\nStatus 202 Accepted. result and error are absent until the run reaches a terminal state.\n\n{\n  \"data\": {\n    \"runId\": \"run_111\",\n    \"status\": \"queued\",\n    \"statusUrl\": \"/api/v1/projects/proj_abc/chat/runs/run_111\"\n  }\n}\n\nResponse — sync (wait=true)\n\nBlocks up to 300 seconds. Returns 200 when completed, 202 if timed out.\n\n{\n  \"data\": {\n    \"runId\": \"run_111\",\n    \"status\": \"completed\",\n    \"statusUrl\": \"...\",\n    \"result\": {\n      \"assistantText\": \"I added a pricing section with...\",\n      \"operations\": [\n        { \"type\": \"screen_created\", \"screenId\": \"scr_xyz\", \"screenName\": \"Pricing\" },\n        { \"type\": \"screen_updated\", \"screenId\": \"scr_abc\" },\n        { \"type\": \"theme_updated\" }\n      ]\n    }\n  }\n}"
      },
      {
        "title": "Chat — Poll Run Status",
        "body": "Use this after async send to check progress.\n\nGET /api/v1/projects/:projectId/chat/runs/:runId\nAuthorization: Bearer $SLEEK_API_KEY\n\nResponse — same shape as send message data object:\n\n{\n  \"data\": {\n    \"runId\": \"run_111\",\n    \"status\": \"queued\",\n    \"statusUrl\": \"...\"\n  }\n}\n\nWhen completed successfully, result is present:\n\n{\n  \"data\": {\n    \"runId\": \"run_111\",\n    \"status\": \"completed\",\n    \"statusUrl\": \"...\",\n    \"result\": {\n      \"assistantText\": \"...\",\n      \"operations\": [...]\n    }\n  }\n}\n\nWhen failed, error is present:\n\n{\n  \"data\": {\n    \"runId\": \"run_111\",\n    \"status\": \"failed\",\n    \"statusUrl\": \"...\",\n    \"error\": { \"code\": \"execution_failed\", \"message\": \"...\" }\n  }\n}\n\nRun status lifecycle: queued → running → completed | failed"
      },
      {
        "title": "Screenshots",
        "body": "Takes a snapshot of one or more rendered components.\n\nPOST /api/v1/screenshots\nAuthorization: Bearer $SLEEK_API_KEY\nContent-Type: application/json\n\n{\n  \"componentIds\": [\"cmp_xyz\", \"cmp_abc\"],\n  \"projectId\": \"proj_abc\",\n  \"format\": \"png\",\n  \"scale\": 2,\n  \"gap\": 40,\n  \"padding\": 40,\n  \"background\": \"transparent\"\n}\n\nFieldDefaultNotesformatpngpng or webpscale21–3 (device pixel ratio)gap40Pixels between componentspadding40Uniform padding on all sidespaddingX(optional)Horizontal padding; overrides padding for left/right when providedpaddingY(optional)Vertical padding; overrides padding for top/bottom when providedpaddingTop(optional)Top padding; overrides paddingY when providedpaddingRight(optional)Right padding; overrides paddingX when providedpaddingBottom(optional)Bottom padding; overrides paddingY when providedpaddingLeft(optional)Left padding; overrides paddingX when providedbackgroundtransparentAny CSS color (hex, named, transparent)showDotsfalseOverlay a subtle dot grid on the background\n\nPadding resolves with a cascade: per-side → axis → uniform. For example, paddingTop falls back to paddingY, which falls back to padding. So { \"padding\": 20, \"paddingX\": 10, \"paddingLeft\": 5 } gives top/bottom 20px, right 10px, left 5px.\n\nWhen showDots is true, a dot pattern is drawn over the background color. The dots automatically adapt to the background: dark backgrounds get light dots, light backgrounds get dark dots. This has no effect when background is \"transparent\".\n\nAlways use \"background\": \"transparent\" unless the user explicitly requests a specific background color.\n\nResponse: raw binary image/png or image/webp with Content-Disposition: attachment."
      },
      {
        "title": "Error Shapes",
        "body": "{ \"code\": \"UNAUTHORIZED\", \"message\": \"...\" }\n\nHTTPCodeWhen401UNAUTHORIZEDMissing/invalid/expired API key403FORBIDDENValid key, wrong scope or plan404NOT_FOUNDResource doesn't exist400BAD_REQUESTValidation failure409CONFLICTAnother run is active for this project500INTERNAL_SERVER_ERRORServer error\n\nChat run-level errors (inside data.error):\n\nCodeMeaningout_of_creditsOrganization has no credits leftexecution_failedAI execution error"
      },
      {
        "title": "Flow 1: Create project and generate a UI (async + polling)",
        "body": "1. POST /api/v1/projects                              → get projectId\n2. POST /api/v1/projects/:id/chat/messages            → get runId (202)\n3. Poll GET /api/v1/projects/:id/chat/runs/:runId\n   until status == \"completed\" or \"failed\"\n4. Collect screenIds from result.operations\n   (screen_created and screen_updated entries)\n5. Screenshot each affected screen individually\n6. If any screen_created: also screenshot all project screens combined\n7. Show all screenshots to the user\n\nPolling recommendation: start at 2s interval, back off to 5s after 10s, give up after 5 minutes."
      },
      {
        "title": "Flow 2: Sync mode (simple, blocking)",
        "body": "Best for short tasks or when latency is acceptable.\n\n1. POST /api/v1/projects/:id/chat/messages?wait=true\n   → blocks up to 300s\n   → 200 if completed, 202 if timed out\n2. If 202, fall back to Flow 1 polling with the returned runId\n3. On completion, screenshot and show affected screens (see screenshot delivery rule)"
      },
      {
        "title": "Flow 3: Edit a specific screen",
        "body": "1. GET /api/v1/projects/:id/components         → find screenId\n2. POST /api/v1/projects/:id/chat/messages\n   body: { message: { text: \"...\" }, target: { screenId: \"scr_xyz\" } }\n3. Poll or wait as above\n4. Screenshot the updated screen and show it to the user"
      },
      {
        "title": "Flow 4: Idempotent message (safe retries)",
        "body": "Add idempotency-key header on the send request. If the network drops and you retry with the same key, the server returns the existing run rather than creating a duplicate. The key must be ≤255 chars.\n\nPOST /api/v1/projects/:id/chat/messages\nidempotency-key: my-unique-request-id-abc123"
      },
      {
        "title": "Flow 5: One run at a time (conflict handling)",
        "body": "Only one active run is allowed per project. If you send a message while one is running, you get 409 CONFLICT. Wait for the active run to complete before sending the next message.\n\n409 response → poll existing run → completed → send next message"
      },
      {
        "title": "Pagination",
        "body": "All list endpoints accept limit (1–100, default 50) and offset (≥0). The response always includes pagination.total so you can page through all results.\n\nGET /api/v1/projects?limit=10&offset=20"
      },
      {
        "title": "Common Mistakes",
        "body": "MistakeFixSending to /api/v1 without Authorization headerAdd Authorization: Bearer $SLEEK_API_KEY to every requestUsing wrong scopeCheck key's scopes match the endpoint (e.g. chats:write for sending messages)Sending next message before run completesPoll until completed/failed before next sendUsing wait=true on long generationsIt blocks 300s max; have a fallback to polling for 202 responseHTTP URLs in imageUrlsOnly HTTPS URLs are acceptedAssuming result is present on 202result is absent until status is completed"
      }
    ],
    "body": "Designing with Sleek\n\nOverview\n\nsleek.design is an AI-powered mobile app design tool. You interact with it via a REST API at /api/v1/* to create projects, describe what you want built in plain language, and get back rendered screens. All communication is standard HTTP with bearer token auth.\n\nBase URL: https://sleek.design Auth: Authorization: Bearer $SLEEK_API_KEY on every /api/v1/* request Content-Type: application/json (requests and responses) CORS: Enabled on all /api/v1/* endpoints\n\nPrerequisites: API Key\n\nCreate API keys at https://sleek.design/dashboard/api-keys. The full key value is shown only once at creation — store it in the SLEEK_API_KEY environment variable.\n\nRequired plan: Pro+ (API access is gated)\n\nKey scopes\nScope\tWhat it unlocks\nprojects:read\tList / get projects\nprojects:write\tCreate / delete projects\ncomponents:read\tList components in a project\nchats:read\tGet chat run status\nchats:write\tSend chat messages\nscreenshots\tRender component screenshots\n\nCreate a key with only the scopes needed for the task.\n\nSecurity & Privacy\nSingle host: All requests go exclusively to https://sleek.design. No data is sent to third parties.\nHTTPS only: All communication uses HTTPS. The API key is transmitted only in the Authorization header to Sleek endpoints.\nMinimal scopes: Create API keys with only the scopes required for the task. Prefer short-lived or revocable keys.\nImage URLs: When using imageUrls in chat messages, those URLs are fetched by Sleek's servers. Avoid passing URLs that contain sensitive content.\nHandling high-level requests\n\nWhen the user says something like \"design a fitness tracking app\" or \"build me a settings screen\":\n\nCreate a project if one doesn't exist yet (ask the user for a name, or derive one from the request)\nSend a chat message describing what to build — you can use the user's words directly as message.text; Sleek's AI interprets natural language\nFollow the screenshot delivery rule below to show the result\n\nYou do not need to decompose the request into screens first. Send the full intent as a single message and let Sleek decide what screens to create.\n\nScreenshot delivery rule\n\nAfter every chat run that produces screen_created or screen_updated operations, always take screenshots and show them to the user. Never silently complete a chat run without delivering the visuals.\n\nWhen screens are created for the first time on a project (i.e. the run includes screen_created operations), deliver:\n\nOne screenshot per newly created screen (individual componentIds: [screenId])\nOne combined screenshot of all screens in the project (componentIds: [all screen ids])\n\nWhen only existing screens are updated, deliver one screenshot per affected screen.\n\nUse background: \"transparent\" for all screenshots unless the user explicitly requests otherwise.\n\nQuick Reference — All Endpoints\nMethod\tPath\tScope\tDescription\nGET\t/api/v1/projects\tprojects:read\tList projects\nPOST\t/api/v1/projects\tprojects:write\tCreate project\nGET\t/api/v1/projects/:id\tprojects:read\tGet project\nDELETE\t/api/v1/projects/:id\tprojects:write\tDelete project\nGET\t/api/v1/projects/:id/components\tcomponents:read\tList components\nPOST\t/api/v1/projects/:id/chat/messages\tchats:write\tSend chat message\nGET\t/api/v1/projects/:id/chat/runs/:runId\tchats:read\tPoll run status\nPOST\t/api/v1/screenshots\tscreenshots\tRender screenshot\n\nAll IDs are stable string identifiers.\n\nEndpoints\nProjects\nList projects\nGET /api/v1/projects?limit=50&offset=0\nAuthorization: Bearer $SLEEK_API_KEY\n\n\nResponse 200:\n\n{\n  \"data\": [\n    {\n      \"id\": \"proj_abc\",\n      \"name\": \"My App\",\n      \"slug\": \"my-app\",\n      \"createdAt\": \"2026-01-01T00:00:00Z\",\n      \"updatedAt\": \"...\"\n    }\n  ],\n  \"pagination\": { \"total\": 12, \"limit\": 50, \"offset\": 0 }\n}\n\nCreate project\nPOST /api/v1/projects\nAuthorization: Bearer $SLEEK_API_KEY\nContent-Type: application/json\n\n{ \"name\": \"My New App\" }\n\n\nResponse 201 — same shape as a single project.\n\nGet / Delete project\nGET    /api/v1/projects/:projectId\nDELETE /api/v1/projects/:projectId   → 204 No Content\n\nComponents\nList components\nGET /api/v1/projects/:projectId/components?limit=50&offset=0\nAuthorization: Bearer $SLEEK_API_KEY\n\n\nResponse 200:\n\n{\n  \"data\": [\n    {\n      \"id\": \"cmp_xyz\",\n      \"name\": \"Hero Section\",\n      \"activeVersion\": 3,\n      \"versions\": [{ \"id\": \"ver_001\", \"version\": 1, \"createdAt\": \"...\" }],\n      \"createdAt\": \"...\",\n      \"updatedAt\": \"...\"\n    }\n  ],\n  \"pagination\": { \"total\": 5, \"limit\": 50, \"offset\": 0 }\n}\n\nChat — Send Message\n\nThis is the core action: describe what you want in message.text and the AI creates or modifies screens.\n\nPOST /api/v1/projects/:projectId/chat/messages?wait=false\nAuthorization: Bearer $SLEEK_API_KEY\nContent-Type: application/json\nidempotency-key: <optional, max 255 chars>\n\n{\n  \"message\": { \"text\": \"Add a pricing section with three tiers\" },\n  \"imageUrls\": [\"https://example.com/ref.png\"],\n  \"target\": { \"screenId\": \"scr_abc\" }\n}\n\nField\tRequired\tNotes\nmessage.text\tYes\t1+ chars, trimmed\nimageUrls\tNo\tHTTPS URLs only; included as visual context\ntarget.screenId\tNo\tEdit a specific screen; omit to let AI decide\n?wait=true/false\tNo\tSync wait mode (default: false)\nidempotency-key header\tNo\tReplay-safe re-sends\nResponse — async (default, wait=false)\n\nStatus 202 Accepted. result and error are absent until the run reaches a terminal state.\n\n{\n  \"data\": {\n    \"runId\": \"run_111\",\n    \"status\": \"queued\",\n    \"statusUrl\": \"/api/v1/projects/proj_abc/chat/runs/run_111\"\n  }\n}\n\nResponse — sync (wait=true)\n\nBlocks up to 300 seconds. Returns 200 when completed, 202 if timed out.\n\n{\n  \"data\": {\n    \"runId\": \"run_111\",\n    \"status\": \"completed\",\n    \"statusUrl\": \"...\",\n    \"result\": {\n      \"assistantText\": \"I added a pricing section with...\",\n      \"operations\": [\n        { \"type\": \"screen_created\", \"screenId\": \"scr_xyz\", \"screenName\": \"Pricing\" },\n        { \"type\": \"screen_updated\", \"screenId\": \"scr_abc\" },\n        { \"type\": \"theme_updated\" }\n      ]\n    }\n  }\n}\n\nChat — Poll Run Status\n\nUse this after async send to check progress.\n\nGET /api/v1/projects/:projectId/chat/runs/:runId\nAuthorization: Bearer $SLEEK_API_KEY\n\n\nResponse — same shape as send message data object:\n\n{\n  \"data\": {\n    \"runId\": \"run_111\",\n    \"status\": \"queued\",\n    \"statusUrl\": \"...\"\n  }\n}\n\n\nWhen completed successfully, result is present:\n\n{\n  \"data\": {\n    \"runId\": \"run_111\",\n    \"status\": \"completed\",\n    \"statusUrl\": \"...\",\n    \"result\": {\n      \"assistantText\": \"...\",\n      \"operations\": [...]\n    }\n  }\n}\n\n\nWhen failed, error is present:\n\n{\n  \"data\": {\n    \"runId\": \"run_111\",\n    \"status\": \"failed\",\n    \"statusUrl\": \"...\",\n    \"error\": { \"code\": \"execution_failed\", \"message\": \"...\" }\n  }\n}\n\n\nRun status lifecycle: queued → running → completed | failed\n\nScreenshots\n\nTakes a snapshot of one or more rendered components.\n\nPOST /api/v1/screenshots\nAuthorization: Bearer $SLEEK_API_KEY\nContent-Type: application/json\n\n{\n  \"componentIds\": [\"cmp_xyz\", \"cmp_abc\"],\n  \"projectId\": \"proj_abc\",\n  \"format\": \"png\",\n  \"scale\": 2,\n  \"gap\": 40,\n  \"padding\": 40,\n  \"background\": \"transparent\"\n}\n\nField\tDefault\tNotes\nformat\tpng\tpng or webp\nscale\t2\t1–3 (device pixel ratio)\ngap\t40\tPixels between components\npadding\t40\tUniform padding on all sides\npaddingX\t(optional)\tHorizontal padding; overrides padding for left/right when provided\npaddingY\t(optional)\tVertical padding; overrides padding for top/bottom when provided\npaddingTop\t(optional)\tTop padding; overrides paddingY when provided\npaddingRight\t(optional)\tRight padding; overrides paddingX when provided\npaddingBottom\t(optional)\tBottom padding; overrides paddingY when provided\npaddingLeft\t(optional)\tLeft padding; overrides paddingX when provided\nbackground\ttransparent\tAny CSS color (hex, named, transparent)\nshowDots\tfalse\tOverlay a subtle dot grid on the background\n\nPadding resolves with a cascade: per-side → axis → uniform. For example, paddingTop falls back to paddingY, which falls back to padding. So { \"padding\": 20, \"paddingX\": 10, \"paddingLeft\": 5 } gives top/bottom 20px, right 10px, left 5px.\n\nWhen showDots is true, a dot pattern is drawn over the background color. The dots automatically adapt to the background: dark backgrounds get light dots, light backgrounds get dark dots. This has no effect when background is \"transparent\".\n\nAlways use \"background\": \"transparent\" unless the user explicitly requests a specific background color.\n\nResponse: raw binary image/png or image/webp with Content-Disposition: attachment.\n\nError Shapes\n{ \"code\": \"UNAUTHORIZED\", \"message\": \"...\" }\n\nHTTP\tCode\tWhen\n401\tUNAUTHORIZED\tMissing/invalid/expired API key\n403\tFORBIDDEN\tValid key, wrong scope or plan\n404\tNOT_FOUND\tResource doesn't exist\n400\tBAD_REQUEST\tValidation failure\n409\tCONFLICT\tAnother run is active for this project\n500\tINTERNAL_SERVER_ERROR\tServer error\n\nChat run-level errors (inside data.error):\n\nCode\tMeaning\nout_of_credits\tOrganization has no credits left\nexecution_failed\tAI execution error\nFlows\nFlow 1: Create project and generate a UI (async + polling)\n1. POST /api/v1/projects                              → get projectId\n2. POST /api/v1/projects/:id/chat/messages            → get runId (202)\n3. Poll GET /api/v1/projects/:id/chat/runs/:runId\n   until status == \"completed\" or \"failed\"\n4. Collect screenIds from result.operations\n   (screen_created and screen_updated entries)\n5. Screenshot each affected screen individually\n6. If any screen_created: also screenshot all project screens combined\n7. Show all screenshots to the user\n\n\nPolling recommendation: start at 2s interval, back off to 5s after 10s, give up after 5 minutes.\n\nFlow 2: Sync mode (simple, blocking)\n\nBest for short tasks or when latency is acceptable.\n\n1. POST /api/v1/projects/:id/chat/messages?wait=true\n   → blocks up to 300s\n   → 200 if completed, 202 if timed out\n2. If 202, fall back to Flow 1 polling with the returned runId\n3. On completion, screenshot and show affected screens (see screenshot delivery rule)\n\nFlow 3: Edit a specific screen\n1. GET /api/v1/projects/:id/components         → find screenId\n2. POST /api/v1/projects/:id/chat/messages\n   body: { message: { text: \"...\" }, target: { screenId: \"scr_xyz\" } }\n3. Poll or wait as above\n4. Screenshot the updated screen and show it to the user\n\nFlow 4: Idempotent message (safe retries)\n\nAdd idempotency-key header on the send request. If the network drops and you retry with the same key, the server returns the existing run rather than creating a duplicate. The key must be ≤255 chars.\n\nPOST /api/v1/projects/:id/chat/messages\nidempotency-key: my-unique-request-id-abc123\n\nFlow 5: One run at a time (conflict handling)\n\nOnly one active run is allowed per project. If you send a message while one is running, you get 409 CONFLICT. Wait for the active run to complete before sending the next message.\n\n409 response → poll existing run → completed → send next message\n\nPagination\n\nAll list endpoints accept limit (1–100, default 50) and offset (≥0). The response always includes pagination.total so you can page through all results.\n\nGET /api/v1/projects?limit=10&offset=20\n\nCommon Mistakes\nMistake\tFix\nSending to /api/v1 without Authorization header\tAdd Authorization: Bearer $SLEEK_API_KEY to every request\nUsing wrong scope\tCheck key's scopes match the endpoint (e.g. chats:write for sending messages)\nSending next message before run completes\tPoll until completed/failed before next send\nUsing wait=true on long generations\tIt blocks 300s max; have a fallback to polling for 202 response\nHTTP URLs in imageUrls\tOnly HTTPS URLs are accepted\nAssuming result is present on 202\tresult is absent until status is completed"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/stefanofa/sleek-design-mobile-apps",
    "publisherUrl": "https://clawhub.ai/stefanofa/sleek-design-mobile-apps",
    "owner": "stefanofa",
    "version": "1.0.4",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/sleek-design-mobile-apps",
    "downloadUrl": "https://openagent3.xyz/downloads/sleek-design-mobile-apps",
    "agentUrl": "https://openagent3.xyz/skills/sleek-design-mobile-apps/agent",
    "manifestUrl": "https://openagent3.xyz/skills/sleek-design-mobile-apps/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/sleek-design-mobile-apps/agent.md"
  }
}