GitPedia

Portaljs

πŸŒ€ 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).

From datopianΒ·Updated June 14, 2026Β·View on GitHubΒ·

Describe the portal you want β€” your agent helps you choose an architecture, scaffolds it, and loads your data. The project is written primarily in TypeScript, distributed under the MIT License license, first published in 2011. It has gained significant community traction with 2,281 stars and 332 forks on GitHub. Key topics include: ai, ai-agents, ckan, data-fabric, data-management-platform.

Latest release: create-portaljs@0.2.0
<p align="center"> <img src="assets/portaljs-logo.svg" alt="PortalJS" width="96" height="96" /> <h1 align="center">PortalJS</h1> <p align="center"> <b>The AI-native framework for building data portals.</b> <br /> Describe the portal you want β€” your agent helps you choose an architecture, scaffolds it, and loads your data. <br /> <br /> <a href="https://www.portaljs.com/opensource">Docs</a> Β· <a href="https://github.com/datopian/portaljs/discussions">Discussions</a> Β· <a href="https://github.com/datopian/portaljs/issues/new">Report a bug</a> <br /> <br /> <a href="https://discord.gg/krmj5HM6He"><img src="https://dcbadge.limes.pink/api/server/krmj5HM6He" alt="Join our Discord server"/></a> <img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="MIT License"/> </p> </p>

Quickstart

Create a portal β€” one command, nothing to install beyond Node 18+:

bash
npm create portaljs@latest my-portal cd my-portal npm run dev # β†’ http://localhost:3000

You get the three surfaces β€” Home, a Catalog (/search), and a dataset Showcase
(/@<namespace>/<slug>) β€” over sample data. Plain, editable Next.js, no lock-in. Add your
own CSV/JSON to datasets.json and it renders automatically.

Build it with your AI assistant β€” PortalJS ships Claude Code
skills that do the assembly. Install them once (into ~/.claude/commands):

bash
curl -fsSL https://raw.githubusercontent.com/datopian/portaljs/main/scripts/install-portaljs-skills.sh | bash

Then, in a Claude Code session from any directory:

text
/architect not sure what stack you need? start here /new-portal "Auckland Council open data portal" /add-dataset ./data/air-quality.csv

/new-portal scaffolds the three surfaces; /add-dataset (or /add-resource) loads data;
/connect-ckan points it at a CKAN backend; /deploy ships it. (All skills + install β†’)

Prefer the bare template β€” plain Next.js, no AI, no lock-in:

bash
npx tiged datopian/portaljs/examples/portaljs-catalog my-portal cd my-portal && npm install && npm run dev # β†’ http://localhost:3000

You get Home, a Catalog (/search), and a dataset Showcase (/@<namespace>/<slug>) over
sample data. Add your own CSV/JSON to datasets.json and it renders automatically.

⭐ If it's useful, a star helps others find it.

Why PortalJS

Building a data portal has always meant more than a website. You have to decide where
the data lives, how it's versioned, how people search it, how it's served, and how it's
governed β€” and then wire a frontend on top. Teams either over-build on a heavy data
warehouse they don't need, or under-build on a pile of scripts that doesn't scale.

PortalJS is an open-source, agentic skills framework that helps data teams build,
develop, and ship data portals β€” and the data infrastructure underneath them.
It isn't
only a frontend. The skills do two jobs:

  • Advise β€” given what you're building, what your data is, and what it's for,
    they recommend an architecture: storage, compute, catalog, access, hosting, metadata.
  • Build β€” they scaffold that stack as plain, editable Next.js code with no lock-in.

It is opinionated but open: the recommended modern path is git + object storage
(Cloudflare R2) + Parquet + DuckLake + DuckDB β€” an open
lakehouse instead of a classic warehouse β€” but a traditional datastore (CKAN, a
warehouse) stays a first-class option when you need it. You always own plain code.

Built and maintained in the open by Datopian and the
PortalJS community.

Architecture at a glance

text
πŸ§‘ you describe what you want to build β”‚ β–Ό ╭─ πŸ€– AGENTIC SKILLS ────────────────────────────────── decide + build β”‚ /architect Β· /new-portal Β· /add-dataset Β· /add-chart Β· /add-map … ╰─ generates plain, editable Next.js code β€” no lock-in β”‚ β–Ό ╭─ πŸ–₯️ SURFACES ──────────────────────────────────────── what users see β”‚ 🏠 Home / πŸ”Ž Catalog /search πŸ“Š Showcase /@ns/slug ╰─ read data through one DataProvider contract β”‚ β–Ό ╭─ πŸ”Œ PROVIDERS ─────────────────────────────────────── pluggable backends β”‚ πŸ“ staticΒ·git 🐘 CKAN πŸ”­ OpenMetadata πŸ—‚οΈ git-LFS + R2 ╰─ swap the source without touching a page β”‚ β–Ό πŸ“¦ STORAGE + COMPUTE β€” choose your point on the spectrum: flat files ─▢ Git-LFS + R2 ─▢ Parquet + DuckLake + πŸ¦† DuckDB ─▢ warehouse / CKAN simplest ⭐ open lakehouse (default) heaviest ☁️ Substrate β€” Cloudflare R2 (storage) Β· Workers (runtime) Β· D1 (catalog) Β· Pages (static) object storage stays S3-compatible β€” R2 is the default, never a lock-in

