{"id":50530306,"url":"https://github.com/xero/text0wnz","last_synced_at":"2026-06-20T07:00:34.192Z","repository":{"id":179484063,"uuid":"663557795","full_name":"xero/text0wnz","owner":"xero","description":"𝙔𝙤𝙪𝙧 𝙗𝙧𝙤𝙬𝙨𝙚𝙧 𝙞𝙨 𝙩𝙝𝙚 𝙘𝙖𝙣𝙫𝙖𝙨. Draw, edit, and collaborate on ANSI, ASCII, NFO, and XBIN art in a retro text art editor rebooted for the modern web. Offline-first or connect for real-time sessions. Crafted for both keyboard-centric artists and creators using a mouse or touch - on any device.","archived":false,"fork":false,"pushed_at":"2026-05-03T05:35:24.000Z","size":6176,"stargazers_count":117,"open_issues_count":2,"forks_count":3,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-05-03T06:34:00.152Z","etag":null,"topics":["ansi","art","ascii","ascii-art","collaborative","editor","graphic-design-software","graphics-editor","nfo","offline-first","progressive-web-app","scene","server","text-art","text-mode","textart","txt","website","xbin"],"latest_commit_sha":null,"homepage":"https://text.0w.nz","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/xero.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":".github/CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE.txt","code_of_conduct":".github/CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":".github/SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":["xero"],"custom":["https://support.x-e.ro"]}},"created_at":"2023-07-07T15:15:44.000Z","updated_at":"2026-05-03T05:18:30.000Z","dependencies_parsed_at":null,"dependency_job_id":"766be0f3-ba5a-4c67-8b05-d47f630b30db","html_url":"https://github.com/xero/text0wnz","commit_stats":null,"previous_names":["xero/moebius-web","xero/text0wnz"],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/xero/text0wnz","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xero%2Ftext0wnz","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xero%2Ftext0wnz/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xero%2Ftext0wnz/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xero%2Ftext0wnz/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/xero","download_url":"https://codeload.github.com/xero/text0wnz/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xero%2Ftext0wnz/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34560266,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-20T02:00:06.407Z","response_time":98,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ansi","art","ascii","ascii-art","collaborative","editor","graphic-design-software","graphics-editor","nfo","offline-first","progressive-web-app","scene","server","text-art","text-mode","textart","txt","website","xbin"],"created_at":"2026-06-03T13:00:24.601Z","updated_at":"2026-06-20T07:00:34.185Z","avatar_url":"https://github.com/xero.png","language":"JavaScript","funding_links":["https://github.com/sponsors/xero","https://support.x-e.ro"],"categories":["Editors and Tools"],"sub_categories":["Web"],"readme":"# teXt0wnz\n\n\u003e ### _Your browser is the canvas_\n\nA 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.\n\n![preview](https://raw.githubusercontent.com/wiki/xero/text0wnz/img/preview.png)\n\n### Draw in your browser now!\n\n| Domain                              | Status                                             |\n|:------------------------------------|:---------------------------------------------------|\n| **https://text.0w.nz**              | The main domain. Collab server may be available    |\n| **https://xero.github.io/text0wnz** | Github Pages version of the site. No collab server |\n\n[![MIT Licensed](https://img.shields.io/github/license/xero/text0wnz?logo=wikiversity\u0026logoColor=979da4\u0026labelColor=262a2e\u0026color=b1a268)](https://github.com/xero/text0wnz/blob/main/LICENSE)\n[![Version](https://img.shields.io/github/package-json/version/xero/teXt0wnz?labelColor=33383e\u0026logo=npm\u0026\u0026logoColor=979da4\u0026color=6e2aa5)](https://github.com/xero/teXt0wnz/releases/latest)\n[![GitHub repo size](https://img.shields.io/github/repo-size/xero/teXt0wnz?labelColor=262a2e\u0026logo=googlecontaineroptimizedos\u0026logoColor=979da4\u0026color=6e2aa5)](https://github.com/xero/teXt0wnz/)\n[![GitHub commit activity](https://img.shields.io/github/commit-activity/w/xero/teXt0wnz?labelColor=262a2e\u0026logo=stagetimer\u0026logoColor=979da4\u0026color=6e2aa5)](https://github.com/xero/text0wnz/graphs/commit-activity)\n[![GitHub last commit](https://img.shields.io/github/last-commit/xero/teXt0wnz.svg?labelColor=262a2e\u0026logo=git\u0026logoColor=979da4\u0026color=6e2aa5)](https://github.com/xero/text0wnz/commits/main/)\n[![OSS Lifecycle](https://img.shields.io/osslifecycle?file_url=https%3A%2F%2Fraw.githubusercontent.com%2Fxero%2FteXt0wnz%2Frefs%2Fheads%2Fmain%2FOSSMETADATA\u0026-square\u0026labelColor=262a2e\u0026logo=checkmarx\u0026logoColor=979da4)](https://github.com/xero/teXt0wnz/blob/main/OSSMETADATA)\n[![Latest Test Suite Results](https://github.com/xero/teXt0wnz/actions/workflows/test-suite.yml/badge.svg?branch=main)](https://github.com/xero/teXt0wnz/actions/workflows/test-suite.yml?query=branch%3Amain)\n[![Latest Deployment](https://img.shields.io/github/deployments/xero/text0wnz/github-pages?logo=githubactions\u0026logoColor=979da4\u0026label=Pages%20Deployment\u0026labelColor=262a2e)](https://github.com/xero/text0wnz/deployments)\n[![Latest Wiki Deployment](https://img.shields.io/badge/success-success?logo=gitbook\u0026logoColor=979da4\u0026labelColor=262a2e\u0026label=Wiki%20Deployment)](https://github.com/xero/text0wnz/wiki)\n[![Schema](https://img.shields.io/badge/Valid-Valid?logo=semanticweb\u0026logoColor=979da4\u0026labelColor=262a2e\u0026label=Schema)](https://validator.schema.org/#url=https%3A%2F%2Fraw.githubusercontent.com%2Fxero%2FteXt0wnz%2Frefs%2Fheads%2Fmain%2Fsrc%2Findex.html)\n[![Lighthouse Performance](https://img.shields.io/badge/100%25-lighthouse?logo=lighthouse\u0026logoColor=979da4\u0026label=Lighthouse\u0026labelColor=262a2e)](https://pagespeed.web.dev/analysis/https-text-0w-nz/eo49m2s0eo?hl=en-US\u0026form_factor=desktop)\n[![Powered by Bun](https://img.shields.io/badge/Bun-Bun?labelColor=262a2e\u0026logo=bun\u0026logoColor=f9f1e1\u0026label=Powered%20by\u0026color=e47ab4\u0026link=https%3A%2F%2Fbun.js)](https://bun.com)\n[![Eslint](https://img.shields.io/badge/Eslint-Eslint?logo=eslint\u0026logoColor=979da4\u0026label=Linting\u0026labelColor=262a2e\u0026color=00aaaa)](https://github.com/xero/teXt0wnz/blob/main/eslint.config.js)\n[![Prettier](https://img.shields.io/badge/Prettier-Prettier?logo=prettier\u0026logoColor=979da4\u0026label=Formatting\u0026labelColor=262a2e\u0026color=00aaaa)](https://github.com/xero/teXt0wnz/blob/main/.prettierrc)\n[![16colors](https://img.shields.io/badge/16Colors-16Colors?logo=renovate\u0026logoColor=979da4\u0026logoSize=auto\u0026label=ANSI%20Art\u0026labelColor=262a2e\u0026color=ed7a2c)](https://16colo.rs)\n[![AsciiArena](https://img.shields.io/badge/AsciiArena-AsciiArena?logo=academia\u0026logoColor=979da4\u0026label=Ascii%20Art\u0026labelColor=262a2e\u0026color=ed7a2c)](https://asciiarena.se)\n\n\n\u003e ### ,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_\n\u003e\n\u003e # Table o' Contents\n\u003e\n\u003e - [Features](#features)\n\u003e - [File Types](#supported-file-types)\n\u003e - [Browser Support](#browser-support)\n\u003e - [Documentation](#documentation)\n\u003e - [Drawing \u0026 Editing Tools](#drawing--editing-tools)\n\u003e - [Key-bindings \u0026 Mouse/Touch Controls](#key-bindings--mousetouch-controls)\n\u003e - [Tips \u0026 Workflow](#tips--workflow)\n\u003e - [Build \u0026 Development](#build--development)\n\u003e - [Collaborative Server](#collaborative-server)\n\u003e - [Docker Containerization](#docker-containerization)\n\u003e - [Testing Suite](#testing-suite)\n\u003e - [Troubleshooting](#troubleshooting)\n\u003e - [Project History](#project-history)\n\u003e - [License \u0026 Greetz](#license--greetz)\n\u003e\n\u003e ### \"7_/\"7_/\"7_/\"7_/\"7_/\"7_/\"7_/\"7_/\"7_/\"7_/\"7_/\"7_/\"7_/\"7_/\"\n\n## Features\n\n- **Web-based text art drawing, also works offline as a PWA**\n  - No install required!\n  - But easily [installed as a Progressive Web Application](docs/install-pwa.md) to your device\n- **Comprehensive keyboard shortcuts and mouse controls**\n  - Draw using the keyboard, mouse, or touch screen\n- **Classic and modern fonts**\n  - Over 100 fonts from IBM PCs, Amiga, C64, and many more vintage/custom\n- **Full suite of drawing tools:**\n  - Keyboard, freehand brushes, fills, shapes, selection, and mirror mode\n- **Advanced color management**\n  - 16-color ANSI, iCE colors, real-time preview, color conflict resolution\n  - Custom XBIN color palette support and selection\n- **Supported file types:**\n  - Import: ANSI, BIN, XBIN, NFO, DIZ, UTF-8 TXT\n  - Export: all of the above and PNG\n- **Multi-platform file opening**\n  - Desktop: OS \"Open with\" integration (Chrome/Edge)\n  - Android: Share sheet integration\n  - iPad+iOS: Enhanced file picker\n  - Drag-and-drop support for everyone!\n- **Canvas operations:**\n  - Undo/redo, canvas resizing, font selection, and full SAUCE metadata support\n- **Editor options:**\n  - Canvas zoom, light/dark mode, and grid overlay\n- **Auto Save/Restore**\n  - Editor Setting saved to local storage for a consistent drawing sessions\n  - Artwork and undo history saved to IndexedDB as you draw, auto-reloads when the app is opened\n  - Optimized binary data storage packing for efficient canvas persistence\n- **Collaborative server mode**\n  - For real-time multi-user editing\n  - Optional and opt-in by users. See: [Privacy](docs/privacy.md)\n- **Build tools:**\n  - Bun, Vite, PostCSS\n- **Automated tests:**\n  - Playwright, Vitest, Testing Library\n- **Robust linting and formatting:**\n  - Eslint and Prettier\n\n## Supported File Types\n\n| Extension       | Description                            | Import | Export | [Sauce](docs/sauce-format.md) |\n|:----------------|:---------------------------------------|:-----|:-----|:-----|\n| **`.ans`**      | ANSI art                               | ░▒▒░ | ░▒▒░ | ░▒▒░ |\n| **`.utf8.ans`** | UTF-8 ANSI for modern terminals        | ░▒▒░ | ░▒▒░ |      |\n| **`.bin`**      | DOS-era binary format                  | ░▒▒░ | ░▒▒░ | ░▒▒░ |\n| **`.xb`**       | [XBIN](docs/xb-format.md) format       | ░▒▒░ | ░▒▒░ | ░▒▒░ |\n| **`.nfo`**      | Scene release format                   | ░▒▒░ | ░▒▒░ | ░▒▒░ |\n| **`.diz`**      | FILE_ID.DIZ archive metadata files     | ░▒▒░ |      | ░▒▒░ |\n| **`.txt`**      | ASCII or other plain text              | ░▒▒░ | ░▒▒░ |      |\n| **`.png`**      | Artwork rendered as an image           |      | ░▒▒░ |      |\n\n## Browser Support\n\n| Browser           | Chrome | Firefox | Safari  | Edge   | Opera  | iOS     | iPadOS | Android |\n|:------------------|:-------|:--------|:--------|:-------|:-------|:--------|:-------|:--------|\n| Last Updated \u003cbr\u003e [2025-11-20](https://github.com/Fyrd/caniuse) | \u003cimg src=\"https://raw.githubusercontent.com/wiki/xero/text0wnz/img/chrome.svg\" width=\"50\" height=\"50\"\u003e | \u003cimg src=\"https://raw.githubusercontent.com/wiki/xero/text0wnz/img/firefox.svg\" width=\"50\" height=\"50\"\u003e | \u003cimg src=\"https://raw.githubusercontent.com/wiki/xero/text0wnz/img/safari.svg\" width=\"50\" height=\"50\"\u003e | \u003cimg src=\"https://raw.githubusercontent.com/wiki/xero/text0wnz/img/edge.svg\" width=\"50\" height=\"50\"\u003e | \u003cimg src=\"https://raw.githubusercontent.com/wiki/xero/text0wnz/img/opera.svg\" width=\"50\" height=\"50\"\u003e | \u003cimg src=\"https://raw.githubusercontent.com/wiki/xero/text0wnz/img/ios.svg\" width=\"50\" height=\"50\"\u003e | \u003cimg src=\"https://raw.githubusercontent.com/wiki/xero/text0wnz/img/ipados.svg\" width=\"50\" height=\"50\"\u003e | \u003cimg src=\"https://raw.githubusercontent.com/wiki/xero/text0wnz/img/android.svg\" width=\"50\" height=\"50\"\u003e |\n| **Supported**     | 95.0+  | 93.0+   | 15.0+   | 95.0+  | 81.0+  | 15.0+   | 15.0+  | 95.0+   |\n| **Latest Dev**    | Canary | Nightly | Preview | Dev    | -      | -       | -      | -       |\n| _**Unsupported**_ | \u003c 94.x | \u003c 92.x  | \u003c 14.x  | \u003c 94.x | \u003c 80.x | \u003c 14.x  | \u003c 14.x | \u003c 94.x  |\n\n## Documentation\n\n\u003e The **[docs](docs/)** folder contains raw markdown documentation files\n\u003e\n\u003e The **[wiki](https://github.com/xero/text0wnz/wiki)** renders these files into easier to read webpages\n\n**Application Guides**\n\n- **[Editor Manual](docs/manual.md) - Visual guide to the Frontend application** [**↵**](https://github.com/xero/text0wnz/wiki/manual)\n  - [Key bindings](docs/manual.md#key-bindings-summary) - Hot keys reference guide [**↵**](https://github.com/xero/text0wnz/wiki/manual#key-bindings-summary)\n- [Collaboration Server](docs/collaboration-server.md) - Backend real-time collaboration server [**↵**](https://github.com/xero/text0wnz/wiki/collaboration-server)\n- [Architecture](docs/architecture.md) - System architecture and design overview [**↵**](https://github.com/xero/text0wnz/wiki/architecture)\n- [PWA Install](docs/install-pwa.md) - Guide to app installing and OS integration for multiple platforms [**↵**](https://github.com/xero/text0wnz/wiki/install-pwa)\n- [Privacy Policy](docs/privacy.md) - Privacy and data handling policy [**↵**](https://github.com/xero/text0wnz/wiki/privacy)\n- [Security Policy](docs/security.md) - Vulnerability reporting \u0026 threat modeling [**↵**](https://github.com/xero/text0wnz/wiki/security)\n\n**Development Guides**\n\n- [Project Structure](docs/project-structure.md) - File and module organization guide [**↵**](https://github.com/xero/text0wnz/wiki/project-structure)\n- [Building and Developing](docs/building-and-developing.md) - Development workflow and build process [**↵**](https://github.com/xero/text0wnz/wiki/building-and-developing)\n- [Testing](docs/testing.md) - Triple headed testing guide (unit, dom, \u0026 e2e) [**↵**](https://github.com/xero/text0wnz/wiki/testing)\n- [CI/CD Pipeline](docs/cicd.md) - Continuous integration and deployment [**↵**](https://github.com/xero/text0wnz/wiki/cicd)\n- [WebServer Configuration](docs/webserver-configuration.md) - WebServer setup and configuration [**↵**](https://github.com/xero/text0wnz/wiki/webserver-configuration)\n- [Docker](docs/docker.md) - Container deployment guide [**↵**](https://github.com/xero/text0wnz/wiki/docker)\n- [Other Tools](docs/other-tools.md) - Additional development and deployment tools [**↵**](https://github.com/xero/text0wnz/wiki/other-tools)\n\n**Technical Specifications**\n\n- [SAUCE Format](docs/sauce-format.md) - SAUCE metadata format specification [**↵**](https://github.com/xero/text0wnz/wiki/sauce-format)\n- [XBin Format](docs/xb-format.md) - XBin file format specification [**↵**](https://github.com/xero/text0wnz/wiki/xb-format)\n\n**Supplemental**\n\n- [Fonts](docs/fonts.md) - Complete font reference and previews [**↵**](https://github.com/xero/text0wnz/wiki/fonts)\n- [Logos](docs/logos.md) - ASCII art logos for the project [**↵**](https://github.com/xero/text0wnz/wiki/logos)\n- [Examples](docs/examples/) - Sample artwork to view and edit\n  - ANSI artwork by [xeR0](https://16colo.rs/artist/xero)\n  - XBin artwork by [Hellbeard](https://16colo.rs/artist/hellbeard)\n\n\u003e [!NOTE]\n\u003e **` ↵ `** links to the wiki version of a document\n\n## Drawing \u0026 Editing Tools\n\n| Tool Name              | Description                                                                    |\n|:-----------------------|:-------------------------------------------------------------------------------|\n| **Keyboard Mode**      | Type characters onto the canvas, using full keyboard navigation                |\n| **Half Block Brush**   | Draw half-blocks with the mouse or touchscreen, pressure-sensitive             |\n| **Shading Brush**      | Draw shading blocks with the mouse or touchscreen, 'reduce mode' with shift    |\n| **Character Brush**    | Draw any ASCII/extended character in the font using a mouse, includes a picker |\n| **Fill Tool**          | Flood fill for color/text, smart attribute handling                            |\n| **Colorizer**          | Paint colors only, hold alt for background colors                              |\n| **Line Tool**          | Draw straight lines, with color conflict resolution                            |\n| **Square/Circle Tool** | Draw rectangles/circles/ellipses, outline or filled, with a real-time preview  |\n| **Selection Tool**     | Select, move, copy, flip, manipulate rectangular areas                         |\n| **Sample Tool**        | Color picker for quick selection from artwork                                  |\n\n## Key Bindings \u0026 Mouse/Touch Controls\n\n**Main Tool Shortcuts:**\n\n| Key | Tool/Action            |\n|:----|:-----------------------|\n| `k` | Keyboard Mode          |\n| `f` | Freestyle (half-block) |\n| `b` | Character Brush        |\n| `n` | Fill Tool              |\n| `a` | Attribute Brush        |\n| `g` | Grid Toggle            |\n| `i` | iCE Colors Toggle      |\n| `m` | Mirror Mode            |\n\n**Color \u0026 Character:**\n\n| Key        | Action                             |\n|:-----------|:-----------------------------------|\n| `d`        | Reset colors to default            |\n| `q`        | Swap foreground/background         |\n| `0`–`7`    | Select basic color                 |\n| `F1`–`F12` | Insert block/character (see below) |\n\n**File \u0026 Canvas:**\n\n| Combo                                     | Action                     |\n|:----------------------------------------- |:---------------------------|\n| `ctrl z` / `ctrl y`                       | Undo / Redo                |\n| `ctrl x`/`ctrl c`/`ctrl v`/`ctrl shift v` | Cut/Copy/Paste/SystemPaste |\n| `ctrl delete`                             | Delete selection           |\n\n**Navigation (Keyboard Mode):**\n\n| Key                      | Action                  |\n|:-------------------------|:------------------------|\n| `arrow keys`             | Move cursor             |\n| `home`                   | Start of current row    |\n| `end`                    | End of current row      |\n| `page up` / `page down`  | Move by viewport screen |\n| `cmd left` / `cmd right` | Start/end of row        |\n\n**Advanced Editing (alt + key):**\n\n| Combo                           | Action               |\n|:--------------------------------|:---------------------|\n| `alt up` / `alt down`           | Insert/Delete row    |\n| `alt right` / `alt left`        | Insert/Delete column |\n| `alt e` / `alt shift e`         | Erase row/col        |\n| `alt home` / `alt end`          | Erase to start/end   |\n| `alt page up` / `alt page down` | Erase to top/bottom  |\n\n**Selection Operations:**\n\n| Key       | Action         |\n|:----------|:---------------|\n| `[` / `]` | Flip selection |\n| `m`       | Move mode      |\n\n**Selection Navigation:**\n\n| Key                      | Action                            |\n|:-------------------------|:----------------------------------|\n| `arrow keys`             | Move selection area by one cell   |\n| `shift arrow keys`       | Expand/shrink selection           |\n| `home` / `end`           | Expand selection to row start/end |\n| `page up` / `page down`  | Move selection by screen height   |\n| `cmd left` / `cmd right` | Expand selection to row start/end |\n\n\u003e [!IMPORTANT]\n\u003e\n\u003e In **Move Mode**: `arrow keys`, `page up`, `page down` move the _selected content_ in the same ways the default actions move the _selection area_.\n\n**Function Keys (`F1`–`F12`):** Quick character insert from CP437 font (blocks, symbols, shapes, and more).\n\n**The Classic CP437 ANSI block shortcuts**\n\n| Key   | Character | Description        |\n|:------|:----------|:-------------------|\n| `F1`  | `░`       | Light shade block  |\n| `F2`  | `▒`       | Medium shade block |\n| `F3`  | `▓`       | Dark shade block   |\n| `F4`  | `█`       | Full block         |\n| `F5`  | `▀`       | Upper half block   |\n| `F6`  | `▄`       | Lower half block   |\n| `F7`  | `▌`       | Left half block    |\n| `F8`  | `▐`       | Right half block   |\n| `F9`  | `■`       | Small solid square  [**_‡_**](https://16colo.rs/artist/alla%20xul) |\n| `F10` | `○`       | Circle             |\n| `F11` | `•`       | Bullet             |\n| `F12` | `NULL`    | Blank/transparent  |\n\n**Cycling character sets:**\n\nUse the toolbar buttons or shortcuts `ctrl [`, `ctrl ]` to cycle predefined sets (blocks, box-drawing, symbols, accents, etc).\n\n### Mouse / Touch Controls\n\n- **Click/Touch:** Draw\n- **Drag:** Draw/Select/Shape\n- **Alt Click:** Sample Color/Alternative Draw\n\n\u003e [!TIP]\n\u003e See: [docs/manual.md](docs/manual.md) for more info.\n\n## Tips \u0026 Workflow\n\n1. Start with Keyboard Mode for layout\n2. Use Grid for alignment\n3. Freestyle for shading/art\n4. Character Brush for textures\n5. Fill Tool for color blocks\n6. Selection Tool for moving/copying\n7. Save often (Ctrl+S)\n8. F-keys for quick block chars\n9. Alt+Click to sample colors\n10. Undo/Redo freely (up to 1000 ops)\n\n\u003e [!NOTE]\n\u003e See the curated collection of [ANSi Tutorials](https://github.com/xero/ansi-art-tutorials/blob/main/README.md) for tips on drawing styles.\n\n## Build \u0026 Development\n\n**Requirements:**\n\n- bun (recommended over npm)\n- node.js (v22.19+)\n\n**Quick Start:**\n\nInstall [bun](https://bun.com):\n\n```sh\n# From an existing npm installation:\nnpm i -g bun\n\n# For UNIX systems like Linux, MacOS, and Open/FreeBSD:\ncurl -fsSL https://bun.sh/install | bash\n\n# For Windows:\npowershell -c \"irm bun.sh/install.ps1 | iex\"\n```\n\nInstall dependencies, build, and serve the app:\n\n```sh\nbun i      # or npm install\nbun bake   # or npm run bake\nbun www    # or npm run www\n```\n\n\u003e [!NOTE]\n\u003e See: [docs/building-and-developing](docs/building-and-developing.md) for more info\n\n**Scripts:**\n\n| Script             | Purpose                              |\n|:-------------------|:-------------------------------------|\n| `bake`             | Build for production (Vite)          |\n| `server`           | Start collaboration server           |\n| `www`              | Serve the `/dist` folder for testing |\n| `fix`              | Auto-fix lint and format             |\n| `lint:check/fix`   | Lint checking/fixing                 |\n| `format:check/fix` | Formatting check/fix                 |\n| `test:unit`        | Run unit tests (Vitest)              |\n| `test:e2e`         | Run end to end tests (Playwright)    |\n| `test:install`     | Install playwright browsers          |\n\n\u003e [!TIP]\n\u003e See: [package.json](package.json) for full commands definitions\n\n**Build Process:**\n\n- Uses Vite + plugins for static copy, sitemap, PWA/offline support\n- Output: `dist/`\n- Files are hashed for cache busting (e.g., `editor-[hash].js`, `stylez-[hash].css`)\n- Customizable options via `.env` variables:\n  - `VITE_DOMAIN='https://text.0w.nz'`\n  - `VITE_UI_DIR='ui/'`\n  - `VITE_WORKER_FILE='websocket.js'`\n\n\u003e [!IMPORTANT]\n\u003e **`VITE_DOMAIN`** is _only_ used for robots.txt and sitemap.xml generation, **all app urls are relative**\n\n**Build Output Structure:**\n\n```\ndist/\n├── index.html                 # Main entry point\n├── site.webmanifest           # PWA manifest\n├── service.js                 # Service worker (injectManifest strategy)\n├── robots.txt                 # Search engine directives\n├── sitemap.xml                # SEO Site map\n├── humans.txt                 # Credits\n├── favicon.ico                # Application icon\n├── ansi/                      # ANSI art tutorials (ANS files, PNG previews)\n└── ui/                        # UI assets\n    ├── stylez-[hash].css      # Minified CSS\n    ├── icons-[hash].svg       # Icon sprite\n    ├── topazplus_1200.woff2   # Interface font (Amiga style)\n    ├── fonts/                 # Bitmap fonts (PNG format)\n    ├── img/                   # PWA Images and app icons\n    └── js/                    # JavaScript bundles\n        ├── editor-[hash].js   # Main application entry point\n        ├── core-[hash].js     # Core modules (state, storage, compression)\n        ├── canvas-[hash].js   # Canvas rendering with lazy font loading\n        ├── tools-[hash].js    # Drawing tools\n        ├── fileops-[hash].js  # File operations\n        ├── network-[hash].js  # Collaboration\n        ├── palette-[hash].js  # Color palette\n        └── websocket.js       # Web Worker (not hashed)\n```\n\n**Code Standards \u0026 Style**\n\n- **HTML 5**: Semantic tagging\n- **CSS 4**: Modern nesting\n- **ES6 JavaScript**: Vanilla \u0026 framework free\n- Sources use all `lowercase` or `camelCase` names\n\n## Collaborative Server\n\nEnable real-time multi-user editing with the built-in server.\n\n**Features:**\n\n- Canvas/chat persistence\n- SSL/HTTP support\n- Custom session names, save intervals\n- Minimal overhead for real-time editing\n\n**Starting the server:**\n\n```sh\nbun server [port] [options]\n# or\nnode src/js/server/main.js\n```\n\n\u003e [!TIP]\n\u003e The server starts on port **`1337`** by default. _so elite_\n\n**Command-Line Options**\n\n| Option                 | Description                                      | Default            |\n|:-----------------------|:-------------------------------------------------|:-------------------|\n| `[port]`               | Port to run the server on                        | `1337`             |\n| `--ssl`                | Enable SSL (requires certificates in `ssl-dir`)  | _Disabled_         |\n| `--ssl-dir \u003cpath\u003e`     | SSL certificate directory                        | `/etc/ssl/private` |\n| `--save-interval \u003cn\u003e`  | Auto-save interval in minutes                    | `30` (minutes)     |\n| `--session-name \u003cstr\u003e` | Session file prefix (for state and chat backups) | `joint`            |\n| `--debug`              | Enable verbose logging                           | `false`            |\n| `--help`               | Show help message and usage examples             | -                  |\n\n\u003e [!NOTE]\n\u003e See: [docs/collaboration-server](docs/collaboration-server) for more info.\n\n## Docker Containerization\n\n**text0wnz** is fully containerized, offering a streamlined deployment experience across different environments and architectures. Our containerization approach focuses on several key areas:\n\n- Multi-Stage Build Architecture\n- Security Hardening\n- Performance Optimization\n- Service Orchestration\n\n### Registry Support\n\nPrebuilt images are available in **linux/amd64** \u0026 **linux/arm64** flavors from multiple repositories:\n\n**[DockerHub](https://hub.docker.com/r/xerostyle/text0wnz):**\n\n```sh\ndocker pull xerostyle/text0wnz:latest\n```\n\n**[GitHub Container Registry](https://github.com/xero/text0wnz/pkgs/container/text0wnz):**\n\n```sh\ndocker pull ghcr.io/xero/text0wnz:latest\n```\n\n### Building Locally\n\nTo build the container locally, you'll need [Docker](https://docs.docker.com/get-docker/) with [Buildx](https://docs.docker.com/buildx/working-with-buildx/) support:\n\n```sh\n# Standard build for your local architecture\ndocker buildx build -t text0wnz:latest .\n\n# Multi-architecture build (requires buildx setup)\ndocker buildx create --name mybuilder --use\ndocker buildx build --platform linux/amd64,linux/arm64 -t yourname/text0wnz:latest --push .\n```\n\n### Running in Development Mode\n\nDevelopment mode provides hot-reloading and detailed logging for an optimized development experience:\n\n```sh\ndocker run \\\n    --cap-add=NET_BIND_SERVICE \\\n    -e NODE_ENV=development \\\n    -p 80:80 \\\n    text0wnz:latest\n```\n\nThe editor client will be available at http://localhost with WebSocket collaboration features enabled.\n\n### Running in Production Mode\n\nFor production deployments, use this configuration with your domain and a secure session key:\n\n```sh\ndocker run \\\n    --cap-add=NET_BIND_SERVICE \\\n    -e DOMAIN=your.cool.domain.tld \\\n    -e SESSION_KEY=secure-production-key \\\n    -e NODE_ENV=production \\\n    -p 80:80 -p 443:443 \\\n    text0wnz:latest\n```\n\nThis setup enables:\n\n- Automatic HTTPS via Caddy's built-in certificate management\n- Production-optimized performance settings\n- Stricter security headers and content policies\n\n\u003e [!NOTE]\n\u003e See: [docs/docker](docs/docker.md) for more info and advanced setup examples.\n\n## Testing Suite\n\n**Triple-Headed:**\n\n- **Vitest:** Unit/integration\n- **Testing Library:** DOM/component\n- **Playwright:** E2E/browser\n\n\u003e [!TIP]\n\u003e View the latest [unit coverage report](https://xero.github.io/text0wnz/tests/) \u0026 [e2e testing report](https://xero.github.io/text0wnz/tests/e2e/)\n\n```sh\nbun test:unit  # Run unit tests\nbun test:e2e   # Run end2end tests\n```\n\nAll tests run automatically in [CI/CD](https://github.com/xero/text0wnz/tree/main/.github/workflows).\n\n\u003e [!NOTE]\n\u003e See: [docs/testing](docs/testing.md) for more info on unit test frameworks and tools.\n\u003e\n\u003e See: [CI/CD Pipeline documentation](docs/cicd.md) for details on the automated testing, building, and deployment process.\n\n## Troubleshooting\n\n**Common Issues:**\n\n**Client**\n- Build fails: Check Node.js version, reinstall deps\n- e2e tests fail: Check you have the playwright browsers installed (`bun test:install`)\n- Client can't connect to server: Check server, proxy, firewall settings\n- WebSocket drops: Validate webServer headers, note trailing slash in proxy_pass\n\n**Still stuck?**\n[Review the wiki](https://github.com/xero/text0wnz/wiki) then [open an issue](https://github.com/xero/teXt0wnz/issues) with error logs and platform details.\n\n**Server:**\n- Port in use: Change server port or stop other process\n- SSL fails: Check cert/key files and permissions\n- Session not saving: Check write permissions, save interval\n- Permissions: Confirm systemd user access\n- Wrong port: Sync client/server configs\n\n\u003e [!TIP]\n\u003e - Use a process manager (systemd, forever) for the server\n\u003e - Lower save interval for busy sessions\n\u003e - Use SSL in production (Let's Encrypt via Certbot, ACME-nginx, etc)\n\u003e - WebSocket debugging: browser dev tools\n\u003e - Restore session: rename backups in the **`sessions`** folder\n\u003e - Run using the **`--debug`** flag and review logs for details\n\u003e\n\u003e See: [docs/trouble_shooting](docs/webserver-configuration.md#troubleshooting) for more help.\n\n## Project History\n\nThe story of this project traces back to 2018, when AndyH joined [Blocktronics](https://16colo.rs/group/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.\n\nAround that time, xeR0 (then a member of [Impure!ASCii](https://16colo.rs/group/impure) 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.\n\nFast 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.\n\n## License \u0026 Greetz\n\n\u003cimg src=\"https://gist.githubusercontent.com/xero/cbcd5c38b695004c848b73e5c1c0c779/raw/6b32899b0af238b17383d7a878a69a076139e72d/kopimi-sm.png\" align=\"left\" height=\"222\"\u003e\n\nMad love \u0026 respect to ▒ [Andy Herbert^67](http://github.com/andyherbert) - [Moebius](https://github.com/blocktronics/moebius) ░ [grmmxi^imp!](https://glyphdrawing.club/) - [MoebiusXBIN](https://github.com/hlotvonen/moebiusXBIN/) ░ [Curtis Wensley](https://github.com/cwensley) - [PabloDraw](https://github.com/cwensley/pablodraw) ░ [Skull Leader^ACiD](https://defacto2.net/p/skull-leader) - [ACiDDRAW](https://www.acid.org/apps/apps.html) ▒ \u0026 the art scene!\n\n---\n\nAll files and scripts in this repo are released [MIT](https://github.com/xero/teXt0wnz/blob/main/LICENSE) / [kopimi](https://kopimi.com)! 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`\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxero%2Ftext0wnz","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fxero%2Ftext0wnz","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxero%2Ftext0wnz/lists"}