A terminal-themed personal academic website with a CSV-based content management system. Edit your publications, news, CV, and repos in spreadsheets, push to GitHub, and a GitHub Actions workflow builds and deploys the site automatically. No databases, no frameworks, no CMS logins.
Live: orijitghosh.github.io
- Dark/light theme toggle with film-grain texture overlay
- Colorblind-accessible palettes (deuteranopia, protanopia, tritanopia)
- Responsive hamburger nav on mobile
- Terminal-style easter egg (try typing
helpin the console widget) - Page transition animations, typing effect on the home page
- Print-friendly CV layout
| Page | Content source |
|---|---|
| about.sh (home) | config.yaml (bio, tags) + data/news.csv + data/publications.csv (selected) |
| publications | data/publications.csv — auto-sorted by year, author name auto-bolded |
| repositories | data/repositories.csv — language color dots from config |
| cv | data/education.csv + data/experience.csv + data/awards.csv |
| teaching | data/service.csv — category column splits into editorial/service/mentoring/teaching |
- Python 3.8+
- Git
git clone https://github.com/orijitghosh/orijitghosh.github.io.git my-site
cd my-site
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt-
Edit
config.yaml— replace my name, bio, email, affiliation, tags, Google Scholar URL, etc. with yours. -
Edit the CSV files in
data/— they're already there with my data as examples. Replace the rows with your own:File Columns publications.csvyear, title, authors, venue, url, selected, notenews.csvdate, descriptionrepositories.csvname, description, url, languageseducation.csvstart_year, end_year, degree, institution, detailsexperience.csvstart_year, end_year, title, institution, detailsawards.csvyear, descriptionservice.csvcategory, description, orderKeep the header row, replace everything below it. See
docs/CSV_FORMAT.mdfor the full spec with examples. -
Build:
python build.py
-
Preview — open
index.htmlin your browser.
Create a repo named yourusername.github.io on GitHub, then:
git add .
git commit -m "Initial deploy"
git branch -M main
git remote set-url origin https://github.com/yourusername/yourusername.github.io.git
git push -u origin mainThen go to your repo Settings > Pages > Source and select "GitHub Actions" (not "Deploy from a branch"). The included workflow (.github/workflows/build-deploy.yml) handles the rest — it installs Python, runs build.py, and deploys the output.
Your site will be live at https://yourusername.github.io within a couple minutes.
# edit a CSV or template, then just push:
git add .
git commit -m "Add new publication"
git pushGitHub Actions runs build.py automatically on every push. You don't need Python installed to update the site — just edit files and push.
If you want to preview locally before pushing, you can still run python build.py and open index.html in your browser.
A few things that might not be obvious:
- Authors in
publications.csvare semicolon-separated (Ghosh Arijit; Smith John). Names matchingauthor_bold_patternsinconfig.yamlget auto-bolded. selected: yesin publications — those show up on the home page. Leave blank otherwise.- Pipe
|separates bullet points in thedetailscolumn of education/experience CSVs.Did A|Did B|Did Crenders as a bulleted list. categoryinservice.csvmust be one of:editorial,service,mentoring,teaching. Controls which section the item appears under.dateinnews.csvisYYYY-MMformat (e.g.,2026-05). Auto-formatted to "May 2026" in the output.- HTML is allowed in most description fields — links,
<em>,<code>, etc. If the cell contains commas, wrap it in double quotes.
All colors live in CSS custom properties at the top of terminal.css. The dark theme, light theme, and three colorblind palettes each have their own block. Change --tan, --green, --accent, --bg, etc. to whatever you want.
config.yaml has a language_colors map (GitHub-style). If you add a repo with a language not in the list, it falls back to gray. Add new ones:
language_colors:
Julia: "#a270ba"
Matlab: "#e16737"The Jinja2 templates are in templates/. Each page imports macros from base.html.j2 (the nav bar and status bar). To add a new page:
- Create
templates/newpage.html.j2 - Add the rendering call in
build.py - Add a tab in the
topbarmacro inbase.html.j2
Replace assets/profile.png. Any square-ish image works, it gets clipped to a circle via CSS.
.
├── config.yaml # personal info, display settings, language colors
├── build.py # reads CSVs + config, renders Jinja2 templates to HTML
├── requirements.txt # jinja2, pandas, pyyaml, pytest
│
├── data/ # YOUR content — replace with your own
│ ├── publications.csv
│ ├── news.csv
│ ├── repositories.csv
│ ├── education.csv
│ ├── experience.csv
│ ├── awards.csv
│ └── service.csv
│
├── templates/ # Jinja2 source templates
│ ├── base.html.j2 # nav bar + status bar macros
│ ├── index.html.j2
│ ├── publications.html.j2
│ ├── repositories.html.j2
│ ├── cv.html.j2
│ └── teaching.html.j2
│
├── assets/
│ ├── profile.png
│ └── CV_AG_05192026.pdf # downloadable CV (swap with your own)
│
├── terminal.css # all styling — themes, responsive, print
├── theme.js # dark/light/colorblind toggle logic
├── terminal-easteregg.js # interactive terminal widget
├── favicon.svg
├── 404.html
│
├── tests/
│ └── test_build.py # 43 tests for the build script
│
├── docs/ # guides for editing, deploying, troubleshooting
│ ├── SETUP.md
│ ├── UPDATE.md
│ ├── DEPLOYMENT.md
│ ├── TROUBLESHOOTING.md
│ ├── TUTORIAL.md
│ └── CSV_FORMAT.md
│
├── .github/workflows/
│ └── build-deploy.yml # GitHub Actions: auto build + deploy on push
├── LICENSE # GPL-3.0
└── README.md # you're here
The data/ folder contains my actual content as working examples. Fork the repo, replace the CSVs with your own data, and you're good to go.
pytest tests/test_build.py -vCovers CSV parsing, author bolding, template rendering, edge cases. Useful if you modify build.py.
GPL-3.0. See LICENSE.
If you use this as a starting point for your own site, a link back is appreciated but not required.