The official site for the ANU CSSA Bush Week Tech Fest (31 July – 2 August 2026), built to run at techfest.cssa.club or on university hosting.
Built with Next.js + React + Tailwind CSS, exported as a fully static site (plain HTML/CSS/JS —
no server required). Aileron, the official brand typeface, is self-hosted via Fontsource. The colour
system is derived from the Canva brand gradient: #ffbb34 → #67acf1 → #3add41.
📘 Extending or restyling the site? Read GUIDE.md — the maintainer's guide to the architecture, the design system (buttons, gradient text, dark-mode rules), and step-by-step recipes for new pages, pins, and content collections.
npm install # once
npm run dev # local preview at http://localhost:3000
npm run build # production build → static site in out/Everything in out/ after a build is the deployable website.
All event content lives in data/*.json. You should almost never need to touch a component to
update the site.
| File | Controls |
|---|---|
data/site.json |
Names, dates, description, CTF links, registration mode, socials, contacts, downloads, footer logos, disclaimer |
data/schedule.json |
The entire programme. Each entry automatically becomes a schedule row, a page at /events/<slug>/, and a downloadable .ics calendar file |
data/venues.json |
Venue names, addresses, map coordinates, Google Maps links, parking pins |
data/speakers.json |
Tech Talks speaker list (photos, abstracts, LinkedIn, slides, recordings) |
data/sponsors.json |
Sponsor wall (name, URL, logo path) |
Pages live in app/, reusable UI in components/, and scripts/generate-ics.mjs regenerates the
calendar files automatically before every build.
Replace the file, keeping the same name:
public/downloads/BWTF-Event-Brief.pdfpublic/downloads/BWTF-Speaker-Brief.pdf
The download buttons never change, so links you've already shared keep working.
Edit data/schedule.json — copy an existing event object and adjust. Fields:
slug (URL), title, icon (one of mic flag bbq film trophy drinks), start/end (24h),
venue (a key from venues.json), includes (badge text), blurb, and links.
When a Humanitix or Rubric listing goes live, paste its URL into that event's
links.humanitix or links.rubric — a registration button appears on the event page automatically.
- Copy the
templateobject indata/speakers.jsoninto thespeakersarray and fill it in. - Drop a square photo into
public/images/speakers/. - Later, set
slides/recordingto add download buttons — no other changes needed.
- Add
{ "name": ..., "url": ..., "logo": "/sponsors/<file>.png" }todata/sponsors.json. - Drop the logo PNG into
public/sponsors/with that filename. (Until the PNG exists, the tile shows the sponsor's name as text — nothing breaks.)
Expected logo filenames for the current sponsor list (drop your PNGs in public/sponsors/):
jane-street.png, imc.png, citadel-securities.png, atlassian.png, optiver.png,
infosect.png, bsides-canberra.png, tanto.png, ntt-data.png.
In data/site.json → registration:
"mode": "link"shows a big button tolinkUrl(currently the CSSA Linktree)."mode": "embed"embedsembedUrlin an iframe — paste a Google Form's embed URL (Form → Send →<>→ copy thesrc), or a Humanitix/Rubric embed URL, and it just works.
Official ANU and SoCo logos are not bundled (they're the university's trademarks — get the
approved files from your ANU contact). Drop them at public/images/anu-logo.png and
public/images/soco-logo.png; until then the footer shows styled text links.
- Map coordinates in
data/venues.jsonare close approximations. Open each venue in Google Maps, right-click the exact spot → copy lat/lng → paste into the JSON. The three parking entries (Baldessin, Kingsley St, Willows) especially need confirming against current ANU parking rules, and the Dendy Cinemas pin against the Canberra Centre entrance. - Social links — Discord, Instagram and Facebook currently point at the Linktree; replace with
direct URLs in
data/site.json. - OG preview — after deploying, paste the URL into a Discord/Slack message or opengraph.xyz to confirm the rich link preview renders.
The build is static, so any of these work:
Cloudflare Pages (recommended for cssa.club): connect the repo, build command npm run build,
output directory out. Then add techfest.cssa.club as a custom domain (Cloudflare will guide the
CNAME setup since cssa.club is likely already on Cloudflare).
GitHub Pages: the included workflow (.github/workflows/deploy.yml) deploys on every push to
main. Set repo Settings → Pages → Source: GitHub Actions. For a custom domain, add
techfest.cssa.club in the Pages settings and create a CNAME record. If you serve from
username.github.io/<repo> instead, uncomment the NEXT_PUBLIC_BASE_PATH line in the workflow.
Vercel: import the repo; zero config needed.
University hosting: run npm run build and hand the ANU web team the contents of out/ — it's
plain files, no runtime needed. If they host it under a sub-path, build with
NEXT_PUBLIC_BASE_PATH=/that/path npm run build.
After changing content, redeploy (push to main if using CI, or re-run the build and re-upload).
The architecture anticipates the roadmap items:
- Speaker slides & recordings — fields already exist per speaker; buttons appear when set.
- CTF scoreboard embed / countdown — the CTF page (
app/ctf/page.jsx) has a sidebar card reserved for this; an iframe to the noCTF scoreboard drops straight in. - Live announcements / photo gallery / sponsor spotlights — follow the established pattern:
create
data/announcements.json, a component that maps over it, and mount it on a page. - Admin CMS — because all content is JSON, a git-based CMS (Decap CMS, TinaCMS, or even
GitHub's web editor) can be pointed at
data/with no restructuring.
- Semantic landmarks, skip-to-content link, visible focus rings,
arialabels on interactive maps and toggles,prefers-reduced-motionrespected. - Dark mode (system-aware with a manual toggle, no flash on load).
- schema.org
Festival/EventJSON-LD on every page, Open Graph + Twitter cards, sitemap, robots.txt, web manifest, favicon and Apple touch icon. .icscalendar files for every event plus the whole festival.- Fully responsive from ~360 px up; no external font/CDN dependencies except OpenStreetMap tiles for the interactive map.