Skip to content
VaelixxPublic

About

A lean 3D editor that runs entirely in the browser — import, edit, paint and export models, with first-class Roblox .rbxm/.mesh support.

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Repository files navigation

MiniBlend

A lean 3D editor that runs entirely in your browser.

Import a model, look at it in 3D, select and delete parts, reshape it, assign materials, paint on it, export it again. No installation, no cloud, no account — every file stays on your machine.

License: MIT Platform three.js No build step Electron i18n

Quick start · Features · Formats · Roblox · Shortcuts · Language · Manual


Why MiniBlend

Blender can do everything, which is exactly the problem when all you want is to strip a few parts off an imported model and export it again. MiniBlend covers that narrow job well and deliberately stops there: no sculpting, no rigging, no animation, no modifier stacks, no rendering. The reduced scope is the feature, not a gap — see Limits.

It is plain ES modules and three.js. There is no build step, no bundler and no transpiler — the files you edit are the files that run.

+----------------------------------------------------------+
| App bar       File · Add · History ·          Navigation  |
+----------------------------------------------------------+
| Context row   3D/UV · Mode · Tool · Brush · View          |
+---------+--------------------------------+---------------+
| Objects |  [Tools]                       | Properties    |
|         |                                |  Search       |
| (list)  |          3D viewport           |  Tabs         |
|         |                                |  Groups       |
+---------+--------------------------------+---------------+
| Status bar                                               |
+----------------------------------------------------------+

Quick start

Download

Grab the latest build from the Releases page:

File What it is
MiniBlend-<version>-win-portable.exe Portable Windows app — no installer, just run it
miniblend-<version>-source.zip The full app — unzip and double-click start.bat

Running from source

git clone https://github.com/Vaelixx/miniblend.git
cd miniblend

Then pick a route — both run the same code:

Command Requires
Browser double-click start.bat (or python serve.py) Python or Node.js
Desktop window double-click app.bat (or npm install && npm start) Node.js

start.bat opens http://localhost:8777 automatically. Use a different port with start.bat 8888, and stop.bat to shut every server down again.

Why a server at all? The app is built from ES modules, and browsers refuse to load those from file://. serve.py also sends Cache-Control: no-store and stamps a version marker onto every module import, so an edit never gets stuck behind a stale browser cache.

Desktop app

app.bat downloads Electron once on first run (~100 MB) and then starts instantly. The desktop shell boots the very same local server and loads the app through it, so there is no second build that could drift apart from the browser version. If the download fails, the browser route is unaffected.

Build it yourself

Prefer your own binary over a downloaded one? The whole build is two commands:

npm install          # pulls Electron + electron-builder (~350 MB, once)
npm run build        # -> dist/MiniBlend-<version>-win-portable.exe
Command Produces
npm run build Windows portable .exe (no installer)
npm run build:all Windows .exe and Linux AppImage
npm start Runs the desktop app straight from source, no packaging

Output lands in dist/. macOS .dmg is configured too, but electron-builder can only produce it on macOS. Builds are unsigned, so Windows SmartScreen shows a warning on first launch — that is expected for an unsigned binary, whether you built it or downloaded it.

No build is needed to use MiniBlend in the browser. npm is only for the desktop wrapper — the web app is plain ES modules and runs as-is.

Requirements

  • A current browser with WebGL 2 (Chrome, Edge, Firefox, Safari)
  • Python 3 or Node.js 18+ — one of the two, to serve the files
  • An internet connection on first start only, to fetch three.js from the CDN
  • Node.js 18+ additionally, if you want the Electron window

Features

Area What you get
Import OBJ · GLTF/GLB · FBX · STL · PLY · DAE · 3MF · RBXM/RBXMX · Roblox .mesh · images. Drag in whole folders; companion files (.mtl, .bin, textures) are matched automatically
Export GLB · GLTF · OBJ · STL · PLY · PNG — whole scene, selection only, or one file per object
Edit mode Vertex/edge/face selection, extrude, inset, solidify, inflate, smooth, subdivide, fill holes, mirror, array, separate by loose parts
Painting Paint directly in 3D and on the flattened UV sheet, into the same layer. Brush ring, straight lines, edge bleed, per-face masking, "paint all marked faces identically"
UV & texture Unwrap by side / by part / triplanar, island editing, image layers with blend modes, 512–2048 canvas
Materials PBR base colour, metalness, roughness, emission, opacity, flat shading, wireframe; seven texture slots; multiple slots per object
Navigation Three presets — Simple, Blender, CAD — plus a WASD fly mode (F5)
Housekeeping Full undo/redo, outliner with rename & visibility, join vs. group, geometry optimiser, decimation
Usability Search across every setting (Ctrl+F), collapsible groups, Simple/All detail levels, resizable and hideable panels, a build stamp that tells you when the browser served stale code
Language English by default, German included — switch live under Scene → View → Language, no reload

The full reference — including the measured performance work behind the paint tool — is in the user manual.


Language

MiniBlend ships English by default and includes a complete German translation. Switch under Scene → View → Language — it applies immediately, without a reload, and the choice is remembered across sessions.

Adding another language means one file:

// js/locales/fr.js — copy en.js, translate the values, keep the keys
export const FR = { 'menu.file': 'Fichier', 'menu.add': 'Ajouter', /* … */ };

Then register it in js/i18n.js:

import { FR } from './locales/fr.js';
export const LANGS = { en: 'English', de: 'Deutsch', fr: 'Français' };
const DICTS = { en: EN, de: DE, fr: FR };

Any key you leave out falls back to English rather than rendering blank, so a partial translation is usable from the first string.


