The AI-native framework for building data portals.
Describe the portal you want β your agent scaffolds it and loads your data in minutes.
Docs
Β·
Discussions
Β·
Report a bug
PortalJS is an open-source framework for building data portals and catalogs. It pairs a lightweight, customizable site with a set of agentic skills β commands your AI assistant runs to scaffold a portal, add datasets, and wire up a backend, without you writing boilerplate.
Built and maintained in the open by Datopian and the PortalJS community.
PortalJS ships Claude Code skills that turn a brief into a working portal.
The skills live in this repo under .claude/commands/. The quickest way to try them is from a clone of the repo:
# 1. Clone the repo and open Claude Code inside it
git clone https://github.com/datopian/portaljs
cd portaljs
claudeClaude Code auto-discovers the slash commands from .claude/commands/ β no install step. Type / in the session to see /new-portal, /add-dataset, and the rest.
Install anywhere: the skills and template are also packaged as a Claude Code plugin and can be installed into
~/.claude/commands/so you can run them from any project. See.claude/INSTALL.md.
In the Claude Code session:
/new-portal "Auckland Council open data portal"
/add-dataset ./data/air-quality.csv
/add-dataset https://example.com/parks.geojson
That scaffolds the site, copies your data in, generates dataset pages, and registers everything on the catalog home page. Run npm run dev and you have a portal.
Prefer to start from a template? Clone the canonical example and build by hand β the skills are a convenience, not a requirement:
npx create-next-app -e https://github.com/datopian/portaljs/tree/main/examples/portaljs-template my-portal| Skill | What it does |
|---|---|
/new-portal |
Scaffold a new portal from a brief |
/add-dataset |
Add a CSV, TSV, JSON, or GeoJSON dataset and register it |
/add-chart |
Add a chart to a dataset page |
/add-map |
Render GeoJSON on an interactive map |
/connect-ckan |
Wire a portal to a CKAN backend |
/deploy |
Deploy to Vercel or static hosting |
More skill families β data ingestion/migration, wrangling and transforms, richer visualization, and metadata β are on the roadmap. Write your own β see .claude/AUTHORING.md.
- π± Open source, MIT licensed β no lock-in, fork it, ship it, own it.
- π€ AI-native β agentic skills do the assembly so you focus on the data, not the scaffolding.
- π§© Decoupled, any backend β the frontend is independent from your backend and talks to it over an API. Out-of-the-box support for CKAN, DKAN, OpenMetadata, Microsoft Purview, DataHub, GitHub, Frictionless Data Packages, plain JSON/static files β or your own custom backend.
- π¨ Bring your own stack β start from the default template or adapt it to the frontend tooling and design system your team already uses.
- π₯ Community-driven β active Discord and discussion forum; contributions welcome.
Reference implementations live in examples/:
| Example | Backend |
|---|---|
portaljs-template |
Static / local files β the canonical starting point |
ckan Β· ckan-ssg |
CKAN |
github-backed-catalog |
GitHub |
dataset-frictionless |
Frictionless Data Package |
fivethirtyeight Β· openspending Β· turing |
Real-world portals |
- π¬ Discord β live chat and help: join the server
- π£οΈ Discussions β questions, ideas, show-and-tell: github.com/datopian/portaljs/discussions
- π Issues β bugs and feature requests: open an issue
- π Docs β portaljs.com/opensource
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 VISION.md for where the project is headed.