Release notes

de-ASCII final polish upgrades readable reconstruction and game asset scaffolds

The final go-live polish adds universal best-effort ASCII/ANSI parsing, text-focused reconstruction guidance, restoration-only AI instructions, compact ASCII handoff discipline, and a reusable browser-safe module for turning ASCII into game level, texture, sign, sprite, and UI asset manifests.

July 5, 20266 min readMichael Barbine

What changed

The final polish keeps de-ASCII focused on its job: reconstructing image output from ASCII and ANSI art. Text readability is now a first-class reconstruction concern, especially for small labels, signs, UI text, digits, captions, code, and map annotations. Hybrid and glyph modes preserve character masks before any optional smoothing pass, and the public guidance now defaults small text toward larger cells, low smoothing, and sharpening rather than pretending every source can be restored at thumbnail scale.

Any pasted ASCII is a valid starting point

de-ASCII no longer assumes the source came from the sibling ASCII app. The parser now accepts plain ASCII, ANSI terminal art with foreground/background SGR color, 16-color, 256-color, truecolor, bold, faint, inverse video, tabs, cursor movement, and erase sequences, plus Unicode Braille, block, quadrant, box-drawing, geometric, and punctuation-heavy art. Sources without exact color metadata are reconstructed as best-effort image evidence rather than treated as a failed round trip.

AI enhancement is restoration, not regeneration

The AI path is intentionally framed as enhancement of the deterministic reconstruction. The instruction stack emphasizes preserving composition, palette, geometry, visible text evidence, symbols, and labels. It avoids prompt-only generation and does not ask a model to invent words, numbers, signs, UI labels, or objects that are not present in the ASCII-derived image.

Reusable game scaffold

de-ASCII now exposes a browser-safe game asset scaffold in lib/game-assets.ts. It parses ASCII into compact row-RLE collision layers, base36 luminance rows, marker coordinates, sign text runs, palette hints, bounds, and recommended reconstruction settings. Games can load the manifest first and reconstruct textures, signs, sprites, or editor previews only when needed.

Braille and animation inputs

Unicode Braille art now auto-detects as its own charset and reconstructs from each cell's 2x4 dot geometry. ASCII animation streams also get a reusable frame scaffold: form-feed, ANSI clear-screen, or repeated blank-line separated frames can become compact per-frame manifests for browser runtimes.

Reusable client-side game scaffold
import { createAsciiGameAssetManifest } from "@/lib/game-assets"

const manifest = createAsciiGameAssetManifest(asciiText, {
  kind: "level",
  tileSize: 16,
  reconstruction: { renderMode: "hybrid", smoothing: 1, autoFitOutput: true }
})

// Collision layer stays compact and game-loadable.
console.log(manifest.layers.collision.encoding)
console.log(manifest.markers, manifest.signs)
Generated demo manifest excerpt
{
  "version": "platphorm-deascii-game-asset.v1",
  "assetId": "launch-scaffold-demo",
  "kind": "level",
  "bounds": {
    "width": 96,
    "height": 60,
    "aspectRatio": 1.6
  },
  "collision": {
    "encoding": "row-rle-v1",
    "rows": 5,
    "cols": 8,
    "solidCount": 23,
    "emptyCount": 17,
    "occupiedRatio": 0.575,
    "data": [
      "8s",
      "1s.6e.1s",
      "1s.3e.1s.2e.1s",
      "1s.6e.1s",
      "8s"
    ]
  },
  "markers": [
    {
      "id": "spawn_1_1",
      "kind": "spawn",
      "token": "S",
      "row": 1,
      "col": 1,
      "x": 18,
      "y": 18
    },
    {
      "id": "exit_1_6",
      "kind": "exit",
      "token": "E",
      "row": 1,
      "col": 6,
      "x": 78,
      "y": 18
    },
    {
      "id": "spawn_2_2",
      "kind": "spawn",
      "token": "S",
      "row": 2,
      "col": 2,
      "x": 30,
      "y": 30
    },
    {
      "id": "npc_2_5",
      "kind": "npc",
      "token": "N",
      "row": 2,
      "col": 5,
      "x": 66,
      "y": 30
    },
    {
      "id": "item_3_3",
      "kind": "item",
      "token": "*",
      "row": 3,
      "col": 3,
      "x": 42,
      "y": 42
    },
    {
      "id": "hazard_3_6",
      "kind": "hazard",
      "token": "!",
      "row": 3,
      "col": 6,
      "x": 78,
      "y": 42
    }
  ],
  "signs": [
    {
      "id": "sign_1_1",
      "text": "S....E",
      "row": 1,
      "col": 1,
      "length": 6,
      "x": 12,
      "y": 12
    },
    {
      "id": "sign_2_2",
      "text": "SIGN",
      "row": 2,
      "col": 2,
      "length": 4,
      "x": 24,
      "y": 24
    }
  ],
  "payloadStrategy": "rle_collision_plus_base36_luminance"
}