Workspace files
Every workspace can be edited as plain text, much like VS Code's settings.json. Use it to change many shortcuts at once, keep your setup in a dotfiles repo, or share a workspace with someone else.
Open the file view
- Open Settings → Workspaces and click a workspace.
- In the dialog's top-right corner, switch from the list icon (Edit visually) to the
{ }icon (Edit as a file). Rovyl remembers your choice for next time. - Edit the text, then press Apply or
Ctrl+S.
Next to Apply you'll find:
- ?: opens this page.
- Copy: copies the whole file to the clipboard.
- Revert: throws away your edits and reloads the saved workspace.
A dot next to workspace.jsonc means you have unapplied edits. Clicking Done, closing the dialog, pressing Escape or switching back to the visual view applies them first. If the file has an error, the dialog stays open and the error bar shows the line. Click the bar to jump there. After applying, Undo in the toast restores the workspace as it was.
Syntax
The file is JSON with two relaxations, the same ones VS Code allows (JSONC):
- Comments:
// to the end of the lineand/* blocks */. - Trailing commas after the last item in a list or object.
Everything else is ordinary JSON: keys and text go in double quotes, and true/false have no quotes.
Windows paths need doubled backslashes. Write "C:\\Tools\\app.exe". A single \ starts an escape sequence and is reported as an error. You can also use forward slashes ("C:/Tools/app.exe"), which Windows accepts.
Rovyl doesn't store comments or formatting. After you apply, the text is rewritten in its standard form.
Workspace keys
The file is one object that describes a single workspace.
| Key | Value | Meaning |
|---|---|---|
name required | text | The name shown on the workspace card and in the picker. Can't be empty. |
icon | icon name | The glyph on the workspace picker wheel. If you leave it out, it's Layers. See Icons. |
color | "#rrggbb" | An optional workspace colour, written as hex (3 to 8 digits). |
enabled | true / false | Whether the workspace appears on the wheel. Defaults to true. The current workspace is always shown, so false is ignored for it. |
shortcuts required | list | The shortcuts, in wheel order: the first sits at the top and the rest follow clockwise. Use [] for an empty workspace. |
Some things aren't in the file on purpose. The number key comes from the workspace's position (the first workspace gets 1), so to change it, drag the card. Which workspace is current is set with the check button in the visual view.
Shortcut keys
Every entry in shortcuts is an object with a type. Each type accepts its own set of keys. A key that type doesn't accept is an error rather than being ignored, so a typo like "lanch" is caught instead of doing nothing.
| Key | Applies to | Meaning |
|---|---|---|
type required | all | One of app, url, folder, file, command, group. |
name required | all | The label on the wheel. |
icon | all | A glyph name. See Icons. |
target required | all except group | What the shortcut opens. The rules depend on the type and are described below. |
"type": "app": an application
target is what Windows launches. It can be:
- A path to an
.exe,.lnk,.bator.cmdfile, such as"C:\\Program Files\\App\\app.exe". If the path contains spaces, you can wrap it in escaped quotes and add arguments after it:"\"C:\\Program Files\\App\\app.exe\" --profile work". - A Store or Start menu app ID:
"shell:AppsFolder\\Microsoft.WindowsTerminal_8wekyb3d8bbwe!App". Apps you add from the installed-apps list are stored this way. To find an ID, runGet-StartAppsin PowerShell.
Environment variables such as %LOCALAPPDATA% are expanded.
| Key | Value | Meaning |
|---|---|---|
launch | "normal" · "reuse" · "prewarm" | normal (the default) is a standard launch. reuse uses the process that's already running when the app supports it; for an IDE, that can switch the project in the current window. prewarm keeps the executable in the Windows file cache so later launches start faster. |
recents | true / false | IDEs only (VS Code, Cursor, JetBrains, …). Opens a submenu of the IDE's recent projects. |
terminalForRecents | true / false | When you pick a recent project, also open a terminal in that folder. |
terminalCommands | list of text | Commands to run in that terminal, in order, e.g. ["npm install", "npm run dev"]. |
openTerminal | true / false | Also open a terminal when the app itself is launched. |
workingDirectory | path | The folder that terminal and its commands start in. |
"type": "url": a website
target is an http:// or https:// address. If you leave out the scheme, https:// is added, so "github.com" becomes "https://github.com". Other schemes are rejected. The page opens in your default browser.
| Key | Value | Meaning |
|---|---|---|
launch | "normal" · "reuse" | reuse opens the page in the browser that's already running. The page may land in an existing window, and private or profile windows may be skipped. prewarm isn't available for websites. |
"type": "folder": a folder
target is a folder path, and it opens in File Explorer. Environment variables are expanded, so "%USERPROFILE%\\Downloads" works on any PC. This type has no other keys.
"type": "file": a document
target is the path to any file. It opens in whichever program Windows uses for that file type, so a .xlsx opens in Excel and a .pdf in your PDF reader. Environment variables are expanded. This type has no other keys, including no launch mode, because Windows picks the program.
"type": "command": a command line
target is a command line, passed to the shell exactly as written, including quotes, &&, ; and pipes. Use the chosen shell's own syntax for variables: $env:USERPROFILE in PowerShell, %USERPROFILE% in Command Prompt.
| Key | Value | Meaning |
|---|---|---|
shell | "powershell" · "cmd" | Which shell reads the line. Defaults to Windows PowerShell. |
window | "open" · "hidden" | open (the default) shows a console that stays open so you can read the output. hidden runs in the background with no window; an error in the first moments is still reported. |
workingDirectory | path | The folder the command runs in. Defaults to your user folder. |
"type": "group": a submenu
A group has no target. It opens a second wheel containing its items, and the hub takes you back.
| Key | Value | Meaning |
|---|---|---|
items required | list | Shortcuts, written exactly like the entries in shortcuts. Groups can contain groups, up to 8 levels deep. |
Icons
icon is the name of a Lucide icon in PascalCase: "Rocket", "FolderGit2", "TerminalSquare". Convert Lucide's names from kebab-case (folder-git-2 becomes FolderGit2). An unknown name falls back to a generic glyph.
- If you leave out
icon, the type's default is used:app→AppWindow,url→Globe,folder→Folder,file→File,command→TerminalSquare,group→Folder. - Apps, files and websites also get a picture of their own: the icon extracted from the program or the site's favicon. That picture is shown instead of the glyph, and the glyph is only a fallback. Folders, commands and groups always show the glyph.
Share and migrate
The file holds only what you'd type. It leaves out internal IDs, the machine's icon cache and the number key, so the same text works on any PC.
- Export: open the workspace, switch to the file view and click Copy. Save or send the text.
- Import into a new workspace: in Settings → Workspaces, click New workspace, open it, switch to the file view, replace the text with what you received, and apply.
- Replace an existing workspace: paste over its file and apply. Undo in the toast brings the old one back.
When you apply a file, every shortcut whose type and target are unchanged keeps its identity and its extracted icon, even if you renamed or moved it. For groups, the name is used instead of the target. New apps, files and websites have their icons fetched right after you apply.
Paths are specific to each PC. Prefer %USERPROFILE%, %LOCALAPPDATA% and shell:AppsFolder\\… IDs over hard-coded user folders so a shared file works for the person receiving it.
To move everything at once (all workspaces plus every preference), use Settings → Advanced → Export settings and Import settings instead.
Full example
// Rovyl workspace. Reference: https://rovyl-red.vercel.app/docs#workspace-file
{
"name": "Dev",
"icon": "Code",
"enabled": true,
"shortcuts": [
{
"type": "app",
"name": "VS Code",
"target": "%LOCALAPPDATA%\\Programs\\Microsoft VS Code\\Code.exe",
"launch": "reuse",
"recents": true,
"terminalForRecents": true,
"terminalCommands": ["git pull", "npm run dev"]
},
{
"type": "app",
"name": "Terminal",
"target": "shell:AppsFolder\\Microsoft.WindowsTerminal_8wekyb3d8bbwe!App"
},
{ "type": "url", "name": "GitHub", "target": "github.com", "launch": "reuse" },
{ "type": "folder", "name": "Projects", "icon": "FolderGit2", "target": "%USERPROFILE%\\src" },
{ "type": "file", "name": "Roadmap", "target": "D:\\Docs\\Roadmap.xlsx" },
{
"type": "group",
"name": "Ops",
"icon": "Server",
"items": [
{
"type": "command",
"name": "Flush DNS",
"icon": "Wifi",
"target": "ipconfig /flushdns",
"shell": "cmd",
"window": "hidden"
},
{
"type": "command",
"name": "Dev server",
"target": "npm install; npm run dev",
"workingDirectory": "D:\\src\\site"
}, // trailing commas are fine
]
}
]
}
Errors
Every error includes its line and column. These are the most common:
| Message | Fix |
|---|---|
"\T" is not an escape JSON knows | Double the backslashes in the path: "C:\\Tools". |
Expected "," or "}" here | A comma is missing at the end of the line above. |
"lanch" is not a setting of a "url" shortcut. Did you mean "launch"? | Fix the spelling, or remove a key that this type doesn't accept. |
"type" must be one of: app, url, folder, file, command, group | Use one of the six types. |
A "url" target must be an http:// or https:// address | For other kinds of link, use an app or command shortcut. |
"recents" must be true or false, without quotes | Write true, not "true". |
A workspace needs a "shortcuts" list | Add "shortcuts": []. |
Found something here that doesn't match what the app does? Open an issue at github.com/arshit09/rovyl.