Skip to content

Maintainer month 2026 update#380

Merged
abbycabs merged 23 commits intomainfrom
maintainer-month-2026-update
Mar 23, 2026
Merged

Maintainer month 2026 update#380
abbycabs merged 23 commits intomainfrom
maintainer-month-2026-update

Conversation

@abbycabs
Copy link
Member

Closes #377

creating a local branch PR to fix codeql errors

ashleywolf and others added 23 commits March 19, 2026 12:24
- Roll over all 2025 references to 2026 (theme TBD)
- Fix hero section text/button overlap on mobile (#259)
- Fix horizontal scroll on medium screens (#250)
- Add responsive breakpoints for schedule page
- Clarify README: use npm run dev, add Node version requirement (#272, #297)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Change overflow-x: hidden to overflow-x: clip on layout__content
  so position: sticky on the header works correctly (hidden creates
  an implicit scroll container that breaks sticky positioning)
- Add box-sizing: border-box to event cards for consistent sizing
- Make markdown-rendered <p> tags inline inside line-clamped text
  so -webkit-line-clamp works correctly with rendered descriptions

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- api/events.js: Add explicit handling for 'TBD' and 'all-day' time
  values in frontmatter. Add timeDisplay field ('specific', 'tbd',
  'all-day') to formatEventDateTime output.
- DateTimeChip: Show clean 'TBD' or 'All Day' label without PT
  conversion row when times aren't specific.
- EventDetail: Show date range chip for multi-day events.
- EventsList: Pass timeDisplay prop; use dash separator in date range.
- useIncomingEvents: Multi-day events remain 'upcoming' until endDate
  passes.
- CONTRIBUTING.md: Document optional UTCStartTime/UTCEndTime and
  endDate fields.
- commons.json: Add 'message:all-day' i18n literal.

Fixes #245, fixes #242

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ue template

- Move 38 event files from content/events/ to content/2025/events/
- Create pages/2025/schedule/ routing for archived 2025 events
- Fix bug: pages/2023/ and pages/2024/ incorrectly referenced 2022 events
- Add iCalendar/ICS feed generation at build time (#88)
- Add skip-to-content link, ARIA landmarks, heading hierarchy, focus styles (#64)
- Update issue template: times optional for TBD/all-day, add workshop type
- Empty content/events/ ready for 2026 submissions

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Add cross-env for Windows-compatible NODE_ENV in build script (#272)
- Footer social icons now wrap on narrow screens instead of overflowing

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Schedule page shows 'coming soon' message when no events exist
- Library page shows empty state message when no resources
- Theme changed to 'Coming Soon' placeholder until 2026 theme is decided
- Removed Council import from homepage (no council for 2026)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
New /ships page showing curated GitHub changelog entries relevant to
maintainers. Data is managed via content/ships/ships.json. Includes
9 initial ships (Issues, Pull Requests, Copilot, Repository Management).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Ships tests: validate required fields, date format, URL format, description length
- Event parsing tests: TBD defaults, all-day handling, multi-day endDate, validation errors

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Add box-sizing, overflow-wrap, word-break for long titles
- Add min-width: 0 on cards to prevent grid blowout

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Remove yarn.lock (project uses npm)
- Remove smoothscroll-polyfill (unnecessary in modern browsers)
- Fix next.config.js: add outputFileTracingRoot
- Fix package.json: start script uses serve for static export
- Fix all title tag warnings across 11 pages (template literals)
- Fix img lint warnings in Offers.jsx
- Fix archived year pages (2023/2024) to reference correct content
- Update CONTRIBUTING.md example to 2026
- Add previous-years note to news page

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Fix calendar API timezone handling
- Fix events API error handling
- Fix EventsList rendering edge case
- Update Ships component layout
- Update commons.json and partner-pack content
- Add test coverage for event edge cases
- Update dependencies

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Use getEvents() in schedule/[slug].js instead of raw fs.readdirSync
  (getEvents already handles missing directories gracefully)
- Add serve as pinned devDependency instead of npx

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Update meta:title and page:date from 2025 to 2026. These were missed
in the initial year rollover and caused the page header and meta tags
to still display 2025.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Abby Cabunoc Mayes <abbycabs@github.com>
- Revert jsconf offer headline and promo code to 2025 (past offers)
- Revert security-challenge.js to 2025 (page removed from nav)
- Add comment on 2024/index.js explaining 2023 home content fallback

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Adds file-type >=21.3.1 to overrides to fix the transitive dependency
vulnerability through jimp.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
file-type >=21.3.1 changed its exports structure, breaking
@jimp/core's import of file-type/core.js. The Dependabot alert
for file-type needs to be resolved by upgrading jimp instead.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings March 23, 2026 15:15
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Updates the Maintainer Month site for the 2026 rollover and addresses CodeQL/lint/test issues by refreshing content, adding new pages/features (Ships + ICS), and improving accessibility and event parsing behavior.

Changes:

  • Adds a new Ships page backed by content/ships/ships.json plus tests and styling.
  • Enhances the Schedule with build-time ICS generation and improves event parsing to support TBD / all-day times and multi-day events.
  • Performs the 2026 content rollover, archives 2025 events under content/2025/events/, and adds routing for the 2025 schedule archive.

Reviewed changes

Copilot reviewed 60 out of 100 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
tests/ships.test.js Adds validation tests for ships JSON entries.
tests/events.test.js Makes event-directory tests tolerant of missing content/events.
tests/event-parsing.test.js Adds coverage for TBD/all-day/valid time parsing and error cases.
styles/styles.scss Registers Ships component styles in global stylesheet.
styles/base.scss Improves focus styles + adds skip-link and screen-reader utility classes.
public/maintainer-month-2026.ics Adds placeholder ICS file (to be overwritten during build).
public/icons/rocket.js Adds Rocket icon used in navigation.
pages/ships.js Adds /ships page that renders Ships data.
pages/schedule/index.js Generates ICS file during static build and renders schedule list.
pages/schedule/[slug].js Uses getEvents() for static paths instead of direct FS listing.
pages/partner-pack.js Updates partner pack messaging for 2026 partner outreach.
pages/news.js Adds a “previous years” note above existing news links.
pages/_app.js Removes smoothscroll polyfill usage.
pages/2025/schedule/index.js Adds 2025 schedule archive index route.
pages/2025/schedule/[slug].js Adds 2025 event detail routes reading from content/2025/events.
pages/2024/schedule/index.js Fixes 2024 schedule to pull 2024 events.
pages/2024/schedule/[slug].js Fixes 2024 event paths/props to read 2024 content.
pages/2024/index.js Fixes 2024 home routing/content sourcing and schedule link.
pages/2023/schedule/index.js Fixes 2023 schedule to pull 2023 events.
pages/2023/schedule/[slug].js Fixes 2023 event paths/props to read 2023 content.
pages/2023/index.js Fixes 2023 home routing/content sourcing and schedule link.
pages/2022/schedule/index.js Title formatting cleanup for 2022 schedule page.
pages/2022/schedule/[slug].js Title formatting cleanup for 2022 event detail page.
package.json Adds ics, cross-env, serve; updates build/start scripts; removes smoothscroll polyfill.
package-lock.json Locks new dependencies for ICS generation and static serving.
next.config.js Adds outputFileTracingRoot for workspace root warnings.
content/ships/ships.json Adds ships data source for the Ships page.
content/partner-pack/offers/bootdev.md Updates Boot.dev offer link to 2026 URL.
content/partner-pack/index.md Updates partner pack metadata to 2026.
content/home/5-events.md Updates home schedule title to 2026.
content/home/2-about.md Updates theme placeholder text for 2026.
content/home/1-hero.md Updates hero date to May 2026.
content/events/2025-05-30-Effection.md Removes/archives an event from the current-year events folder.
content/commons.json Rolls literals to 2026 + adds Ships + all-day + schedule empty/ICS strings.
content/2025/events/pycon-us-2025.md Adds archived 2025 event content.
content/2025/events/2025-05-30-effection.md Adds archived 2025 event content.
content/2025/events/2025-05-30-Libre-Sign.md Adds archived 2025 event content.
content/2025/events/2025-05-28-Deskree.md Adds archived 2025 event content.
content/2025/events/2025-05-27-CRA.md Adds archived 2025 event content.
content/2025/events/2025-05-26-Cultivating-Design.md Adds archived 2025 event content.
content/2025/events/2025-05-24-FSF-40-Chennai.md Adds archived 2025 event content.
content/2025/events/2025-05-24-FOSS-Meetup-Lucknow.md Adds archived 2025 event content.
content/2025/events/2025-05-24-FOSS-Meetup-Bengaluru.md Adds archived 2025 event content.
content/2025/events/2025-05-23-nuxt-ai.md Adds archived 2025 event content.
content/2025/events/2025-05-23-Build-CLI.md Adds archived 2025 event content.
content/2025/events/2025-05-21-kotlinconf.md Adds archived 2025 event content.
content/2025/events/2025-05-21-OSI.md Adds archived 2025 event content.
content/2025/events/2025-05-21-NGINX.md Adds archived 2025 event content.
content/2025/events/2025-05-19-Swift-Craft.md Adds archived 2025 event content.
content/2025/events/2025-05-19-05F5.md Adds archived 2025 event content.
content/2025/events/2025-05-17-FOSS-City-Meetup-Kanpur.md Adds archived 2025 event content.
content/2025/events/2025-05-16-supermemoryai.md Adds archived 2025 event content.
content/2025/events/2025-05-16-Querido-Diario.md Adds archived 2025 event content.
content/2025/events/2025-05-16-Open-Source-European-Commission.md Adds archived 2025 event content.
content/2025/events/2025-05-16-Cyber-Security.md Adds archived 2025 event content.
content/2025/events/2025-05-14-CloudFoundry.md Adds archived 2025 event content.
content/2025/events/2025-05-13-RustWeek.md Adds archived 2025 event content.
content/2025/events/2025-05-10-FOSS-United-Hyderabad.md Adds archived 2025 event content.
content/2025/events/2025-05-09-whopays.md Adds archived 2025 event content.
content/2025/events/2025-05-09-convex.md Adds archived 2025 event content.
content/2025/events/2025-05-09-Localization.md Adds archived 2025 event content.
content/2025/events/2025-05-09-Diciotech.md Adds archived 2025 event content.
content/2025/events/2025-05-07-PyTorch.md Adds archived 2025 event content.
content/2025/events/2025-05-06-OS-Pledge.md Adds archived 2025 event content.
content/2025/events/2025-05-06-Licensing-SBOMs.md Adds archived 2025 event content.
content/2025/events/2025-05-06-Innersource-China.md Adds archived 2025 event content.
content/2025/events/2025-05-06-GOSIM-AI.md Adds archived 2025 event content.
content/2025/events/2025-05-02-typewind.md Adds archived 2025 event content.
content/2025/events/2025-05-02-NPCI.md Adds archived 2025 event content.
content/2025/events/2025-05-02-Cookie-Cutter.md Adds archived 2025 event content.
content/2025/events/2025-05-01-OpenSearch.md Adds archived 2025 event content.
content/2025/events/2025-05-01-OpenPath.md Adds archived 2025 event content.
components/ships/ships.scss Adds styling for Ships page layout/cards.
components/ships/Ships.jsx Implements Ships list UI with sorting and empty state.
components/partner-pack/offers/Offers.jsx Adds lint suppression comments for <img> usage (currently broken JSX).
components/library-links/LibraryLinks.jsx Adds an empty state when there are no links.
components/layout/layout.scss Prevents horizontal overflow + suppresses focus outline on main.
components/layout/Layout.jsx Adds skip-to-content link + landmarks and focusable main target.
components/home/hero/hero.scss Adjusts hero overflow/background sizing and responsive spacing.
components/home/get-involved/ExampleCard.jsx Fixes heading hierarchy (h2→h3).
components/home/events/useIncomingEvents.js Keeps multi-day events “upcoming” until end date passes.
components/home/events/Events.jsx Removes unused Council import and dead commented usage.
components/home/council/Council.jsx Updates council heading to 2026.
components/home/about/About.jsx Updates theme header and heading level.
components/header/Header.jsx Replaces security-challenge nav item with Ships + adds nav aria-label.
components/footer/footer.scss Improves footer social layout for wrapping and centering.
components/footer/Footer.jsx Adds role="contentinfo" to footer.
components/events-list/events-list.scss Adds header actions + ICS button + card/grid improvements and focus styles.
components/events-list/EventsList.jsx Adds ICS download link, improves semantics, and adds schedule empty state.
components/event-detail/event-detail.scss Adds wrapper styling for heading/link semantics change.
components/event-detail/EventDetail.jsx Supports multi-day date display + uses DateTimeChip timeDisplay + improves heading semantics.
components/date-time-chip/DateTimeChip.jsx Adds timeDisplay handling for all-day/TBD and adjusts rendering logic.
components/chip/chip.scss Prevents chip overflow and enables ellipsis truncation.
common/routes.js Adds SHIPS route constant.
api/events.js Adds TBD/all-day parsing + multi-day support + timeDisplay metadata.
api/calendar.js Adds ICS generation from parsed events.
README.md Updates docs for Node 20+, dev command, build output, and 2026 copyright.
Participation.md Updates Maintainer Month year references to 2026.
CONTRIBUTING.md Updates event naming, documents optional times, and adds endDate guidance.
.github/ISSUE_TEMPLATE/add-to-calendar.yml Makes times optional, documents TBD/all-day, and adds workshop type.
Comments suppressed due to low confidence (2)

components/partner-pack/offers/Offers.jsx:89

  • The /* eslint-disable-next-line ... */ comment inside the map return is not wrapped in JSX comment braces, which makes this block invalid JSX and will fail to compile. Use {/* eslint-disable-next-line ... */} or move the disable comment above the map()/component instead.
      <div className="partner-logos">
        {sortedPartnerOffers.map((offer, index) => (
          /* eslint-disable-next-line @next/next/no-img-element */
          <img 
            key={index} 
            src={`/images/partners/${offer.logo}`} 
            alt={offer.name} 
          />

components/date-time-chip/DateTimeChip.jsx:55

  • In the 'specific' branch, the chip always renders a start - end range even when one side is still 'TBD' (which can happen when only one of the times is provided/valid). This results in output like TBD - 3:00 pm. Either guard this branch so it only renders when both start/end are specific, or render a single time / fallback to the 'tbd' display when one side is missing.
  return (
    <div className="datetime-chip">
      {startTime ? (
        <p className="datetime-chip__time">
          <span className="datetime-chip__icon">
            <IconClock />
          </span>
          {`${startTime.utc} - ${endTime.utc}`}
          <span className="datetime-chip__timezone">
            {getLiteral('timezone:utc')}
          </span>
        </p>
      ) : null}

      {endTime ? (
        <p className="datetime-chip__time">
          <span className="datetime-chip__icon">
            <IconClock />
          </span>
          {`${startTime.pt} - ${endTime.pt}`}
          <span className="datetime-chip__timezone">
            {getLiteral('timezone:pt')}
          </span>
        </p>
      ) : null}

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines 84 to 90
<Link
href={ROUTES.SECURITY_CHALLENGE.getPath(year)}
aria-label={getLiteral('navigation:security-challenge')}
href={ROUTES.SHIPS.getPath(year)}
aria-label={getLiteral('navigation:ships')}
className={clsx('header__link', {
['is-active']: pathname === ROUTES.SECURITY_CHALLENGE.getPath(year),
['is-active']: pathname === ROUTES.SHIPS.getPath(year),
})}
>
Copy link

Copilot AI Mar 23, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ROUTES.SHIPS.getPath(year) will generate year-prefixed URLs (e.g. /2025/ships) on archive routes, but there is no corresponding pages/{year}/ships route in the repo. This will produce broken navigation on year-scoped pages; consider linking to the non-year route (/ships) or adding year-specific Ships pages/routes.

See below for a potential fix:

                href={ROUTES.SHIPS.path}
                aria-label={getLiteral('navigation:ships')}
                className={clsx('header__link', {
                  ['is-active']: pathname === ROUTES.SHIPS.path,

Copilot uses AI. Check for mistakes.
}

const timeDisplay =
hasSpecificStartTime || hasSpecificEndTime ? 'specific' : 'tbd'
Copy link

Copilot AI Mar 23, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

timeDisplay is set to 'specific' when either the start or end time parses, which allows cases like “start time set, end time missing/TBD” (or vice versa) to be treated as a specific time range. This flows through to DateTimeChip and can render confusing output like 2:00 pm - TBD. Consider only setting timeDisplay: 'specific' when both start and end times are valid, or adjust the UI to handle partial times explicitly.

Suggested change
hasSpecificStartTime || hasSpecificEndTime ? 'specific' : 'tbd'
hasSpecificStartTime && hasSpecificEndTime ? 'specific' : 'tbd'

Copilot uses AI. Check for mistakes.
Comment on lines +31 to +50
if (hasTime) {
const [startHour, startMinute] = event.UTCStartTime.split(':').map(Number)
icsEvent.start = [EVENT_YEAR, startMonth, startDay, startHour, startMinute]
icsEvent.startInputType = 'utc'

if (!isTBDValue(event.UTCEndTime) && !isAllDayValue(event.UTCEndTime)) {
const [endHour, endMinute] = event.UTCEndTime.split(':').map(Number)

if (event.endDate && event.endDate !== event.date) {
const { month: endMonth, day: endDay } = parseDateParts(event.endDate)
icsEvent.end = [EVENT_YEAR, endMonth, endDay, endHour, endMinute]
} else {
icsEvent.end = [EVENT_YEAR, startMonth, startDay, endHour, endMinute]
}
icsEvent.startOutputType = 'utc'
icsEvent.endInputType = 'utc'
icsEvent.endOutputType = 'utc'
} else {
icsEvent.duration = { hours: 1 }
}
Copy link

Copilot AI Mar 23, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When an event has a start time but no end time, this code sets a duration but does not set startOutputType. That can cause the generated .ics to be interpreted/exported in local time depending on the ics library defaults, while the end-time branch forces UTC. Make the time-handling consistent by setting startOutputType: 'utc' whenever startInputType is 'utc' (including the duration case).

Copilot uses AI. Check for mistakes.
@abbycabs abbycabs merged commit d2c27a5 into main Mar 23, 2026
9 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants