Transform images into pixel art β in your browser.
Every pixel tells a story.
Mosaic Studio is a browser-based pixel art converter with real-time preview, multiple pixel shapes, color palettes, and GIF animation support. Everything runs client-side β no uploads, no server, no tracking.
- 5 Pixel Shapes β Square, Circle, Diamond, Cross-stitch, ASCII art
- 3 Color Modes β Grayscale, Color (quantized RGB), Palette
- 4 Built-in Palettes β Game Boy, NES, Cyberpunk, Retro Brown
- GIF Support β Parse animated GIFs frame-by-frame, export as pixel-art GIF
- Comparison Slider β Drag to compare original vs pixelated (Squoosh-style)
- Copy to Clipboard β One-click copy for PNG images
- Design Token System β 3-layer architecture (Global β Semantic β Component)
- Brand Color β Cool gray palette with blue accent (#60A5FA)
- Professional Typography β Inter + JetBrains Mono (numeric display)
- Micro-interactions β Hover lift, pulse animations, toast feedback
- Accessibility β ARIA roles/labels, keyboard navigation,
prefers-reduced-motion - Responsive β Mobile-optimized with 44px touch targets
- 100% Client-Side β All processing in your browser, privacy guaranteed
| Layer | Technology |
|---|---|
| Framework | React 19 |
| Language | TypeScript 5.9 |
| Build | Vite 7 |
| Rendering | Canvas API + OffscreenCanvas |
| GIF Decode | omggif |
| GIF Encode | modern-gif |
| Fonts | Inter, JetBrains Mono (Google Fonts) |
| Deploy | GitHub Pages |
- Node.js >= 18
git clone https://github.com/chen201724/mosaic-studio.git
cd mosaic-studio
npm install
npm run devnpm run build
npm run preview # preview production build locally- Image Upload β File is read into an
HTMLCanvasElementviadrawImage() - Pixel Sampling β For each pixel block, the center pixel's RGB is sampled
- Color Processing β Grayscale conversion, RGB quantization, or palette mapping
- Shape Rendering β Each block is rendered as the selected shape (square, circle, diamond, cross-stitch, or ASCII character)
- Comparison β Original and processed images are composited on a single canvas with a draggable divider
- GIF Processing β Each frame is decoded, processed via OffscreenCanvas, then re-encoded
src/
βββ main.tsx # Entry point
βββ App.tsx # Main application component
βββ index.css # Design tokens + styles
βββ utils/
βββ mosaic.ts # Core pixel engine (applyMosaic, processFrame)
βββ gif.ts # GIF parse/encode utilities
- 5 pixel shapes (square, circle, diamond, cross-stitch, ASCII)
- 3 color modes (grayscale, color, palette)
- 4 built-in palettes (Game Boy, NES, Cyberpunk, Retro)
- GIF animation preview with play/pause
- Comparison slider (Squoosh-style)
- Copy to clipboard
- Design token system
- Micro-interactions & toast feedback
- Accessibility (ARIA, keyboard, reduced motion)
- Responsive mobile layout
- Open Graph & SEO meta tags
- Custom color palette editor
- Batch processing
- PWA support
- Favicon & brand logo
- OG preview image
This project started as a simple pixel mosaic experiment in vanilla JS back in 2019. In 2025, it was rewritten from scratch as a full-featured React + TypeScript application with a professional design system.
Contributions are welcome! Please open an issue first to discuss what you'd like to change.