desktop-release

Perform a regular desktop release from the dev branch. Gathers commits since last release, updates changelog, evaluates mainHash changes, bumps version, and creates release PR.

37,910 stars

Best use case

desktop-release is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

Perform a regular desktop release from the dev branch. Gathers commits since last release, updates changelog, evaluates mainHash changes, bumps version, and creates release PR.

Teams using desktop-release should expect a more consistent output, faster repeated execution, less prompt rewriting.

When to use this skill

  • You want a reusable workflow that can be run more than once with consistent structure.

When not to use this skill

  • You only need a quick one-off answer and do not need a reusable workflow.
  • You cannot install or maintain the underlying files, dependencies, or repository context.

Installation

Claude Code / Cursor / Codex

$curl -o ~/.claude/skills/desktop-release/SKILL.md --create-dirs "https://raw.githubusercontent.com/RSSNext/Folo/main/.agents/skills/desktop-release/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/desktop-release/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How desktop-release Compares

Feature / Agentdesktop-releaseStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

Perform a regular desktop release from the dev branch. Gathers commits since last release, updates changelog, evaluates mainHash changes, bumps version, and creates release PR.

Where can I find the source code?

You can find the source code on GitHub using the link provided at the top of the page.

Related Guides

SKILL.md Source

# Desktop Regular Release

Perform a regular desktop release. This skill handles the full release workflow from the `dev` branch.

## Pre-flight checks

1. Confirm the current branch is `dev`. If not, abort with a warning.
2. Run `git pull --rebase` in the repo root to ensure the local branch is up to date.
3. Read `apps/desktop/package.json` to get the current `version` and `mainHash`.

## Step 1: Gather changes since last release

1. Find the last release tag:
   ```bash
   git tag --sort=-creatordate | grep '^desktop/v' | head -1
   ```
2. Get all commits since that tag on the current branch:
   ```bash
   git log <last-tag>..HEAD --oneline --no-merges
   ```
3. Categorize commits into:
   - **Shiny new things** (feat: commits, new features)
   - **Improvements** (refactor:, perf:, chore: improvements, dependency updates)
   - **No longer broken** (fix: commits, bug fixes)
   - **Thanks** (identify external contributor GitHub usernames from commits)

## Step 2: Update changelog

1. Read `apps/desktop/changelog/next.md`.
2. Present the categorized changes to the user and draft the changelog content.
3. Wait for user confirmation or edits before writing.
4. Write the final content to `apps/desktop/changelog/next.md`, following the template format:

   ```markdown
   # What's new in vNEXT_VERSION

   ## Shiny new things

   - description of new feature

   ## Improvements

   - description of improvement

   ## No longer broken

   - description of fix

   ## Thanks

   Special thanks to volunteer contributors @username for their valuable contributions
   ```

5. Keep `NEXT_VERSION` as the placeholder - it will be replaced by `apply-changelog.ts` during bump.

## Step 3: Commit changelog updates before bump

`nbump` requires a clean working tree. Commit changelog edits before running bump.

1. Stage the changelog update:
   ```bash
   git add apps/desktop/changelog/next.md
   ```
2. Commit it on `dev`:
   ```bash
   git commit -m "docs(desktop): prepare release changelog"
   ```
3. If there are no changes to commit, continue without creating an extra commit.

## Step 4: Evaluate mainHash

This is critical for determining whether users need a full app update or can use the lightweight renderer hot update.

1. Check what files changed in `apps/desktop/layer/main/` since the last release tag:
   ```bash
   git diff <last-tag>..HEAD --name-only -- apps/desktop/layer/main/
   ```
2. Also check changes to `apps/desktop/package.json` fields other than version/mainHash (since package.json is included in the hash calculation):
   ```bash
   git diff <last-tag>..HEAD -- apps/desktop/package.json
   ```

**Decision logic:**

- If there are **NO changes** in `layer/main/` and no meaningful `package.json` changes (only version/mainHash/changelog-related), then mainHash should NOT be updated. Users will get a fast renderer-only hot update.
- If there are **trivial changes** in `layer/main/` (typo fixes, comment changes, logging tweaks) that don't affect runtime behavior, recommend NOT updating mainHash. Present the changes to the user and ask for confirmation.
- If there are **meaningful changes** in `layer/main/` (new features, bug fixes, dependency changes, API changes), mainHash MUST be updated. Users will need a full app update.

Present your analysis to the user with:

- List of changed files in `layer/main/`
- A summary of what changed
- Your recommendation (update or skip mainHash)
- Ask for explicit confirmation

## Step 5: Save old mainHash and execute bump

1. Save the current mainHash from `apps/desktop/package.json` for later comparison.
2. Verify working tree is clean before bump:
   ```bash
   git status --short
   ```
