mesh-avatar-studio
Turn one illustration into an animated 2D mesh avatar with a coding agent and a local editor
Slice, displace by noise + diagonal depth, RGB-split and layer any image in the browser. Tune every parameter and export a PNG.
DesignJavaScript · HTMLGitHub @thumpersecureOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
🪩📀 working glitch engine for 3d
Translation pending
Loading the full README.
Read the full README ↗A browser-based scanline-displacement + RGB-offset glitch tool with a 3D reveal mode. Upload a photo and pick an intensity level 1–5. The exported image looks glitched as a flat picture, and a depth-parallax viewer at one tilt angle shifts every strip back so the original reappears. Also exports a depth map and a GIF sized for micro.blog. Everything runs client-side — nothing is uploaded anywhere.
▶ Live tool: https://thumpersecure.github.io/scanline-glitch/
Facebook / iOS "3D photos" fake parallax: they shift pixels sideways by their depth value as you tilt. Reveal mode runs that in reverse:
The page has a Tilt preview slider that simulates this: 0 = the flat image you would
post, 1.00 = the reveal. In the simulator the reconstruction is exact (mean difference
0.000) when RGB offset is 0. The R/B colour fringe is not depth-driven, so with RGB offset
on, a fringe stays at every angle by design.
<name>.png and
<name>_depth.png into the composer. On iPhone the Facebook app reads depth embedded
in the photo; a 2019 walkthrough used the DepthCam app to embed it. Neither is
confirmed for 2026. iOS Photos' own "Spatial Scene" estimates depth itself, so a
supplied map does not apply there.strip px tall).amp plus a centred depth ramp (diag).Displacement uses row copies; any shift size leaves no gaps in classic mode.
Pure intensity levels, scaled to image width (tuned at 1080 px). All use normal blending.
| Level | Strip | Displacement | RGB offset | Layers | Opacity |
|---|---|---|---|---|---|
| 1 | 24 | 0.8 % of width | 2 px | 1 | 1.0 |
| 2 | 20 | 1.2 % | 3 px | 2 | 0.5 |
| 3 | 16 | 1.5 % | 4 px | 2 | 0.5 |
| 4 | 12 | 2.5 % | 6 px | 3 | 0.6 |
| 5 | 8 | 4.0 % | 10 px | 4 | 0.8 |
(Layers/opacity apply to classic mode; reveal mode always renders one layer.) Touching a slider switches to custom. Level 5 shifts up to ~5 % of the width, which is probably more than a real 3D photo tilts, so the reveal may only be partial at high levels — calibrate with one upload.
| Button | Output |
|---|---|
| Download PNG | reveal_L<level>_seed<n>_<timestamp>.png (glitch_… in classic mode) |
| Download depth map | <same name>_depth.png, same size, grayscale. In reveal mode each gray band is one strip's shift |
| Export GIF | reveal mode: a looping tilt sweep that shows the reveal; classic mode: seamless noise loop |
Uploads are scaled to a 1080 px working width.
| Preset | Width | Frames | Colors | Measured size |
|---|---|---|---|---|
| micro.blog | 640 px | 20 @ ~14 fps | 256, dithered | ~1.4–2.5 MB on test photos |
| Small | 400 px | 20 | 64 | ~0.4 MB |
micro.blog's real upload/size limits are unconfirmed — conservative guesses (edit
PRESETS in gif.js). The UI warns above 3 MB.
| Control | Effect |
|---|---|
| Reveal mode / Tilt preview / Flip polarity | 3D reveal and its simulator |
| Level 1–5 | preset intensity |
| Strip height / Displacement / Noise scale / Diagonal depth | the slicing |
| RGB offset / spread | channel split (set RGB to 0 for a clean reveal) |
| Layers / scale / opacity / blend | classic mode only |
| Seed | deterministic: same seed + settings = same image |
| Animate | reveal mode: sweeps the tilt; classic mode: evolves the noise |
No build step, no CDN at runtime.
| File | Role |
|---|---|
engine.js | pure seeded renderer, buildReveal, simulateTilt (browser + node) |
gif.js | GIF export; encoder vendored at vendor/gifenc.esm.js (gifenc 1.0.3) |
app.js | UI wiring, single requestAnimationFrame scheduler, downloads |
index.html, style.css | markup and responsive styles |
python3 -m http.server 8000
# open http://localhost:8000
MIT — see LICENSE.