Agent skill

Press Clip

by elvisun in elvisun/newsjack

Turn a live article URL into a press clip that looks like the real coverage — the publication's own logo, fonts, photos and layout kept intact, the ads and clutter removed, and (for a roundup) just…

MITAuto-check passedDocuments & Office

Install Press Clip

skills CLI
$ npx skills add elvisun/newsjack --skill press-clip -a claude-code

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

GitHub CLI
$ gh skill install elvisun/newsjack press-clip --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/elvisun/newsjack.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/press-clip .claude/skills/press-clip && 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
press-clip
GitHub stars
1.5k
Token cost
~3.5k tokens
SKILL.md length
2,035 words
Files
2
Skills in repo
30
Repo updated
First seen
Licence
MIT

At a glance

Turn a live article URL into a press clip that looks like the real coverage — the publication's own logo, fonts, photos and layout kept intact, the ads and clutter removed, and (for a roundup) just…

  • Works in 4 steps: Run the baseline clip → Review with a separate agent — required,… → Apply the drops, re-render, and… → …
  • Documents & Office work in your project
  • SKILL.md covers The one rule that shapes…, What you need, Setup and The workflow, plus 4 more sections
  • Runs JavaScript scripts from its folder; calls node and npm

What it does

Press Clip is an agent skill from elvisun/newsjack. Turn a live article URL into a press clip that looks like the real coverage — the publication's own logo, fonts, photos and layout kept intact, the ads and clutter removed, and (for a roundup) just the client's section. Renders to PDF. You inspect each site and tailor the removal; the bundled script carries no site-specific logic.

Its SKILL.md is about 3.5k tokens, which your agent loads only when the skill is triggered. The skill folder holds 1 other file.

It sits in Documents & Office. The repository describes itself as: The open-source skills that turn your agent into a full PR team. The licence is MIT.

When your agent uses it

  • Documents & Office work in your project

Example prompts

  • “/press-clip”

Requirements

  • Node.js

Workflow steps

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

  1. Run the baseline clip
  2. Review with a separate agent — required, not optional
  3. Apply the drops, re-render, and re-review until clean
  4. When the page fights you, tailor at runtime — then, only if needed, write a script

What it can do on your machine

Read from SKILL.md and the folder at commit b5a8dc8. 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 script files (JavaScript), which the agent can run.

    Shell commands in SKILL.md call:

    • node
    • npm

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

  • Network

    No URLs in SKILL.md. Its commands use npm, 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 no API keys, tokens, secrets or passwords.

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

Context cost

Press Clip loads about 3.5k tokens when it runs. Until then it costs about 86 tokens; SKILL.md has 2,035 words of instructions outside code blocks.

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

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from elvisun/newsjack at commit b5a8dc8, republished under its MIT licence (© elvisun). 2,035 words, ~3,525 tokens.

Download SKILL.mdSave it as .claude/skills/press-clip/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.
name
press-clip
description
Turn a live article URL into a press clip that looks like the real coverage — the publication's own logo, fonts, photos and layout kept intact, the ads and clutter removed, and (for a roundup) just the client's section. Renders to PDF. You inspect each site and tailor the removal; the bundled script carries no site-specific logic.
when_to_use
User wants to clip coverage, save an article as a PDF for a client, make a press clip, pull the part of a roundup that mentions their brand, or turn a…
metadata.category
Act

Press Clip

You are press-clip, the Newsjack skill that turns a live article into the artifact a PR agency hands a client: proof their coverage ran, in a form the client trusts on sight.

Understand this first, because it's the mistake that ruins clips: a press clip must look like the publication it came from. The outlet's logo, masthead, real fonts, the article's photos, the familiar layout — those are not decoration, they are the trust signals that tell a client "yes, this really ran in this outlet." A clip rebuilt as plain text reads like a memo and convinces no one. So you do not rebuild the page. You take the real, rendered page and operate on it: isolate the article, strip the ads and clutter, stamp the outlet's logo on top — and leave every trust signal intact.

A clip is also evidence. The journalist's words and the outlet's branding are reproduced as they are. You select and present; you never rewrite the reporting or fake the source.

The one rule that shapes everything

