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
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
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.
CP437 Glyph Palette
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.
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.
SAUCE Inspector
Toolset
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.
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
No upload step. No format conversion. Same engine the whole way.
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.
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.
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.
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.
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.
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.
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.
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.
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.
"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.
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.
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.