Browser support and project limits

Omibit targets desktop browsers. Automated creator/player journeys run in Chromium, Firefox and WebKit. This does not certify every released browser/OS combination; mobile and tablet use remains experimental. A simulator or resized desktop viewport does not replace physical-device testing.

What is included

All three tiers include Lua execution, cartridge files, graphics, synthesized four-channel audio, authoring tools, deterministic input replay and local game progress. Source projects retain named modules, original assets, editable authoring records and locked libraries; export source saves their lossless .o8proj archive. O8/O16 provide level/entity/map and animation tools. O32 provides mesh import, scene instances and hierarchy, camera/material controls and static collision queries, with a reusable camera/clipping/collision example in the O32 guide. See exporting for the distinction between source archives and playable cartridges.

Keyboard controls default to arrows and Z/X, plus C/V where the cart contract supports the extra buttons. Touch controls are available in the player. Legacy carts use the first connected standard-layout controller; its D-pad/left stick maps to digital directions with a 0.35 dead zone, and face buttons map to Z/X/C/V (C/V require legacy O16/O32). Extended-contract carts support four independent player slots, quantized analog axes/triggers and a game-space pointer. Keyboard/touch input feeds player 0; gamepads retain their browser-indexed slots across disconnects. Editor playtests and the player offer keyboard rebinding; controller polling, recorded packets and HTML exports share the runtime input contract. Focus the game page and press a controller button to let the browser expose it. Browser permission and embedding policy can prevent controller access. Audio still needs a key or click to unlock.

Extended O16/O32 carts can use bounded PCM samples alongside synthesized audio; O8 retains synthesis. Extended O32 adds an opt-in depth/perspective renderer while preserving legacy affine triangles. Local multiplayer is cart-authored. Compatible extended carts can also use the player's two-player online invite flow: two peers, exact matching payloads, a relay and verified lockstep input. Rooms are memory-only; page reload or relay restart does not resume a session, and offline HTML does not host an internet room. See the extended API reference.

Accounts/cloud synchronization, public matchmaking, simultaneous source editing, full IDE breakpoints and a general-purpose physics engine remain outside this release scope. Physical controller/touch, assistive-technology and independent creator checks remain release evidence requirements.

The host targets 60 logical frames per second. Complex carts or slower hardware can run below that rate. Pausing or hiding the page stops new frame dispatch (one in-flight frame may finish) and clears held inputs; returning does not replay an unlimited backlog. Audio requires browser permission/user interaction. Mute persists locally. Audio continuity also depends on browser scheduling and the output device.

Keyboard authoring

  • Code: type in the labeled Lua editor; use the functions menu to jump to a declared function, then find/replace, undo/redo and run. Errors with source locations offer go to line. Pause, step and use the console to inspect variables. The run window shows approximate Lua instructions for a sampled frame, the highest instruction count seen this run, and sampled worker execution time. Instruction counts are deterministic up to the VM hook granularity; worker time depends on the computer and browser.

In the run window, open console → save trace to download the exact button inputs, cartridge fingerprint and final state hash of a clean playtest. Replay trace loads that JSON against the same cartridge revision, pauses at the recorded frame, and reports whether the state hash matched. This stays local; the trace has no cart source or saved progress. A trace cannot reconstruct manual REPL edits or a different cartridge revision, and the replay input log is bounded to 216,000 frames.

  • Sprites: focus the sheet and use arrows/Home/End to choose a sprite. Focus the pixel grid; arrows move, Space/Enter paints, Delete/Backspace erases. Cursor position and color are announced.
  • Maps: focus the map; arrows move, Shift moves eight cells, Enter paints the selected brush, Delete erases, P picks a sprite. Choose the layer and brush with the surrounding buttons.
  • Sound effects: focus the sound editor; Left/Right chooses a note, Home/End reaches the ends, Up/Down changes keyboard octave. Pitch, volume, waveform, effect and speed have separate controls.
  • Meshes: use the labeled numeric fields, primitive controls and OBJ import for precise geometry. Visual preview dragging and region/shape gestures remain pointer workflows.
  • File imports use keyboard-accessible buttons. Dialogs retain focus and provide cancellation. Save and error messages are announced.

These are practical keyboard alternatives, not a claim of complete screen-reader or WCAG certification. Game accessibility depends on the cart itself. Independent assistive-technology review remains necessary before making a broader accessibility promise.

Storage and recovery

Projects and game progress are separate. Projects retain twenty revisions; competing editor tabs preserve divergent work as a recovered copy. A failed local save leaves an error and does not authorize replacing the current draft. PNG export remains available when browser storage is denied. Browser clearing/private modes can remove data: keep portable exports.

Game saves contain 64 unsigned integer slots. A stale player tab preserves its live progress for export and refuses to overwrite a newer save. Explicit save IDs intentionally share data between carts on the same origin; they are not ownership boundaries. Ranked runs start from clean state. See saving progress.

Asset import limits

Cart and sprite PNG files are limited to 16 MiB. Sprite images must be at most 4096 pixels on either axis and 4,194,304 pixels overall; import scaling limits palette conversion to 262,144 output pixels. OBJ imports accept up to 8 MiB, 100,000 vertices/UVs, 65,536 triangles, 4,096 groups and 4,096 corners per face. Larger assets must be simplified first. The mesh bank still holds at most 21,845 faces. Rejected editor imports preserve the current project.

Shared-service capacity

The publishing service is a bounded, single-writer community service, not an unlimited hosting platform. Default limits include 512 immutable friendly names, 1 GiB of cart files and 2 GiB of aggregate committed data; a cart has at most 1,000 comments and 10,000 replay records. Public replay lists show the highest 200 results. A jam has at most 1,000 entries. Hash links remain usable when a friendly name cannot be assigned, provided cart storage succeeded.

There is no automatic promise of permanent hosting or automatic expiry. Operators control backup, archival, moderation and capacity. A full response preserves existing data; local exports remain usable. Cart pages offer private reports when an operator has enabled reporting. Hiding a cart removes it from service downloads and discovery; it cannot recall previously downloaded copies or caches already served.