Changelog Social Recap
FlorianBruniaux/claude-code-ultimate-guide
Turns CHANGELOG.md entries for a release or a week into LinkedIn, Twitter/X, newsletter and Slack posts in French and English.
Draft, update, or audit a crisp, changelog-grounded Anarlog product-update newsletter in Loops (app.loops.so) for a desktop release.
$ npx skills add fastrepl/anarlog --skill product-update-newsletter -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install fastrepl/anarlog product-update-newsletter --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/fastrepl/anarlog.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/product-update-newsletter .claude/skills/product-update-newsletter && 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 "product-update-newsletter" agent skill from https://github.com/fastrepl/anarlog/tree/main/.agents/skills/product-update-newsletter into .claude/skills/product-update-newsletter/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "product-update-newsletter", 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/fastrepl/anarlog/tree/main/.agents/skills/product-update-newsletterType 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 fastrepl/anarlog --skill product-update-newsletter -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install fastrepl/anarlog product-update-newsletter --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/fastrepl/anarlog.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/product-update-newsletter .agents/skills/product-update-newsletter && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "product-update-newsletter" agent skill from https://github.com/fastrepl/anarlog/tree/main/.agents/skills/product-update-newsletter into .agents/skills/product-update-newsletter/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "product-update-newsletter", 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 fastrepl/anarlog --skill product-update-newsletter -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install fastrepl/anarlog product-update-newsletter --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/fastrepl/anarlog.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/product-update-newsletter .cursor/skills/product-update-newsletter && 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 "product-update-newsletter" agent skill from https://github.com/fastrepl/anarlog/tree/main/.agents/skills/product-update-newsletter into .cursor/skills/product-update-newsletter/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "product-update-newsletter", 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/fastrepl/anarlog.git --path .agents/skills/product-update-newsletter--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 fastrepl/anarlog --skill product-update-newsletter -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install fastrepl/anarlog product-update-newsletter --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/fastrepl/anarlog.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/product-update-newsletter .gemini/skills/product-update-newsletter && 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 "product-update-newsletter" agent skill from https://github.com/fastrepl/anarlog/tree/main/.agents/skills/product-update-newsletter into .gemini/skills/product-update-newsletter/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "product-update-newsletter", 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 fastrepl/anarlog product-update-newsletterInstalls 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 fastrepl/anarlog --skill product-update-newsletter -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/fastrepl/anarlog.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/product-update-newsletter .github/skills/product-update-newsletter && 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 "product-update-newsletter" agent skill from https://github.com/fastrepl/anarlog/tree/main/.agents/skills/product-update-newsletter into .github/skills/product-update-newsletter/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "product-update-newsletter", 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 fastrepl/anarlog --skill product-update-newsletter -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install fastrepl/anarlog product-update-newsletter --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/fastrepl/anarlog.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/product-update-newsletter .opencode/skills/product-update-newsletter && 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 "product-update-newsletter" agent skill from https://github.com/fastrepl/anarlog/tree/main/.agents/skills/product-update-newsletter into .opencode/skills/product-update-newsletter/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "product-update-newsletter", 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.
product-update-newsletterDraft, update, or audit a crisp, changelog-grounded Anarlog product-update newsletter in Loops (app.loops.so) for a desktop release.
Product Update Newsletter is an agent skill from fastrepl/anarlog. Draft, update, or audit a crisp, changelog-grounded Anarlog product-update newsletter in Loops (app.loops.so) for a desktop release. Use after the changelog is merged, when asked to draft, revise, or pre-send check the release announcement email.
Its SKILL.md is about 3k tokens, which your agent loads only when the skill is triggered. The skill folder holds 1 other file (for example `nightly-announcement.md`).
It sits in Writing & Content, covering Newsletters and Changelog and release notes. The repository describes itself as: Open source Granola AI Alternative. The licence is MIT.
Read from SKILL.md and the folder at commit 8f33650. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are javascript).
From the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
anarlog.socdn.midjourney.comFrom 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.
Product Update Newsletter loads about 3k tokens when it runs. Until then it costs about 68 tokens; SKILL.md has 1,262 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 found no risky patterns in SKILL.md.
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.
The full file from fastrepl/anarlog at commit 8f33650, republished under its MIT licence (© fastrepl). 1,262 words, ~3,019 tokens.
.claude/skills/product-update-newsletter/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.Announce a desktop release to users through the "Anarlog update (...)" campaign in Loops.
Run this after ../new-changelog/SKILL.md produces the entry and the version is released via
../release-new-version/SKILL.md. The published changelog is the copy source, not the raw commit log.
The newsletter follows stable releases. Do not send a newsletter for each Nightly. In the next stable update, include the opt-in Nightly announcement from nightly-announcement.md, alongside that stable release's changelog. Existing users remain on stable automatically.
Before describing Nightly as available, verify its published installers, update
feed, and https://anarlog.so/download/nightly/. Use the released stable
changelog as the main source; Nightly-only changes are not shipped stable
features. Nightly release notes live in the app and GitHub prereleases, not the
website changelog. Prepare copy locally before publication is ready; create or
update the Loops campaign once the stable release and linked Nightly are live.
Read https://anarlog.so/changelog/desktop/<version>, which renders packages/changelog/content/desktop/<version>.md.
The changelog is frequently edited after first publish. When told it changed, re-fetch and diff against the current email body, then apply only the delta. Do not reapply the whole rewrite.
Map items to the existing structure rather than appending a dump:
Keep beta or partially shipped work honestly qualified. If execution is not connected yet, say so.
Write a product email, not an essay. Keep it crisp, concrete, and easy to scan.
We shipped four releases since last week. Anarlog 1.4.8 is here. over scene-setting such as If you've been putting off updating, this is the one to take or It folds in four releases.If you aren't updating, you're missing out on Automations that run after every meeting, editable transcripts, meeting imports, and near-instant sync. Do not use vague hype, guilt, or blame.30 assistants, eight connect directly, about a second. Cut adjectives when a fact can do the work.Automations do the work now, Transcripts you can fix,
and Sync you stop thinking about.Last week ... This week ... is a useful cadence when it
connects one update to the next. Avoid cutesy transitions such as Now they earn it and vague
phrases such as Accuracy got quieter improvements.Anarlog 1.4.8: automations, meeting imports, instant sync.
Preview text should front-load concrete outcomes and stay near 90 to 140 characters.Duplicate the most recent "Anarlog update (...)" campaign from the Loops Home page so sender, reply-to, section headings, Download button, and footer are inherited, then rename to the new date.
Campaign metrics pages show only send/open/click stats. Use the compose view to edit content.
Every section is exactly this block sequence, and edits must preserve it:
H3 heading
P (empty spacer)
DIV.editor-image
P (empty spacer)
P (body text)Verify before finishing:
await page.evaluate(() => {
const blocks = [...document.querySelector(".ContentEditable__root").children];
return blocks
.filter((b) => b.tagName === "H3")
.map((h) => {
const i = blocks.indexOf(h);
return (
h.innerText +
" -> " +
blocks
.slice(i + 1, i + 4)
.map((x) =>
x.className.includes("editor-image")
? "IMG"
: x.innerText.trim() === ""
? "SP"
: "TXT",
)
.join(",")
);
});
});The body is div.ContentEditable__root. The page has several [contenteditable="true"] elements
(Sender, From, Reply, Subject, Preview, body). Match on distinctive existing text, never a cached
index or ref. Before any multi-block pass, rescan the full block map and resolve targets again. The
user may edit concurrently, so a previously correct fixed index can shift and corrupt headings,
bullets, or the greeting. ### creates an H3 and - creates a bullet.
Reliable mid-document replacement is Range-select then type:
async function selectTextInBody(searchStr) {
return await page.evaluate((str) => {
const root = document.querySelector(".ContentEditable__root");
const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);
let node;
while ((node = walker.nextNode())) {
const idx = node.textContent.indexOf(str);
if (idx !== -1) {
root.focus();
const range = document.createRange();
range.setStart(node, idx);
range.setEnd(node, idx + str.length);
const sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(range);
node.parentElement.scrollIntoView({ block: "center" });
return true;
}
}
return false;
}, searchStr);
}Repeat per occurrence for multi-hit edits such as version bumps.
These corrupt the document silently. All four were observed in practice.
Meta+ArrowUp does not reliably reach document start. It has appended to the end of the current
block instead. Triple-click the target block.evaluate() as scrollIntoView are stale, so clicks land in the
wrong block and keystrokes corrupt unrelated sections. Scroll, sleep(600), then re-read the rect
in a second evaluate().End or Home first.Verify caret placement before typing:
const ok = await page.evaluate(() => {
const sel = window.getSelection();
const blocks = [...document.querySelector(".ContentEditable__root").children];
const target = blocks[TARGET_INDEX];
const anchorBlock = sel.anchorNode
? (sel.anchorNode.nodeType === 1
? sel.anchorNode
: sel.anchorNode.parentElement
).closest(".ContentEditable__root > *")
: null;
return anchorBlock === target;
});If false, click the horizontal middle of the block's text rather than its left edge.
After any structural repair, scan all blocks for stray empty paragraphs, duplicated greetings, and
leftover / or /image text.
The slash menu triggers a native file chooser. Arm the listener before opening the menu.
const fcPromise = page
.waitForEvent("filechooser", { timeout: 15000 })
.catch(() => null);
await page.keyboard.type("/", { delay: 200 });
await sleep(700);
await page.keyboard.type("image", { delay: 120 });
await sleep(700);
const btn = await page.evaluate(() => {
const menu = [...document.querySelectorAll("div.fixed")].find((el) =>
el.className.toString().includes("z-[100]"),
);
const img =
menu &&
[...menu.querySelectorAll("button")].find(
(b) => b.textContent.trim() === "Image",
);
const r = img.getBoundingClientRect();
return { cx: r.x + r.width / 2, cy: r.y + r.height / 2 };
});
await page.mouse.click(btn.cx, btn.cy);
const fc = await fcPromise;
await fc.setFiles("/abs/path/to/image.png");/ needs delay >= 150 or a literal / is typed.div.fixed.z-[100]. Unfiltered, the Image item under MEDIA sits below the
visible scroll area, so clicking its reported rect hits the page behind and silently closes the
menu. Typing image filters the list and brings it into view.Enter and ArrowDown+Enter do not activate the item. Only a mouse click works.img.src contains images.vialoops.com to confirm the upload finished.Replace an image by clicking it to select the block, pressing Backspace, then re-running the flow.
Capture existing images.vialoops.com URLs before editing so a deleted image can be re-downloaded
and restored.
Generate with Midjourney using the established house style:
dithered. [short concept]. bright white sunshine, cheerful, high key. --ar 4:3 --profile aofpoq2data-active="false". Appending
--profile aofpoq2 to the prompt text works and produces the profile chip.\d+% Complete to disappear from document.body.innerText.cdn.midjourney.com returns a Cloudflare challenge to Node-side fetch(). Download full resolution
inside the authenticated tab, where jobId comes from the grid thumbnail
cdn.midjourney.com/<jobId>/0_<n>_640_N.webp:
const b64 = await mjPage.evaluate(async (u) => {
const r = await fetch(u);
const blob = await r.blob();
return await new Promise((res) => {
const fr = new FileReader();
fr.onload = () => res(fr.result.split(",")[1]);
fr.readAsDataURL(blob);
});
}, `https://cdn.midjourney.com/${jobId}/0_${variant}.png`);Run before sending and report pass or fail per item.
Automated:
SP,IMG,SP pattern.complete && naturalWidth > 0./image, orphan /, double spaces, duplicated greeting.Manual judgment:
Restate what changed in plain language, quote the new copy, and attach a screenshot of edited sections. Disclose any self-inflicted document damage and its repair rather than hiding it.
© fastrepl, 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 1 other file in .agents/skills/product-update-newsletter of fastrepl/anarlog.
Open the folder on GitHubat commit 8f33650
Product Update Newsletter 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 |
|---|---|---|---|---|---|---|
| Product Update Newsletter this skillfastrepl/anarlog | 9.5k | — | ~3k | Automated safety check: Pass | MIT | |
| Changelog Social RecapFlorianBruniaux/claude-code-ultimate-guide | 6.1k | — | ~1.8k | Automated safety check: Notes | CC-BY-SA-4.0 | |
| Simple History Voicebonny/WordPress-Simple-History | 317 | — | ~775 | Automated safety check: Pass | None | |
| Omh Content Operatorrlaope/oh-my-hermes | 3.2k | — | ~1.9k | Automated safety check: Pass | MIT | |
| Releasejoenandez/spectre | 164 | — | ~6.5k | Automated safety check: Pass | MIT | |
| SepiaNanako0129/sepia | 3.1k | — | ~3.6k | Automated safety check: Pass | MIT |
FlorianBruniaux/claude-code-ultimate-guide
Turns CHANGELOG.md entries for a release or a week into LinkedIn, Twitter/X, newsletter and Slack posts in French and English.
bonny/WordPress-Simple-History
Pär's writing voice and per-text-type rules for Simple History, on top of the humanizer skill.
rlaope/oh-my-hermes
[omh] Product or company copy to publish or rewrite: scope publish-ready writing, rewriting, summarization, translation, release-note, newsletter, customer-copy, social-copy, README-copy, and…
joenandez/spectre
Switch persistent Spectre installs between this checkout and the public marketplace, deploy the checkout for local testing, or run the full public GitHub marketplace release workflow including…
Nanako0129/sepia
Make AI-generated writing read as human-written, in fiction and in professional prose.
theopenco/llmgateway
Write and validate an LLM Gateway marketing blog post in the repository's current house style, including structured frontmatter and a gpt-image-2 OpenGraph image.
fastrepl/anarlog
Use only in the Anarlog repository when the active checkout branch is exactly gitbutler/workspace.
fastrepl/anarlog
Use only in the Anarlog repository when the active checkout branch is exactly gitbutler/workspace.
fastrepl/anarlog
Inspect every open non-draft PR for CI failures and unresolved Cursor Bugbot findings, then fix them on the existing PR branches.
fastrepl/anarlog
Avoid direct React useEffect usage when writing or reviewing React components and hooks.
fastrepl/anarlog
QA Anarlog's critical Pro user journey on a signed staging candidate — onboarding, responsive launch, microphone and system-audio capture, automated summaries, and cloud sync.
fastrepl/anarlog
Build SQLite-backed reactive UI in apps/desktop using stable patterns for reads, selection, forms, writes, and loading states.
Categories
Draft, update, or audit a crisp, changelog-grounded Anarlog product-update newsletter in Loops (app.loops.so) for a desktop release. Product Update Newsletter is an agent skill from fastrepl/anarlog.so) for a desktop release.
Product Update Newsletter fits situations like: tasks that involve Newsletters; tasks that involve Changelog and release notes.
Run `npx skills add fastrepl/anarlog --skill product-update-newsletter -a claude-code`. Or copy the skill folder (.agents/skills/product-update-newsletter in fastrepl/anarlog) into .claude/skills/product-update-newsletter in your project. Claude Code loads it when a task matches its description.
Run `npx skills add fastrepl/anarlog --skill product-update-newsletter -a codex`. Or copy the skill folder (.agents/skills/product-update-newsletter in fastrepl/anarlog) into .agents/skills/product-update-newsletter 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 fastrepl/anarlog --skill product-update-newsletter -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/product-update-newsletter, .gemini/skills/product-update-newsletter, .github/skills/product-update-newsletter and .opencode/skills/product-update-newsletter in your project.
SKILL.md names no scripts, command-line tools or credentials: Product Update Newsletter is instructions for the agent only.
SKILL.md names 2 domains. In commands or code: anarlog.so and cdn.midjourney.com; the agent is likely to contact these when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Product Update Newsletter is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3k tokens (SKILL.md is roughly 12k 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 Product Update Newsletter: Changelog Social Recap (FlorianBruniaux/claude-code-ultimate-guide, 6.1k stars), Simple History Voice (bonny/WordPress-Simple-History, 317 stars), Omh Content Operator (rlaope/oh-my-hermes, 3.2k stars) and Release (joenandez/spectre, 164 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
fastrepl (a GitHub organization) maintains it in fastrepl/anarlog, which has 9,471 GitHub stars. The repository holds 32 skills in this directory. The repository was last updated on October 11, 2026.
Source: fastrepl/anarlog on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.