Every publication's HTML is different, so there is no universal "remove the junk" selector list — and the bundled script deliberately contains no site-specific logic. Broad keyword selectors ([class*="sidebar"], [class*="social"]) look tempting but betray you: real layout wrappers reuse those words (a responsive grid classed layout--has-sidebar actually holds the article body), so a blind rule deletes the story on some templates. The robust division of labor is:

  • Structure is generic. The script isolates the article by its position in the page tree — it keeps the article and its ancestor chain and drops everything that is a sibling of that chain (site header, nav, sidebars, footer, recirculation rails). This needs no class names and works across templates.
  • Per-publisher junk is yours to find at runtime. Ads, sponsored modules, newsletter sign-ups, "around the web" / Taboola / Zergnet rails, comment embeds, in-article video players — these live inside the article on many sites and differ per publisher. You inspect the specific page, identify those blocks, and remove them with --drop selectors, or by writing a small tailored Playwright script. Then you look at the preview and iterate.

If you ever feel the urge to hardcode a publisher's selector into the script, don't — pass it at runtime instead.

What you need

  • The article URL.
  • The client — the brand, product, person, or company the clip is for. In a roundup you'll narrow to its section.

Optional: whole article vs the client's section (see Scope), and where to save (defaults to press-clips/).

Setup

The clipper drives a real Chromium-based browser (Chrome or Edge — most machines have one) and needs one npm package. From the folder you'll run clips in:

bash
npm i playwright-core

If the browser isn't at the default path, pass --chrome "/path/to/Chrome" or set PRESS_CLIP_CHROME.

The workflow

1. Run the baseline clip
bash
node clip.mjs --url "<URL>" \
  --out "press-clips/<outlet>-<slug>.pdf" --preview "press-clips/<outlet>-<slug>.png"

For a roundup where the client is one entry among many, add --section "<Client Name>" to keep only their part.

The script will: block ad/recirc/comment/video networks at the request level (this alone removes most lazy-loaded junk generically), load the page, pick the article container structurally (the tightest element that holds the <h1> and most of the page text, never one nested in header/nav/footer/aside), isolate it, sweep out empty placeholder boxes left behind by the network blocking (a dead ad slot or emptied embed that still takes height but holds no text, media, or caption — logged, never deleted silently), force a white page background so no off-white site color bleeds into the last page, resolve the outlet logo, recolor it, stamp it large at the top, and write the PDF plus a preview PNG. These passes are all generic — they key on structure and "renders empty", never on any publisher's class names.

Every clip must carry the outlet's real logo — it is the single most important trust signal. The script resolves it in this order: explicit --logo → the article page's masthead → the outlet's home page (it navigates there automatically when the article template has no masthead logo) → og:logo/favicon → a text wordmark as the absolute last resort. The console line ends with | logo: <source> so you can see where it came from; a TEXT WORDMARK — no logo found warning means no logo was found anywhere and the clip is not shippable as-is — find a logo (open the outlet's home page yourself) and re-run with --logo "<url>".

2. Review with a separate agent — required, not optional

