# Send Desing mobile apps to your agent
Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.
## Fast path
- 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.
## Suggested prompts
### New install

```text
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.
```
### Upgrade existing

```text
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.
```
## Machine-readable fields
```json
{
  "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": {
    "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",
    "packageFormat": "ZIP package",
    "primaryDoc": "SKILL.md",
    "includedAssets": [
      "SKILL.md"
    ],
    "downloadMode": "redirect",
    "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."
      ]
    }
  },
  "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"
  }
}
```
## Documentation

### Overview

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.

Base 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

### Prerequisites: API Key

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.

Required plan: Pro+ (API access is gated)

### Key scopes

ScopeWhat it unlocksprojects:readList / get projectsprojects:writeCreate / delete projectscomponents:readList components in a projectchats:readGet chat run statuschats:writeSend chat messagesscreenshotsRender component screenshots

Create a key with only the scopes needed for the task.

### Security & Privacy

Single host: All requests go exclusively to https://sleek.design. No data is sent to third parties.
HTTPS only: All communication uses HTTPS. The API key is transmitted only in the Authorization header to Sleek endpoints.
Minimal scopes: Create API keys with only the scopes required for the task. Prefer short-lived or revocable keys.
Image URLs: When using imageUrls in chat messages, those URLs are fetched by Sleek's servers. Avoid passing URLs that contain sensitive content.

### Handling high-level requests

When the user says something like "design a fitness tracking app" or "build me a settings screen":

Create a project if one doesn't exist yet (ask the user for a name, or derive one from the request)
Send a chat message describing what to build — you can use the user's words directly as message.text; Sleek's AI interprets natural language
Follow the screenshot delivery rule below to show the result

You 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.

### Screenshot delivery rule

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.

When screens are created for the first time on a project (i.e. the run includes screen_created operations), deliver:

One screenshot per newly created screen (individual componentIds: [screenId])
One combined screenshot of all screens in the project (componentIds: [all screen ids])

When only existing screens are updated, deliver one screenshot per affected screen.

Use background: "transparent" for all screenshots unless the user explicitly requests otherwise.

### Quick Reference — All Endpoints

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

All IDs are stable string identifiers.

### Projects

List projects

GET /api/v1/projects?limit=50&offset=0
Authorization: Bearer $SLEEK_API_KEY

Response 200:

{
  "data": [
    {
      "id": "proj_abc",
      "name": "My App",
      "slug": "my-app",
      "createdAt": "2026-01-01T00:00:00Z",
      "updatedAt": "..."
    }
  ],
  "pagination": { "total": 12, "limit": 50, "offset": 0 }
}

Create project

POST /api/v1/projects
Authorization: Bearer $SLEEK_API_KEY
Content-Type: application/json

{ "name": "My New App" }

Response 201 — same shape as a single project.

Get / Delete project

GET    /api/v1/projects/:projectId
DELETE /api/v1/projects/:projectId   → 204 No Content

### Components

List components

GET /api/v1/projects/:projectId/components?limit=50&offset=0
Authorization: Bearer $SLEEK_API_KEY

Response 200:

{
  "data": [
    {
      "id": "cmp_xyz",
      "name": "Hero Section",
      "activeVersion": 3,
      "versions": [{ "id": "ver_001", "version": 1, "createdAt": "..." }],
      "createdAt": "...",
      "updatedAt": "..."
    }
  ],
  "pagination": { "total": 5, "limit": 50, "offset": 0 }
}

### Chat — Send Message

This is the core action: describe what you want in message.text and the AI creates or modifies screens.

POST /api/v1/projects/:projectId/chat/messages?wait=false
Authorization: Bearer $SLEEK_API_KEY
Content-Type: application/json
idempotency-key: <optional, max 255 chars>

{
  "message": { "text": "Add a pricing section with three tiers" },
  "imageUrls": ["https://example.com/ref.png"],
  "target": { "screenId": "scr_abc" }
}

FieldRequiredNotesmessage.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

Response — async (default, wait=false)

Status 202 Accepted. result and error are absent until the run reaches a terminal state.

{
  "data": {
    "runId": "run_111",
    "status": "queued",
    "statusUrl": "/api/v1/projects/proj_abc/chat/runs/run_111"
  }
}

Response — sync (wait=true)

Blocks up to 300 seconds. Returns 200 when completed, 202 if timed out.

{
  "data": {
    "runId": "run_111",
    "status": "completed",
    "statusUrl": "...",
    "result": {
      "assistantText": "I added a pricing section with...",
      "operations": [
        { "type": "screen_created", "screenId": "scr_xyz", "screenName": "Pricing" },
        { "type": "screen_updated", "screenId": "scr_abc" },
        { "type": "theme_updated" }
      ]
    }
  }
}

