A retro text art editor rebooted for the modern web. Draw, edit, and collaborate on ANSI, ASCII, NFO, and XBIN files. Offline-first with auto-save/restore via local storage, plus an optional self-hosted server component enabling real-time, multi-user sessions. Crafted for keyboard-centric artists and creators using mouse or touch, on any device. Built with modern tools and automated testing for a seamless experience for text artists and developers.
| Domain | Status |
|---|---|
| https://text.0w.nz | The main domain. Collab server may be available |
| https://xero.github.io/text0wnz | Github Pages version of the site. No collab server |
- Web-based text art drawing, also works offline as a PWA
- No install required!
- But easily installed as a Progressive Web Application to your device
- Comprehensive keyboard shortcuts and mouse controls
- Draw using the keyboard, mouse, or touch screen
- Classic and modern fonts
- Over 100 fonts from IBM PCs, Amiga, C64, and many more vintage/custom
- Full suite of drawing tools:
- Keyboard, freehand brushes, fills, shapes, selection, and mirror mode
- Advanced color management
- 16-color ANSI, iCE colors, real-time preview, color conflict resolution
- Custom XBIN color palette support and selection
- Supported file types:
- Import: ANSI, BIN, XBIN, NFO, DIZ, UTF-8 TXT
- Export: all of the above and PNG
- Multi-platform file opening
- Desktop: OS "Open with" integration (Chrome/Edge)
- Android: Share sheet integration
- iPad+iOS: Enhanced file picker
- Drag-and-drop support for everyone!
- Canvas operations:
- Undo/redo, canvas resizing, font selection, and full SAUCE metadata support
- Editor options:
- Canvas zoom, light/dark mode, and grid overlay
- Auto Save/Restore
- Editor Setting saved to local storage for a consistent drawing sessions
- Artwork and undo history saved to IndexedDB as you draw, auto-reloads when the app is opened
- Optimized binary data storage packing for efficient canvas persistence
- Collaborative server mode
- For real-time multi-user editing
- Optional and opt-in by users. See: Privacy
- Build tools:
- Bun, Vite, PostCSS
- Automated tests:
- Playwright, Vitest, Testing Library
- Robust linting and formatting:
- Eslint and Prettier
| Extension | Description | Import | Export | Sauce |
|---|---|---|---|---|
.ans |
ANSI art | ββββ | ββββ | ββββ |
.utf8.ans |
UTF-8 ANSI for modern terminals | ββββ | ββββ | |
.bin |
DOS-era binary format | ββββ | ββββ | ββββ |
.xb |
XBIN format | ββββ | ββββ | ββββ |
.nfo |
Scene release format | ββββ | ββββ | ββββ |
.diz |
FILE_ID.DIZ archive metadata files | ββββ | ββββ | |
.txt |
ASCII or other plain text | ββββ | ββββ | |
.png |
Artwork rendered as an image | ββββ |
| Browser | Chrome | Firefox | Safari | Edge | Opera | iOS | iPadOS | Android |
|---|---|---|---|---|---|---|---|---|
| Last Updated 2025-11-20 |
||||||||
| Supported | 95.0+ | 93.0+ | 15.0+ | 95.0+ | 81.0+ | 15.0+ | 15.0+ | 95.0+ |
| Latest Dev | Canary | Nightly | Preview | Dev | - | - | - | - |
| Unsupported | < 94.x | < 92.x | < 14.x | < 94.x | < 80.x | < 14.x | < 14.x | < 94.x |
The docs folder contains raw markdown documentation files
The wiki renders these files into easier to read webpages
Application Guides
- Editor Manual - Visual guide to the Frontend application β΅
- Key bindings - Hot keys reference guide β΅
- Collaboration Server - Backend real-time collaboration server β΅
- Architecture - System architecture and design overview β΅
- PWA Install - Guide to app installing and OS integration for multiple platforms β΅
- Privacy Policy - Privacy and data handling policy β΅
- Security Policy - Vulnerability reporting & threat modeling β΅
Development Guides
- Project Structure - File and module organization guide β΅
- Building and Developing - Development workflow and build process β΅
- Testing - Triple headed testing guide (unit, dom, & e2e) β΅
- CI/CD Pipeline - Continuous integration and deployment β΅
- WebServer Configuration - WebServer setup and configuration β΅
- Docker - Container deployment guide β΅
- Other Tools - Additional development and deployment tools β΅
Technical Specifications
- SAUCE Format - SAUCE metadata format specification β΅
- XBin Format - XBin file format specification β΅
Supplemental
- Fonts - Complete font reference and previews β΅
- Logos - ASCII art logos for the project β΅
- Examples - Sample artwork to view and edit
Note
β΅ links to the wiki version of a document
| Tool Name | Description |
|---|---|
| Keyboard Mode | Type characters onto the canvas, using full keyboard navigation |
| Half Block Brush | Draw half-blocks with the mouse or touchscreen, pressure-sensitive |
| Shading Brush | Draw shading blocks with the mouse or touchscreen, 'reduce mode' with shift |
| Character Brush | Draw any ASCII/extended character in the font using a mouse, includes a picker |
| Fill Tool | Flood fill for color/text, smart attribute handling |
| Colorizer | Paint colors only, hold alt for background colors |
| Line Tool | Draw straight lines, with color conflict resolution |
| Square/Circle Tool | Draw rectangles/circles/ellipses, outline or filled, with a real-time preview |
| Selection Tool | Select, move, copy, flip, manipulate rectangular areas |
| Sample Tool | Color picker for quick selection from artwork |
Main Tool Shortcuts:
| Key | Tool/Action |
|---|---|
k |
Keyboard Mode |
f |
Freestyle (half-block) |
b |
Character Brush |
n |
Fill Tool |
a |
Attribute Brush |
g |
Grid Toggle |
i |
iCE Colors Toggle |
m |
Mirror Mode |
Color & Character:
| Key | Action |
|---|---|
d |
Reset colors to default |
q |
Swap foreground/background |
0β7 |
Select basic color |
F1βF12 |
Insert block/character (see below) |
File & Canvas:
| Combo | Action |
|---|---|
ctrl z / ctrl y |
Undo / Redo |
ctrl x/ctrl c/ctrl v/ctrl shift v |
Cut/Copy/Paste/SystemPaste |
ctrl delete |
Delete selection |
Navigation (Keyboard Mode):
| Key | Action |
|---|---|
arrow keys |
Move cursor |
home |
Start of current row |
end |
End of current row |
page up / page down |
Move by viewport screen |
cmd left / cmd right |
Start/end of row |
Advanced Editing (alt + key):
| Combo | Action |
|---|---|
alt up / alt down |
Insert/Delete row |
alt right / alt left |
Insert/Delete column |
alt e / alt shift e |
Erase row/col |
alt home / alt end |
Erase to start/end |
alt page up / alt page down |
Erase to top/bottom |
Selection Operations:
| Key | Action |
|---|---|
[ / ] |
Flip selection |
m |
Move mode |
Selection Navigation:
| Key | Action |
|---|---|
arrow keys |
Move selection area by one cell |
shift arrow keys |
Expand/shrink selection |
home / end |
Expand selection to row start/end |
page up / page down |
Move selection by screen height |
cmd left / cmd right |
Expand selection to row start/end |
Important
In Move Mode: arrow keys, page up, page down move the selected content in the same ways the default actions move the selection area.
Function Keys (F1βF12): Quick character insert from CP437 font (blocks, symbols, shapes, and more).
The Classic CP437 ANSI block shortcuts
| Key | Character | Description |
|---|---|---|
F1 |
β |
Light shade block |
F2 |
β |
Medium shade block |
F3 |
β |
Dark shade block |
F4 |
β |
Full block |
F5 |
β |
Upper half block |
F6 |
β |
Lower half block |
F7 |
β |
Left half block |
F8 |
β |
Right half block |
F9 |
β |
Small solid square β‘ |
F10 |
β |
Circle |
F11 |
β’ |
Bullet |
F12 |
NULL |
Blank/transparent |
Cycling character sets:
Use the toolbar buttons or shortcuts ctrl [, ctrl ] to cycle predefined sets (blocks, box-drawing, symbols, accents, etc).
- Click/Touch: Draw
- Drag: Draw/Select/Shape
- Alt Click: Sample Color/Alternative Draw
Tip
See: docs/manual.md for more info.
- Start with Keyboard Mode for layout
- Use Grid for alignment
- Freestyle for shading/art
- Character Brush for textures
- Fill Tool for color blocks
- Selection Tool for moving/copying
- Save often (Ctrl+S)
- F-keys for quick block chars
- Alt+Click to sample colors
- Undo/Redo freely (up to 1000 ops)
Note
See the curated collection of ANSi Tutorials for tips on drawing styles.
Requirements:
- bun (recommended over npm)
- node.js (v22.19+)
Quick Start:
Install bun:
# From an existing npm installation:
npm i -g bun
# For UNIX systems like Linux, MacOS, and Open/FreeBSD:
curl -fsSL https://bun.sh/install | bash
# For Windows:
powershell -c "irm bun.sh/install.ps1 | iex"Install dependencies, build, and serve the app:
bun i # or npm install
bun bake # or npm run bake
bun www # or npm run wwwNote
See: docs/building-and-developing for more info
Scripts:
| Script | Purpose |
|---|---|
bake |
Build for production (Vite) |
server |
Start collaboration server |
www |
Serve the /dist folder for testing |
fix |
Auto-fix lint and format |
lint:check/fix |
Lint checking/fixing |
format:check/fix |
Formatting check/fix |
test:unit |
Run unit tests (Vitest) |
test:e2e |
Run end to end tests (Playwright) |
test:install |
Install playwright browsers |
Tip
See: package.json for full commands definitions
Build Process:
- Uses Vite + plugins for static copy, sitemap, PWA/offline support
- Output:
dist/ - Files are hashed for cache busting (e.g.,
editor-[hash].js,stylez-[hash].css) - Customizable options via
.envvariables:VITE_DOMAIN='https://text.0w.nz'VITE_UI_DIR='ui/'VITE_WORKER_FILE='websocket.js'
Important
VITE_DOMAIN is only used for robots.txt and sitemap.xml generation, all app urls are relative
Build Output Structure:
dist/
βββ index.html # Main entry point
βββ site.webmanifest # PWA manifest
βββ service.js # Service worker (injectManifest strategy)
βββ robots.txt # Search engine directives
βββ sitemap.xml # SEO Site map
βββ humans.txt # Credits
βββ favicon.ico # Application icon
βββ ansi/ # ANSI art tutorials (ANS files, PNG previews)
βββ ui/ # UI assets
βββ stylez-[hash].css # Minified CSS
βββ icons-[hash].svg # Icon sprite
βββ topazplus_1200.woff2 # Interface font (Amiga style)
βββ fonts/ # Bitmap fonts (PNG format)
βββ img/ # PWA Images and app icons
βββ js/ # JavaScript bundles
βββ editor-[hash].js # Main application entry point
βββ core-[hash].js # Core modules (state, storage, compression)
βββ canvas-[hash].js # Canvas rendering with lazy font loading
βββ tools-[hash].js # Drawing tools
βββ fileops-[hash].js # File operations
βββ network-[hash].js # Collaboration
βββ palette-[hash].js # Color palette
βββ websocket.js # Web Worker (not hashed)
Code Standards & Style
- HTML 5: Semantic tagging
- CSS 4: Modern nesting
- ES6 JavaScript: Vanilla & framework free
- Sources use all
lowercaseorcamelCasenames
Enable real-time multi-user editing with the built-in server.
Features:
- Canvas/chat persistence
- SSL/HTTP support
- Custom session names, save intervals
- Minimal overhead for real-time editing
Starting the server:
bun server [port] [options]
# or
node src/js/server/main.jsTip
The server starts on port 1337 by default. so elite
Command-Line Options
| Option | Description | Default |
|---|---|---|
[port] |
Port to run the server on | 1337 |
--ssl |
Enable SSL (requires certificates in ssl-dir) |
Disabled |
--ssl-dir <path> |
SSL certificate directory | /etc/ssl/private |
--save-interval <n> |
Auto-save interval in minutes | 30 (minutes) |
--session-name <str> |
Session file prefix (for state and chat backups) | joint |
--debug |
Enable verbose logging | false |
--help |
Show help message and usage examples | - |
Note
See: docs/collaboration-server for more info.
text0wnz is fully containerized, offering a streamlined deployment experience across different environments and architectures. Our containerization approach focuses on several key areas:
- Multi-Stage Build Architecture
- Security Hardening
- Performance Optimization
- Service Orchestration
Prebuilt images are available in linux/amd64 & linux/arm64 flavors from multiple repositories:
docker pull xerostyle/text0wnz:latestdocker pull ghcr.io/xero/text0wnz:latestTo build the container locally, you'll need Docker with Buildx support:
# Standard build for your local architecture
docker buildx build -t text0wnz:latest .
# Multi-architecture build (requires buildx setup)
docker buildx create --name mybuilder --use
docker buildx build --platform linux/amd64,linux/arm64 -t yourname/text0wnz:latest --push .Development mode provides hot-reloading and detailed logging for an optimized development experience:
docker run \
--cap-add=NET_BIND_SERVICE \
-e NODE_ENV=development \
-p 80:80 \
text0wnz:latestThe editor client will be available at http://localhost with WebSocket collaboration features enabled.
For production deployments, use this configuration with your domain and a secure session key:
docker run \
--cap-add=NET_BIND_SERVICE \
-e DOMAIN=your.cool.domain.tld \
-e SESSION_KEY=secure-production-key \
-e NODE_ENV=production \
-p 80:80 -p 443:443 \
text0wnz:latestThis setup enables:
- Automatic HTTPS via Caddy's built-in certificate management
- Production-optimized performance settings
- Stricter security headers and content policies
Note
See: docs/docker for more info and advanced setup examples.
Triple-Headed:
- Vitest: Unit/integration
- Testing Library: DOM/component
- Playwright: E2E/browser
Tip
View the latest unit coverage report & e2e testing report
bun test:unit # Run unit tests
bun test:e2e # Run end2end testsAll tests run automatically in CI/CD.
Note
See: docs/testing for more info on unit test frameworks and tools.
See: CI/CD Pipeline documentation for details on the automated testing, building, and deployment process.
Common Issues:
Client
- Build fails: Check Node.js version, reinstall deps
- e2e tests fail: Check you have the playwright browsers installed (
bun test:install) - Client can't connect to server: Check server, proxy, firewall settings
- WebSocket drops: Validate webServer headers, note trailing slash in proxy_pass
Still stuck? Review the wiki then open an issue with error logs and platform details.
Server:
- Port in use: Change server port or stop other process
- SSL fails: Check cert/key files and permissions
- Session not saving: Check write permissions, save interval
- Permissions: Confirm systemd user access
- Wrong port: Sync client/server configs
Tip
- Use a process manager (systemd, forever) for the server
- Lower save interval for busy sessions
- Use SSL in production (Let's Encrypt via Certbot, ACME-nginx, etc)
- WebSocket debugging: browser dev tools
- Restore session: rename backups in the
sessionsfolder - Run using the
--debugflag and review logs for details
See: docs/trouble_shooting for more help.
The story of this project traces back to 2018, when AndyH joined Blocktronicsβthe legendary masters of the ANSI art scene. During his early days there, he created the original βansiedit,β laying the groundwork for this application. However, his focus soon shifted to developing a desktop-only editor, which evolved into Moebius.
Around that time, xeR0 (then a member of Impure!ASCii and a devoted PabloDraw user) joined Blocktronics shortly after ansieditβs release. xeR0 played the role of testing and debugging the app alongside Andy as he learned the dark arts of the blocks.
Fast forward a decade: xeR0 found himself sad he was still unable to use the new MoebiusXBIN fork to create text art on his iPad. With Andyβs blessing, xeR0 decided to revive the projectβreimagining it from the ground up as a modern Progressive Web App. New features like optimized off-screen canvas', dirty pixel rendering, local storage sync, were added. But without Andy's core math this project would not be possible.
Mad love & respect to β Andy Herbert^67 - Moebius β grmmxi^imp! - MoebiusXBIN β Curtis Wensley - PabloDraw β Skull Leader^ACiD - ACiDDRAW β & the art scene!
All files and scripts in this repo are released MIT / kopimi! In the spirit of freedom of information, I encourage you to fork, modify, change, share, or do whatever you like with this project! ^c^v

