{"adoption": {"forks": 26, "observed_at": "2026-09-03T02:15:11.404461+00:00", "stars": 1041}, "canonical_url": "https://ross.abutalabs.com/products/plain", "card": {"archived": false, "artifact_type": "framework", "description": "The Python web framework for building apps.", "domain": ["web-development", "backend", "developer-tools", "large-language-models"], "enriched": true, "function": ["web-framework", "orm", "templating", "routing", "auth", "middleware", "http-server", "api-framework", "mcp", "cli", "testing", "logging", "tracing", "caching", "email", "form-handling", "scheduling"], "health_score": 80, "homepage": "https://plainframework.com", "language": "Python", "license": null, "license_family": "other", "maturity": "active", "member_repos": ["dropseed/plain"], "name": "dropseed/plain", "platform": ["python", "cli", "cross-platform"], "pushed_at": "2026-09-03T01:53:42+00:00", "repo": "dropseed/plain", "stars": 1041, "tags": ["django-alternative", "flask-alternative", "postgres-only", "jinja2", "htmx", "tailwind", "full-stack", "agent-friendly", "typed-python", "background-jobs", "opentelemetry", "bsd-license", "ai-agents", "web-server"], "topics": ["framework", "python", "web"], "urls": [], "use_cases": ["build a full-stack python web app with postgres", "django alternative with modern typed apis", "build a rest api with class-based views in python", "expose my app to ai agents as an mcp server", "run background jobs with a database-backed queue", "add user authentication and sessions to a python app", "server-rendered app with jinja2, htmx and tailwind", "scaffold a python web app with an ai coding agent"], "what_it_is": "Plain is a Python web framework for building database-backed applications, originally forked from Django and redesigned around explicit, typed APIs. It ships a core HTTP/routing/views layer plus first-party packages for Postgres ORM, auth, sessions, background jobs, APIs, admin, and MCP server support, with built-in OpenTelemetry observability.", "when_to_avoid": ["you need databases other than Postgres (models are Postgres-only)", "you need a mature 1.0 framework — Plain is pre-1.0 and evolving", "you want an async-first or microframework approach like FastAPI or Flask", "you need a large third-party plugin ecosystem"], "when_to_choose": ["you want a batteries-included Python framework like Django but with explicit, typed, modern APIs", "your stack is Postgres-only and you value built-in observability (traces, slow-query detection)", "you want an app that is easy for AI coding agents to read and modify", "you want first-party auth, admin, jobs, email, and MCP packages that work together"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/plain", "repo": "dropseed/plain", "role": "main", "score": 75}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-09-03T02:15:11.404461+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T07:02:56.357975+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d4b758ee7ac5bc6e1eac30b8ff0467e023a757873fde67c61be0426645847402", "fetched_at": "2026-09-03T02:15:11.404461+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dropseed/plain"}, {"content_hash": "62483ee6e92fae87fc22d5e3c3d39fe2a3ea10793f99e70305fb07ddcc33877c", "fetched_at": "2026-08-29T13:04:33.062851+00:00", "kind": "homepage", "missing": false, "url": "https://plainframework.com"}, {"content_hash": "831d5943d302ddc67edecfed2084997b19f25a5a05ce5fb024c9ad2b25da8260", "fetched_at": "2026-08-29T13:04:33.067588+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain/plain"}, {"content_hash": "356d69e6618b9711f29c5436138d2f7b283ee2b22d489f90d25fde3a495b0f2a", "fetched_at": "2026-08-29T13:04:33.069881+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-postgres/plain/postgres"}, {"content_hash": "006e6a996bc5b7c89aab399128ee83a9e5849f26fb59ff6da20ed53b9914b84e", "fetched_at": "2026-08-29T13:04:33.065332+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs"}, {"content_hash": "fc55ad92aeed84dc925cf3196d87b92b7eed3d91dce8bda5e0b51ca768c8479e", "fetched_at": "2026-08-29T13:04:33.073607+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-auth/plain/auth"}, {"content_hash": "6657826c1a127ae8296f02637c1c7998cde126664b327935b754a43176e4a751", "fetched_at": "2026-08-29T13:04:33.075367+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-sessions/plain/sessions"}, {"content_hash": "2c2eb00230f68b13d2f514401631db3db64c079732bd63d6465fab5cda5e8974", "fetched_at": "2026-08-29T13:04:33.077052+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-api/plain/api"}, {"content_hash": "248250087d6e48000fe02f11108efc21a1912fbdadfe25f6ca081dd17b586dac", "fetched_at": "2026-08-29T13:04:33.079153+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-mcp/plain/mcp"}, {"content_hash": "441cd0871631ed3bbea0ffdac0da5ffe3e1ad3c787b023b59cd58654bc04f081", "fetched_at": "2026-08-29T13:04:33.082529+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-jobs/plain/jobs"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-09-03T02:15:11.404461+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T07:02:56.357975+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d4b758ee7ac5bc6e1eac30b8ff0467e023a757873fde67c61be0426645847402", "fetched_at": "2026-09-03T02:15:11.404461+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dropseed/plain"}, {"content_hash": "62483ee6e92fae87fc22d5e3c3d39fe2a3ea10793f99e70305fb07ddcc33877c", "fetched_at": "2026-08-29T13:04:33.062851+00:00", "kind": "homepage", "missing": false, "url": "https://plainframework.com"}, {"content_hash": "831d5943d302ddc67edecfed2084997b19f25a5a05ce5fb024c9ad2b25da8260", "fetched_at": "2026-08-29T13:04:33.067588+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain/plain"}, {"content_hash": "356d69e6618b9711f29c5436138d2f7b283ee2b22d489f90d25fde3a495b0f2a", "fetched_at": "2026-08-29T13:04:33.069881+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-postgres/plain/postgres"}, {"content_hash": "006e6a996bc5b7c89aab399128ee83a9e5849f26fb59ff6da20ed53b9914b84e", "fetched_at": "2026-08-29T13:04:33.065332+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs"}, {"content_hash": "fc55ad92aeed84dc925cf3196d87b92b7eed3d91dce8bda5e0b51ca768c8479e", "fetched_at": "2026-08-29T13:04:33.073607+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-auth/plain/auth"}, {"content_hash": "6657826c1a127ae8296f02637c1c7998cde126664b327935b754a43176e4a751", "fetched_at": "2026-08-29T13:04:33.075367+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-sessions/plain/sessions"}, {"content_hash": "2c2eb00230f68b13d2f514401631db3db64c079732bd63d6465fab5cda5e8974", "fetched_at": "2026-08-29T13:04:33.077052+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-api/plain/api"}, {"content_hash": "248250087d6e48000fe02f11108efc21a1912fbdadfe25f6ca081dd17b586dac", "fetched_at": "2026-08-29T13:04:33.079153+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-mcp/plain/mcp"}, {"content_hash": "441cd0871631ed3bbea0ffdac0da5ffe3e1ad3c787b023b59cd58654bc04f081", "fetched_at": "2026-08-29T13:04:33.082529+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-jobs/plain/jobs"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T07:02:56.357975+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d4b758ee7ac5bc6e1eac30b8ff0467e023a757873fde67c61be0426645847402", "fetched_at": "2026-09-03T02:15:11.404461+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dropseed/plain"}, {"content_hash": "62483ee6e92fae87fc22d5e3c3d39fe2a3ea10793f99e70305fb07ddcc33877c", "fetched_at": "2026-08-29T13:04:33.062851+00:00", "kind": "homepage", "missing": false, "url": "https://plainframework.com"}, {"content_hash": "831d5943d302ddc67edecfed2084997b19f25a5a05ce5fb024c9ad2b25da8260", "fetched_at": "2026-08-29T13:04:33.067588+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain/plain"}, {"content_hash": "356d69e6618b9711f29c5436138d2f7b283ee2b22d489f90d25fde3a495b0f2a", "fetched_at": "2026-08-29T13:04:33.069881+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-postgres/plain/postgres"}, {"content_hash": "006e6a996bc5b7c89aab399128ee83a9e5849f26fb59ff6da20ed53b9914b84e", "fetched_at": "2026-08-29T13:04:33.065332+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs"}, {"content_hash": "fc55ad92aeed84dc925cf3196d87b92b7eed3d91dce8bda5e0b51ca768c8479e", "fetched_at": "2026-08-29T13:04:33.073607+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-auth/plain/auth"}, {"content_hash": "6657826c1a127ae8296f02637c1c7998cde126664b327935b754a43176e4a751", "fetched_at": "2026-08-29T13:04:33.075367+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-sessions/plain/sessions"}, {"content_hash": "2c2eb00230f68b13d2f514401631db3db64c079732bd63d6465fab5cda5e8974", "fetched_at": "2026-08-29T13:04:33.077052+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-api/plain/api"}, {"content_hash": "248250087d6e48000fe02f11108efc21a1912fbdadfe25f6ca081dd17b586dac", "fetched_at": "2026-08-29T13:04:33.079153+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-mcp/plain/mcp"}, {"content_hash": "441cd0871631ed3bbea0ffdac0da5ffe3e1ad3c787b023b59cd58654bc04f081", "fetched_at": "2026-08-29T13:04:33.082529+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-jobs/plain/jobs"}], "taxonomy_version": 1}, "health_score": {"inputs": ["days_since_push", "days_since_release", "archived"], "kind": "computed", "method": "health_v1"}, "homepage": {"kind": "observed", "observed_at": "2026-09-03T02:15:11.404461+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-09-03T02:15:11.404461+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-09-03T02:15:11.404461+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T07:02:56.357975+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d4b758ee7ac5bc6e1eac30b8ff0467e023a757873fde67c61be0426645847402", "fetched_at": "2026-09-03T02:15:11.404461+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dropseed/plain"}, {"content_hash": "62483ee6e92fae87fc22d5e3c3d39fe2a3ea10793f99e70305fb07ddcc33877c", "fetched_at": "2026-08-29T13:04:33.062851+00:00", "kind": "homepage", "missing": false, "url": "https://plainframework.com"}, {"content_hash": "831d5943d302ddc67edecfed2084997b19f25a5a05ce5fb024c9ad2b25da8260", "fetched_at": "2026-08-29T13:04:33.067588+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain/plain"}, {"content_hash": "356d69e6618b9711f29c5436138d2f7b283ee2b22d489f90d25fde3a495b0f2a", "fetched_at": "2026-08-29T13:04:33.069881+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-postgres/plain/postgres"}, {"content_hash": "006e6a996bc5b7c89aab399128ee83a9e5849f26fb59ff6da20ed53b9914b84e", "fetched_at": "2026-08-29T13:04:33.065332+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs"}, {"content_hash": "fc55ad92aeed84dc925cf3196d87b92b7eed3d91dce8bda5e0b51ca768c8479e", "fetched_at": "2026-08-29T13:04:33.073607+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-auth/plain/auth"}, {"content_hash": "6657826c1a127ae8296f02637c1c7998cde126664b327935b754a43176e4a751", "fetched_at": "2026-08-29T13:04:33.075367+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-sessions/plain/sessions"}, {"content_hash": "2c2eb00230f68b13d2f514401631db3db64c079732bd63d6465fab5cda5e8974", "fetched_at": "2026-08-29T13:04:33.077052+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-api/plain/api"}, {"content_hash": "248250087d6e48000fe02f11108efc21a1912fbdadfe25f6ca081dd17b586dac", "fetched_at": "2026-08-29T13:04:33.079153+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-mcp/plain/mcp"}, {"content_hash": "441cd0871631ed3bbea0ffdac0da5ffe3e1ad3c787b023b59cd58654bc04f081", "fetched_at": "2026-08-29T13:04:33.082529+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-jobs/plain/jobs"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-09-03T02:15:11.404461+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-09-03T02:15:11.404461+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T07:02:56.357975+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d4b758ee7ac5bc6e1eac30b8ff0467e023a757873fde67c61be0426645847402", "fetched_at": "2026-09-03T02:15:11.404461+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dropseed/plain"}, {"content_hash": "62483ee6e92fae87fc22d5e3c3d39fe2a3ea10793f99e70305fb07ddcc33877c", "fetched_at": "2026-08-29T13:04:33.062851+00:00", "kind": "homepage", "missing": false, "url": "https://plainframework.com"}, {"content_hash": "831d5943d302ddc67edecfed2084997b19f25a5a05ce5fb024c9ad2b25da8260", "fetched_at": "2026-08-29T13:04:33.067588+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain/plain"}, {"content_hash": "356d69e6618b9711f29c5436138d2f7b283ee2b22d489f90d25fde3a495b0f2a", "fetched_at": "2026-08-29T13:04:33.069881+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-postgres/plain/postgres"}, {"content_hash": "006e6a996bc5b7c89aab399128ee83a9e5849f26fb59ff6da20ed53b9914b84e", "fetched_at": "2026-08-29T13:04:33.065332+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs"}, {"content_hash": "fc55ad92aeed84dc925cf3196d87b92b7eed3d91dce8bda5e0b51ca768c8479e", "fetched_at": "2026-08-29T13:04:33.073607+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-auth/plain/auth"}, {"content_hash": "6657826c1a127ae8296f02637c1c7998cde126664b327935b754a43176e4a751", "fetched_at": "2026-08-29T13:04:33.075367+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-sessions/plain/sessions"}, {"content_hash": "2c2eb00230f68b13d2f514401631db3db64c079732bd63d6465fab5cda5e8974", "fetched_at": "2026-08-29T13:04:33.077052+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-api/plain/api"}, {"content_hash": "248250087d6e48000fe02f11108efc21a1912fbdadfe25f6ca081dd17b586dac", "fetched_at": "2026-08-29T13:04:33.079153+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-mcp/plain/mcp"}, {"content_hash": "441cd0871631ed3bbea0ffdac0da5ffe3e1ad3c787b023b59cd58654bc04f081", "fetched_at": "2026-08-29T13:04:33.082529+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-jobs/plain/jobs"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-09-03T02:15:11.404461+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-09-03T02:15:11.404461+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-09-03T02:15:11.404461+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T07:02:56.357975+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d4b758ee7ac5bc6e1eac30b8ff0467e023a757873fde67c61be0426645847402", "fetched_at": "2026-09-03T02:15:11.404461+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dropseed/plain"}, {"content_hash": "62483ee6e92fae87fc22d5e3c3d39fe2a3ea10793f99e70305fb07ddcc33877c", "fetched_at": "2026-08-29T13:04:33.062851+00:00", "kind": "homepage", "missing": false, "url": "https://plainframework.com"}, {"content_hash": "831d5943d302ddc67edecfed2084997b19f25a5a05ce5fb024c9ad2b25da8260", "fetched_at": "2026-08-29T13:04:33.067588+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain/plain"}, {"content_hash": "356d69e6618b9711f29c5436138d2f7b283ee2b22d489f90d25fde3a495b0f2a", "fetched_at": "2026-08-29T13:04:33.069881+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-postgres/plain/postgres"}, {"content_hash": "006e6a996bc5b7c89aab399128ee83a9e5849f26fb59ff6da20ed53b9914b84e", "fetched_at": "2026-08-29T13:04:33.065332+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs"}, {"content_hash": "fc55ad92aeed84dc925cf3196d87b92b7eed3d91dce8bda5e0b51ca768c8479e", "fetched_at": "2026-08-29T13:04:33.073607+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-auth/plain/auth"}, {"content_hash": "6657826c1a127ae8296f02637c1c7998cde126664b327935b754a43176e4a751", "fetched_at": "2026-08-29T13:04:33.075367+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-sessions/plain/sessions"}, {"content_hash": "2c2eb00230f68b13d2f514401631db3db64c079732bd63d6465fab5cda5e8974", "fetched_at": "2026-08-29T13:04:33.077052+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-api/plain/api"}, {"content_hash": "248250087d6e48000fe02f11108efc21a1912fbdadfe25f6ca081dd17b586dac", "fetched_at": "2026-08-29T13:04:33.079153+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-mcp/plain/mcp"}, {"content_hash": "441cd0871631ed3bbea0ffdac0da5ffe3e1ad3c787b023b59cd58654bc04f081", "fetched_at": "2026-08-29T13:04:33.082529+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-jobs/plain/jobs"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-09-03T02:15:11.404461+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-09-03T02:15:11.404461+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T07:02:56.357975+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d4b758ee7ac5bc6e1eac30b8ff0467e023a757873fde67c61be0426645847402", "fetched_at": "2026-09-03T02:15:11.404461+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dropseed/plain"}, {"content_hash": "62483ee6e92fae87fc22d5e3c3d39fe2a3ea10793f99e70305fb07ddcc33877c", "fetched_at": "2026-08-29T13:04:33.062851+00:00", "kind": "homepage", "missing": false, "url": "https://plainframework.com"}, {"content_hash": "831d5943d302ddc67edecfed2084997b19f25a5a05ce5fb024c9ad2b25da8260", "fetched_at": "2026-08-29T13:04:33.067588+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain/plain"}, {"content_hash": "356d69e6618b9711f29c5436138d2f7b283ee2b22d489f90d25fde3a495b0f2a", "fetched_at": "2026-08-29T13:04:33.069881+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-postgres/plain/postgres"}, {"content_hash": "006e6a996bc5b7c89aab399128ee83a9e5849f26fb59ff6da20ed53b9914b84e", "fetched_at": "2026-08-29T13:04:33.065332+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs"}, {"content_hash": "fc55ad92aeed84dc925cf3196d87b92b7eed3d91dce8bda5e0b51ca768c8479e", "fetched_at": "2026-08-29T13:04:33.073607+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-auth/plain/auth"}, {"content_hash": "6657826c1a127ae8296f02637c1c7998cde126664b327935b754a43176e4a751", "fetched_at": "2026-08-29T13:04:33.075367+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-sessions/plain/sessions"}, {"content_hash": "2c2eb00230f68b13d2f514401631db3db64c079732bd63d6465fab5cda5e8974", "fetched_at": "2026-08-29T13:04:33.077052+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-api/plain/api"}, {"content_hash": "248250087d6e48000fe02f11108efc21a1912fbdadfe25f6ca081dd17b586dac", "fetched_at": "2026-08-29T13:04:33.079153+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-mcp/plain/mcp"}, {"content_hash": "441cd0871631ed3bbea0ffdac0da5ffe3e1ad3c787b023b59cd58654bc04f081", "fetched_at": "2026-08-29T13:04:33.082529+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-jobs/plain/jobs"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T07:02:56.357975+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d4b758ee7ac5bc6e1eac30b8ff0467e023a757873fde67c61be0426645847402", "fetched_at": "2026-09-03T02:15:11.404461+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dropseed/plain"}, {"content_hash": "62483ee6e92fae87fc22d5e3c3d39fe2a3ea10793f99e70305fb07ddcc33877c", "fetched_at": "2026-08-29T13:04:33.062851+00:00", "kind": "homepage", "missing": false, "url": "https://plainframework.com"}, {"content_hash": "831d5943d302ddc67edecfed2084997b19f25a5a05ce5fb024c9ad2b25da8260", "fetched_at": "2026-08-29T13:04:33.067588+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain/plain"}, {"content_hash": "356d69e6618b9711f29c5436138d2f7b283ee2b22d489f90d25fde3a495b0f2a", "fetched_at": "2026-08-29T13:04:33.069881+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-postgres/plain/postgres"}, {"content_hash": "006e6a996bc5b7c89aab399128ee83a9e5849f26fb59ff6da20ed53b9914b84e", "fetched_at": "2026-08-29T13:04:33.065332+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs"}, {"content_hash": "fc55ad92aeed84dc925cf3196d87b92b7eed3d91dce8bda5e0b51ca768c8479e", "fetched_at": "2026-08-29T13:04:33.073607+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-auth/plain/auth"}, {"content_hash": "6657826c1a127ae8296f02637c1c7998cde126664b327935b754a43176e4a751", "fetched_at": "2026-08-29T13:04:33.075367+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-sessions/plain/sessions"}, {"content_hash": "2c2eb00230f68b13d2f514401631db3db64c079732bd63d6465fab5cda5e8974", "fetched_at": "2026-08-29T13:04:33.077052+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-api/plain/api"}, {"content_hash": "248250087d6e48000fe02f11108efc21a1912fbdadfe25f6ca081dd17b586dac", "fetched_at": "2026-08-29T13:04:33.079153+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-mcp/plain/mcp"}, {"content_hash": "441cd0871631ed3bbea0ffdac0da5ffe3e1ad3c787b023b59cd58654bc04f081", "fetched_at": "2026-08-29T13:04:33.082529+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-jobs/plain/jobs"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T07:02:56.357975+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d4b758ee7ac5bc6e1eac30b8ff0467e023a757873fde67c61be0426645847402", "fetched_at": "2026-09-03T02:15:11.404461+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dropseed/plain"}, {"content_hash": "62483ee6e92fae87fc22d5e3c3d39fe2a3ea10793f99e70305fb07ddcc33877c", "fetched_at": "2026-08-29T13:04:33.062851+00:00", "kind": "homepage", "missing": false, "url": "https://plainframework.com"}, {"content_hash": "831d5943d302ddc67edecfed2084997b19f25a5a05ce5fb024c9ad2b25da8260", "fetched_at": "2026-08-29T13:04:33.067588+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain/plain"}, {"content_hash": "356d69e6618b9711f29c5436138d2f7b283ee2b22d489f90d25fde3a495b0f2a", "fetched_at": "2026-08-29T13:04:33.069881+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-postgres/plain/postgres"}, {"content_hash": "006e6a996bc5b7c89aab399128ee83a9e5849f26fb59ff6da20ed53b9914b84e", "fetched_at": "2026-08-29T13:04:33.065332+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs"}, {"content_hash": "fc55ad92aeed84dc925cf3196d87b92b7eed3d91dce8bda5e0b51ca768c8479e", "fetched_at": "2026-08-29T13:04:33.073607+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-auth/plain/auth"}, {"content_hash": "6657826c1a127ae8296f02637c1c7998cde126664b327935b754a43176e4a751", "fetched_at": "2026-08-29T13:04:33.075367+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-sessions/plain/sessions"}, {"content_hash": "2c2eb00230f68b13d2f514401631db3db64c079732bd63d6465fab5cda5e8974", "fetched_at": "2026-08-29T13:04:33.077052+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-api/plain/api"}, {"content_hash": "248250087d6e48000fe02f11108efc21a1912fbdadfe25f6ca081dd17b586dac", "fetched_at": "2026-08-29T13:04:33.079153+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-mcp/plain/mcp"}, {"content_hash": "441cd0871631ed3bbea0ffdac0da5ffe3e1ad3c787b023b59cd58654bc04f081", "fetched_at": "2026-08-29T13:04:33.082529+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-jobs/plain/jobs"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T07:02:56.357975+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d4b758ee7ac5bc6e1eac30b8ff0467e023a757873fde67c61be0426645847402", "fetched_at": "2026-09-03T02:15:11.404461+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dropseed/plain"}, {"content_hash": "62483ee6e92fae87fc22d5e3c3d39fe2a3ea10793f99e70305fb07ddcc33877c", "fetched_at": "2026-08-29T13:04:33.062851+00:00", "kind": "homepage", "missing": false, "url": "https://plainframework.com"}, {"content_hash": "831d5943d302ddc67edecfed2084997b19f25a5a05ce5fb024c9ad2b25da8260", "fetched_at": "2026-08-29T13:04:33.067588+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain/plain"}, {"content_hash": "356d69e6618b9711f29c5436138d2f7b283ee2b22d489f90d25fde3a495b0f2a", "fetched_at": "2026-08-29T13:04:33.069881+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-postgres/plain/postgres"}, {"content_hash": "006e6a996bc5b7c89aab399128ee83a9e5849f26fb59ff6da20ed53b9914b84e", "fetched_at": "2026-08-29T13:04:33.065332+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs"}, {"content_hash": "fc55ad92aeed84dc925cf3196d87b92b7eed3d91dce8bda5e0b51ca768c8479e", "fetched_at": "2026-08-29T13:04:33.073607+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-auth/plain/auth"}, {"content_hash": "6657826c1a127ae8296f02637c1c7998cde126664b327935b754a43176e4a751", "fetched_at": "2026-08-29T13:04:33.075367+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-sessions/plain/sessions"}, {"content_hash": "2c2eb00230f68b13d2f514401631db3db64c079732bd63d6465fab5cda5e8974", "fetched_at": "2026-08-29T13:04:33.077052+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-api/plain/api"}, {"content_hash": "248250087d6e48000fe02f11108efc21a1912fbdadfe25f6ca081dd17b586dac", "fetched_at": "2026-08-29T13:04:33.079153+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-mcp/plain/mcp"}, {"content_hash": "441cd0871631ed3bbea0ffdac0da5ffe3e1ad3c787b023b59cd58654bc04f081", "fetched_at": "2026-08-29T13:04:33.082529+00:00", "kind": "site_page", "missing": false, "url": "https://plainframework.com/docs/plain-jobs/plain/jobs"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 100, "longevity": 90, "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": 1260, "days_push": 0, "days_rel": null, "gap_med": null, "n_releases_24m": 0}, "score": 75, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 3, "stale_scrape": false}}