### Chat — Poll Run Status

Use this after async send to check progress.

GET /api/v1/projects/:projectId/chat/runs/:runId
Authorization: Bearer $SLEEK_API_KEY

Response — same shape as send message data object:

{
  "data": {
    "runId": "run_111",
    "status": "queued",
    "statusUrl": "..."
  }
}

When completed successfully, result is present:

{
  "data": {
    "runId": "run_111",
    "status": "completed",
    "statusUrl": "...",
    "result": {
      "assistantText": "...",
      "operations": [...]
    }
  }
}

When failed, error is present:

{
  "data": {
    "runId": "run_111",
    "status": "failed",
    "statusUrl": "...",
    "error": { "code": "execution_failed", "message": "..." }
  }
}

Run status lifecycle: queued → running → completed | failed

### Screenshots

Takes a snapshot of one or more rendered components.

POST /api/v1/screenshots
Authorization: Bearer $SLEEK_API_KEY
Content-Type: application/json

{
  "componentIds": ["cmp_xyz", "cmp_abc"],
  "projectId": "proj_abc",
  "format": "png",
  "scale": 2,
  "gap": 40,
  "padding": 40,
  "background": "transparent"
}

FieldDefaultNotesformatpngpng 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

Padding 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.

When 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".

Always use "background": "transparent" unless the user explicitly requests a specific background color.

Response: raw binary image/png or image/webp with Content-Disposition: attachment.

### Error Shapes

{ "code": "UNAUTHORIZED", "message": "..." }

HTTPCodeWhen401UNAUTHORIZEDMissing/invalid/expired API key403FORBIDDENValid key, wrong scope or plan404NOT_FOUNDResource doesn't exist400BAD_REQUESTValidation failure409CONFLICTAnother run is active for this project500INTERNAL_SERVER_ERRORServer error

Chat run-level errors (inside data.error):

CodeMeaningout_of_creditsOrganization has no credits leftexecution_failedAI execution error

### Flow 1: Create project and generate a UI (async + polling)

1. POST /api/v1/projects                              → get projectId
2. POST /api/v1/projects/:id/chat/messages            → get runId (202)
3. Poll GET /api/v1/projects/:id/chat/runs/:runId
   until status == "completed" or "failed"
4. Collect screenIds from result.operations
   (screen_created and screen_updated entries)
5. Screenshot each affected screen individually
6. If any screen_created: also screenshot all project screens combined
7. Show all screenshots to the user

Polling recommendation: start at 2s interval, back off to 5s after 10s, give up after 5 minutes.

### Flow 2: Sync mode (simple, blocking)

Best for short tasks or when latency is acceptable.

1. POST /api/v1/projects/:id/chat/messages?wait=true
   → blocks up to 300s
   → 200 if completed, 202 if timed out
2. If 202, fall back to Flow 1 polling with the returned runId
3. On completion, screenshot and show affected screens (see screenshot delivery rule)

### Flow 3: Edit a specific screen

1. GET /api/v1/projects/:id/components         → find screenId
2. POST /api/v1/projects/:id/chat/messages
   body: { message: { text: "..." }, target: { screenId: "scr_xyz" } }
3. Poll or wait as above
4. Screenshot the updated screen and show it to the user

### Flow 4: Idempotent message (safe retries)

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.

POST /api/v1/projects/:id/chat/messages
idempotency-key: my-unique-request-id-abc123

### Flow 5: One run at a time (conflict handling)

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.

409 response → poll existing run → completed → send next message

### Pagination

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.

GET /api/v1/projects?limit=10&offset=20

### Common Mistakes

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
## Trust
- Source: tencent
- Verification: Indexed source record
- Publisher: stefanofa
- Version: 1.0.4
## Source health
- Status: healthy
- Source download looks usable.
- Yavira can redirect you to the upstream package for this source.
- Health scope: source
- Reason: direct_download_ok
- Checked at: 2026-04-23T16:43:11.935Z
- Expires at: 2026-04-30T16:43:11.935Z
- Recommended action: Download for OpenClaw
## Links
- [Detail page](https://openagent3.xyz/skills/sleek-design-mobile-apps)
- [Send to Agent page](https://openagent3.xyz/skills/sleek-design-mobile-apps/agent)
- [JSON manifest](https://openagent3.xyz/skills/sleek-design-mobile-apps/agent.json)
- [Markdown brief](https://openagent3.xyz/skills/sleek-design-mobile-apps/agent.md)
- [Download page](https://openagent3.xyz/downloads/sleek-design-mobile-apps)