Open for review
๐ฑ Nothing is waiting for review right now. Want to help shape what comes next? Read CONTRIBUTING โ
Recently shipped to production (main) wondersofwork.nl ๐
-
Fixrestore Cyberdigma widget house-style overrideWhat this changes
Restores
How to tryis:inlineon the Cyberdigma/MeetingSelect override<style>block inBookingForm.astro, so the Wonders of Work house-style colors apply to the booking widget again instead of the vendor default styling.1. Open a space page with the booking form and run a search that opens the Cyberdigma booking overlay. 2. Confirm the widget shows the Wonders of Work house-style colors (primary brand color), not the default Cyberdigma blue. 3. Compare against current production / the broken build to see the regression.
What this affects- Only
src/components/BookingForm.astroโ the inline override style block. - Root cause: merge 84d8404 (
w3c-enhancements) flipped<style is:inline>to plain<style>. Astro scopes plain style blocks with adata-astro-cidattribute on selectors + rendered elements. The Cyberdigma widget DOM (.searchWidget,.c_lab-bw-widget, โฆ) is injected at runtime by the third-party web component and never gets the scope attribute, so the scoped overrides stopped matching.is:inlinekeeps the CSS global/unscoped so it matches the runtime-injected widget again. - No JS or markup behavior change; styling only.
- Only
-
Fixstop list from swallowing trailing paragraphsWhat this changes, and why
Fixes two list-rendering bugs in the Nostr markdown renderer (
public/scripts/render-markdown.js) seen on event previews:1. Text swallowed into the list. The renderer had no blank-line terminator, so every paragraph after a bullet list got pulled into the last
<li>and indented. Now a blank line followed by a non-indented line ends the list, and continuation requires indentation to the item-content column (first.indent + 2). 2. Empty bullet markers. Some editors emit a list item as a bare marker plus a blank line, with the text as a separate non-indented paragraph (-\n\ntext). That left an empty bullet with the text dropped below it. An empty marker now adopts the following paragraph as its content. Blank-line termination only kicks in once an item already has content.Nested lists, multi-paragraph items, and same-paragraph lazy continuation still render correctly (covered by manual tests against the real event content).
What this affects- Nostr markdown rendering on the event-preview and story-preview pages only. No security-sensitive areas (profile, key export, OpenBunker) touched.
- Bumps the
render-markdown.jsimport version query (?v=20260514โ?v=20260603) in both preview pages to bust the 4h public-script CDN/browser cache.
Open these previews on the MR preview link:
/en/event-preview/?d=event:proeverij-leadership-embodiment-hoe-je-krachtig-n-ontspannen-kunt-zijn-in-uitdagende-situaties-door-belichaamd-persoonlijk-leiderschap-mpeb9k0uc6s2r3y6y504m2sโ text after the bullet list ("Voor wie?" block) is left-aligned, not indented into the list./en/event-preview/?d=event:open-workshop-claude-code-mpf30obb1t1p2otx65725jโ the "Wat leer je?" bullets show their text next to each arrow (not an empty arrow with the text dropped below).
-
Fixalign list markers with item textWhat this changes, and why
Fixes a vertical gap between the list marker (arrow bullet / number) and the item text in
.prose-textlists. Loose-list items render their content inside<p>. Because.prose-textlists are CSS grid containers, each<li>establishes its own block formatting context, so the paragraph'sprosemargin-topno longer collapses and pushes the text below the marker.Fix: zero
margin-topon the first<p>andmargin-bottomon the last<p>inside list items (.prose-text li > p).Spotted on the Nostr event preview (workshop event), but it affects every
.prose-textsurface.Also documents an existing implicit convention in
What this affectsAGENTS.md: merge request descriptions and test plans are written in English (the MR template already is)..prose-text li > ptouches every.prose-textsurface that renders a loose list (blank line between items, producing<li><p>โฆ</p></li>):- Nostr event preview and story preview (
render-markdown.js) - Strapi rich text via
Markdown.astro: RichText, FAQs, Features, StepsGrid, Hero.astro(inlinemarked)- Both bulleted (
ul) and numbered (ol) lists
CardGrid, Spotlight, People, Categories, QuoteGrid, Newsletter, AudioPlayer, VideoGrid, ContactInfo
Not affected:
How to try it.arrow-liststandalone (RichText "chapters" nav โ different class), and tight lists (no<p>inside<li>, selector does not match). No security-sensitive areas touched.On the preview link, open content that contains a bulleted or numbered list with blank lines between items, and confirm the marker now lines up with the first line of text:
- [x] Nostr event preview (the original bug) โ arrow lists line up
- [x] Nostr story preview
- [x] Strapi RichText block:
ulandollists - [x] Numbered list (
ol): number circle aligns with text - [x] Strapi blocks with markdown that may contain lists: FAQs, Features,
- [x] Tight lists (no blank lines between items): unchanged
- [x] Multi-paragraph list items: spacing between paragraphs preserved
StepsGrid, CardGrid, Spotlight, People, Categories, QuoteGrid, Newsletter, AudioPlayer, VideoGrid, ContactInfo, Hero
(only first/last margin removed)
- [x] Branch named
feat/โฆ,fix/โฆ,chore/โฆ,docs/โฆorhotfix/โฆ - [x] Commit messages follow Conventional Commits
- [x]
pnpm formathas been run and the checks are green - [x] Tried it on the preview link
- [x] Rebased on the latest
main
- Nostr event preview and story preview (
-
OtherFeature/dynamic loaderWhat this changes, and why
Replaces all spinning SVG loaders with skeleton cards that match the shape of real story, event, and people cards. Loading.astro gains a variant prop ("story" | "event" | "people") with a count. The grids fill the right space from first paint, eliminating layout shift when content arrives.
Also adds an empty state to the profile page ("No stories or events found") for profiles with no content.
What this affects- src/components/Loading.astro โ new skeleton variants with shimmer; default spinner unchanged
- src/components/blocks/CardGrid.astro โ stories/events grid uses skeleton cards; removed grid.innerHTML = "" that caused a blank flash on reload
- src/components/blocks/People.astro โ people grid uses skeleton cards
- src/pages/[...locale]/event-preview.astro โ RSVP "Going" grid pre-renders people skeletons; removed JS buildAttendeeLoader spinner
- src/pages/[...locale]/profile-preview.astro โ content area shows event skeletons while loading + empty state when nothing is found
- public/scripts/card-generator.js, profile-card-generator.js โ clearGrid now preserves .skeleton-placeholder elements until the first real card replaces them
1. Open a page with stories, events, or a people section (eg: /en/stories/ , /en/calendar/ , /en/wonderful-people/). 2. Reload โ you should see shimmer skeleton cards immediately instead of a spinner. 3. Watch cards fade in and replace the skeletons without any layout jump. 4. On an event page, check the "The people you'll meet" section loads skeletons first. 5. On a profile with no content, confirm the empty state appears instead of a blank area.
-
Featuresurface ๐-approved stories/events regardless of follow listWhat this changes, and why
Expands how the stories/events overviews (and homepage blocks) are curated, in two steps.
1. Thumbs-up curation. A ๐ (kind 7) reaction from the Wonders of Work account now surfaces an individual story (30023) or calendar event (31923) in the overviews even when its author is not on the curation list. Routed through
nostr-queue(not a rawdirectFetch), because a raw concurrent REQ during initial load was answeredCLOSEDby relays that cap concurrent subscriptions, so approved content silently never rendered.2. Correct base curation source. The overviews were gated on the account's kind:3 follow list. The intended source is the NIP-51 kind:30000 follow set titled "Approved" (d-tag
HmLpoIl0DhQjBGkAGXeTr, 22 members). SwitchedfetchDefaultFollowListto that set, and decoupled its cache (window.approvedFollowSetCache+ localStorage keyapprovedFollowSetCache) from people-loader'swindow.defaultFollowListCache(the separate "Wonderful People" set used only by the people page), which the two overviews were sharing and could clobber.Net rule for an item to appear: in the Approved set OR has a ๐ from the account. Author-scoped detail/profile pages are untouched (they already show everything by that author).
What this affectspublic/scripts/content-loader.jsโ curation source, approval layer, queue routing, cache key.src/components/blocks/CardGrid.astro,src/pages/[...locale]/profile-preview.astroโ cache-bust version query only.- Surfaces:
/calendar/,/stories/, homepage story/event blocks (all locales). - Not security-sensitive (no profile, key export, or OpenBunker code). People page ("Wonderful People") deliberately left unchanged.
On the preview link, open
/en/calendar/and/en/stories/(and the NL variants):- The base list reflects the Approved kind:30000 set (22 members), not the old 49-member kind:3 list.
- An event whose author is in the Approved set shows (e.g. *recharging breathwork*, *proeverij leadership*).
- An item with only a ๐ from the account, whose author is not in the Approved set, still shows (e.g. *rise-to-get-there*).
- Profile pages are unchanged.
Verified each step on the Cloudflare preview with a headless browser; no console errors.
Before you ask for review- [x] Branch named
feat/โฆ - [x] Commit messages follow Conventional Commits
- [x]
pnpm formathas been run and the checks are green - [x] Tried it on the preview link
- [x] Rebased on the latest
main
-
CImake the MR description check blockingWhat this changes, and why
Flips the
What this affectsmr-descriptionCI job from a non-blocking warning to blocking (exit 0toexit 1). The team has the workflow in place, so a missing section should now fail the pipeline instead of only warning.
How to try it.gitlab-ci.yml(themr-descriptionjob) and the matching wording inCONTRIBUTING.md. No application code. Only affects MR pipelines (the job runs onmerge_request_eventonly).This MR description has all three required sections, so the
mr-descriptionjob passes here. An MR missing any of them now fails that job (and the pipeline) until added. -
Docsformalise MR description expectations + CI checkWhat this changes, and why
Defines the expectation that every merge request includes a clear description, what it touches, and a test plan โ and aligns the template, CONTRIBUTING and CI with that expectation, so the review hub at
review.wondersofwork.nlbecomes genuinely useful for non-technical and AI-assisted reviewers.- Adds a "What this affects" section to the merge request template, between "What this changes, and why" and "How to try it".
- CONTRIBUTING.md gets a new "Writing a good MR description" section with the three expected fields (and a TOC entry).
- CI gets a new
mr-descriptionjob that warns when any of those sections is missing, non-blocking for now.
.gitlab/merge_request_templates/Default.mdโ adds one section.CONTRIBUTING.mdโ new H2 section + TOC entry, no other changes..gitlab-ci.ymlโ one new job (mr-description), runs only onmerge_request_eventpipelines, currently exits 0 (warning mode). Flip the markedexit 0toexit 1when the team is ready to enforce.
Nothing that touches application behaviour, production content or security-sensitive code.
How to try itOn this very MR: open the pipeline and find the
mr-descriptionjob โ it should print "โ MR description has all required sections." (because this description has them). To see the warning case, open a quick test MR with a minimal description; the job should list the missing sections without failing the pipeline. -
Choredrop duplicate astro build jobWhat this changes, and why
Removes the
What this affectsbuildjob from.gitlab-ci.yml. Cloudflare Pages already runs the fullastro buildon every MR (the "Cloudflare Pages" external status) and gates the merge, so running it again in GitLab CI was redundant and ~3x slower.
How to try it.gitlab-ci.ymlonly. CI keepsformat,typecheck,test,commitlintandmr-descriptionโ the checks Cloudflare does not cover. No application code touched. Production build path is unchanged (Cloudflare).On this MR: the pipeline should no longer show a
buildjob, the "Cloudflare Pages" external status still runs, and the MR stays mergeable on green. -
OtherFix RSVP attendee profile rendering
<!-- See CONTRIBUTING.md if anything here is unclear. -->
What this changes, and whyFixes the event detail RSVP attendee list so profile names and photos render from fetched Nostr kind:0 profile events instead of getting stuck as placeholder attendee cards.
The HAR for the Write Club event showed that attendee profile events could arrive while the attendee cards were still being built. The old code patched DOM nodes that did not exist yet, then the initial card render wrote
Anonymousplaceholders afterwards. This change renders attendee cards only for profiles that already have displayable profile data, shows the existing loader while RSVP/profile data is still actively loading, fetches missing attendee profiles, and re-renders the attendee grid as data arrives.The section heading is now visible as soon as the RSVP UI initializes. Counts are based on displayable attendee cards instead of raw RSVP events, so incomplete anonymous profiles do not inflate
How to try itThe people you will meet. The loader occupies the next card slot and is removed once the RSVP/profile fetch window is finished.Open the MR preview and visit:
/en/event-preview/?d=event:write-club-mpmmxhfu576r1q22144q561oOn a cold load, check the section
Before you ask for reviewThe people you will meet. The heading should be visible before all relay data is finished. Attendee cards whose profile name is already cached can render immediately; the count should increase only for displayable attendee cards. Missing or incomplete profiles should show the loader in the next card position while loading is active, without showing temporaryAnonymouscards, and the loader should disappear after the profile fetch completes or times out.- [x] Branch named
feat/โฆ,fix/โฆ,chore/โฆ,docs/โฆorhotfix/โฆ - [x] Commit messages follow Conventional Commits
- [x]
pnpm formathas been run and the checks are green - [x] Tried it on the preview link
- [x] Rebased on the latest
main
- [x] Branch named
-
Choreadd CODEOWNERS for review routingWhat
Adds
.gitlab/CODEOWNERSso GitLab auto-requests review from the right person for the files a merge request touches.Ownership is a starting point derived from git history:
- default reviewer:
@ih-abir - build / CI / tooling / docs:
@jurjendevries - profile / key export / OpenBunker:
@mmaaaazu - Nostr client scripts:
@ih-abir+@mmaaaazu
Note: this only enforces approval once branch protection on
mainhas "Require approval from Code Owners" enabled (a separate team decision). Until then it just suggests reviewers. Adjust the mapping as the team sees fit. - default reviewer: