mesh-avatar-studio
Turn one illustration into an animated 2D mesh avatar with a coding agent and a local editor
Free, fast, privacy-friendly image tools that run entirely in your browser. Compress, resize, convert, and crop images, generate favicons, and encode images to Base64 — no uploads, no sign-up.
DesignTypeScript · JavaScriptGitHub @jakehellsingOnlineOwner 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
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Free, privacy-friendly image utilities built with Next.js (App Router), TypeScript, and Tailwind CSS. All processing runs locally in the browser with the Canvas API — no images are ever uploaded to a server.
| Tool | URL |
|---|---|
| Image Compressor | /tools/image-compressor |
| Image Resizer | /tools/image-resizer |
| Image Converter | /tools/image-converter |
| Image Cropper | /tools/image-cropper |
| Favicon Generator | /tools/favicon-generator |
| Image to Base64 | /tools/image-to-base64 |
npm install
cp env.example .env.local # then edit values
npm run dev # http://localhost:3000
Note:
.npmrcpoints atregistry.npmmirror.combecauseregistry.npmjs.orgwas unreachable/extremely slow from this network. Delete that file to use the default registry.
| Command | Purpose |
|---|---|
npm run dev | Start the dev server |
npm run build | Production build |
npm start | Serve the production build |
npm run lint | ESLint |
npm run typecheck | tsc --noEmit |
npm test | Unit tests (Vitest) for the image-processing library |
npm run test:e2e | Playwright end-to-end tests (desktop/tablet/mobile) |
E2E tests need browsers once: npx playwright install chromium, and a
production build first (npm run build).
See env.example. In production (e.g. Vercel project settings →
Environment Variables):
| Variable | Required | Purpose |
|---|---|---|
NEXT_PUBLIC_SITE_URL | Yes | Canonical origin for metadata, sitemap, robots |
NEXT_PUBLIC_CONTACT_EMAIL | Yes | Shown on contact page / privacy policy |
NEXT_PUBLIC_ADSENSE_CLIENT | After approval | ca-pub-* publisher ID — gates ALL ad code |
NEXT_PUBLIC_ADSENSE_SLOT_* | After approval | Ad unit slot IDs per placement |
No ad code is emitted unless NEXT_PUBLIC_ADSENSE_CLIENT is a real
ca-pub- ID, so the site ships "ads off" by default.
NEXT_PUBLIC_ADSENSE_CLIENT to your ca-pub-* ID and redeploy —
this activates the loader script and generates /ads.txt with the
matching publisher ID automatically.NEXT_PUBLIC_ADSENSE_SLOT_* env
vars; redeploy. (Or enable "Auto ads" in the AdSense dashboard and skip
slot IDs entirely.)NEXT_PUBLIC_SITE_URL to the production domain and
NEXT_PUBLIC_CONTACT_EMAIL.https://<domain>/sitemap.xml and /robots.txt, then
submit the domain in Google Search Console.Any static-friendly Next.js host works the same way: npm run build,
then serve with npm start behind your usual proxy/process manager.
.next directory (or the
previous git tag) and restart npm start from it.git revert the offending commits and redeploy — the site is
fully static apart from /ads.txt, so there is no database or state to
roll back.<title> and meta description per pageNEXT_PUBLIC_SITE_URLsitemap.xml with all indexable routesrobots.txt pointing at the sitemapWebSite, WebApplication, FAQPage schemas)/icon.svg) and web manifestNEXT_PUBLIC_SITE_URL to the final production domainsrc/
app/ # routes: /, /tools/[slug], legal pages, sitemap,
# robots, manifest, icon, opengraph-image, ads.txt
components/ # header, footer, cards, ad slot, shared tool page
components/tools/ # per-tool client components + shared UI
# (dropzone, previews, result card, form controls)
lib/image/ # image pipeline: magic-byte sniffing, decode,
# resize/crop math, canvas encode, ICO & ZIP writers
lib/tools.ts # tool registry: slugs, copy, FAQs, related links
e2e/ # Playwright specs + a tiny PNG fixture encoder
createImageBitmap — corrupted files and fake
extensions are rejected before any processing.drawImage for resize/crop, toBlob for
encoding. PNG/WebP outputs keep alpha; JPEG flattens transparency onto
a background color with a warning shown first.src/lib/image/.ca-pub-* ID is configured.@imgly/background-removal, ~40MB one-time download, handles complex
backgrounds) or a dependency-free edge flood-fill for solid backgrounds.