Extends the ASCII Art Generator with animation capabilities:
- 5 image effects (color cycle, wave, typewriter, pulse, glitch)
- Pattern animation via time-stepping phase parameters
- Browser playback with play/pause and frame counter
- Animated GIF export via server-side Pillow rendering (no new deps)
- New /api/animate and /api/animate-pattern endpoints
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Auto-generate: selecting a file immediately renders it (no separate
Generate click needed)
- Auto-fit zoom now scales UP to fill the preview area, not just down
to fit width. Uses min(scaleW, scaleH) to fit the limiting dimension.
- Fix re-upload: reset fileInput.value on click so selecting the same
file again triggers the change event
- Patterns also auto-fit to fill the preview
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Emoji, hieroglyphs, dominos, mahjong, playing cards, cuneiform,
alchemical, flora, and weather palettes use double-width characters
that display at 2x normal monospace width in browsers.
Fix: detect wide palettes and halve the render width with adjusted
aspect ratio (1.0 instead of 0.55) so the output maintains correct
image proportions regardless of character width.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Width slider now goes to 1500 (was 500), default 300
- Resolution presets: Low (100), Med (300), High (600), Ultra (1000), Max (1500)
- Optimized renderer: fast pixel access via img.load(), run-length color
grouping in HTML output (groups consecutive same-color chars into one span)
- 800-wide render in 0.5s, 1500-wide in 3.3s
- Base font reduced to 5px for ultra-dense display
- Container bumped to 4 CPU / 1GB RAM for heavy renders
- Uvicorn keep-alive timeout increased to 120s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Apply EXIF transpose so phone photos render right-side-up
- Adjust char aspect ratio from 0.45 to 0.55 to match browser
rendering (8px font, 1.05 line-height, monospace ~0.6 w/h)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Root cause: Cloudflare CDN was caching old static assets, so the
browser never received the updated JS with mode tab click handlers.
Fix: Add cache-busting query strings (?v=<timestamp>) to static
asset URLs, generated at container startup time. Every deploy
gets a new timestamp, forcing CDN to fetch fresh files.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add explicit IDs to mode tab buttons (modeImage, modePattern)
- Bind click handlers directly by ID instead of querySelectorAll
- Add type="button" to prevent form submit behavior
- Change controls flex-wrap to wrap (was nowrap, hiding tabs on narrow screens)
- Add user-select: none and z-index to tab buttons
- Dedicated switchMode() function for cleaner state management
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Mode tabs now 14px bold with gradient active state and glow
- Generate/Random buttons bigger with box-shadow
- Better hover states with background highlight
- Tabs have visible border container for clarity
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Image to colorful Unicode art with 20 palettes (wingdings, braille, hires, dots, kanji, etc.)
- GIF animation support (frame-by-frame rendering)
- Floyd-Steinberg dithering for fine detail
- FastAPI web app with drag-drop upload, zoom controls, fullscreen, original image comparison
- Width up to 500 characters for high-resolution output
- Docker deployment with Traefik routing at ascii.jeffemmett.com
- rSpace integration as rcreate app (#30)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>