A modern Node.js application that creates GitHub issues and HackMD documents for Node.js team meetings. This tool automates the process of reading meeting configuration, fetching calendar events, creating meeting minutes documents, and posting GitHub issues.
- Node.js 22+ (LTS)
- GitHub Personal Access Token
- HackMD API Token (for meeting minutes)
- Create a GitHub Personal Access Token
- Grant the following permissions:
repo(Full control of private repositories)user(Read user information)
- Go to HackMD and sign in to your account
- Navigate to Account Settings > API Tokens
- Create a new API token for the meeting artifacts tool
- Optionally, create or join a team workspace for better organization
create-node-meeting-artifacts/
βββ src/
β βββ config.mjs # Environment configuration (API tokens)
β βββ constants.mjs # Application constants
β βββ github.mjs # GitHub API integration
β βββ calendar.mjs # Calendar integration
β βββ hackmd.mjs # HackMD API integration
β βββ meeting.mjs # Config loading + template rendering
β βββ types.d.ts # Type definitions
β βββ utils/ # Date and URL helpers
βββ meetings/ # One <group>.meeting.json per meeting group
βββ templates/
β βββ meeting.mustache # Single shared template (issue + minutes)
βββ .nvmrc # Node.js version
βββ .env.example # Environment variables example
βββ create-node-meeting-artifacts.mjs # Main application
βββ TEMPLATES_DOCUMENTATION.md # Meeting config reference
βββ README.md # This file
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 an identical format, and the same shared
templates/meeting.mustache renders both the
GitHub issue and the HackMD minutes for every group β so every meeting's
artifacts look the same.
{
"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"
},
"hackmd": {
"team": "openjs-nodejs"
},
"joining": {
"participant": "https://zoom.us/j/611357642",
"observer": "https://www.youtube.com/c/nodejs+foundation/live"
},
"invited": ["@nodejs/tsc"]
}See TEMPLATES_DOCUMENTATION.md for a full reference
of every field, including the optional ones (github.agendaLabel,
github.issueLabels, joining.notes, observers, and curated agenda sections).
Adding a group is a single step: create its config file.
Add meetings/<group>.meeting.json following the format above. The filename stem
(<group>) is what you pass on the command line and to the workflows.
The GitHub Actions workflows discover meeting groups automatically:
- The scheduled workflow builds its matrix by listing
meetings/*.meeting.json. - The manual workflow reads the owner straight from the JSON file.
No workflow edits and no package.json scripts are needed.
- Clone the repository
- Install dependencies:
npm install - Copy
.env.exampleto.envand configure your credentials - Create meeting artifacts:
npm run dev -- <group>(e.g.npm run dev -- tsc)
npm run lint # Run ESLint
npm run lint:fix # Fix ESLint issues automatically
npm run format # Format code with Prettier
npm run format:check # Check code formatting
npm run check # Run both linting and formatting checks# Using npx
npx --env-file=.env . tsc
# Direct execution (with a `.env` file)
node --env-file=.env create-node-meeting-artifacts.mjs tsc
# Preview the rendered issue without creating anything
node --env-file=.env create-node-meeting-artifacts.mjs tsc --dry-runThe CLI accepts the following flags:
--dry-run: render and print the issue without creating an issue or document--force: create a new issue/document even if one already exists--verbose: enable debug logging from the GitHub client
The application creates:
- GitHub Issue: Posted to the configured repository with meeting details and agenda
- HackMD Document: Meeting minutes document in Markdown format with collaborative editing
- Console Output: Links to both the created issue and HackMD document
GITHUB_TOKEN: GitHub Personal Access TokenHACKMD_API_TOKEN: HackMD API token for creating and managing documents
Each meeting is configured by a meetings/<group>.meeting.json file. See
TEMPLATES_DOCUMENTATION.md for the complete field
reference.