
Github Readme
- 58 installs
- 93 repo stars
- Updated May 14, 2026
- thatrebeccarae/claude-marketing
Helps with documentation tasks.
About
github-readme is a Claude Code skill for documentation. It helps solo builders move faster with AI-assisted development.
- github-readme
- Documentation
- AI-coding skill
Github Readme by the numbers
- 58 all-time installs (skills.sh)
- +3 installs in the week ending Jul 27, 2026 (Skillselion tracking)
- Ranked #774 of 1,879 Documentation skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/thatrebeccarae/claude-marketing --skill github-readmeAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 58 |
|---|---|
| repo stars | ★ 93 |
| Last updated | May 14, 2026 |
| Repository | thatrebeccarae/claude-marketing ↗ |
What it does
Helps with documentation tasks.
Files
GitHub README Generator
Generate, audit, or update repository READMEs with project-type detection, voice calibration, discoverability guidance, and scored quality audits.
Install
git clone https://github.com/thatrebeccarae/claude-marketing.git && cp -r claude-marketing/skills/github-readme ~/.claude/skills/When to Use
- Starting a new public repo and need a solid README from scratch
- Auditing an existing README for quality, discoverability, and security issues
- Updating a README after the repo has evolved (new deps, features, structure)
- Preparing a repo for public release and want discoverability optimized
Modes
/github:readme generate [repo-path] # Scan repo, detect type, generate README
/github:readme audit [repo-path] # Score existing README (read-only, 0-100)
/github:readme update [repo-path] # Re-scan, silent audit, patch with approvalDefault repo-path is the current working directory if omitted.
---
Step 0: Parse and Validate
Expect: /github:readme {mode} [repo-path]
1. Extract mode — generate, audit, or update. Any other value or missing → error with usage hint. STOP. 2. Extract repo-path — second argument, or current working directory if omitted. 3. Validate — confirm path exists, is a directory, and contains .git. If not → error. STOP.
Store repo_path (absolute) and mode.
---
Step 1: Scan the Repo
Gather context by reading available files. Skip gracefully if a file does not exist.
Package/config files (tech stack detection):
package.json— Node/TypeScript/ReactCargo.toml— Rustpyproject.toml,setup.py,requirements.txt— Pythongo.mod— Gotsconfig.json— TypeScript confirmationDockerfile,docker-compose.yml— containerizationMakefile,justfile— build system.github/workflows/— CI/CD
Directory structure:
- Run
lsat repo root for top-level layout - Note:
src/,bin/,lib/,scripts/,docs/,tests/,skills/,templates/,plugins/,.github/
Existing docs:
README.md,CONTRIBUTING.md,SECURITY.md,LICENSE,ARCHITECTURE.md,CHANGELOG.md,CODE_OF_CONDUCT.md,llms.txt
Git remote:
- Run
git -C {repo_path} remote get-url origin - Extract
{owner}and{repo}from the URL - Determine public/private:
.public-repomarker → public;-devsuffix or no marker → ask user
---
Step 2: Detect Project Type
Classify the repo into exactly one type based on scan signals:
| Type | Signals |
|---|---|
| tool/CLI | Has bin field in package.json, CLI entry points, man pages, command parsers (yargs, clap, cobra) |
| library/SDK | Has main/exports/module field, published to npm/PyPI/crates.io, no CLI entry |
| collection/marketplace | Contains multiple independent items: skills/, templates/, plugins/, recipes/ directories with 3+ subdirectories |
| web-app | Has React/Vue/Svelte/Next/Nuxt, server framework (Express, FastAPI, Actix), deployment config (Vercel, Dockerfile) |
| personal/experimental | Small repo (<20 files), no package publishing config, no CI, no semver tags |
If ambiguous, ask the user to confirm. Store as project_type.
---
Step 3: Discoverability Audit
Before generating or auditing README content, check these repo-level discoverability signals. Present findings and suggestions to the user.
Repo name:
- Is it keyword-rich and searchable? (e.g.,
markdown-lint-action>my-linter) - Flag generic names:
app,project,tool,my-thing
GitHub About/description:
- Read via
gh repo viewif available - Should be 3-8 words, front-loaded with primary keyword
- Suggest improvement if missing or generic
Topics:
- GitHub allows up to 20 topics
- Suggest relevant topics based on detected tech stack, project type, and domain
- Include both broad (
typescript,cli) and specific (markdown-parser,github-action) topics
Social preview image:
- Flag if missing — suggest creating one (1280x640px recommended)
llms.txt (optional):
- If repo is a library/SDK or tool/CLI, suggest generating an
llms.txtfile - Purpose: helps LLMs understand and recommend the project accurately
Present discoverability suggestions. User can accept, skip, or defer. These do NOT block README generation.
---
Step 4: Generate / Audit / Update
Generate Mode
4a. Check for existing README — if present, confirm overwrite or suggest update mode instead.
4b. Select sections based on project type (see Section Menu below).
4c. Voice calibration:
- Default: professional product voice — clear, direct, no hedge language, no marketing fluff
- Personal/experimental repos OR explicit user opt-in: first-person voice allowed
- Never: passive voice in problem statements, emojis in prose, marketing fluff
4d. Generate each section:
- Title + description — derive name from package config or directory; one-line bold description under 120 chars
- Badges — see Badge Selection below
- Getting Started / Install — prerequisites with versions, install steps, first-run command. Under 20 lines.
- Type-specific sections — per Section Menu. Only include if enough scanned context exists.
- "Why" section (personal/experimental only) — ask user for 2-3 sentences. Do not fabricate.
- License — read LICENSE file type. One line linking to the file.
4e. Run PII/infrastructure scrub (see below). Remove violations before writing.
4f. Write {repo_path}/README.md and display summary.
Audit Mode (read-only)
Read existing README. Do NOT modify any files.
Run quality-signal checks and score against weighted rubric:
| Category | Weight | Checks |
|---|---|---|
| Clarity | 25 | Clear one-line description? Title is descriptive? |
| Usability | 25 | Working install/setup command? Code examples? Getting started under 20 lines? |
| Credibility | 15 | Badges present? Badge URLs resolve? License section present? |
| Currency | 15 | Version numbers match package config? Tech stack matches repo? No stale links? |
| Security | 20 | No PII or infrastructure leaks? No API keys/tokens? No private hostnames/IPs? |
Scoring: Each category scored 0-100, final score = weighted average.
=== README Audit: {repo-name} ===
Score: {X}/100
Clarity: {X}/25
Usability: {X}/25
Credibility: {X}/15
Currency: {X}/15
Security: {X}/20
PASS:
- {passing checks}
WARN:
- {warnings with specific detail}
FAIL:
- {failures with specific detail and fix suggestion}Update Mode
1. Re-scan repo (Step 1) to detect current state 2. Run silent audit — store results, do not display 3. Generate update plan — diff-style, grouped by category:
[STRUCTURE]— missing/outdated sections, badge changes[CONTENT]— stale version numbers, outdated tech references[VOICE]— hedge language, marketing fluff, passive voice[SECURITY]— PII/infra violations (applied automatically)
4. Show preview — numbered list of proposed changes 5. User approval — y (all), N (cancel), or comma-separated numbers 6. Apply, run final PII scrub, write file, display summary
---
Section Menu by Project Type
| Section | tool/CLI | library/SDK | collection | web-app | personal |
|---|---|---|---|---|---|
| Title + description | Required | Required | Required | Required | Required |
| Badges | Required | Required | Required | Required | Optional |
| Getting Started / Install | Required | Required | Required | Required | Required |
| Usage / Commands | Required | -- | -- | -- | -- |
| API Reference | -- | Required | -- | -- | -- |
| Catalog / Index | -- | -- | Required | -- | -- |
| Features | Recommended | Recommended | -- | Required | -- |
| Configuration | Recommended | Recommended | -- | Recommended | -- |
| Architecture | -- | -- | -- | Recommended | -- |
| Why I Built This | -- | -- | -- | -- | Required |
| Who This Is For | Recommended | Recommended | Recommended | -- | -- |
| Contributing | Recommended | Required | Recommended | Recommended | -- |
| License | Required | Required | Required | Required | Required |
---
Voice Guidelines
| Type | Default Tone | Example Opening |
|---|---|---|
| tool/CLI | Direct, practical | "Fast Markdown linting for CI pipelines." |
| library/SDK | Technical, precise | "A typed HTTP client for the Stripe API." |
| collection | Organized, scannable | "50+ reusable GitHub Actions workflows." |
| web-app | Product-focused, clear | "Real-time project dashboard with team analytics." |
| personal | First-person, opinionated | "I needed a better way to track reading habits." |
Always: direct, specific, opinionated, short paragraphs (4 sentences max). Never: hedge language, marketing fluff, passive voice in problem statements, emojis in prose.
---
Badge Selection
Based on detected tech stack, generate 1-3 tech badges + license badge minimum.
Use style=for-the-badge for all badges. Generic patterns:





