SEAS applications

Make your first game.
Then make it your own.

SEAS Workshop lets you arrange a 2D scene and connect visual behaviour nodes to make a playable game inside SEAS.

Covers the first-release editor and runtime · Written against the current implementation · 8 October 2026

Save in this browser. Enable browser storage in Control Panel → Storage first (off by default). Save and Publish retain project and game-package text across reloads and simulated restarts when browser storage is enabled and available. Export downloads a portable project copy. Control Panel → Storage exports a ZIP backup of saved projects, published games and ordinary Documents files, including binary assets. Older JSON backups remain importable. Its confirmed Clear saved files action removes SEAS IndexedDB data for the current website address and reloads the factory filesystem.

Start with the bundled example for a quick tour, or follow the complete coin-collector tutorial to author a game from a blank project. The reference sections explain all controls and nodes.

1. Start and try the example

If SEAS is already open, choose Start → SEAS Workshop. You can also open Terminal and enter workshop.

To run SEAS locally, open a Linux terminal in the seas-desktop folder, run the command below, then open http://127.0.0.1:4173/ in your browser. The project requires Node.js 20 or later.

npm start

While that server is running, this guide is available at http://127.0.0.1:4173/docs/workshop-guide.html. You can also open this HTML file directly without starting SEAS.

  1. Open Workshop and click Example. This loads an editable Coin Collector draft. If your current draft has changes, Workshop asks whether to discard them.
  2. Select Player in the object list. Its scene properties appear on the left and its behaviour graph appears below the scene.
  3. Click Play. A separate window titled Coin Collector — Playtest opens.
  4. Click inside the game canvas and use the arrow keys to move. Collect the five yellow squares to increase the score and win.
  5. Click the game window’s Restart button to reset it. Close that window to return to editing.

The example has four movement chains, coin collection, a score display, a win condition and solid boundary walls. Inspect its objects and nodes to see how they work.

The factory files are /projects/coin-collector/project.json and /apps/coin-collector/app.json. The first opens the editor; the second launches the published game. Terminal command game-coin-collector launches the published version too.

2. Find your way around

Workshop uses a normal SEAS window. Drag its title bar, resize from the window’s lower-right corner, or maximise it for more room. Scroll the sidebar and graph area to reach controls outside the visible space.

Drag the vertical divider beside the left project/object sidebar or the right node inspector to change its width. Double-click a divider to restore its default width. You can also focus a divider with Tab and use Left/Right arrows to adjust it, Shift for larger steps, Home/End for the width limits, or Enter to reset. Escape cancels an active divider drag. Width limits keep space available for the graph.

Drag the horizontal divider below the scene preview up or down to change its height. With that divider focused, use Up/Down arrows (10 pixels), Shift + Up/Down (40 pixels), or Home/End for the limits. Double-click or Enter restores 43% of the current editor height. The limits retain room for both the preview and behaviour graph. These layout changes stay with this editor window and are not saved in the project.

Toolbar controls
ControlWhat it does
NewOpens a blank, single-scene draft. Offers Discard or Cancel if the current draft is modified.
ExampleLoads the built-in Coin Collector into the editor. It does not save over a project automatically.
OpenLists saved projects in immediate folders under /projects. Select a file to open it.
SaveSaves to the open project’s existing path, or creates a folder using the Project ID for a new draft.
Save copySaves under /projects/<current-project-id>, even when the draft already has an open path.
ExportDownloads the current document, including unsaved edits and graph layout, to your host computer.
ImportOpens a host file picker and validates the selected project JSON before opening it as an unsaved draft.
PlayValidates the graphs and opens a separate playtest from the current draft.
PublishValidates and installs a playable snapshot under /apps. Offers Replace or Cancel for an existing target.
InstalledLists installed games you can launch, and explains invalid game packages.
Undo / RedoMoves through the current document’s edit history. Buttons are disabled when no matching history exists.
Grid: on / offToggles the scene grid and 16-pixel snapping for canvas dragging and keyboard nudging.
HelpOpens the in-app quick guide.

A leading • in the window title indicates a modified draft. The status bar also shows Modified after edits. Export retains the file externally but does not mark the in-SEAS draft as saved.

3. Create and manage projects

  1. Click New.
  2. Under Project & scene, enter a display Name, such as Garden Coins.
  3. Set Project ID to a filename-safe name, such as garden-coins.
  4. Choose the scene dimensions and background. The default scene is 640 × 400 logical pixels.
  5. Click outside a text or number field, or press Tab, to commit its value before your next action.

The display name appears in editor/game window titles and installed-game listings. The Project ID determines the default project folder, published package folder and Terminal launcher. It must start with a lowercase letter, then contain only lowercase letters, digits or hyphens, with at most 64 characters.

Good IDs include garden-coins, maze-2 and my-game. Spaces, underscores, uppercase letters and slashes are not accepted.

Make a copy of an existing project

  1. Open the source project, or click Example.
  2. Change its Name and Project ID.
  3. Click Save copy to write the copy to the new ID’s folder.
  4. Save the copy to retain it in this browser, or Export a portable copy.

