Quicklinks
Your own links, with a slot for search terms
palupdated 2026-10-27ProductivityComes with pal1 deep link
Comes with pal, so a new install already has it; the button finds it in pal again if you removed it. This page can't see what your pal has installed.





What it does
Your own links, opened with Enter, with a {query} slot for search URLs that you fill in from the search bar. Create and edit them in the panel, start from a library of ready-made searches, and import or export them as JSON.
enteropens a link; a url with{query}asks for the term right in the search bar{selection},{clipboard}and{files}fill in by themselves, so oneentertranslates the selected text- Create a link from the tab in front, pick the browser it opens in, edit with
cmd+e - A library of 25 ready-made searches (Google, Wikipedia, GitHub, npm, MDN, Maps and more)
- Optionally switch to a tab that already has the page open instead of opening another
- Import and export as JSON; Raycast's quicklinks export is read as is
Palettes 1
-
Quicklinks
quicklinkslistinlinefallback row: Ask QuicklinksEvery quicklink by name and keyword, plus Create Quicklink and Browse Library. At the root a typed web address gets an inline Open row; when nothing matches, every {query} link appears filled with what was typed.
- ↵Open, with the {query} typed in the bar's field; in the library, add the search
- ⌘↵In the library, search with it without adding
- ⌘CCopy the url
- ⌘EEdit
- ⌃XDelete
Actions
- OpenOpens the url; a {query} link asks for it in the search bar first, one field per placeholder name.↵
- Add to my quicklinksIn the library: the search saved to your links, once.↵
- Search with itIn the library: the drill-in with the search, without saving it.⌘↵
- Copy URLThe url as stored, placeholder included.⌘C
- EditThe form, filled in.⌘E
- DeleteAsks first.⌃X
- Create quicklinkThe form, on the Create row.↵
- Import…A JSON file's links, the ones you already have skipped.↵
- Export…Your links to a JSON file.↵
- Browse libraryThe library level, on the Browse Library row.↵
Links 1
Quicklinks answers these pal:// routes from a web page, a script or a keybind; pal call is the same route from a terminal. A link from a page asks first unless you trust the extension. How links work.
-
Open a quicklink by name
openpal call quicklinks/open name=<name>name*The quicklink's name (or a keyword), case-insensitivequeryFills the {query} of a search link; without it the panel opens to ask
Settings
Extension, [extensions.quicklinks]
importA JSON array of {name, url, keywords?} listed alongside your own links, read-only; empty for none.
prefer_existing_tabAsks the browsers (as Browser Tabs does) before opening; a new tab when none has the page.
Defaults shown. Change them in pal's settings window or in the config file.
The README
Everything Quicklinks does, key by key, from the extension's own README.md
Quicklinks
Your own links, kept in the extension's storage and edited in the panel.
Enter on a link opens it. A link whose url has a {query} placeholder
(https://github.com/search?q={query}; Raycast's {argument} and
{argument name="Repo"} are read the same way) takes it as a typed
argument instead: with the cursor on the row, the search bar shows one
field per placeholder name (Query, or the name given) after the query;
Tab into them, and Enter opens the url with them filled in,
percent-encoded. A pick that arrives without the
values (pal run, an item hotkey) asks for them in a form with the same
fields. {selection}, {clipboard} and {files} in a
url are filled without asking (the text selected in the app in front, the
newest copy, or the paths selected in Finder; the SDK's placeholders,
{date} and the rest included, each percent-encoded), so
https://translate.google.com/?text={selection} opens in one Enter. The row shows the placeholder as a tag, the browser
it opens with when one is named, and the url (without https://) as its subtitle; the icon is
the site's favicon; keywords are extra words the search matches.
The palette is indexed, so a quicklink's name and keywords find it from the root, and the rows after the list are its tools:
| row | what |
|---|---|
| Create Quicklink | a form: name, url, keywords (space or comma separated), Open with (the default browser, or one of the browsers installed: Safari, Chrome, Firefox, Arc, Brave, Edge, Chromium, Vivaldi, Zen; open -a on macOS, the command on Linux). The url and the name come filled from the tab in front when Browser Tabs can name one within 400 ms (a DevTools port, a scriptable browser); another extension can push the palette with args: { create: { name, url, keywords } } and the form comes filled with that |
| Browse Library | a level of 25 ready-made searches (Google, DuckDuckGo, Bing, Wikipedia, YouTube, GitHub, GitHub code, npm, crates.io, PyPI, MDN, Stack Overflow, Amazon, Google Maps, Google Translate, X, Reddit, Hacker News, IMDb, Spotify, Unsplash, Can I use, Rust docs, Homebrew, Apple Developer): Enter adds one to your links (once; the ones you have are tagged added), cmd+enter searches with it without adding, cmd+c copies its url |
| Import Quicklinks | a form with one path field; reads a JSON array of {name, url, keywords?} (Raycast's {name, link} export too), skips the urls you already have, says how many came in |
| Export Quicklinks | writes your own links as a JSON array (no ids) to the path, ~/Downloads/pal-quicklinks.json by default, replacing the file |
A url the opener could not take (no scheme, not a path) is refused with
the message under the field; a path that cannot be read or written, the
same. The detail pane (cmd+i) leads with where the link is kept over
its name, what it asks for and the browser it opens in as chips, then the
url in a code block and its keywords.
Keyboard
| keys | action |
|---|---|
enter |
Open the url; on a {query} link, with the argument(s) typed in the bar's field(s) (Tab into them; one per placeholder name); in the library, add the search to your links |
cmd+enter |
In the library, search with it without adding |
cmd+c |
Copy URL, as stored (placeholder included); inside the library's drill-in, the filled url |
cmd+e |
Edit: the form, filled in |
ctrl+x |
Delete, after a confirm |
Marked rows (⌘-click, ⇧↓): Open opens each (a {query} link that still asks for its value is left out), Copy URL puts one a line, Delete takes them all; in the library, Add and Copy URL take several too.
| cmd+i | The detail pane |
An imported link (from the import file) has Open and Copy URL only.
Setup
Nothing to install and no permission: the links live in
<data dir>/pal/storage/quicklinks.json (Storage in the Extensions guide),
shared by every config profile.
Settings, [extensions.quicklinks]:
| key | type | default | what |
|---|---|---|---|
import |
path | (none) | A JSON array of {name, url, keywords?} listed alongside your own links, read-only, read on every listing. ~ is expanded. A file that cannot be read lists nothing and says so in the log. |
prefer_existing_tab |
boolean | false |
Opening a link first asks the browsers (as Browser Tabs does: a DevTools port, Safari and Chrome over AppleScript, Firefox's session) for a tab already on that page (the origin and path; query and fragment aside) and switches to it, the front one first; a new tab when none has it. |
A quicklink file for import looks like this:
[
{ "name": "GitHub search", "url": "https://github.com/search?q={query}", "keywords": ["gh", "code"] },
{ "name": "Wikipedia", "url": "https://en.wikipedia.org/wiki/{query}" }
]
What it does not do
- No
{query}at the root:gh rustat the root does not open a GitHub search (a query nothing matched lists every search link filled with it, as fallback rows). Enter on the link's row, then type. - Open with is a browser by name, not any app: the list is the browsers
found on the machine. A link to a
mailto:or an app's own scheme goes to the system opener whatever the field says. - Two placeholders of one name in a url are filled with the same text;
two names (
{argument name="Owner"}/{argument name="Repo"}) are two fields in the bar. The library's "Search with it" and a link route without a query go through a drill-in with one input, which fills every placeholder alike. - Import does not merge edits: a link whose url you already have is skipped, whatever its name or keywords in the file.
Platforms
macOS and Linux, the same on both.