Developers · Node.js

Live meeting transcript in Node.js, a line at a time with who said it

A Node.js program that prints each line as it is said, with the speaker, with what it printed when it was run.

Ran on 10 November 2026Language Node.jsJob Live transcript

What it does

Each transcript message is one finished line: who said it, what they said and when. This program prints them as they arrive and leaves after a set number of seconds.

It needs a key and a meeting code in MEETFUL_KEY and MEETING. Two curl requests make both. MEETFUL_URL is optional and defaults to https://meetful.com.

Node 22 or later. WebSocket and fetch are built into Node from version 22, so there is nothing to install.

The code

// Print every line said in a Meetful meeting, with the name of whoever said it, as it is said.
// MEETFUL_KEY=tmk_… MEETING=abc-defg-hij LISTEN_FOR=60 node listen.mjs
const base = process.env.MEETFUL_URL || 'https://meetful.com';
const listenFor = Number(process.env.LISTEN_FOR || 60) * 1000;
const ws = new WebSocket(base.replace(/^http/, 'ws'));

ws.addEventListener('open', () => {
  ws.send(JSON.stringify({ type: 'agent-hello', key: process.env.MEETFUL_KEY, meeting: process.env.MEETING }));
});

ws.addEventListener('message', ({ data }) => {
  const m = JSON.parse(data);
  if (m.type === 'agent-ready') {
    console.log(`listening in ${m.meeting}…`);
    setTimeout(() => ws.close(), listenFor);
  }
  if (m.type === 'transcript') {
    // The speaker is the microphone the words came in on: a fact, not a guess from mixed audio.
    const at = new Date(m.line.at).toISOString().slice(11, 19);
    console.log(`${at}  ${m.line.speaker}: ${m.line.text}`);
  }
  if (m.type === 'agent-refused') { console.error('Refused:', m.why); ws.close(); }
});

Run it

MEETFUL_KEY=tmk_… MEETING=abc-defg-hij node listen.mjs

What it printed

listening in iuq-qwbn-dtp…
14:16:51  Dana: Can we move the launch to the third of March?
14:16:51  Sam: Yes, if the docs are ready by the twentieth.
14:16:52  Dana: Then Sam owns the docs.

Run on 10 November 2026 against a Meetful server built from the same code as meetful.com, with two people — Dana and Sam — in the meeting saying three lines. Nothing above was edited.

How it works

The speaker field is the name of the person whose microphone the line came from. Meetful transcribes every microphone on its own, so there is no diarisation step to trust or to correct, and two people talking over each other stay two lines.

The at field is milliseconds since 1970, in UTC; the program prints it as hours, minutes and seconds. A line arrives once, when its speaker pauses — there are no partial lines to stitch together.

What can go wrong

Refused: no such key — mint one with POST /api/keys

The key is wrong, or was never minted on this server. A key from one Meetful server does not work on another.

Nothing printed after "listening in…"

Nobody has spoken yet, or the people in the meeting are muted. The socket stays open until LISTEN_FOR runs out.

Next

In Node.js: join a meeting · speak · get the transcript

The same in Python · Go

The whole API · Every socket message and webhook · All guides

Try Meetful

Meetings that take their own notes

Free video meetings in the browser: every line of the transcript under the name of who said it, and the summary and action items when you hang up. Nothing to install — guests just open the link.