A professional academic website built with Jekyll and optimized for seamless Obsidian integration. Features Computer Modern typography, responsive design, and complete content management through an Obsidian vault.
- Complete Obsidian Integration: All content managed through Obsidian vault with automated Jekyll publishing
- Academic Typography: Professional Computer Modern fonts for that LaTeX-quality appearance
- Responsive Design: Mobile-first design with clean, academic aesthetics
- Rich Content Types: Dedicated collections for publications, experience, education, talks, and teaching
- Automated Deployment: GitHub Actions workflow for continuous deployment to GitHub Pages
- SEO Optimized: Built-in SEO tags, structured data, and RSS feeds
- Professional Layout: Header contact information, refined navigation, and print-friendly styles
Website URL: https://mechanicpanic.github.io/academic-website/
- Click the green "Use this template" button above
- Create your new repository (e.g.,
your-username/academic-website) - Clone your new repository locally
- Edit
_config.yml- Add your name, email, social links - Edit
vault/_pages/index.md- Write your bio - Add content using Obsidian or directly editing markdown files
- See
USER_CONFIG.mdfor detailed customization guide
- Push to GitHub
- Enable GitHub Pages in repository Settings β Pages
- Your site will be live at
https://your-username.github.io/your-repo-name/
- Manual: Run
./update-design.shto get latest template improvements - Automatic: Enable weekly update checks (see Automatic Updates)
- Your content stays safe, only design files update
- Static Site Generator: Jekyll 4.3+
- Content Management: Obsidian vault with templates
- Typography: Computer Modern web fonts via CDN
- Styling: Modern SCSS with CSS custom properties
- Deployment: GitHub Actions + GitHub Pages
- Version Control: Git with automated CI/CD
your-academic-website/ # Your repository from template
βββ _config.yml # π― YOUR SETTINGS - Edit this!
βββ _layouts/ # π§ Template files (updated via script)
β βββ default.html # Base layout with header/nav/footer
β βββ publication.html # Publication detail page
β βββ experience.html # Experience detail page
β βββ talk.html # Talk detail page
β βββ teaching.html # Teaching detail page
βββ _plugins/ # π§ Jekyll plugins (Obsidian links, etc.)
βββ assets/ # π¨ DESIGN ASSETS ONLY
β βββ css/main.scss # Styles (customize colors here)
β βββ images/ # Design images (favicon, etc.)
βββ Gemfile # Ruby dependencies
βββ vault/ # π YOUR CONTENT - All yours!
β βββ assets/ # π YOUR FILES - Managed in Obsidian
β β βββ pdfs/ # π Your PDF files
β β βββ images/ # πΌοΈ Your images & photos
β β βββ slides/ # π Your presentation slides
β βββ _pages/ # Website pages
β β βββ index.md # π Homepage - Write your bio here
β β βββ cv.md # π Your CV page
β β βββ publications.md # Publications listing page
β β βββ research.md # Research overview page
β β βββ teaching.md # Teaching portfolio page
β β βββ talks.md # Talks & presentations page
β β βββ contact.md # Contact information page
β βββ _publications/ # π Add your papers here
β βββ _experience/ # π Add your work experience
β βββ _education/ # π Add your degrees
β βββ _talks/ # π Add your presentations
β βββ _teaching/ # π Add your courses
β βββ .obsidian/ # Obsidian configuration
β βββ templates/ # Content creation templates
βββ .github/workflows/jekyll.yml # π§ Automated deployment
βββ update-design.sh # π Design update script
βββ USER_CONFIG.md # π Your customization guide
βββ README.md # This documentation
Legend:
- π YOUR CONTENT - Edit freely, these are your files in
vault/ - π YOUR FILES - PDFs, images, slides managed in Obsidian (
vault/assets/) - π― YOUR SETTINGS - Customize for your site
- π¨ DESIGN ASSETS - CSS and design images (stay in
assets/) - π§ TEMPLATE FILES - Updated via
update-design.sh - π UPDATE TOOLS - Keep your design current
Key Separation:
vault/assets/- Your content files (PDFs, images, slides) - managed in Obsidianassets/- Design files (CSS, favicon) - not in Obsidian
-
Install Homebrew (if not already installed):
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" -
Install Ruby via Homebrew:
brew install ruby
-
Add Homebrew Ruby to your PATH: Add this to your
~/.zshrc(or~/.bash_profileif using bash):export PATH="/opt/homebrew/opt/ruby/bin:$PATH" export LDFLAGS="-L/opt/homebrew/opt/ruby/lib" export CPPFLAGS="-I/opt/homebrew/opt/ruby/include" export PKG_CONFIG_PATH="/opt/homebrew/opt/ruby/lib/pkgconfig"
-
Reload your shell:
source ~/.zshrc
-
Verify installation:
which ruby # Should show: /opt/homebrew/opt/ruby/bin/ruby ruby -v # Should show: ruby 3.x.x
-
Install rbenv via Homebrew:
brew install rbenv ruby-build
-
Initialize rbenv:
rbenv init
-
Add rbenv to your shell (add to
~/.zshrc):eval "$(rbenv init - zsh)"
-
Install and set Ruby version:
rbenv install 3.2.0 rbenv global 3.2.0
-
Verify installation:
which ruby # Should show: /Users/yourusername/.rbenv/shims/ruby ruby -v # Should show: ruby 3.2.0
After installing Ruby with either method:
gem install bundlerIf you see permission errors:
- β Don't use
sudowith gem commands - β Use Homebrew or rbenv as described above
If bundle install fails:
# Set bundle to install gems locally
bundle config set --local path 'vendor/bundle'
bundle installCheck your Ruby setup:
# Verify you're not using system Ruby
which ruby
# Should NOT show: /usr/bin/ruby
# Check gem environment
gem env
# Look for paths under /opt/homebrew or ~/.rbenv-
Use this template to create your repository
- Click "Use this template" button
- Clone YOUR new repository locally
-
Install Jekyll dependencies
cd your-academic-website bundle install -
Customize your site
# Edit your basic settings nano _config.yml # Edit your homepage bio nano vault/_pages/index.md
-
Run local development server
bundle exec jekyll serve --host 127.0.0.1 --port 4000 -
View the site Open http://127.0.0.1:4000 in your browser
- Open Obsidian
- Open vault: Point to
your-academic-website/vault/ - Use templates: Cmd/Ctrl+P β "Templater: Create new note from template"
- Available templates:
- Publication.md - Research papers and publications
- Experience.md - Professional positions
- Education.md - Academic degrees
- Talk.md - Presentations and seminars
- Teaching.md - Courses and educational activities
- Page.md - General website pages
π‘ Pro tip: All your content lives in the vault/ directory, making it easy to manage everything through Obsidian while keeping design updates separate!
This template fully supports Obsidian-style wikilinks:
- β
Basic links:
[[Page Name]]β links to page - β
Custom text:
[[Page Name|Display Text]]β shows "Display Text" - β Works with all content: pages, publications, talks, etc.
- β
Works locally: Full support with
jekyll serveand in production
Example:
Check out my [[Publications]] or read about my [[Research|research interests]].
See my recent talk on [[The Future of AI: Scalable and Sustainable Machine Learning|sustainable AI]].- In Obsidian: Cmd/Ctrl+P β "Templater: Create new note from template"
- Select "Publication" template
- Fill in the front matter:
--- layout: publication title: "Your Paper Title" date: 2024-01-15 year: 2024 authors: - "Your Name" - "Co-author Name" venue: "Conference/Journal Name" type: "conference" status: "published" abstract: | Brief description of your research... keywords: - "keyword1" - "keyword2" doi: "10.1000/123456" arxiv: "2401.12345" pdf: "/vault/assets/pdfs/paper.pdf" code: "https://github.com/user/repo" ---
- Save in
vault/_publications/directory - Add PDF to
vault/assets/pdfs/if you have one - Jekyll automatically rebuilds the site
All your content files are in the vault/ directory, making them accessible in Obsidian:
- Copy your PDF to
vault/assets/pdfs/ - Reference it in your markdown:
pdf: "/vault/assets/pdfs/filename.pdf"
- Copy images to
vault/assets/images/ - Use in markdown:
 - For profile photo: Update path in
