On this page →

Introduction

Nearby

Scribe.perl (link to the source) is a perl script for generating meeting minutes from an IRC, IM or other log file that follows some simple minuting conventions. It is easy to use and requires no installation. It was primarily designed for use in and around W3C, but can also be used in other environments. (For use in other environments, see the Input Formats section.)

Scribe.perl supports links, images, slides, subsections and even math!

Some sample outputs: default style, with option -member, with option -team and with option -fancy.

This manual documents scribe.perl version 2, revision 227 (dated 19 July 2024). See below for the differences with version 1.

Quick Start Guide

Step 1: Invite RRSAgent and Zakim bot

Skip this step if you're not using W3C's IRC.

IRC Command Explanation Who?
/invite zakim calls Zakim to your IRC channel anybody
zakim, start meeting this makes Zakim invite RRSAgent and set up other things, depending on the channel anybody

Step 2: Describe the meeting:

IRC Command Explanation Who?
Scribe: dbooth dbooth is the IRC nickname of the scribe. If you don't give this command scribe.perl will guess the scribe. Use the command again if the scribe changes. There are several useful variants of this command, see the scribe command below. anybody
Meeting: WS Arch Teleconference Record meeting title. (On some channels, Zakim does this for you.) anybody
Chair: Mike Record who chairs anybody
Previous meeting: http://example.org/20180918 If you want a link to the previous meeting at the top of the minutes. anybody
Next meeting: http://example.org/20181002 Ditto for the next meeting. anybody
Agenda: http://example.org/agenda If you want a link to the agenda at the top of the minutes. anybody
rrsagent, make logs public (For public minutes and logs) Change the permissions on the IRC logs. (On some channels, Zakim does this for you.) Note that the permission changes are queued and it may be a minute or so before they take effect. anybody

Step 3: Take notes in IRC:

IRC Command Explanation Who?
Topic: Debate on Feature X Use "Topic: …" at the start of each agenda topic. Alternatively, you can use Zakim bot's agenda control, which is recognized by default. (See the -useZakimTopics option below.) anybody
Subtopic: Intro to feature X Use "Subtopic: …" for a subtopic. anybody
Mike: Feature X is great Record what Mike said. scribe
… and easy to implement. Mike's statement continues. Use either three periods or the ellipsis character ‘…’. (Some IRC clients automatically replace the former with the latter.) scribe
General agreement. A description or summary, not attributed to a particular speaker. Only works when the scribe writes this. scribe
ACTION: Frank to order lunch Record new action. anybody
Issue: Is it proven that 1+1=2? Record new issue. anybody
RESOLUTION: Accept Frank's proposal Indicate how an issue or topic was resolved. ‘RESOLVED’ is an alias for ‘RESOLUTION’. anybody
… with Pete's modified text Resolutions can be more than one line long. This line is added to the resolution in the previous line. (Such continuation lines also work for topics, issues and actions.) anybody
s/Mary/Marie/ Change most recent occurrence of ‘Mary’ to ‘Marie’. The old string is a literal string, not a regex. Alternate syntax: s|Mary|Marie| anybody
s/Mary/Marie/g Change all previous occurrences of "Mary" to "Marie". anybody
s/Mary/Marie/G Change all previous and future occurrences of ‘Mary’ to ‘Marie’ (within this document). anybody
i/Time to vote/Topic: Vote on Feature Y Insert a ‘Topic: Vote on Feature Y’ line before the line containing the literal string ‘Time to vote’ (not a regex). Alternate syntax: i|Time to vote|Topic: Vote on Feature Y anybody
<dbooth> :-) When dbooth is scribe and wants to add a remark on IRC as himself, rather than in his role of scribe, he can start the remark with his nick in angle brackets. (Hint: auto-completion in some IRC clients may reduce this to two or three keystrokes.) scribe

Step 4: Finish the meeting

IRC Command Explanation Who?
zakim, end meeting Dismiss zakim bot, which will generate a list of attendees and instruct RRSAgent to generate minutes. Use ‘Present: ...’ (described below) instead if you aren't using zakim bot. anybody
rrsagent, bye Dismiss RRSAgent (if used). anybody
(Download and edit the generated minutes) If you're using RRSAgent, then just edit the generated minutes and you are done. anybody

Step 5: Generate minutes

This step is only needed if you are not using RRSAgent, or you forgot step 4 and its too late to run RRSAgent now, or if you want to make edits that are best done locally.

