Feather 0.14.3

Feather documentation

Feather is a native macOS IDE for working with AI coding assistants: an editor, terminals, source control, an API client, a problems list and a record of what changed, in one small Swift and AppKit app. This page documents every part of it, section by section.

1 · Getting started

Download, install, open a folder

Download

Feather is one disk image, Feather.dmg, about 7.1 MB. It runs on every macOS from 13 Ventura to the latest, 26 Tahoe, on Apple silicon and Intel Macs (one universal app), and is signed with a Developer ID and notarized by Apple, so macOS opens it without a warning. The Liquid Glass chrome appears on macOS 26; earlier versions get the same layout with flat panels. The Download button always fetches the newest version.

Install

  1. Open the disk image. It opens as an installer window: Feather on the left, your Applications folder on the right, and an arrow between them.
  2. Drag Feather onto Applications, then eject the disk image.
  3. Open Feather from Applications. Later versions install themselves (see Updates).

Feather ▸ Install ‘feather’ Command… puts a feather command on your path, so feather . opens the current folder from any terminal and feather src/App.tsx:42 opens a file at a line.

First launch

A window with no project shows the welcome page: three steps and your recent projects. Choose Open your project folder or press ⌘ O and pick the folder your code lives in. An empty folder is fine. Windows, tabs, splits and terminals come back the next time Feather starts (Settings ▸ General ▸ Reopen windows, files and terminals on launch).

Feather's welcome page beside the explorer of the Feather repository: the title, three numbered steps (open your project folder, start your AI assistant, watch the changes and run your app), recent projects, and links to Keyboard Shortcuts and What's New.
The welcome page, shown whenever no file is open. The links at the bottom open the shortcuts list and the release notes.

Folder trust

The first time a folder is opened, Feather asks whether you trust the files in it.

  • Trust Folder: everything works. Choose this for your own projects.
  • Restricted Mode: you can browse, search and edit, but nothing from the folder is run: no language servers, no error checkers, no Run or tasks, and no git. The status bar shows an orange Restricted Mode label; click it to trust the folder later. File ▸ Manage Folder Trust… lists every decision.

If something goes wrong at launch

  • Hold Shift while Feather starts (or run it with --safe) to open a clean window: the last session and folder are not reopened, and a card says how to get back to normal.
  • Feather ▸ Reset Feather… (or Feather --reset) clears settings, saved sessions, checkpoints, API client data, the shell files and caches, then quits. Projects are never touched.
  • No git on the Mac? Feather looks for the real git (the Command Line Tools, Xcode, then Homebrew on your shell’s path) and never runs Apple’s stub, which would block on an install dialog. Without one, Source Control offers Install Command Line Tools…; everything else works, and the git features fill in by themselves once the tools are there.

Feather sends your code nowhere. It talks to no AI service. It starts the assistant you chose in a terminal, exactly as you would; its only network traffic of its own is the daily check for updates.

2 · The window

Activity bar, sidebar, editor, terminal

A Feather window on the Feather repository: the activity bar down the left edge with a count on the Source Control icon, the explorer with git marks in the sidebar, Glass.swift open in the editor with a breadcrumb path, and a live terminal underneath. The sidebar, editor and terminal are rounded panels with a small gap between them, on chrome dyed with the project colour.
The sidebar, the editor and the terminal panel each float as a rounded panel; the gaps are also the dividers, so dragging one resizes the panes.
  • The activity bar, down the left edge, holds the sidebar’s panes as icons: Explorer, Search, Source Control, Problems, Activity and Requests. Click one to show it; click the lit one to hide the sidebar. The Source Control icon carries the number of changed files. Extensions and Settings sit at the bottom.
  • The header holds Back and Forward, the project name (click it, or press ⌘ P, to open a file by name) and two buttons at the right that show and hide the sidebar (⌘ B) and the terminal (⌘ J).
  • The sidebar shows the chosen pane. Drag its edge to resize it.
  • The editor holds tabs, a breadcrumb path above the text, and can be split side by side (⌘ \). See Editor.
  • The terminal panel sits under the editor, or in a tall column on the right (View ▸ Terminal on the Right, or the button in its header). See Terminal.
  • The status bar shows the branch with what waits to be pushed or pulled (⎇ main ↑2 ↓1), the author of the current line (blame), the error and warning counts, the Restricted Mode label, and for the open file the line and column, indentation, encoding, language and whether a language server is checking it.

Glass

On macOS 26 the window chrome is Liquid Glass: the activity bar, header, status bar and the ground under the panels use the system’s sidebar material, with the theme colour laid over it, so the desktop shows through blurred. The editor and terminal are translucent too, a little less than the sidebar so code stays easy to read. Quick Open, the Command Palette, suggestions, notice cards and the merge-conflict buttons are sheets of glass. On earlier systems, with Reduce Transparency on, or with Settings ▸ General ▸ Glass window chrome switched off, everything is the flat theme colour.