Changing the ID does not move an already open file. Save continues writing to its existing path. Use Save copy after changing the ID when you want a new folder. Publish always uses the current Project ID.

Opening another document resets the document’s undo/redo history. New, Example, Open and Import ask before discarding a modified draft. Closing the editor, ending its task, or powering down SEAS closes it without a save prompt; save/export first.

4. Edit scenes and objects

Scene coordinates

The origin is the scene’s top-left corner. Increasing x moves right; increasing y moves down. Scene width and height are whole numbers from 64 to 4096. The editor starts in Fit mode; game windows scale the canvas to fit. Viewing scale does not change those logical coordinates.

Zoom and pan the preview grid

  • Zoom: use the preview’s − and + buttons, or roll the mouse wheel over the grid to zoom around the pointer.
  • Fit: shows the whole scene and adjusts as you resize the window or panes.
  • 100%: shows one logical scene pixel per CSS pixel. Manual zoom stays fixed when the window or panes resize.
  • Pan: drag with the middle mouse button, or focus the canvas and hold Space while dragging with the left button. Scrollbars also let you reach areas outside the visible preview.
  • Keyboard: with the canvas focused, + or = zooms in, − zooms out, and 0 restores Fit.

Object movement, grid snapping and the white resize handle still work in logical scene pixels at any zoom. Escape cancels an active object drag. Zoom, pan and pane sizes are separate for each Workshop window. They do not mark the project modified, enter undo history, or appear in saved/exported projects.

Insert a starter object recipe

Click Add recipe above the object list. Choose a Category and Object recipe, adjust its settings, and click Insert recipe. It creates ordinary editable objects and prewired behaviour nodes, with fresh IDs and working references. One Undo removes the whole insertion and any new variables.

Bundled object recipes
RecipeWhat it inserts
Top-down playerA solid player tagged player, with four movement chains. Choose arrows or WASD, speed, size and colour.
Solid wallA solid rectangle with configurable dimensions and colour.
Room boundaryFour solid walls around the current scene. Set thickness and inset; these must leave interior space.
CollectibleA coin trigger tagged coin. Contact with the chosen other-object tag (default player) adds points and destroys the coin.
Score displayA text object updated every step from a number variable. Choose the display label and colour.
Goal zoneA trigger that ends the game when an object with the chosen tag enters. Set the victory message, size and colour.
HazardA trigger that restarts the scene or ends the game on tagged contact. Choose the outcome, message, size and colour.

Variable dropdowns let you reuse a compatible variable or create one with a name and initial value. Score recipes prefer a number variable named Score or with ID score, and otherwise offer to create one. Reusing preserves the variable’s initial value. Recipes use the actual variable ID in node parameters and text templates.

For a quick game, click New and insert Top-down player, Collectible and Score display. Select the display, append Win at threshold using the same Score variable and threshold 1, then Play and move through the coin. Duplicate or move objects to expand the game. Recipe-created projects save, export, import and publish using the existing format.

Create and select objects

Click + Rectangle or + Text above the object list. A new object is selected automatically. Click an object in the list, or click it on the scene, to select it again. Clicking empty scene space clears the selection. For overlapping objects, canvas selection picks the topmost object under the pointer; use the list to reach one behind it.

Objects are drawn in list order, so later objects cover earlier ones. There is currently no layer-reordering control. New rectangles start at x = 40, y = 80, with a size of 40 × 40 and collision mode none.

Selected-object properties
PropertyHow to use it
Object nameA readable label used in the object list and target selectors. Renaming keeps the object’s stable ID and graph references.
x / yThe object’s top-left position. Exact numerical values can include fractions. Negative positions are allowed.
width / heightPositive size values defining the object’s rectangular bounds. They also define its collision and selection area.
ColourThe rectangle fill or text colour, chosen through the browser’s colour picker.
TextAvailable on text objects. Sets the initial displayed string. Use Set Text nodes to change it during play.
Tags (comma-separated)Object categories, such as coin or enemy, hazard. Spaces around commas are trimmed. Overlap tag matching is case-sensitive.
Collisionnone, solid or trigger; see the table below.

Move, resize, duplicate and delete

  • Move: select and drag the object on the scene. Release the pointer to commit the edit.
  • Resize: select it, then drag the white handle at its lower-right corner.
  • Exact editing: change the numerical inspector fields. These fields are not forced onto the grid.
  • Grid: with Grid on, dragging snaps to 16 pixels and arrow nudges move by 16 pixels. With Grid off, dragging rounds to whole pixels and arrow nudges move by one pixel.
  • Duplicate: click Duplicate in the object inspector. The copy gets a new ID, a name ending in “copy”, a 16-pixel position offset and a copy of the original graph.
  • Delete: click Delete object. Other graphs referring to its ID may need fixing before Play or Publish.

Duplicated graphs still target Self correctly. Explicit references to another object keep their existing target IDs; duplicating an object does not automatically retarget those references.

Undo/Redo covers object, variable, connection and node-layout changes, with up to 60 undo entries. It does not restore earlier filesystem saves or publications. After undoing a deletion, select the restored object again if needed.

Collision modes

