[{"data":1,"prerenderedAt":376},["ShallowReactive",2],{"NoscriptNav_XrRK2e2e8meJ0jKVGkb5ULGQDVi3UiFQ9nupAr7Yns":3,"\u002Ftools\u002Foss-taxonomy":8},["Island",4],{"key":5,"result":6},"NoscriptNav_XrRK2e2e8meJ0jKVGkb5ULGQDVi3UiFQ9nupAr7Yns",{"head":7},{},{"id":9,"title":10,"authors":11,"body":13,"canonicalUrl":362,"canonicalWebsiteName":363,"category":364,"date":365,"description":366,"extension":367,"featured":368,"fullWidthLayout":368,"image":369,"imageAlt":369,"location":369,"meta":370,"metaImage":369,"navigation":371,"path":372,"seo":373,"stem":374,"venue":369,"venueUrl":369,"__hash__":375},"tools\u002Ftools\u002Foss-taxonomy.md","A Taxonomy for Open Source Software",[12],"andrew",{"type":14,"value":15,"toc":359},"minimark",[16,34,49,62,65,106,109,112,224,231,296,303,308,311,317,323,329,335,338,347,355],[17,18,19,20,27,28,33],"p",{},"There are millions of open source projects across dozens of package registries, but no standard way to classify them. Existing metadata doesn't help: topic and keyword data is inconsistent, unstructured, or missing entirely, even from popular projects. I found some taxonomies for research software (",[21,22,26],"a",{"href":23,"rel":24},"https:\u002F\u002Facademic.oup.com\u002Fbioinformatics\u002Farticle\u002F40\u002F8\u002Fbtae464\u002F7717992",[25],"nofollow","FAIRsoft",", the ",[21,29,32],{"href":30,"rel":31},"https:\u002F\u002Fgithub.com\u002Frseng\u002Frseng",[25],"RSE taxonomy","), but nothing for open source software more broadly.",[17,35,36,37,42,43,48],{},"I've been interested in improving discovery in open source for a long time, ever since I first launched ",[21,38,41],{"href":39,"rel":40},"https:\u002F\u002F24pullrequests.com",[25],"24 Pull Requests"," and saw how hard it was for people to find projects to contribute to. So I've been working on ",[21,44,47],{"href":45,"rel":46},"https:\u002F\u002Fgithub.com\u002Fecosyste-ms\u002Foss-taxonomy",[25],"OSS Taxonomy",", a structured classification system. Instead of forcing projects into a single category, it uses multiple facets to describe different dimensions.",[50,51,54,55],"div",{"className":52},[53],"page-items","\n    ",[21,56,61],{"className":57,"href":45,"target":60},[58,59],"button","button--arrow","_blank","\n        Go to repository\n    ",[17,63,64],{},"A web framework like Django might be classified as:",[66,67,68,76,82,88,94,100],"ul",{},[69,70,71,75],"li",{},[72,73,74],"strong",{},"Domain",": web-development, api-development",[69,77,78,81],{},[72,79,80],{},"Role",": framework, library",[69,83,84,87],{},[72,85,86],{},"Technology",": python, docker",[69,89,90,93],{},[72,91,92],{},"Audience",": developer, enterprise",[69,95,96,99],{},[72,97,98],{},"Layer",": backend, full-stack",[69,101,102,105],{},[72,103,104],{},"Function",": authentication, database-management, routing",[17,107,108],{},"Six facets, each capturing something different, and a project can have multiple terms per facet.",[17,110,111],{},"The taxonomy is defined as YAML files in a GitHub repo, which keeps it inspectable and easy to extend. Each term has a name, description, examples, related terms, and aliases. New terms are added via pull request. A combined JSON file is generated automatically for easy use in applications.",[113,114,119],"pre",{"className":115,"code":116,"language":117,"meta":118,"style":118},"language-yaml shiki shiki-themes github-light github-dark","name: web-development\ndescription: Software for building websites, web apps, and APIs.\nexamples:\n  - react\n  - nextjs\n  - rails\nrelated:\n  - frontend\n  - backend\naliases:\n  - webdev\n","yaml","",[120,121,122,139,150,159,168,176,184,192,200,208,216],"code",{"__ignoreMap":118},[123,124,127,131,135],"span",{"class":125,"line":126},"line",1,[123,128,130],{"class":129},"s9eBZ","name",[123,132,134],{"class":133},"sVt8B",": ",[123,136,138],{"class":137},"sZZnC","web-development\n",[123,140,142,145,147],{"class":125,"line":141},2,[123,143,144],{"class":129},"description",[123,146,134],{"class":133},[123,148,149],{"class":137},"Software for building websites, web apps, and APIs.\n",[123,151,153,156],{"class":125,"line":152},3,[123,154,155],{"class":129},"examples",[123,157,158],{"class":133},":\n",[123,160,162,165],{"class":125,"line":161},4,[123,163,164],{"class":133},"  - ",[123,166,167],{"class":137},"react\n",[123,169,171,173],{"class":125,"line":170},5,[123,172,164],{"class":133},[123,174,175],{"class":137},"nextjs\n",[123,177,179,181],{"class":125,"line":178},6,[123,180,164],{"class":133},[123,182,183],{"class":137},"rails\n",[123,185,187,190],{"class":125,"line":186},7,[123,188,189],{"class":129},"related",[123,191,158],{"class":133},[123,193,195,197],{"class":125,"line":194},8,[123,196,164],{"class":133},[123,198,199],{"class":137},"frontend\n",[123,201,203,205],{"class":125,"line":202},9,[123,204,164],{"class":133},[123,206,207],{"class":137},"backend\n",[123,209,211,214],{"class":125,"line":210},10,[123,212,213],{"class":129},"aliases",[123,215,158],{"class":133},[123,217,219,221],{"class":125,"line":218},11,[123,220,164],{"class":133},[123,222,223],{"class":137},"webdev\n",[17,225,226,227,230],{},"The taxonomy also integrates with CodeMeta, a metadata standard for software that extends schema.org. CodeMeta has a ",[120,228,229],{},"keywords"," field, and you can use namespaced keywords to preserve the faceted structure:",[113,232,236],{"className":233,"code":234,"language":235,"meta":118,"style":118},"language-json shiki shiki-themes github-light github-dark","{\n  \"keywords\": [\n    \"domain:web-development\",\n    \"role:framework\",\n    \"technology:python\",\n    \"audience:developer\",\n    \"layer:backend\"\n  ]\n}\n","json",[120,237,238,243,252,260,267,274,281,286,291],{"__ignoreMap":118},[123,239,240],{"class":125,"line":126},[123,241,242],{"class":133},"{\n",[123,244,245,249],{"class":125,"line":141},[123,246,248],{"class":247},"sj4cs","  \"keywords\"",[123,250,251],{"class":133},": [\n",[123,253,254,257],{"class":125,"line":152},[123,255,256],{"class":137},"    \"domain:web-development\"",[123,258,259],{"class":133},",\n",[123,261,262,265],{"class":125,"line":161},[123,263,264],{"class":137},"    \"role:framework\"",[123,266,259],{"class":133},[123,268,269,272],{"class":125,"line":170},[123,270,271],{"class":137},"    \"technology:python\"",[123,273,259],{"class":133},[123,275,276,279],{"class":125,"line":178},[123,277,278],{"class":137},"    \"audience:developer\"",[123,280,259],{"class":133},[123,282,283],{"class":125,"line":186},[123,284,285],{"class":137},"    \"layer:backend\"\n",[123,287,288],{"class":125,"line":194},[123,289,290],{"class":133},"  ]\n",[123,292,293],{"class":125,"line":202},[123,294,295],{"class":133},"}\n",[17,297,298,299,302],{},"This works with existing CodeMeta without any schema changes. It's easy to parse (split on ",[120,300,301],{},":","), backward compatible as plain text, and keeps the structure intact.",[304,305,307],"h2",{"id":306},"use-cases","Use cases",[17,309,310],{},"A shared vocabulary enables a few useful things:",[17,312,313,316],{},[72,314,315],{},"Discovery and search."," Filter by what software does (function), who it's for (audience), or where it fits in a stack (layer). A developer looking for authentication libraries for the backend can narrow down to exactly that.",[17,318,319,322],{},[72,320,321],{},"Finding alternatives."," If two projects share the same domain, role, and function classifications, they're probably alternatives. You can build recommendation systems on top of this. And because it's multi-faceted, you can vary one dimension while keeping the others fixed: \"find me the Sidekiq of this ecosystem\" or \"like this, but for researchers.\"",[17,324,325,328],{},[72,326,327],{},"Ecosystem analysis."," With consistent classification across registries, you can identify gaps. Which domains are well-served by Python but underserved in Go? Where does a language lack tooling entirely?",[17,330,331,334],{},[72,332,333],{},"Funding decisions."," Funders can use the taxonomy to identify underinvested areas. If a function like \"authentication\" is widely depended on but has few maintained options, that matters.",[17,336,337],{},"All of these get stronger if more people use and contribute to the taxonomy. The network effect matters: a shared vocabulary is only useful if it's actually shared.",[17,339,340,341,346],{},"How do projects get classified? I'm still thinking about how to integrate this into ",[21,342,345],{"href":343,"rel":344},"https:\u002F\u002Fecosyste.ms",[25],"ecosyste.ms",". Topic and keyword data is the easiest source, but READMEs are probably the richest. There are also interesting technology connections to be made from a project's dependencies. Maintainers could add namespaced keywords to their codemeta.json files for manual correction, and both approaches feed back into improving the taxonomy.",[17,348,349,350,354],{},"The taxonomy is CC0 licensed and I'm looking for people to get involved. Try classifying a project you maintain, suggest new terms, or help refine existing ones: ",[21,351,353],{"href":45,"rel":352},[25],"github.com\u002Fecosyste-ms\u002Foss-taxonomy",".",[356,357,358],"style",{},"html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":118,"searchDepth":141,"depth":141,"links":360},[361],{"id":306,"depth":141,"text":307},"https:\u002F\u002Fnesbitt.io\u002F2025\u002F11\u002F29\u002Foss-taxonomy.html","nesbitt.io","philosophy","2025-11-29","I'm working on a structured taxonomy for classifying open source projects across multiple dimensions: domain, role, technology, audience, layer, and function.","md",false,null,{},true,"\u002Ftools\u002Foss-taxonomy",{"title":10,"description":366},"tools\u002Foss-taxonomy","vZc0wOTY-NWvuM89rmMAhhU_PeDofekDIiL7-PrrTS4",1780596103464]