Skip to content

Maintainer Month 2026 site update#377

Open
ashleywolf wants to merge 17 commits intogithub:mainfrom
ashleywolf:2026-site-update
Open

Maintainer Month 2026 site update#377
ashleywolf wants to merge 17 commits intogithub:mainfrom
ashleywolf:2026-site-update

Conversation

@ashleywolf
Copy link
Contributor

Maintainer Month 2026 Site Update

Comprehensive refresh of the Maintainer Month site for 2026. Addresses 11 of 12 open issues, adds new features, and cleans up the codebase.

Year rollover

  • All 2025 references updated to 2026 (theme placeholder until decided)
  • Archived 38 event files to content/2025/events/
  • Created pages/2025/schedule/ routing for archived events
  • Fixed pre-existing bug where 2023/2024 pages incorrectly referenced 2022 events

Issues addressed

New features

  • Ships page (/ships) — Curated GitHub changelog entries relevant to maintainers, managed via content/ships/ships.json
  • Updated partner pack — Call for 2026 partners, directs to maintainermonth@github.com
  • Updated issue template — Times now optional (TBD/all-day), added workshop event type

Site cleanup

  • Removed Security Challenge from navigation
  • Removed yarn.lock (project uses npm)
  • Removed smoothscroll-polyfill (unnecessary in modern browsers)
  • Fixed next.config.js workspace root warning
  • Fixed npm start to work with static export
  • Fixed all title tag warnings and img lint warnings
  • Added empty states for schedule and library pages
  • Added tests for ships data and event parsing (27 total tests, all passing)

Not addressed

Testing

  • Build: clean, zero warnings
  • Tests: 27/27 passing across 4 suites
  • All pages return 200 (verified home, schedule, library, partner-pack, ships, news, 2022-2025 archives, all 38 archived event detail pages)
  • All internal links verified
  • ICS file generates correctly

Closes #269, closes #259, closes #250, closes #272, closes #297, closes #245, closes #242, closes #244, closes #87, closes #88, closes #64

ashleywolf and others added 17 commits March 14, 2026 20:20
Adds Twitch (twitch.tv/github) and Bluesky (bsky.app/profile/github.com)
icons to the footer social links, following the existing pattern.

- Created SVG icon components for Twitch and Bluesky in public/icons/
- Added i18n strings for URLs and aria-labels in commons.json
- Updated Footer.jsx with new imports and link entries

