Not in the top 1,000 by GitHub stars

hassancs91/content-factory-starter

A Claude Code skill that turns a one-line idea into a published, evidence-backed page. Recon, real lab experiments, verification loops, two human checkpoints. Free and MIT.

History

Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.

View weekly changes

content-factory/SKILL.md

Week of Nov 2, 2026 · Line counts unavailable

Before Not checked yet → After Network or broad shell

First observation → 412b62cb42e6

No earlier version was observed for comparison.

Compare on GitHub

View on GitHubAdd to my skills

Verified commit 412b62cb42e6c84c9ab4c2ff09a43e7a902c9838

10GitHub stars
Not availablestars in 7 days
1skill in this repository
2commits in 30 days

Heat

Insufficient history

Not enough history yet to measure heat. It appears after a few days of data.

Heat never changes the order by stars, and sponsorship never touches it. How heat works

Stars over time

Nov 3, 2026Nov 3, 202610

30-day change not yet available: not enough history.

Individual skills in this repository

How it works

Content Factory

When your agent uses it

End-to-end content pipeline — idea in, published evidence-backed page out. Orchestrates search recon, real lab experiments (cloud VMs / local Docker), screenshot and asset production, drafting in a defined voice, verification loops, ship, and a write-back to your knowledge base. Triggers on "/factory ...", "new piece ...", "factory status", "resume <slug>", "refresh <slug>", "continue the <slug> piece", or any request to create a page that needs experiments, captures, or SERP recon.

What it loads into context

Frontmatter

124 tokens

Always available to the agent

SKILL.md

3,715 tokens

When the skill is activated

Reference documents

22,142 tokens

Loaded on request

Token counts are estimates. Scripts run separately; they are not counted as reference context.

The playbook

  1. The one rule that makes everything else work
  2. Load this before any task
  3. Tasks
  4. Parallel sessions
  5. Hard rules
  6. When NOT to use this skill

Scripts executed separately

  • lab/_config.py
  • lab/auth.py
  • lab/bootstrap-ubuntu.sh
  • lab/capture.py
  • lab/dns.py
  • lab/do.py
  • lab/ledger.py
  • lab/lint_draft.py
  • lab/lock.py

Files

  • SETUP.mddoc3,980 bytes
  • SKILL.mdcore14,794 bytes
  • SKILL.mdcore14,794 bytes
  • SKILL.mdcore14,794 bytes
  • SKILL.mdcore14,794 bytes
  • SKILL.mdcore14,794 bytes
  • SKILL.mdcore14,794 bytes
  • SKILL.mdcore14,794 bytes
  • SKILL.mdcore14,794 bytes
  • SKILL.mdcore14,794 bytes
  • SKILL.mdcore14,794 bytes
  • lab/_config.pyruns2,577 bytes
  • lab/auth.pyruns6,727 bytes
  • lab/bootstrap-ubuntu.shruns937 bytes
  • lab/capture.pyruns5,024 bytes
  • lab/clone-kit/chrome.cssasset3,640 bytes
  • lab/clone-kit/example-browser.htmlasset605 bytes
  • lab/clone-kit/example-terminal.htmlasset879 bytes
  • lab/dns.pyruns5,160 bytes
  • lab/do.pyruns16,378 bytes
  • lab/ledger.pyruns10,852 bytes
  • lab/lint_draft.pyruns6,167 bytes
  • lab/lock.pyruns16,312 bytes
  • memory/MEMORY.mddoc5,500 bytes
  • memory/lesson_assert_on_what_the_user_sees.mddoc1,903 bytes
  • memory/lesson_bash_s_stdin_trap.mddoc1,129 bytes
  • memory/lesson_evidence_scripts_pipefail_and_sentinels.mddoc2,553 bytes
  • memory/lesson_experiments_that_break_their_transport.mddoc2,898 bytes
  • memory/lesson_gpu_droplet_lab.mddoc1,816 bytes
  • memory/lesson_lab_cost_is_wallclock_not_experiments.mddoc2,182 bytes
  • memory/lesson_lazy_images_blank_in_fullpage_captures.mddoc1,317 bytes
  • memory/lesson_measure_before_you_reshoot.mddoc2,682 bytes
  • memory/lesson_never_edit_running_driver.mddoc1,273 bytes
  • memory/lesson_no_shared_mutable_files.mddoc4,265 bytes
  • memory/lesson_path_scoped_commit_ignores_the_index.mddoc2,513 bytes
  • memory/lesson_pkill_matches_the_remote_wrapper.mddoc1,586 bytes
  • memory/lesson_probe_differentiator_before_recon.mddoc2,168 bytes
  • memory/lesson_remote_script_traps.mddoc2,146 bytes
  • memory/lesson_timeboxed_experiments.mddoc1,755 bytes
  • memory/lesson_v6_capture_long_pages.mddoc1,858 bytes
  • memory/lesson_windows_experiment_harness.mddoc3,606 bytes
  • modules/assets.mddoc4,242 bytes
  • modules/brain.mddoc5,140 bytes
  • modules/lab.mddoc7,101 bytes
  • modules/recon.mddoc4,339 bytes
  • modules/verify.mddoc5,545 bytes
  • profiles/writer-profile.example.mddoc4,179 bytes
  • templates/PIECE.mddoc5,498 bytes
  • templates/claims.mddoc1,862 bytes
  • templates/evidence-manifest.mddoc2,464 bytes
  • templates/recon-report.mddoc1,808 bytes
