GPU image wall (PixiJS) with open image search (no API keys).
After GitHub Actions deploys, the app is at:
https://fornevercollective.github.io/vwall/
Double-click Launch.command (Finder) or run:
./start.shOr with a specific port:
./start.sh 8787This uses a tuned Node static server with:
Cache-Control: no-storeon.html/.js/.css→ reliable Cmd/Ctrl+R refreshes- Built-in WebSocket live reload — edits to
.html/.js/.cssautomatically refresh the page - Clean per-request logging with timing
- Bounded concurrency (won't melt your machine when left running in background)
- Auto browser open when launched via
Launch.command
python3 -m http.server 8080But the Node server above is strongly preferred for development.
Search uses public APIs only (no keys): Wikimedia Commons + Openverse (images + audio) + NASA Images/Video/Audio Library (public domain) + site-scoped Internet Archive. All funnel through the same classify / mediaItem / ladder / session paths.
Openverse anon rate limits (daily/hourly) are parsed from headers and shown in status (e.g. OV:187d) for awareness — searches auto-abort prior in-flight on new queries for snappier iteration.
Header chips filter by type: image, gif, video, live (HLS/m3u8 + DASH), gsplat (.ply / .splat / .glb etc), audio (expanded exts: heic/avif/webp/svg/ts/weba/oga...).
Blur button now cycles OFF / Soft / Safe (NSFW) — strong uniform blur on the wall lets you search all content safely (artistic, body, etc from open sources) while still previewing details on tap. Toggle lets you "hit the ground running" with broad queries.
Sort → By media type groups results on the wall by type. Click a tile to preview (desktop: centered lightbox; mobile browse: bottom sheet; HLS via hls.js).
Up to 20,000 items via the count slider (lazy-loaded thumbnails). Very large counts are heavy on GPU/RAM.
Live FPS, memory, load queue, per-type counts, and buffer estimates (video / live / gif / audio) while tiles stream in.
VWall keeps loaded thumbnails, probes, and Pixi nodes in a session cache. Raising the count extends the wall (only fetches new URLs). Layout / reseed / sort reposition without refetching. Status shows reused vs new counts.
Desktop wall (Pixi): thumbnails load first (thumbUrl, or the main URL when no separate thumb exists). While you zoom and pan the mosaic, tiles that span enough screen pixels and have a distinct full-size URL can upgrade in place to the original image (still letterboxed inside the tile), then automatically unload that heavier texture again when zoomed back out — similar in spirit to a coarse “overview” atlas with on-demand sharper layers, minus true lightfield mip chains.
Load order: new sessions mount tiles roughly first-come / first-serve in display sequence (rather than reordering every batch by on-screen proximity). Incremental bumps append to the thumbnail pump when work is already in flight so URLs mid-buffer/decode aren’t flushed for no reason (“rolling shutter” / old-internet pacing at scale).
Resolution ladder (media-ladder.js): ingestion can attach variantUrls (array of { url, role?, maxEdge?, bytesHint?, id? }) plus optional thumbMaxEdge. Preview picks the cheapest tier (cheapestPreviewTier); LOD upgrade resolves the full tier. That is tooling for manifest-style “data lake” URLs (CDN size ladders, IIIF width tiers, tiled rasters later) until true mip pyramids or server tiling land.
Filter already probed items:
exif:canon·camera:nikon·codec:hevc·dims:1920x1080·encoder:lavf
Runs on ffprobe / EXIF tags indexed as items load. Future: waveform, vectorscope, watermark plugins (analyzers.js).
probe-pool.js runs 4-wide metadata clusters (reuses cache, skips duplicate ffprobe). analyzers.js registers waveform / vectorscope / watermark stubs for MuStream integration.
For full stream metadata (codec, HDR hints, bitrate, buffer size, encoder tags — same family as mustream-desktop meta):
mustream probe-serveKeeps http://127.0.0.1:18765/v1/probe?url=… open; VWall’s inspector merges that with in-browser probes. Override bind: MUSTREAM_PROBE_BIND=127.0.0.1:18765.
Pushes to main run .github/workflows/pages.yml.
In the repo Settings → Pages, set Build and deployment → Source to GitHub Actions (one-time).
| File | Description |
|---|---|
index.html |
Main 3D wall |
media-ladder.js |
Multi-URL ladder (variantUrls) for previews vs full-res |
visualwall.html |
Color-sorted grid |
focus.html |
Single-image focus view |
The vidwn/ folder is a local download helper (not deployed to Pages).