Project colours

View ▸ Project Color gives a project its own colour, dyed into the window chrome (the bars and the ground under the panels) so you can tell windows apart; see Themes and project colour. Pick from the palette or More Colors…, add a Window Border, or choose Use Color from .vscode/settings.json to read the colour VS Code’s Peacock extension set. The colour is kept in .feather/settings.json in the project, which Open Project Settings shows.

3 · Explorer

Files, and what git thinks of them

The explorer of the Feather repository: compact folder rows such as Feather.app › Contents and Sources › Feather, dots on the folders that contain changes, Swift files with M and U letters at the right edge, the selected file as a rounded bar, and the editor and terminal beside it.
Compact folders, git marks pinned to the right edge, and the selection as a rounded bar.
  • Git marks. A letter at the end of a changed file’s row, in the matching colour: M modified, U untracked, A added, R renamed, ! conflict. A folder that contains changes gets a dot, green when everything inside is new. The marks are pinned to the visible right edge of the sidebar, in a column of their own, however far the tree is scrolled sideways. Files git ignores are dimmed. The marks follow saves, staging, commits and checkouts on their own, including those made in the terminal.
  • Compact folders. Folders that hold nothing but one folder are one row, src › main › java › com › aagicorp; the folded folders recede and the last one keeps the full colour. A chain too long for the sidebar ends in an ellipsis and the tooltip holds the whole path. Unfold Folder and Fold Folder in the right-click menu open a chain into one row per folder and fold it back. Settings ▸ General ▸ Compact folders turns the folding off.
  • Sideways scroll. The tree grows to fit its widest row and scrolls sideways when names are wider than the sidebar, so nothing is cut short.
  • Rows. One row lights up under the pointer, and the selection is a rounded bar inset from the edges. Rows are laid out by hand, so folders with thousands of files scroll smoothly.
  • Buttons at the top: New File, New Folder, Refresh and Collapse All. Names are typed right in the tree: ↩ or F2 renames, Esc cancels, and a name like components/Button.tsx creates the folder too. Open tabs follow a renamed file.
  • Drag a file onto the terminal to paste its path. Settings ▸ General ▸ Reveal the open file in the Explorer keeps the tree in step with the editor.

5 · Source Control

Init, commit, publish, sync, pull, resolve

The Source Control pane (⌃ ⇧ G) is laid out like VS Code’s: the branch at the top with pull, push, sync and refresh buttons, a message box, one big button, the list of changes, and the graph underneath.

The Source Control pane on main: the branch button with pull, push, sync and refresh beside it, the message box, a blue Commit button, a note that the branch is not on a remote yet and Publish Branch will put it there, Staged Changes with a count of 5 (deleted files marked D) and Changes with a count of 111 (files marked M, with their folders dimmed).
Staged and unstaged changes with their status letters and the folder dimmed after the name. Stage, unstage and discard appear on the row under the pointer.
  • A folder without a repository shows Initialize Repository, which starts one. On a Mac without git it shows Install Command Line Tools… instead.
  • Changes and Staged Changes carry their count on a pill. Each file shows its icon, its name, its folder dimmed after it and its status letter in colour. Hover a row for stage (+), unstage (−) and discard; click it to open the diff.
  • Commit. Type the message (the hint names the branch) and press ⌘ ↩ or the button. With nothing staged the button reads Commit All.
  • The one button changes with the state. While there is something to commit it is Commit. Otherwise it is Publish Branch for a branch that is not on a remote, or Sync Changes ↑2 ↓1 when commits wait on either side. Publish pushes with tracking to origin. With no remote at all it offers to create the repository on GitHub through the gh command-line tool, private or public, or to connect a remote address, then pushes.
  • Pull, Push, Fetch and Sync Changes (⌃ ⇧ S: pull, then push) are also in the Git menu. A pull refused for a missing upstream or for uncommitted changes in the way says so in plain words, with what to do.
  • The diff view. Click a changed file to see old and new side by side with the changed words marked; stage, unstage or revert a single block from there. ⌃ ⇧ D opens the current file’s changes.
  • Blame for the current line sits in the status bar (click it for the commit); Git ▸ Toggle Blame in the Status Bar hides it. Stash, pop, apply and drop are in the branch menu and the Git menu. Open on GitHub (also GitLab and Bitbucket) opens the file and line, the repository, or its pull requests; Copy GitHub Link copies the address.
  • The graph under the list shows recent commits with their lanes and branch labels; Open Full Graph (⌃ ⇧ H) opens the whole history in a tab.
  • Git keeps up with the terminal. A commit, checkout, push or pull made in a terminal shows up by itself a moment later in the status bar, the pane and the explorer’s marks. Every git call has a time limit (two minutes; ten for fetch, pull and push), so a stuck git cannot hold a pane.
