Skip to content

Mosaicary 0.1.4 - #1011

Open
MopicMP wants to merge 3 commits into
JannisX11:masterfrom
MopicMP:gltf-to-minecraft-0.1.3
Open

MopicMP wants to merge 3 commits into
JannisX11:masterfrom
MopicMP:gltf-to-minecraft-0.1.3

Conversation

@MopicMP

@MopicMP MopicMP commented Oct 1, 2026 •

Copy link
Copy Markdown
Contributor

Updates the plugin from 0.1.2, which is what the catalogue publishes today, to 0.1.4. Two releases are in it: 0.1.3, submitted but never merged, and 0.1.4.

The plugin is now called Mosaicary, after the catalogue of Blockbench models it opens; converting is no longer all it does. It was GeckoLib Model Importer, then glTF to Minecraft — renamed on your review, since it imports nothing from GeckoLib and GeckoLib is only one of its outputs. The id is gltf_to_minecraft throughout and does not change: the storage keys are built from it, and for an install by URL the file name is the id.

Source: https://github.com/MopicMP/mosaicary (MIT)

What it looks like

File → Browse Mosaicary Models, beside Open Model, opens the catalogue:

Browse Mosaicary Models in the File menu, beside Open Model

The Models window on the Mosaicary catalogue

A model's own window, before it is taken:

The window of one catalogue model: preview, facts, tags and comments

The Sketchfab side of the same window:

The Sketchfab tab: cards with author, licence, triangles, animations and likes

The import window, and the report it ends with:

The import window: what the model becomes, where it goes, size and place, animations, with a preview

The import report: format, cubes, texture, scale, bones, animations and rebuilt parts

The models shown belong to their authors, named on each card.

Files in this pull request

Four, all in plugins/gltf_to_minecraft/: the plugin, icon.png, about.md and changelog.json. The icon and the changelog have never been in the catalogue — the entry carried "icon": "view_in_ar" and "has_changelog" was absent — so both arrive here for the first time, and about.md replaces 0.1.2's text, which says nothing about the catalogue half. LICENSE.MD in that folder is not ours and is untouched.

In plugins.json only the gltf_to_minecraft entry changes. It now matches Plugin.register field for field, the icon among them.

Updated on 20 October with two fixes inside 0.1.4, without a new version. The site now also holds builds — Axiom blueprints, Litematica and Sponge schematics — which Blockbench cannot open, and the catalogue window had turned into a wall of them; every shelf leaves builds out now, and the camera's near plane follows the size of the model, so layers a hair apart no longer fight in stripes up close. And Upload Model to Mosaicary is no longer offered in the image editor (New > Image), where there is no model to upload: it checks Format.image_editor, as do the upload button in the catalogue window and draft sync.

