Features
- clisawit list keys prints every shortcut while Sawit runs
- mcpkeymap_list, keymap_bind and keymap_unbind read and change your key bindings
- mcpterminal_split splits a terminal pane and can run a command in the new half
- clisawit list config and sawit list mcp, and list_config_files for agents
- toolsuninstall dev tools from the terminal (sawit cabut) and from agents (uninstall_dev_tools)
- mcpcanvas tools take a file, to work on a design file or any canvas file in its own tab or on disk
- clidaftar and stop are list and bakar's other names, and sawit --help lists every alias and flag
- clisawit browse opens a page, a port or the project's dev server in Sawit's browser
- clisawit nyalakan starts stopped Sawit instances, and --ulang restarts them
- mcpevery tool tells clients whether it only reads, can destroy, or reaches past this mac
- catalogthe Dev Tools and MCP pages work from the keyboard
- terminalquitting, closing a window and restart to update ask while a terminal runs something
- appsearchable catalog for dev tools and mcp servers; config files for every coding agent
- canvasreplace the excalidraw webview with the native figcraft canvas
- canvasexports never overwrite a canvas file; headless exports find system fonts
- canvasexport_svg and export_png ops on the native canvas
- mcpbrowser_inspect, browser_design and browser_export_design
- designassets, system tokens and export in the design panel
- designinspect, colors and fonts in the design panel
- designscan, inspect and background export in the browser tab
- designasset naming, data URLs and capped downloads
- designinspect details, contrast, CSS and Tailwind output
- designDESIGN.md, DTCG, Tailwind and shadcn exports
- mcpbrowser_annotations reads the user's visual feedback
- annotatesend annotations to the terminal running Claude
- annotateannotate panel with screenshots and markers
- annotateelement details, key styles and source hints on pick
- browserbrowser_resize, viewport in app_state, ports open in the browser
- canvasimport, save as, export and copy as from the canvas menus
- browsertoolbar toggles, side panel, ⌘⇧. and clean screenshots
- browserdevice sizes with page zoom
- canvaslayers panel with pages, selection, rename, visibility, lock and drag
- keymapkeymap editor; every feature's shortcuts can be rebound
- canvasfills, strokes, effects, typography and export in the design panel
- canvasmain menu, context menu, actions palette and shortcuts sheet
- canvasdesign panel with position, appearance and auto layout
- terminalsplit panes replace herdr; Sawit no longer offers or installs it
- terminalrun, ssh and agent tools address panes
- canvasdraw the arc and corner radius handles the move tool answers
- terminalzoom panes and close exited shells in splits
- terminalherdr-style pane menu, rename and close pane
- terminalsplit panes with headers and draggable dividers
- canvasfloating toolbar, top bar and context bar on the native canvas
- terminalread a session's working folder
- canvasopen .figcraft and .excalidraw files in canvas tabs
- canvastype and compose text on the native canvas
- canvascopy and paste between canvases and from other apps
- mcpcanvas_command and canvas_commands, and canvas tools that work on .figcraft files
- canvasimport excalidraw boards and migrate the project canvas on first open
- canvasdraw the view menu's outlines, soft proof and pixel preview
- canvasfigcraft shortcuts on the native canvas, sharing keys with sawit by policy
- canvasturn mermaid into editable board shapes without a browser
- canvaspointer tools and cursors on the native canvas
- canvasget, add, update, delete, clear, replace and commands ops on the native canvas
- canvasselection, handles, guides and labels drawn over the native canvas
- canvasnative canvas view with pan, zoom, dot grid and autosave
- canvasapply element skeletons as board shapes, connectors, text and sections
- canvasopen and autosave .nyawit/canvas.figcraft with a backup before emptying
- shell-configsave your shell startup files to a private github repository, warning about secrets
- mcpremove a server from every client at once and stop a hanging install
- toolsuninstall dev tools and stop an install that hangs
- nyawitkeep a project's canvas, diagrams and exports in its .nyawit folder
- updatecheck hourly and install a downloaded update when sawit quits
- toolsupgrade dev tools from the terminal (
sawit pupuk) and MCP (upgrade_dev_tools) - mcpbrowser_* tools drive the browser tab
- browserbrowser tab with toolbar, per-project storage and agent ops
- toolsdetect newer versions and upgrade installed dev tools
Fixes
- dbwriting DATABASE_URL leaves a .env that Sawit can't read as it is, instead of replacing the whole file
- mcpa canvas tool that names a file refuses to run when the Sawit app running is too old to know it
- mcpbrowser_annotations names the key your keymap gives Annotate
- mcpan agent's new terminal tab starts in the agent's own project, not the one in front
- mcpterminal_close asks for confirm before it ends a program or the terminal you type in
- mcpremoving a host, prompt, connection or saved command, stopping processes and replacing DATABASE_URL need a confirmation
- mcpstart_instance says whether a held start can still be started anyway
- toolsthe Tools page no longer offers to uninstall Homebrew's npm, which would remove Node.js
- mcpa client config that doesn't parse is reported by line and column, never by quoting its line
- mcpwith no project named, an agent's canvas tools use the canvas of the project it works in
- clisawit asks before running a statement that writes
- mcpcanvas_get, canvas_clear and canvas_export say they act on the page on show
- mcpbrowser_export_design asks for replace: true before it replaces an earlier export
- canvaswhat an agent deletes from the canvas is kept in a .bak first, with Sawit open or closed
- browserbrowser_network shows agents a page's passwords and tokens as [redacted]
- mcpthe browser tools tell agents that ⇧⌘. opens Annotate and what clearing the console or network log drops
- editorkept changes for a file that can't be edited say where they are
- editorSave in the close or quit question saves a read-only tab
- keymapkeymap.json is saved as Sawit saves every file, keeping its permissions
- canvasthe note of a canvas file saved again says to delete it again
- workspacea project opened through a symlink opens at the folder it leads to
- toolsclosing the window or quitting while Dev Tools installs asks first, and stops the installer
- browseran agent's browser is its own project's, not the one you're looking at
- browserthe link question says what cancel does, and reload lets the page's links ask again
- keymapthe keymap editor an agent opens leaves the keyboard where you have it
- browsersend to terminal goes to the page's project and never into an SSH session
- configsaving shell files with a sign-in GitHub refuses asks for a new sign-in, not a sign-out
- installin Sawit's own terminal, the install command leaves Sawit running and says where to run it
- mcpa claude or codex CLI outside nvm's folders finds nvm's node, so installs through it work
- mcpupdating a server moves the PATH Sawit wrote with npx, so it still starts after nvm moves on
- runstop while a restart waits for the old run calls the restart off
- mcpapp_activate_tab shows another project's tab with its project, as a click does
- mcpapp_close_tab says when it asked the user first, instead of "closed"
- mcponly Claude Desktop and LM Studio entries pin where node is; editors keep your shell's PATH
- filesopen project folder replaces the folder of the project that asked
- toolsretry after a failed uninstall asks to run that uninstall again, never the installer
- files⌘Z pressed during a change that fails no longer undoes the change before it
- mcpgit_switch, git_unstage and browser_navigate say they can replace what was there
- terminalan agent's command never goes into the shell you're typing in
- uithe status bar's project path is a Copy Path button, the full path in its tooltip
- editorchanges a quit kept come back with a warning when the file changed on disk in the meantime
- filesthe name box lines up with the tree's outlined rows
- editora quit that can't ask keeps unsaved changes, and the next launch brings them back
- editorquitting, Restart to Update and closing a window ask to save unsaved files first
- filesimage, pdf, video and find in folder tabs follow a renamed or moved file
- filesthe files tab's open project folder goes through the workspace's checks
- filesthe files tab's git items follow the project's repository as it changes
- filesexpand all leaves linked folders closed, and the refresh reads open folders in one go
- filesa file opened from the files tab takes the keyboard, and the tree shows when it has it
- mcpthe MCP page says what the built-in Sawit server lets agents do
- githuba saved sign-in GitHub no longer accepts asks you to sign in again, and git stops sending it
- canvason a design file, board shapes and diagrams say what the canvas is instead of pointing at a hidden menu
- terminala new or switched-to terminal tab scrolls into view in the tab strip
- workspacea tab you open or switch to scrolls into view, not the one left of it
- workspacethe keyboard never stays on what is hidden
- files⌫ asks before moving a file or folder to the trash, and ⌘⌫ doesn't
- installthe install script points at Install CLI in the status bar, where it is
- fileswhile a name is typed in the tree, its other shortcuts leave it alone
- installthe install script waits for Sawit to quit before replacing it, and runs only once whole
- filesa paste or name that fails keeps the cut and the name typed, and an opened folder is read again
- filesthe tree's keys act only on an entry whose row is shown
- fileswork that lands after the files tab changes folder leaves the new folder alone
- filesfile changes run one at a time, so ⌘Z undoes the change it follows
- filesredo of a trash moves the file to the trash again instead of taking its tabs along
- mcpagents are told what a closed app keeps, that browser_* need the app, and what shell_config is
- mcpbrowser_navigate with no url opens the agent's project's dev server
- mcpbrowser_wait_for answers at once what waiting won't change
- mcpcanvas_command reads the files an engine command names as the agent means them
- mcpcanvas_export writes only an absolute path, and takes PNG in any case
- mcpcanvas_load, write_env and browser_screenshot read paths as every other tool does
- canvascanvas_load brings back the board a clear kept in canvas.figcraft.bak
- mcplaunch_app opens the path it names, after --, and says what it opened
- mcpterminal_run starts its shell in the folder it names, or runs nothing
- mcpa project named through a link, in another case or with .. is the open one
- mcptwo agents editing one canvas while sawit is closed get true answers and lose no edit
- searchfind in folder shows the latest search's hits and stops reading at its limit
- filesadd to .gitignore and .git/info/exclude work in worktrees, on links and odd names
- filesduplicating or pasting a folder that holds a pipe or socket finishes, leaving them out
- filesa rename to another file's name in other case no longer replaces that file
- workspacewhat is shown again has its keyboard back
- cataloga page an agent opens leaves the keyboard where the user has it
- canvasan agent's load or command that names a pipe or a link to a device is refused at once
- mcpa detection that finishes under an open sign-in sheet no longer takes the app down
- toolsZed or Cap from a Homebrew cask isn't offered their installer's removal
- catalogpaths under a home folder of a similar name aren't shortened, and the MCP search finds tags
- uithe status bar's Git button shows ⌘3 in its tooltip, as the other buttons there do
- configConfig Files lists each agent profile as its own group, and only real profiles
- canvasa panic in opening a file or in an agent's op is an error, not an abort of the app
- canvasa Mermaid diagram stopped for taking too long isn't rendered a second time
- canvasa blank file another app made keeps its page colour in the dark theme
- canvasa save records the page on show, so a file opens on it again
- canvasan agent's op waits while the user draws a path with the pen, instead of joining its undo step
- canvasa batch step can't write over the canvas file through a path taken from another step
- configdeleting a config file for good names it by its path
- configsaving shell files to GitHub warns about secrets on every save, and finds more of them
- browserbrowser_evaluate no longer leaves a false SyntaxError on the page
- browserpage scripts can no longer borrow the agent's functions to annotate
- toolsclosing the Dev Tools tab mid-install asks and stops the installer, and one tool installs at a time
- mcpa failed or stopped change shows on the server's row, naming the client
- mcpan install's result lands on its own client when Detect Again reorders the list
- mcpremote servers aren't written into Claude Desktop and other program-only clients without npx
- workspaceshortcuts keep working once the web page, tab or panel you typed in is hidden
- mcpAWS installed in another Region reads as installed there, and the Region is checked
- mcpthe MCP page finds claude, codex and npx where the Dev Tools page does
- toolsuninstall runs a tool's own removal only on the copy its installer put in place
- toolsan installer that prints a line that isn't UTF-8 keeps its output and its pipe
- toolsdev tools work when the login shell is fish, nu, PowerShell or tcsh, and a failed detection says so
- mcptwo changes to one client config at once no longer lose an entry or break the file
- mcpremoving a server keeps the others in order, and config files keep their indentation
- mcpan update keeps what you added to a server's entry, and Remove from N asks first
- canvasclosing or quitting a canvas it couldn't save keeps its edits in a copy
- canvasopening a canvas file that is a pipe or a link to a device is refused at once
- canvasa canvas that found no file refuses to save over one made there since
- canvasa clear or a load keeps the five boards before it, not only the last
- canvasan agent's cut or paste while the user types ends the typing first, so the next click keeps it
- filessaves, canvas backups and exports never write through a link a cloned repository holds
- designexports of a dev site on a .test, ddev or lvh.me name keep its assets
- browsera page can no longer open annotate and add an annotation of its own
- browseran agent's click in a web page leaves your keyboard where it is
- keymapthe editor saves a binding for an action that had none
- mcpagents name the terminal they type into, and app_run_script says where it runs
- terminalthe quit and restart question comes forward with its window
- browserAnnotate's key in a web page is the keymap's, not a fixed ⇧⌘.
- browser⌘C, ⌘V, ⌘X and ⌘A act in the web page, not in the field or panel used before it
- canvasan agent's key on the canvas does what the keyboard does with the default keys
- canvasthe canvas's tooltips, menus, palette and shortcuts sheet show the keys as you bound them
- keymapdefault shortcuts follow keyboard layouts that type keys elsewhere, as macOS menus do
- keymapa chord you add no longer delays the canvas's ⌘K, and the editor warns of chords on bound keys
- gitthe commit and comment boxes say ⌘↩ again
- keymapConfig Files' shortcuts go by its name in the keymap editor and keymap.json
- workspacethe title bar's Keymap Editor, Tools and MCP buttons bring the tab area back
- keymap⌘E no longer opens keymap.json from everywhere
- keymap⎋ and ↩ end key recording, and a hidden recorder lets go of the keyboard
- keymapthe keymap editor never writes over a keymap.json changed outside it
- keymapa default turned off with null in keymap.json shows as removed
- keymapa canvas key can be pointed at another command in the keymap editor
- keymapthe keymap editor no longer deletes your other binding of the same keys
- keymapediting a binding records the new keys instead of adding them to the old ones
- mcpapp and terminal tools go to the window with the agent's project open
- ssha server's forwarded ports are let go seconds after its last session
- sshreconnect uses the server's settings as they are now
- runrestart waits for the old run to stop, however long that takes
- terminalagents' terminal commands leave your keyboard alone and say where they ran
- clisawit --wait on a canvas file waits while its canvas is open
- canvasone canvas per file holds for a path named through a link
- canvasa canvas file's tab follows its file, and says when it saves a file that went
- canvasthe canvas you go to takes the keyboard
- canvasa drag cut off by hiding the canvas's tab ends there, and agents' edits go through again
- canvasa template, a table or an auto layout added while text is typed ends the typing first
- canvas⇧Space and ⌥⌘↩ no longer ask for a prototype player the canvas doesn't have
- canvasa name typed in the layers panel stays when the next click lands on a layer
- annotatesend to terminal prefers the agent's terminal to an idle shell
- designan export never writes through a symbolic link in the project
- designexports of two dev servers on one host no longer wipe each other
- annotateclosing the browser or clearing no longer drops unsent notes without asking
- browseran agent's read-only browser call no longer opens a browser over your tab
- browsereach project gets its own browser tab, cookies, screenshots and exports
- portsclicking a port opens it in the browser even when the browser is open
- designexports no longer save what is on your mac or network for a web page, nor send your curlrc
- designsize caps on stylesheet fetches and asset downloads hold for gzip answers
- browserbrowser_evaluate works on pages whose CSP forbids eval
- annotatepage text can no longer add fake annotations to the notes sent to an agent
- browserpage scripts can no longer forge annotations or read the agent's token
- browserwindow.open no longer replaces the page with a blank, a search or a local file
- browserpages can no longer launch other apps without asking
- browseran address webkit can't read is searched instead of crashing sawit
- mcpterminal_run answers whatever wait_secs it gets
- runrunning a script again runs it in its own folder
- terminaldropping files on a pane makes it the tab's focused pane
- terminala shell an agent typed into is kept when the first project opens
- terminalcommands sent to the terminal never land in a run panel script's shell
- terminala tab's menu and buttons act on that tab after the strip changes
- terminala tab's × closes only that tab and hands on the keyboard it had
- terminalclosing a tab left of the active one keeps you in your tab
- pagesevery page follows the window's width
- files⌫ after a folder change no longer trashes the previous folder's selection
- keymapthe editor no longer offers canvas commands the canvas has no use for
- mcpthe instructions say terminal tools address panes, not only tabs
- mcpcanvas_export writes a ~/ path in the home folder, not in a folder named ~
- files⌫ with nothing selected no longer moves the project folder to the trash
- terminalcommands sent to the terminal go to a shell at its prompt, never into a running program
- files⌫ while typing a name no longer trashes the selected entry or the project folder
- browser⇧⌘. toggles annotate when sawit has the keyboard, not only the page
- keymapshifted symbols read as the keys pressed, ⇧⌘. rather than ⌘>
- keymapshortcut hints follow rebinds
- apptyping a search in config files no longer opens or trashes the selected file
- mcpno tool writes over a canvas file
- terminalsend to terminal pastes into the tab's focused pane
- mcpapp_open_page offers the keymap page
- canvasan agent's edit waits for the user's drag to end
- canvasagent ops and the layers panel end typing through one path
- mcpthe offline canvas saver refuses what would lose data
- canvasa migrated arrow into a wide diamond joins it again
- canvasmigrated loops and sequence messages stay as excalidraw drew them
- canvasend the text being typed before a right-click or a menu command
- canvasdesign panel edits leave the canvas's open gestures alone
- canvasremoving a paint or an effect keeps the bindings after it
- designsheet fetch rejects userinfo and checks the address unless the page is local
- designlocal files are copied only for a page that is a file by the tab's URL
- designskipped videos aren't failed downloads; chosen videos are saved
- browser⌘⇧. no longer matches ⌘⇧< on non-US layouts
- designinspect picking only on the Inspect segment
- browsera shot gives up after 10 s per step; a pick adds its row without one
- designfetched sheets reach the page only as CSS, and local hosts only for their own page
- designforeground is the most-used text color readable on the background
- mcpa failed design export is reported as a tool error, with the failures first
- designReveal in Finder runs off the UI thread and reports failure
- designsaves report failures; reveal errors show; export line follows the host
- designhover, pin and HTML copy no longer overtake each other; save notes
- designscreenshot the scanned page before downloads; page answers time out
- designread oklch/lab/p3 colors, measure used fonts, cap the scan in bytes
- designrestrict asset URLs to http(s), end curl options, reuse base64_decode
- designpalette roles from opaque colors; muted skips the body colors
- annotatea failed paste copies the annotations instead
- annotateshots take turns so the overlay is never in a capture
- annotateclip picked text in the page; component-only source hints render
- browserclicks in the panel no longer take focus from its fields
- browserthe view keeps the keyboard so ⌘⇧. works from Sawit
- browseroverlay picks the walked-to parent, stays lazy and never takes pointer events
- canvasend a colour pick before other input joins its undo step
- canvaskeep the context bar inside a narrow canvas and scroll its controls
- mcponly terminal_close's pane defaults to the whole tab
- terminalidle splits stay idle; panes keep the keyboard and their names
- canvaskeep the toolbar inside a narrow canvas and scroll its buttons
- canvaskeep the context bar over the toolbar
- canvascentre a pasted image or svg in the view
- canvasselect the line on a triple click while typing, as figcraft does
- canvasfinish the pen's path on delete and resize with cmd and an arrow
- terminalan exited pane closing keeps the keyboard where it is
- terminaltrue 20x4 pane minimum, nested drag limits, live header folder
- canvaswiden the context bar's text-size menu to fit "Mixed"
- canvasshow the caret at the start of a line and in a new sticky
- canvassave canvas files atomically and never over changes made on disk
- canvascut points, not the layer, with cmd-x in vector edit mode
- canvasimport arrowheads and open an empty old canvas blank
- canvaspaint only a frame of the page and document on show
- canvaskeep a lossy open's original apart from the emptying backup
- canvasput back the file's versions and branches when a command op fails
- canvasdraw mermaid loops along their route and keep messages off notes
- canvascut frame names to their frames and guard the overlay build
- canvaskeep command ops from opening or switching documents
- canvasleave select.area off the shortcut sheet
- canvaskeep an auto gap when a grid cell aligns a frame
- canvasrefuse layer drops that leave the layers where they are
- canvasroute canvas keys as figcraft's own keyboard does
- terminaltab, shift-tab and cmd-c reach the shell and TUIs instead of the window
- portslabel deno tasks as
deno task dev, not go-task'stask dev - browserreject unknown key modifiers, tidy empty snapshot containers and the blank-page log line
Performance
- canvasread the system's fonts when a canvas first opens, not at every launch
- mcpthe MCP page reads each client config once per detection, off the async workers
- canvasa hidden canvas tab lets go of its render buffers
Features
- clisawit panen, backup, tanam, list tools and pasang
- mcptools for exports, backups, csv import, drop and truncate, dev tools and mcp servers
- quieter project labels in front of tab groups
- shell config menu to reveal, duplicate, trash or delete a file
- mcp page installs aws, cloudflare, neon, figma and other servers, with sign-in
- dev tools page to install claude code, bun, uv and more in one click
- dbexport to csv or excel, pg_dump backups, csv import, drop, truncate and bulk row edits
Fixes
- diagramswrap zoomed-out table names at underscores
Performance
- turn mermaid into canvas shapes with pele and ship only the english canvas
Other
- update README, screenshots and demo for exports, backups, dev tools, mcp catalog and new cli words
- add the /consolidate command
- format with rustfmt and fix clippy's octal-escape lint in tests
- remove the unused logo, probe example and old planning docs
Features
- sawit CLI, in-app updates and per-push releases
- prompt manager — save, search, fill and copy prompts
- MCP page covers popular AI agents and editors, with their logos
- appMCP page to install sawit-mcp into every client and profile
- coreinstall sawit-mcp into AI clients and every profile
- applanguage logos for files in the tree and tabs
- editorcompact left-aligned line numbers and icon view buttons
- appimage, PDF and video viewers
- coreimage size and PNG copies of HEIC/AVIF for the viewer
- corerender PDF pages with CoreGraphics
- appeditor with wrap, formatting, live preview and status line
- corecode formatting with Prettier and per-language formatters
- corecancel a running query
- Sawit logo, title-bar mark and macOS app bundle
- appshow/hide sidebar, center tabs and terminal dock
- appclosable Server tab and Zed-style tab context menu
- mcpsawit-mcp stdio server and DATABASE_URL to project .env
- appdatabase panel, virtual table grid and SQL editor
- coreconnection profiles, DATABASE_URL/.env, Keychain, schema, paging and SQL
- appproject file tree and tabbed code editor with save
- coreproject file listing, safe text reading and atomic save
- appbottom-dock terminal tabs that run a login shell or herdr
- coreheadless terminal emulation (PTY + alacritty_terminal) with input encoding
- appZed-style shell with server manager, port conflict panel and live logs
- corepg_ctl lifecycle with port preflight and live log tail
- coreinstance registry and app paths
- coredownload managed PostgreSQL binaries via postgresql_archive
- corediscover installed PostgreSQL binaries
- coreprobe listening ports with owner details
- coreidentify port owners (docker, homebrew, postgres.app, sawit)
- corelsof parsing and port conflict analysis
- coreparse pg_ctl status output
Fixes
- appeditor audit — disk changes, tab overflow, file tree, video keys
- corefile kinds, wider language detection, safe reads and saves
- appvirtual DB tree, disabled unreadable tables, reconnect and cancel
- appreconnect dropped connections and mark unreadable tables
- coreTLS per sslmode, pooler-safe settings, keepalives, privileges
- apptable browser shows 50-row pages ordered by primary key
- harden read-only queries, stable grid paging and input edge cases
Other
- demo video, GIF and screenshots for the README
- i18n: English UI, messages and docs
- fat LTO, size-optimised cold crates, compressed DMG
- refresh size and memory measurements
- README for the editor, formatter, previews and viewers
- README for pagination, tabs, layout, TLS, logo and bundling
- README with build, run, architecture decisions and measurements
- extend scope with text editor, herdr-capable terminal, Zed-style design
- gpui-kit window with DataTable and async SELECT version()
- workspace scaffold and tokio runtime bridge
- Sawit design and stage 1 implementation plan