skills/pixel-art-scaler/SKILL.md
Deterministic pixel art upscaling using EPX/Scale2x, hq2x/hq4x, and xBR algorithms that add valid sub-pixels through pattern recognition. Activate on 'pixel art scaling', 'EPX', 'Scale2x', 'hq2x', 'hq4x', 'xBR', 'retro game upscaling'. NOT for AI/ML upscaling, photo enlargement, or simple nearest-neighbor.
npx skillsauth add curiositech/windags-skills pixel-art-scalerInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Deterministic algorithms for upscaling pixel art that preserve aesthetics by adding valid sub-pixels through edge detection and pattern matching.
✅ Use for:
❌ NOT for:
Best for: Quick iteration, 2x/3x scaling, transparent sprites
How it works:
When to use:
Timeline: Invented by Eric Johnston at LucasArts (~1992), rediscovered by Andrea Mazzoleni (2001)
Best for: Final renders, complex sprites, smooth gradients
How it works:
When to use:
Timeline: Developed by Maxim Stepin for emulators (2003)
Best for: Hero assets, promotional materials, detailed sprites
How it works:
When to use:
Timeline: xBR by Hyllian (2011), Super-xBR (2015)
Novice thinking: "Just use nearest-neighbor 4x, it preserves pixels"
Reality: Nearest-neighbor creates blocky repetition without adding detail. Each pixel becomes NxN identical blocks, which looks crude on high-DPI displays.
What deterministic algorithms do: Add valid sub-pixels through pattern recognition - a diagonal edge gets anti-aliased pixels, straight edges stay crisp.
Timeline:
When nearest-neighbor IS correct: Viewing pixel art at exact integer multiples in pixel-perfect contexts (e.g., 1:1 reference images).
Novice thinking: "Real-ESRGAN / Waifu2x will give better results"
Reality: AI models trained on photos/anime add inappropriate detail to pixel art. They invent textures and smooth edges that shouldn't exist, destroying the intentional pixel-level decisions.
LLM mistake: Training data includes "upscaling = use AI models" advice from photo editing contexts.
Correct approach: | Source Type | Algorithm | |-------------|-----------| | Pixel art (sprites, icons) | EPX/hq2x/xBR (this skill) | | Pixel art photos (screenshots) | Hybrid: xBR first, then light AI | | Photos/realistic art | AI super-resolution | | Mixed content | Test both, compare results |
Novice thinking: "Always use the highest quality algorithm"
Reality: Different algorithms serve different purposes:
| Context | Algorithm | Why | |---------|-----------|-----| | Iteration/prototyping | EPX | 10x faster, good enough | | Production assets (web) | hq2x | Balance of quality/size | | Hero images (marketing) | xBR | Maximum quality | | Transparent sprites | EPX | Best transparency handling | | Complex gradients | hq4x | Best gradient interpolation |
Validation: Always compare outputs visually - sometimes EPX 2x looks better than hq4x!
# Install dependencies
cd ~/.claude/skills/pixel-art-scaler/scripts
pip install Pillow numpy
# Scale a single icon with EPX 2x (fastest)
python3 scale_epx.py input.png output.png --scale 2
# Scale with hq2x (high quality)
python3 scale_hqx.py input.png output.png --scale 2
# Scale with xBR (maximum quality)
python3 scale_xbr.py input.png output.png --scale 2
# Batch process directory
python3 batch_scale.py input_dir/ output_dir/ --algorithm epx --scale 2
# Compare all algorithms side-by-side
python3 compare_algorithms.py input.png output_comparison.html
Decision tree:
Need to scale pixel art?
├── Transparency important? → EPX
├── Fast iteration needed? → EPX
├── Complex gradients/dithering? → hq2x or hq4x
├── Maximum quality for hero asset? → xBR
└── Not sure? → Run compare_algorithms.py
compare_algorithms.py for side-by-sideAll scripts in scripts/ directory:
| Script | Purpose | Speed | Quality |
|--------|---------|-------|---------|
| scale_epx.py | EPX/Scale2x implementation | Fast | Good |
| scale_hqx.py | hq2x/hq3x/hq4x implementation | Medium | Great |
| scale_xbr.py | xBR/Super-xBR implementation | Slow | Best |
| batch_scale.py | Process directories | Varies | Varies |
| compare_algorithms.py | Generate comparison HTML | N/A | N/A |
Each script includes:
--helpEPX: Works in RGB, binary edge detection hq2x/hq4x: Uses YUV color space with thresholds (Y=48, Cb=7, Cr=6) xBR: Advanced edge weighting in RGB with luminance consideration
All algorithms preserve alpha channel:
| Algorithm | Time (1 image) | Batch (100 images) | |-----------|----------------|---------------------| | EPX 2x | 0.01s | 1s | | EPX 3x | 0.02s | 2s | | hq2x | 0.10s | 10s | | hq4x | 0.30s | 30s | | xBR 2x | 0.15s | 15s | | xBR 4x | 0.50s | 50s |
Rule of thumb: EPX is ~10x faster than hq2x, ~20x faster than xBR
After scaling, verify results:
# Check output dimensions
identify output.png # Should be exactly 2x, 3x, or 4x input
# Visual inspection
open output.png # Look for artifacts, incorrect edges
# Compare algorithms
python3 compare_algorithms.py input.png comparison.html
open comparison.html # Side-by-side comparison
Common issues:
/references/algorithm-comparison.md - Visual examples and trade-offs/references/epx-algorithm.md - EPX/Scale2x implementation details/references/hqx-patterns.md - hq2x pattern matching table explanation/references/xbr-edge-detection.md - xBR edge weighting formulas/assets/test-sprites/ - Sample sprites for testing algorithms/assets/expected-outputs/ - Reference outputs for validationtools
Building resilient distributed systems with circuit breakers, retries with full-jitter exponential backoff, retry budgets (per-request 3-attempt + per-client 10% ratio per Google SRE), deadline propagation, and the cascading-failure math (4 layers × 3 retries = 64x amplification). Grounded in Resilience4j, Microsoft Cloud Patterns, AWS Architecture Blog (Marc Brooker), and Google SRE Book.
testing
Designing HTTP cache headers that work correctly across browsers, CDNs, and shared proxies — `Cache-Control` directives per RFC 9111, `stale-while-revalidate` and `stale-if-error` per RFC 5861, the Vary header for varying responses, and surrogate keys for tag-based purging. Grounded in IETF RFCs and Cloudflare/Fastly docs.
development
Use when designing or fixing a Content Security Policy on a real site, choosing between nonce-based and hash-based CSP, adding strict-dynamic, debugging "Refused to execute inline script" errors, deploying CSP in report-only mode first, configuring report-to / report-uri, or auditing an existing policy for unsafe-inline / unsafe-eval / wildcards. Triggers: "CSP blocks legitimate inline script", strict-dynamic, nonce-{RANDOM}, sha256-{HASH}, object-src none, base-uri none, frame-ancestors, Trusted Types, X-Content-Security-Policy obsolete, report-only vs enforced. NOT for general HTTP security headers (HSTS, COOP/COEP), Trusted Types deep dive, CORS configuration, or building a WAF.
tools
Choosing and operating an HTTP API versioning strategy that doesn't break clients — Stripe's date-based pinned versions, the Deprecation/Sunset header pair (RFC 9745 + RFC 8594), URI vs header vs media-type approaches, and the version-transformer pattern. Grounded in Stripe's published architecture and IETF RFCs.