A faithful web port of Microsoft Comic Chat (1996–1998), built from the original source release — the comic engine, the art pipeline, and the IRC protocol, running entirely in the browser.
- The original art, extracted from the shipped
.avb/.bgbbinaries: 31 characters and 9 backgrounds by Jim Woodring, decoded from the zlib-compressed masked-DIB format into PNGs bytools/extract-avb.mjs. - The comic engine (
src/engine/), ported function-by-function from the 1998 C++ (panel.cpp,balloon.cpp,spline.cpp,avatar.cpp):- panel composition: clone-and-extend, 5-balloon/5-body limits, speaker re-entry breaks, establishing shots, zoom with head-room protection;
- greedy character placement with facing penalties and left/right hysteresis; characters flip to face who they talk to;
- balloon outlines as beta-splines (tension 5, bias 1) around per-line text "filters" with wavy bumps every 300 twips; tails broken into the outline with paired arcs; think-bubble chains; dashed whispers; action boxes — all in the original MM_TWIPS coordinate system;
- the text-to-emotion expert system with the authentic rule table from
the original string resources (ALL CAPS → shout at strength 9,
LOL→ laugh at 11,:-)→ happy at 10, sentence-initialYou→ point, …); - the emotion wheel: 8 emotions at 45° steps, radius = intensity, mapped to
the nearest face/torso records exactly like
GetBodyFromEmotion.
- The wire protocol (
src/irc/protocol.ts): messages carry the original annotation prefix(#G<t><te><ti>E<f><fe><fi>[R]M<m>[T…]) text, characters announce with# Appears as <name>, backgrounds sync with# BDrop2:— interoperable with original Comic Chat clients on the same IRC server.
git clone --recurse-submodules https://github.com/comicchat/comicchat.git
cd comicchat
npm install
npm run extract-art # one-time: decode .avb/.bgb art into public/art
npm run dev # http://localhost:5885The original Microsoft source release is pinned as the
sources/comic-chat Git submodule and supplies the files for art extraction.
For a clone made without --recurse-submodules, initialize it with:
git submodule update --init --recursivetools/extract-ui.mjs converts the res/*.bmp UI resources (emotion faces,
toolbar strips).
Everything is client-side; there is no backend. Two modes:
- Demo room — offline, scripted characters. Zero network.
- IRC over WebSocket — connects straight from the browser to any IRC server with a WebSocket listener (Ergo, UnrealIRCd 5+, InspIRCd 3+, or a webircgateway in front of anything else).
To run a local Ergo server for testing, enable a websocket listener in its config:
server:
listeners:
'127.0.0.1:8067':
websocket: true
websockets:
allowed-origins: ['*']then point the connect dialog at ws://localhost:8067.
src/engine/ the comic engine port (twips, splines, balloons, panels, page)
src/irc/ gamja-based IRC core + Comic Chat wire protocol + demo room
src/art/ runtime art store (extracted characters/backgrounds)
src/ui/ 98.css chrome: menus, dialogs, wheel, roster
tools/ build-time extractors for the original binary art
docs/ engine notes reverse-engineered from the 1998 sources
sources/ pinned Microsoft Comic Chat source submodule
- Port code: MIT.
src/irc/gamja/is vendored from gamja (AGPL-3.0-or-later) — the combined web app is effectively AGPL; seesrc/irc/gamja/LICENSE.- Original Comic Chat sources and art: MIT, © Microsoft Corporation (the microsoft/comic-chat submodule). Character art by Jim Woodring.