Badge order: tech stack (left) → stars → license (right).
---
PII / Infrastructure Scrub
Run in ALL modes. Scan generated or existing README text for:
- [ ] Private hostnames
- [ ] IP addresses (especially 10.x, 172.16-31.x, 192.168.x, 100.x Tailscale)
- [ ] Internal network/VLAN names
- [ ] Device identifiers or serial numbers
- [ ] Client or employer names that should not be public
- [ ] Personal email addresses
- [ ] API keys or tokens (
sk-,token_,ghp_,Bearer, long alphanumeric strings) - [ ] Internal Docker/service config (private port mappings, container names)
- [ ] SSH config references (aliases, private key paths)
If violations found: list each, remove or redact, show user what was removed. Security violations are never optional — applied automatically in update mode.
---
Key Principles
- Detect, don't assume. Scan the repo and adapt structure to what actually exists.
- Professional by default. First-person voice is opt-in, not the default.
- Discoverability matters. Repo name, description, topics, and llms.txt are part of the README story.
- Quality over completeness. Fewer well-written sections beat bloated README with empty placeholders.
- Security is non-negotiable. PII/infra scrub runs in every mode, every time.
- Audit mode is read-only. Never modify files during an audit.
GitHub README — Examples
---
Example 1: Generate README for a TypeScript CLI Tool
Prompt:
Generate a README for this repo. It's a CLI tool for bulk-renaming files with regex patterns.
Expected output: Title + badges (TypeScript, Node.js >=18, MIT license, GitHub stars), one-line description, and these sections:
- Why I Built This — Skill asks user for motivation, never fabricates
- Getting Started — Prerequisites (Node >= 18),
npm install -g rename-cli - Commands — Table format:
| Command | Description |
|---|---|
rename match <pattern> | Preview files matching the regex |
rename apply <pattern> <replacement> | Rename all matched files |
rename undo | Revert last rename operation |
- Configuration —
.renamercoptions - Contributing — Fork/branch/PR instructions
- License — MIT
Professional voice. No emojis in prose. No "Why I Built This" fabrication. for-the-badge style on all badges.
---
Example 2: Generate README for a Python Library
Prompt:
Generate a README for this Python library that provides rate-limiting decorators for async functions.
Expected output: Title + badges (Python 3.11+, PyPI version, MIT license, stars), then:
- Why I Built This — User-provided
- Getting Started —
pip install ratelimit-async/poetry add ratelimit-async - Quick Start — Working code example:
from ratelimit_async import limit
@limit(calls=10, period=60)
async def fetch_data(url: str) -> dict:
...- API Reference — Function signatures with parameter docs:
@limit(calls, period, strategy="sliding_window")— params, types, defaults@limit_concurrent(max_concurrent)— concurrency capRateLimitExceeded— exception class- Contributing / License
Technical voice. Function signatures are exact. Install commands cover pip and poetry.
---
Example 3: Generate README for a Skill/Template Collection
Prompt:
Generate a README for this repo. It contains 30+ Claude Code skills for marketing.
Expected output: Title + badges (Claude Code, MIT, stars, LinkedIn, X — social badges because user confirms flagship), then:
- Why I Built This — User-provided
- Quick Start — Clone, copy to
~/.claude/skills/, invoke with/skill-name - Skills Catalog — Categorized tables (not a flat list):
| Skill | Description |
|---|---|
gcd-producer | Generate content drafts from briefs |
github-readme | Generate, audit, or update repo READMEs |
research-analyst | Deep research briefs with source synthesis |
- How Skills Work — SKILL.md structure, tool access
- Composing Skills — Chaining workflows (research -> produce -> review)
- Configuration / Contributing / License
Catalog voice — organized, browsable. Skills grouped by category with tables.
---
Example 4: Audit an Existing README
Prompt:
Audit the README for this repo.
Expected output (read-only, no files modified):
=== README Audit: rename-cli ===
Score: 68/100
Description: 12/15 — Clear but doesn't mention target audience
Installation: 15/20 — npm command works but missing prerequisites
Usage: 8/20 — No code examples, only text description
Badges: 5/10 — License badge missing, npm badge stale
Structure: 10/15 — Good order but missing Contributing section
Completeness: 8/10
Freshness: 10/10
FAIL:
- Required badge missing: License
- npm badge URL returns 404 (package name mismatch)
- No Contributing section (public repo)
WARN:
- Badge style inconsistent (mixing flat and for-the-badge)
- "Install" should be "Getting Started"
- One paragraph exceeds 4 sentences
Discoverability:
- Repo description empty — add: "Bulk-rename files with regex patterns"
- No topics — suggest: typescript, cli, file-rename, regex
- No social preview image
Suggested fixes:
- Add: []
- Fix npm badge package name: "rename-cli" not "rename"
- Add Contributing section with fork/branch/PR instructionsScored with category breakdown per REFERENCE.md rubric. Includes discoverability audit for repo metadata (description, topics, social preview).
---
Example 5: Update README After Adding Features
Prompt:
Update the README. We added a --dry-run flag and dropped Node 16 support.
Expected output — diff-style preview:
=== README Update Plan: rename-cli ===
5 changes proposed:
1. [BADGE] Node.js version
- Node.js-%3E%3D16
+ Node.js-%3E%3D18
2. [SECTION] Commands table — add --dry-run
+ | `rename apply --dry-run` | Preview renames without executing |
3. [SECTION] Getting Started — prerequisites
- Node.js >= 16
+ Node.js >= 18
4. [STRUCTURE] Nav anchors missing Configuration link
5. [VOICE] Hedge language in Why I Built This
- "This might be useful if you need to..."
+ "I built this because renaming files in bulk shouldn't require..."
Apply all changes? [y/N/select]User responds select 1,2,3 — applies badge update, new command row, and prerequisites only. Skips nav anchors and voice rewrite.
=== README Updated: rename-cli ===
Changes applied: 3 of 5
PII/Infra scrub: PASS
Updated: /path/to/repo/README.mdSelective apply lets user accept feature updates while deferring style fixes. PII scrub runs on final output regardless.
MIT License
Copyright (c) 2026 Rebecca Rae Barton
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
GitHub README — Reference
Technical data, templates, and patterns for the github-readme skill.
---
Badge URL Patterns
All badges use shields.io. Default style is style=for-the-badge. Append &style=flat for inline/compact use.
Repository Badges
<!-- GitHub stars -->
[](https://github.com/{owner}/{repo}/stargazers)
<!-- License (auto-detect from repo) -->
[](LICENSE)
<!-- License (hardcoded MIT) -->
[](LICENSE)
<!-- Build status (GitHub Actions) -->
[](https://github.com/{owner}/{repo}/actions)
<!-- Last commit -->
[](https://github.com/{owner}/{repo}/commits)
<!-- npm version -->
[](https://npmjs.com/package/{package})
<!-- PyPI version -->
[](https://pypi.org/project/{package})
<!-- crates.io version -->
[](https://crates.io/crates/{crate})
<!-- Docker pulls -->
[](https://hub.docker.com/r/{owner}/{image})
<!-- Coverage (Codecov) -->
[](https://codecov.io/gh/{owner}/{repo})
<!-- npm downloads -->
[](https://npmjs.com/package/{package})Tech Stack Badges
Pattern: brand color on LEFT (labelColor), gray #555 on RIGHT.
<!-- TypeScript -->
[](#)
<!-- Node.js -->
[](#)
<!-- Python -->
[](https://python.org)
<!-- Rust -->
[](https://rust-lang.org)
<!-- Go -->
[](https://go.dev)
<!-- React -->
[](https://react.dev)
<!-- Vue -->
[](https://vuejs.org)
<!-- Next.js -->
[](https://nextjs.org)
<!-- Docker -->
[](https://docker.com)
<!-- Tauri -->
[](https://v2.tauri.app)
<!-- Claude Code -->
[](https://docs.anthropic.com/en/docs/claude-code)
<!-- Tailwind CSS -->
[](https://tailwindcss.com)
<!-- Prisma -->
[](https://prisma.io)
<!-- PostgreSQL -->
[](https://postgresql.org)
<!-- SQLite -->
[](https://sqlite.org)
<!-- n8n -->
[](https://n8n.io)
<!-- Framer -->
[](https://framer.com)Social Badges (flagship repos only)
[](https://linkedin.com/in/rebeccaraebarton)
[](https://x.com/rebeccarae)Clone Badge
[](https://github.com/{owner}/{repo})---
Section Templates
Title Block (Hero)
<div align="center">
# Project Name
**One-line description under 120 characters stating what this does.**
[](#) [](#) [](#) [](#)
<br>
git clone https://github.com/{owner}/{repo}.git
<br>
<!-- Screenshot or demo (width="760") -->
<br><br>
[Why I Built This](#why-i-built-this) · [Getting Started](#getting-started) · [Features](#features) · [License](#license)
</div>
---Features List
## Features
**Category One**
- **Feature name** — What it does and why it matters
- **Feature name** — What it does and why it matters
**Category Two**
- **Feature name** — What it does and why it mattersInstallation
## Getting Started
### Prerequisites
- Node.js >= 22
- npm >= 10
### Install
npm
npm install {package}
yarn
yarn add {package}
pnpm
pnpm add {package}
pip
pip install {package}
uv
uv add {package}
cargo
cargo install {crate}
go
go install github.com/{owner}/{repo}@latest
git clone
git clone https://github.com/{owner}/{repo}.git cd {repo} npm install
Quick Start
## Quick Start
import { Client } from "{package}";
const client = new Client({ apiKey: process.env.API_KEY }); const result = await client.doSomething({ input: "value" }); console.log(result);
CLI Commands Table
## Commands
| Command | Description |
|---------|-------------|
| `tool init [name]` | Initialize a new project |
| `tool build` | Build for production |
| `tool dev` | Start dev server with hot reload |
| `tool test` | Run test suite |
| `tool lint` | Lint and format |
### `tool init`
tool init [project-name] [--template <name>] [--no-git]
**Options:**
| Flag | Default | Description |
|------|---------|-------------|
| `--template` | `basic` | Starter template |
| `--no-git` | `false` | Skip git initialization |API Reference (Expandable)
## API Reference
<details>
<summary><code>GET /v1/resources</code> — List all resources</summary>
**Parameters:**
| Param | Type | Required | Description |
|-------|------|----------|-------------|
| `limit` | integer | No | Max results (default: 20) |
| `offset` | integer | No | Pagination offset |
**Response:**
{ "data": [], "total": 100, "limit": 20, "offset": 0 }
</details>
<details>
<summary><code>POST /v1/resources</code> — Create a resource</summary>
**Body:**
{ "name": "string (required)", "type": "string" }
**Response:** `201 Created`
</details>Environment Variables Table
## Configuration
| Variable | Required | Default | Description |
|----------|----------|---------|-------------|
| `API_KEY` | Yes | -- | API key from dashboard |
| `PORT` | No | `3000` | Server port |
| `LOG_LEVEL` | No | `info` | `debug`, `info`, `warn`, `error` |
| `DATABASE_URL` | Yes | -- | PostgreSQL connection string |
Copy `.env.example` to `.env` and fill in values:
cp .env.example .env
Architecture Overview
## Architecture
repo/ ├── src/ │ ├── core/ # Core business logic │ ├── api/ # API routes and handlers │ ├── lib/ # Shared utilities │ └── index.ts # Entry point ├── config/ # Configuration files ├── scripts/ # Build and deploy scripts └── tests/ # Test suites
Brief explanation of data flow or key design decisions (2-3 sentences).Contributing
## Contributing
Contributions welcome. See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.
1. Fork the repo
2. Create a feature branch (`git checkout -b feature/thing`)
3. Commit changes (`git commit -m 'Add thing'`)
4. Push (`git push origin feature/thing`)
5. Open a Pull RequestLicense
## License
MIT -- see [LICENSE](LICENSE) for details.---
Project Type Detection Signals
| Signal | Detected Type |
|---|---|
bin field in package.json | CLI tool |
exports or main in package.json (no bin) | Library/SDK |
skills/ dir with SKILL.md files | Skill pack / collection |
templates/ dir with multiple template files | Collection / marketplace |
next.config.* or nuxt.config.* | Web app (SSR) |
vite.config.* or webpack.config.* | Web app (SPA) |
app/ or pages/ dir + framework config | Web app |
routes/ or openapi.yaml/swagger.json | API service |
packages/ dir or workspaces in package.json | Monorepo |
Dockerfile + docker-compose.yml (no app src) | Infrastructure / ops |
src-tauri/ or tauri.conf.json | Desktop app (Tauri) |
pyproject.toml with [project.scripts] | Python CLI |
pyproject.toml with [project] (no scripts) | Python library |
Cargo.toml with [[bin]] | Rust CLI |
Cargo.toml with [lib] | Rust library |
go.mod + main.go at root | Go CLI |
go.mod + no main.go at root | Go library |
.github/actions/ or action.yml | GitHub Action |
serverless.yml or sam-template.yaml | Serverless function |
---
Audit Scoring Rubric
Total: 100 points. Each category is weighted and scored independently.
| Category | Weight | Score 0 | Score 50 | Score 100 |
|---|---|---|---|---|
| Description | 15% | No description or generic placeholder | Description exists but vague or over 120 chars | Clear one-liner, explains what + who, under 120 chars |
| Installation | 20% | No install instructions | Install steps exist but missing prerequisites or package name wrong | Working install command, prerequisites with versions, copy-pasteable |
| Usage/Examples | 20% | No code examples | Examples exist but incomplete or use placeholder values | Working examples covering primary use case, syntactically valid |
| Badges | 10% | No badges | Some badges but broken URLs or inconsistent style | Relevant badges, all resolve, consistent for-the-badge style |
| Structure | 15% | Missing multiple required sections | Sections present but wrong order or names | All required sections, correct order, template-compliant names |
| Completeness | 10% | Placeholder text remaining, TODO markers | Most sections filled but some thin | All sections substantive, no placeholders, no TODO markers |
| Freshness | 10% | Stale version numbers, references removed features | Mostly current, minor drift | Version numbers current, all references accurate, badges valid |
Scoring formula: sum(category_score * weight) rounded to nearest integer.
Grade thresholds:
- 90-100: Excellent -- no action needed
- 70-89: Good -- minor improvements recommended
- 50-69: Needs work -- several sections require attention
- Below 50: Poor -- consider running generate mode
---
Discoverability Reference
GitHub Search Ranking Factors
Priority order for how GitHub search weights content:
1. Repository name — exact and partial matches rank highest 2. Description — the About field on the repo page 3. Topics — tagged topics visible below description 4. README content — full-text indexed but lowest weight
Topic Best Practices
- Use lowercase, hyphenated terms (
cli-tool, notCLI Tool) - Prefer single-concept topics (
typescript,readme-generator) - Max 20 topics per repo (GitHub hard limit)
- Include: language, framework, domain, use-case
- Avoid: generic terms (
awesome,tool), version numbers, duplicating the repo name
Social Preview Image
- Dimensions: 1280 x 640 px (2:1 ratio)
- Format: PNG or JPG, under 1MB
- Set via repo Settings > Social Preview
- Should include: project name, one-line description, visual identity
- Avoid: small text, busy backgrounds, screenshots at low resolution
llms.txt Specification
A llms.txt file tells LLMs what a project does and how to use it.
- Location: repo root (
/llms.txt) - Format: plain text, structured sections
- Sections: Title, Description, Quick Start, API surface, Key concepts
- Purpose: LLM-optimized alternative to README -- dense, no marketing, no images
- Spec: https://llmstxt.org
- Also generate
llms-full.txtfor comprehensive reference if project is complex
AEO (Answer Engine Optimization) Patterns
Structure README content so AI assistants and search engines can extract direct answers:
- Semantic headings: Use descriptive H2/H3 that match common questions (
## Installation,## How It Works, not## Section 3) - Direct answers first: Lead each section with a 1-2 sentence summary before details
- Cited data points: Include specific numbers, versions, benchmarks where relevant
- Definition patterns: "X is a Y that does Z" in the first paragraph
- Comparison-friendly: When relevant, name alternatives and state differentiators
- Structured data: Tables and lists over prose for reference material
---
PII/Infrastructure Scrub Patterns
Regex patterns for detecting common leaks. Run against all generated README text before writing.
Email Addresses
[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}Allowlist: noreply@github.com, action@github.com, example.com domain.
IP Addresses (RFC 1918 Private Ranges)
# 10.x.x.x
10\.\d{1,3}\.\d{1,3}\.\d{1,3}
# 172.16-31.x.x
172\.(1[6-9]|2\d|3[01])\.\d{1,3}\.\d{1,3}
# 192.168.x.x
192\.168\.\d{1,3}\.\d{1,3}
# Tailscale (100.x.x.x CGNAT range)
100\.(6[4-9]|[7-9]\d|1[0-2]\d)\.\d{1,3}\.\d{1,3}API Keys and Tokens
# AWS access key
AKIA[0-9A-Z]{16}
# AWS secret key (generic 40-char base64)
[A-Za-z0-9/+=]{40}
# GitHub token (classic and fine-grained)
gh[ps]_[A-Za-z0-9_]{36,}
github_pat_[A-Za-z0-9_]{22,}
# Slack token
xox[bpors]-[A-Za-z0-9-]+
# Slack webhook
hooks\.slack\.com/services/T[A-Z0-9]+/B[A-Z0-9]+/[A-Za-z0-9]+
# Generic bearer/API key patterns
(sk|pk|api|key|token|secret|password)[_-]?[A-Za-z0-9]{20,}
# OpenAI
sk-[A-Za-z0-9]{48}
# Anthropic
sk-ant-[A-Za-z0-9-]{40,}Internal Hostnames
# Specific known hostnames (case-insensitive) — replace with your own
(?i)\b(internal-host-a|internal-host-b)\b
# Generic internal hostname patterns
\b[a-z]+-?(dev|staging|internal|local)\.[a-z]+\.(local|internal|lan)\bPrivate Key Material
-----BEGIN (RSA |EC |DSA |OPENSSH )?PRIVATE KEY-----File Paths Containing Usernames
# macOS home directories
/Users/[a-zA-Z][a-zA-Z0-9._-]+/
# Linux home directories
/home/[a-zA-Z][a-zA-Z0-9._-]+/
# Windows user directories
C:\\Users\\[a-zA-Z][a-zA-Z0-9._-]+\\Client Names and Internal References
# Replace with your client names and internal codenames
(?i)\b(client-name-a|client-name-b|project-codename)\bDevice Identifiers
\b[A-Z]{5,8}\b # Serial-like patterns (review matches manually)---
Voice Calibration Matrix
Adapt tone and structure based on detected project type.
| Type | Tone | Lead With | Avoid |
|---|---|---|---|
| CLI tool | Direct, efficient | What it does + install command | Backstory, philosophy |
| Library/SDK | Technical, precise | Import statement + API surface | Marketing language, superlatives |
| Collection/marketplace | Catalog, organized | What's inside + how to browse/install | Personal narrative, long intros |
| Web app | Demo-focused, visual | Screenshot + try-it link | Implementation details upfront |
| API service | Reference-oriented | Base URL + auth + first request | Narrative prose, lengthy motivation |
| Personal project | Conversational, first-person | Why I built this + the problem | Corporate tone, passive voice |
| GitHub Action | Integration-focused | Usage YAML snippet | Architecture deep-dives |
| Monorepo | Navigational, structured | Package table + what each does | Treating it like a single project |
| Desktop app | User-focused | Download link + screenshot | Build-from-source as primary path |
| Infrastructure | Ops-oriented | Requirements + deploy command | End-user language |
Voice Examples by Type
CLI tool -- lead sentence:
{tool} finds unused dependencies in your Node.js project and removes them.Library -- lead sentence:
A TypeScript client for the {service} API with full type safety and automatic retry.
Collection -- lead sentence:
55 Claude Code skills for content marketing, developer tools, and design workflows.
Personal project -- lead sentence:
I needed a way to track time without leaving the terminal, so I built one.
---