Read SKILL.md

# Content Factory — Orchestrator

This skill runs a content pipeline where **the evidence is generated before the writing
starts**. The model is one component. The pipeline around it is what makes the output
worth publishing.

Read [SETUP.md](SETUP.md) once before the first run — the pipeline expects a handful of
files to exist and a few decisions to have been made.

| Module | File | What it covers |
|---|---|---|
| Lab (cloud VMs, local Docker) | [modules/lab.md](modules/lab.md) | Where experiments run and how they get torn down |
| Recon | [modules/recon.md](modules/recon.md) | What to learn about the topic before writing |
| Assets | [modules/assets.md](modules/assets.md) | Captures, clones, charts, social cards |
View the complete source on GitHub

Skills included

  • Content Factory

Repository facts

License
MIT
Created
Aug 17, 2026
Last pushed
Nov 5, 2026
Forks
7
Open issues
0
Project activity
Active

Before you install

Network or broad shell

Automated signals, not a guarantee

Checked Nov 6, 2026

Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.

Show 9 notes
  • content-factory/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • content-factory/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • content-factory/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • content-factory/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • content-factory/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • content-factory/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • content-factory/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • content-factory/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • content-factory/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
Show all 63 signals by file

content-factory/SETUP.md

  • Access to secretsline 57
    [Credential-related source omitted]

content-factory/lab/_config.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Access to secretsline 23
    [Credential-related source omitted]
  • Access to secretsline 38
    [Credential-related source omitted]
  • Access to secretsline 60
    [Credential-related source omitted]
  • Access to secretsline 75
    [Credential-related source omitted]

content-factory/lab/auth.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 9
    python .claude/skills/content-factory/lab/auth.py \         --url https://app.example.com/login --out content-lab/.auth/app.json \
  • Network accessline 10
    --url https://app.example.com/login --out content-lab/.auth/app.json \
  • Network accessline 15
    python .claude/skills/content-factory/lab/capture.py \         --url https://app.example.com/usage --out assets/raw/usage.png \
  • Network accessline 16
    --url https://app.example.com/usage --out assets/raw/usage.png \

