agentsclimarketplace

Make pdf

Skill timurgaleev/vibestack/skills/make-pdf

vibestack is a portable skill pack for AI coding agents. Slash commands like /office-hours, /ship, /investigate, /tdd, /review install once and work across every agent that supports the Agent Skills open standard — Claude Code, Cursor, Kiro, and a growing list of others.

Install
npx -y skills add timurgaleev/vibestack --skill make-pdf

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 5 stars5 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its author says it does

Copied from the file, not written here

Generate professional PDFs from code, markdown, or HTML in the current repository. Supports cover pages, tables of contents, watermarks, custom margins, and page sizes.

SKILL.md

7.5 KB, ~2.0k tokens by cl100k_base, as published. Nobody here has run it

When to invoke

Use when asked to "make pdf", "generate pdf", "export to pdf", "create pdf report", or "pdf preview".

Preamble

eval "$(~/.vibestack/bin/vibe-slug 2>/dev/null)" 2>/dev/null || SLUG="unknown"
_LEARN_FILE="${VIBESTACK_HOME:-$HOME/.vibestack}/projects/${SLUG:-unknown}/learnings.jsonl"
if [ -f "$_LEARN_FILE" ]; then
  _LEARN_COUNT=$(wc -l < "$_LEARN_FILE" 2>/dev/null | tr -d ' ')
  echo "LEARNINGS: $_LEARN_COUNT entries loaded"
  if [ "$_LEARN_COUNT" -gt 5 ] 2>/dev/null; then
    ~/.vibestack/bin/vibe-learnings-search --limit 5 2>/dev/null || true
  fi
else
  echo "LEARNINGS: none yet"
fi

{{include lib/snippets/session-host.md}}

{{include lib/snippets/decision-brief.md}}

{{include lib/snippets/working-protocols.md}}

{{include lib/snippets/state-protocols.md}}

Step 0: Find the make-pdf binary

# Check environment override first, then vibestack repo path as fallback
P="${MAKE_PDF_BIN:-}"
if [ -z "$P" ]; then
  _TVIBE_PDF="$HOME/.claude/skills/vibestack/make-pdf/dist/pdf"
  [ -x "$_TVIBE_PDF" ] && P="$_TVIBE_PDF"
fi
[ -n "$P" ] && echo "FOUND: $P" || echo "NOT_FOUND"

If NOT_FOUND, stop and tell the user:

make-pdf binary not found. The binary must be built from the vibestack repo. Run: cd ~/.claude/skills/vibestack && bun install && bun run build:make-pdf Or set $MAKE_PDF_BIN to the path of an existing make-pdf binary.

After building, re-run /make-pdf.


Step 1: Detect intent

Parse the user's input to determine what to do:

  1. /make-pdf with no args — Auto-detect: look for markdown files or ask what to convert
  2. /make-pdf preview <file>Preview mode: generate and open a PDF preview
  3. /make-pdf setupSetup mode: run $P setup to configure defaults
  4. /make-pdf <file or description>Generate mode: produce a PDF from the specified input

Step 2A: Generate mode

  1. Identify the source file(s). If the user provided a path, use it. If not, ask:

    What should I turn into a PDF?
    A) A specific file (provide path)
    B) All markdown files in this directory
    C) A generated report (I'll describe what to include)
    D) Something else
    
  2. Determine output filename. Default: <source-basename>.pdf in the same directory.

  3. Run the generator:

"$P" generate "<source>" --output "<output.pdf>" [flags]

Common flags:

  • --cover — add a cover page (uses repo name + date)
  • --toc — add a table of contents
  • --watermark "<text>" — overlay watermark text (e.g., "DRAFT", "CONFIDENTIAL")
  • --margins "<top> <right> <bottom> <left>" — custom margins in mm (default: 20 20 20 20)
  • --page-size <size> — A4 (default), Letter, Legal
  • --title "<title>" — override document title
  • --author "<name>" — set author metadata
  1. Report the result:
PDF GENERATED
═══════════════════════════════════════════
Output:  <output.pdf>
Size:    <file size>
Pages:   <page count>
═══════════════════════════════════════════

Step 2B: Preview mode

Generate the PDF and open it:

"$P" preview "<source>" [flags]

This generates a temporary PDF and opens it in the system PDF viewer. Report the path if the user wants to save it.


Step 2C: Setup mode

Run the setup wizard to configure defaults for this project:

"$P" setup

This writes a .make-pdf.json config file in the project root. Show the user what was configured.


Core patterns

80% case — memo/letter

One command, no flags. Gets a clean PDF with running header + page numbers.