ModeMovementOverlap eventsTypical use
noneDoes not block or get blocked by collision resolution.Excluded from overlap contacts.Labels, decorations and backgrounds.
solidMove resolves against other solid objects, along X and then Y.Can produce overlap contacts when bounds actually intersect.Player and walls.
triggerDoes not block movement.Produces contacts with other participating objects.Coins, hazards and goal areas.

For a coin pickup, set the player to solid and the coin to trigger. Both must have a mode other than none. Touching edges alone is not an overlap: their rectangular areas must intersect.

Movement does not automatically stop at the scene edges. Add solid walls to keep a solid player inside the scene. Avoid placing solids inside each other initially; Workshop does not push them apart automatically.

Text appearance

Text uses a single line in a sans-serif font. Its height controls font size, clamped from 12 to 96 pixels; its width limits the rendered text width and may compress long strings. Give labels enough width for their longest message. Text does not wrap automatically, and its inspector value is shown literally until a Set Text node replaces it.

5. Use variables and targets

Create a project variable

  1. Scroll down the sidebar and expand Variables.
  2. Click Add variable.
  3. Enter a readable Variable name, select its Type, and set its Initial value.
  4. Note the stable ID displayed above its fields, such as variable-1.

Number variables store values such as score, health or a numeric state. Boolean variables store true or false. Variables belong to the whole project, so any object’s graph can use them. Restart restores every variable’s initial value.

Changing a variable’s type resets its initial value to 0 or false. Check graph nodes using that variable after a type change or removal. Compare Number and Change Variable require number variables. Boolean values can be assigned with Set Variable and inserted into text; this release has no Boolean condition node.

Labels and IDs

The variable name is the label in node dropdowns. Text templates use the ID. For a new variable named Score whose ID is variable-1, enter this in a Set Text node:

Score: {variable-1}

The built-in example instead uses ID score, so its template is Score: {score}. Renaming Score to Points does not change its ID or break that template. New variable IDs are generated automatically; there is no ID-editing field in the variable panel.

Choose a target

TargetMeaning
SelfThe object whose graph you are editing. On the Player graph, Move Self moves the player.
Other (overlap event)The object touching Self during an On Overlap Enter event. On a player/coin contact, Other is the coin.
Named objectA specific object selected from the list. Internally the reference uses its stable ID, so renaming it preserves the connection.

Other is available only along a chain originating from On Overlap Enter. Using Other on an update, start or key-pressed path fails validation. Choose a text object for Set Text; a rectangle cannot display the result.

6. Build behaviour graphs

Each object owns its own graph. Select the object before adding nodes. A graph is an ordered set of events and actions: an event starts a chain, conditions choose a branch, and actions change the game.

Append a default behaviour graph

Select an object, click Add behaviour in the Behaviours toolbar, choose a recipe and its settings, then click Append behaviour. It adds a wired chain below existing nodes without replacing them or changing the object’s properties. Each append and any new variable share one undo step. Incomplete existing graphs remain editable; invalid recipe settings or exceeded limits leave the draft unchanged.

Bundled behaviour graphs
BehaviourGraph and settings
Move while key heldOn Update → Key Held → Move Self. Choose a key and X/Y speed.
Collect on contactOn Overlap Enter → Change Variable → Destroy. Choose the contact tag, score variable, points, and Self or Other as the destruction target.
Display variableOn Update → Set Text. Choose a text target, number or Boolean variable, and display label. Add a text object first if there is no target.
Win at thresholdOn Update → Compare Number → End Game on true. Choose a number variable, comparison, threshold and message.
React to contactOn Overlap Enter → Restart Scene or End Game. Choose the tag and outcome.
Initialise variableOn Start → Set Variable. Choose a number or Boolean variable and matching value.

Contact behaviours require both objects to use solid or trigger collision. For a collectible’s own graph, use the player contact tag and Destroy Self; for a collecting player’s graph, use coin and Destroy Other. Set collision properties in the object inspector. You can edit all inserted nodes and wires normally.

Add and edit a node

  1. Select an object in the object list.
  2. Choose a node type in the Behaviours palette.
  3. Click Add node. The new node is selected.
  4. Edit its parameters in the node inspector on the right of the graph.
  5. Click a node header to select it later, or drag the header to move it. Scroll the graph horizontally or vertically as needed.

Connect nodes

  1. Click an output handle, such as next ●, true ● or false ●.
  2. Click the destination action or condition’s ● in handle.
  3. A wire appears. Repeat to extend the chain.
On Update→Key Held: ArrowRighttrue →Move: Self, X 160, Y 0

Each output connects to at most one destination. Connecting the same output elsewhere replaces its previous wire. To perform several actions, connect them in sequence through their next outputs. A condition has separate true and false outputs; you may leave a branch unconnected when no action is needed.

Event nodes have no input. Each event node begins its own chain; you can add several On Update nodes to one object. Two chains can share an action, but both can execute it when their events fire.

Cancel, disconnect or delete

  • Cancel wire clears the output currently selected for wiring.
  • To remove a connection, select either end and click the matching Disconnect … button in the node inspector.
  • Delete node removes the selected node and all its incoming/outgoing connections.
  • Use Undo if you removed the wrong node or wire.

