Content is centralized in the content/ folder; the template does not ship that folder, so updating the site code does not conflict with personal content
academic-site-template — Next.js Portfolio Template
By kunpai
A personal website template for researchers, doctoral students, and scholars, built on Next.js 16, React 19, and Bootstrap, with content centralized in the content/ folder, supporting a publication topic graph, blog, CV/resume PDFs generated from the same data, and JSON-LD, sitemap, and llms.txt for search engines and LLMs.
Explore the design
Compare the page layouts and mobile experience. Open any screenshot for a closer look.
Actual screenshot captured by the server browser.
All pages & views 3
Screenshots show visual appearance; interactive behavior may differ.
What stands out
A quick read of the recorded project description.
Publications support tabs by type, a tag-based topic graph, BibTeX entries, and author list highlighting
CV and resume PDFs are generated by LaTeX from the same data, and a GitHub Action can rebuild them automatically on push
Provides JSON-LD, sitemap, and llms.txt/llms-full.txt for search engines and LLMs to read
Sections can be disabled via feature flags in config.json; when disabled, pages return 404 and navigation, homepage sections, and sitemap/RSS/llms.txt entries are removed accordingly
Supports light and dark modes, with configurable accent color and heading font
Template Details
This template is used to build an academic personal website, and the README states it is aimed at researchers, doctoral students, and scholars. Site code and personal content are separated: the template itself does not include the content/ folder, which is generated on first run of npm run setup by copying from examples/content/, so updating the site code does not conflict with user content. Content covers configuration, JSON data (publications, education, work experience, projects, skills, awards, news, talks, service), an About page, and a Markdown blog, with photos and PDFs placed in public/. In terms of features, publications support tabs by type, a tag-based topic graph, BibTeX, and author highlighting; the blog is GitHub-style Markdown with reading time and RSS; CV and resume PDFs are generated by LaTeX from the same data and can be rebuilt on push via a GitHub Action; the site provides JSON-LD, sitemap, and llms.txt/llms-full.txt. Some sections can be disabled in config.json; when disabled, the corresponding pages return 404, and navigation links, homepage sections, and entries in sitemap, RSS, and llms.txt are removed. The tech stack is Next.js 16, React 19, and Bootstrap, with deployment targeting Vercel or any Next.js hosting environment. The README does not state performance, accessibility, or production readiness.
Is it right for your project?
Use Cases
- Researchers, doctoral students, and scholars building a personal academic homepage to showcase publications, blog, and CV in one place
- Needing to maintain publication data, blog posts, and CV/resume PDFs from a single content source
- Wanting site content to be readable by search engines and LLMs, requiring JSON-LD, sitemap, and llms.txt
- Using a React/Next.js stack and planning to deploy to Vercel or any Next.js hosting environment
- Needing to disable sections such as projects, blog, or talks as needed and remove them from navigation, homepage, and sitemap accordingly
Suitable For
- Researchers, doctoral students, and scholars
- Developers who prefer a React/Next.js stack
- Users who want content separated from site code for easier template updates later
- Users who need to generate CV and resume PDFs from the same data
- Users planning to deploy to Vercel or any Next.js hosting environment
Getting started & customization
Use these recorded setup notes alongside the repository instructions for your chosen version.
- 1
On GitHub, click Use this template or clone the repository, then run npm install, then run npm run setup to create content/ from examples/ and fill in name, links, and section settings, then run npm run dev to start the local server
- 2
Replace the example entries in content/data/*.json with your own data; field descriptions are in docs/CONTENT.md
- 3
Import the repository in Vercel to deploy; the default Next.js settings work directly
- 4
Generating CV and resume PDFs requires running python3 scripts/generate_resumes.py and having LaTeX installed locally (MacTeX or TeX Live)
- 5
Before updating the template, commit your own changes first, then run npm run update; the first update links history via .template-version, and subsequent updates are normal merges
License & source material
Usage conditions & limitations
Free to use · keep license noticeThis entry covers the free version under the MIT license in the public repository; the free scope is the code of that version and does not mean external services or third-party assets are free.
Must comply with when using
- Free use, modification, commercial use, and distribution of that version's code are permitted.
- When distributing copies or substantial portions of the code, retain the original author's copyright notice and the full MIT license notice.
- The code is provided as is; warranties and limitations of liability are governed by the original license and applicable law.
Additional costs & items to verify
- Demo images, fonts, icons, and other third-party assets must be checked against their respective licenses and cannot be judged solely by the code's MIT license.
- External services such as domains, hosting, databases, payments, or AI may incur separate charges.
- Generating CV and resume PDFs requires LaTeX installed locally (MacTeX or TeX Live); otherwise the script cannot run.
- npm run indexnow submits pages to search engines such as Bing after deployment and is an optional external service call.
- The deployment steps depend on the Vercel platform and require registering for and using that external hosting service.
View Original Text Basis
Permission is hereby granted, free of charge
Original License Text
python3 scripts/generate_resumes.py # needs a LaTeX install (MacTeX, TeX Live)
Original README
| `npm run indexnow` | After a deploy, tell Bing and others about your pages |
Original README
https://github.com/kunpai/academic-site-template/blob/main/LICENSEhttps://github.com/kunpai/academic-site-template/blob/main/README.md3. Deploy: import the repository in [Vercel](https://vercel.com). The default Next.js settings
Original README
Compiled by DeepSeek based on repository license and README ·2026-10-14. Results only cover the materials read; dependencies, images, fonts, and subsequent term changes are subject to their respective original texts.
Project checks & description sources
Template Information
- Source platforms
- GitHub
- Documentation and maintenance reference score
- More documented · 85 / 100
- Technologies
- Next.js · React
- Website type
- Portfolio · Blog
How this score is calculated
Our heuristic uses license records (up to 30), a demo link (12), a preview (10), stars (15), recorded maintenance (15), description completeness (8), feature records (5) and classification data (5). It is not a code, security or performance test, or a Google score. A link does not establish tested functionality.
What to verify for this project
- Repository update recorded
- 2026-09-16
- Screenshot last checked
- 2026-10-14
A demo link is listed. Check it with your own content and viewport sizes; its presence does not confirm that forms, authentication or payments work.
The catalog identifies Next.js as the primary stack. Check the actual dependency manifest and lockfile for versions and hosting requirements. These notes use recorded metadata, not a code audit or a deployment test.
Use a selection guide →How this description was prepared
AI-assisted description based on catalog records and repository material. Repository authors are not automatically the reviewers of this description.
Review declaration: codex-user-requested-batch-review-20261015 · 2026-10-15
Inspect the recorded source material
SHA-256: 549355fcaaee191aa401bc74be413568a4e7c50ec1b58588076221fedfe116dd
2026-10-14T23:54:55.416Z
Source file / repository# Academic Site Template
A personal website for researchers, PhD students and academics: publications with a topic graph,
a blog, a CV/resume built from the same data, and a site that search engines and LLMs can read.
Built with Next.js 16, React 19 and Bootstrap. Everything you write goes in one folder, `content/`,
which `npm run setup` creates for you from [`examples/content/`](examples/content). The template
itself never ships a `content/` folder, so updates to the site code can't conflict with yours.
[](https://github.com/kunpai/academic-site-template/generate)
[](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fkunpai%2Facademic-site-template)
[](https://academic-site-template.vercel.app)
[](https://academic-site-template.vercel.app)
The demo at [academic-site-template.vercel.app](https://academic-site-template.vercel.app) is
built from this repository with the example content for the fictional Jane Doe.
## Updates without merge conflicts
Your content lives in your own `content/` folder, and the template only ships site code, so taking
a new release is one command. This is a real run on a site made with **Use this template**:

See [Getting updates](#getting-updates) for how it works.
## Features
- **Everything personal lives in `content/`**: config, data (JSON), about page, blog posts.
Setup creates it from the example; photos and PDFs go in `public/`.
- **Sections you can switch off.** Turning off `projects`, `blogs` and so on removes the page (it
returns 404), its nav link, its homepage block, and its entries in the sitemap, RSS and
`llms.txt`.
- **Publications** with tabs by type, a topic graph built from your tags, BibTeX, and your name
highlighted in author lists.
- **Blog** in Markdown (GitHub-flavoured, raw HTML allowed), with reading time and an RSS feed.
- **CV and resume PDFs** generated with LaTeX from the same data. A GitHub Action rebuilds them
when you push.
- **Readable by search engines and LLMs:** JSON-LD, a sitemap, and `llms.txt` / `llms-full.txt`.
- **Checked content:** JSON Schemas give editor autocomplete, and `npm run validate` runs before
every build.
- Light and dark mode, a configurable accent colour and heading font.
- Optional link pages for posters and talks (`linktree`, off by default).
## Compared to al-folio, academicpages and HugoBlox
[al-folio](https://github.com/alshedivat/al-folio),
[academicpages](https://github.com/academicpages/academicpages.github.io) and
[HugoBlox](https://github.com/HugoBlox/hugo-theme-academic-cv) (formerly Wowchemy) are the most
popular academic site templates. All three are mature and free to host. This template makes
different trade-offs:
| | This template | al-folio | academicpages | HugoBlox |
|---|---|---|---|---|
| **Stack** | Next.js 16 (React 19), Node | Jekyll (Ruby) | Jekyll (Ruby), based on Minimal Mistakes | Hugo (Go), Tailwind CSS |
| **Your content** | One folder, `content/`, checked against JSON Schemas | Spread across `_pages/`, `_posts/`, `_bibliography/`, `_config.yml` | Spread across `_pages/`, `_publications/`, `_talks/`, `_config.yml` | Markdown in `content/`, plus `config/_default/*.yaml` and `data/authors/` |
| **Updating** | `npm run update` merges the new template; only site code changes, so your content never conflicts | Merge upstream; files you customised can conflict | Fork; no separate update path | `npx hugoblox@latest upgrade`, which applies migrations automatically |
| **Publications** | JSON with a BibTeX entry each, plus an interactive topic graph | A BibTeX file, rendered with jekyll-scholar | One Markdown file per paper (scripts can generate them from TSV/BibTeX) | A folder per paper (`index.md` + `cite.bib`); a CLI imports BibTeX |
| **CV** | CV and short resume compiled to PDF with LaTeX from the same data, locally or by a GitHub Action | CV page from JSON Resume or YAML; you supply the PDF | CV page in Markdown; you supply the PDF | CV page built from a YAML profile; you supply the PDF |
| **Deploy target** | Vercel (or any Next.js host) | GitHub Pages | GitHub Pages | Netlify, GitHub Pages, Vercel, Cloudflare Pages |
Choose al-folio or academicpages if you want Jekyll and GitHub Pages, and HugoBlox if you want
Hugo and its large library of page blocks. Choose this one if you'd rather work in React, keep
your content cleanly separated, and have your CV PDF built from the same data as the site.
## Quickstart
1. Click **Use this template** on GitHub (or clone the repo), then:
```bash
npm install
npm run setup # creates content/ from examples/ and asks for your name, links, sections
npm run dev # http://localhost:3000
```
2. Replace the example entries in `content/data/*.json` with yours. See
[docs/CONTENT.md](docs/CONTENT.md) for every field.
3. Deploy: import the repository in [Vercel](https://vercel.com). The default Next.js settings
work as they are.
Until `content/` exists, `npm run dev` and `npm run build` use the example site in `examples/`.
So a fresh clone, or the Deploy button above, shows a working demo straight away.
## What lives where
`content/` isn't in this repository: `npm run setup` creates it by copying
[`examples/content/`](examples/content), the fictional Jane Doe site in the demo. Browse that folder
to see what goes where.
| Path | What it is |
|---|---|
| `content/config.json` | Name, links, SEO, feature flags, theme, UI labels |
| `content/data/*.json` | Publications, education, experience, projects, skills, awards, news, talks, service |
| `content/about.md` | The About page |
| `content/blogs/*.md` | Blog posts (front matter: `title`, `date`, `tags`, `authors`, `image`) |
| `public/` | Your photo, images, and CV/resume PDFs, served as-is |
| `examples/` | The starter content that `npm run setup` copies |
| `schemas/` | JSON Schemas for everything in `content/` |
| `components/`, `pages/`, `lib/`, `styles/`, `scripts/` | Site code |
Your editor (VS Code, via `.vscode/settings.json`) autocompletes and checks `content/` files
against `schemas/`.
## Customising
**Sections.** Set `features.<name>` to `false` in `content/config.json`:
```json
"features": { "projects": false, "blogs": true, "talks": false }
```
All sections are on by default except `linktree`. The full table is in
[docs/CONTENT.md](docs/CONTENT.md#feature-flags).
**Look.** Pick any Google Fonts family for headings, and optionally an accent colour:
```json
"theme": { "headingFont": "Audiowide", "accentColor": "#0d6efd", "gradientStart": "#0d6efd", "gradientEnd": "#00d2ff" }
```
Without colours the site uses Bootstrap's default palette. Setting `gradientStart` and
`gradientEnd` adds a gradient to your name in the hero.
**Wording.** Button and heading text can be overridden under `labels`, for example
`"labels": { "resumeButton": "Download CV" }`.
**Homepage.** Work and project entries appear on the homepage unless they set
`"show_on_homepage": false`. The full pages always list everything.
## CV and resume
```bash
python3 scripts/generate_resumes.py # needs a LaTeX install (MacTeX, TeX Live)
```
This writes the PDFs named by `resume` and `resume_short` in your config into `public/`. Entries
opt in or out with `show_in_resume` and `show_in_resume_short`. On GitHub, the **Build Resumes**
workflow does the same on every push that changes `content/`.
## Scripts
| Command | What it does |
|---|---|
| `npm run setup` | First-time setup and identity wizard |
| `npm run dev` | Development server (regenerates `llms.txt` and RSS first) |
| `npm run validate` | Check `content/` against the schemas |
| `npm run build` | Validate, generate `llms.txt`/RSS, build, write the sitemap |
| `npm run update` | Merge the latest template into your site ([details](#getting-updates)) |
| `npm run indexnow` | After a deploy, tell Bing and others about your pages |
**Environment variables:** none are required. `SITE_URL` optionally overrides `siteUrl` for the
sitemap.
## Getting updates
Your content lives in `content/` and `public/`, and template updates only touch site code. To
pull the latest version, commit your work and run:
```bash
npm run update
```
This fetches the template and merges it. You only get conflicts in site files you edited yourself
(say, a component you customised), never in your content. [CHANGELOG.md](CHANGELOG.md) lists what
each release changes and anything you need to do.
Why a script: **Use this template** gives your repository fresh history with no commit in common
with the template, so a plain `git merge` would conflict on every file the template changed. Each
release carries a `.template-version` stamp. On the first update, the script uses it to find the
version you started from and links the two histories, so later merges are ordinary merges.
## Show your site
Built something with this template? Share it in the
[Show your site](https://github.com/kunpai/academic-site-template/discussions/1) discussion.
Questions go in [Discussions](https://github.com/kunpai/academic-site-template/discussions), and bugs in
[Issues](https://github.com/kunpai/academic-site-template/issues).
## Credits
<!-- credits:start -->
This template grew out of [Kunal Pai's website](https://www.kunpai.space), which he first built
with help from [Parth Shah](https://helloparthshah.vercel.app/) and
[Harshil Patel](https://harshilpatel.vercel.app/). All three of their sites are built on it.
<!-- credits:end -->
## License
The code is under the [MIT License](LICENSE). The example content in `examples/` is yours to
replace.
Explore similar templates
Compare previews and descriptions within the same stack and category.

tailwind-nextjs-starter-blog
A Next.js and Tailwind CSS blog starter template using Contentlayer for Markdown/MDX, with built-in SEO, code highlighting, and tags. It targets personal technical blogs and migration from Jekyll/Hugo to React, and supports one-click Vercel deployment.
Next.js · Blog

react-resume-template
A personal resume website template for software developers, built with Next.js, React, and TypeScript and styled with Tailwind CSS. Site content is driven by a single data file at /src/data/data.tsx, with types in dataDef.ts and images in src/images/.
Next.js · Portfolio

Nextjs-tailwindcss-blog-template
A Next.js blog styled with Tailwind CSS. The current branch processes Markdown with Velite; the earlier Contentlayer setup is retained in a separate historical branch.
Next.js · Blog

Next-js-Blog-Boilerplate
A blog starter built on Next.js 12 and Tailwind CSS 3, integrating TypeScript, ESLint, Prettier, and PostCSS.
Next.js · Blog

nextjs-blog-theme
A Next.js 15 and Tailwind CSS 4.x blog starter by Netlify, designed by Bejamas, with MDX support, dark/light theme switching, and environment-variable configuration. It includes a visual setup wizard for deploying to Netlify and manages content via local .mdx files.
Next.js · Blog

blog
A personal blog forked from Timlrx's tailwind-nextjs-starter-blog, built with Next.js, React, and Tailwind CSS. Content is stored as Markdown/MDX under data/, with site, author, navigation, and project data in separate files.
Next.js · Blog
