Agent skill

Product Update Logger

by Varnan-Tech in Varnan-Tech/opendirectory

Tell the skill what your product shipped. An agent skill from Varnan-Tech/opendirectory.

MITAuto-check passedWriting & Content

Install Product Update Logger

skills CLI
$ npx skills add Varnan-Tech/opendirectory --skill product-update-logger -a claude-code

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

GitHub CLI
$ gh skill install Varnan-Tech/opendirectory product-update-logger --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/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-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-logger
GitHub stars
674
Token cost
~3.9k tokens
SKILL.md length
865 words
Files
8 (incl. scripts, references)
Skills in repo
61
Repo updated
First seen
Licence
MIT

At a glance

Tell the skill what your product shipped. An agent skill from Varnan-Tech/opendirectory.

  • Works in 8 steps: Setup Check → Parse Input → Run the Gather Script → …
  • Tasks that involve Social media posts
  • SKILL.md covers Reference Files, Step 1: Setup Check, Step 2: Parse Input and Step 3: Run the Gather Script, plus 6 more sections
  • Runs Python scripts from its folder; calls python3 and git; needs GITHUB_TOKEN

What it does

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.

When your agent uses it

  • Tasks that involve Social media posts
  • Tasks that involve Changelog and release notes

Example prompts

  • “/product-update-logger”

Requirements

  • Python 3
  • A credential in GITHUB_TOKEN

Workflow steps

8 steps, taken from the step headings in SKILL.md.

  1. Setup Check
  2. Parse Input
  3. Run the Gather Script
  4. Generate Changelog Entry
  5. Generate Content Package
  6. Self-QA
  7. Append to Changelog + Save Content
  8. Clean Up and Present

What it can do on your machine

Read from SKILL.md and the folder at commit 62e437a. 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

    Ships 1 file in scripts/ (Python), which the agent can run.

    Shell commands in SKILL.md call:

    • python3
    • git

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

  • Network

    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.

  • Credentials

    Names these keys or tokens, usually read from environment variables:

    • GITHUB_TOKEN

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

Context cost

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.

Always · name and description, kept in context so the agent knows when to use it
~58
When it runs · the whole SKILL.md, loaded when a task matches
~3.9k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~7.1k

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); the scripts in this folder are not scanned.

SKILL.md

The full file from Varnan-Tech/opendirectory at commit 62e437a, republished under its MIT licence (© Varnan-Tech). 865 words, ~3,930 tokens.

Download SKILL.mdSave it as .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.
name
product-update-logger
description
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.

product-update-logger

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.

Reference Files

Read these files before each run:

bash
cat references/changelog-format.md
cat references/content-rules.md
cat references/noise-filter.md

Step 1: Setup Check

bash
echo "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.


Step 2: Parse Input

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:

bash
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)'}")
PYEOF

Step 3: Run the Gather Script

bash
ls scripts/gather.py 2>/dev/null && echo "script found" || echo "ERROR: scripts/gather.py not found"
bash
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.json

Verify output:

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


Step 4: Generate Changelog Entry

Print items for context:

bash
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:

  • Do NOT invent outcomes or metrics. "40% faster" must come from the source data. If no number is in the commit or PR, do not add one.
  • Use past tense: "Added", "Fixed", "Improved" -- not "Adds", "Fixes"
  • Assign exactly one category to each item: New, Improved, Fixed, or Under the hood
  • Under the hood: Only include if developer-relevant (API changes, breaking changes). Omit empty sections.
  • Omit anything that maps to: test changes, CI changes, documentation-only commits

Determine version label:

  • If user specified one: use it exactly
  • If existing_changelog.format == "semver": increment based on changes (patch for fixes only, minor for any new feature)
  • Default: Week of [Month Day, Year] using today's date

Write the entry to /tmp/pul-entry.json:

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:

bash
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')
"

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

Step 5: Generate Content Package

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):

  • Tweet 1: Hook -- "We shipped [N] things this week." or lead with the biggest feature
  • Tweets 2-N: One item per tweet, 1-2 sentences max
  • Last tweet: "Changelog: [link]" or "More next week." (optional)
  • Each tweet strictly under 280 characters
  • No hashtags. No em dashes. Active voice.

LinkedIn post:

  • No markdown (asterisks render as literal on LinkedIn)
  • No hashtags
  • Founder voice: "We shipped", not "We are excited to announce"
  • Short paragraphs (1-2 sentences each), blank lines between them
  • Close with a question or observation, not a CTA
  • 150-400 words total

Email snippet:

  • Subject: "What shipped this week: [biggest item] + [1 more]"
  • Body: 50-100 words. "Here's what we shipped this week:" then bullets.

Write to /tmp/pul-content.json:

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."
  }
}

Step 6: Self-QA

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


Step 7: Append to Changelog + Save Content

bash
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}")
PYEOF

Step 8: Clean Up and Present

