diff --git a/.github/workflows/script-commands.yml b/.github/workflows/script-commands.yml
index 4b139025e..cd5dea05f 100644
--- a/.github/workflows/script-commands.yml
+++ b/.github/workflows/script-commands.yml
@@ -3,20 +3,22 @@ name: Set as Executable and Generate Documentation
on:
push:
branches: [master]
+ paths-ignore:
+ - commands/README.md
+ - commands/extensions.json
jobs:
scriptCommands:
- runs-on: macos-12
+ runs-on: macos-15
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v4
with:
fetch-depth: 0
+ token: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
- name: Setup Xcode
- uses: maxim-lobanov/setup-xcode@v1
- with:
- xcode-version: 13.4.1
+ uses: raycast/github-actions/setup-xcode@xcode-16.1.x
- name: Setup GIT
uses: raycast/github-actions/setup-git@v1.1.0
@@ -42,7 +44,7 @@ jobs:
uses: ad-m/github-push-action@master
with:
branch: ${{ github.ref }}
- github_token: ${{ secrets.GITHUB_TOKEN }}
+ github_token: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
- name: Notify Failure
if: failure()
diff --git a/README.md b/README.md
index a1a82d593..fcccd6f14 100644
--- a/README.md
+++ b/README.md
@@ -3,10 +3,10 @@
diff --git a/commands/README.md b/commands/README.md
index 509395197..88289b6ac 100644
--- a/commands/README.md
+++ b/commands/README.md
@@ -25,13 +25,17 @@ This repository contains sample commands and documentation to write your own one
### Categories
+- [Ai](#ai)
+ - [Gemini](#gemini)
- [Apps](#apps)
- [Agenda](#agenda)
- [Amphetamine](#amphetamine)
- [Baremetrics](#baremetrics)
- [Bartender](#bartender)
- [Bear](#bear)
+ - [BusyCal](#busycal)
- [Chatgpt](#chatgpt)
+ - [Claude](#claude)
- [Cleanshot](#cleanshot)
- [Craft](#craft)
- [DND Me](#dnd-me)
@@ -45,6 +49,7 @@ This repository contains sample commands and documentation to write your own one
- [ExpressVPN](#expressvpn)
- [Fantastical](#fantastical)
- [Ferdi](#ferdi)
+ - [Find My](#find-my)
- [Focus](#focus)
- [GoodLinks](#goodlinks)
- [HazeOver](#hazeover)
@@ -72,6 +77,7 @@ This repository contains sample commands and documentation to write your own one
- [Session](#session)
- [SideNotes](#sidenotes)
- [Sip](#sip)
+ - [Stickies](#stickies)
- [Sublime](#sublime)
- [Surfshark](#surfshark)
- [Tailscale](#tailscale)
@@ -108,6 +114,7 @@ This repository contains sample commands and documentation to write your own one
- [Firebase](#firebase)
- [Mood Meter](#mood-meter)
- [Open Weather](#open-weather)
+- [Dashboards](#dashboards)
- [Developer Utils](#developer-utils)
- [Aws](#aws)
- [Brew](#brew)
@@ -131,7 +138,9 @@ This repository contains sample commands and documentation to write your own one
- [Apple Tv](#apple-tv)
- [Cmus](#cmus)
- [Endel](#endel)
+ - [Lowfi](#lowfi)
- [Sonos](#sonos)
+ - [Speaker Setup](#speaker-setup)
- [Spotify](#spotify)
- [Tidal](#tidal)
- [foobar2000](#foobar2000)
@@ -153,11 +162,20 @@ This repository contains sample commands and documentation to write your own one
- [Samsung TV](#samsung-tv)
- [System](#system)
- [Audio](#audio)
+ - [Magic Keyboard Switcher](#magic-keyboard-switcher)
- [VPN](#vpn)
- [Vpnutil](#vpnutil)
- [Web Searches](#web-searches)
- [WordPress](#wordpress)
+## Ai
+
+#### Gemini
+
+| Icon | Title | Description | Author | Args | Templ | Lang |
+| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
+ | | [Ask Gemini](ai/gemini/gemini.js) | Open Gemini in Chrome browser and submit a prompt with optional selected text as context | [Est7](https://github.com/est7) and [Nimo Beeren](https://github.com/nimobeeren) | ✅ | |
|
+
## Apps
#### Agenda
@@ -202,12 +220,24 @@ This repository contains sample commands and documentation to write your own one
|
| [Open Todos](apps/bear/bear-todo.sh) | Open the Todo section in Bear. | [Tanay Nistala](https://github.com/tanaynistala) | ✅ | |
|
|
| [Search](apps/bear/bear-search.sh) | Search notes by keyword and/or tag in Bear. | [Tanay Nistala](https://github.com/tanaynistala) | ✅ | |
|
+#### BusyCal
+
+| Icon | Title | Description | Author | Args | Templ | Lang |
+| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
+ |
| [Create Event/Task](apps/busycal/new-busycal-event-or-task.applescript) | Creates new events or tasks in BusyCal. | [Annie Ma](www.anniema.co) | ✅ | |
|
+
#### Chatgpt
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
|
| [chatgpt](apps/chatgpt/chatgpt-open-safari.applescript) | Open chatgpt in safari | [gintonyc](https://raycast.com/gintonyc) | | |
|
+#### Claude
+
+| Icon | Title | Description | Author | Args | Templ | Lang |
+| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
+ | ✨ | [Ask Claude](apps/claude/claude.js) | Open Claude in Chrome browser and submit a prompt | [Nimo Beeren](https://github.com/nimobeeren) | ✅ | |
|
+
#### Cleanshot
| Icon | Title | Description | Author | Args | Templ | Lang |
@@ -346,6 +376,12 @@ This repository contains sample commands and documentation to write your own one
|
| [Open Service by Index](apps/ferdi/ferdi-open-service-by-index.applescript) | N/A | [Jakub Lanski](https://github.com/jaklan) | ✅ | |
|
|
| [Open Service by Name](apps/ferdi/ferdi-open-service-by-name.applescript) | N/A | [Jakub Lanski](https://github.com/jaklan) | ✅ | |
|
+#### Find My
+
+| Icon | Title | Description | Author | Args | Templ | Lang |
+| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
+ |
| [Find My Phone (Auto Sound)](apps/find-my/fmp.js) | N/A | Raycast | | |
|
+
#### Focus
| Icon | Title | Description | Author | Args | Templ | Lang |
@@ -399,6 +435,7 @@ This repository contains sample commands and documentation to write your own one
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
+ |
| [CaptchaFromMail](apps/mail/copy-captcha-from-mail.py) | Copy the captcha from the emlx file. | [RealTong](https://raycast.com/RealTong) | | |
|
| 📧 | [Copy Foreground Mail Deeplink](apps/mail/copy-foreground-mail-deeplink.applescript) | Copies the foreground Mail deeplink | [Jesse Claven](https://github.com/jesse-c) | | |
|
#### Medo
@@ -544,6 +581,7 @@ This repository contains sample commands and documentation to write your own one
|
| [Close Other Tabs](apps/safari/safari-close-other-tabs.applescript) | Close all tabs besides the currently active tab. | [Thomas Paul Mann](https://github.com/thomaspaulmann) | | |
|
|
| [Close Tabs to the Left](apps/safari/safari-close-tabs-left.applescript) | Close all tabs to the left side of the currently active tab. | [Thomas Paul Mann](https://github.com/thomaspaulmann) | | |
|
|
| [Close Tabs to the Right](apps/safari/safari-close-tabs-right.applescript) | Close all tabs to the right side of the currently active tab. | [Thomas Paul Mann](https://github.com/thomaspaulmann) | | |
|
+ |
| [Download Current URL](apps/safari/safari-download-url.applescript) | Download the currently active tab's URL. | [Michael Bianco](https://github.com/iloveitaly) | | |
|
|
| [Duplicate Tab](apps/safari/safari-duplicate-tab.applescript) | Duplicates and opens the currently active tab. | [Thomas Paul Mann](https://github.com/thomaspaulmann) | | |
|
|
| [Open Bing with Edge User-Agent](apps/safari/safari-bing-edge-user-agent.applescript) | Open Bing in Safari with Edge User-Agent | [smxl](https://github.com/smxl) | | |
|
|
| [Open Safari URL in Chrome](apps/safari/safari-current-page-url-in-chrome.applescript) | Open current Safari URL in new tab in Chrome | [Dave Lehman](https://github.com/dlehman) | | |
|
@@ -574,6 +612,12 @@ This repository contains sample commands and documentation to write your own one
|
| [Open Contrast Checker](apps/sip/sip-open-check-contrast.sh) | Open Sip Contrast Checker. | [Sip](https://twitter.com/sip_app/) | | |
|
|
| [Show Color Picker](apps/sip/sip-show-picker.sh) | Pick a color value from your screen. | [Sip](https://twitter.com/sip_app/) | | |
|
+#### Stickies
+
+| Icon | Title | Description | Author | Args | Templ | Lang |
+| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
+ |
| [New Floating Sticky Note](apps/stickies/new-floating-sticky.applescript) | This script creates a new floating note in the Apple Stickies application | [Annie Ma](http://www.anniema.co/) | | |
|
+
#### Sublime
| Icon | Title | Description | Author | Args | Templ | Lang |
@@ -595,7 +639,7 @@ This repository contains sample commands and documentation to write your own one
|
| [Connect](apps/tailscale/tailscale-connect.sh) | Connects to Tailscale | [Ross Zurowski](https://github.com/rosszurowski) | | |
|
|
| [Disconnect](apps/tailscale/tailscale-disconnect.sh) | Disconnects from Tailscale | [Ross Zurowski](https://github.com/rosszurowski) | | |
|
|
| [Get IP](apps/tailscale/tailscale-ip.sh) | Gets your private Tailscale IP | [Ross Zurowski](https://github.com/rosszurowski) | | |
|
- |
| [Switch Account](apps/tailscale/tailscale-switch.sh) | Switches Tailscale networks | [Ross Zurowski](https://github.com/rosszurowski) | | |
|
+ |
| [Switch Account](apps/tailscale/tailscale-switch.sh) | Switches Tailscale networks | [Ross Zurowski](https://github.com/rosszurowski) and [Daniel Schoemer](https://github.com/quatauta) | | |
|
#### Terminal Translate
@@ -694,6 +738,7 @@ This repository contains sample commands and documentation to write your own one
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
+ | 🤖 | [Open profile](apps/iterm/iterm-open-profile-in-new-window.applescript) | N/A | [sunrisewestern](https://github.com/sunrisewestern) | ✅ | |
|
|
| [Run Shell Command](apps/iterm/iterm-run-shell-command.applescript) | N/A | [Andrei Borisov](https://github.com/andreiborisov) | ✅ | |
|
#### iconsur
@@ -714,6 +759,7 @@ This repository contains sample commands and documentation to write your own one
| 🥽 | [Current Website to Private Browser](browsing/to-private-browsing.sh) | Open the current site in a private browser | [raulanatol](https://github.com/raulanatol) | | |
|
|
| [Go to Outline](browsing/go-to-outine.sh) | Open the website at Outline | [Ronan Rodrigo Nunes](https://ronanrodrigo.dev) | ✅ | |
|
| 🌐 | [New Browser Window](browsing/new-browser-window.sh) | Open new window in default browser | [Levi Nelson](https://github.com/LeviticusNelson) | | |
|
+ | 📚 | [Open Multiple Websites on Safari](browsing/open-multiple-websites-on-safari.template.sh) | Open multiple websites on Safari using list of URLs | [Yasutaka Nishii](https://github.com/ystknsh) | | ✅ |
|
| 🤖 | [Open in guest profile](browsing/open-in-guest-profile.sh) | Open current website in guest profile/mode | [JD Solanki](https://github.com/jd-solanki) | | |
|
|
| [Open without CORS](browsing/open-chrome-without-cors.sh) | Open chrome with web security option disabled. | [Tahsin Yazkan](https://github.com/thsnyzkn) | | |
|
|
| [Peek a link](browsing/peekalink.template.sh) | Use [Peekalink.io](https://peekalink.io) API to peek specified URL. | [Caleb Stauffer](https://github.com/crstauf) | ✅ | ✅ |
|
@@ -754,6 +800,7 @@ This repository contains sample commands and documentation to write your own one
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
+ | 🎲 | [Random Emoji](communication/emojis/random-emoji.sh) | Copy a random emoji to the clipboard. | [Tomohiro Nishimura](https://github.com/Sixeight) | | |
|
| 📙 | [Search Emojis](communication/emojis/emojis-search.sh) | Search for emojis related to input. | [Caleb Stauffer](https://github.com/crstauf) | ✅ | |
|
| 📙 | [Search and Copy First Related Emoji](communication/emojis/emoji-copy.sh) | Copy first emoji related to input. | [Caleb Stauffer](https://github.com/crstauf) | ✅ | |
|
@@ -789,6 +836,7 @@ This repository contains sample commands and documentation to write your own one
|
| [Clear Slack DND](communication/slack/clear-slack-DND-status.sh) | Clear DND Status in Slack | [Sam Ching](https://github.com/samching) | | |
|
| 🧼 | [Clear Status](communication/slack/clear-slack-status.template.sh) | Clear your status in Slack. | [Thomas Paul Mann](https://github.com/thomaspaulmann) | | ✅ |
|
|
| [Jump to...](communication/slack/slack-jump-to.applescript) | N/A | [Jakub Lanski](https://github.com/jaklan) | ✅ | |
|
+ |
| [Launch Dev Mode](communication/slack/slack-dev-mode.sh) | Open Slack with the Developer Menu enabled. ⌘⌥I to access the Developer Menu. If you find it's not working, quit Slack and run this command again. | [Cody Carrell](https://raycast.com/sourcecody) | | |
|
|
| [Open Workspace by Index](communication/slack/slack-open-workspace-by-index.applescript) | N/A | [Jakub Lanski](https://github.com/jaklan) | ✅ | |
|
|
| [Open Workspace by Name](communication/slack/slack-open-workspace-by-name.applescript) | N/A | [Jakub Lanski](https://github.com/jaklan) | ✅ | |
|
|
| [Send Message in Channel](communication/slack/slack-send-message.applescript) | This script posts a message text to a slack channel and sets active status (defaults to random good morning message in #general) | [Faris Aziz](https://github.com/farisaziz12) | ✅ | |
|
@@ -816,6 +864,7 @@ This repository contains sample commands and documentation to write your own one
| ⏱ | [Convert Epoch to Human-Readable Date](conversions/epoch-to-human-date.sh) | Convert epoch to human-readable date. | [Siyuan Zhang](https://github.com/kastnerorz) | ✅ | |
|
| 📋 | [Convert Google Docs Rich Text HTML to Markdown](conversions/google-docs-to-markdown.sh) | A script to take the HTML pastboard type filled by google docs and convert it to nicely formatted markdown | [Michael Bianco](https://github.com/iloveitaly) | | |
|
| ⏱ | [Convert Human-Readable Date To Epoch](conversions/human-date-to-epoch.sh) | Convert human-readable date to timestamp epoch. | [Siyuan Zhang](https://github.com/kastnerorz) | ✅ | |
|
+ | 🔄 | [Convert Markdown to Telegram Format](conversions/markdown-to-telegram.py) | Convert Markdown formatting to Telegram format, excluding processing inside code blocks or quotes | [Maxim Borzov](https://github.com/borzov) | | |
|
| 📋 | [Convert Raw HTML to Rich Text on Clipboard](conversions/raw-html-to-rich-text-clipboard.sh) | This script will convert raw HTML on your clipboard to rich text. It requires pandoc to be installed on your system. | [Michael Bianco](https://github.com/iloveitaly) | | |
|
| 📹 | [Create GIF from video](conversions/create-gif-from-video.py) | Create a GIF from video, by default it takes the last screen record video | [Quentin Eude](https://github.com/qeude) | ✅ | |
|
| 🎨 | [Hex to RGB](conversions/hex-to-rgb.sh) | Convert hexadecimal color value to RGB value. | [Caleb Stauffer](https://github.com/crstauf) | ✅ | |
|
@@ -827,6 +876,7 @@ This repository contains sample commands and documentation to write your own one
| 📝 | [Rich Text to Markdown](conversions/rich-text-clipboard-to-markdown.sh) | Convert rich text clipboard data to GitHub Flavored Markdown using Pandoc | [Adam Zethraeus](https://github.com/adam-zethraeus) | | |
|
| | [Screenshot QR Code to Clipboard](conversions/qr-code-screenshot-to-text.sh) | Decode QR Code from screenshot to clipboard using https://qrserver.com/ | [Diego Lopes](https://github.com/Dihgg) | | |
|
| 🔗 | [Simple Markdown Link Generator](conversions/inputs-to-markdown-link.sh) | Quickly and simply generate a markdown formatted link with your specified URL and title. | [atzzCokeK](https://github.com/atzzCokeK) | ✅ | |
|
+ | 📝 | [Space Fixer](conversions/space-fixer.sh) | Add spaces between Chinese and English, number or symbols. | [RealTong](https://raycast.com/RealTong) | | |
|
| 🔠 | [Strikethrough Text](conversions/strikethrough.sh) | Converts given text (or clipboard if no argument) to t̶e̶x̶t̶ | [Jakub Lanski](https://github.com/jaklan) | ✅ | |
|
| ✂️ | [Trim Newlines and Tabs](conversions/trim-newlines-tabs.sh) | Trim newlines and tabs from clipboard content. | [Caleb Stauffer](https://github.com/crstauf) | | |
|
| 🦸♀️ | [Unicode Superscript](conversions/unicode-superscript.sh) | Convert clipboards text to fake unicode superscript | [Adam Zethraeus](https://github.com/adam-zethraeus) | ✅ | |
|
@@ -850,7 +900,7 @@ This repository contains sample commands and documentation to write your own one
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
- | 🕌 | [Prayer Times (Diyanet)](culture/prayer-times-diyanet.sh) | Prayer Times grabbed from the Diyanet's Official Website for people located in Türkiye. | [Emircan Erkul](https://emircanerkul.com) | | |
|
+ | 🕌 | [Prayer Times](culture/prayer-times.sh) | Prayer Times grabbed from the aladhan.com. | [Emircan Erkul](https://emircanerkul.com) | | |
|
## Dashboard
@@ -905,6 +955,12 @@ This repository contains sample commands and documentation to write your own one
| ⛅️ | [Current Weather](dashboard/open-weather/weather-current.template.sh) | Get current weather from OpenWeather | [Marek Mašek](https://github.com/marekmasek) | | ✅ |
|
| ⛅️ | [Weather Forecast](dashboard/open-weather/weather-forecast.template.sh) | Get weather forecast from OpenWeather | [Marek Mašek](https://github.com/marekmasek) | | ✅ |
|
+## Dashboards
+
+| Icon | Title | Description | Author | Args | Templ | Lang |
+| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
+ | 💾 | [Speed Test](dashboards/iperf-speed-test.template.sh) | Runs an iPerf Speed Test. | [Sam Wright](https://raycast.com/samywamy10) | | ✅ |
|
+
## Developer Utils
| Icon | Title | Description | Author | Args | Templ | Lang |
@@ -926,6 +982,7 @@ This repository contains sample commands and documentation to write your own one
| 💻 | [Decode Base64](developer-utils/decode-base64.sh) | Decodes clipboard content to Base64 and copies it again. | Raycast | | |
|
|
| [Decode JWT](developer-utils/decode-jwt.sh) | Decodes JSON web token from the clipboard. | Raycast | | |
|
| 💻 | [Decode URL](developer-utils/decode-url.sh) | Decodes clipboard content url and copies it again. | Raycast | | |
|
+ | ⌨️ | [Delete Current Line](developer-utils/delete-current-line.applescript) | This script deletes the line at cursor position. | [Annie Ma](http://www.anniema.co/) | | |
|
| 🌍 | [Dig](developer-utils/dig.sh) | Perform a dig command with the specified options | Tommaso Panozzo | ✅ | |
|
| 💻 | [Encode Base64](developer-utils/encode-base64.sh) | Encodes clipboard content to Base64 and copies it again. | Raycast | | |
|
| 💻 | [Encode URL](developer-utils/encode-url.sh) | Encodes clipboard content url and copies it again. | Raycast | | |
|
@@ -961,6 +1018,7 @@ This repository contains sample commands and documentation to write your own one
| 🔐 | [Strong Password Generator](developer-utils/strong-password-generator.sh) | Generate a strong password of requested character length | [Nitin Gupta](https://twitter.com/gniting) | ✅ | |
|
| 🕒 | [Time Between Dates](developer-utils/time-between-dates.js) | Given two dates returns the time between them in multiple units of measure. | [Federico Miraglia](https://github.com/Mitra98t) | ✅ | |
|
| 🕒 | [Time Calculator](developer-utils/time-calculator.js) | Add or Subtract specified amount of time from given date. | [Federico Miraglia](https://github.com/Mitra98t) | ✅ | |
|
+ | 🔒 | [Toggle SSH SOCKS Tunnel](developer-utils/toggle_ssh_proxy_tunnel.template.sh) | Toggles an SSH SOCKS proxy tunnel on and off. | [Andrii Barabash](https://github.com/AndriiBarabash) | | ✅ |
|
| 🔠 | [Transform Case](developer-utils/transform-case.sh) | Transform the case of clipboard content. Defaults to lower case if no conversion type is specified. | [Nitin Gupta](https://twitter.com/gniting) | ✅ | |
|
| ✂ | [Trim Git Commit Hash](developer-utils/trim-git-commit-hash.sh) | Trim full git commit hash down to seven characters. | [Caleb Stauffer](https://github.com/crstauf) | ✅ | |
|
| 🔗 | [Unshorten URL](developer-utils/unshorten-url.sh) | Unshortens clipboard content url and copies the result again. | [Nikita Galaiko](https://github.com/ngalaiko) | | |
|
@@ -972,6 +1030,7 @@ This repository contains sample commands and documentation to write your own one
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| 🤖 | [Find AWS Region by IP](developer-utils/aws/whatismyregion.sh) | Copies the AWS IPv4 to the clipboard. | [Oğuzhan Yılmaz](https://github.com/c1982) | | |
|
+ |
| [S3 Download](developer-utils/aws/amazon-s3-download.sh) | Download from Amazon S3 via URL | [Chris Cook](https://github.com/zirkelc) | ✅ | |
|
|
| [Single Sign-On](developer-utils/aws/aws-sso-util.sh) | Login to AWS using aws-sso-util | [David Molinero](https://github.com/doktor500) | | |
|
#### Brew
@@ -1119,6 +1178,7 @@ This repository contains sample commands and documentation to write your own one
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
+ | | [Calculate CAGR Percentage](math/calculate-CAGR.sh) | Calculate the CAGR between "from" and "to" values over given "years," then copy the result. | [Samuel Barton](https://github.com/samueldbarton) | ✅ | |
|
| 📈 | [Calculate Growth %](math/calculate-growth.sh) | Calculate percentage increase between "from" and "to" values. | [Petr Nikolaev](https://github.com/pitnikola) | ✅ | |
|
| 🔢 | [Generate Random Number](math/random-number.sh) | Generate a number between a given range (inclusive) and then copy the value | [Matt Gleich](https://mattglei.ch) | ✅ | |
|
| 🧮 | [LaTeX Calculator](math/latex-calculator.py) | Evaluate LaTeX expressions and get the product copied to your clipboard | [Matt Gleich](https://mattglei.ch) | ✅ | |
|
@@ -1192,6 +1252,12 @@ This repository contains sample commands and documentation to write your own one
|
| [Workout](media/endel/endel-scenarios-workout.sh) | Run Workout scenario at Endel | [Sergey Korobyin](https://github.com/huangsemao) | ✅ | |
|
|
| [Yoga](media/endel/endel-scenarios-yoga.sh) | Run Yoga scenario at Endel | [Sergey Korobyin](https://github.com/huangsemao) | ✅ | |
|
+#### Lowfi
+
+| Icon | Title | Description | Author | Args | Templ | Lang |
+| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
+ | | [Lowfi](media/lowfi/lowfi.sh) | N/A | Raycast | | |
|
+
#### Sonos
| Icon | Title | Description | Author | Args | Templ | Lang |
@@ -1201,6 +1267,12 @@ This repository contains sample commands and documentation to write your own one
|
| [Volume Down](media/sonos/sonos-volume-down.sh) | Raises volume of Sonos. | [David Blackman](https://github.com/whizziwig) | | |
|
|
| [Volume Up](media/sonos/sonos-volume-up.sh) | Raises volume of Sonos. | [David Blackman](https://github.com/whizziwig) | | |
|
+#### Speaker Setup
+
+| Icon | Title | Description | Author | Args | Templ | Lang |
+| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
+ | 🔊 | [Speaker Setup](media/speaker-setup/speaker-setup.sh) | N/A | [Kailash Yellareddy](https://github.com/kyellareddy) | | |
|
+
#### Spotify
| Icon | Title | Description | Author | Args | Templ | Lang |
@@ -1237,6 +1309,7 @@ This repository contains sample commands and documentation to write your own one
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
+ | 🫥 | [Hide Current Application](navigation/hide-application.applescript) | Easily hide your foremost application | [Chris Bailey](https://raycast.com/that70schris) | | |
|
|
| [JustFocus](navigation/justfocus.applescript) | N/A | Jax0rz | ✅ | |
|
| 📂 | [Open Applications](navigation/open-applications.sh) | Opens the Applications folder in the Finder. | Raycast | | |
|
| 🖥 | [Open Clipboard URL on Desktop](navigation/open-desktop-url-from-clipboard.swift) | Opens the URL from the clipboard in the desktop app. | Raycast | | |
|
@@ -1415,6 +1488,7 @@ This repository contains sample commands and documentation to write your own one
| 💻 | [Add Spacer to Dock](system/add-spacer-to-dock.sh) | Adds an invisible icon to the Dock as a separator. | [Alexandru Turcanu](https://github.com/Pondorasti) | | |
|
| 🔋 | [Battery Info](system/battery-info.sh) | Get Battery percentage, time remaining, charge status, charger wattage, total cycles etc. | [Fahim Faisal](https://github.com/i3p9) | | |
|
| ☀️ | [Brightness](system/brightness.sh) | Set system brightness | [Antonio Dal Sie](https://github.com/exodusanto) | ✅ | |
|
+ | 🖥️ | [CPU Usage](system/inline-cpu-usage-percent.sh) | Display CPU usage percent | [Juan Luis Romero](https://github.com/JuanluR8) | | |
|
| ☕️ | [Caffeinate](system/caffeinate-status.swift) | Shows caffeinate status and time left if it's running | [Yan Smaliak](https://github.com/ysmaliak) | | |
|
| ☕️ | [Caffeinate](system/caffeinate-status.sh) | Shows caffeinate status | [Yan Smaliak](https://github.com/ysmaliak) | | |
|
| 💻 | [Capture Fullscreen to Clipboard](system/capture-fullscreen-to-clipboard.sh) | This script screenshots the entire screen and saves it to the clipboard. | [Aaron Miller](https://github.com/aaronhmiller) | | |
|
@@ -1423,8 +1497,10 @@ This repository contains sample commands and documentation to write your own one
| 💻 | [Capture Screen Selection to Desktop](system/capture-screen-selection-to-desktop.sh) | This script screenshots the selected area and saves it to the desktop. | [Aaron Miller](https://github.com/aaronhmiller) | | |
|
| 🔪 | [Close All Finder Windows](system/close-finder-windows.applescript) | Close all open Finder windows. | [Alexander Steffen](https://github.com/alexjsteffen) | | |
|
| 📅 | [Copy Availability](system/copy-availability.swift) | Copies the calendar availability of today. | Raycast | ✅ | |
|
+ | | [Copy Finder Selection to Clipboard](system/copy-selection-to-clipboard.applescript) | Copy contents of selected items in Finder to the clipboard. If there's more than one file selected, they will be combined and added to the clipboard. | [Felipe Turcheti](https://felipeturcheti.com) | | |
|
| 💁 | [Copy Last Download](system/copy-last-download.swift) | Copy the last downloaded file to the clipboard. | Raycast | | |
|
| 📸 | [Copy Last Screenshot](system/copy-last-screenshot.swift) | Copies the last screenshot to the clipboard. | Raycast | | |
|
+ | 📝 | [Copy Meeting Summary](system/meeting_summary_script.swift) | Copies a summary of today's meetings to the clipboard. | Raycast | | |
|
| 📟 | [Copy Wi-Fi Password](system/wifi-password.sh) | Copy Wi-Fi password from current session | [Astrit Malsia](https://github.com/astrit) | | |
|
| 📧 | [Create Email](system/new-email.sh) | Opens default email application, and creates a new email with the given inputs. | [Brandon Escamilla](https://github.com/brandonescamilla) | ✅ | |
|
| 📄 | [Create New File](system/create-new-file.applescript) | Create files in the front window or desktop of the visit | [LokHsu](https://github.com/lokhsu) | | |
|
@@ -1440,6 +1516,8 @@ This repository contains sample commands and documentation to write your own one
| 💿 | [Disk Usage](system/disk-usage.sh) | Show disk usage for / (root) | [Jesse Claven](https://github.com/jesse-c) | | |
|
| 🔕 | [Dismiss Notifications](system/dismiss-notifications.applescript) | Close all notification alerts staying on screen, e.g., Calendar notifications. | [benyn](github.com/benyn) | | |
|
| 🔕 | [Do Not Disturb](system/do-not-disturb.sh) | Do Not Disturb | [Antonio Dal Sie](https://github.com/exodusanto) | ✅ | |
|
+ | 🤖 | [Dock Position](system/dock-set-position.sh) | Set the position of the Dock in the screen | [Jelte Lagendijk](https://raycast.com/j3lte) | ✅ | |
|
+ | 🤖 | [Dock Set Autohide](system/dock-set-autohide.sh) | Set the Dock autohide | [Jelte Lagendijk](https://raycast.com/j3lte) | ✅ | |
|
| 📀 | [Eject All Disks](system/eject-all-disks.applescript) | Ejects all mounted disk images. | Raycast | | |
|
| 📋 | [Empty Clipboard](system/empty-clipboard.sh) | Empty Clipboard | Raycast | | |
|
| 🗑 | [Empty Trash](system/empty-trash.applescript) | Empty the trash. | Raycast | | |
|
@@ -1447,6 +1525,7 @@ This repository contains sample commands and documentation to write your own one
| 💨 | [Flush DNS](system/flush-dns.sh) | Flush DNS cache | [Felipe Turcheti](https://felipeturcheti.com) | | |
|
| 🔫 | [Kill AirDrop Processes](system/kill-airdrop.processes.sh) | Force kill all AirDrop processes | [Linus Salzmann](https://github.com/linus569) | | |
|
| ⚠️ | [Kill Running Process](system/kill-process.sh) | Force kill a running process | [Gustavo Santana](https://github.com/gumadeiras) | ✅ | |
|
+ | 🚫 | [Kill a process on PORT](system/kill-a-process-on-port.sh) | Kill running processes on the given ports | [aaqifshafi](https://github.com/aaqifshafi) | ✅ | |
|
| 📈 | [Largest CPU Process](system/largest-cpu-process.sh) | Report process with largest system CPU usage. | [Caleb Stauffer](https://github.com/crstauf) | | |
|
| 📈 | [Largest RAM Process](system/largest-ram-process.sh) | Report process with largest system RAM usage. | [Caleb Stauffer](https://github.com/crstauf) | | |
|
| 🔋 | [Low Power Mode](system/Low Power Mode.sh) | N/A | [Kailash Yellareddy](https://github.com/kyellareddy) | | |
|
@@ -1454,10 +1533,11 @@ This repository contains sample commands and documentation to write your own one
| 🌵 | [Modify File Extension](system/modify-extension.sh) | Batch modify the file in the current directory or the specified extension of the selected file | [LokHsu](https://github.com/lokhsu) | ✅ | |
|
| 🗑 | [Move Desktop to Trash](system/move-desktop-to-trash.applescript) | Empty the desktop. | [Seypopi](https://github.com/Seypopi) | | |
|
|
| [Move Downloads to Trash](system/move-downloads-to-trash.applescript) | N/A | Jax0rz | | |
|
- | | [Network Info](system/Network Info.sh) | N/A | [Kailash Yellareddy](https://github.com/kyellareddy) | | |
|
+ | 🛜 | [Network Info](system/Network Info.sh) | N/A | [Kailash Yellareddy](https://github.com/kyellareddy) | | |
|
| 🌐 | [Network Quality](system/network-quality.sh) | N/A | [Archie Lacoin](https://github.com/pomdtr) and [LanikSJ](https://github.com/LanikSJ) | | |
|
| 📶 | [Network Status](system/network-status.sh) | Get current network connections. | [Alexandru Turcanu](https://github.com/Pondorasti) | | |
|
| 🖼 | [OCR](system/ocr.swift) | Use macOS Vision API Identification pictures, if it contain a QR code, Copy the QR code content to the clipboard, If do not include QR codes, identify text content and supplement to clipboard | [zhe](https://github.com/wmszhe) | | |
|
+ | 🔑 | [One-Time Password](system/otp.sh) | Get One-Time Password (OTP) from Apple Password Manager | Angelos Michalopoulos | ✅ | |
|
| 📁 | [Open Folder](system/open-folder.sh) | Open a folder on macOS | [Bin Hua](https://github.com/hzb) | ✅ | |
|
| 📋 | [Open Image](system/open-image-from-clipboard.sh) | Open Image from Clipboard in Preview for OCR or other purposes. | [xxchan](https://github.com/xxchan) | | |
|
| 💁♂️ | [Open Last Download](system/open-last-download.swift) | Opens the last downloaded file. | Raycast | | |
|
@@ -1465,6 +1545,8 @@ This repository contains sample commands and documentation to write your own one
| 💥 | [Quit All Applications](system/quit-all-apps.swift) | Quits all running applications except Finder and Raycast. | Raycast | | |
|
| 💥 | [Quit app](system/quit-app.swift) | Quits an app, by name or process id. | [Roland Leth](https://runtimesharks.com) | ✅ | |
|
| 🖼️ | [Refresh Wallpaper](system/wallpaper-refresh.applescript) | Apply a random image from the [wallpaper directory](https://support.apple.com/guide/mac-help/change-your-desktop-picture-mchlp3013/mac) for the main display's current [Space](https://support.apple.com/guide/mac-help/work-in-multiple-spaces-mh14112/mac). | [Caleb Stauffer](https://github.com/crstauf) | | |
|
+ | 📂 | [Rename Video](system/rename-videos-pictures.py) | This is a simple Python script for recursively renaming video and picture files within a directory. Type the root directory's absolute path, and it will scan all the video and picture files in it and rename them according to the folder where they are located as the format `--`. | [StepaniaH](https://github.com/StepaniaH) | ✅ | |
|
+ | 🚀 | [Reset Launchpad](system/reset-launchpad.sh) | Resets the macOS Launchpad to its default state | [Zach Dawson](https://raycast.com/zdawz) | | |
|
| ♻️ | [Restart](system/restart.applescript) | Restarts computer. | Raycast | | |
|
| 💀 | [Restart the Dock](system/restart-dock.sh) | Restart the Dock | [Jordi Clement](https://github.com/jordicl) | | |
|
| 💀 | [Restart the Finder](system/restart-finder.sh) | Restart the Finder | [Jordi Clement](https://github.com/jordicl) | | |
|
@@ -1475,20 +1557,25 @@ This repository contains sample commands and documentation to write your own one
| 🧭 | [Set Frontmost App as Default Browser](system/default-browser-front-most-app.applescript) | Set Frontmost Web Browser as Default Browser. | [Yohanes Bandung Bondowoso](https://github.com/ybbond) | ✅ | |
|
| 🛌 | [Shut Down](system/shutdown.applescript) | Shuts down computer. | Raycast | | |
|
| 😴 | [Sleep](system/sleep.applescript) | Puts computer to sleep. | Raycast | | |
|
+ | 😴 | [Sleep Timer](system/sleep-timer.applescript) | Put your Mac to sleep (in X minutes). | [AndriiBarabash](https://github.com/AndriiBarabash) | ✅ | |
|
| 🧬 | [Toggle .DS_Store](system/toggle-ds-store.applescript) | A script command to enable and disable .DS_Store | [Astrit](https://github.com/astrit) | | |
|
| 🔋 | [Toggle Battery Charging](system/toggle-battery-charging.sh) | Toggle charging the battery when it is plugged in. When turned off, it will always use the charger instead of the battery; when turned on, it will go to automatic mode (decide based on your settings and daily charging routine). | [Amir Hossein SamadiPour](https://github.com/SamadiPour) | | |
|
|
| [Toggle Bluetooth](system/bluetooth.template.applescript) | Toggle your Bluetooth connection. | [Vincent Dörig](https://github.com/vincentdoerig) | | ✅ |
|
| 🖥 | [Toggle Desktop Icons](system/toggle-desktop-icons.applescript) | A script command to show and hide icons of Desktop folder | [Raycast](https://raycast.com) | | |
|
+ | 🔄 | [Toggle Desktop Widgets](system/toggle-desktop-widget.sh) | N/A | [Federico Zivolo](https://github.com/FezVrasta) | | |
|
+ | 🤖 | [Toggle Dock Autohide](system/dock-autohide-toggle.sh) | Toggle the Dock Autohide | [Jelte Lagendijk](https://raycast.com/j3lte) | | |
|
| 👓 | [Toggle Filename Extensions](system/toggle-filename-extensions.applescript) | Show or hide all filename extensions (like .txt, .png) | [Senthil Prabhu](https://github.com/senthilprabhut) | | |
|
| 🖥 | [Toggle Flip Screen to °](system/toggle-flip-screen.template.applescript) | Toggle flip (rotate) or revert the to ° | [Yohanes Bandung Bondowoso](https://github.com/ybbond) | | ✅ |
|
| 👓 | [Toggle Hidden Files](system/toggle-hidden-files.applescript) | Show and hide hidden files/folders which starts with "." (dot), i.e: .bash_rc, .ssh | [Thiago Holanda](https://twitter.com/tholanda) | | |
|
| 🐚 | [Toggle Lid Sleep](system/toggle-lid-sleep.sh) | Prevent sleep from closing laptop lid (clamshell mode) | [Ivan Rybalko](https://github.com/ivribalko) | | |
|
| 🖱 | [Toggle Natural Scrolling](system/toggle-natural-scrolling.applescript) | Script Command to change natural trackpad/mouse scrolling setting. Reverting the setting value each time. | [Wiley Marques](https://twitter.com/wileymarques) | | |
|
+ | 🖱 | [Toggle Natural Scrolling (macOS 15+)](system/toggle-natural-scrolling-macos15.applescript) | Toggle natural trackpad/mouse scrolling setting for macOS 15.6.1+ | [Raphael-KR](https://github.com/Raphael-KR) | | |
|
| 🌘 | [Toggle Night Shift](system/nightshift.sh) | Toggle Night Shift mode (until tomorrow/sunrise). Required [nightlight](https://github.com/smudge/nightlight) | [BhEaN](https://github.com/bhean) | | |
|
| 🌗 | [Toggle System Appearance](system/toggle-system-appearance.applescript) | Script Command to switch between the system appearance, light and dark mode. | [Thiago Holanda](https://twitter.com/tholanda) | | |
|
|
| [Toggle Wi-Fi](system/wifi.template.applescript) | Toggle your Wi-Fi connection. | [Vincent Dörig](https://github.com/vincentdoerig) | | ✅ |
|
| 😴 | [Turn Off Do Not Disturb](system/dnd-off.sh) | Turn off "do not disturb" mode. Does [not work on Big Sur](https://github.com/sindresorhus/do-not-disturb-cli/issues/2). | [Caleb Stauffer](https://github.com/crstauf) | | |
|
| 😴 | [Turn On Do Not Disturb](system/dnd-on.sh) | Turn on "do not disturb" mode. Does [not work on Big Sur](https://github.com/sindresorhus/do-not-disturb-cli/issues/2). | [Caleb Stauffer](https://github.com/crstauf) | | |
|
+ | 📋 | [Type Clipboard](system/paste-clipboard.sh) | Takes your clipboard then types each character in the clipboard | [AlexGadd](https://raycast.com/AlexGadd) | | |
|
| 🗑 | [Uninstall with AppCleaner](system/uninstall-with-appcleaner.applescript) | Uninstall applications with AppCleaner | [Felipe Turcheti](https://felipeturcheti.com) | ✅ | |
|
| ♻️ | [Update Community Scripts](system/update-scripts-command.template.py) | Updates community Script Commands to their last available version from the GitHub repository. | [Quentin Eude](https://www.github.com/qeude) | | ✅ |
|
@@ -1505,6 +1592,13 @@ This repository contains sample commands and documentation to write your own one
| 🔊 | [Switch Audio to ](system/audio/audio-output-switch.template.applescript) | Switch audio output to desired device. | [mmerle](https://github.com/mmerle) | | ✅ |
|
|
| [Toggle AirPods](system/audio/toggle-airpods.template.swift) | Toggle AirPods bluetooth device | [Nichlas W. Andersen](https://github.com/itsnwa) | | ✅ |
|
| 🎙 | [Toggle Microphone](system/audio/toggle-mic.applescript) | Toggles microphone. | [Matthew Morek](https://github.com/matthewmorek) | | |
|
+ | 🔔 | [Toggle Mute Notifcation Sounds](system/audio/toggle-mute-notification-sounds.applescript) | Toggles notification sounds. | [Annie Ma](http://www.anniema.co/) | | |
|
+
+#### Magic Keyboard Switcher
+
+| Icon | Title | Description | Author | Args | Templ | Lang |
+| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
+ |
| [Magic Keyboard switcher](system/magic-keyboard-switcher/magic-keyboard-switcher.template.sh) | Switch a single magic keyboard between computers | [blastik](https://github.com/blastik) | | ✅ |
|
#### VPN
@@ -1555,7 +1649,8 @@ This repository contains sample commands and documentation to write your own one
|
| [Search PHP Docs](web-searches/search-php-docs.sh) | Search [PHP official documentation](https://www.php.net/docs.php). | [Caleb Stauffer](https://github.com/crstauf) | ✅ | |
|
|
| [Search Python 3 Documentation](web-searches/search-python3-docs.sh) | Search Python 3 Documentation | [Lucas Costa](https://github.com/lucasrcosta) | ✅ | |
|
|
| [Search Python Package Index (PyPI)](web-searches/search-pypi.sh) | Search Python Package Index (PyPI) | [Lucas Costa](https://github.com/lucasrcosta) | ✅ | |
|
- |
| [Search Script Command](web-searches/search-script-command-marketplace.sh) | Search for Script Commands in the [Unofficial Raycast Script Commands Marketplace](https://scriptcommands.com). | [Alexandru Turcanu](https://github.com/Pondorasti) | ✅ | |
|
+ |
| [Search Rust Documentation](web-searches/search-rust-docs.sh) | Search Rust documentation | [lemorage](https://raycast.com/lemorage) | ✅ | |
|
+ |
| [Search Script Command](web-searches/search-script-command-marketplace.sh) | Search for Script Commands in the [Unofficial Raycast Script Commands Marketplace](https://scriptcommands.alexandru.so). | [Alexandru Turcanu](https://github.com/Pondorasti) | ✅ | |
|
|
| [Search Swift Code](web-searches/search-swift-github.sh) | N/A | Raycast | ✅ | |
|
|
| [Search Unsplash](web-searches/search-unsplash.sh) | Search [Unsplash](https://unsplash.com). | [Caleb Stauffer](https://github.com/crstauf) | ✅ | |
|
|
| [Search WP Engine Installs](web-searches/search-wpengine-installs.sh) | Search [WP Engine](https://wpengine.com) installs. | [Caleb Stauffer](https://github.com/crstauf) | ✅ | |
|
diff --git a/commands/ai/gemini/gemini.js b/commands/ai/gemini/gemini.js
new file mode 100755
index 000000000..20eaa42d8
--- /dev/null
+++ b/commands/ai/gemini/gemini.js
@@ -0,0 +1,231 @@
+#!/usr/bin/env node
+
+// Dependencies:
+// This script requires the following software to be installed:
+// - `node` https://nodejs.org
+// - `chrome-cli` https://github.com/prasmussen/chrome-cli
+// Install via homebrew: `brew install node chrome-cli`
+
+// This script needs to run JavaScript in your browser, which requires your permission.
+// To do so, open Chrome and find the menu bar item:
+// View > Developer > Allow JavaScript from Apple Events
+
+// Required parameters:
+// @raycast.schemaVersion 1
+// @raycast.title Ask Gemini
+// @raycast.mode silent
+// @raycast.packageName Gemini
+
+// Optional parameters:
+// @raycast.icon ./images/icon-gemini.svg
+// @raycast.argument1 { "type": "text", "placeholder": "Selected Text", "optional": true }
+// @raycast.argument2 { "type": "text", "placeholder": "Prompt"}
+
+// Documentation:
+// @raycast.description Open Gemini in Chrome browser and submit a prompt with optional selected text as context
+// @raycast.author Est7
+// @raycast.authorURL https://github.com/est7
+
+// @raycast.author Nimo Beeren
+// @raycast.authorURL https://github.com/nimobeeren
+
+const { execSync } = require("child_process");
+
+const selectedText = process.argv[2] || ""; // Get the text from "Selected Text" argument, or use an empty string if argument is empty.
+const prompt = process.argv[3];
+
+process.env.OUTPUT_FORMAT = "json";
+
+/** Escape a string so that it can be used in JavaScript code when wrapped in double quotes. */
+function escapeJsString(str) {
+ return str.replaceAll(`\\`, `\\\\`).replaceAll(`"`, `\\"`);
+}
+
+/** Escape a string so that it can be used in a shell command when wrapped in single quotes. */
+function escapeShellString(str) {
+ return str.replaceAll(`'`, `'"'"'`);
+}
+
+// used to wait for Chrome to activate.
+function sleep(ms) {
+ const start = Date.now();
+ while (Date.now() - start < ms) {}
+}
+
+/**
+ * Verifies that all required dependencies are installed.
+ * Exits the process with an error message if any dependency is missing.
+ */
+function checkDependencies() {
+ // Check if Google Chrome is installed
+ try {
+ execSync("osascript -e 'tell application \"Google Chrome\" to get version'" , { stdio: "ignore" });
+ } catch {
+ try {
+ execSync("osascript -e 'tell application \"Chrome\" to get version'" , { stdio: "ignore" });
+ } catch {
+ console.error("Google Chrome is required to run this script");
+ process.exit(1);
+ }
+ }
+
+ // Check if chrome-cli is installed
+ try {
+ execSync("which chrome-cli");
+ } catch {
+ console.error(
+ "chrome-cli is required to run this script (https://github.com/prasmussen/chrome-cli)"
+ );
+ process.exit(1);
+ }
+}
+
+// Verify all dependencies are installed
+checkDependencies();
+
+// Bring Chrome to the foreground first.
+try {
+ // Try to activate Chrome through AppleScript, supporting different possible application names.
+ execSync("osascript -e 'tell application \"Google Chrome\" to activate'", {
+ stdio: "ignore",
+ });
+} catch (e) {
+ try {
+ // If the first naming method fails, try possible alternatives.
+ execSync("osascript -e 'tell application \"Chrome\" to activate'", {
+ stdio: "ignore",
+ });
+ } catch (err) {
+ console.error(
+ "Unable to activate Chrome browser, continue with other operations",
+ );
+ }
+}
+
+// Give Chrome a little time to make sure it is activated
+sleep(300);
+
+// Find the Gemini tab if one is already open
+let tabs = JSON.parse(execSync("chrome-cli list tabs")).tabs;
+let geminiTab = tabs.find((tab) =>
+ tab.url.startsWith("https://gemini.google.com/"),
+);
+
+// If there is a Gemini tab open, get its info. Otherwise, open Gemini in a new window.
+let geminiTabInfo;
+if (geminiTab) {
+ // Focus on existing tags, do not refresh the page
+ execSync(`chrome-cli activate -t ${geminiTab.id}`);
+ // Get tab info
+ geminiTabInfo = JSON.parse(execSync(`chrome-cli info -t ${geminiTab.id}`));
+} else {
+ // Open a Gemini session in a new tab, focus it and return the tab info
+ geminiTabInfo = JSON.parse(
+ execSync("chrome-cli open 'https://gemini.google.com/app'"),
+ );
+}
+
+// Wait for the tab to be loaded, then execute the script
+let interval = setInterval(() => {
+ if (geminiTabInfo.loading) {
+ geminiTabInfo = JSON.parse(
+ execSync(`chrome-cli info -t ${geminiTabInfo.id}`),
+ );
+ } else {
+ clearInterval(interval);
+ executeScript();
+ }
+}, 100);
+
+function executeScript() {
+ const script = async function (selectedText, prompt) {
+ // Wait for prompt element to be on the page
+ let promptElement;
+ await new Promise((resolve) => {
+ let interval = setInterval(() => {
+ promptElement = document.querySelector(
+ 'div[aria-label="Enter a prompt here"]',
+ );
+ if (promptElement) {
+ clearInterval(interval);
+ resolve();
+ }
+ }, 100);
+ });
+
+ // Prepare the final text
+ let finalText = "";
+ if (selectedText && selectedText.trim() !== "") {
+ finalText += `${selectedText}\n\n${prompt}`;
+ } else {
+ finalText = prompt;
+ }
+
+ // Focus the input element first
+ promptElement.focus();
+
+ // Check if there's existing content
+ const hasExistingContent = promptElement.textContent.trim() !== "";
+
+ // Clear existing content if needed - safely without innerHTML
+ if (!hasExistingContent) {
+ // If empty, we'll just add our content
+ // No need to clear anything
+ } else {
+ // If we want to append to existing content, add a newline
+ // Create a new paragraph for separation
+ const selection = window.getSelection();
+ const range = document.createRange();
+
+ // Move cursor to the end of existing content
+ range.selectNodeContents(promptElement);
+ range.collapse(false); // false means collapse to end
+ selection.removeAllRanges();
+ selection.addRange(range);
+
+ // Insert two newlines to separate content
+ document.execCommand("insertText", false, "\n\n");
+ }
+
+ // Insert the content using execCommand which is safer than innerHTML
+ // Split by newlines and insert with proper paragraph formatting
+ const paragraphs = finalText.split("\n");
+ paragraphs.forEach((paragraph, index) => {
+ if (index > 0) {
+ // Insert newline between paragraphs (not before the first one)
+ document.execCommand("insertText", false, "\n");
+ }
+
+ // Insert the paragraph text
+ document.execCommand("insertText", false, paragraph || "\u200B");
+ });
+
+ // Trigger input event to notify Gemini of changes
+ const inputEvent = new Event("input", { bubbles: true });
+ promptElement.dispatchEvent(inputEvent);
+
+ // Ensure cursor is at the end and visible
+ const selection = window.getSelection();
+ const range = document.createRange();
+ range.selectNodeContents(promptElement);
+ range.collapse(false); // false means collapse to end
+ selection.removeAllRanges();
+ selection.addRange(range);
+
+ // Scroll to make cursor visible
+ promptElement.scrollTop = promptElement.scrollHeight;
+
+ // Additional scroll after a short delay to ensure visibility
+ setTimeout(() => {
+ promptElement.scrollTop = promptElement.scrollHeight;
+ }, 100);
+ };
+
+ const functionString = escapeShellString(script.toString());
+ const selectedTextString = escapeShellString(escapeJsString(selectedText));
+ const promptString = escapeShellString(escapeJsString(prompt));
+
+ execSync(
+ `chrome-cli execute '(${functionString})(\"${selectedTextString}\", \"${promptString}\")' -t ${geminiTabInfo.id}`,
+ );
+}
diff --git a/commands/ai/gemini/images/icon-gemini.svg b/commands/ai/gemini/images/icon-gemini.svg
new file mode 100644
index 000000000..4545c8331
--- /dev/null
+++ b/commands/ai/gemini/images/icon-gemini.svg
@@ -0,0 +1,10 @@
+
diff --git a/commands/apps/busycal/images/busycal.png b/commands/apps/busycal/images/busycal.png
new file mode 100644
index 000000000..8671a4bf0
Binary files /dev/null and b/commands/apps/busycal/images/busycal.png differ
diff --git a/commands/apps/busycal/new-busycal-event-or-task.applescript b/commands/apps/busycal/new-busycal-event-or-task.applescript
new file mode 100755
index 000000000..05627da0c
--- /dev/null
+++ b/commands/apps/busycal/new-busycal-event-or-task.applescript
@@ -0,0 +1,28 @@
+#!/usr/bin/osascript
+
+# Dependency: This script requires `BusyCal` installed: https://www.busymac.com/busycal/
+
+# Required parameters:
+# @raycast.schemaVersion 1
+# @raycast.title Create Event/Task
+# @raycast.mode compact
+# @raycast.packageName BusyCal
+
+# Optional parameters:
+# @raycast.icon images/busycal.png
+# @raycast.argument1 { "type": "dropdown", "placeholder": "type", "data" : [{"title" : "event", "value": "event"}, {"title" : "task", "value": "task"}], "optional": true}
+# @raycast.argument2 { "type": "text", "placeholder": "entry", "percentEncoded": true}
+
+# Documentation:
+# @raycast.description Creates new events or tasks in BusyCal.
+# @raycast.author Annie Ma
+# @raycast.authorURL www.anniema.co
+
+on run argv
+ set query2 to (item 2 of argv)
+ tell application "BusyCal"
+ activate
+ if (item 1 of argv = "event") then open location "busycalevent://new/" & query2
+ if (item 1 of argv = "task") then open location "busycalevent://new/-" & query2
+ end tell
+end run
\ No newline at end of file
diff --git a/commands/apps/claude/claude.js b/commands/apps/claude/claude.js
new file mode 100755
index 000000000..f9adb66c8
--- /dev/null
+++ b/commands/apps/claude/claude.js
@@ -0,0 +1,127 @@
+#!/usr/bin/env node
+
+// Dependencies:
+// This script requires the following software to be installed:
+// - `node` https://nodejs.org
+// - `chrome-cli` https://github.com/prasmussen/chrome-cli
+// Install via homebrew: `brew install node chrome-cli`
+
+// This script needs to run JavaScript in your browser, which requires your permission.
+// To do so, open Chrome and find the menu bar item:
+// View > Developer > Allow JavaScript from Apple Events
+
+// Required parameters:
+// @raycast.schemaVersion 1
+// @raycast.title Ask Claude
+// @raycast.mode silent
+// @raycast.packageName Claude
+
+// Optional parameters:
+// @raycast.icon ✨
+// @raycast.argument1 { "type": "text", "placeholder": "Prompt"}
+
+// Documentation:
+// @raycast.description Open Claude in Chrome browser and submit a prompt
+// @raycast.author Nimo Beeren
+// @raycast.authorURL https://github.com/nimobeeren
+
+const { execSync } = require("child_process");
+
+const prompt = process.argv[2];
+
+process.env.OUTPUT_FORMAT = "json";
+
+/** Escape a string so that it can be used in JavaScript code when wrapped in double quotes. */
+function escapeJsString(str) {
+ return str.replaceAll(`\\`, `\\\\`).replaceAll(`"`, `\\"`);
+}
+
+/** Escape a string so that it can be used in a shell command when wrapped in single quotes. */
+function escapeShellString(str) {
+ return str.replaceAll(`'`, `'"'"'`);
+}
+
+try {
+ execSync("which chrome-cli");
+} catch {
+ console.error(
+ "chrome-cli is required to run this script (https://github.com/prasmussen/chrome-cli)"
+ );
+ process.exit(1);
+}
+
+// Find the Claude tab if one is already open
+let tabs = JSON.parse(execSync("chrome-cli list tabs")).tabs;
+let claudeTab = tabs.find((tab) => tab.url.startsWith("https://claude.ai/"));
+
+// If there is a Claude tab open, get its info. Otherwise, open Claude in a new
+// window.
+let claudeTabInfo;
+if (claudeTab) {
+ // Open a new Claude session in the existing tab and focus it
+ execSync(`chrome-cli open 'https://claude.ai/new' -t ${claudeTab.id}`);
+ // Get tab info
+ claudeTabInfo = JSON.parse(execSync(`chrome-cli info -t ${claudeTab.id}`));
+} else {
+ // Open a Claude session in a new tab, focus it and return the tab info
+ claudeTabInfo = JSON.parse(
+ execSync("chrome-cli open 'https://claude.ai/new'")
+ );
+}
+
+// Wait for the tab to be loaded, then execute the script
+let interval = setInterval(() => {
+ if (claudeTabInfo.loading) {
+ claudeTabInfo = JSON.parse(
+ execSync(`chrome-cli info -t ${claudeTabInfo.id}`)
+ );
+ } else {
+ clearInterval(interval);
+ executeScript();
+ }
+}, 100);
+
+function executeScript() {
+ const script = async function (prompt) {
+ // Wait for prompt element to be on the page
+ let promptElement;
+ await new Promise((resolve) => {
+ let interval = setInterval(() => {
+ promptElement = document.querySelector(
+ '[aria-label="Write your prompt to Claude"] > div'
+ );
+ if (promptElement) {
+ clearInterval(interval);
+ resolve();
+ }
+ }, 100);
+ });
+
+ // Set the prompt
+ const p = document.createElement("p");
+ p.textContent = prompt;
+ promptElement.replaceChildren(p);
+
+ // Wait for submit button to be on the page
+ let submitButton;
+ await new Promise((resolve) => {
+ let interval = setInterval(() => {
+ submitButton = document.querySelector('[aria-label="Send Message"]');
+ if (submitButton) {
+ clearInterval(interval);
+ resolve();
+ }
+ }, 100);
+ });
+
+ // Submit the prompt
+ submitButton.click();
+ };
+
+ const functionString = escapeShellString(script.toString());
+ const promptString = escapeShellString(escapeJsString(prompt));
+
+ execSync(
+ `chrome-cli execute '(${functionString})("${promptString}")' -t ${claudeTabInfo.id}`
+ );
+}
diff --git a/commands/apps/find-my/.env.example b/commands/apps/find-my/.env.example
new file mode 100644
index 000000000..6e3a6c985
--- /dev/null
+++ b/commands/apps/find-my/.env.example
@@ -0,0 +1,3 @@
+ICLOUD_EMAIL=
+ICLOUD_PASSWORD=
+DEVICE=
\ No newline at end of file
diff --git a/commands/apps/find-my/README.md b/commands/apps/find-my/README.md
new file mode 100644
index 000000000..55057353e
--- /dev/null
+++ b/commands/apps/find-my/README.md
@@ -0,0 +1,58 @@
+# Find My Phone Raycast
+
+I lose my phone often, so I made this.
+
+This is a Node.js script that uses Playwright to automate iCloud Find My and trigger a sound on your Apple device. It's perfect for people like me who misplace their phones and want a quick, automated way to make them ring—with Raycast.
+
+## Usage
+
+```sh
+git clone https://github.com/vsvaidya27/fmp-raycast
+cd fmp-raycast
+npm install
+cp .env.example .env
+# Edit .env with your real credentials
+chmod +x fmp.js
+```
+
+### Add to Raycast
+
+1. Open Raycast and go to **Extensions**.
+2. Click **Add**.
+3. Select **Add Script Directory**.
+4. Choose the `fmp-raycast` directory you just cloned.
+5. Set fmp as your alias for calling the script.
+
+Now you can trigger the script directly from Raycast!
+
+## How it works
+
+- Automates login to iCloud Find My using Playwright
+- Selects your device by name
+- Triggers the "Play Sound" feature to help you locate your device
+
+**Note:** You'll need to provide your iCloud credentials and device name in the `.env` file. Sometimes a 2FA check may pop up, but usually they allow you to bypass this and manual intervention is not neccesary (since you often need the very thing you are trying to find for 2FA).
+
+---
+
+## 🛠 Troubleshooting
+
+### If you get the error `env: node: No such file or directory`
+
+Raycast uses a limited shell environment, so it may not find your Node.js install.
+
+To fix it:
+
+1. Run this in Terminal to find your full Node path:
+ ```bash
+ which node
+ ```
+2. Edit the top of `fmp.js`:
+ Replace:
+ ```sh
+ #!/usr/bin/env node
+ ```
+ With:
+ ```sh
+ #!/full/path/to/node
+ ```
diff --git a/commands/apps/find-my/fmp.js b/commands/apps/find-my/fmp.js
new file mode 100755
index 000000000..e672b032b
--- /dev/null
+++ b/commands/apps/find-my/fmp.js
@@ -0,0 +1,62 @@
+#!/usr/bin/env node
+
+// Required parameters:
+// @raycast.schemaVersion 1
+// @raycast.title Find My Phone (Auto Sound)
+// @raycast.mode silent
+// @raycast.packageName FindMy
+// @raycast.icon images/find-my-icon.png
+
+require('dotenv').config();
+const { chromium } = require('playwright');
+
+(async () => {
+ const browser = await chromium.launch({ headless: false });
+ const page = await browser.newPage();
+
+ // 1. Go to iCloud Find Devices
+ await page.goto('https://www.icloud.com/find');
+
+ // 2. Click "Sign In"
+ await page.waitForSelector('text=Sign In', { timeout: 20000 });
+ await page.click('text=Sign In');
+
+ // 3. Wait for the Apple login iframe to appear
+ const frameLocator = page.frameLocator('iframe[name="aid-auth-widget"]');
+
+ // 4. Wait for the email/phone input inside the iframe
+ await frameLocator.getByRole('textbox', { name: 'Email or Phone Number' }).waitFor({ timeout: 20000 });
+
+ // 5. Fill in the email/phone
+ await frameLocator.getByRole('textbox', { name: 'Email or Phone Number' }).fill(process.env.ICLOUD_EMAIL);
+
+ // 6. Click the right-arrow button
+ await frameLocator.getByRole('button').first().click();
+
+ // 7. Wait for the "Continue with Password" button to appear, then click it
+ await frameLocator.getByRole('button', { name: /Continue with Password/i }).waitFor({ timeout: 20000 });
+ await frameLocator.getByRole('button', { name: /Continue with Password/i }).click();
+
+ // 8. Wait for password input
+ await frameLocator.getByRole('textbox', { name: 'Password' }).waitFor({ timeout: 20000 });
+ await frameLocator.getByRole('textbox', { name: 'Password' }).fill(process.env.ICLOUD_PASSWORD);
+
+ // 9. Click the arrow button to continue
+ await frameLocator.getByRole('button').first().click();
+
+ // 10. Wait for 2FA if needed; Hopefully not because this kinda defeats the purpose of automation even though its prob for the best security-wise :(
+ console.log('If prompted, please complete 2FA in the browser window. :(');
+
+ // 12. Click on your iPhone using the precise selector inside the second iframe
+ await page.locator('iframe').nth(1).contentFrame().getByTitle(process.env.DEVICE).getByTestId('show-device-name').click();
+
+ // 13. Wait for the device details panel to load
+ await page.waitForTimeout(2000);
+
+ // 14. Click the "Play Sound" button
+ await page.locator('iframe').nth(1).contentFrame().getByRole('button', { name: 'Play Sound' }).click();
+
+ console.log('✅ Play Sound triggered for ' + process.env.DEVICE + '!');
+ await browser.close();
+})();
+
diff --git a/commands/apps/find-my/images/find-my-icon.png b/commands/apps/find-my/images/find-my-icon.png
new file mode 100644
index 000000000..0862bfec8
Binary files /dev/null and b/commands/apps/find-my/images/find-my-icon.png differ
diff --git a/commands/apps/find-my/package.json b/commands/apps/find-my/package.json
new file mode 100644
index 000000000..6e278971c
--- /dev/null
+++ b/commands/apps/find-my/package.json
@@ -0,0 +1,16 @@
+{
+ "name": "findmyraycast",
+ "version": "1.0.0",
+ "main": "fmp.js",
+ "scripts": {
+ "start": "node fmp.js"
+ },
+ "keywords": [],
+ "author": "",
+ "license": "ISC",
+ "description": "",
+ "dependencies": {
+ "dotenv": "^16.5.0",
+ "playwright": "^1.52.0"
+ }
+}
diff --git a/commands/apps/iterm/iterm-open-profile-in-new-window.applescript b/commands/apps/iterm/iterm-open-profile-in-new-window.applescript
new file mode 100755
index 000000000..6ef8fd3b7
--- /dev/null
+++ b/commands/apps/iterm/iterm-open-profile-in-new-window.applescript
@@ -0,0 +1,34 @@
+#!/usr/bin/osascript
+
+# Dependency: requires iTerm (https://iterm2.com)
+# Install via Homebrew: `brew install --cask iterm2`
+
+# Required parameters:
+# @raycast.schemaVersion 1
+# @raycast.title Open profile
+# @raycast.packageName iTerm
+# @raycast.mode silent
+
+# Optional parameters:
+# @raycast.icon 🤖
+# @raycast.argument1 { "type": "text", "placeholder": "Placeholder" }
+
+# Documentation:
+# @raycast.author sunrisewestern
+# @raycast.authorURL https://github.com/sunrisewestern
+
+on is_running(appName)
+ tell application "System Events" to (name of processes) contains appName
+end is_running
+
+on run {argv}
+ set iTermRunning to is_running("iTerm2")
+ tell application "iTerm"
+ activate
+ if not (iTermRunning) then
+ delay 0.5
+ close the current window
+ end if
+ create window with profile argv
+ end tell
+end run
diff --git a/commands/apps/mail/copy-captcha-from-mail.py b/commands/apps/mail/copy-captcha-from-mail.py
new file mode 100755
index 000000000..de5cae47b
--- /dev/null
+++ b/commands/apps/mail/copy-captcha-from-mail.py
@@ -0,0 +1,97 @@
+#!/usr/bin/env python3
+
+# Copy the verification code from Mail.
+#
+# Dependency: This script requires the `emlx` package.
+# Install it via `pip install emlx`.
+#
+# Required parameters:
+# @raycast.schemaVersion 1
+# @raycast.title CaptchaFromMail
+# @raycast.mode silent
+
+# Optional parameters:
+# @raycast.icon ./images/mail.png
+# @raycast.packageName Mail
+
+# Documentation:
+# @raycast.description Copy the captcha from the emlx file.
+# @raycast.author RealTong
+# @raycast.authorURL https://raycast.com/RealTong
+
+import os
+import re
+import pyperclip
+import emlx
+
+
+def extract_captcha_from_emlx(emlx_path):
+ if emlx_file is None or os.path.exists(emlx_file) is False:
+ print("Mail not found")
+ return
+ email = emlx.read(emlx_path)
+ headers = email.headers
+ content = email.html
+ subject = headers["Subject"]
+ captcha_match_keyword = [
+ "验证码",
+ "动态密码",
+ "代码",
+ "确认",
+ "码",
+ "verification",
+ "code",
+ "confirm",
+ ]
+ content_pattern = r"\b[0-9]{6}\b"
+ subject_pattern = r"\b[a-zA-Z0-9]{6}\b"
+ # 判断内容中是否包含验证码关键字, 只有包含关键字的邮件才会查找验证码
+ for keyword in captcha_match_keyword:
+ if keyword in subject:
+ if re.search(subject_pattern, subject):
+ captcha = re.search(subject_pattern, subject).group()
+ pyperclip.copy(captcha)
+ print("Verification code successfully copied to clipboard:", captcha)
+ return
+ if re.search(content_pattern, content):
+ captcha = re.search(content_pattern, content).group()
+ pyperclip.copy(captcha)
+ print("Verification code successfully copied to clipboard:", captcha)
+ return
+ else:
+ print("Verification code not found")
+ else:
+ print("Not a verification code email")
+
+
+def get_latest_emlx_file(folder):
+ latest_emlx_file = None
+ latest_mod_time = 0
+ for root, dirs, files in os.walk(folder):
+ for file in files:
+ if file.endswith(".emlx"):
+ file_path = os.path.join(root, file)
+ mod_time = os.path.getmtime(file_path)
+ if mod_time > latest_mod_time:
+ latest_mod_time = mod_time
+ latest_emlx_file = file_path
+
+ return latest_emlx_file
+
+
+if __name__ == "__main__":
+ try:
+ import emlx
+
+ os.listdir(f"/")
+ except ImportError:
+ print("emlx not installed, please run 'pip install emlx' to install it")
+ exit(1)
+ except OSError:
+ print(
+ "Currently there is no Full Disk Access permission, please grant Full Disk Access permission to the terminal in System Preferences > Security & Privacy > Privacy > Full Disk Access."
+ )
+ exit(1)
+ mail_path = f"{os.path.expanduser('~')}/Library/Mail/V10/"
+ emlx_file = get_latest_emlx_file(mail_path)
+ extract_captcha_from_emlx(emlx_file)
diff --git a/commands/apps/mail/images/mail.png b/commands/apps/mail/images/mail.png
new file mode 100644
index 000000000..0ae662ac3
Binary files /dev/null and b/commands/apps/mail/images/mail.png differ
diff --git a/commands/apps/notes/create-note-from-clipboard.applescript b/commands/apps/notes/create-note-from-clipboard.applescript
index e54c6bf7b..f131fd31a 100755
--- a/commands/apps/notes/create-note-from-clipboard.applescript
+++ b/commands/apps/notes/create-note-from-clipboard.applescript
@@ -21,6 +21,6 @@ on run argv