Hermes 4 · Sysop Tools

ANSI Art Editor
for Mac

The only ANSI editor where what you draw is byte-for-byte what callers see — because the editor and the BBS terminal are the same engine.

CP437 · SAUCE records · iCE colors · 16/256/truecolor · half-block painting · round-trip verification

The Problem

Why every other ANSI editor
requires a cleanup pass

PabloDraw, Moebius, and icyDraw all render ANSI art with their own engines — engines that make slightly different assumptions than the terminal the art ultimately plays on. The result: stray reset characters, bare LF line endings that corrupt BBS rendering, and subtle color differences that don't match what callers actually see.

Other editors

Render with their own engine — different from the terminal that shows callers the art

Emit bare LF line endings that corrupt BBS display or require manual CRLF conversion

Insert stray ESC[0m reset characters that viewers flag as "cleanup needed"

No round-trip guarantee — save, re-open, and the colors may shift

SAUCE support is partial or absent — metadata gets dropped

Hermes 4 editor

Editor and BBS terminal share the same HermesANSI engine — true WYSIWYG, not an approximation

Serializer enforces CRLF discipline — never emits a bare LF, even on full-width rows

SGR run optimization emits escape sequences only on change — output looks hand-authored

"Test as caller" button re-parses the saved bytes through the actual BBS renderer and diffs the result

Full 128-byte SAUCE records with comments, iCE flag, font name, and exact canvas dimensions

01

Same-Engine WYSIWYG

HermesANSI · CellGrid · ANSISerializer

The core promise of the Hermes 4 ANSI editor is not an approximation — it is architectural. The editing canvas is built on CellGrid and CellGridRenderer, the same data model and drawing code that renders art when callers connect. There is no second renderer to diverge from.

When you save, ANSISerializer converts the grid to .ans bytes with SGR run optimization and strict CRLF line endings. When a caller connects and downloads the file, the same engine parses those bytes back into the identical grid. The round-trip is mathematically guaranteed.

A post-save verification step re-parses the serialized bytes through TextFileRenderer and diffs the result against the original grid. If anything was lossy — a truecolor value quantized to 16-color, or a character outside CP437 — the save dialog tells you exactly what changed before you commit.

ANSI Editor
┌─────────────────────────────┐
Welcome to Olympus BBS
███████████████████████████
└─────────────────────────────┘
serialize(grid)
ESC[0;33m┌ESC[0m...
parse(bytes) == grid
round-trip verified

CP437 Glyph Palette

▀▄▌▐ ─│┌┐└┘
╔═╦═╗ ╠═╬═╣ ╚═╩═╝
☺☻♥♦♣♠•◘○◙♂♀♪♫☼
encoding
CP437 UTF-8
color depth 16 / 256 / truecolor
02

CP437, SAUCE, and Color Depth

Faithful Encodings · No Approximations

Classic BBS art is CP437 — the IBM PC character set with its box-drawing characters, block elements, and line-art. Hermes 4's CP437.fromUnicode() and CP437.isRepresentable handle the full encoding round-trip, flagging any character that has no CP437 equivalent rather than silently substituting.

Color depth is a save-time choice. The serializer supports three targets: 16-color classic (standard BBS compatibility), 256-color xterm palette, and truecolor passthrough. Moving from truecolor to 16-color applies nearest-neighbor quantization with a report — you see exactly which cells were approximated before committing the save.

Both CP437 (default for .ans files) and UTF-8 are supported as output encodings. UTF-8 mode is useful when the art contains characters beyond the CP437 range and the target terminal supports it. The SAUCE record's font field preserves the intended rendering font so nothing is ambiguous.

03

SAUCE Records & iCE Colors

Full Metadata · Blink-Bit Encoding

SAUCE (Standard Architecture for Universal Comment Extensions) is the metadata format for ANSI art — title, author, group, date, canvas dimensions, color flags, and font name, packed into a 128-byte trailer at the end of the file. Hermes 4 reads and writes the full SAUCE record including optional comment blocks, handles the EOF 0x1A guard correctly, and strips SAUCE before parsing so the trailer never renders as garbage characters.

The SAUCE inspector panel lets you edit title, author, group, date, and encoding notes directly. The iCE colors flag in SAUCE corresponds to the iCE mode toggle in the toolbar — flip the snowflake icon to treat the blink bit as a bright background color rather than blinking text, exactly as TheDraw and classic art packers intended.

iCE mode is preserved end-to-end: the SAUCE flag is set on save, read on load, and the editor initializes from it automatically. Import a foreign file with the iCE flag set and the editor will honor it without requiring any manual toggle.

Toolset

Pencil
done
Eraser
done
Eyedropper
done
▀▄
Half-block painter
done
Selection (rect)
done
Undo / Redo (⌘Z / ⇧⌘Z) done
⌘C / ⌘X / ⌘V ANSI paste done
04

Drawing Tools & Palettes

Keyboard-first · Mouse painting · Classic workflow

The editor supports the keyboard-first workflow that ANSI artists know from TheDraw — type characters at the caret with current attributes, move with arrow keys, select with shift-arrows. Mouse interaction layers on top: click to place the caret, drag to paint, right-drag to paint with the secondary color. The visible grid caret is distinct from the terminal cursor so the editing state is always clear.

The half-block painter is the signature ANSI art technique: by treating each cell as two vertically stacked "pixels" using ▀ and ▄ with foreground and background colors, you get an effective 80×50 pixel canvas from an 80×25 text grid. Click the top or bottom half of any cell to set that pixel's color independently.

The 16-color bar shows foreground and background swatches with click-for-fg and right-click-for-bg. An extended disclosure reveals 256-color and truecolor pickers. The CP437 glyph palette is organized into character banks — blocks and shades, single and double box-drawing, special symbols — selectable via keyboard or mouse.

Selection works with rectangular marquee, move or copy-drag, arrow nudge, and ⌘C/⌘X/⌘V including external ANSI paste from the clipboard. Copy as ANSI writes proper .ans bytes to the pasteboard, compatible with other editors and terminals that accept ANSI.

05

Full Authoring Loop In-App

Create · Edit · Verify · Serve

Create a new ANSI document, draw, save directly into your GFiles area, and that file is immediately available to callers — no separate upload step, no format conversion. The GFiles manager replaces its old "Preview" button with an "Edit" button that opens the file directly in the editor. Edit a missing file and it creates it at that path, which means the create-and-publish flow for new art is a single action.

Language variant support extends this further: each variant row in the GFile detail view gains "Edit" (if the file exists) or "Create" (if it doesn't), pre-seeded with a copy of the base-language file. Creating translated BBS welcome screens and menu art for multilingual boards is now a straightforward workflow rather than a manual file management task.

Import brings foreign art in from disk. On import, Hermes 4 detects bare-LF line endings and offers to repair them to CRLF. After any import, the "clean pass" option runs the file through parse → serialize → write, normalizing line endings, stripping editor artifacts, and attaching or updating the SAUCE record. This is the manual cleanup step that ANSI artists currently do after Moebius — automated in a single click.

Authoring Loop

1
New / Import .ans file
2
Draw on the editor canvas
3
Save to GFiles or disk (⌘S)
4
"Test as caller" verify
5
File live — served to callers

No upload step. No format conversion. Same engine the whole way.

What's Included

Full editor, shipping today

Every item below ships in the current Hermes 4 beta — the round-trip engine, the interactive editor, the drawing tools, GFiles integration, and round-trip verification are all working code.

DONE

CellGrid round-trip engine

Value-type grid with per-cell setter and snapshot bridges. CellGrid.swift with 218 passing round-trip tests including randomized property tests and real GFile fixtures.

DONE

ANSISerializer

SGR run optimization, CRLF discipline, full-width row wrap handling, trailing-space elision, CP437 and UTF-8 encoding, 16/256/truecolor color depth with quantization report. ANSISerializer.swift.

DONE

SAUCE read/write

Full 128-byte SAUCE records with comment blocks, EOF guard, iCE flag, font name, and canvas dimensions. Loader strips SAUCE before parse. SAUCE.swift.

DONE

Interactive editor window

ANSIEditorDocument with undo/redo stack, dirty state, and Save / Save As. Multiple editor windows concurrently, each bound to one document. ⌥⌘N / ⌥⌘O menu commands.

DONE

Drawing tools

Pencil, eraser, eyedropper, half-block painter, rectangular selection with move/copy/stamp. Keyboard-first mode with arrow navigation. Mouse click-to-caret and drag-to-paint.

DONE

Color bar & glyph palette

16-color fg/bg swatches with click-for-fg, right-click-for-bg. Extended 256-color and truecolor pickers behind a disclosure. Full 256-glyph CP437 grid in F-key banks.

DONE

SAUCE inspector & iCE toggle

Sidebar panel for editing title, author, group, and date. Toolbar snowflake toggles iCE colors mode. Flag initialized from SAUCE on import, written on save.

DONE

GFiles integration

GFiles manager "Edit" replaces "Preview." Missing file opens a new document at that path. Language variant rows gain Edit/Create. Import detects bare LF and offers CRLF repair.

DONE

"Test as caller" verification

Toolbar button runs the saved bytes through the actual BBS renderer (TextFileRenderer.renderCP437) and diffs the result. Round-trip verify gates every save.

FAQ

Common questions

How do I make clean .ans files on a Mac?

Hermes 4's ANSI editor writes byte-accurate .ans files using the same engine that renders them on the BBS, so there are no stray cleanup characters. The serializer enforces CRLF line endings and emits SGR escape sequences only on attribute change — the output looks like hand-authored art, not a per-cell SGR dump.

Does it support SAUCE metadata and iCE colors?

Yes. The editor reads and writes full SAUCE records (title, author, group, date, dimensions, font name) and supports iCE colors mode. The iCE flag in the SAUCE trailer matches the toolbar toggle — load a file with the flag set and the editor switches to iCE mode automatically.

Is it a Moebius or PabloDraw replacement?

It offers a different promise. Moebius and PabloDraw are excellent general-purpose ANSI editors. The Hermes 4 editor's unique advantage is that it shares the rendering engine with the BBS itself — art created in the editor is provably identical to what callers see, with zero cleanup required. If you run a Hermes 4 BBS and create your welcome screens and menu art in-app, no round-trip through any external tool is ever needed.

Can I import art made in Moebius or PabloDraw?

Yes. Import any .ans, .asc, or .txt file from disk. On import, Hermes 4 detects common external-editor artifacts: bare LF line endings are flagged with a CRLF repair offer. After import, the optional "clean pass" runs parse → serialize → write in one click, stripping stray reset characters and normalizing line endings without altering the visual content of the art.

What platforms does the editor run on?

The editor is part of Hermes Server, the macOS application. It requires macOS on Apple Silicon. The underlying ANSI engine (HermesANSI) is a Swift package shared with the client, so the rendering fidelity is consistent across macOS and iOS — but the editor interface is macOS-only.

Is there a CP437 character palette?

Yes. The glyph palette presents all 256 CP437 characters organized in F-key banks following the PabloDraw convention: blocks and shades (░▒▓█), single and double box-drawing characters, and special symbols. A full 256-glyph grid picker is also available. Characters outside CP437 are flagged when you attempt to save as a .ans file.

Get Started

Draw art that looks right. Every time.

The Hermes 4 ANSI editor is part of the free Hermes Server beta. Download Hermes Server for macOS and the editor is waiting in the GFiles manager.

Requires Apple Silicon. Free, no license fees, no subscription.

Actively developed · v0.1.0 · macOS (Apple Silicon)