📖 Documentation
Everything you need to create, script, and publish 3D games in your browser.
VXLVERSE is a browser-based platform for creating 3D games without writing code. You can build levels, place 3D models, script NPC dialogues, and publish your game — all from the editor in your browser.
Quick start
/editor directly) — VXLVERSE creates a fresh blank game and drops you straight into the editor.@Name. AI generation is optional; you can also paste your own dialogue scripts.Your work autosaves to the cloud about a second after every change — there's no manual Save button on this version.
The editor is split into four areas:
Outliner
Left sidebar. Lists all scenes in your game and the entities in each scene. Click an entity to select it. Click + New Scene at the bottom to add another level.
Viewport
Center area. The 3D view. Click an entity to select; use the gizmo to move, rotate, or scale. Top-right corner has the Play and Publish buttons.
Inspector
Right sidebar. Two tabs: Scene shows environment / fog / weather / post-process settings; Entity shows the selected entity's type, name, position, dialogue, etc.
Asset Dock
Bottom of the editor. Browse and place 3D models (4,000+ free GLBs) and music tracks. Click any thumbnail to enter placement mode, then click in the viewport to drop the model.
Select an entity by clicking it in the viewport or in the Outliner. Press Ctrl+Shift+G, Ctrl+Shift+R, or Ctrl+Shift+S to switch between position, rotation, and scale gizmos. Arrow keys nudge the selected entity in 0.5-unit steps; hold Shift for fine 0.1-unit nudges.
Multi-select in the Outliner with the row checkboxes (or shift-click for ranges). When two or more entities are checked, the Inspector switches to bulk mode where you can change type, move/rotate/scale relatively, or delete them all at once.
VXLVERSE ships with 4,000+ free CC0 GLB 3D models. They live in the Asset Dock at the bottom of the editor — there's no separate modal to open. Pick a model, click in the viewport, done.
How to place a model
The first entity you place in a brand-new scene should be a Scenes & Levels asset — these are full environments (a town, a dungeon, an island) that act as the world backdrop. The editor opens a scene picker automatically when you create a new scene to nudge you toward this.
All models are standard .glb files cached after first load, so subsequent uses are instant. Pro / Admin users can also upload their own GLBs via the + Upload GLB button — useful when you have custom assets that aren't in the public library.
To set the player's starting position, click the green Hero Spawn button at the bottom-right of the viewport, then click anywhere in the scene.
The Story Editor is the canonical place to write your game's narrative. Press Q in the editor or click the Story button at the top-center of the viewport.
Story Editor tabs
You can also write dialogue scripts directly per NPC by selecting the entity, opening the Inspector, and editing the Script field — or pressing Q while an NPC is selected to open the script editor for just that character. The scripting language is VXLScript (next section).
VXLScript is a simple text-based language for writing NPC dialogues, shops, quests, and game logic. Select an NPC entity and press Q to open the script editor.
Scripts are divided into named blocks. A block starts with # BLOCK_NAME. Execution always begins at # START.
# START
Guide: Welcome to the village!
-> END
# SHOP
Merchant: What would you like to buy?
-> END Write dialogue as Speaker: Text. Each line becomes a speech bubble. Lines without a colon are spoken by the Narrator.
Merchant: Welcome to my shop!
Merchant: I have the finest wares in all the land.
Player: What do you have for sale? You can interpolate variables in dialogue text with curly braces, for example {gold} will display the current value of the gold variable.
Lines starting with * create choice buttons. Each choice points to a target block with ->.
Guard: Halt! State your business.
* I'm here to trade -> MARKET
* I seek the King -> CASTLE
* Just passing through -> END Add requirements to choices or goto lines with (need AMOUNT $variable). The choice only appears if the condition is met (the player has at least that amount).
Merchant: What would you like?
* Buy Sword (50g) (need 50 $gold) -> BUY_SWORD
* Buy Potion (10g) (need 10 $gold) -> BUY_POTION
* Leave -> END
// Conditional goto: auto-jumps if player has the key
-> OPEN_DOOR (need 1 $key_dungeon)
Door: It's locked. You need a key. When a conditional -> fails, execution falls through to the next line. This lets you create if/else logic.
Variables are prefixed with $. The engine recognizes several built-in variable types:
PLAYER STATS
$hp, $mp, $gold ITEMS
$sword_iron, $potion_hp_small, $key_dungeon FLAGS
$quest_active, $quest_done, $boss_dead CUSTOM
$any_name_you_want Flags set with [set $flag 1] persist across level transitions via WorldState.
Actions modify game state. Wrap them in square brackets. They execute immediately and advance to the next line.
[give $variable amount] Add currency, HP, MP, or items to the player. Amount defaults to 1 if omitted.
[give $gold 100]
[give $sword_iron 1]
[give $hp 50] [take $variable amount] Remove currency, HP, MP, or items from the player. Clamps at zero.
[take $gold 50]
[take $key_dungeon 1] [set $variable value] Set a variable to a number or string. Ideal for quest flags. Persists in WorldState across levels.
[set $npc_quest_active 1]
[set $npc_quest_desc "Find the lost sword"]
[set $npc_quest_done 1]
// Quest flags power the Quest Log (J key):
// _quest_active → shows as active quest
// _quest_desc → shows objective text
// _quest_done → marks as completed [goto_level levelId] Transition to another level. Ends the dialogue and loads the target level.
[goto_level dungeon_01] [hide name] / [show name] Toggle visibility of an entity by name. Useful for opening doors or revealing hidden objects.
[hide boulder_entrance]
[show treasure_chest] [wait seconds] Pause dialogue execution for a number of seconds before continuing.
[wait 2] [end_game message] End the game and optionally display a message. Use for endings or game over screens.
[end_game You saved the kingdom!] Use -> BLOCK_NAME to jump to another block, or -> END to close the dialogue.
# START
NPC: Hello there!
-> GREETING
# GREETING
NPC: Nice to meet you.
-> END Lines starting with // are ignored by the parser. Use them to annotate your scripts.
// This is a comment
// Check if player has the quest item
-> REWARD (need 1 $dragon_head) # START
// Return path if quest is done
* (need 1 $quest_dragon_dead) -> HERO
* (need 1 $quest_dragon_active) -> RETURN
King: A dragon plagues our lands!
* I will slay it! -> ACCEPT
* Sounds dangerous... -> COWARD
# ACCEPT
King: Take this key to the dragon's lair.
[give $key_dragon_lair 1]
[set $quest_dragon_active 1]
-> END
# COWARD
King: Then we are doomed...
-> END
# RETURN
// Auto-complete if player has proof
-> VICTORY (need 1 $dragon_head)
King: Have you slain the beast?
-> END
# VICTORY
[take $dragon_head 1]
[set $quest_dragon_active 0]
[set $quest_dragon_dead 1]
[give $gold 5000]
[give $sword_excalibur 1]
King: You are the Savior of the Realm!
-> END
# HERO
King: All hail the Dragon Slayer!
-> END Publishing is a deliberate event, not a hidden toggle. The Publish button sits next to the green ▶ Play button at the top-right of the viewport. Clicking it opens the Publish modal — a single screen where you review the public-facing details of your game and ship it to the gallery.
How to publish
vxlverse.com/games/YOUR_GAME_ID and appears on Explore.If your game has critical issues (no scenes yet, no hero spawn placed), the modal shows a red banner listing what to fix and disables the Publish CTA. Click any issue to jump to its fix point. Warnings (NPCs without descriptions, scenes without descriptions) show as a soft amber hint but don't block publishing — your game runs, it just feels unfinished.
Once published, the same button reads ✓ Live and reopens the modal in Update mode. You can change metadata, recapture the thumbnail, or hit Unpublish to remove the game from the gallery without deleting it.
There is no manual save button on this version. Every change you make in the editor is written to two stores in succession:
localStorage (instant)
Synchronously written on every edit. Survives tab closes and refreshes within the same browser. Used as a fast local cache so the editor resumes immediately on reload.
PocketBase cloud (~1s debounce)
About a second after the last edit, the full game configuration uploads to api.vxlverse.com. This is the canonical source of truth — what loads when you open the editor in another browser or share a link.
The save indicator in the header reads Save normally, switches to Saving while the cloud upload is in flight, and back to Save when complete. If the network is offline, your changes still persist in localStorage and sync next time you have connectivity.
Game thumbnails auto-capture on first save (so your game has something to show on cards immediately). After that, they're only updated when you explicitly recapture or upload via the Publish modal — your custom thumbnail won't get overwritten.
All shortcuts work when the viewport is focused (typing in an input field disables them). Grouped by what you're doing — camera, transform, selection, scripting, history.
| W A S D | Move forward / left / back / right |
| E / C | Move up / down |
| Shift | Sprint (3× speed) |
| Right-drag | Look around |
| Space | Focus on selected entity |
| Ctrl+Shift+G | Position (translate) gizmo |
| Ctrl+Shift+R | Rotation gizmo |
| Ctrl+Shift+S | Scale gizmo |
| Arrow keys | Nudge selected entity (0.5 units) |
| Shift + Arrows | Fine nudge (0.1 units) |
| Ctrl+Shift+X | Toggle gizmo snap-to-grid |
| J / ] | Select next entity |
| K / [ | Select previous entity |
| Ctrl+D | Duplicate selected entity |
| Ctrl+Shift+D | Duplicate with random rotation + scale (scatter) |
| Delete | Delete selected entity (or bulk-checked entities) |
| Esc | Cancel placement / deselect / clear bulk selection / close modal |
| Q | Open Story Editor (or NPC script if an NPC is selected) |
| R | Rotate placement preview by 90° (during model placement) |
| Shift+R | Rotate placement preview by 20° (fine) |
| Ctrl+Shift+N | New scene |
| Ctrl+Z | Undo |
| Ctrl+Shift+Z | Redo |
| ? | Toggle the in-editor help / shortcuts modal |
There is no Ctrl+S shortcut. The editor autosaves to localStorage instantly and to the cloud about a second after the last edit — see the Saving & Cloud Sync section.