bash
rm -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:

  • One-liner: [text]
  • Tweet thread: numbered list of tweets
  • LinkedIn post: full text
  • Email snippet: subject line + body

3. Saved files:

  • docs/changelog.md -- updated (new entry prepended)
  • docs/product-updates/[date]-content.md -- full content package saved

Common Mistakes

The agent will want to...Why that's wrong
Invent outcomes or metricsEvery 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 LinkedInLinkedIn renders ** as literal asterisks. Plain text only.
Add hashtags to LinkedIn or tweetsThis 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 3Always 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" sectionOmit if empty. Silence is better than noise.
Combine multiple items into one tweetOne item per tweet. Specificity > breadth.
Pad with filler tweetsIf 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

Files

SKILL.md and 7 other files (scripts, references) in skills/product-update-logger of Varnan-Tech/opendirectory.

  • SKILL.md
  • .env.example
  • README.md
  • evals/evals.json
  • references/changelog-format.md
  • references/content-rules.md
  • references/noise-filter.md
  • scripts/gather.py

Open the folder on GitHubat commit 62e437a

Compare with similar skills

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.

Product Update Logger compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Product Update Logger this skillVarnan-Tech/opendirectory674—~3.9kAutomated safety check: PassMIT
Changelog Social RecapFlorianBruniaux/claude-code-ultimate-guide6.1k—~1.8kAutomated safety check: NotesCC-BY-SA-4.0
Mole Release Notes Publishertw93/Mole70k—~1.9kAutomated safety check: PassGPL-3.0
Book Publisherdmccreary/ibook-skills105—~1.3kAutomated safety check: PassCC-BY-NC-4.0
Announce Articleopen-cqrs/opencqrs118—~2.6kAutomated safety check: NotesApache-2.0
Linkedin Postholtzy/dataviz-inspiration147—~1.1kAutomated safety check: PassNone

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 2 days ago
    Writing & ContentAuto-check: notes
  • 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.

    70k GitHub stars~1.9k tokensUpdated today
    DevelopmentAuto-check passed
  • Book Publisher

    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…

    105 GitHub stars~1.3k tokensUpdated yesterday
    Writing & ContentAuto-check passed
  • Announce Article

    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.

    118 GitHub stars~2.6k tokensUpdated 11 days ago
    Writing & ContentAuto-check: notes
  • Linkedin Post

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

    147 GitHub stars~1.1k tokensUpdated 2 days ago
    Writing & ContentAuto-check passed
  • Linkedin Publisher

    eunomia-bpf/eunomia.dev

    Prepare or publish eunomia.dev content for LinkedIn posts, articles, carousels, and professional updates.

    236 GitHub stars~1.1k tokensUpdated today
    Writing & ContentAuto-check passed

More from Varnan-Tech/opendirectory

All 61 skills in this repo
  • Graphic Ebook

    Varnan-Tech/opendirectory

    Creates professionally designed B2B SaaS e-books in HTML + CSS, exported as print-ready PDF.

    674 GitHub stars~5k tokensUpdated 1 mo ago
    Auto-check passed
  • Docs From Code

    Varnan-Tech/opendirectory

    Generates and updates README.md and API reference docs by reading your codebase's functions, routes, types, schemas, and architecture.

    674 GitHub stars~1.8k tokensUpdated 1 mo ago
    Auto-check passed
  • Graphic Chart

    Varnan-Tech/opendirectory

    Generates data visualization charts (bar, line, area, pie, doughnut, scatter, radar, treemap) as PNG using Apache ECharts v6.

    674 GitHub stars~2.9k tokensUpdated 1 mo ago
    Auto-check passed
  • Graphic Gif

    Varnan-Tech/opendirectory

    Creates animated looping GIFs from CSS animations (default) or AI image-to-video.

    674 GitHub stars~3k tokensUpdated 1 mo ago
    Auto-check passed
  • Map Your Market

    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…

    674 GitHub stars~4.3k tokensUpdated 1 mo ago
    Auto-check passed
  • Newsletter Digest

    Varnan-Tech/opendirectory

    Aggregates RSS feeds from the past week, synthesizes the top stories using Gemini, and publishes a newsletter digest to Ghost CMS.

    674 GitHub stars~1.9k tokensUpdated 1 mo ago
    Auto-check passed

Questions about Product Update Logger

What does Product Update Logger do?

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.

When should I use Product Update Logger?

Product Update Logger fits situations like: tasks that involve Social media posts; tasks that involve Changelog and release notes.

How do I install Product Update Logger in Claude Code?

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.

How do I install Product Update Logger in Codex?

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.

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

What does Product Update Logger need to run?

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.

Does Product Update Logger access the network?

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.

Is Product Update Logger 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. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.

What licence does Product Update Logger use?

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.

How many tokens does Product Update Logger use?

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.

What are the alternatives to Product Update Logger?

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.

Who maintains Product Update Logger?

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.