Execution and validation

Graphs follow the connected output path. Moving nodes around changes their layout, not their execution order. Event roots run in creation/stored order, and objects run in list order. Overlap contacts are evaluated after movement, so score-label and win-condition updates usually see a newly collected coin on the next simulation step.

Use On Update for continuous behaviour. On Key Pressed runs once per press; holding a key does not repeatedly fire that event. Move uses pixels per second and advances only for that simulation step, so a Move attached directly to On Key Pressed produces a small single movement rather than continuous travel.

You can save/export an unfinished graph when the document itself is structurally valid. Play and Publish additionally check node parameters, references, types, ports and execution cycles. If validation fails, click an error row to select the affected object and node, correct it, then try again. Cycles are rejected even in disconnected parts of a graph; use On Update to repeat work over time.

7. Every node explained

The palette contains the 13 nodes below. Default parameters are starting values: select your actual variables and targets before playing.

On Start · On Update · On Key Pressed · On Overlap Enter · Key Held · Compare Number · Set Variable · Change Variable · Move · Set Text · Destroy Object · Restart Scene · End Game

On Start Event

Parameters: none. Output: next.

Runs once on the first simulation step after a game starts or restarts. Use it to set an initial message or initialise a variable through actions. Initial variable values are already restored by the runtime before this event.

On Update Event

Parameters: none. Output: next.

Runs once per simulation step while gameplay is active. The runtime uses 60 steps per second. Use this for held-key movement, score labels, repeated conditions and continuous logic.

On Key Pressed Event

Parameter: Key (default Space). Output: next.

Runs when the selected key changes from released to held. Release and press again to fire another event. Useful for an action button or restarting a still-running scene. Game input requires the active game window.

On Overlap Enter Event

Parameter: Other tag (empty = any), default coin. Output: next.

Runs once when Self begins overlapping another participating object. A nonempty filter must exactly match a tag on Other. Leaving the field empty allows any participating object. Staying in contact does not fire every frame; leaving and re-entering creates another entry event.

This chain can target Other. For pickups, filter by coin, increment the score and destroy Other. Both objects must have collision set to solid or trigger.

Key Held Condition

Parameter: Key (default ArrowRight). Outputs: true, false.

Tests whether the selected key is currently held. Connect On Update to it and connect true to Move for continuous controls. Use false when you want a separate released-key action.

Compare Number Condition

Parameters: Variable, Comparison (default >=), Value (default 5). Outputs: true, false.

Select a number variable and compare it with a constant. Choose == (equal), != (not equal), <, <=, > or >=. For a five-coin win condition, test Score >= 5. This node cannot compare Boolean variables or compare one variable directly with another.

Move Action

Parameters: Target (default Self), X pixels / second (default 160), Y pixels / second (default 0). Output: next.

Moves the target by speed multiplied by one simulation step. Positive X moves right; negative X moves left. Positive Y moves down; negative Y moves up. The target’s solid collision mode controls blocking. A destroyed or missing runtime target is not moved.

Separate horizontal and vertical chains allow diagonal movement; their speeds combine without automatic diagonal normalisation.

Set Variable Action

Parameters: Variable, Value. Output: next.

Replaces a variable’s current value with a constant. Number variables take a numerical value; Boolean variables offer true/false. Select the variable first: changing this selector resets the node’s value to 0 or false.

Change Variable Action

Parameters: Variable, Amount (default 1). Output: next.

Adds Amount to a number variable. Use 1 to add a point or -1 to remove health. It cannot change a Boolean variable. Placing it on an unconditional On Update path changes the value every step, rather than once per pickup.

Set Text Action

Parameters: Text object (default Self), Text; {variable-id} inserts value (default Score: {score}). Output: next.

Updates a text object’s displayed string. The target can be Self when the graph belongs to a text object, or another text object chosen from the selector. Templates insert current values by stable variable ID; a Boolean appears as true or false.

A newly created variable usually has ID variable-1, so replace the default template with Score: {variable-1}. For a fixed message, enter You win! without a placeholder. Unknown variable IDs fail validation.

Destroy Object Action

Parameter: Target (default Other). Output: next.

Marks the target for removal during the current simulation step. Other is the usual target for player-driven pickups. The current action chain can finish, but pending objects cannot begin another event that step; a collected coin cannot award another pickup before removal.

Restart recreates destroyed objects. Destroying an object during a playtest never deletes it from the editor document.

Restart Scene Action

Parameters: none. Outputs: none.

Resets the current game to its loaded snapshot: original objects, transforms, text, initial variables and contact history. Held keys are cleared; On Start runs again. This node ends the current chain.

A Key Pressed → Restart Scene chain works while gameplay is running. After End Game, graph events stop; use the game window’s Restart button.

End Game Action

Parameter: Message (default You win!). Outputs: none.

Stops gameplay updates and shows the final message in the game status area. The final scene remains visible until you click Restart or close the window. If you want to change an on-scene label first, connect Set Text before End Game.

8. Build a coin-collecting game

This walkthrough builds a complete arrow-key game from a blank document. The player collects five coins, the score changes, a win message appears, and walls keep the player inside the arena.

