Model or dataset
SYuan03/Skill-Anything avatar
SYuan03/Skill-Anything

Skill-Anything: source files to a cited study pack, with an audit gate

Any source (PDF, video, web, audio, text) to interactive learning package with quizzes, flashcards and spaced repetition. One command, 12-section study guide.

338 stars13 forksPythonMIT

At a glance

What is it?
Skill-Anything reads a PDF, video, audio file, web page, repository or text file, splits it into sections, and generates a study pack whose every quiz question and flashcard has to quote the source back. Recent releases added an offline HTML site, an Anki export and a strict audit mode for CI.
Who is it for?
This is a reasonable fit when you have a long source and want revision material with traceable provenance, because the citation check and the strict audit are the parts competitors skip. It does not fit a short document, where the section machinery adds overhead without adding coverage, and it depends on an OpenAI compatible endpoint, so the key, base URL and model choices are yours to own.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 16 days ago.
What is it written in?
Mainly Python, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 11, 2026, and from our analysis. They are not legal advice.

Editorial analysis

Every generated item has to quote the source

The v0.4.1 release is the reason to care about this tool. Every LLM generated quiz question, flashcard and exercise must carry a verbatim source quote, and the tool checks that quote against the text it was given, rejecting items that are not supported. A run that produces valid YAML but unsupported trivia is now a failed run rather than a finished one.

Citations are meant to survive the trip out of the generator. They persist across YAML round trips and show up in Markdown, in the offline site, in Anki cards and in exported Skill assets, so the evidence survives whichever format you hand someone else. Two smaller fixes came with it: inline source text is no longer copied into the source_ref field, and cache writes are atomic, so an interrupted run no longer leaves a half written cache entry behind.

The cache key is a hash of prompt, model and version

Long sources were the original problem. Versions 0.1 and 0.2 quietly degraded on anything past roughly 15K characters: the knowledge generator truncated its input, quiz and flashcard generation hit per call caps before reaching later chapters, and every LLM call ran in sequence with no caching. v0.3 replaced that with a section aware, map-reduce pipeline.

The cache is a disk cache keyed on sha256 of the prompt, the model and a version string, so a second run of the same source skips every call it has already made and finishes in seconds. The same example appears twice in the documentation to make the point:

bash
sa pdf book.pdf --format all --concurrency 8
sa pdf book.pdf --format all --concurrency 8

The first is a long PDF processed in parallel, the second is the same command hitting the cache. To force a clean run, --no-cache is available on every source command, and since v0.4 the cache directory follows whatever --output you passed instead of a fixed location.

Sections, not character budgets, decide coverage

Each source type is chopped differently before any model is called. PDFs use the embedded outline, text and web pages split on headings, video and audio bucket transcripts into five minute sections, and repositories produce one section per file. Everything downstream then works on that section list instead of on raw characters.

Quiz, flashcard and exercise counts are allocated per section using largest-remainder weighting by section size, with a guaranteed minimum per section. That is the mechanism behind the claim that every chapter gets covered even on a small total budget. The case study in the documentation shows what partial coverage still looks like: from a twelve chapter distributed systems primer the run produced 13 outline entries, 15 key concepts, 62 glossary terms, 30 quiz questions, 40 flashcards and 10 exercises, and two chapters, CRDTs and messaging semantics, came back with a single quiz question and no flashcards at all.

Two models behind one CLI

Model routing is two tier. Map calls, the per section work that runs many times, are pointed at a fast and cheap model through SKILL_ANYTHING_MODEL_FAST, while the single reduce call that writes the global summary, cheat sheet, takeaways and learning path uses the stronger SKILL_ANYTHING_MODEL_SMART. The .env.example file ships both commented out with gpt-4o-mini and gpt-4o as the sample pair, next to the plain SKILL_ANYTHING_MODEL that covers everything else.

The rest of the configuration is explicit: SKILL_ANYTHING_API_KEY, an OpenAI compatible SKILL_ANYTHING_API_BASE, a separate SKILL_ANYTHING_IMAGE_API_BASE and SKILL_ANYTHING_IMAGE_MODEL for concept map images, an optional SKILL_ANYTHING_PROXY, and SKILL_ANYTHING_CONCURRENCY for parallel section calls. Concurrency defaults to 6, is settable with --concurrency or -c, and v0.4 notes that the documented and default values were brought into line, since they had drifted apart.

sa audit --strict is the gate meant for CI

The strict audit is the part of the tool aimed at automation rather than a human reader. It is a deterministic check over a pack file, covering citation coverage, duplicate items, malformed options and missing answers or solutions, and it has a JSON form for machine consumption:

bash
sa audit output/transformer-learning-pack.yaml --strict
sa audit output/transformer-learning-pack.yaml --strict --json

