Tag every tool and add a Yahoo-style category directory#284
Open
obra wants to merge 8 commits into
Open
Conversation
- tags_lib.py: shared parse/render helpers for .docs.md tag comments - tags.json: seed topic + feature vocabulary, injected into the LLM prompt - write_docs.py: LLM call now emits topics/features, merges new tags - gather_links.py: surfaces topics/features into tools.json - unit tests for both parsers
Classified every tool's docs.md with topic tags (what it does) and feature tags (browser capabilities used), drawn from the tags.json vocabulary. Added web-serial to the vocabulary.
directory.py groups every tool by topic and by browser feature into a classic directory layout; build_index.py injects it below the recent section with retro styling and anchor-linked feature chips.
- Split the 104-tool developer-tools catch-all: new code-sandboxes (10) and apis-services (16) topics, and drop the redundant developer-tools tag from tools that already have a specific home (104 -> 14 residual). - Restructure tags.json into top-level categories -> subcategories. - directory.py now renders the two-level Yahoo-style hierarchy with a category nav and per-category banners.
Add a compact two-column category index (bold category names with inline subcategory links and tool counts), with the full per-category tool listings beneath it.
- Homepage now shows only the Yahoo-style 'Browse by category' index; each subcategory links to its own standalone page. - New build_categories.py generates a 'All tools by category' page (full hierarchy + browse-by-feature) and one page per subcategory (breadcrumb + tools with descriptions). - Extract shared chrome/directory CSS into page_template.py, used by both the homepage and the category pages (de-dups the styles). - Wire build_categories.py into build.sh; gitignore the generated pages.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Tag every tool, then browse them like it's 1998
This adds a tag vocabulary to the doc-generation pipeline and builds a classic Yahoo-style category directory on top of it.
What's in here
1. Tags for every tool — two namespaces, stored in each committed
*.docs.mdas comments that don't disturb the existing description extraction:All 215 tools are backfilled.
tags.jsonis a shared, evolving vocabulary that's injected into the classification prompt so tags converge instead of sprawling.2. The doc-generation pipeline self-tags new tools —
write_docs.py's existing Haiku call now also emitstopics/features(with the vocabulary injected), and re-tags any tool still missing tags.gather_links.pysurfaces tags intotools.json. The Pages workflow commitstags.jsonalongside the generated docs so coined tags persist. No new tool needs manual tagging.3. A two-level category hierarchy —
tags.jsongroups the 19 subcategory topics under 5 top-level categories:The original LLM pass dumped 104/215 tools into a
developer-toolscatch-all, so it was carved: two new subcategories (Code Sandboxes & REPLs, Web APIs & Services) were pulled out and the redundantdeveloper-toolstag dropped from tools that already had a specific home — 104 → 14 residual, nothing else bloated.4. The directory (all generated from the tags, regenerated every build):
[count]superscripts and their subcategories as inline links./category-<slug>) — standalone drill-down pages listing each subcategory's tools with descriptions./categories) — the full hierarchy plus a "Browse by browser feature" section.Shared chrome/CSS lives in a new
page_template.pyused by both the homepage and the category pages.Screenshots
Homepage — Browse by category

/categories— All tools by category/category-developer-tools— a subcategory pageBrowse by browser feature

Notes / caveats
ANTHROPIC_API_KEY/llm-anthropicin the build env here), so the 215-tool backfill was done by a separate model pass reading each tool's HTML; the pipeline changes were verified by unit tests and a dry run, but the HaikuTAGS:emission only runs in CI. It's self-healing: a tool that ever lands without tags gets re-tagged on the next build.# Documentationsummary (e.g. API Explorer, Icon Editor) — pre-existing*.docs.mddata, not touched here; they'll self-correct when those docs regenerate.test_tags_lib.py,test_write_docs.py,test_directory.py(22 tests).The generated pages (
categories.html,category-*.html) are gitignored likeindex.html/colophon.html.Provenance
Built with Claude Code 2.1.165 (harness) driving Claude Opus 4.8 (
claude-opus-4-8[1m]), session9b1d21ea-3d17-4022-8604-120ddc65d9e2, working with Jesse Vincent (@obra).The full sequence of human prompts that produced this PR (verbatim)
(answering scoping questions)
(answering the carve question)