Open-source project
xyjoey/PRISM avatar
xyjoey/PRISM

PRISM: a research homepage template driven by TOML, Markdown and BibTeX

An Elegant Academic Homepage Builder

740 stars211 forksTypeScriptMIT

At a glance

What is it?
PRISM is a Next.js and TypeScript template for an academic personal site where the content lives in files rather than in a CMS, so a publications page is generated from a .bib file and a new page appears by dropping a TOML file into the content directory. It ships as a static export, and the README asks you to install Node 22 yourself rather than use a system copy.
Who is it for?
PRISM is worth taking if you are a researcher or academic who wants a publications page that stays in sync with your own bibliography file and a site you can edit without touching React code, because the BibTeX pipeline and the page-type system remove the two chores that make personal academic sites go stale.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 163 days ago.
What is it written in?
Mainly TypeScript, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.

Editorial analysis

The content directory is the whole user interface

PRISM stands for Portfolio and Research Interface Site Maker, and it is described as a modern, configurable, high-performance personal website template built with Next.js, Tailwind CSS and TypeScript, aimed at researchers, developers and academics.

The defining choice is that the site is configuration driven. The README states that you manage the entire site content using simple TOML, Markdown and BibTeX files in the content directory, and that no code changes are required for content updates. The project structure in the README makes the split explicit: content/ holds all user-editable content, public/ holds static assets, and src/ holds the application with app/ for the Next.js App Router, components/ for React components, lib/ for utility functions such as parsers and config loaders, and types/ for TypeScript definitions.

That separation is the reason this kind of template survives contact with a real academic. The temptation with a personal site built in React is to change a component to add a publication, and then the site is a program. Here the components are fixed and the inputs are files, so a change to the site is a change to a text file that a diff tool understands.

The repository is TypeScript, MIT licensed, and the last push was on 2026-05-13. There are no GitHub releases, so the version in the manifest is what you get, and the package version is 1.3.3. A demo site is published at prism-demo.pages.dev, and there is a Chinese README alongside the English one.

The README also says you are free to customize your own version of PRISM with coding agents, which is a slightly unusual invitation that tells you the maintainer expects forks to diverge heavily.

Publications come from a BibTeX file, and the display settings live inside it

The publications feature is the most substantial part of the template, and it works in a way that is worth understanding before you start editing.

You export your publications from Google Scholar, Zotero or Mendeley to a BibTeX file at content/publications.bib, and PRISM parses that file to generate the publications page. The rendered page includes search, filtering by year and by type, and automatic citation generation.

The unusual part is that the display settings are stored in the same .bib file. The README says to customize the display of publications by changing the selected, preview and description keys in the bib file. So the bibliography is not only the data, it is also the configuration for how that data appears, which means a fork of the template does not need a parallel config file to track which papers are highlighted.

The parsing itself is done by a third-party library rather than by hand. The manifest lists bibtex-parse-js as a dependency, and the TOML files are read with smol-toml, which is a small Rust-backed parser compiled to WebAssembly or native, chosen here because it keeps the static build light.

One detail that will matter if you are an academic: publication titles support a subset of BibTeX inline formatting commands. The listed subset is textit, emph, textbf, textsc, textsuperscript and textsubscript. So italics and small caps work, and anything outside that subset does not, which means a title with, say, a nested math expression or a specialised command will render as the raw command text unless you strip it before export.

The homepage separately has a Selected Publications section, configured in the about file, so the curated subset on the front page and the full filtered list are separate things.

Adding a page is creating a file and naming it in the navigation list

The dynamic routing feature works by convention rather than by code. To add a new page, for example a Projects page, you create a TOML file in the content directory with a matching name and add it to the navigation list in the config file.

Three page types are supported, and each is a rendering mode rather than a template you can extend.

The text type renders Markdown content, and the README suggests it for CVs and bios. The card type renders a list of cards, suggested for projects and awards, and the content of each card item supports Markdown, so a card body can carry formatting without the card being plain text. The publication type renders the full publications list with the filters.

That set of three is both the strength and the limit of the template. It covers the shapes an academic homepage actually needs, and it means a page that is none of those shapes has no configuration path.

The global config file is where the site identity lives, with a site section carrying the title, description and url, an author section with a name and a title such as PhD Student or Researcher, and a features section. The features section is the one to look at first when you start, because it is the switchboard: the example sets enable_likes to true.

The homepage content lives in its own file, content/about.toml, which customises the About section, the News entries and the Selected Publications block. Separating the homepage from the global config means a news update does not touch the site-wide settings.

Localisation is a directory convention with a silent fallback

PRISM supports i18n through a directory naming convention, and the rules are simple enough to reason about without reading the source.