Step 1 — Set up the project and score

  1. Click New. Set Name to My Coin Game and Project ID to my-coin-game.
  2. Keep Scene width 640 and Scene height 400. Choose a dark background.
  3. Expand Variables and click Add variable. Name it Score, keep Type number and Initial value 0.
  4. Note its ID. In a fresh project it is variable-1; use your displayed ID if different.

Step 2 — Create the player and labels

Add the objects in the following order. Use + Rectangle for the Player and + Text for each label. Commit numerical edits with Tab or by clicking elsewhere.

Initial scene objects
Object namex, ywidth × heightCollisionOther properties
Player40, 17028 × 28solidBright cyan; Tags player.
Score label20, 16300 × 24noneWhite; Text Score: 0.
Win label180, 350400 × 28noneYellow; Text Collect all five coins.

Step 3 — Add four movement chains to Player

Select Player. Add an On Update node, a Key Held node and a Move node. Set Key Held to ArrowRight. Set Move to Target Self, X pixels / second 160 and Y pixels / second 0. Wire On Update’s next output to Key Held’s input, then Key Held’s true output to Move’s input.

On Update→Key Held: ArrowRighttrue →Move Self: X 160, Y 0

Build three more separate chains on the same Player graph. Each needs its own On Update, Key Held and Move nodes.

DirectionKey Held → KeyMove → X pixels / secondMove → Y pixels / second
RightArrowRight1600
LeftArrowLeft-1600
UpArrowUp0-160
DownArrowDown0160

Leave the false branches unconnected. Drag node headers into separate rows to keep the chains readable. You can Play now to check movement, then close the playtest to continue.

Step 4 — Add five coins

Create a rectangle named Coin 1 with x = 130, y = 175, width/height 18, a yellow colour, Tags coin, and Collision trigger. Duplicate it four times and edit each copy’s name and x value:

Object namexyTagsCollision
Coin 1130175cointrigger
Coin 2225175cointrigger
Coin 3320175cointrigger
Coin 4415175cointrigger
Coin 5510175cointrigger

Reset y to 175 on every copy. Duplicate offsets both x and y by 16 pixels; changing only x would create a diagonal row. Confirm each copy still has size 18 × 18, tag coin and collision trigger. The coins do not need graphs.

Step 5 — Collect coins on the Player graph

  1. Select Player. Add On Overlap Enter, Change Variable and Destroy Object.
  2. Set On Overlap Enter’s Other tag to coin.
  3. Set Change Variable’s Variable to Score and Amount to 1.
  4. Set Destroy Object’s Target to Other (overlap event).
  5. Wire the three nodes in order using next outputs.
On Overlap Enter: coin→Change Variable: Score +1→Destroy Object: Other

Keep this chain on Player. On that graph, Self is the player and Other is the touched coin. Destroy Self would remove the player instead.

Step 6 — Show the score

  1. Select Score label. Add On Update and Set Text, then wire next to the Set Text input.
  2. Set Text object to Self.
  3. Enter Score: {variable-1} in the text-template field, substituting your score variable’s actual ID if different.
On Update→Set Text: Self, Score: {variable-1}

Place the template in the Set Text node. The text object’s ordinary Text property can remain Score: 0.

Step 7 — Add the win condition

  1. Select Win label. Add On Update, Compare Number, Set Text and End Game.
  2. In Compare Number, select Score, comparison >= and value 5.
  3. In Set Text, choose Self and enter You win!.
  4. In End Game, enter a message such as All five coins collected!.
  5. Wire On Update next → Compare Number input, Compare Number true → Set Text input, and Set Text next → End Game input.
On Update→Compare Number: Score ≥ 5true →Set Text: You win!→End Game

Step 8 — Add boundary walls

Add four rectangles with the following properties. Use a muted colour, Collision solid and no behaviour nodes. Their names are for your convenience.

Object namexywidthheight
Top wall06064012
Bottom wall032064012
Left wall06012272
Right wall6286012272

Step 9 — Play, retain and publish

  1. Click Play. Fix any listed validation errors by selecting the error row.
  2. Click the game canvas and use the arrow keys. The player should stop at the walls.
  3. Collect all five coins. Each disappears once, Score reaches 5, the label changes and the game ends.
  4. Click Restart. The player, all coins, score and label return to their original state.
  5. Close the playtest. Click Save, then Export and keep the downloaded file.
  6. Click Publish. Launch My Coin Game from Start’s Installed games section, or enter game-my-coin-game in SEAS Terminal.

To extend the game, move the coins, increase movement speed, add obstacles or change the target score. If you change the number of coins, update the Compare Number threshold to match.

9. Playtest and restart

Play validates the current draft and opens a separate game window. It includes unsaved edits, but does not save them. A playtest’s score, movement and destruction never change the editor document.

  • Click inside the game canvas to direct keyboard input there. Keyboard gameplay ignores focused buttons and form controls.
  • Only the active game window advances gameplay. Switching to Workshop or Terminal, minimising the game, hiding its browser tab or losing browser focus pauses it and clears held keys.
  • Resume by activating its window/taskbar button and clicking the canvas. Press movement keys again after returning.
  • Restart resets the snapshot that this window originally loaded. It does not fetch later editor changes or a newer published package.
  • To test new edits, return to Workshop and click Play again. You may have several separate playtest windows.
  • Close a game with its window close button, or use Task Manager → Applications → the game’s row → End Task.

