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.
Tell the skill what your product shipped. An agent skill from Varnan-Tech/opendirectory.
$ npx skills add Varnan-Tech/opendirectory --skill product-update-logger -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install Varnan-Tech/opendirectory product-update-logger --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/Varnan-Tech/opendirectory.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/product-update-logger .claude/skills/product-update-logger && 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-logger" agent skill from https://github.com/Varnan-Tech/opendirectory/tree/main/skills/product-update-logger into .claude/skills/product-update-logger/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "product-update-logger", 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/Varnan-Tech/opendirectory/tree/main/skills/product-update-loggerType 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 Varnan-Tech/opendirectory --skill product-update-logger -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install Varnan-Tech/opendirectory product-update-logger --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Varnan-Tech/opendirectory.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/product-update-logger .agents/skills/product-update-logger && 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-logger" agent skill from https://github.com/Varnan-Tech/opendirectory/tree/main/skills/product-update-logger into .agents/skills/product-update-logger/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "product-update-logger", 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 Varnan-Tech/opendirectory --skill product-update-logger -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install Varnan-Tech/opendirectory product-update-logger --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Varnan-Tech/opendirectory.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/product-update-logger .cursor/skills/product-update-logger && 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-logger" agent skill from https://github.com/Varnan-Tech/opendirectory/tree/main/skills/product-update-logger into .cursor/skills/product-update-logger/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "product-update-logger", 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/Varnan-Tech/opendirectory.git --path skills/product-update-logger--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 Varnan-Tech/opendirectory --skill product-update-logger -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install Varnan-Tech/opendirectory product-update-logger --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Varnan-Tech/opendirectory.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/product-update-logger .gemini/skills/product-update-logger && 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-logger" agent skill from https://github.com/Varnan-Tech/opendirectory/tree/main/skills/product-update-logger into .gemini/skills/product-update-logger/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "product-update-logger", 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 Varnan-Tech/opendirectory product-update-loggerInstalls 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 Varnan-Tech/opendirectory --skill product-update-logger -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/Varnan-Tech/opendirectory.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/product-update-logger .github/skills/product-update-logger && 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-logger" agent skill from https://github.com/Varnan-Tech/opendirectory/tree/main/skills/product-update-logger into .github/skills/product-update-logger/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "product-update-logger", 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 Varnan-Tech/opendirectory --skill product-update-logger -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install Varnan-Tech/opendirectory product-update-logger --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Varnan-Tech/opendirectory.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/product-update-logger .opencode/skills/product-update-logger && 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-logger" agent skill from https://github.com/Varnan-Tech/opendirectory/tree/main/skills/product-update-logger into .opencode/skills/product-update-logger/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "product-update-logger", 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-loggerTell the skill what your product shipped. An agent skill from Varnan-Tech/opendirectory.
Product Update Logger is an agent skill from Varnan-Tech/opendirectory. Tell the skill what your product shipped. It writes a polished dated entry to a living docs/changelog.md and produces a ready-to-use content package: tweet thread, LinkedIn post, email snippet, and one-liner.
Its SKILL.md is about 3.9k tokens, which your agent loads only when the skill is triggered. The skill folder holds 10 other files, including scripts and reference files (for example `README.md`, `evals/evals.json` and `references/changelog-format.md`).
It sits in Writing & Content, covering Social media posts and Changelog and release notes. It works with LinkedIn, Git and GitHub. The repository describes itself as: AI Agent Skills built for Founders who hate Marketing. The licence is MIT.
8 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 62e437a. 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.
Ships 1 file in scripts/ (Python), which the agent can run.
Shell commands in SKILL.md call:
python3gitFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use git, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
GITHUB_TOKENFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Product Update Logger loads about 3.9k tokens when it runs, and up to ~7.1k if it reads all its reference files. Until then it costs about 58 tokens; SKILL.md has 865 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); the scripts in this folder are not scanned.
The full file from Varnan-Tech/opendirectory at commit 62e437a, republished under its MIT licence (© Varnan-Tech). 865 words, ~3,930 tokens.
.claude/skills/product-update-logger/SKILL.md (or your agent's skills folder). This skill also uses 7 other files; get the full folder from GitHub.Tell this skill what your product shipped. It writes a polished changelog entry to docs/changelog.md (a living log, newest entry first) and simultaneously produces a content package: tweet thread, LinkedIn post, email snippet, and one-liner.
Input sources: free text from your message, git commits auto-read from the local repo, or GitHub PRs if you provide a repo. Any combination works.
Read these files before each run:
cat references/changelog-format.md
cat references/content-rules.md
cat references/noise-filter.mdecho "GITHUB_TOKEN: ${GITHUB_TOKEN:-not set -- GitHub PR fetching disabled}"
echo "Git: $(git rev-parse --is-inside-work-tree 2>/dev/null && echo 'repo detected' || echo 'not a git repo')"
echo "Changelog: $(ls docs/changelog.md 2>/dev/null && echo 'exists' || echo 'will be created')"Note whether git is available and whether a changelog already exists. This determines the version label format.
Collect from the conversation:
items -- free text description of what shipped (pipe-separated if multiple). Optional if git is available.since -- how many days back to look. Default: 7. User may say "last 2 weeks" (14) or "since last release."repo -- GitHub "owner/repo" for PR fetching. Optional.version_label -- custom label like "v2.1.0" or "The Speed Update." Optional; default is date-based.If the user said nothing about items AND there is no git repo: Ask "What did you ship? List the features, fixes, or improvements -- one per line."
If git is available and user said nothing specific: Proceed with git auto-read in Step 3. Show the user what was found and confirm before transforming.
Write parsed input:
python3 << 'PYEOF'
import json, os, re
inp = {
"items": "", # FILL: pipe-separated free text, or "" if none
"since": 7, # FILL: integer days
"repo": "", # FILL: "owner/repo" or ""
"version_label": "" # FILL: "" means auto (date-based), or custom string
}
with open("/tmp/pul-input.json", "w") as f:
json.dump(inp, f, indent=2)
print(f"Since: {inp['since']} days")
print(f"Free text items: {inp['items'] or 'none (will use git/GitHub)'}")
print(f"GitHub repo: {inp['repo'] or 'none'}")
print(f"Version label: {inp['version_label'] or 'auto (date-based)'}")
PYEOFls scripts/gather.py 2>/dev/null && echo "script found" || echo "ERROR: scripts/gather.py not found"GITHUB_TOKEN="${GITHUB_TOKEN:-}" python3 scripts/gather.py \
--since "$(python3 -c "import json; print(json.load(open('/tmp/pul-input.json'))['since'])")" \
--repo "$(python3 -c "import json; print(json.load(open('/tmp/pul-input.json'))['repo'])")" \
--items "$(python3 -c "import json; print(json.load(open('/tmp/pul-input.json'))['items'])")" \
--output /tmp/pul-raw.jsonVerify output:
python3 -c "
import json
with open('/tmp/pul-raw.json') as f:
d = json.load(f)
print(f'Items found: {d[\"total_items\"]}')
print(f'Noise filtered: {d[\"noise_filtered\"]}')
print(f'Git available: {d[\"git_available\"]}')
print(f'GitHub available: {d[\"github_available\"]}')
print(f'Sources: git={sum(1 for i in d[\"items\"] if i[\"source\"]==\"git_commit\")}, '
f'prs={sum(1 for i in d[\"items\"] if i[\"source\"]==\"github_pr\")}, '
f'text={sum(1 for i in d[\"items\"] if i[\"source\"]==\"free_text\")}')
print()
print('Items:')
for item in d['items']:
print(f' [{item[\"source\"]}] {item[\"subject\"]}')
"If total_items == 0: Stop. Tell the user: "No shipped items found. Either describe what you shipped, point me to a git repo with recent commits, or add a GitHub repo with repo: owner/repo and a GITHUB_TOKEN."
Show the item list to the user and ask: "These are the items I found. Anything to add or remove before I write the changelog?"
Wait for confirmation or edits. If the user says "looks good", "proceed", or makes no changes, continue. If the user adds or removes items, update /tmp/pul-raw.json accordingly before Step 4.
Print items for context:
python3 -c "
import json
with open('/tmp/pul-raw.json') as f:
d = json.load(f)
print(json.dumps(d['items'], indent=2))
print()
print(f'Existing changelog format: {d[\"existing_changelog\"][\"format\"]}')
print(f'Last label: {d[\"existing_changelog\"][\"last_label\"]}')
print(f'Today: {d[\"date\"]}')
"AI instructions: Transform each raw item from technical language to user-facing benefit language. Follow references/changelog-format.md for transformation rules and examples.
Rules:
Determine version label:
existing_changelog.format == "semver": increment based on changes (patch for fixes only, minor for any new feature)Week of [Month Day, Year] using today's dateWrite the entry to /tmp/pul-entry.json:
{
"label": "Week of April 23, 2026",
"date": "2026-04-23",
"new": [
{"title": "Dark mode", "description": "Toggle in Settings > Appearance. Works across all views."}
],
"improved": [
{"title": "API response time", "description": "40% faster on average. Dashboard now loads in under 1 second."}
],
"fixed": [
{"title": "CSV export", "description": "Exports no longer drop the last row."}
],
"under_the_hood": []
}Verify the entry:
python3 -c "
import json
with open('/tmp/pul-entry.json') as f:
e = json.load(f)
print(f'Label: {e[\"label\"]}')
total = 0
for cat in ['new', 'improved', 'fixed', 'under_the_hood']:
items = e.get(cat, [])
if items:
print(f'{cat.replace(\"_\", \" \").title()} ({len(items)}):')
for item in items:
print(f' - {item[\"title\"]}: {item[\"description\"]}')
total += len(items)
print(f'Total: {total} items')
"Using the changelog entry from Step 4, generate all four content pieces. Follow references/content-rules.md strictly.
One-liner (max 20 words): One sentence covering the biggest 1-2 items. Plain language, no jargon.
Tweet thread (3-5 tweets):
LinkedIn post:
Email snippet:
Write to /tmp/pul-content.json:
{
"one_liner": "Dark mode, faster API, and a fixed export bug.",
"tweet_thread": [
"We shipped 3 things this week.",
"Dark mode is live. Toggle it in Settings > Appearance. Works everywhere.",
"API response time is now 40% faster. Dashboard loads in under a second.",
"Fixed: CSV exports were dropping the last row. That's gone now.",
"Changelog: [link]"
],
"linkedin_post": "We shipped 3 updates this week.\n\nDark mode is live. Toggle it in Settings under Appearance. It works across every view.\n\nAPI response time is 40% faster on average. The dashboard now loads in under a second for most users.\n\nWe also fixed a bug where CSV exports were silently dropping the last row. If you hit this and stopped exporting, it's worth trying again.\n\nWhat feature have you been waiting for?",
"email_snippet": {
"subject": "What shipped this week: dark mode + faster API",
"body": "Here's what we shipped this week:\n\n- Dark mode: toggle in Settings > Appearance\n- API response time: 40% faster, dashboard loads under 1 second\n- Fixed: CSV exports no longer drop the last row\n\nFull changelog below."
}
}python3 -c "
import json, re
with open('/tmp/pul-raw.json') as f:
raw = json.load(f)
with open('/tmp/pul-entry.json') as f:
entry = json.load(f)
with open('/tmp/pul-content.json') as f:
content = json.load(f)
full_text = json.dumps(entry) + json.dumps(content)
fails = 0
# Check 1: No em dashes
if chr(8212) in full_text:
print('FAIL: em dash found -- replace with hyphen')
fails += 1
else:
print('PASS: no em dashes')
# Check 2: Banned words
banned = ['powerful', 'robust', 'seamless', 'innovative', 'game-changing',
'streamline', 'leverage', 'transform', 'revolutionize', 'excited to announce',
'pleased to announce', 'we are thrilled', 'cutting-edge', 'best-in-class',
'world-class', 'unlock', 'delightful']
found = [w for w in banned if w.lower() in full_text.lower()]
if found:
print(f'FAIL: banned words found: {found}')
fails += 1
else:
print('PASS: no banned words')
# Check 3: Tweet length
thread = content.get('tweet_thread', [])
long_tweets = [(i+1, len(t)) for i, t in enumerate(thread) if len(t) > 280]
if long_tweets:
print(f'FAIL: tweets over 280 chars: {long_tweets}')
fails += 1
else:
print(f'PASS: all {len(thread)} tweets under 280 chars')
# Check 4: LinkedIn no hashtags
li = content.get('linkedin_post', '')
if re.search(r'#[A-Za-z]', li):
print('FAIL: hashtags found in LinkedIn post')
fails += 1
else:
print('PASS: no hashtags in LinkedIn')
# Check 5: No markdown in LinkedIn
if '**' in li or '__' in li:
print('FAIL: markdown formatting in LinkedIn (renders as literal asterisks)')
fails += 1
else:
print('PASS: no markdown in LinkedIn')
# Check 6: One-liner word count
one_liner = content.get('one_liner', '')
word_count = len(one_liner.split())
if word_count > 20:
print(f'FAIL: one-liner is {word_count} words (max 20)')
fails += 1
else:
print(f'PASS: one-liner is {word_count} words')
# Check 7: Item count
entry_items = (len(entry.get('new', [])) + len(entry.get('improved', [])) +
len(entry.get('fixed', [])) + len(entry.get('under_the_hood', [])))
raw_total = raw['total_items']
print(f'INFO: {entry_items} changelog items from {raw_total} raw items')
print()
print(f'Result: {\"PASS\" if fails == 0 else f\"FAIL ({fails} issues)\"}')
"If any check fails: Fix the issue in the relevant temp file before proceeding to Step 7. Re-run the check after fixing.
python3 << 'PYEOF'
import json, os, re
with open('/tmp/pul-entry.json') as f:
entry = json.load(f)
with open('/tmp/pul-content.json') as f:
content = json.load(f)
# Build the new changelog section
lines = [f"## {entry['label']}", ""]
CAT_HEADERS = {
"new": "### New",
"improved": "### Improved",
"fixed": "### Fixed",
"under_the_hood": "### Under the hood",
}
for cat, header in CAT_HEADERS.items():
items = entry.get(cat, [])
if items:
lines.append(header)
for item in items:
lines.append(f"- **{item['title']}** -- {item['description']}")
lines.append("")
lines.append("---")
lines.append("")
new_section = "\n".join(lines)
# Prepend to docs/changelog.md
os.makedirs("docs", exist_ok=True)
changelog_path = "docs/changelog.md"
if os.path.exists(changelog_path):
existing = open(changelog_path).read()
# Insert after the top-level heading (if any) or at the very top
if existing.startswith("# "):
end_of_heading = existing.index("\n") + 1
updated = existing[:end_of_heading] + "\n" + new_section + existing[end_of_heading:]
else:
updated = new_section + existing
else:
updated = "# Changelog\n\n" + new_section
with open(changelog_path, "w") as f:
f.write(updated)
print(f"Changelog updated: {changelog_path}")
# Save content package
date = entry['date']
content_dir = "docs/product-updates"
os.makedirs(content_dir, exist_ok=True)
content_path = f"{content_dir}/{date}-content.md"
content_lines = [
f"# Content Package: {entry['label']}",
"",
"## One-liner",
content.get('one_liner', ''),
"",
"## Tweet Thread",
"",
]
thread = content.get('tweet_thread', [])
for i, tweet in enumerate(thread, 1):
content_lines.append(f"[{i}/{len(thread)}] {tweet}")
content_lines.append("")
content_lines += [
"## LinkedIn Post",
"",
content.get('linkedin_post', ''),
"",
"## Email Snippet",
"",
f"Subject: {content.get('email_snippet', {}).get('subject', '')}",
"",
content.get('email_snippet', {}).get('body', ''),
"",
]
with open(content_path, "w") as f:
f.write("\n".join(content_lines))
print(f"Content package: {content_path}")
PYEOFrm -f /tmp/pul-input.json /tmp/pul-raw.json /tmp/pul-entry.json /tmp/pul-content.json
echo "Done."Present to the user in this order:
1. Changelog entry (formatted markdown, not raw JSON):
## Week of April 23, 2026
### New
- **Dark mode** -- Toggle in Settings > Appearance. Works across all views.
### Improved
- **API response time** -- 40% faster on average. Dashboard now loads in under 1 second.
### Fixed
- **CSV export** -- Exports no longer drop the last row.2. Content package:
[text]3. Saved files:
docs/changelog.md -- updated (new entry prepended)docs/product-updates/[date]-content.md -- full content package saved| The agent will want to... | Why that's wrong |
|---|---|
| Invent outcomes or metrics | Every claim must come from the raw items. "40% faster" needs to come from the commit message or PR body. If no number is present, don't add one. |
| Write "We are excited to announce" | Banned. Use "We shipped", "[Feature] is now live", or just state the fact. |
| Use markdown bold (**) in LinkedIn | LinkedIn renders ** as literal asterisks. Plain text only. |
| Add hashtags to LinkedIn or tweets | This skill never uses hashtags. |
| Put all items in "New" | Bugs are Fixed, speed improvements are Improved. Miscategorizing weakens the changelog. |
| Skip the confirmation step in Step 3 | Always show the item list and ask the user to confirm before transforming. This prevents wrong-branch commits or stale items. |
| Include empty "Under the hood" section | Omit if empty. Silence is better than noise. |
| Combine multiple items into one tweet | One item per tweet. Specificity > breadth. |
| Pad with filler tweets | If there's one real item, write 2 tweets. Don't pad to 5. |
© Varnan-Tech, 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 7 other files (scripts, references) in skills/product-update-logger of Varnan-Tech/opendirectory.
Open the folder on GitHubat commit 62e437a
Product Update Logger 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 Logger this skillVarnan-Tech/opendirectory | 674 | — | ~3.9k | 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 | |
| Mole Release Notes Publishertw93/Mole | 70k | — | ~1.9k | Automated safety check: Pass | GPL-3.0 | |
| Book Publisherdmccreary/ibook-skills | 105 | — | ~1.3k | Automated safety check: Pass | CC-BY-NC-4.0 | |
| Announce Articleopen-cqrs/opencqrs | 118 | — | ~2.6k | Automated safety check: Notes | Apache-2.0 | |
| Linkedin Postholtzy/dataviz-inspiration | 147 | — | ~1.1k | Automated safety check: Pass | None |
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.
tw93/Mole
Publishes curated, bilingual release notes for an existing Mole version tag with gh release edit, including contributor thanks and reactions, after the release workflow finishes.
dmccreary/ibook-skills
Publishes and promotes a finished intelligent textbook - GitHub README with badges and site statistics, LinkedIn announcement posts, LinkedIn carousel document posts (PPTX/PDF slideshows), and…
open-cqrs/opencqrs
Generate the release announcement package for a finished blog article — Google-Sheet row fields plus three LinkedIn-post variants — and print everything to the terminal as copy-ready templates.
holtzy/dataviz-inspiration
Draft a LinkedIn post announcing the latest data-viz additions to dataviz-inspiration.com, and stage the highlighted projects' images in public/linkedin/.
eunomia-bpf/eunomia.dev
Prepare or publish eunomia.dev content for LinkedIn posts, articles, carousels, and professional updates.
Varnan-Tech/opendirectory
Creates professionally designed B2B SaaS e-books in HTML + CSS, exported as print-ready PDF.
Varnan-Tech/opendirectory
Generates and updates README.md and API reference docs by reading your codebase's functions, routes, types, schemas, and architecture.
Varnan-Tech/opendirectory
Generates data visualization charts (bar, line, area, pie, doughnut, scatter, radar, treemap) as PNG using Apache ECharts v6.
Varnan-Tech/opendirectory
Creates animated looping GIFs from CSS animations (default) or AI image-to-video.
Varnan-Tech/opendirectory
Given a product description, category keywords, or competitor names (any combination), searches Reddit, Hacker News, GitHub Issues, G2, and Google Trends for the real pains your market experiences…
Varnan-Tech/opendirectory
Aggregates RSS feeds from the past week, synthesizes the top stories using Gemini, and publishes a newsletter digest to Ghost CMS.
Categories
Tell the skill what your product shipped. An agent skill from Varnan-Tech/opendirectory. Product Update Logger is an agent skill from Varnan-Tech/opendirectory. Tell the skill what your product shipped.
Product Update Logger fits situations like: tasks that involve Social media posts; tasks that involve Changelog and release notes.
Run `npx skills add Varnan-Tech/opendirectory --skill product-update-logger -a claude-code`. Or copy the skill folder (skills/product-update-logger in Varnan-Tech/opendirectory) into .claude/skills/product-update-logger in your project. Claude Code loads it when a task matches its description.
Run `npx skills add Varnan-Tech/opendirectory --skill product-update-logger -a codex`. Or copy the skill folder (skills/product-update-logger in Varnan-Tech/opendirectory) into .agents/skills/product-update-logger 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 Varnan-Tech/opendirectory --skill product-update-logger -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-logger, .gemini/skills/product-update-logger, .github/skills/product-update-logger and .opencode/skills/product-update-logger in your project.
Going by SKILL.md and its folder, Product Update Logger needs Python for the scripts in its folder, the command-line tools its instructions call (python3 and git) and credentials named GITHUB_TOKEN. Our summary lists: Python 3; A credential in GITHUB_TOKEN.
SKILL.md contains no URLs. Its commands use git, 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 no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Product Update Logger is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.9k tokens (SKILL.md is roughly 16k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 3.2k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Product Update Logger: Changelog Social Recap (FlorianBruniaux/claude-code-ultimate-guide, 6.1k stars), Mole Release Notes Publisher (tw93/Mole, 70k stars), Book Publisher (dmccreary/ibook-skills, 105 stars) and Announce Article (open-cqrs/opencqrs, 118 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
Varnan-Tech (a GitHub organization) maintains it in Varnan-Tech/opendirectory, which has 674 GitHub stars. The repository holds 61 skills in this directory. The repository was last updated on August 16, 2026.
Source: Varnan-Tech/opendirectory on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.