Three surfaces. Every data portal is built from three: a Home page that explains
it and offers search, a Catalog (/search) to discover datasets, and a Showcase
(/@<namespace>/<slug>) to explore one dataset β€” metadata, preview, download/API, and
charts/maps. (Core concepts β†’)

One seam. The surfaces read data only through a DataProvider, so the source β€” static
files today, a CKAN or lakehouse backend tomorrow β€” can change without touching a page.

See ROADMAP.md for the full model and the
architecture decision framework
for how /architect turns your needs into a stack.

Build a portal with your AI assistant

PortalJS ships Claude Code skills that turn a brief into
a working portal.

Setup

Install the skills once into your personal scope so they're available from any
directory:

bash
curl -fsSL https://raw.githubusercontent.com/datopian/portaljs/main/scripts/install-portaljs-skills.sh | bash

Restart Claude Code (or open a new session) and type / to see them. See
.claude/INSTALL.md for other install options (versioned plugin, or
running straight from a clone of this repo).

Use

If you're not sure how to set up your portal, start with the advisor, then build:

text
/architect we have ~200 public CSVs, updated quarterly, and must publish DCAT-AP /new-portal "Auckland Council open data portal" /add-dataset ./data/air-quality.csv /add-dataset https://example.com/parks.geojson

The skills are interactive β€” if your brief is thin, they interview you in short rounds
rather than erroring. /architect recommends a stack and hands off; /new-portal
scaffolds the three surfaces; /add-dataset appends to the datasets.json manifest and
the showcase renders automatically at /@<namespace>/<slug>. Run npm run dev and you
have a portal.

Prefer to build by hand? The skills are a convenience, not a requirement β€” scaffold the
template directly with the CLI:

bash
npm create portaljs@latest my-portal

(Or grab the bare template with no prompts: npx tiged datopian/portaljs/examples/portaljs-catalog my-portal.)

Available skills

SkillWhat it does
/architectRecommend an architecture (storage/compute/catalog/access/hosting/metadata) from your needs, then hand off β€” the advisory entry point
/new-portalScaffold a new portal (Home + Catalog + Showcase) from a brief
/add-datasetAdd a CSV, TSV, JSON, or GeoJSON dataset β€” appends to the manifest; its showcase renders automatically
/add-chartAdd a chart to a dataset's showcase Views section
/add-mapRender GeoJSON on an interactive map in the showcase
/connect-ckanFeed the catalog and showcases from a CKAN backend
/deployDeploy to Cloudflare Pages, Vercel, or static hosting
/check-data-qualityAudit a dataset for quality issues (schema, nulls, types)

More skill families β€” metadata schemas (Frictionless/DCAT), more backends (OpenMetadata,
git-LFS+R2), a DuckDB data layer, and access control β€” are on the roadmap.
Write your own β€” see .claude/AUTHORING.md.

What's in this repo

text
.claude/commands/ the agentic skills (slash commands) examples/ reference portals β€” portaljs-catalog is the canonical template packages/ core/ layout/UI components (@portaljs/core) ckan/ CKAN catalog UI + React (@portaljs/ckan) ckan-api-client-js/ pure CKAN API client (@portaljs/ckan-api-client-js) site/ portaljs.com β€” the marketing site + docs ROADMAP.md direction, the four contracts, sequencing

The canonical template, examples/portaljs-catalog, is where
the three surfaces and the DataProvider seam live β€” read it before building.

What makes it different

  • 🌱 Open source, MIT, no lock-in β€” every skill emits plain Next.js you can fork and own.
  • 🧭 Advisory, not just generative β€” /architect helps you decide the infrastructure, not only scaffold a UI.
  • πŸ¦† Open lakehouse by default β€” git + R2 + Parquet + DuckLake + DuckDB over a heavy warehouse, with DuckDB as the query engine. A datastore/warehouse stays a supported choice.
  • ☁️ Cloudflare-first, portable β€” R2 / Workers / D1 / Pages as the default substrate, but object storage stays S3-compatible.
  • 🧩 Decoupled, any backend β€” one DataProvider contract in front of CKAN, DKAN, OpenMetadata, DataHub, GitHub, Frictionless, plain files β€” or your own.
  • 🎨 Bring your own stack β€” adopt the template or lift the skills and the three-surface model into an app you already have.

Examples

Reference implementations live in examples/:

ExampleBackend
portaljs-catalogCanonical template β€” Home + Catalog + Showcase over a static manifest
portaljs-templateMinimal single-page starter
ckan Β· ckan-ssgCKAN
github-backed-catalogGitHub
dataset-frictionlessFrictionless Data Package
fivethirtyeight Β· openspending Β· turingReal-world portals

Community & support

Contributing

PortalJS is built in the open and we welcome contributions of all sizes β€” new skills,
examples, docs, and fixes. See CONTRIBUTING.md to get started, and read
ROADMAP.md and VISION.md for where the project is headed.

License

MIT Β© Datopian

Contributors

Showing top 12 contributors by commit count.

View all contributors on GitHub β†’

This article is auto-generated from datopian/portaljs via the GitHub API.Last fetched: 6/14/2026