christophthiel
back to work
02
discord.js·blender·python·youtube api·sharp

unwreq

the automation backbone of texturepack.be. forward a link, the pipeline does the rest.

for the texturepack.be ecosystem and the creators who feed it.

unwreq · pipeline
unwreq discord bot conversion pipeline in action
/ the problem
every pack on texturepack.be needs to be downloaded, ported from java to bedrock, get a thumbnail, a showcase video, and a database entry. porting alone takes 30+ minutes per pack because folder structures, casing, and subpack layouts are different every single time. doing that by hand at hundreds of packs just does not scale.
/ what i did
i automated the whole process. forward a link in discord and unwreq takes over: resolves the download url, extracts the archive, runs the 34-step conversion (structure validation, metadata parsing, resolution detection, texture remapping, 14 generators for beds, buttons, huds, armor, animations, sky overlays), and outputs a clean .mcpack. from there headless blender renders a 3d thumbnail, a second pass produces a flythrough video, ffmpeg encodes it, and a cron job handles the youtube upload with rate-limit retry. pack, thumbnail, and metadata land in postgres and the website picks them up on its own.
/ iii. technical deep-diveoptional · expand
/ architecture
three layers, one trigger. the discord bot (bun + discord.js) handles input: url resolution, file download, owner auth. the converter is a step-based pipeline where each of the 34 steps is its own module (validate → parse → scan → remap → generate → pack). analysis phases run in parallel with timeouts. the render layer is pure python: the thumbnail script builds a 3d hud mockup with extruded ui elements, the video script loads a flythrough scene and applies pack textures with a suffix-scan resolver that handles the inconsistent bedrock folder layouts. ffmpeg encodes frames to mp4 with a sidecar json for youtube metadata. a 15-minute cron checks the upload queue, respects the 5-video concurrency cap, and retries on rate limits.
/ infrastructure
infrastructure diagram
/ learnings & what i’d change
this project taught me how to think in pipelines. breaking a big process into small, composable steps that each do one thing made the whole system easier to debug and extend. the architecture side forced me to design for unreliable input since no two packs agree on folder structure, casing, or layout. and the automation layer (cron, retry queues, sidecar metadata) taught me to separate intent from execution. writing a json file is instant and never fails, the actual upload can retry on its own schedule without blocking anything upstream.