After End Game, graph events stop. The window’s Restart button remains available. A runtime error appears in the game status area; fix its source graph and open a new playtest.

10. Save, export and restore

Choose the action for your purpose
ActionDestination / resultSurvives reload?
SaveEditable source in SEAS’s /projects.Yes, when browser storage is enabled and available.
Save copyEditable source under the current Project ID.Yes, when browser storage is enabled and available.
ExportA downloaded <id>.seas-project.json on your real computer.Yes, when you keep the downloaded file.
ImportA validated, unsaved editor draft from a host JSON file.Keep the source download; import it again after reload.
PublishA playable snapshot in SEAS’s /apps.Yes, when browser storage is enabled and available.

Save inside SEAS

SEAS stands for Synthetic Environment and Application System. Earlier Aster exports ending in .aster-project.json remain importable. New exports use .seas-project.json, and the game loader accepts both seas-game and legacy aster-game version-1 packages.

Click Save or press Ctrl+S. A new draft saves as /projects/<project-id>/project.json. An open project saves back to its existing path. The status bar confirms the path or explains a failure.

Save copy uses the current Project ID. If that folder already exists, Workshop offers Replace or Cancel. Replace swaps the entire destination project directory; export anything you want to retain before replacing it. It does not choose an alternative ID automatically.

Export to your computer

  1. Click Export. You can export the current draft without saving it first.
  2. Find <project-id>.seas-project.json in your browser’s downloads, or the folder chosen in its download prompt.
  3. Keep a copy in a real project folder. Use dated filenames if you want separate versions.

The export contains scene objects, variables, graph connections and editor node positions. First-release projects use shapes and text, so the file is self-contained. It exports source, not a published app directory or the current playtest’s score.

Restore after reload or share with someone

  1. Open Workshop in the new SEAS session.
  2. Click Import and select the exported JSON file from the real computer’s file picker.
  3. If validation succeeds, it opens as an unsaved draft. Click Save to retain it in this browser’s /projects.
  4. Click Play to test it, or Publish to install its game in this browser.

The recipient of a shared project follows the same Import → Play/Publish workflow in an SEAS installation supporting project schema version 1.

Before closing or reloading: Save and check that SEAS reports browser storage is available. Export a project or use Control Panel → Storage for a portable backup. If the taskbar says files are temporary, export before leaving.

If a mount disappears

Unmounting /projects leaves the open editor draft in memory. Save reports the unavailable path, while Export still works. Use SEAS’s Mount Manager, or Terminal command mount /projects, to reattach the volume. If the original file no longer exists, use Save copy after choosing a suitable ID.

11. Publish and launch games

Publish creates a playable snapshot of the current draft, including unsaved edits. It does not save the editable source or clear its modified status. Save and Export the source separately when you need to keep editing it later.

  1. Check the project Name and Project ID.
  2. Click Publish. Resolve any graph-validation messages.
  3. If /apps/<id> already exists, choose Replace to update it or Cancel to keep it.
  4. Read the status bar for the published path and Terminal command.

The package contains app.json (the game’s launch manifest) and game.json (its validated game snapshot). Publishing stages both before replacing the destination folder. A validation failure leaves the previous published package intact.

Four ways to launch a published game

WhereWhat to do
StartOpen Start, find the Installed games section and click the game’s display name.
WorkshopClick Installed, then click the game’s title/launcher entry.
ExplorerOpen Applications (/apps), enter the game’s folder and double-click app.json.
SEAS TerminalEnter game-my-coin-game or open /apps/my-coin-game/app.json, using your Project ID.

Run these commands inside SEAS’s Terminal, rather than your host Linux shell. The launcher also exists at /bin/game-my-coin-game. Opening game.json alone opens a text document; app.json is the launch entry.

Update an installed game

Edit the source and Publish again, then choose Replace. Already running games retain their old snapshot. Close and relaunch to use the updated game; clicking Restart in an old window still resets its old version. Changing source alone does not update the installed package.

If you want a separate installed game, choose a different Project ID before publishing. Replace overwrites the destination package folder rather than creating a backup.

Inspect or remove a package

Installed lists valid packages and diagnostics for invalid ones. A broken manifest or game document has no launcher. For a project you can still open in Workshop, fix the source and republish.

To remove a first-release package, use SEAS Terminal to remove its two files, then the empty folder:

rm /apps/my-coin-game/app.json
rm /apps/my-coin-game/game.json
rm /apps/my-coin-game

Use the ID of the package you intend to remove. This does not delete its editable /projects source or host export. A game already running can continue from its loaded snapshot.

If /apps is unmounted, publishing and new package launches are unavailable, and installed launchers disappear. Remount with Mount Manager or mount /apps. Loaded game windows can continue when active.

12. More behaviour recipes

Add WASD controls