A working-tree diff of AppDelegate.swift opened from Source Control: a header reading Index to Working Tree, +15 −10, 6 blocks, with up and down arrows and Open File; the old lines on the left and the new lines on the right with the added lines tinted green and a removed line red, and folded rows saying 46 unchanged lines. The Source Control pane and its graph are on the left.
A changed file opened from the pane: old on the left, new on the right, with the unchanged stretches folded. The arrows step through the blocks.
The graph under the Source Control list: a column of commits on main with their messages, the newest carrying the main label, and a second lane joining at a merge commit.
The graph under the list; Open Full Graph opens the whole history in a tab.

Merge conflicts

A merge in progress: the Source Control button reads Resolve 1 Conflict First, the pane explains the three Accept buttons, greeting.txt is marked with a red exclamation mark, and in the editor the buttons Accept Current, Accept Incoming and Accept Both sit above the conflict block, whose lines are marked in the gutter.
A pull that ended in a conflict. The pane counts the files marked ! and explains the buttons; the editor offers them above every block.
  • A file with <<<<<<< blocks shows each block tinted, the current side green and the incoming side blue, with Accept Current, Accept Incoming and Accept Both above every block. Each is one undoable edit. diff3 blocks with a base section work too.
  • A pull or sync that ends in conflicts is a merge to finish, not an error: the button reads Resolve N Conflicts First until each file is saved and marked resolved with +, then Commit Merge. A pull with pull.rebase pauses the same way and offers Continue Rebase and Abort Rebase.

6 · Editor

