diff --git a/Makefile b/Makefile index 8cb7005e..ba47e1f4 100644 --- a/Makefile +++ b/Makefile @@ -1,17 +1,24 @@ -include .env export -site_install: - uv sync --no-dev +install: + uv sync -site_fetch_stats: +fetch_stats: uv run python website/fetch_github_stars.py -site_build: +test: + uv run pytest website/tests/ -v + +build: uv run python website/build.py -site_preview: site_build - python -m http.server -d website/output/ 8000 - -site_deploy: site_build - @echo "Deploy via GitHub Actions (push to master)" +preview: build + @echo "Check the website on http://localhost:8000" + uv run watchmedo shell-command \ + --patterns='*.md;*.html;*.css;*.js;*.py' \ + --recursive \ + --wait --drop \ + --command='uv run python website/build.py' \ + README.md website/templates website/static website/data & \ + python -m http.server -b 127.0.0.1 -d website/output/ 8000 diff --git a/pyproject.toml b/pyproject.toml index d564cde9..31fee98f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -2,22 +2,30 @@ name = "awesome-python" version = "0.1.0" description = "An opinionated list of awesome Python frameworks, libraries, software and resources." +authors = [{ name = "Vinta Chen", email = "vinta.chen@gmail.com" }] +readme = "README.md" +license = "MIT" requires-python = ">=3.13" -dependencies = [ - "httpx==0.28.1", - "jinja2==3.1.6", - "markdown==3.10.2", -] +dependencies = [] + +[project.urls] +Homepage = "https://awesome-python.com/" +Repository = "https://github.com/vinta/awesome-python" [dependency-groups] +build = ["httpx==0.28.1", "jinja2==3.1.6", "markdown-it-py==4.0.0"] +lint = ["ruff==0.15.6"] +test = ["pytest==9.0.2"] dev = [ - "pytest==9.0.2", - "ruff==0.15.6", + { include-group = "build" }, + { include-group = "lint" }, + { include-group = "test" }, + "watchdog==6.0.0", ] [tool.pytest.ini_options] testpaths = ["website/tests"] +pythonpath = ["website"] [tool.ruff] -target-version = "py313" -line-length = 100 +line-length = 200 diff --git a/uv.lock b/uv.lock index 1f7b17c7..ecff7291 100644 --- a/uv.lock +++ b/uv.lock @@ -18,30 +18,46 @@ wheels = [ name = "awesome-python" version = "0.1.0" source = { virtual = "." } -dependencies = [ - { name = "httpx" }, - { name = "jinja2" }, - { name = "markdown" }, -] [package.dev-dependencies] +build = [ + { name = "httpx" }, + { name = "jinja2" }, + { name = "markdown-it-py" }, +] dev = [ + { name = "httpx" }, + { name = "jinja2" }, + { name = "markdown-it-py" }, { name = "pytest" }, { name = "ruff" }, + { name = "watchdog" }, +] +lint = [ + { name = "ruff" }, +] +test = [ + { name = "pytest" }, ] [package.metadata] -requires-dist = [ - { name = "httpx", specifier = "==0.28.1" }, - { name = "jinja2", specifier = "==3.1.6" }, - { name = "markdown", specifier = "==3.10.2" }, -] [package.metadata.requires-dev] +build = [ + { name = "httpx", specifier = "==0.28.1" }, + { name = "jinja2", specifier = "==3.1.6" }, + { name = "markdown-it-py", specifier = "==4.0.0" }, +] dev = [ + { name = "httpx", specifier = "==0.28.1" }, + { name = "jinja2", specifier = "==3.1.6" }, + { name = "markdown-it-py", specifier = "==4.0.0" }, { name = "pytest", specifier = "==9.0.2" }, { name = "ruff", specifier = "==0.15.6" }, + { name = "watchdog", specifier = "==6.0.0" }, ] +lint = [{ name = "ruff", specifier = "==0.15.6" }] +test = [{ name = "pytest", specifier = "==9.0.2" }] [[package]] name = "certifi" @@ -129,12 +145,15 @@ wheels = [ ] [[package]] -name = "markdown" -version = "3.10.2" +name = "markdown-it-py" +version = "4.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2b/f4/69fa6ed85ae003c2378ffa8f6d2e3234662abd02c10d216c0ba96081a238/markdown-3.10.2.tar.gz", hash = "sha256:994d51325d25ad8aa7ce4ebaec003febcce822c3f8c911e3b17c52f7f589f950", size = 368805, upload-time = "2026-02-09T14:57:26.942Z" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3", size = 73070, upload-time = "2025-08-11T12:57:52.854Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl", hash = "sha256:e91464b71ae3ee7afd3017d9f358ef0baf158fd9a298db92f1d4761133824c36", size = 108180, upload-time = "2026-02-09T14:57:25.787Z" }, + { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload-time = "2025-08-11T12:57:51.923Z" }, ] [[package]] @@ -189,6 +208,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, ] +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + [[package]] name = "packaging" version = "26.0" @@ -256,3 +284,24 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/89/7a/09ece68445ceac348df06e08bf75db72d0e8427765b96c9c0ffabc1be1d9/ruff-0.15.6-py3-none-win_amd64.whl", hash = "sha256:aee25bc84c2f1007ecb5037dff75cef00414fdf17c23f07dc13e577883dca406", size = 11787271, upload-time = "2026-03-12T23:05:20.168Z" }, { url = "https://files.pythonhosted.org/packages/7f/d0/578c47dd68152ddddddf31cd7fc67dc30b7cdf639a86275fda821b0d9d98/ruff-0.15.6-py3-none-win_arm64.whl", hash = "sha256:c34de3dd0b0ba203be50ae70f5910b17188556630e2178fd7d79fc030eb0d837", size = 11060497, upload-time = "2026-03-12T23:05:25.968Z" }, ] + +[[package]] +name = "watchdog" +version = "6.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220, upload-time = "2024-11-01T14:07:13.037Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/68/98/b0345cabdce2041a01293ba483333582891a3bd5769b08eceb0d406056ef/watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c", size = 96480, upload-time = "2024-11-01T14:06:42.952Z" }, + { url = "https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134", size = 88451, upload-time = "2024-11-01T14:06:45.084Z" }, + { url = "https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b", size = 89057, upload-time = "2024-11-01T14:06:47.324Z" }, + { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079, upload-time = "2024-11-01T14:06:59.472Z" }, + { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078, upload-time = "2024-11-01T14:07:01.431Z" }, + { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076, upload-time = "2024-11-01T14:07:02.568Z" }, + { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077, upload-time = "2024-11-01T14:07:03.893Z" }, + { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078, upload-time = "2024-11-01T14:07:05.189Z" }, + { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077, upload-time = "2024-11-01T14:07:06.376Z" }, + { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078, upload-time = "2024-11-01T14:07:07.547Z" }, + { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065, upload-time = "2024-11-01T14:07:09.525Z" }, + { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070, upload-time = "2024-11-01T14:07:10.686Z" }, + { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067, upload-time = "2024-11-01T14:07:11.845Z" }, +] diff --git a/website/build.py b/website/build.py index b8340eb5..5b36526e 100644 --- a/website/build.py +++ b/website/build.py @@ -7,9 +7,10 @@ import shutil from pathlib import Path from typing import TypedDict -import markdown from jinja2 import Environment, FileSystemLoader +from readme_parser import parse_readme, slugify + # Thematic grouping of categories. Each category name must match exactly # as it appears in README.md (the ## heading text). SECTION_GROUPS: list[tuple[str, list[str]]] = [ @@ -67,217 +68,6 @@ SECTION_GROUPS: list[tuple[str, list[str]]] = [ ] -def slugify(name: str) -> str: - """Convert a category name to a URL-friendly slug.""" - slug = name.lower() - slug = re.sub(r"[^a-z0-9\s-]", "", slug) - slug = re.sub(r"[\s]+", "-", slug.strip()) - slug = re.sub(r"-+", "-", slug) - return slug - - -def count_entries(content: str) -> int: - """Count library entries (lines starting with * [ or - [) in a content block.""" - return sum(1 for line in content.split("\n") if re.match(r"\s*[-*]\s+\[", line)) - - -def extract_preview(content: str, *, max_names: int = 4) -> str: - """Extract first N main library names from markdown content for preview text. - - Only includes top-level or single-indent entries (indent <= 3 spaces), - skipping subcategory labels (items without links) and deep sub-entries. - """ - names = [] - for m in re.finditer(r"^(\s*)[-*]\s+\[([^\]]+)\]", content, re.MULTILINE): - indent_len = len(m.group(1)) - if indent_len > 3: - continue - names.append(m.group(2)) - if len(names) >= max_names: - break - return ", ".join(names) - - -def render_content_html(content: str) -> str: - """Render category markdown content to HTML with subcategory detection. - - Lines that are list items without links (e.g., "- Synchronous") are - treated as subcategory headers and rendered as bold dividers. - - Indent levels in the README: - - 0 spaces: top-level entry or subcategory label - - 2 spaces: entry under a subcategory (still a main entry) - - 4+ spaces: sub-entry (e.g., awesome-django under django) - """ - lines = content.split("\n") - out: list[str] = [] - - for line in lines: - stripped = line.strip() - indent_len = len(line) - len(line.lstrip()) - - # Detect subcategory labels: list items without links - m = re.match(r"^[-*]\s+(.+)$", stripped) - if m and "[" not in stripped: - label = m.group(1) - out.append(f'
{label}
') - continue - - # Entry with link and description: * [name](url) - Description. - m = re.match( - r"^\s*[-*]\s+\[([^\]]+)\]\(([^)]+)\)\s*[-\u2013\u2014]\s*(.+)$", - line, - ) - if m: - name, url, desc = m.groups() - if indent_len > 3: - out.append( - f'
' - f'{name}' - f"
" - ) - else: - out.append( - f'
' - f'{name}' - f'{desc}' - f"
" - ) - continue - - # Link-only entry (no description): * [name](url) - m = re.match(r"^\s*[-*]\s+\[([^\]]+)\]\(([^)]+)\)\s*$", line) - if m: - name, url = m.groups() - if indent_len > 3: - out.append( - f'
' - f'{name}' - f"
" - ) - else: - out.append( - f'
' - f'{name}' - f"
" - ) - continue - - return "\n".join(out) - - -def parse_readme(text: str) -> tuple[list[dict], list[dict]]: - """Parse README.md text into categories and resources. - - Returns: - (categories, resources) where each is a list of dicts with keys: - name, slug, description, content - """ - lines = text.split("\n") - - separator_idx = None - for i, line in enumerate(lines): - if line.strip() == "---" and i > 0: - separator_idx = i - break - - if separator_idx is None: - return [], [] - - resources_idx = None - contributing_idx = None - for i, line in enumerate(lines): - if line.strip() == "# Resources": - resources_idx = i - elif line.strip() == "# Contributing": - contributing_idx = i - - cat_end = resources_idx if resources_idx is not None else len(lines) - category_lines = lines[separator_idx + 1 : cat_end] - - resource_lines = [] - if resources_idx is not None: - res_end = contributing_idx if contributing_idx is not None else len(lines) - resource_lines = lines[resources_idx:res_end] - - categories = _extract_sections(category_lines, level=2) - resources = _extract_sections(resource_lines, level=2) - - return categories, resources - - -def _extract_sections(lines: list[str], *, level: int) -> list[dict]: - """Extract ## sections from a block of lines.""" - prefix = "#" * level + " " - sections = [] - current_name = None - current_lines: list[str] = [] - - for line in lines: - if line.startswith(prefix) and not line.startswith(prefix + "#"): - if current_name is not None: - sections.append(_build_section(current_name, current_lines)) - current_name = line[len(prefix) :].strip() - current_lines = [] - elif current_name is not None: - current_lines.append(line) - - if current_name is not None: - sections.append(_build_section(current_name, current_lines)) - - return sections - - -def _build_section(name: str, lines: list[str]) -> dict: - """Build a section dict from a name and its content lines.""" - while lines and not lines[0].strip(): - lines = lines[1:] - while lines and not lines[-1].strip(): - lines = lines[:-1] - - description = "" - content_lines = lines - if lines: - m = re.match(r"^_(.+)_$", lines[0].strip()) - if m: - description = m.group(1) - content_lines = lines[1:] - while content_lines and not content_lines[0].strip(): - content_lines = content_lines[1:] - - content = "\n".join(content_lines).strip() - - return { - "name": name, - "slug": slugify(name), - "description": description, - "content": content, - } - - -def render_markdown(text: str) -> str: - """Render markdown text to HTML.""" - md = markdown.Markdown(extensions=["extra"]) - return md.convert(text) - - -def strip_markdown_links(text: str) -> str: - """Replace [text](url) with just text for plain-text contexts.""" - return re.sub(r"\[([^\]]+)\]\([^)]+\)", r"\1", text) - - -def render_inline_markdown(text: str) -> str: - """Render inline markdown (links, bold, italic) to HTML.""" - from markupsafe import Markup - - html = markdown.markdown(text) - # Strip wrapping

...

since this is inline content - html = re.sub(r"^

(.*)

$", r"\1", html.strip()) - # Add target/rel to links for external navigation - html = html.replace(" list[dict]: def extract_entries( categories: list[dict], - resources: list[dict], groups: list[dict], ) -> list[dict]: """Flatten categories into individual library entries for table display.""" @@ -379,38 +166,18 @@ def extract_entries( entries: list[dict] = [] for cat in categories: group_name = cat_to_group.get(cat["name"], "Other") - last_entry_indent = -1 - for line in cat["content"].split("\n"): - indent_len = len(line) - len(line.lstrip()) - - # Link-only sub-item deeper than parent → "also see" - m_sub = re.match(r"\s*[-*]\s+\[([^\]]+)\]\(([^)]+)\)\s*$", line) - if m_sub and indent_len > last_entry_indent >= 0 and entries: - entries[-1]["also_see"].append({ - "name": m_sub.group(1), - "url": m_sub.group(2), - }) - continue - - if indent_len > 3: - continue - m = re.match( - r"\s*[-*]\s+\[([^\]]+)\]\(([^)]+)\)\s*(?:[-\u2013\u2014]\s*(.+))?$", - line, - ) - if m: - last_entry_indent = indent_len - entries.append({ - "name": m.group(1), - "url": m.group(2), - "description": render_inline_markdown(m.group(3)) if m.group(3) else "", - "category": cat["name"], - "group": group_name, - "stars": None, - "owner": None, - "pushed_at": None, - "also_see": [], - }) + for entry in cat["entries"]: + entries.append({ + "name": entry["name"], + "url": entry["url"], + "description": entry["description"], + "category": cat["name"], + "group": group_name, + "stars": None, + "owner": None, + "last_commit_at": None, + "also_see": entry["also_see"], + }) return entries @@ -420,7 +187,6 @@ def build(repo_root: str) -> None: website = repo / "website" readme_text = (repo / "README.md").read_text(encoding="utf-8") - # Extract subtitle from the first non-empty, non-heading line subtitle = "" for line in readme_text.split("\n"): stripped = line.strip() @@ -429,47 +195,33 @@ def build(repo_root: str) -> None: break categories, resources = parse_readme(readme_text) - - # Enrich with entry counts, rendered HTML, previews, and clean descriptions - for cat in categories + resources: - cat["entry_count"] = count_entries(cat["content"]) - cat["content_html"] = render_content_html(cat["content"]) - cat["preview"] = extract_preview(cat["content"]) - cat["description"] = strip_markdown_links(cat["description"]) + # All fields pre-computed: entry_count, content_html, preview, description total_entries = sum(c["entry_count"] for c in categories) - - # Organize into groups groups = group_categories(categories, resources) + entries = extract_entries(categories, groups) - # Flatten entries for table view - entries = extract_entries(categories, resources, groups) - - # Load and merge GitHub star data stars_data = load_stars(website / "data" / "github_stars.json") for entry in entries: repo_key = extract_github_repo(entry["url"]) if repo_key and repo_key in stars_data: - entry["stars"] = stars_data[repo_key]["stars"] - entry["owner"] = stars_data[repo_key]["owner"] - entry["pushed_at"] = stars_data[repo_key].get("pushed_at", "") + sd = stars_data[repo_key] + entry["stars"] = sd["stars"] + entry["owner"] = sd["owner"] + entry["last_commit_at"] = sd.get("last_commit_at", "") - # Sort by stars descending entries = sort_entries(entries) - # Set up Jinja2 env = Environment( loader=FileSystemLoader(website / "templates"), autoescape=True, ) - # Output directory site_dir = website / "output" if site_dir.exists(): shutil.rmtree(site_dir) site_dir.mkdir(parents=True) - # Generate single index.html tpl_index = env.get_template("index.html") (site_dir / "index.html").write_text( tpl_index.render( @@ -484,14 +236,10 @@ def build(repo_root: str) -> None: encoding="utf-8", ) - # Copy static assets static_src = website / "static" static_dst = site_dir / "static" if static_src.exists(): - shutil.copytree(static_src, static_dst) - - # Write CNAME - (site_dir / "CNAME").write_text("awesome-python.com\n", encoding="utf-8") + shutil.copytree(static_src, static_dst, dirs_exist_ok=True) print(f"Built single page with {len(categories)} categories + {len(resources)} resources") print(f"Total entries: {total_entries}") diff --git a/website/data/github_stars.json b/website/data/github_stars.json index c71287fd..d10e2ce8 100644 --- a/website/data/github_stars.json +++ b/website/data/github_stars.json @@ -2,2621 +2,3145 @@ "0rpc/zerorpc-python": { "stars": 3237, "owner": "0rpc", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-02-08T00:01:11Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "567-labs/instructor": { - "stars": 12554, + "stars": 12555, "owner": "567-labs", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T04:07:30Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "Alir3z4/html2text": { "stars": 2135, "owner": "Alir3z4", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-10-28T11:03:40Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "AnswerDotAI/fasthtml": { "stars": 6883, "owner": "AnswerDotAI", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-13T20:35:47Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "AtsushiSakai/PythonRobotics": { - "stars": 28887, + "stars": 28894, "owner": "AtsushiSakai", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-06T06:56:19Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "BeanieODM/beanie": { "stars": 2661, "owner": "BeanieODM", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-14T16:25:14Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "Bogdanp/dramatiq": { - "stars": 5172, + "stars": 5174, "owner": "Bogdanp", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-15T06:58:54Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "ChristosChristofidis/awesome-deep-learning": { - "stars": 27712, + "stars": 27719, "owner": "ChristosChristofidis", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-05-26T12:28:00Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "CleanCut/green": { "stars": 806, "owner": "CleanCut", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2024-11-12T22:24:34Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "Cornices/cornice": { "stars": 390, "owner": "Cornices", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-03-24T09:40:05Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "DLR-RM/stable-baselines3": { - "stars": 12908, + "stars": 12915, "owner": "DLR-RM", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-13T15:43:52Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "Delgan/loguru": { - "stars": 23690, + "stars": 23692, "owner": "Delgan", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-22T00:32:28Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "DiffSK/configobj": { "stars": 337, "owner": "DiffSK", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-06-06T13:16:36Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "DmytroLitvinov/awesome-flake8-extensions": { "stars": 1276, "owner": "DmytroLitvinov", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-28T08:10:54Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "EmilStenstrom/justhtml": { "stars": 1116, "owner": "EmilStenstrom", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T21:58:05Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "FactoryBoy/factory_boy": { "stars": 3781, "owner": "FactoryBoy", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-12-14T14:33:55Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "HBNetwork/python-decouple": { "stars": 3017, "owner": "HBNetwork", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2024-01-01T17:54:57Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "HypothesisWorks/hypothesis": { - "stars": 8498, + "stars": 8502, "owner": "HypothesisWorks", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-16T20:41:07Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "Instagram/MonkeyType": { "stars": 4996, "owner": "Instagram", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-06-14T08:50:16Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "IronLanguages/ironpython3": { "stars": 2735, "owner": "IronLanguages", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T23:59:02Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "JaidedAI/EasyOCR": { - "stars": 29096, + "stars": 29099, "owner": "JaidedAI", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-12-05T12:23:12Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "Kozea/pygal": { "stars": 2752, "owner": "Kozea", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-12-09T10:28:44Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "Lightning-AI/pytorch-lightning": { - "stars": 30934, + "stars": 30940, "owner": "Lightning-AI", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T09:20:11Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "LuminosoInsight/python-ftfy": { "stars": 4015, "owner": "rspeer", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2024-10-30T21:00:25Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "MagicStack/uvloop": { - "stars": 11687, + "stars": 11688, "owner": "MagicStack", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-01-30T14:24:05Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "ManimCommunity/manim": { - "stars": 37253, + "stars": 37264, "owner": "ManimCommunity", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T03:28:52Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "Manisso/fsociety": { - "stars": 11925, + "stars": 11928, "owner": "Manisso", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2022-09-06T12:45:41Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "Maratyszcza/PeachPy": { "stars": 2048, "owner": "Maratyszcza", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2022-11-13T17:08:27Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "MasoniteFramework/masonite": { "stars": 2365, "owner": "MasoniteFramework", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-03-20T20:11:49Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "MechanicalSoup/MechanicalSoup": { "stars": 4850, "owner": "MechanicalSoup", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-19T07:18:14Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "MervinPraison/PraisonAI": { - "stars": 5677, + "stars": 5684, "owner": "MervinPraison", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T11:08:18Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "Microsoft/PTVS": { "stars": 2567, "owner": "microsoft", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-10T23:46:49Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "MongoEngine/mongoengine": { "stars": 4349, "owner": "MongoEngine", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-09-02T20:46:15Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "NicolasHug/Surprise": { - "stars": 6772, + "stars": 6774, "owner": "NicolasHug", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2024-06-14T19:31:58Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "Nuitka/Nuitka": { - "stars": 14642, + "stars": 14647, "owner": "Nuitka", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-12T13:05:42Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "OpenBB-finance/OpenBB": { - "stars": 63238, + "stars": 63260, "owner": "OpenBB-finance", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T16:37:47Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "Parisson/TimeSide": { "stars": 394, "owner": "Parisson", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2024-10-14T15:20:39Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "Parsely/streamparse": { "stars": 1504, "owner": "pystorm", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2024-08-09T15:10:10Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "PennyLaneAI/pennylane": { "stars": 3111, "owner": "PennyLaneAI", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T05:36:08Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "PrefectHQ/prefect": { - "stars": 21889, + "stars": 21893, "owner": "PrefectHQ", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T03:54:10Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "PyCQA/flake8": { "stars": 3770, "owner": "PyCQA", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-12-22T21:54:35Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "PyCQA/prospector": { "stars": 2074, "owner": "prospector-dev", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-16T18:04:02Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "PyMySQL/PyMySQL": { "stars": 7838, "owner": "PyMySQL", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-08-24T12:53:42Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "PyMySQL/mysqlclient": { "stars": 2525, "owner": "PyMySQL", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-12T06:06:31Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "Pylons/colander": { "stars": 464, "owner": "Pylons", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2024-08-02T16:17:14Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "Pylons/waitress": { "stars": 1572, "owner": "Pylons", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-14T13:45:44Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "Qiskit/qiskit": { - "stars": 7137, + "stars": 7142, "owner": "Qiskit", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T07:40:27Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "RaRe-Technologies/gensim": { "stars": 16375, "owner": "piskvorky", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-10-16T11:13:19Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "RasaHQ/rasa": { - "stars": 21086, + "stars": 21087, "owner": "RasaHQ", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-12-18T08:04:47Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "RaylockLLC/DearPyGui": { - "stars": 15279, + "stars": 15278, "owner": "hoffstadt", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-10T16:12:52Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "SCons/scons": { "stars": 2357, "owner": "SCons", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-15T01:43:25Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "SciTools/cartopy": { "stars": 1589, "owner": "SciTools", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-16T17:14:46Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "ScrapeGraphAI/toonify": { "stars": 323, "owner": "ScrapeGraphAI", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-06T15:59:57Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "SmileyChris/django-countries": { "stars": 1521, "owner": "SmileyChris", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-01-08T04:51:39Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "Suor/django-cacheops": { "stars": 2263, "owner": "Suor", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-04T09:25:53Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "Suor/funcy": { - "stars": 3501, + "stars": 3502, "owner": "Suor", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-14T02:44:27Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "Supervisor/supervisor": { - "stars": 9007, + "stars": 9006, "owner": "Supervisor", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-12-21T21:03:11Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "Tencent/rapidjson": { "stars": 15007, "owner": "Tencent", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-02-05T13:28:08Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "Textualize/rich": { - "stars": 55801, + "stars": 55804, "owner": "Textualize", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-26T09:52:14Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "Textualize/textual": { - "stars": 34878, + "stars": 34882, "owner": "Textualize", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-10T10:00:29Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "TheAlgorithms/Python": { - "stars": 218785, + "stars": 218781, "owner": "TheAlgorithms", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-13T21:53:47Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "TkTech/pysimdjson": { "stars": 761, "owner": "TkTech", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-06-28T20:04:45Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "TomNicholas/Python-for-Scientists": { "stars": 357, "owner": "TomNicholas", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-06-27T13:35:32Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "Valloric/YouCompleteMe": { "stars": 26276, "owner": "ycm-core", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-01-30T19:15:05Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "WhyNotHugo/python-barcode": { "stars": 649, "owner": "WhyNotHugo", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-12-18T09:37:37Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "ZoomerAnalytics/xlwings": { "stars": 6, "owner": "ZoomerAnalytics", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-08-27T03:48:51Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "aaugustin/websockets": { - "stars": 5643, + "stars": 5645, "owner": "python-websockets", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-08T08:14:03Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "abhiTronix/vidgear": { - "stars": 3684, + "stars": 3685, "owner": "abhiTronix", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-11-12T05:07:53Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "aboSamoor/polyglot": { "stars": 2368, "owner": "aboSamoor", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2020-09-22T22:35:28Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "agno-agi/agno": { - "stars": 38754, + "stars": 38776, "owner": "agno-agi", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T17:13:33Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "ahupp/python-magic": { "stars": 2896, "owner": "ahupp", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-03T18:27:52Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "aizvorski/scikit-video": { "stars": 152, "owner": "aizvorski", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2016-05-28T22:17:25Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "ajenti/ajenti": { - "stars": 7908, + "stars": 7909, "owner": "ajenti", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-26T08:27:51Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "alecthomas/voluptuous": { "stars": 1847, "owner": "alecthomas", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-12-18T19:00:01Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "altair-viz/altair": { - "stars": 10301, + "stars": 10302, "owner": "vega", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T15:12:12Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "amitt001/delegator.py": { "stars": 1746, "owner": "amitt001", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2019-05-06T12:33:23Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "amoffat/sh": { "stars": 7241, "owner": "amoffat", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-11-01T12:42:25Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "amosgyamfi/awesome-fasthtml": { "stars": 79, "owner": "amosgyamfi", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2024-09-08T18:40:33Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "andialbrecht/sqlparse": { "stars": 3999, "owner": "andialbrecht", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-12-19T07:18:19Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "ansible/ansible": { - "stars": 68310, + "stars": 68298, "owner": "ansible", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-16T22:19:35Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "apache/spark": { - "stars": 42992, + "stars": 42998, "owner": "apache", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T06:14:16Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "arrow-py/arrow": { - "stars": 9035, + "stars": 9036, "owner": "arrow-py", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-19T15:24:45Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "art049/odmantic": { "stars": 1168, "owner": "art049", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-01-25T11:23:24Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "astral-sh/ruff": { - "stars": 46329, + "stars": 46341, "owner": "astral-sh", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T21:49:56Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "astral-sh/ty": { - "stars": 17739, + "stars": 17753, "owner": "astral-sh", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-16T23:40:05Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "astral-sh/uv": { - "stars": 81192, + "stars": 81254, "owner": "astral-sh", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T23:33:26Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "asweigart/pyautogui": { - "stars": 12363, + "stars": 12365, "owner": "asweigart", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2023-06-07T11:16:23Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "aws/aws-sdk-pandas": { "stars": 4106, "owner": "aws", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-15T00:23:20Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "bbangert/beaker": { "stars": 545, "owner": "bbangert", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-12-03T18:25:50Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "beetbox/audioread": { "stars": 536, "owner": "beetbox", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-10-26T19:43:12Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "beetbox/beets": { - "stars": 14856, + "stars": 14858, "owner": "beetbox", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T18:07:34Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "benedekrozemberczki/karateclub": { "stars": 2276, "owner": "benedekrozemberczki", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2024-07-17T19:00:21Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "benfred/implicit": { "stars": 3773, "owner": "benfred", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2023-11-21T21:15:59Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "benfred/py-spy": { - "stars": 15031, + "stars": 15036, "owner": "benfred", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-08-18T00:13:24Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "benhamner/Metrics": { "stars": 1654, "owner": "benhamner", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2015-09-09T04:13:23Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "benoitc/gunicorn": { - "stars": 10481, + "stars": 10483, "owner": "benoitc", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-13T09:25:38Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "bfly123/claude_code_bridge": { - "stars": 1642, + "stars": 1661, "owner": "bfly123", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T01:51:42Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "bloomberg/bqplot": { "stars": 3684, "owner": "bqplot", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-01-23T10:40:52Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "bokeh/bokeh": { - "stars": 20365, + "stars": 20368, "owner": "bokeh", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T07:03:32Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "boppreh/mouse": { "stars": 961, "owner": "boppreh", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2023-06-26T19:23:24Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "borgbackup/borg": { - "stars": 13081, + "stars": 13084, "owner": "borgbackup", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T14:37:13Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "boto/boto3": { "stars": 9736, "owner": "boto", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T18:19:04Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "bpython/bpython": { "stars": 2771, "owner": "bpython", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-12-06T08:57:26Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "browser-use/browser-use": { - "stars": 81099, + "stars": 81177, "owner": "browser-use", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T03:57:39Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "bterwijn/memory_graph": { - "stars": 771, + "stars": 772, "owner": "bterwijn", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-04T09:21:14Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "buildout/buildout": { "stars": 613, "owner": "buildout", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-06T20:30:10Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "buriy/python-readability": { "stars": 2894, "owner": "buriy", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-01-26T13:06:04Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "canonical/cloud-init": { - "stars": 3627, + "stars": 3629, "owner": "canonical", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-16T14:13:14Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "carlosescri/DottedDict": { "stars": 222, "owner": "carlosescri", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2024-12-09T14:16:32Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "cdgriffith/Box": { "stars": 2822, "owner": "cdgriffith", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-21T16:19:51Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "chaostoolkit/chaostoolkit": { "stars": 2001, "owner": "chaostoolkit", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2024-05-01T12:55:38Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "chapmanb/bcbb": { "stars": 645, "owner": "chapmanb", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-02-05T14:20:51Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "chapmanb/bcbio-nextgen": { "stars": 1027, "owner": "bcbio", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2024-08-24T11:11:30Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "chardet/chardet": { - "stars": 2486, + "stars": 2489, "owner": "chardet", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T23:47:26Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "chriskiehl/Gooey": { - "stars": 22025, + "stars": 22026, "owner": "chriskiehl", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-12T04:32:43Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "clips/pattern": { "stars": 8856, "owner": "clips", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2020-04-25T12:40:40Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "cobrateam/splinter": { "stars": 2767, "owner": "cobrateam", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-08-16T15:08:24Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "codeinthehole/purl": { "stars": 303, "owner": "codeinthehole", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2021-05-15T21:00:41Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "codelucas/newspaper": { - "stars": 15009, + "stars": 15010, "owner": "codelucas", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-12-06T00:29:46Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "coleifer/huey": { - "stars": 5940, + "stars": 5941, "owner": "coleifer", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-28T13:46:22Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "coleifer/micawber": { "stars": 674, "owner": "coleifer", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-10T11:59:12Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "coleifer/peewee": { "stars": 11952, "owner": "coleifer", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T01:49:51Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "conda/conda": { - "stars": 7342, + "stars": 7343, "owner": "conda", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T09:22:23Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "cookiecutter/cookiecutter": { - "stars": 24744, + "stars": 24748, "owner": "cookiecutter", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-04T08:13:03Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "copier-org/copier": { "stars": 3214, "owner": "copier-org", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-16T17:04:02Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "crossbario/autobahn-python": { "stars": 2534, "owner": "crossbario", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-01-10T09:37:30Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "cython/cython": { - "stars": 10654, + "stars": 10655, "owner": "cython", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T07:34:32Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "dahlia/awesome-sqlalchemy": { - "stars": 3031, + "stars": 3033, "owner": "dahlia", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-25T14:13:09Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "dashingsoft/pyarmor": { - "stars": 4989, + "stars": 4988, "owner": "dashingsoft", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T02:02:48Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "dask/dask": { - "stars": 13768, + "stars": 13769, "owner": "dask", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-12T11:13:54Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "datafolklabs/cement": { "stars": 1341, "owner": "datafolklabs", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-09T15:40:14Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "datastax/python-driver": { "stars": 1426, "owner": "apache", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-11T19:30:07Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "dateutil/dateutil": { "stars": 2604, "owner": "dateutil", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-03T05:40:58Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "davidaurelio/hashids-python": { "stars": 1423, "owner": "davidaurelio", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2020-09-07T16:27:01Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "daviddrysdale/python-phonenumbers": { "stars": 3720, "owner": "daviddrysdale", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-13T10:42:24Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "davidhalter/jedi": { - "stars": 6123, + "stars": 6124, "owner": "davidhalter", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-13T11:01:08Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "davidhalter/jedi-vim": { "stars": 5319, "owner": "davidhalter", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-10T10:10:33Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "dbader/schedule": { "stars": 12246, "owner": "dbader", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2024-05-25T18:40:33Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "dbcli/litecli": { "stars": 3214, "owner": "dbcli", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-15T03:11:44Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "dbcli/mycli": { - "stars": 11886, + "stars": 11887, "owner": "dbcli", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T19:32:02Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "dbcli/pgcli": { "stars": 13073, "owner": "dbcli", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-22T03:42:48Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "deanmalmgren/textract": { "stars": 4482, "owner": "deanmalmgren", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-04T04:01:18Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "derek73/python-nameparser": { - "stars": 702, + "stars": 703, "owner": "derek73", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2023-09-21T00:05:34Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "desbordante/desbordante-core": { "stars": 469, "owner": "Desbordante", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-15T18:44:01Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "devpi/devpi": { "stars": 1146, "owner": "devpi", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T14:40:35Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "devsnd/tinytag": { "stars": 805, "owner": "tinytag", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-15T18:38:49Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "dfunckt/django-rules": { "stars": 1970, "owner": "dfunckt", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-10-11T06:42:08Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "dgunning/edgartools": { - "stars": 1859, + "stars": 1861, "owner": "dgunning", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T15:23:57Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "dhamaniasad/awesome-postgres": { - "stars": 11767, + "stars": 11772, "owner": "dhamaniasad", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-22T05:54:13Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "dimka665/awesome-slugify": { "stars": 491, "owner": "voronind", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2017-01-20T20:45:25Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "django-cache-machine/django-cache-machine": { "stars": 885, "owner": "django-cache-machine", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2023-02-20T18:13:51Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "django-compressor/django-compressor": { "stars": 2871, "owner": "django-compressor", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-14T07:39:02Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "django-guardian/django-guardian": { "stars": 3893, "owner": "django-guardian", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-11T10:25:32Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "django-haystack/django-haystack": { "stars": 3800, "owner": "django-haystack", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-14T01:19:47Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "django-haystack/pysolr": { "stars": 697, "owner": "django-haystack", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-14T00:59:24Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "django-tastypie/django-tastypie": { "stars": 3955, "owner": "django-tastypie", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-04-02T19:22:48Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "django/channels": { "stars": 6336, "owner": "django", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-07T16:45:44Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "django/daphne": { "stars": 2651, "owner": "django", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-09-17T12:11:36Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "django/django": { - "stars": 87081, + "stars": 87067, "owner": "django", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T21:08:18Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "dmlc/xgboost": { - "stars": 28138, + "stars": 28139, "owner": "dmlc", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T09:23:18Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "docling-project/docling": { - "stars": 55968, + "stars": 56000, "owner": "docling-project", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T08:59:38Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "dpkp/kafka-python": { "stars": 5887, "owner": "dpkp", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T21:06:58Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "dry-python/returns": { "stars": 4238, "owner": "dry-python", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T07:13:55Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "dynaconf/dynaconf": { "stars": 4272, "owner": "dynaconf", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T18:04:02Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "elapouya/python-docx-template": { "stars": 2588, "owner": "elapouya", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-11-13T12:46:04Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "elastic/elasticsearch-dsl-py": { "stars": 3883, "owner": "elastic", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-04-18T13:50:16Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "eliben/pyelftools": { "stars": 2217, "owner": "eliben", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-12T14:48:41Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "emcconville/wand": { "stars": 1479, "owner": "emcconville", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-24T02:27:28Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "emmett-framework/granian": { - "stars": 5173, + "stars": 5174, "owner": "emmett-framework", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-13T16:11:48Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "encode/django-rest-framework": { - "stars": 29928, + "stars": 29929, "owner": "encode", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T21:09:05Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "encode/httpx": { - "stars": 15163, + "stars": 15139, "owner": "encode", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-23T10:40:42Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "encode/uvicorn": { - "stars": 10496, + "stars": 10500, "owner": "Kludex", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-16T06:11:15Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "erikrose/more-itertools": { - "stars": 4043, + "stars": 4044, "owner": "more-itertools", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T15:52:45Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "esnme/ultrajson": { "stars": 4474, "owner": "ultrajson", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-11T21:45:16Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "evhub/coconut": { "stars": 4313, "owner": "evhub", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-12-31T07:03:46Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "fabric/fabric": { - "stars": 15406, + "stars": 15405, "owner": "fabric", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-07-20T17:31:40Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "facebook/PathPicker": { "stars": 5232, "owner": "facebook", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2024-09-05T13:30:39Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "facebook/pyre-check": { "stars": 7153, "owner": "facebook", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T19:16:18Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "facebookresearch/hydra": { - "stars": 10258, + "stars": 10260, "owner": "facebookresearch", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-12-11T03:44:41Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "faif/python-patterns": { - "stars": 42795, + "stars": 42797, "owner": "faif", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-13T17:04:16Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "falconry/falcon": { "stars": 9805, "owner": "falconry", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-10T12:58:43Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "feature-engine/feature_engine": { "stars": 2214, "owner": "feature-engine", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-05T21:41:02Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "feincms/feincms": { "stars": 1077, "owner": "feincms", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-11T09:41:59Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "fengsp/plan": { "stars": 1182, "owner": "fengsp", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2020-05-14T03:02:37Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "fighting41love/funNLP": { - "stars": 79457, + "stars": 79469, "owner": "fighting41love", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2023-08-24T08:47:15Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "flask-admin/flask-admin": { "stars": 6057, "owner": "pallets-eco", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-16T22:06:01Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "flask-api/flask-api": { "stars": 1468, "owner": "flask-api", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2024-02-20T14:04:59Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "flask-restful/flask-restful": { "stars": 6924, "owner": "flask-restful", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2023-05-21T03:47:13Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "fogleman/Quads": { "stars": 1223, "owner": "fogleman", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2014-05-20T02:31:15Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "fxsjy/jieba": { - "stars": 34802, + "stars": 34808, "owner": "fxsjy", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2020-02-15T08:33:35Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "gabrielfalcao/HTTPretty": { "stars": 2209, "owner": "gabrielfalcao", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2022-10-16T23:12:02Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "gaojiuli/toapi": { "stars": 3555, "owner": "elliotgao2", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2021-06-28T01:58:45Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "gawel/pyquery": { "stars": 2379, "owner": "gawel", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-18T21:11:29Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "geopandas/geopandas": { - "stars": 5067, + "stars": 5066, "owner": "geopandas", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-14T12:07:44Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "geopy/geopy": { "stars": 4783, "owner": "geopy", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-01-27T19:22:13Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "getnikola/nikola": { - "stars": 2722, + "stars": 2723, "owner": "getnikola", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-15T12:21:27Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "getpelican/pelican": { - "stars": 13249, + "stars": 13248, "owner": "getpelican", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-03T11:11:45Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "getsentry/responses": { "stars": 4330, "owner": "getsentry", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-19T14:38:13Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "getsentry/sentry-python": { - "stars": 2156, + "stars": 2157, "owner": "getsentry", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T15:05:11Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "gevent/gevent": { - "stars": 6443, + "stars": 6444, "owner": "gevent", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-26T14:59:03Z", + "fetched_at": "2026-03-18T11:25:26.074230+00:00" }, "giampaolo/psutil": { "stars": 11108, "owner": "giampaolo", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T10:10:03Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "glamp/bashplotlib": { "stars": 1917, "owner": "glamp", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2021-03-31T19:40:59Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "gleitz/howdoi": { "stars": 10831, "owner": "gleitz", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2024-10-22T14:20:10Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "google/jax": { - "stars": 35125, + "stars": 35130, "owner": "jax-ml", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T10:35:30Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "google/python-fire": { - "stars": 28155, + "stars": 28157, "owner": "google", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-08-16T21:26:04Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "google/pytype": { "stars": 5029, "owner": "google", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-01-23T16:17:37Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "google/yapf": { "stars": 13991, "owner": "google", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-02-10T20:44:26Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "gorakhargosh/watchdog": { - "stars": 7283, + "stars": 7282, "owner": "gorakhargosh", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-27T09:55:25Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "gotcha/ipdb": { "stars": 1968, "owner": "gotcha", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-27T02:33:10Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "grantjenks/python-diskcache": { "stars": 2846, "owner": "grantjenks", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2024-03-03T01:19:29Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "grantjenks/python-sortedcontainers": { - "stars": 3935, + "stars": 3934, "owner": "grantjenks", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2024-03-01T23:03:38Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "graphql-python/graphene": { - "stars": 8252, + "stars": 8251, "owner": "graphql-python", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2024-11-09T20:43:17Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "gruns/furl": { "stars": 2797, "owner": "gruns", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-22T04:48:40Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "gruns/icecream": { "stars": 10032, "owner": "gruns", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-01-21T07:33:17Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "h2oai/h2o-3": { "stars": 7511, "owner": "h2oai", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-11T14:23:32Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "has2k1/plotnine": { "stars": 4521, "owner": "has2k1", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-10T17:54:57Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "hbldh/bleak": { - "stars": 2351, + "stars": 2352, "owner": "hbldh", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-17T16:54:46Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "hi-primus/optimus": { "stars": 1539, "owner": "hi-primus", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2023-05-19T04:32:00Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "html5lib/html5lib-python": { "stars": 1218, "owner": "html5lib", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2024-02-21T15:31:38Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "httpie/cli": { "stars": 37725, "owner": "httpie", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2024-12-17T17:30:35Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "hugapi/hug": { "stars": 6905, "owner": "hugapi", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2023-06-30T13:14:01Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "huggingface/diffusers": { - "stars": 33076, + "stars": 33083, "owner": "huggingface", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T06:58:35Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "huggingface/transformers": { - "stars": 157984, + "stars": 158003, "owner": "huggingface", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T10:39:52Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "humiaozuzu/awesome-flask": { "stars": 12696, "owner": "humiaozuzu", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2019-09-17T07:46:46Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "ibayer/fastFM": { "stars": 1090, "owner": "ibayer", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2021-03-24T12:22:31Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "ijl/orjson": { - "stars": 7961, + "stars": 7962, "owner": "ijl", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-02T14:52:49Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "indico/indico": { "stars": 2031, "owner": "indico", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T10:32:40Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "inducer/pudb": { "stars": 3218, "owner": "inducer", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-16T17:32:15Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "infiniflow/ragflow": { - "stars": 75265, + "stars": 75368, "owner": "infiniflow", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T11:20:10Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "ionelmc/python-hunter": { "stars": 866, "owner": "ionelmc", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-08-22T21:11:31Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "ionelmc/python-manhole": { "stars": 400, "owner": "ionelmc", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2024-07-04T13:45:03Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "isnowfy/snownlp": { "stars": 6614, "owner": "isnowfy", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2020-01-19T02:39:03Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "jab/bidict": { "stars": 1578, "owner": "jab", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-01T17:54:35Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "jaraco/path.py": { "stars": 1124, "owner": "jaraco", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-07-27T20:35:09Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "jazzband/django-debug-toolbar": { "stars": 8351, "owner": "django-commons", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T06:19:41Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "jazzband/django-oauth-toolkit": { "stars": 3310, "owner": "django-oauth", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-13T03:05:23Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "jazzband/django-pipeline": { "stars": 1543, "owner": "jazzband", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-09-13T11:23:20Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "jazzband/geojson": { "stars": 984, "owner": "jazzband", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2024-12-21T19:30:30Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "jazzband/pip-tools": { - "stars": 7993, + "stars": 7994, "owner": "jazzband", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-10T00:56:06Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "jazzband/tablib": { - "stars": 4751, + "stars": 4752, "owner": "jazzband", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-10-15T19:49:59Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "jeffknupp/sandman2": { "stars": 2044, "owner": "jeffknupp", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2020-12-21T15:15:51Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "jek/blinker": { "stars": 2034, "owner": "pallets-eco", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-06-14T20:37:05Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "jendrikseipp/vulture": { - "stars": 4379, + "stars": 4380, "owner": "jendrikseipp", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-04T21:50:03Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "jet-admin/jet-bridge": { "stars": 1794, "owner": "jet-admin", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-20T22:46:56Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "jfkirk/tensorrec": { "stars": 1302, "owner": "jfkirk", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2020-02-04T21:10:25Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "jiaaro/pydub": { - "stars": 9743, + "stars": 9744, "owner": "jiaaro", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2022-12-08T17:49:19Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "jindaxiang/akshare": { - "stars": 17394, + "stars": 17423, "owner": "akfamily", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-16T13:32:06Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "jmcnamara/XlsxWriter": { - "stars": 3920, + "stars": 3921, "owner": "jmcnamara", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-01-28T17:54:43Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "joke2k/faker": { - "stars": 19220, + "stars": 19196, "owner": "joke2k", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-13T14:35:47Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "jonathanslenders/ptpython": { "stars": 5410, "owner": "prompt-toolkit", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-11-21T10:57:24Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "jonathanslenders/python-prompt-toolkit": { - "stars": 10329, + "stars": 10331, "owner": "prompt-toolkit", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T12:10:47Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "jorgenschaefer/elpy": { "stars": 1940, "owner": "jorgenschaefer", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-04-04T23:49:23Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" + }, + "josephmisiti/awesome-machine-learning": { + "stars": 72025, + "owner": "josephmisiti", + "last_commit_at": "2026-03-15T15:16:19Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "jpadilla/pyjwt": { - "stars": 5622, + "stars": 5621, "owner": "jpadilla", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-16T13:30:51Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "jschneier/django-storages": { "stars": 2939, "owner": "jschneier", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-06-18T15:59:00Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "keleshev/schema": { "stars": 2944, "owner": "keleshev", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-04T20:33:24Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "keon/algorithms": { - "stars": 25390, + "stars": 25392, "owner": "keon", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-13T20:58:07Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "keras-team/keras": { - "stars": 63928, + "stars": 63910, "owner": "keras-team", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-13T23:34:27Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "keunwoochoi/kapre": { "stars": 946, "owner": "keunwoochoi", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-10-26T20:05:08Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "kevin1024/vcrpy": { "stars": 2951, "owner": "kevin1024", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-01-04T19:19:38Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "kiwicom/schemathesis": { - "stars": 3114, + "stars": 3116, "owner": "schemathesis", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-16T15:31:51Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "klen/mixer": { "stars": 954, "owner": "klen", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2022-03-23T14:37:36Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "knipknap/SpiffWorkflow": { "stars": 1864, "owner": "sartography", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-07T15:46:26Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "kootenpv/yagmail": { - "stars": 2725, + "stars": 2724, "owner": "kootenpv", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2022-09-28T20:43:53Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "kornia/kornia": { - "stars": 11119, + "stars": 11120, "owner": "kornia", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T04:19:37Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "kreuzberg-dev/kreuzberg": { - "stars": 6736, + "stars": 6742, "owner": "kreuzberg-dev", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T10:21:20Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "kurtmckee/feedparser": { "stars": 2327, "owner": "kurtmckee", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-01T15:38:19Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "laixintao/iredis": { "stars": 2728, "owner": "laixintao", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T06:31:48Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "lancopku/pkuseg-python": { - "stars": 6702, + "stars": 6703, "owner": "lancopku", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2022-06-08T05:57:27Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "langchain-ai/langchain": { - "stars": 129943, + "stars": 130028, "owner": "langchain-ai", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T04:53:18Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "lektor/lektor": { "stars": 3926, "owner": "lektor", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-14T18:05:07Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "lemire/simdjson": { - "stars": 23448, + "stars": 23449, "owner": "simdjson", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T16:39:07Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "lepture/authlib": { "stars": 5244, "owner": "authlib", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-16T12:43:10Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "lepture/mistune": { - "stars": 2998, + "stars": 2997, "owner": "lepture", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-16T13:00:29Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "lericson/pylibmc": { "stars": 493, "owner": "lericson", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-04-12T08:57:20Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "libAudioFlux/audioFlux": { - "stars": 3281, + "stars": 3282, "owner": "libAudioFlux", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-06T04:12:10Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "librosa/librosa": { - "stars": 8263, + "stars": 8268, "owner": "librosa", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-05-19T17:05:09Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "libvips/pyvips": { "stars": 789, "owner": "libvips", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-01-20T19:19:36Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "lincolnloop/python-qrcode": { - "stars": 4864, + "stars": 4866, "owner": "lincolnloop", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-01-12T03:26:33Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "linkedin/shiv": { "stars": 1918, "owner": "linkedin", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-01-10T12:19:00Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "litestar-org/litestar": { - "stars": 8099, + "stars": 8100, "owner": "litestar-org", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-16T20:50:28Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "litestar-org/polyfactory": { - "stars": 1428, + "stars": 1429, "owner": "litestar-org", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-16T21:09:57Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "lk-geimfari/mimesis": { "stars": 4799, "owner": "lk-geimfari", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-01-18T21:51:11Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "locustio/locust": { "stars": 27608, "owner": "locustio", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-13T21:23:56Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "lorien/grab": { "stars": 2458, "owner": "lorien", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-09-19T10:51:14Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "lyst/lightfm": { - "stars": 5066, + "stars": 5067, "owner": "lyst", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2023-04-30T18:36:20Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "maciejkula/spotlight": { - "stars": 3042, + "stars": 3043, "owner": "maciejkula", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2020-02-09T21:03:48Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "madmaze/pytesseract": { "stars": 6321, "owner": "madmaze", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-02-17T21:20:41Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "mahmoud/boltons": { "stars": 6856, "owner": "mahmoud", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-06T22:18:37Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "mailgun/flanker": { "stars": 1650, "owner": "mailgun", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2023-03-03T17:53:06Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "marcelotduarte/cx_Freeze": { "stars": 1532, "owner": "marcelotduarte", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-16T12:04:40Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "marimo-team/marimo": { - "stars": 19725, + "stars": 19740, "owner": "marimo-team", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T03:02:33Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "markusschanta/awesome-jupyter": { "stars": 4569, "owner": "markusschanta", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-12-07T18:36:13Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "marph91/jimmy": { "stars": 400, "owner": "marph91", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-08T17:12:27Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "marrow/mailer": { "stars": 293, "owner": "marrow", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-05-21T17:42:25Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "marshmallow-code/marshmallow": { - "stars": 7228, + "stars": 7229, "owner": "marshmallow-code", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-13T19:59:09Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "marshmallow-code/webargs": { "stars": 1405, "owner": "marshmallow-code", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-16T19:32:45Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "martinblech/xmltodict": { "stars": 5726, "owner": "martinblech", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-22T23:29:47Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "martinrusev/imbox": { "stars": 1211, "owner": "martinrusev", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2024-04-16T09:00:27Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "matplotlib/matplotlib": { - "stars": 22585, + "stars": 22593, "owner": "matplotlib", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T05:35:11Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "metawilm/cl-python": { "stars": 394, "owner": "metawilm", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2022-03-10T15:51:06Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "mhammond/pywin32": { - "stars": 5531, + "stars": 5530, "owner": "mhammond", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-27T04:04:10Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "mher/flower": { - "stars": 7130, + "stars": 7131, "owner": "mher", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-05T11:41:28Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "michaelhelmick/lassie": { "stars": 630, "owner": "michaelhelmick", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2021-08-20T14:32:48Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "micropython/micropython": { "stars": 21553, "owner": "micropython", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T06:02:09Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "microsoft/markitdown": { - "stars": 90875, + "stars": 90921, "owner": "microsoft", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-16T17:35:24Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "miguelgrinberg/microdot": { "stars": 2093, "owner": "miguelgrinberg", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-10T23:30:38Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "mindflayer/python-mocket": { "stars": 309, "owner": "mindflayer", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-23T18:40:24Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "mindsdb/mindsdb": { - "stars": 38775, + "stars": 38781, "owner": "mindsdb", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-10T12:27:03Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "mingrammer/diagrams": { - "stars": 42078, + "stars": 42082, "owner": "mingrammer", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-07T11:02:06Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "mininet/mininet": { "stars": 5788, "owner": "mininet", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2023-09-17T01:50:27Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "miracle2k/flask-assets": { "stars": 459, "owner": "miracle2k", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2023-12-15T13:55:26Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "miracle2k/webassets": { "stars": 935, "owner": "miracle2k", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-08-17T12:47:39Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "miso-belica/sumy": { - "stars": 3664, + "stars": 3665, "owner": "miso-belica", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-14T21:08:54Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "mitmproxy/pdoc": { "stars": 2474, "owner": "mitmproxy", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-01-01T09:58:22Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "mitsuhiko/pluginbase": { "stars": 1141, "owner": "mitsuhiko", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2021-05-16T16:12:48Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "mitsuhiko/unp": { "stars": 455, "owner": "mitsuhiko", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2014-08-26T21:17:09Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "mkdocs/mkdocs": { - "stars": 21860, + "stars": 21864, "owner": "mkdocs", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-10-20T13:17:06Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "modoboa/modoboa": { - "stars": 3468, + "stars": 3470, "owner": "modoboa", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T10:55:36Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "mongodb/django-mongodb-backend": { "stars": 218, "owner": "mongodb", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T09:42:16Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "mongodb/mongo-python-driver": { "stars": 4338, "owner": "mongodb", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-12T16:42:15Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "moses-palmer/pynput": { "stars": 2125, "owner": "moses-palmer", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-03-17T17:11:34Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "mozilla/unicode-slugify": { "stars": 328, "owner": "mozilla", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2021-10-22T20:06:17Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "mozillazg/python-pinyin": { "stars": 5271, "owner": "mozillazg", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-15T08:03:42Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "mpdavis/python-jose": { "stars": 1743, "owner": "mpdavis", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-05-28T17:25:04Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "mpi4py/mpi4py": { "stars": 902, "owner": "mpi4py", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-15T10:04:33Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "mre/awesome-static-analysis": { - "stars": 14439, + "stars": 14440, "owner": "analysis-tools-dev", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T00:12:23Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "msiemens/tinydb": { "stars": 7487, "owner": "msiemens", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-01-17T21:42:58Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "mstamy2/PyPDF2": { - "stars": 9878, + "stars": 9880, "owner": "py-pdf", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T13:32:56Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "mwaskom/seaborn": { - "stars": 13770, + "stars": 13769, "owner": "mwaskom", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-01-22T13:03:04Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "mymarilyn/clickhouse-driver": { "stars": 1293, "owner": "mymarilyn", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-11-10T20:21:21Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "napalm-automation/napalm": { "stars": 2438, "owner": "napalm-automation", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-16T18:24:04Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "nficano/python-lambda": { "stars": 1521, "owner": "nficano", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2022-06-03T06:57:29Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "nicfit/eyeD3": { "stars": 631, "owner": "nicfit", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-16T18:17:03Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "nose-devs/nose2": { "stars": 822, "owner": "nose-devs", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-09T17:37:19Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "noxrepo/pox": { "stars": 652, "owner": "noxrepo", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2020-05-20T12:00:13Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "nucleic/enaml": { "stars": 1574, "owner": "nucleic", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-16T11:07:00Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "numba/numba": { - "stars": 10935, + "stars": 10936, "owner": "numba", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-13T01:45:23Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "nvbn/thefuck": { - "stars": 95714, + "stars": 95720, "owner": "nvbn", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2024-01-25T19:52:35Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "nvdv/vprof": { "stars": 3982, "owner": "nvdv", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2022-07-15T07:43:03Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "oauthlib/oauthlib": { "stars": 2958, "owner": "oauthlib", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-28T14:03:09Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "offerrall/FuncToWeb": { "stars": 389, "owner": "offerrall", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-01-20T01:50:32Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "openai/gym": { - "stars": 37100, + "stars": 37099, "owner": "openai", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2023-01-30T18:15:21Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "openembedded/bitbake": { - "stars": 509, + "stars": 510, "owner": "openembedded", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T13:52:55Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "openstack/cliff": { "stars": 260, "owner": "openstack", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-06T16:40:04Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "orsinium/textdistance": { - "stars": 3524, + "stars": 3525, "owner": "life4", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-04-18T12:13:17Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pallets-eco/flask-debugtoolbar": { "stars": 980, "owner": "pallets-eco", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-06-14T20:13:45Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pallets/click": { - "stars": 17367, + "stars": 17338, "owner": "pallets", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-12-31T06:51:28Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pallets/flask": { - "stars": 71376, + "stars": 71345, "owner": "pallets", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-08T23:21:50Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pallets/itsdangerous": { "stars": 3102, "owner": "pallets", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-06-14T20:35:42Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pallets/jinja": { - "stars": 11513, + "stars": 11515, "owner": "pallets", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-06-14T20:34:58Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pallets/markupsafe": { "stars": 685, "owner": "pallets", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-09-27T18:45:34Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pallets/werkzeug": { "stars": 6849, "owner": "pallets", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-25T19:33:16Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "paramiko/paramiko": { "stars": 9712, "owner": "paramiko", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-10-20T02:49:59Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pathsim/pathsim": { "stars": 334, "owner": "pathsim", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-04T08:30:56Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pathwaycom/pathway": { - "stars": 60281, + "stars": 60427, "owner": "pathwaycom", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T06:08:37Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "patrys/httmock": { "stars": 472, "owner": "patrys", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2020-10-28T12:00:08Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "patx/pickledb": { "stars": 1069, "owner": "patx", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-01-06T08:04:35Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pdfminer/pdfminer.six": { "stars": 6933, "owner": "pdfminer", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-13T03:10:44Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pennersr/django-allauth": { - "stars": 10307, + "stars": 10308, "owner": "pennersr", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-09T13:39:18Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "peterbrittain/asciimatics": { - "stars": 4271, + "stars": 4273, "owner": "peterbrittain", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-05-31T15:53:57Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pgjones/hypercorn": { "stars": 1536, "owner": "pgjones", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-11-08T13:49:10Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pgmpy/pgmpy": { - "stars": 3213, + "stars": 3214, "owner": "pgmpy", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T11:06:43Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pikepdf/pikepdf": { "stars": 2667, "owner": "pikepdf", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-14T20:40:53Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "planetopendata/awesome-sqlite": { "stars": 388, "owner": "planetopendata", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-23T12:53:44Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "platformio/platformio-core": { - "stars": 8931, + "stars": 8936, "owner": "platformio", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-23T12:44:48Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "plotly/plotly.py": { - "stars": 18354, + "stars": 18359, "owner": "plotly", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T00:29:18Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pndurette/gTTS": { - "stars": 2595, + "stars": 2594, "owner": "pndurette", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-05-11T13:03:37Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pola-rs/polars": { - "stars": 37775, + "stars": 37780, "owner": "pola-rs", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T07:31:49Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "ponyorm/pony": { - "stars": 3826, + "stars": 3825, "owner": "ponyorm", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-07-03T18:16:47Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "prabhupant/python-ds": { - "stars": 3074, + "stars": 3075, "owner": "prabhupant", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2024-04-06T07:43:16Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pricingassistant/mrq": { "stars": 896, "owner": "pricingassistant", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2020-12-13T18:58:15Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "prompt-toolkit/python-prompt-toolkit": { - "stars": 10329, + "stars": 10331, "owner": "prompt-toolkit", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T12:10:47Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "psf/black": { - "stars": 41430, + "stars": 41431, "owner": "psf", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T00:18:45Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "psf/requests": { - "stars": 53881, + "stars": 53853, "owner": "psf", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-05T20:14:29Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "psf/requests-html": { "stars": 13869, "owner": "psf", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2023-04-03T17:09:56Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "psycopg/psycopg": { "stars": 2322, "owner": "psycopg", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-10T18:42:54Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pudo/dataset": { - "stars": 4853, + "stars": 4854, "owner": "pudo", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-02-05T12:22:42Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pwaller/pyfiglet": { - "stars": 1545, + "stars": 1546, "owner": "pwaller", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-08-15T18:27:57Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "py2exe/py2exe": { "stars": 995, "owner": "py2exe", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-07-15T21:35:24Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pybee/toga": { - "stars": 5323, + "stars": 5325, "owner": "beeware", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T04:04:32Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pybuilder/pybuilder": { "stars": 1956, "owner": "pybuilder", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-13T22:57:47Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pyca/cryptography": { "stars": 7515, "owner": "pyca", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T11:13:04Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pyca/pynacl": { "stars": 1185, "owner": "pyca", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T11:13:25Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pydantic/pydantic": { - "stars": 27237, + "stars": 27214, "owner": "pydantic", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T10:48:39Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pydantic/pydantic-ai": { - "stars": 15531, + "stars": 15547, "owner": "pydantic", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T02:59:07Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pyenv-win/pyenv-win": { - "stars": 7064, + "stars": 7066, "owner": "pyenv-win", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-01-21T03:27:29Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pyenv/pyenv": { - "stars": 44440, + "stars": 44444, "owner": "pyenv", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-14T08:23:19Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pyeve/cerberus": { "stars": 3270, "owner": "pyeve", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-01-01T13:12:42Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pyeve/eve": { "stars": 6746, "owner": "pyeve", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-11T09:34:15Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pyexcel/pyexcel": { "stars": 1284, "owner": "pyexcel", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-12-10T21:38:52Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pyglet/pyglet": { "stars": 2172, "owner": "pyglet", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T02:49:51Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pygraphviz/pygraphviz": { "stars": 834, "owner": "pygraphviz", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-10T23:04:21Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pyinfra-dev/pyinfra": { - "stars": 4869, + "stars": 4870, "owner": "pyinfra-dev", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T10:59:38Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pyinstaller/pyinstaller": { - "stars": 12924, + "stars": 12925, "owner": "pyinstaller", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-16T15:45:58Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pyinvoke/invoke": { "stars": 4722, "owner": "pyinvoke", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-10-20T02:48:00Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pylint-dev/pylint": { "stars": 5661, "owner": "pylint-dev", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T20:40:19Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pymatting/pymatting": { "stars": 1891, "owner": "pymatting", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-19T10:29:20Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pymc-devs/pymc3": { - "stars": 9527, + "stars": 9528, "owner": "pymc-devs", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T14:36:22Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pymssql/pymssql": { "stars": 880, "owner": "pymssql", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-10T00:40:01Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pynamodb/PynamoDB": { "stars": 2647, "owner": "pynamodb", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-01-06T15:42:11Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pypa/bandersnatch": { "stars": 528, "owner": "pypa", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-16T19:27:34Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pypa/hatch": { - "stars": 7145, + "stars": 7149, "owner": "pypa", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-27T17:59:39Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pypa/virtualenv": { "stars": 5017, "owner": "pypa", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T00:32:57Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pypa/warehouse": { - "stars": 3978, + "stars": 3979, "owner": "pypi", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T16:48:08Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pyparsing/pyparsing": { "stars": 2465, "owner": "pyparsing", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-22T17:57:48Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pyqtgraph/pyqtgraph": { "stars": 4311, "owner": "pyqtgraph", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-12-08T16:15:20Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pyston/pyston": { "stars": 2507, "owner": "pyston", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2024-08-12T16:30:56Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "python-attrs/attrs": { "stars": 5746, "owner": "python-attrs", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-14T17:51:51Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "python-greenlet/greenlet": { - "stars": 1814, + "stars": 1815, "owner": "python-greenlet", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-20T20:15:01Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "python-jsonschema/jsonschema": { - "stars": 4935, + "stars": 4934, "owner": "python-jsonschema", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-15T02:35:55Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "python-mode/python-mode": { "stars": 5478, "owner": "python-mode", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-11-14T23:45:03Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "python-openxml/python-docx": { "stars": 5486, "owner": "python-openxml", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-06-16T21:24:39Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "python-pillow/Pillow": { - "stars": 13437, + "stars": 13438, "owner": "python-pillow", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-13T22:42:15Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "python-rapidjson/python-rapidjson": { "stars": 532, "owner": "python-rapidjson", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-12-07T06:14:13Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "python-rope/rope": { "stars": 2183, "owner": "python-rope", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-01-04T14:49:29Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "python-trio/trio": { "stars": 7204, "owner": "python-trio", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-16T22:58:36Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "python/cpython": { - "stars": 72015, + "stars": 72001, "owner": "python", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T18:24:44Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "python/mypy": { "stars": 20302, "owner": "python", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T22:24:58Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "python/typeshed": { - "stars": 5021, + "stars": 5022, "owner": "python", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T00:46:34Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pythonnet/pythonnet": { "stars": 5418, "owner": "pythonnet", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-27T07:16:04Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pytoolz/cytoolz": { "stars": 1103, "owner": "pytoolz", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-10-18T19:31:50Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pytoolz/toolz": { - "stars": 5125, + "stars": 5126, "owner": "pytoolz", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-10-17T03:29:39Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pytorch/pytorch": { - "stars": 98355, + "stars": 98348, "owner": "pytorch", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T08:34:10Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "pytransitions/transitions": { "stars": 6459, "owner": "pytransitions", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-09-09T16:42:34Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "quantumlib/Cirq": { - "stars": 4890, + "stars": 4891, "owner": "quantumlib", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T20:32:18Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "quodlibet/mutagen": { - "stars": 1867, + "stars": 1868, "owner": "quodlibet", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-15T17:12:28Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "r0x0r/pywebview": { - "stars": 5803, + "stars": 5804, "owner": "r0x0r", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-13T21:31:51Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "ranaroussi/yfinance": { - "stars": 22172, + "stars": 22190, "owner": "ranaroussi", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-21T17:37:15Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "ray-project/ray": { - "stars": 41786, + "stars": 41765, "owner": "ray-project", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T07:37:46Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "redis/redis-py": { - "stars": 13505, + "stars": 13507, "owner": "redis", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T11:59:23Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "reflex-dev/reflex": { - "stars": 28234, + "stars": 28233, "owner": "reflex-dev", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T02:23:17Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "robotframework/robotframework": { - "stars": 11478, + "stars": 11479, "owner": "robotframework", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T20:41:56Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "ronaldoussoren/py2app": { "stars": 421, "owner": "ronaldoussoren", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-01-25T11:45:17Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "rq/rq": { "stars": 10605, "owner": "rq", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-14T11:13:10Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "rsalmei/alive-progress": { - "stars": 6256, + "stars": 6257, "owner": "rsalmei", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-10-10T00:39:31Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "run-llama/llama_index": { - "stars": 47740, + "stars": 47758, "owner": "run-llama", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T14:37:41Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "s3tools/s3cmd": { "stars": 4869, "owner": "s3tools", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-10-22T23:26:17Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "saffsd/langid.py": { "stars": 2455, "owner": "saffsd", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2017-07-15T02:49:17Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "saltstack/salt": { "stars": 15281, "owner": "saltstack", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T21:32:42Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "samuelcolvin/watchfiles": { - "stars": 2444, + "stars": 2446, "owner": "samuelcolvin", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-11-28T23:00:57Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "sanic-org/sanic": { "stars": 18639, "owner": "sanic-org", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-12-31T19:05:34Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "scanny/python-pptx": { - "stars": 3233, + "stars": 3235, "owner": "scanny", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2024-08-07T17:33:54Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "schematics/schematics": { "stars": 2591, "owner": "schematics", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2021-08-17T21:08:10Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "scottrogowski/code2flow": { - "stars": 4545, + "stars": 4546, "owner": "scottrogowski", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2023-01-08T22:55:22Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "scrapy/scrapy": { - "stars": 60855, + "stars": 60844, "owner": "scrapy", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-13T09:30:25Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "sdispater/pendulum": { "stars": 6628, "owner": "python-pendulum", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-17T11:16:10Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "sdispater/poetry": { - "stars": 34316, + "stars": 34294, "owner": "python-poetry", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-15T10:36:40Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "sebastien/cuisine": { "stars": 1270, "owner": "sebastien", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2024-05-21T02:33:04Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "secdev/scapy": { - "stars": 12108, + "stars": 12110, "owner": "secdev", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T22:19:36Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "sehmaschine/django-grappelli": { "stars": 3927, "owner": "sehmaschine", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-11-27T15:59:41Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "selwin/python-user-agents": { "stars": 1520, "owner": "selwin", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2023-02-16T01:51:50Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "sergree/matchering": { "stars": 2446, "owner": "sergree", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-15T05:33:05Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "shahraizali/awesome-django": { - "stars": 1901, + "stars": 1902, "owner": "shahraizali", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-11-03T23:23:57Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "shapely/shapely": { - "stars": 4395, + "stars": 4396, "owner": "shapely", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-10T08:57:31Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "sherlock-project/sherlock": { - "stars": 73803, + "stars": 73819, "owner": "sherlock-project", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T06:26:18Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "simonw/datasette": { - "stars": 10835, + "stars": 10839, "owner": "simonw", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T15:47:04Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "simonw/sqlite-utils": { "stars": 2019, "owner": "simonw", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-12-17T06:11:47Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "sirfz/tesserocr": { "stars": 2160, "owner": "sirfz", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-16T14:37:08Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "skorokithakis/shortuuid": { "stars": 2178, "owner": "skorokithakis", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-12-01T00:26:35Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "sloria/doitlive": { "stars": 3566, "owner": "sloria", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-16T16:14:55Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" + }, + "sorrycc/awesome-javascript": { + "stars": 34932, + "owner": "sorrycc", + "last_commit_at": "2026-03-16T02:09:29Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "sphinx-doc/sphinx": { - "stars": 7721, + "stars": 7724, "owner": "sphinx-doc", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-12-31T15:07:44Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "spotify/annoy": { "stars": 14181, "owner": "spotify", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-10-29T14:08:37Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "spotify/luigi": { - "stars": 18694, + "stars": 18695, "owner": "spotify", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T02:22:01Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "spulec/freezegun": { "stars": 4498, "owner": "spulec", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-08-19T19:29:42Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "spyder-ide/spyder": { "stars": 9163, "owner": "spyder-ide", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T01:07:45Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "sqlalchemy/dogpile.cache": { "stars": 291, "owner": "sqlalchemy", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-01-12T18:51:49Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "sqlmapproject/sqlmap": { - "stars": 36853, + "stars": 36856, "owner": "sqlmapproject", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T21:22:40Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "stanfordnlp/stanza": { - "stars": 7739, + "stars": 7740, "owner": "stanfordnlp", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-26T06:42:21Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "statsmodels/statsmodels": { - "stars": 11298, + "stars": 11302, "owner": "statsmodels", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-12T16:03:41Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "stchris/untangle": { "stars": 631, "owner": "stchris", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-01T11:05:37Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "strawberry-graphql/strawberry-django": { "stars": 488, "owner": "strawberry-graphql", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-16T17:13:53Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "streamlit/streamlit": { - "stars": 43924, + "stars": 43929, "owner": "streamlit", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T11:26:08Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "sunainapai/makesite": { "stars": 1872, "owner": "sunainapai", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2022-10-12T19:28:59Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "sympy/sympy": { "stars": 14495, "owner": "sympy", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-15T20:23:47Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "tartley/colorama": { "stars": 3770, "owner": "tartley", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-07-09T16:58:36Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "tayllan/awesome-algorithms": { - "stars": 24835, + "stars": 24837, "owner": "tayllan", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-01-11T06:35:17Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "tensorflow/tensorflow": { - "stars": 194201, + "stars": 194187, "owner": "tensorflow", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T11:21:25Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "thauber/django-schedule": { "stars": 850, "owner": "thauber", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2016-04-16T20:26:10Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "thumbor/thumbor": { "stars": 10465, "owner": "thumbor", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-16T02:56:03Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "tiangolo/fastapi": { - "stars": 96302, + "stars": 96308, "owner": "fastapi", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T10:56:02Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "tiangolo/typer": { - "stars": 19041, + "stars": 19044, "owner": "fastapi", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-16T13:02:43Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "timofurrer/awesome-asyncio": { - "stars": 5030, + "stars": 5031, "owner": "timofurrer", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-12-01T14:19:00Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "timofurrer/try": { "stars": 751, "owner": "timofurrer", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2022-05-15T18:30:33Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "timothycrosley/isort": { "stars": 6916, "owner": "PyCQA", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-14T20:59:11Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "tmux-python/tmuxp": { "stars": 4451, "owner": "tmux-python", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T22:44:59Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "tmux/tmux": { - "stars": 43165, + "stars": 43191, "owner": "tmux", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T08:46:16Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "tomerfiliba/rpyc": { "stars": 1693, "owner": "tomerfiliba-org", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-08-14T03:45:36Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "tomschimansky/customtkinter": { - "stars": 13223, + "stars": 13225, "owner": "TomSchimansky", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-01-02T20:44:11Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "tornadoweb/tornado": { "stars": 22406, "owner": "tornadoweb", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T19:24:12Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "tqdm/tqdm": { - "stars": 31040, + "stars": 31042, "owner": "tqdm", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-03T16:58:32Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "trustedsec/social-engineer-toolkit": { "stars": 14671, "owner": "trustedsec", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2024-10-21T15:46:17Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "twisted/treq": { "stars": 606, "owner": "twisted", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-01-03T01:47:06Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "twisted/twisted": { - "stars": 5951, + "stars": 5950, "owner": "twisted", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-09T23:19:56Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "tyiannak/pyAudioAnalysis": { "stars": 6234, "owner": "tyiannak", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-08-04T16:44:35Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "typeddjango/awesome-python-typing": { - "stars": 1950, + "stars": 1952, "owner": "typeddjango", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-28T08:10:43Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "ultraplot/UltraPlot": { - "stars": 279, + "stars": 280, "owner": "Ultraplot", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T00:56:09Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "un33k/python-slugify": { "stars": 1599, "owner": "un33k", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-01-07T16:28:09Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "unclecode/crawl4ai": { - "stars": 62122, + "stars": 62156, "owner": "unclecode", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-20T03:31:12Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "unfoldadmin/django-unfold": { - "stars": 3369, + "stars": 3372, "owner": "unfoldadmin", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T11:04:37Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "uralbash/awesome-pyramid": { "stars": 570, "owner": "uralbash", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2021-07-08T12:28:10Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "urllib3/urllib3": { "stars": 4012, "owner": "urllib3", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-15T06:51:37Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "vadikko2/python-cqrs": { "stars": 44, "owner": "pypatterns", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-05T20:33:59Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" + }, + "vinta/awesome-python": { + "stars": 287742, + "owner": "vinta", + "last_commit_at": "2026-03-18T06:03:50Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "vinta/pangu.py": { "stars": 276, "owner": "vinta", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2023-03-30T17:57:13Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "vispy/vispy": { "stars": 3558, "owner": "vispy", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-02T19:30:57Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "vitali87/code-graph-rag": { - "stars": 2131, + "stars": 2139, "owner": "vitali87", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T00:56:06Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "vllm-project/vllm": { - "stars": 73457, + "stars": 73512, "owner": "vllm-project", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T10:30:29Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "wagtail/wagtail": { "stars": 20240, "owner": "wagtail", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-18T01:31:28Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "waylan/Python-Markdown": { "stars": 4186, "owner": "Python-Markdown", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-02-09T14:54:42Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "web2py/pydal": { "stars": 531, "owner": "web2py", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-14T00:25:51Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "wireservice/csvkit": { "stars": 6360, "owner": "wireservice", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-05T23:54:49Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "wooey/wooey": { - "stars": 2218, + "stars": 2219, "owner": "wooey", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2023-12-14T15:17:45Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "worldveil/dejavu": { "stars": 6736, "owner": "worldveil", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2020-06-03T05:58:03Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "xonsh/xonsh": { "stars": 9252, "owner": "xonsh", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T15:32:20Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "yfedoseev/pdf_oxide": { "stars": 431, "owner": "yfedoseev", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-11T04:36:36Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "yoloseem/awesome-sphinxdoc": { "stars": 973, "owner": "ygzgxyz", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-10-07T13:10:20Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "ytdl-org/youtube-dl": { - "stars": 139894, + "stars": 139899, "owner": "ytdl-org", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2025-11-26T03:02:36Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "zappa/Zappa": { - "stars": 3676, + "stars": 3678, "owner": "zappa", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-15T01:53:26Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "zauberzeug/nicegui": { - "stars": 15518, + "stars": 15522, "owner": "zauberzeug", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-03-17T13:26:42Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "zoofIO/flexx": { "stars": 3343, "owner": "flexxui", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2024-01-06T22:16:26Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "zopefoundation/ZODB": { "stars": 752, "owner": "zopefoundation", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" + "last_commit_at": "2026-01-24T15:33:23Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" }, "ztane/python-Levenshtein": { "stars": 1278, "owner": "ztane", - "fetched_at": "2026-03-17T20:08:08.973003+00:00" - }, - "josephmisiti/awesome-machine-learning": { - "stars": 72017, - "owner": "josephmisiti", - "fetched_at": "2026-03-17T20:12:03.066921+00:00" - }, - "sorrycc/awesome-javascript": { - "stars": 34931, - "owner": "sorrycc", - "fetched_at": "2026-03-17T20:12:03.066921+00:00" - }, - "vinta/awesome-python": { - "stars": 287640, - "owner": "vinta", - "fetched_at": "2026-03-17T20:12:03.066921+00:00" + "last_commit_at": "2021-02-01T13:02:11Z", + "fetched_at": "2026-03-18T11:26:37.667512+00:00" } } diff --git a/website/fetch_github_stars.py b/website/fetch_github_stars.py index 4f9b50a3..24ae1e9d 100644 --- a/website/fetch_github_stars.py +++ b/website/fetch_github_stars.py @@ -10,14 +10,14 @@ from pathlib import Path import httpx -from build import extract_github_repo +from build import extract_github_repo, load_stars CACHE_MAX_AGE_DAYS = 7 DATA_DIR = Path(__file__).parent / "data" CACHE_FILE = DATA_DIR / "github_stars.json" README_PATH = Path(__file__).parent.parent / "README.md" GRAPHQL_URL = "https://api.github.com/graphql" -BATCH_SIZE = 100 +BATCH_SIZE = 50 def extract_github_repos(text: str) -> set[str]: @@ -30,17 +30,6 @@ def extract_github_repos(text: str) -> set[str]: return repos -def load_cache() -> dict: - """Load the star cache from disk. Returns empty dict if missing or corrupt.""" - if CACHE_FILE.exists(): - try: - return json.loads(CACHE_FILE.read_text(encoding="utf-8")) - except json.JSONDecodeError: - print(f"Warning: corrupt cache at {CACHE_FILE}, starting fresh.", file=sys.stderr) - return {} - return {} - - def save_cache(cache: dict) -> None: """Write the star cache to disk, creating data/ dir if needed.""" DATA_DIR.mkdir(parents=True, exist_ok=True) @@ -61,7 +50,7 @@ def build_graphql_query(repos: list[str]) -> str: continue parts.append( f'repo_{i}: repository(owner: "{owner}", name: "{name}") ' - f"{{ stargazerCount pushedAt owner {{ login }} }}" + f"{{ stargazerCount owner {{ login }} defaultBranchRef {{ target {{ ... on Commit {{ committedDate }} }} }} }}" ) if not parts: return "" @@ -78,10 +67,12 @@ def parse_graphql_response( node = data.get(f"repo_{i}") if node is None: continue + default_branch = node.get("defaultBranchRef") or {} + target = default_branch.get("target") or {} result[repo] = { "stars": node.get("stargazerCount", 0), "owner": node.get("owner", {}).get("login", ""), - "pushed_at": node.get("pushedAt", ""), + "last_commit_at": target.get("committedDate", ""), } return result @@ -114,7 +105,7 @@ def main() -> None: current_repos = extract_github_repos(readme_text) print(f"Found {len(current_repos)} GitHub repos in README.md") - cache = load_cache() + cache = load_stars(CACHE_FILE) now = datetime.now(timezone.utc) # Prune entries not in current README @@ -173,7 +164,7 @@ def main() -> None: cache[repo] = { "stars": results[repo]["stars"], "owner": results[repo]["owner"], - "pushed_at": results[repo]["pushed_at"], + "last_commit_at": results[repo]["last_commit_at"], "fetched_at": now_iso, } fetched_count += 1 diff --git a/website/readme_parser.py b/website/readme_parser.py new file mode 100644 index 00000000..97fd37af --- /dev/null +++ b/website/readme_parser.py @@ -0,0 +1,388 @@ +"""Parse README.md into structured section data using markdown-it-py AST.""" + +from __future__ import annotations + +import re +from typing import TypedDict + +from markdown_it import MarkdownIt +from markdown_it.tree import SyntaxTreeNode +from markupsafe import escape + + +class AlsoSee(TypedDict): + name: str + url: str + + +class ParsedEntry(TypedDict): + name: str + url: str + description: str # inline HTML, properly escaped + also_see: list[AlsoSee] + + +class ParsedSection(TypedDict): + name: str + slug: str + description: str # plain text, links resolved to text + entries: list[ParsedEntry] + entry_count: int + preview: str + content_html: str # rendered HTML, properly escaped + + +# --- Slugify ---------------------------------------------------------------- + +_SLUG_NON_ALNUM_RE = re.compile(r"[^a-z0-9\s-]") +_SLUG_WHITESPACE_RE = re.compile(r"[\s]+") +_SLUG_MULTI_DASH_RE = re.compile(r"-+") + + +def slugify(name: str) -> str: + """Convert a category name to a URL-friendly slug.""" + slug = name.lower() + slug = _SLUG_NON_ALNUM_RE.sub("", slug) + slug = _SLUG_WHITESPACE_RE.sub("-", slug.strip()) + slug = _SLUG_MULTI_DASH_RE.sub("-", slug) + return slug + + +# --- Inline renderers ------------------------------------------------------- + + +def render_inline_html(children: list[SyntaxTreeNode]) -> str: + """Render inline AST nodes to HTML with proper escaping.""" + parts: list[str] = [] + for child in children: + match child.type: + case "text": + parts.append(str(escape(child.content))) + case "softbreak": + parts.append(" ") + case "link": + href = str(escape(child.attrGet("href") or "")) + inner = render_inline_html(child.children) + parts.append( + f'{inner}' + ) + case "em": + parts.append(f"{render_inline_html(child.children)}") + case "strong": + parts.append(f"{render_inline_html(child.children)}") + case "code_inline": + parts.append(f"{escape(child.content)}") + case "html_inline": + parts.append(str(escape(child.content))) + return "".join(parts) + + +def render_inline_text(children: list[SyntaxTreeNode]) -> str: + """Render inline AST nodes to plain text (links become their text).""" + parts: list[str] = [] + for child in children: + match child.type: + case "text": + parts.append(child.content) + case "softbreak": + parts.append(" ") + case "code_inline": + parts.append(child.content) + case "em" | "strong" | "link": + parts.append(render_inline_text(child.children)) + return "".join(parts) + + +# --- AST helpers ------------------------------------------------------------- + + +def _heading_text(node: SyntaxTreeNode) -> str: + """Extract plain text from a heading node.""" + for child in node.children: + if child.type == "inline": + return render_inline_text(child.children) + return "" + + +def _extract_description(nodes: list[SyntaxTreeNode]) -> str: + """Extract description from the first paragraph if it's a single block. + + Pattern: _Libraries for foo._ -> "Libraries for foo." + """ + if not nodes: + return "" + first = nodes[0] + if first.type != "paragraph": + return "" + for child in first.children: + if child.type == "inline" and len(child.children) == 1: + em = child.children[0] + if em.type == "em": + return render_inline_text(em.children) + return "" + + +# --- Entry extraction -------------------------------------------------------- + +_DESC_SEP_RE = re.compile(r"^\s*[-\u2013\u2014]\s*") + + +def _find_child(node: SyntaxTreeNode, child_type: str) -> SyntaxTreeNode | None: + """Find first direct child of a given type.""" + for child in node.children: + if child.type == child_type: + return child + return None + + +def _find_inline(node: SyntaxTreeNode) -> SyntaxTreeNode | None: + """Find the inline node in a list_item's paragraph.""" + para = _find_child(node, "paragraph") + if para is None: + return None + return _find_child(para, "inline") + + +def _find_first_link(inline: SyntaxTreeNode) -> SyntaxTreeNode | None: + """Find the first link node among inline children.""" + for child in inline.children: + if child.type == "link": + return child + return None + + +def _is_leading_link(inline: SyntaxTreeNode, link: SyntaxTreeNode) -> bool: + """Check if the link is the first child of inline (a real entry, not a subcategory label).""" + return bool(inline.children) and inline.children[0] is link + + +def _extract_description_html(inline: SyntaxTreeNode, first_link: SyntaxTreeNode) -> str: + """Extract description HTML from inline content after the first link. + + AST: [link("name"), text(" - Description.")] -> "Description." + The separator (- / en-dash / em-dash) is stripped. + """ + link_idx = next((i for i, c in enumerate(inline.children) if c is first_link), None) + if link_idx is None: + return "" + desc_children = inline.children[link_idx + 1 :] + if not desc_children: + return "" + html = render_inline_html(desc_children) + return _DESC_SEP_RE.sub("", html) + + +def _parse_list_entries(bullet_list: SyntaxTreeNode) -> list[ParsedEntry]: + """Extract entries from a bullet_list AST node. + + Handles three patterns: + - Text-only list_item -> subcategory label -> recurse into nested list + - Link list_item with nested link-only items -> entry with also_see + - Link list_item without nesting -> simple entry + """ + entries: list[ParsedEntry] = [] + + for list_item in bullet_list.children: + if list_item.type != "list_item": + continue + + inline = _find_inline(list_item) + if inline is None: + continue + + first_link = _find_first_link(inline) + + if first_link is None or not _is_leading_link(inline, first_link): + # Subcategory label (plain text or text-before-link) — recurse into nested list + nested = _find_child(list_item, "bullet_list") + if nested: + entries.extend(_parse_list_entries(nested)) + continue + + # Entry with a link + name = render_inline_text(first_link.children) + url = first_link.attrGet("href") or "" + desc_html = _extract_description_html(inline, first_link) + + # Collect also_see from nested bullet_list + also_see: list[AlsoSee] = [] + nested = _find_child(list_item, "bullet_list") + if nested: + for sub_item in nested.children: + if sub_item.type != "list_item": + continue + sub_inline = _find_inline(sub_item) + if sub_inline: + sub_link = _find_first_link(sub_inline) + if sub_link: + also_see.append(AlsoSee( + name=render_inline_text(sub_link.children), + url=sub_link.attrGet("href") or "", + )) + + entries.append(ParsedEntry( + name=name, + url=url, + description=desc_html, + also_see=also_see, + )) + + return entries + + +def _parse_section_entries(content_nodes: list[SyntaxTreeNode]) -> list[ParsedEntry]: + """Extract all entries from a section's content nodes.""" + entries: list[ParsedEntry] = [] + for node in content_nodes: + if node.type == "bullet_list": + entries.extend(_parse_list_entries(node)) + return entries + + +# --- Content HTML rendering -------------------------------------------------- + + +def _render_bullet_list_html( + bullet_list: SyntaxTreeNode, + *, + is_sub: bool = False, +) -> str: + """Render a bullet_list node to HTML with entry/entry-sub/subcat classes.""" + out: list[str] = [] + + for list_item in bullet_list.children: + if list_item.type != "list_item": + continue + + inline = _find_inline(list_item) + if inline is None: + continue + + first_link = _find_first_link(inline) + + if first_link is None or not _is_leading_link(inline, first_link): + # Subcategory label (plain text or text-before-link) + label = str(escape(render_inline_text(inline.children))) + out.append(f'
{label}
') + nested = _find_child(list_item, "bullet_list") + if nested: + out.append(_render_bullet_list_html(nested, is_sub=False)) + continue + + # Entry with a link + name = str(escape(render_inline_text(first_link.children))) + url = str(escape(first_link.attrGet("href") or "")) + + if is_sub: + out.append(f'
{name}
') + else: + desc = _extract_description_html(inline, first_link) + if desc: + out.append( + f'
{name}' + f'{desc}
' + ) + else: + out.append(f'
{name}
') + + # Nested items under an entry with a link are sub-entries + nested = _find_child(list_item, "bullet_list") + if nested: + out.append(_render_bullet_list_html(nested, is_sub=True)) + + return "\n".join(out) + + +def _render_section_html(content_nodes: list[SyntaxTreeNode]) -> str: + """Render a section's content nodes to HTML.""" + parts: list[str] = [] + for node in content_nodes: + if node.type == "bullet_list": + parts.append(_render_bullet_list_html(node)) + return "\n".join(parts) + + +# --- Section splitting ------------------------------------------------------- + + +def _group_by_h2( + nodes: list[SyntaxTreeNode], +) -> list[ParsedSection]: + """Group AST nodes into sections by h2 headings.""" + sections: list[ParsedSection] = [] + current_name: str | None = None + current_body: list[SyntaxTreeNode] = [] + + def flush() -> None: + nonlocal current_name + if current_name is None: + return + desc = _extract_description(current_body) + content_nodes = current_body[1:] if desc else current_body + entries = _parse_section_entries(content_nodes) + entry_count = len(entries) + sum(len(e["also_see"]) for e in entries) + preview = ", ".join(e["name"] for e in entries[:4]) + content_html = _render_section_html(content_nodes) + + sections.append(ParsedSection( + name=current_name, + slug=slugify(current_name), + description=desc, + entries=entries, + entry_count=entry_count, + preview=preview, + content_html=content_html, + )) + current_name = None + + for node in nodes: + if node.type == "heading" and node.tag == "h2": + flush() + current_name = _heading_text(node) + current_body = [] + elif current_name is not None: + current_body.append(node) + + flush() + return sections + + +def parse_readme(text: str) -> tuple[list[ParsedSection], list[ParsedSection]]: + """Parse README.md text into categories and resources. + + Returns (categories, resources) where each is a list of ParsedSection dicts. + """ + md = MarkdownIt("commonmark") + tokens = md.parse(text) + root = SyntaxTreeNode(tokens) + children = root.children + + # Find thematic break (---), # Resources, and # Contributing in one pass + hr_idx = None + resources_idx = None + contributing_idx = None + for i, node in enumerate(children): + if hr_idx is None and node.type == "hr": + hr_idx = i + elif node.type == "heading" and node.tag == "h1": + text_content = _heading_text(node) + if text_content == "Resources": + resources_idx = i + elif text_content == "Contributing": + contributing_idx = i + if hr_idx is None: + return [], [] + + # Slice into category and resource ranges + cat_end = resources_idx or contributing_idx or len(children) + cat_nodes = children[hr_idx + 1 : cat_end] + + res_nodes: list[SyntaxTreeNode] = [] + if resources_idx is not None: + res_end = contributing_idx or len(children) + res_nodes = children[resources_idx + 1 : res_end] + + categories = _group_by_h2(cat_nodes) + resources = _group_by_h2(res_nodes) + + return categories, resources diff --git a/website/static/favicon.svg b/website/static/favicon.svg new file mode 100644 index 00000000..660a7c6f --- /dev/null +++ b/website/static/favicon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/website/static/main.js b/website/static/main.js index 16e18311..ed04a557 100644 --- a/website/static/main.js +++ b/website/static/main.js @@ -1,15 +1,44 @@ // State var activeFilter = null; // { type: "cat"|"group", value: "..." } +var activeSort = { col: 'stars', order: 'desc' }; var searchInput = document.querySelector('.search'); var filterBar = document.querySelector('.filter-bar'); var filterValue = document.querySelector('.filter-value'); var filterClear = document.querySelector('.filter-clear'); var noResults = document.querySelector('.no-results'); -var countEl = document.querySelector('.count'); var rows = document.querySelectorAll('.table tbody tr.row'); var tags = document.querySelectorAll('.tag'); var tbody = document.querySelector('.table tbody'); +// Relative time formatting +function relativeTime(isoStr) { + var date = new Date(isoStr); + var now = new Date(); + var diffMs = now - date; + var diffHours = Math.floor(diffMs / 3600000); + var diffDays = Math.floor(diffMs / 86400000); + if (diffHours < 1) return 'just now'; + if (diffHours < 24) return diffHours === 1 ? '1 hour ago' : diffHours + ' hours ago'; + if (diffDays === 1) return 'yesterday'; + if (diffDays < 30) return diffDays + ' days ago'; + var diffMonths = Math.floor(diffDays / 30); + if (diffMonths < 12) return diffMonths === 1 ? '1 month ago' : diffMonths + ' months ago'; + var diffYears = Math.floor(diffDays / 365); + return diffYears === 1 ? '1 year ago' : diffYears + ' years ago'; +} + +// Format all commit date cells +document.querySelectorAll('.col-commit[data-commit]').forEach(function (td) { + var time = td.querySelector('time'); + if (time) time.textContent = relativeTime(td.dataset.commit); +}); + +// Store original row order for sort reset +rows.forEach(function (row, i) { + row._origIndex = i; + row._expandRow = row.nextElementSibling; +}); + function collapseAll() { var openRows = document.querySelectorAll('.table tbody tr.row.open'); openRows.forEach(function (row) { @@ -46,16 +75,18 @@ function applyFilters() { show = row._searchText.includes(query); } - row.hidden = !show; + if (row.hidden !== !show) row.hidden = !show; if (show) { visibleCount++; - row.querySelector('.col-num').textContent = String(visibleCount); + var numCell = row.cells[0]; + if (numCell.textContent !== String(visibleCount)) { + numCell.textContent = String(visibleCount); + } } }); if (noResults) noResults.hidden = visibleCount > 0; - if (countEl) countEl.textContent = visibleCount; // Update tag highlights tags.forEach(function (tag) { @@ -74,6 +105,76 @@ function applyFilters() { filterBar.hidden = true; } } + + updateURL(); +} + +function updateURL() { + var params = new URLSearchParams(); + var query = searchInput ? searchInput.value.trim() : ''; + if (query) params.set('q', query); + if (activeFilter) { + params.set(activeFilter.type === 'cat' ? 'category' : 'group', activeFilter.value); + } + if (activeSort.col !== 'stars' || activeSort.order !== 'desc') { + params.set('sort', activeSort.col); + params.set('order', activeSort.order); + } + var qs = params.toString(); + history.replaceState(null, '', qs ? '?' + qs : location.pathname); +} + +function getSortValue(row, col) { + if (col === 'name') { + return row.querySelector('.col-name a').textContent.trim().toLowerCase(); + } + if (col === 'stars') { + var text = row.querySelector('.col-stars').textContent.trim().replace(/,/g, ''); + var num = parseInt(text, 10); + return isNaN(num) ? -1 : num; + } + if (col === 'commit-time') { + var attr = row.querySelector('.col-commit').getAttribute('data-commit'); + return attr ? new Date(attr).getTime() : 0; + } + return 0; +} + +function sortRows() { + var arr = Array.prototype.slice.call(rows); + if (activeSort) { + arr.sort(function (a, b) { + var aVal = getSortValue(a, activeSort.col); + var bVal = getSortValue(b, activeSort.col); + if (activeSort.col === 'name') { + var cmp = aVal < bVal ? -1 : aVal > bVal ? 1 : 0; + if (cmp === 0) return a._origIndex - b._origIndex; + return activeSort.order === 'desc' ? -cmp : cmp; + } + if (aVal <= 0 && bVal <= 0) return a._origIndex - b._origIndex; + if (aVal <= 0) return 1; + if (bVal <= 0) return -1; + var cmp = aVal - bVal; + if (cmp === 0) return a._origIndex - b._origIndex; + return activeSort.order === 'desc' ? -cmp : cmp; + }); + } else { + arr.sort(function (a, b) { return a._origIndex - b._origIndex; }); + } + arr.forEach(function (row) { + tbody.appendChild(row); + tbody.appendChild(row._expandRow); + }); + applyFilters(); +} + +function updateSortIndicators() { + document.querySelectorAll('th[data-sort]').forEach(function (th) { + th.classList.remove('sort-asc', 'sort-desc'); + if (activeSort && th.dataset.sort === activeSort.col) { + th.classList.add('sort-' + activeSort.order); + } + }); } // Expand/collapse: event delegation on tbody @@ -130,6 +231,23 @@ if (filterClear) { }); } +// Column sorting +document.querySelectorAll('th[data-sort]').forEach(function (th) { + th.addEventListener('click', function () { + var col = th.dataset.sort; + var defaultOrder = col === 'name' ? 'asc' : 'desc'; + var altOrder = defaultOrder === 'asc' ? 'desc' : 'asc'; + if (activeSort && activeSort.col === col) { + if (activeSort.order === defaultOrder) activeSort = { col: col, order: altOrder }; + else activeSort = { col: 'stars', order: 'desc' }; + } else { + activeSort = { col: col, order: defaultOrder }; + } + sortRows(); + updateSortIndicators(); + }); +}); + // Search input if (searchInput) { var searchTimer; @@ -152,3 +270,23 @@ if (searchInput) { } }); } + +// Restore state from URL +(function () { + var params = new URLSearchParams(location.search); + var q = params.get('q'); + var cat = params.get('category'); + var group = params.get('group'); + var sort = params.get('sort'); + var order = params.get('order'); + if (q && searchInput) searchInput.value = q; + if (cat) activeFilter = { type: 'cat', value: cat }; + else if (group) activeFilter = { type: 'group', value: group }; + if ((sort === 'name' || sort === 'stars' || sort === 'commit-time') && (order === 'desc' || order === 'asc')) { + activeSort = { col: sort, order: order }; + } + if (q || cat || group || sort) { + sortRows(); + } + updateSortIndicators(); +})(); diff --git a/website/static/style.css b/website/static/style.css index c31b6875..1925b00b 100644 --- a/website/static/style.css +++ b/website/static/style.css @@ -23,6 +23,8 @@ --accent-light: oklch(97% 0.015 240); --highlight: oklch(93% 0.10 90); --highlight-text: oklch(35% 0.10 90); + --tag-text: oklch(45% 0.06 240); + --tag-hover-bg: oklch(93% 0.025 240); } html { font-size: 16px; } @@ -65,8 +67,10 @@ a:hover { color: var(--accent-hover); text-decoration: underline; } .hero-main { display: flex; + flex-wrap: wrap; justify-content: space-between; align-items: flex-start; + gap: 1rem; } .hero-submit { @@ -78,14 +82,21 @@ a:hover { color: var(--accent-hover); text-decoration: underline; } color: var(--text); text-decoration: none; white-space: nowrap; + transition: border-color 0.2s, background 0.2s, color 0.2s; } .hero-submit:hover { border-color: var(--accent); + background: var(--accent-light); color: var(--accent); text-decoration: none; } +.hero-submit:focus-visible { + outline: 2px solid var(--accent); + outline-offset: 2px; +} + .hero h1 { font-family: var(--font-display); font-size: clamp(2rem, 5vw, 3rem); @@ -144,6 +155,7 @@ a:hover { color: var(--accent-hover); text-decoration: underline; } font-family: var(--font-body); font-size: var(--text-sm); color: var(--text); + transition: border-color 0.15s, background 0.15s; } .search::placeholder { color: var(--text-muted); } @@ -174,11 +186,12 @@ a:hover { color: var(--accent-hover); text-decoration: underline; } background: none; border: 1px solid var(--border); border-radius: 4px; - padding: 0.15rem 0.5rem; + padding: 0.35rem 0.65rem; font-family: inherit; font-size: var(--text-xs); color: var(--text-muted); cursor: pointer; + transition: border-color 0.15s, color 0.15s; } .filter-clear:hover { @@ -186,14 +199,11 @@ a:hover { color: var(--accent-hover); text-decoration: underline; } color: var(--text); } -.stats { - font-size: var(--text-sm); - color: var(--text-muted); - font-variant-numeric: tabular-nums; +.filter-clear:focus-visible { + outline: 2px solid var(--accent); + outline-offset: 2px; } -.stats strong { color: var(--text-secondary); } - /* === Table === */ .table-wrap { width: 100%; @@ -201,6 +211,11 @@ a:hover { color: var(--accent-hover); text-decoration: underline; } overflow-x: auto; } +.table-wrap:focus { + outline: 2px solid var(--accent); + outline-offset: -2px; +} + .table { width: 100%; border-collapse: separate; @@ -236,6 +251,7 @@ a:hover { color: var(--accent-hover); text-decoration: underline; } padding: 0.7rem 0.75rem; border-bottom: 1px solid var(--border); vertical-align: top; + transition: background 0.15s; } .table tbody tr.row:not(.open):hover td { @@ -253,9 +269,7 @@ a:hover { color: var(--accent-hover); text-decoration: underline; } .col-name { width: 35%; - overflow-wrap: break-word; - word-wrap: break-word; - word-break: break-word; + overflow-wrap: anywhere; } .col-name > a { @@ -266,12 +280,47 @@ a:hover { color: var(--accent-hover); text-decoration: underline; } .col-name > a:hover { text-decoration: underline; color: var(--accent-hover); } +/* === Sortable Headers === */ +th[data-sort] { + cursor: pointer; + user-select: none; +} + +th[data-sort]:hover { + color: var(--accent); +} + +th[data-sort]::after { + content: " ▼"; + opacity: 0; + transition: opacity 0.15s; +} + +th[data-sort="name"]::after { + content: " ▲"; +} + +th[data-sort]:hover::after { + opacity: 1; +} + +th[data-sort].sort-desc::after { + content: " ▼"; + opacity: 1; +} + +th[data-sort].sort-asc::after { + content: " ▲"; + opacity: 1; +} + /* === Stars Column === */ .col-stars { width: 5rem; font-variant-numeric: tabular-nums; white-space: nowrap; color: var(--text-secondary); + text-align: right; } /* === Arrow Column === */ @@ -294,6 +343,12 @@ a:hover { color: var(--accent-hover); text-decoration: underline; } /* === Row Click === */ .row { cursor: pointer; } +.row:focus-visible td { + outline: none; + background: var(--bg-hover); + box-shadow: inset 2px 0 0 var(--accent); +} + /* === Expand Row === */ .expand-row { display: none; @@ -315,10 +370,36 @@ a:hover { color: var(--accent-hover); text-decoration: underline; } border-bottom: 1px solid var(--border); } +@keyframes expand-in { + from { + opacity: 0; + transform: translateY(-4px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + .expand-content { font-size: var(--text-sm); color: var(--text-secondary); line-height: 1.6; + animation: expand-in 0.2s cubic-bezier(0.25, 1, 0.5, 1); +} + +.expand-tags { + display: flex; + gap: 0.4rem; + margin-bottom: 0.4rem; +} + +.expand-tag { + font-size: var(--text-xs); + color: var(--tag-text); + background: var(--bg); + padding: 0.15rem 0.4rem; + border-radius: 3px; } .expand-also-see { @@ -357,35 +438,63 @@ a:hover { color: var(--accent-hover); text-decoration: underline; } color: var(--border); } -.col-cat, .col-group { +.col-cat { width: 13%; white-space: nowrap; } +/* === Last Commit Column === */ +.col-commit { + width: 9rem; + white-space: nowrap; + color: var(--text-muted); +} + /* === Tags === */ .tag { + position: relative; background: var(--accent-light); border: none; font-family: inherit; font-size: var(--text-xs); - color: oklch(45% 0.06 240); + color: var(--tag-text); cursor: pointer; - padding: 0.15rem 0.35rem; + padding: 0.25rem 0.5rem; border-radius: 3px; white-space: nowrap; + transition: background 0.15s, color 0.15s; +} + +/* Expand touch target to 44x44px minimum */ +.tag::after { + content: ""; + position: absolute; + inset: -0.5rem -0.25rem; } .tag:hover { - background: var(--accent-light); + background: var(--tag-hover-bg); color: var(--accent); } +.tag:focus-visible { + outline: 2px solid var(--accent); + outline-offset: 1px; +} + .tag.active { background: var(--highlight); color: var(--highlight-text); font-weight: 600; } +/* === Noscript === */ +.noscript-msg { + text-align: center; + padding: 1rem; + color: var(--text-muted); +} + /* === No Results === */ .no-results { max-width: 1400px; @@ -407,20 +516,18 @@ a:hover { color: var(--accent-hover); text-decoration: underline; } background: var(--bg-input); display: flex; align-items: center; - justify-content: space-between; + justify-content: flex-end; + gap: 0.5rem; } -.footer a { color: var(--text-muted); text-decoration: none; } -.footer a:hover { color: var(--accent); } +.footer a { color: var(--accent); text-decoration: none; } +.footer a:hover { color: var(--accent-hover); text-decoration: underline; } -.footer-links { - display: flex; - gap: 1rem; -} +.footer-sep { color: var(--border-strong); } /* === Responsive === */ @media (max-width: 900px) { - .col-group { display: none; } + .col-commit { display: none; } } @media (max-width: 640px) { @@ -435,7 +542,7 @@ a:hover { color: var(--accent-hover); text-decoration: underline; } .col-cat { display: none; } .col-name { white-space: normal; } - .footer { padding: 1.25rem; flex-direction: column; gap: 0.5rem; } + .footer { padding: 1.25rem; justify-content: center; flex-wrap: wrap; } } /* === Screen Reader Only === */ @@ -454,6 +561,8 @@ a:hover { color: var(--accent-hover); text-decoration: underline; } /* === Reduced Motion === */ @media (prefers-reduced-motion: reduce) { *, *::before, *::after { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; } } diff --git a/website/templates/base.html b/website/templates/base.html index 4a3bc249..ea7c7e52 100644 --- a/website/templates/base.html +++ b/website/templates/base.html @@ -17,10 +17,7 @@ /> - + lib.\n') + entries = _parse_section_entries(nodes) + assert "\n") + html = _render_section_html(nodes) + assert "