Shell Command Explanation
(Save a copy of the IRC log, such as http://www.w3.org/2002/04/05-arch-irc.txt) (Hint: If RRSAgent wrote the minutes to http://...foo-minutes, then the IRC log will be at http://...foo-irc.txt.)
(Download scribe.perl) No installation is needed, but you must have perl.
perl scribe.perl log.txt > minutes.html Generate minutes.
(Review and make adjustments.) If the result isn't good enough, either: 1. edit your copy of the log file and regenerate the HTML; or 2. manually edit the resulting HTML. Option 1 is best if you forgot to indicate who is scribe (‘Scribe: …’), or if you forgot to mark a topic start (‘Topic: …’).

Pros and Cons of Using Scribe.perl

Pros:

Cons:

Running scribe.perl

Scribe.perl reads from the files given as arguments, or standard input if there are none; and writes to standard output:

perl scribe.perl [options] < log.txt > minutes.html

It can also be invoked by RRSAgent from IRC (provided you're using RRSAgent):

rrsagent, draft minutes

Options

Options described below are grouped in several categories:

There are three ways to specify options, from highest to lowest priority:

Options can be written with two dashes (‘--final’) or a single one (‘-final’) and they can be abbreviated as long as the abbreviation is unambiguous (‘--embedDiagnostics’ can be written ‘--embed’, but not ‘--em’, because that clashes with ‘--emphasis’). Case doesn't matter: ‘--dashTopics’ is the same as ‘--dashtopics’.

Options that require an argument can be separated from the argument with either a space or an equals sign: ‘--scribenick jvm’ or ‘--scribenick=jvm’.

Input Style Options

These options are used to accommodate the different input syntaxes and scribing styles.

-dashTopics

Indicate that dash lines are used to indicate that the next line is the start of a new topic, such as:

<Philippe> ---
<Philippe> Review of Action Items

instead of

<Philippe> Topic: Review of Action Items
-implicitContinuations

Indicate that the scribe used implicit continuation lines like this:

<dbooth> Mary: Now is the time
<dbooth> for all good men and women
<dbooth> to come to the aid of their party.

instead of this:

<dbooth> Mary: Now is the time
<dbooth> ... for all good men and women
<dbooth> ... to come to the aid of their party.

The scribe can still add descriptive lines (lines not attributed to any speaker) by starting a line with a backslash (see ‘Escaped’ below). E.g.:

<dbooth> Mary: Now is the time
<dbooth> for all good men and women
<dbooth> to come to the aid of their party.
<dbooth> \Everybody agrees

This option only applies to text assigned to a speaker. To continue topics, resolutions, actions or issues on the next line, you must still use ‘...’ or ‘…’.

-allowSpaceContinuations / -noallowSpaceContinuations

By default, scribe.perl removes leading spaces on a line and recognizes continuation lines because they start with three periods (‘...’) or an ellipsis (‘…’). -allowSpaceContinuations forces scribe.perl to treat lines that start with a space as continuation lines (if there is a line to continue), even if they don't start with ‘...’ For example, scribe.perl would normally interpret this fragment

<jim-scribe> Anna: Is the 5th OK?
<jim-scribe>  Silence.
<jim-scribe>  Jen: maybe

as three separate items: Anna saying ‘Is the 5th OK?’, the scribe giving a summary ‘Silence’ and Jen saying ‘maybe’. The extra spaces are ignored. With -allowSpaceContinuations, the three lines become a single statement attributed to Anna (‘Anna: Is the 5th OK? Silence. Jen: maybe’)

The default is -noallowSpaceContinuations.

This option only applies to text assigned to a speaker. To continue topics, resolutions, actions or issues on the next line, you must still use ‘...’ or ‘…’.

-useZakimTopics

[Default] Recognize when Zakim bot is used to manage the agenda and the list of attendees. Specifically, treat Zakim statements like:

<Zakim> agendum 2. "UTF16 PR issue" taken up [from MSMscribe]

as equivalent to the command:

<scribe> Topic: UTF16 PR issue

and use Zakim's lines such as ‘As of this point the attendees were…’ as an additional source of names for the presence list.

-noUseZakimTopics

Turn off the -useZakimTopics option. This also causes commands for Zakim (‘next agendum’, ‘q+’, ‘zakim, list participants’, etc.) and Zakim's answers to be treated as normal text for the minutes, rather than skipped.

Output Format Options

These options control the output format.

-scribeOnly
Only include what the scribe wrote. Discard any statements made on IRC.
-final
-nodraft
By default, scribe.perl includes a ‘- DRAFT -’ header in the formatted output, to remind you that the generated minutes still need manual editing. -final (or -nodraft) omits the "- DRAFT -" header.
-nofinal
-draft
[DEFAULT] Include a ‘- DRAFT -’ header.
-embedDiagnostics
Embed scribe.perl's diagnostic output into the generated minutes. This is most useful when scribe.perl is run as part of an automated process that otherwise would not display the diagnostic output to the user.
-noEmbedDiagnostics
[DEFAULT] Write diagnostic output to the console (stderr).
-keeplines / -nokeepLines

In the formatted minutes, continuation lines are, by default, shown on a line of their own, starting with ‘…’. (The HTML output contains a <br> to force a new line to start.). E.g., input such as

<pdh> Camille: This works fine.
<pdh> ... I tested it.
<pdh> ... See the report.

Will produce output similar to this:

Camille: This works fine.
… I tested it.
… See the report.

With -nokeepLines, the lines are instead shown as a single paragraph, without any ‘…’:

Camille: This works fine. I tested it. See the report.

Default is -keeplines.

-emphasis

Cause scribe.perl to interpret ‘ASCII highlighting’, arrows, smileys and mathematical formulas.

ASCII highlighting gives underlined, italic, bold and monospaced text:

Input Output
_underlined_ underlined
/italic/ italic
*bold* bold
`monospace` monospace

Highlighted phrases must be surrounded by spaces to be recognized or be at the edge of the line. They may be nested: this is */bold italics/*.

The option also causes the replacement of ASCII arrows and ASCII smileys:

Input Output
<-
<--
<=
<==
==>
=>
-->
->
:-)
;-) 😉︎
:-(
:-/ 😕︎
,-) 😜︎
\o/ 🙌︎

Mathematical formulas use LATEX notation, either between single $ signs (for inline math) or double $$ signs (display math), e.g.:

Then calculate $\frac{1}{x}$ and $$\sum_1^\inf{\frac{1}{x}}$$

yields:

Then calculate 1 x and 1 inf 1 x

Put a backslash before the first $ to avoid starting math, e.g.: from \$2.50 to $2.99 is no math.

Math requires an external program called ‘latexmlmath’ (part of a suite of programs called ‘latexml’). If you run scribe.perl and do not have ‘latexmlmath’, the formulas will remain in LATEX notation.

-urlDisplay break
[DEFAULT] Scribe.perl will ensure that long URLs can be broken at the end of a line, even in browsers that normally do not break URLs. This is done by inserting HTML's <wbr> tags after most slashes (/).
-urlDisplay shorten
Long URLs are shortened by displaying just the first and the last few characters, like this: ‘http:…c.html’.
-urlDisplay full
Long URLs are displayed as they are.
-collapseLimit N
If there are more participants or more regrets than N, the list of participants or regrets is collapsed (with HTML's <details> element). The reader needs to click on it to see the whole list. The default is 30.
-nogithubIssues
Do not make links out of text that looks like (GitHub) issues.
-noghurlbot
Omit messages from gb (a.k.a. ghurlbot). Messages to gb are still interpreted, but gb's responses, such as summaries of issues and actions, are removed.

Template Options

Scribe.perl can generate HTML with a couple of different styles:

-member
Use the style sheet for member-only minutes, rather than the style sheet for public minutes.
-team
Use the style sheet for team-only minutes, rather than the style sheet for public minutes.
-fancy
Omit the W3C logo from the output and use a style sheet that makes the output look very different.
-oldStyle
Use the 2004 style sheets for public minutes. Or, if combined with -team or -member, use the 2004 style for team, resp. member minutes.
-style URL
Use the given style sheet. The usual member, team or public styles become alternative styles instead.
Replace the link to W3C and the W3C logo by the given markup. I.e., the usual <a href="https://www.w3.org/"><img src="https://www.w3.org/Icons/w3c_home\" alt=W3C border=0 height=48 width=72></a> is replaced by markup. To suppress the logo, use -nologo (or -logo="").
-mathjax URL
Use the given URL to load the MathJax script from, instead of the default. MathJax is a script that improves the rendering of mathematical formulas. This option only has effect in combination with -emphasis and then only if there is any math in the minutes.
-islide URL
Use the given URL to load the i-slide script from, instead of the default. (See 'Embedding slides’.)

Scribe Identification Options

-scribeNick nickName
Indicate the IRC nickname of the scribe, which is used to figure out which lines were written by the scribe. This scribenick will be used for the first lines of the log, until the first ‘scribenick’ command in the log itself. (If this option is not given, scribe.perl assumes that that first scribe or scribenick command also applies to the lines before that command.)

Underscores (‘_’) at the end of scribe nicks are ignored, because many IRC clients add them automatically, often after a network error when the original nickname still lingers on the server.

However, occasionally ‘foo’ and ‘foo_’ may actually be different people. So it is advisable to change your nickname back to one without an underscore.

Miscellaneous Options

-minutes http://example.org/2005/03/01-baking-club-minutes
Specify the URL where you will eventually publish the generated minutes. This URL is not actually used anywhere except that scribe.perl looks at it to guess the meeting date if it isn't given explicitly. In particular, scribe.perl checks if the URL happens to contain a pattern of the form yyyy/mm/dd.
-help
Show a brief summary of command line options.
-version
Show the version numbers of scribe.perl and of perl itself.

Commands

Commands are interspersed with other minuted text in your IRC log, except that each command must be on a line by itself. Commands may be issued by anyone, not only the scribe. Syntax is shown below by example, with italicized portions variable.

Editing Commands

These editing commands are usually the easiest way to correct simple mistakes or add clarifications. (Of course, they don't take effect until you run scribe.perl on your IRC log.)

s/old/new/
s/old/new
s|old|new|
s|old|new

Replace the most recent occurrence of old with new. Old is a literal string, not a regular expression. These commands are processed in order, first to last. (I.e., each command works on the text that results after the previous command.)

New may contain slashes and vertical bars. E.g., this works: s/@@/http://example.org/path/. But note that the last slash is taken as part of the command, not of the new string. To include a final slash, double it (s/@@/http://example.org/path//) or use the alternative syntax: s|@@|http://example.org/path/.

Unlike in Perl, backslashes are not special. E.g., s/and\/or/but will try to replace ‘and\’ by ‘or/but’

Successful substitutions are removed from the minutes. Unsuccessful ones are left in the minutes, so they can be manually edited.

s/old/new/g
s|old|new|g

Replace globally from this point backward.

s/old/new/G
s|old|new|G

Replace globally, both forward and backward.

i/locationString/lineToInsert
i/locationString/lineToInsert/
i|locationString|lineToInsert
i|locationString|lineToInsert|

Insert lineToInsert before the line containing locationString, which is a literal string, not a regular expression. This is most helpful if you forgot to insert a ‘Topic: ’ command.

For example, the following use of the i// command:

<Arthur> Finished with issue LC71; on to LC82.
<Arthur> Frank: This is about syntax
<Arthur> ... Do we care about syntax?
<dbooth> i/Frank: This is about/Topic: Issue LC82

is converted to:

<Arthur> Finished with issue LC71; on to LC82.
<inserted> Topic: Issue LC82
<Arthur> Frank: This is about syntax
<Arthur> ... Do we care about syntax?

General Commands

The following commands may be written with any mix of uppercase and lowercase letters: ‘Meeting’, ‘MEETING’ and ‘mEeTiNg’ are all the same thing.

Meeting: Baking Club

Use "Baking Club" as the title of the meeting minutes. If used multiple times, only the last one has effect.

Chair: Jonathan

Jonathan was the meeting chair. If used multiple times, only the last one has effect.

chair: Jonathan, Louis
Chair+ Mia
chair+ Zoe, Pete, Annabel

If there are multiple chairs, you can separate their names with commas, or use the ‘chair+’ command. The combined result of the three lines above is that the meeting minutes will show that there were six chairs.

chair- Louis, Pete

If you made a mistake, you can remove individual names from the list of chairs.

chair+
chair-

And if you use ‘chair+’ or ‘chair-’ without any names, it means that you add, respectively remove, your own nickname from the list of chairs.

Scribe: MaryScr
ScribeNick: MaryScr

Tells scribe.perl that the IRC name of the scribe is MaryScr. If somebody else takes over as scribe, just give the command again, with the nick name of the new scribe.

‘Scribenick’ is an alternative spelling. Whenever you use ‘scribe’, you can also use ‘scribenick’.

Scribe: jon2 = John Smith
Scribe: jon2 / John Smith

You can add the scribe's real name, separated from the IRC name with a slash or an equals sign. This changes how the scribe will be called in the summary at the top of the minutes. Useful if the IRC name is cryptic.

Scribe: Adam, Teo, Ana
Scribe:+ Adam/Adamsky, Teo, Ana=Jo-Ana

Multiple scribes can be active at the same time. Separate their names with commas. Of course, you can also add their real name after the nick name.

Scribe+ jon2
Scribe+: jon2
Scribe+ jon2/John Smith
Scribe+ jon2, adam=Adamsky

Use ‘scribe+’ (with or without a ‘:’) if one or more scribes start taking minutes in addition to, rather than replacing, the previous scribes.

Scribe- adam
Scribe- adam,teo

Indicates when some scribes stop taking minutes.

Scribe+
Scribe-

If there are no names after the ‘+’ or ‘-’, it means the person typing the command is adding or removing himself from the current list of scribes.

A scribe can, e.g., temporarily stop taking minutes (scribe-) and resume later (scribe+).

Scribe: *

A ‘*’ as the scribenick means there is no designated scribe, but everybody is taking notes together. This is useful, e.g., when IRC is used for taking notes in a face-to-face meeting, when IRC isn't needed as a second conversation channel. (But people can still start their lines with their own nick, <nick> ..., see above, to make remarks outside the minutes.)

People cannot remove themselves from the scribe list with scribe- after this command.

Agenda: http://www.example.com/agenda.html

Specify the agenda URL (optional). If used multiple times, only the last one has effect.

Hint: If the agenda has been posted to the W3C Group Calendar or to a W3C mailing list, AgendaBot may be able to find the URL for you.

Present: Jonathan, Mary, Barbara, Steve

Indicate who was present.

Regrets: Nathan, Emma

Indicate who sent regrets (optional).

<frank> present+: Janine, Brian
<frank> present- Nathan
<frank> regrets+ Marja, Leonard
<frank> Present+

Add or remove names from the present/regrets lists. The colon is optional after + or -. With no names, it adds or removes the speaker himself, i.e., the last line adds "frank".

Date: 05 Dec 2002

Specify the meeting date. Not usually needed, because the default is guessed from the log URL reported by RRSAgent.

ACTION: Frank, Mary and Kate to propose solution for issue 42
action Ann: publish report 17
Action Fred to do something

Three ways to give an action item: ‘action:’, ‘action name:’ and ‘action name to’. (Other bots, may require that only one of these syntaxes is used.)

RESOLUTION: Issue 42 closed as duplicate of issue 21
Resolved: next-object does not wrap

Indicate a decision that the group has made. Both keywords may be used interchangeably.

topic: Food and drink
subtopic: Morning coffee

The first starts a new section with the heading ‘Food and drink’. The second starts a subsection with the heading ‘Morning coffee’. (See also -dashtopics and -useZakimTopics for alternative syntaxes.)

ScribeOptions: -dashTopics -embedDiagnostics

Specify options inline, as if they had been written on the command line like: perl scribe.perl -dashTopics -embedDiagnostics. Can be used multiple times and the options are added to previous ones.

NamedAnchorHere: foo

Cause a named anchor ‘foo’ to be generated at this point in the minutes. Leading and trailing spaces are ignored and other spaces are converted to underlines (‘_’). The name can be almost anything, except ‘xNN’, where N is a digit, because those are reserved for scribe.perl's internal use. A few other words (toc, meeting, attendees, links, resolutionsummary, and actionsummary) are also forbidden, because scribe.perl uses them itself.

Next meeting: http:///example.org/20180214/mins
Previous meeting: http://example.org/20180228/mins

You can add a link to the previous and next meeting at the top of the minutes.

Escapes

If you don't want a line to be interpreted by scribe.perl, start it with a backslash. E.g.:

<gigi> here are some words:
<gigi> \Subject: a noun
<gigi> \Topic: same as Subject
<gigi> \Ben: a name
<gigi> \Action: a noun

Even if gigi is the scribe, the above will not be taken as lines spoken by ‘Ben’ or by ‘Subject’ and will not create a new topic or a new action. A few more examples:

<jany> \s/week/month/
<jany> \scribe+
<jany> \present + Jan

Such an initial backslash is omitted from the minutes. If you happen to have a line that should start with a backslash, double it:

<jany> Here are some escapes used in C:
<jany> \\n = newline
<jany> \\t = tab

Backslashes elswhere than at the start are not special. E.g., you could write the above like this:

<jany> Here are some escapes used in C:
<jany> * \n = newline
<jany> * \t = tab

Verbatim or pasted text

To include several lines of verbatim text, e.g., to copy-paste program code into the minutes, start with three single backquotes (```) or two square brackets ([[) on a line by themselves, paste the text and end with a line containing another three backquotes, resp. two square brackets (]]).

No commands are recognized inside verbatim text: ‘action:’ does not create an action, ‘present+’ does not record a participant. etc. Here are two examples:

<dbooth> ```
<dbooth> function factorial(n) {
<dbooth>   if (n == 1) return 1
<dbooth>   else return n * factorial(n - 1)
<dbooth> }
<dbooth> ```
<momo> [[
<momo> January    45
<momo> February  250
<momo> March       2
<momo> ]]

Everybody can use verbatim text, but the effect is slightly different for scribes and for other participants. If the scribe enters verbatim text and other text interrupts the verbatim text, that other text is moved, to keep the scribe's text together. E.g.,

<scribe> [[
<scribe> sub add($$) {
<scribe>    my ($a, $b) = @_;
<cecilia> Me too!
<scribe>    return $a + $b;
<scribe> }
<scribe> ]]

will yield:

sub add($$) {
   my ($a, $b) = @_;
   return $a + $b;
}
<cecilia> Me too!

(The verbatim text feature was suggested by David Booth.)

Scribe.perl automatically recognizes most URLs (http://…, mailto:…, etc.) and turns them into links. See the command line option -urlDisplay for different ways to format URLs.

A Ralph link has -> followed by a URL followed by anchor text, like this:

<dbooth> See -> https://www.example.org/ns/w2 wall 2
<dbooth> And -> https://www.example.org/ns/w2 "wall 2", too.
<dbooth> -> https://www.example.org/ns/w2 'wall 2' also.

If the anchor text is quoted (as in the second and third lines above), scribe.perl uses only the quoted text as anchor, otherwise it takes all the text until the end of the line. Thus, all three lines contain the link wall 2.

<dbooth> wall 2 -> https://www.example.org/ns/w2

The anchor text is all the text leading up to the ->. You should not put quotes around it, unless you actually want quotes in the anchor text.

The anchor text and URL can also swap places. This is known as an inverted Xueyuan link:

<dbooth> See https://www.example.org/ns/w2 -> wall 2
<dbooth> And https://www.example.org/ns/w2 -> "wall 2", too.
<dbooth> https://www.example.org/ns/w2 -> 'wall 2' also.

In this case, like with the Ralph links, you can use quotes to limit what goes into the anchor text.

<dbooth> -> wall 2 https://www.example.org/ns/w2
<dbooth> And -> wall 2 https://www.example.org/ns/w2 too.

Like Xueyuan links, Ivan links should not have quotes around the text (unless you actually want the anchor text to contain quotes).

<dbooth> Some text with [an embedded link](https://www.example.org/ns/w2) and more text

Embedding images

You can also embed images in the minutes by means of Ralph, (inverted) Xueyuan or Ivan links. The only difference is that the -> must be replaced by -->. Some examples:

<dbooth> See --> https://www.example.org/ns/w2.jpg wall 2
<dbooth> And --> https://www.example.org/ns/w2.jpg "wall 2", too.
<dbooth> --> https://www.example.org/ns/w2,jpg 'wall 2' also.
<dbooth> wall 2 --> https://www.example.org/ns/w2.jpg
<dbooth> See https://www.example.org/ns/w2.jpg --> wall 2
<dbooth> And https://www.example.org/ns/w2.jpg --> "wall 2", too.
<dbooth> https://www.example.org/ns/w2.jpg --> 'wall 2' also.
<dbooth> --> wall 2 https://www.example.org/ns/w2.jpg
<dbooth> And --> wall 2 https://www.example.org/ns/w2.jpg too.

The anchor text becomes the image's text alternative (‘alt text’). There is no way to specify a caption.

Markdown-style image links also work. They are like markdown links, but prefixed with a ‘!':

<dbooth> Here it as an image: ![a tree](https://example.org/tree.jpg)

Unless disabled (see -nogithubIssues), text that looks like a reference to a GitHub issue is replaced by a link to that issue:

<dbooth> Let's talk about w3c/scribe#3
<dbooth> And transitions#5

If the owner part is omitted, ‘w3c’ is assumed (thus, ‘transitions#5’ is the same as ‘w3c/transitions#5’). But you can change that by explicitly listing the repositories to use, by means of one or more repo: (or repos, repository or repositories) commands:

<dbooth> Repo: w3c/scribe, transitions, webn/drafts
<dbooth> Repo: docs, w3c/scribe2
...
<dbooth> Let talk about #3, drafts#7 and tests#1

(A + instead of a : also works.) The first line defines three repositories: https://github.com/w3c/scribe (if no other web site is given, github.com is assumed), https://github.com/w3c/transitions (the URL and owner are copied from the preceding repository) and https://github.com/webn/drafts (the URL is copied from the preceding repo). The second line defines two additional repositories: https://github.com/webn/docs (again, the initial part is copied from the preceding repository) and https://github.com/w3c/scribe2.

The ‘#3’ is now a valid issue as well and refers to issue 3 in the last defined repository, which is https://github.com/w3c/scribe2; the ‘drafts#7’ refers to the most recently defined repository called ‘drafts’, i.e., https://github.com/webn/webn/drafts’; and the ‘test#1’, which does not match any defined repository, is assumed to have the same owner as the last repository, i.e., https://github.com/w3c/tests.

You can also give full URLs (which is necessary to refer to repositories that are not on GitHub):

<dbooth> Repo: https://gitlab.example.com/foo/bar, baz

This defines the repositories https://gitlab.example.com/foo/bar and https://gitlab.example.com/foo/baz.

Repositories that are mentioned in topic lines are also added to the defined repositories. This only works for repositories on github.com:

topic: Discuss https://github.com/w3c/scribe2

Remove repositories from the list with repo- (or repos-, repository- or repositories-):

Repo- w3c/scribe2

To remove all repositories, give an empty list:

<dbooth> Repo:

Scribe.perl also interprets the commands for ghurlbot that add or remove repositories, e.g:

<dbooth> ghurlbot, this is https://gitlab.example.com/foo/bar
<dbooth> ghurlbot, drop baz

Embedding slides

You can embed slides in the minutes if they are in a supported format. The list of supported formats depends on the i-slide library, and includes PDF, and the HTML-based Shower and b6+. Google Slides are also supported.

To use this, the slideset from which the slides will be embedded needs to be set with a slideset command and a URL, e.g.:

<dbooth> Slideset: https://www.w3.org/Talks/Tools/b6plus/
<dbooth> Slideset: -> my slides https://www.w3.org/Talks/Tools/b6plus/

Then an individual slide can be embedded using the convention [Slide n] where n is the slide number in the slideset.

<dbooth> [Slide 2]
<dbooth> Dom: as this slide illustrates, scribing is awesome

Note: In the case of Google Slides, scribe.perl makes a snapshot in PDF. It is that snapshot that is shown in the minutes. For other slides, the minutes display the live version. Security rules (‘CORS’) may restrict the display of slides that reside on remote servers.

Embedding Video Recording

You can link to the video record of a meeting in the minutes. The video will be embedded at the top of the minutes and each topic and subtopic of the meeting will link to the approximate time in the video. (This only works for IRC logs that include time stamps, such as RRSAgent's.)

With JavaScript enabled, each topic and subtopic will also offer a play button to launch the embedded video at the appropriate offset. The video will float at the bottom of the page, if it is not visible at the current scroll level. (Launching the video works for video streaming services that use a recognized postMessage API. This includes YouTube, CloudFlare Stream and StreamFizz).

To use this, the link to the recording needs to be set with recording and a URL, e.g.:

<dbooth> Recording: https://youtu.be/PjpACM_6IgM
<dbooth> Recording: -> https://youtu.be/PjpACM_6IgM April meeting video

The point at which the recording starts also needs to be explicitly set. This can be done live, at the moment when recording is started with:

<dbooth> Recording is starting
  

It can also be documented after the fact, with:

<dbooth> Recording started at :05
  

where :05 means at 5 minutes from the top of the hour.

If the recording ends before the end of the meeting, the end of that recording can be documented similarly with:

<dbooth> Recording ends
<dbooth> Recording ended at :55
  

There can be only one recording. If the above commands are used multiple times, the last one wins.

Manually Editing the Log

In addition to the ‘realtime’ editing commands above, you may manually edit your IRC log with a text editor (by mimicking the log format) before running scribe.perl. This is most useful for commands that have a broad effect on the generated HTML. Scribe.perl also recognizes RRSAgent's log format without time stamps, so you can leave those off, rather than invent fake ones.

Here is an example snippet of an IRC log in which the commands ‘ScribeNick: tw’ and ‘Topic: Fire Alarms’ have been inserted using a text editor.

20:11:21 <tw> Scribe: TedWilliams
<tw> ScribeNick: tw
20:11:34 <tw> Topic: Printers
20:11:49 <tw> alan: Printers are working now
<tw> Topic: Fire Alarms
20:12:27 <tw> ralph: Fire marshall assured us that the system is working.

Note that the IRC name <tw> is required, though for most commands it does not matter what IRC name is specified.

Input Formats

Several log formats are recognized, and are described below:

Scribe.perl guesses which format you have used by trying each in turn until it finds one one that matches.

If you have a log format that is not recognized:

  1. Try doing global search/replace in a text editor, to convert it into a recognized format, such as Mirc_Text_Format; or
  2. Write a parser for it and add it to scribe.perl.

RRSAgent text format (recommended)

The plain text format (*.txt) produced by RRSAgent. Hint: add ".txt" to the RRSAgent log URL to get the text version, such as: http://www.w3.org/2002/11/07-ws-arch-irc.txt . The timestamps are ignored, so you can safely edit the log and add lines without having to fake timestamps. Example:

20:41:27 <dbooth> Mike: Feature X would benefit users.
20:41:37 <dbooth> ... and implementation would be easy.
20:41:47 <ericn> I agree.

Mirc timestamped log format

Timestamped log format produced by mIRC. Example:

[19:35] <Zakim> Steven should now be muted
[19:36] <ph> http://lists.w3.org/Archives/Member/w3c-html-cg/2004JanMar/0038.html
[19:36] * Zakim hears Steven's hand up
[19:36] * Zakim sees Steven on the speaker queue

Mirc text format

The format produced by mIRC when you do Buffer→Save As. Example:

<dbooth> Mike: Feature X would benefit users.
<dbooth> ... and implementation would be easy.
<dbooth> This is pretending to be a long
 line that mIRC breaks in order to display,
 but scribe.perl will re-join into a single line.
<ericn> I agree.

Irssi format

The format produced by Irssi logging with ISO8601 timestamp prefixes. Example:

2003-12-18T15:27:21-0500Z <dbooth> Mike: Feature X would benefit users.
2003-12-18T15:27:36-0500Z <dbooth> ... and implementation would be easy.
2003-12-18T15:27:36-0500Z <ericn> I agree.
2003-12-18T16:02:59Z -!- koalie [coralie@team.cloak] has joined &weum
2003-12-18T16:38:58Z  * koalie hears Steve

The date, seconds and timezone are optional, so the following is also recognized:

15:27 <dbooth> Mike: Feature X would benefit users.
15:27 <dbooth> ... and implementation would be easy.
15:27 <ericn> I agree.

Bip format

Bip is an IRC proxy. Its logs look like this:

27-02-2020 15:04:33 < addison!~addison@team.cloak: zakim, take up agendum 1
27-02-2020 15:04:33 < Zakim!zakim@team.cloak: agendum 1. "Agenda and Minutes" taken up [from agendabot]
27-02-2020 15:04:54 -!- JcK!~JcK@team.cloak has joined #i18n
27-02-2020 15:04:54 < addison!~addison@team.cloak: zakim, take up agendum 2
27-02-2020 15:04:54 < Zakim!zakim@team.cloak: agendum 2. "Action Items" taken up [from agendabot]
27-02-2020 15:05:04 < addison!~addison@team.cloak: https://www.w3.org/International/track/actions/open
27-02-2020 15:05:22 < addison!~addison@team.cloak: action-856?
27-02-2020 15:05:22 < * trackbot!trackbot@team.cloak is looking up action-856.
27-02-2020 15:05:22 < trackbot!trackbot@team.cloak: action-856 -- Richard Ishida to Check the time planner -- due 2020-02-27 -- OPEN

Yahoo IM format

The format produced when you save a Yahoo IM session. Example:

dbooth: Mike: Feature X would benefit users.
dbooth: ... and implementation would be easy.
ericn: I agree.

Plain-text format

Line-oriented plain text format. This format is intended for occasions when the scribe doesn't have access to IRC, and simply takes notes in a text editor. Example:

	Mike: Feature X would benefit users.... and implementation would be easy.
Eric agrees.

Qwebirc paste format

Qwebirc is the software behind the web-based IRC client on https://irc.w3.org. Copy-pasting from the browser window gives a log that looks like this:

[09:59] == Wilco [~Wilco@4a714a7c.public.cloak] has joined #act-r
[10:00] <Wilco> agenda+ Update from the ACT Task Force
[10:00] * Zakim notes agendum 1 added
[10:04] <CarlosD> present+
[10:05] <CarlosD> Wilco: provides update on the TF

Quassel paste format

The format of text that is copy-pasted from a Quassel chat window. The line starts with a date & time in square brackets.

The format of the date & time can actually be configured by the user, but scribe.perl only accepts dates and times that consists of digits, dots, dashes and spaces, optionally with am and pm. Here is an example where the date & time is just hours and minutes:

[01:09] <-- borisjohn (borisjohn@899c7108.team.cloak) has quit (Ping timeout: 180 seconds)
[08:50] --> raul (raul@899c7108.team.cloak) has joined &fleague
[09:02] --> borisjohn (borisjohn@899c7108.team.cloak) has joined &fleague
[09:09] <-- borisjohn (borisjohn@899c7108.team.cloak) has quit (Ping timeout: 180 seconds)
[10:02] --> borisjohn (borisjohn@899c7108.team.cloak) has joined &fleague
[11:00] -*- kolec still on another call; it may spill a lot
[11:02] * zakim has been invited to &fleague
[11:02] --> Zakim (zakim@815ad96c.team.cloak) has joined &fleague
[11:02] <Gert> zakim, start meeting
[11:02] <Zakim> inviting RRSAgent
[11:02] --> RRSAgent (rrsagent@815ad96c.team.cloak) has joined &fleague
[11:02] <RRSAgent> logging to https://www.w3.org/2021/04/20-fleague-irc
[11:02] <Zakim> RRSAgent, make logs Team

Bert IRSSI format

The style of IRSSI logs as used by Bert Bos, characterized by a date & time at the start and a vertical bar separating the nick name and the message. This is almost identical to the elho theme for IRSSI, which should work here as well. Here is an example:

--- Log opened Thu Mar 19 12:57:23 2015
12:57       «Users» | 23 nicks (0 ops, 0 halfops, 0 voices, 23 normal
12:57        «Mode» | Channel &global was created on Fri Apr 11 21:35:25 2014
13:08             * | koalie veronica :D
13:08           --> | naomi_ (naomi@team.cloak) has joined &global
13:10         Zakim | +Plh
13:11        scribe | Angel: Short meeting.
13:13        «Quit» | naomi (naomi@team.cloak) has signed off (Ping timeout: 180 seconds)
13:14      veronica | q?
13:15             * | Zakim sees no one on the speaker queue
13:15        scribe | Veronica: Please everyone update the FTMS records.

IRCCloud format

Downloading a log from the IRCCloud server yields a file similar to this:

#wcag-act
[2020-07-21 17:28:44] → Joined channel #wcag-act
[2020-07-21 18:21:09] ⇐ shadi quit (shadi@815ad96c.team.cloak): "Leaving"
[2020-07-23 14:57:43] → Wilco joined (~Wilco@ef89345d.public.cloak)
[2020-07-23 14:57:51] → Zakim joined (zakim@815ad96c.team.cloak)
[2020-07-23 14:57:56]  zakim, start meeting
[2020-07-23 14:58:28] — Zakim notes agendum 1 added
[2020-07-27 16:55:24] * shadi_ → shadi
[2020-07-30 14:53:38]  Meeting: Accessibility Conformance Testing

Environment Variables

The SCRIBEOPTIONS environment variable holds the default options that one wants to use. It is not required. Example for a Bourne-style shell:

export SCRIBEOPTIONS="-team"

Differences from scribe.perl version 1

Scribe.perl version 2 accepts most of the same options as version 1 and recognizes most of the same commands in the input. The following are different:


Bert Bos, adapted from original documentation by David Booth. Scribe.perl is available for use under the W3C Software License. $Date: Sat Jan 8 20:22:22 2022 UTC $