尚未收集仓库信息。
尚未检测到更新。GitHub 发布版本后会显示在这里。
Self-hosted image, video & PDF hosting in one Go binary. Strips GPS on upload, albums, tickets, ShareX & REST API, installable PWA, and a photo studio that runs in your browser. SQLite + local disk or S3.
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗Sharing a photo
Editing a photo
Running it yourself
Good for you if you:
beach-sunset-x7Kp2Q./i/photo.jpg?w=800&format=webp makes and caches any size.tools/ai-server.py): background removal in about a second (rembg), automatic face blur (OpenCV), magic eraser (LaMa) and HD upscale 2× (Real-ESRGAN). One image at a time, daily limits, nothing stored./u/username shows only the images you pick. Can be switched off.HELINK_URL and HELINK_SSO_SECRET to let people use one account for both; leave them empty and PixelHop never contacts HEL.ink.
/hop/* (health, manifest, stats, user 360 and actions, profile and account events pushed by HEL.ink, content and report moderation, settings, search, metrics, audit trail). Calls are signed with the same HELINK_SSO_SECRET; HOP_ADMIN_CLIENTS (default imperium,helink) lists the app slugs allowed to call it. Every change made this way is kept in the hop_audit table.Bearer keys..sxcu file for ShareX.pixelhop push *.png --format markdown.Binary (Linux, macOS, Windows; amd64 and arm64 on the Releases page):
curl -L -o pixelhop https://github.com/navi-crwn/pixelhop/releases/latest/download/pixelhop-linux-amd64
chmod +x pixelhop
PIXELHOP_BASE_URL=https://img.example.com ./pixelhop
Docker:
docker run -d --name pixelhop -p 8080:8080 \
-e PIXELHOP_BASE_URL=https://img.example.com \
-v pixelhop:/data ghcr.io/navi-crwn/pixelhop:latest
From source (Go 1.27+):
git clone https://github.com/navi-crwn/pixelhop.git && cd pixelhop
make build && ./pixelhop
Open http://localhost:8080 and create an account. The first account becomes the admin. You can also make one from the command line: pixelhop user add [email protected] --admin.
Everything is in .env.example. The ones you're most likely to change:
| Variable | Default | What it does |
|---|---|---|
PIXELHOP_BASE_URL | http://localhost:8080 | Public address of the app (sign-in, upload, dashboard) |
PIXELHOP_LINK_URL | PIXELHOP_BASE_URL | Another host for shared links (image and album pages, direct files). Point it at the old address after a move, so old links keep working while the app lives at the new one. That host must also reach PixelHop |
PIXELHOP_DATA | ./data | Database and (local) images |
PIXELHOP_MAX_UPLOAD_MB | 20 | Per image |
PIXELHOP_MAX_MEDIA_MB | 100 | Per video or PDF, for signed-in members |
PIXELHOP_GUEST_MAX_MB | 20 | Per file of any kind, for guests |
PIXELHOP_GUEST_UPLOADS | true | Allow uploads without an account (also a switch in the control center) |
PIXELHOP_TRUSTED_PROXIES | — | cloudflare, or IPs/CIDRs of your reverse proxy |
PIXELHOP_STORAGE | local | local or s3 |
S3_ENDPOINT, S3_BUCKET, S3_ACCESS_KEY, S3_SECRET_KEY | — | For S3-compatible storage |
S3_PUBLIC_URL | — | CDN address of the bucket; image links redirect there |
GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET | — | "Sign in with Google" |
HELINK_URL, HELINK_SSO_SECRET | — | Sign in with a HEL.ink account (same secret as HEL.ink's PIXELHOP_SSO_SECRET) |
HELINK_API_ADDR | — | Optional host:port to reach HEL.ink directly (e.g. 127.0.0.1:443 on the same server) for password checks |
deploy/nginx.conf is a reverse-proxy example. Set PIXELHOP_TRUSTED_PROXIES=127.0.0.1 so PixelHop believes nginx's X-Forwarded-For; add cloudflare if Cloudflare is in front.deploy/pixelhop.service is a hardened systemd unit; deploy/pixelhop-ai.service runs the optional AI tools (pip install "rembg[cpu]" opencv-python-headless onnxruntime, plus the LaMa and Real-ESRGAN x2plus ONNX files).sqlite3 data/pixelhop.db ".backup copy.db" while it runs).ShareX: go to Settings → API keys, create a key, then press Download ShareX config with this key. Double-click the file.
Command line: the same pixelhop binary uploads to any PixelHop server.
pixelhop login --server https://pixel.hel.ink --key ph_yourkey
pixelhop push screenshot.png photos/*.jpg --expire 7d --format markdown
Phone: open the site, choose Add to Home Screen, and PixelHop appears in your share sheet.
curl -H "Authorization: Bearer ph_yourkey" -F "[email protected]" https://pixel.hel.ink/api/v1/upload
| Endpoint | What it does |
|---|---|
POST /api/v1/upload | Upload files (file, repeatable) or links (url); options expire, slug, album, title |
GET /api/v1/images | Your images (page, limit, q, sort) |
GET · PATCH · DELETE /api/v1/images/{id} | Read, rename ({"title": …}), show on your profile ({"listed": true}) or delete one |
PATCH /api/v1/images/{id} | Also alt and visibility (unlisted, private, password + password) |
GET /api/v1/images/{id}/stats | Views per day and referring sites |
GET · POST /api/v1/albums, GET · PATCH · DELETE /api/v1/albums/{id} | List, create, edit (title, description, cover, order, add, remove) and delete albums |
GET /api/v1/users/{username}/images | Public: someone's profile images |
GET /oembed?url=… | oEmbed for image pages |
GET /i/{id}.jpg?w=&h=&fit=&format=&q= | Resized copies, made once and cached |
GET /api/v1/me | Your account and storage use |
GET /api/v1/stats | Public totals |
POST /api/v1/tools/{remove-background,faces,erase,upscale} | Server AI tools (signed in; file, plus mask for erase) |
GET /tools/qr.png · /tools/qr.svg | QR code for text (size, level, fg, bg) |
Every answer looks like {"success": true, "data": …} or {"success": false, "error": "…"}. The full reference is at /docs on any PixelHop server.
PixelHop 2 was a PHP app with MySQL, a Python venv and cron jobs; its code lives on in the v2.3.0-php tag. One command brings everything over:
pixelhop import --images /var/www/pichost/data/images.json \
--mysql "user:pass@tcp(127.0.0.1:3306)/pixelhop" --copy
--copy they are downloaded into PixelHop 3's storage with fresh thumbnails; without it they are served from the old buckets./{id}, /i/2026/08/27/{id}_original.webp, /auth/google-callback (set GOOGLE_REDIRECT_URI), and ShareX configs posting to /api/upload.php.Why the rewrite? Read AUDIT.md.
cmd/pixelhop/ the command: serve, user, import
internal/app/ web server: pages, API, uploads, admin
internal/db/ SQLite schema, migrations and queries
internal/imaging/ type sniffing, metadata stripping, thumbnails
internal/storage/ local disk, S3 (own SigV4 signer), legacy URLs
internal/netsafe/ SSRF-safe fetching for "upload from link"
web/ templates and static files, embedded in the binary
docs/ the GitHub Pages website and README images
make test runs the tests; npm run readme-images re-renders the README pictures from the website.
Yes. Editing happens on your device with Canvas and WebAssembly. The first time you use OCR or background removal, the browser downloads the open-source models from jsDelivr. Your image is not sent anywhere unless you press Upload result.
Yes, both are switches in Admin → Settings.
PixelHop runs on a 512 MB VPS or a Raspberry Pi. It uses a few tens of MB of memory at rest. Big uploads are decoded a few at a time, so bursts can't exhaust memory.
PixelHop is part of the HOP family of privacy-respecting, self-hostable open-source apps.
| App | Address | Repository | What it does |
|---|---|---|---|
| HOP ID | hel.ink · accounts at hub.hel.ink | navi-crwn/HEL.ink | One account for every HOP app. |
| LinkHop | link.hel.ink · hel.ink/l/… | navi-crwn/LinkHop | Short links, QR codes and click analytics. |
| BioHop | bio.hel.ink · hel.ink/b/… | navi-crwn/BioHop | One link-in-bio page for everything you do. |
| PixelHop | pixel.hel.ink · p.hel.ink/… | navi-crwn/PixelHop | Image hosting with albums and direct links. |
| NoteHop | note.hel.ink · n.hel.ink/… | navi-crwn/NoteHop | Encrypted notes you share with a link. |
| Imperium | private (owner only) | private | The HOP control panel. |
More by the same author: Amnesia (a Mac that forgets at logout).
HOP_ADMIN_CLIENTSimperium,helink |
App slugs allowed to call the signed /hop/* admin API (HOP App Protocol) |
PIXELHOP_CONTROL_URL | — | Address of the HOP control center; admins who open /admin are sent there |
TURNSTILE_SITE_KEY, TURNSTILE_SECRET_KEY | — | Cloudflare Turnstile on sign-in and sign-up |
PIXELHOP_REMBG_URL | — | Address of tools/ai-server.py, e.g. http://127.0.0.1:7001, to turn on the server AI tools |
PIXELHOP_INACTIVE_DAYS | 0 | Delete images nobody viewed for N days |