Static website for DMU Hackers and Pwn2Play.
Most recurring content is maintained in data/site-content.js. Update that file first, then rebuild the generated event artifacts and run the checks before deployment.
Use this when a new committee takes over or a new Pwn2Play event is announced.
Edit data/site-content.js.
Update:
committee.currentYearcommittee.currentTagcommittee.currentMemberscommittee.timeline
Current committee cards on index.html and the full committee history on committee.html are rendered from this data.
For each current member, keep this shape:
{
name: "First name",
fullName: "Full Name",
role: "Role Title",
icon: "fas fa-user-secret",
linkedin: "https://www.linkedin.com/in/example/"
}linkedin is optional. If it is missing, the site renders the member without a LinkedIn link.
Edit the p2p object in data/site-content.js.
Update:
p2p.event.namep2p.event.startp2p.event.endp2p.lastUpdatedp2p.categoriesp2p.prizesp2p.rulesp2p.schedulep2p.venuesp2p.scoreboardTracksp2p.sponsorCtap2p.links
Dates should use ISO timestamps with the UK offset, for example:
start: "2026-05-30T09:00:00+01:00",
end: "2026-05-30T18:00:00+01:00"The Pwn2Play page, registration guide, map page, calendar links, structured data, rules, prizes, scoreboards, and sponsor callout all read from this data.
Create the new event in Luma, then copy the embed URL for the event page. It should look similar to:
https://luma.com/embed/event/evt-example/simpleUpdate:
p2p: {
links: {
luma: "https://luma.com/embed/event/evt-example/simple"
}
}The site will update the Pwn2Play iframe and calendar links from this value at runtime.
Luma iframe internals cannot be styled from this site because the embed is hosted by Luma. To match the site better, set the event theme and colour inside Luma itself. The site only styles the surrounding frame.
Sponsors are managed in data/site-content.js under sponsors.
Resources are managed in data/site-content.js under resources.
Sponsor logos should be placed under img/branding/... and referenced with a relative path, for example:
logo: "img/branding/SponsorName/logo.png"Always include meaningful alt text for sponsor logos.
After changing event details, run:
node scripts/build-static-content.jsThis updates:
data/p2p-core-incursion.ics- the Pwn2Play JSON-LD event schema in
P2P.html
No npm install is required for the current maintenance scripts.
Run:
node --check data/site-content.js
node --check js/main.js
Get-ChildItem -Path scripts -Filter *.js | ForEach-Object { node --check $_.FullName }
node scripts/build-static-content.js
node scripts/check-site.js
node scripts/check-render.js
git diff --checkscripts/check-render.js launches Chrome through Playwright and checks desktop/mobile rendering, overflow, light-mode surfaces, and the mobile scroll fade regression.
Before publishing, manually check:
index.htmlP2P.htmlregister.htmlmap.htmlsponsors.htmlresources.html
Check both dark and light mode. On mobile, scroll through the whole page and confirm content does not fade out while still on screen.
Prefer editing data/site-content.js for recurring content. Only edit HTML directly for structural changes, new sections, or fallback copy that must exist before JavaScript runs.
This is a static site. Deploy the repository contents as-is after the checks pass.
Known maintenance item: optimise large images before major public launches when possible.