# Desktop Brand Builder

> Generate a branded qwen-code desktop package from a minimal brandId and logo. Use when the user wants a custom, white-label, rebranded, ModelStudio/OpenWork/Qwen Code desktop client, installer, DMG/EXE/AppImage, or one-click brand build.

- Skill: `modelstudioai/desktop-brand-builder` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add modelstudioai/desktop-brand-builder`
- Raw SKILL.md: https://api.skillmd.com/api/skills/modelstudioai/desktop-brand-builder/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Design & Media
- Author: modelstudioai (https://skillmd.com/u/modelstudioai)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/modelstudioai/desktop-brand-builder

---


# Desktop Brand Builder

## Goal

Create a branded desktop package with the least user input possible. The user
should usually provide only:

```text
brandId: acme-ai
logo: /absolute/path/to/logo.png
website: https://acme.ai
```

`website` is optional. Do not ask for app name, app id, artifact name,
copyright, dock icon, renderer symbol, signing, or local installation unless
the user explicitly asks to override them.

## Input Rules

Required fields:

- `brandId`: must match `^[a-z][a-z0-9-]*$`
- `logo`: local file path; must exist

Optional overrides:

- `website`
- `appName`
- `appId`
- `target`: `mac`, `win`, `linux`, or `all`

If required input is missing, ask once:

```text
请提供：
brandId: 例如 acme-ai，只能小写字母、数字、短横线
logo: 本地 logo 文件路径
website: 可选
```

Once the required fields are present, proceed without a confirmation step.

## Derived Defaults

Infer missing values deterministically:

- `appName`: title-case the hyphen-separated `brandId`; `acme-ai` becomes
  `Acme AI`
- `appId`: if `website` has a valid host, reverse the host labels and append
  `.desktop`; `https://acme.ai` becomes `ai.acme.desktop`
- fallback `appId`: `app.<brandId>.desktop`
- `copyright`: `Copyright © <current year> <appName>`
- all brand images: generate icon, dock icon, and renderer symbol from `logo`

Use explicit user-provided override values as-is after basic validation.

## Build Workflow

Use an isolated build directory under the current working directory so user
changes in the current worktree are not mutated. Default to the qwen-code main
branch; do not clone from `craft-agents-oss`, OpenWork, or another local
checkout unless the user explicitly asks for that source:

```bash
BUILD_ROOT="$PWD/brand-builds/<brandId>-<timestamp>"
mkdir -p "$BUILD_ROOT"
git clone --branch main --single-branch \
  https://github.com/QwenLM/qwen-code.git \
  "$BUILD_ROOT/qwen-code"
cd "$BUILD_ROOT/qwen-code"
git checkout -B brand-<brandId> origin/main
```

If the branch fetch or checkout fails, stop and report the failure. Do not
continue as if `brand-<brandId>` was created.

Create a temporary `brand.json` in the build directory:

```json
{
  "brandId": "acme-ai",
  "logo": "/absolute/path/to/logo.png",
  "website": "https://acme.ai",
  "appName": "Acme AI",
  "appId": "ai.acme.desktop",
  "copyright": "Copyright © 2026 Acme AI"
}
```

Install repository and Tauri shell dependencies when missing:

```bash
npm install
cd packages/desktop-shell && npm install --workspaces=false
```

Then run this skill's bundled brand creation script:

```bash
cd /absolute/path/to/qwen-code
npx tsx .agents/skills/desktop-brand-builder/scripts/brand-create.ts \
  --desktop-root /absolute/path/to/qwen-code/packages/desktop-shell \
  --config /absolute/path/to/brand.json
```

The agent should not hand-edit Tauri icons, the renderer symbol, or
`tauri.conf.json` when this script is available. It generates icons with the
Tauri CLI and patches the visible bootstrap/Web Shell brand copy and deep-link
scheme. It disables the OpenWork updater endpoint so a white-label build cannot
install an OpenWork release; configure a brand-owned signed endpoint before
enabling updates.

Package with the current host target unless the user requested a target:

```bash
cd packages/desktop-shell
npm run build --workspaces=false -- --bundles dmg
npm run build --workspaces=false -- --bundles nsis
npm run build --workspaces=false -- --bundles appimage,deb
```

For `target: all`, run only targets supported by the current machine or CI
environment. Do not claim cross-platform artifacts were produced unless the
files exist.

## Validation

After packaging:

1. Confirm the expected artifact exists under
   `packages/desktop-shell/src-tauri/target/release/bundle/`.
2. Compute `sha256sum` or `shasum -a 256` for each artifact.
3. On macOS, run `hdiutil verify` for generated DMG files.
4. Report the artifact path, SHA-256, app name, app id, and build directory.

## Failure Handling

- Invalid `brandId`: show the regex and ask for a corrected value.
- Missing `logo`: ask for a valid local path.
- Missing bundled script: report that
  `.agents/skills/desktop-brand-builder/scripts/brand-create.ts` is missing,
  and include the expected command.
- Build failure: preserve the build directory, return the last useful error
  lines, and include the full log path or command that produced the failure.

Do not delete the build directory on failure.