The default language lives in content/. Additional languages live in directories named content_ followed by the locale, for example content_zh/ and content_en/. The filenames have to match across the directories, so content/cv.md in the default and content_zh/cv.md in the Chinese version are the same page.

The fallback rule is the part to be careful about. If a localized file is missing, PRISM automatically falls back to the default content/ version.

Automatic is doing real work in that sentence. A missing translation does not produce an empty page, an error or a build failure, it produces the default language content in a page that claims to be in another language. For a site where a visitor selects a language, that is a graceful degradation, and it is also the kind of thing that goes unnoticed until someone notices a paragraph in the wrong language. If you care, you need to check that the file sets are actually complete rather than assuming the fallback covers it.

The repository layout shows this in practice, with both a content/ directory and a content_zh/ directory checked in at the top level, along with a README_cn.md. So the Chinese version is the worked example of a second locale, and the paired files in the two directories are the reference for how the convention is meant to be used.

The language behaviour itself is configured in the main config file, and the section of the README that would cover the available options is cut off in the visible text, so the specific settings are not described.

Node 22, Turbopack and a static out directory

The prerequisites are Node.js 22 or later, and npm, pnpm or yarn. The README is unusually insistent about the Node version, saying to download and install it manually from the nodejs.org download page, and that it is better not to use the pre-installed version on your system as it may be outdated or incompatible. The manifest confirms the floor with an engines entry of node 22.0.0 or higher, and there is an .nvmrc file at the repository root, which is the mechanism that keeps everyone on the same version.

The three commands you need are the standard Next.js ones, and the dev script uses Turbopack:

bash
    npm install
bash
    npm run dev
bash
npm run build

The dev server runs on port 3000. The build produces a static out directory that can be hosted anywhere, and the README points to a deployment guide for GitHub Pages and Cloudflare Pages.

The dependency list is a reasonable picture of a modern Next.js site. Headless UI and Heroicons cover accessible component primitives and icons, Framer Motion handles the animations, next-themes handles dark mode, React Markdown renders the Markdown content, zustand holds client state, and clsx handles class composition. Tailwind is at version 4 with the PostCSS plugin, and lightningcss is listed as a dev dependency with a platform-specific optional package for Linux, which is the minifier.

The README describes the stack as built on Next.js 20 with Turbopack, while the manifest pins next at 15.3.3, so the version numbers in the prose and in the lockfile are not in step, and the manifest is what you actually install.

Editorial conclusion

PRISM is worth taking if you are a researcher or academic who wants a publications page that stays in sync with your own bibliography file and a site you can edit without touching React code, because the BibTeX pipeline and the page-type system remove the two chores that make personal academic sites go stale. It is the wrong tool if you want a general purpose website builder, since the supported page types are text, card and publication and nothing else, and it is the wrong tool if you need server-side rendering, since the whole thing is built for a static export. Before you fork it, verify three things yourself: that the Node.js version you have is 22 or later, since the manifest states that as the engine floor and the README warns against a pre-installed system copy, that your bibliography tool exports a .bib file whose keys survive the display settings, and that the i18n fallback behaves as you expect, since a missing file in a locale directory silently resolves to the default language version rather than erroring.

Frequently asked questions

What is PRISM and who is it for?

PRISM is a personal website template for researchers, developers and academics, built with Next.js, Tailwind CSS and TypeScript. It is configuration driven, so the whole site content lives in TOML, Markdown and BibTeX files in the content directory and needs no code change to update.

How do I add my publications to a PRISM site?

Export your bibliography from Google Scholar, Zotero or Mendeley to content/publications.bib and PRISM parses it into a publications page with search, filtering by year and type, and citation generation. Display settings such as selected, preview and description are set with keys inside the same bib file.

How do I add a new page to a PRISM site?

Create a TOML file in the content directory, for example content/projects.toml, and add it to the navigation list in content/config.toml. The supported page types are text for Markdown content, card for a list of cards whose items support Markdown, and publication for the full filtered publications list.

How does PRISM handle multiple languages?

The default language lives in content/ and additional languages live in directories such as content_zh/, with matching filenames across directories. If a localized file is missing, PRISM falls back automatically to the default content/ version rather than failing.

What do I need to build and deploy PRISM?

Node.js 22 or later, which the README asks you to install manually, plus npm, pnpm or yarn. Then npm install, npm run dev for the dev server on port 3000, and npm run build, which produces a static out directory that can be hosted anywhere, with a deployment guide covering GitHub Pages and Cloudflare Pages.

Official sources

  1. Issues
  2. License: MIT
  3. Project website
  4. README
  5. xyjoey/PRISM on GitHub
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/xyjoey-prism.svg)](https://hysenlabs.com/projects/xyjoey-prism)

Was this useful?