{"adoption": {"forks": 334, "observed_at": "2026-08-28T04:06:39.685381+00:00", "stars": 2344}, "canonical_url": "https://ross.abutalabs.com/products/portaljs", "card": {"archived": false, "artifact_type": "framework", "description": "🌀 AI-native framework for building data portals. Scaffold a full portal from a brief and load datasets in minutes with agentic skills — any backend (CKAN, GitHub, Frictionless).", "domain": ["web-development", "frontend", "developer-tools", "self-hosted"], "enriched": true, "function": ["web-framework", "static-site-generator", "data-visualization", "search-engine", "agent-framework", "mcp", "charts", "geospatial"], "health_score": 99, "homepage": "https://www.portaljs.com", "language": "TypeScript", "license": "MIT", "license_family": "permissive", "maturity": "active", "member_repos": ["datopian/portaljs"], "name": "datopian/portaljs", "platform": ["cli", "self-hosted", "cloud"], "pushed_at": "2026-08-25T07:16:45+00:00", "repo": "datopian/portaljs", "stars": 2344, "tags": ["data-portal", "nextjs", "ckan", "open-data", "claude-code-skills", "agentic-scaffolding", "datasets", "tailwind", "static-export", "data-catalog", "data-engineering", "nodejs", "web-server"], "topics": ["data-portal", "ckan", "nextjs", "open-data-portal", "data-mesh", "datahub", "open-data", "openmetadata", "dataverse", "dkan", "opendatasoft", "socrata", "ai", "ai-agents", "agent-skills", "claude-code", "mcp", "skills"], "urls": [], "use_cases": ["build an open data portal for a city council", "publish a dataset catalog with search and dataset pages", "connect a frontend to an existing CKAN backend", "render CSV/JSON datasets with tables, charts, and maps", "scaffold a data portal from a plain-language description using an AI agent", "deploy a static data portal to Cloudflare or any static host", "migrate an existing data portal to a modern Next.js stack"], "what_it_is": "PortalJS is an open-source, AI-native framework for building data portals on plain Next.js + Tailwind, with Claude Code agentic skills that scaffold the portal, load datasets, and connect backends like CKAN. Output is ordinary editable code with no lock-in, deployable as a static site to any host or Datopian's managed Arc hosting.", "when_to_avoid": ["you need server-side rendering or dynamic server features — Arc hosting is static-only", "you want a turnkey managed portal with RBAC and metadata standards out of the box without self-managing code", "your team doesn't use Node.js or Next.js", "you need a full enterprise data catalog platform rather than a portal frontend"], "when_to_choose": ["you need a customizable open data or dataset catalog portal without vendor lock-in", "you want AI-assisted scaffolding but with plain editable Next.js code as output", "you need to integrate with CKAN, DKAN, OpenMetadata, DataHub, or GitHub data sources", "you want a static-export portal that is cheap and simple to host"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/portaljs", "repo": "datopian/portaljs", "role": "main", "score": 96}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:06:39.685381+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T02:37:04.368267+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0e0160403c57c01605bbfb7a6ecf1841f4a8bb71ad8a33a778ef33e0952fa2c6", "fetched_at": "2026-08-28T04:06:39.685381+00:00", "kind": "readme", "missing": false, "url": "https://github.com/datopian/portaljs"}, {"content_hash": "8ec142757c60853849ef758872bafbf329c4bfffd7c243d9f786be429e964fac", "fetched_at": "2026-08-29T10:17:58.833772+00:00", "kind": "homepage", "missing": false, "url": "https://www.portaljs.com"}, {"content_hash": "f35b5edf28076abb11a686bb8d5a966c2932c0edf80e6776a28fd4603e9a3b64", "fetched_at": "2026-08-29T10:17:58.842993+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/docs"}, {"content_hash": "d982ea94dbf20c673f84bc1b62c59a9683eac4bf60c7cfd5dc4092ce1294e8f0", "fetched_at": "2026-08-29T10:17:58.846442+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/docs/guides/scaling-data"}, {"content_hash": "e78e9cff8854802d45595ef515d245f39a62ce3c2dd926045714a6b07feb34c6", "fetched_at": "2026-08-29T10:17:58.848338+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/docs/arc"}, {"content_hash": "15b3ba43e7684c0cf0e4f0dd043e849058bbb01385458fd80abfbfadf66971cd", "fetched_at": "2026-08-29T10:17:58.850592+00:00", "kind": "site_page", "missing": false, "url": "https://portaljs.com/docs"}, {"content_hash": "25d04af75ffdcd11ab3fdf17c12dc08b19ad915787e65a8bae8cc89444a2ac22", "fetched_at": "2026-08-29T10:17:58.844716+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/pricing"}, {"content_hash": "f3deb651ad6b46392ed2ec4f79150b1de3ec672491777cf23d8939c04bc5d3b3", "fetched_at": "2026-08-29T10:17:58.852551+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/faq"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:06:39.685381+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T02:37:04.368267+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0e0160403c57c01605bbfb7a6ecf1841f4a8bb71ad8a33a778ef33e0952fa2c6", "fetched_at": "2026-08-28T04:06:39.685381+00:00", "kind": "readme", "missing": false, "url": "https://github.com/datopian/portaljs"}, {"content_hash": "8ec142757c60853849ef758872bafbf329c4bfffd7c243d9f786be429e964fac", "fetched_at": "2026-08-29T10:17:58.833772+00:00", "kind": "homepage", "missing": false, "url": "https://www.portaljs.com"}, {"content_hash": "f35b5edf28076abb11a686bb8d5a966c2932c0edf80e6776a28fd4603e9a3b64", "fetched_at": "2026-08-29T10:17:58.842993+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/docs"}, {"content_hash": "d982ea94dbf20c673f84bc1b62c59a9683eac4bf60c7cfd5dc4092ce1294e8f0", "fetched_at": "2026-08-29T10:17:58.846442+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/docs/guides/scaling-data"}, {"content_hash": "e78e9cff8854802d45595ef515d245f39a62ce3c2dd926045714a6b07feb34c6", "fetched_at": "2026-08-29T10:17:58.848338+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/docs/arc"}, {"content_hash": "15b3ba43e7684c0cf0e4f0dd043e849058bbb01385458fd80abfbfadf66971cd", "fetched_at": "2026-08-29T10:17:58.850592+00:00", "kind": "site_page", "missing": false, "url": "https://portaljs.com/docs"}, {"content_hash": "25d04af75ffdcd11ab3fdf17c12dc08b19ad915787e65a8bae8cc89444a2ac22", "fetched_at": "2026-08-29T10:17:58.844716+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/pricing"}, {"content_hash": "f3deb651ad6b46392ed2ec4f79150b1de3ec672491777cf23d8939c04bc5d3b3", "fetched_at": "2026-08-29T10:17:58.852551+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/faq"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T02:37:04.368267+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0e0160403c57c01605bbfb7a6ecf1841f4a8bb71ad8a33a778ef33e0952fa2c6", "fetched_at": "2026-08-28T04:06:39.685381+00:00", "kind": "readme", "missing": false, "url": "https://github.com/datopian/portaljs"}, {"content_hash": "8ec142757c60853849ef758872bafbf329c4bfffd7c243d9f786be429e964fac", "fetched_at": "2026-08-29T10:17:58.833772+00:00", "kind": "homepage", "missing": false, "url": "https://www.portaljs.com"}, {"content_hash": "f35b5edf28076abb11a686bb8d5a966c2932c0edf80e6776a28fd4603e9a3b64", "fetched_at": "2026-08-29T10:17:58.842993+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/docs"}, {"content_hash": "d982ea94dbf20c673f84bc1b62c59a9683eac4bf60c7cfd5dc4092ce1294e8f0", "fetched_at": "2026-08-29T10:17:58.846442+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/docs/guides/scaling-data"}, {"content_hash": "e78e9cff8854802d45595ef515d245f39a62ce3c2dd926045714a6b07feb34c6", "fetched_at": "2026-08-29T10:17:58.848338+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/docs/arc"}, {"content_hash": "15b3ba43e7684c0cf0e4f0dd043e849058bbb01385458fd80abfbfadf66971cd", "fetched_at": "2026-08-29T10:17:58.850592+00:00", "kind": "site_page", "missing": false, "url": "https://portaljs.com/docs"}, {"content_hash": "25d04af75ffdcd11ab3fdf17c12dc08b19ad915787e65a8bae8cc89444a2ac22", "fetched_at": "2026-08-29T10:17:58.844716+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/pricing"}, {"content_hash": "f3deb651ad6b46392ed2ec4f79150b1de3ec672491777cf23d8939c04bc5d3b3", "fetched_at": "2026-08-29T10:17:58.852551+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/faq"}], "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:06:39.685381+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:06:39.685381+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:06:39.685381+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T02:37:04.368267+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0e0160403c57c01605bbfb7a6ecf1841f4a8bb71ad8a33a778ef33e0952fa2c6", "fetched_at": "2026-08-28T04:06:39.685381+00:00", "kind": "readme", "missing": false, "url": "https://github.com/datopian/portaljs"}, {"content_hash": "8ec142757c60853849ef758872bafbf329c4bfffd7c243d9f786be429e964fac", "fetched_at": "2026-08-29T10:17:58.833772+00:00", "kind": "homepage", "missing": false, "url": "https://www.portaljs.com"}, {"content_hash": "f35b5edf28076abb11a686bb8d5a966c2932c0edf80e6776a28fd4603e9a3b64", "fetched_at": "2026-08-29T10:17:58.842993+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/docs"}, {"content_hash": "d982ea94dbf20c673f84bc1b62c59a9683eac4bf60c7cfd5dc4092ce1294e8f0", "fetched_at": "2026-08-29T10:17:58.846442+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/docs/guides/scaling-data"}, {"content_hash": "e78e9cff8854802d45595ef515d245f39a62ce3c2dd926045714a6b07feb34c6", "fetched_at": "2026-08-29T10:17:58.848338+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/docs/arc"}, {"content_hash": "15b3ba43e7684c0cf0e4f0dd043e849058bbb01385458fd80abfbfadf66971cd", "fetched_at": "2026-08-29T10:17:58.850592+00:00", "kind": "site_page", "missing": false, "url": "https://portaljs.com/docs"}, {"content_hash": "25d04af75ffdcd11ab3fdf17c12dc08b19ad915787e65a8bae8cc89444a2ac22", "fetched_at": "2026-08-29T10:17:58.844716+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/pricing"}, {"content_hash": "f3deb651ad6b46392ed2ec4f79150b1de3ec672491777cf23d8939c04bc5d3b3", "fetched_at": "2026-08-29T10:17:58.852551+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/faq"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:06:39.685381+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:06:39.685381+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T02:37:04.368267+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0e0160403c57c01605bbfb7a6ecf1841f4a8bb71ad8a33a778ef33e0952fa2c6", "fetched_at": "2026-08-28T04:06:39.685381+00:00", "kind": "readme", "missing": false, "url": "https://github.com/datopian/portaljs"}, {"content_hash": "8ec142757c60853849ef758872bafbf329c4bfffd7c243d9f786be429e964fac", "fetched_at": "2026-08-29T10:17:58.833772+00:00", "kind": "homepage", "missing": false, "url": "https://www.portaljs.com"}, {"content_hash": "f35b5edf28076abb11a686bb8d5a966c2932c0edf80e6776a28fd4603e9a3b64", "fetched_at": "2026-08-29T10:17:58.842993+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/docs"}, {"content_hash": "d982ea94dbf20c673f84bc1b62c59a9683eac4bf60c7cfd5dc4092ce1294e8f0", "fetched_at": "2026-08-29T10:17:58.846442+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/docs/guides/scaling-data"}, {"content_hash": "e78e9cff8854802d45595ef515d245f39a62ce3c2dd926045714a6b07feb34c6", "fetched_at": "2026-08-29T10:17:58.848338+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/docs/arc"}, {"content_hash": "15b3ba43e7684c0cf0e4f0dd043e849058bbb01385458fd80abfbfadf66971cd", "fetched_at": "2026-08-29T10:17:58.850592+00:00", "kind": "site_page", "missing": false, "url": "https://portaljs.com/docs"}, {"content_hash": "25d04af75ffdcd11ab3fdf17c12dc08b19ad915787e65a8bae8cc89444a2ac22", "fetched_at": "2026-08-29T10:17:58.844716+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/pricing"}, {"content_hash": "f3deb651ad6b46392ed2ec4f79150b1de3ec672491777cf23d8939c04bc5d3b3", "fetched_at": "2026-08-29T10:17:58.852551+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/faq"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:06:39.685381+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:06:39.685381+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:06:39.685381+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T02:37:04.368267+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0e0160403c57c01605bbfb7a6ecf1841f4a8bb71ad8a33a778ef33e0952fa2c6", "fetched_at": "2026-08-28T04:06:39.685381+00:00", "kind": "readme", "missing": false, "url": "https://github.com/datopian/portaljs"}, {"content_hash": "8ec142757c60853849ef758872bafbf329c4bfffd7c243d9f786be429e964fac", "fetched_at": "2026-08-29T10:17:58.833772+00:00", "kind": "homepage", "missing": false, "url": "https://www.portaljs.com"}, {"content_hash": "f35b5edf28076abb11a686bb8d5a966c2932c0edf80e6776a28fd4603e9a3b64", "fetched_at": "2026-08-29T10:17:58.842993+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/docs"}, {"content_hash": "d982ea94dbf20c673f84bc1b62c59a9683eac4bf60c7cfd5dc4092ce1294e8f0", "fetched_at": "2026-08-29T10:17:58.846442+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/docs/guides/scaling-data"}, {"content_hash": "e78e9cff8854802d45595ef515d245f39a62ce3c2dd926045714a6b07feb34c6", "fetched_at": "2026-08-29T10:17:58.848338+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/docs/arc"}, {"content_hash": "15b3ba43e7684c0cf0e4f0dd043e849058bbb01385458fd80abfbfadf66971cd", "fetched_at": "2026-08-29T10:17:58.850592+00:00", "kind": "site_page", "missing": false, "url": "https://portaljs.com/docs"}, {"content_hash": "25d04af75ffdcd11ab3fdf17c12dc08b19ad915787e65a8bae8cc89444a2ac22", "fetched_at": "2026-08-29T10:17:58.844716+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/pricing"}, {"content_hash": "f3deb651ad6b46392ed2ec4f79150b1de3ec672491777cf23d8939c04bc5d3b3", "fetched_at": "2026-08-29T10:17:58.852551+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/faq"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:06:39.685381+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:06:39.685381+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T02:37:04.368267+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0e0160403c57c01605bbfb7a6ecf1841f4a8bb71ad8a33a778ef33e0952fa2c6", "fetched_at": "2026-08-28T04:06:39.685381+00:00", "kind": "readme", "missing": false, "url": "https://github.com/datopian/portaljs"}, {"content_hash": "8ec142757c60853849ef758872bafbf329c4bfffd7c243d9f786be429e964fac", "fetched_at": "2026-08-29T10:17:58.833772+00:00", "kind": "homepage", "missing": false, "url": "https://www.portaljs.com"}, {"content_hash": "f35b5edf28076abb11a686bb8d5a966c2932c0edf80e6776a28fd4603e9a3b64", "fetched_at": "2026-08-29T10:17:58.842993+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/docs"}, {"content_hash": "d982ea94dbf20c673f84bc1b62c59a9683eac4bf60c7cfd5dc4092ce1294e8f0", "fetched_at": "2026-08-29T10:17:58.846442+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/docs/guides/scaling-data"}, {"content_hash": "e78e9cff8854802d45595ef515d245f39a62ce3c2dd926045714a6b07feb34c6", "fetched_at": "2026-08-29T10:17:58.848338+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/docs/arc"}, {"content_hash": "15b3ba43e7684c0cf0e4f0dd043e849058bbb01385458fd80abfbfadf66971cd", "fetched_at": "2026-08-29T10:17:58.850592+00:00", "kind": "site_page", "missing": false, "url": "https://portaljs.com/docs"}, {"content_hash": "25d04af75ffdcd11ab3fdf17c12dc08b19ad915787e65a8bae8cc89444a2ac22", "fetched_at": "2026-08-29T10:17:58.844716+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/pricing"}, {"content_hash": "f3deb651ad6b46392ed2ec4f79150b1de3ec672491777cf23d8939c04bc5d3b3", "fetched_at": "2026-08-29T10:17:58.852551+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/faq"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T02:37:04.368267+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0e0160403c57c01605bbfb7a6ecf1841f4a8bb71ad8a33a778ef33e0952fa2c6", "fetched_at": "2026-08-28T04:06:39.685381+00:00", "kind": "readme", "missing": false, "url": "https://github.com/datopian/portaljs"}, {"content_hash": "8ec142757c60853849ef758872bafbf329c4bfffd7c243d9f786be429e964fac", "fetched_at": "2026-08-29T10:17:58.833772+00:00", "kind": "homepage", "missing": false, "url": "https://www.portaljs.com"}, {"content_hash": "f35b5edf28076abb11a686bb8d5a966c2932c0edf80e6776a28fd4603e9a3b64", "fetched_at": "2026-08-29T10:17:58.842993+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/docs"}, {"content_hash": "d982ea94dbf20c673f84bc1b62c59a9683eac4bf60c7cfd5dc4092ce1294e8f0", "fetched_at": "2026-08-29T10:17:58.846442+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/docs/guides/scaling-data"}, {"content_hash": "e78e9cff8854802d45595ef515d245f39a62ce3c2dd926045714a6b07feb34c6", "fetched_at": "2026-08-29T10:17:58.848338+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/docs/arc"}, {"content_hash": "15b3ba43e7684c0cf0e4f0dd043e849058bbb01385458fd80abfbfadf66971cd", "fetched_at": "2026-08-29T10:17:58.850592+00:00", "kind": "site_page", "missing": false, "url": "https://portaljs.com/docs"}, {"content_hash": "25d04af75ffdcd11ab3fdf17c12dc08b19ad915787e65a8bae8cc89444a2ac22", "fetched_at": "2026-08-29T10:17:58.844716+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/pricing"}, {"content_hash": "f3deb651ad6b46392ed2ec4f79150b1de3ec672491777cf23d8939c04bc5d3b3", "fetched_at": "2026-08-29T10:17:58.852551+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/faq"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T02:37:04.368267+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0e0160403c57c01605bbfb7a6ecf1841f4a8bb71ad8a33a778ef33e0952fa2c6", "fetched_at": "2026-08-28T04:06:39.685381+00:00", "kind": "readme", "missing": false, "url": "https://github.com/datopian/portaljs"}, {"content_hash": "8ec142757c60853849ef758872bafbf329c4bfffd7c243d9f786be429e964fac", "fetched_at": "2026-08-29T10:17:58.833772+00:00", "kind": "homepage", "missing": false, "url": "https://www.portaljs.com"}, {"content_hash": "f35b5edf28076abb11a686bb8d5a966c2932c0edf80e6776a28fd4603e9a3b64", "fetched_at": "2026-08-29T10:17:58.842993+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/docs"}, {"content_hash": "d982ea94dbf20c673f84bc1b62c59a9683eac4bf60c7cfd5dc4092ce1294e8f0", "fetched_at": "2026-08-29T10:17:58.846442+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/docs/guides/scaling-data"}, {"content_hash": "e78e9cff8854802d45595ef515d245f39a62ce3c2dd926045714a6b07feb34c6", "fetched_at": "2026-08-29T10:17:58.848338+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/docs/arc"}, {"content_hash": "15b3ba43e7684c0cf0e4f0dd043e849058bbb01385458fd80abfbfadf66971cd", "fetched_at": "2026-08-29T10:17:58.850592+00:00", "kind": "site_page", "missing": false, "url": "https://portaljs.com/docs"}, {"content_hash": "25d04af75ffdcd11ab3fdf17c12dc08b19ad915787e65a8bae8cc89444a2ac22", "fetched_at": "2026-08-29T10:17:58.844716+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/pricing"}, {"content_hash": "f3deb651ad6b46392ed2ec4f79150b1de3ec672491777cf23d8939c04bc5d3b3", "fetched_at": "2026-08-29T10:17:58.852551+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/faq"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T02:37:04.368267+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0e0160403c57c01605bbfb7a6ecf1841f4a8bb71ad8a33a778ef33e0952fa2c6", "fetched_at": "2026-08-28T04:06:39.685381+00:00", "kind": "readme", "missing": false, "url": "https://github.com/datopian/portaljs"}, {"content_hash": "8ec142757c60853849ef758872bafbf329c4bfffd7c243d9f786be429e964fac", "fetched_at": "2026-08-29T10:17:58.833772+00:00", "kind": "homepage", "missing": false, "url": "https://www.portaljs.com"}, {"content_hash": "f35b5edf28076abb11a686bb8d5a966c2932c0edf80e6776a28fd4603e9a3b64", "fetched_at": "2026-08-29T10:17:58.842993+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/docs"}, {"content_hash": "d982ea94dbf20c673f84bc1b62c59a9683eac4bf60c7cfd5dc4092ce1294e8f0", "fetched_at": "2026-08-29T10:17:58.846442+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/docs/guides/scaling-data"}, {"content_hash": "e78e9cff8854802d45595ef515d245f39a62ce3c2dd926045714a6b07feb34c6", "fetched_at": "2026-08-29T10:17:58.848338+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/docs/arc"}, {"content_hash": "15b3ba43e7684c0cf0e4f0dd043e849058bbb01385458fd80abfbfadf66971cd", "fetched_at": "2026-08-29T10:17:58.850592+00:00", "kind": "site_page", "missing": false, "url": "https://portaljs.com/docs"}, {"content_hash": "25d04af75ffdcd11ab3fdf17c12dc08b19ad915787e65a8bae8cc89444a2ac22", "fetched_at": "2026-08-29T10:17:58.844716+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/pricing"}, {"content_hash": "f3deb651ad6b46392ed2ec4f79150b1de3ec672491777cf23d8939c04bc5d3b3", "fetched_at": "2026-08-29T10:17:58.852551+00:00", "kind": "site_page", "missing": false, "url": "https://www.portaljs.com/faq"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 99, "longevity": 100, "rhythm": 89}, "computed_at": "2026-09-03T02:20:16.233290+00:00", "flags": [], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 5437, "days_push": 8, "days_rel": 76, "gap_med": 3, "n_releases_24m": 10}, "score": 96, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}