the customization guide

Make it yours.

Tune the look and the keys in Settings, paint every panel with a theme written in plain JSON, and teach Rascal new tricks with a tiny JavaScript plugin — no build tools, no accounts. New here? Start with the user guide first.

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.

FieldMeaning
idUnique slug. Matching a built-in’s id overrides it.
nameDisplay name in the theme list.
appearance"light", "dark", or "automatic" (default). Drives system control tint.
backgroundFile-list background.
sidebarBackgroundSidebar fill.
toolbarBackgroundNavigation toolbar fill.
pathBarBackgroundPath / breadcrumb bar fill.
rowAlternateAlternating-row stripe.
labelPrimaryPrimary text (file names).
labelSecondarySecondary text (sizes, dates).
labelTertiaryTertiary text (faint detail).
accentHighlights, badges, the active-pane border.
selectionBackgroundSelected-row fill — usually the accent at low alpha.
baseFontPointSizeOptional. Base text size (default 13).
rowHeightOptional. List row height (default 22).
monospacedOptional. true renders the UI in a mono font.

A complete example

A soft, warm light theme called Blossom:

blossom.json
{
  "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
}
  1. Save the file as blossom.json in ~/Library/Application Support/FinderTwo/Themes/View ▸ Theme ▸ Reveal Themes Folder opens it for you.
  2. Choose View ▸ Theme ▸ Reload Themes (or relaunch).
  3. Apply it from View ▸ Theme, ⌘⇧PTheme: 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:

~/Library/Application Support/FinderTwo/Plugins/
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.

manifest.json
{
  "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.

FunctionWhat 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:

main.js
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:

  1. Open Settings ▸ Advanced and click Reveal Plugins Folder — it opens ~/Library/Application Support/FinderTwo/Plugins/. Put quick-notes.ftplugin there.
  2. Back in Settings, click Reload Plugins (or just relaunch Rascal).
  3. Run it: press ⌘⇧P and type New Dated Note, or pick it from the Plugins menu.
  4. 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.

← Back to the user guide