# Editor URLs and Modes

> Every URL that opens Edit Mode, what each editor mode edits, how a link names the mod it opens, and why a second tab on the same mod opens read-only.

- Source: https://diceytable.com/docs/editor/concepts/editor-urls
- Last verified: 2026-08-23

Edit Mode is a URL, not a hidden state. Every editor address is bookmarkable, pasteable and
shareable with yourself across devices — and the address says **which mod** you are editing
and, increasingly, **which part of it**.

## The URLs

| URL | Opens |
|---|---|
| `/editor` | Edit Mode with no mod chosen — it opens your most recently updated mod |
| `/editor?project={id}` | Edit Mode on a specific mod |
| `/editor/room/{id}` | The **Room Editor** on that mod |
| `/editor/table/{id}` | The **Table Editor** on that mod |
| `/editor/asset/{id}` | The **Asset Editor** on that mod |
| `/editor/game/{id}` | The **Game Editor** on that mod |
| `/editor/room` (no id) | The Room Editor with no mod chosen yet |

`{id}` is the mod's project id — the same id the editor's own API uses.

**The address bar keeps itself current.** Switch mods inside the editor and the URL follows,
so reloading (or copying the address) returns you to the same mod in the same mode. It is a
*replace*, not a push: Back leaves the editor rather than walking backwards through the mods
you clicked. Any other query parameter already on the URL is left alone.

**A URL you mistype opens the plain editor.** `/editor/kitchen/my-mod` is not an error page —
it opens `/editor` with no mode and no mod, and logs a warning to the console saying so. That
is deliberate: `/editor/…` has always been served by the app, and turning a typo into a 404
would break old bookmarks.

An id in the URL that is not one of your mods is reported by name — *"No project "x" in your
account"* — rather than silently opening a different one. Opening the wrong pack is worse than
opening none.

## The modes

A **mode** is one editor configured for one subject. It is not a separate application, a
separate canvas, or a separate document — the hierarchy, the panels and the viewport chrome
change; nothing else does.

| Mode | Edits |
|---|---|
| **Room Editor** | The room shell: floor, ceiling, the four walls and their posters, lights, decor, environment |
| **Table Editor** | The table itself: its model, colliders, triggers, play surface and seat ring |
| **Asset Editor** | Prefabs, decks, materials, textures and scripts as a standalone unit |
| **Game Editor** | Composition: which room and which table a game uses, plus player zones and entities — and the game's [variants](https://diceytable.com/docs/editor/interface/topbar#the-variant-controls), when it has more than one set-up |

Each mode shows the subject it owns plus what that subject legitimately contains, **and
nothing else**. The Game Editor assigns a room; it does not edit a wall.

That is not a restriction added for tidiness. A room and a table are **published packs** with
their own repos, their own versions and their own authors, and a game *references* one of each
at an exact version. The Game Editor is where that reference is made; the Room and Table
Editors are where the thing being referenced is built.

The Room Editor's camera is built for interiors: it opens in a **first-person walk rig** you
steer with WASD and right-drag to look, and its orbit camera can raise its focus to frame a
wall rather than staying pinned near the table. The ceiling toggles off, and a wall you have
moved outside of hides itself — along with anything hanging on it — so you are never framing a
room from behind its own wall.

