A SvelteKit website for BurbSec information security meetups and events.
BurbSec is an information security meetup network hosting events across multiple locations including the greater Chicagoland area, Las Vegas, Galway (Ireland), Minneapolis, and more. This site provides information about upcoming events, locations, and sponsors.
This project uses a data-driven architecture where all event metadata lives in a single source of truth — src/lib/data/events.js. The homepage cards, navigation dropdowns, sponsors page, SEO meta tags, and structured data (JSON-LD) are all auto-generated from this file. Individual route pages only contain unique prose content.
- Chicagoland — Chicago, Wheeling, Hickory Hills, Schaumburg, Crystal Lake, Naperville, South Bend
- Elsewhere — Minneapolis, Las Vegas, Galway (Ireland)
- Special Interest — CigarSec
- Sponsors (
/sponsors) — auto-generated cards from events with sponsor data - Error (
+error.svelte) — branded 404 / error page
- Node.js 22 LTS (or higher)
- npm
- Clone the repository
- Install dependencies:
npm install
- Start the development server:
npm run dev
- Open your browser and navigate to
http://localhost:5173
npm run build # Outputs to build/ with Brotli + Gzip precompression
npm run preview # Preview the production build locally- Framework: SvelteKit 2 + Svelte 4
- Build Tool: Vite 5
- Styling: Bootstrap 5.3.8 (CDN with SRI) + Custom CSS
- Icons: Font Awesome 6.5.1 (CDN with SRI)
- Deployment: Static site generation → GitHub Pages (Node 22)
- Domain:
burbsec.com(via CNAME)
- Subresource Integrity (SRI) hashes on all CDN resources
- Content Security Policy (CSP) meta tag
- Referrer Policy (
strict-origin-when-cross-origin) security.txtat/.well-known/security.txt- Consistent
rel="noopener noreferrer"on all external links
- Skip-to-content link for keyboard/screen-reader navigation
- Visible
:focus-visibleindicators on all interactive elements prefers-reduced-motionsupport (disables animations)- Semantic HTML landmarks (
<nav>,<main>,<footer>) - ARIA labels on key interactive elements
src/
├── app.html # Main HTML template (CSP, SRI, meta tags)
├── app.css # Global styles + a11y focus indicators
├── lib/
│ ├── data/
│ │ └── events.js # ★ Single source of truth for all event data
│ └── components/
│ ├── EventPage.svelte # Reusable event page (auto-generates SEO + JSON-LD)
│ ├── Footer.svelte # Site footer
│ └── Navbar.svelte # Data-driven navigation bar
└── routes/
├── +layout.svelte # Layout (skip-link, org structured data)
├── +layout.js # Prerender + trailing slash config
├── +page.svelte # Homepage (data-driven location cards)
├── +error.svelte # Branded error / 404 page
├── sponsors/ # Sponsors page (data-driven cards)
├── east/ # Chicago event page
├── north/ # Wheeling event page
├── south/ # Hickory Hills event page
├── west/ # Naperville event page
├── prime/ # Schaumburg event page
├── northwest/ # Crystal Lake event page
├── southeast/ # South Bend event page
├── minneapolis/ # Minneapolis event page
├── lasvegas/ # Las Vegas event page
├── galway/ # Galway, Ireland event page
└── cigarsec/ # CigarSec special interest page
static/
├── .well-known/
│ └── security.txt # Security contact info (RFC 9116)
├── images/ # Event shields and IRL photos
├── videos/ # Background video
├── sitemap.xml # Site map for search engines
└── robots.txt # Crawler directives
Adding a new event is now a two-step process (down from six):
-
Add the event to
src/lib/data/events.jsin the appropriate array (chicagolandEvents,elsewhereEvents, orspecialEvents). This automatically updates:- Homepage location cards
- Navbar dropdown menus
- Sponsors page (if
sponsordata is provided) - SEO meta tags and structured data (if
seo/structuredDatafields are provided)
-
Create a minimal route page at
src/routes/<slug>/+page.svelte:<script> import EventPage from '$lib/components/EventPage.svelte'; import { getEventProps } from '$lib/data/events.js'; const event = getEventProps('your-slug'); </script> <EventPage {...event}> <p>Your unique event description here.</p> </EventPage>
-
Drop the shield image into
static/images/and updatestatic/sitemap.xml.
| Field | Required | Description |
|---|---|---|
slug |
Yes | URL path segment (e.g., east) |
title |
Yes | Display title (e.g., BurbSec|East) |
subtitle |
Yes | Meeting cadence |
location |
Yes | Human-readable location |
eventImage |
Yes | Path to shield image in static/ |
gmapsLink |
Yes | Google Maps link to venue |
cardTitle |
Yes | Short name for homepage card |
cardSchedule |
Yes | Short schedule for homepage card |
category |
Yes | chicagoland, elsewhere, or special |
blueskyHandle |
No | BlueSky social handle |
discordLink |
No | Discord server invite link |
meetupPage |
No | Meetup.com page (defaults to main BurbSec) |
eventbriteLink |
No | Eventbrite page link |
irlImage |
No | Path to IRL photo |
seo |
No | Custom SEO title, description, keywords, image |
structuredData |
No | Venue details for JSON-LD schema |
sponsor |
No | Sponsor page card data |
This site is open source. Feel free to submit issues and pull requests to improve the site.
See LICENSE file for details.