_config.yml
- Copy presentation files to
vault/assets/slides/ - Link in talks:
slides: "/vault/assets/slides/presentation.pdf"
Note: All files in vault/assets/ are:
- β Visible and manageable in Obsidian
- β
Automatically served by Jekyll at
/vault/assets/... - β Preserved during design updates
- β Part of your content, not the template
Edit academic-website/docs/_config.yml:
title: "Your Name"
subtitle: "Your Position"
email: [email protected]
orcid: 0000-0000-0000-0000
scholar: your_scholar_id
github_username: your_username
linkedin: your_linkedinEdit academic-website/docs/assets/css/main.scss:
:root {
--primary-text: #2d3748; // Dark gray-blue
--secondary-text: #4a5568; // Medium gray
--accent-color: #5a67d8; // Muted indigo
--background: #ffffff; // Pure white
--surface: #f7fafc; // Very light gray
}- Header:
academic-website/docs/_layouts/default.html - Publication display:
academic-website/docs/_layouts/publication.html - Page structure: Individual layout files in
_layouts/
The site automatically deploys to GitHub Pages via GitHub Actions:
- Push changes to the
masterbranch - GitHub Actions builds the Jekyll site with custom plugins enabled
- Deploys to
https://yourusername.github.io/academic-website/
Important: The GitHub Actions workflow enables custom Jekyll plugins, which means:
- β
Obsidian wikilinks (
[[Page Name]]) work automatically - β LaTeX math rendering with MathJax
- β All custom features are supported
- β No manual build required
cd academic-website/docs
bundle exec jekyll build
# Upload _site/ directory to your web serverThe template receives regular updates with new features, bug fixes, and improvements. You can stay current in two ways:
Run the update script whenever you want:
./update-design.shWhat it does:
- β Checks your current version vs latest
- β Shows changelog of what's new
- β Detects if you've customized design files
- β Updates only template files, preserves your content
- β Creates timestamped backup
- β Migrates old structures automatically
Options:
./update-design.sh --help # Show all options
./update-design.sh --check-only # Just check, don't update
./update-design.sh --force # Force updateRecommended for hassle-free maintenance!
The template includes a GitHub Actions workflow that can automatically check for updates and create PRs.
- Edit
.github/workflows/template-update.yml - Uncomment the schedule trigger:
schedule: - cron: '0 0 * * 0' # Weekly on Sunday
- Commit and push
That's it! The workflow will now:
- β Check weekly for template updates
- β Create a PR when updates are available
- β Show changelog and what changed
- β Auto-merge if safe (no conflicts)
- β Request review if you've customized design files
When you haven't customized design files:
- PR is created automatically
- Auto-merge is enabled
- PR merges itself after checks pass
- Your site is updated seamlessly
When you have customized design files:
- PR is created for your review
- Shows which files conflict
- Auto-merge is disabled
- You review and merge when ready
You can also trigger updates manually:
- Go to Actions tab in your repository
- Select Check for Template Updates
- Click Run workflow
- Optionally enable "Force update"
Check your current version:
cat VERSIONView changelog:
cat CHANGELOG.mdOr visit the template repository for the latest changes.
Updated files (design/template):
_layouts/- HTML templates_plugins/- Jekyll pluginsassets/css/- Stylesheets.github/workflows/- GitHub Actionsupdate-design.sh- Update script itselfVERSIONandCHANGELOG.md
Preserved files (your content):
vault/- All your content and files_config.yml- Your configurationGemfile.lock- Your dependencies- All backups in
.design-backup/
If you've customized design files and an update conflicts:
- Review the PR - See what changed in the template
- Test locally - Checkout the branch and test:
git fetch git checkout template-update-XXXXXXXX bundle exec jekyll serve - Merge conflicts - Resolve any conflicts manually
- Merge the PR - Once satisfied, merge it
The update script creates backups, so you can always revert:
# Revert to backup
cp -r .design-backup/YYYYMMDD_HHMMSS/* .The template includes a custom Jekyll plugin (_plugins/obsidian_wikilinks.rb) that:
- Scans all markdown files for
[[wikilink]]patterns - Converts them to proper markdown links before Jekyll processes them
- Automatically finds the correct URL for each linked page
Features:
- Works both locally (
jekyll serve) and in production (GitHub Actions) - No setup needed - plugin is included and ready to use
- Automatically resolves page titles to URLs
- Supports all content types: pages, publications, talks, etc.
- Add
CNAMEfile to root directory:yourdomain.com - Configure DNS to point to GitHub Pages
- Enable HTTPS in repository settings
Add to _config.yml:
google_analytics: "G-XXXXXXXXXX"The site includes print-optimized CSS for generating PDF versions of your CV directly from the browser.
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
This project is open source and available under the MIT License.
- Documentation: Check the comprehensive guides in this README
- Issues: Report bugs and request features via GitHub Issues
- Discussions: Join conversations in GitHub Discussions
- Jekyll: Static site generator that powers the website
- Obsidian: Outstanding note-taking app that enables seamless content management
- Computer Modern Fonts: Beautiful typography courtesy of dreampulse/computer-modern-web-font
- GitHub Pages: Free hosting for academic websites
Built with β€οΈ for the academic community
Creating beautiful, maintainable academic websites should be simple. This template provides everything you need to showcase your research and professional work with the elegance of LaTeX typography and the convenience of modern web technologies.