{"adoption": {"forks": 1935, "observed_at": "2026-08-28T04:11:38.200116+00:00", "stars": 25510}, "canonical_url": "https://ross.abutalabs.com/products/12-factor-agents", "card": {"archived": false, "artifact_type": "learning-resource", "description": "What are the principles we can use to build LLM-powered software that is actually good enough to put in the hands of production customers?", "domain": ["large-language-models", "developer-tools", "tutorials"], "enriched": true, "function": ["agent-framework", "prompt-engineering", "rag", "llm-inference"], "health_score": 46, "homepage": null, "language": "TypeScript", "license": "NOASSERTION", "license_family": "other", "maturity": "active", "member_repos": ["humanlayer/12-factor-agents"], "name": "humanlayer/12-factor-agents", "platform": ["cross-platform"], "pushed_at": "2025-09-21T14:37:40+00:00", "repo": "humanlayer/12-factor-agents", "stars": 25510, "tags": ["12-factor", "context-engineering", "llm-applications", "production-ai", "agent-design-principles", "methodology", "ai-agents", "nodejs", "typescript"], "topics": ["agents", "ai", "context-window", "framework", "llms", "memory", "orchestration", "prompt-engineering", "rag", "12-factor", "12-factor-agents"], "urls": [], "use_cases": ["learn how to build production-ready LLM agents", "principles for designing reliable AI agent software", "understand context window management for LLM apps", "decide whether to use an agent framework or roll my own stack", "best practices for putting LLM features in front of customers", "context engineering techniques for agents"], "what_it_is": "A guide of twelve principles for building reliable, production-grade LLM-powered agent applications, inspired by 12 Factor Apps. It includes explanatory content, examples, and a scaffolding tool (create-12-factor-agent) written in TypeScript.", "when_to_avoid": ["you need a ready-made runtime framework or SDK rather than guidance", "you want a turnkey agent product with no implementation work", "you need guaranteed long-term maintenance, as it is primarily an evolving methodology document"], "when_to_choose": ["you are designing or reviewing an LLM-powered product architecture", "you want framework-agnostic principles rather than a specific library", "you are evaluating agent frameworks and want to know why teams roll their own"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/12-factor-agents", "repo": "humanlayer/12-factor-agents", "role": "main", "score": 39}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:11:38.200116+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-29T16:56:02.745688+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "fb598d6dcf2ac39d433a6631f6b1dd7f15a1e177d5831ace4fbc73615f5b35cb", "fetched_at": "2026-08-28T04:11:38.200116+00:00", "kind": "readme", "missing": false, "url": "https://github.com/humanlayer/12-factor-agents"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:11:38.200116+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-29T16:56:02.745688+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "fb598d6dcf2ac39d433a6631f6b1dd7f15a1e177d5831ace4fbc73615f5b35cb", "fetched_at": "2026-08-28T04:11:38.200116+00:00", "kind": "readme", "missing": false, "url": "https://github.com/humanlayer/12-factor-agents"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-29T16:56:02.745688+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "fb598d6dcf2ac39d433a6631f6b1dd7f15a1e177d5831ace4fbc73615f5b35cb", "fetched_at": "2026-08-28T04:11:38.200116+00:00", "kind": "readme", "missing": false, "url": "https://github.com/humanlayer/12-factor-agents"}], "taxonomy_version": 1}, "health_score": {"inputs": ["days_since_push", "days_since_release", "archived"], "kind": "computed", "method": "health_v1"}, "homepage": {"kind": "observed", "observed_at": "2026-08-28T04:11:38.200116+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:11:38.200116+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:11:38.200116+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-29T16:56:02.745688+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "fb598d6dcf2ac39d433a6631f6b1dd7f15a1e177d5831ace4fbc73615f5b35cb", "fetched_at": "2026-08-28T04:11:38.200116+00:00", "kind": "readme", "missing": false, "url": "https://github.com/humanlayer/12-factor-agents"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:11:38.200116+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:11:38.200116+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-29T16:56:02.745688+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "fb598d6dcf2ac39d433a6631f6b1dd7f15a1e177d5831ace4fbc73615f5b35cb", "fetched_at": "2026-08-28T04:11:38.200116+00:00", "kind": "readme", "missing": false, "url": "https://github.com/humanlayer/12-factor-agents"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:11:38.200116+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:11:38.200116+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:11:38.200116+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-29T16:56:02.745688+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "fb598d6dcf2ac39d433a6631f6b1dd7f15a1e177d5831ace4fbc73615f5b35cb", "fetched_at": "2026-08-28T04:11:38.200116+00:00", "kind": "readme", "missing": false, "url": "https://github.com/humanlayer/12-factor-agents"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:11:38.200116+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:11:38.200116+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-29T16:56:02.745688+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "fb598d6dcf2ac39d433a6631f6b1dd7f15a1e177d5831ace4fbc73615f5b35cb", "fetched_at": "2026-08-28T04:11:38.200116+00:00", "kind": "readme", "missing": false, "url": "https://github.com/humanlayer/12-factor-agents"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-29T16:56:02.745688+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "fb598d6dcf2ac39d433a6631f6b1dd7f15a1e177d5831ace4fbc73615f5b35cb", "fetched_at": "2026-08-28T04:11:38.200116+00:00", "kind": "readme", "missing": false, "url": "https://github.com/humanlayer/12-factor-agents"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-29T16:56:02.745688+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "fb598d6dcf2ac39d433a6631f6b1dd7f15a1e177d5831ace4fbc73615f5b35cb", "fetched_at": "2026-08-28T04:11:38.200116+00:00", "kind": "readme", "missing": false, "url": "https://github.com/humanlayer/12-factor-agents"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-29T16:56:02.745688+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "fb598d6dcf2ac39d433a6631f6b1dd7f15a1e177d5831ace4fbc73615f5b35cb", "fetched_at": "2026-08-28T04:11:38.200116+00:00", "kind": "readme", "missing": false, "url": "https://github.com/humanlayer/12-factor-agents"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 43, "longevity": 37, "rhythm": 35}, "computed_at": "2026-09-03T02:20:16.233290+00:00", "flags": ["no_releases", "no_license"], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 521, "days_push": 346, "days_rel": null, "gap_med": null, "n_releases_24m": 0}, "score": 39, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}