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.
Quick start · Features · Formats · Roblox · Shortcuts · Language · Manual
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 |
+----------------------------------------------------------+
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 |
git clone https://github.com/Vaelixx/miniblend.git
cd miniblendThen 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.pyalso sendsCache-Control: no-storeand stamps a version marker onto every module import, so an edit never gets stuck behind a stale browser cache.
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.
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.
npmis only for the desktop wrapper — the web app is plain ES modules and runs as-is.
- 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
| 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.
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.
| 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 |
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
401otherwise. That is a restriction on their side. Dropping the.meshfile in alongside the model is the reliable route — and MiniBlend never asks for or stores credentials.UnionOperationstays a placeholder, because its CSG data is encrypted and undocumented.
Details in the manual.
| 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 |
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)
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.
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:
- 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.
- Measure before claiming a speedup. The performance notes in the manual quote numbers timed in the page, not estimates. Please keep it that way.
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.
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.