How ESKEES works
Based on the ESKEES Studio alpha (October 2026). Screens and features may change without notice. The app is currently in Japanese; labels are quoted with translations. For step-by-step use, see the getting-started guide; for scripting, the script language page.
ESKEES and EMG
ESKEES is a product; EMG is a file format — they are different things. EMG is an open format published under Apache 2.0 (specification). ESKEES is a tool for making and exporting EMG works.
- ESKEES can do more than the EMG spec. Nulls, crops, scenes, meshes and scripts have no direct EMG equivalent; on export they are converted to EMG fields, baked into images, or carried as ESKEES extension data.
- The reverse doesn't hold: what works in the editor may not survive export. Rotating an asset, for example, is baked into the image, so it can't be rotated at play time.
File types
| Extension | What it is | Contents |
|---|---|---|
.emg | An EMG file | Parts and layers (data.json), texture images, blink/lip-sync mapping (mapping.json) |
.eskx | ESKEES export (EMG + extension data) | Everything in .emg plus mesh, logic, UI, scenes, sounds, stages and other extension data |
.espj | Project | The whole editing state with asset images and sounds — enough on its own to carry on editing |
.estpl.json | Template | Part assignments to reuse on another asset |
- The export format follows the content:
.eskxif anything needs extension data (such as logic), otherwise.emg. Exporting as.emgwithout extension data lists what will be dropped. - The EMG part of an
.eskxfollows the spec. Rename it to.emgand EMG-compatible software will display the artwork, ignoring the extension data.
Combine projects: 「ファイル ▾」→「プロジェクトから取り込む…」 (import from a project), or dropping a .espj while a work is open, lets you choose between importing it into the current project and opening it in place of the current one. Importing adds library assets, placed items (at the same positions), sounds, tables and grid data, renaming anything that clashes. Logic, UI, scenes, timelines, stages, character settings and effects are not imported.
How edits are exported
| What you edit | On export |
|---|---|
| Asset rotation / scale, 9-slice, objects (text + images) | Baked into the image (9-slice also writes its edges, EMG 0.5.6) |
| Nulls, crops, states, timeline and easing, atlas groups | Converted to EMG fields (states become presets; easing is baked into keys) |
| Mesh and wind, click areas, masks, logic, UI, scenes, sounds, grid data, stages, camera and world, character settings, save-data layout, tables, screen and part effects | Extension data (.eskx only) |
| Components, library assets and categories, guides, grid, preview background, frame rate | Saved in the project (.espj) only |
| Snap strength, position origin, shortcuts | Stored on your device as personal preferences |
Saving and undo
- Edits that affect the export can be undone (Ctrl+Z / Ctrl+Shift+Z). Guides and grids are saved in the project but aren't part of undo.
- ESKEES Studio runs entirely in your browser and never uploads your work. Save often with 「ファイル ▾」→「プロジェクトを保存」 (Ctrl+S).
The screen
| Area | Contents |
|---|---|
| Top bar | File, undo, scenes, Logic (opens the code pane), Test play, Export |
| Library (top left) | Imported assets, components, stages, data and sounds. Nothing shows on the canvas until you place it |
| Hierarchy (bottom left) | Three views: parts, stacking order, and layers (the PSD tree — the only place to regroup parts). The eye button on part and UI (panel / element) rows shows or hides them on the canvas only — export and play are unaffected |
| Inspector (right) | Changes with the selection: null, instance, part or UI. A selected part also shows its animation preview, its own logic, character settings and effects. With nothing selected: project settings (camera and world, screen effects…) and export |
| Bottom panel | Timeline, states (including the scene list), logic, UI and log |
Library and instances
- Imported assets and placed instances are separate. Place an asset as many times as you like; only instances are exported. Deleting an asset asks first, because its placed instances go with it.
- Sounds (effects / BGM / voice), grid data painted cell by cell, and atlases split by purpose (characters, backgrounds…) also live here.
Components
Components combine layers from several assets with text. Unlike objects, each element stays its own layer, editing a component updates every placed instance, and each instance can override its text. If the script has class ComponentName, placed instances become actors when play starts. Double-click a component to edit it on the canvas.
Scenes
Scenes switch the whole screen (title → game → result). Unlike states, only one scene is active at a time, and it switches the UI too. Anything in no scene is "common" and always shown. If a part seems missing, switch scenes in the top bar. Scripts use scene name, on scene name and in scene name.
Nulls
Nulls move several parts together. A null has its own animation, members keep theirs, and nulls can be nested. The pivot is fixed when you first set a key. On export, nulls are folded into their members' animation.
Animation and easing
- Set keys for position, rotation, scale and opacity on the timeline; use the graph view for rows with many keys. Negative values work too (rotation
0 → -360). - Preview a part's animation in the inspector (「アニメーション(このパーツを再生)」, play this part) — even parts hidden on the canvas because the game spawns them. The frame fits everything the part passes through.
- For big moves, 「キャンバスで見る」 (view on canvas) shows only that part on the canvas (the bar's 「ほかのパーツも表示」 brings the rest back); the bar's return button, or Esc, takes you back with visibility, selection, scene and any open table restored.
- Timeline motion on a part also plays on actors spawned with that part's picture (spinning, pulsing…).
- Easing doesn't add keys, so you can change curves later: 4 basic curves plus the 30 from easings.net, including Elastic and Bounce. EMG has no easing, so curves are baked into keys on export.
- Shortcuts: K play / stop, J / L step one frame (Shift for one second), hold Space to pan. Shortcuts can be remapped.
Mesh, click areas and masks
- Mesh sways hair and cloth, with pinned areas, wind and click response per region. Wind depends only on time, so replays look the same.
- Click areas switch frames, apply presets, toggle visibility or play animations when pressed, reverting after 2 seconds by default.
- Masks clip with rectangles or ellipses that can change with variables or time — shown clipped in the editor too.
Logic and test play
「ロジック」 (Logic) in the top bar switches to the script workspace: an outline on the left, the script as blocks, text or a diagram in the middle (all three edit the same script), and problems on the right — lines that don't parse and names that don't exist, found without running. Test play (Ctrl+Enter) runs the work on the same engine as the Player and showcase.
You can also write one part's logic in the inspector: select a part and 「ロジック(このパーツ)」 (logic for this part) shows only the code about it, with a live preview below. The {} next to a table column opens just the logic that reads that column.
Script language
A small Lua-like language with blocks closed by end: values and tables, var / globals / local, the usual control flow plus wait, functions, class and actors, triggers such as on start / on frame / on key / on press, keyboard, gamepad and virtual pad input, tween, effect (including a GLSL effect's param 1..4), particles, scene transitions (scene Game fade 0.6), save slots (save.slot), timeline sound keys and per-component sound names, say with variables and expressions, per-element ui show / hide / color, text input fields players type into with their own keyboard or IME (the text lands in a variable and fires on change; Enter fires on press), part names from expressions (show (who .. "_body")), string.find, the device clock (var t from clock.unix), sound and music, camera and stages, save and score. See Script language.
Use ASCII names for variables, functions and classes (score, addExp, class Enemy). Japanese names work, but full-width and half-width look-alikes can produce names that look the same and aren't. A class name is the part name, so name parts that become classes in ASCII too. Text shown on screen can be in any language.
Game features
- Character settings — control (8 directions, left/right, left/right and jump), hitbox (image rect, rectangle, circle) and class variables in the inspector, without writing a script.
- Stages — paint tile layers with collision, place objects and set the camera's start in 「+ ステージ」. Walls are cells on layers set to collide, plus cells painted with a part set to 「🧱 障害物」 (obstacle) in its character settings, on any layer; the stage editor shows both in red.
- Camera and world — a world larger than the canvas, camera follow and shake, and parts pinned to the screen. The canvas shows the camera frame and world edge; 「カメラ」 (camera) above it shows the view as play starts.
- UI — overlay panels with text, buttons, images and variable-driven gauges (HP bars).
- Tables — enemy stats, experience per level, items: rows of numbers in a spreadsheet-like editor (「+ 表」), pasteable from Excel/Sheets and linkable to other tables, with a tile view that shows each row's picture. Read them as
data.敵.スライム.HP(Manage numbers with tables). - Physics — things that fall and roll, and fixed floors and walls, from the character settings.
- Sound, grid data, saves — and the Player resumes where you left off.
The nine samples on showcase are built with these features and open in Studio (Remix a sample).
Effects
Color, light and blur applied at play time — not baked into images — so scripts can animate them (effect Flash to 0 in 0.3).
| Kind | Where | Choices |
|---|---|---|
| Screen effects | Inspector with nothing selected, 「画面のエフェクト」 | Color adjust, vignette, flash / fade, mosaic, bloom, blur, chromatic aberration, scanlines (CRT), noise, wipe, custom GLSL |
| Part effects | Inspector with a part selected, 「エフェクト」 | Tint, color adjust, outline, dissolve, wave, glow, shadow, blur, custom GLSL |
- Effects are named; scripts change them with
effect name = amountoreffect name to amount in seconds, on a part withon part, or per actor withon self. - Screen effects apply top to bottom and can be limited to some scenes or extended to the UI. The canvas and GIF / video export show them as played.
- Custom GLSL lets you write your own color function, within safety limits (length, loop counts). If it keeps frames slow, just that effect is dropped. ESKEES Screen leaves GLSL off by default; showcase marks such works.
- Effects are
.eskxextension data and are left out of a plain.emg.
Export
.emg/.eskx— one texture by default (split only if it won't fit in 8192px, with a notice).- GIF (one level of transparency), APNG (keeps semi-transparency) and WebM, with presets for Discord stickers (320×320, 512KiB, 5 s) and LINE stickers (320×270, 1MB, 4 s, APNG only).
Publishing and playback
- showcase — press 「公開」 (Publish) in Studio's top bar. Each time, choose editable (remixing allowed; others can open it in Studio) or not editable (play only). You can update a work you published before. Ratings and leaderboards included.
- Test player — drop a
.eskxon showcase.eskees.com/test to play it in the browser without publishing (with variables and a log; the file isn't sent anywhere). - Make it with AI — the ESKEES CLI lets Claude Code, Codex and other AIs build games that you can then edit in Studio (Make games with AI).
- On your own site — embed showcase works, or host your own
.eskxwith ESKEES Player from the CDN, or export a single web page (Put works on your site). - Leaderboards — emit a value with
score; boards are readable by anyone through api.eskees.com. - ESKEES Screen — run it as your Windows desktop wallpaper.
- ESKEES Editor (desktop) — not distributed at the moment (coming soon); it will open
.espj/.eskx/.emgby double-click. Until then, use ESKEES Studio in your browser.
Using EMG elsewhere
.emg loads in Unity, Godot, Ren'Py, YMM4 and web players. To keep it looking right:
- Static vs Switch decides how every player draws a part. Static draws all layers of the part; Switch draws exactly one. Use Switch for expression and outfit variants, Static for things built from several layers. Mistakes don't raise errors — variants pile up, or only one layer shows.
- Hidden layers matter. In a Switch part, hidden PSD variants are exported as options; in a Static part, only visible layers are.
- Stacking order is one order across the whole file. Blend modes are the 16 CSS modes plus additive (
plus-lighter). - Logic, mesh and UI run only on the ESKEES engine (showcase, Player, Screen); elsewhere the work shows as still artwork.