On the Player graph, add separate On Update → Key Held → true → Move chains using KeyD (right), KeyA (left), KeyW (up) and KeyS (down), with the speeds from the tutorial. You may keep the arrow chains too; holding two keys mapped to the same direction runs both movement actions and doubles that direction’s movement.

Make a hazard end the game

Add a trigger rectangle with tag hazard. On Player, add On Overlap Enter with Other tag hazard and connect next to End Game. Set its Message to You hit a hazard.. Use the game window’s Restart button to try again.

Add a restart key while playing

On Key Pressed: Enter→Restart Scene

Add this chain to Player. It resets the running scene when Enter is pressed. Once End Game stops gameplay, use the Restart button instead.

Gate movement using a number variable

Create a number variable named Enabled with initial value 1. Insert Compare Number between On Update and Key Held, test Enabled == 1, and connect its true output to Key Held. Another event can set Enabled to 0 using Set Variable to disable that movement chain.

On Update→Enabled == 1true →Key Heldtrue →Move

Display a Boolean flag

Create a Boolean variable, note its ID, and use a text object with On Update → Set Text. A template such as Switch: {variable-2} displays true/false. Add On Key Pressed: Space → Set Variable on another object to set the flag to true. There is no automatic toggle node; use separate keys to assign true and false if needed.

13. Keyboard reference

KeyWhereAction
Ctrl + SActive Workshop window.Save the draft to SEAS.
Ctrl + ZWorkshop, outside editable fields.Undo a document edit.
Ctrl + Shift + ZWorkshop, outside editable fields.Redo a document edit.
Ctrl + DFocused scene canvas or object-list button.Duplicate the selected object.
DeleteFocused scene canvas or object-list button.Delete the selected object. Node deletion uses its inspector button.
Arrow keysFocused scene canvas or object-list button.Nudge the selected object: 16 pixels with Grid on, one pixel with Grid off.
+ / =, −, 0Focused scene canvas.Zoom in, zoom out, or restore Fit.
Space + dragFocused scene canvas.Pan the preview with the left mouse button.
Left/Right, Shift + Left/RightFocused sidebar or inspector divider.Move the divider by 10 or 40 pixels.
Up/Down, Shift + Up/DownFocused preview divider.Move the divider by 10 or 40 pixels.
Home/End, EnterFocused pane divider.Use the width limits, or reset the default width.
EscapeActive scene-object or pane-divider drag.Cancel the drag.
EscapeA Workshop sheet is open.Close the sheet.
TabA text/number property field.Commit the changed field value and move keyboard focus onward.

These shortcuts use Ctrl. Text inputs retain their own text-editing behaviour for undo; use the toolbar to undo a whole document edit while a field has focus.

Keys available in Key Held and On Key Pressed selectors
Selector valuePhysical key
ArrowUp / ArrowDown / ArrowLeft / ArrowRightArrow keys.
KeyW / KeyA / KeyS / KeyDThe keyboard’s W/A/S/D key positions.
SpaceSpace bar.
EnterEnter.

These are available inputs, not automatic game controls. Your graphs must connect them to actions. Modified shortcuts involving Ctrl, Alt or Meta are ignored by gameplay input.

14. Troubleshooting

Read Workshop’s bottom status bar after Save, Export, Import or Publish. Graph problems appear in a sheet when you click Play/Publish; select an error row to jump to the affected object/node. Runtime messages appear in the game window.

Play or Publish lists “invalid Variable” or “invalid Target”

Select the node and choose an existing variable/object. Compare Number and Change Variable require a number variable. Deleting an object/variable or changing a variable’s type can leave old references invalid. The node’s initial default may also refer to a variable your project does not contain.

“Unknown text variable: score”

Your Set Text template probably still uses {score} from the default. Expand Variables, read the actual ID, and use it in braces. A freshly added Score variable normally uses {variable-1}; the built-in example uses {score}.

The player does not move, or only moves a little

Activate the game and click its canvas. Check that the graph belongs to Player, the Key matches your input, Move targets Self and its speed is nonzero. Continuous movement needs On Update → Key Held → true → Move. A Move on On Key Pressed runs for only one step. A game that has ended needs the Restart button.

Coins do not disappear or the score does not change

Check the player and coin collision modes: none prevents overlap events. Set coins to trigger and tag them exactly coin; set the overlap filter to the same case-sensitive tag. On the Player graph, connect Change Variable to the score variable and Destroy Object to Other. Confirm all next wires exist and the objects’ rectangular bounds actually overlap.

The player disappears when touching a coin

Destroy Object is targeting Self on the Player graph. Change it to Other (overlap event) to remove the coin.

“Other is only available from On Overlap Enter”

Move, Destroy Object or another action targets Other on a start/update/key event path. Choose Self or a named object, or put that action on an overlap chain. An action shared between overlap and update paths must have a target valid for both.

“Execution cycle is not allowed”

One or more wires lead back to an earlier node. Select a listed node and use a Disconnect button to break the loop. Repeat behaviour with On Update. Check disconnected graph sections too; they are also validated.

Text is missing, squeezed, or showing literal braces

Choose a text object as the Set Text target and allow enough width for the string. Height controls font size. A template in the ordinary Text inspector is initially literal; put it in a Set Text node and trigger that node, usually from On Update. Scene text does not wrap.

