Rea Changelog Update
morluto/rea
Prepare or rewrite REA release changelogs and GitHub release notes from pinned Git history, with verified contributor thanks and Release Please synchronization.
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.
$ npx skills add zhitongblog/solomd --skill store-submit -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install zhitongblog/solomd store-submit --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ 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-srcUse ~/.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/
Install the "store-submit" agent skill from https://github.com/zhitongblog/solomd/tree/main/.claude/skills/store-submit into .claude/skills/store-submit/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "store-submit", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/zhitongblog/solomd/tree/main/.claude/skills/store-submitType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add zhitongblog/solomd --skill store-submit -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install zhitongblog/solomd store-submit --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/zhitongblog/solomd.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/store-submit .agents/skills/store-submit && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "store-submit" agent skill from https://github.com/zhitongblog/solomd/tree/main/.claude/skills/store-submit into .agents/skills/store-submit/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "store-submit", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add zhitongblog/solomd --skill store-submit -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install zhitongblog/solomd store-submit --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/zhitongblog/solomd.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/store-submit .cursor/skills/store-submit && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "store-submit" agent skill from https://github.com/zhitongblog/solomd/tree/main/.claude/skills/store-submit into .cursor/skills/store-submit/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "store-submit", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/zhitongblog/solomd.git --path .claude/skills/store-submit--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add zhitongblog/solomd --skill store-submit -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install zhitongblog/solomd store-submit --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/zhitongblog/solomd.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/store-submit .gemini/skills/store-submit && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "store-submit" agent skill from https://github.com/zhitongblog/solomd/tree/main/.claude/skills/store-submit into .gemini/skills/store-submit/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "store-submit", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install zhitongblog/solomd store-submitInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add zhitongblog/solomd --skill store-submit -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/zhitongblog/solomd.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/store-submit .github/skills/store-submit && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "store-submit" agent skill from https://github.com/zhitongblog/solomd/tree/main/.claude/skills/store-submit into .github/skills/store-submit/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "store-submit", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add zhitongblog/solomd --skill store-submit -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install zhitongblog/solomd store-submit --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/zhitongblog/solomd.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/store-submit .opencode/skills/store-submit && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "store-submit" agent skill from https://github.com/zhitongblog/solomd/tree/main/.claude/skills/store-submit into .opencode/skills/store-submit/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "store-submit", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
store-submitPublish 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. 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.
Read from SKILL.md and the folder at commit 35e8fef. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
BashReadWriteFrom allowed-tools in the SKILL.md frontmatter.
Ships script files (Shell), which the agent can run.
Shell commands in SKILL.md call:
curlFrom the folder's file list and the shell code blocks in SKILL.md.
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.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
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.
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.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
allowed-tools: Bash, Read, WriteAutomated 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.
The full file from zhitongblog/solomd at commit 35e8fef, republished under its MIT licence (© zhitongblog). 832 words, ~1,723 tokens.
.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.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:
./scripts/submit-for-review.sh --platform ios --version X.Y.Z \
--notes-dir app-store/release-notes/X.Y.Z --dry-runReach for the browser on Apple only if that script has failed for a reason you have actually diagnosed.
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 inIf 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" --daemonbrowser_connected: false while the daemon is up means every navigate and
evaluate will return HTTP 500; unzoo.sh up opens the browser and waits.
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:
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.
play.md. AAB upload, release notes, countries, review.msstore.md. MSIX packaging, Partner Center, certification.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:
curl -s --noproxy '*' http://127.0.0.1:9399/api/v1/openapi.jsonNote 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.
text lies when the window is not on screenunzoo.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.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 nullEvery 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
SKILL.md and 3 other files in .claude/skills/store-submit of zhitongblog/solomd.
Open the folder on GitHubat commit 35e8fef
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.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Store Submit this skillzhitongblog/solomd | 1.2k | — | ~1.7k | Automated safety check: Notes | MIT | |
| Rea Changelog Updatemorluto/rea | 80k | — | ~1.9k | Automated safety check: Pass | MIT | |
| Yaak Changelogmountain-loop/yaak | 19k | — | ~1.6k | Automated safety check: Pass | MIT | |
| Release NotesRAIT-09/obsidian-agent-client | 2.4k | — | ~4.2k | Automated safety check: Pass | Apache-2.0 | |
| Plane Release Notes Generatormakeplane/plane | 61k | — | ~2.5k | Automated safety check: Pass | AGPL-3.0 | |
| Release Prepjohnhuang316/code-index-mcp | 1k | — | ~680 | Automated safety check: Pass | MIT |
morluto/rea
Prepare or rewrite REA release changelogs and GitHub release notes from pinned Git history, with verified contributor thanks and Release Please synchronization.
mountain-loop/yaak
Create or edit Yaak changelogs. An agent skill from mountain-loop/yaak.
RAIT-09/obsidian-agent-client
Generate a GitHub release note draft for this Obsidian plugin repository.
makeplane/plane
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.
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.
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.
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.
zhitongblog/solomd
Read, search, edit, and version-control any folder of Markdown notes via the SoloMD MCP server.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.