Agent skill

Product Update Newsletter

by fastrepl in fastrepl/anarlog

Draft, update, or audit a crisp, changelog-grounded Anarlog product-update newsletter in Loops (app.loops.so) for a desktop release.

MITAuto-check passedWriting & Content

Install Product Update Newsletter

skills CLI
$ npx skills add fastrepl/anarlog --skill product-update-newsletter -a claude-code

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

GitHub CLI
$ gh skill install fastrepl/anarlog product-update-newsletter --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/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-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
product-update-newsletter
GitHub stars
9.5k
Token cost
~3k tokens
SKILL.md length
1,262 words
Files
2
Skills in repo
32
Repo updated
First seen
Licence
MIT

At a glance

Draft, update, or audit a crisp, changelog-grounded Anarlog product-update newsletter in Loops (app.loops.so) for a desktop release.

  • Tasks that involve Newsletters
  • SKILL.md covers Nightly announcement, Source of Truth, Copy Style Contract and Campaign Setup, plus 6 more sections
  • Reaches anarlog.so and cdn.midjourney.com
  • Tasks that involve Changelog and release notes

What it does

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.

When your agent uses it

  • Tasks that involve Newsletters
  • Tasks that involve Changelog and release notes

Example prompts

  • “/product-update-newsletter”

What it can do on your machine

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

  • Tool permissions

    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.

  • Runs code

    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.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • anarlog.so
    • cdn.midjourney.com

    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

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.

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

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 passed

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.

SKILL.md

The full file from fastrepl/anarlog at commit 8f33650, republished under its MIT licence (© fastrepl). 1,262 words, ~3,019 tokens.

Download SKILL.mdSave it as .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.
name
product-update-newsletter
description
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.
metadata.internal
true

Product Update Newsletter

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.

Nightly announcement

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.

Source of Truth

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:

  • Feature-level items become or extend an H3 section.
  • Minor UX items become bullets under "Small things that add up".
  • Reliability and privacy items append to the fixes paragraph after the bullets.

Keep beta or partially shipped work honestly qualified. If execution is not connected yet, say so.

Copy Style Contract

Write a product email, not an essay. Keep it crisp, concrete, and easy to scan.

  • Open with what shipped and when. Prefer 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 encouraging an update, use explicit loss framing tied to named features: 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.
  • Lead with outcomes and specific numbers: 30 assistants, eight connect directly, about a second. Cut adjectives when a fact can do the work.
  • Use short, active H3 headings such as Automations do the work now, Transcripts you can fix, and Sync you stop thinking about.
  • Keep most paragraphs to one to three sentences. Split long chains, remove repeated setup, and do not restate the same framing in both the intro and fixes paragraph.
  • Use contractions and direct verbs. 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.
  • Keep subjects compact and noun-led: Anarlog 1.4.8: automations, meeting imports, instant sync. Preview text should front-load concrete outcomes and stay near 90 to 140 characters.
  • Self-critical language belongs only when Anarlog or the company was actually at fault. Never add an apology merely to sound personal.
  • Read the final copy aloud and cut anything that can disappear without losing a fact, instruction, or point of view. Changelog lists are allowed; do not force prose just to avoid a list.

Campaign Setup

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.

Body Structure Contract

Every section is exactly this block sequence, and edits must preserve it:

text
H3 heading
P (empty spacer)
DIV.editor-image
P (empty spacer)
P (body text)

Verify before finishing:

js
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(",")
      );
    });
});

Editing the Lexical Body

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:

js
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.

Show full SKILL.md (579 more words)Show less
Failure Modes

These corrupt the document silently. All four were observed in practice.

  • Range selection on the first block reverses typed characters, so "Hi," becomes ",iH". Lexical resets the caret to offset 0 per keystroke there. Use a native mouse triple-click, then type.
  • Meta+ArrowUp does not reliably reach document start. It has appended to the end of the current block instead. Triple-click the target block.
  • Coordinates read in the same 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().
  • Pressing Enter with an active Range selection deletes the selected text. Press End or Home first.

Verify caret placement before typing:

js
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.

Inserting an Image

The slash menu triggers a native file chooser. Arm the listener before opening the menu.

js
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");
  • The caret must sit in an empty paragraph, and / needs delay >= 150 or a literal / is typed.
  • The menu is a scrollable 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.
  • Poll until img.src contains images.vialoops.com to confirm the upload finished.
  • Insertion consumes the empty paragraph, so re-add the trailing spacer.

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.

Section Art

Generate with Midjourney using the established house style:

text
dithered. [short concept]. bright white sunshine, cheerful, high key. --ar 4:3 --profile aofpoq2
  • Target bright, high-key, airy, light-background results. Reject dim or dystopian output.
  • Prefer scene compositions, an object in a sunlit room, over flat grids or UI mockups. Grids do not match the existing set.
  • The Personalize "P" toggle may fail to activate, leaving data-active="false". Appending --profile aofpoq2 to the prompt text works and produces the profile chip.
  • Poll for completion by watching for \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:

