Quicklinks

Your own links, with a slot for search terms

palupdated 2026-10-27ProductivityComes with pal󰌹1 deep link

Open in pal

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.

Quicklinks: Your links by name: a search link carries its {query} as a tag, one pinned to a browser names it
Your links by name: a search link carries its {query} as a tag, one pinned to a browser names it
Quicklinks: A search link asks for its query; Enter opens github.com/search with it filled in
A search link asks for its query; Enter opens github.com/search with it filled in
Quicklinks: Open, Copy URL, Edit, Delete on one of your links
Open, Copy URL, Edit, Delete on one of your links
Quicklinks: Create Quicklink: name, url with {query}, keywords, the browser to open with
Create Quicklink: name, url with {query}, keywords, the browser to open with
Quicklinks: The library: 25 ready-made searches, the ones you have tagged added; Enter adds one to your links
The library: 25 ready-made searches, the ones you have tagged added; Enter adds one to your links
1 of 5

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.

  • enter opens a link; a url with {query} asks for the term right in the search bar
  • {selection}, {clipboard} and {files} fill in by themselves, so one enter translates 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

  • Quicklinksquicklinkslistinlinefallback row: Ask Quicklinks

    Every 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.↵

Settings

Extension, [extensions.quicklinks]

import
empty path

A JSON array of {name, url, keywords?} listed alongside your own links, read-only; empty for none.

prefer_existing_tab
Off boolean

Asks 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 rust at 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.