Core concepts
PortalJS rests on four ideas. Understand these and the skills, the template, and the decisions behind them all make sense.
1. A lightweight template + agentic skills
For years, building a data portal meant wiring up a heavy component library, fighting bundle sizes, and writing boilerplate for every dataset page and catalog view. PortalJS replaces that with two smaller pieces:
- A lightweight, customizable template — plain Next.js, Tailwind, and a few
small React components (
Table, charts, maps added only when you need them). No monolithic, non-tree-shakeable bundle. - A set of agentic skills —
/new-portal,/add-dataset,/add-chart,/add-map,/connect-ckan,/deploy— that do the repetitive assembly.
The work moves from writing boilerplate to describing intent. The framework stays small and easy to own; the agent does the assembly.
2. Plain, editable code — no lock-in
Every skill produces plain, readable code you can clone, fork, and edit by hand. There is no magic runtime interpreting a config file at request time, and nothing is feature-gated behind a hosted product.
This is what AI-native, not AI-only means: the skills are the fast path, but the output is an ordinary Next.js project. You can scaffold with skills today and hand the repo to a developer who's never heard of them — see Manual setup.
3. Decoupled by default
The frontend is independent from the backend and talks to it over an API. The same portal frontend can sit in front of:
- CKAN, DKAN, OpenMetadata, Microsoft Purview, DataHub
- GitHub-backed and Frictionless datasets
- plain JSON / static files (the default — no backend at all)
- a custom backend you already run
Start with static CSVs in /public/data/, then point the portal at a real catalog
later with /connect-ckan — without rewriting the frontend.
4. Bring your own stack
PortalJS ships a sensible default template, but never forces a frontend toolchain or design system on a team that already has one. The components are small and swappable; the styling is plain Tailwind. Adopt the whole template, or lift the skills and ideas into an existing app.
How it fits together
You describe intent ──► Agentic skill ──► Plain editable code
"add this CSV" /add-dataset pages/datasets/*.tsx
public/data/*.csv
The skills are first-class citizens of the repo: documented, tested end-to-end, and composable. Anyone can author one — see the authoring guide.
Where to go next
- Quickstart — put these concepts to work with the skills.
- Manual setup — or build by hand.
- Open-source framework docs — the classic framework reference.