3. Change directory to `apps/desktop/` and run the bump:
   ```bash
   cd apps/desktop && pnpm bump
   ```
4. This command will:
   - Pull latest changes
   - Apply changelog (rename next.md to {version}.md, create new next.md)
   - Recalculate mainHash and write to package.json
   - Format package.json
   - Bump minor version
   - Commit with message `release(desktop): release v{NEW_VERSION}`
   - Create branch `release/desktop/{NEW_VERSION}`
   - Push branch and create PR to `main`

## Step 6: Restore mainHash if skipping update

If Step 4 decided mainHash should NOT be updated, restore the old value now. The bump has already committed, pushed, and created the PR on a new release branch, so we amend the commit and force push. This is safe because the release branch was just created.

1. Change back to the repo root first (Step 5 left the working directory at `apps/desktop/`):
   ```bash
   cd ../..
   ```
2. Ensure you are on the `release/desktop/{NEW_VERSION}` branch (bump should have switched to it).
3. Replace the recalculated mainHash with the saved old value in `apps/desktop/package.json`.
4. Stage and amend the release commit:
   ```bash
   git add apps/desktop/package.json && git commit --amend --no-edit
   ```
5. Force push the release branch:
   ```bash
   git push --force origin release/desktop/{NEW_VERSION}
   ```

If Step 4 decided mainHash SHOULD be updated, skip this step entirely — the bump already wrote the correct new value.

## Step 7: Verify

1. Confirm the PR was created successfully by checking the output.
2. Report the new version number and PR URL to the user.
3. Summarize:
   - New version: v{NEW_VERSION}
   - mainHash updated: yes/no (and why)
   - Changelog highlights
   - PR URL

## Reference

- Bump config: `apps/desktop/bump.config.ts`
- Changelog dir: `apps/desktop/changelog/`
- Changelog template: `apps/desktop/changelog/next.template.md`
- mainHash generator: `apps/desktop/plugins/vite/generate-main-hash.ts`
- Hot updater logic: `apps/desktop/layer/main/src/updater/hot-updater.ts`
- CI build workflow: `.github/workflows/build-desktop.yml`
- Tag workflow: `.github/workflows/tag.yml`

Related Skills

mobile-release

37910
from RSSNext/Folo

Perform a regular mobile release from the dev branch. Gathers commits since last release, updates changelog, bumps version, updates iOS Info.plist, and creates release PR to mobile-main.

Folo CLI Skill

37910
from RSSNext/Folo

## Trigger Conditions

update-deps

37910
from RSSNext/Folo

Update all dependencies across frontend and backend projects. Reads changelogs for breaking changes, checks affected code, runs tests, and provides a summary. Use when updating npm dependencies across the monorepo.

mobile-self-test

37910
from RSSNext/Folo

Self-test a mobile feature change or bug fix after implementation in `apps/mobile`. Use this whenever the user asks to verify a mobile change, run simulator acceptance, smoke-test a mobile PR, or provide screenshot proof for a mobile fix. This skill decides between prod vs local API mode, starts the local follow-server when needed, builds a release app, uses Maestro only to bootstrap registration for non-auth work, then switches to screenshot-driven visual validation and returns screenshot evidence.

mobile-e2e

37910
from RSSNext/Folo

Run apps/mobile Maestro end-to-end tests in this repo. Use when an agent needs to validate mobile auth flows on iOS Simulator or Android Emulator. Current maintained coverage is register, sign out, and sign in.

installing-mobile-preview-builds

37910
from RSSNext/Folo

Builds and installs the iOS preview build for apps/mobile using EAS local build and devicectl. Use when the user asks to install a preview/internal iOS build on a connected iPhone for production-like testing.

desktop-monitor-widget

3891
from openclaw/skills

桌面监控悬浮球 - 实时显示系统资源状态

General Utilities

release

22262
from Yeachan-Heo/oh-my-claudecode

Automated release workflow for oh-my-claudecode

release-notes

5182
from dlt-hub/dlt

Generate release notes between two git tags with categorized PR summaries and author attribution

release-note-localizer

3891
from openclaw/skills

将发布说明转换为中文、英文、客户版和技术版,同时保持术语一致。;use for localization, release-notes, translation workflows;do not use for 机翻敏感合同条款, 替代专业法律翻译.

desktop-control

3891
from openclaw/skills

Advanced desktop automation with mouse, keyboard, and screen control. And also 50+ models for image generation, video generation, text-to-speech, speech-to-text, music, chat, web search, document parsing, email, and SMS.

desktop-sandbox

3891
from openclaw/skills

A desktop sandbox lets OpenClaw run as natively as on a real OS, ensuring full functionality with safe isolation.Run OpenClaw without breaking your PC.