Agent skill

Store Submit

by zhitongblog in zhitongblog/solomd

Publish a SoloMD release to the stores that have no usable submission API — Google Play Console and Microsoft Partner Center — by driving them through the local Unzoo Browser REST API.

MITAuto-check: notesDevelopment

Install Store Submit

skills CLI
$ npx skills add zhitongblog/solomd --skill store-submit -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install zhitongblog/solomd store-submit --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/zhitongblog/solomd.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/store-submit .claude/skills/store-submit && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
store-submit
GitHub stars
1.2k
Token cost
~1.7k tokens
SKILL.md length
832 words
Files
4
Skills in repo
3
Repo updated
First seen
Licence
MIT

At a glance

Publish a SoloMD release to the stores that have no usable submission API — Google Play Console and Microsoft Partner Center — by driving them through the local Unzoo Browser REST API.

  • Asked to submit to Play
  • SKILL.md covers Preflight, The six rules, Which store and unzoo.sh, plus 2 more sections
  • Runs Shell scripts from its folder; calls curl
  • Update the Microsoft Store

What it does

Store Submit is an agent skill from zhitongblog/solomd. Publish a SoloMD release to the stores that have no usable submission API — Google Play Console and Microsoft Partner Center — by driving them through the local Unzoo Browser REST API. Covers upload, release notes, track and country selection, and submitting for review, plus the traps that have cost whole sessions before. Use when asked to "submit to Play", "上架 Play", "update the Microsoft Store", "提交商店", "发到应用商店", or when a release has shipped on GitHub and the store channels are still owed. Apple is NOT here…

Its SKILL.md is about 1.7k tokens, which your agent loads only when the skill is triggered. The skill folder holds 3 other files (for example `msstore.md`, `play.md` and `unzoo.sh`).

It sits in Development, covering App store release, Changelog and release notes and REST APIs. It works with GitHub, Model Context Protocol, iOS and Tauri. The repository describes itself as: A markdown editor — and the bridge to your LLM. Local-first, MIT, ~15 MB. Bundled MCP server lets Claude Code / Codex / Cursor drive your vault directly. 14 AI providers BYOK. The licence is MIT.

When your agent uses it

  • Asked to submit to Play
  • Update the Microsoft Store
  • A release has shipped on GitHub and the store channels are still owed

Example prompts

  • “submit to Play”
  • “上架 Play”
  • “update the Microsoft Store”
  • “/store-submit”

Requirements

  • A Bash shell
  • Pre-approved tools (allowed-tools): Bash, Read, Write

What it can do on your machine

Read from SKILL.md and the folder at commit 35e8fef. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves these tools, so the agent can use them without asking each time:

    • Bash
    • Read
    • Write

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Ships script files (Shell), which the agent can run.

    Shell commands in SKILL.md call:

    • curl

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use curl, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Store Submit loads about 1.7k tokens when it runs. Until then it costs about 149 tokens; SKILL.md has 832 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~149
When it runs · the whole SKILL.md, loaded when a task matches
~1.7k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check: notes

The automated check noted patterns worth knowing about, such as sudo or a known installer.

  • NotePre-approves every shell command (allowed-tools: Bash)SKILL.md
    allowed-tools: Bash, Read, Write

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from zhitongblog/solomd at commit 35e8fef, republished under its MIT licence (© zhitongblog). 832 words, ~1,723 tokens.

