The website of the Interactive Programming & Analysis Lab at TU Wien, served at https://ipa-lab.github.io.
It is a small static site: build.py loads YAML from _data/, renders the Jinja2 templates in templates/, and writes plain HTML to _site/. There is no JS or CSS framework; styles live in one hand-written static/site.css.
To open or close thesis supervision or advertise a position, edit _data/site.yml and rebuild. The home page and the Join page read from it.
You need uv. It installs Python and the dependencies (Jinja2, PyYAML, requests) from pyproject.toml:
uv syncuv run build.pyTo refresh the team data from TISS before building:
uv run build.py --fetchpython -m http.server -d _siteThen open http://localhost:8000. Rebuild after editing a template or data file and reload the page.
| What | File |
|---|---|
| Page templates | templates/*.html (shared layout in templates/base.html) |
| Recruiting status (theses, projects, open positions) | _data/site.yml |
| "Questions we're working on" on the home page | _data/questions.yml |
| Research themes and their linked papers | _data/research.yml |
| Team members | _data/team/tiss_generated.yml (generated), with hand corrections in _data/team/overrides.yml |
| Teaching | _data/teaching.yml |
| Publications | _data/publications/dblp_generated.yml (generated) |
| Styles, images, scripts | static/ (copied to _site/static/) |
Two scripts in _scripts/ regenerate the YAML files. Don't edit the generated files by hand; they are overwritten on every run.
-
Publications are imported by hand. DBLP blocks automated requests with a bot check, so there is no scraper. To refresh:
- Open https://dblp.org/pid/150/6416.html in your browser and save the page (File › Save Page As…).
- Run
uv run _scripts/import_dblp.py "path/to/saved page.html", then rebuild and commit_data/publications/dblp_generated.yml.
The importer de-duplicates entries by title (keeping the published version over a preprint) and sorts them newest first. It also accepts several files (for example one per lab member) and DBLP XML files.
-
_scripts/fetch_tiss.pyfetches name, role, email, phone, office, and photo for the IDs in itstiss_idslist from the TU Wien TISS API and writes_data/team/tiss_generated.yml. To add or remove a team member, edittiss_ids.
build.py then cleans the publication data while rendering: it strips DBLP disambiguation numbers from author names (Satish Chandra 0001), strips trailing periods from titles, shows the venue CoRR as arXiv, and classifies each entry as Conference, Journal, Preprint, Artifact, or Thesis. Lab members (anyone in the TISS data) are highlighted in author lists.
Team members are grouped by their TISS function group: professors as Faculty, student staff as Study assistants, and everyone else as Researchers. To add a person, add their TISS ID to tiss_ids in _scripts/fetch_tiss.py.
The site makes visitors' browsers talk only to the site itself:
- No cookies, analytics, or embeds.
- Fonts are self-hosted in
static/fonts/(SIL Open Font License). - Team photos from TISS are downloaded at build time and served from
/static/people/, cached locally in.cache/photos/.
build.py fails if any generated page, stylesheet, or script loads a resource (font, image, script, stylesheet) from another server. Plain links to other sites are fine. Please keep it that way: don't add Google Fonts, CDNs, YouTube embeds, or analytics.
Every push to master runs .github/workflows/pages.yml, which sets up uv, refreshes the team data from TISS (uv run build.py --fetch), and deploys _site/ to GitHub Pages. You can also start it by hand from the Actions tab.