AI-powered CLI tool that evaluates whether a learning resource is worth your time
Project description
๐ SkiLens
Is this worth learning? Ask before you invest 40 hours.
One command. Instant verdict: LEARN ยท SKIP ยท CONSIDER ALTERNATIVES.
pip install skillens
skillens "https://www.coursera.org/learn/machine-learning"
English ยท ไธญๆ
๐ค The problem
You find a course. It looks promising. 40 hours later:
- ๐ฐ๏ธ Content is 3 years outdated, pre-transformer era
- ๐ The framework it teaches is getting automated away
- ๐ The same material exists in a 2-hour YouTube video
- ๐ฏ It doesn't match where your career is actually heading
"The hardest part of learning isn't learning โ it's deciding what to learn."
SkiLens answers "should I learn this?" before you commit. Paste a URL. Get a verdict in 3 seconds. Optionally find better alternatives.
โก 30-second demo
$ skillens "https://www.coursera.org/learn/machine-learning"
โญโโโโโโโโโโโโโโโโโโโโโโโโ ๐ SkiLens โโโโโโโโโโโโโโโโโโโโโโโโโโฎ
โ โ
โ Machine Learning โ Stanford (coursera) โ
โ by Andrew Ng ยท Updated: 2024-03 ยท 60h โ
โ โ
โ Market Demand โโโโโโโโโโ 78 โ growing โ
โ Skill Half-life โโโโโโโโโโ ~10y โฆ evergreen โ
โ Info Density โโโโโโโโโโ 62 โ moderate โ
โ Freshness โโโโโโโโโโ 48 โ aging โ
โ Effort vs Return โโโโโโโโโโ 71 โ solid โ
โ โ
โ Overall โโโโโโโโโโ 68 โ
โ โ
โ โก Verdict: LEARN (with caveats) โ
โ โ Foundational ML is timeless, but content predates โ
โ the transformer era โ
โ โ
โ โ
Strengths โ
โ ยท Exceptional pedagogy from Andrew Ng โ
โ ยท Covers math foundations thoroughly โ
โ โ
โ โ ๏ธ Concerns โ
โ ยท No coverage of LLMs / transformers โ
โ ยท TensorFlow 1.x examples are outdated โ
โ โ
โ ๐ก Better Alternatives Found โ
โ โ
โ 1. Deep RL Course (Hugging Face) 82 +14 โ โ
โ โโ Fresher (2025), hands-on code โ
โ โโ youtube.com/... โ
โ โ
โ 2. Spinning Up in Deep RL (OpenAI) 79 +11 โ โ
โ โโ Excellent info density, free โ
โ โโ github.com/openai/spinningup โ
โ โ
โฐโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฏ
Zero config. No API key needed. The killer feature โ discovering better alternatives โ works out of the box.
๐ Quick start
# 1. install
pip install skillens
# 2. point it at anything
skillens "https://..."
# 3. there is no step 3
SkiLens auto-detects the platform and extracts the right metadata. No flags, no setup.
๐ฏ What gets evaluated
| Dimension | What it measures | How |
|---|---|---|
| Market Demand | Is this skill actually in demand? | Bundled skill-demand dataset + popularity proxies |
| Skill Half-life | How long until this knowledge is stale? | Topic classification (foundational / established / fast-moving) |
| Info Density | How much signal per hour invested? | Syllabus analysis, unique-topic ratio |
| Freshness | Is the content up-to-date? | Published / last-updated dates, deprecation detection |
| Effort vs Return | Is the time investment justified? | Duration ร demand cross-reference |
| Profile Match (optional) | How well does it fit your background? | Token-overlap scoring against your skills / target role |
Scores are combined into a single 0โ100 overall, mapped to one of three verdicts: LEARN, SKIP, CONSIDER ALTERNATIVES.
๐ Works on everything
# URLs โ platform auto-detected
skillens "https://www.coursera.org/learn/machine-learning"
skillens "https://youtube.com/watch?v=..."
skillens "https://github.com/openai/gym"
skillens "https://arxiv.org/abs/2301.00001"
skillens "https://any-blog-or-tutorial.com/..."
# Skill / topic โ market analysis via web search
skillens topic "reinforcement learning"
skillens topic "rust programming"
# Side-by-side comparison
skillens "https://courseA" --compare "https://courseB"
# JSON output for scripting
skillens "https://..." --json | jq .verdict
Supported platforms
| Platform | Status | What's extracted |
|---|---|---|
| ๐ Coursera | โ | Syllabus, rating, enrollment, instructor, institution (via JSON-LD) |
| ๐บ YouTube | โ | Title, views, duration, description, tags (via yt-dlp) |
| ๐ป GitHub | โ | Stars, activity, topics, README, language |
| ๐ arXiv | โ | Abstract, authors, categories, dates |
| ๐ Generic webpage | โ | Open Graph / JSON-LD / meta fallback |
| ๐จ Plugins | โ | Third-party providers via entry points โ see below |
๐ง Deep mode (optional LLM)
Quick mode (default) needs zero config. For nuanced analysis, plug in any LLM:
# OpenAI (default)
skillens config set llm openai
skillens config set api-key sk-...
skillens "https://..." --deep
# Anthropic Claude
skillens config set llm anthropic
skillens config set api-key sk-ant-...
# Local Ollama (100% private, $0)
skillens config set llm ollama
skillens config set model llama3.2
All three backends use structured outputs (OpenAI tool-calling, Anthropic tool_use, Ollama JSON schema) โ the LLM can't go off-rails and the scores always validate against a Pydantic schema.
Deep mode falls back to quick-mode scoring automatically if the LLM call fails, so --deep is always safe to enable.
๐ค Personalize
Tell SkiLens who you are once, and every evaluation gets a personal-fit score:
skillens profile set --skills "python,pytorch,rl,robotics" \
--role "ML engineer" \
--years 5
Market Demand โโโโโโโโโโ 78
Freshness โโโโโโโโโโ 48
Profile Match โโโโโโโโโโ 85 โ new: strong alignment with your stack
The matcher lives at skillens/profile/matcher.py โ it's pure Python, no LLM needed. Sweet spot is 10โ15% token overlap (new but not redundant); heavy overlap gets penalized as "you already know this".
๐ Plugin ecosystem
Add a provider for any platform without forking SkiLens. Third-party packages register via entry points:
# your-package/pyproject.toml
[project.entry-points."skillens.providers"]
udemy = "my_package.udemy:UdemyProvider"
# my_package/udemy.py
from skillens.providers.base import BaseProvider
from skillens.core.models import ResourceMeta, SourceType
class UdemyProvider(BaseProvider):
@property
def name(self) -> str:
return "udemy"
@staticmethod
def can_handle(url: str) -> bool:
return "udemy.com/course/" in url
async def extract(self, url: str) -> ResourceMeta:
# fetch, parse, return ResourceMeta(...)
...
pip install the package โ SkiLens auto-discovers it at runtime. Broken plugins fail silently with a stderr warning; they can't crash the CLI.
๐ค MCP server mode
Use SkiLens as a tool inside Claude Desktop, Cursor, or any MCP client:
pip install "skillens[mcp]"
skillens mcp # speaks stdio by default
Three tools are exposed: evaluate_url(url), analyze_topic(skill), get_profile(). Drop this into your Claude Desktop config:
{
"mcpServers": {
"skillens": { "command": "skillens", "args": ["mcp"] }
}
}
Now your agent can ask "is this course worth it?" mid-conversation and get a structured verdict back.
๐ ไธญๆ / i18n
skillens "https://bilibili.com/video/BV1..." --lang zh
โ ๅธๅบ้ๆฑ โโโโโโโโโโ 78 โ
โ ๆ่ฝๅ่กฐๆ โโโโโโโโโโ ~10y โ
โ ไฟกๆฏๅฏๅบฆ โโโโโโโโโโ 62 โ
โ โ
โ โก ็ป่ฎบ: ๅผๅพๅญฆ โ
Currently en and zh. Auto-detects Chinese from .bilibili.com / .zhihu.com / .cn URLs when --lang auto is set.
๐ ๏ธ Architecture
skillens/
โโโ cli.py Typer CLI with bare-URL injection
โโโ core/
โ โโโ evaluator.py Pipeline orchestrator
โ โโโ scorer.py Rule-based + LLM scoring engine
โ โโโ dataset.py Bundled skill-demand dataset
โ โโโ config.py ~/.skillens/config.toml
โ โโโ models.py Pydantic data models
โโโ providers/ Coursera ยท YouTube ยท GitHub ยท arXiv ยท Webpage + plugins
โโโ llm/ OpenAI ยท Anthropic ยท Ollama backends + factory
โโโ discovery/ โ
Alternative-resource discovery via DDG
โโโ market/ Skill/topic trend analysis
โโโ profile/ Profile storage + token-overlap matcher
โโโ display/ Rich panels ยท JSON ยท compare table ยท i18n
โโโ mcp_server.py FastMCP server exposing evaluate_url / analyze_topic
โโโ data/
โโโ skill_demand.json 2026.04 curated keyword โ demand map
๐ฆ Install options
pip install skillens # base โ zero config, works immediately
pip install "skillens[youtube]" # adds yt-dlp for rich YouTube metadata
pip install "skillens[llm]" # adds openai + anthropic
pip install "skillens[discover]" # adds DuckDuckGo search for alternatives
pip install "skillens[mcp]" # adds MCP server support
pip install "skillens[pdf]" # adds PyMuPDF for local PDFs
pip install "skillens[all]" # everything
๐งช Development
git clone https://github.com/YixiaJack/skillens
cd skillens
python -m venv .venv && . .venv/Scripts/activate # Windows
pip install -e ".[dev]"
pytest # 67 tests, ~0.4s
Pass rate: 67 / 67 โ
(1 MCP test skips when the optional mcp extra isn't installed, as designed).
๐ค Contributing
The easiest contribution is a new provider. The Plugin ecosystem section shows the full template โ you don't even need to fork SkiLens, just ship your own package with the right entry point.
Other welcome contributions:
- New language packs in
display/i18n.py - Skill-demand dataset updates in
data/skill_demand.json - New LLM backends in
llm/
See CONTRIBUTING.md for full details.
๐บ๏ธ Roadmap
- Core CLI + rule-based scoring engine
- YouTube ยท Coursera ยท GitHub ยท arXiv ยท Webpage providers
- Rich terminal output with score bars
- JSON output mode
- Alternative-resource discovery (the โ killer feature)
- OpenAI / Anthropic / Ollama deep mode
- Profile management + personal match scoring
-
--compareside-by-side mode - Bundled skill-demand dataset
- MCP server mode
- Chinese output (
--lang zh) - Provider plugin system via entry points
- VS Code extension wrapper
- Browser extension (evaluate as you browse)
- Obsidian plugin integration
- Auto-updating dataset via scheduled GitHub Action
๐งญ Philosophy
In a world with infinite content, curation is the bottleneck.
SkiLens shifts evaluation from "after 40 hours" to "before the first hour."
Three invariants the project will never break:
- 5-second first result. Rule-based scoring always beats the LLM to the punch.
- Zero config for basic use.
pip install && skillens URLmust just work. - The terminal is the product. No web dashboard. No SaaS. Forever.
๐ License
MIT โ do whatever you want with it.
If SkiLens saved you from a bad course, give it a โญ
Built with ๐ฅ by @YixiaJack
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file skillens-0.2.0.tar.gz.
File metadata
- Download URL: skillens-0.2.0.tar.gz
- Upload date:
- Size: 150.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d508358d7d07e6861177099a67a9f492d4f29bcca00aa4e7b3e0176dc2e25228
|
|
| MD5 |
77a8394197f3bd44bfc0bc6c43b04a20
|
|
| BLAKE2b-256 |
89b46fde4d0d942308b6e38e09e12204ac9853ecbd03d41ef934c507ae21d8de
|
File details
Details for the file skillens-0.2.0-py3-none-any.whl.
File metadata
- Download URL: skillens-0.2.0-py3-none-any.whl
- Upload date:
- Size: 55.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0332a1786b5e7735cd33db08eaf7fcf8d7acad2456fff6bcc27e74a1761a5fcd
|
|
| MD5 |
4ff9ccde0f0478f88024e99eab2bfd16
|
|
| BLAKE2b-256 |
fbbe30bb25afc51513b584d3115fad9b51adb8b6de2bfcd54a920551a52ca26f
|