Snap LSL together from puzzle bricks, then paste a real Second Life script into a prim.
Version: 0.2.14
Yellow hats are events. Colored bricks stack under them. The panel on the right is the compiled .lsl — not a sketch.
Second Life / LSL are Linden Lab trademarks. This is not affiliated with Linden Lab.
You do not install Node. You download one file from Releases.
| I use… | Download this |
|---|---|
| Windows, just make it work | PrimBlocks-Setup.exe |
| Windows, no installer | PrimBlocks-windows.zip |
| Mac | PrimBlocks-mac.dmg |
| Linux | PrimBlocks-linux.AppImage |
| I want the code | Source code (zip) — skip this unless you are building it |
Then:
- Run that file. Windows: if it says Windows protected your PC → More info → Run anyway. Mac: right-click → Open.
- Tutorials (start at Basic) or Examples → Touch greeter → Copy.
- In Second Life: right-click a prim → Build → Content → New Script → paste → Save.
Full walkthrough: packaging/GETTING_STARTED.txt.
Not a full LSL IDE. The catalog is the events + the ll* calls you actually use for greeters, doors, listens, dialogs, sensors, particles, and the usual sensing/world helpers. Raw LSL bricks cover the rest.
- File — yellow brick next to the title. New, Open, Save, Save As (
.primblocksproject), Import LSL (rebuilds bricks from a.lsl/.txt), Quit - Puzzle bricks — Blockly 13, colored C-hats, toolbox categories
- Noodles — set a variable in one place, get it in another, and the line draws itself. Goes around a stack that is in the way
- Presets — save the current workspace in this browser / the desktop profile. Nothing is uploaded
- Tutorials — basic / intermediate / advanced / expert. Empty workspace, one brick at a time, Next stays off until that brick is there. Done keeps the stack. X puts the parked one back. Tip jar, wearable, land-drop, and worn+placed are in there.
- Tips — header switch. Drop a brick, get a bubble. Off by default.
- Legal compilation units —
defaultalways first, typed globals, novoid,forindex declared outside thefor - Official event signatures —
touch_start(integer num_detected),listen(integer channel, string name, key id, string message), etc. - ll catalog* — chat, looks, motion, sound, sensing, world, lists, math. Wiki link on every brick tooltip
- Type snaps — integer will plug into a float socket, not the other way around. String + number needs a cast brick
- Warnings — sensor range, chat bytes, timer faster than a sim frame, forced delays (IM 2s, dialog 1s,
llSetPos0.2s) - Examples — greeter, notecard greeter, two-state door, timer counter, owner commands, color dialog, nearby sensor, three wired ones, plus land-drop, tip jar, wearable HUD, worn-or-placed, traveling tip jar, split tips
- Notecards — builder panel (
key = value,#comments, 255-byte lines) + a read-notecard hat that emits the real dataserver / EOF / NAK / inventory-check / CHANGED_INVENTORY pattern - localStorage — workspace + script name + notecard survive a refresh. Nothing is uploaded
Editor (desktop):
| Greeter | Door | Timer |
|---|---|---|
![]() |
![]() |
![]() |
Toolbox (Events / Chat / Looks):
| Events | Chat | Looks |
|---|---|---|
![]() |
![]() |
![]() |
Warnings + phone:
| Timer too fast | Dialog delay | Phone LSL sheet |
|---|---|---|
![]() |
![]() |
![]() |
Full set (every flyout, every example, guide, variable dialog): docs/SCREENSHOTS.md.
npm install
npm run dev
Opens on port 5173. Same Copy → New Script → Save loop.
Desktop window (needs Rust):
npm run desktop
npm test
npm run typecheck
- Yellow hats are top-level. Each hat has a state field (
defaultunless you are doing a door / vendor / etc). - Commands under a hat become the event body.
- Variables become typed globals (
integer count = 0;,key id = NULL_KEY;, …). - User-function bricks emit above states. LSL will not let a function change state — don't put a state brick in one.
assembleScript()writes: comments → globals → functions →default→ other states alphabetically.
Details: docs/LSL.md, docs/ARCHITECTURE.md, docs/REVIEW.md.
| File | What |
|---|---|
| CHANGELOG.md | What changed in 0.2.14 |
| packaging/GETTING_STARTED.txt | Which file to download, then what to click |
| packaging/README.md | How the Release is built |
| docs/REVIEW.md | Where to start, easy-to-break generator rules, known gaps |
| docs/SCREENSHOTS.md | Full screenshot gallery |
| docs/LSL.md | LSL rules this editor actually encodes |
| docs/ARCHITECTURE.md | Files, generator pipeline, adding a brick |
| docs/CATALOG.md | Event + ll* table generated from source (npm run catalog) |
| docs/EXAMPLES.md | The bundled scripts and what they should emit |
| docs/EXTENDING.md | How to add an ll* brick without touching the generator by hand |
dev— working branch. Editor, catalog, docs.main— GitHub default. The Windows/Mac/Linux Release is built from here.
See BRANCHING.md.
Personal / local use. 0.2.14 — catalog is not every ll* on the wiki. Hover a brick for the wiki signature. Forced delays and in-world caps warn; they still compile because the simulator is what actually sleeps / clamps.