Closes github#269

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Roll over all 2025 references to 2026 (theme TBD)
- Fix hero section text/button overlap on mobile (github#259)
- Fix horizontal scroll on medium screens (github#250)
- Add responsive breakpoints for schedule page
- Clarify README: use npm run dev, add Node version requirement (github#272, github#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>
- Filter by event type with multi-select chip buttons (All clears filters)
- Group events by date with visible section headers
- Jump-to-date buttons that scroll to the target date group
- Sticky filter bar stays visible while scrolling
- Empty state message when no events match filters

Fixes github#244

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 github#245, fixes github#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 (github#88)
- Add skip-to-content link, ARIA landmarks, heading hierarchy, focus styles (github#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 (github#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>
Copilot AI review requested due to automatic review settings March 15, 2026 06:20
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 website for the 2026 rollout, including new site features (Ships page, ICS export), accessibility/responsiveness improvements, and year-based routing/archiving for prior schedules and events.

Changes:

  • Adds a new “Ships” page fed by content/ships/ships.json and includes supporting styles/tests.
  • Improves schedule UX (filtering, date grouping, empty states) and introduces build-time ICS generation.
  • Rolls site copy/routing forward to 2026 while adding archived schedule routes and moving 2025 event content into content/2025/events/.

Reviewed changes

Copilot reviewed 64 out of 104 changed files in this pull request and generated 12 comments.

Show a summary per file
File Description
tests/ships.test.js Validates ships JSON schema/constraints.
tests/events.test.js Updates event parsing expectations (incl. timeDisplay).
tests/event-parsing.test.js Adds coverage for TBD/all-day times and multi-day endDate parsing.
styles/styles.scss Registers Ships component stylesheet.
styles/base.scss Adds skip-link and screen-reader-only utilities; improves focus outline.
public/maintainer-month-2026.ics Adds an ICS file placeholder in public/.
public/icons/twitch.js Adds Twitch icon component.
public/icons/rocket.js Adds Rocket icon for Ships nav entry.
public/icons/bluesky.js Adds Bluesky icon component.
pages/ships.js Adds /ships page that renders ships data.
pages/security-challenge.js Updates Security Challenge page copy/meta tags for 2026.
pages/schedule/index.js Updates schedule meta title and adds build-time ICS generation.
pages/schedule/[slug].js Simplifies event detail <title> construction.
pages/partner-pack.js Updates partner-pack messaging for 2026 partner outreach.
pages/news.js Adds a “previous years” notice above existing news list.
pages/_app.js Removes smoothscroll-polyfill usage.
pages/2025/schedule/index.js Adds archived 2025 schedule index route.
pages/2025/schedule/[slug].js Adds archived 2025 event detail routes.
pages/2024/schedule/index.js Fixes 2024 schedule to load 2024 events.
pages/2024/schedule/[slug].js Fixes 2024 schedule paths and slug parsing to use 2024 events.
pages/2024/index.js Fixes 2024 home schedule link and data sources.
pages/2023/schedule/index.js Fixes 2023 schedule to load 2023 events.
pages/2023/schedule/[slug].js Fixes 2023 schedule paths and slug parsing to use 2023 events.
pages/2023/index.js Fixes 2023 home schedule link and data sources.
pages/2022/schedule/index.js Simplifies 2022 schedule <title> construction.
pages/2022/schedule/[slug].js Simplifies 2022 event detail <title> construction.
package.json Adds ics + cross-env, updates start for static output.
package-lock.json Locks new dependencies for ICS/build script changes.
next.config.js Sets outputFileTracingRoot for workspace/root warnings.
content/ships/ships.json Adds curated “Ships” data entries.
content/partner-pack/offers/jsconf.md Updates partner offer headline year.
content/partner-pack/offers/bootdev.md Updates partner offer link year.
content/partner-pack/index.md Updates partner pack title/meta for 2026.
content/home/5-events.md Updates “Upcoming events” header year.
content/home/2-about.md Updates theme placeholder copy for 2026.
content/home/1-hero.md Updates hero date to May 2026.
content/events/2025-05-30-Effection.md Removes old event file from prior location (archival move).
content/commons.json Updates global literals (2026 copy, new nav label, ICS strings, all-day/TBD strings).
content/2025/events/pycon-us-2025.md Adds archived 2025 event markdown.
content/2025/events/2025-05-30-effection.md Adds archived 2025 event markdown.
content/2025/events/2025-05-30-Libre-Sign.md Adds archived 2025 event markdown.
content/2025/events/2025-05-28-Deskree.md Adds archived 2025 event markdown.
content/2025/events/2025-05-27-CRA.md Adds archived 2025 event markdown.
content/2025/events/2025-05-26-Cultivating-Design.md Adds archived 2025 event markdown.
content/2025/events/2025-05-24-FSF-40-Chennai.md Adds archived 2025 event markdown.
content/2025/events/2025-05-24-FOSS-Meetup-Lucknow.md Adds archived 2025 event markdown.
content/2025/events/2025-05-24-FOSS-Meetup-Bengaluru.md Adds archived 2025 event markdown.
content/2025/events/2025-05-23-nuxt-ai.md Adds archived 2025 event markdown.
content/2025/events/2025-05-23-Build-CLI.md Adds archived 2025 event markdown.
content/2025/events/2025-05-21-kotlinconf.md Adds archived 2025 event markdown.
content/2025/events/2025-05-21-OSI.md Adds archived 2025 event markdown.
content/2025/events/2025-05-21-NGINX.md Adds archived 2025 event markdown.
content/2025/events/2025-05-19-Swift-Craft.md Adds archived 2025 event markdown.
content/2025/events/2025-05-19-05F5.md Adds archived 2025 event markdown.
content/2025/events/2025-05-17-FOSS-City-Meetup-Kanpur.md Adds archived 2025 event markdown.
content/2025/events/2025-05-16-supermemoryai.md Adds archived 2025 event markdown.
content/2025/events/2025-05-16-Querido-Diario.md Adds archived 2025 event markdown.
content/2025/events/2025-05-16-Open-Source-European-Commission.md Adds archived 2025 event markdown.
content/2025/events/2025-05-16-Cyber-Security.md Adds archived 2025 event markdown.
content/2025/events/2025-05-14-CloudFoundry.md Adds archived 2025 event markdown.
content/2025/events/2025-05-13-RustWeek.md Adds archived 2025 event markdown.
content/2025/events/2025-05-10-FOSS-United-Hyderabad.md Adds archived 2025 event markdown.
content/2025/events/2025-05-09-whopays.md Adds archived 2025 event markdown.
content/2025/events/2025-05-09-convex.md Adds archived 2025 event markdown.
content/2025/events/2025-05-09-Localization.md Adds archived 2025 event markdown.
content/2025/events/2025-05-09-Diciotech.md Adds archived 2025 event markdown.
content/2025/events/2025-05-07-PyTorch.md Adds archived 2025 event markdown.
content/2025/events/2025-05-06-OS-Pledge.md Adds archived 2025 event markdown.
content/2025/events/2025-05-06-Licensing-SBOMs.md Adds archived 2025 event markdown.
content/2025/events/2025-05-06-Innersource-China.md Adds archived 2025 event markdown.
content/2025/events/2025-05-06-GOSIM-AI.md Adds archived 2025 event markdown.
content/2025/events/2025-05-02-typewind.md Adds archived 2025 event markdown.
content/2025/events/2025-05-02-NPCI.md Adds archived 2025 event markdown.
content/2025/events/2025-05-02-Cookie-Cutter.md Adds archived 2025 event markdown.
content/2025/events/2025-05-01-OpenSearch.md Adds archived 2025 event markdown.
content/2025/events/2025-05-01-OpenPath.md Adds archived 2025 event markdown.
components/ships/ships.scss Adds Ships page styling.
components/ships/Ships.jsx Adds Ships list UI.
components/partner-pack/offers/Offers.jsx Adds lint suppressions for <img> usage.
components/library-links/LibraryLinks.jsx Adds empty-state rendering for library links.
components/layout/layout.scss Prevents horizontal overflow and adjusts main focus styling.
components/layout/Layout.jsx Adds skip-to-content link and ARIA landmark attributes.
components/home/hero/hero.scss Fixes hero overflow/spacing for responsive layouts.
components/home/get-involved/ExampleCard.jsx Fixes heading hierarchy (h2 -> h3).
components/home/events/useIncomingEvents.js Keeps multi-day events “upcoming” until endDate passes.
components/home/events/Events.jsx Removes unused Council import and commented render.
components/home/council/Council.jsx Updates advisory council title year.
components/home/about/About.jsx Updates theme heading/copy for 2026.
components/header/Header.jsx Adds Ships nav item and improves nav accessibility labeling.
components/footer/footer.scss Enables wrapping/centering for social icons row.
components/footer/Footer.jsx Adds Twitch/Bluesky footer links and contentinfo landmark.
components/events-list/events-list.scss Adds sticky filters, empty states, and grid/layout fixes.
components/events-list/EventsList.jsx Implements filtering + date grouping + ICS download CTA.
components/event-detail/event-detail.scss Adds wrapper styling for linked titles.
components/event-detail/EventDetail.jsx Adds multi-day date chip + timeDisplay support + heading wrapper.
components/date-time-chip/DateTimeChip.jsx Adds TBD/all-day rendering and uses timeDisplay.
components/chip/chip.scss Prevents chip overflow with ellipsis.
common/routes.js Adds /ships route constant.
api/events.js Adds all-day/TBD parsing + timeDisplay; supports endDate.
api/calendar.js Adds ICS generation utility.
README.md Updates year + improves local dev/build instructions.
Participation.md Updates year/theme section headings.
CONTRIBUTING.md Updates examples and documents optional times + endDate behavior.
.github/ISSUE_TEMPLATE/add-to-calendar.yml Makes times optional and adds workshop event type.

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

Comment on lines 55 to +60
export async function getStaticProps() {
const events = parseEvents(getEvents())

const icsContent = generateICS(events)
const icsPath = path.join(process.cwd(), 'public', 'maintainer-month-2026.ics')
fs.writeFileSync(icsPath, icsContent, 'utf-8')
Comment on lines 1 to 4
import { useEffect } from 'react'
import fs from 'fs'
import path from 'path'
import Head from 'next/head'
Comment on lines 7 to 31
@@ -14,19 +14,20 @@
"dayjs": "^1.11.10",
"fathom-client": "^3.6.0",
"gray-matter": "^4.0.3",
"ics": "^3.8.1",
"jimp": "^1.6.0",
"markdown-it": "^14.1.1",
"marked": "^15.0.11",
"next": "^15.0.8",
"react": "18.2.0",
"react-dom": "18.2.0",
"smoothscroll-polyfill": "^0.4.4"
"react-dom": "18.2.0"
},
"devDependencies": {
"@babel/preset-env": "^7.23.3",
"@testing-library/jest-dom": "^6.1.4",
"@testing-library/react": "^14.1.0",
"babel-jest": "^29.7.0",
"cross-env": "^10.1.0",
"eslint": "8.53.0",
Comment on lines 6 to 10
"dev": "next dev",
"build": "NODE_ENV=production next build",
"start": "next start",
"build": "cross-env NODE_ENV=production next build",
"start": "npx serve out",
"lint": "next lint",
"test": "jest"
## Getting Started

### Installation
Requires [Node.js](https://nodejs.org/) v18.18 or later.
Comment on lines +13 to +32
if (!ships || ships.length === 0) {
return (
<section className="ships">
<p className="ships__empty">
No ships listed yet. Check back soon!
</p>
</section>
)
}

const sorted = [...ships].sort(
(a, b) => new Date(b.date) - new Date(a.date)
)

return (
<section className="ships">
<div className="ships__intro">
<h2 className="ships__heading">Recent ships for maintainers</h2>
<p className="ships__subtitle">GitHub features and updates that make maintaining open source projects easier. Shipped recently or coming soon.</p>
</div>
<p
className="events-list__text"
dangerouslySetInnerHTML={{
__html: md().render(event.description || ''),
Comment on lines +4 to 7
headline: "Unlock early bird pricing for JSConf North America 2026!"
description: "Maintainers can access a special discounted ticket rate — available in limited quantities for Maintainer Month."
secondaryCta: "Use code: JSCONF25GITMAIN"
ctaText: "Learn more"
Comment on lines 146 to 149
formattedStartTime = {
utc: formattedUTCStartTime,
pt: formattedPTStartTime,
utc: UTCStartTime.format('HH:mm a'),
pt: PTStartTime.format('HH:mm a'),
}
Comment on lines +23 to +29
const icsEvent = {
title: event.title,
description: event.description || '',
location: event.location || '',
url: event.linkUrl || '',
calName: 'Maintainer Month 2026',
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

2 participants