A place to find digital events and organisations in Nottingham.
The site is a static site built with Astro and deployed to GitHub Pages. There is no server and no client-side framework — the meetup list is rendered to plain HTML at build time.
Every meetup is a single YAML file in src/content/meetups/.
To add one, create a new file there — you do not need to run the site locally,
and you do not need to touch any HTML:
# src/content/meetups/my-meetup.yml
name: My Meetup
url: https://example.com/my-meetup
category: tech # tech | design | ops
cadence: Second Thursday
summary: >-
A sentence or two about the group, written by the organisers.
links:
- label: Mastodon
url: https://example.social/@mymeetuplinks is optional. category and url are validated on every pull request,
so a typo fails CI rather than reaching the live site.
See the contributing guide for the house rules on descriptions and titles.
Requires Node.js 20.3 or newer.
npm install
npm run dev # local dev server at http://localhost:4321
npm run build # static output into dist/
npm run preview # serve the built site
npm run check # type-check components and content| Path | What it is |
|---|---|
src/content/meetups/*.yml |
The directory data — one file per meetup |
src/content.config.ts |
Schema the meetup files are validated against |
src/data/categories.ts |
The category list (tech, design, ops) |
src/styles/tokens.css |
All colours, fonts and spacing |
src/components/Logo.astro |
The site wordmark |
src/assets/nd-monogram.svg |
The "nd" mark, traced from the logo artwork |
src/data/analytics.ts |
The GoatCounter endpoint — the only analytics config |
scripts/check-live-site.mjs |
Daily health check run against the published site |
.github/workflows/deploy.yml |
Build and publish to GitHub Pages |
.github/workflows/monitor.yml |
Daily check that the live site is up and fresh |
Colour, type and spacing live entirely in src/styles/tokens.css, including the
dark-mode palette. Changing the site's look means editing that one file and
replacing src/components/Logo.astro — no component or page markup needs to
change. The monogram is filled from --logo-ink / --logo-accent, which
.site-mark maps onto the brand tokens, so the mark follows the theme rather
than carrying its own palette.
To add a category: add an entry to src/data/categories.ts, a matching
--color-category-<id> token in src/styles/tokens.css, and an icon in
public/img/.
Pushes to main trigger .github/workflows/deploy.yml, which builds the site
and publishes it to GitHub Pages. This requires the repository's
Settings → Pages → Source to be set to GitHub Actions.
Visitor stats come from GoatCounter,
which is cookieless and stores nothing on the device — no consent banner, and
the dashboard is public. The endpoint lives in src/data/analytics.ts and
nowhere else; emptying that string removes the beacon, which is what a fork
should do.
.github/workflows/monitor.yml runs scripts/check-live-site.mjs every morning
against https://nottingham.digital and fails the run — which emails the
workflow's last committer — when the site is unreachable, when the build stamp
in <meta name="build-time"> is more than 48 hours old (the daily deploy has
stopped), when fewer meetup cards are published than there are files in
src/content/meetups/, or when almost no group resolves an upcoming event
(the feeds in scripts/fetch-next-events.mjs have changed). Run it by hand
with:
node scripts/check-live-site.mjs # against the live site
node scripts/check-live-site.mjs http://localhost:4321/ # against a local buildPull requests also run Lighthouse against the built site (lighthouserc.json)
and attach the report as an artifact. The job is non-blocking until its
thresholds have been calibrated against a real run — see CLAUDE.md.
npm run lighthouse runs the same audit locally.
Nottingham Digital is maintained by members of the Nottingham digital community. See the contributors page in GitHub for more details.
Original design by whatjoesays at JH.
Longer-form implementation notes live in .claude/plans/:
| Plan | What it covers |
|---|---|
2026-08-astro-rebuild.md |
The move from hand-edited HTML to this Astro build |
2026-08-content-refresh.md |
Acting on the July 2026 audit of which meetups are still running |
2026-08-monitoring.md |
Adding visitor analytics, live-site monitoring and Lighthouse budgets |