"$P" generate letter.md                 # writes /tmp/letter.pdf
"$P" generate letter.md letter.pdf      # explicit output path

Publication mode — cover + TOC + chapter breaks

"$P" generate --cover --toc --title "On Horizons" essay.md essay.pdf

Each top-level H1 starts a new page. Disable with --no-chapter-breaks for memos that happen to have multiple H1s.

Draft-stage watermark

"$P" generate --watermark DRAFT memo.md draft.pdf

Diagonal DRAFT across every page. Drop the flag when final.

Fast iteration via preview

"$P" preview essay.md

Renders with print CSS and opens in browser. Skip the PDF round trip until you're ready.


Common flags

Page layout:
  --margins <dim>            1in (default) | 72pt | 2.54cm | 25mm
  --page-size letter|a4|legal

Structure:
  --cover                    Cover page (title, author, date)
  --toc                      Clickable TOC with page numbers
  --no-chapter-breaks        Don't start a new page at every H1

Branding:
  --watermark <text>         Diagonal watermark ("DRAFT", "CONFIDENTIAL")
  --header-template <html>   Custom running header
  --footer-template <html>   Custom footer (mutex with --page-numbers)

Output:
  --page-numbers             "N of M" footer (default on)
  --tagged                   Accessible PDF (default on)
  --outline                  PDF bookmarks from headings (default on)
  --quiet                    Suppress progress on stderr
  --verbose                  Per-stage timings

Network:
  --allow-network            Fetch external images. Off by default
                             (blocks tracking pixels).

Metadata:
  --title "..."              Document title (defaults to first H1)
  --author "..."             Author for cover + PDF metadata
  --date "..."               Date for cover (defaults to today)

When to run it

Watch for markdown-to-PDF intent. Any of these → run "$P" generate:

  • "Can you make this markdown a PDF"
  • "Export it as a PDF"
  • "Turn this into a PDF"
  • "I need a PDF of this"
  • "Print this as a PDF for me"

If the user has a .md file open and says "make it look nice", propose "$P" generate --cover --toc and ask before running.


Output contract

stdout: /tmp/letter.pdf          ← just the path, one line
stderr: Rendering HTML...        ← progress (unless --quiet)
        Generating PDF...
        Done in 1.5s. 43 words · 22KB · /tmp/letter.pdf

exit code: 0 success / 1 bad args / 2 render error / 3 Paged.js timeout / 4 binary unavailable

Capture the path: PDF=$("$P" generate letter.md) — then use $PDF.


Debugging

  • Blank output → check binary is executable: ls -la "$P"
  • Fragmented text on copy-paste → remove fenced code blocks and regenerate
  • Timeout → no headings in the markdown, drop --toc
  • External image missing → the binary fetches external images only when --allow-network is set

Capture Learnings

If you discovered a non-obvious make-pdf behavior, flag pattern, or conversion quirk during this session, log it for future sessions:

~/.vibestack/bin/vibe-learnings-log '{"skill":"make-pdf","type":"TYPE","key":"SHORT_KEY","insight":"DESCRIPTION","confidence":N,"source":"SOURCE","files":["path/to/relevant/file"]}'

Types: pattern (reusable approach), pitfall (what NOT to do), tool (binary behavior), operational (env/path/dependency quirk).

Only log genuine discoveries. A good test: would this save time in a future session?

Gives 0 of the 12 instructions most pdf office docs skills give in ~2.0k tokens

Counted across 635 of the 690 authors here whose files we hold, read 2026-08-06

  • extract text using pdfplumberin 92 of 635, across 25 files
  • create PDFs using reportlabin 83 of 635, across 16 files
  • read FORMS.md to fill out PDF formsin 80 of 635, across 13 files
  • OCR scanned PDFs using pytesseractin 77 of 635, across 10 files
  • merge or split PDFs using qpdfin 70 of 635, across 3 files
  • use Excel formulas instead of hardcoded calculated valuesin 68 of 635, across 12 files
  • unpack edit xml and repack existing documentsin 63 of 635, across 8 files
  • document sources for hardcoded valuesin 61 of 635, across 9 files
  • write minimal python code without unnecessary commentsin 59 of 635, across 7 files
  • run the recalculation script after adding or modifying formulasin 58 of 635, across 6 files
  • fix all identified formula errors and recalculatein 58 of 635, across 6 files
  • format years as text stringsin 57 of 635, across 5 files

Said here and by no other author read

  • determine the source file
  • default the output filename to the source basename
  • parse the user input for arguments
  • report the result of generation
  • generate a temporary pdf and open it for preview
  • run the setup wizard if requested

Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.

Keep looking

Skills are one crate of 328,083. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.