Custom Minecraft frames for ingame picture displays, supports gif and WEBP
  • Java 97.1%
  • GLSL 1.6%
  • Nix 1.3%
Find a file
2026-04-28 18:08:04 -04:00
.sworm chore: add .sworm task definitions 2026-04-28 04:53:57 -04:00
src/main Rename mod to Picture Frames 2026-04-28 18:08:04 -04:00
.gitignore init: initial environment 2026-04-22 12:28:53 -04:00
build.gradle feat: frame border variants + config screen rework 2026-04-28 04:55:09 -04:00
flake.lock init: initial environment 2026-04-22 12:28:53 -04:00
flake.nix Rename mod to Picture Frames 2026-04-28 18:08:04 -04:00
gradle.properties Rename mod to Picture Frames 2026-04-28 18:08:04 -04:00
LICENSE-THIRDPARTY.txt Rename mod to Picture Frames 2026-04-28 18:08:04 -04:00
README.md Rename mod to Picture Frames 2026-04-28 18:08:04 -04:00
settings.gradle Rename mod to Picture Frames 2026-04-28 18:08:04 -04:00

Picture Frames

Display internet images on in-world picture frames for NeoForge 1.21.1.

Supports PNG, JPEG, GIF, and WebP (including animated WebP) from any URL. Works on servers so other players see what you see. GPU shader effects (dithering, palette reduction) give images a Minecrafty look.

Features

  • Place a frame, right-click as owner to paste a URL.
  • GIF animation plays at the source's native frame delays.
  • Animated WebP supported via bundled dwebp (see below).
  • Dither modes: off, 2x2, 4x4 Bayer.
  • Palette reduction: 16, 32, 64 levels per channel.
  • Owner-only edits; anyone can break + pick the item back up.
  • Server-side permission gates: ops-only place, survival-only, domain whitelist/denylist, size and download caps.
  • SSRF-hardened HTTP client: no localhost, no RFC1918, http/https only.

Dependencies

  • KwahsCore (embedded via JarJar; no manual install).

Build

nix run              # build jar into dist/

Or via gradle directly:

nix develop --command gradle jar

Produces build/libs/pictureframes-*.jar (and dist/ if using nix run).

Develop

nix develop --command bash -c 'gradle createLaunchScripts && bash build/moddev/runClient.sh'

VS Code tasks are provided under .vscode/tasks.json (Run Client, Run Server, Build JAR, Compile).

WebP native binaries

WebP decoding invokes dwebp (Google libwebp) as a subprocess. Before a distribution release, drop per-platform dwebp binaries into:

src/main/resources/dwebp/
  dwebp-linux-x64
  dwebp-linux-arm64
  dwebp-mac-x64
  dwebp-mac-arm64
  dwebp-win-x64.exe

They're extracted to <gameDir>/pictureframes-native/ on first WebP decode and marked executable. A dev fallback searches PATH (the nix develop shell exposes libwebp so WebP works out of the box).

If no binary is available, WebP URLs fail with an informative error and the other formats (PNG/JPEG/GIF) still work.

Specification

See specifications.md for the full design doc, including the phased implementation plan, file layout, security model, and verification steps.

License

GPL-3.0-or-later. Bundled third-party components are listed in LICENSE-THIRDPARTY.txt.