Codeck codeck-export

install
source · Clone the upstream repo
git clone https://github.com/hiyeshu/codeck
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/hiyeshu/codeck "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/codeck-export" ~/.claude/skills/hiyeshu-codeck-codeck-export && rm -rf "$T"
manifest: skills/codeck-export/SKILL.md
source content

codeck export

Minimum conversation, maximum output. Export the deck to the user's format.

Step 1: Status

DECK_DIR="$HOME/.codeck/projects/$(basename "$(pwd)")"
mkdir -p "$DECK_DIR"
bash "$HOME/.claude/skills/codeck/scripts/status.sh" "$DECK_DIR"

Gate check: if no assembled HTML exists (

./*-r*.html
), suggest running
/codeck-design
first.

Step 2: Format

  • A) HTML — open in browser, press F for fullscreen, arrow keys to navigate. Zero dependencies. (recommended)
  • B) PDF — email attachments, printing
  • C) PPTX — corporate requirements
  • D) All

Step 3: Export

Find the HTML file (

./*-r*.html
in the user's project directory), derive baseName.

HTML

Already exists. Open in browser, F for fullscreen, arrows to navigate.

PDF — print from HTML

Use Playwright for WYSIWYG PDF:

npx playwright install chromium 2>/dev/null || true
import { chromium } from 'playwright';
import { resolve } from 'path';
import { readdirSync } from 'fs';
import { pathToFileURL } from 'url';

const html = readdirSync('.').find(f => /-r\d+\.html$/.test(f));
const baseName = html.replace('.html', '');
const browser = await chromium.launch();
const page = await browser.newPage();
await page.goto(pathToFileURL(resolve(html)).toString(), { waitUntil: 'networkidle' });
await page.emulateMedia({ media: 'screen' });
await page.pdf({
  path: `${baseName}.pdf`,
  printBackground: true,
  preferCSSPageSize: true,
  margin: { top: '12mm', right: '12mm', bottom: '12mm', left: '12mm' }
});
await browser.close();
console.log(`done: ${baseName}.pdf`);

Poster assets

.media-poster
elements in slides.html are video/audio placeholders. Original file paths are in the caption and outline.md asset manifest.

Default: keep placeholders in export. If user says "embed video", extract path from caption, use

slide.addMedia({ path: "..." })
for PPTX.

PPTX — from HTML

Option A (recommended): LibreOffice

EXPORT_SCRIPTS="$HOME/.claude/skills/codeck-export/pptx/scripts"
python "$EXPORT_SCRIPTS/office/soffice.py" --headless --convert-to pdf ./*-r*.html
python "$EXPORT_SCRIPTS/office/soffice.py" --headless --convert-to pptx ./*-r*.html

Option B (fallback): screenshot embed

If soffice unavailable, use Playwright to screenshot each page, then PptxGenJS to embed screenshots as slides. Read

export/pptx/pptxgenjs.md
for the API.

Step 4: QA (required for PDF/PPTX)

Assume the export has problems. Find them.

PDF

Check: pages complete (no truncation), backgrounds render, fonts display correctly.

PPTX

Generate thumbnails:

EXPORT_SCRIPTS="$HOME/.claude/skills/codeck-export/pptx/scripts"
python "$EXPORT_SCRIPTS/thumbnail.py" ./*-r*.pptx

Convert to images for detailed check:

python "$EXPORT_SCRIPTS/office/soffice.py" --headless --convert-to pdf ./*-r*.pptx
pdftoppm -jpeg -r 150 *.pdf slide-check

Use subagent to visually inspect screenshots. Focus on: overlapping elements, text overflow, uneven spacing, low-contrast text, differences from HTML original.

Fix loop

  1. Find issue → adjust export params or HTML
  2. Re-export → re-screenshot → re-check
  3. Until one full check finds no new issues

At least one fix-verify cycle before declaring done.

Step 5: Done

Export done. Output:

{baseName}.pdf
/
{baseName}.pptx

Need a speech script?

/codeck-speech
. Otherwise you're done — run
/codeck
anytime for an overview.