Supported formats

Format Import Export Notes
.glb / .gltf ✅ ✅ Draco supported; carries materials and textures
.obj (+ .mtl) ✅ ✅ Export drops materials
.fbx ✅ — Binary and ASCII
.stl ✅ ✅ Binary and ASCII
.ply ✅ ✅ Including vertex colours
.dae ✅ — Collada
.3mf ✅ — 3D printing format
.rbxm / .rbxmx ✅ — Roblox models, binary and XML
.mesh ✅ — Roblox mesh, versions 1.00 – 7.00
.png / .jpg / .webp / .bmp ✅ ✅ Drop onto an object as a base colour texture; PNG export writes the painted texture

Roblox support

MiniBlend reads .rbxm and .rbxmx into real parts — Part, WedgePart, SpawnLocation, Seat — with size, position, rotation, colour and transparency, and resolves MeshPart geometry rather than substituting a cube.

All seven revisions of Roblox's own .mesh container are parsed, up to and including version 7.00 (COREMESH with Draco compression). Verified against six real meshes per revision taken from a local Roblox cache, plus .rbxm files written by Roblox Studio: vertex counts, triangles and winding match throughout.

A rbxassetid:// reference is resolved in three steps: a matching file dropped alongside the model, then a fetch through the bundled local proxy, and finally a correctly sized placeholder that states why it failed.

Roblox requires a login for most assets these days and answers 401 otherwise. That is a restriction on their side. Dropping the .mesh file in alongside the model is the reliable route — and MiniBlend never asks for or stores credentials. UnionOperation stays a placeholder, because its CSG data is encrypted and undocumented.

Details in the manual.


Keyboard shortcuts

Key Action Key Action
Tab Object ⇄ edit mode Ctrl+Z / Ctrl+Y Undo / redo
1 2 3 Vertices / edges / faces Ctrl+O Import files
L Select connected part Ctrl+E / Ctrl+S Export dialog
X Delete selection Ctrl+C Ctrl+V Ctrl+X Clipboard
E / I Extrude / inset Ctrl+D, Shift+D Duplicate
P Paint tool · [ ] brush size Ctrl+J / Ctrl+G Join / group
M Cycle paint reach Ctrl+F Search all settings
F / Home Zoom to selection / fit all F2 Rename
1 3 7 5 Front/right/top · ortho ⇄ persp F5 Fly mode (WASD)
B Box select Shift+C Clear 3D cursor

Project structure

index.html            Interface markup
css/style.css         Design system / theme
serve.py              Local dev server: no-store headers, cache-busting, Roblox proxy
start.bat  stop.bat   Browser launcher / shut down all servers
app.bat               Desktop launcher (fetches Electron on first run)
electron/
  main.cjs            Window, menu, lifecycle
  server.cjs          The same static server, embedded
js/
  main.js             Entry point
  i18n.js             Language switching (English default, German included)
  locales/en.js       English strings
  locales/de.js       German strings
  state.js            State + event bus
  history.js          Undo / redo
  viewport.js         Renderer, cameras, navigation, fly mode, light, wire overlay
  input.js            Mouse, box select, 3D cursor, drag & drop
  objects.js          Object mode: select, duplicate, join
  editable.js         Mesh core: delete, separate, extrude, inset, mirror, unwrap
  editmode.js         Edit mode: overlays, selection, tools
  paint.js            Painting in 3D and on the sheet, face masking
  uv2d.js             2D view: UV islands and image layers
  materials.js        Material slots, textures, UV generation
  importer.js         File import
  exporter.js         File export
  rbxm.js             Roblox models (.rbxm binary, .rbxmx XML)
  rbxmesh.js          Roblox mesh format 1.00 – 7.00 (7.00 = Draco)
  rbxassets.js        Resolving rbxassetid://
  primitives.js       Primitives
  ui.js               Panels and wiring
  sidebar.js          Search across all settings
  tips.js             Hint texts
  shortcuts.js        Keyboard shortcuts
docs/
  MANUAL.md           Full user manual (English)
  MANUAL.de.md        Full user manual (German original)

Limits

Stated up front so nobody goes looking:

  • Everything lives in memory — the scene is not saved. Use Export .glb for intermediate states and re-import them.
  • Triangle meshes only; no n-gons, no loop cuts.
  • Box select always cuts through the model (like Blender's X-ray).
  • No sculpting, rigging, animation, modifier stacks or rendering.
  • Unwrapping is a projection, not an angle-minimising solver — strongly curved surfaces get distorted.
  • Roblox unions stay placeholders; most rbxassetid:// assets need an account.
  • The paint tool declines above 400 000 triangles; the wire overlay falls back to a simpler method above 300 000.

Contributing

Issues and pull requests are welcome. There is no build step and no test runner — edit a file under js/, reload the page, and the change is live.

Two conventions worth knowing:

  1. Keep it lean. The narrow scope is deliberate. A feature that duplicates Blender is more likely to be declined than a rough edge that gets fixed.
  2. Measure before claiming a speedup. The performance notes in the manual quote numbers timed in the page, not estimates. Please keep it that way.

Acknowledgements

Built on three.js by Mr.doob and contributors. Roblox mesh and model parsing is a clean-room implementation based on publicly documented format descriptions.


License

MIT © 2026 Vaelixx

MiniBlend is not affiliated with, endorsed by, or connected to Roblox Corporation or the Blender Foundation. "Roblox" and "Blender" are trademarks of their respective owners.

About

A lean 3D editor that runs entirely in the browser — import, edit, paint and export models, with first-class Roblox .rbxm/.mesh support.

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages