Every meeting group is described by a single JSON file in the
meetings/ directory, named <group>.meeting.json — for example,
tsc.meeting.json. Each file follows the identical format documented below.
All meeting artifacts — both the GitHub issue and the HackMD minutes — are
rendered from one shared template,
templates/meeting.mustache, so every group's
issue and notes share the same structure.
The filename stem is the group identifier you pass on the command line
(npx . <group>) and the value the workflows use. For example,
meetings/tsc.meeting.json is the tsc group.
{
"name": "Technical Steering Committee (TSC)",
"host": "Node.js",
"calendar": {
"filter": "Node.js TSC Meeting",
"url": "https://calendar.google.com/calendar/ical/<id>/public/basic.ics"
},
"github": {
"owner": "nodejs",
"repo": "TSC",
"agendaLabel": "tsc-agenda",
"issueLabels": ["tsc-meeting"]
},
"hackmd": {
"team": "openjs-nodejs"
},
"joining": {
"participant": "https://zoom.us/j/611357642",
"observer": "https://www.youtube.com/c/nodejs+foundation/live",
"notes": "Regular password."
},
"invited": ["@nodejs/tsc"],
"observers": [],
"agenda": []
}| Field | Required | Description |
|---|---|---|
name |
✅ | Human-readable group name, used in the meeting title. |
host |
❌ | Meeting host. Defaults to "Node.js". Use "OpenJS Foundation" etc. |
calendar |
✅ | Calendar lookup configuration (see below). |
github |
✅ | GitHub configuration (see below). |
hackmd |
✅ | HackMD configuration (see below). |
joining |
✅ | How to join/observe the meeting (see below). |
invited |
✅ | Array of invited attendees (GitHub team mentions or names). |
observers |
❌ | Array of standing observers. Defaults to []. |
agenda |
❌ | Array of manually-curated agenda sections (see below). Defaults to []. |
| Field | Required | Description |
|---|---|---|
filter |
✅ | Text matched against calendar event summaries/descriptions. |
url |
✅ | The iCal feed URL searched for the next meeting occurrence. |
page |
❌ | Public "add to your calendar" page linked from the minutes. Defaults by host (see below). |
The page default is https://calendar.openjsf.org when host is
"OpenJS Foundation", otherwise https://nodejs.org/calendar.
| Field | Required | Description |
|---|---|---|
owner |
✅ | Organization/user that owns the meeting repository. |
repo |
✅ | Repository where the meeting issue is created. |
agendaLabel |
❌ | Label used to collect agenda issues. Defaults to <group>-agenda. |
issueLabels |
❌ | Labels applied to the created meeting issue. |
Agenda items are gathered from issues and pull requests across the entire
owner organization that carry the agendaLabel.
| Field | Required | Description |
|---|---|---|
team |
✅ | HackMD team the minutes document is created under. |
| Field | Required | Description |
|---|---|---|
participant |
❌ | Where participants join (a URL or a short instruction). |
sessions |
❌ | Alternating sessions with per-session join links (see below). |
observer |
❌ | Where observers watch the livestream (a URL). |
notes |
❌ | Any additional joining notes (e.g. "Regular password."). |
Some groups alternate between time slots that each have their own join link — for
example, the TSC rotates between a 13:00 UTC and a 17:00 UTC slot, each running
every two weeks. Model these with joining.sessions instead of a single
participant:
"joining": {
"observer": "https://www.youtube.com/c/nodejs+foundation/live",
"sessions": [
{ "time": "13:00", "participant": "https://zoom-lfx.platform.linuxfoundation.org/meeting/94552847907?password=..." },
{ "time": "17:00", "participant": "https://zoom-lfx.platform.linuxfoundation.org/meeting/96540765177?password=..." }
]
}time is the UTC time of day (HH:MM). When the tool finds the next
occurrence on the calendar, it selects the session whose time matches that
occurrence's UTC time and shows its link. If no session matches (such as a
--dry-run, which has no real occurrence), every session is listed.
| Field | Required | Description |
|---|---|---|
time |
✅ | UTC time of day in HH:MM form. |
participant |
✅ | Where participants join this session (URL). |
Use this for groups that maintain curated, recurring sections in addition to the
label-driven agenda — for example, the TSC's reminders, the CPC's working-group
updates, or the Security WG's standing review items. These sections render in the
minutes only (the GitHub issue stays focused on the label-driven agenda and
joining details), and they appear before the label-driven "Issues and Pull
Requests" section. A section with an empty items array renders just its heading
(useful for live-filled sections like "Strategic Initiatives"). Each section is:
| Field | Required | Description |
|---|---|---|
title |
✅ | Section heading. |
description |
❌ | Text rendered under the heading. |
items |
✅ | Bullet list items (typically links). |
Example:
"agenda": [
{
"title": "Regular Reviews",
"description": "Please review our standing list before the meeting:",
"items": [
"https://github.com/nodejs/TSC/labels/tsc-review"
]
}
]