Tabs, breadcrumbs, folding, cursors, previews

  • Tabs. A dot marks unsaved edits. A tab’s menu has Close Others and Close to the Right; ⇧ ⌘ T reopens a closed tab, ⇧ ⌘ ] and [ (or ⌃ ⇥) move between them. Files you have open update by themselves when something else changes them, and unsaved edits are never overwritten without asking.
  • The breadcrumb above the text shows the file’s path in the project. A request tab shows its HTTP method in colour instead of a file icon.
  • Syntax colouring for TypeScript, TSX, JavaScript, JSX, Python, Java, Dart, Kotlin, Swift, JSON, CSS, HTML, YAML, shell, Go and Rust comes from a syntax tree (Tree-sitter), updated as you type and re-read off the main thread; embedded code (<script> and <style> in HTML, css`…` and html`…` templates) is coloured as its own language. Other languages, and files over 1 MB, use pattern colouring.
  • Brackets and quotes close themselves and the matching bracket is highlighted; ⇧ ⌘ \ jumps to it. ⌘ / comments a line. Move a line with ⌥ ↑ / ↓, copy it with ⇧ ⌥ ↑ / ↓, delete it with ⇧ ⌘ K, indent with ⌘ ] / [.
  • Suggestions come from the words already in the file, and from the language server when one is running; ⌃ Space asks for them. The scan of a big file runs off the main thread, so the first keystroke does not stutter.

Multiple cursors

Glass.swift in the editor with the word isActive selected in four places at once, one cursor at each, after pressing Command D repeatedly; the enclosing enum Glass line stays pinned at the top.
Four cursors on isActive after ⌘ D three times; typing now changes all four.

⌘ D selects the word and then each next occurrence, ⇧ ⌘ L selects them all, ⌥ ⌘ ↑ / ↓ add a cursor above or below, ⌥-click adds one anywhere, Esc goes back to one. Typing, deleting, pasting and the arrow keys act at every cursor.

Folding and sticky scroll

Glass.swift with the whole enum Glass folded to one line: line 8 shows enum Glass { followed by an ellipsis badge and a chevron in the gutter, and the next line number is 135.
The whole enum Glass folded away: lines 8 to 135 are one row with an ellipsis badge.
MainWindowController.swift scrolled deep into a long method: the lines final class MainWindowController and private func buildLayout() stay pinned at the top of the editor above line 232, so the enclosing class and function are always visible.
Sticky scroll: the class and the function the visible lines belong to stay pinned at the top.

A chevron in the gutter folds a block; ⌃ ⌘ [ / ] fold and unfold, ⌃ ⇧ ⌘ [ / ] do all of them. For parsed languages a block folds exactly where it ends; elsewhere indentation decides. Searching or jumping into a folded block opens it. With sticky scroll on, the class and function you are inside stay pinned at the top while you scroll.

Code intelligence

With a language server running (see Languages): ⌘-click a name or press F12 to go to its definition, ⇧ F12 for its references, F2 to rename it everywhere, ⌥ ⌘ I for quick info. ⌃ - and ⌃ ⇧ - (or the arrows in the header) go back and forward.

Formatting and saving

Format Document (⇧ ⌥ F) and Format Selection use the language server. Settings ▸ Files & Saving has Format on save, Trim trailing whitespace on save, End files with a newline on save and Auto save: off, after a delay (one second), or when focus changes (switching tab or app). A project’s .editorconfig is honoured per file: indentation, line endings, final newline, trailing spaces.

Split, wrap, zoom

⌘ \ splits the editor to the right so two files sit side by side; ⌥ ⌘ \ moves the focus between the groups. ⌥ Z toggles word wrap; ⌘ = and ⌘ - change the font size.

Markdown and media

CONTRIBUTING.md as Markdown source in the left editor group and, beside it in a Preview tab, the same file rendered with headings, paragraphs and a code block.
A Markdown file and its preview side by side (⌥ ⌘ V). The preview follows the text as you type.
  • ⇧ ⌘ V shows a Markdown file as a formatted page in place of the text; ⌥ ⌘ V opens the preview beside it.
  • Images, PDFs and videos open in a tab of their own, in place.
  • A .http or .rest file gets a strip above it with one button per request in the file; see Requests.

7 · Languages

What works out of the box, and what a language server adds

  • With nothing installed: syntax colouring for every common language, folding, bracket matching, word suggestions, Go to Symbol in File and in Workspace, TODO comments, and Check Project for Errors with the project’s own compiler or linter (see Problems).
  • With a language server already on your Mac: errors as you type, completions, go to definition, references, rename, quick info and formatting. Feather looks for the usual servers on your shell’s path and uses the first it finds, among them typescript-language-server, pyright-langserver or pylsp, jdtls, kotlin-language-server, dart, sourcekit-lsp, gopls, rust-analyzer, clangd, intelephense, yaml-language-server, bash-language-server, marksman, taplo, lemminx, svelteserver, prisma-language-server, docker-langserver and the vscode-html, css and json language servers.
  • The status bar says which it is: “TypeScript checking on” when a server is running for the open file, “TypeScript checking off” when none was found, with a hint on how to get one from the terminal.
  • Installing languages from inside Feather is coming to the Extensions window. The earlier Languages pane has been removed in the meantime.

8 · Problems and TODOs

Every error in one list

The Problems pane on its TODOs tab: a filter field, 3 comments in 2 files, a TODO under billing.py and a TODO and a FIXME under users.ts, each with its text; users.ts is open in the editor with the two comments visible.
The TODOs tab beside Problems: every TODO, FIXME, HACK and NOTE comment in the project, grouped by file.
  • The Problems pane (⇧ ⌘ M) lists every error and warning in the project; click one to jump to the line. The same problems show as squiggles in the editor and as counts in the status bar.
  • Check Project for Errors (⇧ ⌘ B, or the play button in the pane) runs the project’s own tools and needs no language server: tsc for a tsconfig.json, pyright, pyflakes or py_compile for Python, Maven or Gradle, dart analyze, and swift build. It also runs a moment after you save a file of that kind (Check the Project for Errors After Saving). The pane says “Checked with tsc · just now”. A language server’s report for a file takes over from the checker’s, so nothing is listed twice. Nothing runs in Restricted Mode.
  • Fix This, on any problem, types a sentence with the error and its exact place into your assistant’s terminal, for you to add to and send with Return.
  • TODOs, the tab beside Problems, lists TODO, FIXME, HACK and NOTE comments across the project.
  • Paths in the terminal (src/App.tsx:42:7, a Java stack frame, a Python traceback line) open at that line with a ⌘-click.

9 · Activity

What changed since the checkpoint

A checkpoint is a snapshot of the project you can return to. Feather saves one when a folder is opened (Settings ▸ General) and whenever you press + Checkpoint; it keeps the last 30. Checkpoints work in any folder, need git installed but never touch the project’s own git history, and leave out files git ignores and files over 5 MB.

The Activity pane: Changes since the checkpoint opened at 12:37 AM, the + Checkpoint, Undo All and Review Changes buttons, a Follow changes checkbox, 59 files with +1597 −2879 lines, then a Changed list of 13 files and a New list of 14 files, each with its lines added and removed and how long ago it changed; at the bottom, 3 checkpoints taking 8.7 MB and a Clear button.
Activity on the Feather repository: every file changed or added since the checkpoint, with its line counts and age.
  • The Activity pane (⌃ ⇧ A) lists every file changed since the checkpoint, newest first, with lines added and removed; a green dot marks files changed in the last few seconds. Click a file for old and new side by side.
  • Undo All… puts every file back; new files go to the Trash and Put the Changes Back reverses it. Restore This File… does it for one. The picker at the top compares against an older checkpoint.
  • Follow changes opens each file as it is changed and flashes the changed lines, without taking the keyboard from the terminal. When an assistant stops after changing files, a card says so (“Claude Code changed 4 files”) with Review in Activity.
  • Review Changes (⌃ ⇧ R, or the button at the top of the pane) walks through every changed file in one tab, like reviewing a pull request: Keep or Undo on each block of changed lines, Keep or Move to Trash for new files, Keep Deleted or Restore for deleted ones, Keep All and Undo All… in the header. Keys: j / k move between blocks, K keeps, U undoes, ⌘ ] / [ move between files.

Clicking a file opens the same side-by-side view as Source Control’s (old on the left, new on the right); hover a block for Undo This Change.

10 · Terminal

Terminals, splits, tasks and your AI assistant

The terminal panel under the editor: a zsh shell in the Feather repository showing the output of git log --oneline -5 with the commit hashes and HEAD -> main in colour, the header reading TERMINAL main with the new, split, move-to-the-right, maximize and close buttons, and the list of shells on the right with each one's folder and branch.
The panel with a live shell, the branch in its header, and the list of shells on the right.
  • The panel shows or hides with ⌃ ` or ⌘ J; ⌃ ⇧ ` opens a new terminal in the project folder. Its header shows the branch and what the terminal in front is doing: “▶ npm run build · 12 s”, then “✓ finished in 14 s” or “✕ exit 1”. New zsh and bash shells carry a small hook that marks the start and end of every command, so this is exact; your own shell files are read as before and nothing in your home folder is changed (Terminal ▸ Open Shell Integration Files shows the hook).
  • The list on the right names each terminal with its folder and branch. Double-click a name to rename it; Change Color and Change Icon are in its menu; the trash icon appears on hover. Drag a row up or down to reorder; a row dropped just above the list lands at the top, just below it at the end. Names, colours, icons and the order come back at the next launch.
  • Splits (⌃ ⇧ 5, or the split button) put a second shell beside the one in front, up to four columns; drag the divider to size them. The list joins the members with a bracket; click any member to show the group with that one in front. Killing a member closes just that column.
  • Maximize (⌃ ⇧ M, the ⤢ button, or a double-click on the header) gives the terminal the editors’ room; the same again brings them back. Terminal on the Right (View menu, or the button in the header) moves the panel to a tall column beside the editor.
  • Links. ⌘-click a path to open it at that line, or a curl … line to turn it into a request in the API client. Copy on Select is in the Terminal menu. ls output is coloured. ⌥ ⌘ ] / [ move between terminals.
The terminal panel with two shells side by side in a split, and the list on the right where the two members of the split are joined by a bracket above two more terminals.
A split: two shells side by side, their rows joined by a bracket in the list.

AI assistant tools

  • Start AI Assistant (⌃ ⌥ A) opens a terminal in the project and starts the tool you chose. Terminal ▸ Choose AI Assistant (or Settings ▸ AI Assistant) picks Claude Code, Codex, Gemini CLI, aider, Cursor Agent or opencode, or Use Another Command… for anything that runs in a terminal. Tools that are not installed are greyed out, with the official install command and a Copy button; Feather installs nothing itself.
  • The header reads “Claude Code · working 2 m”, “waiting for you” when it asks something, and “stopped after 2 m” when it goes quiet.
  • Send Selection to Terminal (⌃ ⌥ S) and Send File Reference to Terminal (⌃ ⌥ L) type into the assistant’s prompt; ⌃ ⌥ K asks about the selected code; Fix This in Problems hands it an error. Nothing is sent until you press Return.

Notifications

Feather can tell you when a terminal finishes or asks something: a small card in the corner of the window (and a sound), or, when the window is out of view, a macOS notification and a Dock badge. Both are off by default: switch them on with Settings ▸ Terminal ▸ Tell me when a terminal is waiting and Play a sound…, or the same two switches in the Command Palette. Clicking the notification brings you back to that terminal.

Tasks and running

  • Run Task… (⌥ ⌘ R) lists what the project can run: package.json scripts, Maven and Gradle goals, Flutter commands, pytest, Django, FastAPI, Makefile targets, and your own tasks in .feather/settings.json. Type to narrow, Return to run it in a terminal. ⌥ ⇧ ⌘ R reruns the last one. Tasks report whether they finished or failed, with the exit code.
  • Run Project (⌘ R) runs the project the usual way for its type; Edit Run Command… changes it. Run Current File is ⇧ ⌘ R, Stop is ⌘ ..

11 · Preview

Your running app beside the code

  • When a terminal prints an address such as localhost:3000, Feather offers Open Preview: the app in a tab, reloading when files change (Settings ▸ Preview). The toolbar has back, forward, reload, the address and phone, tablet and full widths.
  • ⌃ ⌥ P shows the preview, ⌃ ⌥ ⇧ P shows it beside the code, ⌃ ⌥ N opens another preview tab, ⌃ ⌥ B opens the app in your browser. View ▸ Preview This Page previews a plain HTML file with no server.
  • Sign-in cookies marked “Secure” are kept for apps on http://localhost (macOS 14 or later), so signing in works in the preview. The preview exists only while its tab is open and adds nothing to the download.

12 · Requests

The API client

The Requests pane (the paper-plane icon, ⌃ ⇧ I) is an API client in the style of Postman, built in and on from the first launch; Feather ▸ Extensions… switches it off. Collections, folders and requests are plain JSON in the project’s .feather/api folder, so the team shares them through git; collections that are just for you live in your own folder, and the last 500 requests are kept as history outside the repository. A variable marked secret is stored in your Keychain and never reaches a file.

The Requests pane with the environment picker, a New menu, a collection holding a GET request and the history; and a request tab with the method pill, the address, the environment chip, the blue Send button, the tabs Params, Headers 1, Body, Auth, Checks and Variables, a Bulk edit link, a parameter table ending in an Add parameter row, and the empty answer area.
A request in its tab. The answer appears underneath (or beside it) once it is sent.

The pane

  • One row of controls: the environment picker, New ▾ (request, collection, folder, environment, import, paste cURL) and ⋯ (export, cookies, generate from OpenAPI). A filter field narrows by name or address.
  • Collections hold folders and requests, each method on a pill of one width (GET green, POST amber, PUT blue, DELETE red). +, duplicate and delete appear on the row under the pointer. Drag to reorder or to move between folders and collections; right-click for Rename, Copy as cURL, Variables…, Run, Export… and Delete.
  • The history underneath is grouped by Today, Yesterday and date; click an entry to open that request as it was sent.

A request

  • The request bar: the method on a pill of its colour, the address ({{variables}} in blue), the active environment as a chip, the blue Send button (⌘ ↩), Save (⌘ S, into the collection; a scratch request asks which) and a ⋯ menu with Cookies, Copy as cURL and where the answer goes (below or beside).
  • Tabs with counts: Params (kept in step with the address), Headers, Body (JSON or text in a real editor, a form, or multipart with files), Auth (inherit, none, bearer, basic, API key), Checks and Variables.
  • Tables end in a row that says “Add parameter” (or header, or field) and becomes real as you type. ✕ appears at the end of a row under the pointer, ⌫ removes the selected row, and there is a Description column. Bulk edit turns Params, Headers or a form body into text, one name: value a line, with // in front to switch a row off.
  • Checks are forms, not scripts: the status is 200, a JSON path equals a value, a header contains text, the time is under a limit. Variables take a value from the answer into a variable ($.token → token) for the requests after it, so a sign-in followed by authenticated requests works without code.
  • The answer: the status on a pill in its colour (green 2xx, amber 3xx and 4xx, red 5xx and failures) with the time and size; Body with a Pretty / Raw toggle, pretty-printed and coloured, with ⌘ F, Copy, Copy path (the JSON path under the caret, for a check or a variable) and Save; Headers and Cookies with their counts; Checks with ✓ or ✕ and a plain sentence each. A spinner and Cancel (Esc) while sending; answers over 50 MB offer Save to File.
  • Cookies (in the ⋯ menu, or Requests ▸ Cookies…) lists what servers set, where each applies and when it ends, with Delete and Clear All. A sign-in cookie set over http://localhost is kept and sent back, as browsers do.

Environments and variables

Environments (Local, Staging…) hold {{variables}}; pick one at the top of the pane. Manage environments… opens a sheet with the variables (tick Secret to keep a value in the Keychain), the timeout, follow redirects and certificate checking. A collection’s Variables… opens the same sheet for its own variables.

Run a collection

Run Collection or Folder… (⌥ ⇧ ⌘ R, or the right-click menu) sends every request in order with the chosen environment, in a results tab with the status, time and checks per request, and Stop, Run Again and Rerun Failed. Values captured from one answer flow into the next request.

Import, export, cURL, .http files

FormatImportExport
Postman collection v2.1 and environment (.json)yes (scripts are kept as text; :id becomes {{id}})yes
.http / .rest files (VS Code REST Client)yesyes
cURL commandpaste, or ⌘-click a line in the terminalCopy as cURL
OpenAPI 3 / Swagger (openapi.yaml, openapi.json, swagger.json)yes: one request per operation, in folders by tag; each server becomes an environment—
  • Import… takes several files or a whole folder at once; files can also be dropped on the pane. Exports never contain secret values; the export says which were left blank. Copy as cURL resolves variables and sign-in and writes uploads as -F parts.
  • .http files: open one and a strip above it lists its requests (### between them; @name = value lines are file variables). The request your cursor is in is highlighted; click its button to open it in a request tab and send it.
  • From the terminal: ⌘-click a curl … line printed by you, a script or the assistant, and it becomes a request in a “From terminal” collection in your personal folder.
  • With the assistant: Requests ▸ Ask Assistant About Last Request types a short brief at its prompt: the cURL line, the status, time and size, the first lines of the body and any failed checks. A project with an OpenAPI file at its root (or in api/, docs/, spec/) gets an offer to Generate Requests from it.

13 · Extensions

What is built in, and what is coming

  • Feather ▸ Extensions… opens the Extensions window. The catalogue of installable extensions needs a home on the web first, so for now the window shows a coming soon card and lists what is built in under it, each with a switch.
  • Built in today: the API Client (the Requests pane), on by default. Switched off, a feature costs nothing: no menu, no sidebar icon, no memory. Switched on, it appears in every window at once. Nothing is downloaded either way.
  • Coming here: installing language servers from inside Feather, as VS Code does through its extensions. Until then a server already on the Mac is used (see Languages).

14 · Updates

Automatic, signed, and sometimes required

  • Feather checks for a new version once a day, and when you choose Feather ▸ Check for Updates…. A new version shows its release notes with an Install button; Feather downloads the disk image, checks its signature against a key inside the app (so a hacked server cannot push a fake), swaps the app and relaunches with your windows as they were. Settings, sessions and checkpoints live outside the app and are untouched. When automatic updates are allowed, an ordinary update is downloaded quietly and installed at the next quit.
  • Required updates. A release that fixes a serious bug can be marked critical. Every older copy then shows it at once with no Skip button, every window carries an Update required card with Install Now until it is installed, and the download starts by itself so Install needs no wait. Feather never quits on its own: you press Install, and your windows come back.
  • What’s New. After an update, a page with the release notes opens once. It is always under Help ▸ What’s New in Feather, starts with the running version and a Check for Updates link, and is also linked from the welcome page.
  • Where the files are. Each release is published on GitHub Releases as Feather-<version>.dmg and as Feather.dmg; the Download button on this site uses the permanent releases/latest link, so it always fetches the newest version, and the update feed lives on this site.

15 · Settings

Settings, themes and shortcuts

Feather ▸ Settings… (⌘ ,) has a search box and sections like VS Code’s: type “terminal” or “save” and only the matching settings stay. Reset to Defaults is at the bottom. Every switch is also in the Command Palette.

The Settings window: a search field at the top, then the Appearance section with Theme (Dark, with Import VS Code Theme and Delete buttons), Font, Editor font size and a Scroll bar size slider; the Editor section with tab width and its checkboxes; the start of Files & Saving with Auto save; and Reset to Defaults at the bottom.
Settings: one scrolling list in sections, filtered by the search field.
SectionWhat is in it
AppearanceTheme (Dark, Light, Midnight, Solarized Dark, GitHub Light, and any you import), font, editor font size, scroll bar size.
EditorTab width, spaces for Tab, wrap long lines, line numbers, suggestions while typing, ⌘-click goes to the definition, close brackets and quotes, highlight matching brackets, sticky scroll.
Files & SavingAuto save (Off, After a Delay, When Focus Changes), trim trailing whitespace on save, end files with a newline, format on save. .editorconfig is honoured in every case.
TerminalTerminal font size, blinking cursor, copy on select, the list’s icon and name colours (or the theme’s), the sound and the notification for a waiting terminal, and how long a quiet terminal waits before it counts as finished.
AI AssistantWhich tool Start AI Assistant runs, or your own command.
GitBlame for the current line in the status bar.
PreviewReload the preview when a file changes.
GeneralReveal the open file in the Explorer, compact folders, glass window chrome, reopen windows, files and terminals on launch, ask before quitting, follow changes, save a checkpoint when a folder is opened, and the Keyboard Shortcuts… editor.

Themes

Import VS Code Theme… (Settings ▸ Appearance, the Feather menu or the Command Palette) takes any *-color-theme.json file; the theme joins the list and the Command Palette, and can be deleted from Settings again. The theme colour also tints the glass chrome.

Scroll bars

Feather draws its own scroll bars, sized by the slider in Appearance, with no corner piece where a vertical and a sideways bar meet.

Keyboard shortcuts

Help ▸ Keyboard Shortcuts (or Settings ▸ General ▸ Keyboard Shortcuts…) lists every menu command with its keys. Double-click one (or select it and choose Change), press the new keys, then Return. Reset puts one back, Reset All puts them all back, and keys used by two commands are shown in red. The menus pick up the change at once.

Per project

.feather/settings.json in a project carries its colour, its run command and its own tasks; .feather/api carries the API client’s collections and environments. Both are meant to be committed.

16 · Themes and project colour

Themes, imported themes, and a colour per project

Five themes come built in: Dark, Light, Midnight, Solarized Dark and GitHub Light. Pick one in Settings ▸ Appearance or by name in the Command Palette. Import VS Code Theme… adds any VS Code theme from its *-color-theme.json file; it joins the list and can be deleted again. The theme colours the editor, the terminal, the sidebar and the window chrome, and tints the glass on macOS 26.

The same Feather window in the Light theme: white editor and terminal, a pale sidebar and chrome, Swift coloured on white.
Light
The same window in the Midnight theme: a deep navy editor, terminal and chrome.
Midnight
The same window in the Solarized Dark theme: a dark teal editor and terminal with Solarized's yellow, blue and green on the Swift code.
Solarized Dark
The Dark theme with a teal project colour: the title bar, the activity bar, the status bar and the ground under the three panels take the teal while the editor and terminal keep the theme's own background.
A teal project colour on the Dark theme

View ▸ Project Color gives one project its own colour, so its windows are told apart at a glance. The colour is dyed into the chrome, not painted over it: the title bar, the status bar, the activity bar and the ground under the sidebar, editor and terminal take the hue, while the panels keep the theme’s background so code reads as before. Pick from the palette, More Colors…, or Use Color from .vscode/settings.json for a colour VS Code’s Peacock extension set; Window Border adds a thin frame in the same colour. The choice is kept in the project’s .feather/settings.json.

17 · Keyboard shortcuts

Every default shortcut

These are the defaults; every one can be changed in Help ▸ Keyboard Shortcuts. ⌃ is Control, ⌥ Option, ⇧ Shift, ⌘ Command.

Files and windowsPress
New File⌘N
New Window⇧⌘N
Open…⌘O
Save⌘S
Save As…⇧⌘S
Save All⌥⌘S
Close Tab⌘W
Close Other Tabs⌥⌘T
Reopen Closed Tab⇧⌘T
Close Window⇧⌘W
Settings…⌘,
Minimize⌘M
Enter Full Screen⌃⌘F
Finding thingsPress
Quick Open (files; # symbol, @ symbol in file, : line)⌘P
Command Palette⇧⌘P
Find in file⌘F
Find and Replace in file⌥⌘F
Find Next / Previous⌘G / ⇧⌘G
Use Selection for Find⌘E
Find in Project⇧⌘F
Replace in Project⇧⌘H
Go to Symbol in File⇧⌘O
Go to Symbol in Workspace⌘T
Go to Line⌃G
PanesPress
Show or hide the sidebar⌘B
Explorer⇧⌘E
Source Control⌃⇧G
Git Graph⌃⇧H
Problems⇧⌘M
Activity: What Changed⌃⇧A
Review Changes Since Checkpoint⌃⇧R
Requests (the API pane)⌃⇧I
Show or hide the terminal⌃` or ⌘J
Maximize Terminal⌃⇧M
EditingPress
Toggle Line Comment⌘/
Format Document⇧⌥F
Trigger Completion⌃Space
Move Line Up / Down⌥↑ / ⌥↓
Copy Line Up / Down⇧⌥↑ / ⇧⌥↓
Insert Line Below / Above⌘↩ / ⇧⌘↩
Delete Line⇧⌘K
Indent / Outdent Lines⌘] / ⌘[
Add Selection to Next Find Match⌘D
Select All Occurrences⇧⌘L
Add Cursor Above / Below⌥⌘↑ / ⌥⌘↓
Add a cursor anywhere⌥-click
Fold / Unfold⌃⌘[ / ⌃⌘]
Fold All / Unfold All⌃⇧⌘[ / ⌃⇧⌘]
Go to Matching Bracket⇧⌘\
Toggle Word Wrap⌥Z
Increase / Decrease Font Size⌘= / ⌘-
Code intelligencePress
Go to DefinitionF12 or ⌘-click
Find References⇧F12
Rename SymbolF2
Show Quick Info⌥⌘I
Check Project for Errors⇧⌘B
Ask AI Assistant About Selection⌃⌥K
Tabs, splits and previewsPress
Next / Previous Tab⇧⌘] / ⇧⌘[
Next / Previous Tab (also)⌃⇥ / ⌃⇧⇥
Split Editor Right⌘\
Focus Next Editor Group⌥⌘\
Toggle Markdown Preview⇧⌘V
Open Markdown Preview to the Side⌥⌘V
Show Preview (running app)⌃⌥P
Show Preview to the Side⌃⌥⇧P
New Preview Tab⌃⌥N
Open App in Browser⌃⌥B
Back / Forward⌃- / ⌃⇧-
Terminal and runningPress
New Terminal⌃⇧`
Split Terminal⌃⇧5
Next / Previous Terminal⌥⌘] / ⌥⌘[
Start AI Assistant⌃⌥A
Send Selection to Terminal⌃⌥S
Send File Reference to Terminal⌃⌥L
Run Task…⌥⌘R
Rerun Last Task⌥⇧⌘R
Run Project⌘R
Run Current File⇧⌘R
Stop⌘.
GitPress
Open Changes for Current File⌃⇧D
Sync Changes (pull, then push)⌃⇧S
Commit (in the message box)⌘↩
RequestsPress
Show the API pane⌃⇧I
New Request⌥⇧⌘N
Send Request⌘↩
Save the request⌘S
Run Collection or Folder⌥⇧⌘R