content-factory/lab/bootstrap-ubuntu.sh

  • Executable scriptline 1
    #!/usr/bin/env bash
  • Network accessline 13
    echo "== apt base ==" $APT update -y $APT install -y ca-certificates curl git jq htop unzip
  • Network accessline 15
    $APT install -y ca-certificates curl git jq htop unzip
  • Network accessline 17
    echo "== docker ==" curl -fsSL https://get.docker.com | sh
  • Dangerous shell operationline 18
    curl -fsSL https://get.docker.com | sh
  • Network accessline 18
    curl -fsSL https://get.docker.com | sh
  • Dangerous shell operationline 29
    rm -rf /var/lib/apt/lists/*

content-factory/lab/capture.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 7
    python capture.py --url https://... --out shot.png
  • Network accessline 9
    python capture.py --url http://127.0.0.1:8150/my-page/ --out full.png --full --dark
  • Network accessline 14
    python capture.py --url https://app.example.com/usage \

content-factory/lab/dns.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Dangerous shell operationline 13
    python dns.py rm myapp
  • Network accessline 36
    API = "https://api.cloudflare.com/client/v4"
  • Network accessline 56
    def api(method, path, body=None):     req = urllib.request.Request(
  • Network accessline 57
    req = urllib.request.Request(
  • Network accessline 62
    )     try:         with urllib.request.urlopen(req, timeout=30) as r:
  • Network accessline 63
    try:         with urllib.request.urlopen(req, timeout=30) as r:             data = json.loads(r.read())
  • Network accessline 64
    with urllib.request.urlopen(req, timeout=30) as r:

content-factory/lab/do.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Access to secretsline 13
    [Credential-related source omitted]
  • Network accessline 34
    API = "https://api.digitalocean.com/v2"
  • Access to secretsline 35
    [Credential-related source omitted]
  • Network accessline 50
    def api(method, path, body=None):     req = urllib.request.Request(
  • Network accessline 51
    req = urllib.request.Request(
  • Network accessline 56
    )     try:         with urllib.request.urlopen(req, timeout=30) as r:
  • Network accessline 57
    try:         with urllib.request.urlopen(req, timeout=30) as r:             raw = r.read()
  • Network accessline 58
    with urllib.request.urlopen(req, timeout=30) as r:

content-factory/lab/ledger.py

  • Executable scriptline 1
    #!/usr/bin/env python3

content-factory/lab/lint_draft.py

  • Executable scriptline 1
    #!/usr/bin/env python3

content-factory/lab/lock.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Access to secretsline 65
    [Credential-related source omitted]
  • Access to secretsline 70
    [Credential-related source omitted]

content-factory/memory/MEMORY.md

  • Network accessline 35
    - [Lazy images render blank in full-page captures](lesson_lazy_images_blank_in_fullpage_captures.md) — Playwright's `full_page=True` never scrolls, so `loading="lazy"` images shoot as empty boxes; pre-scroll first, and curl the asset URL be

content-factory/memory/lesson_lazy_images_blank_in_fullpage_captures.md

  • Network accessline 15
    like that or shoot viewport stops (which scroll by construction). If a screenshot shows an empty framed box where an `<img>` should be, suspect this before suspecting paths — `curl -w %{http_code}` the static URL first; it costs nothing and
  • Network accessline 17
    `curl -w %{http_code}` the static URL first; it costs nothing and splits the two causes.

content-factory/memory/lesson_probe_differentiator_before_recon.md

  • Network accessline 35
    **Method note that cost a round:** probe reachability with a real TCP connect (`/dev/tcp/$ip/$port`), never `curl`. curl reported port 22 as unreachable on a box we were
  • Dangerous shell operationline 36
    (`/dev/tcp/$ip/$port`), never `curl`. curl reported port 22 as unreachable on a box we were
  • Network accessline 36
    (`/dev/tcp/$ip/$port`), never `curl`. curl reported port 22 as unreachable on a box we were

content-factory/memory/lesson_remote_script_traps.md

  • Network accessline 19
    **2. `curl -s url | grep -q pattern` fails on a MATCH under `set -o pipefail`.**
  • Network accessline 20
    grep -q exits on first match and closes the pipe; curl takes SIGPIPE → exit 23 →
  • Network accessline 22
    `OUT=$(curl -s url || true); echo "$OUT" | grep -q pattern`.

content-factory/modules/assets.md

  • Network accessline 14
    python $CAP --url https://your-lab-box.example.com/... --out assets/raw/app.png
  • Network accessline 15
    python $CAP --url http://127.0.0.1:8150/your-page/ --out assets/raw/page.png --full
  • Network accessline 24
    python .claude/skills/content-factory/lab/auth.py \     --url https://app.example.com/login --out content-lab/.auth/app.json \
  • Network accessline 25
    --url https://app.example.com/login --out content-lab/.auth/app.json \
  • Network accessline 27
    python $CAP --url https://app.example.com/usage --out assets/raw/usage.png \

content-factory/modules/lab.md

  • Dangerous shell operationline 58
    python $D rm plausible          # teardown
  • Access to secretsline 67
    [Credential-related source omitted]

content-factory/modules/verify.md

  • Network accessline 92
    CAP=.claude/skills/content-factory/lab/capture.py python $CAP --url http://127.0.0.1:<port>/<path>/ --out assets/raw/v6-desktop.png --full
  • Network accessline 93
    python $CAP --url http://127.0.0.1:<port>/<path>/ --out assets/raw/v6-desktop.png --full
  • Network accessline 94
    python $CAP --url http://127.0.0.1:<port>/<path>/ --out assets/raw/v6-mobile.png --width 390 --height 844 --dpr 3 --full

How the signals fit together

Facts from a static read of the files at the pinned commit. They describe what the code does, not why.

Combined signals: 1 fact
Declared and executed: 3 facts
Signal confidence: 63 facts

and 13 more

Works with

Agent compatibility, from the files in this repository
AgentStatusEvidenceInstall to
Claude CodeUnknownNo evidence
CodexUnknownNo evidence
CursorUnknownNo evidence
Gemini CLIUnknownNo evidence
GitHub CopilotUnknownNo evidence
OpenCodeUnknownNo evidence
  • Native The repository ships a manifest, folder or frontmatter field for this agent.
  • Compatible A standard SKILL.md that this agent can read.
  • Unknown No evidence either way.

Derived automatically from paths, manifests and frontmatter. Not tested on each agent.