A living operating system for academic and research websites.
Designed for researchers, professors, and labs who want their public presence to stay current by default.
Built with Astro 5, Vue 3, and Tailwind CSS v4.
Getting Started • Features • Configuration • Content • Automation • Import Existing Sites • Contributing
ScholarOS is a free, open source academic website system that treats your site as a living research surface, not a static brochure.
It is built for people who publish papers, recruit students, run labs, maintain CVs, announce results, and share ideas continuously — and who are tired of manually updating websites to keep up.
ScholarOS combines a static, performance-first architecture with a CMS, automation workflows, and data-driven views so that your site stays accurate, fresh, and coherent with minimal effort.
You can use it for a personal academic site or a multi-member research lab.
The same system supports both.
Fork it, edit a few YAML files, push once, and your site deploys automatically.
Most academic websites fail for the same reason: maintenance cost.
Static templates are excellent for publishing content, but they break down when:
- multiple people need to edit the site
- publications need regular updates
- CVs drift out of sync with PDFs
- blog posts and announcements become infrequent
- labs grow, rotate members, and change focus
ScholarOS is designed around a different assumption:
Your website should update itself whenever possible,
and be easy to update when automation is not enough.
This is why ScholarOS is closer to an operating system than a theme.
-
CMS-driven editing
Publish blog posts, announcements, people profiles, and CV updates through a browser-based admin panel. No Git knowledge required for contributors. -
Automation-first design
Scheduled workflows keep publications, feeds, and generated artifacts up to date. Manual work is the exception, not the rule. -
Data as the source of truth
Publications, CVs, people, and research areas live in structured YAML and Markdown, not hard-coded layouts. -
Static by default, interactive where needed
Astro’s island architecture keeps pages fast and stable, while Vue powers search, filters, forms, and admin-facing interactions. -
Built to grow with you
ScholarOS starts simple, but supports future extensions such as dashboards, interactive demos, internal pages, and richer automation without replatforming.
ScholarOS supports two modes controlled by a single configuration flag:
- Personal mode for individual researchers
- Lab mode for research groups with many members
The same content model, automation, and workflows power both.
You do not need separate templates.
ScholarOS respects the work you have already done.
If you are currently using an established academic template such as al-folio, ScholarOS can import your existing content — publications, posts, projects, news, and data — into its own structure.
This is an opt-in, content-only import:
- no scraping
- no copying of theme code
- full license and attribution preserved
- your data remains yours
The goal is to reduce switching friction, not to replace or devalue existing projects.
- Researchers who want their site to reflect their current work
- Labs that need multiple contributors without chaos
- Academics who want automation without servers
- Groups who value clarity, longevity, and provenance
If your website should behave more like a research instrument than a static page, ScholarOS is designed for you.
Built with care for the academic community.
If ScholarOS helps you, please consider giving it a star.
- Getting Started
- Features
- Two Modes: Personal & Lab
- Publications
- Blog & External Feeds
- People Directory
- CV / Resume
- Research Areas
- Projects
- News & Announcements
- Talks & Presentations
- Open Positions
- GitHub Repositories
- Global Search
- Dark Mode
- Hero Backgrounds
- Newsletter Signup
- Contact & Application Forms
- Analytics
- SEO & Structured Data
- RSS Feed
- CMS Admin Panel
- Cookie Consent (GDPR)
- Internationalization (i18n)
- View Transitions
- Configuration
- Content Collections
- Project Structure
- Pages
- Automation Workflows
- Deployment
- Migration from al-folio
- Tech Stack
- Contributing
- Acknowledgments
- License
- Click the "Use this template" button at the top of the repository
- Name your repository
YOUR_USERNAME.github.io(this enables GitHub Pages automatically athttps://YOUR_USERNAME.github.io) - Wait about a minute -- GitHub Actions will build and deploy your site
- A setup issue is automatically created in your new repository with a checklist to guide your initial configuration
- Go to
https://YOUR_USERNAME.github.io/adminto open the CMS and start customizing -- change your name, photo, bio, publications, and everything else through the browser
That's it. No terminal, no local install, no code editing. The CMS handles content, and GitHub Actions handles deployment.
Tip: If you don't want a
username.github.iosite, you can name the repo anything (e.g.,my-lab-site). Your site will be available athttps://YOUR_USERNAME.github.io/my-lab-site/. Just make sure to go to Settings > Pages > Source and select GitHub Actions.
If you prefer working locally, want to customize components, or need to run automation scripts:
# Clone your repository (after using the template above, or fork directly)
git clone https://github.com/YOUR_USERNAME/YOUR_REPO.git
cd YOUR_REPO
# Install dependencies
pnpm install
# Start development server with hot-reload
pnpm devYour site will be running at http://localhost:4321.
| What you want to change | Where to edit |
|---|---|
| Site name, mode, description, socials | config/site.yml |
| Colors, fonts, hero background | config/site.yml (colors, fonts, hero sections) |
| Research areas | config/research.yml |
| CV / resume | config/cv.yml |
| Publications | src/content/publications/*.md |
| Blog posts | src/content/posts/*.md |
| Team members | src/content/people/*.md |
| News / announcements | src/content/announcements/*.md |
| Projects | src/content/projects/*.md |
| Open positions | src/content/positions/*.md |
| Talks | src/content/talks/*.md |
| External RSS feeds | config/feeds.yml |
| Navigation menu | config/site.yml (nav section) |
| Page layouts & components | src/layouts/ and src/components/ |
pnpm dev # Start development server
pnpm build # Build for production
pnpm preview # Preview production build locally
pnpm sync:feeds # Sync external RSS feeds
pnpm sync:scholar # Sync Google Scholar publications
pnpm render:cv # Generate CV PDF
pnpm generate:keywords # Generate SEO keywords from content
pnpm migrate:al-folio # Import content from an al-folio siteScholarOS adapts its language, layout, and navigation based on a single config flag:
# config/site.yml
siteMode: 'personal' # or "lab"| Personal Mode | Lab Mode | |
|---|---|---|
| Homepage hero | Your name & title | Lab name & mission |
| Publications | "My publications" | "Our publications" |
| People page | Hidden or minimal | Full team directory with roles |
| Positions page | "Work with me" | "Join our lab" with application forms |
| About section | Personal bio | Lab overview |
A dedicated publications page with advanced filtering:
- Filter by type -- journal, conference, preprint, workshop, thesis, book chapter
- Filter by year -- dropdown year selector
- Keyword search -- real-time search across titles, authors, venues
- Author highlighting -- your name is automatically bolded
- One-click BibTeX copy -- copy citation to clipboard
- PDF & DOI links -- direct links to papers
- List & Grid views -- toggle between compact and card layouts
- Thumbnail images -- optional paper thumbnails with automatic optimization
Full-featured blog with support for external content aggregation:
- Markdown & MDX -- write posts in Markdown with optional JSX components
- LaTeX math -- native support via remark-math and MathJax
- Code highlighting -- GitHub-themed syntax highlighting (light & dark)
- Tags -- categorize posts with filterable tags
- Draft support -- mark posts as drafts to exclude from production
- External feeds -- aggregate content from Medium, Substack, or any RSS source
- RSS output --
/feed.xmlendpoint for subscribers
Showcase your team with rich profile cards:
- Role-based grouping -- PI, Postdoc, PhD, Masters, Undergrad, Research Assistant, Visiting, Alumni
- Profile photos -- with configurable shapes (rectangular, circular, oval)
- Social links -- GitHub, Google Scholar, Twitter/X, LinkedIn, ORCID, Mastodon, Bluesky
- Research interests -- displayed as tags on each profile
- Individual profile pages -- dedicated page per team member with full bio
- Email obfuscation -- spam-protected email display
A structured CV page driven entirely by YAML:
# config/cv.yml
cv:
name: 'Prof. Jane Smith'
sections:
education:
- institution: 'MIT'
degree: 'Ph.D.'
area: 'Computer Science'
experience:
- company: 'Stanford University'
position: 'Associate Professor'
publications:
- title: 'Your Paper Title'
journal: 'NeurIPS 2025'
awards:
- label: 'Best Paper Award, ACL 2023'
skills:
- label: 'Languages'
details: 'Python, TypeScript, C++'- PDF generation -- automated PDF rendering via GitHub Actions using RenderCV
- Multiple themes -- classic, modern, and more
- Download button -- visitors can download your CV as PDF
A dedicated research overview page configured via YAML:
# config/research.yml
areas:
- title: 'Natural Language Processing'
description: 'Developing models that understand and generate human language...'
tags: ['Language Models', 'Multilingual NLP', 'Text Generation']Automatically displays related active projects and featured publications for each area.
Showcase research projects, software tools, and datasets:
- Type categories -- software, dataset, benchmark, hardware, other
- Status indicators -- active, completed, upcoming
- Links -- repository URL, paper URL, live demo
- Team members -- link to people profiles
- Tags -- filterable project tags
Keep visitors updated with a news feed:
- Categories -- paper, grant, award, talk, media, general
- Pinned items -- pin important announcements to the top
- Emoji indicators -- visual emoji badges for quick scanning
- Category filtering -- browse news by category
- Homepage widget -- latest announcements on the homepage
A dedicated page for conference talks, invited lectures, and seminars:
- Talk types -- Conference Talk, Invited Talk, Seminar, Tutorial, Workshop, Keynote, Panel
- Slides & video links -- direct links to presentation materials
- Event & location -- where and when you presented
Recruit new team members with dedicated position listings:
- Position types -- PhD, Postdoc, Masters, Undergrad, Research Assistant, Visiting
- Status tracking -- open / closed with deadline display
- Application form -- built-in application form (via Web3Forms)
- Detail pages -- full description with requirements and benefits
Showcase your lab's open-source work:
- GitHub stats card -- contribution streak, language breakdown
- Profile trophies -- GitHub achievement badges
- Pinned repos -- highlight your most important repositories
- Team activity -- show GitHub profiles of all team members
- Self-hosted support -- use your own github-readme-stats instance
Full-site search accessible from any page:
- Keyboard shortcut --
Cmd+K(Mac) orCtrl+K(Windows/Linux) - Instant results -- real-time filtering as you type
- Cross-content -- searches across blog posts, publications, people, projects, news, positions, and talks
- Mobile-friendly -- dedicated search button on mobile
First-class dark mode support:
- System-aware -- respects
prefers-color-schemeby default - Manual toggle -- sun/moon toggle in the header
- Persistent -- remembers your choice via localStorage
- Configurable default -- set
light,dark, orsystemas the default - No flash -- inline script applies theme before first paint
Five hero background options for the homepage:
| Type | Description |
|---|---|
image |
Static image with light/dark variants |
video |
Background video with poster fallback |
pattern |
SVG patterns: dots, grid, waves, diagonal, hexagons |
animation |
GSAP-powered: particles, gradient-morph, geometric, wave-lines, or custom |
none |
Clean, minimal solid color |
hero:
type: 'animation'
animation:
preset: 'wave-lines' # particles | gradient-morph | geometric | wave-lines | customBuilt-in email capture in the footer:
- Web3Forms integration -- free, no-backend email collection
- Customizable copy -- set heading and description text
- Success/error feedback -- real-time form validation
Ready-to-use forms powered by Web3Forms:
- Contact form -- name, email, subject, message
- Application form -- for position applicants on position detail pages
- No backend needed -- emails delivered via Web3Forms API
- Spam protection -- built-in honeypot and validation
Plug in your preferred analytics provider (all opt-in):
| Provider | Config Key |
|---|---|
| Google Analytics (GA4) | googleAnalytics |
| Google Tag Manager | googleTagManager |
| Cronitor RUM | cronitor |
| OpenPanel | openpanel |
| Pirsch | pirsch |
| Microsoft Clarity | microsoftClarity |
All analytics scripts are blocked until cookie consent is given (when GDPR banner is enabled).
Comprehensive search engine optimization:
- JSON-LD structured data -- Person, ResearchOrganization, BlogPosting, ScholarlyArticle, BreadcrumbList
- OpenGraph & Twitter cards -- rich previews when sharing links
- Automatic sitemap -- generated at
/sitemap-index.xml - Configurable meta tags -- keywords, Google/Bing verification codes
- Automated keyword generation -- GitHub Actions workflow analyzes your content and generates optimized keywords
Auto-generated RSS 2.0 feed at /feed.xml with <link> auto-discovery in the page head. Includes all published blog posts (excludes drafts).
Built-in content management system at /admin:
- Visual editor -- edit content without touching code
- Collection management -- full CRUD for all content types
- Media uploads -- image and file management
- Access control -- configurable admin user list
Optional GDPR-compliant cookie consent banner:
cookieConsent: true # false to disableWhen enabled, analytics scripts are blocked until the visitor accepts.
Built-in support for any language and text direction:
lang: 'en' # BCP 47 language tag (en, fa, ar, zh, de, etc.)
direction: 'ltr' # "ltr" or "rtl"The entire layout flips for RTL languages like Arabic, Persian, and Hebrew.
Smooth, app-like page transitions powered by Astro's ClientRouter:
- Fade animations -- seamless navigation between pages
- Theme persistence -- dark mode preserved across transitions
- No full-page reload -- instant navigation feel
All configuration lives in the config/ directory. No code changes needed.
The main configuration file is config/site.yml:
# Mode
siteMode: 'personal' # "personal" or "lab"
# Identity
title: 'My Research Lab'
author: 'Prof. Jane Smith'
labName: 'Smith Research Lab'
university: 'MIT'
department: 'Department of Computer Science'
siteUrl: 'https://your-site.github.io'
description: 'A brief description of your research.'
# Default theme
defaultTheme: 'system' # "light" | "dark" | "system"
# Image shape for photos
imageShape: 'circular' # "rectangular" | "circular" | "oval"Customize the visual identity with hex colors and Google Fonts:
colors:
light:
primary: '#2c5282'
secondary: '#06b6d4'
dark:
primary: '#22d3ee'
secondary: '#2c5282'
fonts:
families:
sans: 'Inter'
serif: 'Playfair Display'
mono: 'JetBrains Mono'
sizes:
base: '1rem'
h1: '2.25rem'
h2: '1.5rem'ScholarOS automatically generates a full shade palette (50-950) from your primary and secondary colors using CSS color-mix().
Fully customizable navigation menu:
nav:
- label: 'Research'
href: '/research'
- label: 'Publications'
href: '/publications'
- label: 'Blog'
href: '/blog'
- label: 'CV'
href: '/cv'
- label: 'Contact'
href: '/contact'An optional top bar is also available:
topBar:
enabled: true
text: 'Department of Computer Science, MIT'
links:
- label: 'Apply Now'
href: '/positions'Connect all your academic profiles:
socials:
email: 'you@university.edu'
github: 'https://github.com/you'
scholar: 'https://scholar.google.com/citations?user=YOUR_ID'
twitter: 'https://twitter.com/you'
linkedin: 'https://linkedin.com/in/you'
orcid: 'https://orcid.org/0000-0000-0000-0000'
mastodon: 'https://mastodon.social/@you'
bluesky: 'https://bsky.app/profile/you.bsky.social'
website: 'https://your-other-site.com'Control which sections appear on the homepage and their order:
homepageSections:
- id: hero
enabled: true
- id: about
enabled: true
- id: news
enabled: true
- id: publications
enabled: true
- id: blog
enabled: false # hide the blog sectionAll content is stored as Markdown files in src/content/:
| Collection | Directory | Schema Fields |
|---|---|---|
| People | src/content/people/ |
name, role, title, photo, email, socials, researchInterests, active |
| Publications | src/content/publications/ |
title, authors, venue, year, doi, url, pdf, bibtex, type, featured, abstract, image |
| Blog Posts | src/content/posts/ |
title, date, author, excerpt, coverImage, tags, draft |
| Announcements | src/content/announcements/ |
title, date, category, pinned, emoji, excerpt |
| Projects | src/content/projects/ |
title, type, status, image, url, repoUrl, team, tags |
| Positions | src/content/positions/ |
title, type, status, deadline, excerpt, tags, contact |
| Talks | src/content/talks/ |
title, event, date, location, type, slidesUrl, videoUrl |
| Feeds | src/data/feeds.json |
title, link, date, source, excerpt |
Create src/content/publications/my-paper.md:
---
title: 'Your Paper Title'
authors:
- 'Jane Smith'
- 'Alex Chen'
venue: 'NeurIPS 2025'
year: 2025
type: 'conference' # journal | conference | preprint | workshop | thesis | book-chapter
doi: '10.1234/example'
url: 'https://arxiv.org/abs/2025.00001'
pdf: 'https://arxiv.org/pdf/2025.00001'
bibtex: |
@inproceedings{smith2025paper,
title={Your Paper Title},
author={Smith, Jane and Chen, Alex},
booktitle={NeurIPS},
year={2025}
}
featured: true
---
Optional abstract or notes in Markdown.Create src/content/people/jane-smith.md:
---
name: 'Jane Smith'
role: 'pi' # pi | postdoc | phd | masters | undergrad | research-assistant | visiting | alumni
title: 'Associate Professor'
email: 'jane@university.edu'
photo: './photos/jane.jpg'
socials:
github: 'https://github.com/janesmith'
scholar: 'https://scholar.google.com/citations?user=XXXX'
twitter: 'https://twitter.com/janesmith'
orcid: 'https://orcid.org/0000-0000-0000-0000'
researchInterests:
- 'Natural Language Processing'
- 'AI Safety'
sortOrder: 1
active: true
---
Your full bio in Markdown. This appears on the individual profile page.Create src/content/posts/my-first-post.md:
---
title: "My First Blog Post"
date: 2025-01-15
author: "Jane Smith"
excerpt: "A brief summary of the post."
tags:
- "Research"
- "NLP"
draft: false
---
Your blog post content in **Markdown** or MDX.
You can use $\LaTeX$ math: $E = mc^2$
```python
# And code blocks with syntax highlighting
def hello():
print("Hello, world!")
---
## Project Structure
ScholarOS/ ├── .github/workflows/ # CI/CD automation │ ├── deploy.yml # Build & deploy to GitHub Pages │ ├── migrate-al-folio.yml # One-click al-folio migration │ ├── sync-feeds.yml # Sync external RSS feeds │ ├── sync-scholar.yml # Sync Google Scholar publications │ ├── render-cv.yml # Generate CV PDF │ ├── generate-seo.yml # Auto-generate SEO keywords │ ├── sync-template.yml # Sync upstream template updates │ └── template-init.yml # First-time setup ├── config/ # All configuration (YAML) │ ├── site.yml # Main site config │ ├── cv.yml # CV / resume data │ ├── research.yml # Research areas │ ├── feeds.yml # External RSS feed sources │ ├── scholar.yml # Google Scholar sync config │ └── cms.yml # CMS panel config ├── public/ # Static assets (served as-is) ├── scripts/ # Automation scripts │ ├── migrate-al-folio.ts # al-folio migration │ ├── sync-feeds.ts # RSS feed aggregation │ ├── sync-scholar.py # Google Scholar sync │ ├── render-cv.py # CV PDF generation │ └── generate-seo-keywords.ts # SEO keyword extraction ├── src/ │ ├── components/ │ │ ├── astro/ # Static components (zero JS) │ │ └── vue/ # Interactive islands (hydrated on demand) │ ├── content/ # Markdown content collections │ │ ├── announcements/ │ │ ├── people/ │ │ ├── positions/ │ │ ├── posts/ │ │ ├── projects/ │ │ ├── publications/ │ │ └── talks/ │ ├── layouts/ # Page layouts │ ├── lib/ # Utilities, config loader, types │ ├── pages/ # Route pages │ └── styles/ # Global CSS ├── astro.config.mjs ├── tailwind.config.mjs ├── tsconfig.json └── package.json
---
## Pages
| Route | Description |
|-------|-------------|
| `/` | Homepage with hero, about, news, publications, and blog widgets |
| `/research` | Research areas with related projects and publications |
| `/people` | Team directory grouped by role |
| `/people/[id]` | Individual member profile |
| `/publications` | Filterable publication list with search, year/type filters |
| `/projects` | Project showcase with status and type indicators |
| `/projects/[id]` | Project detail page |
| `/news` | News and announcements with category filtering |
| `/news/[id]` | Individual announcement |
| `/news/category/[cat]` | News filtered by category |
| `/blog` | Blog with posts and aggregated external feeds |
| `/blog/[id]` | Individual blog post with ToC and prose styling |
| `/blog/tag/[tag]` | Blog posts filtered by tag |
| `/talks` | Talks and presentations timeline |
| `/positions` | Open positions with application status |
| `/positions/[id]` | Position detail with application form |
| `/repositories` | GitHub stats, trophies, and pinned repos |
| `/cv` | CV page with PDF download |
| `/contact` | Contact form |
| `/join` | Lab recruitment page |
| `/feed.xml` | RSS feed |
| `/admin` | CMS admin panel |
---
## Automation Workflows
ScholarOS includes 8 GitHub Actions workflows that keep your site up to date automatically:
| Workflow | Trigger | What it Does |
|----------|---------|--------------|
| **Deploy** | Push to `main` | Builds the site and deploys to GitHub Pages |
| **Migrate al-folio** | `site.yml` change / manual | Migrates content from an al-folio repository |
| **Sync Feeds** | Scheduled / manual | Fetches latest posts from external RSS feeds |
| **Sync Scholar** | Scheduled / manual | Pulls publications from your Google Scholar profile |
| **Render CV** | `cv.yml` change / manual | Generates a PDF from your CV YAML using RenderCV |
| **Generate SEO** | Content change / manual | Analyzes content and generates optimized keywords |
| **Sync Template** | Manual | Pulls latest updates from upstream ScholarOS template |
| **Template Init** | First use | Initializes the template with your configuration |
---
## Deployment
### GitHub Pages (Recommended)
1. Go to **Settings > Pages > Build and deployment > Source** and select **GitHub Actions**
2. Push to `main` -- the included workflow handles everything
3. Your site will be live at `https://YOUR_USERNAME.github.io/YOUR_REPO/`
### Netlify
1. Connect your repository on [Netlify](https://netlify.com)
2. Build settings are auto-detected from `netlify.toml`
### Cloudflare Pages
1. Connect your repository on [Cloudflare Pages](https://pages.cloudflare.com)
2. Build command: `pnpm build`
3. Build output directory: `dist`
4. Node.js version: `22`
### Vercel
1. Import your repository on [Vercel](https://vercel.com)
2. Framework preset: **Astro**
3. Everything else is auto-detected
---
## Migration from al-folio
Already using [al-folio](https://github.com/alshedivat/al-folio)? ScholarOS can migrate your content automatically.
### Automatic Migration (Recommended)
1. Fork or create a new ScholarOS repository
2. Edit `config/site.yml` and set:
```yaml
alfolioRepo: "https://github.com/YOUR_USERNAME/YOUR_AL_FOLIO_REPO"
- Push the change. The migration workflow will:
- Clone your al-folio repository
- Convert
_data/configs,_bibliography/,_projects/,_posts/,_news/, and team data - Migrate images and assets
- Commit the converted content
- Clear the
alfolioRepofield - Trigger a fresh deploy
# Set the al-folio repo URL in config/site.yml, then run:
pnpm migrate:al-folio| Technology | Purpose |
|---|---|
| Astro 5 | Static site generator with island architecture |
| Vue 3 | Interactive components (search, filters, forms) |
| Tailwind CSS v4 | Utility-first styling with CSS variables |
| MDX | Enhanced Markdown with component support |
| TypeScript | Type-safe configuration and utilities |
| Sharp | Automatic image optimization |
| GSAP | Hero background animations |
| Web3Forms | Contact & newsletter forms (no backend) |
| RenderCV | PDF CV generation from YAML |
We welcome contributions of all kinds! Whether it's fixing a typo, adding a new feature, improving documentation, or reporting a bug -- every contribution helps make ScholarOS better for the academic community.
Please read our Contributing Guide for details on:
- Setting up the development environment
- Finding good first issues
- Submitting pull requests
- Code style and conventions
ScholarOS was inspired by al-folio, a beautiful and widely-adopted Jekyll theme for academics. al-folio set the standard for what an academic website template should include, and its influence on the features and content model of ScholarOS is significant. If you're looking for a mature, battle-tested Jekyll-based solution, al-folio is an excellent choice and we encourage you to check it out.
ScholarOS takes a different architectural approach -- Astro's island architecture, YAML-driven configuration, and GitHub Actions automation -- but the goal is the same: give researchers a professional web presence with minimal friction. We are grateful to the al-folio maintainers and contributors for their work.
ScholarOS is open source under the MIT License.
You are free to use this template for your personal or lab website. A link back to ScholarOS in your footer is appreciated but not required.
Made with care for the academic community.
If ScholarOS helps you, please consider giving it a star.
