This guide explains how to populate the site using Ghost content settings.
The theme has three standalone-branded surfaces, plus the ICRS-native project pages:
- Main ICRS home page (from index.hbs)
- LobSTAR landing page (from page-lobstar.hbs, for slug
lobstar) - IPRL Front Page (from page-iprl.hbs, for slug
iprl)
UNIBOTS (page-unibots.hbs, slug unibots) uses the shared ICRS-native (blue/mono) project-page styling instead of its own brand.
Most dynamic sections are powered by Ghost internal tags (tags prefixed with #).
-
#icrs-post- Used for the home page post feed.
- Query:
tag:hash-icrs-post(up to 20 posts)
-
#sponsor- Used for the sponsor grid on the home page.
- Query:
tag:hash-sponsor(up to 100 posts)
-
#newsletter- Used for the newsletter banner near the top of the home page.
- Query:
tag:hash-newsletter(most recent 1 post)
-
#gallery- Used for the gallery marquee on the home page.
- Query:
tag:hash-gallery(up to 20 posts)
-
lobstar- Used for LobSTAR posts grid.
- Query:
tag:lobstar(up to 6 posts)
-
#lobstar-sponsor- Used for LobSTAR sponsors section.
- Query:
tag:hash-lobstar-sponsor(up to 100 posts)
-
#lobstar-subsystem- Used for LobSTAR subsystems cards.
- Query:
tag:hash-lobstar-subsystem(up to 100 posts)
-
#lobstar-team- Used for LobSTAR team members.
- Query:
tag:hash-lobstar-team(up to 100 posts, oldest first)
Uses page-unibots.hbs, which auto-applies to the Ghost page with slug unibots. Still uses the shared ICRS-native (blue/mono) project-page styling.
-
unibots- Regular (non-internal) tag used for the UNIBOTS posts grid.
- Query:
tag:unibots(up to 9 posts)
-
#unibots-team- Used for the UNIBOTS team section.
- Query:
tag:hash-unibots-team(up to 100 posts, oldest first) - Field mapping: feature image -> avatar, title -> name, custom excerpt -> bio.
page-iprl.hbs auto-applies to the Ghost page with slug iprl. Unlike UNIBOTS, this is a fully standalone, separately-branded sub-site (own header/footer/fonts — cream/ink/orange palette, Tw Cen MT + IntoDotMatrix + Inter — bypassing the shared ICRS shell entirely, the same way the LobSTAR pages do). Most of the page (hero, branch info, sponsors placeholder copy) is static marketing content per the 2026 design handoff; only two sections pull real Ghost content:
-
iprl- Regular (non-internal) tag used for the News grid.
- Query:
tag:iprl(up to 3 posts, most recent first) - Field mapping: feature_image -> card image, primary_tag -> category label, title -> headline (links to the post), custom_excerpt (falls back to autogenerated excerpt) -> excerpt, first author's name + published date -> byline.
-
#iprl-sponsor- Used for the sponsor logo grid in the Supporters section.
- Query:
tag:hash-iprl-sponsor(up to 100 posts) - Field mapping: feature_image -> logo, title -> alt text/fallback label, canonical_url (if set) -> makes the tile a clickable link.
- If no posts have this tag, the section falls back to 8 empty placeholder tiles (matches the original design's unpopulated state).
iprl_join_url custom setting (Settings > Design & Branding > Site-wide): destination for every "Join the Lab" button across all IPRL pages (nav, hero, footer). Leave empty and the buttons just jump to the Front Page's own footer instead.
The IPRL header/footer chrome (partials/iprl-header.hbs, partials/iprl-footer.hbs) is shared across the Front Page and every page below, so nav links and the Join CTA stay consistent everywhere without duplicating markup.
Posts tagged iprl render through a dedicated branch inside post.hbs (the same pattern LobSTAR uses) instead of the shared ICRS post template — own header/footer, own fonts, back-to-News link, tag chips, author bio, and a "More from the Lab" related-posts row (2 real posts sharing the iprl tag, plus a static Mission Archive teaser card). No new tags needed beyond iprl itself; everything else maps directly to standard Ghost post fields (primary_tag, title, feature_image, tags, primary_author.bio, authors[0] for the byline avatar).
page-iprl-shop.hbs auto-applies to the Ghost page with slug iprl-shop (URL /iprl-shop/). Ghost has no native commerce, so per the design handoff there's no checkout here — one central "Shop on ICU" button (below) is the only purchase path. Products themselves are real Ghost Posts, one per product, split into three sections by internal tag:
#iprl-shop-apparel→ Apparel section#iprl-shop-promotional→ Promotional section#iprl-shop-other→ Other section
Each product post maps like this:
- Feature image → product photo (cropped to a square; falls back to an empty tinted tile if unset)
- Title → product name and price together, separated by a pipe:
IPRL Zip Hoodie | £38.main.jssplits this client-side into the name and a separately-styled price badge (same lightweight pattern the theme already uses for author initials and event cards). No pipe in the title just shows as-is with no price badge — nothing breaks if you forget it or if JS is off, it just reads as one line. - Custom excerpt (falls back to an autogenerated excerpt) → description
A section with no tagged products simply doesn't render (no empty "Promotional" heading with nothing under it).
icu_shop_url custom setting (Settings > Design & Branding > Site-wide): destination for the "Shop on ICU" button in the hero. Leave empty to hide the button — set it once you know where Imperial College Union's store lives.
page-iprl-team.hbs → Page with slug iprl-team (header "Team" link, footer, and the News Post "Archive" card → /iprl-team/#archive). It replaces the old per-year iprl-archive-* pages.
Current team — one Post per member, internal tags only (they never show in News, RSS or /tag/):
- Title → name, Custom excerpt → role, Feature image → square photo
#team-<year>(e.g.#team-2026) → season- one group tag:
#team-leadership,#team-rover,#team-uavor#team-science - Members sort featured first, then by title. A group with no members for the season is hidden.
- Season shown = theme setting
current_team_year(Settings > Design & Branding > Site-wide, default2026). It drives the hero eyebrow and the member filter. - The
iprl-teamPage itself supplies the hero H1 (title), intro (custom excerpt) and the full-team photo (feature image; falls back towhole-team-photo.jpg).
Mission Archive — one Page per season tagged #archive, shown as client-side tabs, newest first (published_at decides order and the tab's year label, so set it to the season's year):
- Title → rover name, Custom excerpt → eyebrow ("European Rover Challenge 2025 · Kraków"), Feature image → splash, Meta description → blurb beside the "The Team" heading
- Body: an HTML card with the specs strip, then a heading + bullet list for Achievements, then a Gallery card. The specs strip is lifted above the season's team grid by CSS (
.iprl-archive-content):<div class="iprl-archive-specs"> <div><span>Drivetrain</span><br>6-wheel rocker-bogie</div> <div><span>Arm</span><br>5-DOF modular manipulator</div> <div><span>Chassis</span><br>Machined aluminium</div> <div><span>Autonomy</span><br>LIDAR + stereo nav stack</div> </div>
- That season's team grid is built from members tagged
#team-<published year>. - Deep links:
/iprl-team/#archiveand/iprl-team/#archive-2024. Without JS all seasons are listed.
Season rollover: tag new members #team-2027 + group, set current_team_year to 2027, publish the 2026 archive Page tagged #archive.
Redirects: upload redirects.yaml (Settings > Labs > Redirects) so old /iprl-archive/ and /iprl-archive-YYYY/ links land on the Team page.
The LobSTAR page includes a Featured Post section directly under the intro content.
Selection rule:
- Post must have tag
lobstar - Post must also have
Featuredenabled in Ghost (featured:true) - Query used:
featured:true+tag:lobstar - Only 1 post is shown (
limit="1")
If multiple posts are marked featured, Ghost returns one based on default ordering. To keep this predictable, mark only one LobSTAR post as featured at a time.
This comes from the static page that uses page-lobstar.hbs:
- Page title -> hero title
- Page content -> hero body text
- Page feature image -> hero image
For the selected featured post:
- Feature image -> left image panel
- Title -> heading on the right
- Date -> metadata line
- Custom excerpt (if set) -> main text
- Fallback when custom excerpt is empty -> autogenerated excerpt
For each post:
- Feature image -> card image
- Title -> card title
- Date -> metadata
- Custom excerpt (if set) -> card text
- Fallback when custom excerpt is empty -> autogenerated excerpt
For each sponsor post:
- Feature image -> sponsor logo/image (will fill the entire square polaroid space)
- Title -> sponsor name
- Custom excerpt -> supporting text (often used for URL or short note)
- Primary tag (first tag) -> sponsor tier level (e.g., "Krill", "Gold", "Platinum")
Note on tier tags: The tier label appears on the polaroid only if set as the post's primary tag. In Ghost Admin, ensure the tier tag appears first in the tag list to make it the primary tag.
For each subsystem post:
- Feature image -> subsystem image
- Title -> subsystem name
- Custom excerpt (if set) -> summary
- Fallback when custom excerpt is empty -> autogenerated excerpt
For each team post:
- Feature image -> avatar/headshot
- Title -> person name
- Custom excerpt -> short bio
- Create or edit a post/page in Ghost Admin.
- Open the post settings panel.
- Add internal tags exactly as listed above (with
#). - Fill in Feature image and Custom excerpt where relevant.
- For a LobSTAR featured post, toggle the post to Featured.
- Publish the content.
- Home article should appear in ICRS feed: add
#icrs-post - Home sponsor should appear in sponsors row: add
#icrs-sponsor - LobSTAR article should appear in Posts: add
lobstar - LobSTAR article should appear in Featured Post: add
lobstarand set Featured - LobSTAR sponsor/team/subsystem cards: add the matching LobSTAR internal tag
- Internal tags are queried by slug (
hash-...) in templates, so spelling matters. - Featured Post section renders only when at least one post matches
featured:true+tag:lobstar. - A featured LobSTAR post can appear in both the Featured section and the Posts grid.
- If an image is missing in some LobSTAR sections, the theme may show a placeholder or text-only block.
- Sponsor tier tags: The tier label on polaroids displays the post's primary tag. In Ghost Admin, set the tier tag (e.g., "Krill") as the first tag in the list to make it primary. The
#lobstar-sponsortag should be a secondary tag.
Posts can include styled event cards using a single <div data-event> HTML card. The theme rewrites it on the published page into a Windows-style window with title bar, image, meta rows, description, sign-up link, and an "add to calendar" button.
In the Ghost editor type /html and paste:
<div data-event
data-title="Build Night"
data-when="Fri 12 Jun 2026 · 18:00–21:00"
data-start="2026-06-12T18:00"
data-end="2026-06-12T21:00"
data-where="Imperial College, RSM 1.51"
data-price="Free for members"
data-image="https://your-image-url.jpg"
data-cta="https://signup-url"
data-cta-label="sign up">
Bring your own project. Pizza at 19:00. Multiple paragraphs are supported — leave a blank line between them.
</div>Save the HTML card as a Ghost snippet named event so /event inserts it next time.
All attributes are optional except data-event itself. Drop any line and that piece won't render.
Content
data-title— heading inside the carddata-when— human-readable display string for the date/time row (e.g.Fri 12 Jun 2026 · 18:00)data-where— location rowdata-price— price rowdata-image— feature image URL (no drag-and-drop; paste the URL of an image uploaded elsewhere)data-cta— sign-up link URLdata-cta-label— link text, defaults tosign updata-label— title bar label, defaults toEVENT
Calendar (machine-readable times)
Including these makes the "add to calendar" button appear in the bottom-right corner.
data-start— ISO 8601 datetime, required for the calendar button (e.g.2026-06-12T18:00)data-end— ISO 8601 datetime, optionaldata-duration— minutes, used ifdata-endis omitted, defaults to60data-calendar-label— accessible name / tooltip, defaults toadd to calendar
Times are treated as floating local time — "18:00 wherever you are" — so any timezone suffix (Z, +01:00) is stripped before parsing. The calendar button opens a small dropdown letting the reader pick Google, Outlook, or Apple / iCal. Google and Outlook open a pre-filled "save event?" prompt in a new tab; Apple downloads a .ics file.
Color overrides (per-card)
Each maps to a CSS custom property on the card wrapper:
data-color— title bar background (default#000000)data-title-color— title bar text + button border color (default#FFFFFF)data-bg— window body background (default#FFFFFF)data-fg— window body text (default#000000)data-shadow— drop-shadow color (default#000000)data-accent— link / button hover color (default#001EFF)
Example using LobSTAR colors:
<div data-event
data-color="#001EFF"
data-accent="#F2FF00"
data-label="LOBSTAR"
data-title="Lab tour"
data-start="2026-06-20T14:00"
data-where="EEE 505">
Open lab session for new members.
</div>- The Ghost editor preview shows the raw
<div data-event>HTML — the styled card only appears on the published post. - No drag-and-drop image upload. To get a hosted URL, upload via a temporary
/imagecard, copy the rendered URL, paste intodata-image, then delete the temporary card. - All text is set via
textContentso attribute values can't inject HTML. - The implementation lives in
assets/js/main.js(renderEventCards,buildCalendarButton, ICS / Google / Outlook URL builders) andassets/css/screen.css(section "9b. Event Card").
The theme supports custom site settings available in Ghost Admin under Settings > Design & Branding > Site-wide:
alert_banner_text: Alert banner text displayed at the top of all pages (if set)footer_text: Custom footer description text on all pageshero_tag_1_text,hero_tag_1_url,hero_tag_1_color: First hero tag on ICRS landing pagehero_tag_2_text,hero_tag_2_url,hero_tag_2_color: Second hero tag on ICRS landing pagehero_tag_3_text,hero_tag_3_url,hero_tag_3_color: Third hero tag on ICRS landing pagelobstar_support_url: Support/donation URL for the "Support Us" button on LobSTAR Supporters section
Note: The "Support Us" button only appears on the LobSTAR page if lobstar_support_url is configured.