What 0.1.4 adds: the catalogue

  • Browse Mosaicary Models, in File beside Open Model, opens Mosaicary and the Sketchfab search in one window. A model from Mosaicary was made in Blockbench, so it opens as the project its author saved — nothing is converted and nothing is rebuilt. It is handed to Blockbench's own loadModelFile, which is why the entry stands with the openers rather than under Import: the import entries add their result into an open project, and a catalogue under Import would promise the same and replace the project instead.
  • Four shelves: the catalogue, models you put a heart on, your own ones with drafts among them, and Recent — what you last opened in Blockbench, which needs no account and opens an entry the way the start screen does. On the web build, where Blockbench keeps no recents, it lists the open tabs.
  • Filters over format, what the model is for, what is inside it, how detailed it is, texture size, licence, tags, where the words you typed are looked for, when it was added, and whether models for adults are among them. Those wait behind a cover until asked for.
  • A window for a model before you take it: the model turning in a view, its animations with play and loop, its figures, description and comments. Author and licence are on every card and in that window, for Mosaicary and for Sketchfab alike. A Sketchfab model is drawn in that same view of ours, from the model's own geometry. That is why it waits for a press: turning the model means downloading it, so looking at one you then decide against is a download spent, and the hint under the button says as much before it is pressed. If the import follows, it takes that same download rather than fetching it twice. A model its author does not allow to be downloaded cannot be shown at all — that geometry is the download — and the note beside it says so.
  • Once a model has been taken the catalogue gets out of the way: it moves into a Blockbench panel and folds there instead of standing over the model it just delivered. A switch in its header turns that off, for taking several models in a row.
  • An account, for the shelves and the comments that need one: sign in through the browser with a code shown in Blockbench and confirmed on the site, or paste an API key by hand. Upload Model to Mosaicary puts the open project up, published or as a draft; the picture on its card is drawn in that same window from the model itself. Leave a Review, under Help, holds one review of the plugin and one of the catalogue. Nothing is sent without the button being pressed.
  • The Sketchfab search no longer hides models whose author does not allow downloading. Hiding them made the same search look a quarter the size of Sketchfab's own; they now take a part of each page, marked with a lock, and offer the model's page rather than an import that could only fail. A switch leaves them out again.
  • The import window and the import report are rebuilt: settings under headings on the left, the model turning in a view on the right, long explanations moved onto a question mark beside the setting they explain, and the report's figures in the same icon grid the catalogue cards use.
  • GeckoLib needs no second plugin. Where the GeckoLib plugin is absent this one registers the format itself, so a GeckoLib import opens an ordinary project, somebody else's GeckoLib .bbmodel opens instead of being turned away, and Export GeckoLib Geometry writes the .geo.json the mod reads. Where the GeckoLib plugin is installed nothing changes and none of this is shown.
  • The plugin has an icon: a render of a Blockbench model, drawn by the same arithmetic that draws the catalogue cards.