The GitHub Actions workflow runs on Python 3.10 through 3.13, runs Ruff, and builds a wheel on every push and pull request. Ruff also appears in the dev extra alongside pytest. Two fixes in this release matter for anyone running the gate in a loop: cache writes are atomic, and oversized chapters are split into ordered prompt windows rather than discarding everything after the first five to six thousand characters, which is what previously made late chapters vanish from an otherwise valid pack.

The offline site is a single file with no CDN

The v0.4 line added outputs that work without Python, without an API key and without a network connection. The web export is one self-contained index.html with searchable notes, a glossary, quiz mode, flip cards, exercises, dark mode, printing support, and progress saved locally in the browser. There are no CDN scripts, no web fonts, no trackers and no runtime API calls in it, so private study material stays on the machine unless you publish it yourself.

Sharing is a single command that produces the site and a ZIP, and the same file can be hosted on GitHub Pages, Cloudflare Pages or Netlify:

bash
sa share output/transformer-learning-pack.yaml
sa repo . --format all
sa export output/transformer-learning-pack.yaml --format web
sa export output/transformer-learning-pack.yaml --format anki

The all format emits the study guide, structured YAML, an agent Skill, the offline site and an Anki deck in one run. The Anki export writes flashcards and quiz questions as import ready UTF-8 TSV with HTML fields and tags, and portable exports skip image API calls so an export does not spend tokens on concept map illustrations.

Five extras decide which sources you can read

The core install is small: typer, rich, pyyaml, python-dotenv, openai and httpx, which is all the CLI needs to talk to a model. Everything that reads a file format is an extra, and there are five of them. pdf pulls pdfplumber, video pulls youtube-transcript-api, audio pulls openai-whisper, web pulls beautifulsoup4, all pulls all four, and dev adds pytest and ruff.

That split is deliberate rather than lazy, and the loose requirements.txt shows the alternative for each: pdfplumber is the preferred PDF parser with pymupdf and pypdf written underneath as commented alternatives for anyone who prefers those. Both manifests require Python 3.10 or newer, the project builds with hatchling, and it installs two command names, sa and skill-anything, both pointing at the same Typer app.

Two releases on one day, then a quiet stretch

The release history explains the shape of the feature set. v0.4.0 and v0.4.1 both shipped on 2026-09-26, the portable outputs and the citation guarantees landing hours apart, and the last push to the default branch matches that day. Before that, v0.3 dated from 2026-06-01, which is where the map-reduce pipeline, the concurrency flag and the disk cache arrived. The gap is close to four months of a stable long document pipeline between two bursts of new output formats.

The project version in pyproject.toml is 0.4.1, matching the newest tag, and the classifiers still read Development Status :: 4 - Beta with audience entries for Developers and Education. The repository holds 336 stars, 13 forks and a single open issue, and the documentation site lives at the SYuan03 GitHub Pages address. Separate release note files for v0.2, v0.3, v0.4 and v0.4.1 sit at the repository root, so the changelog detail lives there rather than in the README.

Editorial conclusion

This is a reasonable fit when you have a long source and want revision material with traceable provenance, because the citation check and the strict audit are the parts competitors skip. It does not fit a short document, where the section machinery adds overhead without adding coverage, and it depends on an OpenAI compatible endpoint, so the key, base URL and model choices are yours to own. Before you publish anything generated, run the strict audit yourself and read the chapters that came back thin, since per section quotas guarantee a floor rather than quality.

Frequently asked questions

What does Skill-Anything produce from one source?

A study pack with a study guide, outline, concepts, glossary, quiz, flashcards and exercises, and depending on the format also structured YAML, an offline HTML site, an Anki TSV deck or an agent Skill. A twelve chapter case study produced 30 quiz questions, 40 flashcards and 10 exercises.

How does Skill-Anything handle a source longer than a few chapters?

It splits the source into sections by type, runs per section map calls in parallel with a default concurrency of 6, and allocates quiz and flashcard quotas per section with a guaranteed minimum, caching results under a sha256 of prompt, model and version.

Which environment variables does Skill-Anything read?

SKILL_ANYTHING_API_KEY, SKILL_ANYTHING_API_BASE, SKILL_ANYTHING_MODEL, optional SKILL_ANYTHING_MODEL_FAST and SKILL_ANYTHING_MODEL_SMART for routing, SKILL_ANYTHING_CONCURRENCY, a separate image base and model, and an optional SKILL_ANYTHING_PROXY.

How do I add PDF support to Skill-Anything?

Install the pdf extra, which pulls pdfplumber. The loose requirements.txt prefers pdfplumber as well and lists pymupdf and pypdf as commented alternatives you can install instead.

Does Skill-Anything check its own quiz questions?

Since v0.4.1 every generated question, flashcard and exercise must include a verbatim source quote, unsupported items are rejected, and sa audit with --strict checks citation coverage, duplicates, malformed options and missing answers.

Official sources

  1. License: MIT
  2. Project website
  3. README
  4. Releases
  5. SYuan03/Skill-Anything on GitHub
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/syuan03-skill-anything.svg)](https://hysenlabs.com/projects/syuan03-skill-anything)