agentsclimarketplace

Ascii img react

Skill vinsonconsulting/claude-skill-foundry/skills/ascii-art/ascii-img-react

Use when rendering images as ASCII art in the browser or a React app with the ascii-img-react library — the shape-vector (not brightness-ramp) approach that keeps edges sharp. Trigger when ascii-img-react or <AsciiImage> is named; when the user wants an image-to-ASCII React component, a terminal/retro ASCII image effect on a web page, a click-ripple or rain ASCII animation over an image, or to theme ASCII output via CSS variables; or when they reach for the low-level utilities (sampleCell, sampleGrid, sampleExternalCircles, findBestCharacter, CachedCharacterLookup, applyGlobalContrast / applyDirectionalContrast, NORMALIZED_CHARACTERS). Covers install, the <AsciiImage> props, CORS/sizing/performance caveats, CSS-variable theming, Astro/Next integration, and the 6D shape-vector technique it implements. Not for converting an image file to ASCII from the command line in Python (use image-to-ascii), and not for real-time generative textmode graphics on a WebGL grid (use textmode-js).From its SKILL.md

Install
npx -y skills add vinsonconsulting/claude-skill-foundry --skill ascii-img-react

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

2 things to look at

  • 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
  • runs commandsInstructs the agent to run 1 command, including `npm add [email protected]`.

SKILL.md

5.8 KB, ~1.3k tokens by cl100k_base, as published. Nobody here has run it

ascii-img-react

ascii-img-react renders an image as ASCII art in React via an <AsciiImage> component. It matches each grid cell to the character whose shape fits best (6D shape vectors + nearest-neighbour), so edges stay crisp — unlike a brightness ramp. Pin a version: the package is young (0.1.0, MIT). Install + props live below; the full API is in references/component-api.md, the algorithm in references/technique.md.

Mental model

  • Characters are matched by shape, not brightness. Six staggered sampling circles per cell form a 6D vector; the nearest character (Euclidean distance) wins. That is why diagonals and curves render as /, \, _ rather than a blocky ramp.
  • The component samples the image on a hidden <canvas>, so the image must be same-origin or CORS-enabled (img.crossOrigin = "anonymous"). A cross-origin image without CORS headers renders blank.
  • It outputs a <pre> of monospace text. Monospace fonts only — proportional fonts break the grid.
  • The contrast and directionalContrast props are exactly the global and directional contrast-enhancement exponents from the technique (see references/technique.md).

Install

npm add [email protected]     # or: bun add / pnpm add / yarn add

Peer deps: React 18 or 19 (react, react-dom).

Usage

import { AsciiImage } from 'ascii-img-react';

export function Hero() {
  return (
    <AsciiImage
      src="/portrait.jpg"        // same-origin or CORS-enabled
      width={100}                 // output width in CHARACTERS
      color="#39ff14"             // green
      backgroundColor="#000"
      enableRipple={false}
    />
  );
}

width/height are in characters. cellWidth/cellHeight (px, default 6×12) set the sampling resolution. Defaults that matter: contrast={1.5}, directionalContrast={2}, enableDirectionalContrast, enableRipple, fontSize={10}, lineHeight={0.8}. Full prop table in references/component-api.md.

Theming with CSS variables

Set the --ascii-* variables on a shared class and pass it via className to theme every instance at once (props still win per-instance):

.ascii {
  --ascii-font-family: 'Fira Code', monospace;
  --ascii-font-size: 12px;
  --ascii-line-height: 0.85;
  --ascii-color: #c8d3f5;
  --ascii-background: #1a1b26;
}
@media (prefers-color-scheme: light) {
  .ascii { --ascii-color: #1a1b26; --ascii-background: #e1e2e7; }
}
<AsciiImage src="/portrait.jpg" width={120} className="ascii" />

--ascii-font-family works even though it looks commented out in the source — the container falls back through var(--ascii-font-family, monospace).

Sharpening a mushy render

Internal edges look soft? Raise contrast (global, default 1.5) and/or directionalContrast (default 2, needs enableDirectionalContrast). Global contrast separates light/dark across the whole cell; directional contrast samples neighbouring cells to fix staircasing at hard boundaries. See the global-vs-directional explanation in references/technique.md.

Animation: ripple and rain

  • enableRipple (default true) makes clicks send a wave that perturbs the sampling vectors. Tune rippleCount and rippleConfig (speed, amplitude, decay, wavelength, duration).
  • enableRain (default false) auto-spawns drops; tune rainConfig (intensity, variation).

Animation has a cost: grids wider than ~150 columns can stutter. For large output, shrink width or set enableRipple={false}.

Low-level utilities

For a custom pipeline (your own canvas, caching, or non-React use), import from the package root: sampleCell / sampleGrid / sampleExternalCircles, rgbToLightness, DEFAULT_GRID_CONFIG, findBestCharacter / CachedCharacterLookup / cachedLookup, CHARACTERS / NORMALIZED_CHARACTERS, applyGlobalContrast / applyDirectionalContrast / applyFullContrast. Reach for these only when <AsciiImage> can't express what you need; otherwise the component is the path. Full signatures in references/component-api.md.

Framework notes

  • Next.js / Astro: <AsciiImage> is a client component (uses useEffect, <canvas>). In Next App Router add "use client"; in Astro give it a client:load/client:visible directive. Serve the image same-origin (e.g. from /public) to avoid CORS entirely.

Boundary — when NOT to use this

  • Converting an image file to ASCII on the command line / in Python → use image-to-ascii.
  • A real-time, generative textmode sketch on a WebGL character grid (webcam, shaders, VJ visuals) → use textmode-js.

Attribution

Technique: Alex Harri, "ASCII characters are not pixels". Library: MIT-licensed ascii-img-react.

What ships with it: 4 files

13.9 KB alongside SKILL.md

evals/

references/

Keep looking

Skills are one crate of 325,949. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.