Releases: michalstrnadel/source-to-skill
Release list
v0.6.0 — podcast shows, real tables, docs in reading order
Install or update: /plugin marketplace add michalstrnadel/source-to-skill then /plugin install source-to-skill@source-to-skill, or uvx --from git+https://github.com/michalstrnadel/source-to-skill source-to-skill install.
Whole podcast shows, real tables, and repo docs in reading order.
Added
- Podcast shows from RSS — a feed URL (
feeds.*hosts,.rss,
.xml,/feed,/rss) becomes a course skill of the latest 5
episodes (--limit N), each transcribed locally with Whisper and
titled from the feed ("kind": "feed"). - Per-lesson deep links — playlist segments carry a
deep_link_template(&t=for YouTube,#t=for media files), so
lessons from any source link moments, not just videos. - Tables and images in books and articles — HTML tables become
| a | b |rows with a header separator (layout-only tables stay plain
text); images with alt text become[image: ...]and captions
[figure] ...instead of stray lines. - Article bylines — author and date fall back to JSON-LD,
twitter:creator, andrel="author"links. - Repo docs in reading order — Sphinx
toctree(from
docs/index.rst) or MkDocsnav:sets the segment order;include/
literalinclude(and MyST{include}) are resolved inside the repo, so
Flask's changelog and license are no longer empty stubs; reST roles
reduce to readable text, version and admonition directives to short
lines, autodoc to an "API reference:" line; segments flagorphanand
stub. - Plugin validation in CI —
claude plugin validate --strictfor the
marketplace and plugin manifests (the marketplace gained a
description).
Changed
- Inline
[t=Ns]markers every 30 s instead of 60 s: deep links land
within half a minute of a claim for about 3% more tokens.
Fixed
- Whisper fallback broke with yt-dlp plugins installed — yt-dlp's
plugin loader can rebindsys.modules["extractor"]to its own package;
deferred imports then failed with "No module named
'extractor.media'". All extractor imports are now module-level. - Podcast downloads printed a progress bar into the extractor output;
downloads are now silent.
v0.5.0 — podcasts, channels, topic skills & local Whisper
Install or update
/plugin marketplace add michalstrnadel/source-to-skill
/plugin install source-to-skill@source-to-skill
or uvx source-to-skill install (PyPI publishing pending), then pip install mlx-whisper (Apple Silicon) or faster-whisper for podcasts.
See the examples gallery and the website.
Listen, not just watch and read: podcasts and audio become skills through
local Whisper, YouTube channels become course skills, several sources merge
into one topic skill, and skills can be refreshed. Plus a PyPI CLI, an
examples gallery, CI, and a landing page.
Added
- Podcasts and audio (
scripts/extractor/parsers/audio.py) — Apple
Podcasts links, direct media URLs (.mp3,.m4a,.wav,.mp4, ...),
local audio/video files, and any page yt-dlp can download (Vimeo,
SoundCloud, TED, ... via--type audio) are transcribed locally with
Whisper. Segments follow the episode's chapters or 10-minute windows and
keep their start second;deep_link_templatelinks back to the exact
moment where the origin is seekable (YouTube, Vimeo, direct media files).
Downloaded media is deleted after transcription. - Local Whisper transcription (
scripts/extractor/transcribe.py) —
mlx-whisper (Apple Silicon,whisper-large-v3-turbo), faster-whisper,
or openai-whisper, first one installed wins; model override via
SOURCE_TO_SKILL_WHISPER_MODEL. No API keys. - Captionless YouTube videos — transcribed with Whisper instead of
failing when a backend is installed, in single videos and playlists;
--transcribeforces Whisper even when captions exist. Metadata
captionsgains the valuewhisper. - YouTube channels —
youtube.com/@handle,/channel/...,/c/...,
/user/...extract the latest 20 uploads as a course skill
("kind": "channel");--limit Nchanges that and caps long playlists. - Topic skills from several sources —
/source-to-skill <a> <b> <c>
extracts each source into its own--work-dirand generates one skill
with source-tagged ideas, one file per source, anddisagreements.md
recording where sources contradict instead of averaging them. - Skill refresh — every extraction writes
source.json(origin,
options, segment keys), copied into the generated skill;
/source-to-skill update <skill-dir>re-extracts and
tools/diff_source.pyreports what is new, so only new lessons are
generated. --work-dir PATH— parallel or multi-source runs no longer share
one work directory.- PyPI package and CLI —
uvx source-to-skill install(orpipx)
installs the skill for Claude Code, cross-agent, or Copilot CLI
(--agent,--project,--dest,--force);extract,check, and
validatewrap the bundled scripts. Extras:youtube,paper,
audio,all. - Repo docs in reStructuredText and MDX —
docs/anddoc/are read
for*.md,*.mdx, and*.rst(Sphinx projects such as Flask and
Django now extract their full docs); reST files are titled by their
first section title. - Timestamps inside long chapters and lessons — video, audio and
playlist transcripts carry an inline[t=Ns]marker about once a
minute, so skills can link a claim to its own second, not just the
chapter start. - Article date fallback —
<time datetime>when no meta tag names
the date. --checkreports the Whisper backend and model, a missing ffmpeg,
and warns when the installed yt-dlp is over 60 days old.- Examples gallery (
examples/) — skills generated by the tool itself
from a talk, a course playlist, a paper, a book, an article, a repo, and
a three-source topic; CI validates all of them. - Project infrastructure — CI (tests on Python 3.10–3.14 and macOS,
wheel install smoke test, example validation), a weekly live-source
smoke workflow, release workflow with PyPI trusted publishing, issue
forms, PR template,SECURITY.md,CODE_OF_CONDUCT.md,
CITATION.cff, Dependabot, and a GitHub Pages landing page.
Fixed
- Paper metadata and sections — arXiv papers take title, authors, year
and DOI from the arXiv API (falling back to the PDF when it is
unreachable); local PDFs get their title from the largest page-1 font
instead of the file name. Years prefer the arXiv id or venue stamp over
dataset names like "WMT 2014". Numbered headings ("3 Model
Architecture", number on its own line), lettered appendices, and
tables of contents are recognized, so a paper no longer collapses into
one "Background" segment. References split into one entry per
reference ([n],[ADG+16], or numbered), with wrapped lines joined.
Metadata addsarxiv_idandabstract_url;authorsis a list. - Rate limits reported as missing captions — a playlist whose videos
all hit YouTube's HTTP 429 now fails with "rate-limiting, wait and
retry" instead of suggesting Whisper, and stops after 3 rate-limited
videos in a row instead of requesting the rest. Single sources get the
same hint, and a YouTube bot check suggests updating yt-dlp. - EPUB code lost its indentation —
<pre>blocks keep leading
whitespace (git status -scolumns, YAML, Python), superscripts keep a
^(2^80, not280), and zero-width spaces are removed. Front-matter
segments (contents, contributors, dedications) are flagged
front_matterso generators skip them. - No absolute home paths in
source.json— local sources are stored
as~/.... - Repo segments name their file — each segment has a
path, so
same-titled pages (two "Templates") stay distinguishable. - Caption notices in transcripts — bracket-only cues (
[Music],
[Submit subtitle corrections ...]) are dropped. - Article text glued at nested blocks — a list nested right after an
inline label (<li><b>Sectioning</b>:<ul>...) no longer runs the label
into the next line's text.
Changed
- The generator spec asks for an article byline and skips support files
that would only repeat a small source.
v0.4.0 — Claude Code plugin marketplace
The repo is now a Claude Code plugin marketplace, and the skill lives in a self-contained folder.
Added
-
Plugin install —
.claude-plugin/marketplace.json+.claude-plugin/plugin.json:/plugin marketplace add michalstrnadel/source-to-skill /plugin install source-to-skill@source-to-skill
Changed
- Breaking (install layout): the skill moved from the repo root to the self-contained
skills/source-to-skill/folder (SKILL.md,scripts/,tools/together). Existing installs that cloned the whole repo into~/.claude/skills/source-to-skillmust re-install: clone anywhere and symlink/copyskills/source-to-skill/into the agent's skills folder (see README Quick start).
Full changelog: v0.3.0...v0.4.0
v0.3.0 — playlists, articles & GitHub repos
Three new source types, all without a single new dependency:
- YouTube playlist → course skill — the whole playlist becomes a course: lesson index, one linked lesson per video, course-wide cheatsheet. Captionless videos are skipped with a warning, never fatal.
- Web article → skill — readable-article extraction with the Python standard library alone; any blogpost URL becomes thesis, key claims, and quotable highlights.
- GitHub repository → skill — README and docs pulled via one tarball download (no git clone); the repo's documentation becomes a library skill with install steps, usage patterns, and a command cheatsheet.
Also: network timeouts on all fetches, charset-safe article decoding, path-traversal-safe tarball extraction with in-tree symlink support, and a --type override covering all six source types. 181 offline tests.
See CHANGELOG.md.
v0.2.0 — YouTube, papers & books
First public release.
Turn any YouTube video, academic paper (arXiv/PDF) or book (EPUB) into an agent skill for Claude Code, GitHub Copilot CLI, Amp, or any Agent Skills host.
- YouTube: captions via yt-dlp (manual preferred, auto fallback), chapter-based segments with
&t=deep links back into the video - Papers: PyMuPDF extraction, academic section detection, methods/findings/limitations skill structure, arXiv URLs auto-download
- Books: stdlib-only EPUB parser (zero extra dependencies), PDF books via document outline (
--type book) - Deterministic extractor + agent-driven generator — no API keys, your agent does the distillation
- 91 offline tests
See CHANGELOG.md for details.