The camera and both of those toggles are driven from the right-hand end of the [viewport
toolbar](https://diceytable.com/docs/editor/interface/viewport#view-controls), which shows exactly the controls the
mode you are in declares — and shows none of them on plain `/editor`.

`/editor` with no mode segment stays exactly as it always was: the full tree, every panel.
Nothing about it changed when the modes arrived.

## Opening a second editor

The menu bar offers two ways out of the mod you have open:

- **Mod ▸ Open In → the editors this mod's kind allows.** Switches *this* tab to that mode on the
  mod you already have open. It reloads the page, so unsaved changes are confirmed first.

  **The modes you get depend on what the mod is.** A mod's kind is chosen once, in the
  create chooser, and frozen at its first publish — so it is not a view you switch between:

  | This mod is a… | Open In offers |
  |---|---|
  | **Table** | Table Editor |
  | **Room** | Room Editor |
  | **Asset pack** | Asset Editor |
  | **Game** | Game Editor, Full Editor |

  A table pack has no room to dress, no pieces to place and no script to write, so the other
  editors are not offered: their panels describe a different kind of document. A game is the
  one kind with two, because the Game Editor and the Full Editor are two views of the *same*
  document. Creating a mod takes you straight to its own editor for the same reason.

  Type a URL that names the wrong editor for a mod — `/editor/game/{a-table-pack}` — and it
  still opens, with a notice on the menu bar naming the editor that mod belongs in. It is
  not redirected: a forced navigation would discard whatever that tab has unsaved.

  **`Game Editor` and `Full Editor` are not the same thing.** `Full Editor` is plain `/editor`
  with no mode: the whole nested tree and every panel, exactly as it has always been. The
  `Game Editor` is the composition view, where `Room` and `Table` are two assignable rows
  instead of twelve scenery rows — see [Assign a room or a
  table](https://diceytable.com/docs/editor/workflows/assign-a-room-or-table).
- **The open-in-new-tab icon** on any *other* mod in **File ▸ Open Project…**. Opens that mod in its own tab.
  Click it again later and the browser **focuses the tab you already have** instead of making a
  third one — each mod's editor tab has a name, and a named tab is reused.

Notice what is missing: there is no button that opens a second tab on the mod you are already
editing. That is the point of the next section.

## One mod, one writing tab

**Two editor tabs on the same mod cannot both save. The second one opens read-only.**

Your working files live in your browser's own storage, on disk, in one tree per mod. Two tabs
editing that tree are two writers with no coordination between them: each saves a complete
picture of the mod built before the other's changes existed, and whichever saves last wins
silently. Nothing errors. Work simply disappears.

So the first tab to open a mod owns it. A second tab — from a pasted link, a duplicated tab, a
restored session, another window — detects the first one and opens **read-only**:

- a `Read-only` badge next to the mode name in the topbar;
- a notice on the menu bar saying what is happening;
- `Save Draft` and `Publish` disabled, and every other write refused with the same reason.

You can still look at everything: the hierarchy, the Inspector, the viewport, the asset
explorer. It is a viewer, not a broken editor.

**The owning tab is asked, never overruled.** The moment the second tab opens, the owning tab
shows **Another tab wants to edit this project** with two choices:

- **Keep control** — nothing changes; the new tab stays read-only and says the other tab kept
  control.
- **Give up control** (**Save & give up control** when there are unsaved changes) — the owning
  tab saves, becomes read-only, and the new tab reloads as the owner. If the save fails, the
  owning tab keeps control and offers **Give up anyway**.

**Click `Read-only` to ask for control** — from either tab, at any time, including to take
control back after giving it up. The owning tab gets the same prompt. If it does not answer
within 20 seconds, the badge offers **take control anyway**; the owning tab then saves what it
can and hands over without asking.

A tab never becomes the owner in place: it reloads first, because a tab that has been sitting
read-only is looking at a picture of the mod from before the other tab's saves, and promoting it
as-is would let stale state overwrite newer files. When the owning tab closes, clicking the badge
simply reloads and takes over.

Refreshing the owning tab and then cancelling the browser's "leave site?" prompt does not give
ownership away — ownership is released only when the page actually goes.

**A crashed tab does not lock you out.** Ownership is renewed continuously while a tab is
alive; a new tab that finds an owner asks it directly, and one that does not answer within a
moment — because it crashed — is taken over. A tab in a background or covered window keeps
answering even though the browser slows its timers, so it is never mistaken for a crashed one,
and a tab that is mid-save is given considerably longer.

> **This is per browser profile, not per account.** Ownership is decided between tabs in the
> same browser on the same machine. Two different machines — or two browser profiles — cannot
> see each other, and each has its own copy of the working files. Publish is what reconciles
> them; see [the publish flow](https://diceytable.com/docs/mods/publishing/publish-flow).

## Related

- [Opening Projects](https://diceytable.com/docs/editor/interface/projects) — choosing and switching mods
- [Document vs Engine](https://diceytable.com/docs/editor/concepts/document-vs-engine) — what a save actually writes
