τ — Trustworthy Autonomy under Uncertainty. Static, dependency-free site for a research group working on reinforcement learning, world models, and robotics. Hosted on GitHub Pages.
This repository is the website. There is no build step. Open
index.html in a browser and it works.
| Page | What it is |
|---|---|
index.html |
Home. Hero with an interactive 3D armillary scene (Three.js, no build). |
research.html |
Publications, filtered by venue, searchable. |
blogs.html |
Technical writings (Markdown + PDF + external links). |
about.html |
About + contact. |
blog.html |
Single-post viewer (?slug=…). Renders Markdown or embeds PDF. |
The whole site shares one stylesheet (assets/css/style.css)
whose colour tokens come straight from the company logo (warm copper,
cream, near-black). Re-theme by editing the :root block.
-
Create
blogs/my-post.mdwith YAML frontmatter:--- title: My post title date: 2025-04-12 author: Your Name tags: [world-models, RL] summary: One-sentence teaser. --- # Body…
-
Push. The GitHub Action regenerates
content/blogs.jsonand the post appears onblogs.html. To preview locally first, run:python3 scripts/generate_manifest.py
-
Drop the file:
blogs/my-talk.pdf -
(Optional) add a sidecar
blogs/my-talk.jsonwith metadata:{ "title": "My talk title", "date": "2025-04-12", "author": "Your Name", "tags": ["talks"], "summary": "What the talk is about." } -
Push. Done.
Edit content/papers.json and add an entry. Paper
metadata is too rich to infer from a filename, so this is intentionally
manual:
{
"title": "…",
"authors": ["A", "B"],
"venue": "NeurIPS",
"year": 2025,
"tags": ["RL", "world models"],
"abstract": "…",
"links": {
"pdf": "papers/my-paper.pdf",
"arxiv": "https://arxiv.org/abs/…",
"code": "https://github.com/…",
"project": "https://…"
}
}If you want to host the PDF too, drop it in papers/.
No toolchain required:
# Any static server. Python's built-in works fine.
python3 -m http.server 8080
# then open http://localhost:8080(Opening index.html directly with file:// mostly works, but the
JSON fetch() calls used by the research/blog loaders need an HTTP
origin — use the server.)
- Push this repo to GitHub.
- Settings → Pages → Build and deployment → Source → "GitHub Actions".
- Push to
main. The workflow at.github/workflows/deploy.ymlwill:- Run
scripts/generate_manifest.pyto refreshcontent/blogs.json. - Auto-commit the regenerated manifest (with
[skip ci]so it doesn't loop). - Publish the entire repo as the GitHub Pages artifact.
- Run
Custom domain? Rename CNAME.example to CNAME and put
your domain inside it.
.
├── index.html ← Home (3D hero)
├── research.html ← Publications listing
├── blogs.html ← Writings listing
├── about.html ← About + contact
├── blog.html ← Single-post viewer
│
├── assets/
│ ├── css/style.css ← Single stylesheet, all theme tokens at top
│ ├── js/
│ │ ├── main.js ← Nav toggle + reveal-on-scroll
│ │ ├── three-hero.js ← Interactive 3D hero (Three.js, ESM CDN)
│ │ ├── research-loader.js ← Renders papers from content/papers.json
│ │ ├── blogs-loader.js ← Renders writings from content/blogs.json
│ │ └── blog-viewer.js ← Renders Markdown / embeds PDF
│ └── img/
│ ├── logo.svg ← Fallback τ mark
│ └── (drop logo.png here)
│
├── content/
│ ├── papers.json ← Publications manifest (edit by hand)
│ └── blogs.json ← Writings manifest (auto-generated)
│
├── blogs/ ← Drop .md / .pdf files here
│ └── welcome.md ← Example post
├── papers/ ← Optional: host paper PDFs here
│
├── scripts/
│ └── generate_manifest.py ← Scans /blogs → writes content/blogs.json
│
├── .github/workflows/deploy.yml ← Build manifest + publish to Pages
├── .nojekyll ← Tells Pages to skip Jekyll
└── CNAME.example ← Rename to CNAME for a custom domain
All colours are tokens at the top of assets/css/style.css
under :root. The defaults are sampled from the logo:
| Token | Hex | Role |
|---|---|---|
--primary |
#E8722C |
Logo orange |
--primary-2 |
#B8541C |
Deep copper |
--accent |
#E9A766 |
Warm gold highlight |
--bg |
#0E0D0B |
Page background (near-black) |
--text |
#F2E9D8 |
Body text (cream) |
Change them in one place; the whole site re-themes.
assets/js/three-hero.js loads
Three.js from a CDN as a native ES module — no
bundler. The scene is a wireframe icosphere wrapped by three orbiting
copper rings (a nod to the logo's armillary sphere) inside a warm
particle field. Drag to rotate, scroll to zoom, move the cursor to
parallax-nudge the camera. Pauses automatically when off-screen, and
silently no-ops if WebGL is unavailable.
To swap the visual for something else (e.g. a Gaussian-splat viewer later), edit just that one file.