Free Chevereto Alternative — Self-Hosted Image Hosting PHP Script (PixelZip)
PixelZip: Chevereto-class image hosting on your own server — drag & drop, chunked + ShareX uploads, password albums, moderation queue, watermarks, IP bans, flood protection, S3. Everything Chevereto charges for, free and MIT.
What it is
Why we built it: Chevereto is the de-facto standard for self-hosted image hosting — and while a free edition is available on GitHub, the features self-hosters actually need (upload moderation, watermarks, IP banning, spam protection, social features) are reserved for paid tiers. PixelZip's brief was simple: build the whole thing, give it away.
Uploading, the way it should work. Drop files anywhere on the upload page, paste straight from the clipboard, browse, or fetch from a URL. Files bigger than the server's upload_max_filesize still work — the uploader slices them into 2 MB chunks and the server reassembles them. Guests can upload without an account (with their own size limit and an optional auto-delete policy), duplicates are caught by content hash, and every upload can self-destruct after 5 minutes to 1 month. JPG, PNG, GIF (animations preserved untouched), WebP, AVIF and BMP are supported, with three sizes generated per image: square thumbnail, medium, and the untouched original.
Protection that's usually paywalled: a real moderation queue (hold everything, or guests only), adaptive PNG watermarking with per-group rules, per-IP flood limits for uploads, albums, signups and logins, IP bans with expiry and a custom message, a stop-word filter covering titles, filenames, usernames and bios, optional Cloudflare Turnstile on signup, NSFW flagging with viewer-side blur, EXIF stripping by default, and content-vs-extension verification so a PHP file in a .jpg coat never gets through. Uploads land in a directory where script execution is disabled — defense in depth.
For power users: every member gets an API key — upload with one curl line, or download the ready-made ShareX config (.sxcu) from account settings and screenshot-to-URL in one keypress. Embed codes (direct link, HTML, Markdown, BBCode) sit one click away on every image. Storage is pluggable: local disk out of the box, plus any S3-compatible bucket (AWS, Wasabi, Backblaze B2, DigitalOcean Spaces, MinIO) added from the admin panel with a built-in connection test — native Signature V4 over cURL, no SDK, no Composer.
And an admin panel that covers everything: dashboard with live stats and runtime checks, a content manager searchable by title or ip:, user roles, categories, custom HTML pages, 8 banner/ad slots, theme controls (dark/light, accent color, custom CSS/JS, analytics), SMTP settings with a test-mail button. Every product setting is editable in the panel — you never touch a config file after install.
PixelZip vs Chevereto
Chevereto feature placement per its official edition comparison (v4 docs), GitHub free edition and pricing page, October 2026.
| Feature | PixelZip | Chevereto |
|---|---|---|
| Price | Free forever (MIT) | Free (GitHub) · Lite $10/mo · Pro $99/yr |
| License key / phone-home | None | License key, update checks |
| Free edition | This is the only edition | Free version available (GitHub) |
| Upload moderation queue | Included | Lite ($10/mo) |
| Watermarking | Included (adaptive, per-group) | Lite ($10/mo) |
| Likes & follows | Included | Lite ($10/mo) |
| IP bans | Included (expiry + custom message) | Pro ($99/yr) |
| Flood protection | Included (per-action limits) | Pro ($99/yr) |
| Stop words | Included | Pro ($99/yr) |
| Banner / ad manager | Included (8 slots) | Pro ($99/yr) |
| S3-compatible storage | Included (native SigV4, no SDK) | All editions |
| Chunked uploads | Included (2 MB parts) | Included |
| ShareX + API | Included (.sxcu one click) | Included |
| Password-protected albums | Included (+ sub-albums) | Included |
| OAuth login providers | Not in 1.0 | Pro ($99/yr) |
| Video uploads | Not in 1.0 (images only) | Included |
| Multi-language UI | English only in 1.0 | 30+ languages |
Server requirements & dependencies
- PHP 8.1 or newer (pdo_mysql, gd, curl)
- MySQL 5.7+ / MariaDB 10.3+
- GD with WebP support (AVIF optional — auto-detected)
- Any web server: Apache (bundled .htaccess), nginx, LiteSpeed, or plain shared hosting
- No Composer, no SDKs, no external services
How to install
2. Open install.php in your browser, fill in the database + admin form, click Install. The installer checks your PHP extensions first and locks itself once an admin exists.
3. Delete install.php.
4. Add the housekeeping cron (expired uploads, cleanup): */15 * * * * php /path/to/pixelzip/cron.php — or call cron.php?key=YOUR_KEY from your host's cron panel.
5. Everything else — uploads, watermark, moderation, storage, SMTP, theme — is configured from the admin panel.
The prompt — build it yourself
Paste this into Claude and you'll get this product. This is the actual spec that produced the code above.
Architecture: plain PHP 8.1, one mini-framework file (bootstrap: settings cache, auth, CSRF, encoded IDs, flood/ban/stop-word guards), a GD pipeline class, a storage abstraction with native S3 SigV4 over cURL (no SDK), and a single JSON API that serves both the browser uploader (session + CSRF header) and ShareX/scripts (X-API-Key). Image IDs are XOR-masked per install before base-58 encoding, so public URLs are short and non-enumerable.
The design: a "darkroom" theme — near-black charcoal, one signal-orange accent, Bricolage Grotesque display type, JetBrains Mono for numbers, a dashed film-strip marquee of fresh uploads on the homepage, and a masonry grid with hover metadata. No purple gradients, no glassmorphism cards, no emoji headers.
Adversarial pass (fix → proof):
- A PHP payload wearing a .jpg name is rejected by getimagesize; a crafted GIF89a+PHP polyglot passes the header sniff but dies in GD decode; and because *animated* GIFs are copied verbatim (GD would flatten them), the uploads directory ships with script execution disabled — tested all three.
- Chevereto's duplicate rule (same file + same IP, 24h) blocked two different members behind the same NAT in testing. PixelZip's rule became: per-account for members, per-IP only for guests.
- Chunked uploads enforce the size limit on every chunk, so the limit can't be bypassed by slicing a big file — verified with a 21 MB file against a 20 MB cap (rejected at the chunk where it crossed).
- URL fetch resolves the hostname first and refuses private/reserved ranges (SSRF), verified against the server's own loopback config file.
- Flood limits verified live (limit 2/min → third upload rejected), IP ban returns the custom message on every route, the moderation queue keeps pending images visible only to their uploader, and a session-only guest can delete their own upload but nobody else's.
Result: 33 files, 4,125 lines, tested end-to-end on a live rig — install → upload (single, chunked, URL, paste) → variants → albums with password gates → likes/follows/notifications → moderation cycle → cron expiry sweep → watermark pixels verified in the output JPEG.
Design revision (v1.0, same day): the first theme leaned on the usual AI-landing crutches — orange accent everywhere, radial glow,
// mono kicker, bold grotesque headline. It was rebuilt as a "quiet gallery": monochrome UI where the photos are the only color, Newsreader editorial serif with an italic turn in the headline, white primary buttons, hairline dividers. Two bugs surfaced on the way: square-cropped thumbnails inside original-ratio masonry boxes left dead space under every card (thumbnails now keep their aspect ratio), and Cloudflare kept serving the old stylesheet because assets were versioned with a static constant — cache-busting now uses filemtime. The demo gallery was reseeded with real photography (Unsplash via Picsum, 18 photos), and the demo bar gained a one-click "Browse the admin panel" entry. Reviews
Used Free Chevereto Alternative — Self-Hosted Image Hosting PHP Script (PixelZip)? A star rating takes two seconds and helps others.
More builds
License: MIT — free for personal and commercial use, no warranty. Software is provided as is; review the code before running it in production (it's short enough to actually read).