- 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>