twhsi/epub-hypercard-obsidian
Convert EPUB card books into Obsidian-ready HyperCard Markdown folders and portable zip files. Use when Codex needs to turn an EPUB with XHTML chapters, table-of-contents cards, keyword index cards, backlinks, Luhmann/Zettelkasten numbers, or cross-links into one Markdown file per card with verified relative links, keyword cards, previous/home/next navigation, and GitHub/shareable zip output.
npx skills add https://github.com/twhsi/skills --skill epub-hypercard-obsidian
Create an Obsidian folder from an EPUB card book. Each EPUB正文 card becomes one Markdown file. The output uses the four-table HyperCard format:
Use this skill for EPUBs generated from project notes, Luhmann/Zettelkasten chunks, chapter cards, keyword index cards, or book-check editions that need to become clickable Obsidian Markdown.
Run the generator:
python3 scripts/epub_to_hypercard_obsidian.py INPUT.epub --out OUTPUT_DIR --zip
Recommended portable mode:
python3 scripts/epub_to_hypercard_obsidian.py INPUT.epub --out 3.4-centaur-hypercard-obsidian-portable --zip --portable
The script writes:
index.md: stack home and chapter directorycard-*.md: one正文 card per EPUB article/chapterkeyword-index.md: keyword directorykey-*.md: one keyword index card per keywordOUTPUT_DIR.zip: shareable zip, when --zip is setMETA-INF/container.xml, OEBPS/content.opf, XHTML text files, and a spine.Text/toc.xhtml or the first non-article spine item as the directory card.Text/index.xhtml or the XHTML with .index-card sections as the keyword index card.<article> as正文 HyperCards.p.code text for the card code, such as 3.4.1|113字.h1 as the visible card title.<br><br>.key-*.md.label to avoid Obsidian heading-anchor drift.index.xhtml sections into K001, keyword, weight, and target cards.key-*.md per keyword.label must resolve to a file in the output folder.[[#heading]] same-file anchors for this workflow.--portable for sharing with AI tools, GitHub, macOS Finder, Windows, or zip upload workflows.| Mode | Shape | Use |
|---|---|---|
| --portable | card-3-4-1.md, key-k001.md | Default recommendation for zip/GitHub/AI upload |
| no --portable | 3.4.1-標題.md, K001-關鍵字.md | More human-readable inside Obsidian, less portable across zip tools |
| 魯曼編號 | 卡片標題 |
|---|---|
| `{{code}}` | **{{title}}** |
| 內容 |
|---|
| {{content_with_links}} |
| 索引 | | | |
|---|---|---|---|
| {{keyword_link_1}} | {{keyword_link_2}} | {{keyword_link_3}} | {{keyword_link_4}} |
| ← 上一張 | Card {{n}} / {{total}} | 下一張 → |
|---|---|---|
| {{previous_card}} | [Home](index.md) | {{next_card}} |
TARS.[[target|alias]] contains | and can break table columns.\|.Before finishing, run or report the script validation:
cards: ...
keywords: ...
missing_links: 0
zip: ...
If missing_links is not zero, fix the generated links or parser before delivery.
Take twhsi/epub-hypercard-obsidian from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.