Download SKILL.mdSave it as .claude/skills/store-submit/SKILL.md (or your agent's skills folder). This skill also uses 3 other files; get the full folder from GitHub.
name
store-submit
description
Publish a SoloMD release to the stores that have no usable submission API — Google Play Console and Microsoft Partner Center — by driving them through the local Unzoo Browser REST API. Covers upload, release notes, track and country selection, and submitting for review, plus the traps that have cost whole sessions before. Use when asked to "submit to Play", "上架 Play", "update the Microsoft Store", "提交商店", "发到应用商店", or when a release has shipped on GitHub and the store channels are still owed. Apple is NOT here: the App Store has a real API — see scripts/submit-for-review.sh.
allowed-tools
Bash, Read, Write
version
1.0.0
triggers
submit to play store, 提交 play, 上架 google play, update microsoft store, 提交微软商店, submit to store, 商店提交

Store submission over the Unzoo browser

Google Play and Microsoft Partner Center are the two channels with no usable API for this account, so releasing to them means driving a real browser. This skill is the accumulated way to do that without losing an afternoon.

Apple does not belong here. iOS and macOS submit over the App Store Connect API with no browser at all:

bash
./scripts/submit-for-review.sh --platform ios   --version X.Y.Z \
    --notes-dir app-store/release-notes/X.Y.Z --dry-run

Reach for the browser on Apple only if that script has failed for a reason you have actually diagnosed.

Preflight

bash
S=.claude/skills/store-submit
$S/unzoo.sh status          # {"browser_connected":true,...}
$S/unzoo.sh up              # starts the browser if it is down
$S/unzoo.sh tabs            # find the console tab that is already signed in

If the daemon is down, start it from a Bash call with run_in_background: true — nohup … & is not enough, it dies with the tool's shell:

"/Applications/Unzoo Browser.app/Contents/MacOS/unzoo-service" --daemon

browser_connected: false while the daemon is up means every navigate and evaluate will return HTTP 500; unzoo.sh up opens the browser and waits.

The six rules

These are not style preferences. Each one has already cost a session.

1. Pin the tab. Always. Without tab_id the API acts on whatever tab the user is looking at — their mail, their bank. Resolve one and export it:

bash
export UNZOO_TAB=$($S/unzoo.sh find-tab play.google.com/console)

If a read comes back nonsensical, check unzoo.sh url before you debug the page. It has been the user's Cloudflare dashboard.

2. A coordinate click goes to the ACTIVE tab, not to tab_id. The endpoint accepts the id and ignores it. Clicking a background tab produces no click event, no error, and a page that looks like it ignored you. unzoo.sh click and click-el activate first for this reason — if you call /api/v1/click directly, activate yourself.

3. Read pages with text, never with screenshots. A screenshot does not follow scroll, so full_page silently omits exactly the banner you are looking for. Use a screenshot only to locate something you must click by coordinate.

4. Use the console's own session, in the user's own profile. The signed-in Google and Microsoft sessions live in the default profile. Prefer find-tab over new. Do not touch cookies: setting one without SameSite=None has signed the main profile out.

5. Never claim a submission you have not read back. Both consoles render optimistically and will lie in both directions. Partner Center showed "Update in certification" seconds after the click, then "Update in draft" in a screenshot taken moments later, with a session-expired dialog in the DOM throughout — and the submission had in fact gone through. Navigate away and back before reading a status, and look for a structural change (the Submit button gone, a Cancel button appeared), not just a word.

6. A file input that reads back empty was probably filled. Angular and React uploaders take the FileList and clear the input in the same tick, so a successful set_input_files leaves files.length === 0. Confirm on the page. Retrying on the count uploads twice.

Which store

  • Google Play → play.md. AAB upload, release notes, countries, review.
  • Microsoft Store → msstore.md. MSIX packaging, Partner Center, certification.

unzoo.sh

status | up | tabs | find-tab <url-substring> | new <url> | activate
nav <url> | url | wait-load | wait-for <sel> [s] | exists <sel>
text | html | eval <js> | box <sel> | click <x> <y> | click-el <sel>
upload <input-sel> <file> | shot [path]

-t <id> overrides UNZOO_TAB for one call. Full API surface, if you need something not wrapped here:

bash
curl -s --noproxy '*' http://127.0.0.1:9399/api/v1/openapi.json

Note the --noproxy '*': the local proxy mangles loopback calls, and it is also why store uploads through the browser stall — see reference_release_upload_watchdog in memory.

Show full SKILL.md (319 more words)Show less

★ text lies when the window is not on screen

unzoo.sh text and any innerText read need layout, and Chrome skips layout for a browser window that is not actually being painted. The Play Console page then reads as ~550 characters of loading splash while it is fully rendered — a screenshot shows the real content. This is silent: no error, just a short string that looks like "still loading".

Anything unattended (a watcher, a poll loop, a cron) must read unzoo.sh dom-text, which returns document.body.textContent and does not depend on layout. Two caveats that come with it:

  • textContent includes hidden and collapsed elements, so match on markers you expect to appear; do not conclude something is gone because a string is absent from a freshly loaded page.
  • Loading-splash text stays in textContent permanently, so judge "page ready" by length plus a content anchor, never by the absence of the splash string.

When a read disagrees with what you think is on screen, take a screenshot — that forces a paint and settles it.

★ eval used to share one scope, and a collision looked like null

Every unzoo.sh eval landed in the same top-level context, so the second const b = ... in a session threw "Identifier 'b' has already been declared" — and that throw came back as a plain null result, indistinguishable from "the selector matched nothing". It sent this session chasing imaginary DOM changes more than once, and it is visible in the page console as a stray SyntaxError that has nothing to do with the page.

eval now wraps every expression in its own arrow scope, so redeclaration is impossible. Three input shapes are handled: a bare expression, several statements where you write your own return, and several statements where you do not (the last one is returned for you). A ; inside a string literal is the one case that misfires — and it fails as a visible syntax error, not silence.

© zhitongblog, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 3 other files in .claude/skills/store-submit of zhitongblog/solomd.

  • SKILL.md
  • msstore.md
  • play.md
  • unzoo.sh

Open the folder on GitHubat commit 35e8fef

Compare with similar skills

Store Submit next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Store Submit compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Store Submit this skillzhitongblog/solomd1.2k—~1.7kAutomated safety check: NotesMIT
Rea Changelog Updatemorluto/rea80k—~1.9kAutomated safety check: PassMIT
Yaak Changelogmountain-loop/yaak19k—~1.6kAutomated safety check: PassMIT
Release NotesRAIT-09/obsidian-agent-client2.4k—~4.2kAutomated safety check: PassApache-2.0
Plane Release Notes Generatormakeplane/plane61k—~2.5kAutomated safety check: PassAGPL-3.0
Release Prepjohnhuang316/code-index-mcp1k—~680Automated safety check: PassMIT

Similar skills

  • Prepare or rewrite REA release changelogs and GitHub release notes from pinned Git history, with verified contributor thanks and Release Please synchronization.

    80k GitHub stars~1.9k tokensUpdated today
    DevelopmentAuto-check passed
  • Yaak Changelog

    mountain-loop/yaak

    Create or edit Yaak changelogs. An agent skill from mountain-loop/yaak.

    19k GitHub stars~1.6k tokensUpdated today
    DevelopmentAuto-check passed
  • Release Notes

    RAIT-09/obsidian-agent-client

    Generate a GitHub release note draft for this Obsidian plugin repository.

    2.4k GitHub stars~4.2k tokensUpdated 8 days ago
    DevelopmentAuto-check passed
  • Builds categorized release notes for a Plane release pull request from its commits and writes them into the PR description, for both the plane-cloud and plane-ee repos.

    61k GitHub stars~2.5k tokensUpdated yesterday
    DevelopmentAuto-check passed
  • Release Prep

    johnhuang316/code-index-mcp

    A skill your agent uses when code-index-mcp implementation is complete and a version bump, release notes, tag, package publication, or GitHub release is being prepared.

    1k GitHub stars~680 tokensUpdated 2 mo ago
    DevelopmentAuto-check passed
  • Liveagent Code Review

    Stack-Cairn/LiveAgent

    Review an open GitHub pull request or the current local branch and working tree with parallel, independent reviewers and evidence-based validation.

    2.2k GitHub stars~2k tokensUpdated yesterday
    DevelopmentAuto-check passed

More from zhitongblog/solomd

  • Competitor Feedback

    zhitongblog/solomd

    Scan competing markdown editors' user feedback (GitHub issues/discussions/releases + closed-source forums) and synthesize themes cross-referenced against SoloMD's own gaps and roadmap.

    1.2k GitHub stars~1.2k tokensUpdated yesterday
    Auto-check: notes
  • Solomd

    zhitongblog/solomd

    Read, search, edit, and version-control any folder of Markdown notes via the SoloMD MCP server.

    1.2k GitHub stars~2k tokensUpdated yesterday
    Auto-check passed

Questions about Store Submit

What does Store Submit do?

Publish a SoloMD release to the stores that have no usable submission API — Google Play Console and Microsoft Partner Center — by driving them through the local Unzoo Browser REST API. Store Submit is an agent skill from zhitongblog/solomd. Publish a SoloMD release to the stores that have no usable submission API — Google Play Console and Microsoft Partner Center — by driving them through the local Unzoo Browser REST API.

When should I use Store Submit?

Store Submit fits situations like: asked to submit to Play; update the Microsoft Store; A release has shipped on GitHub and the store channels are still owed.

How do I install Store Submit in Claude Code?

Run `npx skills add zhitongblog/solomd --skill store-submit -a claude-code`. Or copy the skill folder (.claude/skills/store-submit in zhitongblog/solomd) into .claude/skills/store-submit in your project. Claude Code loads it when a task matches its description.

How do I install Store Submit in Codex?

Run `npx skills add zhitongblog/solomd --skill store-submit -a codex`. Or copy the skill folder (.claude/skills/store-submit in zhitongblog/solomd) into .agents/skills/store-submit in your project. Codex loads it when a task matches its description.

Can I use Store Submit in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add zhitongblog/solomd --skill store-submit -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/store-submit, .gemini/skills/store-submit, .github/skills/store-submit and .opencode/skills/store-submit in your project.

What does Store Submit need to run?

Going by SKILL.md and its folder, Store Submit needs a shell for the scripts in its folder and the command-line tools its instructions call (curl). Our summary lists: A Bash shell. Its frontmatter pre-approves these tools: Bash, Read, Write.

Does Store Submit access the network?

SKILL.md contains no URLs. Its commands use curl, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Store Submit safe to install?

Our automated static check of SKILL.md found notes only (pre-approves every shell command (allowed-tools: bash)), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.

What licence does Store Submit use?

Store Submit is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Store Submit use?

About 1.7k tokens (SKILL.md is roughly 6.9k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Store Submit?

Skills that share tags, products or a category with Store Submit: Rea Changelog Update (morluto/rea, 80k stars), Yaak Changelog (mountain-loop/yaak, 19k stars), Release Notes (RAIT-09/obsidian-agent-client, 2.4k stars) and Plane Release Notes Generator (makeplane/plane, 61k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Store Submit?

zhitongblog (a GitHub user) maintains it in zhitongblog/solomd, which has 1,198 GitHub stars. The repository holds 3 skills in this directory. The repository was last updated on October 10, 2026.

Source: zhitongblog/solomd on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.