teXt0wnz
web based text-mode art editor
teXt0wnz is a web-based text-mode art editor for ANSI, ASCII, XBIN, NFO and more. Create, edit, and share text-based artwork in your browser—with full support for auto-save/restore with local storage, real-time collaborative editing, modern build tools, and automated testing.

| 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 |
Application Guides
Development Guides
Technical Specifications
Supplemental
| 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 |
> [!NOTE] > See: docs/editor-client for more info.
| Key | Action/Tool |
|---|---|
| k | Keyboard Mode |
| f | Freestyle (half-block) |
| b | Character Brush |
| n | Fill |
| a | Attribute Brush |
| g | Grid Toggle |
| i | iCE Colors Toggle |
| m | Mirror Mode |
| Key/Combo | Action |
|---|---|
| d | Reset colors to default |
| Q | Swap foreground/background |
| f1–f12 | Insert ASNI block chars |
| 0–7 | Select foreground color (again for bright) |
| alt/option + 0–7 | Select background color (again for bright) |
| Key Combo | Action |
|---|---|
| ctrl+z / ctrl+y | Undo / Redo |
| ctrl+x | Cut |
| ctrl+c | Copy |
| ctrl+v | Paste |
| ctrl+shift+v | Paste from system clipboard |
| ctrl+delete | Delete selection |
| Combo | Action |
|---|---|
| alt+up/down | Insert/Delete row |
| alt+right/left | Insert/Delete col |
| alt+e/shift+e | Erase row/col |
| alt+home/end | Erase to start/end |
| alt+pgUp/pgDn | Erase to top/bottom |
| Key | Action |
|---|---|
| arrow keys | Move cursor |
| home/end | Line start/end |
| page up/down | Page jump |
| tab/backspace | Insert tab/delete left |
| enter | New line |
| Key | Action |
|---|---|
| [,] | Flip selection |
| M | Move mode |
Requirements:
Quick Start:
install bun
npm i -g bun
install, build, and serve the app:
bun i # or npm install
bun bake # or npm run bake
bun www # or npm run www
> [!NOTE] > 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 |
Build Process:
Build Output Structure:
dist/
├── index.html # Main entry point
├── site.webmanifest # PWA manifest
├── service.js # Service worker
├── workbox-[hash].js # Workbox runtime for caching
├── robots.txt # Search engine directives
├── sitemap.xml # Site map
├── humans.txt # Humans.txt file
├── favicon.ico # Favicon
└── ui/ # UI assets directory
├── stylez-[hash].css # Minified CSS (hashed)
├── icons-[hash].svg # Icon sprite (hashed)
├── topazplus_1200.woff2 # Font file
├── fonts/ # Bitmap fonts (PNG format)
├── img/ # Images and icons
└── js/ # JavaScript bundles (all hashed)
├── editor-[hash].js # Main entry
├── 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)
> [!IMPORTANT] > DOMAIN is only used for robots.txt and sitemap.xml generation, all app urls are relative
Enable real-time multi-user editing with the built-in server.
Features:
Starting the server:
bun server [port] [options]
# or
node src/js/server/main.js
> [!TIP] > 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:
Prebuilt images are avalable in linux/amd64 & linux/arm64 flavors from multiple repositories:
docker pull xerostyle/text0wnz:latest
docker pull ghcr.io/xero/text0wnz:latest
To 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:latest
The application 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:latest
This setup enables:
> [!NOTE] > See: docs/docker for more info and advanced setup examples.
Triple-Headed:
> [!TIP] > view the latest: unit coverage report & e2e testing report
bun test:unit # Run unit tests
bun test:e2e # Run end2end tests
All tests run automatically in CI/CD. See the CI/CD Pipeline documentation for details on the automated testing, building, and deployment process.
> [!NOTE] > See: docs/testing for more info.
Common Issues:
Still stuck? Open an issue with error logs and platform details.
Tips:
> [!NOTE] > See: docs/trouble_shooting for more help.
> Works on desktop and mobile!
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.
<img src="https://gist.githubusercontent.com/xero/cbcd5c38b695004c848b73e5c1c0c779/raw/6b32899b0af238b17383d7a878a69a076139e72d/kopimi-sm.png" align="left" height="222">
mad love & respect to ▒ Andy Herbert^67 - Moebius ░ grmmxi^imp! - MoebiusXBIN ░ Curtis Wensley - PabloDraw ░ Skull Leader^ACiD - ACiDDRAW ▒ & the 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