js
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`);

Pre-Send Audit

Run before sending and report pass or fail per item.

Automated:

  • Version string consistent across subject and body, with no prior version anywhere.
  • Every changelog item is represented in the copy, including contributor thanks when a change came from someone outside the Fastrepl org.
  • All H3 sections match the SP,IMG,SP pattern.
  • All images report complete && naturalWidth > 0.
  • No stray artifacts: /image, orphan /, double spaces, duplicated greeting.
  • Sign-off block intact.

Manual judgment:

  • Sender, From, and Reply fields correct. Flag any reply-to change, since the body promises a personal reply and any call for testers routes to the same address.
  • Preview text length. Clients truncate near 90 to 140 characters, so front-load the important content.
  • The Download button URL lives in editor state, not the DOM. Click the button block and read the Link textbox in the right sidebar.
  • State explicitly that only the Compose step was audited unless Audience, Schedule, and Goals were also checked.

Reporting

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

Files

SKILL.md and 1 other file in .agents/skills/product-update-newsletter of fastrepl/anarlog.

  • SKILL.md
  • nightly-announcement.md

Open the folder on GitHubat commit 8f33650

Compare with similar skills

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.

Product Update Newsletter compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Product Update Newsletter this skillfastrepl/anarlog9.5k—~3kAutomated safety check: PassMIT
Changelog Social RecapFlorianBruniaux/claude-code-ultimate-guide6.1k—~1.8kAutomated safety check: NotesCC-BY-SA-4.0
Simple History Voicebonny/WordPress-Simple-History317—~775Automated safety check: PassNone
Omh Content Operatorrlaope/oh-my-hermes3.2k—~1.9kAutomated safety check: PassMIT
Releasejoenandez/spectre164—~6.5kAutomated safety check: PassMIT
SepiaNanako0129/sepia3.1k—~3.6kAutomated safety check: PassMIT

Similar skills

  • 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.

    6.1k GitHub stars~1.8k tokensUpdated today
    Writing & ContentAuto-check: notes
  • Simple History Voice

    bonny/WordPress-Simple-History

    Pär's writing voice and per-text-type rules for Simple History, on top of the humanizer skill.

    317 GitHub stars~775 tokensUpdated 3 days ago
    Writing & ContentAuto-check passed
  • Omh Content Operator

    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…

    3.2k GitHub stars~1.9k tokensUpdated yesterday
    Writing & ContentAuto-check passed
  • Release

    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…

    164 GitHub stars~6.5k tokensUpdated 8 days ago
    DevelopmentAuto-check passed
  • Sepia

    Nanako0129/sepia

    Make AI-generated writing read as human-written, in fiction and in professional prose.

    3.1k GitHub stars~3.6k tokensUpdated yesterday
    Writing & ContentAuto-check passed
  • Blog

    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.

    1.7k GitHub stars~2.2k tokensUpdated today
    Writing & ContentAuto-check passed

More from fastrepl/anarlog

All 32 skills in this repo
  • But

    fastrepl/anarlog

    Use only in the Anarlog repository when the active checkout branch is exactly gitbutler/workspace.

    9.5k GitHub stars~5.8k tokensUpdated today
    Auto-check passed
  • Create PRs

    fastrepl/anarlog

    Use only in the Anarlog repository when the active checkout branch is exactly gitbutler/workspace.

    9.5k GitHub stars~1.2k tokensUpdated today
    Auto-check passed
  • Fix Ready PRs

    fastrepl/anarlog

    Inspect every open non-draft PR for CI failures and unresolved Cursor Bugbot findings, then fix them on the existing PR branches.

    9.5k GitHub stars~1.4k tokensUpdated today
    Auto-check passed
  • No Use Effect

    fastrepl/anarlog

    Avoid direct React useEffect usage when writing or reviewing React components and hooks.

    9.5k GitHub stars~825 tokensUpdated today
    Auto-check passed
  • QA Critical UX

    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.

    9.5k GitHub stars~1.4k tokensUpdated today
    Auto-check passed
  • Reactive Sqlite UI

    fastrepl/anarlog

    Build SQLite-backed reactive UI in apps/desktop using stable patterns for reads, selection, forms, writes, and loading states.

    9.5k GitHub stars~699 tokensUpdated today
    Auto-check passed

Questions about Product Update Newsletter

What does Product Update Newsletter do?

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.

When should I use Product Update Newsletter?

Product Update Newsletter fits situations like: tasks that involve Newsletters; tasks that involve Changelog and release notes.

How do I install Product Update Newsletter in Claude Code?

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.

How do I install Product Update Newsletter in Codex?

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.

Can I use Product Update Newsletter 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 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.

What does Product Update Newsletter need to run?

SKILL.md names no scripts, command-line tools or credentials: Product Update Newsletter is instructions for the agent only.

Does Product Update Newsletter access the network?

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.

Is Product Update Newsletter safe to install?

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.

What licence does Product Update Newsletter use?

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.

How many tokens does Product Update Newsletter use?

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.

What are the alternatives to Product Update Newsletter?

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.

Who maintains Product Update Newsletter?

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.