Source for the JOBS Workshop site — a half-day workshop for computer architecture PhD students and postdocs going on the job market, co-located with MICRO. Listed by MICRO-59 as JOBS — Accelerating Your Job Search.
Live site: https://comparchsa.github.io/jobs-workshop.github.io/
A plain Jekyll site built by GitHub Pages. No npm, no
theme gem, no build step in CI — just Liquid templates, YAML, and one CSS file.
Push to main and the site rebuilds in a minute or two.
All maintenance documentation lives in this file. The site itself contains no instructions for editing it.
Almost every edit you will ever make is to a file in _data/.
The pages read from those YAML files and render whatever is in them. You should
rarely need to touch a .html or .md file to change content.
| Want to change… | Edit this |
|---|---|
| Dates, times, venue, application link, deadlines | _data/workshop.yml |
| The schedule, its speakers and panelists | _data/schedule.yml |
| The organizing committee | _data/organizers.yml |
| The selected job candidates | _data/candidates.yml |
| The tabs in the top nav | _data/navigation.yml |
| The archive of previous years | _data/past_editions.yml |
| Site title, description, URL | _config.yml |
Every one of those files opens with a comment block explaining its fields.
The site is complete but a few values are placeholders:
contact_emailin_data/workshop.ymlis the literal string<placeholder>. Until it contains an@, the site prints it as plain text in a dashed box rather than a mailto link, so no dead address is published. Put the real address in and every occurrence becomes a working link on its own — see_includes/contact.html.submission.urlis empty. Paste the HotCRP URL when the site is live.important_datesare allTBDexcept the workshop date itself.- Schedule speakers are all
TBD. venue_roomisTBDuntil MICRO assigns it.
Applications run through HotCRP. In _data/workshop.yml:
submission:
label: "Apply as a job candidate"
url: "https://jobs2026.hotcrp.com/"
hotcrp_name: "jobs2026.hotcrp.com"While url is empty the button renders as a greyed-out "opens soon" chip
instead of a dead link, so it is always safe to ship the page before HotCRP
exists. Fill in the matching deadlines under important_dates at the same time.
After selection, add a block per candidate to
_data/candidates.yml:
- name: Ada Lovelace
affiliation: University of Virginia
seeking: Academia # free text; shown as a tag
cv: https://example.org/ada-cv.pdf
website: https://example.org/ada # optional
research: Analytical engines and compiler design. # optional, one lineCommit and push. The table on /candidates/ picks it up automatically. While
the list is empty the page shows a "not published yet" panel rather than an
empty table.
In _data/schedule.yml, replace the TBD entry:
people:
- name: Jane Researcher
affiliation: NVIDIA
url: https://example.org/jane # optional
role: Moderator # optional
photo: /assets/img/speakers/jane-researcher.jpg # optionalPhotos. Drop square images (400×400 or larger is plenty) into
assets/img/speakers/ and point photo: at them. Anyone without a photo gets
a circle with their initials, so a partly-confirmed panel still looks
deliberate — you can add photos one at a time as people send them.
Every field in _data/schedule.yml is optional except title, so the file
works at any stage of planning:
# Times not settled yet — just list the sessions
- kind: panel
title: "Panel: Research careers in industry and academia"
# Times settled
- start: "08:15"
end: "09:00"
kind: panel
title: "Panel: Research careers in industry and academia"A slot with no start renders without a time on /schedule/ and shows "TBD" in
the home-page summary. kind is one of panel, talk, break, or session
and sets the word in the little chip above the title. Reordering entries
reorders the page.
The note above the schedule comes from schedule_note in
_data/workshop.yml; set it to "" to hide it once the
program is final.
_data/organizers.yml — order in the file is order on
the page. Photos work the same way as for speakers, in
assets/img/organizers/. Two extra options exist for the awkward cases:
initials:overrides the letters derived from the name, for entries that are not a person ("CASA" rather than the "CS" that would be derived).photo_fit: containfits a logo whole inside the circle on a white disc, instead of cropping it to fill like a face. The CASA Steering Group uses it.
For faces, photo_position and photo_zoom control the framing — see the
comment block at the top of _includes/avatar.html.
-
Create
newpage.mdat the repo root with front matter:--- title: New Page subtitle: One line under the heading. # optional permalink: /newpage/ ---
Note that front matter is not processed as Liquid —
{{ }}intitleorsubtitlewill render literally. -
Add it to
_data/navigation.ymlwith aurlthat matches thepermalinkexactly, slashes included.
The page layout is applied automatically (see defaults in _config.yml), so
you only write the body.
Ten minutes of work, in this order:
- Archive the edition that just ended. Add an entry to the top of
_data/past_editions.yml— year, conference, date, location, a short summary, and the highlights. - Update
_data/workshop.yml— edition, dates, venue, co-located conference and its URLs, important dates; resetsubmission.urlto""and restoreschedule_note. - Reset
_data/schedule.ymlto a skeleton withTBDspeakers. - Update
_data/organizers.ymlfor the new committee. - Empty
_data/candidates.yml— keep the comment header, delete the entries. - Update
titlein_config.ymlto the new year. - Update the
calendar:block in_data/workshop.yml— the.icstimes are UTC and do not derive themselves from the dates above. - Regenerate
assets/img/social-card.png(1200x630) so link previews show the right year.
Nothing else needs to change. The prose on the pages reads years, venues, and
conference names out of _data rather than hard-coding them.
bundle install
bundle exec jekyll serve --livereload
# → http://127.0.0.1:4000/jobs-workshop.github.io/Note the /jobs-workshop.github.io/ suffix — that is the baseurl, and it is
part of the local URL too.
_config.yml is the only file Jekyll does not hot-reload; restart the server
after editing it.
If you would rather not install Ruby, editing YAML directly in the GitHub web UI is perfectly fine — GitHub Pages builds it and emails you if something breaks.
Served from the main branch by GitHub Pages, under
Settings → Pages → Source: Deploy from a branch.
Because the repository lives under the comparchsa organization rather than a
user or org literally named jobs-workshop, the published URL is a project
page:
https://comparchsa.github.io/jobs-workshop.github.io/
which is why _config.yml sets:
url: https://comparchsa.github.io
baseurl: /jobs-workshop.github.ioMoving to a custom domain later (e.g. jobsworkshop.org):
- Add a
CNAMEfile at the repo root containing just the bare domain. - Set
url:tohttps://jobsworkshop.organdbaseurl:to"". - Point DNS at GitHub Pages and enable HTTPS in Settings → Pages.
All internal links go through Jekyll's relative_url filter, so they follow
baseurl automatically — you do not have to hunt through the templates.
_config.yml site-wide settings
_data/ ← all the content you actually edit
_includes/
nav.html top navigation bar
footer.html footer
cta.html the job-candidate application buttons
contact.html the organizers' address, or the placeholder
avatar.html one person's photo, or their initials in a circle
organizer-grid.html the committee card grid (used on 2 pages)
_layouts/
default.html html skeleton: head, nav, main, footer
page.html default.html + the page title band
index.html home page (hero + sections)
schedule.md timeline rendered from _data/schedule.yml
candidates.md how to apply + table from _data/candidates.yml
organizers.md committee grid, panelist nominations, contact
venue.md venue, travel, registration, accessibility
past-editions.md archive from _data/past_editions.yml (footer link only)
404.html shown for any unknown URL
calendar.ics generates /jobs-workshop-2026.ics from workshop.yml
assets/img/social-card.png 1200x630 link preview image
assets/css/style.css every style on the site, one file, plain CSS
assets/js/site.js the mobile nav toggle — the only JS on the site
The palette is Tokyo Night Light,
the VS Code theme. Surfaces and text come from the theme's own JSON; --brand
and --accent are its link-blue and purple syntax colours.
The site is light-only, on purpose. There is no
@media (prefers-color-scheme: dark) block, and html { color-scheme: light }
stops dark-mode browsers from auto-darkening scrollbars and form controls. If
you add a dark block back, anyone whose OS is set to dark mode will stop seeing
the light palette entirely — which is exactly the trap this note exists to
prevent.
All colours are CSS custom properties in the single :root at the top of
assets/css/style.css. There are four surface levels:
--surface (cards, tables, header), --bg (page canvas), --bg-soft (banded
sections, page headers), and --bg-sunken (footer). --text and
--text-muted are the two text tones.
The palette is checked against WCAG 2.1 AA: every text/background pair is at least 4.5:1, and control outlines are at least 3:1. If you change a colour, re-check it — https://webaim.org/resources/contrastchecker/ takes about ten seconds per pair.
The site is built to WCAG 2.1 AA. What is already in place:
- One
<h1>per page and no skipped heading levels. <header>,<nav>,<main>,<footer>landmarks, a skip-to-content link, andaria-current="page"on the active tab.- Visible focus outlines on every interactive element. The mobile menu is a
real
<button>witharia-expanded; Esc closes it and returns focus to the button rather than dropping focus to the top of the page. - The candidate table sits in a
tabindex="0"role="region"box, so it can be scrolled sideways with the keyboard on a narrow screen. Keep those attributes on any scrollable box you add — without them the content is unreachable without a mouse. - Decorative images carry
alt=""; the initials circles arearia-hidden, so names are announced once, not twice. - Table headers use
scope, and the candidate table has a caption. - Dates and session times are wrapped in
<time datetime="...">. - Text sizes are in
rem, so browser zoom and OS font-size settings work. - Wide content scrolls inside its own box; the page body never scrolls sideways, down to a 320px-wide screen.
- Honours
prefers-reduced-motionandforced-colors(Windows High Contrast). - The site is fully readable with JavaScript disabled.
When adding content, the three things that break this most often: an image
without alt, a link whose text is "here" or "click here", and a heading level
skipped for visual reasons. Style headings with CSS instead of picking a
smaller tag.
Organized by CASA, the Computer Architecture Student Association. All participants are expected to follow the SIGARCH CARES policies.
The original scaffolding came from the pages-themes/minimal Jekyll theme
(CC0), by way of PLTea and the CASA
ArchChat site — thanks to Rachit and everyone there. See LICENSE.