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.
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…
$ npx skills add elvisun/newsjack --skill press-clip -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install elvisun/newsjack press-clip --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/elvisun/newsjack.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/press-clip .claude/skills/press-clip && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "press-clip" agent skill from https://github.com/elvisun/newsjack/tree/main/skills/press-clip into .claude/skills/press-clip/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "press-clip", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/elvisun/newsjack/tree/main/skills/press-clipType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add elvisun/newsjack --skill press-clip -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install elvisun/newsjack press-clip --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/elvisun/newsjack.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/press-clip .agents/skills/press-clip && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "press-clip" agent skill from https://github.com/elvisun/newsjack/tree/main/skills/press-clip into .agents/skills/press-clip/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "press-clip", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add elvisun/newsjack --skill press-clip -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install elvisun/newsjack press-clip --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/elvisun/newsjack.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/press-clip .cursor/skills/press-clip && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "press-clip" agent skill from https://github.com/elvisun/newsjack/tree/main/skills/press-clip into .cursor/skills/press-clip/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "press-clip", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/elvisun/newsjack.git --path skills/press-clip--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add elvisun/newsjack --skill press-clip -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install elvisun/newsjack press-clip --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/elvisun/newsjack.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/press-clip .gemini/skills/press-clip && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "press-clip" agent skill from https://github.com/elvisun/newsjack/tree/main/skills/press-clip into .gemini/skills/press-clip/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "press-clip", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install elvisun/newsjack press-clipInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add elvisun/newsjack --skill press-clip -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/elvisun/newsjack.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/press-clip .github/skills/press-clip && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "press-clip" agent skill from https://github.com/elvisun/newsjack/tree/main/skills/press-clip into .github/skills/press-clip/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "press-clip", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add elvisun/newsjack --skill press-clip -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install elvisun/newsjack press-clip --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/elvisun/newsjack.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/press-clip .opencode/skills/press-clip && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "press-clip" agent skill from https://github.com/elvisun/newsjack/tree/main/skills/press-clip into .opencode/skills/press-clip/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "press-clip", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
press-clipTurn 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. 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.
4 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit b5a8dc8. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships script files (JavaScript), which the agent can run.
Shell commands in SKILL.md call:
nodenpmFrom the folder's file list and the shell code blocks in SKILL.md.
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.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
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.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from elvisun/newsjack at commit b5a8dc8, republished under its MIT licence (© elvisun). 2,035 words, ~3,525 tokens.
.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.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.
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:
--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.
Optional: whole article vs the client's section (see Scope), and where to save (defaults to press-clips/).
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:
npm i playwright-coreIf the browser isn't at the default path, pass --chrome "/path/to/Chrome" or set PRESS_CLIP_CHROME.
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>".
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:
<img> or <svg> in the site header that links to home. Grab its absolute image URL.--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:
<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.
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:
<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..zergnet-widget, .nyp-video-player, aside.single__inline-module). Prefer a class that names the widget, not a layout grid.layout__item--main, target the other columns (.layout__item:not(.layout__item--main)), not the shared grid.Then re-run with, for example:
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.
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:
<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.<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 | Use it when | Flag |
|---|---|---|
| Whole article | The piece is about the client, or short | (no extra flag) |
| Client's section only | A 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.
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.
skills/ETHICS.md.No Chromium-based browser or Node available? Fall back honestly:
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
SKILL.md and 1 other file in skills/press-clip of elvisun/newsjack.
Open the folder on GitHubat commit b5a8dc8
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.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Press Clip this skillelvisun/newsjack | 1.5k | — | ~3.5k | Automated safety check: Pass | MIT | |
| Markdown Article FormatterJimLiu/baoyu-skills | 27k | 6 repos | ~3.5k | Automated safety check: Pass | MIT | |
| MarkitdownImCa0/just-laws | 781 | 14 repos | ~3.2k | Automated safety check: Notes | MIT | |
| Obsidian MarkdownAtmosphere/atmosphere | 3.8k | 20 repos | ~1.3k | Automated safety check: Pass | Apache-2.0 | |
| DOCXrvdbreemen/OTGW-firmware | 207 | 33 repos | ~4.3k | Automated safety check: Pass | Proprietary | |
| Word Document Reader and WriterHKUDS/DeepTutor | 41k | — | ~2.5k | Automated safety check: Pass | Apache-2.0 |
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.
ImCa0/just-laws
Convert files and office documents to Markdown. An agent skill from ImCa0/just-laws.
Atmosphere/atmosphere
Create and edit Obsidian Flavored Markdown with wikilinks, embeds, callouts, properties, and other Obsidian-specific syntax.
rvdbreemen/OTGW-firmware
A skill your agent uses whenever the user wants to create, read, edit, or manipulate Word documents (.docx files).
HKUDS/DeepTutor
Reads, creates and edits Word .docx files with python-docx, and drops to raw OOXML for tracked changes, comments and byte-exact edits.
wasp-lang/wasp
Crosspost Wasp blog articles (MDX) to DEV.to and Medium. An agent skill from wasp-lang/wasp.
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.
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…
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.
elvisun/newsjack
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…
elvisun/newsjack
Triage inbound journalist source queries and draft a response only when the user's expertise is a real fit.
elvisun/newsjack
Recover source-bound buyer jobs, struggling moments, desired progress, forces, workarounds, information acts, journey states, criteria, constraints, roles, locales, and authentic language.
Categories
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.
Press Clip fits situations like: documents & Office work in your project.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.