What 0.1.3 added: the converter

  • Parts that are not cubes — bevels, wedges, rounded shapes — are rebuilt from thin plates that follow their surface, each cut to its outline by a baked texture, instead of becoming one box. Fast and Best quality; Best also lays a strip along each sharp slanted edge.
  • A model can be opened as meshes instead, chosen at the top of the import window: the geometry stays the author's own for Blockbench's mesh tools, while bones, textures and animations come across the same way. Cubes stay the default, since cubes are what the game renders.
  • Choose what to build into: GeckoLib, Bedrock Entity, Generic Model or a still Java block/item model. Java models are fitted into the box the format allows, and the report says which Minecraft version their cube rotations need.
  • Add to the open project instead of a new one: a sword into the selected hand, a helmet onto a head, as one undoable edit.
  • Sketchfab search gained ordering, an Animated filter, triangle and animation counts on the cards, and a note on whether a model looks built from cubes — the blockbench tag alone does not tell. For models uploaded from Blockbench the author's original is downloaded, because Sketchfab's own conversion can lose a texture's transparency.
  • Fourteen languages. The developer console stays in English, so a log pasted into an issue reads the same whoever ran the import.
  • Fixes: a cube whose first face had no texture came out invisible (thanks Snownee, Missing cube MopicMP/mosaicary#1); hair-thin panels lost both sides and vanished; specular-glossiness textures were not read; inside-out outline shells covered the parts they outlined.
  • Hostile input limits: cyclic node graphs, oversized accessors, ZIP bombs and oversized images are rejected before allocation (thanks HadesScience, Bound untrusted model import resources MopicMP/mosaicary#2).

Honest limitations

Wedges, bevels and rounded shapes do not exist in Minecraft. By default such objects are rebuilt from plates, which keeps the silhouette at the price of cubes; the advanced settings offer their bounding box instead, or skipping them, or stopping the import. Whichever was used, the report states how many objects were approximated out of how many, and at 30% or more it says plainly that the model is a poor fit for cubes.

A texture that lost its alpha channel cannot be recovered; when the material asks for transparency and the texture has none, the report says so.

Notes for review

  • No external code is executed, and no external HTML is rendered. The plugin talks to the Sketchfab Data API and to the Mosaicary API — the author's own site — and both answer with data and model files, never script. Thumbnails are loaded as images. Where a page of either site is wanted, it opens in the browser, not inside Blockbench.
  • Nothing is sent anywhere unasked. Uploads and reviews send what was filled in, and only on the button; the account key is read from the plugin's own storage and is there only if somebody signed in from this plugin. Reviews are public on the site, which the window says before anything is typed.
  • No bundled dependencies; THREE, JSZip and the rest come from Blockbench. Not minified and not obfuscated: one readable file.
  • There is one eval in the file, and it will show up in a grep, so here is what it is: Environment diagnostics under Help asks whether a library is in scope by name — eval('JSZip') inside a try — because a Blockbench build may have no developer console and the plugin then has to serve as its own. The names are a fixed list written in the file, typeof is all that is taken from the result, and nothing that arrives from outside reaches it.
  • The converter core does not depend on Blockbench and is covered by Node tests in the source repository, including a smoke test that runs the full import path with Blockbench objects substituted.
  • node scripts/validate.js gltf_to_minecraft passes.

The catalogue publishes 0.1.2 of this plugin. Two releases are in this one
commit: 0.1.3, submitted but never merged, and 0.1.4, which adds a catalogue
of Blockbench models inside the editor -- which is where the new name comes
from, since converting is no longer all the plugin does.

The id stays gltf_to_minecraft: every storage key is built from it, and for an
install by URL the file name is the id, so the folder and the file keep their
names.

Four files in plugins/gltf_to_minecraft/: the plugin, about.md, and icon.png
and changelog.json, which the catalogue has never held -- the entry carried
"icon": "view_in_ar" and had no has_changelog, so the icon's address on the
CDN answered 404 and an empty square was what a reader saw.

In plugins.json only the gltf_to_minecraft entry is touched: ten lines changed
of 1753, and the file is left tab-indented with its CRLF endings and its tags
on one line, exactly as it was. node scripts/validate.js gltf_to_minecraft
passes.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@MopicMP
MopicMP force-pushed the gltf-to-minecraft-0.1.3 branch from 7feef8c to 3567cd5 Compare October 10, 2026 20:36
@MopicMP MopicMP changed the title glTF to Minecraft 0.1.3 Mosaicary 0.1.4 Oct 10, 2026
@MopicMP

MopicMP commented Oct 10, 2026

Copy link
Copy Markdown
Contributor Author

A question about size, which I would rather ask before the next release than after it.

The plugin file in this PR is 1,898,107 bytes — about 1.81 MiB, so still inside the 2 MB the README asks for. What worries me is the direction: 0.1.2 was 214 KB, 0.1.3 was 1.26 MB, and 0.1.4 is what you see here. Another release of that shape does not fit.

Where the bytes actually are, measured by walking the file by JavaScript state rather than by regex:

  • the I18N dictionary — 994,433 bytes, 51.6%: 14 languages of 910 keys, and the 13 translations alone are 45.2%
  • comments — 365,271 bytes, 19.0%
  • code — 552,254 bytes, 28.7%

Nothing is bundled that Blockbench already ships: THREE, JSZip and MolangJS all come from the editor. There is no base64 and no embedded image in the file, and the only repeated block of eight lines or more is a single 468-byte spot. So it is big because of translated text, not because of carelessness — every further language costs about 67 KB.

Two ways out of it, and I would rather ask than guess:

  1. It stays one plugin and is allowed past 2 MB when it gets there. I can see files above that line in the catalogue already, so I read the 2 MB as guidance rather than a gate — but I would rather have your word than my reading. If the limit is firm, the honest way under it is a compressed dictionary (brotli plus base64 saves about 710 KB), and that only stops being obfuscation if the readable source is published beside it, so it would come with sources in the repository rather than instead of them. Minifying the whole file saves about 424 KB on the same terms.

  2. It becomes a core plugin plus add-ons, with the add-ons declaring dependencies on the core — the way emf_animation_addon depends on cem_template_loader. The converter, the model catalogue browser and the parts that come later would then be separate entries, each carrying its own share of the dictionary. Technically this works. What I do not know is whether you want several entries from one author for one set of tools, and whether dependencies is meant for this or only for plugins that are genuinely separate things.

If you prefer the second, I would rather do the split now than once there are more parts to untangle. If you prefer the first, nothing in this PR changes and the file stays as readable as it is.

@MopicMP

MopicMP commented Oct 10, 2026

Copy link
Copy Markdown
Contributor Author

Hi @JannisX11, thank you for the rules you wrote down and for the time the reviews take.

Before writing this we read through other submissions and your answers in them, in particular what you said about AI in #919 and the review you left on #976. We tried to follow the rules as you state them rather than as we would prefer to read them.

To be plain about one thing: this plugin was written with AI assistance. We are not hiding it, and we read the rule as written -- not a ban, but a requirement that the author keeps full understanding of the code and that the result is not noise. We genuinely try not to add junk to the catalogue. What we set out to build is the thing we kept missing in Blockbench ourselves.

Where a claim can be replaced by a measurement, here are the measurements.

Installs. Since 0.1.2 was merged on 26 September: 1 413 installs in the last seven days, 10th of 146 plugins, 2.6 per cent of all plugin installs that week, and 3 051 over the three-week window. The numbers are yours, from https://blckbn.ch/api/stats/plugins?weeks=1.

Issues and pull requests. Two have come in from outside and both were answered. A bug report arrived on 24 September and the fix was released on the 26th. An outside pull request hardening the importer against untrusted model files was reviewed and merged on 1 October, the day it was opened.

Your last review. In #964 you asked for two things: the name was confusing, and the menu entries sat at the bottom of the File menu instead of under File > Import. Both were done the same day. Measuring our own submission against that second point again, we found one entry we had missed: "Publish to site" is offered in the image editor (New > Image), where there is no model to publish. That one is ours and it is being fixed.

Testing. The plugin is checked by 41 verification scripts, a dozen of which drive a real Blockbench -- the web build and the desktop app -- rather than a stand-in for it, and by live import runs against real files. I cannot tell you the plugin has no bugs. I can tell you that the ones we find get fixed and released, and that work on it is active.

The source. The submitted file is not bundled and not minified: 33 495 lines, longest line 737 characters, and 19 per cent of the lines are comments. The non-Latin text in it is the translation tables, which are data.

The art. The icon was not generated. I drew it myself, from a hat model made by a person on Sketchfab, and that model can be seen in the models section of our site: https://mosaicary.com/models

On #976. We read it, and rather than wait to be told, measured our own plugin against the three things you named there. Two we could answer with numbers; the third is the menu entry above, which is the same class of mistake.

One more thing, as an offer rather than a claim. Because those checks had to be repeatable, we wrote a script that measures the rules your validator does not count: weight against both readings of the 2 MB limit, tag count and the edition tag, tabs-only indentation of the plugins.json entry, untranslated non-English text in code, icon format, dimensions, squareness and size, images in the about page and whether they are fetched remotely, bundled copies of the libraries Blockbench already ships, ways foreign code or markup could be executed, calls to generative services from the plugin itself, and changelog order. The checks are taken from what README.md asks for and from what you wrote in #919 and #976, not from our own taste.

It has three verdicts rather than two, and that is the part we care about: ok, look -- a person decides, and it prints line numbers instead of a verdict -- and FAIL, which is the only one that sets the exit code. It does not pretend to answer the two questions that cannot be read off the bytes, whether the art was made by a machine and whether the author understands the code. Those stay with the reviewer.

What we did to find out whether it is worth anything:

  • Over the whole catalogue it reads 146 entries and reports 82 failures, so it can refuse and not only approve. On our own submission: 15 ok, 7 look, 0 FAIL. On Add Render Studio #976 it reports no failure, because the threshold you judged that file by is not written down anywhere, so it prints the numbers and leaves the call to a person.
  • Every rule has a fixture built to break exactly that rule, 40 of them, because a check that has never refused anything looks the same as a check that cannot refuse. The test itself is then tested by breaking the script on purpose: silence every verdict, or turn every FAIL into a look, and the test has to go red. It does.
  • The one rule with an outside truth is the metadata match, since scripts/validate.js is what actually runs. Reading the declaration the way you do, by running the file, the two agree on 140 of 146 entries. All six differences are the same case: six bundled plugins compute their metadata from somewhere the sandbox cannot supply, so the sandbox comes back empty and the validator then reports every field as a mismatch. That is about the reading rather than the plugin, and the script says so instead of failing them.

We will keep working on it either way, since we use it on ourselves, and there is a list of things it could still measure. If it is of any use to the catalogue, we would be glad to open a separate pull request adding it next to scripts/validate.js, in whatever shape suits you, and to keep improving it from there. If you would rather not have it, that is fine too and it changes nothing about this submission -- the decision is yours.

And the standing part: we will keep up with the rules as they are and as they change. If you name anything, here or later, we will meet you on it and fix it as far as we can.

@Malik12tree

Copy link
Copy Markdown
Contributor

AI PRs must be illegal 🤦‍♂️🤦‍♂️

@MopicMP

MopicMP commented Oct 11, 2026

Copy link
Copy Markdown
Contributor Author

AI PRs must be illegal 🤦‍♂️🤦‍♂️

First of all, do you think this text was written by AI? Yes, it was, but only because I don't know English. I can't communicate in it. The only thing I did was ask an AI to translate the text and edit it for me. But if you really want to read dozens of grammar mistakes, fine. Next time I'll write the pull request by hand, if that's what you want.

@MopicMP

MopicMP commented Oct 11, 2026

Copy link
Copy Markdown
Contributor Author

And if you think my text above is incredibly long and useless, then please, before writing that, take a look at my work and the plugin. That text wasn't written off the top of my head. All the changes are real, and none of them are minor or incomplete. I wrote exactly as much as there actually is in the plugin right now. If you have a problem, please say it directly, instead of just "AI PRs must be illegal 🤦‍♂️🤦‍♂️".

@MopicMP

MopicMP commented Oct 11, 2026

Copy link
Copy Markdown
Contributor Author

Honestly, I'm not trying to offend anyone. I'm also ready to accept criticism of what I do and work on. But please, I'm just asking you to say directly what's wrong. I'm always ready to listen and talk. If there are things you're not happy with, I'm always open to discussing them with you. But please, try to understand me too. Just like you, I spent a lot of time on development. What's above wasn't done with a snap of the fingers, even though AI was used in it. A lot of work went into it. I have always been, and still am, ready to hear your opinions and contribute more to the community.

MopicMinystr and others added 2 commits October 20, 2026 22:02
… the image editor

Two fixes inside 0.1.4, without a new version.

The Mosaicary site now also holds builds (Axiom blueprints, Litematica and
Sponge schematics), which Blockbench cannot open, and the catalogue window had
turned into a wall of them. Every shelf leaves builds out. The camera's near
plane follows the size of the model, so layers a hair apart no longer fight in
stripes up close.

Upload Model to Mosaicary was offered in the image editor (New > Image), where
there is no model to upload. It now checks Format.image_editor, as do the upload
button in the catalogue window and draft sync.

node scripts/validate.js gltf_to_minecraft passes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
vintagestory (JannisX11#1015) went in at the end of plugins.json, right after this
plugin's entry, which was the last one. The closing brace of the entry became
"}," on master while this branch changed the lines just above it, so Git
could not merge the two on its own. Resolved by keeping this branch's
entry and master's new one after it; nothing else in the file differs from
master. The version stays 0.1.4. node scripts/validate.js gltf_to_minecraft
passes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants