BylinaRounds 1.0.0

A single offline web page that tracks lettering correction rounds for comics. Lock the script you lettered, import the writer's revision, review every change against the page/panel/balloon IDs you already lettered, export a correction packet, then lock the round. Repeat for each revision.

Prerequisites and what was tested

First result in two minutes (built-in example)

BylinaRounds start screen with the three workflow steps
The start screen. The steps bar shows where you are: lock, review, export & lock.
  1. Click Load example: Saltmarsh Courier (round 0). The page shows 4 pages, 11 panels, 24 lettered items.
  2. One line needs your decision: the painted sign GULL ROCK — KEEP CLEAR starts with a quote, so it could be lettering. It is art direction: click Not lettered. Locking is disabled until every flagged line is decided.
A flagged line with buttons New lettered item and Not lettered
Lines the grammar cannot classify safely are never dropped silently; you decide.
  1. Click Lock round 0 (baseline).
  2. Click Load example revision (round 1). The sign decision is carried over because the same line appears again.
  3. Review the 10 change rows (expected: 2 edited, 1 speaker, 1 style, 1 emphasis, 1 moved, 3 added, 1 deleted; 24 old − 1 deleted + 3 added = 26 new). The writer inserted a new page 3, so lettered pages 3 and 4 are now pages 4 and 5.
Review rows grouped by lettered page with old and new text
Rows are grouped by the page you lettered, with old/new text, word-level differences, speaker, balloon style and emphasis shown separately.
  1. Accept each row (button or A), or use Accept unflagged on this page. When 0 rows are open, export unlocks.
Export panel with packet, paste text, CSV, JSON and print buttons
Export is blocked until every row has a decision.
  1. Click Download packet (.zip) (all files below in one ZIP), then Lock correction round 1. Load the round 2 example to see punctuation-only corrections, a split caption, a merged balloon and two moved balloons (10 rows to decide). The script has two identical DONNG sound effects and one was deleted; which copy is only a proposal, so both rows are marked Check pairing.
Round 2 review with split and merge rows marked Check pairing
Round 2: repeated identical text (two DONNG effects, one deleted) gets a “Check pairing” flag; the proposal is not trusted silently.

The expected answers for both rounds are in samples/EXPECTED.json and the reference outputs in expected-outputs/.

Using your own scripts

  1. Type the book title at the top (it names your files).
  2. Click Choose script… (or drop the file on the page) and pick the exact version you lettered. Decide any flagged lines, check the page list, then lock round 0.
  3. When a revision arrives, import it, review, export, lock. Save the book after each lock.

Supported formats (bounded grammar)

InputWhat is read
Word .docxBody paragraphs, bold/italic/underline runs, list numbering. Headers, footers, comments, footnotes/endnotes and images are listed under “Excluded from comparison”. Refused with a message: tracked changes (accept or reject them first), encrypted/password files, legacy .doc, damaged ZIPs, unsafe entry names, DTD/entity declarations and oversized decompression.
Plain text .txt, .md, .fountainUTF-8 text (byte-order mark optional) or UTF-16 with a byte-order mark. Emphasis markers: *italic* or _italic_, **bold** or __bold__, ***bold italic***. Unpaired markers stay in the text and are reported.

Grammar: page headings such as PAGE ONE or PAGE 1; panel headings such as Panel 1.; lettered lines as NAME: text, optionally numbered (3. OSKAR: …) and with a style in parentheses (HESTA (OFF): …). Other paragraphs are panel descriptions. PDF input is not supported. Compatibility with Microsoft Word or Google Docs exports was not tested; the DOCX samples were generated with Python's standard library.

Limit (each tested at N and N+1)Value
Script file size8 MiB
Lines / paragraphs per script30,000
Pages per script200
Lettered items per script3,000
Characters per lettered item2,000
Archive entries in a .docx1,000
XML read from one .docx (decompressed)32 MiB
Rounds per bookround 0 plus 12 correction rounds
Saved book file64 MiB

Reviewing a revision

Re-pair dialog listing candidate items with similarity
Re-pair lists candidates by text similarity; tick 2–3 for a split or merge.

Export, save and reopen

FileUse
*-corrections.jsonCanonical data with exact texts and IDs.
*-corrections.csvExact texts (RFC 4180).
*-corrections-spreadsheet-safe.csvCells starting with = + - @ get a leading apostrophe so spreadsheets do not run them. Texts here are not exact.
*-paste-pack.txtPlain text to paste into your lettering file. Plain text cannot carry bold/italic, so emphasis is listed on an EMPHASIS: line for you to apply.
*-paste-pack.htmlThe same texts with bold/italic/underline applied, to copy with formatting.
*-ledger.csvPage lineage for the round: old page, new page, items on each, change rows.
*-corrections.html / PrintPrintable packet: instructions, page map, tick boxes, IDs, word differences and rich emphasis.
manifest.jsonSHA-256 of every file in the packet ZIP.

Save book downloads title.bylina.json with every locked round, the original script bytes, your line decisions and pairings — and, if you are mid-review, the unlocked script with its decisions so far. The file carries SHA-256 fingerprints of the whole book (title, every round, the unlocked script and its decisions) and of each round in a chain. Open book… checks those fingerprints, re-reads and re-parses every stored script and restores the open review. A book changed in any way after it was saved — even one decision or the title — is refused. The fingerprints use no password or secret key: they catch accidental and casual edits, not someone who deliberately recomputes them, so keep books where only you can change them. Your source scripts are only read, never modified.

A book holds round 0 plus 12 correction rounds and can be up to 64 MiB. BylinaRounds refuses to lock a 13th correction round, or a round that would make the book larger than 64 MiB, and will not save a book it could not reopen. When that happens, export the round’s corrections and start a new book with the latest script as round 0.

Troubleshooting

Message or symptomFix
“contains tracked changes”Accept or reject all changes in your word processor, save a copy, import the copy.
“No PAGE headings were found”Add headings like PAGE ONE on their own line.
Lines that need your decisionPick New lettered item, Join previous balloon, Speaker cue or Not lettered. Lock stays disabled until all are decided.
A change paired with the wrong balloonUse Re-pair… or Unpair; Undo reverses it.
Export buttons are disabledSome rows are still open; the page list shows the count per page.
“legacy Word .doc or encrypted”Save as .docx without a password.
Print window blockedDownload the HTML packet and print it.
“This book was changed after BylinaRounds saved it” or “has no whole-book fingerprint”The file was edited (by hand, a script or a sync tool) or saved by a pre-release build. Open the copy exactly as BylinaRounds saved it.
“already holds 12 correction rounds” or “would make the book … can be reopened”The book is full. Export this round’s corrections, then start a new book with the latest script as round 0.

Privacy

BylinaRounds runs entirely in your browser tab. Its content-security policy blocks all network connections; it uses no storage API, cookies or analytics. Nothing is kept after you close the tab unless you download it.

Uninstall

Delete the unzipped folder. Saved books and exports are ordinary files wherever you downloaded them.

Limitations

Reading page references in exports

Each correction row’s lettered_page and new_page refer to the actual old and revised balloon IDs. If a reviewed split or merge spans several pages, the page values are separated by a semicolon and a space. An absent side is null in JSON and blank in CSV. The JSON page_map is the dominant page match; split_old_pages adds split destinations. The page ledger reports dominant page matches and whole-page counts, with split_revision_pages listing a split’s destinations. Those counts are page totals, not a count of items transferred between pages. Use each correction row’s IDs to place a moved balloon.