A tool that lets you unpixelate, unblur and enhance pictures for free
No AI needed
not yet reviewed by publik. It is live now; the founder has not reviewed this version yet.
Every step written out. No terminal experience needed. Pick your setup.
A browser-based image restoration studio — depixelate mosaic/censored images, remove Gaussian blur via real deconvolution, and sharpen detail. 100% client-side workflow, 100% honest about what physics allows.
![]()
You may have come here looking for a tool that restores pixelated or blurred images "with 100% accuracy". No such tool exists, and none ever will — not this one, not a commercial one, not a future AI one. Here is why, stated up front so you can calibrate your expectations:
If someone promises 100% recovery, they are selling you a guess and calling it ground truth.
| Mode | What happens under the hood | Best for |
|---|---|---|
| Auto | Detects pixelation block size + blur level, routes to the right pipeline | Unknown degradation |
| Depixelate | Grid-aware mosaic reconstruction: block detection → area downsample → Lanczos super-sampling → iterative back-projection → edge-aware bilateral | Censored/mosaic images, low-res upscale, pixel art |
| Unblur | Richardson-Lucy deconvolution on the luma plane with a separable Gaussian PSF | Gaussian/out-of-focus softness |
| Sharpen | Luma-only unsharp masking with halo control | Mildly soft photos, screenshots |
Every run returns:
X-Process-Report header): detected pixel block
size, Laplacian variance and total-variation before/after, per-step timingsNo account, no upload to third parties — the image is processed by the server you're running (or self-hosting) and immediately discarded.
PixelRevive is not a wrapper around someone's ML model. The restoration
engine is hand-rolled signal processing in pure TypeScript
(src/lib/algorithms.ts) orchestrated by
sharp for codec work and resizing.
A pixelated image is a low-resolution grid that was scaled up with nearest-neighbor. The detector scans horizontal and vertical boundary differences, clusters the intervals between equal-value boundaries, and finds the spacing that explains them harmonically (phase-free, so it works regardless of where the grid lands, and on non-integer ratios like 8.57 px). Horizontal and vertical estimates must agree within ±0.75 px before a mosaic is declared.
Once the block size b is known, the original pixel grid is recoverable
exactly:
pixelated image
→ area-downsample to the true grid (b×b cells → 1 px)
→ Lanczos3 super-sample to target size
→ iterative back-projection (2–3 passes: re-blur the estimate,
add the difference back — recovers high-frequency content)
→ soft bilateral filter (flattens grid residue, keeps real edges)
→ scale-aware unsharp (σ scaled by the upscale factor)
Gaussian blur is modeled as convolution with a known PSF. PixelRevive runs Richardson-Lucy — the classic maximum-likelihood deconvolution — on the luma plane only (chroma is smoothed, avoiding color fringe artifacts), with edge-aware handling to stop ringing at borders. Strength maps to iteration count; the pipeline gates it at 6 MP to stay responsive.
Auto mode measures Laplacian variance (blur) and the boundary-harmonic score (mosaic), then composes the right passes. Every step is timed and reported.
upload → analyze (block size, LV, TV) → [depixelate | deconvolve | sharpen]
→ enhance → encode (png/jpeg/webp) → response + X-Process-Report
The UI is a thin client over one endpoint — script it with curl:
curl -X POST http://localhost:3000/api/enhance \
-F "image=@photo.jpg" \
-F "mode=unblur" \
-F "strength=70" \
-F "upscale=2" \
-F "format=png" \
-o restored.png -D headers.txt
# headers.txt contains X-Process-Report: <URI-encoded JSON>
| Endpoint | Method | Parameters |
|---|---|---|
/api/enhance | POST | multipart form: image (file, ≤25 MB), mode = auto|depixelate|unblur|sharpen, strength (0–100, default 60), upscale (1/2/4), format = png|jpeg|webp |
/api/sample | GET | ?kind=pixelated|blurred — generates synthetic test images |
Errors: 400 unreadable/empty image, 413 over 25 MB, 500 processing
failure — all with a JSON { "error": "..." } body.
src/
├── lib/
│ ├── algorithms.ts # pure DSP kernels — no sharp/DOM, fully testable
│ ├── pipeline.ts # sharp orchestration, mode routing, MP gates, report
│ ├── types.ts # EnhanceMode / EnhanceParams / EnhanceReport
│ └── utils.ts # cn() and friends
├── app/
│ ├── page.tsx # studio UI (modes, sliders, zoom, metrics, report)
│ ├── layout.tsx # fonts, metadata, toaster
│ ├── globals.css # Tailwind v4 theme
│ └── api/
│ ├── enhance/route.ts # POST → runEnhance() → image + report header
│ └── sample/route.ts # synthetic degraded test images (SVG → sharp)
└── components/
├── comparison-slider.tsx # clip-path before/after wipe (pointer + a11y)
└── ui/ # shadcn/ui primitives (button, slider, select...)
Safety gates in the pipeline: inputs are capped at 3200 px on the long side, outputs at 24 MP; deconvolution and bilateral passes degrade gracefully above their MP thresholds instead of OOM-ing.
Any Node 20+ host works:
npm run build && npm start # plain Next.js server
Or Docker:
FROM node:22-slim
WORKDIR /app
COPY package.json ./
RUN npm install
COPY . .
RUN npm run build
EXPOSE 3000
CMD ["npm", "start"]
Being honest about the ceiling is part of the design:
Restoration tools can be misused to attempt de-censoring of private or sensitive imagery. PixelRevive cannot recover information that was destroyed, and you are responsible for complying with the law and other people's privacy when processing images that aren't yours.
PRs are welcome — see CONTRIBUTING.md for the project layout and the "keep the kernels pure" rules.
MIT © 2026 PixelRevive Contributors