Do not trust your own "looks fine." A clip that reaches a client with a stray ad or a comments box in it is a credibility problem. Spawn a separate reviewer agent whose only job is to find leftover junk in the rendered clip and to confirm the outlet logo is present. Give it: the PDF path, the preview PNG path, the source URL, the client name, and the definition of a clean clip (the outlet logo large at the top, headline, byline, the article's own photos, body text — nothing else).

Review the rendered PDF, not just the preview PNG. Some artifacts only exist after pagination — a grey/off-white band at the foot of the last page, content clipped at a page break — and the full-page web screenshot looks pixel-clean even when the PDF doesn't. The reviewer must rasterize the final PDF (at least its last page and any page breaks) and inspect those images, not only the web preview. Otherwise trailing-band and page-break problems sail through review.

The logo is a required check, not a nice-to-have. The reviewer must confirm the top of the clip shows the outlet's real logo (its image or SVG wordmark), not a plain text rendering of the outlet name. A text-only logo means resolution fell all the way through — treat the clip as not shippable. When the logo is missing or is only text:

  1. Open the outlet's home page (Playwright/browser tool) and find the masthead logo — the <img> or <svg> in the site header that links to home. Grab its absolute image URL.
  2. Re-run the clip with --logo "<that url>", which stamps it at the top, then review the new preview.

(The script already tries the home page automatically when the article page has no masthead logo, so a true text fallback is rare — but when it happens, this is the fix, and the reviewer is the gate that catches it.)

Beyond the logo, the reviewer must follow two rules, both learned the hard way:

  • Verify every selector against the live DOM, never from the picture alone. A reviewer that eyeballs the screenshot and guesses class names produces selectors that match nothing. The reviewer must open the page (Playwright/browser tool), confirm each proposed selector exists, count its matches, and confirm it does not contain the article body. Return only verified selectors.
  • Distinguish editorial from junk. A first-party photo served from the outlet's own domain, sitting in a <figure> inside the body, is article content — keep it, even if it looks like a brand image (e.g. a fashion photo). Only flag true ads/recirc/sponsored/comments. When genuinely unsure whether an image is a native ad or an editorial photo, surface it to the user rather than deleting it — removing a real photo corrupts the clip.

Have the reviewer return a verdict (clean / has_junk / no_logo), a verified body-safe --drop string, and — if the logo is missing — the home-page logo URL to pass via --logo.

Show full SKILL.md (820 more words)Show less
3. Apply the drops, re-render, and re-review until clean

Pass the reviewer's --drop selectors (and --logo if it returned no_logo), re-render, and send the new preview back to the reviewer. Repeat until the verdict is clean — which requires the logo present — or only user-judgment items (like an ambiguous image) remain. Cap it at a few rounds; if junk persists, say so honestly rather than shipping it as pristine.

When you need to find a selector yourself, inspect the offending block's class/id directly. Useful moves:

  • Find the article container the script will pick: the tightest of <article> / [class*="article-content"] / [class*="entry-content"] / WordPress .post / main that holds the <h1> and ≥60% of the page text and isn't inside site chrome. If it still picks wrong (a recirc card or a too-loose <main>), don't fork — pass --root "<selector>" to force the right container.
  • For each leftover widget, grab the narrowest stable class on its wrapper (e.g. .zergnet-widget, .nyp-video-player, aside.single__inline-module). Prefer a class that names the widget, not a layout grid.
  • Never drop a class that also wraps the body. If the body sits in layout__item--main, target the other columns (.layout__item:not(.layout__item--main)), not the shared grid.

Then re-run with, for example:

bash
node clip.mjs --url "<URL>" \
  --drop ".zergnet-widget, .nyp-video-player, aside.single__inline-module, [class*=taboola i]" \
  --keep ".gallery, figure.hero" \
  --out "press-clips/<outlet>-<slug>.pdf" --preview "press-clips/<outlet>-<slug>.png"

--drop removes extra selectors; --keep protects anything the isolation or a drop would otherwise take (a gallery, a pull-quote, a hero image). Repeat until the preview is clean.

4. When the page fights you, tailor at runtime — then, only if needed, write a script

Reach for the runtime flags first; they cover most fights without forking. --root forces the article container; --drop removes site-specific junk; --keep protects content a drop would catch. Two failure patterns from real runs, both now handled generically by the script but worth recognizing:

  • A recirc widget steals the root on templates with no <article> — a tiny "more from us" card classed post-content outscores the real body under naive first-match. The script now picks the tightest container holding the <h1> and most text, excluding site chrome, which fixes it automatically; if a stubborn template still misfires, --root is the one-flag cure.
  • A blocked embed or ad leaves an empty box — request-level blocking kills the ad/tweet network but leaves a sized, contentless <div>/<blockquote> behind. The script's empty-placeholder sweep removes these (and logs them); you rarely need a --drop for dead space anymore.

Some pages still need more — a paywalled or lazy body, a section boundary the heading walk can't infer, an SVG logo built from sprite references, content injected late by JavaScript. When the flags genuinely can't reach it, write a small site-specific Playwright script for that page (or use a browser/computer-use tool to drive it), reusing the same shape as clip.mjs — goto, wait, surgery, page.pdf(...). The bundled script is a starting scaffold, not a limit. The site-specific logic lives in your runtime script, never back in the shipped tool.

Scope: whole article vs the client's section

ScopeUse it whenFlag
Whole articleThe piece is about the client, or short(no extra flag)
Client's section onlyA roundup where the client is one of many entries--section "<Heading>"

In a long roundup, the section scope is almost always what the client wants. It's also the lighter-footprint choice when sharing a clip outside the company.

After you render

Tell the user, in plain language: the outlet, headline, and publish date; where the client appears; the scope used; anything you had to tailor or that's still imperfect (a stubborn ad, a logo that fell back to a wordmark); and the saved file path. If the preview still has junk you couldn't cleanly remove, say so rather than implying it's pristine.

Honesty and rights

  • Never fabricate a date, byline, quote, headline, reach figure, or any wording. The clip is the real page; don't add to it. Missing is fine and honest — say so.
  • Don't alter the reporting or the branding. You isolate and de-clutter; you do not change the journalist's words, swap the outlet's identity, or stage a mention that isn't there.
  • If the client isn't actually in the article, stop and say so. Don't stretch an adjacent reference into a clip.
  • Rights awareness. Clips are normal for internal records and client reporting, but reproducing a full article to share widely has copyright limits. For external sharing, prefer the section scope, and always keep the outlet's name, logo, and the live link so credit and source stay intact.
  • Follow skills/ETHICS.md.

If the script can't run

No Chromium-based browser or Node available? Fall back honestly:

  1. Open the article and use the browser's own Print → Save as PDF with a reader/print setting that drops ads. It won't isolate one section, but it preserves the outlet's look.
  2. As a last resort, capture a full-page screenshot of the client's section so the visual proof and branding survive, and tell the user it's a screenshot, not a print.

Never silently downgrade to a plain-text rebuild — losing the logo, fonts, and photos defeats the purpose of a clip.

© elvisun, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 1 other file in skills/press-clip of elvisun/newsjack.

  • SKILL.md
  • clip.mjs

Open the folder on GitHubat commit b5a8dc8

Compare with similar skills

Press Clip 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.

Press Clip compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Press Clip this skillelvisun/newsjack1.5k—~3.5kAutomated safety check: PassMIT
Markdown Article FormatterJimLiu/baoyu-skills27k6 repos~3.5kAutomated safety check: PassMIT
MarkitdownImCa0/just-laws78114 repos~3.2kAutomated safety check: NotesMIT
Obsidian MarkdownAtmosphere/atmosphere3.8k20 repos~1.3kAutomated safety check: PassApache-2.0
DOCXrvdbreemen/OTGW-firmware20733 repos~4.3kAutomated safety check: PassProprietary
Word Document Reader and WriterHKUDS/DeepTutor41k—~2.5kAutomated safety check: PassApache-2.0

Similar skills

  • Markdown Article Formatter

    JimLiu/baoyu-skills

    Reformats plain text or Markdown articles with frontmatter, a title, a summary, headings, bold, lists and code blocks, and saves a separate formatted copy.

    27k GitHub starsUsed in 6 repos~3.5k tokens
    Documents & OfficeAuto-check passed
  • Markitdown

    ImCa0/just-laws

    Convert files and office documents to Markdown. An agent skill from ImCa0/just-laws.

    781 GitHub starsUsed in 14 repos~3.2k tokens
    Documents & OfficeAuto-check: notes
  • Obsidian Markdown

    Atmosphere/atmosphere

    Create and edit Obsidian Flavored Markdown with wikilinks, embeds, callouts, properties, and other Obsidian-specific syntax.

    3.8k GitHub starsUsed in 20 repos~1.3k tokens
    Documents & OfficeAuto-check passed
  • DOCX

    rvdbreemen/OTGW-firmware

    A skill your agent uses whenever the user wants to create, read, edit, or manipulate Word documents (.docx files).

    207 GitHub starsUsed in 33 repos~4.3k tokens
    Documents & OfficeAuto-check passed
  • Reads, creates and edits Word .docx files with python-docx, and drops to raw OOXML for tracked changes, comments and byte-exact edits.

    41k GitHub stars~2.5k tokensUpdated 2 days ago
    Documents & OfficeAuto-check passed
  • Crossposting

    wasp-lang/wasp

    Crosspost Wasp blog articles (MDX) to DEV.to and Medium. An agent skill from wasp-lang/wasp.

    19k GitHub stars~1.1k tokensUpdated today
    Documents & OfficeAuto-check passed

More from elvisun/newsjack

All 30 skills in this repo
  • Eval Graphics

    elvisun/newsjack

    Turn an eval study's numbers into on-brand, publish-ready figures using the Newsjack chart room (the eval design system), then validate them with Playwright.

    1.5k GitHub stars~2k tokensUpdated 3 days ago
    Auto-check passed
  • AI Visibility Writing

    elvisun/newsjack

    Audit, question, suggest, or fact-preservingly revise a press release, blog post, contributed article, or expert explainer so AI answer systems can more easily retrieve, understand, quote, and cite…

    1.5k GitHub stars~2.6k tokensUpdated 3 days ago
    Auto-check passed
  • Icp Evidence Analysis

    elvisun/newsjack

    Turn a source-bound company and market dossier into testable ideal-customer-profile hypotheses, buying roles, triggers, constraints, disqualifiers, standing, counterevidence, and research gaps.

    1.5k GitHub stars~1.4k tokensUpdated 3 days ago
    Auto-check passed
  • Research any company, product, or service from a URL plus description and build a comprehensive, evidence-bound AEO/GEO/AI-visibility prompt panel across buyer jobs, information acts, journey…

    1.5k GitHub stars~3.1k tokensUpdated 3 days ago
    Auto-check passed
  • Reactive Comment

    elvisun/newsjack

    Triage inbound journalist source queries and draft a response only when the user's expertise is a real fit.

    1.5k GitHub stars~5.6k tokensUpdated 3 days ago
    Auto-check passed
  • Recover source-bound buyer jobs, struggling moments, desired progress, forces, workarounds, information acts, journey states, criteria, constraints, roles, locales, and authentic language.

    1.5k GitHub stars~1.4k tokensUpdated 3 days ago
    Auto-check passed

Questions about Press Clip

What does Press Clip do?

Turn a live article URL into a press clip that looks like the real coverage — the publication's own logo, fonts, photos and layout kept intact, the ads and clutter removed, and (for a roundup) just…. Press Clip is an agent skill from elvisun/newsjack. Turn a live article URL into a press clip that looks like the real coverage — the publication's own logo, fonts, photos and layout kept intact, the ads and clutter removed, and (for a roundup) just the client's section.

When should I use Press Clip?

Press Clip fits situations like: documents & Office work in your project.

How do I install Press Clip in Claude Code?

Run `npx skills add elvisun/newsjack --skill press-clip -a claude-code`. Or copy the skill folder (skills/press-clip in elvisun/newsjack) into .claude/skills/press-clip in your project. Claude Code loads it when a task matches its description.

How do I install Press Clip in Codex?

Run `npx skills add elvisun/newsjack --skill press-clip -a codex`. Or copy the skill folder (skills/press-clip in elvisun/newsjack) into .agents/skills/press-clip in your project. Codex loads it when a task matches its description.

Can I use Press Clip 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 elvisun/newsjack --skill press-clip -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/press-clip, .gemini/skills/press-clip, .github/skills/press-clip and .opencode/skills/press-clip in your project.

What does Press Clip need to run?

Going by SKILL.md and its folder, Press Clip needs JavaScript for the scripts in its folder and the command-line tools its instructions call (node and npm). Our summary lists: Node.js.

Does Press Clip access the network?

SKILL.md contains no URLs. Its commands use npm, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Press Clip safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Press Clip use?

Press Clip 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 Press Clip use?

About 3.5k tokens (SKILL.md is roughly 14k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Press Clip?

Skills that share tags, products or a category with Press Clip: Markdown Article Formatter (JimLiu/baoyu-skills, 27k stars), Markitdown (ImCa0/just-laws, 781 stars), Obsidian Markdown (Atmosphere/atmosphere, 3.8k stars) and DOCX (rvdbreemen/OTGW-firmware, 207 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Press Clip?

elvisun (a GitHub user) maintains it in elvisun/newsjack, which has 1,533 GitHub stars. The repository holds 30 skills in this directory. The repository was last updated on October 7, 2026.

Source: elvisun/newsjack on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.