Settings & appearance
Press ⌘, for Settings. Most of what you’ll reach for lives in two places — Appearance for the look, Keyboard and Hotbar for how you drive it. Everything applies live.
The look
- Theme — pick from the built-ins (Rascal Light, dark, and several more) in Settings ▸ Appearance or View ▸ Theme, or load your own (below).
- Accent colour — recolours selection, badges, and the active-pane border on top of any theme.
- Density & font size — tighten or relax row spacing and bump the base text size for a comfier list.
Keys & chrome
- Keyboard — every command is rebindable in Settings ▸ Keyboard, with live conflict detection. The full default list is in HOTKEYS.md.
- Hotbar — curate the per-pane toolbar of one-click actions in Settings ▸ Hotbar; drop your favourite commands (and plugin actions) right where you want them.
- Chrome — hide the toolbar and title bar for a quiet, content-first window, and toggle the sidebar with ⌥⌘S.
- Vim mode — flip on modal navigation and drive with
hjkl,/,dd,gg,G.
Crafting a theme
A theme is a single JSON file of hex colors. Drop it in the Themes folder and Rascal repaints every panel — list, sidebar, toolbar, path bar, and the floating finders — to match. The built-in themes are written in exactly the same format, so any of them doubles as a starting template.
The fields
Colors are #RRGGBB or #RRGGBBAA (the alpha form is handy for
the translucent selectionBackground). Only id, name, and the
color fields are required; the rest fall back to sensible defaults.
| Field | Meaning |
|---|---|
id | Unique slug. Matching a built-in’s id overrides it. |
name | Display name in the theme list. |
appearance | "light", "dark", or "automatic" (default). Drives system control tint. |
background | File-list background. |
sidebarBackground | Sidebar fill. |
toolbarBackground | Navigation toolbar fill. |
pathBarBackground | Path / breadcrumb bar fill. |
rowAlternate | Alternating-row stripe. |
labelPrimary | Primary text (file names). |
labelSecondary | Secondary text (sizes, dates). |
labelTertiary | Tertiary text (faint detail). |
accent | Highlights, badges, the active-pane border. |
selectionBackground | Selected-row fill — usually the accent at low alpha. |
baseFontPointSize | Optional. Base text size (default 13). |
rowHeight | Optional. List row height (default 22). |
monospaced | Optional. true renders the UI in a mono font. |
A complete example
A soft, warm light theme called Blossom:
{
"id": "blossom",
"name": "Blossom",
"appearance": "light",
"background": "#FFF7FA",
"sidebarBackground": "#FCEDF3",
"toolbarBackground": "#FDF1F6",
"pathBarBackground": "#FCEDF3",
"rowAlternate": "#FBEFF4",
"labelPrimary": "#3A1F2B",
"labelSecondary": "#7A5566",
"labelTertiary": "#B08C9C",
"accent": "#E0457B",
"selectionBackground": "#E0457B33",
"rowHeight": 24
}
- Save the file as
blossom.jsonin~/Library/Application Support/FinderTwo/Themes/— View ▸ Theme ▸ Reveal Themes Folder opens it for you. - Choose View ▸ Theme ▸ Reload Themes (or relaunch).
- Apply it from View ▸ Theme, ⌘⇧P → Theme: Blossom, or Settings ▸ Appearance.
Don’t start from scratch — View ▸ Theme ▸ Export Current Theme… writes the active theme into the folder as editable JSON. Because a matching id overrides a built-in, you can tweak a copy of Rascal Light and keep its name. Accent color, density, and font size from Settings layer on top of any theme.
Writing a plugin
A Rascal plugin is a tiny folder of JavaScript that adds new commands to
the app. No build step, no npm, no compiling — write a .js file,
drop it in a folder, reload. Each plugin runs in its own JavaScriptCore
context with a small ft bridge to the file manager.
Anatomy of a plugin
A plugin is a folder named <anything>.ftplugin containing exactly
two files — a manifest and a script:
quick-notes.ftplugin/
├─ manifest.json # id, name, and the actions it contributes
└─ main.js # the code, run once when Rascal loads
The manifest declares the plugin’s identity and the actions it adds.
Each action’s id is what your script hooks into; its title is
what the user sees in the Command Palette and the Plugins menu.
{
"id": "dev.you.quick-notes",
"name": "Quick Notes",
"version": "1.0",
"actions": [
{ "id": "notes.new-dated", "title": "New Dated Note" }
]
}
The ft API
Inside main.js the host exposes a global ft object. Register
a handler for each action with ft.onAction — it’s called with an
array of the currently selected file paths whenever the user runs that command.
| Function | What it does |
|---|---|
ft.onAction(id, fn) | Register a handler. fn(paths) receives an array of selected file paths. |
ft.selectedURLs() | Returns the selected paths as an array of strings. |
ft.currentURL() | Returns the active pane’s current folder path. |
ft.readFile(path) | Reads a file, returns its text (or null). |
ft.writeFile(path, text) | Writes text to a file, returns true on success. |
ft.run([cmd, …args]) | Runs a program and returns its stdout as a string. |
ft.notify(message) | Flashes a message in the active window’s status bar. |
A complete example
Here’s a working plugin that drops a dated Markdown note into whatever folder you’re viewing. It uses three of the bridge calls — read the current folder, write a file, and confirm:
ft.onAction('notes.new-dated', function (paths) {
var dir = ft.currentURL();
if (!dir) { ft.notify('Open a folder first'); return; }
// YYYY-MM-DD using the JS Date
var d = new Date();
var pad = function (n) { return ('0' + n).slice(-2); };
var stamp = d.getFullYear() + '-' + pad(d.getMonth() + 1) + '-' + pad(d.getDate());
var path = dir + '/' + stamp + '-note.md';
ft.writeFile(path, '# ' + stamp + '\n\n');
ft.notify('Created ' + stamp + '-note.md');
});
Save the two files into the plugin folder, then:
- Open Settings ▸ Advanced and click Reveal Plugins Folder — it opens
~/Library/Application Support/FinderTwo/Plugins/. Putquick-notes.ftpluginthere. - Back in Settings, click Reload Plugins (or just relaunch Rascal).
- Run it: press ⌘⇧P and type New Dated Note, or pick it from the Plugins menu.
- Want it on a key? Give it a shortcut in Settings ▸ Keyboard, or add it to a pane’s toolbar in Settings ▸ Hotbar.
A note on trust. Plugins run in-process with your full permissions — they can read and write files and launch programs (ft.run). There’s no sandbox, so only add plugins you’ve read and trust, exactly as you would a shell script.