Changelog
User-visible changes in each release. Quiet infrastructure work is not listed.
v0.19.0
2026-10-30- Added "Align the brush cursor to pixels" under Settings > Input. Turn it off and the cursor preview follows the pointer smoothly; the pixels you draw are unchanged
- While dragging the lasso fill or lasso select, hold ⌥ to draw a straight segment; release to resume freehand
- Instance layers now look clearly different from regular layers: on the timeline they appear as a single clip (thumbnail and symbol name) on a recessed row, and the Layers panel shows the symbol name under the layer name.
- "Place Symbol" is now "Add Instance Layer", and instance rows stay empty outside their band. In the Symbols panel, add an instance layer from the button at the end of each symbol row.
- The timeline now draws links, instances and tweens as spans: one thumbnail at the start and a continuous band. Drag an instance's first thumbnail to slide the whole band. Symbols now use a diamond mark.
- The app's fonts now display correctly offline — they ship inside the app instead of loading from the web.
- Added a Symbols panel to the right dock: it lists the document's symbols with thumbnails; click one to highlight the rows that use it, double-click to enter it, press + to place it, and right-click to rename it or export it as .ten or a sprite sheet
- A reusable animation made from layers is called a Symbol, and each one placed on the timeline is an Instance (the same terms as Illustrator and Animate)
- Fixed the preview window not resizing horizontally. The window now outlines the artwork with a checkerboard and border, and panning can go slightly past the edge so it's clear when you've reached it.
- Aligned the left edges of the palette controls
- The Color panel is now split into color mixing and palette sections by a divider, dropping the "Color" and "Arrangement" headings
- Color variants now switch from a dropdown above the palette, which also holds duplicate, rename, adjust colors and delete
- Palette import (preset, file, Lospec, image) and the grid's columns and rows moved into the "⋯" menu
- The Transparent button is now a small button beside the color swatches, saving a row in the Color panel
- The hex color field now matches the number fields, with a single thin focus outline
- Focused number fields now show a thin outline around the whole field
- Tidied the placement panel: rows are evenly spaced, the path is handled with Draw / Redraw / Remove buttons, and easing is picked from curve icons
- The tabs in the lower right dock (Layers and others) no longer show a count
- Refreshed the transform bar (and the mesh, puppet, underlay, wave and path bars): controls sit on one row and a footer shows the mode with Cancel / Apply at the bottom right. Gesture hints now appear in the status bar. While Randomize is off, its strength, area and grain controls are dimmed
- Refreshed the property fields: position, size and rotation are one row each with a label column and the axis name inside the field (drag the axis name to scrub, as before). The input-syntax help moved to the "?" in the section header
- Refreshed the right dock: panels now stack full-width separated by rules instead of floating as cards (the palette grid gets wider). The Palette / Properties switch and the library switch are now underlined tabs
- Refreshed the document tabs: tabs are now ruled cells, and the active tab joins the surface below it instead of being filled (only its document icon is indigo)
v0.18.0
2026-10-23- Added "Randomize" to transform, mesh and puppet: it randomly softens the visible step between moving and still pixels (for fur, scales and other textures). Strength, area and grain size are in the transform bar; the grain switch is experimental
- Scaling without rotation or skew no longer rounds the corners of grid-like patterns
- Fixed pattern corners getting chipped when only moving content in transform, mesh, or puppet mode
- Exporting from the File menu while inside a part now exports the main document (the editor leaves the part first). To export just a part, use the placement layer’s context menu.
- Parts can now be exported as standalone .ten files (from the placement layer’s context menu), and File > Import .ten as Part… embeds another .ten document as a placed part.
- You can now export a part on its own as a sprite sheet from the placement layer’s context menu.
- PSD export now lets you choose, per part, whether to explode it (a folder with its own layers) or bake it into a single layer. The choice is saved in the document and also applies to export recipes (which gain a PSD format) and the command line. Aseprite export bakes parts.
- Parts made from unnamed layers now default to names like "Part 1", so they are easy to tell apart from layers
- The "Enter" button in the Placement panel now sits at the right end of the part's thumbnail-and-name row
- The X / Y fields in the Placement panel are now compact, keeping each value next to its label
- Part bands on the timeline use a softer ink, so they no longer outshine the artwork in the dark theme
- Part bands on the timeline no longer carry a name label, so the first frame's thumbnail stays visible
- "Place Part…" in the layer context menu now opens a list with thumbnails, size, frame count and usage to pick from
- Fixed keys (Esc and shortcuts) sometimes being ignored while an animation was playing
- Selecting a placement layer shows a Placement panel in the right dock to adjust its start phase, repeat, position, path and timing
- Placements of parts that contain other parts can now be baked into a plain layer too
- You can now make parts — reusable multi-frame loops. Right-click cels or layers → “Make Part…”, then double-click the placed row to edit inside it (Esc to go back). Edits inside a part show up everywhere it is placed
- Moving frames across a part placement band is now refused so the band's content cannot change silently (bake it first)
- Drawing on a part placement layer is now blocked with a hint to draw inside the part instead
- Timeline cel thumbnails now draw far faster, especially for layers with large artwork
- Added “Flip All Frames of This Layer” and “Flip Entire Document” (horizontal/vertical) to the Edit menu — hidden layers included, one undo
- Flip Horizontal/Vertical (⇧H/⇧V) now applies to every cel of the selected timeline range (one undo), and is also available from the cel context menu
- Flipping a range that includes linked cels flips them exactly once instead of flipping them back
- Cel ranges spanning several layers can now be cleared or linked/unlinked at once with Delete or the context menu (one undo); the range chip shows the layer count
- Added "Select All Cels in This Frame" to the frame header's context menu and "Select All Cels in This Layer" to the timeline layer row's context menu
- Cel ranges in the timeline can now span multiple layers (drag diagonally, ⇧-click a cel on another layer, or drag to the top/bottom edge to scroll)
- Changing a preview window's zoom no longer resizes the window; content larger than the window can be dragged to pan
- The layer context menu now correctly shows "⌥Click" for "Show only this layer" (the ⌥ key alone does nothing)
v0.17.0
2026-10-05- Multi-selected layers now read clearly even on rows with a color label.
- Layer drag-and-drop now reads where in the row you drop — top/bottom edges insert beside it, the middle of a group row drops into it (so you can finally place a layer directly above or below a group).
- Dragging a multi-selected set of layers in the Layers panel or timeline now reorders them together as one block (Option-drag duplicates the whole selection).
- The float window footer now shows just horizontal and vertical flip; rotation and diagonal mirrors moved to the right-click menu.
- Text that was too small is now a step larger — descriptions, notes and the update dialog's release notes. Settings › Display has a new "Text size" option (100–150%) that scales the editor's text.
- .ten files now open in Ten Editor when you double-click them.
- ⌥-click a layer's eye to show only that layer (also in the right-click menu). The saved visibility is left untouched.
- Drop images or .ten files onto the window — images open the import dialog, .ten files open as tabs.
- New Lasso Fill tool (cycle with F): enclose an area by dragging or by clicking polygon vertices and it fills with the foreground color. The lasso selection gained the same polygon mode.
- Right-dock panels (layers, selections, slices, deformers) can now be detached into their own windows — resize them freely; position and size persist across restarts.
- Float windows now size independently of zoom — shrink one to crop into part of the artwork, drag the art to pan, and right-click to fit a slice.
- The 1px brush cursor no longer flickers — it shows the color it will lay down instead of an outline.
- Canvas Size now lets you pick a 3×3 anchor for where existing art lands.
- Multiple selected layers can now be moved together.
v0.16.0
2026-09-29- The timeline can now be collapsed to just its bar with the button at the right end of the bar; press it again to restore the previous height.
- Dragging a cel range or frames to the edge of the timeline now scrolls it automatically, so you can select or move past the visible frames.
- The timeline now scrolls automatically so the current frame always stays in view during playback and frame stepping.
- The app window now remembers its position, size and maximized state, and reopens the same way on the next launch.
- The preview window now reopens at the position and zoom you last used.
- The preview window now follows the frame selected on the canvas. To play or step frames inside the window on its own, click the sync button at the bottom of the window to unsync — the play / previous / next buttons appear. Click it again to re-sync. Animation Preview opens unsynced and already playing.
- When a frame declares its own layer order, the layer panel now names the frame it comes from and marks the rows that sit away from the base order; rows slide when the order changes as you step frames (never during playback).
- Fixed the layer-name column turning see-through when the timeline is scrolled sideways in a narrow window.
- You can now take a frame out of a timeline tag — drag the tag band's edge to resize its range, right-click a frame and choose "Remove from Tag", or just drag the frame out of the tag.
- Grabbable frame numbers in the timeline now show a hand cursor, and the status bar shows frame shortcuts plus where a dragged frame will land
- Drag the selected frame's number in the timeline to reorder it directly (⌥ to duplicate); ⇧-click a frame to set the loop range from the selected frame
- While dragging timeline cels, cels that the drop would overwrite are dimmed, and the status bar tells you what dropping will do, e.g. “Drop: replaces cel 05 (undo restores)”
- Clicking a timeline cel now shows a status-bar hint for what you can do with it: drag to move, ⌥ to copy, Delete to clear, ⇧-click to extend the range
- The timeline cel-range chip now shows a single labeled “Link” or “Unlink” button that matches the current state. Hovering a linked cel tells you how many frames share its drawing
- Right-click a timeline cel → “Clear Cel” to erase its drawing while keeping the frame. Clicking a cel and pressing Delete does the same (with a canvas selection, Delete still erases just the selection)
- Agent integration: new clearCels operation erases cels while keeping their frames (a linked cel drops out of its link; the other frames keep the image)
- Fixed the tool rail overlapping the status bar on short windows. The rail now stops above the status bar and scrolls vertically.
- New File > “Export Recipes…”: batch-export PNG / GIF / sequences / sheets split per tag or per layer with a {title}_{tag}_{layer}_{frame} name template; recipes are saved in the document. Shift+Cmd+X repeats the last export
- Command-line batch export: `teneditor -b hero.ten` runs the document's saved recipes (or an ad-hoc `--kind gif --split tags`), several .ten files at once
- Agent integration: ten_export_file gains split / template / dir / recipe (run a saved recipe by name)
- The “Aseprite compatible” key preset now covers the real differences (bucket G, slice Shift+C, fill selection F, export sprite sheet Cmd+E, settings Cmd+K; puppet moves to P, merge layers to Shift+Cmd+E)
- Pen / eraser: Shift+click draws a straight line from the last point (the same gesture as Photoshop / Aseprite)
- Fixed onion skin never showing in the Mac app. New option (Settings → Display → Onion Skin): draw ghosts behind or in front of the artwork
- New option (Settings → Input → Palette): picking a palette color while on a non-color tool (eraser, selection…) returns to the last color tool (off by default)
- Timeline tag names now stay readable even on 1–2 frame tags: labels overflow short bands, and tags whose labels would collide are stacked on separate rows.
- Added shortcuts: ⌘' grid, ⇧H/⇧V flip, ⇧N new layer, Enter play/stop, plus ⌘N (new) and ⌘Y (redo) aliases
- Pen shortcut is now B instead of P, pairing with Eraser E for the left hand
- File open/save dialogs on macOS now follow the system language (e.g. Japanese)
- Preview, reference and terrain view windows now hide when you switch to another tab and reappear when you return (right-click "Show on All Tabs" for the old behavior). Preview windows also open about twice as large
- Added an "Outline" option to the filled rectangle and filled ellipse tools — draw the fill and a background-colored outline in a single drag
- Claude Desktop is now supported. In Settings → AI Agent, press "Add…" on the Claude Desktop row to install the extension and let Claude Desktop work on the artwork you have open.
- Agent tools now declare MCP annotations, so supporting AI clients can skip confirmation prompts for read-only operations such as reading structure, reading pixels and taking screenshots.
- The Iso Solid tool can now chamfer a cube: cut the 4 corners of the base, one ratio step at a time, for boxes with softened edges.
- The Iso Solid tool can now draw an outline: turn on "Outline" to overlay the visible edges on the 3 faces, drawn in the background color.
- Added the iso solid tool — cube, cylinder and cone in two drags (drag the base, release for height, click to commit). It appears once the document perspective is isometric.
- Added "Always show the iso solid tool" to the Isometric settings.
- Agents can now draw isometric cubes, cylinders and cones by dimension in one op (the GUI tool comes next).
- While dragging a selection or moving pixels, the width × height (and the offset while moving) now appears just below the selection.
- While restacking, the canvas and animation playback now preview the draft order before you apply it.
- Per-frame stacking-order boundaries are now always visible in the timeline as a gap with connector curves, not only while editing.
- The restack mode now shows a gap at the boundary with smooth connector curves that visualize how rows are remapped.
- Improved the restack mode: only columns from the target frame onward reorder visually (a split view), and rows can be dragged from anywhere in the cels past the boundary.
- Layer stacking order can now change partway through an animation. Right-click a frame header, choose “Change Layer Order From Here”, drag the layer rows, and apply. An arm that passes behind the body on the wind-up and in front on the swing no longer needs duplicate layers.
- AI agents can now read the reference underlay — asks like "pixel this rough" work as-is
- The Terrain View gains a joining mode. Connect always joins neighbouring cells of the terrain; Path joins only the cells of one stroke and cuts them off from the rest, so roads and rivers that double back stay lines instead of merging into blocks. Cut edges are marked with a white line in the window.
- Terrain layers are replaced by a dedicated Terrain View window (View > Terrain View…). A terrain no longer appears in the layer panel or on the canvas; paint cells in the window with its pen, eraser, rectangle and bucket and the tiles assemble from the base block automatically. The grid size is independent of the canvas, and you can bake the result to a layer or export it as PNG. Files saved with terrain layers by earlier versions open with those layers migrated to the new terrains.
- The Shade pen ink now has a Darker / Lighter direction toggle. Direction follows the actual lightness of the ramp ends, not their order. When a stroke can't shift because it's already at a ramp end, the status bar and the direction button flash red.
- Improved AI agent onboarding and settings: a clearer note that the CLI version is required, a copyable install command, CLI detection status (version / login), per-engine groups with agent icons, plus a larger Settings dialog and wider path fields.
- Fixed a bug where the AI agent's ten_describe always returned an empty response ({}), preventing it from drawing.
- Improved UI text legibility across the app — descriptions and chat text are now 13px with roomier line height, and minimum sizes were raised (AI agent panel, Settings, and more).
- AI Agent: fixed the model picker label wrapping vertically in the Codex rows
- AI Agent: model choices now show version and role descriptions, and the Default option explains what it follows
- AI Agent: paste images from the clipboard with Cmd+V to attach them; also improved spacing between the agent and model pickers
- AI Agent: attach images to your instructions (e.g. pixel it from a reference picture)
- AI Agent: the status line now shows the model with its version (e.g. Fable 5)
- AI Agent: pick the Codex model and reasoning effort per conversation
- AI Agent: the status line now shows the model in use, and each conversation can pick a model (Fable/Opus/Sonnet/Haiku)
- AI Agent: added a New Conversation button — restart the chat and pick a different agent (Claude Code / Codex)
- AI Agent: hardened Codex integration's safe mode (shell and other tools are removed entirely)
- The AI agent panel now also works with Codex (ChatGPT) — pick your agent when starting a conversation
- AI Agent: fixed IME composition Enter accidentally sending the prompt; added a Claude Code path field to Settings
- AI agent panel (beta, off by default): enable it in Settings to drive the editor with Claude Code right from the dock.
- Added a ten_read_style tool so agents can read the full TENSTYLE.md style-guide text (natural-language rules)
- Agent operations are now recorded in the .ten file (provenance)
- Added an open source licenses list to the About dialog.
v0.15.0
2026-09-03- Drawing on a hidden layer is now blocked with a red notice explaining why, and drawing on a locked layer now shows a "layer is locked" notice instead of doing nothing
- Error notices in the status bar are now shown as a red chip with larger, more readable text
- A missed selection operation now flashes the marquee red with a brief shake. Fill, copy and brush-creation misses are now reported too, and a missed copy no longer overwrites the clipboard
- Add layer merge — right-click or ⌘E flattens the selected layers or a group into one. Also adds Shift+click range selection of layers and unified multi-selection styling.
- Deleting, cutting, moving or transforming a selection with nothing to affect now shows a red notice naming the active layer. A missed attempt no longer clears the selection, and a missed cut no longer wipes the clipboard
- Context menus improved — paste is now available outside the canvas, and canvas resizing on the canvas itself
- The layer properties dialog now opens with the name field focused and selected, ready to type
- Agent integration: ten_describe now serves your project's art-style rules from TENSTYLE.md files, cascading per folder (the file nearest the document wins).
- Autotile expansion can now export a Tiled tileset — a .tsx beside the PNG with a mixed wangset wired, ready for terrain painting in Tiled and any TMX-capable engine (MCP: tiled:true)
- The terrain-layer dialog now explains that it is an autotiling feature and points newcomers to the Autotile Template as the first step
- Terrain-layer usability — the timeline now shows the kind badge, warnings are red, the icon is now a map, and when the canvas is filled by the base block (e.g. right after the template) the dialog offers to grow the canvas so one Create lets you paint immediately
- The terrain-layer dialog now warns in place when the base position has no pixels, and the autotile template leaves a slice marking the base block — expansion and terrain-layer creation pick it up as their defaults
- Terrain layers — a new layer kind that references a 2×3 autotile base block: cells you paint with the pen assemble into tiles automatically, and editing the base updates everything you painted instantly (Add Terrain Layer… in the layer panel)
- Terrain layers (core) — a new kind of layer whose painted cells assemble themselves into tiles from a base block. Available from MCP's paintTerrain for now
- Fixed sprite-sheet JSON and autotile Godot .tres not being written beside the PNG
- Autotile expansion can now export a Godot 4 TileSet — a .tres beside the PNG with a Terrain Set and all 47 peering bits wired, ready for terrain painting in Godot (MCP: godot:true on ten_export_file)
- Autotile expansion — File > "Autotile Template…" creates a 2×3 base block, and "Expand Autotile…" turns it into a 47-tile blob set (PNG+JSON or a new tab)
- ten_export_file gains kind:'autotile' — expand a 2:3 A2 base block into a 47-tile autotile sheet (PNG + JSON)
v0.14.0
2026-08-29- Hold any tool key for a temporary switch (release to return), Esc returns to the pen, the eyedropper returns to the last color-using tool, Alt-eyedrop works with fill/gradient/eraser, and a floating selection now casts a shadow so commits are visible
- Shift-selecting palette colors now picks the rectangle you see on the grid instead of an index run
- Clarified the example agent prompts so they resolve unambiguously in any setup
- Adding, renaming, and deleting tags is now undoable (bulk changes by AI agents revert in a single undo)
- Agents can now read your currently selected drawing color — asks like "build a ramp from this color" work as-is
- The Claude Code register command in Settings > AI Agent now uses --scope user, so the registration works from any folder
- New "AI Agent" settings category — connection status, per-client registration, and copy-paste example prompts in one place (replaces the old Agent Connection dialog)
- Added Flip Horizontal / Flip Vertical to the Edit menu (flips the selection in place when one exists)
- Added PNG sequence and per-tag GIF export (File > Export PNG Sequence / Tag GIF…)
- AI agents can now open, edit, and save multiple .ten files, and write PNG/GIF/sequence/spritesheet exports next to the document
- The eyedropper can now pick colors from reference image windows.
v0.13.0
2026-08-21- Lay a reference window's image under your canvas with "Lay under the canvas" and draw over the translucent rough (move, scale, opacity, desaturate, show-in-front; placement is saved with the file). MCP gains ten_set_reference, so an AI agent can hand you a rough as an underlay and you decide the pixels.
- Image import and paste now offer "Use as reference" — keep a reference picture in a floating window beside your canvas while you draw (move, zoom, rotate/flip, smooth-scaling toggle). Reference and preview windows are now saved into the .ten file and restored when you reopen it.
v0.12.0
2026-08-20- New "Isometric" settings category. The guide toggle, axis snap, and snap mode (auto/fixed) can now be changed right from the settings dialog.
- Multi-selected palette colors can now be sorted from the right-click menu by hue, saturation, lightness, or opacity (plus reverse). The set of cells stays put — only the colors are re-dealt, and pixels and variants are untouched.
- Paste images from the clipboard as a new layer with ⇧⌘V — files copied in Finder work too. The import dialog now auto-detects upscaled pixel art and proposes the scale that restores the original dot size.
- You can now rotate right after selecting with the move tool — drag just outside a corner of the frame (where the cursor turns into a rotate arrow).
- The angle can now be typed right after selecting with the move tool — typing starts rotating immediately. The properties panel heading is now a constant "Move & Transform" instead of changing with state.
- Width and height can now be typed right after selecting with the move tool — typing starts scaling immediately. The properties panel is regrouped into Position / Size / Rotation, with the aspect-ratio lock next to W and H.
- Mesh warp now supports moving several points together — drag on empty space to rubber-band select, ⇧-click to add or remove points from the selection.
- The update dialog now reads properly — release notes are written for you, and no longer show raw markdown symbols.