The player passes through walls or leaves the scene

Set both the moving player and walls to solid. Triggers do not block, and none ignores collisions. The scene boundary is not an automatic wall. Add boundary rectangles and keep initially solid objects from intersecting.

Score keeps increasing every moment

A Change Variable node probably runs on every On Update. For a pickup, use On Overlap Enter, increment once and destroy the coin. If a trigger remains, leaving and re-entering it can award another point.

Save still writes to the old folder after an ID change

The project is open from an existing path. Save deliberately keeps that path. Use Save copy with the new Project ID to create a separate source folder.

“Project path is unavailable” or “/apps is unavailable”

The relevant mount or file is missing. Open Mount Manager or run mount /projects / mount /apps in SEAS Terminal. Export an open draft while recovering its save path. If its original file is gone, Save copy can create a new one under /projects.

My edits disappeared after reload, restart or power-on

Check the taskbar storage indicator and whether you used the same website address and browser profile. Saved projects and published games persist only when browser storage succeeds. Session-only changes can be restored from a project export or SEAS backup.

The published game still runs an older version

Editing or saving source does not update its package. Publish and choose Replace. Close the existing game and launch a new instance. Restart in an already open game reuses that window’s original snapshot.

The game is absent from Start, or Terminal cannot find its command

Publish it first, verify /apps is mounted, and open Installed for package diagnostics. Use game-<project-id>, rather than the display name. Reopen Start to see the current installed entries. Malformed or unsupported packages have no launcher.

Import fails or an unsupported version is reported

Select the exported .seas-project.json source, not a package manifest. Ensure it is valid JSON within the import size limit and contains schema version 1. The editor does not migrate unsupported project/package formats. Keep the original file while investigating.

“Instruction budget exceeded” or a runtime error appears

The error identifies an object/node. Simplify large chains or reduce repeated execution, especially many event roots sharing long action sequences. A variable growing beyond finite numerical range can also stop the runtime. Correct the source and launch a fresh playtest; Restart alone reruns the same loaded graph.

15. Current scope and limits

The first release supports one scene, coloured rectangles, single-line text, keyboard input, rectangular solid/trigger collisions, number/Boolean variables and the 13 allowlisted behaviour nodes.

It currently has no sprite/image import, animation, audio, multiple scenes, scrolling camera, gravity, platformer controller, mouse/touch/gamepad behaviour nodes, expression language, generated script execution, automatic unsaved-draft recovery or standalone game-export button. Publishing installs a game within SEAS; it does not produce an independent host application.

ItemLimit / rule
Scene dimensions64–4096 whole logical pixels per axis.
ObjectsUp to 256 per project.
VariablesUp to 128 per project.
Graph sizeUp to 256 nodes and 512 connections per object.
TagsUp to 32 per object, each at most 64 characters.
Numerical authoring valuesFinite, within ±1,000,000; widths and heights must be positive.
Document stringsValidated name, text and node-string fields are at most 2,000 characters.
Import sizeHost imports check a 2 MiB file-size cap. VFS JSON reads also cap document text at 2,097,152 characters.
Edit historyUp to 60 undo entries in the current document.
Game updates60 simulation steps per second, with capped catch-up after a slow frame.
Graph executionNo cycles; a shared 10,000-instruction budget per simulation step.

Keep a scene manageable and export backups as you edit. Limits are checked by the document/runtime validators; adding another object or node beyond a limit may leave a draft that needs simplifying before saving or playing.

16. Files and version reference

The visual controls create these files for you. This reference helps you recognise the source and launch entries when browsing SEAS.

/projects/my-coin-game/
    project.json       Editable project source

/apps/my-coin-game/
    app.json           Package manifest; open this to launch
    game.json          Published game snapshot

my-coin-game.seas-project.json
                      Export downloaded to your host computer

Project documents use schemaVersion: 1. They contain a stable project ID and name, scene settings, variables, objects and per-object graphs. Object/node/variable IDs use the same lowercase letter/digit/hyphen form as Project ID. Object IDs self and other are reserved.

An object graph contains event roots, nodes and edges. Each node stores its type, parameters and editor position. Each edge stores its source node, output port and destination node. Publishing removes node editor positions from the game snapshot; it keeps the initial game state.

Package manifests have a separate package schema version and runtime version. A typical manifest is:

{
  "schemaVersion": 1,
  "id": "my-coin-game",
  "title": "My Coin Game",
  "kind": "seas-game",
  "runtimeVersion": 1,
  "entry": "game.json"
}

Discovery checks immediate /apps child folders with app.json. The manifest ID must match its folder and game document, and the entry must be game.json. Packages nested more deeply are not discovered. Unsupported versions are reported rather than silently converted.

Source files versus the factory image

SEAS loads its factory filesystem from rootfs.zip and applies this browser’s saved changes during boot. For a project bundled for every visitor, update the factory image itself; browser storage and exports belong to individual users and do not change rootfs.zip.

For everyday authoring, use Save and Publish to keep files in this browser. Keep a host project export or Control Panel backup for portability and recovery.

Back to contents ↑