Skip to content

Releases: michalstrnadel/source-to-skill

v0.6.0 — podcast shows, real tables, docs in reading order

Choose a tag to compare

@michalstrnadel michalstrnadel released this 05 Oct 10:51

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, and rel="author" links.
  • Repo docs in reading order — Sphinx toctree (from
    docs/index.rst) or MkDocs nav: 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 flag orphan and
    stub.
  • Plugin validation in CI — claude plugin validate --strict for 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 rebind sys.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

Choose a tag to compare

@michalstrnadel michalstrnadel released this 04 Oct 20:47

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_template links 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;
    --transcribe forces Whisper even when captions exist. Metadata
    captions gains the value whisper.
  • YouTube channels — youtube.com/@handle, /channel/..., /c/...,
    /user/... extract the latest 20 uploads as a course skill
    ("kind": "channel"); --limit N changes that and caps long playlists.
  • Topic skills from several sources — /source-to-skill <a> <b> <c>
    extracts each source into its own --work-dir and generates one skill
    with source-tagged ideas, one file per source, and disagreements.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.py reports 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 (or pipx)
    installs the skill for Claude Code, cross-agent, or Copilot CLI
    (--agent, --project, --dest, --force); extract, check, and
    validate wrap the bundled scripts. Extras: youtube, paper,
    audio, all.
  • Repo docs in reStructuredText and MDX — docs/ and doc/ 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.
  • --check reports 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 adds arxiv_id and abstract_url; authors is 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 -s columns, YAML, Python), superscripts keep a
    ^ (2^80, not 280), and zero-width spaces are removed. Front-matter
    segments (contents, contributors, dedications) are flagged
    front_matter so 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

Choose a tag to compare

@michalstrnadel michalstrnadel released this 27 Jul 13:43

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-skill must re-install: clone anywhere and symlink/copy skills/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

Choose a tag to compare

@michalstrnadel michalstrnadel released this 27 Jul 11:01

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

Choose a tag to compare

@michalstrnadel michalstrnadel released this 27 Jul 10:06

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.