[Raycast](https://raycast.com/) lets you control your tools with a few keystrokes and installing script commands makes it possible to execute commands from anywhere on your desktop. They are a great way to speed up every-day tasks such as converting data, opening bookmarks or triggering dev workflows. This repository contains some example scripts as well as links to our community commands and documentation to write your own ones.
**✨ Looking to build richer extensions?** Check out the Extensions API [here](https://github.com/raycast/extensions).
🚨 For anything that is not related to script commands, please [send us an email](mailto:feedback@raycast.com), use the feedback command within Raycast, or join the [Slack community](https://www.raycast.com/community).
## Install Script Commands from this repository
To install new commands, follow these steps:
1. Choose a script from the [community repo](https://github.com/raycast/script-commands/tree/master/commands#apps) and save it into a new directory.
Scripts containing the word `.template.` in the filename require some values to be set (check [the troubleshooting section](#troubleshooting-and-faqs) for more information).
Alternatively, instead of creating a new directory you can reuse the repo's [`_enable-commands` folder](https://github.com/raycast/script-commands/tree/master/_enabled-commands).
3. Open the Extensions tab in the Raycast preferences
4. Click the plus button
5. Click `Add Script Directory`
6. Select directories containing your Script Commands
**💡 Hint:** We recommend that you don't directly load the community script directories into Raycast to avoid potential restructuring and new script commands suddenly appearing in Raycast.

## Create your own Script Commands
To write your own custom Script Commands, go over the following steps:
1. Use the `Create Script Command` functionality in Raycast
2. Write and edit your script using your favourite code editor
3. Run your Script Command from the Raycast root search
**💡 Hint:** If you choose to write your script in `Bash`, we highly recommend using the [Shellcheck](https://marketplace.visualstudio.com/items?itemName=timonwong.shellcheck) linter as this will ensure smooth running of your script. All scripts uploaded to GitHub will need to have been run through ShellCheck.

### Metadata
These parameters are available for you to customize your Script Command in Raycast. For practical examples of how these should be used, as well as best practices and supported languages, please browse our templates and community-built scripts.
| Name | Description | Required | App Version |
|----------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------|---------------------|
|schemaVersion | Schema version to prepare for future changes in the API. Currently there is only version 1 available. | Yes | 0.29+ |
| title | Display name of the Script Command that is shown as title in the root search. | Yes | 0.29+ |
| mode | Specifies how the script is executed and how the output is presented. [Details of the options for this parameter can be viewed here](https://github.com/raycast/script-commands/blob/master/documentation/OUTPUTMODES.md) | Yes | 0.29+ |
| packageName | Display name of the package that is shown as subtitle in the root search. When not provided, the name will be inferred from the script directory name. | No | 0.29+ |
| icon | Icon that is displayed in the root search. Can be an emoji, a file path (relative or full) or a remote URL (only https). Supported formats for images are PNG and JPEG. Please make sure to use small icons, recommended size - 64px. | No | 0.29+ |
| iconDark | Same as `icon`, but for dark theme. If not specified, then `icon` will be used in both themes. | No | 1.3.0+ |
| currentDirectoryPath | Path from which the script is executed. Default is the path of the script. | No | 0.29+ |
| needsConfirmation | Specify `true` if you would like to show confirmation alert dialog before running the script. Can be helpful with destructive scripts like "Quit All Apps" or "Empty Trash". Default value is `false`. | No | 0.30+ |
| refreshTime | Specify a refresh interval for inline mode scripts in seconds, minutes, hours or days. Examples: 10s, 1m, 12h, 1d. Note that the actual times can vary depending on how the OS prioritises scheduled work. The minimum refresh interval is 10 seconds. If you have more than 10 inline commands, only the first 10 will be refreshed automatically; the rest have to be manually refreshed by navigating to them and pressing `return`.| No | 0.31+ |
| argument[1...3] | [Custom arguments, see Passing Arguments page](https://github.com/raycast/script-commands/blob/master/documentation/ARGUMENTS.md) for detail of how to use this field | No | 1.2.0+ |
| author | Define an author name to be part of the script commands documentation | No | |
| authorURL | Author social media, website, email or anything to help the users to get in touch | No | |
| description | A brief description about the script command to be presented in the documentation | No | |
### Output Mode
You can use the standard output to present messages in Raycast. Depending on the `mode`, the standard output of your scripts is differently presented.`fullOutput` and `inline` modes support ANSI Escape codes allowing to color generated output by changing its background and foreground color. [You can view the different output mode options as well as their various forms and color options here.](https://github.com/raycast/script-commands/blob/master/documentation/OUTPUTMODES.md)
### Error Handling
If the script exits with a status code not equal to 0, Raycast interprets it as failed and shows a toast that the script failed to run. If this script has inline or compact mode, the last line of the output will be used as an error message. Consider this example for a bash script:
```bash
if ! [[ $value =~ $regex ]] ; then
echo "Invalid value provided"
exit 1
else
...
```
## Troubleshooting and FAQs
Why isn't my script appearing in Raycast?
* Ensure the filename doesn't contain `.template.` string
* Check that all required metadata parameters are provided. See the table above which parameters are required.
* Ensure you use either `#` or `//` comments for metadata parameters
* If nothing helps, try to go step by step from a [template](https://github.com/raycast/script-commands/tree/master/templates) Script Command or use one of the examples in this repo.
Why isn't my Shell script working?
* Ensure the filename doesn't contain `.template.` string
* Run your code through [ShellCheck](https://www.shellcheck.net/) to check for syntax errors or unexpected characters
Can I build in a non-login shell?
**We only allow Script Commands that run in a non-login shell in this repository as agreed on in our [contribution guidelines](https://github.com/raycast/script-commands/blob/master/CONTRIBUTING.md), due to any dependencies.**
However, if you need to run your local script as login-shell, you can specify an argument after shebang, e.g. `#!/bin/bash -l` for bash. We also append `/usr/local/bin` to `$PATH` variable so you can use your local shell commands without any additional steps. If this is not enough, you can always extend `$PATH` by adding `export PATH='/some/extra/path:$PATH'` at the top of your script.
## Community
We're always looking for new Script Commands or other ways to improve Raycast. If you have anything cool to show, please send us a pull request. If we screwed something up, please report a bug. Join our [Slack community](https://www.raycast.com/community) to brainstorm ideas with like-minded folks.
================================================
FILE: Tools/Toolkit/CONTRIBUTING.md
================================================
# Contributing to Raycast's Toolkit
Raycast Toolkit is a command-line application for automating repetitive tasks in this repo. At the moment the Toolkit automates the generation of the [Awesome Script Commands](../../commands/README.md) and the [extensions.json](../../commands/extensions.json) which contains information about each Script Command.
## Tech Stack
- [Swift](https://developer.apple.com/swift) 5.3
- [Swift Package Manager](https://github.com/apple/swift-package-manager/)
- [Swift Argument Parser](https://github.com/apple/swift-argument-parser)
- [SwiftLint](https://github.com/realm/SwiftLint)
## Code Structure
```txt
.
├── Sources
│ ├── Toolkit - Command-line Interface tool that makes calls to ToolkitLibrary. This is the interface used by the user or by the CI.
│ │ ├── Extensions - Custom Swift extensions specific to the CLI
│ │ └── SubCommands - Sub-commands are the interfaces that are exposed to the user
│ └── ToolkitLibrary - The main library
│ ├── Core - Core functionally
│ │ ├── Documentation - Documentation generation for Markdown and JSON
│ │ └── Toolkit - Contains the public interface which will be consumed by the Toolkit CLI
│ ├── Errors - Errors for the Toolkit
│ ├── Extensions - Custom Swift extensions
│ ├── Models - Data models
│ └── Protocols - Custom Swift protocols
└── Tests - Unit tests
└── ToolkitLibraryTests - Unit tests for the library
```
## Getting Setup
Open this folder in Xcode with the following terminal command:
```bash
open -a Xcode.app .
```
Xcode will automatically download the Swift Packages for you.
## Running the CLI
1. Open up your terminal and head over to the root of this repo.
2. Run `make build`
3. Use the generated binary with `./toolkit`!
## Running the Unit Tests
See [Apple's documentation for running unit tests](https://developer.apple.com/library/archive/documentation/ToolsLanguages/Conceptual/Xcode_Overview/UnitTesting.html).
================================================
FILE: Tools/Toolkit/Package.resolved
================================================
{
"object": {
"pins": [
{
"package": "swift-argument-parser",
"repositoryURL": "https://github.com/apple/swift-argument-parser.git",
"state": {
"branch": null,
"revision": "d2930e8fcf9c33162b9fcc1d522bc975e2d4179b",
"version": "1.0.1"
}
},
{
"package": "swift-tools-support-core",
"repositoryURL": "https://github.com/apple/swift-tools-support-core.git",
"state": {
"branch": null,
"revision": "f9bbd6b80d67408021576adf6247e17c2e957d92",
"version": "0.2.4"
}
}
]
},
"version": 1
}
================================================
FILE: Tools/Toolkit/Package.swift
================================================
// swift-tools-version:5.3
import PackageDescription
let package = Package(
name: "toolkit",
platforms: [
.macOS(.v11),
],
dependencies: [
.package(
url: "https://github.com/apple/swift-tools-support-core.git",
.upToNextMinor(from: "0.2.4")
),
.package(
url: "https://github.com/apple/swift-argument-parser.git",
.upToNextMinor(from: "1.0.0")
),
],
targets: [
.target(
name: "Toolkit",
dependencies: [
"ToolkitLibrary",
.product(name: "SwiftToolsSupport-auto", package: "swift-tools-support-core"),
.product(name: "ArgumentParser", package: "swift-argument-parser"),
]
),
.target(
name: "ToolkitLibrary",
dependencies: [
.product(name: "SwiftToolsSupport-auto", package: "swift-tools-support-core"),
]
),
.testTarget(
name: "ToolkitLibraryTests",
dependencies: ["ToolkitLibrary"]),
]
)
================================================
FILE: Tools/Toolkit/README.md
================================================
# Raycast Toolkit
[Raycast](https://raycast.com) Toolkit helps you to generate documentation for all script commands on a predefined or customized path.
## CLI overview
```txt
OVERVIEW: A tool to generate automatized documentation
USAGE: toolkit [--version]
OPTIONS:
-v, --version Print the version and exit
-h, --help Show help information.
SUBCOMMANDS:
generate-documentation Generate the documentation in JSON and Markdown format
See 'toolkit help ' for detailed help.
```
## How does the Toolkit work?
The Toolkit runs on every push to master using [this GitHub Action workflow](../../.github/workflows/documentation.yml). That workflow goes through the following process:
1. Setup a version of Xcode
2. Build the Toolkit using the [Makefile](../../Makefile) located at the root of the repo
3. Run `make gen-docs-and-commit`
1. Runs the [integration shell script](integration.sh)
2. Commits the changes (if there are any)
4. Pushes the changes to the master branch using the Raycast bot.
## Contributing
We would love to have your contribution! Check out our [CONTRIBUTING.md](CONTRIBUTING.md) file to get started.
## Community
This is a shared place and we're always looking for new Script Commands or other ways to improve Raycast. If you have anything cool to show, please send us a pull request. If we screwed something up, please report a bug. Join our [Slack community](https://www.raycast.com/community) to brainstorm ideas with like-minded folks.
================================================
FILE: Tools/Toolkit/Sources/Toolkit/SubCommands/GenerateDocumentation.swift
================================================
//
// MIT License
// Copyright (c) 2020-2021 Raycast. All rights reserved.
//
import ArgumentParser
import ToolkitLibrary
extension ToolkitCommand {
struct GenerateDocumentation: ParsableCommand {
static var configuration = CommandConfiguration(
abstract: "Generate the documentation in JSON and Markdown format"
)
@Argument(help: "Path of the Raycast extensions folder.\n")
var path: String = "./commands"
@Argument(help: "Output file name for the Markdown documentation.\n")
var outputMarkdownFilename: String = "README.md"
@Argument(help: "Output file name for the Markdown documentation.\n")
var outputJSONFilename: String = "extensions.json"
func run() throws {
do {
let dataManager = try DataManager(
extensionsPath: path,
extensionsFilename: outputJSONFilename
)
let toolkit = Toolkit(
dataManager: dataManager
)
try toolkit.generateDocumentation(
outputJSONFilename: outputJSONFilename,
outputMarkdownFilename: outputMarkdownFilename
)
Toolkit.raycastDescription()
Console.shared.writeGreen("Documents generated!")
} catch {
Toolkit.raycastDescription()
Console.shared.writeRed("Error: \(error)")
}
}
}
}
================================================
FILE: Tools/Toolkit/Sources/Toolkit/SubCommands/Report.swift
================================================
//
// MIT License
// Copyright (c) 2020-2021 Raycast. All rights reserved.
//
import ArgumentParser
import SwiftUI
import ToolkitLibrary
extension ToolkitCommand {
struct Report: ParsableCommand {
static var configuration = CommandConfiguration(
abstract: "Generate a report about the health of the Script Commands"
)
@Option(
name: [
.customShort("t"),
.customLong("type"),
],
help: "\(Toolkit.ReportType.allOptions)\n "
)
var reportType: Toolkit.ReportType = .allScripts
@Argument(
help: "Path of the Raycast extensions folder.\n "
)
var path: String = "./commands"
@Flag(help: "Print report without colors")
var noColor: Bool = false
func run() throws {
do {
let dataManager = try DataManager(
extensionsPath: path
)
let toolkit = Toolkit(
dataManager: dataManager
)
try toolkit.report(
type: reportType,
noColor: noColor
)
} catch {
Toolkit.raycastDescription()
Console.shared.writeRed("Error: \(error)")
}
}
}
}
// MARK: - Expressible By Argument
extension ToolkitLibrary.Toolkit.ReportType: ExpressibleByArgument {
static var allOptions: String {
Self.allValueStrings.joined(separator: "|")
}
}
================================================
FILE: Tools/Toolkit/Sources/Toolkit/SubCommands/SetExecutable.swift
================================================
//
// MIT License
// Copyright (c) 2020-2021 Raycast. All rights reserved.
//
import ArgumentParser
import ToolkitLibrary
extension ToolkitCommand {
struct SetExecutable: ParsableCommand {
static var configuration = CommandConfiguration(
abstract: "Set file mode \"executable\" to Script Commands"
)
@Argument(help: "Path of the Raycast extensions folder.\n")
var path: String = "./commands"
func run() throws {
do {
let dataManager = try DataManager(
extensionsPath: path
)
let toolkit = Toolkit(
dataManager: dataManager
)
try toolkit.setScriptCommandsAsExecutable()
} catch {
Toolkit.raycastDescription()
Console.shared.writeRed("Error: \(error)")
}
}
}
}
================================================
FILE: Tools/Toolkit/Sources/Toolkit/SubCommands/Version.swift
================================================
//
// MIT License
// Copyright (c) 2020-2021 Raycast. All rights reserved.
//
import ArgumentParser
import ToolkitLibrary
extension ToolkitCommand {
struct Version: ParsableCommand {
static var configuration = CommandConfiguration(
abstract: "Print the current Toolkit version"
)
func run() throws {
Toolkit.version()
throw ExitCode.success
}
}
}
================================================
FILE: Tools/Toolkit/Sources/Toolkit/main.swift
================================================
//
// MIT License
// Copyright (c) 2020-2021 Raycast. All rights reserved.
//
import Foundation
import ArgumentParser
import ToolkitLibrary
import TSCBasic
struct ToolkitCommand: ParsableCommand {
static var configuration = CommandConfiguration(
commandName: "toolkit",
abstract: "A tool to generate automatized documentation",
subcommands: [
GenerateDocumentation.self,
Report.self,
SetExecutable.self,
Version.self,
]
)
}
ToolkitCommand.main()
================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Core/Console.swift
================================================
//
// MIT License
// Copyright (c) 2020-2021 Raycast. All rights reserved.
//
import Foundation
import TSCBasic
public final class Console {
private var noColor: Bool
private let terminalController: TerminalController?
public static let shared = Console()
init(noColor: Bool = false) {
self.noColor = noColor
self.terminalController = TerminalController(stream: stdoutStream)
}
public func writeRed(_ message: String, bold: Bool = false, endLine: Bool = true) {
write(string: message, color: .red, bold: bold, endLine: endLine)
}
public func writeYellow(_ message: String, bold: Bool = false, endLine: Bool = true) {
write(string: message, color: .yellow, bold: bold, endLine: endLine)
}
public func writeGreen(_ message: String, bold: Bool = false, endLine: Bool = true) {
write(string: message, color: .green, bold: bold, endLine: endLine)
}
public func write(_ message: String, bold: Bool = false, endLine: Bool = true) {
write(string: message, color: .noColor, bold: bold, endLine: endLine)
}
public func write(string: String, color: TerminalController.Color, bold: Bool = false, endLine: Bool = true) {
terminalController?.write(string, inColor: noColor ? .noColor : color, bold: bold)
if endLine {
terminalController?.endLine()
}
}
public func endLine() {
terminalController?.endLine()
}
}
================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Core/Documentation/Documentation.swift
================================================
//
// MIT License
// Copyright (c) 2020-2021 Raycast. All rights reserved.
//
import Foundation
import TSCBasic
final class Documentation {
private let fileSystem = TSCBasic.localFileSystem
private let path: AbsolutePath
private let markdownFilename: String
private let jsonFilename: String
init(path: AbsolutePath, jsonFilename: String, markdownFilename: String) {
self.path = path
self.jsonFilename = jsonFilename
self.markdownFilename = markdownFilename
}
func generateDocuments(for data: RaycastData) throws {
try generateMarkdown(for: data)
try generateJSON(for: data)
}
}
// MARK: - Private methods
private extension Documentation {
func generateMarkdown(for raycastData: RaycastData) throws {
let documentFilePath = path.appending(
component: markdownFilename
)
guard let data = markdownData(for: raycastData) else {
return
}
try fileSystem.writeFileContents(
documentFilePath,
bytes: ByteString(data.uint8Array)
)
}
func generateJSON(for raycastData: RaycastData) throws {
let documentFilePath = path.appending(
component: jsonFilename
)
let data = try raycastData.toData()
try fileSystem.writeFileContents(
documentFilePath,
bytes: ByteString(data.uint8Array)
)
}
func markdownData(for raycastData: RaycastData) -> Data? {
let groups = raycastData.groups
var tableOfContents = String.empty
var contentString = String.empty
let sortedGroups = groups.sorted()
sortedGroups.forEach {
tableOfContents += $0.markdownDescription
}
sortedGroups.forEach { group in
contentString += .newLine + group.sectionTitle
contentString += renderMarkdown(for: group)
}
let markdown = """
\(renderBadges())
# Raycast Script Commands
[Raycast](https://raycast.com) lets you control your tools with a few keystrokes
and Script Commands makes it possible to execute scripts from anywhere on your desktop.
They are a great way to speed up every-day tasks such as converting data, opening bookmarks
or triggering dev workflows.
This repository contains sample commands and documentation to write your own ones.
### Categories
\(tableOfContents)\(contentString)
## Community
This is a shared place and we're always looking for new Script Commands or other ways to improve Raycast.
If you have anything cool to show, please send us a pull request. If we screwed something up,
please report a bug. Join our
[Slack community](https://www.raycast.com/community)
to brainstorm ideas with like-minded folks.
"""
guard let contentData = markdown.data(using: .utf8) else {
return nil
}
return contentData
}
func renderMarkdown(for group: Group, headline: Bool = false) -> String {
var contentString = String.empty
if group.scriptCommands.isEmpty == false {
if headline {
contentString += .newLine
contentString += .newLine + "#### \(group.name)"
}
contentString += .newLine
contentString += .newLine + "| Icon | Title | Description | Author | Args | Templ | Lang |"
contentString += .newLine + "| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |"
for scriptCommand in group.scriptCommands.sorted() {
contentString += scriptCommand.markdownDescription
}
}
if let subGroups = group.subGroups?.sorted() {
for subGroup in subGroups {
contentString += renderMarkdown(
for: subGroup,
headline: true
)
}
}
return contentString
}
func renderBadges() -> String {
let logo = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFgAAABYCAIAAAD+96djAAAIC0lEQVR4nOybW2zb1hmADynqLsuWRFLOBVmTpqkVy5LlpkgfDGRdnSvcdSiKIUWHosO8lwDtw4Bge1pRYMAw9KXAgAxYMiTNGjRZt+5plxQIkCzpNjduZMmJnMRpt7WR7NgSJYqULFISNUQ8pikpKVLpkOwDP+QhUajj40//f3j+n0fEY1sfByYA4EZP4JuCKQJiioCYIiCmCIgpAmKKgJgiIKYIiCkCYoqAmCIgpgiIKQJiioCYIiDGi9jidIQ8bqNnYbSIkNv9h7HY+7HRXf39xs7ESBFbnc5To5Gg3d5vtf4uMhLu8xg4GSNF7BroJ202+e9eK3EmNvr0gGFxYRnw+Y362SmeL1Rrzwb8AMMAAHYc30+Sl3JMtlrVfzJGigAAJDguXRH2kQHowmJ5Phi8kmeWRVHnmegt4gmXa7vLlRYE5ZUUz+ertT0BPwZd4JNBejpfWFJdowO6itjssJ8bix3euGGGZdOV9d8zwXFtOXKQoi4yuayoX47oJ2Kzw/HuaHSz00ng+H6K+pjJ31PFf4Lj+Hp93O9T4mKCJC8zTE6v9UI/Ec8M9B/euNGy9plPBulrrXERLxbvVip7SVJ24SGIFwaDuuWIfiI+K68u8KVDNIUpLmi6LUfm+VJnjuizduq6RnxWLmcqwgQZkF0QOH6Aoq51rBeda+elnObrhbYiQm73bt/AQqmsvJLi+YVSaS9Fyjlia8bFbLH4ZaWiXJPgOLWvtdgpZrTMEQ1FbHU634tFX9wwmCxy/11dBQAMEMSugX6x0ahJjRFvn3wZgeOHaGpREAI22xanU/7D1+sei2W7GxZjDovlgMY5gml0LCDkcZ+KRmi7HQAgStKRuRsXcrlxv+/3o9GuxyzWalPJuasFFulMIVrVGttcrsBaHWHD8Z9sewzreUwvQZwYCYfcmtTsWon4y/LKVGJOlCQAwE2OfyWeaKAY1mu1nh2LaVGnalh9XmSYI3M3Uhz3cny2UKuhGlauU2NeL6oBZVCK2Oyw7yNJ9SsXcrnJq58itCDjJYhT0cgQ0r4WMhHyDvrX4Z37qRYXSDJCZjpfkBpwPK+VOBmN7HC7UA2ORsQTLtefnoptc7lsOH4sPPzShkEkw7ZxbnHx6PxNxcWg3f7BU2OocgSNCJ/V6iUIOCKG/WroyYOtcYGKD5fuvXX7DlDiopkjSNZONCI+YdnXEklubS3AMeyd4Z0auTidTr95+446R87ERnvvgyNbI6YL7A/iCcWFDcdf3rQR1eBtnE6nfzp/S1LFRe998O5FbHU6v9+6FiQ57sfJuUq93suEHpE/Li39YmE9R3rvg3cpIuRxnx0b/eXQk69u2qR+fbpwP0d41PdLGWUZkjl59wE50nUfvJuia4vDcSY2GrTbMQx7NuBPV4QUzyv/m64I11h2kqYzgvDnpXstb3Q6Xxzs/obyzMBAosh90VqnouqDdxMRbovFga+9EcPeDj0gLqY0yBGHxXI8Et7d+pmfTqePzt9ScsSK457WwHlEuomIbLU6w7IHaMou68CwPQF/oVpLcJxyzZeVyr8LbLnVRY8R8bBejtIHFyTp9RupK/l8FyN32Y/ICMIVhpmkabsFb6q4nyN8vR4vFpVryh0R0bsIpZfT2QdnxOq76fQ/mG4s9NSYWRbFT1l2P0XaLRbQlDHu992tVOb50sPegkSEHBedffAkx6nbXF+XnvYRV1n2cHy2qNpHvR0aalsvEPL35RW5rgcA9BHEe7HobnTPSnvdUM3zpVfis8Xquou3dmzXyMVH2ewb11PK/bKvub9G5QLBzvI6x7+WSCpxATDszR3bX0KRAp2cz2bVe0r5lolkZGQ9yyGP+2Q0MthsUgIApEbj57cWzmQy6msom23c7+v6R8wUWHkVOEiR7wzvXK3Xp5JzM2yx57kDxM3bHW7XB2NjXiu8jV9mmFdnk6gGb+MQRS2LAioLiDtUt0vllhxBhBXDjkfCzwUC6hf/urKC0AL6nmW8WFSvnb1jxbDfjAxPkOSxkeHvBDR8FoW+eXud4w9fi7OInmIfCw8/1+yD2nD8t5GR7wVpJMN2okkXe75UmkrOIcmRs5lFZe9QlSROsxpfqyddAADaZjvyrS191vUS6JM8e25xUX2NlyB+9vg2eZ8uc345+1E2q77m237/iehIVZJ+lJz7Z76g0Ww1FAEAeLq//0Qk7LVa5X9KjcbR+Zsfttbm4z7f8UjYIe/Tm88H37iROr/S4uK7QbpUq1/I5bSbqrZPwzOCcIlhng8G5W0PhmF7SbKtTv2iUrlfy1KUrXmNBcMO0VRGaOlx3CqV/tN8jKwdmp+PyIrVzjo13+pC6eUQa74myMBCqXSnXNZ0bmr0OCiyLIrThcLB1v5FpqOvNXO/lqXWY4ciPy+X1WcrNEWnEzNLgnAxl5sgSbl9JH/mXK02W2yJi4+Z/GSQll3wtdr7mYymh0PU6Hd0KCtWLzPMC8GgkiN7/O05ck8U5RypNRo/TCTR7h2/Gl3PUOWq1c4cKXSsFzMs+7eVlX9pcyDkYeh98nbpQT2+zj74/1a77zV1hwFnsZdF8VIuNxmkHWs9vn1koC1H9MeYQ+kP7IMzYjVpnAvDvq8xw7bUqaIkfb6q366hEyO/pqD0wSUAXr+e6roTjwRta41HIeRxewhCo0ODj043T8fQ8hXPQfTE+K87fkMwRUBMERBTBMQUATFFQEwREFMExBQBMUVATBEQUwTEFAExRUBMERBTBOT/AQAA//98wKt7wQJ9rAAAAABJRU5ErkJggg=="
let style = "for-the-badge"
let labelColor = "202123"
let dataURL = "https:%2F%2Fraw.githubusercontent.com%2Fraycast%2Fscript-commands%2Fmaster%2Fcommands%2Fextensions.json"
let jsonPath = "$.totalScriptCommands"
let badges = """
"""
return badges
}
}
================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Core/GitShell.swift
================================================
//
// MIT License
// Copyright (c) 2020-2021 Raycast. All rights reserved.
//
import TSCBasic
import TSCUtility
struct GitError: Error {
let result: ProcessResult
}
struct GitShell {
init() {}
func run(_ args: String..., environment: [String: String] = Git.environment, path: AbsolutePath) throws -> String {
do {
return try execute(
["-C", path.dirname] + args,
environment: environment
)
} catch {
throw error
}
}
private func execute(_ args: [String], environment: [String: String] = Git.environment) throws -> String {
let process = Process(arguments: [Git.tool] + args, environment: environment)
let result: ProcessResult
do {
try process.launch()
result = try process.waitUntilExit()
guard result.exitStatus == .terminated(code: 0) else {
throw GitError(
result: result
)
}
let content = try result.utf8Output().spm_chomp()
return content
} catch let error as GitError {
throw error
} catch {
let result = ProcessResult(
arguments: process.arguments,
environment: process.environment,
exitStatus: .terminated(code: -1),
output: .failure(error),
stderrOutput: .failure(error)
)
throw GitError(
result: result
)
}
}
}
================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Core/RegEx.swift
================================================
//
// MIT License
// Copyright (c) 2020-2021 Raycast. All rights reserved.
//
import Foundation
typealias NSTextCheckingResults = [NSTextCheckingResult]
final class RegEx {
static func checkingResults(for regex: String, in text: String) -> NSTextCheckingResults {
do {
let regex = try NSRegularExpression(
pattern: regex,
options: [
.caseInsensitive,
.anchorsMatchLines,
]
)
let range = NSRange(text.startIndex..., in: text)
return regex.matches(in: text, range: range)
} catch {
print("Invalid regex: \(error.localizedDescription)")
return []
}
}
static func checkingResult(for regex: String, in text: String) -> NSTextCheckingResult? {
return checkingResults(for: regex, in: text).first
}
}
================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Core/Report/Report.swift
================================================
//
// MIT License
// Copyright (c) 2020-2021 Raycast. All rights reserved.
//
import Foundation
import TSCBasic
final class Report {
private lazy var scriptCommands = ScriptCommands()
private let console: Console
private let data: RaycastData
private let type: Toolkit.ReportType
init(data: RaycastData, type: Toolkit.ReportType, noColor: Bool) {
self.console = Console(
noColor: noColor
)
self.data = data
self.type = type
}
func showResult() {
data.groups.sorted().forEach { group in
filter(
for: group,
by: type
)
}
renderReport(
for: scriptCommands
)
}
}
// MARK: - Signs
extension Report {
enum Divider {
static let pipe = "|"
static let plus = "+"
static let minus = "-"
static let space = " "
}
}
// MARK: - Private methods
private extension Report {
typealias Title = (value: String, color: TerminalController.Color, bold: Bool)
typealias Titles = [Title]
typealias Cell = (title: String, length: Int, color: TerminalController.Color, bold: Bool)
typealias Cells = [Cell]
func filter(for group: Group, by type: Toolkit.ReportType) {
if group.scriptCommands.isEmpty == false {
for scriptCommand in group.scriptCommands.sorted() {
switch (type, scriptCommand.isExecutable) {
case (.executable, true):
self.scriptCommands.append(scriptCommand)
case (.nonExecutable, false):
self.scriptCommands.append(scriptCommand)
case (.allScripts, _):
self.scriptCommands.append(scriptCommand)
default:
break
}
}
}
if let subGroups = group.subGroups?.sorted() {
for subGroup in subGroups {
filter(
for: subGroup,
by: type
)
}
}
}
func renderReport(for scriptCommands: ScriptCommands) {
let raycast = "Raycast"
let cellMargin = 2
var firstColumnLength = 0
var secondColumnLength = 0
let thirdColumnLength = 10
scriptCommands.forEach {
let author: String = $0.authors?.description ?? raycast
if author.count >= firstColumnLength {
firstColumnLength = author.count
}
if $0.fullPath.count >= secondColumnLength {
secondColumnLength = $0.fullPath.count
}
}
let columnsLength = [firstColumnLength, secondColumnLength, thirdColumnLength]
let titleCells = [
Title(value: raycast, color: .red, bold: true),
Title(value: "Script Commands", color: .green, bold: true),
]
let descriptionCells = [
Cell(title: "Author", length: firstColumnLength, color: .noColor, bold: false),
Cell(title: "Path", length: secondColumnLength, color: .noColor, bold: false),
Cell(title: "Executable", length: thirdColumnLength, color: .noColor, bold: false),
]
let headerWidth = columnsLength.reduce(0, +) + (descriptionCells.count * cellMargin)
renderDivider(with: columnsLength)
renderHeader(with: headerWidth, titles: titleCells)
renderDivider(with: columnsLength)
renderRow(for: descriptionCells)
renderDivider(with: columnsLength)
scriptCommands.forEach {
let author = $0.authors?.description ?? raycast
let executableColor: TerminalController.Color = $0.isExecutable ? .cyan : .yellow
let rowCells = [
Cell(title: author, length: firstColumnLength, color: .green, bold: true),
Cell(title: $0.fullPath, length: secondColumnLength, color: .noColor, bold: false),
Cell(title: String($0.isExecutable), length: thirdColumnLength, color: executableColor, bold: !$0.isExecutable),
]
renderRow(for: rowCells)
}
renderDivider(with: columnsLength)
console.write(" Total of", endLine: false)
console.write(string: " \(scriptCommands.count) ", color: .cyan, bold: true, endLine: false)
console.write("script commands")
}
func renderHeader(with maxWidth: Int, titles: Titles) {
let titleCount = titles.map { $0.value }.joined(separator: " ").count
let titleLength = titleCount % 2 == 0 ? titleCount : titleCount + 1
let halfMaxWidth = maxWidth / 2
let halfTitleWidth = titleLength / 2
let leadingOffset = halfMaxWidth - halfTitleWidth
let titleLeadingMargin = Divider.space.`repeat`(by: leadingOffset)
let trailingOffset = maxWidth - (leadingOffset + titleCount)
let titleTrailingMargin = Divider.space.`repeat`(by: trailingOffset)
console.write(Divider.pipe, endLine: false)
console.write(titleLeadingMargin, endLine: false)
titles.enumerated().forEach { (i, title) in
if i > 0 {
console.write(Divider.space, endLine: false)
}
console.write(
string: title.value,
color: title.color,
bold: title.bold,
endLine: false
)
}
console.write(titleTrailingMargin, endLine: false)
console.write(Divider.pipe)
}
func renderRow(for cells: Cells) {
console.write(Divider.pipe, endLine: false)
cells.forEach { cell in
let length = cell.length - cell.title.count
var cellString = String.empty
cellString += Divider.space
cellString += cell.title
cellString += Divider.space.`repeat`(by: length)
console.write(
string: cellString,
color: cell.color,
bold: cell.bold,
endLine: false
)
console.write(Divider.pipe, endLine: false)
}
console.endLine()
}
func renderDivider(with maxWidthList: [Int]) {
var divisor = Divider.plus
maxWidthList.forEach { maxWidth in
divisor += Divider.minus.`repeat`(by: maxWidth + 1)
divisor += Divider.plus
}
console.write(divisor, endLine: true)
}
}
// MARK: - Extension for Array
private extension Array where Element == ScriptCommand.Author {
/// Return the name of the author or in case of multiple authors, just "Multiple"
var description: String {
var author = String.empty
if count == 1 {
author = self[0].name ?? "Raycast"
} else if count > 1 {
author = "Multiple"
}
return author
}
}
================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Core/Stores/DataManager.swift
================================================
//
// MIT License
// Copyright (c) 2020-2021 Raycast. All rights reserved.
//
import TSCBasic
public final class DataManager {
private var total: Int = 0 {
// FIXME: Data racing
didSet {
data.totalScriptCommands = total
}
}
var data = RaycastData()
let extensionsFilePath: AbsolutePath
let extensionsPath: AbsolutePath
let fileSystem: FileSystem
let ignoreGitInformation: Bool
var isMetadataEmpty: Bool {
data.metadata.isEmpty
}
var extensionsPathString: String {
extensionsPath.pathString
}
public init(extensionsPath: String, extensionsFilename: String = "") throws {
let fileSystem = TSCBasic.localFileSystem
let path = fileSystem.absolutePath(for: extensionsPath)
let extensionsFilePath = path.appending(RelativePath(extensionsFilename))
guard fileSystem.exists(path) else {
throw ToolkitError.folderNotFound(path.pathString)
}
self.fileSystem = fileSystem
self.extensionsPath = path
self.extensionsFilePath = extensionsFilePath
self.ignoreGitInformation = extensionsFilename.isEmpty
}
func increaseTotal() {
total += 1
}
func addLanguage(_ language: String) {
data.languages.insert(
Language.Information(name: language)
)
}
func loadContent() {
if let byteString = try? fileSystem.readFileContents(extensionsPath) {
let data = byteString.contents.data
do {
self.data = try data.decode()
} catch {
self.data = RaycastData()
}
} else {
data = RaycastData()
}
}
}
================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Core/Toolkit/Toolkit+Constants.swift
================================================
//
// MIT License
// Copyright (c) 2020-2021 Raycast. All rights reserved.
//
import Foundation
import TSCBasic
public extension Toolkit {
var blockedFolderList: [String] {
[
".git",
"screenshots",
"Tools",
".build",
".github",
"templates",
"images",
"_enabled-commands",
".swiftpm",
]
}
var blockedFilesExtensionsList: [String] {
[
"txt",
]
}
static var information: (name: String, version: String) {
(
name: "Raycast Toolkit",
version: "0.4.0"
)
}
static func raycastDescription() {
Console.shared.writeRed(information.name, bold: true)
}
static func version() {
raycastDescription()
Console.shared.write("Current version: ", endLine: false)
Console.shared.writeYellow(information.version, bold: true)
}
}
================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Core/Toolkit/Toolkit+GenerateDocumentation.swift
================================================
//
// MIT License
// Copyright (c) 2020-2021 Raycast. All rights reserved.
//
import Foundation
import TSCBasic
extension Toolkit {
public func generateDocumentation(outputJSONFilename: String, outputMarkdownFilename: String) throws {
dataManager.loadContent()
try readFolderContent(
path: dataManager.extensionsPath,
parentGroups: &dataManager.data.groups,
ignoreFilesInDir: true
)
let documentation = Documentation(
path: dataManager.extensionsPath,
jsonFilename: outputJSONFilename,
markdownFilename: outputMarkdownFilename
)
try documentation.generateDocuments(
for: dataManager.data
)
}
}
================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Core/Toolkit/Toolkit+Mode.swift
================================================
//
// MIT License
// Copyright (c) 2020-2021 Raycast. All rights reserved.
//
import Foundation
import TSCBasic
extension Toolkit {
public func setScriptCommandsAsExecutable() throws {
var data = RaycastData()
try readFolderContent(
path: dataManager.extensionsPath,
parentGroups: &data.groups,
ignoreFilesInDir: true
)
var scriptCommands = ScriptCommands()
data.groups.forEach { group in
filter(
for: group,
scriptCommands: &scriptCommands
)
}
let rawCount = scriptCommands.count
var newModeCount = 0
scriptCommands.sorted().forEach { scriptCommand in
let filePath = dataManager.extensionsPath.appending(RelativePath(scriptCommand.fullPath))
do {
try fileSystem.chmod(.executable, path: filePath)
newModeCount += 1
} catch {
return
}
}
let console = Console(noColor: false)
Toolkit.raycastDescription()
if newModeCount > 0 {
console.write("Result:", endLine: false)
console.writeYellow(" \(newModeCount) ", bold: true, endLine: false)
console.write("of", endLine: false)
console.writeGreen(" \(rawCount) ", bold: true, endLine: false)
console.write("Script Commands was set as \"executable\".")
} else {
console.write("✅ Nothing to be done.")
}
}
}
private extension Toolkit {
func filter(for group: Group, scriptCommands: inout ScriptCommands) {
if group.scriptCommands.isEmpty == false {
for scriptCommand in group.scriptCommands where scriptCommand.isExecutable == false {
scriptCommands.append(scriptCommand)
}
}
if let subGroups = group.subGroups {
for subGroup in subGroups {
filter(
for: subGroup,
scriptCommands: &scriptCommands
)
}
}
}
}
================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Core/Toolkit/Toolkit+ReadContent.swift
================================================
//
// MIT License
// Copyright (c) 2020-2021 Raycast. All rights reserved.
//
import Foundation
import TSCBasic
extension Toolkit {
typealias FolderContent = (scriptCommands: ScriptCommands, readmePath: String?, groupName: String)
@discardableResult
func readFolderContent(path: AbsolutePath, parentGroups: inout Groups, ignoreFilesInDir: Bool = false) throws -> FolderContent {
var scriptCommands = ScriptCommands()
for directory in onlyDirectories(at: path) {
guard blockedFolderList.contains(directory.basename) == false else {
continue
}
var group = Group(
name: directory.socialBasename,
path: directory.basenameWithoutExt
)
var subGroups = Groups()
let (scriptCommands, readmePath, groupName) = try readFolderContent(path: directory, parentGroups: &subGroups)
if groupName.isEmpty == false, groupName.lowercased() == group.name.lowercased() {
group.name = groupName
}
if scriptCommands.isEmpty == false {
group.scriptCommands = scriptCommands
}
if subGroups.isEmpty == false {
group.subGroups = subGroups
}
if let readmePath = readmePath {
group.readme = readmePath
}
if scriptCommands.isEmpty == false || subGroups.isEmpty == false {
parentGroups.append(group)
}
}
let directoryFiles = onlyFiles(at: path)
var groupName = ""
var readmePath: String?
for file in directoryFiles where directoryFiles.isEmpty == false {
guard ignoreFilesInDir == false else {
continue
}
guard
let fileExtension = file.extension,
blockedFilesExtensionsList.contains(fileExtension) == false else {
continue
}
if file.basenameWithoutExt.lowercased() == "readme" {
guard let fileContent = readContentFile(from: file), fileContent.count > 0 else {
continue
}
let pathCount = dataManager.extensionsPathString.count + 1
readmePath = String(file.pathString.dropFirst(pathCount))
} else if var scriptCommand = readScriptCommand(from: file) {
// This is to avoid data racing
DispatchQueue.global(qos: .userInitiated).async {
self.dataManager.increaseTotal()
self.dataManager.addLanguage(scriptCommand.language)
}
scriptCommand.configure(
isExecutable: fileSystem.isExecutableFile(file)
)
if let packageName = scriptCommand.packageName {
groupName = packageName
}
scriptCommands.append(scriptCommand)
}
}
return (
scriptCommands: scriptCommands,
readmePath: readmePath,
groupName: groupName
)
}
func readContentFile(from path: AbsolutePath) -> String? {
guard let byteString = try? fileSystem.readFileContents(path) else {
return nil
}
let data = byteString.contents.data
let content = String(data: data, encoding: .utf8)
return content
}
func extractGitDates(from filePath: AbsolutePath) -> [String]? {
do {
let dates = try git.run(
"log", "--format=%aI", "--follow", filePath.basename,
path: filePath
)
return dates.splitByNewLine
} catch {
return nil
}
}
func readScriptCommand(from filePath: AbsolutePath) -> ScriptCommand? {
guard fileSystem.isFile(filePath) else {
return nil
}
guard let fileContent = readContentFile(from: filePath) else {
return nil
}
let dictionary = keyValue(
for: fileContent,
filename: filePath.basename,
path: filePath
)
return ScriptCommand(
from: dictionary
)
}
func keyValue(for content: String, filename: String, path: AbsolutePath) -> [String: Any] {
let filenameKey = ScriptCommand.CodingKeys.filename.rawValue
let packageNameKey = ScriptCommand.CodingKeys.packageName.rawValue
var dictionary = readKeyValues(of: content)
dictionary[filenameKey] = filename
let pathCount = dataManager.extensionsPathString.count + 1
let scriptPath = path.dirname.dropFirst(pathCount)
dictionary["path"] = "\(scriptPath)/"
if dataManager.ignoreGitInformation == false {
if let dates = extractGitDates(from: path), dates.isEmpty == false {
if let updateAt = dates.first {
dictionary["updatedAt"] = updateAt
}
if let createdAt = dates.last {
dictionary["createdAt"] = createdAt
}
}
} else {
dictionary["updatedAt"] = String.empty
dictionary["createdAt"] = String.empty
}
dictionary["isTemplate"] = filename.contains("template")
if dictionary[packageNameKey] == nil {
dictionary[packageNameKey] = path.basenameWithoutExt.sanitize.capitalized
}
return dictionary
}
func readKeyValues(of content: String) -> [String: Any] {
let regex = "@raycast.(?[A-Za-z0-9]+)\\s(?[\\S ]+)"
let results = RegEx.checkingResults(for: regex, in: content)
var dictionary: [String: Any] = [:]
if let language = extractLanguageFromShebang(using: content) {
dictionary["language"] = language
}
let authors = extractAuthors(from: content, using: results)
if authors.isEmpty == false {
dictionary["authors"] = authors
}
let icons = extractIcons(from: content, using: results)
if icons.isEmpty == false {
dictionary["icon"] = icons
}
dictionary["hasArguments"] = extractArguments(from: content, using: results)
for result in results {
let keyValue = readKeyValue(from: result, content: content)
guard keyValue.authorKeys == false && keyValue.iconKeys == false else {
continue
}
dictionary.merge(keyValue) { $1 }
}
return dictionary
}
func extractLanguageFromShebang(using content: String) -> String? {
let regex = "#!(?[^\n]+)"
guard let result = RegEx.checkingResult(for: regex, in: content) else {
return nil
}
let range = result.range(withName: "shebang")
guard let shebang = self.content(of: range, on: content) else {
return nil
}
guard var software = shebang.split(separator: "/").last else {
return nil
}
let values = software.split(separator: " ")
if values.count > 1 {
software = values.first == "env"
? values.last ?? ""
: values.first ?? ""
}
let language = Language(String(software))
return language.name
}
func extractArguments(from content: String, using results: NSTextCheckingResults) -> Bool {
var hasArguments = false
for result in results {
let dictionary = readKeyValue(from: result, content: content)
guard dictionary.argumentsKeys else {
continue
}
hasArguments = true
}
return hasArguments
}
func extractIcons(from content: String, using results: NSTextCheckingResults) -> [String: String] {
var icons: [String: String] = [:]
for result in results {
let dictionary = readKeyValue(from: result, content: content)
guard let key = dictionary.keys.first, dictionary.iconKeys else {
continue
}
if let value = dictionary[key] as? String {
icons[key] = value
}
}
return icons
}
func extractAuthors(from content: String, using results: NSTextCheckingResults) -> [[String: String]] {
var authors: [[String: String]] = []
var currentAuthor: [String: String] = [:]
for result in results {
let dictionary = readKeyValue(from: result, content: content)
guard let key = dictionary.keys.first, dictionary.authorKeys else {
continue
}
if currentAuthor.keys.count == 2 {
currentAuthor = [:]
}
if let value = dictionary[key] as? String {
currentAuthor[key] = value
}
if currentAuthor.keys.count == 2 {
guard let value = dictionary[key] as? String else {
continue
}
guard authors.contains(
where: {
$0[key] == value
}
) == false else {
currentAuthor = [:]
continue
}
authors.append(currentAuthor)
currentAuthor = [:]
}
}
if currentAuthor.keys.count == 1 {
authors.append(currentAuthor)
}
return authors
}
func readKeyValue(from result: NSTextCheckingResult, content: String) -> [String: Any] {
var dictionary = [String: Any]()
let keyRange = result.range(withName: "key")
let valueRange = result.range(withName: "value")
if let key = self.content(of: keyRange, on: content), let value = self.content(of: valueRange, on: content) {
if let intValue = Int(value) {
dictionary[key] = intValue
} else if let boolValue = Bool(value) {
dictionary[key] = boolValue
} else {
dictionary[key] = value
}
}
return dictionary
}
func content(of range: NSRange, on content: String) -> String? {
var value: String?
if range.location != NSNotFound, range.length > 0, let rangeString = Range(range, in: content) {
value = String(content[rangeString])
}
return value
}
}
// MARK: - Filter Extensions
private extension Toolkit {
enum ContentDirType {
case directories
case files
}
func onlyFiles(at path: AbsolutePath) -> [AbsolutePath] {
return folderContent(type: .files, for: path)
}
func onlyDirectories(at path: AbsolutePath) -> [AbsolutePath] {
return folderContent(type: .directories, for: path)
}
func folderContent(type: ContentDirType, for path: AbsolutePath) -> [AbsolutePath] {
do {
let directoryContent = try fileSystem.getDirectoryContents(path)
let pathsForType: [AbsolutePath] = directoryContent.compactMap {
let contentPath = path.appending(component: $0)
guard check(type, for: contentPath) else {
return nil
}
return contentPath
}
return pathsForType
} catch {
return []
}
}
private func check(_ type: ContentDirType, for path: AbsolutePath) -> Bool {
switch type {
case .directories:
return fileSystem.isDirectory(path)
case .files:
return fileSystem.isFile(path)
}
}
}
// MARK: - Dictionary Extension
private extension Dictionary where Key == String {
var authorKeys: Bool {
typealias Keys = ScriptCommand.Author.InputCodingKeys
let authorNameKey = Keys.name.rawValue
let authorURLKey = Keys.url.rawValue
guard let key = keys.first else {
return false
}
return key == authorNameKey || key == authorURLKey
}
var iconKeys: Bool {
typealias Keys = ScriptCommand.Icon.InputCodingKeys
let iconKey = Keys.icon.rawValue
let iconDarkKey = Keys.iconDark.rawValue
guard let key = keys.first else {
return false
}
return key == iconKey || key == iconDarkKey
}
var argumentsKeys: Bool {
guard let key = keys.first else {
return false
}
return key == "argument1" || key == "argument2" || key == "argument3"
}
}
================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Core/Toolkit/Toolkit+Report.swift
================================================
//
// MIT License
// Copyright (c) 2020-2021 Raycast. All rights reserved.
//
import Foundation
import TSCBasic
extension Toolkit {
public func report(type: ReportType, noColor: Bool) throws {
try readFolderContent(
path: dataManager.extensionsPath,
parentGroups: &dataManager.data.groups,
ignoreFilesInDir: true
)
let report = Report(
data: dataManager.data,
type: type,
noColor: noColor
)
report.showResult()
}
}
================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Core/Toolkit/Toolkit+ReportType.swift
================================================
//
// MIT License
// Copyright (c) 2020-2021 Raycast. All rights reserved.
//
import Foundation
public extension Toolkit {
enum ReportType: String, CaseIterable, CustomStringConvertible {
case executable
case nonExecutable = "non-executable"
case allScripts = "all-scripts"
public var description: String {
return rawValue
}
}
}
================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Core/Toolkit/Toolkit.swift
================================================
//
// MIT License
// Copyright (c) 2020-2021 Raycast. All rights reserved.
//
import Foundation
import TSCBasic
public final class Toolkit {
lazy var fileSystem = TSCBasic.localFileSystem
var dataManager: DataManager
let git = GitShell()
public init(dataManager: DataManager) {
self.dataManager = dataManager
}
}
================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Errors/Reader+Error.swift
================================================
//
// MIT License
// Copyright (c) 2020-2021 Raycast. All rights reserved.
//
import Foundation
enum ToolkitError: Swift.Error, CustomStringConvertible, LocalizedError {
case folderNotFound(String)
case fileNotFound(String)
var description: String {
switch self {
case .folderNotFound(let folder):
return "Folder not found. Expected: \(folder)"
case .fileNotFound(let file):
return "File \"\(file)\" not found"
}
}
}
================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Extensions/Array/Array+Metadata.swift
================================================
//
// MIT License
// Copyright (c) 2020-2021 Raycast. All rights reserved.
//
import Foundation
extension Array where Element == Metadata {
func hasIdentifier(_ identifier: Identifier) -> Bool {
var foundValue = false
for item in self {
foundValue = item.identifiers.first(where: { $0 == identifier }) != nil
}
return foundValue
}
}
================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Extensions/Array/Array+UInt8.swift
================================================
//
// MIT License
// Copyright (c) 2020-2021 Raycast. All rights reserved.
//
import Foundation
extension Array where Element == UInt8 {
var data: Data {
var array = self
return Data(
bytes: &array,
count: array.count
)
}
}
================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Extensions/Character/Character+Emoji.swift
================================================
//
// MIT License
// Copyright (c) 2020-2021 Raycast. All rights reserved.
//
import Foundation
extension Character {
var isSimpleEmoji: Bool {
guard let firstScalar = unicodeScalars.first else {
return false
}
return firstScalar.properties.isEmoji && firstScalar.value > 0x238C
}
var isCombinedIntoEmoji: Bool {
guard unicodeScalars.count > 1, let firstScalar = unicodeScalars.first else {
return false
}
return firstScalar.properties.isEmoji
}
var isEmoji: Bool {
isSimpleEmoji || isCombinedIntoEmoji
}
}
================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Extensions/Character/Character+String.swift
================================================
//
// MIT License
// Copyright (c) 2020-2021 Raycast. All rights reserved.
//
import Foundation
extension Character {
static var newLine = Character(.newLine)
}
================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Extensions/Codable/Encodable+Data.swift
================================================
//
// MIT License
// Copyright (c) 2020-2021 Raycast. All rights reserved.
//
import Foundation
extension Encodable {
func toData() throws -> Data {
let encoder = JSONEncoder()
encoder.outputFormatting.insert(.prettyPrinted)
encoder.outputFormatting.insert(.sortedKeys)
encoder.dateEncodingStrategy = .iso8601
return try encoder.encode(self)
}
}
================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Extensions/Data/Data+Bytes.swift
================================================
//
// MIT License
// Copyright (c) 2020-2021 Raycast. All rights reserved.
//
import Foundation
extension Data {
var uint8Array: [UInt8] {
return [UInt8](self)
}
}
================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Extensions/Data/Data+Decodable.swift
================================================
//
// MIT License
// Copyright (c) 2020-2021 Raycast. All rights reserved.
//
import Foundation
extension Data {
func decode(_ type: T.Type = T.self) throws -> T {
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
let object = try decoder.decode(type, from: self)
return object
}
}
================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Extensions/Dictionary/Dictionary+Codable.swift
================================================
//
// MIT License
// Copyright (c) 2020-2021 Raycast. All rights reserved.
//
import Foundation
extension Dictionary where Key == String, Value: Any {
func encodeToStruct() -> T? {
do {
let data = try JSONSerialization.data(
withJSONObject: self
)
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
return try decoder.decode(T.self, from: data)
} catch {
return nil
}
}
}
================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Extensions/Integer/Int+Indent.swift
================================================
//
// MIT License
// Copyright (c) 2020-2021 Raycast. All rights reserved.
//
import Foundation
extension Int {
var level: String {
var content: String = .empty
for _ in 0...size
)
}
}
================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Extensions/String/String+Emoji.swift
================================================
//
// MIT License
// Copyright (c) 2020-2021 Raycast. All rights reserved.
//
import Foundation
extension String {
var isEmoji: Bool {
count == 1 && containsEmoji
}
var containsEmoji: Bool {
contains {
$0.isEmoji
}
}
var containsOnlyEmoji: Bool {
isEmpty == false &&
contains {
$0.isEmoji == false
} == false
}
}
================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Extensions/String/String+Interpolation.swift
================================================
//
// MIT License
// Copyright (c) 2020-2021 Raycast. All rights reserved.
//
import Foundation
extension String.StringInterpolation {
mutating func appendInterpolation(indent: Int, newLine: Bool = true) {
appendInterpolation("\(newLine ? String.newLine : .empty)\(indent.level)")
}
}
================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Extensions/String/String+URL.swift
================================================
//
// MIT License
// Copyright (c) 2020-2021 Raycast. All rights reserved.
//
import Foundation
extension String {
var isValidURL: Bool {
guard let detector = try? NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue) else {
return false
}
if let match = detector.firstMatch(in: self, options: [], range: NSRange(location: 0, length: utf16.count)) {
return match.range.length == self.utf16.count
}
return false
}
}
================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Extensions/String/String.swift
================================================
//
// MIT License
// Copyright (c) 2020-2021 Raycast. All rights reserved.
//
import CryptoKit
import Foundation
enum StringError: Error {
case convertStringToData
}
extension String {
var sanitize: String {
var text = self
let entities = [
"_",
"-",
]
entities.forEach { entity in
guard text.contains(entity) else {
return
}
text = text.replacingOccurrences(
of: entity,
with: " "
)
}
return text
}
var trimmedString: String {
trimmingCharacters(in: .whitespacesAndNewlines)
}
var splitByNewLine: [String] {
split(separator: .newLine).map(String.init)
}
static var newLine: String {
"\n"
}
static var empty: String {
""
}
func `repeat`(by times: Int) -> String {
var content = self
guard times >= 0 else {
return .empty
}
for _ in 0.. String {
guard let data = data(using: .utf8) else {
throw StringError.convertStringToData
}
let digest = Insecure.MD5.hash(data: data)
let value = digest.map {
String(format: "%02hhx", $0)
}
.joined()
return value
}
}
================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Extensions/TSCBasic/AbsolutePath+SocialBasename.swift
================================================
//
// MIT License
// Copyright (c) 2020-2021 Raycast. All rights reserved.
//
import TSCBasic
extension AbsolutePath {
var socialBasename: String {
basenameWithoutExt.sanitize.capitalized
}
}
================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Extensions/TSCBasic/FileSystem+AbsolutePath.swift
================================================
//
// MIT License
// Copyright (c) 2020-2021 Raycast. All rights reserved.
//
import TSCBasic
extension FileSystem {
func absolutePath(for path: String) -> AbsolutePath {
if let path = try? AbsolutePath(validating: path) {
return path
} else if
let path = try? RelativePath(validating: path),
let currentWorkingDirectory = localFileSystem.currentWorkingDirectory {
return AbsolutePath(
path.pathString,
relativeTo: currentWorkingDirectory
)
}
return localFileSystem.homeDirectory.appending(
RelativePath(path)
)
}
}
================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Models/Group.swift
================================================
//
// MIT License
// Copyright (c) 2020-2021 Raycast. All rights reserved.
//
import Foundation
typealias Groups = [Group]
struct Group: Codable {
var name: String
let path: String
var readme: String?
var scriptCommands: ScriptCommands = []
var subGroups: Groups?
}
// MARK: - MarkdownDescription Protocol
extension Group: MarkdownDescriptionProtocol {
var sectionTitle: String {
.newLine + "## \(name)"
}
var markdownDescription: String {
renderTree(for: self, level: 0)
}
func renderItem(for group: Group, level: Int = 0) -> String {
"\(indent: level)- [\(group.name)](#\(group.path))"
}
func renderTree(for group: Group, level: Int) -> String {
var description = String.empty
if let subGroups = group.subGroups?.sorted() {
description += renderItem(
for: group,
level: level
)
for subGroup in subGroups {
description += renderTree(
for: subGroup,
level: level + 1
)
}
} else {
description += renderItem(
for: group,
level: level
)
}
return description
}
}
// MARK: - Comparable
extension Group: Comparable {
static func < (lhs: Group, rhs: Group) -> Bool {
lhs.name < rhs.name
}
static func == (lhs: Group, rhs: Group) -> Bool {
lhs.name == rhs.name
}
}
================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Models/Language+Information.swift
================================================
//
// MIT License
// Copyright (c) 2020-2021 Raycast. All rights reserved.
//
extension Language {
typealias Informations = [Information]
struct Information: Codable {
let name: String
let displayName: String
let icon: String?
init(name: String) {
let language = Language(name)
self.name = language.name
self.displayName = language.displayName
self.icon = language.icon
}
}
}
extension Language.Information: Hashable {
func hash(into hasher: inout Hasher) {
hasher.combine(name)
}
}
================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Models/Language.swift
================================================
//
// MIT License
// Copyright (c) 2020-2021 Raycast. All rights reserved.
//
import Foundation
enum Language {
case applescript
case bash
case python
case ruby
case swift
case node
case php
case dotnet
case custom(String)
init(_ rawValue: String) {
let value = rawValue.lowercased()
switch value {
case "applescript", "osascript":
self = .applescript
case "bash", "zsh", "sh":
self = .bash
case "python", "python2", "python3":
self = .python
case "ruby":
self = .ruby
case "swift":
self = .swift
case "node", "js", "zx":
self = .node
case "php":
self = .php
case "dotnet":
self = .cs
default:
self = .custom(value)
}
}
var icon: String? {
switch self {
case .applescript:
return "icon-applescript.png"
case .bash:
return "icon-bash.png"
case .python:
return "icon-python.png"
case .ruby:
return "icon-ruby.png"
case .swift:
return "icon-swift.png"
case .node:
return "icon-nodejs.png"
case .php:
return "icon-php.png"
case .cs:
return "icon-dotnet.png"
default:
return nil
}
}
var displayName: String {
switch self {
case .applescript:
return "AppleScript"
case .bash:
return "Bash"
case .python:
return "Python"
case .ruby:
return "Ruby"
case .swift:
return "Swift"
case .node:
return "Node"
case .php:
return "PHP"
case .cs:
return ".NET"
case .custom(let name):
return name
}
}
var name: String {
displayName.lowercased()
}
}
// MARK: -
extension Language: MarkdownDescriptionProtocol {
var markdownDescription: String {
if let iconFilename = icon {
return ""
}
return displayName
}
var sectionTitle: String {
.empty
}
}
================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Models/Metadata.swift
================================================
//
// MIT License
// Copyright (c) 2020-2021 Raycast. All rights reserved.
//
import Foundation
struct Metadata: Codable {
let date: Date
var identifiers: Identifiers
}
// MARK: - Equatable
extension Metadata: Equatable {
static func == (lhs: Metadata, rhs: Metadata) -> Bool {
lhs.date == rhs.date
}
}
================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Models/RaycastData.swift
================================================
//
// MIT License
// Copyright (c) 2020-2021 Raycast. All rights reserved.
//
import Foundation
struct RaycastData: Codable {
var groups: Groups
var updatedAt: Date
var totalScriptCommands: Int
var metadata: [Metadata]
var languages: Set
var isEmpty: Bool {
groups.isEmpty
&& totalScriptCommands == 0
&& metadata.isEmpty
}
private enum CodingKeys: String, CodingKey {
case groups
case updatedAt
case totalScriptCommands
case metadata
case languages
}
init() {
self.groups = .init()
self.updatedAt = Date()
self.totalScriptCommands = 0
self.metadata = []
self.languages = []
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
groups = try container.decode(Groups.self, forKey: .groups)
totalScriptCommands = try container.decode(Int.self, forKey: .totalScriptCommands)
languages = try container.decode(Set.self, forKey: .languages)
if let value = try container.decodeIfPresent(String.self, forKey: .updatedAt) {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
self.updatedAt = dateFormatter.date(from: value) ?? Date()
} else {
self.updatedAt = Date()
}
if let metadata = try container.decodeIfPresent([Metadata].self, forKey: .metadata) {
self.metadata = metadata
} else {
self.metadata = []
}
}
}
================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Models/ScriptCommand+Author.swift
================================================
//
// MIT License
// Copyright (c) 2020-2021 Raycast. All rights reserved.
//
import Foundation
extension ScriptCommand {
typealias Authors = [Author]
struct Author: Codable {
let name: String?
let url: String?
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: InputCodingKeys.self)
name = try container.decodeIfPresent(String.self, forKey: .name)
url = try container.decodeIfPresent(String.self, forKey: .url)
}
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: OutputCodingKeys.self)
try container.encode(name, forKey: .name)
try container.encode(url, forKey: .url)
}
}
}
// MARK: - Keys
extension ScriptCommand.Author {
enum InputCodingKeys: String, CodingKey {
case url = "authorURL"
case name = "author"
}
enum OutputCodingKeys: String, CodingKey {
case url
case name
}
}
// MARK: - Comparable
extension ScriptCommand.Author: Comparable {
static func < (lhs: ScriptCommand.Author, rhs: ScriptCommand.Author) -> Bool {
guard let leftName = lhs.name, let rightName = rhs.name else {
return false
}
return leftName < rightName
}
static func == (lhs: ScriptCommand.Author, rhs: ScriptCommand.Author) -> Bool {
guard let leftName = lhs.name, let rightName = rhs.name else {
return false
}
return leftName == rightName
}
}
// MARK: - MarkdownDescription Protocol
extension ScriptCommand.Author: MarkdownDescriptionProtocol {
var markdownDescription: String {
if let name = name, let url = url {
return "[\(name)](\(url))"
} else if let name = name {
return name
} else if let url = url {
return url
}
return .empty
}
var sectionTitle: String {
.empty
}
}
// MARK: - Authors
extension Array: MarkdownDescriptionProtocol where Element == ScriptCommand.Author {
var sectionTitle: String {
.empty
}
var markdownDescription: String {
var authors = String.empty
for author in self {
let separator = self.separator(for: author.name ?? .empty)
authors += separator + author.markdownDescription
}
return authors
}
func separator(for currentName: String) -> String {
if let firstAuthor = first, currentName == firstAuthor.name {
return .empty
} else if let lastAuthor = last, currentName == lastAuthor.name {
return Separator.and
}
return Separator.comma
}
}
extension ScriptCommand.Authors {
enum Separator {
static let and = " and "
static let comma = ", "
}
}
================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Models/ScriptCommand+Icon.swift
================================================
//
// MIT License
// Copyright (c) 2020-2021 Raycast. All rights reserved.
//
import Foundation
extension ScriptCommand {
struct Icon: Codable {
let light: String?
let dark: String?
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: InputCodingKeys.self)
light = try container.decodeIfPresent(String.self, forKey: .icon)
dark = try container.decodeIfPresent(String.self, forKey: .iconDark)
}
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: OutputCodingKeys.self)
try container.encode(light, forKey: .light)
try container.encode(dark, forKey: .dark)
}
}
}
// MARK: - Keys
extension ScriptCommand.Icon {
enum InputCodingKeys: String, CodingKey {
case icon
case iconDark
}
enum OutputCodingKeys: String, CodingKey {
case light
case dark
}
}
// MARK: - HTML Render
extension ScriptCommand.Icon {
private func htmlImageTag(for lightFilepath: String?, darkFilepath: String?, path: String) -> String {
if let iconLight = lightFilepath, let iconDark = darkFilepath {
var darkURL: String { iconDark.isValidURL ? iconDark : path + iconDark }
var lightURL: String { iconLight.isValidURL ? iconLight : path + iconLight }
// This is the way to make modern HTML change images based on the theme (light or dark) used by the user
return ""
} else if let icon = lightFilepath {
var url: String { icon.isValidURL ? icon : path + icon }
return ""
} else if let icon = darkFilepath {
var url: String { icon.isValidURL ? icon : path + icon }
return ""
}
return .empty
}
func imageTag(with path: String) -> String {
if let iconLight = light, let iconDark = dark {
if iconLight.isEmoji && iconDark.isEmoji {
return iconLight
} else if iconLight.isImage && iconDark.isImage || iconLight.isValidURL && iconDark.isValidURL {
let tag = htmlImageTag(
for: iconLight,
darkFilepath: iconDark,
path: path
)
return tag
}
} else if let iconLight = light, iconLight.isEmoji {
return iconLight
} else if let iconDark = dark, iconDark.isEmoji {
return iconDark
} else if let icon = light, icon.isImage || icon.isValidURL {
let tag = htmlImageTag(
for: icon,
darkFilepath: nil,
path: path
)
return tag
} else if let icon = dark, icon.isImage || icon.isValidURL {
let tag = htmlImageTag(
for: nil,
darkFilepath: icon,
path: path
)
return tag
}
return .empty
}
}
// MARK: -
private extension String {
var isImage: Bool {
hasSuffix(".png") || hasSuffix(".jpeg") || hasSuffix(".jpg") || hasSuffix(".gif")
}
}
================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Models/ScriptCommand+Mode.swift
================================================
//
// MIT License
// Copyright (c) 2020-2021 Raycast. All rights reserved.
//
import Foundation
extension ScriptCommand {
enum Mode: String, Codable {
case fullOutput
case compact
case silent
case inline
}
}
================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Models/ScriptCommand.swift
================================================
//
// MIT License
// Copyright (c) 2020-2021 Raycast. All rights reserved.
//
import Foundation
typealias ScriptCommands = [ScriptCommand]
struct ScriptCommand: Codable {
let identifier: String
let schemaVersion: Int
let title: String
var filename: String
let mode: Mode?
var packageName: String?
let icon: Icon?
let authors: [Author]?
let details: String?
let currentDirectoryPath: String?
let needsConfirmation: Bool?
let refreshTime: String?
let language: String
let isTemplate: Bool
let hasArguments: Bool
let createdAt: String
let updatedAt: String
var path: String
private(set) var isExecutable: Bool = false
enum CodingKeys: String, CodingKey {
case identifier
case schemaVersion
case title
case filename
case mode
case packageName
case icon
case authors
case details = "description"
case currentDirectoryPath
case needsConfirmation
case refreshTime
case language
case isTemplate
case hasArguments
case createdAt
case updatedAt
case path
}
var iconDescription: String {
guard let icon = self.icon else {
return .empty
}
let path = "https://raw.githubusercontent.com/raycast/script-commands/master/commands/\(self.path)"
let tag = icon.imageTag(
with: path
)
return tag
}
var fullPath: String {
"\(path)\(filename)"
}
mutating func configure(isExecutable: Bool) {
self.isExecutable = isExecutable
}
}
// MARK: - Encode/Decode
extension ScriptCommand {
init?(from dictionary: [String: Any]) {
if let scriptCommand: ScriptCommand = dictionary.encodeToStruct() {
self = scriptCommand
} else {
return nil
}
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
// Required
self.schemaVersion = try container.decode(Int.self, forKey: .schemaVersion)
self.title = try container.decode(String.self, forKey: .title)
self.language = try container.decode(String.self, forKey: .language)
self.isTemplate = try container.decode(Bool.self, forKey: .isTemplate)
self.hasArguments = try container.decode(Bool.self, forKey: .hasArguments)
self.path = try container.decode(String.self, forKey: .path)
let filename = try container.decode(String.self, forKey: .filename)
let createdAt = try container.decode(String.self, forKey: .createdAt)
let updatedAt = try container.decode(String.self, forKey: .updatedAt)
self.filename = filename
self.createdAt = createdAt
self.updatedAt = updatedAt
do {
let value = "\(createdAt.description)\(filename)"
let identifier = try value.convertToMD5()
self.identifier = identifier
} catch let error as StringError {
fatalError(error.localizedDescription)
}
// Optionals
self.mode = try container.decodeIfPresent(Mode.self, forKey: .mode)
self.packageName = try container.decodeIfPresent(String.self, forKey: .packageName)
self.icon = try container.decodeIfPresent(Icon.self, forKey: .icon)
self.details = try container.decodeIfPresent(String.self, forKey: .details)
self.currentDirectoryPath = try container.decodeIfPresent(String.self, forKey: .currentDirectoryPath)
self.needsConfirmation = try container.decodeIfPresent(Bool.self, forKey: .needsConfirmation)
self.refreshTime = try container.decodeIfPresent(String.self, forKey: .refreshTime)
self.authors = try container.decodeIfPresent(Authors.self, forKey: .authors)
}
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(identifier, forKey: .identifier)
try container.encode(schemaVersion, forKey: .schemaVersion)
try container.encode(title, forKey: .title)
try container.encode(filename, forKey: .filename)
try container.encode(mode, forKey: .mode)
try container.encode(packageName, forKey: .packageName)
try container.encode(icon, forKey: .icon)
try container.encode(details, forKey: .details)
try container.encode(currentDirectoryPath, forKey: .currentDirectoryPath)
try container.encode(authors, forKey: .authors)
try container.encode(needsConfirmation, forKey: .needsConfirmation)
try container.encode(refreshTime, forKey: .refreshTime)
try container.encode(language, forKey: .language)
try container.encode(isTemplate, forKey: .isTemplate)
try container.encode(hasArguments, forKey: .hasArguments)
try container.encode(createdAt, forKey: .createdAt)
try container.encode(updatedAt, forKey: .updatedAt)
try container.encode(path, forKey: .path)
}
}
// MARK: - Comparable
extension ScriptCommand: Comparable {
static func < (lhs: ScriptCommand, rhs: ScriptCommand) -> Bool {
lhs.title < rhs.title
}
static func == (lhs: ScriptCommand, rhs: ScriptCommand) -> Bool {
lhs.title == rhs.title
&& lhs.schemaVersion == rhs.schemaVersion
&& lhs.authors == rhs.authors
}
}
// MARK: - MarkdownDescription Protocol
extension ScriptCommand: MarkdownDescriptionProtocol {
var markdownDescription: String {
var content: String = .empty
var author = "Raycast"
var details = "N/A"
if let value = self.authors {
author = value.markdownDescription
}
if let value = self.details {
details = value.replacingOccurrences(of: "|", with: #"\|"#)
}
let language = Language(self.language).markdownDescription
let scriptPath = "\(path)\(filename)"
let header = """
| \(iconDescription) | [\(title)](\(scriptPath)) | \(details) | \(author) | \(hasArguments ? "✅" : "") | \(isTemplate ? "✅" : "") | \(language) |
"""
content += .newLine + header
return content
}
var sectionTitle: String {
.empty
}
}
================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Protocols/MarkdownDescriptionProtocol.swift
================================================
//
// MIT License
// Copyright (c) 2020-2021 Raycast. All rights reserved.
//
import Foundation
protocol MarkdownDescriptionProtocol {
var markdownDescription: String { get }
var sectionTitle: String { get }
}
================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Typealiases/Identifier.swift
================================================
//
// MIT License
// Copyright (c) 2020-2021 Raycast. All rights reserved.
//
typealias Identifier = String
typealias Identifiers = [Identifier]
================================================
FILE: Tools/Toolkit/Tests/LinuxMain.swift
================================================
//
// MIT License
// Copyright (c) 2020-2021 Raycast. All rights reserved.
//
import XCTest
import ToolkitLibraryTests
var tests = [XCTestCaseEntry]()
tests += ToolkitLibraryTests.allTests()
XCTMain(tests)
================================================
FILE: Tools/Toolkit/Tests/ToolkitLibraryTests/ToolkitLibraryTests.swift
================================================
//
// MIT License
// Copyright (c) 2020-2021 Raycast. All rights reserved.
//
import XCTest
import class Foundation.Bundle
final class ToolkitLibraryTests: XCTestCase {
func testExample() throws {
let fooBinary = productsDirectory.appendingPathComponent("toolkit")
let process = Process()
process.executableURL = fooBinary
let pipe = Pipe()
process.standardOutput = pipe
try process.run()
process.waitUntilExit()
let data = pipe.fileHandleForReading.readDataToEndOfFile()
let output = String(data: data, encoding: .utf8)
XCTAssertEqual(output, "OVERVIEW: A tool to generate automatized documentation\n\nUSAGE: toolkit \n\nOPTIONS:\n -h, --help Show help information.\n\nSUBCOMMANDS:\n generate-documentation Generate the documentation in JSON and Markdown format\n version Print the current Toolkit version\n\n See \'toolkit help \' for detailed help.\n")
}
/// Returns path to the built products directory.
var productsDirectory: URL {
#if os(macOS)
for bundle in Bundle.allBundles where bundle.bundlePath.hasSuffix(".xctest") {
return bundle.bundleURL.deletingLastPathComponent()
}
fatalError("couldn't find the products directory")
#else
return Bundle.main.bundleURL
#endif
}
static var allTests = [
("testExample", testExample),
]
}
================================================
FILE: Tools/Toolkit/Tests/ToolkitLibraryTests/XCTestManifests.swift
================================================
//
// MIT License
// Copyright (c) 2020-2021 Raycast. All rights reserved.
//
import XCTest
#if !canImport(ObjectiveC)
public func allTests() -> [XCTestCaseEntry] {
return [
testCase(ToolkitLibraryTests.allTests),
]
}
#endif
================================================
FILE: Tools/Toolkit/integration.sh
================================================
#!/bin/bash
function commit_documentation() {
if `git status | grep -q "nothing to commit"`; then
exit 0;
else
extensions=false
readme=false
extensions_path="commands/extensions.json"
readme_path="commands/README.md"
while read -r file; do
if [[ $file == $extensions_path ]]; then
extensions=true
fi
if [[ $file == $readme_path ]]; then
readme=true
fi
done <<< "$(git diff --name-only)"
if $extensions && $readme; then
git add $extensions_path $readme_path
git commit -m "Update Script Commands documentation"
fi
exit 0;
fi
}
function commit_executable() {
if `git status | grep -q "nothing to commit"`; then
exit 0;
else
git add -u
git commit -m "Set scripts as executable"
exit 0;
fi
}
argument=$1
git config --local user.email "bot@raycast.com"
git config --local user.name "Raycast Bot"
if [[ $argument = "commit_documentation" ]]; then
commit_documentation;
elif [[ $argument = "commit_executable" ]]; then
commit_executable;
fi
================================================
FILE: _enabled-commands/.gitignore
================================================
# Ignore directory contents
*
# Except for
!.gitignore
!README.md
================================================
FILE: _enabled-commands/README.md
================================================
# How to use this directory
Grab script files you want to use from the repository and paste it here (rather than pointing directly to other repo folders). By doing this, you will avoid new unexpected scripts creeping in Raycast as community adds more. You also protect yourself from any potential folder renamings. All content in this directory will be ignored by git.
================================================
FILE: commands/README.md
================================================
# Raycast Script Commands
[Raycast](https://raycast.com) lets you control your tools with a few keystrokes
and Script Commands makes it possible to execute scripts from anywhere on your desktop.
They are a great way to speed up every-day tasks such as converting data, opening bookmarks
or triggering dev workflows.
This repository contains sample commands and documentation to write your own ones.
### 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)
- [Deepl](#deepl)
- [Devutils](#devutils)
- [Dictionary](#dictionary)
- [Downie](#downie)
- [Espanso](#espanso)
- [Eudic](#eudic)
- [Evernote](#evernote)
- [ExpressVPN](#expressvpn)
- [Fantastical](#fantastical)
- [Ferdi](#ferdi)
- [Find My](#find-my)
- [Focus](#focus)
- [GoodLinks](#goodlinks)
- [HazeOver](#hazeover)
- [Hyper](#hyper)
- [Lungo](#lungo)
- [Mail](#mail)
- [Medo](#medo)
- [MeetingBar](#meetingbar)
- [MenubarX](#menubarx)
- [Message](#Message)
- [Mullvad](#mullvad)
- [NotePlan3](#noteplan3)
- [Notes](#notes)
- [Obsidian](#obsidian)
- [One Thing](#one-thing)
- [OpenVPN](#openvpn)
- [PhpStorm](#phpstorm)
- [Plash](#plash)
- [Playground](#playground)
- [Pulse Secure](#pulse-secure)
- [Quip](#quip)
- [Raycast](#raycast)
- [Reminders](#reminders)
- [Safari](#safari)
- [Session](#session)
- [SideNotes](#sidenotes)
- [Sip](#sip)
- [Stickies](#stickies)
- [Sublime](#sublime)
- [Surfshark](#surfshark)
- [Tailscale](#tailscale)
- [Terminal Translate](#terminal-translate)
- [Things](#things)
- [Timing](#timing)
- [Todoist](#todoist)
- [Translate Shell](#translate-shell)
- [Trello](#trello)
- [TunnelBlick](#tunnelblick)
- [Viscosity](#viscosity)
- [WARP](#warp)
- [WebStorm](#webstorm)
- [Wikipedia](#wikipedia)
- [Y Pomodoro](#y-pomodoro)
- [iTerm](#iterm)
- [iconsur](#iconsur)
- [Browsing](#browsing)
- [Communication](#communication)
- [Cloudup](#cloudup)
- [DuckDuckGo Email Protection](#duckduckgo-email-protection)
- [Emojis](#emojis)
- [Gmail](#gmail)
- [Google Meet](#google-meet)
- [Mail](#mail)
- [Messenger](#messenger)
- [Slack](#slack)
- [Zoom](#zoom)
- [Conversions](#conversions)
- [Change Case](#change-case)
- [Culture](#culture)
- [Dashboard](#dashboard)
- [Countdowns](#countdowns)
- [Firebase](#firebase)
- [Mood Meter](#mood-meter)
- [Open Weather](#open-weather)
- [Dashboards](#dashboards)
- [Developer Utils](#developer-utils)
- [Aws](#aws)
- [Brew](#brew)
- [Cloudflare](#cloudflare)
- [Docker](#docker)
- [Git](#git)
- [GitHub](#github)
- [GitLab](#gitlab)
- [Google](#google)
- [Ip](#ip)
- [Minikube](#minikube)
- [Sentry](#sentry)
- [Solana](#solana)
- [Vscode](#vscode)
- [Xcode](#xcode)
- [Home](#home)
- [Elgato](#elgato)
- [Philips Hue](#philips-hue)
- [Math](#math)
- [Media](#media)
- [Apple Music](#apple-music)
- [Apple Tv](#apple-tv)
- [Cmus](#cmus)
- [Endel](#endel)
- [Lowfi](#lowfi)
- [Sonos](#sonos)
- [Speaker Setup](#speaker-setup)
- [Spotify](#spotify)
- [Tidal](#tidal)
- [foobar2000](#foobar2000)
- [Navigation](#navigation)
- [Productivity](#productivity)
- [Bitwarden](#bitwarden)
- [Imgur](#imgur)
- [Pomodoro](#pomodoro)
- [QPDF](#qpdf)
- [Writing](#writing)
- [macOCR](#macocr)
- [stopwatch](#stopwatch)
- [tesseract](#tesseract)
- [Remote Control](#remote-control)
- [Ddc](#ddc)
- [Arm64](#arm64)
- [X86](#x86)
- [Denon AVR](#denon-avr)
- [LG TV](#lg-tv)
- [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
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Agenda Today Overview](apps/agenda/agenda-today.sh) | Opens Agenda - Today Overview | [Michael Ellis](https://github.com/mtellis2) | | | |
| | [Create New On the Agenda Note](apps/agenda/agenda-new-note.sh) | Creates New Note and adds it to On the Agenda | [Michael Ellis](https://github.com/mtellis2) | ✅ | | |
| | [On the Agenda Overview](apps/agenda/agenda-on-the-agenda.sh) | Opens Agenda - On the Agenda Overview | [Michael Ellis](https://github.com/mtellis2) | | | |
#### Amphetamine
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [End Session](apps/amphetamine/amphetamine-off.applescript) | Stop Current Amphetamine Session | [James Lyons](https://github.com/jamesjlyons) | | | |
| | [Start Default Session](apps/amphetamine/amphetamine-on.applescript) | Start Default Amphetamine Session | [James Lyons](https://github.com/jamesjlyons) | | | |
#### Baremetrics
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Annual Recurring Revenue](apps/baremetrics/get-arr.sh) | Display Annual Recurring Revenue (ARR) | [Valentin Chrétien](https://github.com/valentinchrt) | | | |
| | [Average Revenue Per User](apps/baremetrics/get-arpu.sh) | Display Average revenue per user (ARPU) | [Valentin Chrétien](https://github.com/valentinchrt) | | | |
| | [Lifetime Value](apps/baremetrics/get-ltv.sh) | Display Lifetime Value (LTV) | [Valentin Chrétien](https://github.com/valentinchrt) | | | |
| | [Monthly Recurring Revenue](apps/baremetrics/get-mrr.sh) | Display Monthly Recurring Revenue (MRR) | [Valentin Chrétien](https://github.com/valentinchrt) | | | |
| | [Revenue](apps/baremetrics/simple-dashboard.sh) | Display Revenue Dashboard | [Valentin Chrétien](https://github.com/valentinchrt) | | | |
#### Bartender
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Search Bartender](apps/bartender/bartender-search.applescript) | Perform a quick search of Menu Bar Items, in Bartender 4 | Raycast | ✅ | | |
#### Bear
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Add Note](apps/bear/bear-add-note.sh) | Add a new note to Bear. | [Tanay Nistala](https://github.com/tanaynistala) | ✅ | | |
| | [Open Note](apps/bear/bear-open-note.sh) | Open the specified note in Bear. | [Tanay Nistala](https://github.com/tanaynistala) | ✅ | | |
| | [Open Tag](apps/bear/bear-open-tag.sh) | Open the specified tag in Bear. | [Tanay Nistala](https://github.com/tanaynistala) | ✅ | | |
| | [Open Today](apps/bear/bear-today.sh) | Open the Today section in Bear. | [Tanay Nistala](https://github.com/tanaynistala) | ✅ | | |
| | [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 |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Add Quick Access Overlay](apps/cleanshot/cleanshot-add-quick-access-overlay.sh) | Opens a new Quick Access Overlay with the specified image or video. | [CleanShot X](https://twitter.com/CleanShot_app) | ✅ | | |
| | [Annotate](apps/cleanshot/cleanshot-annotate.sh) | Opens specified file in Annotate. | [CleanShot X](https://twitter.com/CleanShot_app) | ✅ | | |
| | [Capture Area](apps/cleanshot/cleanshot-capture-area.sh) | Take a screenshot of a specific area on your screen. | [CleanShot X](https://twitter.com/CleanShot_app) | | | |
| | [Capture Fullscreen](apps/cleanshot/cleanshot-capture-fullscreen.sh) | Take a screenshot of your screen. | [CleanShot X](https://twitter.com/CleanShot_app) | | | |
| | [Capture Previous Area](apps/cleanshot/cleanshot-capture-previous-area.sh) | Take a screenshot of the previously specified area of your screen. | [CleanShot X](https://twitter.com/CleanShot_app) | | | |
| | [Capture Text](apps/cleanshot/cleanshot-capture-text.sh) | Opens Text Recognition (OCR) tool or extracts text from the specified file. | [CleanShot X](https://twitter.com/CleanShot_app) | ✅ | | |
| | [Capture Window](apps/cleanshot/cleanshot-capture-window.sh) | Take a screenshot of a window. | [CleanShot X](https://twitter.com/CleanShot_app) | | | |
| | [Open from Clipboard](apps/cleanshot/cleanshot-open-from-clipboard.sh) | Open screenshot that is currently in the clipboard. | [CleanShot X](https://twitter.com/CleanShot_app) | | | |
| | [Pin to the Screen](apps/cleanshot/cleanshot-pin.sh) | Pin a screenshot to the screen. | [CleanShot X](https://twitter.com/CleanShot_app) | ✅ | | |
| | [Record Screen](apps/cleanshot/cleanshot-record-screen.sh) | Start a screen recording and save it as a video or an optimized GIF file. | [CleanShot X](https://twitter.com/CleanShot_app) | | | |
| | [Record Screen With Keystroke Pro](apps/cleanshot/cleanshot-record-screen-with-keystroke-pro.sh) | Start a screen recording with keystrokes using the Keystroke Pro app and save it as a video or an optimized GIF file. | [Danylo Zalizchuk](https://raycast.com/danulqua) | | | |
| | [Restore Recently Closed File](apps/cleanshot/cleanshot-restore.sh) | Restore the recently closed file. | [CleanShot X](https://twitter.com/CleanShot_app) | | | |
| | [Scrolling Capture](apps/cleanshot/cleanshot-scrolling-capture.sh) | Capture any scrollable content. | [CleanShot X](https://twitter.com/CleanShot_app) | | | |
| | [Self-Timer](apps/cleanshot/cleanshot-self-timer.sh) | Take a screenshot after a specified delay to capture the perfect moment. | [CleanShot X](https://twitter.com/CleanShot_app) | | | |
| | [Toggle Desktop Icons](apps/cleanshot/cleanshot-toggle-desktop-icons.sh) | Hide clutter on your Desktop. | [CleanShot X](https://twitter.com/CleanShot_app) | | | |
#### Craft
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Create Doc](apps/craft/craft-create-doc.template.sh) | Creates a doc in Craft | [James Lyons](https://github.com/jamesjlyons) | ✅ | ✅ | |
| | [Search in Workspace](apps/craft/craft-search-workspace.template.sh) | Searches in Workspace in Craft | [James Lyons](https://github.com/jamesjlyons) | ✅ | ✅ | |
#### DND Me
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| 🔕 | [Start DND](apps/dnd-me/start-dnd-me.sh) | Starts DND via DND Me. The parameter has to be a menu item or slider equivalent: 15m, 30m, 1h, 2h, ..., 12h, next, next-hour, next-half-hour; it defaults to next. next-hour means the next 60m mark, next-half-hour means the next 30m mark and next means the first of the two. For example, if it's 9:22, next-hour means 10:00, next-half-hour means 9:30 and next means 9:30. | [Roland Leth](https://runtimesharks.com/projects/dnd-me) | ✅ | | |
| 🔔 | [Stop DND](apps/dnd-me/stop-dnd-me.sh) | Stops DND via DND Me. | [Roland Leth](https://runtimesharks.com/projects/dnd-me) | | | |
#### Deepl
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [DeepL App Translate](apps/deepl/deepl-app-translate.applescript) | Translate text in DeepL for Mac. Features options to input from the clipboard as well as automatically copy translation results. | [Jono Hewitt](https://github.com/jonohewitt) | ✅ | | |
| | [DeepL Web Translate](apps/deepl/deepl-web-translate.sh) | Translate text on the DeepL website. Translates to a default language if no "to" argument is given. | [Jono Hewitt](https://github.com/jonohewitt) | ✅ | | |
#### Devutils
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Backslash Escape/Unescape](apps/devutils/backslash.sh) | Escape (or unescape) backslashes in your current clipboard string | [DevUtils.app](https://devutils.app) | | | |
| | [Base64 Image Encode/Decode](apps/devutils/base64image.sh) | Decode the Base64 string in clipboard to an image (if it’s decodable) | [DevUtils.app](https://devutils.app) | | | |
| | [Base64 String Encode/Decode](apps/devutils/base64encode.sh) | Decode the Base64 string in clipboard (if it’s decodable) | [DevUtils.app](https://devutils.app) | | | |
| | [CSS Beautify/Minify](apps/devutils/cssformatter.sh) | Beautify or minify your current clipboard as CSS | [DevUtils.app](https://devutils.app) | | | |
| | [CSV to JSON](apps/devutils/csv2json.sh) | Convert your current clipboard from CSV to JSON | [DevUtils.app](https://devutils.app) | | | |
| | [Cron Job Parser](apps/devutils/cronparser.sh) | Parse the cron job expression in clipboard (if it’s a valid cron expression) | [DevUtils.app](https://devutils.app) | | | |
| | [ERB Beautify/Minify](apps/devutils/erbformatter.sh) | Beautify or minify your current clipboard as ERB | [DevUtils.app](https://devutils.app) | | | |
| | [HTML Beautify/Minify](apps/devutils/htmlformatter.sh) | Beautify or minify your current clipboard as HTML | [DevUtils.app](https://devutils.app) | | | |
| | [HTML Entity Encode/Decode](apps/devutils/htmlencode.sh) | Escape (or unescape) the HTML entities your current clipboard string | [DevUtils.app](https://devutils.app) | | | |
| | [HTML Preview](apps/devutils/htmlpreview.sh) | Show a HTML preview of your current clipboard string | [DevUtils.app](https://devutils.app) | | | |
| | [HTML to JSX](apps/devutils/html2jsx.sh) | Convert the HTML string in clipboard to JSX | [DevUtils.app](https://devutils.app) | | | |
| | [Hash Generator](apps/devutils/hashing.sh) | Calculate the hash of your current clipboard string | [DevUtils.app](https://devutils.app) | | | |
| | [JS Beautify/Minify](apps/devutils/jsformatter.sh) | Beautify or minify your current clipboard as JavaScript | [DevUtils.app](https://devutils.app) | | | |
| | [JSON Format/Validate](apps/devutils/jsonformatter.sh) | Format the JSON string currently in your clipboard (if it’s a valid JSON) | [DevUtils.app](https://devutils.app) | | | |
| | [JSON to CSV](apps/devutils/json2csv.sh) | Convert your current clipboard from JSON to CSV | [DevUtils.app](https://devutils.app) | | | |
| | [JSON to YAML](apps/devutils/json2yaml.sh) | Convert your current clipboard from JSON to YAML | [DevUtils.app](https://devutils.app) | | | |
| | [JWT Debugger](apps/devutils/jwt.sh) | Decode and verify the current JWT token in your clipboard | [DevUtils.app](https://devutils.app) | | | |
| | [LESS Beautify/Minify](apps/devutils/lessformatter.sh) | Beautify or minify your current clipboard as LESS | [DevUtils.app](https://devutils.app) | | | |
| | [Lorem Ipsum Generator](apps/devutils/loremipsum.sh) | Get some randomly generated lorem ipsum strings | [DevUtils.app](https://devutils.app) | | | |
| | [Markdown Preview](apps/devutils/markdownpreview.sh) | Preview the markdown string currently in your clipboard | [DevUtils.app](https://devutils.app) | | | |
| | [Number Base Converter](apps/devutils/numberbase.sh) | Convert numbers between bases (oct, hex, binary, etc.) | [DevUtils.app](https://devutils.app) | | | |
| | [QR Code Reader/Generator](apps/devutils/qrcode.sh) | Generate a QR code from your current clipboard string | [DevUtils.app](https://devutils.app) | | | |
| | [RegExp Tester](apps/devutils/regextester.sh) | Test your regular expression with a string and inspect matches, groups, etc. | [DevUtils.app](https://devutils.app) | | | |
| | [SCSS Beautify/Minify](apps/devutils/scssformatter.sh) | Beautify or minify your current clipboard as SCSS | [DevUtils.app](https://devutils.app) | | | |
| | [SQL Formatter](apps/devutils/sqlformatter.sh) | Format the SQL string currently in your clipboard | [DevUtils.app](https://devutils.app) | | | |
| | [String Case Converter](apps/devutils/stringcaseconverter.sh) | Convert a string in clipboard into various naming conventions | [DevUtils.app](https://devutils.app) | | | |
| | [String Inspector](apps/devutils/stringinspect.sh) | Inspect your current clipboard string (length, words count, unicode, etc.) | [DevUtils.app](https://devutils.app) | | | |
| | [Text Diff Checker](apps/devutils/textdiff.sh) | Compare two texts and find diff (per characters, words, lines, etc.) | [DevUtils.app](https://devutils.app) | | | |
| | [URL Encode/Decode](apps/devutils/urlencode.sh) | Decode the current URL string in your clipboard (if any) | [DevUtils.app](https://devutils.app) | | | |
| | [URL Parser](apps/devutils/querystringparser.sh) | Parse the URL string currently in your clipboard | [DevUtils.app](https://devutils.app) | | | |
| | [UUID/ULID Generate/Decode](apps/devutils/uuidtool.sh) | Decode the UUID in your clipboard (if any), or generate UUIDs | [DevUtils.app](https://devutils.app) | | | |
| | [Unix Time Converter](apps/devutils/unixtime.sh) | Parse and display UNIX the timestamp string currently in your clipboard | [DevUtils.app](https://devutils.app) | | | |
| | [XML Beautify/Minify](apps/devutils/xmlformatter.sh) | Beautify or minify your current clipboard as XML | [DevUtils.app](https://devutils.app) | | | |
| | [YAML to JSON](apps/devutils/yaml2json.sh) | Convert your current clipboard from YAML to JSON | [DevUtils.app](https://devutils.app) | | | |
#### Dictionary
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Look up in Dictionary](apps/dictionary/look-up-in-dictionary.applescript) | Look up selected text in Dictionary | [yayiji](https://github.com/yayiji) | | | |
#### Downie
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Download Video](apps/downie/download-video.sh) | Download video from Pasteboard link | [Clu Soh](https://twitter.com/designedbyclu) | | | |
#### Espanso
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Create Text Expansion](apps/espanso/espanso-create-expansion.sh) | Add a text expansion to expanso | [Max Stoiber](https://github.com/mxstbr) | ✅ | | |
| | [Disable Espanso](apps/espanso/disable-espanso.sh) | N/A | [es183923](https://github.com/es183923) | | | |
| | [Enable Espanso](apps/espanso/enable-espanso.sh) | N/A | [es183923](https://github.com/es183923) | | | |
| | [Restart Espanso](apps/espanso/restart-espanso.sh) | N/A | [es183923](https://github.com/es183923) | | | |
| | [Start Espanso](apps/espanso/start-espanso.sh) | N/A | [es183923](https://github.com/es183923) | | | |
| | [Stop Espanso](apps/espanso/stop-espanso.sh) | N/A | [es183923](https://github.com/es183923) | | | |
#### Eudic
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Look up Word](apps/eudic/look-up-in-eudic.applescript) | look up in eudic | [jingyi](https://jingyi.blog) | ✅ | | |
#### Evernote
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Create Evernote](apps/evernote/create-note.applescript) | Creates a new Evernote. | [Aaron Miller](https://github.com/aaronhmiller) | | | |
| | [Create Evernote Paste Clipboard](apps/evernote/create-note-paste-clipboard.applescript) | Creates a new Evernote, pastes in the contents of the clipboard, and positions the cursor in the title area. | [Aaron Miller](https://github.com/aaronhmiller) | | | |
#### ExpressVPN
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Connect](apps/expressvpn/expressvpn-connect.applescript) | N/A | [Amir Hossein SamadiPour](https://github.com/SamadiPour) | | | |
| | [Disconnect](apps/expressvpn/expressvpn-disconnect.applescript) | N/A | [Amir Hossein SamadiPour](https://github.com/SamadiPour) | | | |
| | [Reconnect](apps/expressvpn/expressvpn-reconnect.applescript) | N/A | [Amir Hossein SamadiPour](https://github.com/SamadiPour) | | | |
#### Fantastical
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Create Event](apps/fantastical/create-event.applescript) | Create an event in Fantastical | [Robert Cooper](https://github.com/robertcoopercode) | ✅ | | |
| | [Create Task](apps/fantastical/create-todo-in-fantastical.applescript) | Speed up setting reminders for Fantastical by invoking this script. | [Vardan Sawhney](https://github.com/commai) | ✅ | | |
#### Ferdi
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [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 |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Open Focus Preferences](apps/focus/focus-preferences.sh) | Open focus preferences. | [Ernest Ojeh](https://github.com/namzo) | | | |
| | [Start 25 minutes Focus Session](apps/focus/focus-start-session-25.sh) | Start a 25 minutes focus session. | [Ernest Ojeh](https://github.com/namzo) | | | |
| | [Start Custom Break](apps/focus/focus-start-custom-break.sh) | Start a custom break. If you don't enter any values, it uses the last break duration. | [Ernest Ojeh](https://github.com/namzo) | ✅ | | |
| | [Start Custom Focus Session](apps/focus/focus-start-custom-session.sh) | Start a custom focus session. If you don't enter any values, it starts an untimed focus session. | [Ernest Ojeh](https://github.com/namzo) | ✅ | | |
| | [Start Focus Session (Focus)](apps/focus/focus-start-session.sh) | Start an untimed focus session. | [Ernest Ojeh](https://github.com/namzo) | | | |
| | [Stop Break (Unbreak)](apps/focus/focus-stop-break.sh) | Stop break and continues the current focus session. | [Ernest Ojeh](https://github.com/namzo) | | | |
| | [Stop Focus Session (Unfocus)](apps/focus/focus-stop-session.sh) | Stop the current focus session. | [Ernest Ojeh](https://github.com/namzo) | | | |
| | [Take 5 Minutes Break](apps/focus/focus-start-break-5.sh) | Take 5 minutes break. | [Ernest Ojeh](https://github.com/namzo) | | | |
| | [Toggle Focus Session](apps/focus/focus-toggle-focus.sh) | Toggle between start session (untimed) and stop session. | [Ernest Ojeh](https://github.com/namzo) | | | |
#### GoodLinks
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Open Last Unread Link](apps/goodlinks/goodlinks-last-unread-link.sh) | Open the last unread link in the GoodLinks app | [Filip Chabik](https://github.com/hadret) | | | |
| | [Open Link](apps/goodlinks/goodlinks-open-link.sh) | Open a link in the GoodLinks app | [Filip Chabik](https://github.com/hadret) | ✅ | | |
| | [Open Random Unread Link](apps/goodlinks/goodlinks-random-unread-link.sh) | Open a random unread link in the GoodLinks app | [Filip Chabik](https://github.com/hadret) | | | |
| | [Save Link](apps/goodlinks/goodlinks-save-link.sh) | Saves a new link to GoodLinks | [Filip Chabik](https://github.com/hadret) | ✅ | | |
| | [Show Read List](apps/goodlinks/goodlinks-read-list.sh) | Show Read list in the GoodLinks app | [Filip Chabik](https://github.com/hadret) | | | |
| | [Show Starred List](apps/goodlinks/goodlinks-starred-list.sh) | Show Starred list in the GoodLinks app | [Filip Chabik](https://github.com/hadret) | | | |
| | [Show Tag](apps/goodlinks/goodlinks-tagged-links.sh) | Show links tagged with the specified tag in the GoodLinks app | [Filip Chabik](https://github.com/hadret) | ✅ | | |
| | [Show Unread List](apps/goodlinks/goodlinks-unread-list.sh) | Show Unread list in the GoodLinks app | [Filip Chabik](https://github.com/hadret) | | | |
| | [Show Untagged List](apps/goodlinks/goodlinks-untagged-list.sh) | Show Untagged list in the GoodLinks app | [Filip Chabik](https://github.com/hadret) | | | |
#### HazeOver
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Set Intensity](apps/hazeover/hazeover-set-intensity.applescript) | Set dimming intensity of background windows. | [Thomas Paul Mann](https://github.com/thomaspaulmann) | ✅ | | |
| | [Toggle Dimming](apps/hazeover/hazeover-toggle-dimming.applescript) | Toggle dimming of all background windows. | [Thomas Paul Mann](https://github.com/thomaspaulmann) | | | |
#### Hyper
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Run Shell Command](apps/hyper/hyper-run-shell-command.applescript) | Run a terminal using Hyper | [Eliot Hertenstein](https://github.com/eIiot) | ✅ | | |
#### Lungo
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Activate](apps/lungo/lungo-activate.sh) | Deactivate Lungo. | [Lungo](https://sindresorhus.com/lungo) | ✅ | | |
| | [Deactivate](apps/lungo/lungo-deactivate.sh) | Deactivate Lungo. | [Lungo](https://sindresorhus.com/lungo) | | | |
| | [Toggle](apps/lungo/lungo-toggle.sh) | Toggle Lungo. | [Lungo](https://sindresorhus.com/lungo) | ✅ | | |
#### Mail
| 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
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Add Task](apps/medo/add-task.sh) | Add a new task | [Aayush ](https://github.com/Aayush9029) | ✅ | | |
| | [Medo Float](apps/medo/medo-float.sh) | Add a new task with priority | [Aayush ](https://github.com/Aayush9029) | | | |
| | [Medo Float Large](apps/medo/medo-float-large.sh) | Add a new task with priority | [Aayush ](https://github.com/Aayush9029) | | | |
| | [Medo Float Small](apps/medo/medo-float-small.sh) | Add a new task with priority | [Aayush ](https://github.com/Aayush9029) | | | |
#### MeetingBar
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Create Meeting](apps/meetingbar/meetingbar-create-meeting.applescript) | Create a new meeting. | [Jakub Lanski](https://github.com/jaklan) | | | |
| | [Join Meeting](apps/meetingbar/meetingbar-join-meeting.applescript) | Join the ongoing or upcoming meeting. | [Jakub Lanski](https://github.com/jaklan) | | | |
#### MenubarX
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Close Last Tab](apps/menubarx/close-last-menubarx-tab.sh) | Close last viewed tab in MenubarX | [Clu Soh](https://twitter.com/designedbyclu) | | | |
| | [Open Tabs](apps/menubarx/open-tab-in-menubar.applescript) | Open X Tab in your menubar | [Clu Soh](https://twitter.com/designedbyclu) | ✅ | | |
| | [Open in MenubarX](apps/menubarx/open-in-menubarx.sh) | Open Pasteboard link in MenubarX | [Clu Soh](https://twitter.com/designedbyclu) | | | |
#### Message
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Copy Code](apps/Message/copycode.sh) | Copy verification code from a message. | [Fatpandac](https://github.com/Fatpandac) | | | |
#### Mullvad
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Connect](apps/mullvad/connect.sh) | Connect the Mullvad VPN tunnel using the most recent configuration settings. | [Phil Salant](https://github.com/PSalant726) | | | |
| | [Connect to Location](apps/mullvad/location.sh) | Connect the Mullvad VPN tunnel using the specified location. | [Phil Salant](https://github.com/PSalant726) | ✅ | | |
| | [Disconnect](apps/mullvad/disconnect.sh) | Disconnect from the Mullvad VPN tunnel. | [Phil Salant](https://github.com/PSalant726) | | | |
| | [Mullvad Status](apps/mullvad/status.sh) | Display the current status of the Mullvad VPN tunnel connection. | [Phil Salant](https://github.com/PSalant726) | | | |
| | [Reconnect](apps/mullvad/reconnect.sh) | Force the client to reconnect to the Mullvad VPN tunnel. | [Phil Salant](https://github.com/PSalant726) | | | |
| | [Search Countries, Cities, and Hostnames](apps/mullvad/search.sh) | Search the list of available entities to which a Mullvad VPN tunnel connection can be made. | [Phil Salant](https://github.com/PSalant726) | ✅ | | |
#### NotePlan3
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Append To Daily Note](apps/noteplan3/noteplan-append-daily-note.sh) | Append to daily note | [Göran Damberg](https://github.com/gdamberg) | ✅ | | |
| | [New Note From Clipboard](apps/noteplan3/noteplan-new-note-from-clipboard.sh) | Create a new note from clipboard | [Göran Damberg](https://github.com/gdamberg) | ✅ | | |
#### Notes
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Append Content From Clipboard](apps/notes/append-note-from-clipboard.applescript) | Script to append to an existing note content from clipboard. | [Ayoub Gharbi](https://github.com/ayoub-g) | ✅ | | |
| | [Create Note](apps/notes/create-note.applescript) | Create a new Note | [Vardan Sawhney](https://github.com/commai) | ✅ | | |
| | [Create Note From Clipboard](apps/notes/create-note-from-clipboard.applescript) | Create Note From Clipboard | [Ayoub Gharbi](https://github.com/ayoub-g) | ✅ | | |
| | [Open Note](apps/notes/open-note.applescript) | Open Note via its Title | [Vardan Sawhney](https://github.com/commai) | ✅ | | |
| | [Search Note By Name](apps/notes/search-note-by-name.applescript) | This script searches for a note, given its exact name, or a substring, the search does not consider case | [Ayoub Gharbi](github.com/ayoub-g) | ✅ | | |
#### Obsidian
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Create Note](apps/obsidian/obsidian-create-note.template.sh) | Create a new note | [Yiyao Wei](https://github.com/HotThoughts) | ✅ | ✅ | |
| | [Search in Vault](apps/obsidian/obsidian-search-vault.template.sh) | Search Obsidian Vault | [Yiyao Wei](https://github.com/HotThoughts) | ✅ | ✅ | |
#### One Thing
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Clear Text](apps/one-thing/one-thing-clear-text.sh) | Clear the text shown in One Thing app. | [One Thing](https://sindresorhus.com/one-thing) | | | |
| | [Set Text](apps/one-thing/one-thing-set-text.sh) | Set the text shown in One Thing app. | [One Thing](https://sindresorhus.com/one-thing) | ✅ | | |
#### OpenVPN
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Connect OpenVPN](apps/openvpn/connect-openvpn.applescript) | Prepares OpenVPN Connect client to connect or reconnect. | [Aaron Miller](https://github.com/aaronhmiller) | | | |
| | [Disconnect OpenVPN](apps/openvpn/disconnect-openvpn.applescript) | Disconnects the OpenVPN Connect client from VPN. | [Aaron Miller](https://github.com/aaronhmiller) | | | |
| | [Quit OpenVPN](apps/openvpn/quit-openvpn.applescript) | Quits the OpenVPN Connect client. | [Aaron Miller](https://github.com/aaronhmiller) | | | |
#### PhpStorm
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Update Recent Projects](apps/phpstorm/recent-projects.sh) | N/A | Raycast | | | |
#### Plash
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Add Website](apps/plash/plash-add-website.sh) | Add a website to Plash. | [Plash](https://github.com/sindresorhus/Plash) | ✅ | | |
| | [Next Website](apps/plash/plash-next-website.sh) | Switch to the next website in the list in Plash. | [Plash](https://github.com/sindresorhus/Plash) | | | |
| | [Previous Website](apps/plash/plash-previous-website.sh) | Switch to the previous website in the list in Plash. | [Plash](https://github.com/sindresorhus/Plash) | | | |
| | [Reload Website](apps/plash/plash-reload-website.sh) | Reload the current website in Plash. | [Plash](https://github.com/sindresorhus/Plash) | | | |
| | [Switch to Random Website](apps/plash/plash-random-website.sh) | Switch to a random website from the list of websites in Plash. | [Plash](https://github.com/sindresorhus/Plash) | | | |
| | [Toggle Browsing Mode](apps/plash/plash-toggle-browser-mode.sh) | Toggle browsing mode in Plash. | [Plash](https://github.com/sindresorhus/Plash) | | | |
#### Playground
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| 🕊 | [Create Basic](apps/playground/open-new-playground.py) | Create and open a new basic Swift Playground | [Quentin Eude](https://github.com/qeude) | ✅ | | |
| 🕊 | [Create View Based](apps/playground/open-new-view-playground.py) | Create and open a new view based Swift Playground | [Quentin Eude](https://github.com/qeude) | ✅ | | |
#### Pulse Secure
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Connect / Reconnect](apps/pulse-secure/pulse-secure-connect.applescript) | Connect to the given / default connection with the given / default username. | [Jakub Lanski](https://github.com/jaklan) | ✅ | | |
| | [Disconnect / Cancel](apps/pulse-secure/pulse-secure-disconnect.applescript) | Disconnect / cancel the active connection. | [Jakub Lanski](https://github.com/jaklan) | | | |
| | [Resume](apps/pulse-secure/pulse-secure-resume.applescript) | Resume the suspended connection. | [Jakub Lanski](https://github.com/jaklan) | | | |
| | [Suspend](apps/pulse-secure/pulse-secure-suspend.applescript) | Suspend the active connection. | [Jakub Lanski](https://github.com/jaklan) | | | |
#### Quip
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Set up Quip commands](apps/quip/set-up-quip-commands.py) | Create script commands for creating Quip documents, based on the configuration in quip_config.ini. | [diego_zamboni](https://raycast.com/diego_zamboni) | | | |
| | [{{commandtitle}}](apps/quip/quip-new.template.py) | Configure your Quip API token and other defaults in quip_config.ini | [zzamboni](https://raycast.com/zzamboni) | ✅ | ✅ | |
#### Raycast
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| 🎉 | [Celebrate](apps/raycast/celebrate.sh) | Set Confetti to run for a number of times and during intervals | [Fatpandac](https://github.com/Fatpandac) | ✅ | | |
#### Reminders
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Add Reminder](apps/reminders/reminders-create-reminder.sh) | Add a new reminder. | [Andrei Nedelcu](https://dinosaurgame.net) | ✅ | | |
#### Safari
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Add Item to Reading List](apps/safari/safari-create-reading-list-item.applescript) | Add a new Reading List item with the given URL. Allows a custom title to be specified. | [Thomas Paul Mann](https://github.com/thomaspaulmann) | ✅ | | |
| | [Clear Cache and Refresh Page](apps/safari/safari-clear-cache-reload.applescript) | This script clears cache and reloads the page of the frontmost Safari window. | [Aaron Miller](https://github.com/aaronhmiller) | | | |
| | [Close All Tabs](apps/safari/safari-close-all-tabs.applescript) | Close all tabs in the frontmost window | [Thomas Paul Mann](https://github.com/thomaspaulmann) | | | |
| | [Close Duplicated Tabs](apps/safari/safari-close-duplicated-tabs.applescript) | Close tabs with the same URL. | [Thomas Paul Mann](https://github.com/thomaspaulmann) | | | |
| | [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) | | | |
| | [Open Safari URL in Firefox](apps/safari/safari-current-page-url-in-firefox.applescript) | Open current Safari URL in new tab in Firefox | [Dave Lehman](https://github.com/dlehman) | | | |
#### Session
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Abandon Session](apps/session/session-abandon.sh) | Starts a focus session in Session app | [James Lyons](https://github.com/jamesjlyons) | | | |
| | [Finish Session](apps/session/session-finish.sh) | Finishes a focus session in Session app | [James Lyons](https://github.com/jamesjlyons) | | | |
| | [Pause Session](apps/session/session-pause.sh) | Starts a focus session in Session app | [James Lyons](https://github.com/jamesjlyons) | | | |
| | [Start Previous Session](apps/session/session-start-previous.sh) | Starts a focus session in Session app with the previous intent and duration | [James Lyons](https://github.com/jamesjlyons) | | | |
| | [Start Session](apps/session/session-start-new.sh) | Starts a focus session in Session app | [James Lyons](https://github.com/jamesjlyons) | ✅ | | |
#### SideNotes
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [SideNotes create](apps/sidenotes/sidenotes-create-note.applescript) | Create a new note within the selected or the first SideNotes folder. | [Marcel Bochtler](https://github.com/MarcelBochtler) | ✅ | | |
#### Sip
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [ Add Color to History](apps/sip/sip-add-hex-color.sh) | Add a color to your Sip history. | [Sip](https://twitter.com/sip_app/) | ✅ | | |
| | [Check Contrast](apps/sip/sip-check-contrast-hex.sh) | Open Sip Contrast Checker. | [Sip](https://twitter.com/sip_app/) | ✅ | | |
| | [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 |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Open with Sublime](apps/sublime/open-with-sublime.applescript) | Open currently focused directory in Sublime | [Rock Hu](https://twitter.com/0xRock) | | | |
#### Surfshark
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Surfshark VPN Status](apps/surfshark/surfshark-vpn-status.sh) | Get Surfshark VPN status | [Jordi Clement](https://github.com/jordicl) | | | |
| | [VPN Connect](apps/surfshark/surfshark-vpn-start.sh) | Start Surfshark VPN connection | [Jordi Clement](https://github.com/jordicl) | | | |
| | [VPN Disconnect](apps/surfshark/surfshark-vpn-stop.sh) | Stop Surfshark VPN connection | [Jordi Clement](https://github.com/jordicl) | | | |
#### Tailscale
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [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) and [Daniel Schoemer](https://github.com/quatauta) | | | |
#### Terminal Translate
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| 📖 | [Translate](apps/terminal-translate/translate.sh) | Translate word or sentence. | [Fatpandac](https://github.com/Fatpandac) | ✅ | | |
#### Things
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Create To-Do](apps/things/things-create-todo.sh) | Create a new To-Do with title and optional deadline. | [Things](https://twitter.com/culturedcode/) | ✅ | | |
| | [Current To-Do](apps/things/things-current-todo.applescript) | Show your current To-Do to stay focused. | [Things](https://twitter.com/culturedcode/) | | | |
| | [Search To-Dos](apps/things/things-search-to-dos.sh) | Search To-Dos with a query. | [Things](https://twitter.com/culturedcode/) | ✅ | | |
| | [Today](apps/things/things-today.applescript) | Get an overview of your completed tasks for today. | [Things](https://twitter.com/culturedcode/) | | | |
#### Timing
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Start Timer](apps/timing/timing-start-timer.js) | Start a timer | [Landen Danyluk](https://github.com/landendanyluk) | ✅ | | |
| | [Stop Timer](apps/timing/timing-stop-timer.js) | Stop the active timer | [Landen Danyluk](https://github.com/landendanyluk) | | | |
#### Todoist
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Create Task](apps/todoist/create-task.template.sh) | Create Task | [Faris Aziz](https://github.com/farisaziz12) | ✅ | ✅ | |
| | [Get Tasks](apps/todoist/get-tasks.template.sh) | Gets All Todoist tasks | [Faris Aziz](https://github.com/farisaziz12) | | ✅ | |
#### Translate Shell
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| 🌍 | [Translate Shell](apps/translate-shell/translate-shell-language-pair.py) | Translate text using translate-shell. | [Marcel Bochtler](https://github.com/MarcelBochtler) | ✅ | | |
| 📖 | [Translate to EN](apps/translate-shell/translate-to-en.sh) | Translate and copy brief translation to clipboard. | [tiancheng92](https://github.com/tiancheng92) | ✅ | | |
| 📖 | [Translate to ZH](apps/translate-shell/translate-to-zh.sh) | Translate and copy brief translation to clipboard. | [tiancheng92](https://github.com/tiancheng92) | ✅ | | |
#### Trello
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Create Card](apps/trello/create-trello-card.template.py) | Create a new Trello card | [Michael Francis](https://github.com/mikefrancis) | ✅ | ✅ | |
#### TunnelBlick
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Tunnelblick: Connect](apps/tunnelblick/tunnelblick-connect.applescript) | Connect a VPN configuration. | [Achille Lacoin](https://github.com/pomdtr) | ✅ | | |
| | [Tunnelblick: Connect All](apps/tunnelblick/tunnelblick-connect-all.applescript) | Connect all unconnected VPN configurations. | [Achille Lacoin](https://github.com/pomdtr) | | | |
| | [Tunnelblick: Disconnect](apps/tunnelblick/tunnelblick-disconnect.applescript) | Disconnect a VPN configuration. | [Achille Lacoin](https://github.com/pomdtr) | ✅ | | |
| | [Tunnelblick: Disconnect All](apps/tunnelblick/tunnelblick-disconnect-all.applescript) | Disconnect all connected VPN configurations. | [Achille Lacoin](https://github.com/pomdtr) | | | |
#### Viscosity
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Viscosity: Connect](apps/viscosity/viscosity-connect.applescript) | Connect a VPN viscosity configuration. | [Luigi Cardito (credits Achille Lacoin https://github.com/pomdtr)](https://github.com/lcardito) | ✅ | | |
| | [Viscosity: Connect All](apps/viscosity/viscosity-connect-all.applescript) | Connect all unconnected VPN configurations. | [Luigi Cardito (credits Achille Lacoin https://github.com/pomdtr)](https://github.com/lcardito) | | | |
| | [Viscosity: Disconnect](apps/viscosity/viscosity-disconnect.applescript) | Disconnect a VPN configuration. | [Luigi Cardito (credits Achille Lacoin https://github.com/pomdtr)](https://github.com/lcardito) | ✅ | | |
| | [Viscosity: Disconnect All](apps/viscosity/viscosity-disconnect-all.applescript) | Disconnect all connected VPN configurations. | [Luigi Cardito (credits Achille Lacoin https://github.com/pomdtr)](https://github.com/lcardito) | | | |
#### WARP
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Connect](apps/warp/warp-start.sh) | Create a connection to WARP | [Sergey Fuksman](https://github.com/fuksman) | | | |
| | [Disconnect](apps/warp/warp-stop.sh) | Disconnect from WARP | [Sergey Fuksman](https://github.com/fuksman) | | | |
| | [Reauthenticate](apps/warp/warp-reauth.sh) | Force WARP reauthentication | [Daniils Petrovs](https://github.com/danirukun) | | | |
| | [Toggle WARP](apps/warp/warp-toggle.sh) | Toggle Connection | [Sergey Fuksman](https://github.com/fuksman) | | | |
| | [WARP Status](apps/warp/warp-status.sh) | Check WARP connection | [Sergey Fuksman](https://github.com/fuksman) | | | |
#### WebStorm
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Open](apps/webstorm/open-workspace.template.sh) | Open WebStorm projects | [Daniel Stovv](https://github.com/stovv) | ✅ | ✅ | |
#### Wikipedia
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Wikipedia Search](apps/wikipedia/wikipedia-search.py) | Search Wikipedia and display the result in Raycast | [Juan I. Serra](https://twitter.com/jiserra) | ✅ | | |
#### Y Pomodoro
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| 🍅 | [Pause](apps/y-pomodoro/pause.sh) | Pause active pomodoro timer using [y-pomodoro](https://github.com/jesse-c/y-pomodoro) | [Jesse Claven](https://github.com/jesse-c) | | | |
| 🍅 | [Resume](apps/y-pomodoro/resume.sh) | Resume active pomodoro timer using [y-pomodoro](https://github.com/jesse-c/y-pomodoro) | [Jesse Claven](https://github.com/jesse-c) | | | |
| 🍅 | [Show](apps/y-pomodoro/show.sh) | Show active pomodoro timer using [y-pomodoro](https://github.com/jesse-c/y-pomodoro) | [Jesse Claven](https://github.com/jesse-c) | | | |
| 🍅 | [Start](apps/y-pomodoro/start.sh) | Start a pomodoro timer using [y-pomodoro](https://github.com/jesse-c/y-pomodoro) | [Jesse Claven](https://github.com/jesse-c) | | | |
| 🍅 | [Stop](apps/y-pomodoro/stop.sh) | Stop active pomodoro timer using [y-pomodoro](https://github.com/jesse-c/y-pomodoro) | [Jesse Claven](https://github.com/jesse-c) | | | |
#### iTerm
| 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
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| 🅱️ | [Change Application Icon](apps/iconsur/iconsur.sh) | Change App icons to match Big Sur | [StevenRCE0](https://github.com/StevenRCE0) | ✅ | | |
## Browsing
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| 🐔 | [Convert Twitter to Nitter](browsing/convert-twitter-to-nitter.js) | Convert Twitter link to Nitter | [cSharp](https://github.com/noidwasavailable) | | | |
| 🧭 | [Copy Current Page URL](browsing/safari-current-page-url.sh) | This script copies URL of currently opened page in Safari into clipboard. | [Kirill Gorbachyonok](https://github.com/japanese-goblinn) | | | |
| 🧭 | [Copy Current Page URL](browsing/chrome-current-page-url.sh) | This script copies URL of currently opened page in Google Chrome into clipboard. | [Jakub Lanski](https://github.com/jaklan) | | | |
| 🧭 | [Copy Current Window URLs](browsing/safari-current-window-urls.applescript) | This script copies to clipboard all URLs from frontmost Safari window. | [Kirill Gorbachyonok](https://github.com/japanese-goblinn) | | | |
| | [Create Short URL](browsing/shlink-create-short-url.template.sh) | Create a short URL using Shlink | [Eliot Hertenstein](https://github.com/eIiot) | ✅ | ✅ | |
| 🥽 | [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) | ✅ | ✅ | |
| 🖼️ | [Screenshot Website](browsing/website-screenshots.sh) | Takes screenshots of the entered URL using [`pageres`](https://github.com/sindresorhus/pageres) and saves it to the Desktop. | [Caleb Stauffer](https://github.com/crstauf) | ✅ | | |
| 🔗 | [Shorten URL From Clipboard](browsing/shorten-url.sh) | Shorten the URL in your Clipboard with Tiny URL. | [Thomas Paul Mann](https://github.com/thomaspaulmann) | | | |
| | [Shorten URL from GitHub](browsing/git-io.sh) | Shorten any github.com URL | [Astrit](https://github.com/astrit) | | | |
| 🔗 | [Shorten URL with Bitly](browsing/shorten-url-bitly.template.sh) | Transform the clipboard contents to a short Bitly URL | [Nitin Gupta](https://twitter.com/gniting) | | ✅ | |
| 🔗 | [Shorten URL with Emojis](browsing/short-url-emoji.sh) | Transform the clipboard contents to a short Emoji URL | [Samuel Henry](https://bne.sh) | | | |
| 📹 | [Youtube Shorts in video player](browsing/Youtube Shorts in video player.sh) | Opens current Youtube Shorts video in the normal video player by replacing "/shorts/" with "/v/" in the url. | [Kailash Yellareddy](https://github.com/kyellareddy) | | | |
## Communication
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| 🔐 | [2FA from iMessages](communication/imessage-2fa.sh) | Get most recent two-factor authentication code from iMessages. | [Caleb Stauffer](https://github.com/crstauf) and [Thiago Holanda](https://twitter.com/tholanda) | | | |
| 📱 | [Call with iPhone](communication/call-with-iphone.sh) | Place a telephone call via your iPhone on Wi-Fi. | [Alexander JH Steffen](https://github.com/alexjsteffen) | ✅ | | |
| 🔐 | [Generate Passphrase](communication/xkcdpass.sh) | Use [xkcdpass](https://github.com/redacted/XKCD-password-generator) to create a passphrase. | [Caleb Stauffer](https://github.com/crstauf) | | | |
| 🤡 | [Let Me Google That](communication/let-me-google-that.sh) | Let Me Google That For You | [Leo Fritsch](https://github.com/leofritsch) | | | |
| 🗣 | [Say](communication/say.sh) | Convert text to audible speech. | [Felipe Turcheti](https://felipeturcheti.com) | ✅ | | |
| | [Share Secret from Clipboard](communication/share-secret-doppler.py) | Share secret securely using https://share.doppler.com/. | [Petr Nikolaev](https://github.com/PitNikola) | ✅ | | |
#### Cloudup
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Paste](communication/cloudup/cloudup-paste.sh) | Upload clipboard contents to [Cloudup](https://cloudup.com/). | [Caleb Stauffer](https://github.com/crstauf) | | | |
| | [Pick](communication/cloudup/cloudup-pick.sh) | Open file dialog and upload to [Cloudup](https://cloudup.com/). | [Caleb Stauffer](https://github.com/crstauf) | | | |
| | [Upload](communication/cloudup/cloudup-upload.sh) | Upload path or URL in clipboard to [Cloudup](https://cloudup.com/). | [Caleb Stauffer](https://github.com/crstauf) | | | |
#### DuckDuckGo Email Protection
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Configure](communication/duckduckgo-email-protection/configure-@duck.com-script-command.applescript) | Use this script command to configure your @duck.com authorizationID | [Rediwed](github.com/Rediwed) | ✅ | | |
| | [Generate Unique Address](communication/duckduckgo-email-protection/generate-unique-email-address.applescript) | This script command generates a unique private @duck.com email address. | [Rediwed](github.com/Rediwed) | | | |
#### Emojis
| 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) | ✅ | | |
#### Gmail
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Gmail](communication/gmail/google-gmail.sh) | Open gmail.com in the default browser | [Michael Aigner](https://github.com/tonka3000) | | | |
#### Google Meet
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Open Google Meet](communication/google-meet/meet.sh) | Start a Google Meet session | [Mujib Azizi](https://github.com/mujibazizi) | | | |
#### Mail
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| ✉️ | [Open Most Recent Email](communication/mail/open-most-recent-email.applescript) | Open the last received email in your inbox in Mail.app | [Ben Yoon](https://github.com/benyn) | | | |
#### Messenger
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Open Conversation](communication/messenger/messenger-open-conversation.applescript) | N/A | [Jakub Lanski](https://github.com/jaklan) | ✅ | | |
#### Slack
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| ⏰ | [Add Reminder](communication/slack/add-slack-reminder.template.sh) | Create a Slack reminder | [Zeb Pykosz](https://github.com/zebapy) | ✅ | ✅ | |
| | [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) | ✅ | | |
| | [Set DND Status](communication/slack/set-slack-DND-status.sh) | Set your DND status in Slack | [Sam Ching](https://github.com/samching) | ✅ | | |
| | [Set Status in Slack to Spotify Song](communication/slack/set-slack-status-spotify.sh) | Set your status in Slack to a song currently playing in Spotify. | [alongat](https://github.com/alongat) | | | |
| ☕️ | [Set Status to Coffee](communication/slack/set-slack-status.template.sh) | Set your status in Slack. | [Thomas Paul Mann](https://github.com/thomaspaulmann) | | ✅ | |
| | [Set WFH Status in Slack](communication/slack/set-slack-wfh-status.sh) | Set your status in Slack to WFH or WFO depending on your WiFi | [alongat](https://github.com/alongat) | | | |
#### Zoom
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Leave Meeting](communication/zoom/leave-meeting.applescript) | Leaves Current Zoom meeting | [Faris Aziz](https://github.com/farisaziz12) | | | |
| | [Rename Profile](communication/zoom/rename-profile.applescript) | Rename your profile in Zoom Meeting App (Mac Only) and cliclick. | [Leo Voon](https://github.com/leovoon) | ✅ | | |
| | [Toggle Microphone](communication/zoom/toggle-mic.applescript) | Mute/Unmute your microphone in the current meeting | [Luigi Cardito](https://github.com/lcardito) and [Faris Aziz](https://github.com/farisaziz12) | | | |
| | [Toggle Video](communication/zoom/toggle-video.applescript) | Show/Hide your microphone in the current meeting | [Luigi Cardito](https://github.com/lcardito) and [Faris Aziz](https://github.com/farisaziz12) | | | |
## Conversions
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| 📋 | [Clipboard to Markdown](conversions/clipboard-to-markdown.js) | Automatically take the content found in the clipboard and turn it into Markdown | [Alessandra Pereyra](https://github.com/alessandrapereyra) | | | |
| 🎨 | [Color Conversion](conversions/color-conversion.sh) | Convert color formats (e.g. #FFEEFF -> rgba(255,238,255,1) | [quelhasu](https://github.com/quelhasu) | ✅ | | |
| 🗂 | [Column to Comma](conversions/column-to-comma.sh) | Converts column to comma separated list. | Raycast | | | |
| ⏱ | [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) | ✅ | | |
| 🎨 | [Hex to RGBA](conversions/hex-to-rgba.sh) | Convert hexadecimal color value to RGBA value. | [Caleb Stauffer](https://github.com/crstauf) | ✅ | | |
| 🧱 | [Markdown Table](conversions/create-markdown-table.js) | Create a markdown table template | [Ryan Nystrom](https://github.com/rnystrom) | ✅ | | |
| 📋 | [OCR Image](conversions/clipboard-ocr.sh) | OCR Image from Clipboard | [xxchan](https://github.com/xxchan) | | | |
| 📋 | [Paste and Match Style](conversions/paste-as-plain-text.applescript) | A script to click the "Paste and Match Style" menu item, even if it's disabled | [Michael Bianco](https://github.com/iloveitaly) | | | |
| | [QR Code Generation](conversions/qrcode-generate.sh) | QR Code Generation | [wyhaya](https://github.com/wyhaya) | ✅ | | |
| 📝 | [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) | ✅ | | |
| 🕰 | [Unix Time Reader From Clipboard](conversions/unix-time-reader.sh) | Display Human-Readable Date from Unix Time in Clipboard | [Francis Feng](https://github.com/francisfeng) | | | |
| 🌇 | [Vaporwave Text](conversions/vaporwave-text.sh) | Convert clipboard text to vaporwave | [Adam Zethraeus](https://github.com/adam-zethraeus) | ✅ | | |
| 📅 | [What Day Is...](conversions/what-day-is.py) | Return the day of the week on which a particular date falls. | [Phil Salant](https://github.com/PSalant726) | ✅ | | |
| 👹 | [Zalgo Text](conversions/zalgo-text.swift) | Converts text to z̫̫̐a̳ͩl̓͂̀ͅg͔̚o̷̦̣͢ t̳͆ḛ̊͟ẍ̮̝́t̵̔ͯ͝ | [Adam Zethraeus](https://github.com/adam-zethraeus) | ✅ | | |
#### Change Case
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Camel Case](conversions/change-case/camelcase.py) | Change to clipboard text to camel case | [Robert Cooper](https://github.com/robertcoopercode) | | | |
| | [Kebab Case](conversions/change-case/kebabcase.py) | Change to clipboard text to kebab case | [Robert Cooper](https://github.com/robertcoopercode) | | | |
| | [Lowercase](conversions/change-case/lowercase.py) | Change clipboard text to lowercase | [Robert Cooper](https://github.com/robertcoopercode) | | | |
| | [Snake Case](conversions/change-case/snakecase.py) | Change to clipboard text to snake case | [Robert Cooper](https://github.com/robertcoopercode) | | | |
| | [Title Case](conversions/change-case/titlecase.py) | Change to clipboard text to title case | [Robert Cooper](https://github.com/robertcoopercode) | | | |
| | [Uppercase](conversions/change-case/uppercase.py) | Change to clipboard text to uppercase | [Robert Cooper](https://github.com/robertcoopercode) | | | |
## Culture
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| 🕌 | [Prayer Summary](culture/prayer-summary.template.sh) | Get the current and next prayer times for a specific city and country. | [Muneeb Ajaz](https://github.com/mianmuneebajaz) | | ✅ | |
| 🕌 | [Prayer Times](culture/prayer-times.sh) | Prayer Times grabbed from the aladhan.com. | [Emircan Erkul](https://emircanerkul.com) | | | |
## Dashboard
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Bitcoin Price](dashboard/bitcoin-price-usd.sh) | Get current Bitcoin price from Coindesk. | [Tanguy Le Stradic](https://github.com/tanguyls) | | | |
| 💲 | [Check Usage of OpenAI API](dashboard/open-ai-usage.sh) | Get total usage of OpenAI API | [nagauta](https://github.com/nagauta) | | | |
| 💰 | [Crypto](dashboard/crypto-portfolio.py) | Gets crypto prices from Binance | [Manan Mehta](https://github.com/mehtamanan) | | | |
| 🌦️ | [Current Weather](dashboard/current-weather.sh) | Get current weather report from [wttr.in](https://wttr.in/). | [Caleb Stauffer](https://github.com/crstauf) | | | |
| | [DOGE Price](dashboard/doge.sh) | Checking DOGE coin price | [Clu Soh](https://github.com/designedbyclu) | | | |
| | [Ethereum Price](dashboard/ethereum-price-usd.sh) | Get current Ethereum price from CoinGecko. | [Clark Dinnison](https://github.com/cdinnison) | | | |
| | [Fear Index](dashboard/fear-index.sh) | Fear & Greed Index from CNN | [Astrit](https://github.com/astrit) | | | |
| | [Metals Price](dashboard/precious-metals.sh) | Retrieves the value of precious metals per 1 oz | [Stefan de Graaf](https://github.com/DBZFYAM) | | | |
| | [NextDNS Status](dashboard/nextdns-status-check.py) | Check if this machine is using NextDNS. | [Phil Salant](https://github.com/PSalant726) | | | |
| 🤖 | [SABnzbd Queue](dashboard/sabnzbd-queue-status.template.sh) | Show SABnzbd's queue status | [Jesse Claven](https://github.com/jesse-c) | | ✅ | |
| | [Speedtest](dashboard/speedtest.sh) | Test download and upload connection speed using [Speedtest](https://www.speedtest.net/apps/cli). | [Caleb Stauffer](https://github.com/crstauf) | | | |
| 📈 | [Stocks](dashboard/stock-portfolio.rb) | Keep track of your stock portfolio. | [Thomas Paul Mann](https://github.com/thomaspaulmann) | | | |
| 📈 | [System Activity](dashboard/system-activity.sh) | N/A | Raycast | | | |
| 🚘 | [Tesla](dashboard/tesla.template.sh) | Get the status of your Tesla vehicle | [Mortada Sarheed](https://github.com/mSarheed) | | ✅ | |
| | [Twitter Statistics](dashboard/twitter-statistics.template.rb) | Shows the followers, favorites and friends count of your Twitter account. | [Thomas Paul Mann](https://github.com/thomaspaulmann) | | ✅ | |
| 🕐 | [World Time](dashboard/world-time.sh) | Show the time from elsewhere in the world | [Jesse Claven](https://github.com/jesse-c) | | | |
| ⏱ | [Year Progress](dashboard/year-progress.sh) | See the year progress on your desktop. | [Thomas Paul Mann](https://github.com/thomaspaulmann) | | | |
| | [YouTube Statistics](dashboard/youtube-statistics.template.rb) | Shows YouTube Subscribers, Views and Videos | [Astrit](https://github.com/astrit) | | ✅ | |
#### Countdowns
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| 🎅🏻 | [Countdown to Christmas](dashboard/countdowns/countdown-to-christmas.sh) | See how many days until Christmas. | [Valentin Chrétien](https://github.com/valentinchrt) | | | |
| ⏱ | [Countdown to Date](dashboard/countdowns/countdown-to-date.template.sh) | See how many days/hours until a specific date. | [Valentin Chrétien](https://github.com/valentinchrt) | | ✅ | |
| ⏱ | [Create Countdown](dashboard/countdowns/create-countdown.template.sh) | Create countdowns via Raycast. | [Valentin Chrétien](https://github.com/valentinchrt) | ✅ | ✅ | |
#### Firebase
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Get Authorization Token](dashboard/firebase/firebase-authentication-get-token.template.sh) | Get token from Firebase Authentication service | [João Melo](https://github.com/joaopcm) | | ✅ | |
| | [Get data from Firebase](dashboard/firebase/firebase-realtime-db-get-data.template.sh) | Get values from Firebase Realtime Database | [Marek Mašek](https://github.com/marekmasek) | | ✅ | |
#### Mood Meter
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| ☕️ | [Add Mood](dashboard/mood-meter/add-mood.js) | Add mood value to current or specified date | [Federico Miraglia](https://github.com/Mitra98t) | ✅ | | |
| ☕️ | [Display Mood Month](dashboard/mood-meter/display-mood-month.js) | Displays month mood table | [Federico Miraglia](https://github.com/Mitra98t) | | | |
| ☕️ | [Display Mood Year](dashboard/mood-meter/display-mood-year.js) | Displays year mood table | [Federico Miraglia](https://github.com/Mitra98t) | ✅ | | |
#### Open Weather
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| ⛅️ | [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 |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| 🔑 | [Add SSH Keys (with Terminal)](developer-utils/add-ssh-keys.template.applescript) | Add one or multiple SSH keys to your SSH agent (with Terminal). | [Caleb Stauffer](https://github.com/crstauf) | | ✅ | |
| 🤖 | [Base Converter](developer-utils/base-converter.sh) | Utility to convert numbers between bases. Can be one number or a list of string-delimited numbers. | [Saimir S.](https://www.saimirsulaj.com) | ✅ | | |
| 🔓 | [Base64 Decode](developer-utils/base64-decode-input.sh) | Decode the base64 string | [Bin Hua](https://github.com/hzb) | ✅ | | |
| 🔐 | [Base64 Encode](developer-utils/base64-encode-input.sh) | Encode any text data by using base64 | [Bin Hua](https://github.com/hzb) | ✅ | | |
| 🌐 | [Check Domain](developer-utils/check-domain.template.sh) | Check the availability of a domain with the Vercel API. | [Ted Spare](https://y.at/🤘🐊🗿🚀) | ✅ | ✅ | |
| 🧹 | [Clear All Related Junk](developer-utils/clear_xcode.sh) | This script clears all Xcode related junk. | [Kirill Gorbachyonok](https://github.com/japanese-goblinn) | | | |
| 🧹 | [Clear Derived Data](developer-utils/clear-derived-data.sh) | Clear the derived data of Xcode. | Raycast | | | |
| ⏱️ | [Copy Current Epoch Unix Timestamp](developer-utils/unix-timestamp.sh) | Copy the current epoch Unix timestamp. | [Caleb Stauffer](https://github.com/crstauf) | | | |
| 📁 | [Copy Focused Finder Window Path](developer-utils/copy-focused-finder-window-path.sh) | Copies full path of the currently focused Finder window | [Vishal Telangre](https://github.com/vishaltelangre) | | | |
| 📝 | [Copy Lorem Ipsum](developer-utils/lorem-ipsum.sh) | Copy one paragraph of Lorem Ipsum to clipboard. | Raycast | | | |
| 🔑 | [Copy SSH Public Key](developer-utils/copy-ssh-public-key.sh) | Copying the default SSH public key to the clipboard | [Angelos Michalopoulos](https://github.com/miagg) | | | |
| 🤖 | [Count Characters Bash](developer-utils/count-characters.sh) | Counts the characters of either the clipboard or the passed argument | es183923 | ✅ | | |
| 🤐 | [Create .gitignore](developer-utils/generate-git-ignore.sh) | Generates a .gitignore file via https://gitignore.io | [Roland Leth](https://runtimesharks.com) | ✅ | | |
| | [Create Image from Code](developer-utils/create-image-from-code.sh) | Create beautiful images of your code with https://ray.so | [Thomas Paul Mann](https://github.com/thomaspaulmann) | ✅ | | |
| 💻 | [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 | | | |
| ℹ️ | [Error Info](developer-utils/error-info.sh) | Get info about Apple API errors | [Ronan Rodrigo Nunes](https://ronanrodrigo.dev) | ✅ | | |
| 💻 | [Escape String for Shell](developer-utils/escape-shell-chars.sh) | Escapes shell character string and copies it again. | Raycast | | | |
| | [Flutter Create Project](developer-utils/flutter-create.sh) | Creates A Flutter Project from Raycast | [Kabilan VS](https://github.com/KABILAN235) | ✅ | | |
| | [Format Swift](developer-utils/format-swift.sh) | Use [swiftformat](https://github.com/nicklockwood/SwiftFormat) to format clipboard content. | [Dean Moore](https://github.com/moored) | | | |
| | [Generate Password](developer-utils/genpasswd.py) | Generates an iOS style password | [everdrone](https://github.com/everdrone) | ✅ | | |
| 🔐 | [Generate Password](developer-utils/generate-password.sh) | Generates a random password and copies it to the clipboard. | [Sven Hofmann](https://github.com/hofmannsven) | | | |
| 💻 | [Generate ULID](developer-utils/generate-ulid.sh) | Generates a ULID and copies it to the clipboard. | [David Molinero](https://github.com/doktor500) | | | |
| 💻 | [Generate UUID](developer-utils/generate-uuid.sh) | Generates a UUID and copies it to the clipboard. | Raycast | | | |
| 🕐 | [Get TTFB (Time to First Byte)](developer-utils/get-ttfb.sh) | Get the TTFB (Time to First Byte) of a website | [Angelos Michalopoulos](https://github.com/miagg) | ✅ | | |
| 🧹 | [Ignore Package Folders](developer-utils/ignore-package-folders-time-machine.template.sh) | Ignore package folders (node_modules, Pods, etc) from Time Machine backups. They might not be big in size (altough they do add up), but they usually have tens of thousands of files, making backups slower than they should be. Many files are worse than big files when copying. You can also add a Spotlight comment to each file, to easily be able to exclude the same folders from Spotlight indexing (disabled by default). | [Roland Leth](https://runtimesharks.com) | | ✅ | |
| 🌐 | [Is It Up?](developer-utils/is-it-up.sh) | Check if a website is up | [Jesse Claven](https://github.com/jesse-c) | ✅ | | |
| | [JSON to Go Struct](developer-utils/json-to-go-struct.sh) | Convert the copied JSON into a golang structure. | [tiancheng92](https://github.com/tiancheng92) | ✅ | | |
| 🛠 | [Join Clipboard Lines by Delimiter](developer-utils/join-lines.sh) | Join multiple lines of text from the clipboard into a single line, separated by a specified delimiter. | [decaylala](https://github.com/decaylala) | ✅ | | |
| 💻 | [Json Stringify Text](developer-utils/json-stringify-text.js) | Get JSON-formatted text | Senthil Prabhu | | | |
| 🔐 | [MD5 Hash](developer-utils/md5-hash.sh) | Hashing any text data by using MD5 | [Bin Hua](https://github.com/hzb) | ✅ | | |
| | [Microlink API](developer-utils/microlink.sh) | Microlink API integration | [Kiko Beats](https://github.com/kikobeats) | ✅ | | |
| 🔗 | [Open Deep Link](developer-utils/open-link-simulator.applescript) | Opens a URL inside the currently booted iOS Simulator. Can be used to open deeplinks | [Tomás Martins](https://github.com/tfmart) | ✅ | | |
| 🌐 | [Ping](developer-utils/ping.sh) | Ping an IP address or URL. | [Caleb Stauffer](https://github.com/crstauf) | ✅ | | |
| 🌐 | [Ping Monitor](developer-utils/ping-monitor.template.sh) | Ping an IP address or URL on an interval. | [Caleb Stauffer](https://github.com/crstauf) | | ✅ | |
| 💻 | [Prettify JSON](developer-utils/prettify-json.sh) | Pretty prints the JSON currently in the clipboard. | Raycast | | | |
| 🤖 | [Print TLDR doc](developer-utils/tldr.sh) | Print the tldr documentation for a command | [Achille Lacoin](https://github.com/pomdtr) | ✅ | | |
| | [Query cheat.sh](developer-utils/cheat.sh) | Query the cheat.sh service (https://github.com/chubin/cheat.sh). You can change the color style in the script. | [Jakub Lanski](https://github.com/jaklan) | ✅ | | |
| 📱 | [Record Simulator](developer-utils/record-simulator.sh) | Records simulator to Downloads folder | [Maxim Krouk](https://github.com/maximkrouk) | ✅ | | |
| | [Run Command](developer-utils/run-bash-command.sh) | Run arbitrary bash command and return output in Raycast. | [Boyang Xu](https://github.com/BoyangMichael) | ✅ | | |
| 🛠 | [Run Command On Front Finder Window](developer-utils/run-command-in-finder.sh) | Runs the specified command in the path of the frontmost Finder window. | [Wesley Martin](https://github.com/itsmewes) | ✅ | | |
| | [Run Pa11y](developer-utils/pa11y.sh) | Run [Pa11y](https://github.com/pa11y/pa11y) web accessibility tool on specified path or URL. | [Caleb Stauffer](https://github.com/crstauf) | ✅ | | |
| 🔐 | [SHA1 Hash](developer-utils/sha1-hash.sh) | Hashing any text data by using SHA1 | [Bin Hua](https://github.com/hzb) | ✅ | | |
| | [Save URL to Wayback Machine](developer-utils/wayback-machine-save.sh) | Save URL to [Wayback Machine](https://web.archive.org/). | [Caleb Stauffer](https://github.com/crstauf) | ✅ | | |
| 🔎 | [Search Script Command](developer-utils/search-script-command.sh) | Search for Script Commands available in the Raycast repository | [Thiago Holanda](https://twitter.com/tholanda) | ✅ | | |
| 🔐 | [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) | | | |
| 📖 | [View Scripting Dictionary](developer-utils/view-scripting-dictionary.sh) | Opens the Scripting Dictionary for the given application, defaulting to the active application if none is provided. | [Stephen Kaplan](https://github.com/SKaplanOfficial) | ✅ | | |
| 🌐 | [Whois](developer-utils/whois.sh) | Whois of URL. | [Caleb Stauffer](https://github.com/crstauf) and [Ronan Rodrigo Nunes](https://ronanrodrigo.dev) | ✅ | | |
#### Aws
| 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
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| 🍺 | [Cask Upgrade](developer-utils/brew/brew-cask-upgrade.sh) | Updates brew and upgrades every outdated app | [LanikSJ](https://github.com/LanikSJ) | | | |
| 🍺 | [Doctor](developer-utils/brew/brew-doctor.sh) | Run Brew Doctor | [Thiago Holanda](https://twitter.com/tholanda) | | | |
| 🍺 | [Install a package](developer-utils/brew/brew-install.sh) | Installs specified brew package. | [Alex Zotov](https://github.com/lex4hex) | ✅ | | |
| 🍺 | [Leaves](developer-utils/brew/brew-leaves.sh) | Show list of installed brew formulae that are not dependencies of other installed formula. | [owpac](https://github.com/Owpac) | | | |
| 🍺 | [List](developer-utils/brew/brew-list.sh) | Show Brew List | [chengzhiqi](https://twitter.com/1872Fate) | | | |
| 🍺 | [Outdated List](developer-utils/brew/brew-outdated.sh) | Show list of outdated formulae | [Thiago Holanda](https://twitter.com/tholanda) | | | |
| 🍺 | [Restart Service](developer-utils/brew/brew-services-restart.sh) | Restart Service in Brew | [es183923](github.com/es183923) | ✅ | | |
| 🍺 | [Services List](developer-utils/brew/brew-services-list.sh) | Show Brew Services List | [Thiago Holanda](https://twitter.com/tholanda) | | | |
| 🍺 | [Start Service](developer-utils/brew/brew-services-start.sh) | Start Service in Brew | [Thiago Holanda](https://twitter.com/tholanda) | ✅ | | |
| 🍺 | [Stop Service](developer-utils/brew/brew-services-stop.sh) | Stop Service in Brew | [Thiago Holanda](https://twitter.com/tholanda) | ✅ | | |
| 🍺 | [Uninstall](developer-utils/brew/brew-uninstall-application.sh) | Uninstalls an Specified Application Using Homebrew | [StevenRCE0](https://github.com/StevenRCE0) | ✅ | | |
| 🍺 | [Update](developer-utils/brew/brew-update.sh) | Run Brew Update | [chengzhiqi](https://twitter.com/1872Fate) | | | |
| 🍺 | [Upgrade](developer-utils/brew/brew-upgrade.sh) | Run Brew Upgrade | [Thiago Holanda](https://twitter.com/tholanda) | | | |
#### Cloudflare
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Purge Cloudflare cache](developer-utils/cloudflare/purge-cloudflare-cache.template.sh) | Purge Cloudflare cache for zone. | [Caleb Stauffer](https://github.com/crstauf) | | ✅ | |
#### Docker
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| 🧹 | [Clean](developer-utils/docker/clean-docker.sh) | Script that cleans Docker images, volumes, and containers | Quentin Eude | | | |
| | [List Containers](developer-utils/docker/docker-ps.sh) | List containers in Docker | Sebastian Kroll | | | |
| | [List Images](developer-utils/docker/docker-images.sh) | List images in Docker | Sebastian Kroll | | | |
| ▶️ | [Run](developer-utils/docker/run-docker.sh) | Runs a Docker container | Fabián Delgado | ✅ | | |
| ⏹️ | [Stop](developer-utils/docker/stop-docker.sh) | Stops a Docker container | Fabián Delgado | ✅ | | |
| | [System Prune](developer-utils/docker/docker-system-prune.sh) | Remove unused data (system prune) | Sebastian Kroll | | | |
#### Git
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Clear Changes](developer-utils/git/git-clear-changes.sh) | Clear all changes | [Thomas Paul Mann](https://github.com/thomaspaulmann) | | | |
| | [Save Changes](developer-utils/git/git-save-changes.sh) | Commit all pending changes. If no commit message is provided, it will amend the changes. | [Thomas Paul Mann](https://github.com/thomaspaulmann) | ✅ | | |
| | [Standup](developer-utils/git/git-standup.sh) | Lists your commits from the last 24 hours. Optionally specify since when, e.g. "1 week". | [Thomas Paul Mann](https://github.com/thomaspaulmann) | ✅ | | |
| | [Status](developer-utils/git/git-status.sh) | Shows the status of your Git repository. | [Thomas Paul Mann](https://github.com/thomaspaulmann) | | | |
| | [Switch Branch](developer-utils/git/git-switch-branch.sh) | Switch to a new branch. If not name was provided, it checks out the default branch. | [Thomas Paul Mann](https://github.com/thomaspaulmann) | ✅ | | |
| | [Sync Changes](developer-utils/git/git-sync-changes.sh) | Pulls, rebases and pushes your changes. | [Thomas Paul Mann](https://github.com/thomaspaulmann) | | | |
#### GitHub
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Create GitHub Gist from Clipboard](developer-utils/github/create-github-gist.template.sh) | Create a GitHub Gist from clipboard contents and copy Gist URL. | [Caleb Stauffer](https://github.com/crstauf) | | ✅ | |
| | [GitHub Contributions](developer-utils/github/github-contributions.template.sh) | Show GitHub user contributions from the current year | [Astrit](https://github.com/astrit) | | ✅ | |
| | [Open Commit History](developer-utils/github/github-open-commit-history.sh) | Opens the commit history of the filepath in the clipboard or the frontmost window. Alternatively can open the file view on GitHub. | [Thomas Paul Mann](https://github.com/thomaspaulmann) | | | |
| | [Open Pull Requests](developer-utils/github/github-open-pull-requests.template.rb) | Display number of open pull requests | [Faye Sipiano](https://github.com/FSipiano) | | ✅ | |
| | [Open Pull Requests page](developer-utils/github/github-open-pull-requests-page.sh) | Open your GitHub pull requests page | [Faye Sipiano](https://github.com/FSipiano) | | | |
| ⭐️ | [Repository Statistics](developer-utils/github/github-repository-stars.template.rb) | Show statistics of your GitHub repository. | [Thomas Paul Mann](https://github.com/thomaspaulmann) | | ✅ | |
| ⭐️ | [Repository Statistics](developer-utils/github/github-repository-stars_all_repos_template.rb) | Show statistics of your GitHub repositories. | [Valdir Junior](https://github.com/valdirjunior011 ) | | ✅ | |
| | [Show Open Pull Requests](developer-utils/github/github-open-pull-requests-details.template.rb) | Display (detailed) GitHub pull requests | [Faye Sipiano](https://github.com/FSipiano) | | ✅ | |
| | [Show Review Requests](developer-utils/github/github-review-requests.template.rb) | Display number of Pull Requests requesting your review | [Vince Picone](https://github.com/vpicone) | | ✅ | |
| | [Unread Notifications](developer-utils/github/github-unread-notifications.template.sh) | Display (detailed) number of unread GitHub notifications. | [Caleb Stauffer](https://github.com/crstauf) | | ✅ | |
| | [Visit a Repository, Pull Request, or Issue](developer-utils/github/open-gh-repo-pr-or-issue.sh) | Open a repository, pull request, or issue on GitHub | [Phil Salant](https://github.com/PSalant726) | ✅ | | |
#### GitLab
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Issues](developer-utils/gitlab/gitlab-issues.template.py) | Show issues from GitLab | [Michael Aigner](https://github.com/tonka3000) | | ✅ | |
| | [Merge Requests](developer-utils/gitlab/gitlab-mergerequests.template.py) | Show merge requests from GitLab | [Michael Aigner](https://github.com/tonka3000) | | ✅ | |
| | [To-Dos](developer-utils/gitlab/gitlab-todos.template.py) | Show todos from GitLab | [Michael Aigner](https://github.com/tonka3000) | | ✅ | |
#### Google
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Lighthouse](developer-utils/google/google-lighthouse.sh) | Open a [Lighthouse](https://developers.google.com/web/tools/lighthouse/) report of URL. | [Caleb Stauffer](https://github.com/crstauf) | ✅ | | |
| | [PageSpeed Insights - Desktop](developer-utils/google/google-psi-desktop.sh) | Run a [PageSpeed Insights](https://developers.google.com/speed/pagespeed/insights/) analysis on desktop of URL. | [Caleb Stauffer](https://github.com/crstauf) | ✅ | | |
| | [PageSpeed Insights - Mobile](developer-utils/google/google-psi-mobile.sh) | Run a [PageSpeed Insights](https://developers.google.com/speed/pagespeed/insights/) analysis on mobile of URL. | [Caleb Stauffer](https://github.com/crstauf) | ✅ | | |
#### Ip
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| 🌐 | [External IPv4](developer-utils/ip/get-external-ip-v4.sh) | Copies the external IPv4 to the clipboard. | Raycast | | | |
| 🌐 | [External IPv6](developer-utils/ip/get-external-ip-v6.sh) | Copies the external IPv6 to the clipboard. | Raycast | | | |
| 🌐 | [Local IPv4](developer-utils/ip/get-local-ip-v4.sh) | Copies the local IPv4 to the clipboard. | Raycast | | | |
| 🌐 | [Local IPv6](developer-utils/ip/get-local-ip-v6.sh) | Copies the local IPv6 to the clipboard. | Raycast | | | |
| 🌐 | [URL IPv4](developer-utils/ip/get-url-ip-v4.sh) | Get IPv4 address of URL. | [Caleb Stauffer](https://github.com/crstauf) | ✅ | | |
| 🌐 | [URL IPv6](developer-utils/ip/get-url-ip-v6.sh) | Get IPv6 address of URL. | [Caleb Stauffer](https://github.com/crstauf) | ✅ | | |
#### Minikube
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| ⚙️ | [Config Set](developer-utils/minikube/minikube-config-set.sh) | Pause Minikube cluster | [Daniils Petrovs](https://danpetrov.xyz) | ✅ | | |
| ⏸ | [Pause](developer-utils/minikube/minikube-pause.sh) | Pause Minikube cluster | [Daniils Petrovs](https://danpetrov.xyz) | | | |
| 🚀 | [Start](developer-utils/minikube/minikube-start.sh) | Start Minikube cluster | [Daniils Petrovs](https://danpetrov.xyz) | | | |
| ℹ️ | [Status](developer-utils/minikube/minikube-status.sh) | Show Minikube cluster status | [Daniils Petrovs](https://danpetrov.xyz) | | | |
| 🤖 | [Stop](developer-utils/minikube/minikube-stop.sh) | Stops a running Minikube cluster | [Daniils Petrovs](https://danpetrov.xyz) | | | |
| ⏸ | [Unpause](developer-utils/minikube/minikube-unpause.sh) | Pause Minikube cluster | [Daniils Petrovs](https://danpetrov.xyz) | | | |
#### Sentry
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Unresolved Issues](developer-utils/sentry/sentry-unresolved-issues.template.py) | Show unresolved issues of the last 24 hours from Sentry. | [Thomas Paul Mann](https://github.com/thomaspaulmann) | | ✅ | |
| | [Unresolved Issues By Project](developer-utils/sentry/sentry-unresolved-issues-by-project.template.py) | Show unresolved issues in the last 24 hours (by project) from Sentry. | [Phil Salant](https://github.com/PSalant726) and [Thomas Paul Mann](https://github.com/thomaspaulmann) | ✅ | ✅ | |
#### Solana
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Extract Transaction from Blink Response](developer-utils/solana/solana-tx-blink-extract.sh) | Extract transaction from Blink endpoint in clipboard and replaces with the transaction | [bjoerndotsol](https://github.com/bjoerndotsol) | | | |
| | [Open in Solana Inspector](developer-utils/solana/solana-tx-inspector.sh) | Extracts the message from a signed Solana transaction and opens Explorer's Inspector with it. | [bjoerndotsol](https://github.com/bjoerndotsol) | ✅ | | |
| | [View Solana Transaction](developer-utils/solana/solana-tx-details.sh) | Opens a Solana transaction in Solscan. Network: empty/mainnet, d/dev/devnet, t/test/testnet | [bjoerndotsol](https://github.com/bjoerndotsol) | ✅ | | |
#### Vscode
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Open Directory](developer-utils/vscode/open-folder-in-vscode.applescript) | Opens current topmost directory in VS Code | [chohner](https://github.com/chohner) | | | |
| | [Open Project](developer-utils/vscode/open-project-in-vscode.sh) | Finds path to the given directory which must be a VS Code or Git project and opens it with VS Code | [Maksim Zemlyanikin](https://github.com/Maksimka101) | ✅ | | |
#### Xcode
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Last Project](developer-utils/xcode/xcode-last-project.sh) | Open the last Xcode project | [Sergey Korobyin](https://github.com/huangsemao) | | | |
| | [Recent Project](developer-utils/xcode/xcode-recent-project.sh) | Open recent Xcode project | [Sergey Korobyin](https://github.com/huangsemao) | ✅ | | |
## Home
#### Elgato
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Decrease Brightness](home/elgato/elgato-key-light-decrease-brightness.template.rb) | Decrease brightness of Elgato Key Light by 5%. | [Thomas Paul Mann](https://github.com/thomaspaulmann) | | ✅ | |
| | [Increase Brightness](home/elgato/elgato-key-light-increase-brightness.template.rb) | Increase brightness of Elgato Key Light by 5%. | [Thomas Paul Mann](https://github.com/thomaspaulmann) | | ✅ | |
| | [Turn Off](home/elgato/elgato-key-light-turn-off.template.rb) | Turn off Elgato Key Light. | [Thomas Paul Mann](https://github.com/thomaspaulmann) | | ✅ | |
| | [Turn On](home/elgato/elgato-key-light-turn-on.template.rb) | Turn on Elgato Key Light. | [Thomas Paul Mann](https://github.com/thomaspaulmann) | | ✅ | |
#### Philips Hue
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| 💡 | [Lights](home/philips-hue/hue-lights-inline.template.mjs) | Show inline summary of any Hue compatible lights. Choose to show on/off, brightness percentage, color temperature or hue, saturation, brightness values. Recommended to have already assigned names to lights in the Hue app. | [Jono Hewitt](https://github.com/jonohewitt) | | ✅ | |
| 💡 | [Rooms](home/philips-hue/hue-rooms-inline.template.mjs) | Show inline summary about your rooms of Hue compatible lights. Choose to show the number of lights on out of the room total, or use more general terms such as "All on". Requires rooms to have already been set up in the Hue app. | [Jono Hewitt](https://github.com/jonohewitt) | | ✅ | |
| 💡 | [Set Light Bulb](home/philips-hue/hue-bulb.template.mjs) | Set a specified or default individual color bulb to a preset, hsb or brightness value. Leave preset and value arguments empty to toggle a bulb on or off. | [Jono Hewitt](https://github.com/jonohewitt) | ✅ | ✅ | |
| 💡 | [Set Room Lights](home/philips-hue/hue-room.template.mjs) | Set a specified or default room of color bulbs to a preset, hsb or brightness value. Leave preset and value arguments empty to toggle a room on or off. | [Jono Hewitt](https://github.com/jonohewitt) | ✅ | ✅ | |
## Math
| 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) | ✅ | | |
| | [Wolfram Alpha](math/wolfram-alpha.template.sh) | Use Wolfram Alpha to answer your query | [es183923](https://github.com/es183923) | ✅ | ✅ | |
| | [nCr: Calculate Combinations](math/calculate-combinations.js) | nCr: Calculate combinations | [cSharp](https://github.com/noidwasavailable) | ✅ | | |
## Media
#### Apple Music
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Apple Music Volume Down](media/apple-music/apple-music-volume-down.applescript) | N/A | [Juan I. Serra](https://github.com/jiserra) | | | |
| | [Apple Music Volume Up](media/apple-music/apple-music-volume-up.applescript) | N/A | [Juan I. Serra](https://github.com/jiserra) | | | |
| | [Current Track](media/apple-music/apple-music-current-track.applescript) | Show currently playing track in Music. | [mmerle](https://github.com/mmerle) | | | |
| | [Go to Artist in Apple Music](media/apple-music/apple-music-go-to-artist-page.sh) | Go to Artist page in the Apple Music App | [Jordi Clement](https://github.com/jordicl) | ✅ | | |
| | [Hate Current Track](media/apple-music/apple-music-hate-current-track.applescript) | Let the algorithm know how you feel about the currently playing track. | [Bryan Schuetz](https://github.com/bryanschuetz) | | | |
| | [Love Current Track](media/apple-music/apple-music-love-current-track.applescript) | Let the algorithm know how you feel about the currently playing track. | [Bryan Schuetz](https://github.com/bryanschuetz) | | | |
| | [Next Track](media/apple-music/apple-music-next.applescript) | Next track in Music. | [Caleb Stauffer](https://github.com/crstauf) | | | |
| | [Pause](media/apple-music/apple-music-pause.applescript) | Pause Music. | [Caleb Stauffer](https://github.com/crstauf) | | | |
| | [Play](media/apple-music/apple-music-play.applescript) | Play Music. | [Caleb Stauffer](https://github.com/crstauf) | | | |
| | [Previous Track](media/apple-music/apple-music-previous.applescript) | Previous track in Music. | [Caleb Stauffer](https://github.com/crstauf) | | | |
| | [Search](media/apple-music/apple-music-search.applescript) | Search using the native UI | [StevenRCE0](https://github.com/StevenRCE0) | ✅ | | |
| | [Set Volume](media/apple-music/apple-music-set-volume.applescript) | Set volume in Music. | [Caleb Stauffer](https://github.com/crstauf) | ✅ | | |
| | [Stop](media/apple-music/apple-music-stop.applescript) | Stop Music. | [Caleb Stauffer](https://github.com/crstauf) | | | |
| | [Toggle Repeat](media/apple-music/apple-music-repeat.applescript) | Toggle repeat setting in Music. | [Caleb Stauffer](https://github.com/crstauf) | | | |
| | [Toggle Shuffle](media/apple-music/apple-music-shuffle.applescript) | Toggle shuffle setting in Music. | [Caleb Stauffer](https://github.com/crstauf) | | | |
#### Apple Tv
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Pause](media/apple-tv/apple-tv-pause.applescript) | Pause TV. | [Caleb Stauffer](https://github.com/crstauf) | | | |
| | [Play](media/apple-tv/apple-tv-play.applescript) | Play TV. | [Caleb Stauffer](https://github.com/crstauf) | | | |
| | [Play Movie](media/apple-tv/apple-tv-play-movie.applescript) | Play specified movie from library in TV. | [Caleb Stauffer](https://github.com/crstauf) | ✅ | | |
| | [Set Volume](media/apple-tv/apple-tv-set-volume.applescript) | Set volume in TV. | [Caleb Stauffer](https://github.com/crstauf) | ✅ | | |
| | [Stop](media/apple-tv/apple-tv-stop.applescript) | Stop TV. | [Caleb Stauffer](https://github.com/crstauf) | | | |
#### Cmus
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| ℹ️ | [Current Track](media/cmus/track-info.sh) | Shows info on the current track if cmus is running | [mmerle](https://github.com/mmerle) | | | |
| ⏩ | [Next Track](media/cmus/next-track.sh) | Goes forward a track if cmus is running | [mmerle](https://github.com/mmerle) | | | |
| ⏪ | [Previous Track](media/cmus/previous-track.sh) | Goes back a track if cmus is running | [mmerle](https://github.com/mmerle) | | | |
| ⏯ | [Toggle Play/Pause](media/cmus/play-pause.sh) | Toggles the play/pause state if cmus is running | [mmerle](https://github.com/mmerle) | | | |
| 🔁 | [Toggle Repeat](media/cmus/toggle-repeat.sh) | Toggles the repeat option if cmus is running | [mmerle](https://github.com/mmerle) | | | |
| 🔀 | [Toggle Shuffle](media/cmus/toggle-shuffle.sh) | Toggles the shuffle option if cmus is running | [mmerle](https://github.com/mmerle) | | | |
#### Endel
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Deep Focus](media/endel/endel-deep-focus.sh) | Set deep focus mode at Endel | [Sergey Korobyin](https://github.com/huangsemao) | | | |
| | [Deep Work](media/endel/endel-scenarios-deepwork.sh) | Run Deep Work scenario at Endel | [Sergey Korobyin](https://github.com/huangsemao) | ✅ | | |
| | [Focus](media/endel/endel-focus.sh) | Set focus mode at Endel | [Sergey Korobyin](https://github.com/huangsemao) | | | |
| | [Homework](media/endel/endel-scenarios-homework.sh) | Run Homework scenario at Endel | [Sergey Korobyin](https://github.com/huangsemao) | ✅ | | |
| | [Lullaby](media/endel/endel-lullaby.sh) | Set AI lullaby mode at Endel | [Sergey Korobyin](https://github.com/huangsemao) | | | |
| | [Meditate](media/endel/endel-scenarios-meditate.sh) | Run Meditate scenario at Endel | [Sergey Korobyin](https://github.com/huangsemao) | ✅ | | |
| | [Power Nap](media/endel/endel-scenarios-powernap.sh) | Run Power Nap scenario at Endel | [Sergey Korobyin](https://github.com/huangsemao) | ✅ | | |
| | [Read](media/endel/endel-scenarios-read.sh) | Run Read scenario at Endel | [Sergey Korobyin](https://github.com/huangsemao) | ✅ | | |
| | [Recovery](media/endel/endel-recovery.sh) | Set recovery mode at Endel | [Sergey Korobyin](https://github.com/huangsemao) | | | |
| | [Relax](media/endel/endel-relax.sh) | Set relax mode at Endel | [Sergey Korobyin](https://github.com/huangsemao) | | | |
| | [Self Care](media/endel/endel-scenarios-selfcare.sh) | Run Self Care scenario at Endel | [Sergey Korobyin](https://github.com/huangsemao) | ✅ | | |
| | [Set Alarm](media/endel/endel-alarm.sh) | Set Alarm in Endel | [Sergey Korobyin](https://github.com/huangsemao) | | | |
| | [Set Timer](media/endel/endel-timer.sh) | Set Timer in Endel | [Sergey Korobyin](https://github.com/huangsemao) | | | |
| | [Sleep](media/endel/endel-sleep.sh) | Set focus mode at Endel | [Sergey Korobyin](https://github.com/huangsemao) | | | |
| | [Study](media/endel/endel-study.sh) | Set study mode at Endel | [Sergey Korobyin](https://github.com/huangsemao) | | | |
| | [Unwind](media/endel/endel-scenarios-unwind.sh) | Run Unwind scenario at Endel | [Sergey Korobyin](https://github.com/huangsemao) | ✅ | | |
| | [Wiggly Wisdom](media/endel/endel-wisdom.sh) | Set wiggly wisdom mode at Endel | [Sergey Korobyin](https://github.com/huangsemao) | | | |
| | [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 |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Play Favorite](media/sonos/sonos-play-favorite.sh) | Play from Sonos favorites. | [David Blackman](https://github.com/whizziwig) | ✅ | | |
| | [Set Volume](media/sonos/sonos-volume-set.sh) | Sets volume of Sonos. | [David Blackman](https://github.com/whizziwig) | ✅ | | |
| | [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 |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [${commandName}](media/spotify/create-spotify-command.js) | Play ${commandName} on Spotify | [Nichlas Wærnes Andersen](https://twitter.com/nichlaswa) | ✅ | | |
| | [Copy Current Playing Song URL](media/spotify/spotify-now-playing-url.applescript) | Get link to current Spotify playing song | [Jack LaFond](https://github.com/jacc) | | | |
| | [Current Track](media/spotify/spotify-current-track.applescript) | Show currently playing track in Spotify. | [Thomas Paul Mann](https://github.com/thomaspaulmann) | | | |
| | [Next Track](media/spotify/spotify-next-track.applescript) | Skips to the next track in Spotify. | Raycast | | | |
| | [Pause](media/spotify/spotify-pause.applescript) | Pause current track in Spotify. | Raycast | | | |
| | [Play](media/spotify/spotify-play.applescript) | Plays current track in Spotify. | Raycast | | | |
| | [Play Track or Playlist](media/spotify/spotify-play-playlist.template.applescript) | Play playlist or track in Spotify. | [Thomas Paul Mann](https://github.com/thomaspaulmann) | | ✅ | |
| | [Previous Track](media/spotify/spotify-previous-track.applescript) | Skips to the previous track in Spotify. | Raycast | | | |
| | [Toggle Play/Pause](media/spotify/spotify-play-pause.applescript) | Toggles play or pause of current track in Spotify. | Raycast | | | |
#### Tidal
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Next Track](media/tidal/tidal-next-track.applescript) | Skip to the next track in Tidal. | [Charles Harries](https://github.com/charlesharries) | | | |
| | [Pause](media/tidal/tidal-pause.applescript) | Pause the current track in Tidal. | [Charles Harries](https://github.com/charlesharries) | | | |
| | [Play](media/tidal/tidal-play.applescript) | Play the current track in Tidal. | [Charles Harries](https://github.com/charlesharries) | | | |
| | [Previous Track](media/tidal/tidal-previous-track.applescript) | Skip back to the previous track in Tidal. | [Charles Harries](https://github.com/charlesharries) | | | |
| | [Toggle Play/Pause](media/tidal/tidal.applescript) | Play/Pause Tidal | [Cebrail AKTAS](https://github.com/AktasC) | | | |
#### foobar2000
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Next foobar2000](media/foobar2000/foobar2000-next.applescript) | Shortcuts to next foobar2000 for Mac v2.3.0 | [Jing Li](https://github.com/lixeon) | | | |
| | [Pause foobar2000](media/foobar2000/foobar2000-pause.applescript) | Shortcuts to pause foobar2000 for Mac v2.3.0 | [Jing Li](https://github.com/lixeon) | | | |
| | [Previous foobar2000](media/foobar2000/foobar2000-pervious.applescript) | Shortcuts to Previous foobar2000 for Mac v2.3.0 | [Jing Li](https://github.com/lixeon) | | | |
## Navigation
| 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 | | | |
| 📟 | [Open Current Finder Directory in Terminal](navigation/open-terminal-from-finder.applescript) | Open current Finder directory in Terminal | [Kirill Gorbachyonok](https://github.com/japanese-goblinn) | | | |
| | [Open Current Finder Directory in iTerm](navigation/open-iterm-from-finder.applescript) | Open current Finder directory in iTerm | [Kirill Gorbachyonok](https://github.com/japanese-goblinn) | | | |
| 📟 | [Open Current Terminal Directory in Finder](navigation/open-finder-from-terminal.applescript) | Open current Terminal directory in Finder | [Kirill Gorbachyonok](https://github.com/japanese-goblinn) | | | |
| | [Open Current iTerm Directory in Finder](navigation/open-finder-from-iterm.applescript) | Open current iTerm directory in Finder | [Kirill Gorbachyonok](https://github.com/japanese-goblinn) | | | |
| | [Open Desktop](navigation/open-desktop.sh) | Opens the Desktop folder in the Finder. | Raycast | | | |
| | [Open Documents](navigation/open-documents.sh) | Opens the Documents folder in the Finder. | Raycast | | | |
| | [Open Downloads](navigation/open-downloads.sh) | Opens the Downloads folder in the Finder. | Raycast | | | |
| 🔍 | [Open Finder](navigation/open-finder.sh) | Open Finder at Home folder or argument location | [Afraz](https://github.com/afrazkhan) | ✅ | | |
| | [Open Home](navigation/open-home.sh) | Opens the Home folder in the Finder. | Raycast | | | |
| | [Open Image From Clipboard](navigation/open-clipboard-in-pixelmator-pro.applescript) | Creates a new document in Pixelmator Pro from the image stored in your clipboard. | [Bryce Carr](https://github.com/bdcarr) | | | |
| | [Open Last Downloaded](navigation/open-last-downloaded.sh) | Opens the last file that was downloaded | Raycast | | | |
| | [Open Library](navigation/open-library.sh) | Opens the Library folder in the Finder. | Raycast | | | |
| 🌐 | [Open URL From Clipboard](navigation/open-url-from-clipboard.sh) | Opens the URL in the clipboard. | Raycast | | | |
| | [Quit Application](navigation/quit-application.applescript) | Quit the application. Edit the command to change the default values (Application: "", Force quit?: "No"). | [Jakub Lanski](https://github.com/jaklan) | ✅ | | |
| | [Restart Application](navigation/restart-application.applescript) | Restart the application. Edit the command to change the default values (Application: "", Force restart?: "No"). | [Jakub Lanski](https://github.com/jaklan) | ✅ | | |
| | [Search in Dash](navigation/search-in-dash.sh) | N/A | Jax0rz | ✅ | | |
| | [Search in Devdocs](navigation/search-in-devdocs.sh) | N/A | Jax0rz | ✅ | | |
## Productivity
#### Bitwarden
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Bitwarden Status](productivity/bitwarden/status.sh) | Display the authentication and lock status of the user's Bitwarden session. | [Phil Salant](https://github.com/PSalant726) | | | |
| | [Copy First Matching Password](productivity/bitwarden/copy-first-matching-password.sh) | Search all items in a Bitwarden vault, and copy the password of the first search result to the clipboard. | [Phil Salant](https://github.com/PSalant726) | ✅ | | |
| | [Copy First Matching TOTP](productivity/bitwarden/copy-first-matching-totp.sh) | Search all items in a Bitwarden vault, and copy the TOTP of the first search result to the clipboard. | [Phil Salant](https://github.com/int3rrupt) | ✅ | | |
| | [Create a Text Send](productivity/bitwarden/create-text-send.sh) | Create a new text-only Bitwarden Send. | [Phil Salant](https://github.com/PSalant726) | ✅ | | |
| | [Delete a Send](productivity/bitwarden/delete-send.sh) | Delete a Bitwarden Send. | [Phil Salant](https://github.com/PSalant726) | ✅ | | |
| | [Edit a Send](productivity/bitwarden/edit-send.sh) | Edit an existing Bitwarden Send. | [Phil Salant](https://github.com/PSalant726) | ✅ | | |
| | [List All Text Sends](productivity/bitwarden/list-sends.sh) | List all Bitwarden text Sends created in the currently unlocked account. | [Phil Salant](https://github.com/PSalant726) | ✅ | | |
| | [Lock Session](productivity/bitwarden/lock.sh) | Lock a Bitwarden session. | [Phil Salant](https://github.com/PSalant726) | | | |
| | [Log In](productivity/bitwarden/log-in-apikey.template.sh) | Log in to Bitwarden using an API key. | [Marcel Bochtler](https://github.com/MarcelBochtler) | ✅ | ✅ | |
| | [Log In](productivity/bitwarden/log-in.template.sh) | Log in to Bitwarden. | [Phil Salant](https://github.com/PSalant726) | ✅ | ✅ | |
| | [Log Out](productivity/bitwarden/log-out.sh) | Log out of Bitwarden. | [Phil Salant](https://github.com/PSalant726) | | | |
| | [Receive a Text Send](productivity/bitwarden/receive-text-send.sh) | View the content of a text-only Bitwarden Send. | [Phil Salant](https://github.com/PSalant726) | ✅ | | |
| | [Search Vault Items](productivity/bitwarden/search-vault-items.sh) | Search all items in a Bitwarden vault. | [Phil Salant](https://github.com/PSalant726) | ✅ | | |
| | [Unlock Session](productivity/bitwarden/unlock.sh) | Unlock an authenticated Bitwarden session. | [Phil Salant](https://github.com/PSalant726) | ✅ | | |
#### Imgur
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| 📋 | [Clipboard to Imgur](productivity/imgur/imgur-upload-clipboard-image.template.sh) | Upload Image from your Clipboard and copy the image link to clipboard | [Fahim Faisal](https://github.com/i3p9) | | ✅ | |
| 📷 | [Screenshot and Imgur](productivity/imgur/screenshot-and-imgur.sh) | Opens default screenshot interface and immediately uploads and copies link to clipboard | [Fahim Faisal](https://github.com/i3p9) | | | |
| ☁️ | [Upload Latest Screenshot to Imgur](productivity/imgur/imgur-upload-latest-screenshot.template.sh) | Upload your last screenshot to Imgur and copy the image link to clipboard | [Fahim Faisal](https://github.com/i3p9) | | ✅ | |
#### Pomodoro
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| 🍅 | [Start Timer](productivity/pomodoro/pomodoro-start-timer.sh) | Start a Pomodoro timer | [Thomas Paul Mann](https://github.com/thomaspaulmann) | ✅ | | |
| 🍅 | [Status](productivity/pomodoro/pomodoro-status.sh) | Status of a Pomodoro timer | [Thomas Paul Mann](https://github.com/thomaspaulmann) | | | |
| 🍅 | [Stop Timer](productivity/pomodoro/pomodoro-stop-timer.sh) | Stop active Pomodoro timer | [Thomas Paul Mann](https://github.com/thomaspaulmann) | | | |
#### QPDF
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| 🗜️ | [Compress PDF](productivity/qpdf/compress-pdf-qpdf.sh) | Compress selected PDF files. Note: This script requires 'qpdf' to be installed via Homebrew. | [Nicklas Jakobsen](https://github.com/nicklasjm) | ✅ | | |
#### Writing
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| 📖 | [Dictionary Lookup](productivity/writing/dictionary-lookup.swift) | Directly use macOS Dictionary | [Alessandra Pereyra](https://github.com/alessandrapereyra) | ✅ | | |
| 🤖 | [Word Count](productivity/writing/word-count.sh) | Counts the number of words of the text in the clipboard | [Benny Wong](https://bwong.net) | | | |
#### macOCR
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| 📸 | [Run OCR](productivity/macocr/macocr-run-ocr.sh) | N/A | [Jakub Lanski](https://github.com/jaklan) | ✅ | | |
#### stopwatch
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| ⏱ | [Show Stopwatch Progress](productivity/stopwatch/stopwatch-progress.sh) | Status of active stopwatch | [Achille Lacoin](https://github.com/pomdtr) | | | |
| ⏱ | [Start Stopwatch](productivity/stopwatch/stopwatch-start.sh) | Start a stopwatch | [Achille Lacoin](https://github.com/pomdtr) | | | |
| ⏱ | [Stop Stopwatch](productivity/stopwatch/stopwatch-stop.sh) | Stop active stopwatch, copy total time | [Achille Lacoin](https://github.com/pomdtr) | | | |
#### tesseract
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| 🔍 | [OCR Screenshot](productivity/tesseract/tesseract-ocr.sh) | Tesseract OCR | [Diego Lopes](https://github.com/Dihgg) | ✅ | | |
## Remote Control
#### Arm64
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| 📺 | [Switch to DP](remote-control/ddc/arm64/screen-dp.sh) | This script will switch the external display screen to DP. | goodhyun | | | |
| 📺 | [Switch to HDMI](remote-control/ddc/arm64/screen-hdmi.sh) | This script will switch the external display screen to HDMI. | goodhyun | | | |
#### X86
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| 📺 | [Switch to DP](remote-control/ddc/x86/screen-dp.sh) | This script will switch the external display screen to DP. | goodhyun | | | |
| 📺 | [Switch to HDMI](remote-control/ddc/x86/screen-hdmi.sh) | This script will switch the external display screen to HDMI. | goodhyun | | | |
#### Denon AVR
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Configure](remote-control/denon-avr/configure.applescript) | Helperscript to configure Denon AVR Script Commands | [Rediwed](github.com/Rediwed) | ✅ | | |
| | [Power Off](remote-control/denon-avr/power-off.applescript) | Powers off a modern Denon AVR if it is currently powered on | [Rediwed](github.com/Rediwed) | | | |
| | [Power On](remote-control/denon-avr/power-on.applescript) | Powers on a modern Denon AVR if it is currently powered off | [Rediwed](github.com/Rediwed) | | | |
| | [Volume Down](remote-control/denon-avr/volume-down.applescript) | Decreases the volume of your Denon AVR by one unit | [Rediwed](github.com/Rediwed) | | | |
| | [Volume Up](remote-control/denon-avr/volume-up.applescript) | Increases the volume of your Denon AVR by one unit | [Rediwed](github.com/Rediwed) | | | |
#### LG TV
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Authenticate](remote-control/lg-tv/authenticate.sh) | Authenticate the library. The TV has to be turned on. You have to provide the IP address of the TV and accept the connection on the TV. | [Jakub Lanski](https://github.com/jaklan) | ✅ | | |
| | [Change Channel](remote-control/lg-tv/change-channel.sh) | Change the TV channel by its ID. | [Jakub Lanski](https://github.com/jaklan) | ✅ | | |
| | [Change Input](remote-control/lg-tv/change-input.sh) | Change the input by its ID. | [Jakub Lanski](https://github.com/jaklan) | ✅ | | |
| | [Change Sound Output](remote-control/lg-tv/change-sound-output.sh) | Change the sound output. Possible "Output Type" values: tv_speaker \| external_optical \| external_arc \| external_speaker \| lineout \| headphone \| tv_external_speaker \| tv_speaker_headphone \| bt_soundbar. | [Jakub Lanski](https://github.com/jaklan) | ✅ | | |
| | [Change Volume](remote-control/lg-tv/change-volume.sh) | Change the volume level. | [Jakub Lanski](https://github.com/jaklan) | ✅ | | |
| | [Close App](remote-control/lg-tv/close-app.sh) | Close the application by its ID. | [Jakub Lanski](https://github.com/jaklan) | ✅ | | |
| | [Execute Command](remote-control/lg-tv/execute-command.sh) | Execute the given command on TV. | [Jakub Lanski](https://github.com/jaklan) | ✅ | | |
| | [Fast Forward Media](remote-control/lg-tv/fast-forward-media.sh) | Fast forward the media. | [Jakub Lanski](https://github.com/jaklan) | | | |
| | [List Apps](remote-control/lg-tv/list-apps.sh) | Show the list of applications. | [Jakub Lanski](https://github.com/jaklan) | | | |
| | [List Channels](remote-control/lg-tv/list-channels.sh) | Show the list of TV channels. | [Jakub Lanski](https://github.com/jaklan) | | | |
| | [List Inputs](remote-control/lg-tv/list-inputs.sh) | Show the list of inputs. | [Jakub Lanski](https://github.com/jaklan) | | | |
| | [List Launch Points](remote-control/lg-tv/list-launch-points.sh) | Show the list of launch points. | [Jakub Lanski](https://github.com/jaklan) | | | |
| | [List Services](remote-control/lg-tv/list-services.sh) | Show the list of services. | [Jakub Lanski](https://github.com/jaklan) | | | |
| | [Mute](remote-control/lg-tv/mute.sh) | Mute the TV. | [Jakub Lanski](https://github.com/jaklan) | | | |
| | [Open App](remote-control/lg-tv/open-app.sh) | Open the application by its ID. | [Jakub Lanski](https://github.com/jaklan) | ✅ | | |
| | [Open App With Payload](remote-control/lg-tv/open-app-with-payload.sh) | Open the application with the given payload. | [Jakub Lanski](https://github.com/jaklan) | ✅ | | |
| | [Open Browser](remote-control/lg-tv/open-browser.sh) | Open the browser with the given URL. The URL has to start with "http://" or "https://" prefix. | [Jakub Lanski](https://github.com/jaklan) | ✅ | | |
| | [Open Youtube (ID)](remote-control/lg-tv/open-youtube-id.sh) | Open Youtube with the given video ID. | [Jakub Lanski](https://github.com/jaklan) | ✅ | | |
| | [Open Youtube (URL)](remote-control/lg-tv/open-youtube-url.sh) | Open Youtube with the given video URL. The URL has to start with "http://" or "https://" prefix. | [Jakub Lanski](https://github.com/jaklan) | ✅ | | |
| | [Pause Media](remote-control/lg-tv/pause-media.sh) | Pause the media. | [Jakub Lanski](https://github.com/jaklan) | | | |
| | [Play Media](remote-control/lg-tv/play-media.sh) | Play the media. | [Jakub Lanski](https://github.com/jaklan) | | | |
| | [Rewind Media](remote-control/lg-tv/rewind-media.sh) | Rewind the media. | [Jakub Lanski](https://github.com/jaklan) | | | |
| | [Scan](remote-control/lg-tv/scan.sh) | Scan to find the TV. The TV has to be turned on. | [Jakub Lanski](https://github.com/jaklan) | | | |
| | [Send Notification](remote-control/lg-tv/send-notification.sh) | Send the notification and show it on the TV. | [Jakub Lanski](https://github.com/jaklan) | ✅ | | |
| | [Send Notification With Icon](remote-control/lg-tv/send-notification-with-icon.sh) | Send the notification with the icon and show it on the TV. | [Jakub Lanski](https://github.com/jaklan) | ✅ | | |
| | [Show Audio Status](remote-control/lg-tv/show-audio-status.sh) | Show the audio status. | [Jakub Lanski](https://github.com/jaklan) | | | |
| | [Show Audio Volume](remote-control/lg-tv/show-audio-volume.sh) | Show the audio volume. | [Jakub Lanski](https://github.com/jaklan) | | | |
| | [Show Channel](remote-control/lg-tv/show-channel.sh) | Show information about the TV channel. | [Jakub Lanski](https://github.com/jaklan) | | | |
| | [Show Config](remote-control/lg-tv/show-config.sh) | Show the configuration of the library. | [Jakub Lanski](https://github.com/jaklan) | | | |
| | [Show Cursor Socket](remote-control/lg-tv/show-cursor-socket.sh) | Show the cursor socket. | [Jakub Lanski](https://github.com/jaklan) | | | |
| | [Show Foreground App Info](remote-control/lg-tv/show-fg-app-info.sh) | Show information about the foreground application. | [Jakub Lanski](https://github.com/jaklan) | | | |
| | [Show Picture Settings](remote-control/lg-tv/show-picture-settings.sh) | Show picture settings. | [Jakub Lanski](https://github.com/jaklan) | | | |
| | [Show Power State](remote-control/lg-tv/show-power-state.sh) | Show the power state. | [Jakub Lanski](https://github.com/jaklan) | | | |
| | [Show Software Info](remote-control/lg-tv/show-software-info.sh) | Show information about the software. | [Jakub Lanski](https://github.com/jaklan) | | | |
| | [Show Sound Output](remote-control/lg-tv/show-sound-output.sh) | Show the sound output. | [Jakub Lanski](https://github.com/jaklan) | | | |
| | [Show TV Info](remote-control/lg-tv/show-tv-info.sh) | Show information about the TV. | [Jakub Lanski](https://github.com/jaklan) | | | |
| | [Stop Media](remote-control/lg-tv/stop-media.sh) | Stop the media. | [Jakub Lanski](https://github.com/jaklan) | | | |
| | [Switch To Next Channel](remote-control/lg-tv/switch-next-channel.sh) | Switch to the next TV channel. | [Jakub Lanski](https://github.com/jaklan) | | | |
| | [Switch To Previous Channel](remote-control/lg-tv/switch-previous-channel.sh) | Switch to the previous TV channel. | [Jakub Lanski](https://github.com/jaklan) | | | |
| | [Turn Off](remote-control/lg-tv/turn-off.sh) | Turn off the TV. | [Jakub Lanski](https://github.com/jaklan) | | | |
| | [Turn Off 3D](remote-control/lg-tv/turn-off-3d.sh) | Turn off the 3D mode. | [Jakub Lanski](https://github.com/jaklan) | | | |
| | [Turn Off Screen](remote-control/lg-tv/turn-off-screen.sh) | Turn off the screen. | [Jakub Lanski](https://github.com/jaklan) | | | |
| | [Turn On](remote-control/lg-tv/turn-on.sh) | Turn on the TV. | [Jakub Lanski](https://github.com/jaklan) | | | |
| | [Turn On 3D](remote-control/lg-tv/turn-on-3d.sh) | Turn on the 3D mode. | [Jakub Lanski](https://github.com/jaklan) | | | |
| | [Turn On Screen](remote-control/lg-tv/turn-on-screen.sh) | Turn on the screen. | [Jakub Lanski](https://github.com/jaklan) | | | |
| | [Turn Volume Down](remote-control/lg-tv/turn-volume-down.sh) | Turn the volume down. | [Jakub Lanski](https://github.com/jaklan) | | | |
| | [Turn Volume Up](remote-control/lg-tv/turn-volume-up.sh) | Turn the volume up. | [Jakub Lanski](https://github.com/jaklan) | | | |
| | [Unmute](remote-control/lg-tv/unmute.sh) | Unmute the TV. | [Jakub Lanski](https://github.com/jaklan) | | | |
#### Samsung TV
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Turn Off TV](remote-control/samsung-tv/turn-off.template.py) | Turns off a Samsung TV. | [Darryl Brooks](https://github.com/DarrylBrooks97) | | ✅ | |
| | [Turn On TV](remote-control/samsung-tv/turn-on.template.py) | Turns on a Samsung TV. | [Darryl Brooks](https://github.com/DarrylBrooks97) | | ✅ | |
## System
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| 💻 | [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) | | | |
| 💻 | [Capture Fullscreen to Desktop](system/capture-fullscreen-to-desktop.sh) | This script screenshots the entire screen and saves it to the desktop. | [Aaron Miller](https://github.com/aaronhmiller) | | | |
| 💻 | [Capture Screen Selection to Clipboard](system/capture-screen-selection-to-clipboard.sh) | This script screenshots the selected area and saves it to the clipboard. | [Aaron Miller](https://github.com/aaronhmiller) | | | |
| 💻 | [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) | | | |
| | [Create New File in Finder](system/create-new-file-in-finder.applescript) | Create New File in Finder is a script to make your Finder better.You can use this script to create a plain text file. | Jax0rz | | | |
| | [Custom Window Size](system/custom-window.applescript) | Resize and center the frontmost window to any custom size. | [Astrit](https://github.com/astrit) | ✅ | | |
| | [Default to Arc](system/default-browser-arc.applescript) | Set Arc as the default browser. | [Marcos Sánchez-Dehesa](https://github.com/dehesa) | | | |
| | [Default to Chrome](system/default-browser-chrome.applescript) | Set Google Chrome as the default browser. | [Marcos Sánchez-Dehesa](https://github.com/dehesa) | | | |
| | [Default to Chromium](system/default-browser-chromium.applescript) | Set Chromium as the default browser. | [Marcos Sánchez-Dehesa](https://github.com/dehesa) | | | |
| | [Default to Firefox](system/default-browser-firefox.applescript) | Set Firefox as the default browser. | [Marcos Sánchez-Dehesa](https://github.com/dehesa) | | | |
| | [Default to Safari](system/default-browser-safari.applescript) | Set Safari as the default browser. | [Marcos Sánchez-Dehesa](https://github.com/dehesa) | | | |
| 🗑 | [Delete Selected Files](system/delete-selected-files.sh) | Move selected files in Finder to Trash | [Vicent Gozalbes](https://github.com/vigosan) | | | |
| ☕️ | [Disable Caffeinate](system/caffeinate-disable.sh) | Stops all caffeinate sessions | [Yan Smaliak](https://github.com/ysmaliak) | | | |
| 💾 | [Disk Free](system/disk-free.sh) | Show free space in your mounted disks | [Juan Luis Romero](https://github.com/JuanluR8) | | | |
| 💿 | [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 | | | |
| ☕️ | [Enable Caffeinate](system/caffeinate-enable.sh) | Starts a caffeinated session | [Yan Smaliak](https://github.com/ysmaliak) | ✅ | | |
| 💨 | [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) | | | |
| | [Minimize All Windows](system/minimize-all-windows.applescript) | This script minimizes all windows of currently running apps | [Ernest Ojeh](https://github.com/namzo) | | | |
| 🌵 | [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 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 | | | |
| 🗃 | [Open Selection With](system/open-selection-with.applescript) | Open selected items in Finder with the given application. | [Felipe Turcheti](https://felipeturcheti.com) | ✅ | | |
| 💥 | [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) | | | |
| 🔡 | [Running processes](system/list-processes.rb) | List running app showing their process id, CPU usage, name, and optionally the process path. | [Roland Leth](https://runtimesharks.com) | ✅ | | |
| 🎨 | [Sample Color](system/sample-color.swift) | Sample a color from anywhere on your screen. | [Jesse Claven](https://github.com/jesse-c) | | | |
| 🤖 | [Save Image From Clipboard](system/save-image-from-clipboard.py) | Save Image From Clipboard | [Yufei Kang](kangyufei.net) and [LanikSJ](https://github.com/LanikSJ) | | | |
| 🌀 | [Screen Saver](system/screensaver.applescript) | A script command to start your current screen saver. | [Valentin Chrétien](https://twitter.com/valentinchrt) | | | |
| 🧭 | [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) | | ✅ | |
#### Audio
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| ⚡️ | [AirPods Battery Level](system/audio/airpodsbattery.sh) | Get the current battery status of your AirPods. | [Quentin Eude](https://www.github.com/qeude) | | | |
| 🔈 | [Audio devices](system/audio/get-audio-devices.swift) | Lists all audio devices | [Roland Leth](https://runtimesharks.com) | | | |
| 🔈 | [Audio devices](system/audio/get-selected-audio-device.swift) | Shows the selected audio devices for input and output | [Roland Leth](https://runtimesharks.com) | | | |
| 🎧 | [Headphones Battery Level](system/audio/bluetooth-headphones-battery-level.template.sh) | Get the battery level of your bluetooth headphones | [Mortada Sarheed](https://github.com/mSarheed) | | ✅ | |
| 🎧 | [Reload CoreAudio](system/audio/reload-coreaudio.sh) | Reloads CoreAudio. | [Maxim Krouk](https://github.com/maximkrouk) | | | |
| 🎧 | [Set audio device](system/audio/set-audio-device.swift) | Sets the input (i), the output (o) or both (b) audio sources, based on name. If `both` is passed, but no input or output device is found with the given name, it will still try to set the other one. For example, if you're trying to set both to "External mic", which doesn't have an input source, it will still set the output to the mic; vice-versa for a speaker. | [Roland Leth](https://runtimesharks.com) | ✅ | | |
| 🔊 | [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
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| 📡 | [Connect](system/vpn/vpn-start.sh) | Start VPN connection. | [Alexandru Turcanu](https://github.com/Pondorasti) | | | |
| 📡 | [Disconnect](system/vpn/vpn-stop.sh) | Stop VPN connection. | [Alexandru Turcanu](https://github.com/Pondorasti) | | | |
| 📡 | [VPN Status](system/vpn/vpn-status.sh) | Stop VPN connection. | [Alexandru Turcanu](https://github.com/Pondorasti) | | | |
#### Vpnutil
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| 📡 | [Start VPN](system/vpnutil/vpnutil-start.sh) | Start VPN connection. | [Sergey Fuksman](https://github.com/fuksman) | | | |
| 📡 | [Stop VPN](system/vpnutil/vpnutil-stop.sh) | Stop VPN connection | [Sergey Fuksman](https://github.com/fuksman) | | | |
| 📡 | [Toggle VPN](system/vpnutil/vpnutil-toggle.sh) | Toggle VPN connection | [Sergey Fuksman](https://github.com/fuksman) | | | |
| 📡 | [VPN Status](system/vpnutil/vpnutil-status.sh) | Check VPN connection | [Sergey Fuksman](https://github.com/fuksman) | | | |
## Web Searches
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| 📦 | [Bundlephobia cost](web-searches/bundlephobia.sh) | N/A | [Zander Martineau](https://zander.wtf) | ✅ | | |
| ❓ | [Caniuse.com search](web-searches/caniuse.sh) | N/A | [Zander Martineau](https://zander.wtf) | ✅ | | |
| 🌦 | [Check Weather](web-searches/check-weather.sh) | N/A | [Jakub Lanski](https://github.com/jaklan) | ✅ | | |
| 🚚 | [Clipboard to 17TRACK](web-searches/clipboard-to-17track.js) | Open 17TRACK with the tracking code found in the clipboard | [Alessandra Pereyra](https://github.com/alessandrapereyra) | | | |
| 🪙 | [CoinMarketCap Search](web-searches/search-coinmarketcap.sh) | Searches coinmarketcap currencies. | [Benedict Neo](https://github.com/benthecoder) | ✅ | | |
| | [Find Email Address With Hunter](web-searches/hunter.sh) | Find emails using hunter.io | [Tanguy Le Stradic](https://github.com/tanguyls) | ✅ | | |
| 📖 | [Find Paper](web-searches/doi.sh) | Parses and opens DOI links in your browser | [Razvan Azamfirei](https://github.com/razvanazamfirei) | ✅ | | |
| 📖 | [Find Paper](web-searches/doi-clipboard.sh) | Scans clipboard and opens DOI links in your browser | [Razvan Azamfirei](https://github.com/razvanazamfirei) | | | |
| | [Giphy search](web-searches/giphy.sh) | N/A | [Zander Martineau](https://zander.wtf) | ✅ | | |
| 🌍 | [Google Translate](web-searches/google-translate.rb) | Translates via Google Translate | [Roland Leth](https://runtimesharks.com) | ✅ | | |
| | [I'm Feeling Ducky](web-searches/im-feeling-ducky.sh) | Open the first DuckDuckGo search result page for your query (also supports bang!) | [Achille Lacoin](https://github.com/pomdtr) | ✅ | | |
| | [Open WP Engine Install](web-searches/wpengine-install.sh) | Open specified [WP Engine](https://wpengine.com) install. | [Caleb Stauffer](https://github.com/crstauf) | ✅ | | |
| 📦 | [Open npm Package Repo](web-searches/repo.sh) | N/A | [Zander Martineau](https://zander.wtf) | ✅ | | |
| | [PostgreSQL Documentation](web-searches/postgresql.sh) | Search PostgreSQL documentation | [Phil Salant](https://github.com/PSalant726) | ✅ | | |
| | [Pub.dev Search](web-searches/pub-search.sh) | Search [pub.dev](https://pub.dev/) for packages to build Dart and Flutter apps. | [Wade Garrett](https://wadegarrett.com) | ✅ | | |
| | [Search Genre in Chosic](web-searches/search-gender-in-chosic.applescript) | Find the current Spotify track's gender in Chosic | [quelhasu](https://github.com/quelhasu) | | | |
| | [Search GitHub](web-searches/search-github.sh) | Search [GitHub](https://github.com). | [Caleb Stauffer](https://github.com/crstauf) | ✅ | | |
| | [Search Go Package Documentation](web-searches/pkg-go-dev.sh) | Search pkg.go.dev for package documentation | [Phil Salant](https://github.com/PSalant726) | ✅ | | |
| | [Search Google Maps](web-searches/google-maps.sh) | N/A | Raycast | ✅ | | |
| | [Search Hacker News](web-searches/search-hacker-news.sh) | Search Hacker News | [Shannon Matthews](https://github.com/s-oram) | ✅ | | |
| | [Search IMDB](web-searches/search-imdb.sh) | Search IMDB. | [Lucas Costa](https://github.com/lucasrcosta) | ✅ | | |
| | [Search LinkedIn](web-searches/search-linkedin.sh) | Search LinkedIn | [Nitin Gupta](https://twitter.com/gniting) | ✅ | | |
| | [Search MDN (Mozilla Developer Network)](web-searches/mozilla-developer-network.sh) | N/A | [Jon Callahan](https://www.joncallahan.com) | ✅ | | |
| | [Search Netflix](web-searches/search-netflix.sh) | Search Netflix. | [Caleb Stauffer](https://github.com/crstauf) | ✅ | | |
| | [Search OpenSecrets.org](web-searches/opensecrets.sh) | N/A | [Daniel Sieradski](https://github.com/selfagency) | ✅ | | |
| | [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 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) | ✅ | | |
| | [Search cdnjs](web-searches/search-cdnjs.sh) | Search [cdnjs.com](https://cdnjs.com/) for library. | [Caleb Stauffer](https://github.com/crstauf) | ✅ | | |
| | [Search for Crate](web-searches/rust-crate.sh) | Search for a rust crate on crates.io | [Matthew Gleich](https://mattglei.ch) | ✅ | | |
| | [Search in Amazon](web-searches/amazon.sh) | N/A | Raycast | ✅ | | |
| | [Search in App Store](web-searches/app-store.sh) | Search in App Store app | [Andrei Borisov](https://github.com/andreiborisov) | ✅ | | |
| | [Search in Baidu](web-searches/search-in-baidu.sh) | N/A | Jax0rz | ✅ | | |
| | [Search in Bilibili](web-searches/search-in-bilibili.sh) | N/A | Jax0rz | ✅ | | |
| | [Search in Crunchbase](web-searches/crunchbase.sh) | N/A | Raycast | ✅ | | |
| | [Search in DnDBeyond.com](web-searches/search-in-dndbeyond.sh) | N/A | [Chris Koerner Zeller](https://github.com/ChessMess) | ✅ | | |
| | [Search in DuckDuckGo](web-searches/duck-duck-go.sh) | N/A | Raycast | ✅ | | |
| | [Search in Ecosia](web-searches/ecosia.sh) | N/A | [Sasivarnan R](https://github.com/sasivarnan) | ✅ | | |
| 🔎 | [Search in Emojipedia](web-searches/search-emojipedia.sh) | Search for emojis at emojipedia. | [Benedict Neo](https://github.com/benthecoder) | ✅ | | |
| | [Search in Figma](web-searches/figma.sh) | Search files in Figma | [Tanguy Le Stradic](https://github.com/tanguyls) | ✅ | | |
| | [Search in Google](web-searches/google-search.sh) | N/A | Raycast | ✅ | | |
| | [Search in Jingdong](web-searches/search-in-jingdong.sh) | N/A | [sunbufu](https://sunbufu.github.io/) | ✅ | | |
| | [Search in Kinopoisk](web-searches/kinopoisk.sh) | N/A | [Andrei Borisov](https://github.com/andreiborisov) | ✅ | | |
| | [Search in MDN (Mozilla) Docs by Topic](web-searches/mdn.sh) | Search in MDN (Mozilla) Docs by topic | [Jesse Traynham](https://github.com/traynham) | ✅ | | |
| | [Search in Taobao](web-searches/search-in-taobao.sh) | N/A | Jax0rz | ✅ | | |
| | [Search in Twitter](web-searches/twitter-search.sh) | N/A | Raycast | ✅ | | |
| | [Search in Wikipedia](web-searches/search-in-wikipedia.sh) | N/A | Jax0rz | ✅ | | |
| | [Search in Yandex](web-searches/yandex-search.sh) | N/A | Raycast | ✅ | | |
| | [Search in YouTube](web-searches/youtube.sh) | N/A | Raycast | ✅ | | |
| | [Search in Zhihu](web-searches/search-in-zhihu.sh) | N/A | Jax0rz | ✅ | | |
| | [Search in arXiv](web-searches/arxiv.sh) | N/A | [Marco Varisco](https://github.com/mava) | ✅ | | |
| | [Search in devhints.io](web-searches/search-in-devhints.sh) | N/A | [Francois](https://github.com/AsterYujano) | ✅ | | |
| | [Search in grep.app](web-searches/grep-app-search.sh) | N/A | Raycast | ✅ | | |
| | [Search npm Packages](web-searches/npmjs.sh) | N/A | Raycast | ✅ | | |
| | [Swift Package Index](web-searches/swift-package-index.sh) | Search for Swift packages in the Swift Package Index. | [The Swift Package Index](https://swiftpackageindex.com) | ✅ | | |
| | [Translate with Baidu](web-searches/translate-with-baidu.template.sh) | N/A | [sunbufu](https://sunbufu.github.io/) | ✅ | ✅ | |
| | [Translate with Google](web-searches/translate-with-google.template.sh) | N/A | [sunbufu](https://sunbufu.github.io/) | ✅ | ✅ | |
| 🔗 | [Unfurl URL](web-searches/unfurl.sh) | N/A | [Zander Martineau](https://zander.wtf) | ✅ | | |
| | [Wayback Machine Search](web-searches/wayback-machine.sh) | N/A | [Zander Martineau](https://zander.wtf) | ✅ | | |
| 🐸 | [njt](web-searches/njt.sh) | N/A | [Zander Martineau](https://zander.wtf) | ✅ | | |
| | [npms](web-searches/npms.sh) | N/A | [Zander Martineau](https://zander.wtf) | ✅ | | |
#### WordPress
| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
| | [Search WordPress Docs](web-searches/wordpress/search-wordpress-docs.sh) | Search [WordPress Developer documentation](https://developer.wordpress.org/reference/). | [Caleb Stauffer](https://github.com/crstauf) | ✅ | | |
| | [WordPress CLI Command](web-searches/wordpress/wordpress-cli-command.sh) | Open [WordPress CLI command reference](https://developer.wordpress.org/cli/commands/) for specified command. | [Caleb Stauffer](https://github.com/crstauf) | ✅ | | |
| | [WordPress Classes Reference](web-searches/wordpress/wordpress-classes-reference.sh) | Open [WordPress classes reference](https://developer.wordpress.org/reference/classes/) for specified class. | [Caleb Stauffer](https://github.com/crstauf) | ✅ | | |
| | [WordPress Functions Reference](web-searches/wordpress/wordpress-functions-reference.sh) | Open [WordPress functions reference](https://developer.wordpress.org/reference/functions/) for specified function. | [Caleb Stauffer](https://github.com/crstauf) | ✅ | | |
| | [WordPress Hooks Reference](web-searches/wordpress/wordpress-hooks-reference.sh) | Open [WordPress hooks reference](https://developer.wordpress.org/reference/hooks/) for specified hook. | [Caleb Stauffer](https://github.com/crstauf) | ✅ | | |
## Community
This is a shared place and we're always looking for new Script Commands or other ways to improve Raycast.
If you have anything cool to show, please send us a pull request. If we screwed something up,
please report a bug. Join our
[Slack community](https://www.raycast.com/community)
to brainstorm ideas with like-minded folks.
================================================
FILE: commands/ai/gemini/gemini.js
================================================
#!/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}`,
);
}
================================================
FILE: commands/apps/Message/copycode.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Copy Code
# @raycast.mode silent
# @raycast.packageName Messages
# Optional parameters:
# @raycast.icon images/Message.png
# Documentation:
# @raycast.description Copy verification code from a message.
# @raycast.author Fatpandac
# @raycast.authorURL https://github.com/Fatpandac
USERNAME=$(id -u -n)
result=$(sqlite3 /Users/$USERNAME/Library/Messages/chat.db 'SELECT text FROM message WHERE datetime(date/1000000000 + 978307200,"unixepoch","localtime") > datetime("now","localtime","-60 second") ORDER BY date DESC LIMIT 1;')
#You can append another `keyword` into the list to support other language Messages.
keyword=("验证码" "code");
keyword_regex="^(.*)(${keyword[*]/%/|})(.*)$"
if [ ! $result ]; then
echo "No verification code received in the last 60 seconds!"
exit 0;
fi
if [[ "$result" =~ "$keyword_regex" ]]; then
code=`echo $result | grep -o "[0-9]\{4,6\}"`;
echo "$code" | pbcopy;
echo "$code code copied!"
fi
================================================
FILE: commands/apps/agenda/README.md
================================================
Use these scripts to quickly access your notes on [Agenda](https://agenda.com/).

## Commands
- **On the Agenda Overview**: Opens Agenda's On the Agenda Overview.
- **Agenda Today Overview**: Opens Agenda's Today Overview.
- **Create New On the Agenda Note**: Create a new note and add it to On the Agenda.
================================================
FILE: commands/apps/agenda/agenda-new-note.sh
================================================
#!/bin/bash
# Note: Agenda required
# Install via Mac App Store: https://apps.apple.com/us/app/agenda/id1287445660
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Create New On the Agenda Note
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/agenda.png
# @raycast.argument1 { "type": "text", "placeholder": "Project Title", "percentEncoded": true}
# @raycast.argument2 { "type": "text", "placeholder": "Title", "percentEncoded": true }
# @raycast.argument3 { "type": "text", "placeholder": "Note Text", "percentEncoded": true, "optional": true }
# @raycast.packageName Agenda
# Documentation:
# @raycast.description Creates New Note and adds it to On the Agenda
# @raycast.author Michael Ellis
# @raycast.authorURL https://github.com/mtellis2
open "agenda://x-callback-url/create-note?project-title=$1&title=$2&text=$3&on-the-agenda=true&date=today"
echo "Created On the Agenda Note."
================================================
FILE: commands/apps/agenda/agenda-on-the-agenda.sh
================================================
#!/bin/bash
# Note: Agenda required
# Install via Mac App Store: https://apps.apple.com/us/app/agenda/id1287445660
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title On the Agenda Overview
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/agenda.png
# @raycast.packageName Agenda
# Documentation:
# @raycast.description Opens Agenda - On the Agenda Overview
# @raycast.author Michael Ellis
# @raycast.authorURL https://github.com/mtellis2
open "agenda://x-callback-url/on-the-agenda"
echo "Opened On the Agenda Notes."
================================================
FILE: commands/apps/agenda/agenda-today.sh
================================================
#!/bin/bash
# Note: Agenda required
# Install via Mac App Store: https://apps.apple.com/us/app/agenda/id1287445660
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Agenda Today Overview
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/agenda.png
# @raycast.packageName Agenda
# Documentation:
# @raycast.description Opens Agenda - Today Overview
# @raycast.author Michael Ellis
# @raycast.authorURL https://github.com/mtellis2
open "agenda://x-callback-url/today"
echo "Opened Today's Notes."
================================================
FILE: commands/apps/amphetamine/amphetamine-off.applescript
================================================
#!/usr/bin/osascript
# Install Amphetamine via Mac App Store: https://apps.apple.com/us/app/amphetamine/id937984704
# @raycast.title End Session
# @raycast.author James Lyons
# @raycast.authorURL https://github.com/jamesjlyons
# @raycast.description Stop Current Amphetamine Session
# @raycast.icon images/amphetamine.png
# @raycast.mode silent
# @raycast.packageName Amphetamine
# @raycast.schemaVersion 1
tell application "Amphetamine" to end session
log "Ended current session"
================================================
FILE: commands/apps/amphetamine/amphetamine-on.applescript
================================================
#!/usr/bin/osascript
# Install Amphetamine via Mac App Store: https://apps.apple.com/us/app/amphetamine/id937984704
# @raycast.title Start Default Session
# @raycast.author James Lyons
# @raycast.authorURL https://github.com/jamesjlyons
# @raycast.description Start Default Amphetamine Session
# @raycast.icon images/amphetamine.png
# @raycast.mode silent
# @raycast.packageName Amphetamine
# @raycast.schemaVersion 1
tell application "Amphetamine" to start new session
log "Started default session"
================================================
FILE: commands/apps/baremetrics/get-arpu.sh
================================================
#!/bin/bash
# You may need to install coreutils via homebrew to make this script work (gdate function below).
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Average Revenue Per User
# @raycast.mode inline
# @raycast.refreshTime 1h
# Optional parameters:
# @raycast.icon images/baremetrics.png
# @raycast.packageName Baremetrics
# Documentation:
# @raycast.description Display Average revenue per user (ARPU)
# @raycast.author Valentin Chrétien
# @raycast.authorURL https://github.com/valentinchrt
# Configuration
# To create a new API token, do the following:
# 1. Go to Settings > API (https://app.baremetrics.com/settings/api)
# 2. Copy your Live API Key
# 3. Insert your API token below
API_TOKEN=''
DATE=`gdate -d yesterday '+%Y-%m-%d'`
# Main program
if [[ -z "$API_TOKEN" ]]
then
echo "No API token provided"
exit 1
fi
ARPU_BEFORE=$(curl -s GET \
--header 'Accept: application/json' \
--header "Authorization: Bearer ${API_TOKEN}" \
--url "https://api.baremetrics.com/v1/metrics/arpu?start_date=${DATE}&end_date=${DATE}" \
| jq '.metrics[0].value')
ARPU=$(echo "$ARPU_BEFORE * 0.01" | bc -l)
printf "€%'.0f\n" $ARPU
================================================
FILE: commands/apps/baremetrics/get-arr.sh
================================================
#!/bin/bash
# You may need to install coreutils via homebrew to make this script work (gdate function below).
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Annual Recurring Revenue
# @raycast.mode inline
# @raycast.refreshTime 1h
# Optional parameters:
# @raycast.icon images/baremetrics.png
# @raycast.packageName Baremetrics
# Documentation:
# @raycast.description Display Annual Recurring Revenue (ARR)
# @raycast.author Valentin Chrétien
# @raycast.authorURL https://github.com/valentinchrt
# Configuration
# To create a new API token, do the following:
# 1. Go to Settings > API (https://app.baremetrics.com/settings/api)
# 2. Copy your Live API Key
# 3. Insert your API token below
API_TOKEN=''
DATE=`gdate -d yesterday '+%Y-%m-%d'`
# Main program
if [[ -z "$API_TOKEN" ]]
then
echo "No API token provided"
exit 1
fi
ARR_BEFORE=$(curl -s GET \
--header 'Accept: application/json' \
--header "Authorization: Bearer ${API_TOKEN}" \
--url "https://api.baremetrics.com/v1/metrics/arr?start_date=${DATE}&end_date=${DATE}" \
| jq '.metrics[0].value')
ARR=$(echo "$ARR_BEFORE * 0.01" | bc -l)
printf "€%'.0f\n" $ARR
================================================
FILE: commands/apps/baremetrics/get-ltv.sh
================================================
#!/bin/bash
# You may need to install coreutils via homebrew to make this script work (gdate function below).
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Lifetime Value
# @raycast.mode inline
# @raycast.refreshTime 1h
# Optional parameters:
# @raycast.icon images/baremetrics.png
# @raycast.packageName Baremetrics
# Documentation:
# @raycast.description Display Lifetime Value (LTV)
# @raycast.author Valentin Chrétien
# @raycast.authorURL https://github.com/valentinchrt
# Configuration
# To create a new API token, do the following:
# 1. Go to Settings > API (https://app.baremetrics.com/settings/api)
# 2. Copy your Live API Key
# 3. Insert your API token below
API_TOKEN=''
DATE=`gdate -d yesterday '+%Y-%m-%d'`
# Main program
if [[ -z "$API_TOKEN" ]]
then
echo "No API token provided"
exit 1
fi
LTV_BEFORE=$(curl -s GET \
--header 'Accept: application/json' \
--header "Authorization: Bearer ${API_TOKEN}" \
--url "https://api.baremetrics.com/v1/metrics/ltv?start_date=${DATE}&end_date=${DATE}" \
| jq '.metrics[0].value')
LTV=$(echo "$LTV_BEFORE * 0.01" | bc -l)
printf "€%'.0f\n" $LTV
================================================
FILE: commands/apps/baremetrics/get-mrr.sh
================================================
#!/bin/bash
# You may need to install coreutils via homebrew to make this script work (gdate function below).
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Monthly Recurring Revenue
# @raycast.mode inline
# @raycast.refreshTime 1h
# Optional parameters:
# @raycast.icon images/baremetrics.png
# @raycast.packageName Baremetrics
# Documentation:
# @raycast.description Display Monthly Recurring Revenue (MRR)
# @raycast.author Valentin Chrétien
# @raycast.authorURL https://github.com/valentinchrt
# Configuration
# To create a new API token, do the following:
# 1. Go to Settings > API (https://app.baremetrics.com/settings/api)
# 2. Copy your Live API Key
# 3. Insert your API token below
API_TOKEN=''
DATE=`gdate -d yesterday '+%Y-%m-%d'`
# Main program
if [[ -z "$API_TOKEN" ]]
then
echo "No API token provided"
exit 1
fi
MRR_BEFORE=$(curl -s GET \
--header 'Accept: application/json' \
--header "Authorization: Bearer ${API_TOKEN}" \
--url "https://api.baremetrics.com/v1/metrics/mrr?start_date=${DATE}&end_date=${DATE}" \
| jq '.metrics[0].value')
MRR=$(echo "$MRR_BEFORE * 0.01" | bc -l)
printf "€%'.0f\n" $MRR
================================================
FILE: commands/apps/baremetrics/simple-dashboard.sh
================================================
#!/bin/bash
# You may need to install coreutils via homebrew to make this script work (gdate function below).
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Revenue
# @raycast.mode inline
# @raycast.refreshTime 1h
# Optional parameters:
# @raycast.icon images/baremetrics.png
# @raycast.packageName Baremetrics
# Documentation:
# @raycast.description Display Revenue Dashboard
# @raycast.author Valentin Chrétien
# @raycast.authorURL https://github.com/valentinchrt
# Configuration
# To create a new API token, do the following:
# 1. Go to Settings > API (https://app.baremetrics.com/settings/api)
# 2. Copy your Live API Key
# 3. Insert your API token below
API_TOKEN=''
DATE=`gdate -d today '+%Y-%m-%d'`
# Main program
if [[ -z "$API_TOKEN" ]]
then
echo "No API token provided"
exit 1
fi
ROUGH_MRR=$(curl -s GET \
--header 'Accept: application/json' \
--header "Authorization: Bearer ${API_TOKEN}" \
--url "https://api.baremetrics.com/v1/metrics/mrr?start_date=${DATE}&end_date=${DATE}" \
| jq '.metrics[0].value')
CLEANED_MRR=$(echo "$ROUGH_MRR * 0.01" | bc -l)
MRR=$(printf "€%'.0f\n" $CLEANED_MRR)
ROUGH_ARR=$(curl -s GET \
--header 'Accept: application/json' \
--header "Authorization: Bearer ${API_TOKEN}" \
--url "https://api.baremetrics.com/v1/metrics/arr?start_date=${DATE}&end_date=${DATE}" \
| jq '.metrics[0].value')
CLEANED_ARR=$(echo "$ROUGH_ARR * 0.01" | bc -l)
ARR=$(printf "€%'.0f\n" $CLEANED_ARR)
ROUGH_LTV=$(curl -s GET \
--header 'Accept: application/json' \
--header "Authorization: Bearer ${API_TOKEN}" \
--url "https://api.baremetrics.com/v1/metrics/ltv?start_date=${DATE}&end_date=${DATE}" \
| jq '.metrics[0].value')
CLEANED_LTV=$(echo "$ROUGH_LTV * 0.01" | bc -l)
LTV=$(printf "€%'.0f\n" $CLEANED_LTV)
ROUGH_ARPU=$(curl -s GET \
--header 'Accept: application/json' \
--header "Authorization: Bearer ${API_TOKEN}" \
--url "https://api.baremetrics.com/v1/metrics/arpu?start_date=${DATE}&end_date=${DATE}" \
| jq '.metrics[0].value')
CLEANED_ARPU=$(echo "$ROUGH_ARPU * 0.01" | bc -l)
ARPU=$(printf "€%'.0f\n" $CLEANED_ARPU)
# Display Revenue Dashboard
echo "MRR: $MRR | ARR: $ARR | LTV: $LTV | ARPU: $ARPU"
================================================
FILE: commands/apps/bartender/bartender-search.applescript
================================================
#!/usr/bin/osascript
# Note: Bartender 4 required
# Install from https://www.macbartender.com/
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Search Bartender
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/bartender-icon.png
# @raycast.argument1 { "type": "text", "placeholder": "Menu Bar Item Name" }
# @raycast.packageName Bartender.app
# Documentation:
# @raycast.description Perform a quick search of Menu Bar Items, in Bartender 4
on run argv
tell application "Bartender 4"
quick search with argv
end tell
end run
================================================
FILE: commands/apps/bear/bear-add-note.sh
================================================
#!/bin/bash
# Install Bear via Mac App Store: https://apps.apple.com/us/app/bear/id1091189122
# @raycast.title Add Note
# @raycast.author Tanay Nistala
# @raycast.authorURL https://github.com/tanaynistala
# @raycast.description Add a new note to Bear.
#
# @raycast.icon images/bear-light.png
# @raycast.iconDark images/bear-dark.png
#
# @raycast.mode silent
# @raycast.packageName Bear
# @raycast.schemaVersion 1
# @raycast.argument1 { "type": "text", "placeholder": "Title", "percentEncoded": true}
# @raycast.argument2 { "type": "text", "placeholder": "Content", "optional": true, "percentEncoded": true}
# @raycast.argument3 { "type": "text", "placeholder": "Use Clipboard?", "optional": true, "percentEncoded": true}
open "bear://x-callback-url/create?title=${1}&clipboard=${3}&text=${2}"
echo "Note created!"
================================================
FILE: commands/apps/bear/bear-open-note.sh
================================================
#!/bin/bash
# Install Bear via Mac App Store: https://apps.apple.com/us/app/bear/id1091189122
# @raycast.title Open Note
# @raycast.author Tanay Nistala
# @raycast.authorURL https://github.com/tanaynistala
# @raycast.description Open the specified note in Bear.
#
# @raycast.icon images/bear-light.png
# @raycast.iconDark images/bear-dark.png
#
# @raycast.mode silent
# @raycast.packageName Bear
# @raycast.schemaVersion 1
# @raycast.argument1 { "type": "text", "placeholder": "Title", "percentEncoded": true}
open "bear://x-callback-url/open-note?title=${1}"
================================================
FILE: commands/apps/bear/bear-open-tag.sh
================================================
#!/bin/bash
# Install Bear via Mac App Store: https://apps.apple.com/us/app/bear/id1091189122
# @raycast.title Open Tag
# @raycast.author Tanay Nistala
# @raycast.authorURL https://github.com/tanaynistala
# @raycast.description Open the specified tag in Bear.
#
# @raycast.icon images/bear-light.png
# @raycast.iconDark images/bear-dark.png
#
# @raycast.mode silent
# @raycast.packageName Bear
# @raycast.schemaVersion 1
# @raycast.argument1 { "type": "text", "placeholder": "Tag", "percentEncoded": true}
open "bear://x-callback-url/open-tag?name=${1}"
================================================
FILE: commands/apps/bear/bear-search.sh
================================================
#!/bin/bash
# Install Bear via Mac App Store: https://apps.apple.com/us/app/bear/id1091189122
# @raycast.title Search
# @raycast.author Tanay Nistala
# @raycast.authorURL https://github.com/tanaynistala
# @raycast.description Search notes by keyword and/or tag in Bear.
#
# @raycast.icon images/bear-light.png
# @raycast.iconDark images/bear-dark.png
#
# @raycast.mode silent
# @raycast.packageName Bear
# @raycast.schemaVersion 1
# @raycast.argument1 { "type": "text", "placeholder": "Term", "optional": true, "percentEncoded": true}
# @raycast.argument2 { "type": "text", "placeholder": "Tag", "optional": true, "percentEncoded": true}
if [ ! -z "$1" ]; then
if [ ! -z "$2" ]; then
open "bear://x-callback-url/search?term=${1}&tag=${2}"
else
open "bear://x-callback-url/search?term=${1}"
fi
else
if [ ! -z "$2" ]; then
open "bear://x-callback-url/search?tag=${2}"
else
open "bear://"
fi
fi
================================================
FILE: commands/apps/bear/bear-today.sh
================================================
#!/bin/bash
# Install Bear via Mac App Store: https://apps.apple.com/us/app/bear/id1091189122
# @raycast.title Open Today
# @raycast.author Tanay Nistala
# @raycast.authorURL https://github.com/tanaynistala
# @raycast.description Open the Today section in Bear.
#
# @raycast.icon images/bear-light.png
# @raycast.iconDark images/bear-dark.png
#
# @raycast.mode silent
# @raycast.packageName Bear
# @raycast.schemaVersion 1
# @raycast.argument1 { "type": "text", "placeholder": "Search Query", "optional": true, "percentEncoded": true}
open "bear://x-callback-url/today?search=${1}"
================================================
FILE: commands/apps/bear/bear-todo.sh
================================================
#!/bin/bash
# Install Bear via Mac App Store: https://apps.apple.com/us/app/bear/id1091189122
# @raycast.title Open Todos
# @raycast.author Tanay Nistala
# @raycast.authorURL https://github.com/tanaynistala
# @raycast.description Open the Todo section in Bear.
#
# @raycast.icon images/bear-light.png
# @raycast.iconDark images/bear-dark.png
#
# @raycast.mode silent
# @raycast.packageName Bear
# @raycast.schemaVersion 1
# @raycast.argument1 { "type": "text", "placeholder": "Search Query", "optional": true, "percentEncoded": true}
open "bear://x-callback-url/todo?search=${1}"
================================================
FILE: commands/apps/busycal/new-busycal-event-or-task.applescript
================================================
#!/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
================================================
FILE: commands/apps/chatgpt/chatgpt-open-safari.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title chatgpt
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/chatgpt.png
# @raycast.packageName Chatgpt Util
# Documentation:
# @raycast.description Open chatgpt in safari
# @raycast.author gintonyc
# @raycast.authorURL https://raycast.com/gintonyc
tell application "Safari"
set targetURLPrefix to "https://chat.openai.com"
set foundTab to false
repeat with aWindow in windows
repeat with aTab in (tabs of aWindow)
set tabURL to URL of aTab
if tabURL starts with targetURLPrefix then
set foundTab to true
set current tab of aWindow to aTab
exit repeat
end if
end repeat
if foundTab then exit repeat
end repeat
if not foundTab then
make new document with properties {URL:targetURLPrefix}
end if
activate
end tell
================================================
FILE: commands/apps/claude/claude.js
================================================
#!/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}`
);
}
================================================
FILE: commands/apps/cleanshot/cleanshot-add-quick-access-overlay.sh
================================================
#!/bin/bash
# Note: CleanShot X v3.8.1 required
# Install from https://cleanshot.com
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Add Quick Access Overlay
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ./images/add-quick-access-overlay.png
# @raycast.packageName CleanShot X
# @raycast.argument1 { "type": "text", "placeholder": "Filepath" }
# Documentation:
# @raycast.author CleanShot X
# @raycast.authorURL https://twitter.com/CleanShot_app
# @raycast.description Opens a new Quick Access Overlay with the specified image or video.
open "cleanshot://add-quick-access-overlay?filepath=$1"
================================================
FILE: commands/apps/cleanshot/cleanshot-annotate.sh
================================================
#!/bin/bash
# Note: CleanShot X v3.8.1 required
# Install from https://cleanshot.com
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Annotate
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ./images/annotate.png
# @raycast.packageName CleanShot X
# @raycast.argument1 { "type": "text", "placeholder": "Filepath", "optional": true }
# Documentation:
# @raycast.author CleanShot X
# @raycast.authorURL https://twitter.com/CleanShot_app
# @raycast.description Opens specified file in Annotate.
if [[ -z "$1" ]]
then
open "cleanshot://open-annotate"
else
open "cleanshot://open-annotate?filepath=$1"
fi
================================================
FILE: commands/apps/cleanshot/cleanshot-capture-area.sh
================================================
#!/bin/bash
# Note: CleanShot X v3.5.1 required
# Install from https://cleanshot.com
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Capture Area
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ./images/capture-area.png
# @raycast.packageName CleanShot X
# Documentation:
# @raycast.author CleanShot X
# @raycast.authorURL https://twitter.com/CleanShot_app
# @raycast.description Take a screenshot of a specific area on your screen.
open "cleanshot://capture-area"
================================================
FILE: commands/apps/cleanshot/cleanshot-capture-fullscreen.sh
================================================
#!/bin/bash
# Note: CleanShot X v3.5.1 required
# Install from https://cleanshot.com
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Capture Fullscreen
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ./images/capture-fullscreen.png
# @raycast.packageName CleanShot X
# Documentation:
# @raycast.author CleanShot X
# @raycast.authorURL https://twitter.com/CleanShot_app
# @raycast.description Take a screenshot of your screen.
open "cleanshot://capture-fullscreen"
================================================
FILE: commands/apps/cleanshot/cleanshot-capture-previous-area.sh
================================================
#!/bin/bash
# Note: CleanShot X v3.5.1 required
# Install from https://cleanshot.com
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Capture Previous Area
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ./images/capture-previous-area.png
# @raycast.packageName CleanShot X
# Documentation:
# @raycast.author CleanShot X
# @raycast.authorURL https://twitter.com/CleanShot_app
# @raycast.description Take a screenshot of the previously specified area of your screen.
open "cleanshot://capture-previous-area"
================================================
FILE: commands/apps/cleanshot/cleanshot-capture-text.sh
================================================
#!/bin/bash
# Note: CleanShot X v3.8.1 required
# Install from https://cleanshot.com
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Capture Text
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ./images/capture-text.png
# @raycast.packageName CleanShot X
# @raycast.argument1 { "type": "text", "placeholder": "Filepath", "optional": true }
# Documentation:
# @raycast.author CleanShot X
# @raycast.authorURL https://twitter.com/CleanShot_app
# @raycast.description Opens Text Recognition (OCR) tool or extracts text from the specified file.
if [[ -z "$1" ]]
then
open "cleanshot://capture-text"
else
open "cleanshot://capture-text?filepath=$1"
fi
================================================
FILE: commands/apps/cleanshot/cleanshot-capture-window.sh
================================================
#!/bin/bash
# Note: CleanShot X v3.5.1 required
# Install from https://cleanshot.com
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Capture Window
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ./images/capture-window.png
# @raycast.packageName CleanShot X
# Documentation:
# @raycast.author CleanShot X
# @raycast.authorURL https://twitter.com/CleanShot_app
# @raycast.description Take a screenshot of a window.
open "cleanshot://capture-window"
================================================
FILE: commands/apps/cleanshot/cleanshot-open-from-clipboard.sh
================================================
#!/bin/bash
# Note: CleanShot X v3.5.1 required
# Install from https://cleanshot.com
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open from Clipboard
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ./images/clipboard.png
# @raycast.packageName CleanShot X
# Documentation:
# @raycast.author CleanShot X
# @raycast.authorURL https://twitter.com/CleanShot_app
# @raycast.description Open screenshot that is currently in the clipboard.
open "cleanshot://open-from-clipboard"
================================================
FILE: commands/apps/cleanshot/cleanshot-pin.sh
================================================
#!/bin/bash
# Note: CleanShot X v3.5.1 required
# Install from https://cleanshot.com
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Pin to the Screen
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ./images/pin.png
# @raycast.packageName CleanShot X
# @raycast.argument1 { "type": "text", "placeholder": "Filepath", "optional": true }
# Documentation:
# @raycast.author CleanShot X
# @raycast.authorURL https://twitter.com/CleanShot_app
# @raycast.description Pin a screenshot to the screen.
if [[ -z "$1" ]]
then
open "cleanshot://pin"
else
open "cleanshot://pin?filepath=$1"
fi
================================================
FILE: commands/apps/cleanshot/cleanshot-record-screen-with-keystroke-pro.sh
================================================
#!/bin/bash
# Note: CleanShot X required
# Install from https://cleanshot.com
#
# Keystroke Pro required
# Install from https://apps.apple.com/app/id1572206224?ct=ixeau
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Record Screen With Keystroke Pro
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ./images/record-screen-keystroke-pro.png
# @raycast.packageName CleanShot X
# Documentation:
# @raycast.author Danylo Zalizchuk
# @raycast.authorURL https://raycast.com/danulqua
# @raycast.description Start a screen recording with keystrokes using the Keystroke Pro app and save it as a video or an optimized GIF file.
open "/Applications/Keystroke Pro.app"
open "cleanshot://record-screen"
================================================
FILE: commands/apps/cleanshot/cleanshot-record-screen.sh
================================================
#!/bin/bash
# Note: CleanShot X v3.5.1 required
# Install from https://cleanshot.com
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Record Screen
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ./images/record-screen.png
# @raycast.packageName CleanShot X
# Documentation:
# @raycast.author CleanShot X
# @raycast.authorURL https://twitter.com/CleanShot_app
# @raycast.description Start a screen recording and save it as a video or an optimized GIF file.
open "cleanshot://record-screen"
================================================
FILE: commands/apps/cleanshot/cleanshot-restore.sh
================================================
#!/bin/bash
# Note: CleanShot X v3.5.1 required
# Install from https://cleanshot.com
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Restore Recently Closed File
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ./images/restore.png
# @raycast.packageName CleanShot X
# Documentation:
# @raycast.author CleanShot X
# @raycast.authorURL https://twitter.com/CleanShot_app
# @raycast.description Restore the recently closed file.
open "cleanshot://restore-recently-closed"
================================================
FILE: commands/apps/cleanshot/cleanshot-scrolling-capture.sh
================================================
#!/bin/bash
# Note: CleanShot X v3.5.1 required
# Install from https://cleanshot.com
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Scrolling Capture
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ./images/scrolling-capture.png
# @raycast.packageName CleanShot X
# Documentation:
# @raycast.author CleanShot X
# @raycast.authorURL https://twitter.com/CleanShot_app
# @raycast.description Capture any scrollable content.
open "cleanshot://scrolling-capture"
================================================
FILE: commands/apps/cleanshot/cleanshot-self-timer.sh
================================================
#!/bin/bash
# Note: CleanShot X v3.5.1 required
# Install from https://cleanshot.com
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Self-Timer
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ./images/self-timer.png
# @raycast.packageName CleanShot X
# Documentation:
# @raycast.author CleanShot X
# @raycast.authorURL https://twitter.com/CleanShot_app
# @raycast.description Take a screenshot after a specified delay to capture the perfect moment.
open "cleanshot://self-timer"
================================================
FILE: commands/apps/cleanshot/cleanshot-toggle-desktop-icons.sh
================================================
#!/bin/bash
# Note: CleanShot X v3.5.1 required
# Install from https://cleanshot.com
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Toggle Desktop Icons
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ./images/toggle-desktop-icons.png
# @raycast.packageName CleanShot X
# Documentation:
# @raycast.author CleanShot X
# @raycast.authorURL https://twitter.com/CleanShot_app
# @raycast.description Hide clutter on your Desktop.
open "cleanshot://toggle-desktop-icons"
================================================
FILE: commands/apps/craft/craft-create-doc.template.sh
================================================
#!/bin/bash
# Dependency: This script requires `Craft v1.2.6` installed: https://www.craft.do/
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Create Doc
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ./images/craft.png
# @raycast.packageName Craft
# @Documentation:
# @raycast.description Creates a doc in Craft
# @raycast.author James Lyons
# @raycast.authorURL https://github.com/jamesjlyons
# @raycast.argument1 { "type": "text", "placeholder": "Title", "optional": false, "percentEncoded": true }
# @raycast.argument2 { "type": "text", "placeholder": "Content (Markdown)", "optional": true, "percentEncoded": true }
# Configuration:
# To retrieve your Craft space_id, do the following:
# 1. Go to the space in Craft you'd like to use
# 2. Open or create a doc
# 3. Right click on a block of content in your doc and click on Copy Deeplink. Your space_id will be in the URL.
SPACE_ID=""
open "craftdocs://createdocument?spaceId=$SPACE_ID&title=${1}&content=${2}&folderId="
================================================
FILE: commands/apps/craft/craft-search-workspace.template.sh
================================================
#!/bin/bash
# Dependency: This script requires `Craft v1.2.6` installed: https://www.craft.do/
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Search in Workspace
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ./images/craft.png
# @raycast.packageName Craft
# @Documentation:
# @raycast.description Searches in Workspace in Craft
# @raycast.author James Lyons
# @raycast.authorURL https://github.com/jamesjlyons
# @raycast.argument1 { "type": "text", "placeholder": "Query", "optional": false, "percentEncoded": true }
# Configuration:
# To retrieve your Craft space_id, do the following:
# 1. Go to the space in Craft you'd like to use
# 2. Open or create a doc
# 3. Right click on a block of content in your doc and click on Copy Deeplink. Your space_id will be in the URL.
SPACE_ID=""
open "craftdocs://opensearch?spaceId=$SPACE_ID&query=${1}"
================================================
FILE: commands/apps/deepl/deepl-app-translate.applescript
================================================
#!/usr/bin/osascript
# Dependency: This script requires DeepL to be installed: https://deepl.com/app
# Tested with DeepL for Mac Version 3.1.133440
# Once installed, DeepL will run in the background even if you quit the app from the dock
# This script will work as long as the DeepL icon is visible in the menu bar in the top right
# Configuration options are available in the script below
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title DeepL App Translate
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/deepl.png
# @raycast.argument1 { "type": "text", "placeholder": "text", "optional": true }
# @raycast.packageName Apps
# Documentation:
# @raycast.description Translate text in DeepL for Mac. Features options to input from the clipboard as well as automatically copy translation results.
# @raycast.author Jono Hewitt
# @raycast.authorURL https://github.com/jonohewitt
on run translate
### Configuration: ###
-- Choose whether to use the clipboard as the input if no input argument is entered in Raycast:
set useClipboardAsInput to false
-- Choose whether the translation result should be automatically copied to the clipboard:
set copyResultToClipboard to false
### End of configuration ###
do shell script "open -a DeepL"
set inputText to ""
if item 1 of translate is "" then
if useClipboardAsInput is true
set inputText to the clipboard
end if
else
set inputText to item 1 of translate
end if
tell application "System Events"
set value of text area 1 of group 3 of group 1 of group 1 of UI Element 1 of scroll area 1 of group 1 of group 1 of window "DeepL" of process "DeepL" to inputText
end tell
if copyResultToClipboard is true then
set translation to ""
set timeoutSeconds to 10.0
set endDate to (current date) + timeoutSeconds
tell application "System Events"
repeat until translation is not ""
if exists of text area 1 of group 6 of group 3 of group 1 of UI Element 1 of scroll area 1 of group 1 of group 1 of window "DeepL" of process "DeepL"
set translation to value of text area 1 of group 6 of group 3 of group 1 of UI Element 1 of scroll area 1 of group 1 of group 1 of window "DeepL" of process "DeepL"
end if
if ((current date) > endDate) then
exit repeat
end if
delay 0.2
end repeat
end tell
if translation is not ""
set the clipboard to translation
end if
end if
end run
================================================
FILE: commands/apps/deepl/deepl-web-translate.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title DeepL Web Translate
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/deepl.png
# @raycast.packageName Web Searches
# @raycast.argument1 { "type": "text", "placeholder": "text", "percentEncoded": true, "optional": true }
# @raycast.argument2 { "type": "text", "placeholder": "to", "optional": true }
# @raycast.argument3 { "type": "text", "placeholder": "from", "optional": true }
# Documentation:
# @raycast.description Translate text on the DeepL website. Translates to a default language if no "to" argument is given.
# @raycast.author Jono Hewitt
# @raycast.authorURL https://github.com/jonohewitt
### Language codes:
# Bulgarian: bg
# Chinese simplified: zh
# Czech: cs
# Danish: da
# Dutch: nl
# English (American and British): en
# Estonian: et
# Finnish: fi
# German: de
# Greek: el
# Hungarian: hu
# Italian: it
# Japanese: ja
# Latvian: lv
# Lithuanian: lt
# Polish: pl
# Portuguese (Brazilian and Portuguese): pt
# Romanian: ro
# Russian: ru
# Slovak: sk
# Slovenian: sl
# Spanish: es
# Swedish: sv
# It's not usually necessary to specify a "from" language as DeepL will auto-detect it, however on very short inputs it can be helpful
# You can enter no inputs just to bring up the DeepL website
# Configure your default language code here:
defaultLang="en"
inputText=$1
toLang=$2
fromLang=$3
if [ -z $2 ]; then
toLang=$defaultLang
fi
if [ -z $3 ]; then
fromLang=$defaultLang
fi
open "https://www.deepl.com/translator#$fromLang/$toLang/$inputText"
================================================
FILE: commands/apps/devutils/backslash.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.icon images/devutils.png
# @raycast.title Backslash Escape/Unescape
# @raycast.mode silent
# @raycast.packageName DevUtils.app
# Documentation:
# @raycast.description Escape (or unescape) backslashes in your current clipboard string
# @raycast.author DevUtils.app
# @raycast.authorURL https://devutils.app
open devutils://backslash?clipboard
================================================
FILE: commands/apps/devutils/base64encode.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.icon images/devutils.png
# @raycast.title Base64 String Encode/Decode
# @raycast.mode silent
# @raycast.packageName DevUtils.app
# Documentation:
# @raycast.description Decode the Base64 string in clipboard (if it’s decodable)
# @raycast.author DevUtils.app
# @raycast.authorURL https://devutils.app
open devutils://base64encode?clipboard
================================================
FILE: commands/apps/devutils/base64image.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.icon images/devutils.png
# @raycast.title Base64 Image Encode/Decode
# @raycast.mode silent
# @raycast.packageName DevUtils.app
# Documentation:
# @raycast.description Decode the Base64 string in clipboard to an image (if it’s decodable)
# @raycast.author DevUtils.app
# @raycast.authorURL https://devutils.app
open devutils://base64image?clipboard
================================================
FILE: commands/apps/devutils/cronparser.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.icon images/devutils.png
# @raycast.title Cron Job Parser
# @raycast.mode silent
# @raycast.packageName DevUtils.app
# Documentation:
# @raycast.description Parse the cron job expression in clipboard (if it’s a valid cron expression)
# @raycast.author DevUtils.app
# @raycast.authorURL https://devutils.app
open devutils://cronparser?clipboard
================================================
FILE: commands/apps/devutils/cssformatter.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.icon images/devutils.png
# @raycast.title CSS Beautify/Minify
# @raycast.mode silent
# @raycast.packageName DevUtils.app
# Documentation:
# @raycast.description Beautify or minify your current clipboard as CSS
# @raycast.author DevUtils.app
# @raycast.authorURL https://devutils.app
open devutils://cssformatter?clipboard
================================================
FILE: commands/apps/devutils/csv2json.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.icon images/devutils.png
# @raycast.title CSV to JSON
# @raycast.mode silent
# @raycast.packageName DevUtils.app
# Documentation:
# @raycast.description Convert your current clipboard from CSV to JSON
# @raycast.author DevUtils.app
# @raycast.authorURL https://devutils.app
open devutils://csv2json?clipboard
================================================
FILE: commands/apps/devutils/erbformatter.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.icon images/devutils.png
# @raycast.title ERB Beautify/Minify
# @raycast.mode silent
# @raycast.packageName DevUtils.app
# Documentation:
# @raycast.description Beautify or minify your current clipboard as ERB
# @raycast.author DevUtils.app
# @raycast.authorURL https://devutils.app
open devutils://erbformatter?clipboard
================================================
FILE: commands/apps/devutils/hashing.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.icon images/devutils.png
# @raycast.title Hash Generator
# @raycast.mode silent
# @raycast.packageName DevUtils.app
# Documentation:
# @raycast.description Calculate the hash of your current clipboard string
# @raycast.author DevUtils.app
# @raycast.authorURL https://devutils.app
open devutils://hashing?clipboard
================================================
FILE: commands/apps/devutils/html2jsx.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.icon images/devutils.png
# @raycast.title HTML to JSX
# @raycast.mode silent
# @raycast.packageName DevUtils.app
# Documentation:
# @raycast.description Convert the HTML string in clipboard to JSX
# @raycast.author DevUtils.app
# @raycast.authorURL https://devutils.app
open devutils://html2jsx?clipboard
================================================
FILE: commands/apps/devutils/htmlencode.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.icon images/devutils.png
# @raycast.title HTML Entity Encode/Decode
# @raycast.mode silent
# @raycast.packageName DevUtils.app
# Documentation:
# @raycast.description Escape (or unescape) the HTML entities your current clipboard string
# @raycast.author DevUtils.app
# @raycast.authorURL https://devutils.app
open devutils://htmlencode?clipboard
================================================
FILE: commands/apps/devutils/htmlformatter.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.icon images/devutils.png
# @raycast.title HTML Beautify/Minify
# @raycast.mode silent
# @raycast.packageName DevUtils.app
# Documentation:
# @raycast.description Beautify or minify your current clipboard as HTML
# @raycast.author DevUtils.app
# @raycast.authorURL https://devutils.app
open devutils://htmlformatter?clipboard
================================================
FILE: commands/apps/devutils/htmlpreview.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.icon images/devutils.png
# @raycast.title HTML Preview
# @raycast.mode silent
# @raycast.packageName DevUtils.app
# Documentation:
# @raycast.description Show a HTML preview of your current clipboard string
# @raycast.author DevUtils.app
# @raycast.authorURL https://devutils.app
open devutils://htmlpreview?clipboard
================================================
FILE: commands/apps/devutils/jsformatter.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.icon images/devutils.png
# @raycast.title JS Beautify/Minify
# @raycast.mode silent
# @raycast.packageName DevUtils.app
# Documentation:
# @raycast.description Beautify or minify your current clipboard as JavaScript
# @raycast.author DevUtils.app
# @raycast.authorURL https://devutils.app
open devutils://jsformatter?clipboard
================================================
FILE: commands/apps/devutils/json2csv.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.icon images/devutils.png
# @raycast.title JSON to CSV
# @raycast.mode silent
# @raycast.packageName DevUtils.app
# Documentation:
# @raycast.description Convert your current clipboard from JSON to CSV
# @raycast.author DevUtils.app
# @raycast.authorURL https://devutils.app
open devutils://json2csv?clipboard
================================================
FILE: commands/apps/devutils/json2yaml.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.icon images/devutils.png
# @raycast.title JSON to YAML
# @raycast.mode silent
# @raycast.packageName DevUtils.app
# Documentation:
# @raycast.description Convert your current clipboard from JSON to YAML
# @raycast.author DevUtils.app
# @raycast.authorURL https://devutils.app
open devutils://json2yaml?clipboard
================================================
FILE: commands/apps/devutils/jsonformatter.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.icon images/devutils.png
# @raycast.title JSON Format/Validate
# @raycast.mode silent
# @raycast.packageName DevUtils.app
# Documentation:
# @raycast.description Format the JSON string currently in your clipboard (if it’s a valid JSON)
# @raycast.author DevUtils.app
# @raycast.authorURL https://devutils.app
open devutils://jsonformatter?clipboard
================================================
FILE: commands/apps/devutils/jwt.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.icon images/devutils.png
# @raycast.title JWT Debugger
# @raycast.mode silent
# @raycast.packageName DevUtils.app
# Documentation:
# @raycast.description Decode and verify the current JWT token in your clipboard
# @raycast.author DevUtils.app
# @raycast.authorURL https://devutils.app
open devutils://jwt?clipboard
================================================
FILE: commands/apps/devutils/lessformatter.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.icon images/devutils.png
# @raycast.title LESS Beautify/Minify
# @raycast.mode silent
# @raycast.packageName DevUtils.app
# Documentation:
# @raycast.description Beautify or minify your current clipboard as LESS
# @raycast.author DevUtils.app
# @raycast.authorURL https://devutils.app
open devutils://lessformatter?clipboard
================================================
FILE: commands/apps/devutils/loremipsum.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.icon images/devutils.png
# @raycast.title Lorem Ipsum Generator
# @raycast.mode silent
# @raycast.packageName DevUtils.app
# Documentation:
# @raycast.description Get some randomly generated lorem ipsum strings
# @raycast.author DevUtils.app
# @raycast.authorURL https://devutils.app
open devutils://loremipsum?clipboard
================================================
FILE: commands/apps/devutils/markdownpreview.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.icon images/devutils.png
# @raycast.title Markdown Preview
# @raycast.mode silent
# @raycast.packageName DevUtils.app
# Documentation:
# @raycast.description Preview the markdown string currently in your clipboard
# @raycast.author DevUtils.app
# @raycast.authorURL https://devutils.app
open devutils://markdownpreview?clipboard
================================================
FILE: commands/apps/devutils/numberbase.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.icon images/devutils.png
# @raycast.title Number Base Converter
# @raycast.mode silent
# @raycast.packageName DevUtils.app
# Documentation:
# @raycast.description Convert numbers between bases (oct, hex, binary, etc.)
# @raycast.author DevUtils.app
# @raycast.authorURL https://devutils.app
open devutils://numberbase?clipboard
================================================
FILE: commands/apps/devutils/qrcode.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.icon images/devutils.png
# @raycast.title QR Code Reader/Generator
# @raycast.mode silent
# @raycast.packageName DevUtils.app
# Documentation:
# @raycast.description Generate a QR code from your current clipboard string
# @raycast.author DevUtils.app
# @raycast.authorURL https://devutils.app
open devutils://qrcode?clipboard
================================================
FILE: commands/apps/devutils/querystringparser.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.icon images/devutils.png
# @raycast.title URL Parser
# @raycast.mode silent
# @raycast.packageName DevUtils.app
# Documentation:
# @raycast.description Parse the URL string currently in your clipboard
# @raycast.author DevUtils.app
# @raycast.authorURL https://devutils.app
open devutils://querystringparser?clipboard
================================================
FILE: commands/apps/devutils/regextester.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.icon images/devutils.png
# @raycast.title RegExp Tester
# @raycast.mode silent
# @raycast.packageName DevUtils.app
# Documentation:
# @raycast.description Test your regular expression with a string and inspect matches, groups, etc.
# @raycast.author DevUtils.app
# @raycast.authorURL https://devutils.app
open devutils://regextester?clipboard
================================================
FILE: commands/apps/devutils/scssformatter.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.icon images/devutils.png
# @raycast.title SCSS Beautify/Minify
# @raycast.mode silent
# @raycast.packageName DevUtils.app
# Documentation:
# @raycast.description Beautify or minify your current clipboard as SCSS
# @raycast.author DevUtils.app
# @raycast.authorURL https://devutils.app
open devutils://scssformatter?clipboard
================================================
FILE: commands/apps/devutils/sqlformatter.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.icon images/devutils.png
# @raycast.title SQL Formatter
# @raycast.mode silent
# @raycast.packageName DevUtils.app
# Documentation:
# @raycast.description Format the SQL string currently in your clipboard
# @raycast.author DevUtils.app
# @raycast.authorURL https://devutils.app
open devutils://sqlformatter?clipboard
================================================
FILE: commands/apps/devutils/stringcaseconverter.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.icon images/devutils.png
# @raycast.title String Case Converter
# @raycast.mode silent
# @raycast.packageName DevUtils.app
# Documentation:
# @raycast.description Convert a string in clipboard into various naming conventions
# @raycast.author DevUtils.app
# @raycast.authorURL https://devutils.app
open devutils://stringcaseconverter?clipboard
================================================
FILE: commands/apps/devutils/stringinspect.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.icon images/devutils.png
# @raycast.title String Inspector
# @raycast.mode silent
# @raycast.packageName DevUtils.app
# Documentation:
# @raycast.description Inspect your current clipboard string (length, words count, unicode, etc.)
# @raycast.author DevUtils.app
# @raycast.authorURL https://devutils.app
open devutils://stringinspect?clipboard
================================================
FILE: commands/apps/devutils/textdiff.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.icon images/devutils.png
# @raycast.title Text Diff Checker
# @raycast.mode silent
# @raycast.packageName DevUtils.app
# Documentation:
# @raycast.description Compare two texts and find diff (per characters, words, lines, etc.)
# @raycast.author DevUtils.app
# @raycast.authorURL https://devutils.app
open devutils://textdiff?clipboard
================================================
FILE: commands/apps/devutils/unixtime.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.icon images/devutils.png
# @raycast.title Unix Time Converter
# @raycast.mode silent
# @raycast.packageName DevUtils.app
# Documentation:
# @raycast.description Parse and display UNIX the timestamp string currently in your clipboard
# @raycast.author DevUtils.app
# @raycast.authorURL https://devutils.app
open devutils://unixtime?clipboard
================================================
FILE: commands/apps/devutils/urlencode.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.icon images/devutils.png
# @raycast.title URL Encode/Decode
# @raycast.mode silent
# @raycast.packageName DevUtils.app
# Documentation:
# @raycast.description Decode the current URL string in your clipboard (if any)
# @raycast.author DevUtils.app
# @raycast.authorURL https://devutils.app
open devutils://urlencode?clipboard
================================================
FILE: commands/apps/devutils/uuidtool.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.icon images/devutils.png
# @raycast.title UUID/ULID Generate/Decode
# @raycast.mode silent
# @raycast.packageName DevUtils.app
# Documentation:
# @raycast.description Decode the UUID in your clipboard (if any), or generate UUIDs
# @raycast.author DevUtils.app
# @raycast.authorURL https://devutils.app
open devutils://uuidtool?clipboard
================================================
FILE: commands/apps/devutils/xmlformatter.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.icon images/devutils.png
# @raycast.title XML Beautify/Minify
# @raycast.mode silent
# @raycast.packageName DevUtils.app
# Documentation:
# @raycast.description Beautify or minify your current clipboard as XML
# @raycast.author DevUtils.app
# @raycast.authorURL https://devutils.app
open devutils://xmlformatter?clipboard
================================================
FILE: commands/apps/devutils/yaml2json.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.icon images/devutils.png
# @raycast.title YAML to JSON
# @raycast.mode silent
# @raycast.packageName DevUtils.app
# Documentation:
# @raycast.description Convert your current clipboard from YAML to JSON
# @raycast.author DevUtils.app
# @raycast.authorURL https://devutils.app
open devutils://yaml2json?clipboard
================================================
FILE: commands/apps/dictionary/look-up-in-dictionary.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Look up in Dictionary
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/dictionary.icns
# @raycast.packageName Dictionary
# Documentation:
# @raycast.description Look up selected text in Dictionary
# @raycast.author yayiji
# @raycast.authorURL https://github.com/yayiji
tell application "System Events"
keystroke "c" using {command down}
delay 0.1
do shell script "open dict://" & the clipboard
end
================================================
FILE: commands/apps/dnd-me/start-dnd-me.sh
================================================
#!/bin/bash
# Install DND Me from https://runtimesharks.com/projects/dnd-me?ref=producthunt
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Start DND
# @raycast.mode silent
# Optional parameters:
# @raycast.icon 🔕
# @raycast.argument1 { "type": "text", "placeholder": "Duration", "optional": true }
# @raycast.packageName DND Me
# Documentation:
# @raycast.description Starts DND via DND Me. The parameter has to be a menu item or slider equivalent: 15m, 30m, 1h, 2h, ..., 12h, next, next-hour, next-half-hour; it defaults to next. next-hour means the next 60m mark, next-half-hour means the next 30m mark and next means the first of the two. For example, if it's 9:22, next-hour means 10:00, next-half-hour means 9:30 and next means 9:30.
# @raycast.author Roland Leth
# @raycast.authorURL https://runtimesharks.com/projects/dnd-me
duration=$1
if [[ -z "$1" ]]
then
duration=next
fi
open "dndme://start-dnd/$duration"
echo "DND on"
================================================
FILE: commands/apps/dnd-me/stop-dnd-me.sh
================================================
#!/bin/bash
# Install DND Me from https://runtimesharks.com/projects/dnd-me?ref=producthunt
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Stop DND
# @raycast.mode silent
# Optional parameters:
# @raycast.icon 🔔
# @raycast.packageName DND Me
# Documentation:
# @raycast.description Stops DND via DND Me.
# @raycast.author Roland Leth
# @raycast.authorURL https://runtimesharks.com/projects/dnd-me
open "dndme://stop-dnd"
echo "DND off"
================================================
FILE: commands/apps/downie/download-video.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Download Video
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/downie.png
# @raycast.packageName Downie
# Documentation:
# @raycast.description Download video from Pasteboard link
# @raycast.author Clu Soh
# @raycast.authorURL https://twitter.com/designedbyclu
regex='(https?|ftp|file)://[-A-Za-z0-9\+&@#/%?=~_|!:,.;]*[-A-Za-z0-9\+&@#/%=~_|]'
pasteboard=$(pbpaste)
if [[ $pasteboard =~ $regex ]]
then
open "downie://XUOpenLink?url=$pasteboard"
echo "Downloading in Downie"
else
echo "Seem like is not a URL you copied"
fi
================================================
FILE: commands/apps/espanso/disable-espanso.sh
================================================
#!/bin/bash
# Dependency: This script requires `espanso` cli installed: https://espanso.org/install/
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Disable Espanso
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/espanso.png
# @raycast.packageName Espanso
# Documentation:
# @raycast.author es183923
# @raycast.authorURL https://github.com/es183923
if ! command -v espanso &> /dev/null; then
echo "espanso is required (https://espanso.org/install).";
exit 1;
fi
espanso cmd disable
================================================
FILE: commands/apps/espanso/enable-espanso.sh
================================================
#!/bin/bash
# Dependency: This script requires `espanso` cli installed: https://espanso.org/install/
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Enable Espanso
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/espanso.png
# @raycast.packageName Espanso
# Documentation:
# @raycast.author es183923
# @raycast.authorURL https://github.com/es183923
if ! command -v espanso &> /dev/null; then
echo "espanso is required (https://espanso.org/install).";
exit 1;
fi
espanso cmd enable
================================================
FILE: commands/apps/espanso/espanso-create-expansion.sh
================================================
#!/bin/bash
# Dependency: This script requires `espanso` cli installed: https://espanso.org/install/
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Create Text Expansion
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/espanso.png
# @raycast.packageName Espanso
# @raycast.argument1 { "type": "text", "placeholder": ":shortcut", "optional": false }
# @raycast.argument2 { "type": "text", "placeholder": "Text", "optional": false }
# Documentation:
# @raycast.description Add a text expansion to expanso
# @raycast.author Max Stoiber
# @raycast.authorURL https://github.com/mxstbr
if ! command -v espanso &> /dev/null; then
echo "espanso is required (https://espanso.org/install).";
exit 1;
fi
echo " - trigger: \"$1\"
replace: \"$2\"" >> ~/Library/Preferences/espanso/default.yml
espanso restart
================================================
FILE: commands/apps/espanso/restart-espanso.sh
================================================
#!/bin/bash
# Dependency: This script requires `espanso` cli installed: https://espanso.org/install/
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Restart Espanso
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/espanso.png
# @raycast.packageName Espanso
# Documentation:
# @raycast.author es183923
# @raycast.authorURL https://github.com/es183923
if ! command -v espanso &> /dev/null; then
echo "espanso is required (https://espanso.org/install).";
exit 1;
fi
espanso restart
================================================
FILE: commands/apps/espanso/start-espanso.sh
================================================
#!/bin/bash
# Dependency: This script requires `espanso` cli installed: https://espanso.org/install/
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Start Espanso
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/espanso.png
# @raycast.packageName Espanso
# Documentation:
# @raycast.author es183923
# @raycast.authorURL https://github.com/es183923
if ! command -v espanso &> /dev/null; then
echo "espanso is required (https://espanso.org/install).";
exit 1;
fi
espanso start
================================================
FILE: commands/apps/espanso/stop-espanso.sh
================================================
#!/bin/bash
# Dependency: This script requires `espanso` cli installed: https://espanso.org/install/
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Stop Espanso
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/espanso.png
# @raycast.packageName Espanso
# Documentation:
# @raycast.author es183923
# @raycast.authorURL https://github.com/es183923
if ! command -v espanso &> /dev/null; then
echo "espanso is required (https://espanso.org/install).";
exit 1;
fi
espanso stop
================================================
FILE: commands/apps/eudic/look-up-in-eudic.applescript
================================================
#!/usr/bin/osascript
# Dependency: Eudic required
# Install via Mac App Store: https://apps.apple.com/app/id402380914
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Look up Word
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ./images/eudic.png
# @raycast.argument1 { "type": "text", "placeholder": "word" }
# @raycast.packageName Eudic
# Documentation:
# @raycast.description look up in eudic
# @raycast.author jingyi
# @raycast.authorURL https://jingyi.blog
on run argv
# FIXME known issue of Eudic. Force open it
do shell script "open -b com.eusoft.eudic"
do shell script "open -b com.eusoft.eudic"
tell application id "com.eusoft.eudic"
activate
show dic with word (item 1 of argv)
end tell
end run
================================================
FILE: commands/apps/evernote/create-note-paste-clipboard.applescript
================================================
#!/usr/bin/osascript
# Assumption: Evernote running (launching and waiting not great UX)
#
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Create Evernote Paste Clipboard
# @raycast.mode silent
#
# Optional parameters:
# @raycast.icon ./images/evernote.png
# @raycast.packageName Evernote
#
# Documentation:
# @raycast.description Creates a new Evernote, pastes in the contents of the clipboard, and positions the cursor in the title area.
# @raycast.author Aaron Miller
# @raycast.authorURL https://github.com/aaronhmiller
tell application "System Events"
tell process "Evernote"
set frontmost to true
click menu item "New Note" of menu "File" of menu bar 1
delay 2 --needed b/c Electron apps slow
click menu item "Paste" of menu "Edit" of menu bar 1
delay 1
tell application "System Events" to key code 48 using shift down -- shift-tab (move cursor to Title area)
end tell
end tell
do shell script "echo New Evernote created"
================================================
FILE: commands/apps/evernote/create-note.applescript
================================================
#!/usr/bin/osascript
# Assumption: Evernote running (launching and waiting not great UX)
#
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Create Evernote
# @raycast.mode silent
#
# Optional parameters:
# @raycast.icon ./images/evernote.png
# @raycast.packageName Evernote
#
# Documentation:
# @raycast.description Creates a new Evernote.
# @raycast.author Aaron Miller
# @raycast.authorURL https://github.com/aaronhmiller
tell application "System Events"
tell process "Evernote"
set frontmost to true
click menu item "New Note" of menu "File" of menu bar 1
end tell
end tell
do shell script "echo New Evernote created"
================================================
FILE: commands/apps/expressvpn/expressvpn-connect.applescript
================================================
#!/usr/bin/osascript
# You need ExpressVPN for this script: https://www.expressvpn.com/latest#mac
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Connect
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/expressvpn_logo.svg
# @raycast.packageName ExpressVPN
# Documentation:
# @raycast.author Amir Hossein SamadiPour
# @raycast.authorURL https://github.com/SamadiPour
tell application "ExpressVPN"
if state = "connected" then
do shell script "echo Already Connected."
else if state = "connecting" then
do shell script "echo Please wait. Connecting..."
else if state = "ready" then
connect
end if
end tell
================================================
FILE: commands/apps/expressvpn/expressvpn-disconnect.applescript
================================================
#!/usr/bin/osascript
# You need ExpressVPN for this script: https://www.expressvpn.com/latest#mac
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Disconnect
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/expressvpn_logo.svg
# @raycast.packageName ExpressVPN
# Documentation:
# @raycast.author Amir Hossein SamadiPour
# @raycast.authorURL https://github.com/SamadiPour
tell application "ExpressVPN"
if state = "connected" or state = "connecting" then
disconnect
else if state = "ready" then
do shell script "echo Already Disconnected..."
end if
end tell
================================================
FILE: commands/apps/expressvpn/expressvpn-reconnect.applescript
================================================
#!/usr/bin/osascript
# You need ExpressVPN for this script: https://www.expressvpn.com/latest#mac
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Reconnect
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/expressvpn_logo.svg
# @raycast.packageName ExpressVPN
# Documentation:
# @raycast.author Amir Hossein SamadiPour
# @raycast.authorURL https://github.com/SamadiPour
tell application "ExpressVPN"
if state = "connected" and not (state = "connecting") then
disconnect
delay 0.5
connect
else if state = "ready" then
connect
end if
end tell
do shell script "echo Reconnecting..."
================================================
FILE: commands/apps/fantastical/create-event.applescript
================================================
#!/usr/bin/osascript
# Install Fantastical via the Mac App Store: https://apps.apple.com/us/app/fantastical-calendar-tasks/id975937182
# @raycast.title Create Event
# @raycast.author Robert Cooper
# @raycast.authorURL https://github.com/robertcoopercode
# @raycast.description Create an event in Fantastical
# @raycast.schemaVersion 1
# @raycast.icon ./images/fantastical.png
# @raycast.mode silent
# @raycast.packageName Fantastical
# @raycast.argument1 { "type": "text", "placeholder": "query" }
on run argv
tell application "Fantastical"
parse sentence of (item 1 of argv)
end tell
end run
================================================
FILE: commands/apps/fantastical/create-todo-in-fantastical.applescript
================================================
#!/usr/bin/osascript
# Install Fantastical via the Mac App Store: https://apps.apple.com/us/app/fantastical-calendar-tasks/id975937182
# @raycast.title Create Task
# @raycast.author Vardan Sawhney
# @raycast.authorURL https://github.com/commai
# @raycast.description Speed up setting reminders for Fantastical by invoking this script.
# @raycast.schemaVersion 1
# @raycast.icon ./images/fantastical.png
# @raycast.mode silent
# @raycast.packageName Fantastical
# @raycast.argument1 { "type": "text", "placeholder": "Task to complete" }
on run argv
tell application "Fantastical"
parse sentence "todo today " & (item 1 of argv)
end tell
end run
================================================
FILE: commands/apps/ferdi/ferdi-open-service-by-index.applescript
================================================
#!/usr/bin/osascript
# Dependency: This script requires Ferdi to be installed: https://getferdi.com/
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open Service by Index
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/ferdi.png
# @raycast.packageName Ferdi
# @raycast.argument1 { "type": "text", "placeholder": "Index", "optional": true }
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
on run argv
### Configuration ###
# Delay time before triggering the keystroke (used only when Ferdi needs to be initialized)
set keystrokeDelay to 5
### End of configuration ###
if item 1 of argv = "" then
set serviceIndex to 1
else
set serviceIndex to item 1 of argv
end if
if application "Ferdi" is running then
do shell script "open -a Ferdi"
else
do shell script "open -a Ferdi"
delay keystrokeDelay
end if
tell application "System Events" to keystroke serviceIndex using command down
end run
================================================
FILE: commands/apps/ferdi/ferdi-open-service-by-name.applescript
================================================
#!/usr/bin/osascript
# Dependency: This script requires Ferdi to be installed: https://getferdi.com/
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open Service by Name
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/ferdi.png
# @raycast.packageName Ferdi
# @raycast.argument1 { "type": "text", "placeholder": "Name", "optional": true }
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
on run argv
### Configuration ###
# Delay time before triggering the click (used only when Ferdi needs to be initialized)
set clickDelay to 5
### End of configuration ###
if application "Ferdi" is running then
do shell script "open -a Ferdi"
else
do shell script "open -a Ferdi"
delay clickDelay
end if
tell application "System Events" to tell process "Ferdi"
if item 1 of argv = "" then
click menu item 7 of menu 1 of menu bar item "Services" of menu bar 1
else
set serviceNames to name of menu items of menu 1 of menu bar item "Services" of menu bar 1
set serviceNames to items 7 through -1 of serviceNames
repeat with serviceName in serviceNames
if serviceName contains item 1 of argv then
click menu item serviceName of menu 1 of menu bar item "Services" of menu bar 1
exit repeat
end if
end repeat
end if
end tell
end run
================================================
FILE: commands/apps/find-my/README.md
================================================
# 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
```
================================================
FILE: commands/apps/find-my/fmp.js
================================================
#!/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();
})();
================================================
FILE: commands/apps/find-my/package.json
================================================
{
"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"
}
}
================================================
FILE: commands/apps/focus/focus-preferences.sh
================================================
#!/bin/bash
# Note: Focus required
# Install from: https://heyfocus.com
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open Focus Preferences
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/focus-logo.png
# @raycast.packageName Focus
# Documentation:
# @raycast.author Ernest Ojeh
# @raycast.authorURL https://github.com/namzo
# @raycast.description Open focus preferences.
open "focus://preferences"
================================================
FILE: commands/apps/focus/focus-start-break-5.sh
================================================
#!/bin/bash
# Note: Focus required
# Install from: https://heyfocus.com
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Take 5 Minutes Break
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/focus-logo.png
# @raycast.packageName Focus
# Documentation:
# @raycast.author Ernest Ojeh
# @raycast.authorURL https://github.com/namzo
# @raycast.description Take 5 minutes break.
open "focus://break?minutes=5"
================================================
FILE: commands/apps/focus/focus-start-custom-break.sh
================================================
#!/bin/bash
# Note: Focus required
# Install from: https://heyfocus.com
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Start Custom Break
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/focus-logo.png
# @raycast.packageName Focus
# Documentation:
# @raycast.author Ernest Ojeh
# @raycast.authorURL https://github.com/namzo
# @raycast.description Start a custom break. If you don't enter any values, it uses the last break duration.
# @raycast.argument1 { "type": "text", "placeholder": "Minutes", "optional": true, "percentEncoded": true }
open "focus://break?minutes=${1}"
================================================
FILE: commands/apps/focus/focus-start-custom-session.sh
================================================
#!/bin/bash
# Note: Focus required
# Install from: https://heyfocus.com
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Start Custom Focus Session
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/focus-logo.png
# @raycast.packageName Focus
# Documentation:
# @raycast.author Ernest Ojeh
# @raycast.authorURL https://github.com/namzo
# @raycast.description Start a custom focus session. If you don't enter any values, it starts an untimed focus session.
# @raycast.argument1 { "type": "text", "placeholder": "Hours", "optional": true, "percentEncoded": true }
# @raycast.argument2 { "type": "text", "placeholder": "Minutes", "optional": true, "percentEncoded": true }
open "focus://focus?hours=${1}&minutes=${2}"
================================================
FILE: commands/apps/focus/focus-start-session-25.sh
================================================
#!/bin/bash
# Note: Focus required
# Install from: https://heyfocus.com
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Start 25 minutes Focus Session
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/focus-logo.png
# @raycast.packageName Focus
# Documentation:
# @raycast.author Ernest Ojeh
# @raycast.authorURL https://github.com/namzo
# @raycast.description Start a 25 minutes focus session.
open "focus://focus?minutes=25"
================================================
FILE: commands/apps/focus/focus-start-session.sh
================================================
#!/bin/bash
# Note: Focus required
# Install from: https://heyfocus.com
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Start Focus Session (Focus)
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/focus-logo.png
# @raycast.packageName Focus
# Documentation:
# @raycast.author Ernest Ojeh
# @raycast.authorURL https://github.com/namzo
# @raycast.description Start an untimed focus session.
open "focus://focus"
================================================
FILE: commands/apps/focus/focus-stop-break.sh
================================================
#!/bin/bash
# Note: Focus required
# Install from: https://heyfocus.com
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Stop Break (Unbreak)
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/focus-logo.png
# @raycast.packageName Focus
# Documentation:
# @raycast.author Ernest Ojeh
# @raycast.authorURL https://github.com/namzo
# @raycast.description Stop break and continues the current focus session.
open "focus://unbreak"
================================================
FILE: commands/apps/focus/focus-stop-session.sh
================================================
#!/bin/bash
# Note: Focus required
# Install from: https://heyfocus.com
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Stop Focus Session (Unfocus)
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/focus-logo.png
# @raycast.packageName Focus
# Documentation:
# @raycast.author Ernest Ojeh
# @raycast.authorURL https://github.com/namzo
# @raycast.description Stop the current focus session.
open "focus://unfocus"
================================================
FILE: commands/apps/focus/focus-toggle-focus.sh
================================================
#!/bin/bash
# Note: Focus required
# Install from: https://heyfocus.com
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Toggle Focus Session
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/focus-logo.png
# @raycast.packageName Focus
# Documentation:
# @raycast.author Ernest Ojeh
# @raycast.authorURL https://github.com/namzo
# @raycast.description Toggle between start session (untimed) and stop session.
open "focus://toggle"
================================================
FILE: commands/apps/goodlinks/goodlinks-last-unread-link.sh
================================================
#!/bin/bash
# Install GoodLinks via Mac App Store: https://apps.apple.com/app/id1474335294
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open Last Unread Link
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/goodlinks.png
# @raycast.packageName GoodLinks
# Documentation:
# @raycast.description Open the last unread link in the GoodLinks app
# @raycast.author Filip Chabik
# @raycast.authorURL https://github.com/hadret
open "goodlinks://x-callback-url/last"
================================================
FILE: commands/apps/goodlinks/goodlinks-open-link.sh
================================================
#!/bin/bash
# Install GoodLinks via Mac App Store: https://apps.apple.com/app/id1474335294
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open Link
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/goodlinks.png
# @raycast.packageName GoodLinks
# Documentation:
# @raycast.description Open a link in the GoodLinks app
# @raycast.author Filip Chabik
# @raycast.authorURL https://github.com/hadret
# @raycast.argument1 { "type": "text", "placeholder": "URL", "percentEncoded": true}
open "goodlinks://x-callback-url/open?url=${1}"
================================================
FILE: commands/apps/goodlinks/goodlinks-random-unread-link.sh
================================================
#!/bin/bash
# Install GoodLinks via Mac App Store: https://apps.apple.com/app/id1474335294
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open Random Unread Link
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/goodlinks.png
# @raycast.packageName GoodLinks
# Documentation:
# @raycast.description Open a random unread link in the GoodLinks app
# @raycast.author Filip Chabik
# @raycast.authorURL https://github.com/hadret
open "goodlinks://x-callback-url/random"
================================================
FILE: commands/apps/goodlinks/goodlinks-read-list.sh
================================================
#!/bin/bash
# Install GoodLinks via Mac App Store: https://apps.apple.com/app/id1474335294
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Show Read List
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/goodlinks.png
# @raycast.packageName GoodLinks
# Documentation:
# @raycast.description Show Read list in the GoodLinks app
# @raycast.author Filip Chabik
# @raycast.authorURL https://github.com/hadret
open "goodlinks://x-callback-url/read"
================================================
FILE: commands/apps/goodlinks/goodlinks-save-link.sh
================================================
#!/bin/bash
# Install GoodLinks via Mac App Store: https://apps.apple.com/app/id1474335294
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Save Link
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/goodlinks.png
# @raycast.packageName GoodLinks
# Documentation:
# @raycast.description Saves a new link to GoodLinks
# @raycast.author Filip Chabik
# @raycast.authorURL https://github.com/hadret
# @raycast.argument1 { "type": "text", "placeholder": "URL", "percentEncoded": true}
# @raycast.argument2 { "type": "text", "placeholder": "Tags", "optional": true, "percentEncoded": true}
# @raycast.argument3 { "type": "text", "placeholder": "Title", "optional": true, "percentEncoded": true}
open "goodlinks://x-callback-url/save?url=${1}&tags=${2}&title=${3}&quick=1"
echo "Link saved!"
================================================
FILE: commands/apps/goodlinks/goodlinks-starred-list.sh
================================================
#!/bin/bash
# Install GoodLinks via Mac App Store: https://apps.apple.com/app/id1474335294
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Show Starred List
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/goodlinks.png
# @raycast.packageName GoodLinks
# Documentation:
# @raycast.description Show Starred list in the GoodLinks app
# @raycast.author Filip Chabik
# @raycast.authorURL https://github.com/hadret
open "goodlinks://x-callback-url/starred"
================================================
FILE: commands/apps/goodlinks/goodlinks-tagged-links.sh
================================================
#!/bin/bash
# Install GoodLinks via Mac App Store: https://apps.apple.com/app/id1474335294
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Show Tag
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/goodlinks.png
# @raycast.packageName GoodLinks
# Documentation:
# @raycast.description Show links tagged with the specified tag in the GoodLinks app
# @raycast.author Filip Chabik
# @raycast.authorURL https://github.com/hadret
# @raycast.argument1 { "type": "text", "placeholder": "name", "percentEncoded": true}
open "goodlinks://x-callback-url/tag?name=${1}"
================================================
FILE: commands/apps/goodlinks/goodlinks-unread-list.sh
================================================
#!/bin/bash
# Install GoodLinks via Mac App Store: https://apps.apple.com/app/id1474335294
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Show Unread List
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/goodlinks.png
# @raycast.packageName GoodLinks
# Documentation:
# @raycast.description Show Unread list in the GoodLinks app
# @raycast.author Filip Chabik
# @raycast.authorURL https://github.com/hadret
open "goodlinks://x-callback-url/unread"
================================================
FILE: commands/apps/goodlinks/goodlinks-untagged-list.sh
================================================
#!/bin/bash
# Install GoodLinks via Mac App Store: https://apps.apple.com/app/id1474335294
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Show Untagged List
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/goodlinks.png
# @raycast.packageName GoodLinks
# Documentation:
# @raycast.description Show Untagged list in the GoodLinks app
# @raycast.author Filip Chabik
# @raycast.authorURL https://github.com/hadret
open "goodlinks://x-callback-url/untagged"
================================================
FILE: commands/apps/hazeover/hazeover-set-intensity.applescript
================================================
#!/usr/bin/osascript
# Install HazeOver via Mac App Store: https://apps.apple.com/gb/app/hazeover-distraction-dimmer/id430798174
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Set Intensity
# @raycast.mode silent
# @raycast.packageName HazeOver
# @raycast.argument1 { "type": "text", "placeholder": "Intensity (0-100)" }
# Optional parameters:
# @raycast.icon images/hazeover.png
# Documentation:
# @raycast.author Thomas Paul Mann
# @raycast.authorURL https://github.com/thomaspaulmann
# @raycast.description Set dimming intensity of background windows.
on run argv
tell application "HazeOver"
set newIntensity to item 1 of argv as integer
if newIntensity < 0 then
newIntensity = 0
else if newIntensity > 100 then
newIntensity = 100
end if
set intensity to newIntensity
log "Set intensity to " & newIntensity & "%"
end tell
end run
================================================
FILE: commands/apps/hazeover/hazeover-toggle-dimming.applescript
================================================
#!/usr/bin/osascript
# Install HazeOver via Mac App Store: https://apps.apple.com/gb/app/hazeover-distraction-dimmer/id430798174
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Toggle Dimming
# @raycast.mode silent
# @raycast.packageName HazeOver
# Optional parameters:
# @raycast.icon images/hazeover.png
# Documentation:
# @raycast.author Thomas Paul Mann
# @raycast.authorURL https://github.com/thomaspaulmann
# @raycast.description Toggle dimming of all background windows.
tell application "HazeOver"
set enabled to not enabled
if enabled then
log "Enabled dimming"
else
log "Disabled dimming"
end if
end tell
================================================
FILE: commands/apps/hyper/hyper-run-shell-command.applescript
================================================
#!/usr/bin/osascript
# Note: Hyper required
# Install via Hyper.is: https://hyper.is/
# Dependency: This script requires `hyperalfred` (https://github.com/gjuchault/hyperalfred)
# Install via Hyper: `hyper i hyperalfred`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Run Shell Command
# @raycast.mode silent
# @raycast.packageName Hyper
# Optional parameters:
# @raycast.icon images/hyper.png
# @raycast.currentDirectoryPath ~
# @raycast.argument1 { "type": "text", "placeholder": "Command" }
# Documentation:
# @raycast.description Run a terminal using Hyper
# @raycast.author Eliot Hertenstein
# @raycast.authorURL https://github.com/eIiot
on run argv
write_to_file( (item 1 of argv) , "./.hyper_plugins/hyperalfred.txt", false)
try
tell application "Hyper" to activate
on error e
log "Hyper is required (https://hyper.is)"
-- return false
end try
end run
on write_to_file(this_data, target_file, append_data)
try
tell application "System Events" to exists file target_file
if not the result then do shell script "> " & quoted form of target_file
set the open_target_file to open for access target_file with write permission
if append_data is false then set eof of the open_target_file to 0
write this_data to the open_target_file starting at eof
close access the open_target_file
return true
on error e
try
log "hyperalfred is required (https://github.com/gjuchault/hyperalfred)."
close access target_file
end try
return false
end try
end write_to_file
================================================
FILE: commands/apps/iconsur/iconsur.sh
================================================
#!/bin/bash
# Dependency: requires iconsur (https://github.com/rikumi/iconsur)
# Install via Homebrew: `brew install iconsur`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Change Application Icon
# @raycast.mode compact
# Optional parameters:
# @raycast.icon 🅱️
# @raycast.argument1 { "type": "text", "placeholder": "Application" }
# @raycast.argument2 { "type": "text", "placeholder": "Root Password", "secure": true, "optional": true }
# @raycast.argument3 { "type": "text", "placeholder": "Use Local Icon (y)" , "optional": true }
# @raycast.packageName iconsur
# Documentation:
# @raycast.description Change App icons to match Big Sur
# @raycast.author StevenRCE0
# @raycast.authorURL https://github.com/StevenRCE0
# Test iconsur
t=$(which iconsur)
if [ -z "$t" ]; then
echo "Iconsur not found, install using brew install iconsur"
exit 1
fi
# Workaround for the error message
exec 2>/dev/null
# Test file
appPath=""
if [ -d "/Applications/$1.app" ]; then
appPath="/Applications/$1.app"
elif [ -d "$HOME/Applications/$1.app" ]; then
appPath="$HOME/Applications/$1.app"
else
echo "Application not found, make sure it's in Applications folder"
exit 2
fi
loc=""; omit=0
if [ -z $3 ] && [ $2 = "y" -o $2 = "Y" ]; then
loc="-l"
omit=1
fi
if [ $omit -eq 0 ] && [ $3 = "y" -o $3 = "Y" ]; then
loc="-l"
fi
if [ $2 ] && [ $omit -eq 0 ]; then
echo $2|sudo -S iconsur set "$appPath" $loc
if [ ${PIPESTATUS[1]} -eq 1 ]; then
echo "Password incorrect"
exit 2
fi
else
iconsur set "$appPath" $loc 1>/dev/null
if [ ${PIPESTATUS[0]} -eq 1 ]; then
echo "It didn't work, try again with password"
exit 2
fi
fi
echo "Icon changed successfully"
================================================
FILE: commands/apps/iterm/iterm-open-profile-in-new-window.applescript
================================================
#!/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
================================================
FILE: commands/apps/iterm/iterm-run-shell-command.applescript
================================================
#!/usr/bin/osascript
# Dependency: requires iTerm (https://iterm2.com)
# Install via Homebrew: `brew install --cask iterm2`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Run Shell Command
# @raycast.mode silent
# @raycast.packageName iTerm
# Optional parameters:
# @raycast.icon images/iterm.png
# @raycast.argument1 { "type": "text", "placeholder": "shell command" }
# Documentation
# @raycast.author Andrei Borisov
# @raycast.authorURL https://github.com/andreiborisov
-- Set this property to true to open in a new window instead of a new tab
property open_in_new_window : false
-- Handlers
on new_window()
tell application "iTerm" to create window with default profile
end new_window
on new_tab()
tell application "iTerm" to tell the first window to create tab with default profile
end new_tab
on call_forward()
tell application "iTerm" to activate
end call_forward
on is_running()
application "iTerm" is running
end is_running
on is_processing()
tell application "iTerm" to tell the first window to tell current session to get is processing
end is_processing
on has_windows()
if not is_running() then return false
if windows of application "iTerm" is {} then return false
true
end has_windows
on send_text(custom_text)
tell application "iTerm" to tell the first window to tell current session to write text custom_text
end send_text
-- Main
on run argv
if has_windows() then
-- Open the command in the current session unless it has a running command, e.g., ssh or top
if is_processing() then
if open_in_new_window then
new_window()
else
new_tab()
end if
end if
else
-- If iTerm is not running and we tell it to create a new window, we get two
-- One from opening the application, and the other from the command
if is_running() then
new_window()
else
call_forward()
end if
end if
-- Make sure a window exists before we continue, or the write may fail
repeat until has_windows()
delay 0.01
end repeat
send_text(argv)
call_forward()
end run
================================================
FILE: commands/apps/lungo/lungo-activate.sh
================================================
#!/bin/bash
# Note: Lungo v2.0.4 required
# Install via Mac App Store: https://apps.apple.com/app/id1263070803
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Activate
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ./images/lungo.png
# @raycast.packageName Lungo
# Documentation:
# @raycast.author Lungo
# @raycast.authorURL https://sindresorhus.com/lungo
# @raycast.description Deactivate Lungo.
# @raycast.argument1 { "type": "text", "placeholder": "hours", "optional": true, "percentEncoded": true }
# @raycast.argument2 { "type": "text", "placeholder": "minutes", "optional": true, "percentEncoded": true }
open --background "lungo:activate?hours=$1&minutes=$2"
================================================
FILE: commands/apps/lungo/lungo-deactivate.sh
================================================
#!/bin/bash
# Note: Lungo v2.0.4 required
# Install via Mac App Store: https://apps.apple.com/app/id1263070803
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Deactivate
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ./images/lungo.png
# @raycast.packageName Lungo
# Documentation:
# @raycast.author Lungo
# @raycast.authorURL https://sindresorhus.com/lungo
# @raycast.description Deactivate Lungo.
open --background lungo:deactivate
================================================
FILE: commands/apps/lungo/lungo-toggle.sh
================================================
#!/bin/bash
# Note: Lungo v2.0.4 required
# Install via Mac App Store: https://apps.apple.com/app/id1263070803
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Toggle
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ./images/lungo.png
# @raycast.packageName Lungo
# Documentation:
# @raycast.author Lungo
# @raycast.authorURL https://sindresorhus.com/lungo
# @raycast.description Toggle Lungo.
# @raycast.argument1 { "type": "text", "placeholder": "hours", "optional": true, "percentEncoded": true }
# @raycast.argument2 { "type": "text", "placeholder": "minutes", "optional": true, "percentEncoded": true }
open --background "lungo:toggle?hours=$1&minutes=$2"
================================================
FILE: commands/apps/mail/copy-captcha-from-mail.py
================================================
#!/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)
================================================
FILE: commands/apps/mail/copy-foreground-mail-deeplink.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Copy Foreground Mail Deeplink
# @raycast.mode compact
# Optional parameters:
# @raycast.icon 📧
# @raycast.packageName Mail
# Documentation:
# @raycast.description Copies the foreground Mail deeplink
# @raycast.author Jesse Claven
# @raycast.authorURL https://github.com/jesse-c
tell application "System Events"
set frontmostApp to name of application processes whose frontmost is true
end tell
# https://apple.stackexchange.com/questions/122630/applescript-comparing-variable-to-string-is-failing/122631#122631
if frontmostApp as string is equal to "Mail" then
# https://daringfireball.net/2007/12/message_urls_leopard_mail
tell application "Mail"
set _sel to get selection
set _links to {}
repeat with _msg in _sel
set _messageURL to "message://%3c" & _msg's message id & "%3e"
set end of _links to _messageURL
end repeat
set AppleScript's text item delimiters to return
set the clipboard to (_links as string)
log "Copied email deeplink"
end tell
else
log "Foreground app was " & frontmostApp & ", not Mail"
end if
================================================
FILE: commands/apps/medo/add-task.sh
================================================
#!/bin/bash
# Note: Medo v1.0 required
# Install via Github Repo: https://github.com/Aayush9029/Medo
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Add Task
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ./images/medo.png
# @raycast.argument1 { "type": "text", "placeholder": "Title" }
# @raycast.argument2 { "type": "text", "placeholder": "Priority", "default": "low","optional": true}
# @raycast.packageName Medo
# Documentation:
# @raycast.description Add a new task
# @raycast.author Aayush
# @raycast.authorURL https://github.com/Aayush9029
open "medo://add-task?title=$1&p=$2"
================================================
FILE: commands/apps/medo/medo-float-large.sh
================================================
#!/bin/bash
# Note: Medo v1.0 required
# Install via Github Repo: https://github.com/Aayush9029/Medo
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Medo Float Large
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ./images/medo.png
# @raycast.packageName Medo
# Documentation:
# @raycast.description Add a new task with priority
# @raycast.author Aayush
# @raycast.authorURL https://github.com/Aayush9029
open "medo://show-large"
================================================
FILE: commands/apps/medo/medo-float-small.sh
================================================
#!/bin/bash
# Note: Medo v1.0 required
# Install via Github Repo: https://github.com/Aayush9029/Medo
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Medo Float Small
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ./images/medo.png
# @raycast.packageName Medo
# Documentation:
# @raycast.description Add a new task with priority
# @raycast.author Aayush
# @raycast.authorURL https://github.com/Aayush9029
open "medo://show-small"
================================================
FILE: commands/apps/medo/medo-float.sh
================================================
#!/bin/bash
# Note: Medo v1.0 required
# Install via Github Repo: https://github.com/Aayush9029/Medo
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Medo Float
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ./images/medo.png
# @raycast.packageName Medo
# Documentation:
# @raycast.description Add a new task with priority
# @raycast.author Aayush
# @raycast.authorURL https://github.com/Aayush9029
open "medo://show-medium"
================================================
FILE: commands/apps/meetingbar/meetingbar-create-meeting.applescript
================================================
#!/usr/bin/osascript
# Dependencies:
# MeetingBar: https://github.com/leits/MeetingBar
# Recommended installation:
# brew install --cask meetingbar
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Create Meeting
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/meetingbar.png
# @raycast.packageName MeetingBar
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Create a new meeting.
on run
try
runMeetingBar()
createMeeting()
return
on error errorMessage
closeMenu()
return errorMessage
end try
end run
### Functions ###
on createMeeting()
openMenu()
tell application "System Events" to tell application process "MeetingBar"
tell menu 1 of menu bar item 1 of menu bar 2
click menu item "Create meeting"
end tell
end tell
end createMeeting
on MeetingBarIsRunning()
return application "MeetingBar" is running
end MeetingBarIsRunning
on runMeetingBar()
if not MeetingBarIsRunning() then do shell script "open -a 'MeetingBar'"
end runMeetingBar
on menuIsOpen()
tell application "System Events" to tell application process "MeetingBar"
return menu 1 of menu bar item 1 of menu bar 2 exists
end tell
end menuIsOpen
on openMenu()
set killDelay to 0
repeat
tell application "System Events" to tell application process "MeetingBar"
if my menuIsOpen() then return
ignoring application responses
click menu bar item 1 of menu bar 2
end ignoring
end tell
set killDelay to killDelay + 0.1
delay killDelay
do shell script "killall System\\ Events"
end repeat
end openMenu
on closeMenu()
if menuIsOpen() then tell application "System Events" to key code 53
end closeMenu
================================================
FILE: commands/apps/meetingbar/meetingbar-join-meeting.applescript
================================================
#!/usr/bin/osascript
# Dependencies:
# MeetingBar: https://github.com/leits/MeetingBar
# Recommended installation:
# brew install --cask meetingbar
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Join Meeting
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/meetingbar.png
# @raycast.packageName MeetingBar
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Join the ongoing or upcoming meeting.
on run
try
runMeetingBar()
joinMeeting()
return
on error errorMessage
closeMenu()
return errorMessage
end try
end run
### Functions ###
on joinMeeting()
openMenu()
tell application "System Events" to tell application process "MeetingBar"
tell menu 1 of menu bar item 1 of menu bar 2
if menu item "Join current event meeting" exists then
click menu item "Join current event meeting"
else if menu item "Join next event meeting" exists then
click menu item "Join next event meeting"
else
error "No meetings found"
end if
end tell
end tell
end joinMeeting
on MeetingBarIsRunning()
return application "MeetingBar" is running
end MeetingBarIsRunning
on runMeetingBar()
if not MeetingBarIsRunning() then do shell script "open -a 'MeetingBar'"
end runMeetingBar
on menuIsOpen()
tell application "System Events" to tell application process "MeetingBar"
return menu 1 of menu bar item 1 of menu bar 2 exists
end tell
end menuIsOpen
on openMenu()
set killDelay to 0
repeat
tell application "System Events" to tell application process "MeetingBar"
if my menuIsOpen() then return
ignoring application responses
click menu bar item 1 of menu bar 2
end ignoring
end tell
set killDelay to killDelay + 0.1
delay killDelay
do shell script "killall System\\ Events"
end repeat
end openMenu
on closeMenu()
if menuIsOpen() then tell application "System Events" to key code 53
end closeMenu
================================================
FILE: commands/apps/menubarx/close-last-menubarx-tab.sh
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Close Last Tab
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/menubarx_logo.png
# @raycast.packageName MenubarX
# Documentation:
# @raycast.description Close last viewed tab in MenubarX
# @raycast.author Clu Soh
# @raycast.authorURL https://twitter.com/designedbyclu
tell application "MenubarX" to activate
delay 0.1
tell application "System Events" to tell process "MenubarX"
key code 13 using {shift down, command down}
end tell
do shell script "echo Closed tab"
================================================
FILE: commands/apps/menubarx/open-in-menubarx.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open in MenubarX
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/menubarx_logo.png
# @raycast.packageName MenubarX
# Documentation:
# @raycast.description Open Pasteboard link in MenubarX
# @raycast.author Clu Soh
# @raycast.authorURL https://twitter.com/designedbyclu
regex='(https?|ftp|file)://[-A-Za-z0-9\+&@#/%?=~_|!:,.;]*[-A-Za-z0-9\+&@#/%=~_|]'
pasteboard=$(pbpaste)
if [[ $pasteboard =~ $regex ]]
then
open "menubarx://open/?xurl=$pasteboard"
echo "Opened in MenubarX"
else
echo "Seem like is not a URL you copied"
fi
================================================
FILE: commands/apps/menubarx/open-tab-in-menubar.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open Tabs
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/menubarx_logo.png
# @raycast.packageName MenubarX
# @raycast.argument1 { "type": "text", "placeholder": "Tabs 1~9" }
# Documentation:
# @raycast.description Open X Tab in your menubar
# @raycast.author Clu Soh
# @raycast.authorURL https://twitter.com/designedbyclu
on run argv
set tabNum to item 1 of argv
if tabNum is equal to "1" then
tell application "MenubarX" to activate
delay 0.1
tell application "System Events" to tell process "MenubarX"
keystroke "1" using command down
end tell
else if tabNum is equal to "2" then
tell application "MenubarX" to activate
delay 0.1
tell application "System Events" to tell process "MenubarX"
keystroke "2" using command down
end tell
else if tabNum is equal to "3" then
tell application "MenubarX" to activate
delay 0.1
tell application "System Events" to tell process "MenubarX"
keystroke "3" using command down
end tell
else if tabNum is equal to "4" then
tell application "MenubarX" to activate
delay 0.1
tell application "System Events" to tell process "MenubarX"
keystroke "4" using command down
end tell
else if tabNum is equal to "5" then
tell application "MenubarX" to activate
delay 0.1
tell application "System Events" to tell process "MenubarX"
keystroke "5" using command down
end tell
else if tabNum is equal to "6" then
tell application "MenubarX" to activate
delay 0.1
tell application "System Events" to tell process "MenubarX"
keystroke "6" using command down
end tell
else if tabNum is equal to "7" then
tell application "MenubarX" to activate
delay 0.1
tell application "System Events" to tell process "MenubarX"
keystroke "7" using command down
end tell
else if tabNum is equal to "8" then
tell application "MenubarX" to activate
delay 0.1
tell application "System Events" to tell process "MenubarX"
keystroke "8" using command down
end tell
else if tabNum is equal to "9" then
tell application "MenubarX" to activate
delay 0.1
tell application "System Events" to tell process "MenubarX"
keystroke "9" using command down
end tell
end if
end run
================================================
FILE: commands/apps/mullvad/README.md
================================================
# Mullvad Package
A package of script commands to manage [Mullvad VPN](https://mullvad.net/) tunnel connections, wrapping the [Mullvad CLI](https://mullvad.net/en/help/cli-command-wg/).
## Dependencies
All commands in this package require the [Mullvad CLI](https://mullvad.net/en/help/cli-command-wg/). It is installed automatically when installing [the official desktop client](https://mullvad.net/download/). The _Search Countries, Cities, and Hostnames_ command also requires the [`fzf` utility](https://github.com/junegunn/fzf/). Install it via homebrew:
```sh
$ brew install fzf
```
Additional installation options are available in the tools' respective documentation.
## Command Usage
Because usage of the CLI is dependent on the the official desktop client app, all script commands are executed in the context of the user account currently logged in there.
### Connect
This command executes in `silent` mode, and connects to a Mullvad VPN tunnel using the most recently set configuration settings.
### Connect to Location
This command executes in `silent` mode, and connects to a Mullvad VPN tunnel satisfying the values of the passed `Country`, `City`, and `Hostname` arguments. Each argument expects their values in a specific format, but only `Country` is required. To retrieve the correct value(s) for your desired connection, use the [_Search Countries, Cities, and Hostnames_ command](#search-countries-cities-and-hostnames).
### Disconnect
This command executes in `silent` mode, and disconnects from the currently connected Mullvad VPN tunnel.
### Reconnect
This command executes in `silent` mode, and disconnects, then immediately connects again to the currently connected Mullvad VPN tunnel.
### Search Countries, Cities, and Hostnames
This command executes in `fullOutput` mode, searches the available countries, cities, and hostnames to which Mullvad VPN tunnel connections are possible, and prints all search results sorted by relevance in the following format:
```
COUNTRIES:
USA (us)
Austria (at)
Australia (au)
United Arab Emirates (ae)
CITIES:
Salt Lake City, UT (slc)
Brussels (bru)
Dusseldorf (dus)
Secaucus, NJ (uyk)
Sao Paulo (sao)
Budapest (bud)
Bucharest (buh)
HOSTNAMES:
us-mia-202 (193.27.12.2) - OpenVPN, hosted by M247
us-nyc-201 (89.46.62.15) - OpenVPN, hosted by M247
us-nyc-202 (89.46.62.28) - OpenVPN, hosted by M247
us-nyc-203 (89.46.62.41) - OpenVPN, hosted by M247
us-nyc-204 (89.46.62.54) - OpenVPN, hosted by M247
...
```
> The `Query` used to generate the above list is `us`, with the `Show Hostnames?` argument set to `y`. Results are truncated for brevity, and current as of March 20, 2021.
In the actual Raycast output, the values to be used with the [_Connect to Location_ command](#connect-to-location) are printed in
yellow
. Because of the large number of possible search results, hostnames are omitted by default. They can be displayed by passing `y` as the value of the `Show Hostnames?` argument.
### Status
This dashboard command will show the current connection state of the Mullvad VPN tunnel. It automatically updates every five minutes.
================================================
FILE: commands/apps/mullvad/connect.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Connect
# @raycast.mode silent
#
# Optional parameters:
# @raycast.packageName Mullvad
# @raycast.icon images/mullvad.png
#
# Documentation:
# @raycast.author Phil Salant
# @raycast.authorURL https://github.com/PSalant726
# @raycast.description Connect the Mullvad VPN tunnel using the most recent configuration settings.
#
# Dependencies:
# The Mullvad CLI: https://mullvad.net/en/help/cli-command-wg/
if ! command -v mullvad &> /dev/null; then
echo "The Mullvad CLI is not installed"
exit 1
fi
mullvad connect --wait
success=$?
if [ $success -ne 0 ]; then
echo "Failed to establish a VPN tunnel"
exit 1
fi
status=$(mullvad status)
echo "$status"
================================================
FILE: commands/apps/mullvad/disconnect.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Disconnect
# @raycast.mode silent
#
# Optional parameters:
# @raycast.packageName Mullvad
# @raycast.icon images/mullvad.png
#
# Documentation:
# @raycast.author Phil Salant
# @raycast.authorURL https://github.com/PSalant726
# @raycast.description Disconnect from the Mullvad VPN tunnel.
#
# Dependencies:
# The Mullvad CLI: https://mullvad.net/en/help/cli-command-wg/
if ! command -v mullvad &> /dev/null; then
echo "The Mullvad CLI is not installed"
exit 1
fi
mullvad disconnect --wait
success=$?
if [ $success -ne 0 ]; then
echo "Failed to disconnect from the VPN tunnel"
exit 1
fi
echo "Disconnected and unsecured"
================================================
FILE: commands/apps/mullvad/location.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Connect to Location
# @raycast.mode silent
#
# Optional parameters:
# @raycast.packageName Mullvad
# @raycast.icon images/mullvad.png
# @raycast.argument1 { "type": "text", "placeholder": "Country (2-letter code)" }
# @raycast.argument2 { "type": "text", "placeholder": "City (3-letter code)", "optional": true }
# @raycast.argument3 { "type": "text", "placeholder": "Hostname", "optional": true }
#
# Documentation:
# @raycast.author Phil Salant
# @raycast.authorURL https://github.com/PSalant726
# @raycast.description Connect the Mullvad VPN tunnel using the specified location.
#
# Dependencies:
# The Mullvad CLI: https://mullvad.net/en/help/cli-command-wg/
if ! command -v mullvad &> /dev/null; then
echo "The Mullvad CLI is not installed"
exit 1
fi
location=$(mullvad relay set location "$@" 2>&1)
location_set=$?
if [ $location_set -ne 0 ]; then
echo "${location//error: /}"
exit 1
fi
mullvad connect --wait
success=$?
if [ $success -ne 0 ]; then
echo "Failed to establish a VPN tunnel"
exit 1
fi
status=$(mullvad status)
echo "$status"
================================================
FILE: commands/apps/mullvad/reconnect.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Reconnect
# @raycast.mode silent
#
# Optional parameters:
# @raycast.packageName Mullvad
# @raycast.icon images/mullvad.png
#
# Documentation:
# @raycast.author Phil Salant
# @raycast.authorURL https://github.com/PSalant726
# @raycast.description Force the client to reconnect to the Mullvad VPN tunnel.
#
# Dependencies:
# The Mullvad CLI: https://mullvad.net/en/help/cli-command-wg/
if ! command -v mullvad &> /dev/null; then
echo "The Mullvad CLI is not installed"
exit 1
fi
mullvad reconnect --wait
success=$?
if [ $success -ne 0 ]; then
echo "Failed to reconnect to the VPN tunnel"
exit 1
fi
status=$(mullvad status --location)
if [[ $status == *"Tunnel status: Disconnected"* ]]; then
echo "No active connection to reconnect!"
exit 0
fi
echo "$status"
================================================
FILE: commands/apps/mullvad/search.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Search Countries, Cities, and Hostnames
# @raycast.mode fullOutput
#
# Optional parameters:
# @raycast.packageName Mullvad
# @raycast.icon images/mullvad.png
# @raycast.argument1 { "type": "text", "placeholder": "Query" }
# @raycast.argument2 { "type": "text", "placeholder": "Show Hostnames? (y/n)", "optional": true }
#
# Documentation:
# @raycast.author Phil Salant
# @raycast.authorURL https://github.com/PSalant726
# @raycast.description Search the list of available entities to which a Mullvad VPN tunnel connection can be made.
#
# Dependencies:
# 1. The Mullvad CLI: https://mullvad.net/en/help/cli-command-wg/
# 2. The `fzf` utility: https://github.com/junegunn/fzf
if ! command -v mullvad &> /dev/null; then
echo "The Mullvad CLI is not installed (https://mullvad.net/en/help/cli-command-wg/)"
exit 1
elif ! command -v fzf &> /dev/null; then
echo "The fzf utility is not installed (https://github.com/junegunn/fzf)"
echo "Install via Homebrew with 'brew install fzf'"
exit 1
fi
BLUE=$'\e[1;34m'
BOLD_YELLOW=$'\e[1;33m'
BOLD_RED=$'\e[1;31m'
BOLD_GREEN=$'\e[1;32m'
END=$'\e[0m'
countries=()
cities=()
hostnames=()
colorize_location_value() {
echo $1 | sed -r 's/\((.{'$2'})\)/\('$BOLD_YELLOW'\1'$END'\)/'
}
print_blue() {
printf "%s%s%s\n" $BLUE $1 $END
}
print_array() {
for i in "$@"; do
echo "$i"
done
}
wireguard_bias() {
echo $1 | sed -r 's/OpenVPN/'$BOLD_RED'OpenVPN'$END'/' | sed -r 's/WireGuard/'$BOLD_GREEN'WireGuard'$END'/'
}
entities=$(mullvad relay list | fzf -i --filter "$1")
if [ ${#entities} -eq 0 ]; then
printf "%sNo results%s found for \"%s\".\n" $BOLD_RED $END $1
exit 0
fi
printf "The values printed in %syellow%s are meant to be used with the \"Connect to Location\" script.\n\n" $BOLD_YELLOW $END
while IFS= read -r entity; do
if [[ "$entity" == "$(printf '\t\t')"* ]]; then
hostname=$(echo "$entity" | sed -r 's/\t//g' | sed -r 's/^(.*) \(/'$BOLD_YELLOW'\1'$END' \(/')
hostnames+=("$(wireguard_bias "$hostname")")
elif [[ "$entity" == "$(printf '\t')"* ]]; then
city=$(echo "$entity" | sed -r 's/\t(.*)@.*/\1/')
cities+=("$(colorize_location_value "$city" 3)")
elif [ -n "$entity" ]; then
countries+=("$(colorize_location_value "$entity" 2)")
fi
done <<< "$entities"
if [ ${#countries} -ne 0 ]; then
print_blue "COUNTRIES:"
print_array "${countries[@]}"
echo " "
fi
if [ ${#cities} -ne 0 ]; then
print_blue "CITIES:"
print_array "${cities[@]}"
echo " "
fi
if [[ -n $2 && $2 == "y" && ${#hostnames} -ne 0 ]]; then
print_blue "HOSTNAMES:"
print_array "${hostnames[@]}"
echo " "
fi
================================================
FILE: commands/apps/mullvad/status.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Mullvad Status
# @raycast.mode inline
#
# Conditional parameters:
# @raycast.refreshTime 5m
#
# Optional parameters:
# @raycast.packageName Mullvad
# @raycast.icon images/mullvad.png
#
# Documentation:
# @raycast.author Phil Salant
# @raycast.authorURL https://github.com/PSalant726
# @raycast.description Display the current status of the Mullvad VPN tunnel connection.
#
# Dependencies:
# The Mullvad CLI: https://mullvad.net/en/help/cli-command-wg/
if ! command -v mullvad &> /dev/null; then
echo "⚠️ The Mullvad CLI is not installed"
exit 1
fi
status=$(mullvad status)
success=$?
if [ $success -ne 0 ]; then
echo "⚠️ Failed to update VPN tunnel connection status"
exit 1
fi
if [[ $status == *"Disconnected"* ]]; then
echo "❌ Disconnected and unsecured"
else
echo "✅ $status"
fi
================================================
FILE: commands/apps/noteplan3/README.md
================================================
# NotePlan3
Script commands for [NotePlan3](https://noteplan.co)

## Commands
- **Append To Daily Note**: Appends input text to the Daily note of today. Really simple input that can include *, - or markdown for formatting. If input is left blank it will instead paste whatever text is in your clipboard.
- **New Note From Clipboard**: Create a new note with a title and the contents of the clipboard (only works with text).
================================================
FILE: commands/apps/noteplan3/noteplan-append-daily-note.sh
================================================
#!/bin/bash
# Note: NotePlan3 required
# Install via Mac App Store: https://apps.apple.com/app/noteplan-3/id1505432629
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Append To Daily Note
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/noteplan3.png
# @raycast.argument1 { "type": "text", "placeholder": "- Quick note", "percentEncoded": true, "optional": true }
# @raycast.packageName NotePlan3
# Documentation: Appends text to the daily note. If no input is given it will use the current clipboard item.
# @raycast.description Append to daily note
# @raycast.author Göran Damberg
# @raycast.authorURL https://github.com/gdamberg
text=""
if [ -z "${1}" ]; then
text="$(pbpaste | python3 -c 'import urllib.parse, sys; print(urllib.parse.quote(sys.stdin.read()))')"
else
text="${1}"
fi
open "noteplan://x-callback-url/addText?noteDate=today&mode=append&openNote=no&text=${text}"
echo "Appended to daily note."
================================================
FILE: commands/apps/noteplan3/noteplan-new-note-from-clipboard.sh
================================================
#!/bin/bash
# Note: NotePlan3 required
# Install via Mac App Store: https://apps.apple.com/app/noteplan-3/id1505432629
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title New Note From Clipboard
# @raycast.mode fullOutput
# Optional parameters:
# @raycast.icon images/noteplan3.png
# @raycast.argument1 { "type": "text", "placeholder": "Title", "percentEncoded": true, "optional": false }
# @raycast.packageName NotePlan3
# Documentation: Creates a new note from clipboard
# @raycast.description Create a new note from clipboard
# @raycast.author Göran Damberg
# @raycast.authorURL https://github.com/gdamberg
text="$(pbpaste | python3 -c 'import urllib.parse, sys; print(urllib.parse.quote(sys.stdin.read()))')"
open "noteplan://x-callback-url/addNote?noteTitle=${1}&openNote=yes&text=${text}"
================================================
FILE: commands/apps/notes/append-note-from-clipboard.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Append Content From Clipboard
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ./images/notes.png
# @raycast.argument1 { "type": "text", "placeholder": "Note Name" }
# @raycast.packageName Notes
# Documentation:
# @raycast.description Script to append to an existing note content from clipboard.
# @raycast.author Ayoub Gharbi
# @raycast.authorURL https://github.com/ayoub-g
on run argv
tell application "Notes"
set note_name to (item 1 of argv)
if exists note note_name then
show note note_name
set new_content to the clipboard
set note_content to body of note note_name
set body of note note_name to note_content & new_content
else
log "Note \"" & note_name & "\" was not found"
end if
end tell
end run
================================================
FILE: commands/apps/notes/create-note-from-clipboard.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Create Note From Clipboard
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ./images/notes.png
# @raycast.argument1 { "type": "text", "placeholder": "Note Name" }
# @raycast.packageName Notes
# Documentation:
# @raycast.description Create Note From Clipboard
# @raycast.author Ayoub Gharbi
# @raycast.authorURL https://github.com/ayoub-g
on run argv
set content to "
" & (item 1 of argv) & "
" & (the clipboard as Unicode text) & "
"
tell application "Notes"
activate
make new note at folder "Notes" with properties {name:"", body:content}
end tell
end run
================================================
FILE: commands/apps/notes/create-note.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Create Note
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ./images/notes.png
# @raycast.argument1 { "type": "text", "placeholder": "Note Name" }
# @raycast.argument2 { "type": "text", "placeholder": "Text" }
# @raycast.packageName Notes
# Documentation:
# @raycast.description Create a new Note
# @raycast.author Vardan Sawhney
# @raycast.authorURL https://github.com/commai
on run argv
set content to "
" & (item 1 of argv) & "
" & (item 2 of argv) & "
"
tell application "Notes"
activate
make new note at folder "Notes" with properties {name: "", body:content}
end tell
end run
================================================
FILE: commands/apps/notes/open-note.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open Note
# @raycast.mode compact
# Optional parameters:
# @raycast.icon ./images/notes.png
# @raycast.argument1 { "type": "text", "placeholder": "Note Title" }
# @raycast.packageName Notes
# Documentation:
# @raycast.description Open Note via its Title
# @raycast.author Vardan Sawhney
# @raycast.authorURL https://github.com/commai
on run argv
tell application "Notes"
if exists note (item 1 of argv)
show note (item 1 of argv)
else
log "Sorry, the note \"" & (item 1 of argv) & "\" was not found"
end if
end tell
end run
================================================
FILE: commands/apps/notes/search-note-by-name.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Search Note By Name
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ./images/notes.png
# @raycast.argument1 { "type": "text", "placeholder": "Exact Note Name or a Substring" }
# @raycast.packageName Notes
# Documentation:
# @raycast.description This script searches for a note, given its exact name, or a substring, the search does not consider case
# if two notes or more have the same given substring the script will always show the first one
# @raycast.author Ayoub Gharbi
# @raycast.authorURL github.com/ayoub-g
on run argv
set note_to_search to (item 1 of argv)
tell application "Notes"
activate
set search_complete to false
set note_found to false
set folder_index to 1
set folders_count to (count of folders)
repeat while search_complete is false
set note_index to 1
set end_list to false
set leave_list to false
set note_names to (name of notes of folder folder_index)
repeat while leave_list is false
set note_name to item note_index of note_names
if note_to_search is in note_name then
show note note_name
set note_found to true
set search_complete to true
end if
set note_index to (note_index + 1)
if note_index > (count of note_names) then
set end_list to true
end if
set leave_list to end_list or note_found
end repeat
set folder_index to (folder_index + 1)
if folder_index > folders_count then
set search_complete to true
end if
end repeat
end tell
end run
================================================
FILE: commands/apps/obsidian/obsidian-create-note.template.sh
================================================
#!/bin/bash
# Note: Obsidian v0.8.15+ required
# Install via: 1) https://obsidian.md 2) brew install --cask obsidian
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Create Note
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ./images/obsidian.png
# @raycast.argument1 { "type": "text", "placeholder": "Name", "optional": false, "percentEncoded": true}
# @raycast.argument2 { "type": "text", "placeholder": "Content", "optional": true, "percentEncoded": true}
# @raycast.packageName Obsidian
# Documentation:
# @raycast.description Create a new note
# @raycast.author Yiyao Wei
# @raycast.authorURL https://github.com/HotThoughts
# The name of your vault, e.g., "Knowledge Base"
VAULT_NAME=""
if [ -z "$VAULT_NAME" ]
then
echo "Configure VAULT_NAME"
exit 1
fi
open "obsidian://new?vault=$VAULT_NAME&name=${1}&content=${2}"
================================================
FILE: commands/apps/obsidian/obsidian-search-vault.template.sh
================================================
#!/bin/bash
# Note: Obsidian v0.8.15+ required
# Install via: 1) https://obsidian.md 2) brew install --cask obsidian
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Search in Vault
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ./images/obsidian.png
# @raycast.argument1 { "type": "text", "placeholder": "Type to search in vault..." }
# @raycast.packageName Obsidian
# Documentation:
# @raycast.description Search Obsidian Vault
# @raycast.author Yiyao Wei
# @raycast.authorURL https://github.com/HotThoughts
# The name of your vault, e.g., "Knowledge Base"
VAULT_NAME=""
if [ -z "$VAULT_NAME" ]
then
echo "Configure VAULT_NAME"
exit 1
fi
open "obsidian://search?vault=$VAULT_NAME&query=${1}"
================================================
FILE: commands/apps/one-thing/one-thing-clear-text.sh
================================================
#!/bin/bash
# Note: One Thing required
# Install via Mac App Store: https://apps.apple.com/app/id1604176982
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Clear Text
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ./images/one-thing.png
# @raycast.packageName One Thing
# Documentation:
# @raycast.author One Thing
# @raycast.authorURL https://sindresorhus.com/one-thing
# @raycast.description Clear the text shown in One Thing app.
open --background "one-thing:?text="
================================================
FILE: commands/apps/one-thing/one-thing-set-text.sh
================================================
#!/bin/bash
# Note: One Thing required
# Install via Mac App Store: https://apps.apple.com/app/id1604176982
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Set Text
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ./images/one-thing.png
# @raycast.packageName One Thing
# Documentation:
# @raycast.author One Thing
# @raycast.authorURL https://sindresorhus.com/one-thing
# @raycast.description Set the text shown in One Thing app.
# @raycast.argument1 { "type": "text", "placeholder": "text", "percentEncoded": true }
open --background "one-thing:?text=$1"
================================================
FILE: commands/apps/openvpn/connect-openvpn.applescript
================================================
#!/usr/bin/osascript
# Note: OpenVPN v3.3+ recommended
# Install via https://openvpn.net/vpn-client/
#
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Connect OpenVPN
# @raycast.mode silent
#
# Optional parameters:
# @raycast.icon ./images/openvpn.png
# @raycast.packageName OpenVPN
#
# Documentation:
# @raycast.description Prepares OpenVPN Connect client to connect or reconnect.
# @raycast.author Aaron Miller
# @raycast.authorURL https://github.com/aaronhmiller
if application "OpenVPN Connect" is running then
-- no op
else
tell application "OpenVPN Connect" to activate
delay 3 --wait for init
end if
ignoring application responses --removes 5 sec delay (via caching?)
tell application "System Events" to tell process "OpenVPN Connect" to click menu bar item 1 of menu bar 2
end ignoring
delay 0.1
do shell script "killall System\\ Events"
tell application "System Events" to tell process "OpenVPN Connect" to tell menu bar item 1 of menu bar 2
click
get menu items of menu 1
try
click menu item "Connect" of menu 1
do shell script "echo OpenVPN ready to connect"
on error --menu item toggles between connect/disconnect
key code 53 --escape key to close menu
do shell script "echo Already connected"
end try
end tell
================================================
FILE: commands/apps/openvpn/disconnect-openvpn.applescript
================================================
#!/usr/bin/osascript
# Note: OpenVPN v3.3+ recommended
# Install via https://openvpn.net/vpn-client/
#
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Disconnect OpenVPN
# @raycast.mode silent
#
# Optional parameters:
# @raycast.icon ./images/openvpn.png
# @raycast.packageName OpenVPN
#
# Documentation:
# @raycast.description Disconnects the OpenVPN Connect client from VPN.
# @raycast.author Aaron Miller
# @raycast.authorURL https://github.com/aaronhmiller
-- shouldn't try to disconnect if app isn't running, but sometimes we do things without awareness ;)
if application "OpenVPN Connect" is running then
-- no op
else
return "OpenVPN Connect not running"
end if
ignoring application responses --removes 5 sec delay (via caching?)
tell application "System Events" to tell process "OpenVPN Connect" to click menu bar item 1 of menu bar 2
end ignoring
delay 0.1
do shell script "killall System\\ Events"
tell application "System Events" to tell process "OpenVPN Connect" to tell menu bar item 1 of menu bar 2
click
get menu items of menu 1
try
click menu item "Disconnect" of menu 1
do shell script "echo OpenVPN disconnected"
on error --menu item toggles between connect/disconnect
key code 53 --escape key to close menu
do shell script "echo Already disconnected"
end try
end tell
================================================
FILE: commands/apps/openvpn/quit-openvpn.applescript
================================================
#!/usr/bin/osascript
# Note: OpenVPN v3.3+ recommended
# Install via https://openvpn.net/vpn-client/
#
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Quit OpenVPN
# @raycast.mode silent
#
# Optional parameters:
# @raycast.icon ./images/openvpn.png
# @raycast.packageName OpenVPN
#
# Documentation:
# @raycast.description Quits the OpenVPN Connect client.
# @raycast.author Aaron Miller
# @raycast.authorURL https://github.com/aaronhmiller
-- shouldn't try to quit if app isn't running, but sometimes we do silly things ;)
if application "OpenVPN Connect" is running then
-- no op
else
return "OpenVPN Connect not running"
end if
ignoring application responses --removes 5 sec delay (via caching?)
tell application "System Events" to tell process "OpenVPN Connect" to click menu bar item 1 of menu bar 2
end ignoring
delay 0.1
do shell script "killall System\\ Events"
tell application "System Events" to tell process "OpenVPN Connect" to tell menu bar item 1 of menu bar 2
click
get menu items of menu 1
click menu item "Exit" of menu 1
do shell script "echo OpenVPN exited"
end tell
================================================
FILE: commands/apps/phpstorm/.gitignore
================================================
icon.icns
phpstorm-open-*.bash
options.csv
================================================
FILE: commands/apps/phpstorm/recent-projects.sh
================================================
#!/usr/bin/env bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Update Recent Projects
# @raycast.mode inline
#
# Optional parameters:
# @raycast.packageName PhpStorm
# @raycast.icon icon.icns
#
# Conditional parameters:
# @raycast.refreshTime 5m
#
# Requirements
# Raygen (https://github.com/pomdtr/raygen) and PhpStorm installed via JetBrains Toolbox
raygen=$(find /Library/Frameworks/Python.framework -name raygen -type f || true)
[[ -z $raygen ]] && echo "run 'pip install git+https://github.com/pomdtr/raygen.git' to use this script" && exit 1
[[ ! -d ~/Library/Application\ Support/JetBrains ]] && echo "No JetBrains support path" && exit 1
[[ ! -f ~/.config/jetbrains/bin/phpstorm ]] && echo "Install the PhpStorm script via JetBrains Toolbox" && exit 1
phpstormVersion=$(find -s ~/Library/Application\ Support/JetBrains -type d -name 'PhpStorm*' -depth 1 | tail -n 1)
[[ -z $phpstormVersion ]] && echo "could not find PhpStorm version" && exit 1
# copy the icons file from the application
[[ -f "icon.icns" ]] || cp ~/Applications/JetBrains\ Toolbox/PhpStorm.app/Contents/Resources/icon.icns .
# newest projects are at the bottom
top20=$(find "$phpstormVersion" -type f -name recentProjects.xml -exec grep -Eo 'key="[^"]*' {} \; | cut -f2 -d '"' | tail -n 20)
echo "title,command" > options.csv
for path in $top20 ; do
echo "PhpStorm Open $(echo "$path" | rev | cut -f1 -d '/' | rev),~/.config/jetbrains/bin/phpstorm $path" >> options.csv;
done
find . -type f -name phpstorm-open-\*.bash -delete
$raygen \
--header-row \
--output-dir . \
options.csv \
--package-name PhpStorm \
--icon ~/Applications/JetBrains\ Toolbox/PhpStorm.app/Contents/Resources/icon.icns
rm options.csv
chmod u+x phpstorm-open-*.bash
================================================
FILE: commands/apps/plash/plash-add-website.sh
================================================
#!/bin/bash
# Note: Plash v2.2.0 required
# Install via Mac App Store: https://apps.apple.com/app/id1494023538
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Add Website
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ./images/plash.png
# @raycast.packageName Plash
# Documentation:
# @raycast.author Plash
# @raycast.authorURL https://github.com/sindresorhus/Plash
# @raycast.description Add a website to Plash.
# @raycast.argument1 { "type": "text", "placeholder": "url", "percentEncoded": true }
# @raycast.argument2 { "type": "text", "placeholder": "title", "optional": true, "percentEncoded": true }
open --background "plash:add?url=$1&title=$2"
================================================
FILE: commands/apps/plash/plash-next-website.sh
================================================
#!/bin/bash
# Note: Plash v2.2.0 required
# Install via Mac App Store: https://apps.apple.com/app/id1494023538
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Next Website
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ./images/plash.png
# @raycast.packageName Plash
# Documentation:
# @raycast.author Plash
# @raycast.authorURL https://github.com/sindresorhus/Plash
# @raycast.description Switch to the next website in the list in Plash.
open --background plash:next
================================================
FILE: commands/apps/plash/plash-previous-website.sh
================================================
#!/bin/bash
# Note: Plash v2.2.0 required
# Install via Mac App Store: https://apps.apple.com/app/id1494023538
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Previous Website
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ./images/plash.png
# @raycast.packageName Plash
# Documentation:
# @raycast.author Plash
# @raycast.authorURL https://github.com/sindresorhus/Plash
# @raycast.description Switch to the previous website in the list in Plash.
open --background plash:previous
================================================
FILE: commands/apps/plash/plash-random-website.sh
================================================
#!/bin/bash
# Note: Plash v2.3.0 required
# Install via Mac App Store: https://apps.apple.com/app/id1494023538
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Switch to Random Website
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ./images/plash.png
# @raycast.packageName Plash
# Documentation:
# @raycast.author Plash
# @raycast.authorURL https://github.com/sindresorhus/Plash
# @raycast.description Switch to a random website from the list of websites in Plash.
open --background plash:random
================================================
FILE: commands/apps/plash/plash-reload-website.sh
================================================
#!/bin/bash
# Note: Plash v2.2.0 required
# Install via Mac App Store: https://apps.apple.com/app/id1494023538
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Reload Website
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ./images/plash.png
# @raycast.packageName Plash
# Documentation:
# @raycast.author Plash
# @raycast.authorURL https://github.com/sindresorhus/Plash
# @raycast.description Reload the current website in Plash.
open --background plash:reload
================================================
FILE: commands/apps/plash/plash-toggle-browser-mode.sh
================================================
#!/bin/bash
# Note: Plash v2.2.0 required
# Install via Mac App Store: https://apps.apple.com/app/id1494023538
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Toggle Browsing Mode
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ./images/plash.png
# @raycast.packageName Plash
# Documentation:
# @raycast.author Plash
# @raycast.authorURL https://github.com/sindresorhus/Plash
# @raycast.description Toggle browsing mode in Plash.
open --background plash:toggle-browsing-mode
================================================
FILE: commands/apps/playground/README.md
================================================
Playground
Test and prototype using Swift Playground as easy as it should via [Raycast](http://raycast.com).

### Available scripts
- **Create Basic:** Create and open a new basic Swift Playground
- **Create View Based:** Create and open a new view based Swift Playground
### Arguments
#### Destination Path
Default is `/tmp/`
Example: `~/MyPlayground`
#### GitHub/Gist URL
Gist, a GitHub URL or any other URL to open in the created Playground.
Example: `https://gist.github.com/JohnSundell/b7f901e8edb89d1396ede4d8db3e8c21`
#### Dependencies
Add some dependencies to your playground.
Example: `~/unbox/unbox.xcodeproj,~/files/files.xcodeproj`
================================================
FILE: commands/apps/playground/open-new-playground.py
================================================
#!/usr/bin/env python3
# Dependency: This script require playground (https://github.com/JohnSundell/Playground).
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Create Basic
# @raycast.mode silent
# Optional parameters:
# @raycast.icon 🕊
# @raycast.argument1 { "type": "text", "placeholder": "Destination Path", "optional": true }
# @raycast.argument2 { "type": "text", "placeholder": "GitHub/Gist URL", "optional": true }
# @raycast.argument3 { "type": "text", "placeholder": "Dependencies", "optional": true }
# @raycast.packageName Swift Playgrounds
# Documentation:
# @raycast.description Create and open a new basic Swift Playground
# @raycast.author Quentin Eude
# @raycast.authorURL https://github.com/qeude
import sys
import os
from datetime import datetime
from shutil import which
def safe_get(array, index):
try:
return array[index]
except IndexError:
return None
if which("playground") is None:
print("playground is required (https://github.com/JohnSundell/Playground).")
exit(1)
default_path=os.path.abspath("/tmp")
destination_path=safe_get(sys.argv, 1) or default_path
url_to_open=safe_get(sys.argv, 2)
dependencies=safe_get(sys.argv, 3)
if os.path.isdir(destination_path):
destination_path=os.path.join(destination_path, datetime.now().astimezone().isoformat())
command = f"playground -t '{destination_path}'"
if url_to_open:
command = command + f" -u '{url_to_open}'"
if dependencies:
command = command + f" -d '{dependencies}'"
os.system(command)
================================================
FILE: commands/apps/playground/open-new-view-playground.py
================================================
#!/usr/bin/env python3
# Dependency: This script require playground (https://github.com/JohnSundell/Playground).
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Create View Based
# @raycast.mode silent
# Optional parameters:
# @raycast.icon 🕊
# @raycast.argument1 { "type": "text", "placeholder": "Destination Path", "optional": true }
# @raycast.argument2 { "type": "text", "placeholder": "GitHub/Gist URL", "optional": true }
# @raycast.argument3 { "type": "text", "placeholder": "Dependencies", "optional": true }
# @raycast.packageName Swift Playgrounds
# Documentation:
# @raycast.description Create and open a new view based Swift Playground
# @raycast.author Quentin Eude
# @raycast.authorURL https://github.com/qeude
import sys
import os
from datetime import datetime
from shutil import which
def safe_get(array, index):
try:
return array[index]
except IndexError:
return None
if which("playground") is None:
print("playground is required (https://github.com/JohnSundell/Playground).")
exit(1)
default_path=os.path.abspath("/tmp")
destination_path=safe_get(sys.argv, 1) or default_path
url_to_open=safe_get(sys.argv, 2)
dependencies=safe_get(sys.argv, 3)
if os.path.isdir(destination_path):
destination_path=os.path.join(destination_path, datetime.now().astimezone().isoformat())
command = f"playground -v -t '{destination_path}'"
if url_to_open:
command = command + f" -u '{url_to_open}'"
if dependencies:
command = command + f" -d '{dependencies}'"
os.system(command)
================================================
FILE: commands/apps/pulse-secure/README.md
================================================
## Pulse Secure
Manage your VPN connection with the collection of scripts that control the [Pulse Secure application](https://www.pulsesecure.net/) via [Raycast](http://raycast.com).
### Available scripts
- **Connect / Reconnect:** Connect to the given / default connection with the given / default username.
- **Disconnect / Cancel:** Disconnect / cancel the active connection.
- **Resume:** Resume the suspended connection.
- **Suspend:** Suspend the active connection.
================================================
FILE: commands/apps/pulse-secure/pulse-secure-connect.applescript
================================================
#!/usr/bin/osascript
# Dependencies:
# Pulse Secure: https://www.pulsesecure.net/
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Connect / Reconnect
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName Pulse Secure
# @raycast.icon images/pulse-secure.png
# @raycast.argument1 { "type": "text", "placeholder": "Connection", "optional": true }
# @raycast.argument2 { "type": "text", "placeholder": "Username", "optional": true }
# @raycast.argument3 { "type": "text", "placeholder": "Password", "optional": true, "secure": true }
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Connect to the given / default connection with the given / default username.
on run argv
### Configuration ###
set defaultConnection to ""
set defaultUsername to ""
set keychainItemPrefix to "raycast-pulse-secure-"
### End of configuration ###
try
runTray()
set connection to getConnection(item 1 of argv, defaultConnection)
set formattedConnection to formatConnection(connection)
set keychainItem to keychainItemPrefix & formattedConnection
set username to getUsername(item 2 of argv, defaultUsername)
if item 3 of argv = "" then
set pwd to getPassword(connection, username, keychainItem)
else
set pwd to item 3 of argv
updatePassword(pwd, connection, username, keychainItem)
end if
disconnectOrCancel()
connect(connection, username, pwd)
return
on error errorMessage
closeMenu()
return errorMessage
end try
end run
### Functions ###
on getConnection(query, defaultConnection)
set connection to query
if connection = "" then
set connection to defaultConnection
if connection = "" then error "Default connection is not set, edit the command file"
else if not connectionExists(query) then
set connection to findMatchingConnection(query)
if connection = "" then error "Connection \"" & query & "\" not found"
end if
return connection
end getConnection
on formatConnection(connection)
return do shell script "python3 -c \"print('" & connection & "'.lower().replace(' ','-'))\""
end formatConnection
on getUsername(username, defaultUsername)
if username = "" then
set username to defaultUsername
if username = "" then error "Default username is not set, edit the command file"
end if
return username
end getUsername
on getPassword(connection, username, keychainItem)
try
return do shell script "security find-generic-password -a '" & username & "' -s '" & keychainItem & "' -w 2> /dev/null"
on error
error "Keychain item \"" & keychainItem & "\" (account \"" & username & "\") not found, enter password"
end try
end getPassword
on updatePassword(pwd, connection, username, keychainItem)
set comment to "Credentials for Pulse Secure connection \"" & connection & "\" (username \"" & username & "\")"
do shell script "security add-generic-password -U -a '" & username & "' -s '" & keychainItem & "' -j '" & comment & "' -w '" & pwd & "'"
end updatePassword
on connectionExists(connection)
openMenu()
tell application "System Events" to tell process "PulseTray"
tell menu 1 of menu bar item 1 of menu bar 2
return menu item connection exists
end tell
end tell
end connectionExists
on findMatchingConnection(query)
openMenu()
tell application "System Events" to tell process "PulseTray"
tell menu 1 of menu bar item 1 of menu bar 2
try
return name of first menu item whose name contains query
on error
return ""
end try
end tell
end tell
end findMatchingConnection
on disconnectOrCancel()
openMenu()
tell application "System Events" to tell process "PulseTray"
tell menu 1 of menu bar item 1 of menu bar 2
if name of menu item 3 does not contain "No active connections" then
tell (first menu item whose value of attribute "AXMenuItemMarkChar" is " ")
click
tell menu 1
if value of attribute "AXEnabled" of menu item "Disconnect" then
click menu item "Disconnect"
else if value of attribute "AXEnabled" of menu item "Cancel" then
click menu item "Cancel"
else
error "Neither menu item \"Disconnect\" nor \"Cancel\" is active"
end if
end tell
end tell
end if
end tell
end tell
end disconnectOrCancel
on connect(connection, username, pwd)
openMenu()
tell application "System Events" to tell process "PulseTray"
tell menu 1 of menu bar item 1 of menu bar 2 to tell menu item connection
click
tell menu 1
if value of attribute "AXEnabled" of menu item "Connect" then
click menu item "Connect"
my waitForWindow(connection)
keystroke username
key code 48
keystroke pwd
key code 36
else
error "Menu item \"Connect\" is not active"
end if
end tell
end tell
end tell
end connect
on trayIsRunning()
return application "PulseTray" is running
end trayIsRunning
on runTray()
if not trayIsRunning() then do shell script "open -a 'PulseTray'"
end runTray
on menuIsOpen()
tell application "System Events" to tell process "PulseTray"
return menu 1 of menu bar item 1 of menu bar 2 exists
end tell
end menuIsOpen
on openMenu()
set killDelay to 0
repeat
tell application "System Events" to tell process "PulseTray"
if my menuIsOpen() then return
ignoring application responses
click menu bar item 1 of menu bar 2
end ignoring
end tell
set killDelay to killDelay + 0.1
delay killDelay
do shell script "killall System\\ Events"
end repeat
end openMenu
on closeMenu()
if menuIsOpen() then tell application "System Events" to key code 53
end closeMenu
on waitForWindow(connection)
tell application "System Events" to tell process "PulseTray"
repeat
if window connection exists then
set frontmost to true
perform action "AXRaise" of window connection
return
else
delay 0.5
end if
end repeat
end tell
end waitForWindow
================================================
FILE: commands/apps/pulse-secure/pulse-secure-disconnect.applescript
================================================
#!/usr/bin/osascript
# Dependencies:
# Pulse Secure: https://www.pulsesecure.net/
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Disconnect / Cancel
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName Pulse Secure
# @raycast.icon images/pulse-secure.png
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Disconnect / cancel the active connection.
on run argv
### End of configuration ###
try
if not trayIsRunning() then error "Pulse Secure tray is not running"
disconnectOrCancel()
return
on error errorMessage
closeMenu()
return errorMessage
end try
end run
### Functions ###
on disconnectOrCancel()
openMenu()
tell application "System Events" to tell process "PulseTray"
tell menu 1 of menu bar item 1 of menu bar 2
if name of menu item 3 does not contain "No active connections" then
tell (first menu item whose value of attribute "AXMenuItemMarkChar" is " ")
click
tell menu 1
if value of attribute "AXEnabled" of menu item "Disconnect" then
click menu item "Disconnect"
else if value of attribute "AXEnabled" of menu item "Cancel" then
click menu item "Cancel"
else
error "Neither menu item \"Disconnect\" nor \"Cancel\" is active"
end if
end tell
end tell
else
error "No active connection"
end if
end tell
end tell
end disconnectOrCancel
on trayIsRunning()
return application "PulseTray" is running
end trayIsRunning
on menuIsOpen()
tell application "System Events" to tell process "PulseTray"
return menu 1 of menu bar item 1 of menu bar 2 exists
end tell
end menuIsOpen
on openMenu()
set killDelay to 0
repeat
tell application "System Events" to tell process "PulseTray"
if my menuIsOpen() then return
ignoring application responses
click menu bar item 1 of menu bar 2
end ignoring
end tell
set killDelay to killDelay + 0.1
delay killDelay
do shell script "killall System\\ Events"
end repeat
end openMenu
on closeMenu()
if menuIsOpen() then tell application "System Events" to key code 53
end closeMenu
================================================
FILE: commands/apps/pulse-secure/pulse-secure-resume.applescript
================================================
#!/usr/bin/osascript
# Dependencies:
# Pulse Secure: https://www.pulsesecure.net/
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Resume
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName Pulse Secure
# @raycast.icon images/pulse-secure.png
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Resume the suspended connection.
on run argv
### End of configuration ###
try
if not trayIsRunning() then error "Pulse Secure tray is not running"
resume()
return
on error errorMessage
closeMenu()
return errorMessage
end try
end run
### Functions ###
on resume()
openMenu()
tell application "System Events" to tell process "PulseTray"
tell menu 1 of menu bar item 1 of menu bar 2
if name of menu item 3 contains "Suspended" then
tell (first menu item whose value of attribute "AXMenuItemMarkChar" is " ")
click
tell menu 1
if value of attribute "AXEnabled" of menu item "Resume" then
click menu item "Resume"
else
error "Menu item \"Resume\" is not active"
end if
end tell
end tell
else
error "No suspended connection"
end if
end tell
end tell
end resume
on trayIsRunning()
return application "PulseTray" is running
end trayIsRunning
on menuIsOpen()
tell application "System Events" to tell process "PulseTray"
return menu 1 of menu bar item 1 of menu bar 2 exists
end tell
end menuIsOpen
on openMenu()
set killDelay to 0
repeat
tell application "System Events" to tell process "PulseTray"
if my menuIsOpen() then return
ignoring application responses
click menu bar item 1 of menu bar 2
end ignoring
end tell
set killDelay to killDelay + 0.1
delay killDelay
do shell script "killall System\\ Events"
end repeat
end openMenu
on closeMenu()
if menuIsOpen() then tell application "System Events" to key code 53
end closeMenu
================================================
FILE: commands/apps/pulse-secure/pulse-secure-suspend.applescript
================================================
#!/usr/bin/osascript
# Dependencies:
# Pulse Secure: https://www.pulsesecure.net/
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Suspend
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName Pulse Secure
# @raycast.icon images/pulse-secure.png
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Suspend the active connection.
on run argv
### End of configuration ###
try
if not trayIsRunning() then error "Pulse Secure tray is not running"
suspend()
return
on error errorMessage
closeMenu()
return errorMessage
end try
end run
### Functions ###
on suspend()
openMenu()
tell application "System Events" to tell process "PulseTray"
tell menu 1 of menu bar item 1 of menu bar 2
if name of menu item 3 contains "Connected" then
tell (first menu item whose value of attribute "AXMenuItemMarkChar" is " ")
click
tell menu 1
if value of attribute "AXEnabled" of menu item "Suspend" then
click menu item "Suspend"
else
error "Menu item \"Suspend\" is not active"
end if
end tell
end tell
else
error "No active connection"
end if
end tell
end tell
end suspend
on trayIsRunning()
return application "PulseTray" is running
end trayIsRunning
on menuIsOpen()
tell application "System Events" to tell process "PulseTray"
return menu 1 of menu bar item 1 of menu bar 2 exists
end tell
end menuIsOpen
on openMenu()
set killDelay to 0
repeat
tell application "System Events" to tell process "PulseTray"
if my menuIsOpen() then return
ignoring application responses
click menu bar item 1 of menu bar 2
end ignoring
end tell
set killDelay to killDelay + 0.1
delay killDelay
do shell script "killall System\\ Events"
end repeat
end openMenu
on closeMenu()
if menuIsOpen() then tell application "System Events" to key code 53
end closeMenu
================================================
FILE: commands/apps/quip/.gitignore
================================================
.DS_Store
tmp/
quip_config.ini
quip-new-*.py
__pycache__
================================================
FILE: commands/apps/quip/README.org
================================================
#+title: Raycast script commands for Quip
This set of script commands makes it possible to easily create and add text to different types of Quip documents. They complement the existing Raycast [[https://www.raycast.com/justin0u0/quip][Quip extension]], which provides support for searching and viewing Quip documents.
With these scripts you can create commands to do one of two actions:
- =create=: Create new Quip documents in predefined folders, optionally based on predefined templates (e.g. type =mnote Meeting title= to automatically create a new document in your "Meeting notes" folder, using an appropriate template). You can define as many different "create" actions as you need.
- =add=: Add text to an existing Quip document, optionally formatted as list items (e.g. type =todo Update the documentation= to add a todo item to your "Action items" document). You can define as many "add" actions as you need.
You can customize the behavior during and after these actions, including the following:
- Open the created/updated document automatically (and whether to use the Quip app or the web browser for this)
- Copy the URL of the created/updated document to the clipboard.
- Prepend the current date to the title of newly created documents or added text.
- Use different templates for each type of document created.
- The Quip folder in which to store each type of created document.
- Produce notifications after each command finishes execution.
* Configuration and use
To get set up, do the following:
1. Check out this repository and add the =quip= directory as a Script Directory in the Raycast preferences:
[[file:images/raycast-script-directory-prefs.png]]
2. Copy =quip_config.template.ini= to =quip_config.ini= and customize it to your needs. You need to set at least the following values:
- =APIToken= to your Quip personal API token. You can get one at https://quip.com/api/personal-token (the URL may be different if you are using a Quip Enterprise instance with a custom domain).
- If you are using a custom Quip domain, modify =BaseURL= and =APIURL= accordingly.
- Configure the actions you want. See the examples in the template for details on how to configure them.
- *Note:* if you want to populate Quip secrets and other values from a password manager, see =quip_config.chezmoi.template.ini= for an example which inserts those values from entries kept in KeePassXC. Instructions are at the top of the file.
3. Once your configuration is complete, run from Raycast the "Set up Quip commands" command. This will ask you for confirmation and then generate scripts corresponding to your configuration, which will be loaded automatically by Raycast.
[[file:images/raycast-setup-quip-commands.png]]
[[file:images/raycast-generate-quip-commands-output.png]]
4. You can now use the generated commands to create or add text to Quip documents. You can of course configure aliases or hotkeys for the commands you need the most in the Raycast Script Commands settings.
[[file:images/raycast-quip-commands.png]]
[[file:images/raycast-script-command-settings.png]]
5. Note that you can also run the generated scripts from the command line to execute the corresponding actions. For example:
#+begin_src shell
./quip-new-note.py "New note title"
#+end_src
6. If you need to update or modify your config (e.g. to add or remove actions), make sure you rerun the "Set up Quip commands" command afterwards, to ensure the scripts are kept up to date.
================================================
FILE: commands/apps/quip/quip-new.template.py
================================================
#!/usr/bin/env python3
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title {{commandtitle}}
# @raycast.mode compact
# Optional parameters:
# @raycast.icon /Applications/Quip.app/Contents/Resources/AppIcon.icns
# @raycast.argument1 { "type": "text", "placeholder": "{{commandargplaceholder}}", "optional": {{opendocifemptyarg}} }
# @raycast.packageName Quip utilities
# Documentation:
# @raycast.description Configure your Quip API token and other defaults in quip_config.ini
# @raycast.author zzamboni
# @raycast.authorURL https://raycast.com/zzamboni
import sys
import re
import quip_utils
# Determine the document type to create from the script filename.
match = re.search('quip-new-(.+)\.py', sys.argv[0])
if match:
doc_type = match.group(1)
if len(sys.argv) > 1:
arg = sys.argv[1]
else:
arg = None
quip_utils.quip_new_doc(doc_type, arg)
else:
quip_utils.fail(f"Error: Could not determine document type to use - incorrect script name.")
================================================
FILE: commands/apps/quip/quip.py
================================================
# Copyright 2014 Quip
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
"""A Quip API client library.
For full API documentation, visit https://quip.com/api/.
Typical usage:
client = quip.QuipClient(access_token=...)
user = client.get_authenticated_user()
starred = client.get_folder(user["starred_folder_id"])
print "There are", len(starred["children"]), "items in your starred folder"
In addition to standard getters and setters, we provide a few convenience
methods for document editing. For example, you can use `add_to_first_list`
to append items (in Markdown) to the first bulleted or checklist in a
given document, which is useful for automating a task list.
"""
import datetime
import json
import logging
import ssl
import sys
import time
import xml.etree.cElementTree
PY3 = sys.version_info > (3,)
if PY3:
import urllib.request
import urllib.parse
import urllib.error
Request = urllib.request.Request
urlencode = urllib.parse.urlencode
urlopen = urllib.request.urlopen
HTTPError = urllib.error.HTTPError
iteritems = dict.items
else:
import urllib
import urllib2
Request = urllib2.Request
urlencode = urllib.urlencode
urlopen = urllib2.urlopen
HTTPError = urllib2.HTTPError
iteritems = dict.iteritems
try:
reload(sys)
sys.setdefaultencoding('utf8')
except:
# Can't change default encoding usually...
pass
try:
ssl.PROTOCOL_TLSv1_1
except AttributeError:
raise Exception(
"Using the Quip API requires an SSL library that supports TLS versions "
">= 1.1; your Python + OpenSSL installation must be upgraded.")
# After 2017-02, the Quip API HTTPS endpoint requires TLS version 1.1 or later;
# TLS version 1.0 is disabled due to extensive security vulnerabilities.
#
# - macOS: At this time of this writing, macOS ships with Python 2.7 and
# OpenSSL, but the version of OpenSSL is outdated and only supports TLS 1.0.
# (This is even true of the most recent version of macOS (Sierra) with all
# security patches installed; see
# https://eclecticlight.co/2016/03/23/the-tls-mess-in-os-x-el-capitan/ .)
#
# To use this module on a macOS system, you will need to install your own
# copy of Python and OpenSSL. Simple suggestions:
#
# 1) Install Homebrew from http://brew.sh; run "brew install openssl python"
# 2) Install Miniconda from https://conda.io/miniconda.html
#
# - Google App Engine (GAE): Per App Engine's documentation, you must request
# version 2.7.11 of the "ssl" library in your app.yaml file. See:
# https://cloud.google.com/appengine/docs/python/sockets/ssl_support
class QuipError(Exception):
def __init__(self, code, message, http_error):
Exception.__init__(self, "%d: %s" % (code, message))
self.code = code
self.http_error = http_error
class QuipClient(object):
"""A Quip API client"""
# Edit operations
APPEND, \
PREPEND, \
AFTER_SECTION, \
BEFORE_SECTION, \
REPLACE_SECTION, \
DELETE_SECTION = range(6)
# Folder colors
MANILA, \
RED, \
ORANGE, \
GREEN, \
BLUE = range(5)
def __init__(self, access_token=None, client_id=None, client_secret=None,
base_url=None, request_timeout=None):
"""Constructs a Quip API client.
If `access_token` is given, all of the API methods in the client
will work to read and modify Quip documents.
Otherwise, only `get_authorization_url` and `get_access_token`
work, and we assume the client is for a server using the Quip API's
OAuth endpoint.
"""
self.access_token = access_token
self.client_id = client_id
self.client_secret = client_secret
self.base_url = base_url if base_url else "https://platform.quip.com"
self.request_timeout = request_timeout if request_timeout else 10
def get_authorization_url(self, redirect_uri, state=None):
"""Returns the URL the user should be redirected to to sign in."""
return self._url(
"oauth/login", redirect_uri=redirect_uri, state=state,
response_type="code", client_id=self.client_id)
def get_access_token(self, redirect_uri, code,
grant_type="authorization_code",
refresh_token=None):
"""Exchanges a verification code for an access_token.
Once the user is redirected back to your server from the URL
returned by `get_authorization_url`, you can exchange the `code`
argument with this method.
"""
return self._fetch_json(
"oauth/access_token", redirect_uri=redirect_uri, code=code,
grant_type=grant_type, refresh_token=refresh_token,
client_id=self.client_id, client_secret=self.client_secret)
def get_authenticated_user(self):
"""Returns the user corresponding to our access token."""
return self._fetch_json("users/current")
def get_user(self, id):
"""Returns the user with the given ID."""
return self._fetch_json("users/" + id)
def get_users(self, ids):
"""Returns a dictionary of users for the given IDs."""
return self._fetch_json("users/", post_data={"ids": ",".join(ids)})
def update_user(self, user_id, picture_url=None):
return self._fetch_json("users/update", post_data={
"user_id": user_id,
"picture_url": picture_url,
})
def get_contacts(self):
"""Returns a list of the users in the authenticated user's contacts."""
return self._fetch_json("users/contacts")
def get_folder(self, id):
"""Returns the folder with the given ID."""
return self._fetch_json("folders/" + id)
def get_folders(self, ids):
"""Returns a dictionary of folders for the given IDs."""
return self._fetch_json("folders/", post_data={"ids": ",".join(ids)})
def new_folder(self, title, parent_id=None, color=None, member_ids=[]):
return self._fetch_json("folders/new", post_data={
"title": title,
"parent_id": parent_id,
"color": color,
"member_ids": ",".join(member_ids),
})
def update_folder(self, folder_id, color=None, title=None):
return self._fetch_json("folders/update", post_data={
"folder_id": folder_id,
"color": color,
"title": title,
})
def add_folder_members(self, folder_id, member_ids):
"""Adds the given users to the given folder."""
return self._fetch_json("folders/add-members", post_data={
"folder_id": folder_id,
"member_ids": ",".join(member_ids),
})
def remove_folder_members(self, folder_id, member_ids):
"""Removes the given users from the given folder."""
return self._fetch_json("folders/remove-members", post_data={
"folder_id": folder_id,
"member_ids": ",".join(member_ids),
})
def get_teams(self):
"""Returns the teams for the user corresponding to our access token."""
return self._fetch_json("teams/current")
def get_messages(self, thread_id, max_created_usec=None, count=None):
"""Returns the most recent messages for the given thread.
To page through the messages, use max_created_usec, which is the
sort order for the returned messages.
count should be an integer indicating the number of messages you
want returned. The maximum is 100.
"""
return self._fetch_json(
"messages/" + thread_id, max_created_usec=max_created_usec,
count=count)
def new_message(self, thread_id, content=None, **kwargs):
"""Sends a message on the given thread.
`content` is plain text, not HTML.
"""
args = {
"thread_id": thread_id,
"content": content,
}
args.update(kwargs)
return self._fetch_json("messages/new", post_data=args)
def get_thread(self, id):
"""Returns the thread with the given ID."""
return self._fetch_json("threads/" + id)
def get_threads(self, ids):
"""Returns a dictionary of threads for the given IDs."""
return self._fetch_json("threads/", post_data={"ids": ",".join(ids)})
def get_recent_threads(self, max_updated_usec=None, count=None, **kwargs):
"""Returns the recently updated threads for a given user."""
return self._fetch_json(
"threads/recent", max_updated_usec=max_updated_usec,
count=count, **kwargs)
def get_matching_threads(
self, query, count=None, only_match_titles=False, **kwargs):
"""Returns the recently updated threads for a given user."""
return self._fetch_json("threads/search", query=query, count=count,
only_match_titles=only_match_titles, **kwargs)
def add_thread_members(self, thread_id, member_ids):
"""Adds the given folder or user IDs to the given thread."""
return self._fetch_json("threads/add-members", post_data={
"thread_id": thread_id,
"member_ids": ",".join(member_ids),
})
def delete_thread(self, thread_id):
"""Deletes the thread with the given thread id or secret"""
return self._fetch_json("threads/delete", post_data={
"thread_id": thread_id,
})
def remove_thread_members(self, thread_id, member_ids):
"""Removes the given folder or user IDs from the given thread."""
return self._fetch_json("threads/remove-members", post_data={
"thread_id": thread_id,
"member_ids": ",".join(member_ids),
})
def move_thread(self, thread_id, source_folder_id, destination_folder_id):
"""Moves the given thread from the source folder to the destination one.
"""
self.add_thread_members(thread_id, [destination_folder_id])
self.remove_thread_members(thread_id, [source_folder_id])
def new_chat(self, message, title=None, member_ids=[]):
"""Creates a chat with the given title and members, and send the
initial message."""
return self._fetch_json("threads/new-chat", post_data={
"message": message,
"title": title,
"member_ids": ",".join(member_ids),
})
def new_document(self, content, format="html", title=None, member_ids=[]):
"""Creates a new document from the given content.
To create a document in a folder, include the folder ID in the list
of member_ids, e.g.,
client = quip.QuipClient(...)
user = client.get_authenticated_user()
client.new_document(..., member_ids=[user["archive_folder_id"]])
"""
return self._fetch_json("threads/new-document", post_data={
"content": content,
"format": format,
"title": title,
"member_ids": ",".join(member_ids),
})
def copy_document(self, thread_id, folder_ids=None, member_ids=None,
title=None, values=None, **kwargs):
"""Copies the given document, optionally replaces template variables
in the document with values in 'values' arg. The values argument
must be a dictionary that contains string keys and values that
are either strings, numbers or dictionaries.
"""
args = {"thread_id": thread_id}
if folder_ids:
args["folder_ids"] = ",".join(folder_ids)
if member_ids:
args["member_ids"] = ",".join(member_ids)
if title:
args["title"] = title
if values:
args["values"] = json.dumps(values)
args.update(kwargs)
return self._fetch_json("threads/copy-document", post_data=args)
def merge_comments(self, original_id, children_ids, ignore_user_ids=[]):
"""Given an original document and a set of exact duplicates, copies
all comments and messages on the duplicates to the original.
Impersonates the commentors if the access token used has
permission, but does not add them to the thread.
"""
import re
threads = self.get_threads(children_ids + [original_id])
original_section_ids = re.findall(r" id='([a-zA-Z0-9]{11})'",
threads[original_id]["html"])
for thread_id in children_ids:
thread = threads[thread_id]
child_section_ids = re.findall(r" id='([a-zA-Z0-9]{11})'",
thread["html"])
parent_map = dict(zip(child_section_ids, original_section_ids))
messages = self.get_messages(thread_id)
for message in reversed(messages):
if message["author_id"] in ignore_user_ids:
continue
kwargs = {
"user_id": message["author_id"],
"frame": "bubble",
"service_id": message["id"],
}
if "parts" in message:
kwargs["parts"] = json.dumps(message["parts"])
else:
kwargs["content"] = message["text"]
if "annotation" in message:
section_id = None
if "highlight_section_ids" in message["annotation"]:
section_id = message["annotation"][
"highlight_section_ids"][0]
else:
anno_loc = thread["html"].find(
'= 0 and loc >= 0:
section_id = thread["html"][loc + 4:loc + 15]
if section_id and section_id in parent_map:
kwargs["section_id"] = parent_map[section_id]
if "files" in message:
attachments = []
for blob_info in message["files"]:
blob = self.get_blob(thread_id, blob_info["hash"])
new_blob = self.put_blob(
original_id, blob, name=blob_info["name"])
attachments.append(new_blob["id"])
if attachments:
kwargs["attachments"] = ",".join(attachments)
self.new_message(original_id, **kwargs)
def edit_document(self, thread_id, content, operation=APPEND, format="html",
section_id=None, **kwargs):
"""Edits the given document, adding the given content.
`operation` should be one of the constants described above. If
`operation` is relative to another section of the document, you must
also specify the `section_id`.
"""
# Since our cell ids in 10x contain ';', which is a valid cgi
# parameter separator, we are replacing them with '_' in 10x cell
# sections. This should be no op for all other sections.
section_id = None if not section_id else section_id.replace(";", "_")
args = {
"thread_id": thread_id,
"content": content,
"location": operation,
"format": format,
"section_id": section_id
}
args.update(kwargs)
return self._fetch_json("threads/edit-document", post_data=args)
def add_to_first_list(self, thread_id, *items, **kwargs):
"""Adds the given items to the first list in the given document.
client = quip.QuipClient(...)
client.add_to_first_list(thread_id, "Try the Quip API")
"""
items = [item.replace("\n", " ") for item in items]
args = {
"thread_id": thread_id,
"content": "\n\n".join(items),
"format": "markdown",
"operation": self.AFTER_SECTION
}
args.update(kwargs)
if "section_id" not in args:
first_list = self.get_first_list(
thread_id, kwargs.pop("document_html", None))
if first_list:
args["section_id"] = self.get_last_list_item_id(first_list)
if not args.get("section_id"):
args["operation"] = self.APPEND
args["content"] = "\n\n".join([" * %s" % i for i in items])
return self.edit_document(**args)
def add_to_spreadsheet(self, thread_id, *rows, **kwargs):
"""Adds the given rows to the named (or first) spreadsheet in the
given document.
client = quip.QuipClient(...)
client.add_to_spreadsheet(thread_id, ["5/1/2014", 2.24])
"""
content = "".join(["
%s
" % "".join(
["
%s
" % cell for cell in row]) for row in rows])
if kwargs.get("name"):
spreadsheet = self.get_named_spreadsheet(kwargs["name"], thread_id)
else:
spreadsheet = self.get_first_spreadsheet(thread_id)
if kwargs.get("add_to_top"):
section_id = self.get_first_row_item_id(spreadsheet)
operation = self.BEFORE_SECTION
else:
section_id = self.get_last_row_item_id(spreadsheet)
operation = self.AFTER_SECTION
return self.edit_document(
thread_id=thread_id,
content=content,
section_id=section_id,
operation=operation)
def update_spreadsheet_row(self, thread_id, header, value, updates, **args):
"""Finds the row where the given header column is the given value, and
applies the given updates. Updates is a dict from header to
new value. In both cases headers can either be a string that matches, or
"A", "B", "C", 1, 2, 3 etc. If no row is found, adds a new one.
client = quip.QuipClient(...)
client.update_spreadsheet_row(
thread_id, "customer", "Acme", {"Billed": "6/24/2015"})
"""
response = None
if args.get("name"):
spreadsheet = self.get_named_spreadsheet(args["name"], thread_id)
else:
spreadsheet = self.get_first_spreadsheet(thread_id)
headers = self.get_spreadsheet_header_items(spreadsheet)
row = self.find_row_from_header(spreadsheet, header, value)
if row:
ids = self.get_row_ids(row)
for head, val in iteritems(updates):
index = self.get_index_of_header(headers, head)
if not index or index >= len(ids) or not ids[index]:
continue
response = self.edit_document(
thread_id=thread_id,
content=val,
format="markdown",
section_id=ids[index],
operation=self.REPLACE_SECTION,
**args)
else:
updates[header] = value
response = self.add_spreadsheet_row(
thread_id, spreadsheet, updates, headers=headers, **args)
return response
def add_spreadsheet_row(
self, thread_id, spreadsheet, updates, headers=None, **args):
if not headers:
headers = self.get_spreadsheet_header_items(spreadsheet)
indexed_items = {}
extra_items = []
for head, val in iteritems(updates):
index = self.get_index_of_header(
headers, head, default=None)
if index is None or index in indexed_items:
extra_items.append(val)
else:
indexed_items[index] = val
cells = []
if indexed_items:
for i in range(max(indexed_items.keys()) + 1):
if i in indexed_items:
cells.append(indexed_items[i])
elif len(extra_items):
cells.append(extra_items.pop(0))
else:
cells.append("")
cells.extend(extra_items)
content = "
%s
" % "".join(
["
%s
" % cell for cell in cells])
section_id = self.get_last_row_item_id(spreadsheet)
response = self.edit_document(
thread_id=thread_id,
content=content,
section_id=section_id,
operation=self.AFTER_SECTION,
**args)
return response
def toggle_checkmark(self, thread_id, item, checked=True):
"""Sets the checked state of the given list item to the given state.
client = quip.QuipClient(...)
list = client.get_first_list(thread_id)
client.toggle_checkmark(thread_id, list[0])
"""
if checked:
item.attrib["class"] = "checked"
else:
item.attrib["class"] = ""
return self.edit_document(thread_id=thread_id,
content=xml.etree.cElementTree.tostring(item),
section_id=item.attrib["id"],
operation=self.REPLACE_SECTION)
def get_first_list(self, thread_id=None, document_html=None):
"""Returns the `ElementTree` of the first list in the document.
The list can be any type (bulleted, numbered, or checklist).
If `thread_id` is given, we download the document. If you have
already downloaded the document, you can specify `document_html`
directly.
"""
return self._get_container(thread_id, document_html, "ul", 0)
def get_last_list(self, thread_id=None, document_html=None):
"""Like `get_first_list`, but the last list in the document."""
return self._get_container(thread_id, document_html, "ul", -1)
def get_section(self, section_id, thread_id=None, document_html=None):
if not document_html:
document_html = self.get_thread(thread_id).get("html")
if not document_html:
return None
tree = self.parse_document_html(document_html)
element = list(tree.iterfind(".//*[@id='%s']" % section_id))
if not element:
return None
return element[0]
def get_named_spreadsheet(self, name, thread_id=None, document_html=None):
if not document_html:
document_html = self.get_thread(thread_id).get("html")
if not document_html:
return None
tree = self.parse_document_html(document_html)
element = list(tree.iterfind(".//*[@title='%s']" % name))
if not element:
return None
return element[0]
def _get_container(self, thread_id, document_html, container, index):
if not document_html:
document_html = self.get_thread(thread_id).get("html")
if not document_html:
return None
tree = self.parse_document_html(document_html)
lists = list(tree.iter(container))
if not lists:
return None
try:
return lists[index]
except IndexError:
return None
def get_last_list_item_id(self, list_tree):
"""Returns the last item in the given list `ElementTree`."""
items = list(list_tree.iter("li"))
return items[-1].attrib["id"] if items else None
def get_first_list_item_id(self, list_tree):
"""Like `get_last_list_item_id`, but the first item in the list."""
for item in list_tree.iter("li"):
return item.attrib["id"]
return None
def get_first_spreadsheet(self, thread_id=None, document_html=None):
"""Returns the `ElementTree` of the first spreadsheet in the document.
If `thread_id` is given, we download the document. If you have
already downloaded the document, you can specify `document_html`
directly.
"""
return self._get_container(thread_id, document_html, "table", 0)
def get_last_spreadsheet(self, thread_id=None, document_html=None):
"""Like `get_first_spreadsheet`, but the last spreadsheet."""
return self._get_container(thread_id, document_html, "table", -1)
def get_last_row_item_id(self, spreadsheet_tree):
"""Returns the last row in the given spreadsheet `ElementTree`."""
items = list(spreadsheet_tree.iter("tr"))
return items[-1].attrib["id"] if items else None
def get_first_row_item_id(self, spreadsheet_tree):
"""Returns the last row in the given spreadsheet `ElementTree`."""
items = list(spreadsheet_tree.iter("tr"))
return items[1].attrib["id"] if items else None
def get_row_items(self, row_tree):
"""Returns the text of items in the given row `ElementTree`."""
return [(list(x.itertext()) or [None])[0] for x in row_tree]
def get_row_ids(self, row_tree):
"""Returns the ids of items in the given row `ElementTree`."""
return [x.attrib["id"] for x in row_tree]
def get_spreadsheet_header_items(self, spreadsheet_tree):
"""Returns the header row in the given spreadsheet `ElementTree`."""
return self.get_row_items(list(spreadsheet_tree.iterfind(".//tr"))[0])
def get_index_of_header(self, header_items, header, default=0):
"""Find the index of the given header in the items"""
if header:
header = str(header)
lower_headers = [str(h).lower() for h in header_items]
if header in header_items:
return header_items.index(header)
elif header.lower() in lower_headers:
return lower_headers.index(header.lower())
elif header.isdigit():
return int(header)
elif len(header) == 1:
char = ord(header.upper())
if ord('A') < char < ord('Z'):
return char - ord('A') + 1
else:
pass
return default
def find_row_from_header(self, spreadsheet_tree, header, value):
"""Find the row in the given spreadsheet `ElementTree` where header is
value.
"""
headers = self.get_spreadsheet_header_items(spreadsheet_tree)
index = self.get_index_of_header(headers, header)
for row in spreadsheet_tree.iterfind(".//tr"):
if len(row) <= index:
continue
cell = row[index]
if cell.tag != "td":
continue
if list(cell.itertext())[0].lower() == value.lower():
return row
def parse_spreadsheet_contents(self, spreadsheet_tree):
"""Returns a python-friendly representation of the given spreadsheet
`ElementTree`
"""
import collections
spreadsheet = {
"id": spreadsheet_tree.attrib.get("id"),
"headers": self.get_spreadsheet_header_items(spreadsheet_tree),
"rows": [],
}
for row in spreadsheet_tree.iterfind(".//tr"):
value = {
"id": row.attrib.get("id"),
"cells": collections.OrderedDict(),
}
for i, cell in enumerate(row):
if cell.tag != "td":
continue
data = {
"id": cell.attrib.get("id"),
}
images = list(cell.iter("img"))
if images:
data["content"] = images[0].attrib.get("src")
else:
data["content"] = list(cell.itertext())[0].replace(
u"\u200b", "")
style = cell.attrib.get("style")
if style and "background-color:#" in style:
sharp = style.find("#")
data["color"] = style[sharp + 1:sharp + 7]
value["cells"][spreadsheet["headers"][i]] = data
if len(value["cells"]):
spreadsheet["rows"].append(value)
return spreadsheet
def parse_document_html(self, document_html):
"""Returns an `ElementTree` for the given Quip document HTML"""
document_xml = "" + document_html + ""
return xml.etree.cElementTree.fromstring(document_xml.encode("utf-8"))
def parse_micros(self, usec):
"""Returns a `datetime` for the given microsecond string"""
return datetime.datetime.utcfromtimestamp(usec / 1000000.0)
def get_blob(self, thread_id, blob_id):
"""Returns a file-like object with the contents of the given blob from
the given thread.
The object is described in detail here:
https://docs.python.org/2/library/urllib2.html#urllib2.urlopen
"""
request = Request(
url=self._url("blob/%s/%s" % (thread_id, blob_id)))
if self.access_token:
request.add_header("Authorization", "Bearer " + self.access_token)
try:
return urlopen(request, timeout=self.request_timeout)
except HTTPError as error:
try:
# Extract the developer-friendly error message from the response
message = json.loads(error.read().decode())["error_description"]
except Exception:
raise error
raise QuipError(error.code, message, error)
def put_blob(self, thread_id, blob, name=None):
"""Uploads an image or other blob to the given Quip thread. Returns an
ID that can be used to add the image to the document of the thread.
blob can be any file-like object. Requires the 'requests' module.
"""
import requests
url = "blob/" + thread_id
headers = None
if self.access_token:
headers = {"Authorization": "Bearer " + self.access_token}
if name:
blob = (name, blob)
try:
response = requests.request(
"post", self._url(url), timeout=self.request_timeout,
files={"blob": blob}, headers=headers)
response.raise_for_status()
return response.json()
except requests.RequestException as error:
try:
# Extract the developer-friendly error message from the response
message = error.response.json()["error_description"]
except Exception:
raise error
raise QuipError(error.response.status_code, message, error)
def new_websocket(self, **kwargs):
"""Gets a websocket URL to connect to.
"""
return self._fetch_json("websockets/new", **kwargs)
def _fetch_json(self, path, post_data=None, **args):
request = Request(url=self._url(path, **args))
if post_data:
post_data = dict((k, v) for k, v in post_data.items()
if v or isinstance(v, int))
request_data = urlencode(self._clean(**post_data))
if PY3:
request.data = request_data.encode()
else:
request.data = request_data
if self.access_token:
request.add_header("Authorization", "Bearer " + self.access_token)
try:
return json.loads(
urlopen(
request, timeout=self.request_timeout).read().decode())
except HTTPError as error:
try:
# Extract the developer-friendly error message from the response
message = json.loads(error.read().decode())["error_description"]
except Exception:
raise error
raise QuipError(error.code, message, error)
def _clean(self, **args):
return dict((k, str(v) if isinstance(v, int) else v.encode("utf-8"))
for k, v in args.items() if v or isinstance(v, int))
def _url(self, path, **args):
url = self.base_url + "/1/" + path
args = self._clean(**args)
if args:
url += "?" + urlencode(args)
return url
================================================
FILE: commands/apps/quip/quip_config.chezmoi.template.ini
================================================
# Template example for creating quip_config.ini with chezmoi
# (https://www.chezmoi.io/) using values stored in KeePassXC. I use this
# template to generate my personal configuration file. I keep in KeepassXC two
# items:
#
# - "Quip personal token", which contains my API token in the Password field,
# and has two custom attributes named "BaseURL" and "APIURL", which are used
# to populate the corresponding fields below.
#
# - "Quip documents", which contains custom attributes for the FolderID,
# TemplateID and DocID values for all sections. For example, the FolderID for
# "Note" items is called "Note.FolderID".
#
# You need to configure chezmoi to know where to find your KeePassXC database,
# and your Keyfile if you use one. My config file ~/.config/chezmoi/chezmoi.toml
# looks like this:
#
# [keepassxc]
# database = "/path/to/my/KeePassXC/Passwords.kdbx"
# args = ["-k", "/path/to/my/KeePassXC/keyfile.keyx"]
#
# If you don't use chezmoi for all your dotfiles, you can generate a single file
# by running chezmoi like this:
#
# chezmoi execute-template -o quip_config.ini < quip_config.chezmoi.template.ini
#
# Note: if you use 1Password, you can also use chezmoi, or use the native `op
# inject` (https://developer.1password.com/docs/cli/reference/commands/inject/)
# Values in the DEFAULT section are inherited for all the other sections, but
# you can override any of them in the individual sections below.
[DEFAULT]
###
### Authentication
###
# Quip API token. Get one at https://quip.com/api/personal-token
APIToken = {{ (keepassxc "Quip personal token").Password }}
###
### Behaviors for document creation
###
# Prepend date to the title of new documents?
PrependDate = yes
# Whether to automatically open the created documents
OpenDoc = yes
# Whether to copy the URL of newly created documents to the clipboard
CopyURLToClipboard = no
# Whether to open documents in the app or in the browser
UseQuipApp = yes
# Default values for Raycast command metadata
CommandTitle = New ${section} in Quip
CommandArgPlaceholder = ${section} title
# You can set a default FolderID here. If not set, new documents are placed
# in your top-level "Private" Quip folder
# FolderID =
# Default action, can be "create" or "add"
Action = create
# Produce a notification at the end?
Notify = no
# Whether the command should accept an empty argument and in that case just open
# the document (this applies only to 'add' actions)
OpenDocIfEmptyArg = no
###
### URLs. Defaults should be OK for most users.
###
# Quip base URL to use
BaseURL = {{ keepassxcAttribute "Quip personal token" "BaseURL" }}
# Quip API URL to use
APIURL = {{ keepassxcAttribute "Quip personal token" "APIURL" }}
###
### Each section below defines a new "document type", which can be stored in
### different folders and override any of the defaults.
###
### The section names are arbitrary, and you should define at least the FolderID
### attribute for each of them (but it's not mandatory)
### The document/folder IDs can be obtained by using the "Copy Link" menu
### option in Quip. The ID is the part that comes right after the hostname
### in the URL. For example: https://quip.com/A7RmAB1oNeuL
###
### Below custom sections for different document types
## First the 'create' actions, which create new documents in different folders,
## with different templates.
[doc]
# Document without a folder, created in the default location.
[Note]
# Quip Folder ID for general notes.
FolderID = {{ keepassxcAttribute "Quip documents" "Note.FolderID" }}
[Meeting notes]
# Quip Folder ID for meeting notes.
FolderID = {{ keepassxcAttribute "Quip documents" "Meetings.FolderID" }}
# Meeting notes template
TemplateID = {{ keepassxcAttribute "Quip documents" "Meetings.TemplateID" }}
# Some custom metadata for the Raycast command
CommandArgPlaceholder = Meeting title
[Project page]
# Quip Folder ID for project pages
FolderID = {{ keepassxcAttribute "Quip documents" "Project.FolderID" }}
# Project notes template
TemplateID = {{ keepassxcAttribute "Quip documents" "Project.TemplateID" }}
# Project don't get the date prepended
PrependDate = no
# Metadata for the Raycast command
CommandArgPlaceholder = Project name
[Training/course notes]
FolderID = {{ keepassxcAttribute "Quip documents" "Training.FolderID" }}
## Now the 'add' actions, which add text to an existing document. These sections
## will not work until you add the appropriate 'DocID' parameter.
# Command to add todo items to an existing Quip document.
[TODO]
action = add
# The ID of the document where the text should be added
DocID = {{ keepassxcAttribute "Quip documents" "TODO.DocID" }}
# Prepend the date to the text?
PrependDate = no
# Produce a notification and don't open the doc. But if an empty argument is
# given, open the document.
Notify = yes
OpenDoc = no
OpenDocIfEmptyArg = yes
# Add the text as a list item? Value can be "todo", "bullet" or "num". Anything
# else adds is as regular text. Note that the text you add can contain Markdown
# markup.
ListType = todo
# Command to add items to a "brag document" (a doc where I keep a record of my
# accomplishments).
[BRAG item]
action = add
# The ID of the document where the text should be added
DocID = {{ keepassxcAttribute "Quip documents" "BRAG.DocID" }}
# Prepend the date to the text?
PrependDate = yes
# Produce a notification and don't open the doc. But if an empty argument is
# given, open the document.
Notify = yes
OpenDoc = no
OpenDocIfEmptyArg = yes
# Add the text as a list item? Value can be "todo", "bullet" or "num". Anything
# else adds is as regular text. Note that the text you add can contain Markdown
# markup.
ListType = none
# Metadata for the Raycast command
CommandArgPlaceholder = BRAG text
================================================
FILE: commands/apps/quip/quip_config.template.ini
================================================
# You must configure at least the APIToken in the DEFAULT section.
#
# Please note: Do NOT quote values in this file.
# Values in the DEFAULT section are inherited for all the other sections, but
# you can override any of them in the individual sections below.
[DEFAULT]
###
### Authentication
###
# Quip API token. Get one at https://quip.com/api/personal-token
APIToken =
###
### Behaviors for document creation
###
# Prepend date to the title of new documents?
PrependDate = yes
# Whether to automatically open the created documents
OpenDoc = yes
# Whether to copy the URL of newly created documents to the clipboard
CopyURLToClipboard = no
# Whether to open documents in the app or in the browser
UseQuipApp = yes
# Default values for Raycast command metadata
CommandTitle = New ${section} in Quip
CommandArgPlaceholder = ${section} title
# You can set a default FolderID here. If not set, new documents are placed
# in your top-level "Private" Quip folder
# FolderID =
# Default action, can be "create" or "add"
Action = create
# Produce a notification at the end?
Notify = no
# Whether the command should accept an empty argument and in that case just open
# the document (this applies only to 'add' actions)
OpenDocIfEmptyArg = no
###
### URLs. Defaults should be OK for most users.
###
# Quip base URL to use
BaseURL = https://quip.com/
# Quip API URL to use
APIURL = https://platform.quip.com
###
### Each section below defines a new "document type", which can be stored in
### different folders and override any of the defaults.
###
### The section names are arbitrary, and you should define at least the FolderID
### attribute for each of them (but it's not mandatory)
### The document/folder IDs can be obtained by using the "Copy Link" menu
### option in Quip. The ID is the part that comes right after the hostname
### in the URL. For example: https://quip.com/A7RmAB1oNeuL
###
### Below custom sections for different document types
## First the 'create' actions, which create new documents in different folders,
## with different templates.
[doc]
# Document without a folder, created in the default location.
[Note]
# Quip Folder ID for general notes.
# FolderID =
[Meeting notes]
# Quip Folder ID for meeting notes.
# FolderID =
# Meeting notes template, if you want to use one
# TemplateID =
# Some custom metadata for the Raycast command
CommandArgPlaceholder = Meeting title
[Project page]
# Quip Folder ID for project pages
# FolderID =
# Project notes template
# TemplateID =
# Project don't get the date prepended
PrependDate = no
# Metadata for the Raycast command
CommandArgPlaceholder = Project name
[Training/course notes]
# Quip folder ID for storing course notes
# FolderID =
## Now the 'add' actions, which add text to an existing document. These sections
## will not work until you add the appropriate 'DocID' parameter.
# Command to add todo items to an existing Quip document.
[TODO]
action = add
# The ID of the document where the text should be added
# THIS PARAMETER IS MANDATORY for 'add' actions.
# DocID =
# Prepend the date to the text?
PrependDate = no
# Produce a notification and don't open the doc. But if an empty argument is
# given, open the document.
Notify = yes
OpenDoc = no
OpenDocIfEmptyArg = yes
# Add the text as a list item? Value can be "todo", "bullet" or "num". Anything
# else adds is as regular text. Note that the text you add can contain Markdown
# markup.
ListType = todo
# Command to add items to a "brag document" (a doc where I keep a record of my
# accomplishments).
[BRAG item]
action = add
# The ID of the document where the text should be added
# THIS PARAMETER IS MANDATORY for 'add' actions.
# DocID =
# Prepend the date to the text?
PrependDate = yes
# Produce a notification and don't open the doc. But if an empty argument is
# given, open the document.
Notify = yes
OpenDoc = no
OpenDocIfEmptyArg = yes
# Add the text as a list item? Value can be "todo", "bullet" or "num". Anything
# else adds is as regular text. Note that the text you add can contain Markdown
# markup.
ListType = none
# Metadata for the Raycast command
CommandArgPlaceholder = BRAG text
================================================
FILE: commands/apps/quip/quip_utils.py
================================================
#!/usr/bin/env python3
#
# Utility library for interacting with the Quip API and for other common
# functions.
#
# Diego Zamboni
import quip
import os
import sys
import subprocess
import re
from datetime import datetime
from configparser import ConfigParser, ExtendedInterpolation
config = None
config_file = "quip_config.ini"
# Custom config interpolation class that allows interpolating the current
# section name.
# Code from https://stackoverflow.com/a/47360765
class ExtendedSectionInterpolation(ExtendedInterpolation):
def before_get(self, parser, section, option, value, defaults):
defaults.maps.append({'section': section})
return super().before_get(parser, section, option, value, defaults)
# Print error message and exit with a non-zero code.
def fail(message):
red = "\u001b[31m"
print(red + message)
sys.exit(1)
# Produce a macOS notification message
def notify(title, text):
CMD = '''
on run argv
display notification (item 2 of argv) with title (item 1 of argv)
end run
'''
subprocess.call(['osascript', '-e', CMD, title, text])
# Read configuration file into global config variable.
def readConfig(filename=config_file):
global config
config = ConfigParser(interpolation=ExtendedSectionInterpolation())
files_read = config.read(filename)
if filename not in files_read:
fail(f"Could not read config file '{filename}'.")
# Check whether the APIToken field has a non-empty value and exit if it doesn't.
# Does not verify that it's valid.
def checkAPIToken(doc_type):
if config[doc_type].get('APIToken', "") == "":
fail(f"Error: Please configure APIToken in {config_file}.")
# Put a string in the macOS clipboard using the pbcopy command.
#
# Function originally from
# https://gist.github.com/XuankangLin/7ec82f80a0044a52330720244de2d15a modified
# to automatically call encode('utf_8') on its argument, with the assumption
# that it's a string.
def setClipboardData(text):
p = subprocess.Popen(['pbcopy'], stdin=subprocess.PIPE)
p.stdin.write(text.encode('utf_8'))
p.stdin.close()
retcode = p.wait()
def quip_open(thing, doc_type='DEFAULT'):
# thing can be a DocID or a URL. DocIDs are 11 or 12 characters long
if len(thing) in [11,12]:
url = config[doc_type].get('BaseURL', 'https://quip.com/') + thing
else:
url = thing
app_args=[]
if config[doc_type].getboolean('UseQuipApp'):
app_args=["-a", "Quip"]
try:
open_args=["/usr/bin/open", *app_args, url]
# We use Popen to put the open process in the background.
pid = subprocess.Popen(open_args).pid
except OSError as e:
fail(f"Execution failed: {e}")
# Normalize a string by lowercasing and replacing whitespace with dashes.
def normalize(s):
return re.sub('\W+', '-', s.lower())
# Create a new document in Quip.
#
# The document is created according to the configuration associated with the
# given doc_type. This indicates parameters such as the APIToken to use, whether
# to prepend the current date to the text, and the folder in which the document
# should be stored. See quip_config.ini for the full list of available
# configuration parameters.
#
def quip_new_doc(doc_type, text):
readConfig()
if not config.has_section(doc_type):
# Map section names to their "normalized" variants used in the filenames
denormalized_types = {}
for t in config.sections():
denormalized_types[normalize(t)] = t
if doc_type in denormalized_types:
doc_type = denormalized_types[doc_type]
else:
fail(f"Error: Quip document type '{doc_type}' is not defined in {config_file}.")
checkAPIToken(doc_type)
# Prepend date to the text if needed
if text and config[doc_type].getboolean('PrependDate'):
dateformat = config[doc_type].get('DateFormat', "%Y-%m-%d")
text = datetime.now().strftime(dateformat) + " " + text
# What to do?
action = config[doc_type].get('action', 'create')
# Notification message to produce at the end
message_title = ""
message_body = ""
try:
client = quip.QuipClient(access_token=config[doc_type]['APIToken'], base_url=config[doc_type]['APIURL'])
if action == 'create':
# print(f"Creating new note '{text}' in folder {folder_id}...")
folders = []
folderID = config[doc_type].get('FolderID',None)
if folderID:
folders = [folderID]
templateID = config[doc_type].get('TemplateID', None)
# If TemplateID is given, use it to create the doc, otherwise create an empty one
if templateID:
result = client.copy_document(templateID, folder_ids=[folderID], title=text)
else:
result = client.new_document(content=text, format="markdown", member_ids=folders)
message_title = f"New {doc_type} created"
message_body = message_title
elif action == 'add':
listmarkup = { "todo": "[] ", "bullet": "- ", "num": "1. " }
listtype = config[doc_type].get('ListType', 'none')
docid = config[doc_type].get('DocID', None)
if not docid:
fail(f"Error: no DocID provided, needed for 'add' action.")
if text:
if listtype in listmarkup:
text = listmarkup[listtype] + text
result = client.edit_document(docid, text, format='markdown', section_id='')
message_title = f"New {doc_type} added to document"
message_body = message_title
else:
if config[doc_type].getboolean('OpenDocIfEmptyArg'):
message_title = f"Opening {doc_type} document"
quip_open(docid, doc_type)
sys.exit(0)
else:
fail(f"Error: Invalid action value '{action}', should be 'create' or 'add'.")
except Exception as e:
if e.code == 401:
fail(f"Please configure/verify your Quip API token in {config_file}")
elif e.code == 400:
fail(f"Please configure/verify folder ID for [{doc_type}] in {config_file}")
else:
fail(f"Received a Quip error:", e, file=sys.stderr)
if result:
url = result['thread']['link']
if url:
if config[doc_type].getboolean('CopyURLToClipboard'):
setClipboardData(url)
message_body = message_body + f", URL copied to clipboard"
if config[doc_type].getboolean('OpenDoc'):
message_body = message_body + f", opening {url}"
quip_open(url, doc_type)
message_body = message_body + "."
print(message_body)
if config[doc_type].getboolean('Notify'):
notify(message_title, message_body)
else:
fail(f"Something went wrong, could not get the document URL.")
else:
fail(f"Something went wrong, could not create document.")
================================================
FILE: commands/apps/quip/set-up-quip-commands.py
================================================
#!/usr/bin/env python3
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Set up Quip commands
# @raycast.mode fullOutput
# Optional parameters:
# @raycast.icon /Applications/Quip.app/Contents/Resources/AppIcon.icns
# @raycast.packageName Quip utilities
# @raycast.needsConfirmation true
# Documentation:
# @raycast.description Create script commands for creating Quip documents, based on the configuration in quip_config.ini.
# @raycast.author diego_zamboni
# @raycast.authorURL https://raycast.com/diego_zamboni
import quip_utils
import os
import glob
# Read template
cmd_template="quip-new.template.py"
with open(cmd_template, 'r') as file:
template = file.read()
blue = "\u001b[34m"
yellow = "\u001b[33m"
green = "\u001b[32m"
red = "\u001b[31m"
print(f"Reading quip_config.ini...")
quip_utils.readConfig()
doc_types = quip_utils.config.sections()
quip_utils.checkAPIToken('DEFAULT')
print(blue + f"The configuration file contains the following document types: {' '.join(doc_types)}")
print(yellow + f"Removing old scripts before creating new ones...")
for file in glob.glob("quip-new-*.py"):
print(yellow + f" {file}")
os.remove(file)
for type in doc_types:
new_script = template
normalized_type = quip_utils.normalize(type)
filename = f"quip-new-{normalized_type}.py"
print(blue + f"Creating script for '{type}': ", end="")
# Replace config values in template
template_values = {}
for k,v in quip_utils.config[type].items():
# If it's a boolean value, convert it to a JSON-style boolean (i.e. "true" or "false", all lowercase)
if v in quip_utils.config.BOOLEAN_STATES.keys():
v = str(quip_utils.config[type].getboolean(k)).lower()
template_k = "{{" + k + "}}"
new_script = new_script.replace(template_k, v)
with open(filename, 'w') as file:
file.write(new_script)
print(f"{green}{filename}")
================================================
FILE: commands/apps/raycast/celebrate.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Celebrate
# @raycast.mode silent
# Optional parameters:
# @raycast.icon 🎉
# @raycast.argument1 { "type": "text", "placeholder": "Times (Default: 1)", "optional": true }
# @raycast.argument2 { "type": "text", "placeholder": "Interval (Default: 0)", "optional": true }
# @raycast.packageName Raycast
# Documentation:
# @raycast.description Set Confetti to run for a number of times and during intervals
# @raycast.author Fatpandac
# @raycast.authorURL https://github.com/Fatpandac
times=1
interval=0
if [ -n "$1" ]; then
times=$1
fi
if [ -n "$2" ]; then
interval=$(($2))
fi
for i in $(seq 1 $times); do
open raycast://confetti
echo "Celebrate 🎉"
sleep $interval
done
================================================
FILE: commands/apps/reminders/reminders-create-reminder.sh
================================================
#!/bin/bash
# Dependency: This script requires `Quick reminder for Raycast` installed:
https://www.icloud.com/shortcuts/62a0cedf7bce488eb0bde4b8a3a8b0de
# @raycast.title Add Reminder
# @raycast.author Andrei Nedelcu
# @raycast.authorURL https://dinosaurgame.net
# @raycast.description Add a new reminder.
#
# @raycast.icon images/reminders.png
#
# @raycast.mode silent
# @raycast.packageName Create Reminder
# @raycast.schemaVersion 1
# @raycast.argument1 { "type": "text", "placeholder": "What", "percentEncoded": false}
# @raycast.argument2 { "type": "text", "placeholder": "When", "optional": true, "percentEncoded": false}
if test -z "$2"
then
echo "${1}" | shortcuts run "Quick reminder for Raycast"
else
echo "${1}, ${2}" | shortcuts run "Quick reminder for Raycast"
fi
echo "Reminder created!"
================================================
FILE: commands/apps/safari/README.md
================================================
Safari
Add a few missing actions to make tab management easier in Safari.

================================================
FILE: commands/apps/safari/safari-bing-edge-user-agent.applescript
================================================
#!/usr/bin/osascript
# Check "Safari > Advanced > Develop" first.
# This script works on the English Safari menu.
# @raycast.title Open Bing with Edge User-Agent
# @raycast.description Open Bing in Safari with Edge User-Agent
# @raycast.author smxl
# @raycast.authorURL https://github.com/smxl
# @raycast.icon images/safari.png
# @raycast.mode silent
# @raycast.packageName Safari
# @raycast.schemaVersion 1
tell application "Safari"
activate
set theURL to "https://www.bing.com"
set newTab to make new tab at end of tabs of window 1
set current tab of window 1 to newTab
set theUserAgent to "Microsoft Edge ¡ª MacOS"
set URL of newTab to theURL
tell application "System Events"
tell process "Safari"
click menu item theUserAgent of menu "User Agent" of menu item "User Agent" of menu "Develop" of menu bar 1
end tell
end tell
end tell
================================================
FILE: commands/apps/safari/safari-clear-cache-reload.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Clear Cache and Refresh Page
# @raycast.mode silent
#
# Optional parameters:
# @raycast.packageName Safari
# @raycast.icon images/safari.png
#
# Documentation:
# @raycast.description This script clears cache and reloads the page of the frontmost Safari window.
# @raycast.author Aaron Miller
# @raycast.authorURL https://github.com/aaronhmiller
tell application "Safari" to activate
tell application "System Events" to keystroke "r" using {option down, command down} --warning: undocumented can change w/o notice
================================================
FILE: commands/apps/safari/safari-close-all-tabs.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Close All Tabs
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName Safari
# @raycast.icon images/safari.png
# @Documentation:
# @raycast.author Thomas Paul Mann
# @raycast.authorURL https://github.com/thomaspaulmann
# @raycast.description Close all tabs in the frontmost window
tell window 1 of application "Safari" to close tabs
================================================
FILE: commands/apps/safari/safari-close-duplicated-tabs.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Close Duplicated Tabs
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName Safari
# @raycast.icon images/safari.png
# @Documentation:
# @raycast.author Thomas Paul Mann
# @raycast.authorURL https://github.com/thomaspaulmann
# @raycast.description Close tabs with the same URL.
tell window 1 of application "Safari"
set visitedURLs to {}
set closedTabs to 0
set allTabs to tabs
repeat with i from length of allTabs to 1 by -1
set currentTab to item i of allTabs
set currentURL to URL of currentTab
if visitedURLs contains currentURL then
close currentTab
set closedTabs to closedTabs + 1
else
copy currentURL to end of visitedURLs
end if
end repeat
if closedTabs is equal to 1 then
log "Closed 1 duplicated tab"
else if closedTabs is greater than 1 then
log "Closed " & closedTabs & " duplicated tab"
else
log "No duplicated tabs found"
end if
end
================================================
FILE: commands/apps/safari/safari-close-other-tabs.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Close Other Tabs
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName Safari
# @raycast.icon images/safari.png
# @Documentation:
# @raycast.author Thomas Paul Mann
# @raycast.authorURL https://github.com/thomaspaulmann
# @raycast.description Close all tabs besides the currently active tab.
tell window 1 of application "Safari"
set currentTab to get index of current tab
close tabs where index is not equal to currentTab
end
================================================
FILE: commands/apps/safari/safari-close-tabs-left.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Close Tabs to the Left
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName Safari
# @raycast.icon images/safari.png
# @Documentation:
# @raycast.author Thomas Paul Mann
# @raycast.authorURL https://github.com/thomaspaulmann
# @raycast.description Close all tabs to the left side of the currently active tab.
tell window 1 of application "Safari"
set currentTab to get index of current tab
close tabs where index is less than currentTab
end
================================================
FILE: commands/apps/safari/safari-close-tabs-right.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Close Tabs to the Right
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName Safari
# @raycast.icon images/safari.png
# @Documentation:
# @raycast.author Thomas Paul Mann
# @raycast.authorURL https://github.com/thomaspaulmann
# @raycast.description Close all tabs to the right side of the currently active tab.
tell window 1 of application "Safari"
set currentTab to get index of current tab
close tabs where index is greater than currentTab
end
================================================
FILE: commands/apps/safari/safari-create-reading-list-item.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Add Item to Reading List
# @raycast.mode fullOutput
# Optional parameters:
# @raycast.packageName Safari
# @raycast.icon images/safari.png
# @raycast.argument1 { "type": "text", "placeholder": "Link" }
# @raycast.argument2 { "type": "text", "placeholder": "Title", "optional": true }
# @Documentation:
# @raycast.author Thomas Paul Mann
# @raycast.authorURL https://github.com/thomaspaulmann
# @raycast.description Add a new Reading List item with the given URL. Allows a custom title to be specified.
on run argv
try
set linkArgument to item 1 of argv as text
set titleArgument to item 2 of argv as text
if titleArgument is equal to "" then
tell application "Safari" to add reading list item linkArgument
else
tell application "Safari" to add reading list item linkArgument with title titleArgument
end if
log "Added item to reading list"
on error errorMessage number errorNumber
log errorMessage
log "Failed to add item to reading list"
return errorNumber
end try
end run
================================================
FILE: commands/apps/safari/safari-current-page-url-in-chrome.applescript
================================================
#!/usr/bin/osascript
# @raycast.title Open Safari URL in Chrome
# @raycast.description Open current Safari URL in new tab in Chrome
# @raycast.author Dave Lehman
# @raycast.authorURL https://github.com/dlehman
# @raycast.icon images/safari.png
# @raycast.mode silent
# @raycast.packageName Safari
# @raycast.schemaVersion 1
tell application "Safari"
set safariUrl to URL of front document
end tell
tell application "Google Chrome"
activate
delay 0.5
tell front window to make new tab at after (get active tab) with properties {URL:safariUrl} -- open a new tab after the current tab
activate
end tell
================================================
FILE: commands/apps/safari/safari-current-page-url-in-firefox.applescript
================================================
#!/usr/bin/osascript
# @raycast.title Open Safari URL in Firefox
# @raycast.description Open current Safari URL in new tab in Firefox
# @raycast.author Dave Lehman
# @raycast.authorURL https://github.com/dlehman
# @raycast.icon images/safari.png
# @raycast.mode silent
# @raycast.packageName Safari
# @raycast.schemaVersion 1
tell application "Safari"
set safariUrl to URL of front document
end tell
tell application "Firefox"
activate
delay 0.5
open location safariUrl
activate
end tell
================================================
FILE: commands/apps/safari/safari-download-url.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Download Current URL
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName Safari
# @raycast.icon images/safari.png
# @Documentation:
# @raycast.author Michael Bianco
# @raycast.authorURL https://github.com/iloveitaly
# @raycast.description Download the currently active tab's URL.
tell application "Safari"
activate
set currentTab to current tab of window 1
set theURL to URL of currentTab
end tell
-- Simulate pressing Option key and clicking the link
tell application "System Events"
keystroke "l" using {command down} -- Select the address bar (Cmd + L)
delay 0.5
keystroke return using {option down} -- Press Option + Return to download the file
end tell
================================================
FILE: commands/apps/safari/safari-duplicate-tab.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Duplicate Tab
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName Safari
# @raycast.icon images/safari.png
# @Documentation:
# @raycast.author Thomas Paul Mann
# @raycast.authorURL https://github.com/thomaspaulmann
# @raycast.description Duplicates and opens the currently active tab.
tell window 1 of application "Safari"
set currentURL to get URL of current tab
set newTab to make new tab with properties { URL: currentURL }
set current tab to newTab
end
================================================
FILE: commands/apps/session/session-abandon.sh
================================================
#!/bin/bash
# Dependency: This script requires `Session X v2.1.6` installed: https://www.stayinsession.com/
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Abandon Session
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/session.png
# @raycast.packageName Session
# @Documentation:
# @raycast.description Starts a focus session in Session app
# @raycast.author James Lyons
# @raycast.authorURL https://github.com/jamesjlyons
open "session:///abandon"
================================================
FILE: commands/apps/session/session-finish.sh
================================================
#!/bin/bash
# Note: Session X v2.1.6 required: https://www.stayinsession.com/
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Finish Session
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/session.png
# @raycast.packageName Session
# @Documentation:
# @raycast.description Finishes a focus session in Session app
# @raycast.author James Lyons
# @raycast.authorURL https://github.com/jamesjlyons
open "session:///finish"
================================================
FILE: commands/apps/session/session-pause.sh
================================================
#!/bin/bash
# Note: Session X v2.1.6 required: https://www.stayinsession.com/
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Pause Session
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/session.png
# @raycast.packageName Session
# @Documentation:
# @raycast.description Starts a focus session in Session app
# @raycast.author James Lyons
# @raycast.authorURL https://github.com/jamesjlyons
open "session:///pause"
================================================
FILE: commands/apps/session/session-start-new.sh
================================================
#!/bin/bash
# Note: Session X v2.1.6 required: https://www.stayinsession.com/
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Start Session
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/session.png
# @raycast.packageName Session
# @Documentation:
# @raycast.description Starts a focus session in Session app
# @raycast.author James Lyons
# @raycast.authorURL https://github.com/jamesjlyons
# @raycast.argument1 { "type": "text", "placeholder": "Intent", "optional": true, "percentEncoded": true }
# @raycast.argument2 { "type": "text", "placeholder": "Minutes duration", "optional": true }
open "session:///start?intent=${1}&duration=${2}"
================================================
FILE: commands/apps/session/session-start-previous.sh
================================================
#!/bin/bash
# Note: Session X v2.1.6 required: https://www.stayinsession.com/
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Start Previous Session
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/session.png
# @raycast.packageName Session
# @Documentation:
# @raycast.description Starts a focus session in Session app with the previous intent and duration
# @raycast.author James Lyons
# @raycast.authorURL https://github.com/jamesjlyons
open "session:///start-previous"
================================================
FILE: commands/apps/sidenotes/sidenotes-create-note.applescript
================================================
#!/usr/bin/osascript
# Dependency: Requires SideNotes (https://apptorium.com/sidenotes)
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title SideNotes create
# @raycast.mode silent
# @raycast.packageName SideNotes
# Optional parameters:
# @raycast.packageName SideNotes
# @raycast.icon images/sidenotes.png
# @raycast.argument1 { "type": "text", "placeholder": "Note", "optional": true }
# @raycast.argument2 { "type": "text", "placeholder": "Folder", "optional": true }
# Documentation:
# @raycast.description Create a new note within the selected or the first SideNotes folder.
# @raycast.author Marcel Bochtler
# @raycast.authorURL https://github.com/MarcelBochtler
on run argv
if application "SideNotes" is not running then
log "SideNotes is not running"
return
end if
tell application "SideNotes"
set note_content to item 1 of argv
set folder_name to item 2 of argv
# Create a folder if none exist
if (count of folders) is 0 then
if folder_name is "" then
make new folder with properties {name:note_content}
else
make new folder with properties {name:folder_name}
end if
end if
set folder_index to my index_of_folder(folder_name, folders)
if folder_index is -1 then
# Folder not found. Create one if the name is given.
# Otherwise create the note in the current or the first folder.
if folder_name is not "" then
set target_folder to make new folder with properties {name:folder_name}
else
if current folder is missing value then
set target_folder to first folder
else
set target_folder to current folder
end if
end if
else
set target_folder to item folder_index of folders
end if
set created_note to make new note in target_folder at 1 with properties {text:note_content}
open folder target_folder note created_note
log "Note created in folder " & (name of target_folder)
end tell
end run
on index_of_folder(folder_name, folder_list)
repeat with i from 1 to the count of folder_list
if name of item i of folder_list is folder_name then return i
end repeat
return -1
end index_of_folder
================================================
FILE: commands/apps/sip/sip-add-hex-color.sh
================================================
#!/bin/bash
# Note: Sip X v2.5.3 required
# Install from https://sipapp.io
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Add Color to History
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ./images/sip.png
# @raycast.packageName Sip
# Documentation:
# @raycast.author Sip
# @raycast.authorURL https://twitter.com/sip_app/
# @raycast.description Add a color to your Sip history.
# @raycast.argument1 { "type": "text", "placeholder": "Name" }
# @raycast.argument2 { "type": "text", "placeholder": "HEX" }
open "sip://color/hex/${1}/#"${2//#}"
================================================
FILE: commands/apps/sip/sip-check-contrast-hex.sh
================================================
#!/bin/bash
# Note: Sip X v2.5.3 required
# Install from https://sipapp.io
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Check Contrast
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ./images/sip.png
# @raycast.packageName Sip
# Documentation:
# @raycast.author Sip
# @raycast.authorURL https://twitter.com/sip_app/
# @raycast.description Open Sip Contrast Checker.
# @raycast.argument1 { "type": "text", "placeholder": "HEX 1" }
# @raycast.argument2 { "type": "text", "placeholder": "HEX 2" }
open "sip://contrast/hex/"${1//#}","${2//#}""
================================================
FILE: commands/apps/sip/sip-open-check-contrast.sh
================================================
#!/bin/bash
# Note: Sip X v2.5.3 required
# Install from https://sipapp.io
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open Contrast Checker
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ./images/sip.png
# @raycast.packageName Sip
# Documentation:
# @raycast.author Sip
# @raycast.authorURL https://twitter.com/sip_app/
# @raycast.description Open Sip Contrast Checker.
open "sip://contrast"
================================================
FILE: commands/apps/sip/sip-show-picker.sh
================================================
#!/bin/bash
# Note: Sip X v2.5.3 required
# Install from https://sipapp.io
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Show Color Picker
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ./images/sip.png
# @raycast.packageName Sip
# Documentation:
# @raycast.author Sip
# @raycast.authorURL https://twitter.com/sip_app/
# @raycast.description Pick a color value from your screen.
open "sip://picker"
================================================
FILE: commands/apps/stickies/new-floating-sticky.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title New Floating Sticky Note
# @raycast.mode silent
# @raycast.packageName Stickies
# Optional parameters:
# @raycast.icon images/stickies.png
# Documentation:
# @raycast.description This script creates a new floating note in the Apple Stickies application
# @raycast.author Annie Ma
# @raycast.authorURL http://www.anniema.co/
tell application "Stickies"
activate
tell application "System Events"
keystroke "n" using command down
keystroke "f" using command down & option down
end tell
end tell
================================================
FILE: commands/apps/sublime/open-with-sublime.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open with Sublime
# @raycast.mode silent
# Optional parameters:
# @raycast.icon https://cdn.worldvectorlogo.com/logos/sublime-text.svg
# @raycast.packageName Sublime
# Documentation:
# @raycast.author Rock Hu
# @raycast.authorURL https://twitter.com/0xRock
# @raycast.description Open currently focused directory in Sublime
set targetApp to path to application "Sublime Text"
tell application "Finder"
set theSelection to selection
if theSelection is {} then
if exists Finder window 1 then
set currentDir to target of Finder window 1 as alias
open currentDir using targetApp
end if
else
open theSelection using targetApp
end if
end tell
================================================
FILE: commands/apps/surfshark/surfshark-vpn-start.sh
================================================
#!/bin/bash
# Dependency: This script requires the vpnutil commandline utility
# Download and install in your $PATH: https://github.com/Timac/VPNStatus/releases/tag/1.0
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title VPN Connect
# @raycast.mode compact
# @raycast.packageName Surfshark
# Optional parameters:
# @raycast.icon images/surfshark.png
# @raycast.author Jordi Clement
# @raycast.authorURL https://github.com/jordicl
# @raycast.description Start Surfshark VPN connection
source surfshark.config.sh
VPN=$SURFSHARK_VPN_NAME
vpnutil start "${VPN}" >/dev/null 2>&1
echo "Surfshark VPN connected"
================================================
FILE: commands/apps/surfshark/surfshark-vpn-status.sh
================================================
#!/bin/bash
# Dependency: This script requires the vpnutil commandline utility
# Download and install in your $PATH: https://github.com/Timac/VPNStatus/releases/tag/1.0
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Surfshark VPN Status
# @raycast.mode inline
# @raycast.refreshTime 10s
# @raycast.packageName Surfshark
# Optional parameters:
# @raycast.icon images/surfshark.png
# @raycast.author Jordi Clement
# @raycast.authorURL https://github.com/jordicl
# @raycast.description Get Surfshark VPN status
source surfshark.config.sh
VPN=$SURFSHARK_VPN_NAME
vpnutil status "${VPN}"
================================================
FILE: commands/apps/surfshark/surfshark-vpn-stop.sh
================================================
#!/bin/bash
# Dependency: This script requires the vpnutil commandline utility
# Download and install in your $PATH: https://github.com/Timac/VPNStatus/releases/tag/1.0
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title VPN Disconnect
# @raycast.mode compact
# @raycast.packageName Surfshark
# Optional parameters:
# @raycast.icon images/surfshark.png
# @raycast.author Jordi Clement
# @raycast.authorURL https://github.com/jordicl
# @raycast.description Stop Surfshark VPN connection
source surfshark.config.sh
VPN=$SURFSHARK_VPN_NAME
vpnutil stop "${VPN}" >/dev/null 2>&1
echo "Surfshark VPN disconnected"
================================================
FILE: commands/apps/surfshark/surfshark.config.sh
================================================
#!/bin/bash
# Dependency: This script requires the vpnutil commandline utility
# Download and install in your $PATH: https://github.com/Timac/VPNStatus/releases/tag/1.0
# You can find the VPN name in the Network preference pane
export SURFSHARK_VPN_NAME="Surfshark. IKEv2"
if ! command -v vpnutil &> /dev/null; then
echo "vpnutil command is required. Download here: https://github.com/Timac/VPNStatus/releases/tag/1.0";
exit 1;
fi
if [ -z "$SURFSHARK_VPN_NAME" ]; then
echo "\$SURFSHARK_VPN_NAME is empty. Please, set VPN name in \"surfshark.config.sh\".";
exit 1;
fi
================================================
FILE: commands/apps/tailscale/README.md
================================================
Tailscale
Connect your macOS computer to your devices, services, and friends with these scripts that control the [Tailscale macOS application](https://tailscale.com/download) via [Raycast](http://raycast.com).

### Available scripts
- **Connect:** Connect to your most recent Tailscale network, logging in if needed.
- **Disconnect:** Disconnect from your Tailscale network.
- **Get IP:** shows your current [private Tailscale IP](https://tailscale.com/kb/1033/ip-and-dns-addresses/).
- **Switch Account:** Quickly switch between Tailscale networks.
> **Pro tip:** If [`jq` is installed](https://stedolan.github.io/jq/) in your $PATH, these scripts will show information about the network you're connecting to.
================================================
FILE: commands/apps/tailscale/tailscale-connect.sh
================================================
#!/bin/bash
# Note: Tailscale v1.8.0 required
# Install via https://tailscale.com/download
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Connect
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ./images/tailscale-icon.png
# @raycast.iconDark ./images/tailscale-iconDark.png
# @raycast.packageName Tailscale
# @Documentation:
# @raycast.description Connects to Tailscale
# @raycast.author Ross Zurowski
# @raycast.authorURL https://github.com/rosszurowski
ts=""
if command -v tailscale &> /dev/null; then
ts=$(which tailscale)
elif [ -f /Applications/Tailscale.app/Contents/MacOS/Tailscale ]; then
ts="/Applications/Tailscale.app/Contents/MacOS/Tailscale"
else
echo "Tailscale is not installed. See tailscale.com/download"
exit 1
fi
$ts up
if command -v jq &> /dev/null; then
account=$($ts status --json | jq -r '.User[(.Self.UserID | tostring)].LoginName')
echo "Connected as $account"
else
echo "Connected"
fi
================================================
FILE: commands/apps/tailscale/tailscale-disconnect.sh
================================================
#!/bin/bash
# Note: Tailscale v1.8.0 required
# Install via https://tailscale.com/download
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Disconnect
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ./images/tailscale-icon.png
# @raycast.iconDark ./images/tailscale-iconDark.png
# @raycast.packageName Tailscale
# @Documentation:
# @raycast.description Disconnects from Tailscale
# @raycast.author Ross Zurowski
# @raycast.authorURL https://github.com/rosszurowski
ts=""
if command -v tailscale &> /dev/null; then
ts=$(which tailscale)
elif [ -f /Applications/Tailscale.app/Contents/MacOS/Tailscale ]; then
ts="/Applications/Tailscale.app/Contents/MacOS/Tailscale"
else
echo "Tailscale is not installed. See: tailscale.com/download"
exit 1
fi
$ts down
echo "Disconnected"
================================================
FILE: commands/apps/tailscale/tailscale-ip.sh
================================================
#!/bin/bash
# Note: Tailscale v1.8.0 required
# Install via https://tailscale.com/download
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Get IP
# @raycast.mode inline
# @raycast.refreshTime 1d
# Optional parameters:
# @raycast.icon ./images/tailscale-icon.png
# @raycast.iconDark ./images/tailscale-iconDark.png
# @raycast.packageName Tailscale
# @Documentation:
# @raycast.description Gets your private Tailscale IP
# @raycast.author Ross Zurowski
# @raycast.authorURL https://github.com/rosszurowski
ts=""
if command -v tailscale &> /dev/null; then
ts=$(which tailscale)
elif [ -f /Applications/Tailscale.app/Contents/MacOS/Tailscale ]; then
ts="/Applications/Tailscale.app/Contents/MacOS/Tailscale"
else
echo "Tailscale is not installed. See tailscale.com/download"
exit 1
fi
ip=$($ts ip -4)
echo "$ip"
================================================
FILE: commands/apps/tailscale/tailscale-switch.sh
================================================
#!/bin/bash
# Note: Tailscale v1.8.0 required
# Install via https://tailscale.com/download
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Switch Account
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ./images/tailscale-icon.png
# @raycast.iconDark ./images/tailscale-iconDark.png
# @raycast.packageName Tailscale
# @Documentation:
# @raycast.description Switches Tailscale networks
# Original author
# @raycast.author Ross Zurowski
# @raycast.authorURL https://github.com/rosszurowski
# Contributor
# @raycast.author Daniel Schoemer
# @raycast.authorURL https://github.com/quatauta
ts=""
if command -v tailscale &> /dev/null; then
ts=$(which tailscale)
elif [ -f /Applications/Tailscale.app/Contents/MacOS/Tailscale ]; then
ts="/Applications/Tailscale.app/Contents/MacOS/Tailscale"
else
echo "Tailscale is not installed. See tailscale.com/download"
exit 1
fi
"${ts}" switch --list | # List all Tailscale accounts ""
grep -vF -e 'ID' -e '*' | # Omit the header line and the current account marked with "*"
awk '{ print $1 }' | # Print only the account ID of not-connected accounts
head -n1 | # Print only the first not-connected account
xargs -r -n1 "${ts}" switch # Switch to the selected account
tailnet="$("${ts}" switch --list | awk '/\*/ { print $2 }')"
echo "Switched to ${tailnet}"
================================================
FILE: commands/apps/terminal-translate/translate.sh
================================================
#!/bin/bash
# Dependency: requires translate-shell
# Install with Homebrew: `npm install terminal-translate -g`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Translate
# @raycast.mode fullOutput
# Optional parameters:
# @raycast.icon 📖
# @raycast.argument1 { "type": "text", "placeholder": "Word or Sentence" }
# @raycast.packageName Terminal Translate
# Documentation:
# @raycast.description Translate word or sentence.
# @raycast.author Fatpandac
# @raycast.authorURL https://github.com/Fatpandac
if ! command -v tl &> /dev/null; then
echo "trans command is required (https://github.com/ShanaMaid/terminal-translate).";
exit 1;
fi
tl $1
================================================
FILE: commands/apps/things/README.md
================================================
Things
Stay on top of your to-dos with this collection of scripts that control the [Things macOS application](https://culturedcode.com/things/) via [Raycast](http://raycast.com).

### Available scripts
- **Create To-Do:** Create a new To-Do and set an optional deadline.
- **Current To-Do:** Show your current To-Do in Raycast.
- **Search To-Dos:** Search To-Dos with a query.
- **Today:** Get an overview of your completed tasks.
> **Pro tip:** Add the *Current To-Do* or the *Today* script to your favorites to have it always visible when opening Raycast.
================================================
FILE: commands/apps/things/things-create-todo.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Create To-Do
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/things.png
# @raycast.packageName Things
# @raycast.argument1 { "type": "text", "placeholder": "Title", "percentEncoded": true }
# @raycast.argument2 { "type": "text", "placeholder": "Notes", "percentEncoded": true, "optional": true }
# @raycast.argument3 { "type": "text", "placeholder": "When (e.g. \"today\")", "percentEncoded": true, "optional": true }
# Documentation:
# @raycast.description Create a new To-Do with title and optional deadline.
# @raycast.author Things
# @raycast.authorURL https://twitter.com/culturedcode/
open "things:///add?title=$1¬es=$2&when=$3"
echo "Created To-Do"
================================================
FILE: commands/apps/things/things-current-todo.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Current To-Do
# @raycast.mode inline
# @raycast.refreshTime 1m
# Optional parameters:
# @raycast.packageName Things
# @raycast.icon images/things.png
# Documentation:
# @raycast.description Show your current To-Do to stay focused.
# @raycast.author Things
# @raycast.authorURL https://twitter.com/culturedcode/
if application "Things3" is not running then
log "Things is not running"
return
end if
tell application "Things3"
set todayTodos to to dos of list "Today"
repeat with i from 1 to count of todayToDos
set todo to item i of todayToDos
if status of todo is open then
set currentTodoName to name of todo as text
log currentTodoName
return
end if
end repeat
log "You're all done for today 🎉"
end tell
================================================
FILE: commands/apps/things/things-search-to-dos.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Search To-Dos
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/things.png
# @raycast.packageName Things
# @raycast.argument1 { "type": "text", "placeholder": "Query", "percentEncoded": true }
# Documentation:
# @raycast.description Search To-Dos with a query.
# @raycast.author Things
# @raycast.authorURL https://twitter.com/culturedcode/
open "things:///search?query=$1"
================================================
FILE: commands/apps/things/things-today.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Today
# @raycast.mode inline
# @raycast.refreshTime 1m
# Optional parameters:
# @raycast.packageName Things
# @raycast.icon images/things.png
# Documentation:
# @raycast.description Get an overview of your completed tasks for today.
# @raycast.author Things
# @raycast.authorURL https://twitter.com/culturedcode/
if application "Things3" is not running then
log "Things is not running"
return
end if
tell application "Things3"
set todayTodos to to dos of list "Today"
set todosCount to the length of todayTodos
set completedTodosCount to 0
repeat with i from 1 to count of todayToDos
set todo to item i of todayToDos
if status of todo is completed then
set completedTodosCount to completedTodosCount + 1
end if
end repeat
if completedTodosCount is equal to todosCount then
log "You're all done for today 🎉"
else
set progress to round(100 * completedTodosCount / todosCount)
log (progress as string) & "% Completed of " & todosCount & " To-Dos"
end if
end tell
================================================
FILE: commands/apps/timing/timing-start-timer.js
================================================
#!/usr/bin/osascript -l JavaScript
// Note: Timing.app is required with an Expert or Connect subscription
// Learn more and install: https://timingapp.com
// Required parameters:
// @raycast.schemaVersion 1
// @raycast.title Start Timer
// @raycast.mode silent
// Optional parameters:
// @raycast.icon images/timing-logo.png
// @raycast.argument1 { "type": "text", "placeholder": "Project", "optional": true }
// @raycast.argument2 { "type": "text", "placeholder": "Title", "optional": true }
// @raycast.argument3 { "type": "text", "placeholder": "Duration", "optional": true }
// @raycast.packageName Timing
// Documentation:
// @raycast.description Start a timer
// @raycast.author Landen Danyluk
// @raycast.authorURL https://github.com/landendanyluk
function run(argv) {
const timing = Application('TimingHelper');
// throw if AppleScript support is not enabled
if (!timing.scriptingSupportAvailable()) {
console.log('Scripting support requires an Expert or Connect subscription');
throw new Error();
}
// throw if both project and title are empty
if (!(argv[0] || argv[1])) {
console.log("Please enter a project name or title");
throw new Error();
}
let project;
if (argv[0] !== "") {
// check if project exists
const projects = timing.projects.whose({ name: argv[0] });
if (!projects.length) {
console.log("Project does not exist");
throw new Error();
} else {
// if there's more than one project with the same name, choose the first one in the list
project = projects[0];
}
}
const withTitle = argv[1];
const forAbout = Number(argv[2]) * 60;
if (isNaN(forAbout)) {
console.log("Please enter a valid duration");
throw new Error();
}
// JXA will complain if a key is present but undefined, so we have to add them like this
const options = {};
if (project) {
options.project = project;
}
if (withTitle) {
options.withTitle = withTitle;
}
if (forAbout) {
options.forAbout = forAbout;
}
timing.startTimer(options);
}
================================================
FILE: commands/apps/timing/timing-stop-timer.js
================================================
#!/usr/bin/osascript -l JavaScript
// Note: Timing.app is required with an Expert or Connect subscription
// Learn more and install: https://timingapp.com
// Required parameters:
// @raycast.schemaVersion 1
// @raycast.title Stop Timer
// @raycast.mode silent
// Optional parameters:
// @raycast.icon images/timing-logo.png
// @raycast.packageName Timing
// Documentation:
// @raycast.description Stop the active timer
// @raycast.author Landen Danyluk
// @raycast.authorURL https://github.com/landendanyluk
function run() {
const timing = Application('TimingHelper');
// throw if AppleScript support is not enabled
if (!timing.scriptingSupportAvailable()) {
console.log('Scripting support requires an Expert or Connect subscription');
throw new Error();
}
timing.stopCurrentTimer({ notification: true });
}
================================================
FILE: commands/apps/todoist/create-task.template.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Create Task
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/todoist-logo.png
# @raycast.packageName Todoist
# @raycast.argument1 { "type": "text", "placeholder": "Call Mom Tomorrow at 5" }
# Documentation:
# @raycast.description Create Task
# @raycast.author Faris Aziz
# @raycast.authorURL https://github.com/farisaziz12
# Get your API Token from: https://todoist.com/prefs/integrations
API_TOKEN="APITOKENHERE"
if [ -z "$API_TOKEN" ]; then
echo "Todoist API token is missing.";
exit 1;
fi
TASK="$1"
if [[ $TASK != "" ]]; then
curl "https://api.todoist.com/rest/v2/tasks" \
-X POST \
--data '{"content": "'"$TASK"'"}' \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $API_TOKEN"
echo "Task Created" # These tasks will show up in your inbox
else
echo "Please specify a task"
fi
================================================
FILE: commands/apps/todoist/get-tasks.template.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.author Faris Aziz
# @raycast.authorURL https://github.com/farisaziz12
# @raycast.schemaVersion 1
# @raycast.title Get Tasks
# @raycast.mode fullOutput
# @raycast.packageName Todoist
# @raycast.description Gets All Todoist tasks
# @raycast.needsConfirmation false
# Dependency: requires jq (https://stedolan.github.io/jq/)
# Install via Homebrew: `brew install jq`
# Optional parameters:
# @raycast.icon images/todoist-logo.png
# Get your API Token from: https://todoist.com/prefs/integrations
API_TOKEN=
if ! command -v jq &> /dev/null; then
echo "jq is required (https://stedolan.github.io/jq/).";
exit 1;
fi
if [ -z "$API_TOKEN" ]; then
echo "Todoist API token is missing.";
exit 1;
fi
TASKS=$(curl -s -X GET \
https://api.todoist.com/rest/v1/tasks \
-H "Authorization: Bearer $API_TOKEN")
echo "$TASKS" | jq '.[] | .content'
echo
echo "You have $(echo "$TASKS" | jq 'length') tasks"
================================================
FILE: commands/apps/translate-shell/translate-shell-language-pair.py
================================================
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
# Dependency: Requires translate-shell (https://www.soimort.org/translate-shell)
# Install with Homebrew: `brew install translate-shell`
# or install with MacPorts: `sudo port install translate-shell`
# Set required paths to binaries required for translate-shell.
GAWK='/usr/local/bin/gawk'
TRANS='/usr/local/bin/trans'
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Translate Shell
# @raycast.mode fullOutput
# Optional parameters:
# @raycast.argument1 {"type": "text", "placeholder": "Query"}
# @raycast.argument2 {"type": "text", "placeholder": "from", "optional": true }
# @raycast.argument3 {"type": "text", "placeholder": "to", "optional": true}
# @raycast.icon 🌍
# Documentation:
# @raycast.author Marcel Bochtler
# @raycast.authorURL https://github.com/MarcelBochtler
# @raycast.description Translate text using translate-shell.
# Set the default language pair.
# Allows to set a default language-pair that can be used to translate in both
# directions without setting the 'from' and 'to' languages.
FROM_LANG_DEFAULT = 'de'
TO_LANG_DEFAULT = 'en'
import json, os, sys, subprocess
from_language = FROM_LANG_DEFAULT
if sys.argv[2]:
from_language = sys.argv[2]
to_language = TO_LANG_DEFAULT
if sys.argv[3]:
to_language = sys.argv[3]
colors = {
'green': '\033[92m',
'yellow': '\033[93m',
'red': '\033[91m',
'grey': '\033[90m',
'white': '\033[97m',
'end': '\033[0m',
}
def green(message):
return f"{colors['green']}{message}{colors['end']}"
def yellow(message):
return f"{colors['yellow']}{message}{colors['end']}"
def red(message):
return f"{colors['red']}{message}{colors['end']}"
def grey(message):
return f"{colors['grey']}{message}{colors['end']}"
def white(message):
return f"{colors['white']}{message}{colors['end']}"
def translate(lang, query):
cmd = f"""
# Ensure gawk is available in PATH, as translate-shell requires it.
PATH="$(dirname {GAWK}):$PATH"
{TRANS} '{lang}' -dump '{query}' | /usr/bin/tail -n +2 | /usr/bin/head -n 1
"""
stream = os.popen(cmd)
rawJson = stream.read()
parsedJson = json.loads(rawJson)
translations = parsedJson[1]
if translations is not None:
translation = parsedJson[0][0][0]
subprocess.run("pbcopy", universal_newlines=True, input=translation)
return translations
def print_translations(translations):
# TODO: Limit the number of translations so no scrolling in the results is required.
if translations is None:
print(yellow('No translations found.'))
else:
for i, translation in enumerate(translations):
wordType = translation[0]
print(grey(wordType))
translationWithBackTranslation = translation[2]
for j, t in enumerate(translationWithBackTranslation):
translatedWord = t[0]
backTranslations = t[1]
if i == 0 and j == 0:
print(f' {yellow(translatedWord)} 📋')
else:
print(f' {green(translatedWord)}')
print(white(' ' + ', '.join(backTranslations) + '\n'))
query = sys.argv[1]
translations = translate(f'{from_language}:{to_language}', query)
if translations is None:
translations = translate(f'{to_language}:{from_language}', query)
# TODO: If second attempt failed, use result from first attempt and offer
# a "Did you mean ..." functionality.
print_translations(translations)
else:
print_translations(translations)
================================================
FILE: commands/apps/translate-shell/translate-to-en.sh
================================================
#!/bin/bash
# Dependency: requires translate-shell
# Install with Homebrew: `brew install translate-shell`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Translate to EN
# @raycast.mode fullOutput
# @raycast.packageName Translate Shell
# Optional parameters:
# @raycast.argument1 {"type": "text", "placeholder": "Word or Sentence"}
# @raycast.icon 📖
# Documentation:
# @raycast.author tiancheng92
# @raycast.authorURL https://github.com/tiancheng92
# @raycast.description Translate and copy brief translation to clipboard.
if ! command -v trans &> /dev/null; then
echo "trans command is required (https://github.com/soimort/translate-shell).";
exit 1;
fi
trans :en "$1" # display
trans :en "$1" -b | pbcopy # copy brief to clipboard
================================================
FILE: commands/apps/translate-shell/translate-to-zh.sh
================================================
#!/bin/bash
# Dependency: requires translate-shell
# Install with Homebrew: `brew install translate-shell`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Translate to ZH
# @raycast.mode fullOutput
# @raycast.packageName Translate Shell
# Optional parameters:
# @raycast.argument1 {"type": "text", "placeholder": "Word or Sentence"}
# @raycast.icon 📖
# Documentation:
# @raycast.author tiancheng92
# @raycast.authorURL https://github.com/tiancheng92
# @raycast.description Translate and copy brief translation to clipboard.
if ! command -v trans &> /dev/null; then
echo "trans command is required (https://github.com/soimort/translate-shell).";
exit 1;
fi
trans :zh "$1" # display
trans :zh "$1" -b | pbcopy # copy brief to clipboard
================================================
FILE: commands/apps/trello/create-trello-card.template.py
================================================
#!/usr/bin/env python3
# Dependency: This script requires the following Python libraries: `dateparser`, `requests`
# Install them with `pip install dateparser requests`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Create Card
# @raycast.packageName Trello
# @raycast.mode compact
# Optional parameters:
# @raycast.icon ./images/logo.png
# @raycast.argument1 { "type": "text", "placeholder": "Card title" }
# @raycast.argument2 { "type": "text", "placeholder": "Due date (e.g. today)", "optional": true }
# Documentation:
# @raycast.description Create a new Trello card
# @raycast.author Michael Francis
# @raycast.authorURL https://github.com/mikefrancis
import sys
import requests
import dateparser
# To generate an API key/token, head to https://trello.com/app-key
TRELLO_KEY = ''
TRELLO_TOKEN = ''
# To find the Board ID, head to https://api.trello.com/1/members/me/boards?key={TRELLO_KEY}&token={TRELLO_TOKEN}
# To find the List ID, head to https://api.trello.com/1/boards/{BOARD_ID}/lists?key={TRELLO_KEY}&token={TRELLO_TOKEN}
TRELLO_LIST_ID = ''
if not TRELLO_KEY:
print('Command not configured correctly. Missing variable: TRELLO_KEY')
exit(1)
if not TRELLO_TOKEN:
print('Command not configured correctly. Missing variable: TRELLO_TOKEN')
exit(1)
if not TRELLO_LIST_ID:
print('Command not configured correctly. Missing variable: TRELLO_LIST_ID')
exit(1)
name = sys.argv[1]
due_date = sys.argv[2]
payload = {
'key': TRELLO_KEY,
'token': TRELLO_TOKEN,
'idList': TRELLO_LIST_ID,
'name': name,
'pos': 'top',
}
if due_date:
try:
datetime = dateparser.parse(due_date)
payload['due'] = datetime.strftime('%Y-%m-%d')
except:
pass
response = requests.post('https://api.trello.com/1/cards', data=payload)
if not response.ok :
print(response.reason)
exit(1)
================================================
FILE: commands/apps/tunnelblick/tunnelblick-connect-all.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Tunnelblick: Connect All
# @raycast.mode silent
# @raycast.packageName TunnelBlick
#
# Optional parameters:
# @raycast.icon images/tunnelblick.png
# @raycast.needsConfirmation false
#
# Documentation:
# @raycast.description Connect all unconnected VPN configurations.
# @raycast.author Achille Lacoin
# @raycast.authorURL https://github.com/pomdtr
on run argv
tell application "Tunnelblick" to connect all
return # Discard Output
end run
================================================
FILE: commands/apps/tunnelblick/tunnelblick-connect.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Tunnelblick: Connect
# @raycast.mode silent
# @raycast.packageName Tunnelblick
#
# Optional parameters:
# @raycast.icon images/tunnelblick.png
# @raycast.needsConfirmation false
# @raycast.argument1 { "type": "text", "placeholder": "Configuration" }
#
# Documentation:
# @raycast.description Connect a VPN configuration.
# @raycast.author Achille Lacoin
# @raycast.authorURL https://github.com/pomdtr
on run argv
tell application "Tunnelblick" to connect (item 1 of argv)
return # Discard Output
end run
================================================
FILE: commands/apps/tunnelblick/tunnelblick-disconnect-all.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Tunnelblick: Disconnect All
# @raycast.mode silent
# @raycast.packageName Tunnelblick
#
# Optional parameters:
# @raycast.icon images/tunnelblick.png
# @raycast.needsConfirmation false
#
# Documentation:
# @raycast.description Disconnect all connected VPN configurations.
# @raycast.author Achille Lacoin
# @raycast.authorURL https://github.com/pomdtr
on run argv
tell application "Tunnelblick" to disconnect all
return # Discard Output
end run
================================================
FILE: commands/apps/tunnelblick/tunnelblick-disconnect.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Tunnelblick: Disconnect
# @raycast.mode silent
# @raycast.packageName Tunnelblick
#
# Optional parameters:
# @raycast.icon images/tunnelblick.png
# @raycast.needsConfirmation false
# @raycast.argument1 { "type": "text", "placeholder": "Configuration" }
#
# Documentation:
# @raycast.description Disconnect a VPN configuration.
# @raycast.author Achille Lacoin
# @raycast.authorURL https://github.com/pomdtr
on run argv
tell application "Tunnelblick" to disconnect (item 1 of argv)
return # Discard Output
end run
================================================
FILE: commands/apps/viscosity/viscosity-connect-all.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Viscosity: Connect All
# @raycast.mode silent
# @raycast.packageName Viscosity
#
# Optional parameters:
# @raycast.icon images/viscosity.png
# @raycast.needsConfirmation false
#
# Documentation:
# @raycast.description Connect all unconnected VPN configurations.
# @raycast.author Luigi Cardito (credits Achille Lacoin https://github.com/pomdtr)
# @raycast.authorURL https://github.com/lcardito
on run argv
tell application "Viscosity" to connectall
return # Discard Output
end run
================================================
FILE: commands/apps/viscosity/viscosity-connect.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Viscosity: Connect
# @raycast.mode silent
# @raycast.packageName Viscosity
#
# Optional parameters:
# @raycast.icon images/viscosity.png
# @raycast.needsConfirmation false
# @raycast.argument1 { "type": "text", "placeholder": "Configuration" }
#
# Documentation:
# @raycast.description Connect a VPN viscosity configuration.
# @raycast.author Luigi Cardito (credits Achille Lacoin https://github.com/pomdtr)
# @raycast.authorURL https://github.com/lcardito
on run argv
tell application "Viscosity" to connect (item 1 of argv)
return # Discard Output
end run
================================================
FILE: commands/apps/viscosity/viscosity-disconnect-all.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Viscosity: Disconnect All
# @raycast.mode silent
# @raycast.packageName Viscosity
#
# Optional parameters:
# @raycast.icon images/viscosity.png
# @raycast.needsConfirmation false
#
# Documentation:
# @raycast.description Disconnect all connected VPN configurations.
# @raycast.author Luigi Cardito (credits Achille Lacoin https://github.com/pomdtr)
# @raycast.authorURL https://github.com/lcardito
on run argv
tell application "Viscosity" to disconnectall
return # Discard Output
end run
================================================
FILE: commands/apps/viscosity/viscosity-disconnect.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Viscosity: Disconnect
# @raycast.mode silent
# @raycast.packageName Viscosity
#
# Optional parameters:
# @raycast.icon images/viscosity.png
# @raycast.needsConfirmation false
# @raycast.argument1 { "type": "text", "placeholder": "Configuration" }
#
# Documentation:
# @raycast.description Disconnect a VPN configuration.
# @raycast.author Luigi Cardito (credits Achille Lacoin https://github.com/pomdtr)
# @raycast.authorURL https://github.com/lcardito
on run argv
tell application "Viscosity" to disconnect (item 1 of argv)
return # Discard Output
end run
================================================
FILE: commands/apps/warp/warp-reauth.sh
================================================
#!/bin/bash
# Dependency: Cloudflare WARP https://developers.cloudflare.com/warp-client/setting-up/macOS
# Note: Cloudflare WARP must be installed, but CLI works properly only if GUI-client is not running
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Reauthenticate
# @raycast.mode compact
# Optional parameters:
# @raycast.icon images/warp.png
# @Documentation:
# @raycast.packageName WARP
# @raycast.description Force WARP reauthentication
# @raycast.author Daniils Petrovs
# @raycast.authorURL https://github.com/danirukun
if ! command -v warp-cli &> /dev/null; then
echo "WARP is required (https://developers.cloudflare.com/warp-client/setting-up/macOS)";
exit 1;
fi
warp-cli access-reauth
echo "Opening WARP authentication page"
================================================
FILE: commands/apps/warp/warp-start.sh
================================================
#!/bin/bash
# Dependency: Cloudflare WARP https://developers.cloudflare.com/warp-client/setting-up/macOS
# Note: Cloudflare WARP must be installed, but CLI works properly only if GUI-client is not running
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Connect
# @raycast.mode compact
# Optional parameters:
# @raycast.icon images/warp.png
# @Documentation:
# @raycast.packageName WARP
# @raycast.description Create a connection to WARP
# @raycast.author Sergey Fuksman
# @raycast.authorURL https://github.com/fuksman
if ! command -v warp-cli &> /dev/null; then
echo "WARP is required (https://developers.cloudflare.com/warp-client/setting-up/macOS)";
exit 1;
fi
# Source: https://superuser.com/a/736859
function isnt_connected () {
warp-cli status | grep Status | grep -qv Connected
}
function poll_until_connected () {
(( loops=0 ))
(( max_loops=200 )) # 200 * 0.1 is 20 seconds. Bash doesn't support floats
while isnt_connected; do
sleep 0.1 # can't use a variable here, bash doesn't have floats
(( loops=loops+1 ))
[ "$loops" -gt "$max_loops" ] && break
done
[ "$loops" -le "$max_loops" ]
}
if isnt_connected; then
warp-cli connect
if poll_until_connected; then
echo "Connected to WARP"
else
echo "Couldn't connect to WARP"
warp-cli disconnect
exit 1
fi
else
echo "Already connected to WARP"
exit 1
fi
================================================
FILE: commands/apps/warp/warp-status.sh
================================================
#!/bin/bash
# Dependency: Cloudflare WARP https://developers.cloudflare.com/warp-client/setting-up/macOS
# Note: Cloudflare WARP must be installed, but CLI works properly only if GUI-client is not running
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title WARP Status
# @raycast.mode inline
# @raycast.refreshTime 30s
# Optional parameters:
# @raycast.icon images/warp.png
# @Documentation:
# @raycast.packageName WARP
# @raycast.description Check WARP connection
# @raycast.author Sergey Fuksman
# @raycast.authorURL https://github.com/fuksman
if ! command -v warp-cli &> /dev/null; then
echo "WARP is required (https://developers.cloudflare.com/warp-client/setting-up/macOS)";
exit 1;
fi
status=$(warp-cli status | grep Status | awk 'NF>1{print $NF}')
if [ "$status" == "Connected" ] || [ "$status" == "Disconnected" ]; then
echo "$status"
exit 0
fi
echo "🚨 Can't check status"
exit 1
================================================
FILE: commands/apps/warp/warp-stop.sh
================================================
#!/bin/bash
# Dependency: Cloudflare WARP https://developers.cloudflare.com/warp-client/setting-up/macOS
# Note: Cloudflare WARP must be installed, but CLI works properly only if GUI-client is not running
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Disconnect
# @raycast.mode compact
# Optional parameters:
# @raycast.icon images/warp.png
# @Documentation:
# @raycast.packageName WARP
# @raycast.description Disconnect from WARP
# @raycast.author Sergey Fuksman
# @raycast.authorURL https://github.com/fuksman
if ! command -v warp-cli &> /dev/null; then
echo "WARP is required (https://developers.cloudflare.com/warp-client/setting-up/macOS)";
exit 1;
fi
# Source: https://superuser.com/a/736859
function isnt_connected () {
warp-cli status | grep Status | grep -qv Connected
}
if isnt_connected; then
echo "WARP is not connected"
exit 1
else
warp-cli disconnect
echo "Disconnected from WARP"
fi
================================================
FILE: commands/apps/warp/warp-toggle.sh
================================================
#!/bin/bash
# Dependency: Cloudflare WARP https://developers.cloudflare.com/warp-client/setting-up/macOS
# Note: Cloudflare WARP must be installed, but CLI works properly only if GUI-client is not running
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Toggle WARP
# @raycast.mode compact
# Optional parameters:
# @raycast.icon images/warp.png
# @Documentation:
# @raycast.packageName WARP
# @raycast.description Toggle Connection
# @raycast.author Sergey Fuksman
# @raycast.authorURL https://github.com/fuksman
if ! command -v warp-cli &> /dev/null; then
echo "WARP is required (https://developers.cloudflare.com/warp-client/setting-up/macOS)";
exit 1;
fi
# Source: https://superuser.com/a/736859
function isnt_connected () {
warp-cli status | grep Status | grep -qv Connected
}
function poll_until_connected () {
(( loops=0 ))
(( max_loops=200 )) # 200 * 0.1 is 20 seconds. Bash doesn't support floats
while isnt_connected; do
sleep 0.1 # can't use a variable here, bash doesn't have floats
(( loops=loops+1 ))
[ "$loops" -gt "$max_loops" ] && break
done
[ "$loops" -le "$max_loops" ]
}
if isnt_connected; then
warp-cli connect
if poll_until_connected; then
echo "Connected to WARP"
else
echo "Couldn't connect to WARP"
warp-cli disconnect
exit 1
fi
else
warp-cli disconnect
echo "Disconnected from WARP"
fi
================================================
FILE: commands/apps/webstorm/open-workspace.template.sh
================================================
#!/bin/bash
# Note: WebStorm required
# Install via via JetBrains Toolbox https://www.jetbrains.com/toolbox-app/
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open
# @raycast.mode compact
#
# Optional parameters:
# @raycast.icon images/webstorm.png
# @raycast.packageName WebStorm
#
# Arguments
# @raycast.argument1 { "type": "text", "placeholder": "Workspace", "optional": true }
# @raycast.argument2 { "type": "text", "placeholder": "Close Others? [yes/no]", "optional": true }
#
# Documentation:
# @raycast.description Open WebStorm projects
# @raycast.author Daniel Stovv
# @raycast.authorURL https://github.com/stovv
#
# Configuration
# 1. Please make sure for WebStorm installed and WebStorm CLI available in $PATH
# https://www.jetbrains.com/help/webstorm/working-with-the-ide-features-from-command-line.html#standalone
# 2. Configure always open projects in new window Preferences -> Appearance & Behavior -> System Settings -> Project -> Open project in [ Select: New Window ]
# 3. Add more workspaces by example
if ! command -v webstorm &> /dev/null; then
echo "WebStorm CLI is required (https://www.jetbrains.com/help/webstorm/working-with-the-ide-features-from-command-line.html#standalone).";
exit 1;
fi
# Main program
# Arguments
WORKSPACE=$1
CLOSE_OTHER=$2
PROCESS=$(pgrep -f webstorm)
if [ "${CLOSE_OTHER}" = "yes" ] && [ "${PROCESS}" != "" ] ;then
echo "Kill WebStorm..."
kill -9 "${PROCESS}"
fi
# Example:
if [[ "${WORKSPACE}" = "workspace_name" ]];then
# TODO: change paths to projects
webstorm nosplash ~/Project/someProject ~/Project/someOtherProject
echo "Workspace ${WORKSPACE} opened!"
exit 0
fi
webstorm nosplash dontReopenProjects
echo "WebStorm projects dialog opened!"
================================================
FILE: commands/apps/wikipedia/wikipedia-search.py
================================================
#!/usr/bin/env python3
# Dependencies:
# Wikipedia: https://github.com/goldsmith/Wikipedia
# Recommended installation:
# Use pipx (https://github.com/pypa/pipx) to install the package system-wide:
# pipx install wikipedia
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Wikipedia Search
# @raycast.mode fullOutput
# @raycast.packageName Wikipedia
# Optional parameters:
# @raycast.icon images/wikipedia.png
# @raycast.argument1 { "type": "text", "placeholder": "Search Term" }
# Documentation:
# @raycast.description Search Wikipedia and display the result in Raycast
# @raycast.author Juan I. Serra
# @raycast.authorURL https://twitter.com/jiserra
# Define some colors to work with
colors = {
'green': '\033[92m',
'yellow': '\033[93m',
'red': '\033[91m',
'grey': '\033[90m',
'white': '\033[97m',
'end': '\033[0m',
}
def green(message):
return f"{colors['green']}{message}{colors['end']}"
def yellow(message):
return f"{colors['yellow']}{message}{colors['end']}"
def red(message):
return f"{colors['red']}{message}{colors['end']}"
def grey(message):
return f"{colors['grey']}{message}{colors['end']}"
def white(message):
return f"{colors['white']}{message}{colors['end']}"
# Import Wikipedia module
try:
import wikipedia
except ImportError:
print(red(f"Wikipedia module not installed, run `pip install wikipedia`"))
exit(1)
# This is to disable the wikipedia module warning about the parser in BeautifulSoup
import warnings
warnings.filterwarnings("ignore")
# Define the argument
import sys
search = sys.argv[1]
# Catch the exception when there's more than one definition
try:
wikisearch = wikipedia.page(search)
except wikipedia.exceptions.DisambiguationError as e:
print(red('Which one do you mean?\n'))
print(e)
except wikipedia.exceptions.PageError:
print(red(f"Sorry, there's not a Wikipedia page on {yellow(search.title())}"))
else:
print(yellow(wikisearch.title))
print(wikisearch.summary)
================================================
FILE: commands/apps/y-pomodoro/pause.sh
================================================
#!/bin/bash
# Dependency: This script requires `y-pomodoro` downloaded: https://github.com/jesse-c/y-pomodoro
# Run via: `cargo run`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Pause
# @raycast.packageName y-pomodoro
# @raycast.mode compact
# Optional parameters:
# @raycast.icon 🍅
# @raycast.description Pause active pomodoro timer using [y-pomodoro](https://github.com/jesse-c/y-pomodoro)
# Documentation:
# @raycast.author Jesse Claven
# @raycast.authorURL https://github.com/jesse-c
printf "pause" | nc -U /tmp/pomodoro.sock
================================================
FILE: commands/apps/y-pomodoro/resume.sh
================================================
#!/bin/bash
# Dependency: This script requires `y-pomodoro` downloaded: https://github.com/jesse-c/y-pomodoro
# Run via: `cargo run`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Resume
# @raycast.packageName y-pomodoro
# @raycast.mode compact
# Optional parameters:
# @raycast.icon 🍅
# @raycast.description Resume active pomodoro timer using [y-pomodoro](https://github.com/jesse-c/y-pomodoro)
# Documentation:
# @raycast.author Jesse Claven
# @raycast.authorURL https://github.com/jesse-c
printf "resume" | nc -U /tmp/pomodoro.sock
================================================
FILE: commands/apps/y-pomodoro/show.sh
================================================
#!/bin/bash
# Dependency: This script requires `y-pomodoro` downloaded: https://github.com/jesse-c/y-pomodoro
# Run via: `cargo run`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Show
# @raycast.packageName y-pomodoro
# @raycast.mode inline
# @raycast.refreshTime 15s
# Optional parameters:
# @raycast.icon 🍅
# @raycast.description Show active pomodoro timer using [y-pomodoro](https://github.com/jesse-c/y-pomodoro)
# Documentation:
# @raycast.author Jesse Claven
# @raycast.authorURL https://github.com/jesse-c
printf "show" | nc -U /tmp/pomodoro.sock
================================================
FILE: commands/apps/y-pomodoro/start.sh
================================================
#!/bin/bash
# Dependency: This script requires `y-pomodoro` downloaded: https://github.com/jesse-c/y-pomodoro
# Run via: `cargo run`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Start
# @raycast.packageName y-pomodoro
# @raycast.mode compact
# Optional parameters:
# @raycast.icon 🍅
# @raycast.description Start a pomodoro timer using [y-pomodoro](https://github.com/jesse-c/y-pomodoro)
# Documentation:
# @raycast.author Jesse Claven
# @raycast.authorURL https://github.com/jesse-c
printf "start" | nc -U /tmp/pomodoro.sock
================================================
FILE: commands/apps/y-pomodoro/stop.sh
================================================
#!/bin/bash
# Dependency: This script requires `y-pomodoro` downloaded: https://github.com/jesse-c/y-pomodoro
# Run via: `cargo run`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Stop
# @raycast.packageName y-pomodoro
# @raycast.mode compact
# Optional parameters:
# @raycast.icon 🍅
# @raycast.description Stop active pomodoro timer using [y-pomodoro](https://github.com/jesse-c/y-pomodoro)
# Documentation:
# @raycast.author Jesse Claven
# @raycast.authorURL https://github.com/jesse-c
printf "stop" | nc -U /tmp/pomodoro.sock
================================================
FILE: commands/browsing/Youtube Shorts in video player.sh
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Youtube Shorts in video player
# @raycast.mode silent
# Optional parameters:
# @raycast.icon 📹
# Documentation:
# @raycast.description Opens current Youtube Shorts video in the normal video player by replacing "/shorts/" with "/v/" in the url.
# @raycast.author Kailash Yellareddy
# @raycast.authorURL https://github.com/kyellareddy
# -------------------------------------------------------------------
# | # This script currently supports Safari and Google Chrome. |
# | # Replace "Safari" in line 21 with either "Safari" or "Chrome" |
# -------------------------------------------------------------------
set browser to "Safari"
if browser="Safari"
tell application "Safari"
tell front window
if its document exists then
set CurrentUrl to URL of current tab
end if
end tell
end tell
set inputText to CurrentUrl
set findText to "shorts"
set replaceText to "v"
set newText to do shell script "sed 's|" & quoted form of findText & "|" & quoted form of replaceText & "|g' <<< " & quoted form of inputText
tell application "Safari"
tell window 1
tell current tab
set URL to {newText}
end tell
end tell
end tell
end if
if browser="Chrome"
tell application "Google Chrome"
set frontIndex to active tab index of front window
get URL of tab frontIndex of front window
set CurrentUrl to URL of tab frontIndex of front window
end tell
set inputText to CurrentUrl
set findText to "shorts"
set replaceText to "v"
set newText to do shell script "sed 's|" & quoted form of findText & "|" & quoted form of replaceText & "|g' <<< " & quoted form of inputText
tell application "Google Chrome"
set URL of active tab of window 1 to {newText}
end tell
end if
================================================
FILE: commands/browsing/chrome-current-page-url.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Copy Current Page URL
# @raycast.mode silent
# @raycast.packageName Google Chrome
#
# Optional parameters:
# @raycast.icon 🧭
#
# Documentation:
# @raycast.description This script copies URL of currently opened page in Google Chrome into clipboard.
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
osascript -e 'tell application "Google Chrome" to get URL of active tab of first window' | pbcopy
echo "Copied"
================================================
FILE: commands/browsing/convert-twitter-to-nitter.js
================================================
#!/usr/bin/env node
// Dependency: This script requires Nodejs.
// Install Node: https://nodejs.org/en/download/
// Required parameters:
// @raycast.schemaVersion 1
// @raycast.title Convert Twitter to Nitter
// @raycast.mode silent
// Optional parameters:
// @raycast.icon 🐔
// Documentation:
// @raycast.description Convert Twitter link to Nitter
// @raycast.author cSharp
// @raycast.authorURL https://github.com/noidwasavailable
// Example Twitter link: https://twitter.com/Cron/status/1644010827647975425
const child_process = require('child_process');
let link = child_process.execSync("pbpaste").toString();
if (!link) {
console.error('No link provided');
return;
}
try {
link = link.replace('twitter.com', 'nitter.net');
console.log(`Opening ${link}`);
child_process.execSync(`open "${link}"`);
return;
} catch (error) {
console.error('Invalid link provided');
return;
}
================================================
FILE: commands/browsing/git-io.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Shorten URL from GitHub
# @raycast.mode silent
# @raycast.packageName Browsing
# Optional parameters:
# @raycast.icon images/git-io.png
# Documentation:
# @raycast.author Astrit
# @raycast.authorURL https://github.com/astrit
# @raycast.description Shorten any github.com URL
regex='(https?)://[-A-Za-z0-9\+&@#/%?=~_|!:,.;]*[-A-Za-z0-9\+&@#/%=~_|]?(github)\.(com|io)'
getLink=$(pbpaste)
if [[ $getLink =~ $regex ]]
then
result=$(curl -i https://git.io -F "url=$getLink" | grep Location)
location="Location: "
resultCleanup=${result//$location/}
if [[ $result != "Error" ]]
then
echo $resultCleanup | pbcopy
echo "Copied URL: $resultCleanup"
else
echo "URL cannot be shortened"
exit 1
fi
else
echo "String in clipboard is not a valid URL"
exit 1
fi
================================================
FILE: commands/browsing/go-to-outine.sh
================================================
#!/bin/bash
# @raycast.author Ronan Rodrigo Nunes
# @raycast.authorURL https://ronanrodrigo.dev
# @raycast.packageName Browsing
# @raycast.schemaVersion 1
# @raycast.title Go to Outline
# @raycast.description Open the website at Outline
# @raycast.mode compact
# @raycast.argument1 { "type": "text", "placeholder": "URL" }
# @raycast.icon images/outline.png
address=$1
if ! command -v jq &> /dev/null; then
echo "Please, install jq: brew install jq"
exit 1
fi
regex='(https?|ftp|file)://[-A-Za-z0-9\+&@#/%?=~_|!:,.;]*[-A-Za-z0-9\+&@#/%=~_|]'
if ! [[ $address =~ $regex ]] ; then
echo "Invalid URL"
exit 1
fi
function outline_request() {
curl -s "https://api.outline.com/v3/parse_article?source_url=${address}"\
-H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:84.0) Gecko/20100101 Firefox/84.0'\
-H 'Accept: */*'\
-H 'Accept-Language: pt-BR,pt;q=0.8,en-US;q=0.5,en;q=0.3' --compressed\
-H 'Origin: https://outline.com'\
-H 'DNT: 1' -H 'Connection: keep-alive'\
-H 'Referer: https://outline.com/'\
-H 'Sec-GPC: 1'
}
short_code=$(outline_request | jq -r '.data.short_code')
open "https://outline.com/${short_code}"
================================================
FILE: commands/browsing/new-browser-window.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title New Browser Window
# @raycast.mode compact
# Optional parameters:
# @raycast.icon 🌐
# @raycast.packageName Browser Utils
# Documentation:
# @raycast.description Open new window in default browser
# @raycast.author Levi Nelson
# @raycast.authorURL https://github.com/LeviticusNelson
# https://stackoverflow.com/a/66026925/13949806
defaultBrowser=$(plutil -p ~/Library/Preferences/com.apple.LaunchServices/com.apple.launchservices.secure.plist | grep 'https' -b3 |awk 'NR==3 {split($4, arr, "\""); print arr[2]}')
open --new -b "$defaultBrowser"
================================================
FILE: commands/browsing/open-chrome-without-cors.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open without CORS
# @raycast.mode compact
# Optional parameters:
# @raycast.icon images/chrome-icon.png
# @raycast.packageName Chrome
# @raycast.needsConfirmation false
# Documentation:
# @raycast.description Open chrome with web security option disabled.
# @raycast.author Tahsin Yazkan
# @raycast.authorURL https://github.com/thsnyzkn
open -n -a /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --args --user-data-dir="/tmp/chrome_dev_test" --disable-web-security
================================================
FILE: commands/browsing/open-in-guest-profile.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open in guest profile
# @raycast.mode silent
# Optional parameters:
# @raycast.icon 🤖
# @raycast.packageName Browser
# Documentation:
# @raycast.description Open current website in guest profile/mode
# @raycast.author JD Solanki
# @raycast.authorURL https://github.com/jd-solanki
############################################
## Set your browser app ##
## "Google Chrome" ##
## "Brave Browser" ##
############################################
browser="Google Chrome"
URL=$(osascript -e "tell application \"$browser\" to get URL of active tab of first window")
open -a "$browser" -n --args --guest --new-window "$URL"
================================================
FILE: commands/browsing/open-multiple-websites-on-safari.template.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open Multiple Websites on Safari
# @raycast.mode silent
# Optional parameters:
# @raycast.icon 📚
# @raycast.packageName Browsing
# Documentation:
# @raycast.description Open multiple websites on Safari using list of URLs
# @raycast.author Yasutaka Nishii
# @raycast.authorURL https://github.com/ystknsh
# Set list of URLs
urls=(
"https://example.com"
"https://example.org"
"https://example.net"
"https://example.jp"
"https://example.io"
"https://example.ai"
)
# Make AppleScript commands
applescript_command="tell application \"Safari\"
make new document with properties {URL:\"${urls[0]}\"}
tell window 1"
for ((i=1; i<${#urls[@]}; i++)); do
applescript_command+="
make new tab with properties {URL:\"${urls[$i]}\"}"
done
applescript_command+="
end tell
end tell"
# Execute AppleScript
osascript -e "$applescript_command"
# Set Safari window to front(Optional)
osascript < /dev/null; then
echo "jq is required (https://stedolan.github.io/jq/).";
exit 1;
fi
if [ -z "$1" ]; then
URL=$(pbpaste)
else
URL=$1
fi
if [[ $URL =~ ^https?://[a-zA-Z0-9./?=_-]*$ ]]; then
SHORT_URL=$(curl --location --silent --request POST ''"$PROTOCOL"'/rest/v1/short-urls' \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: '"$APIKEY"'' \
--data-raw '{
"longUrl": "'"$URL"'",
"validateUrl": false,
"tags": [
"'$TAG'"
],
"findIfExists": true,
"domain": "'"$BASEURL"'"
}' | jq -r '.shortUrl')
if [ -n "$SHORT_URL" ]; then
echo "$SHORT_URL" | pbcopy
echo "Copied $SHORT_URL to your clipboard"
else
echo "Error: Could not create short URL"
exit 1
fi
else
echo "Invalid URL \"$URL\""
exit 1
fi
================================================
FILE: commands/browsing/short-url-emoji.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Shorten URL with Emojis
# @raycast.mode compact
# @raycast.packageName Browsing
# Optional parameters:
# @raycast.icon 🔗
# Documentation:
# @raycast.author Samuel Henry
# @raycast.authorURL https://bne.sh
# @raycast.description Transform the clipboard contents to a short Emoji URL
regex='(https?|ftp|file)://[-A-Za-z0-9\+&@#/%?=~_|!:,.;]*[-A-Za-z0-9\+&@#/%=~_|]'
pasteboardString=$(pbpaste)
if [[ $pasteboardString =~ $regex ]]
then
result=$(curl "https://bne.sh/api/shorten?url=$pasteboardString")
echo $result | ruby -r json -e 'puts JSON.parse(STDIN.read)["url"]' | pbcopy; echo -n `pbpaste`
else
echo "String in clipboard is a not valid URL"
exit 1
fi
================================================
FILE: commands/browsing/shorten-url-bitly.template.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Shorten URL with Bitly
# @raycast.mode compact
# @raycast.packageName Browsing
# Optional parameters:
# @raycast.icon 🔗
# Documentation:
# @raycast.author Nitin Gupta
# @raycast.authorURL https://twitter.com/gniting
# @raycast.description Transform the clipboard contents to a short Bitly URL
# generate an access token: https://support.bitly.com/hc/en-us/articles/230647907-How-do-I-generate-an-OAuth-access-token-for-the-Bitly-API-
accessToken="put_in_your_access_token_here"
urlFromClipboard=`pbpaste`
result=`curl -s --request GET -G --data-urlencode "longURL=$urlFromClipboard" --data-urlencode "access_token=$accessToken" https://api-ssl.bitly.com/v3/shorten`
statusCode=`echo $result | ruby -r json -e 'puts JSON.parse(STDIN.read)["status_code"]'`
if [[ "$statusCode" == "200" ]]
then
echo $result | ruby -r json -e 'puts JSON.parse(STDIN.read)["data"]["url"]' | pbcopy; echo -n `pbpaste`
else
echo $result | ruby -r json -e 'puts "ERROR: " + JSON.parse(STDIN.read)["status_txt"]'
fi
================================================
FILE: commands/browsing/shorten-url.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Shorten URL From Clipboard
# @raycast.mode silent
# @raycast.packageName Browsing
# Optional parameters:
# @raycast.icon 🔗
# Documentation:
# @raycast.author Thomas Paul Mann
# @raycast.authorURL https://github.com/thomaspaulmann
# @raycast.description Shorten the URL in your Clipboard with Tiny URL.
regex='(https?|ftp|file)://[-A-Za-z0-9\+&@#/%?=~_|!:,.;]*[-A-Za-z0-9\+&@#/%=~_|]'
pasteboardString=$(pbpaste)
if [[ $pasteboardString =~ $regex ]]
then
result=$(curl "https://tinyurl.com/api-create.php?url=$pasteboardString")
if [[ $result != "Error" ]]
then
echo $result | pbcopy
echo "Copied shortened URL"
else
echo "URL cannot be shortened"
exit 1
fi
else
echo "String in clipboard is a not valid URL"
exit 1
fi
================================================
FILE: commands/browsing/to-private-browsing.sh
================================================
#!/bin/bash
############################################
## Set your browser app ##
## "Google Chrome" ##
## "Brave Browser" ##
############################################
browser="Google Chrome"
# @raycast.title Current Website to Private Browser
# @raycast.author raulanatol
# @raycast.authorURL https://github.com/raulanatol
# @raycast.description Open the current site in a private browser
# @raycast.icon 🥽
# @raycast.mode silent
# @raycast.packageName Browser
# @raycast.schemaVersion 1
URL=$(osascript -e "tell application \"$browser\" to get URL of active tab of first window")
open -a "$browser" -n --args --incognito --new-window "$URL"
================================================
FILE: commands/browsing/website-screenshots.sh
================================================
#!/bin/bash
# Dependency: requires pageres (https://github.com/sindresorhus/pageres-cli)
# Install via npm: `npm install --global pageres-cli`
# Set viewport resolution of screenshots
resolutions="1920x1080 390x844"
# @raycast.title Screenshot Website
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Takes screenshots of the entered URL using [`pageres`](https://github.com/sindresorhus/pageres) and saves it to the Desktop.
# @raycast.currentDirectoryPath ~/Desktop
# @raycast.icon 🖼️
# @raycast.mode compact
# @raycast.packageName Internet
# @raycast.schemaVersion 1
# @raycast.argument1 { "type": "text", "placeholder": "URL" }
if ! command -v pageres &> /dev/null; then
echo "pageres command is required (https://github.com/sindresorhus/pageres-cli).";
exit 1;
fi
if [ -z ${resolutions+x} ]; then
echo "Viewport resolutions are undefined.";
exit 0
fi
regex='(https?)://[-A-Za-z0-9\+&@#/%?=~_|!:,.;]*[-A-Za-z0-9\+&@#/%=~_|]'
url=$1
if [[ $url =~ $regex ]]; then
output=$(pageres --crop "$url" $resolutions)
echo "Saved screenshot(s) to Desktop"
else
echo "Input is not a valid url"
fi
================================================
FILE: commands/communication/call-with-iphone.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Call with iPhone
# @raycast.mode compact
# Optional parameters:
# @raycast.icon 📱
# @raycast.argument1 { "type": "text", "placeholder": "+1 514 555 1212" }
# @raycast.packageName Communication
# Documentation:
# @raycast.description Place a telephone call via your iPhone on Wi-Fi.
# @raycast.author Alexander JH Steffen
# @raycast.authorURL https://github.com/alexjsteffen
sleep 1
open "tel://$1"
================================================
FILE: commands/communication/cloudup/cloudup-paste.sh
================================================
#!/usr/bin/osascript
# @raycast.title Paste
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Upload clipboard contents to [Cloudup](https://cloudup.com/).
# @raycast.icon images/cloudup-logo.png
# @raycast.mode silent
# @raycast.packageName Cloudup
# @raycast.schemaVersion 1
tell application "Cloudup" to paste
================================================
FILE: commands/communication/cloudup/cloudup-pick.sh
================================================
#!/usr/bin/osascript
# @raycast.title Pick
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Open file dialog and upload to [Cloudup](https://cloudup.com/).
# @raycast.icon images/cloudup-logo.png
# @raycast.mode silent
# @raycast.packageName Cloudup
# @raycast.schemaVersion 1
tell application "Cloudup" to pick
================================================
FILE: commands/communication/cloudup/cloudup-upload.sh
================================================
#!/usr/bin/osascript
# @raycast.title Upload
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Upload path or URL in clipboard to [Cloudup](https://cloudup.com/).
# @raycast.icon images/cloudup-logo.png
# @raycast.mode silent
# @raycast.packageName Cloudup
# @raycast.schemaVersion 1
set variable to (do shell script "pbpaste")
tell application "Cloudup"
upload variable
end tell
================================================
FILE: commands/communication/duckduckgo-email-protection/README.md
================================================
# What is DuckDuckGo Email Protection?
DuckDuckGo Email Protection is an email protection service (currently invite-only). After having been invited, DDG provides you with an intermediary e-mail address (you@duck.com). Any e-mail sent to this address will be stripped of its analytics components, before being forwarded to your actual e-mail address (you@you.com).

# About this Script Command
This script command lets you quickly generate a unique @duck.com address that is connected to your own e-mail address. Just like your personal you@duck.com address, the unique addresses will also forward any e-mail to your own e-mail address, after having been stripped of any tracking or analytics modules.

At the same time, DuckDuckGo allows you to create unique private e-mail addresses. These are randomly generated @duck.com addresses that also forward to your actual e-mail address. These are basically 'throw-away' e-mail addresses that you can use for any reason.
# Requirements
In order to configure this script command, you have to have been invited into the E-mail protection service beta. Currently, the only way to do this is through the DuckDuckGo app (iOS/Android). After you have been invited, you will need to extract your authorization ID from the DuckDuckGo desktop browser extension.
# Configuring DDG Email Protection Script command
Completing the following commands should allow you to generate new unique @duck.com addresses from Raycast. Note: this explanation assumes the use of FireFox.
1. First, make sure you've set-up the DDG extension on Firefox (or Chrome)
2. Then, navigate go to about:debugging#/runtime/this-firefox
3. In the list of installed extension, look for DuckDuckGo Privacy Essentials and click 'Inspect'
4. In the inspector, navigate to the Network tab
5. Click on the extension icon, and click on 'Create new Duck Address' (bottom)
6. A new POST request will have appeared in the network tab, select it
7. In the 'Request Headers' section, look for 'Authorization'
8. Copy the string of randomized characters AFTER "Bearer "
9. Open Raycast and paste the string in the Configure script command. You will receive a confirmation should the string be correct.

# Cleanup
After configuring the script command, it is wise to disable the configuration command from Raycast settings.
================================================
FILE: commands/communication/duckduckgo-email-protection/configure-@duck.com-script-command.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Configure
# @raycast.mode compact
# Optional parameters:
# @raycast.icon images/duckduckgo_logo.png
# @raycast.argument1 { "type": "text", "placeholder": "@duck.com authorizationID" }
# @raycast.packageName DuckDuckGo Email Protection
# Documentation:
# @raycast.description Use this script command to configure your @duck.com authorizationID
# @raycast.author Rediwed
# @raycast.authorURL github.com/Rediwed
on run argv
set prefix to do shell script "curl -X POST https://quack.duckduckgo.com/api/email/addresses --header 'Authorization: Bearer " & (item 1 of argv) & "'"
if text 3 through 9 of prefix is "address" then
setAuthorizationID(item 1 of argv)
else
tell me to error "Could not configure authorizationID. Duck.com API result: " & prefix
end if
end run
on setAuthorizationID(authorizationID)
try
return do shell script "defaults write com.dpe.ddgEmailProtection AuthorizationID " & authorizationID
on error
tell me to error "Authorization ID not set, please run configure script command"
end try
end setAuthorizationID
================================================
FILE: commands/communication/duckduckgo-email-protection/generate-unique-email-address.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Generate Unique Address
# @raycast.mode compact
# Optional parameters:
# @raycast.icon images/duckduckgo_logo.png
# @raycast.packageName DuckDuckGo Email Protection
# Documentation:
# @raycast.description This script command generates a unique private @duck.com email address.
# @raycast.author Rediwed
# @raycast.authorURL github.com/Rediwed
on run
set prefix to do shell script "curl -X POST https://quack.duckduckgo.com/api/email/addresses --header 'Authorization: Bearer " & getAuthorizationID() & "'"
if text 3 through 9 of prefix is "address" then
set uniqueAddress to text 13 through -3 of prefix & "@duck.com"
set the clipboard to uniqueAddress
return uniqueAddress & " copied to clipboard!"
else
tell me to error "An error has occured: " & prefix
end if
end run
on getAuthorizationID()
try
return do shell script "defaults read com.dpe.ddgEmailProtection AuthorizationID"
on error
tell me to error "Authorization ID not set, please run configure script command"
end try
end getAuthorizationID
================================================
FILE: commands/communication/emojis/emoji-copy.sh
================================================
#!/bin/bash
# Dependency: emoj (https://github.com/sindresorhus/emoj)
# Install via npm: `npm install --global emoj`
# @raycast.title Search and Copy First Related Emoji
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Copy first emoji related to input.
# @raycast.icon 📙
# @raycast.mode compact
# @raycast.packageName Communication
# @raycast.schemaVersion 1
# @raycast.argument1 { "type": "text", "placeholder": "Search for..." }
if ! command -v emoj &> /dev/null; then
echo "emoj command is required (https://github.com/sindresorhus/emoj).";
exit 1;
fi
emojis=$(emoj -c "$1")
if [ -z "$emojis" ]; then
echo "No emojis found for \"${1}\""
exit 0
fi
echo "Copied emoji for \"$1\""
================================================
FILE: commands/communication/emojis/emojis-search.sh
================================================
#!/bin/bash
# Dependency: emoj (https://github.com/sindresorhus/emoj)
# Install via npm: `npm install --global emoj`
# @raycast.title Search Emojis
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Search for emojis related to input.
# @raycast.icon 📙
# @raycast.mode fullOutput
# @raycast.packageName Communication
# @raycast.schemaVersion 1
# @raycast.argument1 { "type": "text", "placeholder": "Search for..." }
if ! command -v emoj &> /dev/null; then
echo "emoj command is required (https://github.com/sindresorhus/emoj).";
exit 1;
fi
emojis=$(emoj "$1")
if [ -z "$emojis" ]; then
echo "No emojis found for \"${1}\""
exit 0
fi
echo "Emojis found for \"$1\":"
echo ""
echo "$emojis"
echo ""
================================================
FILE: commands/communication/emojis/random-emoji.sh
================================================
#!/usr/bin/env bash
# Dependency: This script requires `jq` cli installed: https://stedolan.github.io/jq/
# Install via homebrew: `brew install jq`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Random Emoji
# @raycast.mode silent
# @raycast.packageName Emojis
# Optional parameters:
# @raycast.icon 🎲
# Documentation:
# @raycast.description Copy a random emoji to the clipboard.
# @raycast.author Tomohiro Nishimura
# @raycast.authorURL https://github.com/Sixeight
LANG="en_US.UTF-8"
if ! command -v jq &> /dev/null; then
echo "jq command is required (https://github.com/jqlang/jq).";
exit 1;
fi
IFS=$'\n' read -d '' -r -a EMOJIS < <(curl -s https://raw.githubusercontent.com/github/gemoji/master/db/emoji.json | jq -r '.[] | .emoji' && printf '\0')
EMOJI="${EMOJIS[$RANDOM % ${#EMOJIS[@]}]}"
echo -n "$EMOJI" | pbcopy
echo "$EMOJI"
================================================
FILE: commands/communication/gmail/google-gmail.sh
================================================
#!/bin/bash
# @raycast.title Gmail
# @raycast.author Michael Aigner
# @raycast.authorURL https://github.com/tonka3000
# @raycast.description Open gmail.com in the default browser
# @raycast.icon images/google-gmail-logo.png
# @raycast.mode silent
# @raycast.packageName Google
# @raycast.schemaVersion 1
open https://gmail.com
================================================
FILE: commands/communication/google-meet/meet.sh
================================================
#!/bin/bash
# @raycast.schemaVersion 1
# @raycast.title Open Google Meet
# @raycast.mode silent
# @raycast.packageName Google
# @raycast.icon images/logo.png
# @raycast.author Mujib Azizi
# @raycast.authorURL https://github.com/mujibazizi
# @raycast.description Start a Google Meet session
open https://meet.google.com/new
MAX_TRIES=10
TRIES=0
DEFAULT_BROWSER=$(defaults read ~/Library/Preferences/com.apple.LaunchServices/com.apple.launchservices.secure.plist | awk -F'\"' '/http;/{print window[(NR)-1]}{window[NR]=$2}')
get_url () {
if [ "$DEFAULT_BROWSER" = "com.google.chrome" ]; then
URL=$(osascript -e 'tell application "Chrome" to URL of active tab of front window as text')
elif [ "$DEFAULT_BROWSER" = "com.brave.browser" ]; then
URL=$(osascript -e 'tell application "Brave" to URL of active tab of front window as text')
elif [ "$DEFAULT_BROWSER" = "com.apple.safari" ]; then
URL=$(osascript -e 'tell application "Safari" to return URL of front document')
elif [ "$DEFAULT_BROWSER" = "org.mozilla.firefox" ]; then
URL=$(osascript -e 'tell applcation "Firefox" to activate')
echo "There is no support for Firefox yet. Please copy the URL manually"
exit 0
fi
}
while true; do
((TRIES++))
# Allow some time between each iteration to perform an attempt
sleep 1
# As we're doing `while true`, we do want to make sure we can
# exit the script when we feel we've tried too many times.
if [[ "$TRIES" -gt "$MAX_TRIES" ]]; then
echo "Could not copy Google Meet url"
break;
fi
get_url
# First, we'll check if we are still on the Google Meet page.
if [[ $URL != "https://meet.google.com"* ]]; then
continue
fi
# Next, we want to make sure it's not still loading.
if [[ $URL == *"new"* ]]; then
continue
fi
echo $URL | pbcopy
echo "Copied Google Meet url"
break
done
================================================
FILE: commands/communication/imessage-2fa.sh
================================================
#!/bin/bash
### Requires Raycast to have Full Disk Access:
### https://spin.atomicobject.com/2020/05/22/search-imessage-sql/
## Contributions welcome to improve regular expressions.
# @raycast.title 2FA from iMessages
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.author Thiago Holanda
# @raycast.authorURL https://twitter.com/tholanda
# @raycast.description Get most recent two-factor authentication code from iMessages.
# @raycast.icon 🔐
# @raycast.mode silent
# @raycast.packageName iMessage
# @raycast.schemaVersion 1
sqlite_path="$HOME/Library/Messages/chat.db"
regex="(^| |\s|\t|\R|G-|:)([0-9]{5,8})"
query="
select
message.rowid,
ifnull(handle.uncanonicalized_id, chat.chat_identifier) AS sender,
message.service,
datetime(message.date / 1000000000 + 978307200, 'unixepoch', 'localtime') AS message_date,
message.text
from
message
left join chat_message_join
on chat_message_join.message_id = message.ROWID
left join chat
on chat.ROWID = chat_message_join.chat_id
left join handle
on message.handle_id = handle.ROWID
where
is_from_me = 0
and text is not null
and length(text) > 0
and (
text glob '*[0-9][0-9][0-9][0-9][0-9]*'
or text glob '*[0-9][0-9][0-9][0-9][0-9][0-9]*'
or text glob '*[0-9][0-9][0-9][0-9][0-9][0-9][0-9]*'
or text glob '*[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]*'
)
order by
message.date desc
limit 50
"
while read -r line; do
IFS='|'
read -a columns <<< "${line}"
id=${columns[0]}
sender=${columns[1]}
date=${columns[3]}
message=${columns[4]}
if [[ $message =~ $regex ]]; then
matchedCode="${BASH_REMATCH[2]}"
echo $matchedCode | pbcopy
echo "Copied \"$matchedCode\" from $sender on $date"
exit
fi
done <<< "$(sqlite3 $sqlite_path "$query")"
echo 'No two factor authentication codes found'
================================================
FILE: commands/communication/let-me-google-that.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Let Me Google That
# @raycast.mode silent
# Optional parameters:
# @raycast.icon 🤡
# @raycast.packageName Communication
# Documentation:
# @raycast.description Let Me Google That For You
# @raycast.author Leo Fritsch
# @raycast.authorURL https://github.com/leofritsch
# Get the content of the clipboard
clipboard=$(pbpaste)
# change spaces to plus signs
url_encoded=$(echo "${clipboard}" | sed 's/ /+/g')
# Construct the URL string with the encoded clipboard content
url="https://letmegooglethat.com/?q=${url_encoded}"
# Copy the URL to the clipboard
echo "${url}" | pbcopy
echo -e "Copied to clipboard: ${url}"
================================================
FILE: commands/communication/mail/open-most-recent-email.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open Most Recent Email
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ✉️
# @raycast.packageName Mail
# Documentation:
# @raycast.description Open the last received email in your inbox in Mail.app
# @raycast.author Ben Yoon
# @raycast.authorURL https://github.com/benyn
tell application "Mail"
if not (first message of inbox exists) then
# Trigger a check for new email just in case.
check for new mail
log "No emails found in your inbox. Checking for new email."
return
end if
# Get the first email from each account inbox and find the one that was received last.
# `first message of inbox` is inadequate since it refers to
# the first message of the first account inbox.
set lastReceivedMessage to missing value
repeat with accountInbox in mailboxes of inbox
if first message of accountInbox exists then
set firstMessage to first message of accountInbox
if lastReceivedMessage is missing value then
set lastReceivedMessage to firstMessage
else if (date received of lastReceivedMessage) < (date received of firstMessage) then
set lastReceivedMessage to firstMessage
end if
end if
end repeat
open lastReceivedMessage
# Show nothing at the end (prevent "missing value" from being shown).
log ""
end tell
================================================
FILE: commands/communication/messenger/messenger-open-conversation.applescript
================================================
#!/usr/bin/osascript
# Dependency: This script requires Messenger to be installed: https://www.messenger.com/desktop
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open Conversation
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/messenger.png
# @raycast.packageName Messenger
# @raycast.argument1 { "type": "text", "placeholder": "Name" }
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
on run argv
### Configuration ###
# Delay time before triggering the keystroke for the Search
# (used only when Messenger needs to be initialized)
set keystrokeDelay to 2.5
# Delay time before triggering the "⌘1" keystroke
set conversationKeystrokeDelay to 1
### End of configuration ###
if application "Messenger" is running then
do shell script "open -a Messenger"
else
do shell script "open -a Messenger"
delay keystrokeDelay
end if
tell application "System Events" to tell process "Messenger"
keystroke "k" using command down
keystroke item 1 of argv
delay conversationKeystrokeDelay
keystroke "1" using command down
end tell
end run
================================================
FILE: commands/communication/say.sh
================================================
#!/bin/bash
# @raycast.title Say
# @raycast.author Felipe Turcheti
# @raycast.authorURL https://felipeturcheti.com
# @raycast.description Convert text to audible speech.
# @raycast.icon 🗣
# @raycast.mode silent
# @raycast.packageName Communication
# @raycast.schemaVersion 1
# @raycast.argument1 { "type": "text", "placeholder": "Say this...", "optional": false }
say "$1"
================================================
FILE: commands/communication/share-secret-doppler.py
================================================
#!/usr/bin/env python3
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Share Secret from Clipboard
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/doppler-logo.png
# @raycast.argument1 { "type": "text", "placeholder": "Expire Views (1)", "optional": true }
# @raycast.argument2 { "type": "text", "placeholder": "Expire Days (1)", "optional": true }
# @raycast.packageName Doppler
# @Documentation:
# @raycast.author Petr Nikolaev
# @raycast.authorURL https://github.com/PitNikola
# @raycast.description Share secret securely using https://share.doppler.com/.
import json
import sys
import urllib.request
import subprocess
expire_views = sys.argv[1]
expire_days = sys.argv[2]
if not expire_views:
expire_views = 1
if not expire_days:
expire_days = 1
def read_from_clipboard():
return subprocess.check_output(
'pbpaste', env={'LANG': 'en_US.UTF-8'}).decode('utf-8')
def write_to_clipboard(output):
process = subprocess.Popen(
'pbcopy', env={'LANG': 'en_US.UTF-8'}, stdin=subprocess.PIPE)
process.communicate(output.encode())
url = "https://api.doppler.com/v1/share/secrets/plain"
payload = {
"expire_views": expire_views,
"expire_days": expire_views
}
payload['secret'] = read_from_clipboard()
headers = {"Content-Type": "application/json"}
request = urllib.request.Request(url)
payload = json.dumps(payload)
payload_as_bytes = payload.encode('utf-8')
request.add_header('Content-Type', 'application/json')
request.add_header('Content-Length', len(payload_as_bytes))
try:
response = urllib.request.urlopen(request, payload_as_bytes)
except urllib.error.HTTPError as err:
print("Failed to create secret. HTTP Error code: {}".format(err.code))
sys.exit(1)
except urllib.error.URLError as err:
print("Failed to create secret: {}".format(err.reason))
sys.exit(1)
else:
json_response = json.load(response)
authenticated_url = json_response['authenticated_url']
write_to_clipboard(authenticated_url)
print("Secret URL copied to clipboard")
================================================
FILE: commands/communication/slack/add-slack-reminder.template.sh
================================================
#!/bin/bash
# API: https://api.slack.com/methods/reminders.add
# Parameters
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Add Reminder
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName Slack
# @raycast.icon ⏰
# @raycast.argument1 { "type": "text", "placeholder": "What" }
# @raycast.argument2 { "type": "text", "placeholder": "When" }
# Documentation:
# @raycast.description Create a Slack reminder
# @raycast.author Zeb Pykosz
# @raycast.authorURL https://github.com/zebapy
# Configuration
# To create a new API token, do the following:
# 1. Create a new Slack app at https://api.slack.com/authentication/basics
# 2. Add `reminders:write` to the user token scopes
# 3. Install the app to your workplace
# 4. Insert your OAuth access token below
API_TOKEN=""
if [[ -z "$API_TOKEN" ]]
then
echo "No API token provided"
exit 1
fi
RESPONSE=$(
curl \
--header "Content-Type: application/json" \
--header "Authorization: Bearer $API_TOKEN" \
--request POST \
--data "{ 'text': '$1', 'time': '$2' }" \
--silent \
--output /dev/null \
--show-error \
--fail \
"https://slack.com/api/reminders.add"
)
if [[ "$RESPONSE" =~ "error" ]]
then
echo "Failed to add reminder in Slack"
exit 1
else
echo "Added reminder '$1 $2' in Slack!"
exit 0
fi
================================================
FILE: commands/communication/slack/clear-slack-DND-status.sh
================================================
#!/bin/bash
# API: https://slack.com/api/dnd.endDnd
# Parameters
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Clear Slack DND
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName Slack
# @raycast.icon images/slack-logo.png
# Documentation:
# @raycast.description Clear DND Status in Slack
# @raycast.author Sam Ching
# @raycast.authorURL https://github.com/samching
# Configuration
# To create a new API token, do the following:
# 1. Create a new Slack app at https://api.slack.com/authentication/basics
# 2. Add `dnd:write` to the user token scopes
# 3. Install the app to your workplace
# 4. Insert your OAuth access token below
API_TOKEN="XXXXXX"
# Main program
if [[ -z "$API_TOKEN" ]]
then
echo "No API token provided"
exit 1
fi
RESPONSE=$(
curl \
--header "Content-Type: application/json" \
--header "Authorization: Bearer $API_TOKEN" \
--request POST \
--silent \
--show-error \
--fail \
"https://slack.com/api/dnd.endDnd"
)
if [[ "$RESPONSE" =~ "error" ]]
then
echo "Failed to clear DND status in Slack"
exit 1
else
echo "Cleared DND status in Slack"
exit 0
fi
================================================
FILE: commands/communication/slack/clear-slack-status.template.sh
================================================
#!/bin/bash
# How to use this script?
# It's a template which needs further setup. Duplicate the file,
# remove `.template.` from the filename and set an API token.
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Clear Status
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName Slack
# @raycast.icon 🧼
# Documentation:
# @raycast.description Clear your status in Slack.
# @raycast.author Thomas Paul Mann
# @raycast.authorURL https://github.com/thomaspaulmann
# To create a new API token, do the following:
# 1. Create a new Slack app at https://api.slack.com/authentication/basics
# 2. Add `users.profile:write` to the user token scopes
# 3. Install the app to your workplace
# 4. Insert your OAuth access token below
API_TOKEN=""
if [[ -z "$API_TOKEN" ]]
then
echo "No API token provided"
exit 1
fi
RESPONSE=$(
curl \
--header "Content-Type: application/json" \
--header "Authorization: Bearer $API_TOKEN" \
--request POST \
--data "{ 'profile': { 'status_text': '', 'status_emoji': '' } }" \
--silent \
--output /dev/null \
--show-error \
--fail \
"https://slack.com/api/users.profile.set"
)
if [[ "$RESPONSE" =~ "error" ]]
then
echo "Failed to clear status in Slack"
exit 1
else
echo "Cleared status in Slack"
exit 0
fi
================================================
FILE: commands/communication/slack/set-slack-DND-status.sh
================================================
#!/bin/bash
# API: https://slack.com/api/dnd.setSnooze
# Parameters
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Set DND Status
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName Slack
# @raycast.argument1 { "type": "text", "placeholder": "number of minutes", "percentEncoded": true, "optional": true}
# @raycast.icon images/slack-logo.png
# Documentation:
# @raycast.description Set your DND status in Slack
# @raycast.author Sam Ching
# @raycast.authorURL https://github.com/samching
# Configuration
# To create a new API token, do the following:
# 1. Create a new Slack app at https://api.slack.com/authentication/basics
# 2. Add `dnd:write` to the user token scopes
# 3. Install the app to your workplace
# 4. Insert your OAuth access token below
API_TOKEN="XXXXXX"
# Default expiration (in mins)
DEFAULT_STATUS_EXPIRATION_IN_MINUTES=30
# Minutes until the the status will expire
STATUS_EXPIRATION_IN_MINUTES="${1}"
# Main program
if [[ -z "$API_TOKEN" ]]
then
echo "No API token provided"
exit 1
fi
if [[ -z "$STATUS_EXPIRATION_IN_MINUTES" ]]
then
STATUS_EXPIRATION_IN_MINUTES=$DEFAULT_STATUS_EXPIRATION_IN_MINUTES # default expiration
fi
RESPONSE=$(
curl \
--header "Content-Type: application/x-www-form-urlencoded" \
--request POST \
--data "token=$API_TOKEN&num_minutes=$STATUS_EXPIRATION_IN_MINUTES" \
--silent \
--show-error \
--fail \
"https://slack.com/api/dnd.setSnooze"
)
if [[ "$RESPONSE" =~ "error" ]]
then
echo "Failed to set status in Slack"
exit 1
else
echo "Turned DND on in Slack for $STATUS_EXPIRATION_IN_MINUTES" minutes
exit 0
fi
================================================
FILE: commands/communication/slack/set-slack-status-spotify.sh
================================================
#!/bin/bash
# API: https://api.slack.com/methods/users.profile.set
# Parameters
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Set Status in Slack to Spotify Song
# @raycast.mode inline
# @raycast.refreshTime 30s
# Optional parameters:
# @raycast.packageName Slack
# @raycast.icon images/slack-logo.png
# Documentation:
# @raycast.description Set your status in Slack to a song currently playing in Spotify.
# @raycast.author alongat
# @raycast.authorURL https://github.com/alongat
# Configuration
# To create a new API token, do the following:
# 1. Create a new Slack app at https://api.slack.com/authentication/basics
# 2. Add `users.profile:write` to the user token scopes
# 3. Install the app to your workplace
# 4. Insert your OAuth access token below
# SLACK Token
API_TOKEN="XXXX"
# Song playing on Spotify
SONG=""
# Minutes until the the status will expire (Empty string will not expire the status)
STATUS_EXPIRATION_IN_MINUTES="2"
# Lock is used to know if this script updated the status in slack, so not to just clear the status.
LOCK="spotify.lock"
function getSongAndState() {
SONG="$(osascript -e 'tell application "Spotify" to artist of current track & " - " & name of current track' | cut -c1-99)"
STATE=$(osascript -e 'tell application "Spotify" to player state')
STATUS_EMOJI=":heads-down:"
}
function resetStatus() {
if [ ! -f "$LOCK" ]; then
echo "$LOCK not exists. doing nothing"
return
fi
echo 'Resetting status'
STATUS_EMOJI=""
SONG=""
STATUS_EXPIRATION_IN_MINUTES=""
setStatus
rm $LOCK
}
function setExperation() {
if [[ -z "$STATUS_EXPIRATION_IN_MINUTES" ]]
then
STATUS_EXPIRATION=0
else
CURRENT_UNIX_TIME=$(date +%s)
STATUS_EXPIRATION=$(($CURRENT_UNIX_TIME + ($STATUS_EXPIRATION_IN_MINUTES * 60)))
fi
}
function setStatus() {
if [ ! -f "$LOCK" ]; then
echo "$LOCK not exists. doing nothing"
return
fi
setExperation
RESPONSE=$(
curl \
--header "Content-Type: application/json" \
--header "Authorization: Bearer $API_TOKEN" \
--request POST \
--data "{ 'profile': { 'status_text': '$SONG', 'status_emoji': '$STATUS_EMOJI', 'status_expiration': $STATUS_EXPIRATION } }" \
--silent \
--show-error \
--fail \
"https://slack.com/api/users.profile.set"
)
}
# Main program
if [[ -z "$API_TOKEN" ]]
then
echo "No API token provided"
exit 1
fi
pgrep Spotify > /dev/null
if [ $? -ne 0 ]; then
echo 'Spotify is not running, exiting'
resetStatus
exit 0
fi
getSongAndState
if [[ "$STATE" != "playing" ]]; then
resetStatus
else
touch $LOCK
setStatus
fi
if [[ "$RESPONSE" =~ "error" ]]
then
echo "Failed to set status in Slack"
exit 1
else
echo "Status set to $STATUS_EMOJI : $SONG"
exit 0
fi
================================================
FILE: commands/communication/slack/set-slack-status.template.sh
================================================
#!/bin/bash
# How to use this script?
# It's a template which needs further setup. Duplicate the file,
# remove `.template.` from the filename and set an API token.
# Optionally, adjust the status text and emoji as well as
# the command title and icon to fit your Slack status.
#
# API: https://api.slack.com/methods/users.profile.set
# Parameters
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Set Status to Coffee
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName Slack
# @raycast.icon ☕️
# Documentation:
# @raycast.description Set your status in Slack.
# @raycast.author Thomas Paul Mann
# @raycast.authorURL https://github.com/thomaspaulmann
# Configuration
# To create a new API token, do the following:
# 1. Create a new Slack app at https://api.slack.com/authentication/basics
# 2. Add `users.profile:write` to the user token scopes
# 3. Install the app to your workplace
# 4. Insert your OAuth access token below
API_TOKEN=""
# Short status text (max. 100 characters)
STATUS_TEXT="Coffee"
# String referencing an emoji enabled for the Slack team
STATUS_EMOJI=":coffee:"
# Minutes until the the status will expire (Empty string will not expire the status)
STATUS_EXPIRATION_IN_MINUTES="30"
# Main program
if [[ -z "$API_TOKEN" ]]
then
echo "No API token provided"
exit 1
fi
if [[ -z "$STATUS_EXPIRATION_IN_MINUTES" ]]
then
STATUS_EXPIRATION=0
else
CURRENT_UNIX_TIME=$(date +%s)
STATUS_EXPIRATION=$(($CURRENT_UNIX_TIME + ($STATUS_EXPIRATION_IN_MINUTES * 60)))
fi
RESPONSE=$(
curl \
--header "Content-Type: application/json" \
--header "Authorization: Bearer $API_TOKEN" \
--request POST \
--data "{ 'profile': { 'status_text': '$STATUS_TEXT', 'status_emoji': '$STATUS_EMOJI', 'status_expiration': $STATUS_EXPIRATION } }" \
--silent \
--show-error \
--fail \
"https://slack.com/api/users.profile.set"
)
if [[ "$RESPONSE" =~ "error" ]]
then
echo "Failed to set status in Slack"
exit 1
else
echo "Set status to coffee in Slack"
exit 0
fi
================================================
FILE: commands/communication/slack/set-slack-wfh-status.sh
================================================
#!/bin/bash
# API: https://api.slack.com/methods/users.profile.set
# Parameters
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Set WFH Status in Slack
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName Slack
# @raycast.icon images/slack-logo.png
# Documentation:
# @raycast.description Set your status in Slack to WFH or WFO depending on your WiFi
# @raycast.author alongat
# @raycast.authorURL https://github.com/alongat
# Configuration
# To create a new API token, do the following:
# 1. Create a new Slack app at https://api.slack.com/authentication/basics
# 2. Add `users.profile:write` to the user token scopes
# 3. Install the app to your workplace
# 4. Insert your OAuth access token below
# 5. Fill you OFFICE_WIFI + HOME_WIFI - this will set different emoji when WFH vs WFO
# SLACK Token
API_TOKEN="XXXX"
# Minutes until the the status will expire (Empty string will not expire the status)
STATUS_EXPIRATION_IN_MINUTES="540" # 9 hours
CURRENT_UNIX_TIME=$(date +%s)
STATUS_EXPIRATION=$(($CURRENT_UNIX_TIME + ($STATUS_EXPIRATION_IN_MINUTES * 60)))
# Define home and office WiFi
HOME_WIFI="HOME-WIFI"
OFFICE_WIFI="OFFICE-WIFI"
# Main program
if [[ -z "$API_TOKEN" ]]
then
echo "No API token provided"
exit 1
fi
wifi_name=`/System/Library/PrivateFrameworks/Apple80211.framework/Resources/airport -I | awk -F: '/ SSID/{print $2}'`
if [[ "$wifi_name" == " $HOME_WIFI" ]]; then
STATUS_EMOJI=":house_with_garden:"
TEXT="WFH"
elif [[ "$wifi_name" == " $OFFICE_WIFI" ]]; then
STATUS_EMOJI=":office:"
TEXT="WFO"
fi
RESPONSE=$(
curl \
--header "Content-Type: application/json" \
--header "Authorization: Bearer $API_TOKEN" \
--request POST \
--data "{ 'profile': { 'status_text': '$TEXT', 'status_emoji': '$STATUS_EMOJI', 'status_expiration': $STATUS_EXPIRATION } }" \
--silent \
--show-error \
--fail \
"https://slack.com/api/users.profile.set"
)
if [[ "$RESPONSE" =~ "error" ]]
then
echo "Failed to set status in Slack"
exit 1
else
echo "Status set to $STATUS_EMOJI : $TEXT"
exit 0
fi
================================================
FILE: commands/communication/slack/slack-dev-mode.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Launch Dev Mode
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/slack-logo.png
# @raycast.packageName Slack
# Documentation:
# @raycast.description 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.
# @raycast.author Cody Carrell
# @raycast.authorURL https://raycast.com/sourcecody
SLACK_DEVELOPER_MENU=true open /Applications/Slack.app
================================================
FILE: commands/communication/slack/slack-jump-to.applescript
================================================
#!/usr/bin/osascript
# Dependency: This script requires Slack to be installed: https://slack.com/
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Jump to...
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/slack-logo.png
# @raycast.packageName Slack
# @raycast.argument1 { "type": "text", "placeholder": "Channel / DM / File / Misc" }
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
on run argv
### Configuration ###
# Delay time before triggering the keystroke for the Quick Switcher
# (used only when Slack needs to be initialized)
set keystrokeDelay to 5
# Delay time before entering the input
set inputDelay to 0.5
# Delay time before triggering the "enter" keystroke
set enterDelay to 0.5
### End of configuration ###
if application "Slack" is running then
do shell script "open -a Slack"
else
do shell script "open -a Slack"
delay keystrokeDelay
end if
tell application "System Events"
keystroke "k" using command down
delay inputDelay
keystroke item 1 of argv
delay enterDelay
key code 36
end tell
end run
================================================
FILE: commands/communication/slack/slack-open-workspace-by-index.applescript
================================================
#!/usr/bin/osascript
# Dependency: This script requires Slack to be installed: https://slack.com/
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open Workspace by Index
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/slack-logo.png
# @raycast.packageName Slack
# @raycast.argument1 { "type": "text", "placeholder": "Index", "optional": true }
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
on run argv
### Configuration ###
# Delay time before triggering the keystroke (used only when Slack needs to be initialized)
set keystrokeDelay to 5
### End of configuration ###
if item 1 of argv = "" then
set serviceIndex to 1
else
set serviceIndex to item 1 of argv
end if
if application "Slack" is running then
do shell script "open -a Slack"
else
do shell script "open -a Slack"
delay keystrokeDelay
end if
tell application "System Events" to keystroke serviceIndex using command down
end run
================================================
FILE: commands/communication/slack/slack-open-workspace-by-name.applescript
================================================
#!/usr/bin/osascript
# Dependency: This script requires Slack to be installed: https://slack.com/
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open Workspace by Name
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/slack-logo.png
# @raycast.packageName Slack
# @raycast.argument1 { "type": "text", "placeholder": "Name", "optional": true }
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
on run argv
### Configuration ###
# Delay time before triggering the click (used only when Slack needs to be initialized)
set clickDelay to 5
### End of configuration ###
if application "Slack" is running then
do shell script "open -a Slack"
else
do shell script "open -a Slack"
delay clickDelay
end if
tell application "System Events" to tell process "Slack"
if item 1 of argv = "" then
click menu item 1 of menu 1 of menu item "Workspace" of menu 1 of menu bar item "File" of menu bar 1
else
set workspaces to name of menu items of menu 1 of menu item "Workspace" of menu 1 of menu bar item "File" of menu bar 1
set workspaces to items 1 through -8 of workspaces
repeat with workspace in workspaces
if workspace contains item 1 of argv then
click menu item workspace of menu 1 of menu item "Workspace" of menu 1 of menu bar item "File" of menu bar 1
exit repeat
end if
end repeat
end if
end tell
end run
================================================
FILE: commands/communication/slack/slack-send-message.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.author Faris Aziz
# @raycast.authorURL https://github.com/farisaziz12
# @raycast.schemaVersion 1
# @raycast.title Send Message in Channel
# @raycast.mode silent
# @raycast.packageName Slack
# @raycast.description This script posts a message text to a slack channel and sets active status (defaults to random good morning message in #general)
# @raycast.needsConfirmation true
# @raycast.argument1 { "type": "text", "placeholder": "Channel (default: #general)", "optional": true, }
# @raycast.argument2 { "type": "text", "placeholder": "Message (default: good morning)", "optional": true, }
# @raycast.argument3 { "type": "text", "placeholder": "Set Active? y/n", "optional": true, }
# Optional parameters:
# @raycast.icon images/slack-logo.png
on openChannel(channel)
tell application "Slack"
activate
tell application "System Events"
keystroke "k" using {command down}
delay 0.5
keystroke channel
delay 0.5
key code 36
delay 0.5
end tell
end tell
end openChannel
on sendMessage(msg)
tell application "Slack"
activate
tell application "System Events"
keystroke msg
delay 0.5
key code 36
end tell
end tell
end sendMessage
on slashCommand(cmd)
tell application "Slack"
activate
tell application "System Events"
key code 44
delay 0.5
keystroke cmd
delay 0.5
key code 36
end tell
end tell
end slashCommand
on pressReturn()
tell application "Slack"
activate
tell application "System Events"
delay 1
key code 36
end tell
end tell
end pressReturn
on run argv
set channel to item 1 of argv
set message to item 2 of argv
set setActive to item 3 of argv
set today to do shell script "date +%A"
set todayText to "Happy " & today & "!"
set goodMorningTexts to {"Good Morning all!", "Good Morning Everyone!", todayText }
set randomItemNum to random number from 1 to count of goodMorningTexts
set randomGoodMorningText to item randomItemNum of goodMorningTexts as string
-- if no channel argument set #general as default
if channel = "" then
set channelToSendTo to "#general"
else
set channelToSendTo to channel
end if
-- if no message argument set random good morning message as default
if message = "" then
set messageToSend to randomGoodMorningText
else
set messageToSend to message
end if
openChannel(channelToSendTo)
-- setting to active will not work if already active
if setActive = "y" or setActive = "Y" then
sendMessage(messageToSend)
slashCommand("Set yourself as active")
pressReturn()
log messageToSend & " sent To " & channelToSendTo &" and status set to active!"
else if setActive = "n" or setActive = "N" or setActive = "" -- default is no
sendMessage(messageToSend)
log messageToSend & " sent To " & channelToSendTo &"!"
else
log "Invalid argument for set active. Specify setting active using 'y' or 'n'"
end if
end run
================================================
FILE: commands/communication/xkcdpass.sh
================================================
#!/bin/bash
# Dependency: requires xkcdpass (https://github.com/redacted/XKCD-password-generator).
# Install via pip: `pip install xkcdpass`
# @raycast.title Generate Passphrase
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Use [xkcdpass](https://github.com/redacted/XKCD-password-generator) to create a passphrase.
# @raycast.icon 🔐
# @raycast.mode silent
# @raycast.packageName Communication
# @raycast.schemaVersion 1
if ! command -v xkcdpass &> /dev/null; then
echo "xkcdpass is required (https://pypi.org/project/xkcdpass/).";
exit 1;
fi
passphrase=$(xkcdpass)
echo -n $passphrase | pbcopy
echo "Copied passphrase"
================================================
FILE: commands/communication/zoom/leave-meeting.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.author Faris Aziz
# @raycast.authorURL https://github.com/farisaziz12
# @raycast.schemaVersion 1
# @raycast.title Leave Meeting
# @raycast.mode silent
# @raycast.packageName Zoom
# @raycast.description Leaves Current Zoom meeting
# @raycast.needsConfirmation true
# Optional parameters:
# @raycast.icon images/zoom-logo.png
tell application "zoom.us"
activate
tell application "System Events"
keystroke "w" using {command down}
delay 0.5
key code 36
log "Meeting left"
end tell
end tell
================================================
FILE: commands/communication/zoom/rename-profile.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Rename Profile
# @raycast.description Rename your profile in Zoom Meeting App (Mac Only) and cliclick.
# @raycast.mode silent
# @raycast.packageName Zoom
# @raycast.argument1 { "type": "text", "placeholder": "AFK for?" }
# Optional parameters:
# @raycast.icon images/zoom-logo.png
# Documentation:
# @raycast.author Leo Voon
# @raycast.authorURL https://github.com/leovoon
on run argv
tell application "System Events"
tell application process "zoom.us"
set frontmost to true
set windowIsOpen to false
set participantsWindow to missing value
set renameWindow to missing value
repeat with w in windows
if name of w contains "Participants" then
set windowIsOpen to true
set participantsWindow to w
exit repeat
end if
end repeat
delay 0.5
set foundRename to false
-- Hover on name
do shell script "/opt/homebrew/bin/cliclick m:" & 1183 & "," & 124
delay 0.5
-- Hover on More button
do shell script "/opt/homebrew/bin/cliclick m:" & 1400 & "," & 124
delay 0.5
-- Click More button
do shell script "/opt/homebrew/bin/cliclick c:" & 1400 & "," & 124
delay 0.5
-- Click Arrow Down
do shell script "/opt/homebrew/bin/cliclick kp:arrow-down kp:arrow-down kp:return"
delay 0.5
-- Target Rename and Hit Return Key
do shell script "/opt/homebrew/bin/cliclick kp:return"
-- Edit Input, modify here for your needs
delay 0.5
set newName to "YOUR NAME -" & ( item 1 of argv )
delay 0.5
do shell script "/opt/homebrew/bin/cliclick c:" & 888 & "," & 430
delay 0.5
key code 51 using {command down}
keystroke newName
delay 0.5
do shell script "/opt/homebrew/bin/cliclick c:" & 880 & "," & 517
end tell
end tell
end run
================================================
FILE: commands/communication/zoom/toggle-mic.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.author Luigi Cardito
# @raycast.authorURL https://github.com/lcardito
# @raycast.author Faris Aziz
# @raycast.authorURL https://github.com/farisaziz12
# @raycast.schemaVersion 1
# @raycast.title Toggle Microphone
# @raycast.mode silent
# @raycast.packageName Zoom
# @raycast.description Mute/Unmute your microphone in the current meeting
# Optional parameters:
# @raycast.icon images/zoom-logo.png
tell application "zoom.us"
activate
tell application "System Events"
keystroke "a" using {shift down, command down}
log "Toggle mute"
end tell
end tell
================================================
FILE: commands/communication/zoom/toggle-video.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.author Luigi Cardito
# @raycast.authorURL https://github.com/lcardito
# @raycast.author Faris Aziz
# @raycast.authorURL https://github.com/farisaziz12
# @raycast.schemaVersion 1
# @raycast.title Toggle Video
# @raycast.mode silent
# @raycast.packageName Zoom
# @raycast.description Show/Hide your microphone in the current meeting
# Optional parameters:
# @raycast.icon images/zoom-logo.png
tell application "zoom.us"
activate
tell application "System Events"
keystroke "v" using {shift down, command down}
log "Toggle video"
end tell
end tell
================================================
FILE: commands/conversions/change-case/camelcase.py
================================================
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Camel Case
# @raycast.mode inline
# @raycast.packageName Change Case
# Optional parameters:
# @raycast.icon ./images/camelcase-light.png
# @raycast.iconDark ./images/camelcase-dark.png
# Documentation:
# @raycast.author Robert Cooper
# @raycast.authorURL https://github.com/robertcoopercode
# @raycast.description Change to clipboard text to camel case
import subprocess
import re
always_uppercase = r"""\bXML|HTML|CSS|JSON|FYI|AOL|ATM|BBC|CD|FAQ|GAIM|GNU|GTK|HIRD|HIV
|HURD|IEEE|IOU|IRA|IUPAC|JPEG|LCD|NAACP|NAC|NATO|NCAA|NOAD|OEM|PHP|ROM|SAT|SFMOMA|SQL|USA|VHDL|VHSIC|W3C
|LOL|WTF\b"""
always_uppercase_re = re.compile(always_uppercase, re.I | re.X)
def __dict_replace(s, d):
"""Replace substrings of a string using a dictionary."""
for key, value in d.items():
s = s.replace(key, value)
return s
SMALL = "a|an|and|as|at|but|by|en|for|if|in|of|on|or|the|to|v\.?|via|vs\.?"
PUNCT = r"""!"#$%&'‘()*+,\-./:;?@[\\\]_`{|}~"""
SMALL_WORDS = re.compile(r"^(%s)$" % SMALL, re.I)
INLINE_PERIOD = re.compile(r"[a-z][.][a-z]", re.I)
UC_ELSEWHERE = re.compile(r"[%s]*?[a-zA-Z]+[A-Z]+?" % PUNCT)
CAPFIRST = re.compile(r"^[%s]*?([A-Za-z])" % PUNCT)
SMALL_FIRST = re.compile(r"^([%s]*)(%s)\b" % (PUNCT, SMALL), re.I)
SMALL_LAST = re.compile(r"\b(%s)[%s]?$" % (SMALL, PUNCT), re.I)
SUBPHRASE = re.compile(r"([:.;?!][ ])(%s)" % SMALL)
APOS_SECOND = re.compile(r"^[dol]{1}['‘]{1}[a-z]+$", re.I)
ALL_CAPS = re.compile(r"^[A-Z\s%s]+$" % PUNCT)
UC_INITIALS = re.compile(r"^(?:[A-Z]{1}\.{1}|[A-Z]{1}\.{1}[A-Z]{1})+$")
MAC_MC = re.compile(r"^([Mm]a?c)(\w+)")
def titlecase(text):
"""
Titlecases input text
This filter changes all words to Title Caps, and attempts to be clever
about *un*capitalizing SMALL words like a/an/the in the input.
The list of "SMALL words" which are not capped comes from
the New York Times Manual of Style, plus 'vs' and 'v'.
"""
lines = re.split("[\r\n]+", text)
processed = []
for line in lines:
all_caps = ALL_CAPS.match(line)
words = re.split("[\t ]", line)
tc_line = []
for word in words:
if all_caps:
if UC_INITIALS.match(word):
tc_line.append(word)
continue
else:
word = word.lower()
if APOS_SECOND.match(word):
word = word.replace(word[0], word[0].upper())
word = word.replace(word[2], word[2].upper())
tc_line.append(word)
continue
if INLINE_PERIOD.search(word) or UC_ELSEWHERE.match(word):
tc_line.append(word)
continue
if SMALL_WORDS.match(word):
tc_line.append(word.lower())
continue
match = MAC_MC.match(word)
if match:
tc_line.append(
"%s%s" % (match.group(1).capitalize(), match.group(2).capitalize())
)
continue
hyphenated = []
for item in word.split("-"):
hyphenated.append(CAPFIRST.sub(lambda m: m.group(0).upper(), item))
tc_line.append("-".join(hyphenated))
result = " ".join(tc_line)
result = SMALL_FIRST.sub(
lambda m: "%s%s" % (m.group(1), m.group(2).capitalize()), result
)
result = SMALL_LAST.sub(lambda m: m.group(0).capitalize(), result)
result = SUBPHRASE.sub(
lambda m: "%s%s" % (m.group(1), m.group(2).capitalize()), result
)
processed.append(result)
return "\n".join(processed)
def titlecase_plus(text):
"""The titlecase module assumes words in all UPPERCASE should be ignored.
This works for words like HTML, FYI, ID, etc., but not generally. Just work
around for now by going to .lower first. Then, replace any well known
"always" uppercase"""
text = titlecase(text.lower())
def upcase(m):
return m.group().upper()
return always_uppercase_re.sub(upcase, text)
def getClipboardData():
p = subprocess.Popen(["pbpaste"], stdout=subprocess.PIPE)
data = p.stdout.read()
return tryDecode(data)
def setClipboardData(data):
p = subprocess.Popen(["pbcopy"], stdin=subprocess.PIPE)
p.stdin.write(tryEncode(data))
p.stdin.close()
def tryDecode(s):
try:
return s.decode('utf-8')
except:
return s
def tryEncode(s):
try:
return s.encode('utf-8')
except:
return s
clipboard = str(getClipboardData())
result = titlecase_plus(clipboard).replace(" ", "")
result = result[0].lower() + result[1:]
setClipboardData(result)
print(result)
================================================
FILE: commands/conversions/change-case/kebabcase.py
================================================
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Kebab Case
# @raycast.mode inline
# @raycast.packageName Change Case
# Optional parameters:
# @raycast.icon ./images/kebabcase-light.png
# @raycast.iconDark ./images/kebabcase-dark.png
# Documentation:
# @raycast.author Robert Cooper
# @raycast.authorURL https://github.com/robertcoopercode
# @raycast.description Change to clipboard text to kebab case
import subprocess
def getClipboardData():
p = subprocess.Popen(["pbpaste"], stdout=subprocess.PIPE)
data = p.stdout.read()
return tryDecode(data)
def setClipboardData(data):
p = subprocess.Popen(["pbcopy"], stdin=subprocess.PIPE)
p.stdin.write(tryEncode(data))
p.stdin.close()
def tryDecode(s):
try:
return s.decode('utf-8')
except:
return s
def tryEncode(s):
try:
return s.encode('utf-8')
except:
return s
clipboard = str(getClipboardData())
result = clipboard.lower().replace(" ", "-").replace("_", "-")
setClipboardData(result)
print(result)
================================================
FILE: commands/conversions/change-case/lowercase.py
================================================
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Lowercase
# @raycast.mode inline
# @raycast.packageName Change Case
# Optional parameters:
# @raycast.icon ./images/lowercase-light.png
# @raycast.iconDark ./images/lowercase-dark.png
# Documentation:
# @raycast.author Robert Cooper
# @raycast.authorURL https://github.com/robertcoopercode
# @raycast.description Change clipboard text to lowercase
import subprocess
def getClipboardData():
p = subprocess.Popen(["pbpaste"], stdout=subprocess.PIPE)
data = p.stdout.read()
return tryDecode(data)
def setClipboardData(data):
p = subprocess.Popen(["pbcopy"], stdin=subprocess.PIPE)
p.stdin.write(tryEncode(data))
p.stdin.close()
def tryDecode(s):
try:
return s.decode('utf-8')
except:
return s
def tryEncode(s):
try:
return s.encode('utf-8')
except:
return s
clipboard = str(getClipboardData())
result = clipboard.lower()
setClipboardData(result)
print(result)
================================================
FILE: commands/conversions/change-case/snakecase.py
================================================
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Snake Case
# @raycast.mode inline
# @raycast.packageName Change Case
# Optional parameters:
# @raycast.icon ./images/snakecase-light.png
# @raycast.iconDark ./images/snakecase-dark.png
# Documentation:
# @raycast.author Robert Cooper
# @raycast.authorURL https://github.com/robertcoopercode
# @raycast.description Change to clipboard text to snake case
import subprocess
import re
def getClipboardData():
p = subprocess.Popen(["pbpaste"], stdout=subprocess.PIPE)
data = p.stdout.read()
return tryDecode(data)
def setClipboardData(data):
p = subprocess.Popen(["pbcopy"], stdin=subprocess.PIPE)
p.stdin.write(tryEncode(data))
p.stdin.close()
def tryDecode(s):
try:
return s.decode('utf-8')
except:
return s
def tryEncode(s):
try:
return s.encode('utf-8')
except:
return s
clipboard = str(getClipboardData())
result = re.sub(r"([a-z])([A-Z])", r"\1_\2", clipboard)
result = result.lower().replace(" ", "_").replace("-", "_")
setClipboardData(result)
print(result)
================================================
FILE: commands/conversions/change-case/titlecase.py
================================================
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Title Case
# @raycast.mode inline
# @raycast.packageName Change Case
# Optional parameters:
# @raycast.icon ./images/titlecase-light.png
# @raycast.iconDark ./images/titlecase-dark.png
# Documentation:
# @raycast.author Robert Cooper
# @raycast.authorURL https://github.com/robertcoopercode
# @raycast.description Change to clipboard text to title case
import re
import subprocess
always_uppercase = r"""\bXML|HTML|CSS|JSON|FYI|AOL|ATM|BBC|CD|FAQ|GAIM|GNU|GTK|HIRD|HIV
|HURD|IEEE|IOU|IRA|IUPAC|JPEG|LCD|NAACP|NAC|NATO|NCAA|NOAD|OEM|PHP|ROM|SAT|SFMOMA|SQL|USA|VHDL|VHSIC|W3C
|LOL|WTF\b"""
always_uppercase_re = re.compile(always_uppercase, re.I | re.X)
def __dict_replace(s, d):
"""Replace substrings of a string using a dictionary."""
for key, value in d.items():
s = s.replace(key, value)
return s
SMALL = "a|an|and|as|at|but|by|en|for|if|in|of|on|or|the|to|v\.?|via|vs\.?"
PUNCT = r"""!"#$%&'‘()*+,\-./:;?@[\\\]_`{|}~"""
SMALL_WORDS = re.compile(r"^(%s)$" % SMALL, re.I)
INLINE_PERIOD = re.compile(r"[a-z][.][a-z]", re.I)
UC_ELSEWHERE = re.compile(r"[%s]*?[a-zA-Z]+[A-Z]+?" % PUNCT)
CAPFIRST = re.compile(r"^[%s]*?([A-Za-z])" % PUNCT)
SMALL_FIRST = re.compile(r"^([%s]*)(%s)\b" % (PUNCT, SMALL), re.I)
SMALL_LAST = re.compile(r"\b(%s)[%s]?$" % (SMALL, PUNCT), re.I)
SUBPHRASE = re.compile(r"([:.;?!][ ])(%s)" % SMALL)
APOS_SECOND = re.compile(r"^[dol]{1}['‘]{1}[a-z]+$", re.I)
ALL_CAPS = re.compile(r"^[A-Z\s%s]+$" % PUNCT)
UC_INITIALS = re.compile(r"^(?:[A-Z]{1}\.{1}|[A-Z]{1}\.{1}[A-Z]{1})+$")
MAC_MC = re.compile(r"^([Mm]a?c)(\w+)")
def titlecase(text):
"""
Titlecases input text
This filter changes all words to Title Caps, and attempts to be clever
about *un*capitalizing SMALL words like a/an/the in the input.
The list of "SMALL words" which are not capped comes from
the New York Times Manual of Style, plus 'vs' and 'v'.
"""
lines = re.split("[\r\n]+", text)
processed = []
for line in lines:
all_caps = ALL_CAPS.match(line)
words = re.split("[\t ]", line)
tc_line = []
for word in words:
if all_caps:
if UC_INITIALS.match(word):
tc_line.append(word)
continue
else:
word = word.lower()
if APOS_SECOND.match(word):
word = word.replace(word[0], word[0].upper())
word = word.replace(word[2], word[2].upper())
tc_line.append(word)
continue
if INLINE_PERIOD.search(word) or UC_ELSEWHERE.match(word):
tc_line.append(word)
continue
if SMALL_WORDS.match(word):
tc_line.append(word.lower())
continue
match = MAC_MC.match(word)
if match:
tc_line.append(
"%s%s" % (match.group(1).capitalize(), match.group(2).capitalize())
)
continue
hyphenated = []
for item in word.split("-"):
hyphenated.append(CAPFIRST.sub(lambda m: m.group(0).upper(), item))
tc_line.append("-".join(hyphenated))
result = " ".join(tc_line)
result = SMALL_FIRST.sub(
lambda m: "%s%s" % (m.group(1), m.group(2).capitalize()), result
)
result = SMALL_LAST.sub(lambda m: m.group(0).capitalize(), result)
result = SUBPHRASE.sub(
lambda m: "%s%s" % (m.group(1), m.group(2).capitalize()), result
)
processed.append(result)
return "\n".join(processed)
def titlecase_plus(text):
"""The titlecase module assumes words in all UPPERCASE should be ignored.
This works for words like HTML, FYI, ID, etc., but not generally. Just work
around for now by going to .lower first. Then, replace any well known
"always" uppercase"""
text = titlecase(text.lower())
def upcase(m):
return m.group().upper()
return always_uppercase_re.sub(upcase, text)
def getClipboardData():
p = subprocess.Popen(["pbpaste"], stdout=subprocess.PIPE)
data = p.stdout.read()
return tryDecode(data)
def setClipboardData(data):
p = subprocess.Popen(["pbcopy"], stdin=subprocess.PIPE)
p.stdin.write(tryEncode(data))
p.stdin.close()
def tryDecode(s):
try:
return s.decode('utf-8')
except:
return s
def tryEncode(s):
try:
return s.encode('utf-8')
except:
return s
clipboard = str(getClipboardData())
result = titlecase_plus(clipboard)
setClipboardData(result)
print(result)
================================================
FILE: commands/conversions/change-case/uppercase.py
================================================
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Uppercase
# @raycast.mode inline
# @raycast.packageName Change Case
# Optional parameters:
# @raycast.icon ./images/uppercase-light.png
# @raycast.iconDark ./images/uppercase-dark.png
# Documentation:
# @raycast.author Robert Cooper
# @raycast.authorURL https://github.com/robertcoopercode
# @raycast.description Change to clipboard text to uppercase
import subprocess
def getClipboardData():
p = subprocess.Popen(["pbpaste"], stdout=subprocess.PIPE)
data = p.stdout.read()
return tryDecode(data)
def setClipboardData(data):
p = subprocess.Popen(["pbcopy"], stdin=subprocess.PIPE)
p.stdin.write(tryEncode(data))
p.stdin.close()
def tryDecode(s):
try:
return s.decode('utf-8')
except:
return s
def tryEncode(s):
try:
return s.encode('utf-8')
except:
return s
clipboard = str(getClipboardData())
result = clipboard.upper()
setClipboardData(result)
print(result)
================================================
FILE: commands/conversions/clipboard-ocr.sh
================================================
#!/bin/bash
# Dependency: `brew install pngpaste tesseract`
# pngpaste required to grab image from clipboard
# tesseract required to OCR
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title OCR Image
# @raycast.mode fullOutput
# Optional parameters:
# @raycast.icon 📋
# @raycast.packageName Clipboard
# Documentation:
# @raycast.description OCR Image from Clipboard
# @raycast.author xxchan
# @raycast.authorURL https://github.com/xxchan
# credit to @laixintao https://www.kawabangga.com/posts/4876
pngpaste - | tesseract stdin stdout
================================================
FILE: commands/conversions/clipboard-to-markdown.js
================================================
#!/usr/bin/env node
// Dependency: This script requires Nodejs.
// Install Node: https://nodejs.org/en/download/
// Required parameters:
// @raycast.schemaVersion 1
// @raycast.title Clipboard to Markdown
// @raycast.mode silent
// Optional parameters:
// @raycast.icon 📋
// @raycast.packageName Conversions
// Documentation:
// @raycast.description Automatically take the content found in the clipboard and turn it into Markdown
// @raycast.author Alessandra Pereyra
// @raycast.authorURL https://github.com/alessandrapereyra
// Based on the code from
// https://github.com/raycast/script-commands/blob/master/commands/conversions/create-markdown-table.js
const child_process = require("child_process");
function pbpaste() {
return child_process.execSync("pbpaste").toString();
}
function pbcopy(data) {
return new Promise(function (resolve, reject) {
const child = child_process.spawn("pbcopy");
child.on("error", function (err) {
reject(err);
});
child.on("close", function (err) {
resolve(data);
});
child.stdin.write(data);
child.stdin.end();
});
}
function processLine(content) {
if (
content.startsWith("* ") ||
content.startsWith("- ") ||
content.startsWith("+ ")
) {
return "* " + processContent(content.substring(2));
}
return processContent(content);
}
function processLines(content) {
const lines = content.split("\n");
const markdownLines = lines.map((line) => {
return processLine(line);
});
return markdownLines.join("\n");
}
function processImageURL(content) {
return ``;
}
function processURL(content) {
return `[${content}](${content})`;
}
function processText(content) {
return content;
}
function processContent(content) {
if (content.startsWith("http")) {
if (content.match(/\.(jpeg|jpg|gif|png|bmp|tiff)$/) != null) {
return processImageURL(content);
} else {
return processURL(content);
}
} else {
return processText(content);
}
}
function processStoredContent(content) {
if (content.includes("\n")) {
return processLines(content);
} else {
return processContent(content);
}
}
const storedClipboardContent = pbpaste();
let markdown = processStoredContent(storedClipboardContent);
pbcopy(markdown);
================================================
FILE: commands/conversions/color-conversion.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Color Conversion
# @raycast.mode fullOutput
# @raycast.packageName Conversions
# Optional parameters:
# @raycast.icon 🎨
# @raycast.needsConfirmation false
# @raycast.argument1 { "type": "text", "placeholder": "Color (e.g. #FFEEFF | RGB(..) | RGBA(..))" }
# @raycast.argument2 { "type": "text", "placeholder": "New format (e.g. RGB | RGBA | HEX)" }
# Documentation:
# @raycast.description Convert color formats (e.g. #FFEEFF -> rgba(255,238,255,1)
# @raycast.author quelhasu
# @raycast.authorURL https://github.com/quelhasu
function rgbToHex() {
RGB=$(echo "$1" | awk -F '[()]' '{print $2}')
IFS=,
set $RGB
R=$1
G=$2
B=$3
printf "%02x%02x%02x" "$R" "$G" "$B"
}
color=$(echo "$1" | tr '[:upper:]' '[:lower:]')
to_format=$(echo "$2" | tr '[:upper:]' '[:lower:]')
if [ "${color:0:1}" = "#" ]; then
hex=$(echo "${color:1:6}")
elif [ "${color:0:4}" = "rgba" ] || [ "${color:0:3}" = "rgb" ]; then
hex=$(rgbToHex $color)
else
echo "Color format unknown"
fi
case $to_format in
rgb)
transformed_color=$(printf "rgb(%d,%d,%d)" 0x${hex:0:2} 0x${hex:2:2} 0x${hex:4:2})
;;
rgba)
transformed_color=$(printf "rgba(%d,%d,%d,1)" 0x${hex:0:2} 0x${hex:2:2} 0x${hex:4:2})
;;
hex)
transformed_color=$(echo "#${hex}")
;;
*)
echo "Use correct format {HEX|RGBA|RGB}"
;;
esac
if [ "${transformed_color}" ]; then
echo $transformed_color | pbcopy
echo "Color ${color} -> ${transformed_color}"
fi
================================================
FILE: commands/conversions/column-to-comma.sh
================================================
#!/bin/bash
# Dependency: requires gnu-sed (also known as gsed) (https://formulae.brew.sh/formula/gnu-sed)
# Install with Homebrew: `brew install gnu-sed`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Column to Comma
# @raycast.description Converts column to comma separated list.
# @raycast.mode silent
# @raycast.packageName Conversions
# Optional parameters:
# @raycast.icon 🗂
if ! command -v gsed &> /dev/null; then
echo "gsed command is required (https://formulae.brew.sh/formula/gnu-sed).";
exit 1;
fi
clipboard=$(pbpaste)
echo "$clipboard" | gsed ':a;N;$!ba;$s/\n/,/g' | pbcopy
================================================
FILE: commands/conversions/create-gif-from-video.py
================================================
#!/usr/bin/env python3
# Dependency: This script requires `gifski` to be installed: https://gif.ski/
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Create GIF from video
# @raycast.mode compact
# Optional parameters:
# @raycast.icon 📹
# @raycast.argument1 { "type": "text", "placeholder": "Source File Path", "optional": true }
# @raycast.argument2 { "type": "text", "placeholder": "FPS (Default: 20)", "optional": true }
# @raycast.argument3 { "type": "text", "placeholder": "Width (Default 600)", "optional": true }
# @raycast.packageName Conversions
# Documentation:
# @raycast.description Create a GIF from video, by default it takes the last screen record video
# @raycast.author Quentin Eude
# @raycast.authorURL https://github.com/qeude
import mimetypes
import os
import subprocess
import sys
from datetime import datetime
from glob import glob
from pathlib import Path
from shutil import which
if which("gifski") is None:
print("gifski is required (https://gif.ski/).")
exit(1)
if which("ffmpeg") is None:
print("ffmpeg is required (https://www.ffmpeg.org/).")
exit(1)
base_directory=f"{os.environ['HOME']}/Desktop"
default_gif_filename=f"generated_gif_{datetime.now().astimezone().isoformat()}.gif"
def is_video_file(file_path):
return mimetypes.guess_type(file_path)[0].startswith('video')
def get_last_video_file_path():
files = [x for x in glob(f"{base_directory}/**") if is_video_file(os.path.abspath(x))]
return os.path.abspath(max(files, key=os.path.getctime))
def get_default_destination_file_path(from_file_path):
destination_directory_path = os.path.abspath(os.path.join(from_file_path, os.pardir))
return os.path.join(destination_directory_path, default_gif_filename)
def safe_get(array, index):
try:
return array[index]
except IndexError:
return None
def handle_error(stderr):
if stderr:
print(stderr)
exit(1)
from_file_path=safe_get(sys.argv, 1) or get_last_video_file_path()
if not from_file_path:
print("No video file have been found at the specified path.")
exit(1)
if os.path.isdir(from_file_path) or not is_video_file(from_file_path):
print("Source file should be a valid video file.")
exit(1)
frame_rate=safe_get(sys.argv, 2) or 20
width=safe_get(sys.argv, 3) or 600
to_file_path=get_default_destination_file_path(from_file_path)
try:
int_width = int(width)
except Exception as e:
print(f"Width should be a valid integer between 1 and 5120.")
exit(1)
if int_width > 5120 or int_width < 1:
print(f"Width should be a valid integer between 1 and 5120.")
exit(1)
try:
int_frame_rate = int(frame_rate)
except Exception as e:
print(f"Frame rate should be valid integer between 1 and 60.")
exit(1)
if int_frame_rate <= 60 and int_frame_rate >= 1:
mp4_filename=f".{os.path.splitext(os.path.basename(from_file_path))[0]}_{datetime.now().astimezone().isoformat()}.mp4"
mp4_file_path=os.path.join(os.path.dirname(from_file_path), mp4_filename)
cmd = ["ffmpeg", "-y", "-loglevel", "panic", "-err_detect", "aggressive", "-fflags", "discardcorrupt", "-i", from_file_path, "-c:v", "libx264", "-preset", "slow", "-crf", "18", "-c:a", "copy", mp4_file_path]
stderr_str = subprocess.run(cmd, stdout=subprocess.DEVNULL, stderr=subprocess.PIPE).stderr
handle_error(stderr_str)
cmd = ["gifski", "--repeat", "0", "-W", str(int_width), "--fps", str(int_frame_rate), "-o", to_file_path, mp4_file_path]
stderr_str = subprocess.run(cmd, stdout=subprocess.DEVNULL, stderr=subprocess.PIPE).stderr
handle_error(stderr_str)
os.remove(mp4_file_path)
subprocess.run("pbcopy", universal_newlines=True, input=to_file_path)
print("GIF successfully generated 🎉")
exit(0)
print(f"Frame rate should be valid integer between 1 and 60.")
exit(0)
================================================
FILE: commands/conversions/create-markdown-table.js
================================================
#!/usr/bin/env node
// Dependency: This script requires Nodejs.
// Install Node: https://nodejs.org/en/download/
// Required parameters:
// @raycast.schemaVersion 1
// @raycast.title Markdown Table
// @raycast.packageName Conversions
// @raycast.mode silent
// Optional parameters:
// @raycast.icon 🧱
// @raycast.argument1 { "type": "text", "placeholder": "Columns" }
// @raycast.argument2 { "type": "text", "placeholder": "Rows" }
// Documentation:
// @raycast.description Create a markdown table template
// @raycast.author Ryan Nystrom
// @raycast.authorURL https://github.com/rnystrom
const child_process = require("child_process");
function pbcopy(data) {
return new Promise(function (resolve, reject) {
const child = child_process.spawn("pbcopy");
child.on("error", function (err) {
reject(err);
});
child.on("close", function (err) {
resolve(data);
});
child.stdin.write(data);
child.stdin.end();
});
}
let [columns, rows] = process.argv.slice(2);
columns = Math.max(parseInt(columns), 1);
rows = Math.max(parseInt(rows), 1);
let emptyTemplate = " ";
let headerTemplate = "---";
let rowArr = Array(columns + 1).fill("|");
let lines = [];
// header
lines.push(rowArr.join(emptyTemplate));
// header spacer |---|
lines.push(rowArr.join(headerTemplate));
// rows
for (let i = 0; i < rows; i++) {
lines.push(rowArr.join(emptyTemplate));
}
pbcopy(lines.join("\n"));
================================================
FILE: commands/conversions/epoch-to-human-date.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Convert Epoch to Human-Readable Date
# @raycast.mode silent
# @raycast.packageName Conversions
#
# Optional parameters:
# @raycast.icon ⏱
# @raycast.needsConfirmation false
# @raycast.argument1 {"type": "text", "placeholder": "Timestamp Epoch"}
#
# Documentation:
# @raycast.description Convert epoch to human-readable date.
# @raycast.author Siyuan Zhang
# @raycast.authorURL https://github.com/kastnerorz
epoch=${1}
size=${#epoch}
if [[ $size == "10" ]];
then
human=$(echo `date -r $epoch "+%F %T"`)
echo -n "$human" | pbcopy
else
human=$(echo `date -r $(($epoch/1000)) "+%F %T"`)
echo -n "$human" | pbcopy
fi
echo "Converted $epoch to $human"
================================================
FILE: commands/conversions/google-docs-to-markdown.sh
================================================
#!/bin/bash
# Dependency: requires the google-docs-to-markdown npm package: https://github.com/Mr0grog/google-docs-to-markdown
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Convert Google Docs Rich Text HTML to Markdown
# @raycast.mode silent
# Optional parameters:
# @raycast.icon 📋
# @raycast.packageName Conversions
# @raycast.description A script to take the HTML pastboard type filled by google docs and convert it to nicely formatted markdown
# Documentation:
# @raycast.author Michael Bianco
# @raycast.authorURL https://github.com/iloveitaly
set -euo pipefail
swift - <'):
# Format headers with emojis and bold text
if line.startswith('# '):
line = f"⚫️ **{line[2:].strip()}**\n"
elif line.startswith('## '):
line = f"◾️ **{line[3:].strip()}**\n"
elif line.startswith('### '):
line = f"▪️ **{line[4:].strip()}**\n"
elif line.startswith('#### '):
line = f"🔹 **{line[5:].strip()}**\n"
elif line.startswith('##### '):
line = f"📌 **{line[6:].strip()}**\n"
elif line.startswith('###### '):
line = f"🔰 **{line[7:].strip()}**\n"
else:
# Format bold text
line = re.sub(r'(?')) and not next.startswith(('*', '-', '```', '|', '>')):
result.append('')
return '\n'.join(result)
if __name__ == "__main__":
try:
markdown_text = paste()
converted_text = convert_markdown(markdown_text)
copy(converted_text)
print("✅ Markdown converted and copied to clipboard")
except Exception as e:
print(f"❌ Error during conversion: {str(e)}")
================================================
FILE: commands/conversions/paste-as-plain-text.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Paste and Match Style
# @raycast.mode silent
# Optional parameters:
# @raycast.icon 📋
# @raycast.packageName Conversions
# @raycast.description A script to click the "Paste and Match Style" menu item, even if it's disabled
# Documentation:
# @raycast.author Michael Bianco
# @raycast.authorURL https://github.com/iloveitaly
tell application "System Events"
tell process 1 where frontmost is true
click menu item "Paste and Match Style" of menu "Edit" of menu bar 1
end tell
end tell
================================================
FILE: commands/conversions/qr-code-screenshot-to-text.sh
================================================
#!/bin/bash
# Dependency: This script requires `jq` cli installed: https://stedolan.github.io/jq/
# Install via homebrew: `brew install jq`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Screenshot QR Code to Clipboard
# @raycast.mode silent
# @raycast.packageName QR Code
#
# Optional parameters:
# @raycast.icon images/qrcode.icns
# @raycast.currentDirectoryPath ~
# @raycast.needsConfirmation false
#
# Documentation:
# @raycast.description Decode QR Code from screenshot to clipboard using https://qrserver.com/
# @raycast.author Diego Lopes
# @raycast.authorURL https://github.com/Dihgg
if ! command -v jq &> /dev/null; then
echo "jq command is required (https://stedolan.github.io/jq/)."
exit 1
fi
TEMP_DIR=$(mktemp -d)
FILE="$TEMP_DIR/screenshot.png"
screencapture -i "$FILE"
if ! test -f "$FILE"; then
printf "Please capture a QR code"
exit 1
fi
curl -s --location --request POST 'https://api.qrserver.com/v1/read-qr-code/' --form file=@"$TEMP_DIR"/screenshot.png >> "$TEMP_DIR"/qr-code.json
DATA=$(jq -r '.[0].symbol[0].data' "$TEMP_DIR/qr-code.json")
if [ "$DATA" == "null" ]; then
ERROR=$(jq .[0].symbol[0].error "$TEMP_DIR/qr-code.json")
printf "%s" "$ERROR"
exit 1
fi
echo "$DATA" | pbcopy
printf "Gathered QR Code Content to Clipboard"
exit 0;
================================================
FILE: commands/conversions/qrcode-generate.sh
================================================
#!/bin/bash
# @raycast.title QR Code Generation
# @raycast.description QR Code Generation
# @raycast.author wyhaya
# @raycast.authorURL https://github.com/wyhaya
# @raycast.icon images/qrcode.png
# @raycast.mode fullOutput
# @raycast.packageName Conversions
# @raycast.schemaVersion 1
# @raycast.argument1 { "type": "text", "placeholder": "Content" }
echo $1 | curl -s qrcode.show -d @-
================================================
FILE: commands/conversions/raw-html-to-rich-text-clipboard.sh
================================================
#!/bin/bash
# Dependency: This script requires `pandoc`: https://pandoc.org/installing.html
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Convert Raw HTML to Rich Text on Clipboard
# @raycast.mode silent
# Optional parameters:
# @raycast.icon 📋
# @raycast.packageName Conversions
# @raycast.description This script will convert raw HTML on your clipboard to rich text. It requires pandoc to be installed on your system.
# Documentation:
# @raycast.author Michael Bianco
# @raycast.authorURL https://github.com/iloveitaly
pbpaste | pandoc -f html -t rtf -s | pbcopy -pboard general -Prefer rtf
================================================
FILE: commands/conversions/rich-text-clipboard-to-markdown.sh
================================================
#!/bin/bash
# Dependency: This script requires the `pandoc` cli to be installed: https://pandoc.org/
# Install via homebrew: `brew install pandoc`
# @raycast.title Rich Text to Markdown
# @raycast.author Adam Zethraeus
# @raycast.authorURL https://github.com/adam-zethraeus
# @raycast.description Convert rich text clipboard data to GitHub Flavored Markdown using Pandoc
#
# @raycast.icon 📝
#
# @raycast.mode silent
# @raycast.packageName Conversions
# @raycast.schemaVersion 1
if ! command -v pandoc &> /dev/null; then
echo "pandoc is required (https://pandoc.org/).";
exit 1;
fi
export LC_CTYPE=UTF-8
osascript -e 'the clipboard as «class RTF »' | perl -ne 'print chr foreach unpack("C*",pack("H*",substr($_,11,-3)))' | pandoc --from=rtf --to=gfm | pbcopy
================================================
FILE: commands/conversions/space-fixer.sh
================================================
#!/usr/bin/env bash
# Add spaces between Chinese and English, number or symbols.
#
# Dependency: This script requires the `https://www.npmjs.com/package/pangu` package.
# Install it via `pip install pangu` or `pnpm install -g pangu` or `npm install -g pangu`.
#
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Space Fixer
# @raycast.mode silent
# Optional parameters:
# @raycast.icon 📝
# @raycast.packageName Conversions
# Documentation:
# @raycast.description Add spaces between Chinese and English, number or symbols.
# @raycast.author RealTong
# @raycast.authorURL https://raycast.com/RealTong
# pip, pnp paths
export PATH="$HOME/.pyenv/shims:$HOME/Library/pnpm:$PATH"
# nvm paths
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
# npm paths
NPM_BIN_PATH=$(which npm)
if [[ -n "$NPM_BIN_PATH" ]]; then
NPM_DIR=$(dirname "$NPM_BIN_PATH")
export PATH="$NPM_DIR:$PATH"
fi
pangu_path=$(which pangu)
if [ -z "$pangu_path" ]; then
echo "Error: pangu not found in PATH"
exit 1
fi
input=$(pbpaste)
if [ -z "$input" ]; then
echo "Input is empty"
exit 1
fi
# Call pangu : pangu -t "text"
output=$($pangu_path -t "$input")
if [ -z "$output" ]; then
echo "Output is empty"
exit 1
fi
echo $output | pbcopy
echo "Fixed Chinese text has been copied to the clipboard"
================================================
FILE: commands/conversions/strikethrough.sh
================================================
#!/usr/bin/env bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Strikethrough Text
# @raycast.mode silent
# Optional parameters:
# @raycast.icon 🔠
# @raycast.packageName Conversions
# @raycast.argument1 { "type": "text", "placeholder": "Text", "optional": true}
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Converts given text (or clipboard if no argument) to t̶e̶x̶t̶
LANG=en_US.UTF-8
if [ "$1" = "" ]; then
input=$(pbpaste)
else
input=$1
fi
output=$(python3 -c "print('\u0336'.join('$input') + '\u0336')")
echo $output | tee >(pbcopy)
================================================
FILE: commands/conversions/trim-newlines-tabs.sh
================================================
#!/bin/bash
# @raycast.schemaVersion 1
# @raycast.title Trim Newlines and Tabs
# @raycast.mode fullOutput
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Trim newlines and tabs from clipboard content.
# @raycast.icon ✂️
# @raycast.packageName Conversions
file=$( mktemp )
pbpaste > $file
output=$( tr '\n' ' ' < $file )
echo "$output" > $file
output=$( tr '\r' ' ' < $file )
echo "$output" > $file
output=$( tr '\t' ' ' < $file )
rm $file
echo -n $output
================================================
FILE: commands/conversions/unicode-superscript.sh
================================================
#!/bin/bash
# @raycast.title Unicode Superscript
# @raycast.author Adam Zethraeus
# @raycast.authorURL https://github.com/adam-zethraeus
# @raycast.description Convert clipboards text to fake unicode superscript
#
# @raycast.icon 🦸♀️
#
# @raycast.mode silent
# @raycast.packageName Conversion
# @raycast.schemaVersion 1
# @raycast.argument1 { "type": "text", "placeholder": "Text to superscript", "optional": false, "percentEncoded": true}
JXA=$(cat <<-END
function superscript(text) {
var map = {"0":"⁰","1":"¹","2":"²","3":"³","4":"⁴","5":"⁵","6":"⁶","7":"⁷","8":"⁸","9":"⁹","a":"ᵃ","b":"ᵇ","c":"ᶜ","d":"ᵈ","e":"ᵉ","f":"ᶠ","g":"ᵍ","h":"ʰ","i":"ᶦ","j":"ʲ","k":"ᵏ","l":"ˡ","m":"ᵐ","n":"ⁿ","o":"ᵒ","p":"ᵖ","q":"ᑫ","r":"ʳ","s":"ˢ","t":"ᵗ","u":"ᵘ","v":"ᵛ","w":"ʷ","x":"ˣ","y":"ʸ","z":"ᶻ","A":"ᴬ","B":"ᴮ","C":"ᶜ","D":"ᴰ","E":"ᴱ","F":"ᶠ","G":"ᴳ","H":"ᴴ","I":"ᴵ","J":"ᴶ","K":"ᴷ","L":"ᴸ","M":"ᴹ","N":"ᴺ","O":"ᴼ","P":"ᴾ","Q":"Q","R":"ᴿ","S":"ˢ","T":"ᵀ","U":"ᵁ","V":"ⱽ","W":"ᵂ","X":"ˣ","Y":"ʸ","Z":"ᶻ","+":"⁺","-":"⁻","=":"⁼","(":"⁽",")":"⁾", "q":"ᵠ", "Q":"ᵠ", "?":"ˀ", "!":"ᵎ"};
var charArray = text.split("");
for(var i = 0; i < charArray.length; i++) {
if( map[charArray[i].toLowerCase()] ) {
charArray[i] = map[charArray[i]];
}
}
text = charArray.join("");
return text;
}
var app = Application('System Events');
app.includeStandardAdditions = true;
var input = decodeURIComponent("$1");
var superscriptOutput = superscript(input);
app.setTheClipboardTo(superscriptOutput);
superscriptOutput + " copied to clipboard";
END
)
echo $JXA | osascript -l JavaScript
================================================
FILE: commands/conversions/unix-time-reader.sh
================================================
#!/bin/bash
# @raycast.schemaVersion 1
# @raycast.title Unix Time Reader From Clipboard
# @raycast.mode compact
# @raycast.packageName Conversions
#
# @raycast.icon 🕰
# @raycast.needsConfirmation false
#
# Documentation:
# @raycast.description Display Human-Readable Date from Unix Time in Clipboard
# @raycast.author Francis Feng
# @raycast.authorURL https://github.com/francisfeng
unixTime=$(pbpaste)
size=${#unixTime}
if [[ $size == "10" ]]
then
readable=$(echo `date -r $unixTime "+%F %T"`)
elif [[ $size == "13" ]]
then
readable=$(echo `date -r $(($unixTime/1000)) "+%F %T"`)
else
echo "Unix Time is not found"
exit 1
fi
echo "$unixTime -> $readable"
================================================
FILE: commands/conversions/vaporwave-text.sh
================================================
#!/bin/bash
# @raycast.title Vaporwave Text
# @raycast.author Adam Zethraeus
# @raycast.authorURL https://github.com/adam-zethraeus
# @raycast.description Convert clipboard text to vaporwave
#
# @raycast.icon 🌇
#
# @raycast.mode silent
# @raycast.packageName Conversion
# @raycast.schemaVersion 1
# @raycast.argument1 { "type": "text", "placeholder": "Text to vaporwave", "optional": false, "percentEncoded": true}
JXA=$(cat <<-END
function vaporwave(text) {
var vaporwaveMap = {
' ': ' ',
'!': '!',
'\\'': '\\'',
'#': '#',
'$': '$',
'%': '%',
'&': '&',
'\\"': '\\"',
'(': '(',
')': ')',
'*': '*',
'+': '+',
'\\,': ',',
'-': '-',
'.': '.',
'/': '/',
'0': '0',
'1': '1',
'2': '2',
'3': '3',
'4': '4',
'5': '5',
'6': '6',
'7': '7',
'8': '8',
'9': '9',
':': ':',
';': ';',
'<': '<',
'=': '=',
'>': '>',
'?': '?',
'@': '@',
'A': 'A',
'B': 'B',
'C': 'C',
'D': 'D',
'E': 'E',
'F': 'F',
'G': 'G',
'H': 'H',
'I': 'I',
'J': 'J',
'K': 'K',
'L': 'L',
'M': 'M',
'N': 'N',
'O': 'O',
'P': 'P',
'Q': 'Q',
'R': 'R',
'S': 'S',
'T': 'T',
'U': 'U',
'V': 'V',
'W': 'W',
'X': 'X',
'Y': 'Y',
'Z': 'Z',
'[': '[',
'\\\\': '\\\\',
']': ']',
'^': '^',
'_': '_',
'\`': '\`',
'a': 'a',
'b': 'b',
'c': 'c',
'd': 'd',
'e': 'e',
'f': 'f',
'g': 'g',
'h': 'h',
'i': 'i',
'j': 'j',
'k': 'k',
'l': 'l',
'm': 'm',
'n': 'n',
'o': 'o',
'p': 'p',
'q': 'q',
'r': 'r',
's': 's',
't': 't',
'u': 'u',
'v': 'v',
'w': 'w',
'x': 'x',
'y': 'y',
'z': 'z',
'{': '{',
'|': '|',
'}': '}',
'~': '~'
};
return text.split('').map((c) => {
vc = vaporwaveMap[c];
return vc || c;
}).join('');
}
var app = Application('System Events');
app.includeStandardAdditions = true;
var input = decodeURIComponent("$1");
var vaporwaveOutput = vaporwave(input);
app.setTheClipboardTo(vaporwaveOutput);
vaporwaveOutput + ' copied to clipboard';
END
)
echo $JXA | osascript -l JavaScript
================================================
FILE: commands/conversions/what-day-is.py
================================================
#!/usr/bin/env python3
# Parameters
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title What Day Is...
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName Conversions
# @raycast.icon 📅
# @raycast.argument1 { "type": "text", "placeholder": "Date (YYYY-MM-DD)" }
# Documentation:
# @raycast.author Phil Salant
# @raycast.authorURL https://github.com/PSalant726
# @raycast.description Return the day of the week on which a particular date falls.
import sys
from datetime import datetime as dt
print(dt.fromisoformat(sys.argv[1]).strftime("%A"))
================================================
FILE: commands/conversions/zalgo-text.swift
================================================
#!/usr/bin/swift
// Required parameters:
// @raycast.schemaVersion 1
// @raycast.title Zalgo Text
// @raycast.mode silent
// @raycast.author Adam Zethraeus
// @raycast.authorURL https://github.com/adam-zethraeus
// @raycast.packageName Conversions
// @raycast.icon 👹
// @raycast.argument1 { "type": "text", "placeholder": "Text to Z̶̶͚̯͗a̩̞͜͜l̫͕ͬͨ̿g͈̫͂ͤ͆͢o̠͚̞ͥ" }
// @raycast.argument2 { "type": "text", "optional": true, "placeholder": "Intensity=5" }
// Documentation:
// @raycast.description Converts text to z̫̫̐a̳ͩl̓͂̀ͅg͔̚o̷̦̣͢ t̳͆ḛ̊͟ẍ̮̝́t̵̔ͯ͝
import Cocoa
// zalgo function credit mattt @ https://gist.github.com/mattt/b46ab5027f1ee6ab1a45583a41240033
func zalgo(_ string: String, intensity: Int = 5) -> String {
let combiningDiacriticMarks = 0x0300...0x036f
let latinAlphabetUppercase = 0x0041...0x005a
let latinAlphabetLowercase = 0x0061...0x007a
var output: [UnicodeScalar] = []
for scalar in string.unicodeScalars {
output.append(scalar)
guard (latinAlphabetUppercase).contains(numericCast(scalar.value)) ||
(latinAlphabetLowercase).contains(numericCast(scalar.value))
else {
continue
}
for _ in 0...(Int.random(in: 1...intensity)) {
let randomScalarValue = Int.random(in: combiningDiacriticMarks)
output.append(Unicode.Scalar(randomScalarValue)!)
}
}
return String(String.UnicodeScalarView(output))
}
NSPasteboard.general.clearContents()
let text = CommandLine.arguments[1]
let intensityString = CommandLine.arguments[2]
let intensity = Int(intensityString) ?? 5
let zalgoText = zalgo(text, intensity: intensity)
NSPasteboard.general.setString(zalgoText, forType: .string)
print("\(zalgoText) copied to clipboard")
================================================
FILE: commands/culture/prayer-summary.template.sh
================================================
#!/bin/bash
# How to use this script?
# It's a template which needs further setup. Duplicate the file,
# remove `.template.` from the filename and set your city and country below.
# Optionally, adjust the calculation method to fit your location.
#
# API: https://aladhan.com/prayer-times-api
# Dependency: This script requires `jq` cli installed: https://stedolan.github.io/jq/
# Install via homebrew: `brew install jq`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Prayer Summary
# @raycast.mode inline
# @raycast.refreshTime 2m
# Optional parameters:
# @raycast.icon 🕌
# @raycast.packageName Culture
# Documentation:
# @raycast.description Get the current and next prayer times for a specific city and country.
# @raycast.author Muneeb Ajaz
# @raycast.authorURL https://github.com/mianmuneebajaz
# Configuration
# Set your city and country below:
# 1. Replace CITY with your city name (e.g., "London")
# 2. Replace COUNTRY with your country name (e.g., "United Kingdom")
CITY=""
COUNTRY=""
# Calculation method (default: 3 for Muslim World League - MWL)
# Common methods:
# 1 - University of Islamic Sciences, Karachi
# 2 - Islamic Society of North America (ISNA)
# 3 - Muslim World League (MWL)
# 4 - Umm Al-Qura University, Makkah
# 5 - Egyptian General Authority of Survey
# See https://aladhan.com/prayer-times-api for all methods
METHOD="3"
# Main program
if ! command -v jq &> /dev/null; then
echo "jq is required (https://stedolan.github.io/jq/)"
exit 1
fi
if [ -z "$CITY" ] || [ -z "$COUNTRY" ]; then
echo "City and Country are required"
exit 1
fi
DATA=$(curl -s -L "http://api.aladhan.com/v1/timingsByCity?city=${CITY}&country=${COUNTRY}&method=${METHOD}")
if [ -z "$DATA" ]; then
echo "Unable to fetch prayer times"
exit 1
fi
get_time() {
echo "$DATA" | jq -r ".data.timings.$1"
}
FAJR=$(get_time "Fajr")
DHUHR=$(get_time "Dhuhr")
ASR=$(get_time "Asr")
MAGHRIB=$(get_time "Maghrib")
ISHA=$(get_time "Isha")
# Convert 24h to 12h format
to_ampm() {
date -j -f "%H:%M" "$1" "+%I:%M %p" 2>/dev/null
}
PRAYER_NAMES=("Fajr" "Dhuhr" "Asr" "Maghrib" "Isha")
PRAYER_TIMES=("$FAJR" "$DHUHR" "$ASR" "$MAGHRIB" "$ISHA")
epoch_today() {
date -j -f "%Y-%m-%d %H:%M" "$(date +%Y-%m-%d) $1" "+%s"
}
NOW=$(date +%s)
CURRENT="None (before Fajr)"
NEXT=""
NEXT_TIME=""
NEXT_EPOCH=0
LAST=""
for i in "${!PRAYER_NAMES[@]}"; do
name="${PRAYER_NAMES[$i]}"
time="${PRAYER_TIMES[$i]}"
ep=$(epoch_today "$time")
if [ "$ep" -le "$NOW" ]; then
LAST="$name"
elif [ -z "$NEXT" ]; then
NEXT="$name"
NEXT_TIME="$time"
NEXT_EPOCH="$ep"
fi
done
if [ -n "$LAST" ]; then
CURRENT="$LAST"
fi
# After Isha, next prayer is tomorrow's Fajr
if [ -z "$NEXT" ]; then
NEXT="Fajr (tomorrow)"
NEXT_TIME="$FAJR"
NEXT_EPOCH=$(($(epoch_today "$FAJR") + 86400))
fi
DIFF=$((NEXT_EPOCH - NOW))
H=$((DIFF / 3600))
M=$(((DIFF % 3600) / 60))
COUNTDOWN="${H}h ${M}m"
NEXT_AM=$(to_ampm "$NEXT_TIME")
echo "Current: $CURRENT | Next: $NEXT at $NEXT_AM in $COUNTDOWN"
================================================
FILE: commands/culture/prayer-times.sh
================================================
#!/bin/bash
# You may need to install coreutils via homebrew to make this script work (gdate function).
#
# Homebrew: https://brew.sh/
# Coreutils: https://formulae.brew.sh/formula/coreutils
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Prayer Times
# @raycast.mode inline
# @raycast.packageName Culture
# Optional parameters:
# @raycast.icon 🕌
# Documentation
# @raycast.author Emircan Erkul
# @raycast.authorURL https://emircanerkul.com
# @raycast.description Prayer Times grabbed from the aladhan.com.
data=$(curl -s -L 'http://api.aladhan.com/v1/timingsByCity?city=derince&country=turkey&method=13')
imsak=$(echo "$data" | jq --raw-output '.data.timings.Imsak')
gunes=$(echo $data | jq --raw-output '.data.timings.Sunrise')
ogle=$(echo "$data" | jq --raw-output '.data.timings.Dhuhr')
ikindi=$(echo "$data" | jq --raw-output '.data.timings.Asr')
aksam=$(echo "$data" | jq --raw-output '.data.timings.Maghrib')
yatsi=$(echo "$data" | jq --raw-output '.data.timings.Isha')
NOW=$(gdate +%s)
if [ $(($(gdate -d "$imsak" +%s) - $NOW)) -gt 0 ]; then
REMANINING=$(($(gdate -d "$imsak" +%s) - $NOW))
elif [ $(($(gdate -d "$gunes" +%s) - $NOW)) -gt 0 ]; then
REMANINING=$(($(gdate -d "$gunes" +%s) - $NOW))
elif [ $(($(gdate -d "$ogle" +%s) - $NOW)) -gt 0 ]; then
REMANINING=$(($(gdate -d "$ogle" +%s) - $NOW))
elif [ $(($(gdate -d "$ikindi" +%s) - $NOW)) -gt 0 ]; then
REMANINING=$(($(gdate -d "$ikindi" +%s) - $NOW))
elif [ $(($(gdate -d "$aksam" +%s) - $NOW)) -gt 0 ]; then
REMANINING=$(($(gdate -d "$aksam" +%s) - $NOW))
else
REMANINING=$(($(gdate -d "$yatsi" +%s) - $NOW))
fi
if [ $REMANINING -gt 0 ]; then
if [ $(($REMANINING / 3600)) -gt 0 ]; then
REMANINING="$(($REMANINING / 3600))h $(($REMANINING / 60 % 60))m $(($REMANINING % 60))s"
elif [ $(($REMANINING / 60 % 60)) -gt 0 ]; then
REMANINING="$(($REMANINING / 60 % 60))m $(($REMANINING % 60))s"
else
REMANINING="$(($REMANINING % 60))s"
fi
REMANINING="☾ $REMANINING ☽"
else
REMANINING=""
fi
output="$REMANINING $imsak ⚙︎ $gunes ⚙︎ $ogle ⚙︎ $ikindi ⚙︎ $aksam ⚙︎ $yatsi"
echo $output
================================================
FILE: commands/dashboard/bitcoin-price-usd.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Bitcoin Price
# @raycast.mode inline
# @raycast.refreshTime 1h
# @raycast.packageName Dashboard
# Optional parameters:
# @raycast.author Tanguy Le Stradic
# @raycast.authorURL https://github.com/tanguyls
# @raycast.description Get current Bitcoin price from Coindesk.
# @raycast.icon images/bitcoin-logo.png
price=$(curl -s http://api.coindesk.com/v1/bpi/currentprice.json | python -c "import json, sys; print(json.load(sys.stdin)['bpi']['USD']['rate'])")
echo "\$${price}"
================================================
FILE: commands/dashboard/countdowns/countdown-to-christmas.sh
================================================
#!/bin/bash
# You may need to install coreutils via homebrew to make this script work (gdate function).
#
# Homebrew: https://brew.sh/
# Coreutils: https://formulae.brew.sh/formula/coreutils
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Countdown to Christmas
# @raycast.mode inline
# Conditional parameters:
# @raycast.refreshTime 1h
# Optional parameters:
# @raycast.icon 🎅🏻
# Documentation:
# @raycast.author Valentin Chrétien
# @raycast.authorURL https://github.com/valentinchrt
# @raycast.description See how many days until Christmas.
XMAS=`gdate -d "Dec 25" +%j`
TODAY=`gdate +%j`
DAYS=$(($XMAS - $TODAY))
if [[ $DAYS > 0 ]]; then
echo "There are $DAYS days left until Xmas."
else
echo "Merry Xmas and Happy New year\!"
fi
================================================
FILE: commands/dashboard/countdowns/countdown-to-date.template.sh
================================================
#!/bin/bash
# How to use this script?
#
# It's a template which needs further setup. Duplicate the file,
# remove `.template.` from the filename and set the date you want.
# Optionally, adjust the raycast.title and raycast.icon according to your needs.
# You may need to install coreutils via homebrew to make this script work (gdate function).
#
# Homebrew: https://brew.sh/
# Coreutils: https://formulae.brew.sh/formula/coreutils
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Countdown to Date
# @raycast.mode inline
# Conditional parameters:
# @raycast.refreshTime 10m
# Optional parameters:
# @raycast.icon ⏱
# Documentation:
# @raycast.author Valentin Chrétien
# @raycast.authorURL https://github.com/valentinchrt
# @raycast.description See how many days/hours until a specific date.
# Configuration
# 1. Set the date you want by replacing yyyy-mm-dd in TIMESTAMP_EVENT (e.g. 2022-12-31)
# 2. Optionaly, you can set the time by editing T00:00:00+00:00
# 3. Write the message you want to display when the countdown is at 0 ("Your message!" line 46)
TIMESTAMP_EVENT=`gdate -d "yyyy-mm-ddT00:00:00+00:00" +%s`
TIMESTAMP_TODAY=`gdate +%s`
REMAINING=$(($TIMESTAMP_EVENT - $TIMESTAMP_TODAY))
DAYS_REMAINING=$(($REMAINING / 86400))
HOURS_REMAINING=$(($REMAINING % 86400 / 3600))
if [[ $DAYS_REMAINING > 0 || $HOURS_REMAINING > 0 ]]; then
echo "There are $DAYS_REMAINING days and $HOURS_REMAINING hours left until your event."
else
echo "Your message\!"
fi
================================================
FILE: commands/dashboard/countdowns/create-countdown.template.sh
================================================
#!/bin/bash
# How to use this script?
#
# It's a template which needs further setup. Duplicate the file,
# remove `.template.` from the filename and set the absolute path to the folder of your Raycast script.
# Optionally, adjust the raycast.title and raycast.icon according to your needs.
# You may need to install coreutils via homebrew to use the generated scripts (gdate function).
#
# Homebrew: https://brew.sh/
# Coreutils: https://formulae.brew.sh/formula/coreutils
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Create Countdown
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ⏱
# @raycast.argument1 { "type": "text", "placeholder": "Event Name", "percentEncoded": true }
# @raycast.argument2 { "type": "text", "placeholder": "Date (yyyy-mm-dd)", "percentEncoded": true }
# Documentation:
# @raycast.author Valentin Chrétien
# @raycast.authorURL https://github.com/valentinchrt
# @raycast.description Create countdowns via Raycast.
# Configuration
# 1. Specify the absolute path to the folder of your Raycast script in the DIRECTORY_SCRIPT_PATH variable below
# 2. Adjust title, icon and wording if you want to
# 3. Write the message you want to display when the countdown is at 0 ("Your message!" line 59)
DIRECTORY_SCRIPT_PATH=""
RAYCAST="@raycast"
SCRIPT="#!/bin/bash\n\
\n\
# Required parameters:\n\
# $RAYCAST.schemaVersion 1\n\
# $RAYCAST.title ${1} Countdown\n\
# $RAYCAST.mode inline\n\
\n\
# Optional parameters:\n\
# $RAYCAST.icon ⏱\n\
# $RAYCAST.description See how many days/hours until ${1}.\n\
# $RAYCAST.refreshTime 10m\n\
\n\
TIMESTAMP_TODAY=\`gdate +%s\`\n\
TIMESTAMP_EVENT=\`gdate -d \"${2}T00:00:00+00:00\" +%s\`\n\
\n\
REMAINING=\$((\$TIMESTAMP_EVENT - \$TIMESTAMP_TODAY))\n\
\n\
DAYS_REMAINING=\$((\$REMAINING / 86400))\n\
HOURS_REMAINING=\$((\$REMAINING % 86400 / 3600))\n\
\n\
if [[ \$DAYS_REMAINING > 0 || \$HOURS_REMAINING > 0 ]]; then\n\
echo \"There are \$DAYS_REMAINING days and \$HOURS_REMAINING hours left until ${1}.\"\n\
else\n\
echo \"Your message\!\"\n\
fi"
echo -e $SCRIPT > "$DIRECTORY_SCRIPT_PATH/countdown-${1}.sh"
chmod +x "$DIRECTORY_SCRIPT_PATH/countdown-${1}.sh"
echo Countdown created! ✅
================================================
FILE: commands/dashboard/crypto-portfolio.py
================================================
#!/usr/bin/env python3
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Crypto
# @raycast.mode inline
# @raycast.refreshTime 5m
# @raycast.packageName Money
# Optional parameters:
# @raycast.icon 💰
# Documentation:
# @raycast.description Gets crypto prices from Binance
# @raycast.author Manan Mehta
# @raycast.authorURL https://github.com/mehtamanan
import json
from urllib.request import urlopen
import sys
# Other symbols
# ETHUSDT - Ethereum / USD
# LTCUSDT - Litcoin / USD
# LTCBTC - Litecoin / Bitcoin
# ADAUSDT - Cardano / USD
# BNBUSDT - Binance Coin / USD
# DOTUSDT - Polkadot / USD
# XRPUSDT - Ripple / USD
SYMBOLS = [ 'BTCUSDT', 'ETHBTC' ]
# Fetch tickers from Binance for selected symbols
responses = []
for symbol in SYMBOLS:
try:
with urlopen('https://api.binance.com/api/v3/ticker/24hr?symbol={}'.format(symbol)) as f:
responses.append(json.load(f))
except:
print('Failed loading prices..')
sys.exit(0)
# Create and print inline message
messages = []
for r in responses:
messages.append('{}: {:.3f} ({:+.2f}%)'.format(r['symbol'], float(r['askPrice']), float(r['priceChangePercent'])))
print(' '.join(messages))
================================================
FILE: commands/dashboard/current-weather.sh
================================================
#!/bin/bash
# @raycast.title Current Weather
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Get current weather report from [wttr.in](https://wttr.in/).
# @raycast.icon 🌦️
# @raycast.mode inline
# @raycast.packageName Dashboard
# @raycast.schemaVersion 1
## Please be mindful of scalability of wttr.in if adjusting the refresh time:
## currently limited to one million requests per day
## (see https://github.com/chubin/wttr.in/blob/master/share/static/malformed-response.html).
# @raycast.refreshTime 1h
# get your ip
IP=$(dig -4 TXT +short o-o.myaddr.l.google.com @ns1.google.com | sed -r 's/^"|"$//g')
# configure
UNIT="m" # celsius
# UNIT="u" # fahrenheit
# Automatic location
LOCATION=$(curl --silent "https://ipapi.co/${IP}/postal/") # automatic location
CITY=$(curl --silent "https://ipapi.co/${IP}/city/") # for output
# Manual location
# LOCATION="Berlin" # use this if you want to manually set your location
# CITY="${LOCATION}"
curl --silent "https://wttr.in/${LOCATION}?format=${CITY}:+%c+%f+%w&${UNIT}"
================================================
FILE: commands/dashboard/doge.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title DOGE Price
# @raycast.mode inline
# @raycast.refreshTime 1h
# @raycast.packageName Dashboard
# Optional parameters:
# @raycast.icon images/dogecoin-logo.png
# Documentation:
# @raycast.description Checking DOGE coin price
# @raycast.author Clu Soh
# @raycast.authorURL https://github.com/designedbyclu
price=$(curl -s https://api.coingecko.com/api/v3/coins/dogecoin | python -c "import json, sys; print(json.load(sys.stdin)['market_data']['current_price']['usd'])")
echo "\$${price}"
================================================
FILE: commands/dashboard/ethereum-price-usd.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Ethereum Price
# @raycast.mode inline
# @raycast.refreshTime 1h
# @raycast.packageName Dashboard
# Optional parameters:
# @raycast.author Clark Dinnison
# @raycast.authorURL https://github.com/cdinnison
# @raycast.description Get current Ethereum price from CoinGecko.
# @raycast.icon images/ethereum-logo.png
price=$(curl -s https://api.coingecko.com/api/v3/coins/ethereum | python -c "import json, sys; print(json.load(sys.stdin)['market_data']['current_price']['usd'])")
echo "\$${price}"
================================================
FILE: commands/dashboard/fear-index.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Fear Index
# @raycast.mode inline
# @raycast.refreshTime 12h
# Optional parameters:
# @raycast.packageName Fear & Greed Index
# @raycast.icon 😱
# Documentation:
# @raycast.description Fear & Greed Index from CNN
# @raycast.author Astrit
# @raycast.authorURL https://github.com/astrit
url="https://money.cnn.com/data/fear-and-greed/"
result=$(curl -s $url )
result=$(echo "$result" | sed -e 's/(Fear)/↓/g')
result=$(echo "$result" | sed -e 's/(Greed)/↑/g')
greedNow=$(echo "$result" | sed -n -e 's/.*
Fear & Greed Now: *\([^<]*\).*/\1/p')
greedPrevious=$(echo "$result" | sed -n -e 's/.*
Fear & Greed Previous Close: *\([^<]*\).*/\1/p')
greedWeek=$(echo "$result" | sed -n -e 's/.*
Fear & Greed 1 Week Ago: *\([^<]*\).*/\1/p')
greedMonth=$(echo "$result" | sed -n -e 's/.*
Fear & Greed 1 Month Ago: *\([^<]*\).*/\1/p')
greedYear=$(echo "$result" | sed -n -e 's/.*
Fear & Greed 1 Year Ago: *\([^<]*\).*/\1/p')
echo "H:$greedNow D:$greedPrevious W:$greedWeek M:$greedMonth Y:$greedYear"
================================================
FILE: commands/dashboard/firebase/firebase-authentication-get-token.template.sh
================================================
#!/bin/bash
# Dependency: This script requires `jq` cli installed: https://stedolan.github.io/jq/
# Install via homebrew: `brew install jq`
# !!! This script is only template, you can use it to write own script to get your data from Firebase project !!!
# If you use Firebase email and password authentication service, this script generates an authentication token
# and copy it to your clipboard.
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Get Authorization Token
# @raycast.mode compact
# @raycast.packageName Firebase Authentication
# Optional parameters:
# @raycast.icon images/firebase.png
#
# Documentation:
# @raycast.description Get token from Firebase Authentication service
# @raycast.author João Melo
# @raycast.authorURL https://github.com/joaopcm
# you can find API_KEY on "Project settings -> General" page in Firebase
WEB_API_KEY=""
# you need to create an user with email and password on "Authentication -> Users" page in Firebase
EMAIL=""
PASSWORD=""
if ! jq --version download &> /dev/null; then
echo "download jq is required (https://stedolan.github.io/jq/).";
exit 1;
fi
if [ -z "$WEB_API_KEY" ] || [ -z "$EMAIL" ] || [ -z "$PASSWORD" ]; then
echo "Error: You must provide WEB_API_KEY, EMAIL, and PASSWORD variables"
exit 1
fi
# Generate the request body
json_data=$( jq -n -c \
--arg email "$EMAIL" \
--arg password "$PASSWORD" \
--arg returnSecureToken true '$ARGS.named' )
# Get data from Firebase Authentication service and copy the token to clipboard
curl -X POST \
"https://identitytoolkit.googleapis.com/v1/accounts:signInWithPassword?key=$WEB_API_KEY" \
--header 'Accept: */*' \
--header 'User-Agent: Raycast' \
--header 'Content-Type: application/json' \
--data-raw "$json_data" | jq -r '.idToken' | pbcopy
echo 'Authorization token copied to your clipboard!'
================================================
FILE: commands/dashboard/firebase/firebase-realtime-db-get-data.template.sh
================================================
#!/bin/bash
# Dependency: This script requires `jq` cli installed: https://stedolan.github.io/jq/
# Install via homebrew: `brew install jq`
# !!! This script is only template, you can use it to write own script to get your data from Firebase Realtime Database !!!
# I'm using an Arduino ESP-32 as outside weather station and I'm storing the temperature, humidity and barometric pressure into Firebase Realtime Database.
# I wrote this script to see those values directly in Raycast. This script is changing the text color based on the Light/Dark mode.
# Check example folder to see the result of my script and my Firebase Realtime Database structure.
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Get data from Firebase
# @raycast.mode inline
# @raycast.refreshTime 10m
# @raycast.packageName Firebase
# Optional parameters:
# @raycast.icon images/firebase.png
#
# Documentation:
# @raycast.description Get values from Firebase Realtime Database
# @raycast.author Marek Mašek
# @raycast.authorURL https://github.com/marekmasek
# you can find API_KEY on "Project settings -> General" page in Firebase
WEB_API_KEY=""
# you need to create an user with email and password on "Authentication -> Users" page in Firebase
EMAIL=""
PASSWORD=""
# This is URL to your Realtime Database in Firebase, example of DB_URL: "https://${database-name}.${database-location}.firebasedatabase.app"
DB_URL=""
if ! jq --version download &> /dev/null; then
echo "download jq is required (https://stedolan.github.io/jq/).";
exit 1;
fi
# Generate access token
TOKEN=$(curl -s -H "Content-Type: application/json" -d '{"email": "'$EMAIL'", "password": "'$PASSWORD'", "returnSecureToken": true}' 'https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyPassword?key='$WEB_API_KEY | jq -r '.idToken')
# Get data from Firebase Realtime Database
RESPONSE=$(curl -s $DB_URL'/.json?auth='$TOKEN)
# This script is changing color of the output text based on the light/dark mode activated in macOS
COLOR_MODE=$(defaults read -g AppleInterfaceStyle 2>/dev/null)
MAIN_COLOR="\u001b[97m"
if [ ${COLOR_MODE:-"Light"} == "Light" ]; then
MAIN_COLOR="\u001b[30m"
fi
# Get specific field values, round them and print the output
echo $RESPONSE | jq -r 'def colors:
{
"main": "'$MAIN_COLOR'",
"reset": "\u001b[0m",
}; colors.reset + "Temp: " + colors.main + (.outside.temp*10.0|round/10.0|tostring) + " °C" + colors.reset +" Hum: " + colors.main + (.outside.humidity|round|tostring) + " %" + colors.reset + " BP: " + colors.main + (.outside.airPressure*10.0|round/10.0|tostring) + " hPa" + colors.reset + " Room Temp: " + colors.main + (.inside.temp*10.0|round/10.0|tostring) + " °C"'
================================================
FILE: commands/dashboard/mood-meter/add-mood.js
================================================
#!/usr/bin/env node
// Dependency: This script requires Nodejs.
// Install Node: https://nodejs.org/en/download/
// Required parameters:
// @raycast.schemaVersion 1
// @raycast.title Add Mood
// @raycast.mode silent
// @raycast.packageName Dashboard
//
// Optional parameters:
// @raycast.icon ☕️
// @raycast.argument1 { "type": "text", "placeholder": "mood rating 1-5",}
// @raycast.argument2 { "type": "text", "placeholder": "Day number", "optional":true }
// Documentation:
// @raycast.description Add mood value to current or specified date
// @raycast.author Federico Miraglia
// @raycast.authorURL https://github.com/Mitra98t
const { exec } = require('child_process')
const fs = require("fs")
const homedir = require('os').homedir();
const filePath = `${homedir}/.moodTable.json`
let now = new Date()
if (!fs.existsSync(filePath)) {
exec(`echo '{}' > ${filePath}`)
}
let json = fs.readFileSync(filePath)
let parsedMoods = JSON.parse(json)
var moodVal = Number(process.argv.slice(2)[0])
var dayNum = Number(process.argv.slice(2)[1])
if (parsedMoods[now.getFullYear()] == null) {
parsedMoods[now.getFullYear()] = [[], [], [], [], [], [], [], [], [], [], [], []]
fs.writeFileSync(filePath, JSON.stringify(parsedMoods))
}
if (moodVal > 0 && moodVal <= 5) {
let dayVal = dayNum && dayNum > 0 && dayNum <= 31 ? dayNum : now.getDate()
let index = parsedMoods[now.getFullYear()][now.getMonth()].findIndex(d => d.date == dayVal)
if (index != -1)
parsedMoods[now.getFullYear()][now.getMonth()][index] = { date: dayVal, mood: moodVal }
else
parsedMoods[now.getFullYear()][now.getMonth()].push({ date: dayVal, mood: moodVal })
fs.writeFileSync(filePath, JSON.stringify(parsedMoods))
console.log("Added mood for today ☕️")
}
else console.log("Mood must be between 1 and 5")
================================================
FILE: commands/dashboard/mood-meter/display-mood-month.js
================================================
#!/usr/bin/env node
// Dependency: This script requires Nodejs.
// Install Node: https://nodejs.org/en/download/
// Required parameters:
// @raycast.schemaVersion 1
// @raycast.title Display Mood Month
// @raycast.mode inline
// @raycast.refreshTime 5s
// @raycast.packageName Dashboard
//
// Optional parameters:
// @raycast.icon ☕️
// Documentation:
// @raycast.description Displays month mood table
// @raycast.author Federico Miraglia
// @raycast.authorURL https://github.com/Mitra98t
const { exec } = require('child_process')
const fs = require("fs")
const homedir = require('os').homedir();
const filePath = `${homedir}/.moodTable.json`
if (!fs.existsSync(filePath)) {
exec(`echo '{}' > ${filePath}`)
}
let json = fs.readFileSync(filePath)
let parsedMoods = JSON.parse(json)
let now = new Date()
let bars = { full: "▓", empty: "░" }
if (parsedMoods[now.getFullYear()] == null) {
parsedMoods[now.getFullYear()] = [[], [], [], [], [], [], [], [], [], [], [], []]
fs.writeFileSync(filePath, JSON.stringify(parsedMoods))
console.log("loading...")
}
let resArr = [];
for (let i = 0; i < daysInMonth(now.getMonth(), now.getFullYear()); i++) {
let toAdd = 0
for (const day of parsedMoods[now.getFullYear()][now.getMonth()]) {
if (day.date - 1 == i) {
toAdd = day.mood
}
}
resArr.push(toAdd)
}
let res = "";
for (const day of resArr) {
let val = ""
switch (day) {
case 1:
val = `\x1b[38;5;88m${bars.full}\x1b[0m`
break;
case 2:
val = `\x1b[38;5;166m${bars.full}\x1b[0m`
break;
case 3:
val = `\x1b[38;5;214m${bars.full}\x1b[0m`
break;
case 4:
val = `\x1b[38;5;70m${bars.full}\x1b[0m`
break;
case 5:
val = `\x1b[38;5;46m${bars.full}\x1b[0m`
break;
default:
val = `${bars.empty}`
break;
}
res += val
}
console.log(res)
function daysInMonth(month, year) {
return month <= 6
? (month % 2 == 0 ? 31 : month == 1 ? isLeapYear(year) ? 29 : 28 : 30)
: (month % 2 == 0 ? 30 : 31)
}
function isLeapYear(year) {
return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
}
================================================
FILE: commands/dashboard/mood-meter/display-mood-year.js
================================================
#!/usr/bin/env node
// Dependency: This script requires Nodejs.
// Install Node: https://nodejs.org/en/download/
// Required parameters:
// @raycast.schemaVersion 1
// @raycast.title Display Mood Year
// @raycast.mode fullOutput
// @raycast.packageName Dashboard
//
// Optional parameters:
// @raycast.icon ☕️
// @raycast.argument1 { "type": "text", "placeholder": "Year", "optional": true}
// Documentation:
// @raycast.description Displays year mood table
// @raycast.author Federico Miraglia
// @raycast.authorURL https://github.com/Mitra98t
const { exec } = require('child_process')
const fs = require("fs")
const homedir = require('os').homedir();
const filePath = `${homedir}/.moodTable.json`
const monthNames = ["January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "December"
];
if (!fs.existsSync(filePath)) {
exec(`echo '{}' > ${filePath}`)
}
let json = fs.readFileSync(filePath)
let parsedMoods = JSON.parse(json)
let now = new Date()
let yearVal = Number(process.argv.slice(2)[0])
let bars = { full: "▓", empty: "░" }
if (parsedMoods[now.getFullYear()] == null) {
parsedMoods[now.getFullYear()] = [[], [], [], [], [], [], [], [], [], [], [], []]
fs.writeFileSync(filePath, JSON.stringify(parsedMoods))
}
let nowYear = yearVal && yearVal > 0 ? yearVal : now.getFullYear()
if (parsedMoods[nowYear] == null) {
console.log("Empty year!")
return
}
let resArr = [];
// * Mese parte da 0 (ottimo per index)
for (const month in parsedMoods[nowYear]) {
resArr.push([]);
for (let i = 0; i < daysInMonth(month, nowYear); i++) {
let toAdd = 0
let dayIndex = parsedMoods[nowYear][month].findIndex(d => d.date == i + 1)
if (dayIndex != -1)
toAdd = parsedMoods[nowYear][month][dayIndex].mood
resArr[month].push(toAdd)
}
}
let res = "";
for (const month in resArr) {
res += `${monthNames[month]}\n`
for (const day of resArr[month]) {
let val = ""
switch (day) {
case 1:
val = `\x1b[38;5;88m${bars.full}\x1b[0m`
break;
case 2:
val = `\x1b[38;5;166m${bars.full}\x1b[0m`
break;
case 3:
val = `\x1b[38;5;214m${bars.full}\x1b[0m`
break;
case 4:
val = `\x1b[38;5;70m${bars.full}\x1b[0m`
break;
case 5:
val = `\x1b[38;5;46m${bars.full}\x1b[0m`
break;
default:
val = `${bars.empty}`
break;
}
res += val
}
if (month != 11)
res += `\n`
}
console.log(res)
function daysInMonth(month, year) {
return month <= 6
? (month % 2 == 0 ? 31 : month == 1 ? isLeapYear(year) ? 29 : 28 : 30)
: (month % 2 == 0 ? 30 : 31)
}
function isLeapYear(year) {
return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
}
================================================
FILE: commands/dashboard/nextdns-status-check.py
================================================
#!/usr/bin/env python3
# Parameters
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title NextDNS Status
# @raycast.mode inline
# Conditional parameters:
# @raycast.refreshTime 1h
# Optional parameters:
# @raycast.packageName Dashboard
# @raycast.icon images/nextdns.png
# Documentation:
# @raycast.author Phil Salant
# @raycast.authorURL https://github.com/PSalant726
# @raycast.description Check if this machine is using NextDNS.
import json, urllib.request
request = urllib.request.Request(
method="GET",
url="https://test.nextdns.io",
headers={ "User-Agent": "curl" },
)
try:
response = urllib.request.urlopen(request)
except urllib.error.HTTPError as e:
print("Failed to get status from NextDNS:", e.code, e.reason)
exit(1)
except urllib.error.URLError as e:
print("Failed to reach NextDNS.", "Error:", e.reason)
exit(1)
else:
resp_json = json.loads(response.read().decode("utf-8"))
status = resp_json["status"]
if status == "ok":
print("✅ ", resp_json["deviceName"], "is using NextDNS via", resp_json["protocol"])
else:
print("❌ This device is not using NextDNS")
================================================
FILE: commands/dashboard/open-ai-usage.sh
================================================
#!/bin/bash
# Dependency: This script requires `jq` cli installed: https://stedolan.github.io/jq/
# Install via homebrew: `brew install jq`
# I made this thanks to article by htnosm below
# https://htnosm.hatenablog.com/entry/2023/04/02/090000
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Check Usage of OpenAI API
# @raycast.mode inline
# @raycast.packageName System
#
# Optional parameters:
# @raycast.icon 💲
#
# Documentation:
# @raycast.description Get total usage of OpenAI API
# @raycast.author nagauta
# @raycast.authorURL https://github.com/nagauta
_ORGANIZATION=""
_OPENAI_APIKEY=""
_START_DATE="$(date -u +'%Y-%m')-01"
_END_DATE="$(date -u -v+1m +'%Y-%m')-01"
echo
TOTAL_USAGE=$(curl -sSf "https://api.openai.com/dashboard/billing/usage?end_date=${_END_DATE}&start_date=${_START_DATE}" \
-H "authorization: Bearer ${_OPENAI_APIKEY}" \
| jq -r '"$" + (.total_usage | round / 100 | tostring)')
echo "Total Usage: ${TOTAL_USAGE}, Period: ${_START_DATE}-${_END_DATE}"
================================================
FILE: commands/dashboard/open-weather/weather-current.template.sh
================================================
#!/bin/bash
# Dependency: This script requires `jq` cli installed: https://stedolan.github.io/jq/
# Install via homebrew: `brew install jq`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Current Weather
# @raycast.mode inline
# @raycast.refreshTime 30m
# @raycast.packageName OpenWeather
# Optional parameters:
# @raycast.icon ⛅️
#
# Documentation:
# @raycast.description Get current weather from OpenWeather
# @raycast.author Marek Mašek
# @raycast.authorURL https://github.com/marekmasek
# you can generate API KEY here: https://home.openweathermap.org/api_keys
API_KEY=""
# city which will be used
CITY="prague"
if ! jq --version download &> /dev/null; then
echo "download jq is required (https://stedolan.github.io/jq/).";
exit 1;
fi
# Get location coordinates
LOCATION_INFO=$(curl -s 'https://photon.komoot.io/api/?lang=en&limit=1&q='$CITY)
LAT=$( jq -r '.features[0].geometry.coordinates[1]' <<< "${LOCATION_INFO}" )
LON=$( jq -r '.features[0].geometry.coordinates[0]' <<< "${LOCATION_INFO}" )
# Get weather forecast from OpenWeather
RESPONSE=$(curl -s 'https://api.openweathermap.org/data/2.5/onecall?lat='$LAT'&lon='$LON'&units=metric&appid='$API_KEY)
# This script is changing color of the output text based on the light/dark mode activated in macOS
COLOR_MODE=$(defaults read -g AppleInterfaceStyle 2>/dev/null)
MAIN_COLOR="\e[97m"
if [ ${COLOR_MODE:-"Light"} == "Light" ]; then
MAIN_COLOR="\e[30m"
fi
# Build output string
CURRENT_TEMP=$( jq -r '.current.temp*10.0|round/10.0|tostring' <<< "${RESPONSE}" )
# Print output string
printf "Temp: $MAIN_COLOR$CURRENT_TEMP °C"
================================================
FILE: commands/dashboard/open-weather/weather-forecast.template.sh
================================================
#!/bin/bash
# Dependency: This script requires `jq` cli installed: https://stedolan.github.io/jq/
# Install via homebrew: `brew install jq`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Weather Forecast
# @raycast.mode inline
# @raycast.refreshTime 30m
# @raycast.packageName OpenWeather
# Optional parameters:
# @raycast.icon ⛅️
#
# Documentation:
# @raycast.description Get weather forecast from OpenWeather
# @raycast.author Marek Mašek
# @raycast.authorURL https://github.com/marekmasek
# you can generate API KEY here: https://home.openweathermap.org/api_keys
API_KEY=""
# city which will be used
CITY="prague"
if ! jq --version download &> /dev/null; then
echo "download jq is required (https://stedolan.github.io/jq/).";
exit 1;
fi
# Get location coordinates
LOCATION_INFO=$(curl -s 'https://photon.komoot.io/api/?lang=en&limit=1&q='$CITY)
LAT=$( jq -r '.features[0].geometry.coordinates[1]' <<< "${LOCATION_INFO}" )
LON=$( jq -r '.features[0].geometry.coordinates[0]' <<< "${LOCATION_INFO}" )
# Get weather forecast from OpenWeather
RESPONSE=$(curl -s 'https://api.openweathermap.org/data/2.5/onecall?lat='$LAT'&lon='$LON'&units=metric&appid='$API_KEY)
# This script is changing color of the output text based on the light/dark mode activated in macOS
COLOR_MODE=$(defaults read -g AppleInterfaceStyle 2>/dev/null)
MAIN_COLOR="\e[97m"
RESET_COLOR="\e[0m"
if [ ${COLOR_MODE:-"Light"} == "Light" ]; then
MAIN_COLOR="\e[30m"
fi
# Build output string
OUTPUT_STRING=
for i in {0..3}
do
WORKDAY=$( date -r $( jq -r '.daily['$i'].dt' <<< "${RESPONSE}") +%a)
TEMP_DAY=$( jq -r '.daily['$i'].temp.day*10.0|round/10.0|tostring' <<< "${RESPONSE}" )
TEMP_NIGHT=$( jq -r '.daily['$i'].temp.night*10.0|round/10.0|tostring' <<< "${RESPONSE}" )
OUTPUT_STRING="$OUTPUT_STRING $WORKDAY: $MAIN_COLOR$TEMP_DAY°$RESET_COLOR / $MAIN_COLOR$TEMP_NIGHT°$RESET_COLOR"
done
# Print output string
printf "$OUTPUT_STRING C"
================================================
FILE: commands/dashboard/precious-metals.sh
================================================
#!/bin/bash
# Dependency: requires jq (https://stedolan.github.io/jq/)
# Install via Homebrew: `brew install jq`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Metals Price
# @raycast.mode inline
# @raycast.refreshTime 1h
# @raycast.packageName Dashboard
#
# Documentation:
# @raycast.description Retrieves the value of precious metals per 1 oz
# @raycast.author Stefan de Graaf
# @raycast.authorURL https://github.com/DBZFYAM
# @raycast.icon images/precious-metals.png
if ! command -v jq &> /dev/null; then
echo "jq is not installed. To install, run 'brew install jq' or visit https://stedolan.github.io/jq/";
exit 1;
fi
# Configure the values below if needed. Specify the metals to retrieve and set the desired output currency
# NOTE: Not all metals/currencies are available in all output-currencies (For example: XPT and XPD are only available in USD)
metals=("XAG" "XAU" "XPT" "XPD")
metalsLabels=("Silver" "Gold" "Platinum" "Palladium")
currency="USD"
# Leave as is
endpoint="https://forex-data-feed.swissquote.com/public-quotes/bboquotes/instrument"
metalsLength=${#metals[@]}
output=""
for (( i=1; i<${metalsLength}+1; i++ ));
do
url="${endpoint}/${metals[$i-1]}/$currency"
data=$(curl --silent $url)
response=$(echo "$data" | jq '.[0].spreadProfilePrices[] | select(.spreadProfile=="Standard") | .ask')
if [[ $i -gt 1 ]]
then
output+=" - "
fi
output+="${metalsLabels[$i-1]}: $response"
done
echo $output
================================================
FILE: commands/dashboard/sabnzbd-queue-status.template.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title SABnzbd Queue
# @raycast.mode inline
# @raycast.refreshTime 1m
# Optional parameters:
# @raycast.icon 🤖
# @raycast.packageName Dashboard
# Documentation:
# @raycast.description Show SABnzbd's queue status
# @raycast.author Jesse Claven
# @raycast.authorURL https://github.com/jesse-c
protocol="http"
address="127.0.0.1"
port="8080"
apikey="<-- API KEY -->"
full_queue_status=$(curl -s "$protocol://$address:$port/sabnzbd/api?output=json&apikey=$apikey&mode=queue")
status=$(echo "$full_queue_status" | jq -j '.queue.status')
size_left=$(echo "$full_queue_status" | jq -j '.queue.sizeleft')
size=$(echo "$full_queue_status" | jq -j '.queue.size')
speed=$(echo "$full_queue_status" | jq -j '.queue.speed')
time_left=$(echo "$full_queue_status" | jq -j '.queue.timeleft')
no_of_slots=$(echo "$full_queue_status" | jq -j '.queue.noofslots')
if [ "$status" = "Paused" ]; then
time_left="-"
speed="-"
fi
echo "🚦 $status ・ 📥 $no_of_slots ・ ⏳ $time_left ・ 💿 $size_left / $size ・ 📊 $speed"
================================================
FILE: commands/dashboard/speedtest.sh
================================================
#!/bin/bash
# Dependency: requires speedtest (https://www.speedtest.net/apps/cli)
# Install with Homebrew: `brew tap teamookla/speedtest; brew update; brew install speedtest --force`
# Afterward, accept license: `speedtest --accept-license`
# @raycast.title Speedtest
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Test download and upload connection speed using [Speedtest](https://www.speedtest.net/apps/cli).
# @raycast.icon images/speedtest-logo.png
# @raycast.mode inline
# @raycast.packageName Internet
# @raycast.refreshTime 20m
# @raycast.schemaVersion 1
if ! command -v speedtest &> /dev/null; then
echo "speedtest command is required (https://www.speedtest.net/apps/cli).";
exit 1;
fi
if ! command -v jq &> /dev/null; then
echo "jq is required (https://stedolan.github.io/jq/).";
exit 1;
fi
json=$(speedtest -f json-pretty)
report_url=$(echo "$json" | jq -r '.result.url')
ping=$(echo "$json" | jq -r '.ping.latency')
bps_down=$(echo "$json" | jq -r '.download.bandwidth')
bps_up=$(echo "$json" | jq -r '.upload.bandwidth')
divide_to_mbps=125000
mbps_down=$(echo "scale=2; $bps_down / $divide_to_mbps" | bc)
mbps_up=$(echo "scale=2; $bps_up / $divide_to_mbps" | bc)
echo "↓ ${mbps_down}mbps ↑ ${mbps_up}mbps ↔ ${ping}ms"
echo "Full report: $report_url"
================================================
FILE: commands/dashboard/stock-portfolio.rb
================================================
#!/usr/bin/env ruby
# Parameters
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Stocks
# @raycast.mode inline
# @raycast.refreshTime 1h
# Optional parameters:
# @raycast.icon 📈
# Documentation:
# @raycast.author Thomas Paul Mann
# @raycast.authorURL https://github.com/thomaspaulmann
# @raycast.description Keep track of your stock portfolio.
# Configuration
SYMBOLS = [
"AAPL",
"BYND",
"TSLA",
]
# Main program
require "json"
require "net/http"
require "uri"
if SYMBOLS.empty?
puts "No stock symbol provided"
exit(1)
end
def fetch_stock(symbol)
uri = URI("https://api.lil.software/stocks?symbol=#{symbol}")
req = Net::HTTP::Get.new(uri)
req_options = {
use_ssl: uri.scheme == "https",
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) { |http|
http.request(req)
}
if res.code == "200"
result = JSON.parse(res.body)
current = result["current"]
previous_close = result["previous_close"]
growth = ((current - previous_close) / previous_close * 100).round(1)
return "#{symbol}: #{current} (#{growth}%)"
else
puts "Failed loading stock"
exit(1)
end
end
portfolio = SYMBOLS.map { |symbol| fetch_stock symbol }
puts "#{portfolio * " "}"
================================================
FILE: commands/dashboard/system-activity.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title System Activity
# @raycast.mode inline
# @raycast.refreshTime 5s
# @raycast.packageName Dashboard
# Optional parameters:
# @raycast.icon 📈
cpu_mem=$(ps -A -o %cpu,%mem | awk '{ cpu += $1; mem += $2} END {print "CPU: "cpu"% MEM: "mem"%"}')
echo "${cpu_mem}"
================================================
FILE: commands/dashboard/tesla.template.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Tesla
# @raycast.mode fullOutput
# Optional parameters:
# @raycast.icon 🚘
# Documentation:
# @raycast.description Get the status of your Tesla vehicle
# @raycast.author Mortada Sarheed
# @raycast.authorURL https://github.com/mSarheed
### SETUP ###
## Get your token ##
# On iOS you can use the app Auth app for Tesla link: https://apps.apple.com/us/app/auth-app-for-tesla/id1552058613
# On Android you can use the app Tesla Tokens link: https://play.google.com/store/apps/details?id=net.leveugle.teslatokens&hl=en&gl=US
# Retrieve your refresh token and paste it into the varibale $refresh token
# ONLY relevant if you have multiple Tesla Vehicles and on the same Tesla Account.
#If you have multiple Tesla Vehicles, please identify the ID of your vehicle. You can use this tool https://tesla-info.com/tesla-token.php to get the vehicle ID
refresh_token=''
url="https://tesla-info.com/api/control_v2.php?refresh=$refresh_token&request=get_data"
data=$(curl -s "$url")
# Name of vehicle
name=$(echo $data | grep -o '"display_name":"[^"]*"' | awk -F':' '{print $2}' | tr -d '"')
# State
state=$(echo $data | grep -o '"state":[^,]*' | awk -F':' '{print $2}' | tr -d '"')
# Uppercase first letter
state="$(tr '[:lower:]' '[:upper:]' <<< ${state:0:1})${state:1}"
if [ "$state" == "Online" ]; then
state="\033[32m$state\033[0m ✅"
else
state="\033[31m$state\033[0m 💤"
fi
# Vehicle locked or not
locked=$(echo $data | grep -o '"locked":[^,]*' | awk -F':' '{print $2}' | tr -d '"')
locked=$(echo $locked | tr -d ' ')
if [ "$locked" = true ]; then
locked="\033[32mLocked\033[0m"
else
locked="\033[31mUnlocked\033[0m"
fi
# Sentry mode
sentry=$(echo $data | grep -o '"dashcam_state":"[^"]*"' | awk -F':' '{print $2}' | tr -d '"')
if [ "$sentry" == "Recording" ]; then
sentry="\033[31mRecording\033[0m"
else
sentry="\033[32mOff\033[0m"
fi
battery_level=$(echo $data | grep -o '"battery_level":[^,]*' | awk -F':' '{print $2}' | tr -d '"')
est_battery_range=$(echo $data | grep -o '"est_battery_range":[^,]*' | awk -F':' '{print $2}' | tr -d '"')
# Tesla shows the battery range estimate miles. If you need to show this in kilometeres instead, just uncomment the line below
est_battery_range=$(echo "$est_battery_range * 1.60934" | bc)
# Limit kilometers to no decimals
est_battery_range=$(printf "%.0f\n" "$est_battery_range")
charging_state=$(echo $data | grep -o '"charging_state":"[^"]*"' | awk -F':' '{print $2}' | tr -d '"')
minutes_to_full_charge=$(echo $data | grep -o '"minutes_to_full_charge":[^,]*' | awk -F':' '{print $2}' | tr -d '"')
charge_limit=$(echo $data | grep -o '"charge_limit_soc":[^,]*' | awk -F':' '{print $2}' | tr -d '"')
if [ "$name" == "" ]; then
echo -e "⚠️ \033[31mSORRY! - Something went wrong.\033[0m ⚠️"
echo -e ''
echo -e "\033[31mEither a bad token or the API service is down!\033[0m"
else
echo -e "🚘 Status of: \033[34m$name\033[0m 🚘"
echo ''
echo -e "➡️ Vehicle State: $state"
echo ''
echo -e "➡️ Doors: $locked 🔐"
echo ''
echo -e "➡️ Sentry: $sentry 📸"
echo ''
echo -e "➡️ Battery: \033[34m$battery_level%\033[0m 🔋"
echo ''
echo -e "➡️ Est. range: \033[34m$est_battery_range km\033[0m 🛣️"
echo ''
if [ "$charging_state" == "Charging" ]; then
echo -e "➡️ SoC Limit: \033[34m$charge_limit%\033[0m ⚡️"
echo ''
echo -e "➡️ Time left to charge limit: \033[34m$minutes_to_full_charge minutes\033[0m ⏰"
else
echo -e "➡️ Charging state: \033[31mNot charging\033[0m 🔌"
fi
fi
================================================
FILE: commands/dashboard/twitter-statistics.template.rb
================================================
#!/usr/bin/env ruby
# How to use this script?
# It's a template which needs further setup. Duplicate the file,
# remove `.template.` from the filename, set a bearer token and
# specify your Twitter username.
# Parameters
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Twitter Statistics
# @raycast.mode inline
# @raycast.refreshTime 1h
# Optional parameters:
# @raycast.packageName Twitter
# @raycast.icon images/twitter.png
# Documentation:
# @raycast.description Shows the followers, favorites and friends count of your Twitter account.
# @raycast.author Thomas Paul Mann
# @raycast.authorURL https://github.com/thomaspaulmann
# Configuration
# Get a new bearer token from https://developer.twitter.com
BEARER_TOKEN = ""
# Twitter username
USER_NAME = "raycastapp"
# Main program
require "json"
require "net/http"
require "uri"
if BEARER_TOKEN.empty?
puts "No bearer token provided"
exit(1)
end
uri = URI("https://api.twitter.com/1.1/users/show.json?screen_name=#{USER_NAME}")
req = Net::HTTP::Get.new(uri)
req["Authorization"] = "Bearer #{BEARER_TOKEN}"
req_options = {
use_ssl: uri.scheme == "https",
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) { |http|
http.request(req)
}
if res.code == "200"
result = JSON.parse(res.body)
followers_count = result["followers_count"]
favorites_count = result["favorites_count"]
friends_count = result["friends_count"]
puts "#{followers_count} Followers, #{favorites_count} Favorites and #{friends_count} Friends"
else
puts "Failed loading statistics"
exit(1)
end
================================================
FILE: commands/dashboard/world-time.sh
================================================
#!/usr/bin/env bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title World Time
# @raycast.mode inline
# @raycast.refreshTime 5s
# @raycast.packageName Dashboard
# Optional parameters:
# @raycast.icon 🕐
#
# Documentation:
# @raycast.description Show the time from elsewhere in the world
# @raycast.author Jesse Claven
# @raycast.authorURL https://github.com/jesse-c
# Timezones can be found in /usr/share/zoneinfo
nyc=$(TZ=America/New_York date +"%H:%M")
lon=$(TZ=Europe/London date +"%H:%M")
bne=$(TZ=Australia/Brisbane date +"%H:%M")
echo "New York City: $nyc | London: $lon | Brisbane: $bne"
================================================
FILE: commands/dashboard/year-progress.sh
================================================
#!/bin/bash
# Inspired by https://twitter.com/year_progress
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Year Progress
# @raycast.mode inline
# Conditional parameters:
# @raycast.refreshTime 1h
# Optional parameters:
# @raycast.icon ⏱
# @raycast.packageName Dashboard
# Documentation:
# @raycast.author Thomas Paul Mann
# @raycast.authorURL https://github.com/thomaspaulmann
# @raycast.description See the year progress on your desktop.
# Configuration
OUTPUT_INCLUDES_BAR=true
BAR_LENGTH=33
# Main program
current_year=$(date +%Y)
current_day=$(date +%j)
if [ $((current_year % 400)) -eq 0 ]
then
DAYS=366
elif [ $((current_year % 100)) -eq 0 ]
then
DAYS=365
elif [ $((current_year % 4)) -eq 0 ]
then
DAYS=366
else
DAYS=365
fi
percentage=$((100 * 10#$current_day / $DAYS))
filled_element_count=$(($BAR_LENGTH * $percentage / 100))
blank_element_count=$(($BAR_LENGTH - $filled_element_count))
bar=""
for ((i = 0; i < $filled_element_count; i++)) {
bar=${bar}"▓"
}
for ((i = 0; i < $blank_element_count; i++)) {
bar=${bar}"░"
}
if [ "$OUTPUT_INCLUDES_BAR" = true ]
then
echo ${bar}" "${percentage}"%"
else
echo ${percentage}"%"
fi
================================================
FILE: commands/dashboard/youtube-statistics.template.rb
================================================
#!/usr/bin/env ruby
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title YouTube Statistics
# @raycast.mode inline
# @raycast.refreshTime 1h
# Optional parameters:
# @raycast.packageName YouTube Statistics
# @raycast.icon images/youtube.png
# Documentation:
# @raycast.description Shows YouTube Subscribers, Views and Videos
# @raycast.author Astrit
# @raycast.authorURL https://github.com/astrit
require "json"
require "net/http"
require "uri"
# Channel ID is required
# To find your ID please follow instructions here: https://support.google.com/youtube/answer/3250431?hl=en
CHANNEL_ID = ""
# Channel KEY is required
# To create your credentials please follow instructions here: https://developers.google.com/youtube/registering_an_application
CHANNEL_KEY = ""
uri = URI("https://www.googleapis.com/youtube/v3/channels?part=statistics&id=#{CHANNEL_ID}&key=#{CHANNEL_KEY}&part=snippet")
req = Net::HTTP::Get.new(uri)
req_options = {
use_ssl: uri.scheme == "https",
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) { |http|
http.request(req)
}
if res.code == "200"
result = JSON.parse(res.body)
item = result["items"][0]
statistics = item["statistics"]
title = item["snippet"]["title"]
subs = statistics["subscriberCount"]
views = statistics["viewCount"]
videos = statistics["videoCount"]
puts "Channel: #{title}, Subs: #{subs}, Views: #{views}, Videos: #{videos}"
else
puts "Failed loading statistics"
exit(1)
end
================================================
FILE: commands/dashboards/iperf-speed-test.template.sh
================================================
#!/bin/bash
# Dependency: This script requires `iPerf` to be installed: https://iperf.fr/iperf-download.php
# Install via homebrew: `brew install iperf`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Speed Test
# @raycast.mode inline
# @raycast.refreshTime 1h
# @raycast.packageName iPerf
# Optional parameters:
# @raycast.icon 💾
# Documentation:
# @raycast.description Runs an iPerf Speed Test.
# @raycast.author Sam Wright
# @raycast.authorURL https://raycast.com/samywamy10
# Add the IP address of your iPerf server here
ip_address='192.168.86.44'
if ! command -v iperf &> /dev/null; then
echo "iperf command is required ('brew install iperf' or https://iperf.fr/iperf-download.php).";
exit 1;
fi
{ iperf3 -c $ip_address | grep 'sender' | tail -n 1 | awk '{print $7 " " $8}' && date +'%-I:%M%p'; } | tr '\n' ' ' | awk '{$3="@ "$3; print $0}'
================================================
FILE: commands/developer-utils/add-ssh-keys.template.applescript
================================================
#!/usr/bin/osascript
#######################################################
## Set keyPaths array with paths to SSH keys to add. ##
#######################################################
# Array of paths to SSH keys.
# Example: set keyPaths to { "~/.ssh/id_ed25519" }
set keyPaths to {}
# @raycast.title Add SSH Keys (with Terminal)
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Add one or multiple SSH keys to your SSH agent (with Terminal).
# @raycast.icon 🔑
# @raycast.mode silent
# @raycast.packageName Developer Utilities
# @raycast.schemaVersion 1
on implode( array, delimiter )
set AppleScript's text item delimiters to delimiter
set implodedArray to array as string
set AppleScript's text item delimiters to ""
return implodedArray
end implode
set cmd to "clear; ssh-add " & implode( keyPaths,"; clear; ssh-add " )
tell application "Terminal"
do script cmd
activate
end tell
================================================
FILE: commands/developer-utils/aws/amazon-s3-download.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title S3 Download
# @raycast.mode fullOutput
# Optional parameters:
# @raycast.icon images/amazon-s3.png
# @raycast.packageName AWS
# Documentation:
# @raycast.description Download from Amazon S3 via URL
# @raycast.argument1 { "type": "text", "placeholder": "s3://bucket/key" }
# @raycast.author Chris Cook
# @raycast.authorURL https://github.com/zirkelc
URL=$1
# Ensure AWS CLI is installed
if ! command -v aws &> /dev/null; then
echo "AWS CLI not found. Please install AWS CLI."
echo "Installation instructions: https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html"
exit 1
fi
# Try matching different S3 URL patterns
# https://dev.to/aws-builders/format-and-parse-amazon-s3-url-5e10
if [[ $URL =~ ^https?://s3\.([a-z0-9-]+)\.amazonaws\.com/([^/]+)(/(.*))?$ ]]; then
# Regional hostname with path-style
# Example: https://s3.us-east-1.amazonaws.com/bucket/key
BUCKET="${BASH_REMATCH[2]}"
KEY="${BASH_REMATCH[4]}"
elif [[ $URL =~ ^https?://([^/]+)\.s3\.([a-z0-9-]+)\.amazonaws\.com(/(.*))?$ ]]; then
# Regional hostname with virtual-hosted-style
# Example: https://bucket.s3.us-east-1.amazonaws.com/key
BUCKET="${BASH_REMATCH[1]}"
KEY="${BASH_REMATCH[4]}"
elif [[ $URL =~ ^https?://s3\.amazonaws\.com/([^/]+)(/(.*))?$ ]]; then
# Legacy hostname with path-style
# Example: https://s3.amazonaws.com/bucket/key
BUCKET="${BASH_REMATCH[1]}"
KEY="${BASH_REMATCH[3]}"
elif [[ $URL =~ ^https?://([^/]+)\.s3\.amazonaws\.com(/(.*))?$ ]]; then
# Legacy hostname with virtual-hosted-style
# Example: https://bucket.s3.amazonaws.com/key
BUCKET="${BASH_REMATCH[1]}"
KEY="${BASH_REMATCH[3]}"
elif [[ $URL =~ ^s3://([^/]+)(/(.*))?$ ]]; then
# S3 URI
# Example: s3://bucket/key
BUCKET="${BASH_REMATCH[1]}"
KEY="${BASH_REMATCH[3]}"
else
echo "Invalid URL: $URL"
echo "URL must match recognized S3 patterns."
echo "Patterns:"
echo "- Global S3 URI: s3://bucket/key"
echo "- Regional Path-Style URL: https://s3.region.amazonaws.com/bucket/key"
echo "- Regional Virtual-Hosted-Style URL: https://bucket.s3.region.amazonaws.com/key"
echo "- Legacy Path-Style URL: https://s3.amazonaws.com/bucket/key"
echo "- Legacy Virtual-Hosted-Style URL: https://bucket.s3.amazonaws.com/key"
exit 1
fi
# Trim leading slash from KEY if present
KEY="${KEY#/}"
# Check for empty bucket
if [[ -z "$BUCKET" ]]; then
echo "Error extracting bucket from URL: $URL"
exit 1
fi
DOWNLOAD_FOLDER="$HOME/Downloads"
# Ensure download folder exists
if [ ! -d "$DOWNLOAD_FOLDER" ]; then
echo "Download folder does not exist"
exit 1
fi
# Print bucket and key
echo "Bucket: $BUCKET"
echo "Key: ${KEY:-}"
echo "Download: $DOWNLOAD_FOLDER"
echo ""
if [ -z "$KEY" ]; then
# No key provided, download entire bucket
DOWNLOAD_PATH="$DOWNLOAD_FOLDER/$BUCKET"
echo "Downloading entire bucket s3://$BUCKET to $DOWNLOAD_PATH..."
RECURSIVE="--recursive"
else
# Check if the key ends with a slash, indicating it's likely a directory
if [[ "$KEY" == */ ]]; then
DOWNLOAD_PATH="$DOWNLOAD_FOLDER/$BUCKET/$KEY"
echo "Downloading directory s3://$BUCKET/$KEY to $DOWNLOAD_PATH..."
RECURSIVE="--recursive"
else
# Check if the object exists as a file
if aws s3api head-object --bucket "$BUCKET" --key "$KEY" &>/dev/null; then
# It's a file
FILENAME=$(basename "$KEY")
DOWNLOAD_PATH="$DOWNLOAD_FOLDER/$FILENAME"
echo "Downloading file s3://$BUCKET/$KEY to $DOWNLOAD_PATH..."
RECURSIVE=""
else
# It might be a directory without a trailing slash or it doesn't exist
# Try to list objects with this prefix
if aws s3api list-objects-v2 --bucket "$BUCKET" --prefix "$KEY/" --max-items 1 --query 'Contents[0].Key' --output text &>/dev/null; then
# It's a directory
DOWNLOAD_PATH="$DOWNLOAD_FOLDER/$BUCKET/$KEY"
echo "Downloading directory s3://$BUCKET/$KEY to $DOWNLOAD_PATH..."
RECURSIVE="--recursive"
else
echo "Error: No file or directory found at s3://$BUCKET/$KEY"
exit 1
fi
fi
fi
fi
# Perform the download
if aws s3 cp "s3://$BUCKET/${KEY:+$KEY}" "$DOWNLOAD_PATH" $RECURSIVE; then
echo "Downloaded successfully."
if [[ -n "$RECURSIVE" ]]; then
open "$DOWNLOAD_FOLDER/$BUCKET"
else
open "$DOWNLOAD_FOLDER"
fi
else
echo "Download failed. Error code: $?"
exit 1
fi
================================================
FILE: commands/developer-utils/aws/aws-sso-util.sh
================================================
#!/bin/bash
# Dependency: This script requires `aws-sso-util` installed: https://github.com/benkehoe/aws-sso-util
# Install via pipx: `pipx install aws-sso-util` following the instructions on https://github.com/benkehoe/aws-sso-util
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Single Sign-On
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/aws-sso-util.png
# @raycast.packageName AWS
# Documentation:
# @raycast.description Login to AWS using aws-sso-util
# @raycast.author David Molinero
# @raycast.authorURL https://github.com/doktor500
export PATH="$PATH:${HOME}/.local/bin/";
if ! aws-sso-util &> /dev/null; then
echo "aws-sso-util is required (https://github.com/benkehoe/aws-sso-util)";
exit 1;
fi
aws-sso-util login --all;
================================================
FILE: commands/developer-utils/aws/whatismyregion.sh
================================================
#!/bin/bash
# Dependency: requires curl (https://curl.se/)
# Install via homebrew: `brew install curl`
# Dependency: requires jq (https://stedolan.github.io/jq/)
# Install via homebrew: `brew install jq`
# Dependency: requires grepcidr (http://www.pc-tools.net/unix/grepcidr/)
# Install via homebrew: `brew install grepcidr`
# @raycast.schemaVersion 1
# @raycast.author Oğuzhan Yılmaz
# @raycast.authorURL https://github.com/c1982
# @raycast.title Find AWS Region by IP
# @raycast.mode fullOutput
# @raycast.packageName Developer Utilities
# @raycast.icon 🤖
# @raycast.description Copies the AWS IPv4 to the clipboard.
IPADDR=$(pbpaste)
IPRANGEFILE="${PWD}/ip-ranges.json"
download_ipranges_file(){
curl -o $IPRANGEFILE https://ip-ranges.amazonaws.com/ip-ranges.json
}
check_file_existence(){
if [ ! -f "$IPRANGEFILE" ]; then
echo "$IPRANGEFILE does not exists. Downloading..."
download_ipranges_file
fi
}
check_file_older_than_7days(){
if test `find "$IPRANGEFILE" -cmin +10080`
then
echo "$IPRANGEFILE file too old. Downloading..."
download_ipranges_file
fi
}
find_aws_prefix(){
for range in $AWS_RANGES; do
prefix=$(grepcidr "$range" <(echo "$IPADDR") >/dev/null && echo "$range")
if [[ ! -z $prefix ]]; then
echo $prefix
exit
fi
done
}
check_requirements(){
if [ -z $(which grepcidr) ];
then
echo "grepcidr not installed"
exit
fi
if [ -z $(which curl) ];
then
echo "curl not installed"
exit
fi
if [ -z $(which jq) ];
then
echo "jq not installed"
exit
fi
}
check_valid_ipv4(){
if [[ ! $IPADDR =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echo "Couldn't read valid IPv4 address from clipboard"
exit
fi
}
check_requirements
check_file_existence
check_file_older_than_7days
check_valid_ipv4
AWS_RANGES=$(cat $IPRANGEFILE | jq -r '.prefixes[] | select(.service=="EC2") | select(.ip_prefix) | .ip_prefix')
PREFIX=$(find_aws_prefix)
if [[ -z $PREFIX ]]; then
echo "$IPADDR is not in AWS range"
exit
fi
SHOW_RANGE=$(cat $IPRANGEFILE | jq '.prefixes[] | select(.service=="EC2" and .ip_prefix=="'$PREFIX'")')
echo $SHOW_RANGE | jq --arg ip $IPADDR '. + {"ip":"'$IPADDR'"}'
================================================
FILE: commands/developer-utils/base-converter.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Base Converter
# @raycast.mode compact
# Optional parameters:
# @raycast.icon 🤖
# @raycast.packageName Developer Utilities
# @raycast.author Saimir S.
# @raycast.authorURL https://www.saimirsulaj.com
# @raycast.description Utility to convert numbers between bases. Can be one number or a list of string-delimited numbers.
# @raycast.argument1 { "type": "text", "placeholder": "from base", "optional": false }
# @raycast.argument2 { "type": "text", "placeholder": "to base", "optional": false }
# @raycast.argument3 { "type": "text", "placeholder": "value", "optional": false }
num_re='^[0-9]+$'
input_base=$1;
output_base=$2;
if [ -z "$input_base" ]; then
echo "Error: \"from base\" must be defined";
exit 1;
fi
if ! [[ $input_base =~ $num_re ]] ; then
echo "Error: Input base must be a number" >&2;
exit 1;
fi
if [ -z "$output_base" ]; then
echo "Error: \"to base\" must be defined";
exit 1;
fi
if ! [[ $output_base =~ $num_re ]] ; then
echo "Error: Output base must be a number" >&2;
exit 1;
fi
if [ -z "$3" ]; then
echo "Error: \"value\" must be defined";
exit 1;
fi
# Output base has to be expressed in the base of the input base.
output_base_cov=$(echo "ibase=10; obase=$input_base; $output_base" | bc);
output="";
for num in $3; do
if ! [[ $num =~ $num_re ]] ; then
echo "Error: \"$num\" is not a number" >&2;
exit 1;
fi
num_cov=$(echo "ibase=$input_base; obase=$output_base_cov; $num" | bc);
output="$output $num_cov";
done
# Trim whitespace
output="${output##}";
echo "$output";
echo "$output" | pbcopy;
================================================
FILE: commands/developer-utils/base64-decode-input.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Base64 Decode
# @raycast.mode silent
# @raycast.packageName Developer Utilities
#
# Optional parameters:
# @raycast.icon 🔓
# @raycast.needsConfirmation false
# @raycast.argument1 { "type": "text", "placeholder": "text", "optional": false }
#
# Documentation:
# @raycast.description Decode the base64 string
# @raycast.author Bin Hua
# @raycast.authorURL https://github.com/hzb
echo $1 | base64 --decode | pbcopy
echo "Copied to clipboard"
================================================
FILE: commands/developer-utils/base64-encode-input.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Base64 Encode
# @raycast.mode silent
# @raycast.packageName Developer Utilities
#
# Optional parameters:
# @raycast.icon 🔐
# @raycast.needsConfirmation false
# @raycast.argument1 { "type": "text", "placeholder": "text", "optional": false }
#
# Documentation:
# @raycast.description Encode any text data by using base64
# @raycast.author Bin Hua
# @raycast.authorURL https://github.com/hzb
echo $1 | base64 | pbcopy
echo "Copied to clipboard"
================================================
FILE: commands/developer-utils/brew/brew-cask-upgrade.sh
================================================
#!/bin/bash
# Dependency: This script requires brew-cask-upgrade cli installed: https://github.com/buo/homebrew-cask-upgrade
# Install via Homebrew: brew tap buo/cask-upgrade
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Cask Upgrade
# @raycast.mode fullOutput
# @raycast.packageName Brew
#
# Optional parameters:
# @raycast.icon 🍺
#
# Documentation:
# @raycast.description Updates brew and upgrades every outdated app
# @raycast.author LanikSJ
# @raycast.authorURL https://github.com/LanikSJ
if ! command -v brew &> /dev/null; then
echo "brew command is required (https://brew.sh).";
exit 1;
fi
if ! command -v brew cu &> /dev/null; then
echo "brew cask upgrade command is required (https://github.com/buo/homebrew-cask-upgrade).";
exit 1;
fi
brew cu -ay
================================================
FILE: commands/developer-utils/brew/brew-doctor.sh
================================================
#!/bin/bash
#
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Doctor
# @raycast.mode fullOutput
# @raycast.packageName Brew
#
# Optional parameters:
# @raycast.icon 🍺
#
# Documentation:
# @raycast.description Run Brew Doctor
# @raycast.author Thiago Holanda
# @raycast.authorURL https://twitter.com/tholanda
if ! command -v brew &> /dev/null; then
echo "brew command is required (https://brew.sh).";
exit 1;
fi
brew doctor
================================================
FILE: commands/developer-utils/brew/brew-install.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Install a package
# @raycast.mode fullOutput
# @raycast.packageName Brew
#
# Optional parameters:
# @raycast.icon 🍺
# @raycast.needsConfirmation true
# @raycast.argument1 {"type": "text", "placeholder": "Package name"}
#
# Documentation:
# @raycast.description Installs specified brew package.
# @raycast.author Alex Zotov
# @raycast.authorURL https://github.com/lex4hex
if ! command -v brew &> /dev/null; then
echo "brew command is required (https://brew.sh).";
exit 1;
fi
brew install $1
================================================
FILE: commands/developer-utils/brew/brew-leaves.sh
================================================
#!/bin/bash
#
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Leaves
# @raycast.mode fullOutput
# @raycast.packageName Brew
#
# Optional parameters:
# @raycast.icon 🍺
#
# Documentation:
# @raycast.description Show list of installed brew formulae that are not dependencies of other installed formula.
# @raycast.author owpac
# @raycast.authorURL https://github.com/Owpac
if ! command -v brew &> /dev/null; then
echo "brew command is required (https://brew.sh).";
exit 1;
fi
brew leaves
================================================
FILE: commands/developer-utils/brew/brew-list.sh
================================================
#!/bin/bash
#
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title List
# @raycast.mode fullOutput
# @raycast.packageName Brew
#
# Optional parameters:
# @raycast.icon 🍺
#
# Documentation:
# @raycast.description Show Brew List
# @raycast.author chengzhiqi
# @raycast.authorURL https://twitter.com/1872Fate
if ! command -v brew &> /dev/null; then
echo "brew command is required (https://brew.sh).";
exit 1;
fi
brew list
================================================
FILE: commands/developer-utils/brew/brew-outdated.sh
================================================
#!/bin/bash
#
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Outdated List
# @raycast.mode fullOutput
# @raycast.packageName Brew
#
# Optional parameters:
# @raycast.icon 🍺
#
# Documentation:
# @raycast.description Show list of outdated formulae
# @raycast.author Thiago Holanda
# @raycast.authorURL https://twitter.com/tholanda
if ! command -v brew &> /dev/null; then
echo "brew command is required (https://brew.sh).";
exit 1;
fi
brew outdated --quiet
================================================
FILE: commands/developer-utils/brew/brew-services-list.sh
================================================
#!/bin/bash
#
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Services List
# @raycast.mode fullOutput
# @raycast.packageName Brew
#
# Optional parameters:
# @raycast.icon 🍺
#
# Documentation:
# @raycast.description Show Brew Services List
# @raycast.author Thiago Holanda
# @raycast.authorURL https://twitter.com/tholanda
if ! command -v brew &> /dev/null; then
echo "brew command is required (https://brew.sh).";
exit 1;
fi
brew services list
================================================
FILE: commands/developer-utils/brew/brew-services-restart.sh
================================================
#!/bin/bash
#
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Restart Service
# @raycast.mode fullOutput
# @raycast.packageName Brew
# @raycast.argument1 {"type":"text", "placeholder": "Service Name" }
#
# Optional parameters:
# @raycast.icon 🍺
#
# Documentation:
# @raycast.description Restart Service in Brew
# @raycast.author es183923
# @raycast.authorURL github.com/es183923
if ! command -v brew &> /dev/null; then
echo "brew command is required (https://brew.sh).";
exit 1;
fi
brew services restart $1
================================================
FILE: commands/developer-utils/brew/brew-services-start.sh
================================================
#!/bin/bash
#
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Start Service
# @raycast.mode fullOutput
# @raycast.packageName Brew
# @raycast.argument1 {"type":"text", "placeholder": "Service Name" }
#
# Optional parameters:
# @raycast.icon 🍺
#
# Documentation:
# @raycast.description Start Service in Brew
# @raycast.author Thiago Holanda
# @raycast.authorURL https://twitter.com/tholanda
if ! command -v brew &> /dev/null; then
echo "brew command is required (https://brew.sh).";
exit 1;
fi
brew services start $1
================================================
FILE: commands/developer-utils/brew/brew-services-stop.sh
================================================
#!/bin/bash
#
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Stop Service
# @raycast.mode fullOutput
# @raycast.packageName Brew
# @raycast.argument1 {"type":"text", "placeholder": "Service Name" }
#
# Optional parameters:
# @raycast.icon 🍺
#
# Documentation:
# @raycast.description Stop Service in Brew
# @raycast.author Thiago Holanda
# @raycast.authorURL https://twitter.com/tholanda
if ! command -v brew &> /dev/null; then
echo "brew command is required (https://brew.sh).";
exit 1;
fi
brew services stop $1
================================================
FILE: commands/developer-utils/brew/brew-uninstall-application.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Uninstall
# @raycast.mode compact
# Optional parameters:
# @raycast.icon 🍺
# @raycast.argument1 { "type": "text", "placeholder": "Application" }
# @raycast.packageName Brew
# Documentation:
# @raycast.description Uninstalls an Specified Application Using Homebrew
# @raycast.author StevenRCE0
# @raycast.authorURL https://github.com/StevenRCE0
if ! command -v brew &> /dev/null; then
echo "brew command is required (https://brew.sh).";
exit 1;
fi
# Workaround for the error message
exec 2>/dev/null
brew cat --cask "$1";
if [[ ${PIPESTATUS[0]} -ne 0 ]]; then
brew cat "$1";
if [[ ${PIPESTATUS[0]} -ne 0 ]]; then
echo "That's not a cask nor a formula. Check the spelling or try uninstalling it manually.";
exit 2;
fi
echo "brew uninstall --force --zap \"$1\"" | pbcopy;
else
echo "brew uninstall --cask --force --zap \"$1\"" | pbcopy;
fi
echo "Copied command to clipboard.";
================================================
FILE: commands/developer-utils/brew/brew-update.sh
================================================
#!/bin/bash
#
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Update
# @raycast.mode fullOutput
# @raycast.packageName Brew
#
# Optional parameters:
# @raycast.icon 🍺
#
# Documentation:
# @raycast.description Run Brew Update
# @raycast.author chengzhiqi
# @raycast.authorURL https://twitter.com/1872Fate
if ! command -v brew &> /dev/null; then
echo "brew command is required (https://brew.sh).";
exit 1;
fi
brew update
================================================
FILE: commands/developer-utils/brew/brew-upgrade.sh
================================================
#!/bin/bash
#
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Upgrade
# @raycast.mode fullOutput
# @raycast.packageName Brew
#
# Optional parameters:
# @raycast.icon 🍺
#
# Documentation:
# @raycast.description Run Brew Upgrade
# @raycast.author Thiago Holanda
# @raycast.authorURL https://twitter.com/tholanda
if ! command -v brew &> /dev/null; then
echo "brew command is required (https://brew.sh).";
exit 1;
fi
brew upgrade
================================================
FILE: commands/developer-utils/cheat.sh
================================================
#!/usr/bin/env bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Query cheat.sh
# @raycast.mode fullOutput
# @raycast.packageName Developer Utilities
# Optional parameters:
# @raycast.icon images/cheat.png
# @raycast.argument1 { "type": "text", "placeholder": "Language / Command" }
# @raycast.argument2 { "type": "text", "placeholder": "Question", "optional": true }
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Query the cheat.sh service (https://github.com/chubin/cheat.sh). You can change the color style in the script.
language=$1
question=${2// /+}
# Available styles: https://cht.sh/:styles-demo
style="paraiso-dark"
# get a random answer each time
randnum=$((1 + (RANDOM%4)))
# https://github.com/chubin/cheat.sh#usage
if [ -z "$question" ]; then
curl -s cht.sh/$language?style=$style
else
curl -s cht.sh/$language/$question/$randnum?style=$style
fi
================================================
FILE: commands/developer-utils/check-domain.template.sh
================================================
#!/bin/bash
# How to use this script
# It's a template which needs some setup.
# 1. Duplicate the file,
# 2. remove `.template.` from the filename, and
# 3. replace with your API token.
# Optionally, customize the script title, icon, and output.
#
# API docs:
# https://vercel.com/docs/api#endpoints/domains/check-a-domain-availability
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Check Domain
# @raycast.mode compact
# Optional parameters:
# @raycast.icon 🌐
# @raycast.argument1 { "type": "text", "placeholder": "example.com" }
# @raycast.packageName Developer Utils
# @Documentation:
# @raycast.description Check the availability of a domain with the Vercel API.
# @raycast.author Ted Spare
# @raycast.authorURL https://y.at/🤘🐊🗿🚀
# Setup
# Indicate that the script has started
echo "Checking domain "$1"..."
# Vercel API base URL
API_URL="https://api.vercel.com/v4/domains/"
# Authorization header required for making requests
# should be replaced with your token: https://vercel.com/account/tokens
AUTH_HEADER="Authorization: Bearer "
# Main program
# Query the Vercel API for the availability of the domain
available=$(curl -s $API_URL"status?name="$1 -H "${AUTH_HEADER}")
# If the domain is available, check its price. If unavailable, tell the user.
# If there is an auth or other error, alert the user and throw an error.
case $available in
*"true"*)
price=$(curl -s $API_URL"price?name="$1 -H "${AUTH_HEADER}")
# Alert the user if the TLD is invalid
if [[ $price = *"tld"* ]]; then
tld=$(echo $1 | cut -d '.' -f2)
echo "Invalid TLD ."$tld
exit 1
fi
# Extract the price from the JSON-formatted result
price=${price%,*}
price=${price##*:}
echo $1" is available for $"$price"! 🤑"
exit 0
;;
*"false"*)
echo $1" is not available 😢"
exit 0
;;
*"auth"*)
echo "Please provide a valid API token"
exit 1
;;
*)
echo "Something went wrong"
exit 1
;;
esac
================================================
FILE: commands/developer-utils/clear-derived-data.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Clear Derived Data
# @raycast.mode compact
# @raycast.packageName Xcode
# Optional parameters:
# @raycast.icon 🧹
# Documentation:
# @raycast.description Clear the derived data of Xcode.
rm -rf ~/Library/Developer/Xcode/DerivedData
echo "Removed all derived data"
================================================
FILE: commands/developer-utils/clear_xcode.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Clear All Related Junk
# @raycast.mode compact
# @raycast.packageName Xcode
#
# Optional parameters:
# @raycast.icon 🧹
#
# Documentation:
# @raycast.description This script clears all Xcode related junk.
# @raycast.author Kirill Gorbachyonok
# @raycast.authorURL https://github.com/japanese-goblinn
rm -rf ~/Library/Caches/CocoaPods
rm -rf ~/Library/Caches/org.carthage.CarthageKit
xcrun simctl delete unavailable
rm -rf ~/Library/Developer/Xcode/Archives
rm -rf ~/Library/Developer/Xcode/DerivedData
rm -rf ~/Library/Developer/Xcode/iOS\ Device\ Logs/
echo "Junk removed!"
================================================
FILE: commands/developer-utils/cloudflare/purge-cloudflare-cache.template.sh
================================================
#!/bin/bash
##################################################
### Enter zone ID, email address, and API key. ###
##################################################
cf_zone_id=''
cf_email_address=''
cf_api_key=''
# @raycast.title Purge Cloudflare cache
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Purge Cloudflare cache for zone.
# @raycast.icon images/cloudflare-logo.png
# @raycast.mode silent
# @raycast.packageName Developer Utilities
# @raycast.schemaVersion 1
if [ -z ${cf_zone_id+x} ]; then
echo "Zone ID is missing.";
exit 1;
fi
if [ -z ${cf_email_address+x} ]; then
echo "Email address is missing.";
exit 1;
fi
if [ -z ${cf_api_key+x} ]; then
echo "API key is missing.";
exit 1;
fi
curl -X POST "https://api.cloudflare.com/client/v4/zones/${cf_zone_id}/purge_cache" \
-H "X-Auth-Email: $cf_email_address" \
-H "X-Auth-Key: $cf_api_key" \
-H "Content-Type: application/json" \
--data '{"purge_everything":true}'
echo "Purged cache"
================================================
FILE: commands/developer-utils/copy-focused-finder-window-path.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Copy Focused Finder Window Path
# @raycast.mode silent
# Optional parameters:
# @raycast.icon 📁
# @raycast.packageName Developer Utils
# Documentation:
# @raycast.description Copies full path of the currently focused Finder window
# @raycast.author Vishal Telangre
# @raycast.authorURL https://github.com/vishaltelangre
path=$(osascript <<'EOF'
tell application "Finder"
if exists Finder window 1 then
get the POSIX path of (target of Finder window 1 as alias)
else
get the POSIX path of (desktop as alias)
end if
end tell
EOF
)
echo $path | tr -d '\n' | pbcopy
echo "Copied $path to clipboard"
================================================
FILE: commands/developer-utils/copy-ssh-public-key.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Copy SSH Public Key
# @raycast.mode silent
# Optional parameters:
# @raycast.icon 🔑
# @raycast.packageName Developer Utils
# Documentation:
# @raycast.description Copying the default SSH public key to the clipboard
# @raycast.author Angelos Michalopoulos
# @raycast.authorURL https://github.com/miagg
if [ -f "$HOME/.ssh/id_rsa.pub" ]; then
pbcopy < "$HOME/.ssh/id_rsa.pub"
elif [ -f "$HOME/.ssh/id_dsa.pub" ]; then
pbcopy < "$HOME/.ssh/id_dsa.pub"
elif [ -f "$HOME/.ssh/id_ed25519.pub" ]; then
pbcopy < "$HOME/.ssh/id_ed25519.pub"
else
echo "No SSH public key was found"
exit 1
fi
echo "SSH public key was copied to the clipboard"
================================================
FILE: commands/developer-utils/count-characters.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Count Characters Bash
# @raycast.mode fullOutput
# Optional parameters:
# @raycast.icon 🤖
# @raycast.argument1 { "type": "text", "placeholder": "Text", "optional": true }
# @raycast.packageName Developer Utilities
# Documentation:
# @raycast.description Counts the characters of either the clipboard or the passed argument
# @raycast.author es183923
arg=$1
if [ -z "$arg" ]
then
# arg is NULL
str=$(pbpaste)
echo "${#str} chars"
else
echo "${#arg} chars"
fi
================================================
FILE: commands/developer-utils/create-image-from-code.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Create Image from Code
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ./images/ray-so.png
# @raycast.argument1 { "type": "text", "placeholder": "Title", "optional": true, "percentEncoded": true }
# Documentation:
# @raycast.description Create beautiful images of your code with https://ray.so
# @raycast.author Thomas Paul Mann
# @raycast.authorURL https://github.com/thomaspaulmann
# Customization:
# Set colors. Available options: candy, breeze, midnight or sunset
COLORS="midnight"
# Toggle background. Available options: true or false
BACKGROUND="true"
# Toggle dark mode. Available options: true or false
DARK_MODE="true"
# Set padding. Available options: 16, 32, 64 or 128
PADDING="64"
# Set language. Available options: shell, cpp (C/C++), csharp, clojure, coffeescript, crystal, css, d, dart, diff, dockerfile, elm, erlang, fortran, gherkin,
# go, groovy, haskell, xml, java, javascript, json, jsx, julia, kotlin, latex, lisp, lua, markdown, mathematica, octave, nginx, objectivec, ocaml (F#), perl, php,
# powershell, python, r, ruby, rust, scala, smalltalk, sql, swift, typescript, (for Tsx, use jsx), twig, verilog, vhdl, xquery, yaml
LANGUAGE="auto"
# Main:
TITLE=${1:-"Untitled"}
CODE=$(pbpaste | base64)
# Urlencode any + symbols in the base64 encoded string
CODE=${CODE//+/%2B}
open "https://ray.so?#title=$TITLE&code=$CODE&colors=$COLORS&background=$BACKGROUND&darkMode=$DARK_MODE&padding=$PADDING&title=$TITLE&code=$CODE&language=$LANGUAGE"
================================================
FILE: commands/developer-utils/decode-base64.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Decode Base64
# @raycast.mode silent
# @raycast.packageName Developer Utilities
# Optional parameters:
# @raycast.icon 💻
# Documentation:
# @raycast.description Decodes clipboard content to Base64 and copies it again.
pbpaste | base64 -d | pbcopy
echo "Decoded"
================================================
FILE: commands/developer-utils/decode-jwt.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Decode JWT
# @raycast.mode fullOutput
# @raycast.packageName Developer Utilities
# Optional parameters:
# @raycast.icon images/jwt-logo.png
# Documentation:
# @raycast.description Decodes JSON web token from the clipboard.
# JWT function from:
# https://www.jvt.me/posts/2019/06/13/pretty-printing-jwt-openssl/
function jwt() {
for part in 1 2; do
b64="$(cut -f$part -d. <<< "$1" | tr '_-' '/+')"
len=${#b64}
n=$((len % 4))
if [[ 2 -eq n ]]; then
b64="${b64}=="
elif [[ 3 -eq n ]]; then
b64="${b64}="
fi
d="$(openssl enc -base64 -d -A <<< "$b64")"
python -mjson.tool <<< "$d"
# don't decode further if this is an encrypted JWT (JWE)
if [[ 1 -eq part ]] && grep '"enc":' <<< "$d" >/dev/null ; then
exit 0
fi
done
}
jwt $(pbpaste)
================================================
FILE: commands/developer-utils/decode-url.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Decode URL
# @raycast.mode silent
# @raycast.packageName Developer Utilities
# Optional parameters:
# @raycast.icon 💻
# Documentation:
# @raycast.description Decodes clipboard content url and copies it again.
function urldecode() {
local url_encoded="${1//+/ }"
printf '%b' "${url_encoded//%/\\x}"
}
urldecode $(pbpaste) | pbcopy
echo "Decoded URL"
================================================
FILE: commands/developer-utils/delete-current-line.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Delete Current Line
# @raycast.mode silent
# @raycast.packageName Developer Utilities
# Optional parameters:
# @raycast.icon ⌨️
# Documentation:
# @raycast.description This script deletes the line at cursor position.
# @raycast.author Annie Ma
# @raycast.authorURL http://www.anniema.co/
tell application "System Events"
keystroke "k" using control down
keystroke (ASCII character 8) using command down
end tell
================================================
FILE: commands/developer-utils/dig.sh
================================================
#!/bin/bash
# Dependency: This script requires `dig` to be installed and in $PATH
#
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Dig
# @raycast.mode fullOutput
#
# Optional parameters:
# @raycast.icon 🌍
# @raycast.packageName Internet
# @raycast.argument1 { "type": "text", "placeholder": "name" }
# @raycast.argument2 { "type": "text", "placeholder": "type", "optional": true }
#
# @raycast.description Perform a dig command with the specified options
# @raycast.author Tommaso Panozzo
# @raycase.authorURL https://github.com/tom139
dig $1 $2
================================================
FILE: commands/developer-utils/docker/clean-docker.sh
================================================
#!/bin/bash
# Dependency: This script requires `docker for mac` to be installed: https://docs.docker.com/docker-for-mac/install/
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Clean
# @raycast.mode compact
# @raycast.packageName Docker
# Optional parameters:
# @raycast.icon 🧹
# @raycast.needsConfirmation true
# Documentation:
# @raycast.description Script that cleans Docker images, volumes, and containers
# @raycast.author Quentin Eude
# @raycase.authorURL https://github.com/qeude
if ! command -v docker &> /dev/null; then
echo "docker for mac is required (https://docs.docker.com/docker-for-mac/install/).";
exit 1;
fi
docker stop $(docker ps -a -q) && docker rm $(docker ps -a -q)
docker image prune -a -f
docker system prune --volumes -f
docker system -df
echo "Successfully cleaned Docker ✨"
================================================
FILE: commands/developer-utils/docker/docker-images.sh
================================================
#!/bin/bash
# Dependency: This script requires `docker for mac` to be installed: https://docs.docker.com/docker-for-mac/install/
#
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title List Images
# @raycast.mode fullOutput
#
# Optional parameters:
# @raycast.icon images/docker.png
# @raycast.packageName Docker
#
# @raycast.description List images in Docker
# @raycast.author Sebastian Kroll
# @raycase.authorURL https://github.com/skrollme
if ! command -v docker &> /dev/null; then
echo "docker for mac is required (https://docs.docker.com/docker-for-mac/install/).";
exit 1;
fi
docker images
================================================
FILE: commands/developer-utils/docker/docker-ps.sh
================================================
#!/bin/bash
# Dependency: This script requires `docker for mac` to be installed: https://docs.docker.com/docker-for-mac/install/
#
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title List Containers
# @raycast.mode fullOutput
#
# Optional parameters:
# @raycast.icon images/docker.png
# @raycast.packageName Docker
#
# @raycast.description List containers in Docker
# @raycast.author Sebastian Kroll
# @raycase.authorURL https://github.com/skrollme
if ! command -v docker &> /dev/null; then
echo "docker for mac is required (https://docs.docker.com/docker-for-mac/install/).";
exit 1;
fi
docker ps
================================================
FILE: commands/developer-utils/docker/docker-system-prune.sh
================================================
#!/bin/bash
# Dependency: This script requires `docker for mac` to be installed: https://docs.docker.com/docker-for-mac/install/
#
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title System Prune
# @raycast.mode compact
#
# Optional parameters:
# @raycast.icon images/docker.png
# @raycast.packageName Docker
#
# @raycast.description Remove unused data (system prune)
# @raycast.author Sebastian Kroll
# @raycase.authorURL https://github.com/skrollme
if ! command -v docker &> /dev/null; then
echo "docker for mac is required (https://docs.docker.com/docker-for-mac/install/).";
exit 1;
fi
docker system prune -f
================================================
FILE: commands/developer-utils/docker/run-docker.sh
================================================
#!/bin/bash
# Dependency: This script requires `docker for mac` to be installed: https://docs.docker.com/docker-for-mac/install/
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Run
# @raycast.mode compact
# @raycast.packageName Docker
# Optional parameters:
# @raycast.icon ▶️
# @raycast.needsConfirmation true
# @raycast.argument1 { "type": "text", "placeholder": "Port Machine" }
# @raycast.argument2 { "type": "text", "placeholder": "Port Docker" }
# @raycast.argument3 { "type": "text", "placeholder": "Image", "percentEncoded": true}
# Documentation:
# @raycast.description Runs a Docker container
# @raycast.author Fabián Delgado
# @raycase.authorURL https://github.com/fabdelgado
if ! command -v docker &> /dev/null; then
echo "docker for mac is required (https://docs.docker.com/docker-for-mac/install/).";
exit 1;
fi
if ! [[ "$(docker image inspect $3 2> /dev/null)" == "" ]]; then
docker pull $3
fi
docker run -d --rm -p $(($1)):$(($2)) $3
echo "Successfully running ${3}🚀"
================================================
FILE: commands/developer-utils/docker/stop-docker.sh
================================================
#!/bin/bash
# Dependency: This script requires `docker for mac` to be installed: https://docs.docker.com/docker-for-mac/install/
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Stop
# @raycast.mode compact
# @raycast.packageName Docker
# Optional parameters:
# @raycast.icon ⏹️
# @raycast.needsConfirmation true
# @raycast.argument1 { "type": "text", "placeholder": "Image", "percentEncoded": true}
# Documentation:
# @raycast.description Stops a Docker container
# @raycast.author Fabián Delgado
# @raycase.authorURL https://github.com/fabdelgado
if ! command -v docker &> /dev/null; then
echo "docker for mac is required (https://docs.docker.com/docker-for-mac/install/).";
exit 1;
fi
docker stop $1
echo "Successfully stopped $1 ⏹️"
================================================
FILE: commands/developer-utils/encode-base64.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Encode Base64
# @raycast.mode silent
# @raycast.packageName Developer Utilities
# Optional parameters:
# @raycast.icon 💻
# Documentation:
# @raycast.description Encodes clipboard content to Base64 and copies it again.
pbpaste | base64 | pbcopy
echo "Encoded"
================================================
FILE: commands/developer-utils/encode-url.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Encode URL
# @raycast.mode silent
# @raycast.packageName Developer Utilities
# Optional parameters:
# @raycast.icon 💻
# Documentation:
# @raycast.description Encodes clipboard content url and copies it again.
pbpaste | ( curl -Gso /dev/null -w %{url_effective} --data-urlencode @- "" | cut -c 3- || true) | pbcopy
echo "Encoded URL"
================================================
FILE: commands/developer-utils/error-info.sh
================================================
#!/bin/bash
# Dependency: requires mint and errorinfo
# Instal via mint Homebrew and errorinfo via Mint: `brew install mint && mint install errorinfo`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Error Info
# @raycast.mode fullOutput
# @raycast.packageName Developer Utilities
# Optional parameters:
# @raycast.icon ℹ️
# @raycast.argument1 { "type": "text", "placeholder": "Error term" }
# Documentation:
# @raycast.description Get info about Apple API errors
# @raycast.author Ronan Rodrigo Nunes
# @raycast.authorURL https://ronanrodrigo.dev
errorinfo $1
================================================
FILE: commands/developer-utils/escape-shell-chars.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Escape String for Shell
# @raycast.mode silent
# @raycast.packageName Developer Utilities
# Optional parameters:
# @raycast.icon 💻
# Documentation:
# @raycast.description Escapes shell character string and copies it again.
escaped=$(pbpaste) && printf '%q' "$escaped" | pbcopy
echo "Escaped string for shell"
================================================
FILE: commands/developer-utils/flutter-create.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Flutter Create Project
# @raycast.mode fullOutput
# Optional parameters:
# @raycast.icon images/flutter.png
# @raycast.argument1 { "type": "text", "placeholder": "ProjectName" }
# @raycast.packageName flutter-create
# Documentation:
# @raycast.description Creates A Flutter Project from Raycast
# @raycast.author Kabilan VS
# @raycast.authorURL https://github.com/KABILAN235
# Flutter SDK Path. Eg: /Users/$USER/Devtools/flutter/bin
SDK_PATH="/Users/$USER/DevTools/flutter/bin"
# Default Project Path, ie- This is Where Your Projects will be Stored
PROJECT_PATH="/Users/$USER/Desktop/Dev/FlutterProjects/"
export PATH="$PATH:$SDK_PATH"
export PATH
first_argument=${1// /+}
cd $PROJECT_PATH;
flutter create $first_argument
================================================
FILE: commands/developer-utils/format-swift.sh
================================================
#!/bin/bash
# Dependency: requires swiftformat (https://github.com/nicklockwood/SwiftFormat).
# Install via homebrew: `brew install swiftformat`
# @raycast.title Format Swift
# @raycast.author Dean Moore
# @raycast.authorURL https://github.com/moored
# @raycast.description Use [swiftformat](https://github.com/nicklockwood/SwiftFormat) to format clipboard content.
# @raycast.icon images/swift.png
# @raycast.mode silent
# @raycast.packageName Developer Utilities
# @raycast.schemaVersion 1
if ! command -v swiftformat &> /dev/null; then
echo "swiftformat command is required (https://github.com/nicklockwood/SwiftFormat).";
exit 1;
fi
pbpaste | swiftformat --output stdout | pbcopy
echo "Swift formatted"
================================================
FILE: commands/developer-utils/generate-git-ignore.sh
================================================
#!/bin/bash
# List of available gitignore types: https://www.toptal.com/developers/gitignore/api/list
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Create .gitignore
# @raycast.mode silent
# @raycast.packageName Developer Utilities
# Optional parameters:
# @raycast.icon 🤐
# @raycast.argument1 { "type": "text", "placeholder": "Types (react,node,vscode)", "optional": false }
# Documentation:
# @raycast.description Generates a .gitignore file via https://gitignore.io
# @raycast.author Roland Leth
# @raycast.authorURL https://runtimesharks.com
params="$1"
if [[ -z "$params" ]]
then
echo "Missing params"
exit 1
fi
result=$(curl -s "https://www.toptal.com/developers/gitignore/api/$params" | sed -e "1d")
if [[ "$result" =~ !!\ ERROR.+!! ]]
then
echo "Unsupported gitignore type"
exit 1
fi
echo "$result" | pbcopy
echo "Copied to clipboard!"
================================================
FILE: commands/developer-utils/generate-password.sh
================================================
#!/bin/bash
# Dependency: requires gpg (https://www.gnupg.org/)
# Download: https://www.gnupg.org/download/#sec-1-1
# @raycast.schemaVersion 1
# @raycast.title Generate Password
# @raycast.mode silent
# @raycast.author Sven Hofmann
# @raycast.authorURL https://github.com/hofmannsven
# @raycast.description Generates a random password and copies it to the clipboard.
# @raycast.packageName Developer Utilities
# @raycast.icon 🔐
if ! command -v gpg &> /dev/null; then
echo "gpg command is required (https://www.gnupg.org/).";
exit 1;
fi
gpg --gen-random -a 0 30 | pbcopy
echo "Password Generated"
================================================
FILE: commands/developer-utils/generate-ulid.sh
================================================
#!/bin/bash
# Dependency: This script requires `ulid` installed: https://github.com/ulid/javascript
# Install via npm: `npm install -g ulid`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Generate ULID
# @raycast.mode silent
# Optional parameters:
# @raycast.icon 💻
# @raycast.packageName Developer Utilities
# Documentation:
# @raycast.description Generates a ULID and copies it to the clipboard.
# @raycast.author David Molinero
# @raycast.authorURL https://github.com/doktor500
NODE_PATH=$(which node | xargs readlink | xargs dirname);
export PATH="$PATH:${NODE_PATH}";
if ! ulid &> /dev/null; then
echo "ulid is required (https://github.com/ulid/javascript)";
exit 1;
fi
id=$(ulid);
echo "$id" | pbcopy;
echo "$id";
================================================
FILE: commands/developer-utils/generate-uuid.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Generate UUID
# @raycast.mode silent
# @raycast.packageName Developer Utilities
# Optional parameters:
# @raycast.icon 💻
# Documentation:
# @raycast.description Generates a UUID and copies it to the clipboard.
uuidgen | pbcopy
echo "UUID Generated"
================================================
FILE: commands/developer-utils/genpasswd.py
================================================
#!/usr/bin/env python3
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Generate Password
# @raycast.mode silent
# @raycast.packageName Security
# Optional parameters:
# @raycast.icon images/genpasswd.png
# @raycast.iconDark images/genpasswd-iconDark.png
# Documentation:
# @raycast.description Generates an iOS style password
# @raycast.author everdrone
# @raycast.authorURL https://github.com/everdrone
# @raycast.argument1 {"type": "text", "placeholder": "Sets (3)", "optional": true}
# @raycast.argument2 {"type": "text", "placeholder": "Length (6)", "optional": true}
import sys
import string
import random
import subprocess
from textwrap import wrap
def charset(length: int = 6) -> str:
return ''.join(random.choices(string.ascii_lowercase, k=length))
def superset(
length: int = 3,
set_length: int = 6,
numbers: int = 1,
uppercase: int = 1,
separator: str = '-'
) -> str:
sets = []
for _ in range(length):
sets.append(charset(set_length))
all = ''.join(sets)
# insert uppercase
for _ in range(uppercase):
pick_again = True
while pick_again:
index = random.randrange(len(all))
if all[index].isalpha() and all[index].islower():
pick_again = False
all = list(all)
all[index] = all[index].upper()
all = ''.join(all)
# insert numbers
for _ in range(numbers):
pick_again = True
while pick_again:
index = random.randrange(len(all))
if all[index].isalpha() and all[index].islower():
pick_again = False
all = list(all)
all[index] = random.choice(string.digits)
all = ''.join(all)
# split and join with separators
sets = wrap(all, set_length)
result = separator.join(sets)
subprocess.run("pbcopy", universal_newlines=True, input=result)
return result
# stops a crash if this doesn't exist
if len(sys.argv) > 1:
sets = sys.argv[1]
if sets.isdigit():
sets = int(sets)
else:
# do not crash, set fallback value
sets = 3
# stops a crash if this doesn't exist
if len(sys.argv) > 2:
s_len = sys.argv[2]
if s_len.isdigit():
s_len = int(s_len)
else:
s_len = 6
# This auto copies the password to the user's clipboard
generatedPassword = superset(length=sets, set_length=s_len)
subprocess.run("pbcopy", universal_newlines=True, input=generatedPassword)
print(generatedPassword)
================================================
FILE: commands/developer-utils/get-ttfb.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Get TTFB (Time to First Byte)
# @raycast.mode fullOutput
# Optional parameters:
# @raycast.icon 🕐
# @raycast.packageName Developer Utils
# Documentation:
# @raycast.description Get the TTFB (Time to First Byte) of a website
# @raycast.author Angelos Michalopoulos
# @raycast.authorURL https://github.com/miagg
# @raycast.argument1 { "type": "text", "placeholder": "URL" }
if [ -z "$1" ]; then
echo "Please provide a domain"
exit 1
fi
# If no url scheme is provided, add https://
if [[ "$1" == http* ]]; then
url="$1"
else
url="https://$1"
fi
echo "Pinging: $url..."
curl -o /dev/null \
-H 'Cache-Control: no-cache' \
-s \
-w "\nLookup time:\t\t\t%{time_namelookup}\nConnect time:\t\t%{time_connect}\nSSL handshake time:\t%{time_appconnect}\nPre-Transfer time:\t%{time_pretransfer}\nRedirect time:\t\t%{time_redirect}\nTime to first byte:\t%{time_starttransfer}\n\nTotal time:\t\t\t%{time_total}\n" \
--fail \
--silent \
--show-error \
"$url"
================================================
FILE: commands/developer-utils/git/git-clear-changes.sh
================================================
#!/bin/bash
# Note: Set currentDirectoryPath to your local repository.
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Clear Changes
# @raycast.mode compact
# Optional parameters:
# @raycast.icon ./images/git.png
# @raycast.packageName Git
# @raycast.needsConfirmation true
# @raycast.currentDirectoryPath ~/Developer/script-commands
# Documentation:
# @raycast.author Thomas Paul Mann
# @raycast.authorURL https://github.com/thomaspaulmann
# @raycast.description Clear all changes
git clean -d -x --force
git reset --hard
echo "Cleared changes"
================================================
FILE: commands/developer-utils/git/git-save-changes.sh
================================================
#!/bin/bash
# Note: Set currentDirectoryPath to your local repository.
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Save Changes
# @raycast.mode compact
# Optional parameters:
# @raycast.icon ./images/git.png
# @raycast.packageName Git
# @raycast.argument1 { "type": "text", "placeholder": "Message", "optional": true }
# @raycast.currentDirectoryPath ~/Developer/script-commands
# Documentation:
# @raycast.author Thomas Paul Mann
# @raycast.authorURL https://github.com/thomaspaulmann
# @raycast.description Commit all pending changes. If no commit message is provided, it will amend the changes.
STATUS=$(git status --short)
if [ -z "$STATUS" ]; then
echo "No changes to save"
exit 1
fi
if [ -n "$1" ]; then
git commit --all --message "$1"
echo "Committed changes"
else
git commit -all --amend --no-edit
echo "Amended changes"
fi
================================================
FILE: commands/developer-utils/git/git-standup.sh
================================================
#!/bin/bash
# Note: Set currentDirectoryPath to your local repository.
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Standup
# @raycast.mode fullOutput
# Optional parameters:
# @raycast.icon ./images/git.png
# @raycast.packageName Git
# @raycast.argument1 { "type": "text", "placeholder": "Project Path"}
# @raycast.argument2 { "type": "text", "placeholder": "Since (e.g: 1 week)", "optional": true }
# Documentation:
# @raycast.author Thomas Paul Mann
# @raycast.authorURL https://github.com/thomaspaulmann
# @raycast.description Lists your commits from the last 24 hours. Optionally specify since when, e.g. "1 week".
if [ -n "$1" ]; then
PROJECT_PATH="$1"
else
echo "Please give project path"
exit 1
fi
if [ -n "$2" ]; then
SINCE="$2"
else
SINCE="yesterday.midnight"
fi
cd "$PROJECT_PATH" || exit 1
USER_NAME=$(git config user.name)
git log --author="$USER_NAME" --since="$SINCE" --oneline --pretty=format:"%s %Cblue(%ar)%Creset" --color
================================================
FILE: commands/developer-utils/git/git-status.sh
================================================
#!/bin/bash
# Note: Set currentDirectoryPath to your local repository.
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Status
# @raycast.mode inline
# Conditional parameters:
# @raycast.refreshTime 5m
# Optional parameters:
# @raycast.icon ./images/git.png
# @raycast.packageName Git
# @raycast.currentDirectoryPath ~/Developer/script-commands
# Documentation:
# @raycast.author Thomas Paul Mann
# @raycast.authorURL https://github.com/thomaspaulmann
# @raycast.description Shows the status of your Git repository.
MESSAGE=""
ADDED=$(git status --short | grep -c " A")
if [ $ADDED -gt 0 ]; then
MESSAGE="$MESSAGE \\033[32m$ADDED Added\\033[0m"
fi
MODIFIED=$(git status --short | grep -c " M")
if [ $MODIFIED -gt 0 ]; then
MESSAGE="$MESSAGE \\033[33m$MODIFIED Modified\\033[0m"
fi
DELETED=$(git status --short | grep -c " D")
if [ $DELETED -gt 0 ]; then
MESSAGE="$MESSAGE \\033[31m$DELETED Deleted\\033[0m"
fi
UNTRACKED=$(git status --short | grep -c "??")
if [ $UNTRACKED -gt 0 ]; then
MESSAGE="$MESSAGE \\033[34m$UNTRACKED Untracked\\033[0m"
fi
if [ -z "$MESSAGE" ]; then
MESSAGE="No pending changes"
fi
echo -e $MESSAGE
================================================
FILE: commands/developer-utils/git/git-switch-branch.sh
================================================
#!/bin/bash
# Note: Set currentDirectoryPath to your local repository.
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Switch Branch
# @raycast.mode compact
# Optional parameters:
# @raycast.icon ./images/git.png
# @raycast.packageName Git
# @raycast.argument1 { "type": "text", "placeholder": "Name", "optional": true }
# @raycast.currentDirectoryPath ~/Developer/script-commands
# Documentation:
# @raycast.author Thomas Paul Mann
# @raycast.authorURL https://github.com/thomaspaulmann
# @raycast.description Switch to a new branch. If not name was provided, it checks out the default branch.
if [ -n "$1" ]; then
BRANCH_NAME="$1"
else
BRANCH_NAME=$(git symbolic-ref --short HEAD)
fi
git checkout --branch $BRANCH_NAME
================================================
FILE: commands/developer-utils/git/git-sync-changes.sh
================================================
#!/bin/bash
# Note: Set currentDirectoryPath to your local repository.
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Sync Changes
# @raycast.mode compact
# Optional parameters:
# @raycast.icon ./images/git.png
# @raycast.packageName Git
# @raycast.currentDirectoryPath ~/Developer/script-commands
# Documentation:
# @raycast.author Thomas Paul Mann
# @raycast.authorURL https://github.com/thomaspaulmann
# @raycast.description Pulls, rebases and pushes your changes.
git pull --rebase
git push
echo "Synced changes"
================================================
FILE: commands/developer-utils/github/create-github-gist.template.sh
================================================
#!/bin/bash
# Dependency: requires jq (https://stedolan.github.io/jq/)
# Install via Homebrew: `brew install jq`
####################################################
## Set GitHub username and personal access token. ##
####################################################
# GitHub username
user=
# GitHub personal access token
access_key=
# @raycast.title Create GitHub Gist from Clipboard
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Create a GitHub Gist from clipboard contents and copy Gist URL.
# @raycast.icon images/github-logo.png
# @raycast.iconDark images/github-logo-iconDark.png
# @raycast.mode compact
# @raycast.needsConfirmation true
# @raycast.packageName GitHub
# @raycast.schemaVersion 1
if [ -z ${user+x} ]; then
echo "GitHub username is missing.";
exit 1;
fi
if [ -z ${access_key+x} ]; then
echo "GitHub personal access token is missing.";
exit 1;
fi
if ! command -v jq &> /dev/null; then
echo "jq is required (https://stedolan.github.io/jq/).";
exit 1;
fi
clipboard=$(pbpaste)
gist_content="$( jq -nc --arg str "$clipboard" '{ "public": false, "files": { "gistfile1.txt": { "content": $str } } }' )"
auth=$(echo -n "$user:$access_key" | base64)
response=$( curl -s -X POST -H "Accept: application/json" -H "Content-Type: application/json" -H "Authorization: Basic $auth" https://api.github.com/gists -d "$gist_content" )
echo "$response" | jq -r '.html_url' | pbcopy
echo "Created gist and copied URL"
================================================
FILE: commands/developer-utils/github/github-contributions.template.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title GitHub Contributions
# @raycast.mode inline
# @raycast.refreshTime 2h
# Optional parameters:
# @raycast.packageName GitHub Contributions
# @raycast.icon images/github-logo.png
# @raycast.iconDark images/github-logo-iconDark.png
# Documentation:
# @raycast.description Show GitHub user contributions from the current year
# @raycast.author Astrit
# @raycast.authorURL https://github.com/astrit
# GitHub username is required
username=""
url="https://github.com/users/${username}/contributions"
result=$(curl -s $url )
resultFilter=$(echo "$result" | sed -n -e '/
/,/<\/h2>/p')
resultCleanup=$(echo "$resultFilter" | sed -e 's/<[^>]*>//g')
echo $resultCleanup
================================================
FILE: commands/developer-utils/github/github-open-commit-history.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open Commit History
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ./images/github-logo.png
# @raycast.iconDark ./images/github-logo-iconDark.png
# @raycast.packageName GitHub
# Documentation:
# @raycast.author Thomas Paul Mann
# @raycast.authorURL https://github.com/thomaspaulmann
# @raycast.description Opens the commit history of the filepath in the clipboard or the frontmost window. Alternatively can open the file view on GitHub.
# Configuration:
# Set the branch to open on GitHub.
BRANCH="master"
# Set the page to open for the file. Available values: commits, blob, blame
PAGE="commits"
# Enable to get verbose output.
DEBUG=false
# Utils:
get_current_filepath_of_frontmost_application() {
osascript -e '
tell application "System Events" to set frontmostApplication to name of first process whose frontmost is true
if (frontmostApplication is "Finder") then
tell application "Finder"
get POSIX path of (selection as alias)
end tell
else if (frontmostApplication is "iTerm2") then
tell application "iTerm"
tell current session of current window
get variable named "session.path"
end tell
end tell
else
tell application "System Events"
tell (first process where frontmost is true)
get value of attribute "AXDocument" of first window
end tell
end tell
end if
'
}
# Main:
CLIPBOARD_CONTENTS=$(pbpaste)
if [[ -d $CLIPBOARD_CONTENTS || -f $CLIPBOARD_CONTENTS ]]; then
FILEPATH=$CLIPBOARD_CONTENTS
else
FRONTMOST_FILEPATH=$(get_current_filepath_of_frontmost_application)
FILEPATH=${FRONTMOST_FILEPATH#"file://"}
fi
if [ "$DEBUG" = true ] ; then
echo "Extracted filepath: $FILEPATH"
fi
if [[ -d $FILEPATH || -f $FILEPATH ]]; then
cd `dirname $FILEPATH`
if git rev-parse > /dev/null 2>&1; then
GIT_REPOSITORY_ROOT_PATH=$(git rev-parse --show-toplevel)
RELATIVE_FILEPATH=${FILEPATH#"$GIT_REPOSITORY_ROOT_PATH/"}
BASE=$(git config --get remote.origin.url | sed s/\\.git// | sed 's/:/\//' | sed 's/.*github.com/https:\/\/github.com/')
URL="$BASE/$PAGE/$BRANCH/$RELATIVE_FILEPATH"
open $URL
else
echo "Not a Git repostiory"
exit 1
fi
else
echo "Not a valid filepath"
exit 1
fi
================================================
FILE: commands/developer-utils/github/github-open-pull-requests-details.template.rb
================================================
#!/usr/bin/env ruby
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Show Open Pull Requests
# @raycast.mode fullOutput
# @raycast.description Display (detailed) GitHub pull requests
#
# Optional parameters:
# @raycast.packageName GitHub
# @raycast.icon images/github-logo.png
# @raycast.iconDark images/github-logo-iconDark.png
#
# Credits
# @raycast.author Faye Sipiano
# @raycast.authorURL https://github.com/FSipiano
require 'json'
require 'net/http'
require 'uri'
# Insert a personal access token (https://github.com/settings/tokens)
API_TOKEN = ''
if API_TOKEN.empty?
puts 'No API token provided'
exit(1)
end
uri = URI('https://api.github.com/graphql')
req = Net::HTTP::Post.new(uri)
req['Authorization'] = "token #{API_TOKEN}"
req.body = '{ "query": "query { viewer { pullRequests(first: 10 states: OPEN) { nodes { baseRepository { name } title number url } } } }" }'
req_options = {
use_ssl: uri.scheme == 'https'
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
http.request(req)
end
if res.code == '200'
result = JSON.parse(res.body)
pull_requests = result['data']['viewer']['pullRequests']['nodes']
if pull_requests.length == 0
puts 'No open pull requests 🎉'
else
puts "You have #{pull_requests.length} open pull requests"
pull_requests.each do |pr|
puts "##{pr['number']} #{pr['title']} (#{pr['url']})"
end
end
else
puts 'Failed loading GitHub pull requests'
exit(1)
end
================================================
FILE: commands/developer-utils/github/github-open-pull-requests-page.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open Pull Requests page
# @raycast.mode silent
# @raycast.description Open your GitHub pull requests page
#
# Optional parameters:
# @raycast.packageName GitHub
# @raycast.icon images/github-logo.png
# @raycast.iconDark images/github-logo-iconDark.png
#
# Credits
# @raycast.author Faye Sipiano
# @raycast.authorURL https://github.com/FSipiano
open https://github.com/pulls/
================================================
FILE: commands/developer-utils/github/github-open-pull-requests.template.rb
================================================
#!/usr/bin/env ruby
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open Pull Requests
# @raycast.mode inline
# @raycast.description Display number of open pull requests
#
# Optional parameters:
# @raycast.packageName GitHub
# @raycast.icon images/github-logo.png
# @raycast.iconDark images/github-logo-iconDark.png
#
# Conditional parameters:
# @raycast.refreshTime 5m
#
# Credits
# @raycast.author Faye Sipiano
# @raycast.authorURL https://github.com/FSipiano
require 'json'
require 'net/http'
require 'uri'
# Insert a personal access token (https://github.com/settings/tokens)
API_TOKEN = ''
if API_TOKEN.empty?
puts 'No API token provided'
exit(1)
end
RED = 31
GREEN = 32
YELLOW = 33
uri = URI('https://api.github.com/graphql')
req = Net::HTTP::Post.new(uri)
req['Authorization'] = "token #{API_TOKEN}"
req.body = '{ "query": "query { viewer { pullRequests(first: 10, states:OPEN) { nodes { title number url } } } }" }'
req_options = {
use_ssl: uri.scheme == 'https'
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
http.request(req)
end
if res.code == '200'
result = JSON.parse(res.body)
pull_requests = result['data']['viewer']['pullRequests']['nodes']
if pull_requests.length == 0
message = "No open pull requests 🎉"
puts "\e[#{GREEN}m#{message}\e[0m"
else
color = (pull_requests.length <= 5) ? YELLOW : RED
message = "You have #{pull_requests.length} open pull requests"
puts "\e[#{color}m#{message}\e[0m"
pull_requests.each do |pr|
puts "##{pr['number']} #{pr['title']} (#{pr['url']})"
end
end
else
puts 'Failed loading GitHub pull requests'
exit(1)
end
================================================
FILE: commands/developer-utils/github/github-repository-stars.template.rb
================================================
#!/usr/bin/env ruby
# How to use this script?
# It's a template which needs further setup. Duplicate the file,
# remove `.template.` from the filename, set an API token and
# specify your repository.
# Parameters
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Repository Statistics
# @raycast.mode inline
# @raycast.refreshTime 1h
# Optional parameters:
# @raycast.packageName GitHub
# @raycast.icon ⭐️
# Documentation:
# @raycast.description Show statistics of your GitHub repository.
# @raycast.author Thomas Paul Mann
# @raycast.authorURL https://github.com/thomaspaulmann
# Configuration
# Insert a token with access to your repository (https://github.com/settings/tokens)
$api_token = ""
# Slug of the owner and repository
$repository = "raycast/script-commands"
# Main program
require "json"
require "net/http"
require "uri"
if $api_token.empty?
puts "No API token provided"
exit(1)
end
uri = URI("https://api.github.com/repos/#{$repository}")
req = Net::HTTP::Get.new(uri)
req["Authorization"] = "token #{$api_token}"
req_options = {
use_ssl: uri.scheme == "https",
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) { |http|
http.request(req)
}
if res.code == "200"
result = JSON.parse(res.body)
stars = result["stargazers_count"]
forks = result["forks_count"]
subscribers = result["subscribers_count"]
puts "#{stars} Stars, #{forks} Forks and #{subscribers} Watchers"
else
puts "Failed loading GitHub repository"
exit(1)
end
================================================
FILE: commands/developer-utils/github/github-repository-stars_all_repos_template.rb
================================================
#!/usr/bin/env ruby
# How to use this script?
# It's a template which needs further setup. Duplicate the file,
# remove `.template.` from the filename, set an API token.
# Parameters
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Repository Statistics
# @raycast.mode inline
# @raycast.refreshTime 1h
# Optional parameters:
# @raycast.packageName GitHub
# @raycast.icon ⭐️
# Documentation:
# @raycast.description Show statistics of your GitHub repositories.
# @raycast.author Valdir Junior
# @raycast.authorURL https://github.com/valdirjunior011
# Configuration
# Insert a token with access to your repository (https://github.com/settings/tokens)
$api_token = ""
# Owner of the repositories
$owner = ""
# Main program
require "json"
require "net/http"
require "uri"
if $api_token.nil?
puts "API token not provided"
exit(1)
end
uri = URI("https://api.github.com/users/#{$owner}/repos")
req = Net::HTTP::Get.new(uri)
req["Authorization"] = "token #{$api_token}"
req_options = {
use_ssl: uri.scheme == "https",
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) { |http|
http.request(req)
}
if res.code == "200"
repositories = JSON.parse(res.body)
total_stars = 0
total_forks = 0
total_subscribers = 0
repositories.each do |repo|
repo_name = repo["full_name"]
url = repo["html_url"]
repo_uri = URI("https://api.github.com/repos/#{repo_name}")
repo_req = Net::HTTP::Get.new(repo_uri)
repo_req["Authorization"] = "token #{$api_token}"
repo_res = Net::HTTP.start(repo_uri.hostname, repo_uri.port, req_options) { |http|
http.request(repo_req)
}
if repo_res.code == "200"
result = JSON.parse(repo_res.body)
stars = result["stargazers_count"]
forks = result["forks_count"]
subscribers = result["subscribers_count"]
total_stars += stars
total_forks += forks
total_subscribers += subscribers
else
puts "Failed loading statistics for #{repo_name}"
end
end
puts "Owner: #{$owner} Total Stars: #{total_stars}, Forks: #{total_forks}, Subs: #{total_subscribers}"
else
puts "Failed loading repositories for #{$owner}"
end
================================================
FILE: commands/developer-utils/github/github-review-requests.template.rb
================================================
#!/usr/bin/env ruby
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Show Review Requests
# @raycast.mode inline
# @raycast.description Display number of Pull Requests requesting your review
#
# Optional parameters:
# @raycast.packageName GitHub
# @raycast.icon images/github-logo.png
# @raycast.iconDark images/github-logo-iconDark.png
#
# Conditional parameters:
# @raycast.refreshTime 5m
#
# Credits
# @raycast.author Vince Picone
# @raycast.authorURL https://github.com/vpicone
require 'json'
require 'net/http'
require 'uri'
# Insert a personal access token (https://github.com/settings/tokens)
# No additional permissions are required, leave all the options unchecked
API_TOKEN = ''
if API_TOKEN.empty?
puts 'No API token provided'
exit(1)
end
RED = 31
GREEN = 32
YELLOW = 33
uri = URI('https://api.github.com/graphql')
req = Net::HTTP::Post.new(uri)
req['Authorization'] = "token #{API_TOKEN}"
req.body = '{ "query": "query {search(query:\"type:pr is:open user-review-requested:@me\",type:ISSUE,first:10){issueCount edges{node{...on PullRequest{number title url}}}}}" }'
req_options = {
use_ssl: uri.scheme == 'https'
}
res = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
http.request(req)
end
if res.code == '200'
result = JSON.parse(res.body)
review_requests = result['data']['search']['edges']
review_requests_count = result['data']['search']['issueCount']
if review_requests_count == 0
message = "No open review requests 🎉"
puts "\e[#{GREEN}m#{message}\e[0m"
else
color = (review_requests_count <= 5) ? YELLOW : RED
message = "You have #{review_requests_count} open review requests"
puts "\e[#{color}m#{message}\e[0m"
review_requests.each do |pr|
puts "##{pr['node']['number']} #{pr['node']['title']} (#{pr['node']['url']})"
end
end
else
puts 'Failed loading GitHub review requests'
exit(1)
end
================================================
FILE: commands/developer-utils/github/github-unread-notifications.template.sh
================================================
#!/bin/bash
# Dependency: requires jq (https://stedolan.github.io/jq/)
# Install via Homebrew: `brew install jq`
##################################################################
## Set GitHub username and personal access token and uncomment, ##
## and check toggle for detailed output. ##
##################################################################
# GitHub username
user=
# GitHub personal access token
access_key=
# Toggle for detailed count
detailed=true
# @raycast.title Unread Notifications
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Display (detailed) number of unread GitHub notifications.
# @raycast.icon images/github-logo.png
# @raycast.iconDark images/github-logo-iconDark.png
# @raycast.mode inline
# @raycast.packageName GitHub
# @raycast.refreshTime 5m
# @raycast.schemaVersion 1
if [ -z ${user+x} ]; then
echo "GitHub username is missing.";
exit 1;
fi
if [ -z ${access_key+x} ]; then
echo "GitHub personal access token is missing.";
exit 1;
fi
if ! command -v jq &> /dev/null; then
echo "jq is required (https://stedolan.github.io/jq/).";
exit 1;
fi
auth=$(echo -n "$user:$access_key" | base64)
response=$(curl -s -H "Accept: application/vnd.github.v3+json" -H "Authorization: Basic $auth" "https://api.github.com/notifications?per_page=50")
count=$(echo "$response" | jq -r 'length')
if [ 0 = $count ]; then
echo 'None'
elif [ 50 = $count ]; then
echo '50+ unread notifications'
elif $detailed; then
notifications=$(echo "$response" | jq 'group_by(.reason) | map({
"reason": .[0].reason,
"total": length
})')
function reason_label() {
local reason=$1
if [[ $reason = "ci_activity" ]]; then
reason="CI"
elif [[ $reason = "review_requested" ]]; then
reason="Review"
else
reason="$(tr '[:lower:]' '[:upper:]' <<< ${reason:0:1})${reason:1}"
fi
echo $reason
}
echo "$notifications" | jq -c '.[]' |
while IFS=$"\n" read -r c; do
reason=$(echo "$c" | jq -r '.reason')
reason=$(reason_label $reason)
total=$(echo "$c" | jq -r '.total')
echo -n "${reason}:${total} "
done
else
echo "$count unread notifications"
fi
================================================
FILE: commands/developer-utils/github/open-gh-repo-pr-or-issue.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Visit a Repository, Pull Request, or Issue
# @raycast.mode silent
#
# Optional parameters:
# @raycast.packageName GitHub
# @raycast.icon images/github-logo.png
# @raycast.iconDark images/github-logo-iconDark.png
# @raycast.argument1 { "type": "text", "placeholder": "Organization/Repository" }
# @raycast.argument2 { "type": "text", "placeholder": "Pull Request or Issue #", "optional": true }
#
# Documentation
# @raycast.author Phil Salant
# @raycast.authorURL https://github.com/PSalant726
# @raycast.description Open a repository, pull request, or issue on GitHub
path=""
if [ -n "$2" ]; then
path="/pull/$2"
fi
open "https://github.com/$1$path"
================================================
FILE: commands/developer-utils/gitlab/gitlab-issues.template.py
================================================
#!/usr/bin/env python3
# How to use this script?
# It's a template which needs further setup. Duplicate the file,
# remove `.template.` from the filename and set an Personal access token as
# well as the GitLab instance url if it is not gitlab.com in gitlabconfig.py
# You need to copy gitlabconfig.py and gitlabhelper.py next to the script command
# otherwise it won't work. gitlabconfig.py and gitlabhelper.py are shared between
# all gitlab script commands.
#
# API: https://docs.gitlab.com/ee/api
# Parameters
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Issues
# @raycast.mode fullOutput
# Optional parameters:
# @raycast.packageName GitLab
# @raycast.icon images/gitlab.png
# Documentation:
# @raycast.author Michael Aigner
# @raycast.authorURL https://github.com/tonka3000
# @raycast.description Show issues from GitLab
# Configuration
# see gitlabconfig.py
# Main program
from gitlabhelper import GitLab
gitlab = GitLab()
data = gitlab.get_call("issues?state=opened&scope=assigned_to_me")
print(f"GitLab Issues assigned to you on {gitlab.instance}:\n")
for e in data:
title = e.get("title")
web_url = e.get("web_url")
reference = e.get("references", {}).get("full")
print(f"* {title} at {reference}")
print(f"{web_url}\n")
================================================
FILE: commands/developer-utils/gitlab/gitlab-mergerequests.template.py
================================================
#!/usr/bin/env python3
# How to use this script?
# It's a template which needs further setup. Duplicate the file,
# remove `.template.` from the filename and set an Personal access token as
# well as the GitLab instance url if it is not gitlab.com in gitlabconfig.py
# You need to copy gitlabconfig.py and gitlabhelper.py next to the script command
# otherwise it won't work. gitlabconfig.py and gitlabhelper.py are shared between
# all gitlab script commands.
#
# API: https://docs.gitlab.com/ee/api
# Parameters
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Merge Requests
# @raycast.mode fullOutput
# Optional parameters:
# @raycast.packageName GitLab
# @raycast.icon images/gitlab.png
# Documentation:
# @raycast.author Michael Aigner
# @raycast.authorURL https://github.com/tonka3000
# @raycast.description Show merge requests from GitLab
# Configuration
# see gitlabconfig.py
# Main program
from gitlabhelper import GitLab
import textwrap
gitlab = GitLab()
data = gitlab.get_call("merge_requests?state=opened&scope=assigned_to_me")
print(f"GitLab Merge requests assigned to you on {gitlab.instance}/:\n")
for e in data:
title = e.get("title")
state = e.get("state")
web_url = e.get("web_url")
author = e.get("author")
name = author.get("name")
username = author.get("username")
reference = e.get("references", {}).get("full")
description = textwrap.shorten(e.get("description"), width=420, placeholder="...")
print(f"[{state}] * {title} at {reference}\n")
print(f"{description}\n")
print(f"{web_url}\n")
print(f"By {name} @{username}\n")
================================================
FILE: commands/developer-utils/gitlab/gitlab-todos.template.py
================================================
#!/usr/bin/env python3
# How to use this script?
# It's a template which needs further setup. Duplicate the file,
# remove `.template.` from the filename and set an Personal access token as
# well as the GitLab instance url if it is not gitlab.com in gitlabconfig.py
# You need to copy gitlabconfig.py and gitlabhelper.py next to the script command
# otherwise it won't work. gitlabconfig.py and gitlabhelper.py are shared between
# all gitlab script commands.
#
# API: https://docs.gitlab.com/ee/api
# Parameters
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title To-Dos
# @raycast.mode fullOutput
# Optional parameters:
# @raycast.packageName GitLab
# @raycast.icon images/gitlab.png
# Documentation:
# @raycast.author Michael Aigner
# @raycast.authorURL https://github.com/tonka3000
# @raycast.description Show todos from GitLab
# Configuration
# see gitlabconfig.py
# Main program
from gitlabhelper import GitLab
gitlab = GitLab()
data = gitlab.get_call("todos")
print(f"GitLab To-Do List on {gitlab.instance}:\n")
todo_count = len(data)
print(f"To Do {todo_count}")
for todo in data:
project_name = todo.get("project", {}).get("name_with_namespace")
title = todo.get("target", {}).get("title")
web_url = todo.get("target", {}).get("web_url")
print(f"* {title} at {project_name}")
print(f"{web_url}\n")
================================================
FILE: commands/developer-utils/gitlab/gitlabconfig.py
================================================
#
# fill in your values of this config!
#
# GitLab instance like https://gitlab.com
instance = "https://gitlab.com"
# Personal access token, see https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html#creating-a-personal-access-token
pat = ""
if not instance:
print("no GitLab instance provided")
exit(1)
if not pat:
print("no personal access token provided")
exit(1)
================================================
FILE: commands/developer-utils/gitlab/gitlabhelper.py
================================================
import json
import urllib.request
import ssl
import certifi
import gitlabconfig as config
class GitLab:
def __init__(self):
self.instance = config.instance
self.pat = config.pat
def get_call(self, url):
url = f"{self.instance}/api/v4/{url}"
request = urllib.request.Request(url)
request.add_header("PRIVATE-TOKEN", self.pat)
try:
response = urllib.request.urlopen(request, context=ssl.create_default_context(cafile=certifi.where())) # context= avoids local ssl errors
except urllib.error.HTTPError as e:
print("Error code: ", e.code)
print(f"Failed to get todos from {self.instance}")
exit(1)
except urllib.error.URLError as e:
print("Error reason: ", e.reason)
print("Failed to reach {instance}")
exit(1)
else:
data_text = response.read().decode("utf-8")
return json.loads(data_text)
================================================
FILE: commands/developer-utils/google/google-lighthouse.sh
================================================
#!/bin/bash
# Dependency: requires lighthouse (https://developers.google.com/web/tools/lighthouse#cli)
# Install via npm: `npm install -g lighthouse`
# @raycast.title Lighthouse
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Open a [Lighthouse](https://developers.google.com/web/tools/lighthouse/) report of URL.
# @raycast.currentDirectoryPath ~/Desktop
# @raycast.icon images/google-lighthouse-logo.png
# @raycast.mode silent
# @raycast.packageName Google
# @raycast.schemaVersion 1
# @raycast.argument1 { "type": "text", "placeholder": "URL" }
if ! command -v lighthouse &> /dev/null; then
echo "lighthouse is required (https://developers.google.com/web/tools/lighthouse#cli).";
exit 1;
fi
regex='(https?)://[-A-Za-z0-9\+&@#/%?=~_|!:,.;]*[-A-Za-z0-9\+&@#/%=~_|]'
if [[ $1 =~ $regex ]]; then
lighthouse --quiet --view "$1"
fi
echo "Input is not a valid URL."
================================================
FILE: commands/developer-utils/google/google-psi-desktop.sh
================================================
#!/bin/bash
# Dependency: requires psi (https://github.com/GoogleChromeLabs/psi)
# Install via npm: `npm install -g psi`
# @raycast.title PageSpeed Insights - Desktop
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Run a [PageSpeed Insights](https://developers.google.com/speed/pagespeed/insights/) analysis on desktop of URL.
# @raycast.icon images/google-psi-logo.png
# @raycast.mode fullOutput
# @raycast.packageName Google
# @raycast.schemaVersion 1
# @raycast.argument1 { "type": "text", "placeholder": "URL" }
if ! command -v psi &> /dev/null; then
echo "psi is required (https://github.com/GoogleChromeLabs/psi).";
exit 1;
fi
url=$1
regex='(https?)://[-A-Za-z0-9\+&@#/%?=~_|!:,.;]*[-A-Za-z0-9\+&@#/%=~_|]'
if [[ $url =~ $regex ]]; then
analysis=$(psi $url --strategy=desktop 2>&1)
if [ ${?} -eq 1 ]; then
echo ""
echo "There was an error; please try again later."
else
echo "$analysis"
fi
analysis_url="https://developers.google.com/speed/pagespeed/insights/?url=${url}&tab=desktop"
echo ""
echo "Desktop analysis URL:"
echo "$analysis_url"
exit 0
fi
echo "Input is not a valid URL."
================================================
FILE: commands/developer-utils/google/google-psi-mobile.sh
================================================
#!/bin/bash
# Dependency: requires psi (https://github.com/GoogleChromeLabs/psi)
# Install via npm: `npm install -g psi`
# @raycast.title PageSpeed Insights - Mobile
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Run a [PageSpeed Insights](https://developers.google.com/speed/pagespeed/insights/) analysis on mobile of URL.
# @raycast.icon images/google-psi-logo.png
# @raycast.mode fullOutput
# @raycast.packageName Google
# @raycast.schemaVersion 1
# @raycast.argument1 { "type": "text", "placeholder": "URL" }
if ! command -v psi &> /dev/null; then
echo "psi is required (https://github.com/GoogleChromeLabs/psi).";
exit 1;
fi
url=$1
regex='(https?)://[-A-Za-z0-9\+&@#/%?=~_|!:,.;]*[-A-Za-z0-9\+&@#/%=~_|]'
if [[ $url =~ $regex ]]; then
analysis=$(psi $url --strategy=mobile 2>&1)
if [ ${?} -eq 1 ]; then
echo ""
echo "There was an error; please try again later."
else
echo "$analysis"
fi
analysis_url="https://developers.google.com/speed/pagespeed/insights/?url=${url}&tab=mobile"
echo ""
echo "Desktop analysis URL:"
echo "$analysis_url"
exit 0
fi
echo "Clipboard does not contain a URL."
================================================
FILE: commands/developer-utils/ignore-package-folders-time-machine.template.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Ignore Package Folders
# @raycast.mode inline
# @raycast.refreshTime 1d
# @raycast.packageName Developer Utilities
# Optional parameters:
# @raycast.icon 🧹
# Documentation:
# @raycast.description Ignore package folders (node_modules, Pods, etc) from Time Machine backups. They might not be big in size (altough they do add up), but they usually have tens of thousands of files, making backups slower than they should be. Many files are worse than big files when copying. You can also add a Spotlight comment to each file, to easily be able to exclude the same folders from Spotlight indexing (disabled by default).
# @raycast.author Roland Leth
# @raycast.authorURL https://runtimesharks.com
# Change this to your projects' folder.
# You can use `$HOME` for a relative path to your home folder,
# for example `"$HOME/web-projects"` expands to `/Users/you/web-projects`.
WORK_DIR=""
DEPTH=8
# Add or remove as needed, separated by `|`.
DIRS="node_modules|Carthage|Pods"
# -E means to use extended regex;
# -maxdepth means it'll drill into that many subfolders, starting at the folder set above,
# so if you start at `/Users/you/web-projects`, it'll go as far as
# `/Users/you/web-projects/1/2/3/4/5/6/7/node_modules`;
# -type d means to search for directories;
# -iregex means case insensitive regex;
# -prune means it'll skip matches inside matches, meaning it will skip
# `/some/path/node_modules/other/node_modules` since `/some/path/node_modules` was matched;
cmd=(find -E "$WORK_DIR" -maxdepth "$DEPTH" -type d -iregex ".*\/($DIRS).*" -prune)
# Use this to first confirm they're what you want; it'll print them all.
# "${cmd[@]}"
# -exec means it passes all the output to `tmutil`, `{}` is replaced by the pathname of the file, and `\+` tells it to pass all paths at once.
"${cmd[@]}" -exec tmutil addexclusion {} \+
# This adds a spotlight metadata comment, so a Smart Folder (or a custom search) can be used to find all these items. The best part is that it won't return any items that are already ignored by Spotlight.
# To create a Smart Folder (or a custom search) that returns items with this comment, use a Raw Query of `kMDItemFinderComment == "ignore_spotlight_index"`.
# "${cmd[@]}" -exec xattr -w com.apple.metadata:kMDItemFinderComment "ignore_spotlight_index" {} \+
# Use these to confirm they're excluded:
# - `[Included] ` means they will get backed up;
# - `[Excluded] ` means they won't get backed up.
# "${cmd[@]}" -exec tmutil isexcluded {} \;
# `: ignore_spotlight_index` means it added the comment;
# `xattr: : No such xattr...` means it didn't add the comment.
# "${cmd[@]}" -exec xattr -p com.apple.metadata:kMDItemFinderComment {} \+
date "+%d %b, %I:%m %p"
================================================
FILE: commands/developer-utils/ip/get-external-ip-v4.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title External IPv4
# @raycast.mode inline
# @raycast.packageName Internet
# Optional parameters:
# @raycast.icon 🌐
# Documentation:
# @raycast.description Copies the external IPv4 to the clipboard.
ip=$(curl -4 -s -m 5 https://api.ipify.org)
echo $ip | tr -d '\n' | pbcopy
echo "Copied $ip"
================================================
FILE: commands/developer-utils/ip/get-external-ip-v6.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title External IPv6
# @raycast.mode inline
# @raycast.packageName Internet
# Optional parameters:
# @raycast.icon 🌐
# Documentation:
# @raycast.description Copies the external IPv6 to the clipboard.
ip=$(curl -6 -s -m 5 https://api64.ipify.org)
echo $ip | tr -d '\n' | pbcopy
echo "Copied $ip"
================================================
FILE: commands/developer-utils/ip/get-local-ip-v4.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Local IPv4
# @raycast.mode inline
# @raycast.packageName Internet
# Optional parameters:
# @raycast.icon 🌐
# Documentation:
# @raycast.description Copies the local IPv4 to the clipboard.
ip=$(ifconfig | grep 'inet.*broadcast' | awk '{print $2}')
IFS=' ' read -ra array <<< "$ip"
echo ${array[0]} | tr -d '\n' | pbcopy
echo "Copied $ip"
================================================
FILE: commands/developer-utils/ip/get-local-ip-v6.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Local IPv6
# @raycast.mode inline
# @raycast.packageName Internet
# Optional parameters:
# @raycast.icon 🌐
# Documentation:
# @raycast.description Copies the local IPv6 to the clipboard.
ip=$(ifconfig | grep 'inet6.*%en' | awk '{print $2}')
IFS=' ' read -ra array <<< "$ip"
echo ${array[0]} | tr -d '\n' | pbcopy
echo "Copied $ip"
================================================
FILE: commands/developer-utils/ip/get-url-ip-v4.sh
================================================
#!/bin/bash
# @raycast.title URL IPv4
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Get IPv4 address of URL.
# @raycast.icon 🌐
# @raycast.mode compact
# @raycast.packageName Internet
# @raycast.schemaVersion 1
# @raycast.argument1 { "type": "text", "placeholder": "URL" }
ip=$(dig -4 +short +time=1 $1 | awk '{ print ; exit }')
echo $ip | pbcopy
echo "Copied $ip"
================================================
FILE: commands/developer-utils/ip/get-url-ip-v6.sh
================================================
#!/bin/bash
# @raycast.title URL IPv6
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Get IPv6 address of URL.
# @raycast.icon 🌐
# @raycast.mode compact
# @raycast.packageName Internet
# @raycast.schemaVersion 1
# @raycast.argument1 { "type": "text", "placeholder": "URL" }
ip=$(dig -6 +short +time=1 $1 | awk '{ print ; exit }')
echo $ip | pbcopy
echo "Copied $ip"
================================================
FILE: commands/developer-utils/is-it-up.sh
================================================
#!/bin/bash
# Dependency: requires jq (https://stedolan.github.io/jq/)
# Install via Homebrew: `brew install jq`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Is It Up?
# @raycast.mode compact
# @raycast.packageName Developer Utils
#
# Optional parameters:
# @raycast.icon 🌐
# @raycast.argument1 { "type": "text", "placeholder": "Website" }
#
# Documentation:
# @raycast.description Check if a website is up
# @raycast.author Jesse Claven
# @raycast.authorURL https://github.com/jesse-c
if ! command -v jq &> /dev/null; then
echo "jq is required (https://stedolan.github.io/jq/).";
exit 1;
fi
# Get the url from the user input
url=$1
# Remove any protocol prefix (http:// or https://)
url=${url#*://}
# Remove any www. prefix
url=${url#www.}
# Remove any trailing slash
url=${url%/}
status_code=$(curl --silent "https://isitup.org/${url}.json" | jq '.status_code')
# Sample output:
#
# {
# "domain": "duckduckgo.com",
# "port": 80,
# "status_code": 1,
# "response_ip": "52.142.124.215",
# "response_code": 200,
# "response_time": 0.021
# }
case $status_code in
1) echo "$1 is up!"
exit 0
;;
2) echo "$1 is down."
exit 0
;;
3) echo "Invalid domain: $1"
exit 1
;;
*) echo "Error: unknown status code ($status_code): $1"
exit 1
;;
esac
================================================
FILE: commands/developer-utils/join-lines.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Join Clipboard Lines by Delimiter
# @raycast.mode silent
# Optional parameters:
# @raycast.icon 🛠
# @raycast.argument1 { "type": "text", "placeholder": "delimiter", "optional": true }
# @raycast.packageName Developer Utilities
# Documentation:
# @raycast.description Join multiple lines of text from the clipboard into a single line, separated by a specified delimiter.
# @raycast.author decaylala
# @raycast.authorURL https://github.com/decaylala
pbpaste | awk -v d="$1" 'BEGIN {ORS=d} {print}' | awk -v d="$1" 'sub(d "$", "")' | pbcopy
echo 'Copied to clipboard'
================================================
FILE: commands/developer-utils/json-stringify-text.js
================================================
#!/usr/bin/env node
// Required parameters:
// @raycast.schemaVersion 1
// @raycast.title Json Stringify Text
// @raycast.mode fullOutput
// Optional parameters:
// @raycast.icon 💻
// @raycast.packageName Developer Utilities
// Documentation:
// @raycast.description Get JSON-formatted text
// @raycast.author Senthil Prabhu
const child_process = require("child_process");
const fs = require("fs");
// Function to read the output of pbpaste command
function pbpaste() {
return new Promise((resolve, reject) => {
const child = child_process.spawn('pbpaste');
// listen on child process stdout
let response = "";
child.stdout.on("data", (chunk) => {
response += chunk;
});
child.on("close", (code) => {
if (code != 0) {
reject();
} else {
resolve(response);
}
});
});
};
// Function to copy data to clipboard
function pbcopy(data) {
return new Promise(function(resolve, reject) {
const child = child_process.spawn('pbcopy');
child.on('error', function(err) {
reject(err);
});
child.on('close', function(err) {
resolve(data);
});
child.stdin.write(data);
child.stdin.end();
});
};
// Stringify the text from clipboard and copy back to it
pbpaste()
.then(function(result) {
return JSON.stringify(result);
})
.then(function(string) {
return pbcopy(string);
})
.then(function(string) {
console.log(string);
}).catch(function(e) {
console.error(new Error('Could not stringify text'));
console.error(e);
});
================================================
FILE: commands/developer-utils/json-to-go-struct.sh
================================================
#!/bin/bash
# Dependency: requires json-to-go-cli, jq
# Install with npm: `npm i json-to-go-cli -g`
# Install with brew: `brew install jq`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title JSON to Go Struct
# @raycast.mode fullOutput
# @raycast.packageName Developer Utilities
# Optional parameters:
# @raycast.argument1 {"type": "text", "placeholder": "inline", "optional": true}
# @raycast.icon images/go.png
# Documentation:
# @raycast.author tiancheng92
# @raycast.authorURL https://github.com/tiancheng92
# @raycast.description Convert the copied JSON into a golang structure.
if ! command -v json-to-go &> /dev/null; then
echo "trans command is required (https://github.com/mholt/json-to-go).";
exit 1;
fi
if ! command -v jq &> /dev/null; then
echo "jq command is required (https://stedolan.github.io/jq/).";
exit 1;
fi
echo "$(pbpaste)" | jq &> /dev/null
if [ $(echo $?) != 0 ]; then
echo "json parse error";
echo "raw data: $(pbpaste)"
exit 1;
fi
if [ "$1" != "" ]; then
json-to-go -s "$(pbpaste)" -i
json-to-go -s "$(pbpaste)" -i | pbcopy
else
json-to-go -s "$(pbpaste)"
json-to-go -s "$(pbpaste)" | pbcopy
fi
================================================
FILE: commands/developer-utils/lorem-ipsum.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Copy Lorem Ipsum
# @raycast.mode silent
# @raycast.packageName Developer Utilities
# Optional parameters:
# @raycast.icon 📝
# Documentation:
# @raycast.description Copy one paragraph of Lorem Ipsum to clipboard.
echo "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Turpis egestas pretium aenean pharetra. Orci eu lobortis elementum nibh tellus molestie. Vulputate dignissim suspendisse in est. Vel pharetra vel turpis nunc. Malesuada nunc vel risus commodo. Nisi vitae suscipit tellus mauris. Posuere morbi leo urna molestie at elementum eu. Urna duis convallis convallis tellus. Urna molestie at elementum eu. Nunc sed blandit libero volutpat." | pbcopy
echo "Copied Lorem Ipsum"
================================================
FILE: commands/developer-utils/md5-hash.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title MD5 Hash
# @raycast.mode silent
# @raycast.packageName Developer Utilities
#
# Optional parameters:
# @raycast.icon 🔐
# @raycast.needsConfirmation false
# @raycast.argument1 { "type": "text", "placeholder": "text", "optional": false }
#
# Documentation:
# @raycast.description Hashing any text data by using MD5
# @raycast.author Bin Hua
# @raycast.authorURL https://github.com/hzb
echo -n $1 | md5 -r | pbcopy
echo "Copied to clipboard"
================================================
FILE: commands/developer-utils/microlink.sh
================================================
#!/bin/bash
# Dependency: This script requires `microlink` CLI installed: https://microlink.io/docs/api/getting-started/cli
# Install via npm: `npm install -g microlink`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Microlink API
# @raycast.mode fullOutput
# Optional parameters:
# @raycast.icon images/microlink.png
# @raycast.argument1 { "type": "text", "placeholder": "url", "optional": false }
# Documentation:
# @raycast.description Microlink API integration
# @raycast.author Kiko Beats
# @raycast.authorURL https://github.com/kikobeats
microlink "$1"
================================================
FILE: commands/developer-utils/minikube/minikube-config-set.sh
================================================
#!/bin/bash
# Dependency: This script requires `minikube` to be installed: https://minikube.sigs.k8s.io/docs/start/
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Config Set
# @raycast.mode compact
# @raycast.packageName Minikube
# Optional parameters:
# @raycast.icon ⚙️
# Documentation:
# @raycast.description Pause Minikube cluster
# @raycast.author Daniils Petrovs
# @raycast.authorURL https://danpetrov.xyz
# @raycast.argument1 { "type": "text", "placeholder": "property name" }
# @raycast.argument2 { "type": "text", "placeholder": "property value" }
if ! command -v minikube &> /dev/null; then
echo "minikube is required (https://minikube.sigs.k8s.io).";
exit 1;
fi
minikube config set "$1" "$2"
echo "Set $1 to $2"
================================================
FILE: commands/developer-utils/minikube/minikube-pause.sh
================================================
#!/bin/bash
# Dependency: This script requires `minikube` to be installed: https://minikube.sigs.k8s.io/docs/start/
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Pause
# @raycast.mode compact
# @raycast.packageName Minikube
# Optional parameters:
# @raycast.icon ⏸
# Documentation:
# @raycast.description Pause Minikube cluster
# @raycast.author Daniils Petrovs
# @raycast.authorURL https://danpetrov.xyz
if ! command -v minikube &> /dev/null; then
echo "minikube is required (https://minikube.sigs.k8s.io).";
exit 1;
fi
minikube pause
echo "Cluster paused"
================================================
FILE: commands/developer-utils/minikube/minikube-start.sh
================================================
#!/bin/bash
# Dependency: This script requires `minikube` to be installed: https://minikube.sigs.k8s.io/docs/start/
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Start
# @raycast.mode compact
# @raycast.packageName Minikube
# Optional parameters:
# @raycast.icon 🚀
# Documentation:
# @raycast.description Start Minikube cluster
# @raycast.author Daniils Petrovs
# @raycast.authorURL https://danpetrov.xyz
if ! command -v minikube &> /dev/null; then
echo "minikube is required (https://minikube.sigs.k8s.io).";
exit 1;
fi
minikube start
echo "Cluster started 🚀"
================================================
FILE: commands/developer-utils/minikube/minikube-status.sh
================================================
#!/bin/bash
# Dependency: This script requires `minikube` to be installed: https://minikube.sigs.k8s.io/docs/start/
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Status
# @raycast.mode fullOutput
# @raycast.packageName Minikube
# Optional parameters:
# @raycast.icon ℹ️
# Documentation:
# @raycast.description Show Minikube cluster status
# @raycast.author Daniils Petrovs
# @raycast.authorURL https://danpetrov.xyz
if ! command -v minikube &> /dev/null; then
echo "minikube is required (https://minikube.sigs.k8s.io).";
exit 1;
fi
minikube status
================================================
FILE: commands/developer-utils/minikube/minikube-stop.sh
================================================
#!/bin/bash
# Dependency: This script requires `minikube` to be installed: https://minikube.sigs.k8s.io/docs/start/
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Stop
# @raycast.mode compact
# @raycast.packageName Minikube
# Optional parameters:
# @raycast.icon 🤖
# Documentation:
# @raycast.description Stops a running Minikube cluster
# @raycast.author Daniils Petrovs
# @raycast.authorURL https://danpetrov.xyz
if ! command -v minikube &> /dev/null; then
echo "minikube is required (https://minikube.sigs.k8s.io).";
exit 1;
fi
minikube stop
echo "Cluster stopped"
================================================
FILE: commands/developer-utils/minikube/minikube-unpause.sh
================================================
#!/bin/bash
# Dependency: This script requires `minikube` to be installed: https://minikube.sigs.k8s.io/docs/start/
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Unpause
# @raycast.mode compact
# @raycast.packageName Minikube
# Optional parameters:
# @raycast.icon ⏸
# Documentation:
# @raycast.description Pause Minikube cluster
# @raycast.author Daniils Petrovs
# @raycast.authorURL https://danpetrov.xyz
if ! command -v minikube &> /dev/null; then
echo "minikube is required (https://minikube.sigs.k8s.io).";
exit 1;
fi
minikube unpause
echo "Cluster unpaused"
================================================
FILE: commands/developer-utils/open-link-simulator.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open Deep Link
# @raycast.mode compact
# Optional parameters:
# @raycast.argument1 { "type": "text", "placeholder": "Deep Link" }
# Documentation:
# @raycast.description Opens a URL inside the currently booted iOS Simulator. Can be used to open deeplinks
# @raycast.author Tomás Martins
# @raycast.authorURL https://github.com/tfmart
# @raycast.icon 🔗
# @raycast.packageName Developer Utilities
# @raycast.schemaVersion 1
on run argv
do shell script "xcrun simctl openurl booted " & (item 1 of argv)
end run
================================================
FILE: commands/developer-utils/pa11y.sh
================================================
#!/bin/bash
# Dependency: requires pa11y (https://github.com/pa11y/pa11y) and pa11y-reporter-html (https://github.com/pa11y/pa11y-reporter-html)
# Install via npm: `npm install -g pa11y pa11y-reporter-html@1.0.0`
# @raycast.title Run Pa11y
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Run [Pa11y](https://github.com/pa11y/pa11y) web accessibility tool on specified path or URL.
# @raycast.currentDirectoryPath ~/Desktop
# @raycast.icon images/pa11y-logo.png
# @raycast.mode compact
# @raycast.packageName Developer Utilities
# @raycast.schemaVersion 1
# @raycast.argument1 { "type": "text", "placeholder": "Path or URL" }
if ! command -v pa11y &> /dev/null; then
echo "pa11y command is required (https://github.com/pa11y/pa11y).";
exit 1;
fi
if ! command -v pa11y-reporter-html &> /dev/null; then
echo "pa11y-reporter-html command is required for HTML output (https://github.com/pa11y/pa11y-reporter-html).";
exit 1;
fi
pa11y --reporter html "$1" > "pa11y-report.html"
echo "Report saved to Desktop"
================================================
FILE: commands/developer-utils/ping-monitor.template.sh
================================================
#!/bin/bash
#########################################################
## Set IP address or website URL in "target" variable. ##
#########################################################
# IP address or URL.
target=""
# @raycast.title Ping Monitor
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Ping an IP address or URL on an interval.
# @raycast.icon 🌐
# @raycast.mode inline
# @raycast.packageName Internet
# @raycast.refreshTime 10m
# @raycast.schemaVersion 1
if [ -z ${target+x} ]; then
echo "Target is undefined.";
exit 0
fi
output=$(ping -i 0.25 -t 3 -q "$target")
summary=$(echo "$output" | awk 'END{print}')
IFS=' ' read -ra array <<< $summary
times=$(echo ${array[3]})
avg=$(echo $times | awk -F/ '{print $2}')
echo "${target}: ${avg}${array[4]}"
================================================
FILE: commands/developer-utils/ping.sh
================================================
#!/bin/bash
# @raycast.title Ping
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Ping an IP address or URL.
# @raycast.icon 🌐
# @raycast.mode fullOutput
# @raycast.packageName Internet
# @raycast.schemaVersion 1
# @raycast.argument1 { "type": "text", "placeholder": "URL or IP address" }
ping -i 0.25 -t 3 "$1"
================================================
FILE: commands/developer-utils/prettify-json.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Prettify JSON
# @raycast.mode fullOutput
# @raycast.packageName Developer Utilities
# Optional parameters:
# @raycast.icon 💻
# Documentation:
# @raycast.description Pretty prints the JSON currently in the clipboard.
pbpaste | python -m json.tool
================================================
FILE: commands/developer-utils/record-simulator.sh
================================================
#!/bin/zsh
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Record Simulator
# @raycast.mode compact
# @raycast.packageName Developer Utilities
# Optional parameters:
# @raycast.author Maxim Krouk
# @raycast.authorURL https://github.com/maximkrouk
# @raycast.description Records simulator to Downloads folder
# @raycast.needsConfirmation true
# @raycast.icon 📱
# @raycast.argument1 { "type": "text", "placeholder": "Filename" }
# @raycast.currentDirectoryPath ~/Downloads
clipboard=$1
filePath=~/Downloads/$clipboard.mp4
xcrun simctl io booted recordVideo $filePath
open -R $filePath
================================================
FILE: commands/developer-utils/run-bash-command.sh
================================================
#!/usr/bin/env bash
###############################################################################
# Title: run-bash-command.sh #
# #
# Description: run arbitrary bash command and show ouput in Raycast window. # #
# #
# Arguments: #
# Your arbitrary bash commands (oneliner). #
# * If blank, it opens the Terminal app and cd to . #
# The directory where your command will be excuted. #
# * If blank, it uses current Finder directory. #
# * If no open Finder window, then use $HOME. #
# #
###############################################################################
#
#
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Run Command
# @raycast.description Run arbitrary bash command and return output in Raycast.
# @raycast.mode fullOutput
# @raycast.author Boyang Xu
# @raycast.authorURL https://github.com/BoyangMichael
#
# Optional parameters:
# @raycast.icon images/run-bash-command.png
# @raycast.packageName Bash Command
# @raycast.argument1 { "type": "text", "placeholder": "Command (Default: open Terminal)", "optional": true }
# @raycast.argument2 { "type": "text", "placeholder": "Directory (Default: Finder)", "optional": true }
cmd="$1"
dir="${2/#\~/$HOME}"
# Parse directory
if [ -z "$dir" ] ; then
finder_dir=$( osascript -e "tell application \"Finder\"" -e "if exists window 1 then" -e "set pathList to (POSIX path of (folder of the front window as alias))" -e "pathList" -e "end if" -e "end tell" )
if [ -z "$finder_dir" ] ; then
dir="${HOME}"
else
dir="$finder_dir"
fi
fi
# Action
if [ -z "$cmd" ] ; then
osascript -e "set dir to \"$dir\"" -e "dir" -e "tell application \"Terminal\"" -e "do script \"cd \" & quoted form of dir" -e "activate" -e "end tell"
else
TERM="linux" ; export TERM
cd "$dir"
eval "$cmd"
cd "$OLDPWD"
fi
================================================
FILE: commands/developer-utils/run-command-in-finder.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Run Command On Front Finder Window
# @raycast.mode silent
# @raycast.author Wesley Martin
# @raycast.authorURL https://github.com/itsmewes
#
# Optional parameters:
# @raycast.icon 🛠
# @raycast.packageName Developer Utils
# @raycast.argument1 { "type": "text", "placeholder": "Write command" }
# Documentation:
# @raycast.description Runs the specified command in the path of the frontmost Finder window.
dir=$(osascript <<'EOF'
tell application "Finder"
if exists Finder window 1 then
get the POSIX path of (target of Finder window 1 as alias)
else
get the POSIX path of (desktop as alias)
end if
end tell
EOF
)
( cd "$dir" && $@ )
================================================
FILE: commands/developer-utils/search-script-command.sh
================================================
#!/bin/bash
# Dependency: This script requires `swift` installed.
# Install via https://swift.org/download/
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Search Script Command
# @raycast.mode fullOutput
# @raycast.packageName Searches
#
# Optional parameters:
# @raycast.author Thiago Holanda
# @raycast.authorURL https://twitter.com/tholanda
# @raycast.icon 🔎
# @raycast.description Search for Script Commands available in the Raycast repository
# @raycast.argument1 { "type": "text", "placeholder": "Query"}
# Files related to this Script Command:
# - search-script-command.sh (this file)
# - search-script-command.swift
# - search-script-command (this binary file will be generated by swiftc)
if ! command -v swiftc &> /dev/null; then
echo "Swift is required (https://swift.org/download).";
exit 1;
fi
filename=${0##*/}
basename=${filename%.*}
swift_filename="$basename.swift"
if [ ! -f $basename ] && [ -f $swift_filename ]; then
$(swiftc $swift_filename -emit-executable -o $basename)
fi
./$basename "$1"
================================================
FILE: commands/developer-utils/search-script-command.swift
================================================
/**
* Search Script Command - Raycast Script Command
* Copyright (c) Thiago Holanda 2021
* https://twitter.com/tholanda
*
* Files related to this Script Command:
* - search-script-command.sh
* - search-script-command.swift (this file)
* - search-script-command (this binary file will be generated by swiftc)
*
* MIT license
*
*/
import Foundation
// MARK: - Typealiases
typealias Groups = [Group]
typealias ScriptCommands = [ScriptCommand]
typealias NSTextCheckingResults = [NSTextCheckingResult]
// MARK: - Regular Expression Helper
final class RegEx {
static func checkingResults(for regex: String, in text: String) -> NSTextCheckingResults {
do {
let regex = try NSRegularExpression(
pattern: regex,
options: [
.caseInsensitive,
.anchorsMatchLines,
]
)
let range = NSRange(
text.startIndex...,
in: text
)
return regex.matches(
in: text,
range: range
)
}
catch {
print("Invalid regex: \(error.localizedDescription)")
return []
}
}
}
// MARK: - Models
struct RaycastData: Codable {
var updatedAt = Date()
var groups = Groups()
var totalScriptCommands: Int
}
struct Group: Codable {
let name: String
let path: String
var scriptCommands: ScriptCommands = []
var subGroups: Groups?
}
struct Icon: Codable {
let light: String?
let dark: String?
}
struct ScriptCommand: Codable {
let identifier: String
let createdAt: String
let updatedAt: String
let schemaVersion: Int
let title: String
var filename: String
let mode: Mode?
var packageName: String?
let icon: Icon?
let authors: [Author]?
let details: String?
let currentDirectoryPath: String?
let needsConfirmation: Bool?
let refreshTime: String?
let path: String
let language: String
private(set) var leadingPath: String = ""
private enum CodingKeys: String, CodingKey {
case identifier
case createdAt
case updatedAt
case schemaVersion
case title
case filename
case mode
case packageName
case icon
case authors
case details = "description"
case currentDirectoryPath
case needsConfirmation
case refreshTime
case path
case language
}
mutating func setLeadingPath(_ value: String) {
self.leadingPath = value
}
}
extension ScriptCommand {
typealias Authors = [Author]
struct Author: Codable, CustomStringConvertible {
let name: String?
let url: String?
var description: String {
if let name = name {
return "\u{001B}[0;33m\(name.trimmedText)\u{001B}[0m"
}
else if let url = url {
return url
}
return .empty
}
}
}
extension ScriptCommand {
enum Mode: String, Codable {
case fullOutput
case compact
case silent
case inline
}
}
// MARK: - Author Extension
extension Array where Element == ScriptCommand.Author {
var authorDescription: String {
var authors = String.empty
for author in self {
let separator = self.separator(for: author.name ?? .empty)
authors += separator + author.description
}
return authors
}
func separator(for currentName: String) -> String {
if let firstAuthor = first, currentName == firstAuthor.name {
return .empty
}
else if let lastAuthor = last, currentName == lastAuthor.name {
return Separator.and
}
return Separator.comma
}
}
extension ScriptCommand.Authors {
enum Separator {
static let and = " and "
static let comma = ", "
}
}
// MARK: - Extensions
extension ScriptCommand {
func contains(_ query: String) -> Bool {
var description: String = .empty
if let details = self.details {
description = details
}
return title.lowercased().contains(query)
|| filename.lowercased().contains(query)
|| description.lowercased().contains(query)
|| language.lowercased().contains(query)
}
}
extension ScriptCommand: Comparable {
static func < (lhs: ScriptCommand, rhs: ScriptCommand) -> Bool {
lhs.title < rhs.title
}
static func == (lhs: ScriptCommand, rhs: ScriptCommand) -> Bool {
lhs.title == rhs.title
}
}
extension Group: Comparable {
static func < (lhs: Group, rhs: Group) -> Bool {
lhs.name < rhs.name
}
static func == (lhs: Group, rhs: Group) -> Bool {
lhs.name == rhs.name
}
}
// MARK: - Int Extension
extension Int {
enum Unit: Int {
case units = 1
case tens = 2
case hundreds = 3
case thousands = 4
}
var unitForTotal: Unit {
switch self {
case 0..<10:
return .units
case 10..<100:
return .tens
case 100..<1000:
return .hundreds
default:
return .thousands
}
}
func prependZeros(for unit: Unit) -> String {
let format = "%0\(unit.rawValue)d"
let counter = String(format: format, self)
return counter
}
}
// MARK: - String Extension
extension String {
static var newLine = "\n"
static var empty = ""
var trimmedText: String {
trimmingCharacters(in: .whitespacesAndNewlines)
}
private func value(of range: NSRange) -> String? {
var value: String?
if range.location != NSNotFound, range.length > 0, let rangeString = Range(range, in: self) {
value = String(self[rangeString])
}
return value
}
func clearMarkdownLink() -> String {
var content = self
let regex = #"\[(.+?)\]\((.+?)\)"#
let results = RegEx.checkingResults(for: regex, in: content)
results.compactMap { result -> [String]? in
guard result.numberOfRanges == 3 else {
return nil
}
guard
let match = content.value(of: result.range(at: 0)),
let value = content.value(of: result.range(at: 1))
else {
return nil
}
return [match, value]
}
.forEach { item in
content = content.replacingOccurrences(of: item[0], with: item[1])
}
return content.trimmedText
}
}
// MARK: - Store
final class ScriptCommandsStore {
enum StoreError: Error {
case emptyData
}
private var totalScriptCommands: Int = 0
private var scriptCommands: ScriptCommands = []
private let extensionsURL = URL(string: "https://raw.githubusercontent.com/raycast/script-commands/master/commands/extensions.json")
private func githubURL(for path: String) -> String {
"https://github.com/raycast/script-commands/blob/master/commands/\(path)"
}
private func loadData() throws -> RaycastData {
let urlSession = URLSession.shared
var data: Data?
let semaphore = DispatchSemaphore(value: 0)
guard let url = extensionsURL else {
throw URLError(.badURL)
}
let task = urlSession.dataTask(with: url) { responseData, response, error in
data = responseData
semaphore.signal()
}
task.resume()
semaphore.wait()
guard let unwrappedData = data else {
throw StoreError.emptyData
}
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
let raycastData = try decoder.decode(RaycastData.self, from: unwrappedData)
return raycastData
}
func searchCommand(using query: String) {
do {
let data = try loadData()
totalScriptCommands = data.totalScriptCommands
search(for: query, in: data.groups)
if scriptCommands.count > 0 {
print(
renderOutput(
for: scriptCommands
)
)
}
else {
print("No script command found with '\(query)'")
}
}
catch {
print(error)
exit(1)
}
}
private func search(for query: String, in groups: Groups) {
for group in groups {
search(
for: query,
in: group,
leadingPath: group.path
)
}
scriptCommands = scriptCommands.sorted()
}
private func search(for query: String, in group: Group, leadingPath: String = "") {
if group.scriptCommands.count > 0 {
for var scriptCommand in group.scriptCommands {
if scriptCommand.contains(query) {
scriptCommand.setLeadingPath(
"\(leadingPath)/\(scriptCommand.filename)"
)
self.scriptCommands.append(scriptCommand)
}
}
}
if let subGroups = group.subGroups {
for subGroup in subGroups {
search(
for: query,
in: subGroup,
leadingPath: "\(leadingPath)/\(subGroup.path)"
)
}
}
}
private func renderOutput(for scriptCommands: ScriptCommands) -> String {
let total = scriptCommands.count
let unit = total.unitForTotal
var contentString = "Script Commands found: \u{001B}[0;32m\(total)\u{001B}[0m in \u{001B}[0;32m\(totalScriptCommands)\u{001B}[0m"
for (index, scriptCommand) in scriptCommands.enumerated() {
var title = String.empty
var author = String.empty
if let value = scriptCommand.authors {
author = "(by \(value.authorDescription))"
}
let position = Int(index + 1).prependZeros(for: unit)
title = "\(position)) \u{001B}[0;31m\(scriptCommand.title.clearMarkdownLink())\u{001B}[0m \(author)"
if contentString.count > 0 {
contentString += .newLine + .newLine
}
contentString += title.trimmedText
if let details = scriptCommand.details {
contentString += .newLine
contentString += details.clearMarkdownLink()
}
contentString += .newLine
contentString += "Language: \u{001B}[0;31m\(scriptCommand.language.capitalized)\u{001B}[0m"
contentString += .newLine
contentString += githubURL(for: scriptCommand.leadingPath)
}
return contentString
}
}
if CommandLine.arguments.count > 1 {
let query = CommandLine.arguments[1].lowercased().trimmedText
if query.isEmpty {
print("Query must not be empty")
}
else {
let store = ScriptCommandsStore()
store.searchCommand(using: query)
}
}
================================================
FILE: commands/developer-utils/sentry/sentry-unresolved-issues-by-project.template.py
================================================
#!/usr/bin/env python3
# How to use this script?
# It's a template which needs further setup. Duplicate the file,
# remove `.template.` from the filename and set an API token as
# well as the Sentry organization.
#
# API: https://docs.sentry.io/api/events/list-a-projects-issues/
# Parameters
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Unresolved Issues By Project
# @raycast.mode fullOutput
# Conditional parameters:
# @raycast.refreshTime 1h
# Optional parameters:
# @raycast.packageName Sentry
# @raycast.icon images/sentry.png
# @raycast.iconDark images/sentry-dark.png
# @raycast.argument1 { "type": "text", "placeholder": "Project" }
# Documentation:
# @raycast.author Phil Salant
# @raycast.authorURL https://github.com/PSalant726
# @raycast.author Thomas Paul Mann
# @raycast.authorURL https://github.com/thomaspaulmann
# @raycast.description Show unresolved issues in the last 24 hours (by project) from Sentry.
#########################
##### Configuration #####
#########################
# API token with `project:read` scope (https://sentry.io/settings/account/api/auth-tokens/)
API_TOKEN = ""
# Slug of organization the issues belong to
ORGANIZATION = ""
if not API_TOKEN:
print(error("No API token provided"))
exit(1)
if not ORGANIZATION:
print(error("No Sentry organization provided"))
exit(1)
# Main program
import json, sys, urllib.request
from datetime import datetime as dt
colors = {
'ok': '\033[92m',
'error': '\033[91m',
'end': '\033[0m',
'warn': '\033[93m',
}
def error(message):
return f"{colors['error']}{message}{colors['end']}"
def ok(message):
return f"{colors['ok']}{message}{colors['end']}"
def warn(message):
return f"{colors['warn']}{message}{colors['end']}"
project = sys.argv[1]
if not project:
print(error("No Sentry project provided"))
exit(1)
request = urllib.request.Request(
method="GET",
url=f"https://sentry.io/api/0/projects/{ORGANIZATION}/{project}/issues/?statsPeriod=24h&query=is:unresolved",
headers={ "Authorization": f"Bearer {API_TOKEN}" }
)
try:
response = urllib.request.urlopen(request)
except urllib.error.HTTPError as e:
print(f"{error('Failed to get unresolved issues from Sentry:')} {e.code} {e.reason}")
exit(1)
except urllib.error.URLError as e:
print(f"{error('Failed to reach Sentry:')} {e.reason}")
exit(1)
else:
unresolved_issues = json.loads(response.read().decode("utf-8"))
unresolved_issues_count = len(unresolved_issues)
if unresolved_issues_count == 0:
print(ok("No unresolved issues in the last 24 hours."))
else:
issue_text = "issue" if unresolved_issues_count == 1 else "issues"
print(error(f"{unresolved_issues_count} unresolved {issue_text} in the last 24 hours:\n"))
for i, issue in enumerate(unresolved_issues, 1):
last_seen = dt.strptime(issue['lastSeen'], "%Y-%m-%dT%H:%M:%S.%fZ").strftime('%b %d, %Y at %I:%M %p')
print(f"{i}. {warn(issue['title'])}")
print(f" Last seen {last_seen}.")
print(f" {issue['permalink']}\n")
================================================
FILE: commands/developer-utils/sentry/sentry-unresolved-issues.template.py
================================================
#!/usr/bin/env python3
# How to use this script?
# It's a template which needs further setup. Duplicate the file,
# remove `.template.` from the filename and set an API token as
# well as the Sentry organization and project.
#
# API: https://docs.sentry.io/api/events/list-a-projects-issues/
# Parameters
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Unresolved Issues
# @raycast.mode inline
# Conditional parameters:
# @raycast.refreshTime 1h
# Optional parameters:
# @raycast.packageName Sentry
# @raycast.icon images/sentry.png
# @raycast.iconDark images/sentry-dark.png
# Documentation:
# @raycast.author Thomas Paul Mann
# @raycast.authorURL https://github.com/thomaspaulmann
# @raycast.description Show unresolved issues of the last 24 hours from Sentry.
# Configuration
# API token with `project:read` scope (https://sentry.io/settings/account/api/auth-tokens/)
API_TOKEN = ""
# Slug of organization the issues belong to
ORGANIZATION = ""
# Slug of project the issues belong to
PROJECT = ""
if not API_TOKEN:
print("No API token provided")
exit(1)
if not ORGANIZATION or not PROJECT:
print("No Sentry organization or project provided")
exit(1)
# Main program
import json
import urllib.request
url = f"https://sentry.io/api/0/projects/{ORGANIZATION}/{PROJECT}/issues/?statsPeriod=24h&query=is:unresolved"
request = urllib.request.Request(url)
request.add_header("Authorization", f"Bearer {API_TOKEN}")
try:
response = urllib.request.urlopen(request)
except urllib.error.HTTPError as e:
print("Error code: ", e.code)
print("Failed to get unresolved issues from Sentry")
exit(1)
except urllib.error.URLError as e:
print("Error reason: ", e.reason)
print("Failed to reach Sentry")
exit(1)
else:
data = response.read().decode("utf-8")
unresolved_issues = json.loads(data)
unresolved_issues_count = len(unresolved_issues)
has_unresolved_issues = unresolved_issues_count > 0
message = f"{unresolved_issues_count} in the last 24 hours" if has_unresolved_issues else "None in the last 24 hours"
print(message)
================================================
FILE: commands/developer-utils/sha1-hash.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title SHA1 Hash
# @raycast.mode silent
# @raycast.packageName Developer Utilities
#
# Optional parameters:
# @raycast.icon 🔐
# @raycast.needsConfirmation false
# @raycast.argument1 { "type": "text", "placeholder": "text", "optional": false }
#
# Documentation:
# @raycast.description Hashing any text data by using SHA1
# @raycast.author Bin Hua
# @raycast.authorURL https://github.com/hzb
echo -n $1 | shasum | tr -d '-' | pbcopy
echo "Copied to clipboard"
================================================
FILE: commands/developer-utils/solana/solana-tx-blink-extract.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Extract Transaction from Blink Response
# @raycast.mode silent
# @raycast.packageName Solana
# Optional parameters:
# @raycast.icon ./images/solana-logo.png
# Documentation:
# @raycast.description Extract transaction from Blink endpoint in clipboard and replaces with the transaction
# @raycast.author bjoerndotsol
# @raycast.authorURL https://github.com/bjoerndotsol
# Get clipboard content
input=$(pbpaste)
# Check if "transactions" (plural) exists
if echo "$input" | grep -q '"transactions"'; then
echo "❌ Error: Multiple transactions detected. This script only works with a single transaction."
exit 1
fi
# Extract transaction value using grep and sed
transaction=$(echo "$input" | grep -o '"transaction"\s*:\s*"[^"]*"' | sed 's/"transaction"\s*:\s*"\([^"]*\)"/\1/')
# Check if transaction was found
if [ -z "$transaction" ]; then
echo "❌ Error: No transaction property found in the input."
exit 1
fi
# Copy transaction to clipboard
echo "$transaction" | pbcopy
# Show success message
echo "✅ Transaction copied to clipboard!"
================================================
FILE: commands/developer-utils/solana/solana-tx-details.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title View Solana Transaction
# @raycast.mode silent
# @raycast.packageName Solana
# Optional parameters:
# @raycast.icon ./images/solana-logo.png
# @raycast.argument1 { "type": "text", "placeholder": "Transaction Signature" }
# @raycast.argument2 { "type": "text", "placeholder": "Network", "optional": true }
# Documentation:
# @raycast.description Opens a Solana transaction in Solscan. Network: empty/mainnet, d/dev/devnet, t/test/testnet
# @raycast.author bjoerndotsol
# @raycast.authorURL https://github.com/bjoerndotsol
# Get transaction signature from first argument
SIGNATURE="$1"
# Get network parameter (optional, defaults to mainnet)
NETWORK_PARAM=$(echo "$2" | tr '[:upper:]' '[:lower:]') # Convert to lowercase
# Determine the network cluster based on the parameter
if [[ -z "$NETWORK_PARAM" ]]; then
# Empty or not provided = mainnet
CLUSTER=""
elif [[ "$NETWORK_PARAM" == d* ]]; then
# Starts with 'd' = devnet
CLUSTER="?cluster=devnet"
elif [[ "$NETWORK_PARAM" == t* ]]; then
# Starts with 't' = testnet
CLUSTER="?cluster=testnet"
else
# Default to mainnet for unrecognized input
CLUSTER=""
fi
# Construct the Solscan URL
URL="https://solscan.io/tx/${SIGNATURE}${CLUSTER}"
# Open the URL in the default browser
open "$URL"
echo "Opening transaction in Solscan: $URL"
================================================
FILE: commands/developer-utils/solana/solana-tx-inspector.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open in Solana Inspector
# @raycast.mode silent
# @raycast.packageName Solana
# Optional parameters:
# @raycast.icon ./images/solana-logo.png
# @raycast.argument1 { "type": "text", "placeholder": "Signed transaction (base64)" }
# Documentation:
# @raycast.description Extracts the message from a signed Solana transaction and opens Explorer's Inspector with it.
# @raycast.author bjoerndotsol
# @raycast.authorURL https://github.com/bjoerndotsol
# This script decodes a full signed Solana transaction (base64)
# and reconstructs a Solana Explorer Inspector link.
# Supports both legacy and versioned transactions.
TX_BASE64=$(printf "%s" "$1" | tr -d '[:space:]')
if [[ -z "$TX_BASE64" ]]; then
echo "❌ Please provide a base64-encoded transaction."
exit 1
fi
# Use Python to extract the message portion (skip signatures)
MESSAGE_BASE64=$(python3 - "$TX_BASE64" <<'PY'
import sys, base64, binascii, urllib.parse
try:
tx_b64 = sys.argv[1]
b = base64.b64decode(tx_b64)
except (binascii.Error, ValueError) as e:
print(f"Error decoding base64: {e}", file=sys.stderr)
sys.exit(1)
# Transaction format:
# [u8: num_signatures] [signatures * 64 bytes] [message...]
# The message may start with a version byte (0x80 | version) for versioned transactions
if not b or len(b) < 2:
print("Transaction too short", file=sys.stderr)
sys.exit(1)
num_signatures = b[0]
offset = 1 + num_signatures * 64
if offset >= len(b):
print(f"Invalid transaction: offset {offset} >= length {len(b)}", file=sys.stderr)
sys.exit(1)
# Extract message (includes version byte if present)
msg = b[offset:]
msg_b64 = base64.b64encode(msg).decode()
# URL encode (double encoding for Explorer)
encoded = urllib.parse.quote(msg_b64, safe='')
print(encoded)
PY
)
# Check if extraction failed
if [[ $? -ne 0 ]] || [[ -z "$MESSAGE_BASE64" ]]; then
echo "❌ Could not extract transaction message."
exit 1
fi
# Dummy signature array for Inspector (Explorer only needs valid JSON)
DUMMY_SIGS='["1111111111111111111111111111111111111111111111111111111111111111"]'
ENCODED_SIGS=$(python3 -c "import urllib.parse,sys;print(urllib.parse.quote(sys.argv[1]))" "$DUMMY_SIGS")
URL="https://explorer.solana.com/tx/inspector?signatures=${ENCODED_SIGS}&message=${MESSAGE_BASE64}"
open "$URL"
echo "✅ Opening Solana Explorer Inspector"
================================================
FILE: commands/developer-utils/strong-password-generator.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Strong Password Generator
# @raycast.mode compact
# @raycast.packageName Developer Utils
# Optional parameters:
# @raycast.icon 🔐
# @raycast.argument1 { "type": "text", "placeholder": "Length"}
# Documentation:
# @raycast.author Nitin Gupta
# @raycast.authorURL https://twitter.com/gniting
# @raycast.description Generate a strong password of requested character length
openssl rand -base64 $1 | head -c$1 | pbcopy; echo -n `pbpaste`
================================================
FILE: commands/developer-utils/time-between-dates.js
================================================
#!/usr/bin/env node
// Dependency: This script requires Nodejs.
// Install Node: https://nodejs.org/en/download/
// Required parameters:
// @raycast.schemaVersion 1
// @raycast.title Time Between Dates
// @raycast.mode fullOutput
// Optional parameters:
// @raycast.icon 🕒
// @raycast.argument1 { "type": "text", "placeholder": "First Date (Default: now)", "optional":true}
// @raycast.argument2 { "type": "text", "placeholder": "Second Date" }
// @raycast.description Given two dates returns the time between them in multiple units of measure.
// @raycast.packageName Developer Utilities
// Documentation:
// @raycast.author Federico Miraglia
// @raycast.authorURL https://github.com/Mitra98t
const dateReg = new RegExp(/^\d{4}\-(0?[1-9]|1[012])\-(0?[1-9]|[12][0-9]|3[01])$/)
var firstD = process.argv.slice(2)[0]
var secondD = process.argv.slice(2)[1]
if(firstD != ""){
if(!dateReg.test(secondD)){
console.log("Use format yyyy-mm-dd or yyyy-m-d")
return null
}
else {
firstD = new Date(firstD)
}
}
else {
firstD = new Date()
}
if(!dateReg.test(secondD)){
console.log("Use format yyyy-mm-dd or yyyy-m-d")
return null
}
else{
secondD = new Date(secondD)
}
var firstD1am = new Date(`${firstD.getFullYear()}-${firstD.getMonth() + 1}-${firstD.getDate()}`)
var diffMS = Math.abs(secondD.getTime() - firstD.getTime())
var diffMS1Am = Math.abs(secondD.getTime() - firstD1am.getTime())
var diffDays = Math.round(diffMS1Am / (1000 * 3600 * 24))
var diffHours = Math.round(diffMS / (1000 * 3600))
var diffYears = (diffMS / 31556952000).toFixed(2)
console.log(`There are ${diffMS} milliseconds`);
console.log(`There are ${diffHours} hours`);
console.log(`There are ${diffDays} days today excluded`);
console.log(`There are ${diffYears} years`);
console.log(`Between the two given dates.`);
================================================
FILE: commands/developer-utils/time-calculator.js
================================================
#!/usr/bin/env node
// Dependency: This script requires Nodejs.
// Install Node: https://nodejs.org/en/download/
// Required parameters:
// @raycast.schemaVersion 1
// @raycast.title Time Calculator
// @raycast.mode compact
// Optional parameters:
// @raycast.icon 🕒
// @raycast.argument1 { "type": "text", "placeholder": "Starting Date (Default: now)", "optional":true }
// @raycast.argument2 { "type": "text", "placeholder": "Time to Add/Subtract (eg: -44, 44, +44)" }
// @raycast.argument3 { "type": "text", "placeholder": "s, m, h, d, w, y (Default: h)", "optional":true}
// @raycast.description Add or Subtract specified amount of time from given date.
// @raycast.packageName Developer Utilities
// Documentation:
// @raycast.author Federico Miraglia
// @raycast.authorURL https://github.com/Mitra98t
const dateReg = new RegExp(/^\d{4}\-(0?[1-9]|1[012])\-(0?[1-9]|[12][0-9]|3[01])$/)
var value = process.argv.slice(2)[1]
var unit = process.argv.slice(2)[2] == "" ? "h" : process.argv.slice(2)[2]
var operator = ""
if (unit != "s" && unit != "m" && unit != "h" && unit != "d" && unit != "w" && unit != "y") {
console.log("Use s, m, h, d, w, y as units of measure")
return null
}
if (!/^[-\+]?\d+$/.test(value)) {
console.log("Only numbers eg: -44, 44, +44")
return null
}
else{
operator = value.charAt(0)
if(/^[-\+]$/.test(operator))
value = value.substring(1)
}
function conversion(n, unit) {
switch (unit) {
case "s":
return n * 1000
break;
case "m":
return n * 60000
break;
case "h":
return n * 3600000
break;
case "d":
return (n * 24) * 3600000
break;
case "w":
return ((n * 7) * 24) * 3600000
break;
case "y":
return n * 31556952000
break;
default:
return { err: true, message: "Wrong time format" }
break;
}
}
var nowDate = process.argv.slice(2)[0]
if (nowDate != "") {
if(!dateReg.test(nowDate)){
console.log("Use format yyyy-mm-dd or yyyy-m-d")
return null
}
else{
nowDate = new Date(nowDate)
}
}
else{
nowDate = new Date()
}
var nowMS = nowDate.getTime()
var resMS = operator !== "-" ? nowMS + conversion(value, unit) : nowMS - conversion(value, unit)
var resDate = new Date(resMS)
var resString = `${resDate.getFullYear()}-${resDate.getMonth() + 1}-${resDate.getDate()} | ${resDate.getHours()}:${resDate.getMinutes()}:${resDate.getSeconds()} | Unix ${resMS}`
console.log(resString)
================================================
FILE: commands/developer-utils/tldr.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Print TLDR doc
# @raycast.mode fullOutput
# Optional parameters:
# @raycast.icon 🤖
# @raycast.argument1 { "type": "text", "placeholder": "Command" }
# @raycast.argument2 { "type": "text", "placeholder": "OS [linux, osx, sunos, windows]", "optional": true }
# @raycast.packageName Developer Utils
# @Documentation:
# @raycast.description Print the tldr documentation for a command
# @raycast.author Achille Lacoin
# @raycast.authorURL https://github.com/pomdtr
if ! command -v tldr &>/dev/null; then
echo "tldr CLI is not installed."
echo "Installation instructions: https://dbrgn.github.io/tealdeer/installing.html"
exit 1
fi
command=$1
os=$2
if test -z "$os"; then
tldr "$command" --color always
else
tldr "$command" --os "$os" --color always
fi
================================================
FILE: commands/developer-utils/toggle_ssh_proxy_tunnel.template.sh
================================================
#!/bin/bash
# Raycast Script Command
#
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Toggle SSH SOCKS Tunnel
# @raycast.mode silent
#
# Optional parameters:
# @raycast.icon 🔒
# @raycast.packageName Developer Utilities
#
# Documentation:
# @raycast.description Toggles an SSH SOCKS proxy tunnel on and off.
# @raycast.author Andrii Barabash
# @raycast.authorURL https://github.com/AndriiBarabash
# --- Configuration ---
# Replace these with your own values
SSH_USER=""
SSH_HOST=""
SSH_PORT=""
INTERFACE="" # e.g., "Wi-Fi" or "Ethernet"
PROXY_PORT="" # e.g., 1080
# --- End Configuration ---
if pgrep -f "ssh -D $PROXY_PORT" >/dev/null; then
echo "SSH SOCKS tunnel is running. Turning it off..."
# Kill the SSH process
pkill -f "ssh -D $PROXY_PORT"
# Disable the SOCKS proxy
networksetup -setsocksfirewallproxystate "$INTERFACE" off
echo "Tunnel and proxy disabled."
else
echo "SSH SOCKS tunnel is not running. Turning it on..."
# Start the SSH tunnel
ssh -D "$PROXY_PORT" -f -C -q -N -p "$SSH_PORT" "$SSH_USER"@"$SSH_HOST"
# Enable the SOCKS proxy
networksetup -setsocksfirewallproxy "$INTERFACE" 127.0.0.1 "$PROXY_PORT"
networksetup -setsocksfirewallproxystate "$INTERFACE" on
echo "Tunnel and proxy enabled."
fi
================================================
FILE: commands/developer-utils/transform-case.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Transform Case
# @raycast.mode compact
# @raycast.packageName Developer Utils
# Optional parameters:
# @raycast.icon 🔠
# @raycast.argument1 { "type": "text", "placeholder": "L)ower, U)pper or T)itle?" }
# Documentation:
# @raycast.author Nitin Gupta
# @raycast.authorURL https://twitter.com/gniting
# @raycast.description Transform the case of clipboard content. Defaults to lower case if no conversion type is specified.
case $1 in
[Uu] )
pbpaste | awk '{print toupper($0)}' | pbcopy; echo -n `pbpaste`
;;
[Tt] )
pbpaste | awk '{print tolower($0)}' | awk '{for(j=1;j<=NF;j++){ $j=toupper(substr($j,1,1)) substr($j,2) }}1' | pbcopy; echo -n `pbpaste`
;;
* )
pbpaste | awk '{print tolower($0)}' | pbcopy; echo -n `pbpaste`
;;
esac
================================================
FILE: commands/developer-utils/trim-git-commit-hash.sh
================================================
#!/bin/bash
# @raycast.title Trim Git Commit Hash
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Trim full git commit hash down to seven characters.
# @raycast.icon ✂
# @raycast.mode silent
# @raycast.packageName Developer Utilities
# @raycast.schemaVersion 1
# @raycast.argument1 { "type": "text", "placeholder": "Full git commit hash" }
str="$1"
echo ${str:0:7} | tr -d '\n' | pbcopy
echo "Copied to clipboard"
================================================
FILE: commands/developer-utils/unix-timestamp.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Copy Current Epoch Unix Timestamp
# @raycast.mode silent
# Optional parameters:
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Copy the current epoch Unix timestamp.
# @raycast.packageName Developer Utils
# @raycast.icon ⏱️
echo -n $(date +"%s") | pbcopy
echo "Unix timestamp copied"
================================================
FILE: commands/developer-utils/unshorten-url.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Unshorten URL
# @raycast.author Nikita Galaiko
# @raycast.authorURL https://github.com/ngalaiko
# @raycast.mode silent
# @raycast.packageName Developer Utilities
# Optional parameters:
# @raycast.icon 🔗
# Documentation:
# @raycast.description Unshortens clipboard content url and copies the result again.
## Please note that https://unshorten.me has a limit of unique 10 requests per hour:
## https://unshorten.me/api
function resolve() {
local url_short="${1//+/ }"
local schema_less="$(sed 's/https\{0,1\}:\/\///g' <<<"${url_short}")"
local resolved="$(curl --silent https://unshorten.me/s/${schema_less})"
printf '%b' "${resolved//%/\\x}"
}
resolve $(pbpaste) | pbcopy
echo "URL resolved"
================================================
FILE: commands/developer-utils/view-scripting-dictionary.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title View Scripting Dictionary
# @raycast.mode silent
# Optional parameters:
# @raycast.icon 📖
# @raycast.argument1 { "type": "text", "placeholder": "Application", "optional": true }
# @raycast.packageName Developer Utils
# Documentation:
# @raycast.description Opens the Scripting Dictionary for the given application, defaulting to the active application if none is provided.
# @raycast.author Stephen Kaplan
# @raycast.authorURL https://github.com/SKaplanOfficial
if [ -z "$1" ]; then
open -a "Script Editor" "$(osascript -e "tell application \"System Events\" to get POSIX path of application file of (first application process whose frontmost is true)")"
exit
fi
open -a "Script Editor" "$(osascript -e "POSIX path of (path to application \"$1\")")"
================================================
FILE: commands/developer-utils/vscode/open-folder-in-vscode.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open Directory
# @raycast.mode silent
# @raycast.packageName VS Code
#
# Optional parameters:
# @raycast.icon images/vscode.png
#
# Documentation:
# @raycast.description Opens current topmost directory in VS Code
# @raycast.author chohner
# @raycast.authorURL https://github.com/chohner
tell application "Finder"
# Check if there's a selection; works if there's a window open or not.
if selection is not {} then
set i to item 1 of (get selection)
# If it's an alias, set the item to the original item.
if class of i is alias file then
set i to original item of i
end if
# If it's a folder, use its path.
if class of i is folder then
set p to i
else
# If it's an item, use its container's path.
set p to container of i
end if
else if exists window 1 then
# If a window exist, use its folder property as the path.
set p to folder of window 1
else
# Fallback to the Desktop, as nothing is open or selected.
set p to path to desktop folder
end if
end tell
do shell script "open -n -b \"com.microsoft.VSCode\" --args " & quoted form of POSIX path of (p as alias)
================================================
FILE: commands/developer-utils/vscode/open-project-in-vscode.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open Project
# @raycast.mode compact
# @raycast.packageName VS Code
# Optional parameters:
# @raycast.icon images/vscode.png
# @raycast.argument1 { "type": "text", "placeholder": "Directory Name", "optional": false }
# Documentation
# @raycast.description Finds path to the given directory which must be a VS Code or Git project and opens it with VS Code
# @raycast.author Maksim Zemlyanikin
# @raycast.authorURL https://github.com/Maksimka101
directory=$1
foundDirectory=''
if [ -z $directory ]; then
echo "Empty directory is not allowed"
exit 1
fi
set +e
directories=$(find $HOME -name $directory -type d -maxdepth 5)
for dir in $directories; do
if [[ -n "$(find $dir -name .vscode -maxdepth 1)" || -n "$(find $dir -name .git -maxdepth 1)" ]]; then
foundDirectory=$dir
fi
done
if [ -n $foundDirectory ]; then
echo "Project directory is $foundDirectory"
if [ -n $(which code) ]; then
code -n $foundDirectory
else
open -n -b \"com.microsoft.VSCode\" --args $foundDirectory
fi
else
echo "No such directory in '$HOME' with name $1"
fi
exit 0
================================================
FILE: commands/developer-utils/wayback-machine-save.sh
================================================
#!/bin/bash
# @raycast.title Save URL to Wayback Machine
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Save URL to [Wayback Machine](https://web.archive.org/).
# @raycast.icon images/ia-logo.jpg
# @raycast.mode compact
# @raycast.packageName Internet
# @raycast.schemaVersion 1
# @raycast.argument1 { "type": "text", "placeholder": "URL" }
url=$1
regex='(https?)://[-A-Za-z0-9\+&@#/%?=~_|!:,.;]*[-A-Za-z0-9\+&@#/%=~_|]'
if [[ $url =~ $regex ]]
then
curl -s "http://web.archive.org/save/$url" > /dev/null
echo "Submitted $url to Wayback Machine"
else
echo "Input is not a valid URL"
fi
================================================
FILE: commands/developer-utils/whois.sh
================================================
#!/bin/bash
# Dependency: This script requires `whois` CLI which is already installed on macOS.
# But if for some reason you don't have: brew install whois
# @raycast.title Whois
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.author Ronan Rodrigo Nunes
# @raycast.authorURL https://ronanrodrigo.dev
# @raycast.description Whois of URL.
# @raycast.icon 🌐
# @raycast.mode fullOutput
# @raycast.packageName Internet
# @raycast.schemaVersion 1
# @raycast.argument1 { "type": "text", "placeholder": "URL" }
if command -v whois &> /dev/null; then
whois $1
else
open https://who.is/whois/$1
fi
================================================
FILE: commands/developer-utils/xcode/xcode-last-project.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Last Project
# @raycast.mode silent
# @raycast.packageName Developer Utilities
#
# Optional parameters:
# @raycast.icon images/xcode.png
# @raycast.needsConfirmation false
#
# Documentation:
# @raycast.description Open the last Xcode project
# @raycast.author Sergey Korobyin
# @raycast.authorURL https://github.com/huangsemao
mdfind "(kMDItemContentType =='com.apple.xcode.project') || (kMDItemContentType == 'com.apple.dt.document.workspace') || (kMDItemContentType == 'com.apple.dt.playground')" -0 | xargs -0 ls -t | head -1 | cut -f1 -d: | awk '{print "\x27" $0 "\x27" }' | xargs open
================================================
FILE: commands/developer-utils/xcode/xcode-recent-project.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Recent Project
# @raycast.mode silent
# @raycast.packageName Developer Utilities
# @raycast.argument1 { "type": "text", "placeholder": "Project name", "percentEncoded": true}
#
# Optional parameters:
# @raycast.icon images/xcode.png
# @raycast.needsConfirmation false
#
# Documentation:
# @raycast.description Open recent Xcode project
# @raycast.author Sergey Korobyin
# @raycast.authorURL https://github.com/huangsemao
mdfind "(kMDItemFSName == '*$1*'c) && ((kMDItemContentType =='com.apple.xcode.project') || (kMDItemContentType == 'com.apple.dt.document.workspace') || (kMDItemContentType == 'com.apple.dt.playground'))" -0 | xargs -0 ls -t | head -1 | cut -f1 -d: | awk '{print "\x27" $0 "\x27" }' | xargs open
================================================
FILE: commands/extensions.json
================================================
{
"groups" : [
{
"name" : "Home",
"path" : "home",
"scriptCommands" : [
],
"subGroups" : [
{
"name" : "Elgato",
"path" : "elgato",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Thomas Paul Mann",
"url" : "https:\/\/github.com\/thomaspaulmann"
}
],
"createdAt" : "2021-02-04T18:14:11Z",
"currentDirectoryPath" : null,
"description" : "Increase brightness of Elgato Key Light by 5%.",
"filename" : "elgato-key-light-increase-brightness.template.rb",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/elgato.png"
},
"identifier" : "0efbf0fc0112b8007548e0036851da5a",
"isTemplate" : true,
"language" : "ruby",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Elgato Key Light",
"path" : "home\/elgato\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Increase Brightness",
"updatedAt" : "2021-02-04T18:14:11Z"
},
{
"authors" : [
{
"name" : "Thomas Paul Mann",
"url" : "https:\/\/github.com\/thomaspaulmann"
}
],
"createdAt" : "2021-02-04T18:14:11Z",
"currentDirectoryPath" : null,
"description" : "Turn on Elgato Key Light.",
"filename" : "elgato-key-light-turn-on.template.rb",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/elgato.png"
},
"identifier" : "6bded1a4b3b945dff30a380936a1741f",
"isTemplate" : true,
"language" : "ruby",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Elgato Key Light",
"path" : "home\/elgato\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Turn On",
"updatedAt" : "2021-02-04T18:14:11Z"
},
{
"authors" : [
{
"name" : "Thomas Paul Mann",
"url" : "https:\/\/github.com\/thomaspaulmann"
}
],
"createdAt" : "2021-02-04T18:14:11Z",
"currentDirectoryPath" : null,
"description" : "Turn off Elgato Key Light.",
"filename" : "elgato-key-light-turn-off.template.rb",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/elgato.png"
},
"identifier" : "d5b4e7d38d50f78801983fed1ab9c710",
"isTemplate" : true,
"language" : "ruby",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Elgato Key Light",
"path" : "home\/elgato\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Turn Off",
"updatedAt" : "2021-02-04T18:14:11Z"
},
{
"authors" : [
{
"name" : "Thomas Paul Mann",
"url" : "https:\/\/github.com\/thomaspaulmann"
}
],
"createdAt" : "2021-02-04T18:14:11Z",
"currentDirectoryPath" : null,
"description" : "Decrease brightness of Elgato Key Light by 5%.",
"filename" : "elgato-key-light-decrease-brightness.template.rb",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/elgato.png"
},
"identifier" : "6b6890b0f6e356b44fd73d3d7e30c902",
"isTemplate" : true,
"language" : "ruby",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Elgato Key Light",
"path" : "home\/elgato\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Decrease Brightness",
"updatedAt" : "2021-02-04T21:22:04Z"
}
]
},
{
"name" : "Philips Hue",
"path" : "philips-hue",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Jono Hewitt",
"url" : "https:\/\/github.com\/jonohewitt"
}
],
"createdAt" : "2021-05-15T13:09:58+02:00",
"currentDirectoryPath" : null,
"description" : "Show inline summary about your rooms of Hue compatible lights. Choose to show the number of lights on out of the room total, or use more general terms such as \"All on\". Requires rooms to have already been set up in the Hue app.",
"filename" : "hue-rooms-inline.template.mjs",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "💡"
},
"identifier" : "e46e06b26b98f5f9b2e390565bb48a1b",
"isTemplate" : true,
"language" : "node",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Philips Hue",
"path" : "home\/philips-hue\/",
"refreshTime" : "2m",
"schemaVersion" : 1,
"title" : "Rooms",
"updatedAt" : "2021-07-23T17:49:45-04:00"
},
{
"authors" : [
{
"name" : "Jono Hewitt",
"url" : "https:\/\/github.com\/jonohewitt"
}
],
"createdAt" : "2021-05-15T13:08:55+02:00",
"currentDirectoryPath" : null,
"description" : "Set a specified or default individual color bulb to a preset, hsb or brightness value. Leave preset and value arguments empty to toggle a bulb on or off.",
"filename" : "hue-bulb.template.mjs",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "💡"
},
"identifier" : "fb89b0817302263bcaae8586039493f8",
"isTemplate" : true,
"language" : "node",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Philips Hue",
"path" : "home\/philips-hue\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Set Light Bulb",
"updatedAt" : "2021-07-23T17:49:11-04:00"
},
{
"authors" : [
{
"name" : "Jono Hewitt",
"url" : "https:\/\/github.com\/jonohewitt"
}
],
"createdAt" : "2021-05-15T13:09:44+02:00",
"currentDirectoryPath" : null,
"description" : "Show inline summary of any Hue compatible lights. Choose to show on\/off, brightness percentage, color temperature or hue, saturation, brightness values. Recommended to have already assigned names to lights in the Hue app.",
"filename" : "hue-lights-inline.template.mjs",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "💡"
},
"identifier" : "f6fb1c021d088eac4eeabfbe0ffcff23",
"isTemplate" : true,
"language" : "node",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Philips Hue",
"path" : "home\/philips-hue\/",
"refreshTime" : "2m",
"schemaVersion" : 1,
"title" : "Lights",
"updatedAt" : "2021-07-23T17:49:49-04:00"
},
{
"authors" : [
{
"name" : "Jono Hewitt",
"url" : "https:\/\/github.com\/jonohewitt"
}
],
"createdAt" : "2021-05-15T13:08:55+02:00",
"currentDirectoryPath" : null,
"description" : "Set a specified or default room of color bulbs to a preset, hsb or brightness value. Leave preset and value arguments empty to toggle a room on or off.",
"filename" : "hue-room.template.mjs",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "💡"
},
"identifier" : "6f9d2bf502507e1a6d6ab2fe57c71e94",
"isTemplate" : true,
"language" : "node",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Philips Hue",
"path" : "home\/philips-hue\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Set Room Lights",
"updatedAt" : "2021-07-23T17:49:41-04:00"
}
]
}
]
},
{
"name" : "Conversions",
"path" : "conversions",
"scriptCommands" : [
{
"authors" : [
{
"name" : "RealTong",
"url" : "https:\/\/raycast.com\/RealTong"
}
],
"createdAt" : "2024-03-21T12:03:11+08:00",
"currentDirectoryPath" : null,
"description" : "Add spaces between Chinese and English, number or symbols.",
"filename" : "space-fixer.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "📝"
},
"identifier" : "01ce6b040aecd6bcd05519b1880154c6",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Conversions",
"path" : "conversions\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Space Fixer",
"updatedAt" : "2024-03-22T18:09:49+08:00"
},
{
"authors" : [
{
"name" : "Adam Zethraeus",
"url" : "https:\/\/github.com\/adam-zethraeus"
}
],
"createdAt" : "2021-04-11T17:02:10-07:00",
"currentDirectoryPath" : null,
"description" : "Converts text to z̫̫̐a̳ͩl̓͂̀ͅg͔̚o̷̦̣͢ t̳͆ḛ̊͟ẍ̮̝́t̵̔ͯ͝",
"filename" : "zalgo-text.swift",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "👹"
},
"identifier" : "2d634b5bcb404f80873074e8fd26b9c8",
"isTemplate" : false,
"language" : "swift",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Conversions",
"path" : "conversions\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Zalgo Text",
"updatedAt" : "2021-04-12T08:35:23-07:00"
},
{
"authors" : [
{
"name" : "Adam Zethraeus",
"url" : "https:\/\/github.com\/adam-zethraeus"
}
],
"createdAt" : "2021-03-25T14:52:38-07:00",
"currentDirectoryPath" : null,
"description" : "Convert rich text clipboard data to GitHub Flavored Markdown using Pandoc",
"filename" : "rich-text-clipboard-to-markdown.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "📝"
},
"identifier" : "b5ade467081438e72c96da6cab2dcefb",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Conversions",
"path" : "conversions\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Rich Text to Markdown",
"updatedAt" : "2024-08-28T20:37:53+08:00"
},
{
"authors" : null,
"createdAt" : "2020-10-24T11:59:49-04:00",
"currentDirectoryPath" : null,
"description" : "Converts column to comma separated list.",
"filename" : "column-to-comma.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🗂"
},
"identifier" : "36817b8a67adc979ae871b5f4caebe18",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Conversions",
"path" : "conversions\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Column to Comma",
"updatedAt" : "2021-04-20T01:26:19-07:00"
},
{
"authors" : [
{
"name" : "Phil Salant",
"url" : "https:\/\/github.com\/PSalant726"
}
],
"createdAt" : "2021-02-20T19:36:59-05:00",
"currentDirectoryPath" : null,
"description" : "Return the day of the week on which a particular date falls.",
"filename" : "what-day-is.py",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "📅"
},
"identifier" : "9201a6c6a3bd7bbc86adc6cbb791caf8",
"isTemplate" : false,
"language" : "python",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Conversions",
"path" : "conversions\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "What Day Is...",
"updatedAt" : "2021-02-21T22:11:45Z"
},
{
"authors" : [
{
"name" : "Michael Bianco",
"url" : "https:\/\/github.com\/iloveitaly"
}
],
"createdAt" : "2023-08-16T08:02:16-06:00",
"currentDirectoryPath" : null,
"description" : "A script to take the HTML pastboard type filled by google docs and convert it to nicely formatted markdown",
"filename" : "google-docs-to-markdown.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "📋"
},
"identifier" : "2b7d768fc7ffd6b6990173914031c150",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Conversions",
"path" : "conversions\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Convert Google Docs Rich Text HTML to Markdown",
"updatedAt" : "2023-08-16T08:02:16-06:00"
},
{
"authors" : [
{
"name" : "atzzCokeK",
"url" : "https:\/\/github.com\/atzzCokeK"
}
],
"createdAt" : "2023-10-10T22:38:42+09:00",
"currentDirectoryPath" : null,
"description" : "Quickly and simply generate a markdown formatted link with your specified URL and title.",
"filename" : "inputs-to-markdown-link.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🔗"
},
"identifier" : "f7dee34add22537a9662c9fc31f36827",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Conversions",
"path" : "conversions\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Simple Markdown Link Generator",
"updatedAt" : "2023-10-17T22:58:55+09:00"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2021-08-21T13:14:05-04:00",
"currentDirectoryPath" : null,
"description" : "Trim newlines and tabs from clipboard content.",
"filename" : "trim-newlines-tabs.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "✂️"
},
"identifier" : "bcbc3784b51822bb3771df707ad5b088",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Conversions",
"path" : "conversions\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Trim Newlines and Tabs",
"updatedAt" : "2021-08-23T10:12:46Z"
},
{
"authors" : [
{
"name" : "Quentin Eude",
"url" : "https:\/\/github.com\/qeude"
}
],
"createdAt" : "2021-07-02T09:59:04+02:00",
"currentDirectoryPath" : null,
"description" : "Create a GIF from video, by default it takes the last screen record video",
"filename" : "create-gif-from-video.py",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "📹"
},
"identifier" : "84edd7675ee0b974e699ddd28fae84f5",
"isTemplate" : false,
"language" : "python",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Conversions",
"path" : "conversions\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Create GIF from video",
"updatedAt" : "2021-07-02T09:59:04+02:00"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-11-03T16:41:50-05:00",
"currentDirectoryPath" : null,
"description" : "Convert hexadecimal color value to RGBA value.",
"filename" : "hex-to-rgba.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🎨"
},
"identifier" : "6d131530318240cf125637fc91c92ce9",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Conversions",
"path" : "conversions\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Hex to RGBA",
"updatedAt" : "2020-11-28T13:47:03-05:00"
},
{
"authors" : [
{
"name" : "Adam Zethraeus",
"url" : "https:\/\/github.com\/adam-zethraeus"
}
],
"createdAt" : "2021-03-24T02:53:50-07:00",
"currentDirectoryPath" : null,
"description" : "Convert clipboards text to fake unicode superscript",
"filename" : "unicode-superscript.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🦸♀️"
},
"identifier" : "04c3c0bf32f09602d74bdebfed5967c4",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Conversion",
"path" : "conversions\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Unicode Superscript",
"updatedAt" : "2021-04-12T10:16:23-07:00"
},
{
"authors" : [
{
"name" : "wyhaya",
"url" : "https:\/\/github.com\/wyhaya"
}
],
"createdAt" : "2021-11-04T03:59:40+08:00",
"currentDirectoryPath" : null,
"description" : "QR Code Generation",
"filename" : "qrcode-generate.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/qrcode.png"
},
"identifier" : "df265285ae7ca5b6305aaada0055f872",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Conversions",
"path" : "conversions\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "QR Code Generation",
"updatedAt" : "2021-11-04T03:59:40+08:00"
},
{
"authors" : [
{
"name" : "Maxim Borzov",
"url" : "https:\/\/github.com\/borzov"
}
],
"createdAt" : "2024-05-21T11:23:12+03:00",
"currentDirectoryPath" : null,
"description" : "Convert Markdown formatting to Telegram format, excluding processing inside code blocks or quotes",
"filename" : "markdown-to-telegram.py",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🔄"
},
"identifier" : "14c19002feb2ab3f839073ec5eda7c30",
"isTemplate" : false,
"language" : "python",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Conversions",
"path" : "conversions\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Convert Markdown to Telegram Format",
"updatedAt" : "2024-05-21T11:23:12+03:00"
},
{
"authors" : [
{
"name" : "Ryan Nystrom",
"url" : "https:\/\/github.com\/rnystrom"
}
],
"createdAt" : "2021-11-03T16:00:51-04:00",
"currentDirectoryPath" : null,
"description" : "Create a markdown table template",
"filename" : "create-markdown-table.js",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🧱"
},
"identifier" : "94dda699695f45d3562beb2acc1bed61",
"isTemplate" : false,
"language" : "node",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Conversions",
"path" : "conversions\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Markdown Table",
"updatedAt" : "2021-11-03T20:04:02Z"
},
{
"authors" : [
{
"name" : "Michael Bianco",
"url" : "https:\/\/github.com\/iloveitaly"
}
],
"createdAt" : "2022-03-31T08:03:29-06:00",
"currentDirectoryPath" : null,
"description" : "A script to click the \"Paste and Match Style\" menu item, even if it's disabled",
"filename" : "paste-as-plain-text.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "📋"
},
"identifier" : "a9b5ccbfa4a899aa9435317bc6d839a2",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Conversions",
"path" : "conversions\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Paste and Match Style",
"updatedAt" : "2022-03-31T14:05:46Z"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-11-03T16:41:50-05:00",
"currentDirectoryPath" : null,
"description" : "Convert hexadecimal color value to RGB value.",
"filename" : "hex-to-rgb.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🎨"
},
"identifier" : "886795a04f438d025fc531c55c7e1156",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Conversions",
"path" : "conversions\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Hex to RGB",
"updatedAt" : "2020-11-28T13:47:03-05:00"
},
{
"authors" : [
{
"name" : "Francis Feng",
"url" : "https:\/\/github.com\/francisfeng"
}
],
"createdAt" : "2021-03-30T22:28:00+08:00",
"currentDirectoryPath" : null,
"description" : "Display Human-Readable Date from Unix Time in Clipboard",
"filename" : "unix-time-reader.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🕰"
},
"identifier" : "a95731d504f328ce3af77a4e5366bbc5",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : false,
"packageName" : "Conversions",
"path" : "conversions\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Unix Time Reader From Clipboard",
"updatedAt" : "2021-03-30T15:34:59Z"
},
{
"authors" : [
{
"name" : "Diego Lopes",
"url" : "https:\/\/github.com\/Dihgg"
}
],
"createdAt" : "2021-11-04T07:20:46-03:00",
"currentDirectoryPath" : "~",
"description" : "Decode QR Code from screenshot to clipboard using https:\/\/qrserver.com\/",
"filename" : "qr-code-screenshot-to-text.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/qrcode.icns"
},
"identifier" : "dd588b0008181dc53aab2019603ca17b",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : false,
"packageName" : "QR Code",
"path" : "conversions\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Screenshot QR Code to Clipboard",
"updatedAt" : "2021-11-04T07:20:46-03:00"
},
{
"authors" : [
{
"name" : "Alessandra Pereyra",
"url" : "https:\/\/github.com\/alessandrapereyra"
}
],
"createdAt" : "2022-09-08T18:50:04-05:00",
"currentDirectoryPath" : null,
"description" : "Automatically take the content found in the clipboard and turn it into Markdown",
"filename" : "clipboard-to-markdown.js",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "📋"
},
"identifier" : "f45f6235a350476d4f5f896a12250d19",
"isTemplate" : false,
"language" : "node",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Conversions",
"path" : "conversions\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Clipboard to Markdown",
"updatedAt" : "2022-09-08T18:50:04-05:00"
},
{
"authors" : [
{
"name" : "quelhasu",
"url" : "https:\/\/github.com\/quelhasu"
}
],
"createdAt" : "2021-02-07T12:24:35+01:00",
"currentDirectoryPath" : null,
"description" : "Convert color formats (e.g. #FFEEFF -> rgba(255,238,255,1)",
"filename" : "color-conversion.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🎨"
},
"identifier" : "deebbd6861359fe8e1fdccbae3349010",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : false,
"packageName" : "Conversions",
"path" : "conversions\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Color Conversion",
"updatedAt" : "2021-02-12T11:49:03+01:00"
},
{
"authors" : [
{
"name" : "Siyuan Zhang",
"url" : "https:\/\/github.com\/kastnerorz"
}
],
"createdAt" : "2020-11-23T14:59:40+08:00",
"currentDirectoryPath" : null,
"description" : "Convert human-readable date to timestamp epoch.",
"filename" : "human-date-to-epoch.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "⏱"
},
"identifier" : "5ae97124a80e01d18262b94a1900fe8d",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : false,
"packageName" : "Conversions",
"path" : "conversions\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Convert Human-Readable Date To Epoch",
"updatedAt" : "2020-11-23T12:53:48-05:00"
},
{
"authors" : [
{
"name" : "Adam Zethraeus",
"url" : "https:\/\/github.com\/adam-zethraeus"
}
],
"createdAt" : "2021-04-12T10:16:23-07:00",
"currentDirectoryPath" : null,
"description" : "Convert clipboard text to vaporwave",
"filename" : "vaporwave-text.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🌇"
},
"identifier" : "daa88b6d219c4f426109613d2ede7045",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Conversion",
"path" : "conversions\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Vaporwave Text",
"updatedAt" : "2021-04-12T10:16:23-07:00"
},
{
"authors" : [
{
"name" : "xxchan",
"url" : "https:\/\/github.com\/xxchan"
}
],
"createdAt" : "2023-01-31T01:00:23+01:00",
"currentDirectoryPath" : null,
"description" : "OCR Image from Clipboard",
"filename" : "clipboard-ocr.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "📋"
},
"identifier" : "1fa48d4acba0f0992f2e9b9bf586703d",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Clipboard",
"path" : "conversions\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "OCR Image",
"updatedAt" : "2023-01-31T01:00:23+01:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-06-04T04:22:35+02:00",
"currentDirectoryPath" : null,
"description" : "Converts given text (or clipboard if no argument) to t̶e̶x̶t̶",
"filename" : "strikethrough.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🔠"
},
"identifier" : "95383104fdc831db571001adb57dd33c",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Conversions",
"path" : "conversions\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Strikethrough Text",
"updatedAt" : "2021-06-04T04:22:35+02:00"
},
{
"authors" : [
{
"name" : "Siyuan Zhang",
"url" : "https:\/\/github.com\/kastnerorz"
}
],
"createdAt" : "2020-11-12T14:41:06+08:00",
"currentDirectoryPath" : null,
"description" : "Convert epoch to human-readable date.",
"filename" : "epoch-to-human-date.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "⏱"
},
"identifier" : "71ccf00855eb5a36a02b6d49c27295af",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : false,
"packageName" : "Conversions",
"path" : "conversions\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Convert Epoch to Human-Readable Date",
"updatedAt" : "2021-03-30T17:29:45+08:00"
},
{
"authors" : [
{
"name" : "Michael Bianco",
"url" : "https:\/\/github.com\/iloveitaly"
}
],
"createdAt" : "2023-07-03T15:03:20-06:00",
"currentDirectoryPath" : null,
"description" : "This script will convert raw HTML on your clipboard to rich text. It requires pandoc to be installed on your system.",
"filename" : "raw-html-to-rich-text-clipboard.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "📋"
},
"identifier" : "8acc19746e49d7fc76584c8ea631b545",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Conversions",
"path" : "conversions\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Convert Raw HTML to Rich Text on Clipboard",
"updatedAt" : "2023-07-03T21:06:13Z"
}
],
"subGroups" : [
{
"name" : "Change Case",
"path" : "change-case",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Robert Cooper",
"url" : "https:\/\/github.com\/robertcoopercode"
}
],
"createdAt" : "2021-03-24T04:47:26-04:00",
"currentDirectoryPath" : null,
"description" : "Change to clipboard text to title case",
"filename" : "titlecase.py",
"hasArguments" : false,
"icon" : {
"dark" : ".\/images\/titlecase-dark.png",
"light" : ".\/images\/titlecase-light.png"
},
"identifier" : "7af20974291066f818922fccdfa3b947",
"isTemplate" : false,
"language" : "python",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Change Case",
"path" : "conversions\/change-case\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Title Case",
"updatedAt" : "2022-02-22T15:13:31+01:00"
},
{
"authors" : [
{
"name" : "Robert Cooper",
"url" : "https:\/\/github.com\/robertcoopercode"
}
],
"createdAt" : "2021-03-24T04:47:26-04:00",
"currentDirectoryPath" : null,
"description" : "Change to clipboard text to kebab case",
"filename" : "kebabcase.py",
"hasArguments" : false,
"icon" : {
"dark" : ".\/images\/kebabcase-dark.png",
"light" : ".\/images\/kebabcase-light.png"
},
"identifier" : "8f212577632cfcea8380428c2e408398",
"isTemplate" : false,
"language" : "python",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Change Case",
"path" : "conversions\/change-case\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Kebab Case",
"updatedAt" : "2022-02-22T15:13:31+01:00"
},
{
"authors" : [
{
"name" : "Robert Cooper",
"url" : "https:\/\/github.com\/robertcoopercode"
}
],
"createdAt" : "2021-03-24T04:47:26-04:00",
"currentDirectoryPath" : null,
"description" : "Change to clipboard text to snake case",
"filename" : "snakecase.py",
"hasArguments" : false,
"icon" : {
"dark" : ".\/images\/snakecase-dark.png",
"light" : ".\/images\/snakecase-light.png"
},
"identifier" : "0a617d0433eda4b367c06d3f186671cd",
"isTemplate" : false,
"language" : "python",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Change Case",
"path" : "conversions\/change-case\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Snake Case",
"updatedAt" : "2022-02-22T15:13:31+01:00"
},
{
"authors" : [
{
"name" : "Robert Cooper",
"url" : "https:\/\/github.com\/robertcoopercode"
}
],
"createdAt" : "2021-03-24T04:47:26-04:00",
"currentDirectoryPath" : null,
"description" : "Change to clipboard text to uppercase",
"filename" : "uppercase.py",
"hasArguments" : false,
"icon" : {
"dark" : ".\/images\/uppercase-dark.png",
"light" : ".\/images\/uppercase-light.png"
},
"identifier" : "77cad94335378ab5ce8849a38c2b6681",
"isTemplate" : false,
"language" : "python",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Change Case",
"path" : "conversions\/change-case\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Uppercase",
"updatedAt" : "2022-02-22T15:13:31+01:00"
},
{
"authors" : [
{
"name" : "Robert Cooper",
"url" : "https:\/\/github.com\/robertcoopercode"
}
],
"createdAt" : "2021-03-24T04:47:26-04:00",
"currentDirectoryPath" : null,
"description" : "Change clipboard text to lowercase",
"filename" : "lowercase.py",
"hasArguments" : false,
"icon" : {
"dark" : ".\/images\/lowercase-dark.png",
"light" : ".\/images\/lowercase-light.png"
},
"identifier" : "02b1ea34a2e36143011c6d479fc346f9",
"isTemplate" : false,
"language" : "python",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Change Case",
"path" : "conversions\/change-case\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Lowercase",
"updatedAt" : "2022-02-22T15:13:31+01:00"
},
{
"authors" : [
{
"name" : "Robert Cooper",
"url" : "https:\/\/github.com\/robertcoopercode"
}
],
"createdAt" : "2021-03-24T04:47:26-04:00",
"currentDirectoryPath" : null,
"description" : "Change to clipboard text to camel case",
"filename" : "camelcase.py",
"hasArguments" : false,
"icon" : {
"dark" : ".\/images\/camelcase-dark.png",
"light" : ".\/images\/camelcase-light.png"
},
"identifier" : "31db55a1512dd366b1bca3193dda9432",
"isTemplate" : false,
"language" : "python",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Change Case",
"path" : "conversions\/change-case\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Camel Case",
"updatedAt" : "2022-02-22T15:13:31+01:00"
}
]
}
]
},
{
"name" : "Browsing",
"path" : "browsing",
"scriptCommands" : [
{
"authors" : [
{
"name" : "JD Solanki",
"url" : "https:\/\/github.com\/jd-solanki"
}
],
"createdAt" : "2021-09-24T08:28:06+01:00",
"currentDirectoryPath" : null,
"description" : "Open current website in guest profile\/mode",
"filename" : "open-in-guest-profile.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🤖"
},
"identifier" : "7e65f41bd6407a5464ce4b1289b0abad",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Browser",
"path" : "browsing\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open in guest profile",
"updatedAt" : "2022-10-31T11:55:21Z"
},
{
"authors" : [
{
"name" : "Nitin Gupta",
"url" : "https:\/\/twitter.com\/gniting"
}
],
"createdAt" : "2021-02-09T23:41:04+01:00",
"currentDirectoryPath" : null,
"description" : "Transform the clipboard contents to a short Bitly URL",
"filename" : "shorten-url-bitly.template.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🔗"
},
"identifier" : "fd3ff912fc4db2d3916bdba60c436507",
"isTemplate" : true,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Browsing",
"path" : "browsing\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Shorten URL with Bitly",
"updatedAt" : "2021-02-12T11:49:03+01:00"
},
{
"authors" : [
{
"name" : "Eliot Hertenstein",
"url" : "https:\/\/github.com\/eIiot"
}
],
"createdAt" : "2022-02-06T18:08:25-08:00",
"currentDirectoryPath" : null,
"description" : "Create a short URL using Shlink",
"filename" : "shlink-create-short-url.template.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : ".\/images\/shlink.png"
},
"identifier" : "19917e997ea6a87adb283ca739ec7f4f",
"isTemplate" : true,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Shlink",
"path" : "browsing\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Create Short URL",
"updatedAt" : "2022-02-20T23:31:37-08:00"
},
{
"authors" : [
{
"name" : "Thomas Paul Mann",
"url" : "https:\/\/github.com\/thomaspaulmann"
}
],
"createdAt" : "2020-11-09T17:16:09Z",
"currentDirectoryPath" : null,
"description" : "Shorten the URL in your Clipboard with Tiny URL.",
"filename" : "shorten-url.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🔗"
},
"identifier" : "87e7fd07ae15344a2c3bbdfa528403ab",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Browsing",
"path" : "browsing\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Shorten URL From Clipboard",
"updatedAt" : "2021-04-26T15:00:19-04:00"
},
{
"authors" : [
{
"name" : "Ronan Rodrigo Nunes",
"url" : "https:\/\/ronanrodrigo.dev"
}
],
"createdAt" : "2021-01-20T16:50:26-03:00",
"currentDirectoryPath" : null,
"description" : "Open the website at Outline",
"filename" : "go-to-outine.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/outline.png"
},
"identifier" : "44f41225998f8653fba00b8af3aaf546",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Browsing",
"path" : "browsing\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Go to Outline",
"updatedAt" : "2021-02-19T19:09:37-03:00"
},
{
"authors" : [
{
"name" : "Yasutaka Nishii",
"url" : "https:\/\/github.com\/ystknsh"
}
],
"createdAt" : "2024-08-29T16:26:42+09:00",
"currentDirectoryPath" : null,
"description" : "Open multiple websites on Safari using list of URLs",
"filename" : "open-multiple-websites-on-safari.template.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "📚"
},
"identifier" : "be278c484ca03c82e901a345ff6e6b72",
"isTemplate" : true,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Browsing",
"path" : "browsing\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open Multiple Websites on Safari",
"updatedAt" : "2024-09-03T11:24:41Z"
},
{
"authors" : [
{
"name" : "raulanatol",
"url" : "https:\/\/github.com\/raulanatol"
}
],
"createdAt" : "2021-09-24T08:28:06+01:00",
"currentDirectoryPath" : null,
"description" : "Open the current site in a private browser",
"filename" : "to-private-browsing.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🥽"
},
"identifier" : "9f2e428dc1c53dc016ace6bb81f7e155",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Browser",
"path" : "browsing\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Current Website to Private Browser",
"updatedAt" : "2021-09-24T08:28:06+01:00"
},
{
"authors" : [
{
"name" : "Kirill Gorbachyonok",
"url" : "https:\/\/github.com\/japanese-goblinn"
}
],
"createdAt" : "2020-11-08T20:30:05+03:00",
"currentDirectoryPath" : null,
"description" : "This script copies to clipboard all URLs from frontmost Safari window.",
"filename" : "safari-current-window-urls.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🧭"
},
"identifier" : "1545cff8326c80f5bdd5cc367117ce83",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Safari",
"path" : "browsing\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Copy Current Window URLs",
"updatedAt" : "2020-11-23T12:53:48-05:00"
},
{
"authors" : [
{
"name" : "Astrit",
"url" : "https:\/\/github.com\/astrit"
}
],
"createdAt" : "2021-11-16T15:01:51+01:00",
"currentDirectoryPath" : null,
"description" : "Shorten any github.com URL",
"filename" : "git-io.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/git-io.png"
},
"identifier" : "2ca33ad632de2d16f4bbbaa3806b3843",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Browsing",
"path" : "browsing\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Shorten URL from GitHub",
"updatedAt" : "2021-11-16T15:01:51+01:00"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-11-16T16:13:19-05:00",
"currentDirectoryPath" : "~\/Desktop",
"description" : "Takes screenshots of the entered URL using [`pageres`](https:\/\/github.com\/sindresorhus\/pageres) and saves it to the Desktop.",
"filename" : "website-screenshots.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🖼️"
},
"identifier" : "7e10196776662f35cbc776aaf41f1fe6",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Internet",
"path" : "browsing\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Screenshot Website",
"updatedAt" : "2020-11-28T13:47:03-05:00"
},
{
"authors" : [
{
"name" : "Levi Nelson",
"url" : "https:\/\/github.com\/LeviticusNelson"
}
],
"createdAt" : "2022-09-20T11:37:44-07:00",
"currentDirectoryPath" : null,
"description" : "Open new window in default browser",
"filename" : "new-browser-window.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🌐"
},
"identifier" : "982df81504688c40ed7c99f11913cdd2",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Browser Utils",
"path" : "browsing\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "New Browser Window",
"updatedAt" : "2022-09-20T11:37:44-07:00"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2021-02-03T02:51:13-05:00",
"currentDirectoryPath" : null,
"description" : "Use [Peekalink.io](https:\/\/peekalink.io) API to peek specified URL.",
"filename" : "peekalink.template.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/peekalink-logo.png"
},
"identifier" : "372c4a1272d6d88cd4df5e3b94ec8835",
"isTemplate" : true,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Internet",
"path" : "browsing\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Peek a link",
"updatedAt" : "2021-02-04T15:17:52-05:00"
},
{
"authors" : [
{
"name" : "Samuel Henry",
"url" : "https:\/\/bne.sh"
}
],
"createdAt" : "2022-06-20T10:20:50+10:00",
"currentDirectoryPath" : null,
"description" : "Transform the clipboard contents to a short Emoji URL",
"filename" : "short-url-emoji.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🔗"
},
"identifier" : "e811b99614fa16b00c890cede57aee7b",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Browsing",
"path" : "browsing\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Shorten URL with Emojis",
"updatedAt" : "2022-06-20T10:20:50+10:00"
},
{
"authors" : [
{
"name" : "Kailash Yellareddy",
"url" : "https:\/\/github.com\/kyellareddy"
}
],
"createdAt" : "2023-07-25T21:56:55+05:30",
"currentDirectoryPath" : null,
"description" : "Opens current Youtube Shorts video in the normal video player by replacing \"\/shorts\/\" with \"\/v\/\" in the url.",
"filename" : "Youtube Shorts in video player.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "📹"
},
"identifier" : "9bdd39853c92b430aa2dcff8f1dfb7ec",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Youtube Shorts In Video Player",
"path" : "browsing\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Youtube Shorts in video player",
"updatedAt" : "2023-07-25T16:29:37Z"
},
{
"authors" : [
{
"name" : "Tahsin Yazkan",
"url" : "https:\/\/github.com\/thsnyzkn"
}
],
"createdAt" : "2023-01-31T03:02:13+03:00",
"currentDirectoryPath" : null,
"description" : "Open chrome with web security option disabled.",
"filename" : "open-chrome-without-cors.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/chrome-icon.png"
},
"identifier" : "a6e07f1845ea9de231cf3c943d0aa522",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : false,
"packageName" : "Chrome",
"path" : "browsing\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open without CORS",
"updatedAt" : "2023-01-31T03:02:13+03:00"
},
{
"authors" : [
{
"name" : "Kirill Gorbachyonok",
"url" : "https:\/\/github.com\/japanese-goblinn"
}
],
"createdAt" : "2020-11-08T19:55:59+03:00",
"currentDirectoryPath" : null,
"description" : "This script copies URL of currently opened page in Safari into clipboard.",
"filename" : "safari-current-page-url.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🧭"
},
"identifier" : "d76d017a3bf2c77354523fabb01612a7",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Safari",
"path" : "browsing\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Copy Current Page URL",
"updatedAt" : "2022-02-22T10:00:48Z"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-05-10T00:36:12+02:00",
"currentDirectoryPath" : null,
"description" : "This script copies URL of currently opened page in Google Chrome into clipboard.",
"filename" : "chrome-current-page-url.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🧭"
},
"identifier" : "5a79e63e15b0bf391bab19555eca98b1",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Google Chrome",
"path" : "browsing\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Copy Current Page URL",
"updatedAt" : "2021-05-10T00:36:12+02:00"
},
{
"authors" : [
{
"name" : "cSharp",
"url" : "https:\/\/github.com\/noidwasavailable"
}
],
"createdAt" : "2023-08-10T17:56:44+09:00",
"currentDirectoryPath" : null,
"description" : "Convert Twitter link to Nitter",
"filename" : "convert-twitter-to-nitter.js",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🐔"
},
"identifier" : "42048eefcf9facbebf2aeef19f24c2e8",
"isTemplate" : false,
"language" : "node",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Convert Twitter To Nitter",
"path" : "browsing\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Convert Twitter to Nitter",
"updatedAt" : "2023-08-10T17:56:44+09:00"
}
]
},
{
"name" : "Navigation",
"path" : "navigation",
"scriptCommands" : [
{
"authors" : null,
"createdAt" : "2020-09-30T12:56:01+01:00",
"currentDirectoryPath" : null,
"description" : "Opens the Library folder in the Finder.",
"filename" : "open-library.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/folder-library.png"
},
"identifier" : "1bfe51640c6221e5092a323968d9bceb",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Navigation",
"path" : "navigation\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open Library",
"updatedAt" : "2021-04-27T16:34:55-04:00"
},
{
"authors" : [
{
"name" : "Kirill Gorbachyonok",
"url" : "https:\/\/github.com\/japanese-goblinn"
}
],
"createdAt" : "2020-11-08T21:39:17+03:00",
"currentDirectoryPath" : null,
"description" : "Open current Finder directory in Terminal",
"filename" : "open-terminal-from-finder.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "📟"
},
"identifier" : "5724c9575b60d431ce2d42d5aacf05cd",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Navigation",
"path" : "navigation\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open Current Finder Directory in Terminal",
"updatedAt" : "2021-05-12T11:28:01+05:30"
},
{
"authors" : [
{
"name" : "Kirill Gorbachyonok",
"url" : "https:\/\/github.com\/japanese-goblinn"
}
],
"createdAt" : "2020-11-08T21:39:17+03:00",
"currentDirectoryPath" : null,
"description" : "Open current Terminal directory in Finder",
"filename" : "open-finder-from-terminal.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "📟"
},
"identifier" : "5569104fd9c90af5275b1bfc6e66a247",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Navigation",
"path" : "navigation\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open Current Terminal Directory in Finder",
"updatedAt" : "2021-07-23T17:32:20-04:00"
},
{
"authors" : [
{
"name" : "Afraz",
"url" : "https:\/\/github.com\/afrazkhan"
}
],
"createdAt" : "2021-05-27T11:24:45+02:00",
"currentDirectoryPath" : null,
"description" : "Open Finder at Home folder or argument location",
"filename" : "open-finder.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🔍"
},
"identifier" : "d854a7e995306fbe1435037c533a7f63",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Navigation",
"path" : "navigation\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open Finder",
"updatedAt" : "2021-05-31T10:08:39Z"
},
{
"authors" : [
{
"name" : "Jax0rz",
"url" : null
}
],
"createdAt" : "2021-01-02T14:35:53+08:00",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "search-in-devdocs.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/devdocs.png"
},
"identifier" : "6da9c8ea33864399cb6b6397ba3e518d",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Navigation",
"path" : "navigation\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search in Devdocs",
"updatedAt" : "2021-01-05T12:30:16Z"
},
{
"authors" : null,
"createdAt" : "2020-09-30T12:56:01+01:00",
"currentDirectoryPath" : null,
"description" : "Opens the Applications folder in the Finder.",
"filename" : "open-applications.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "📂"
},
"identifier" : "09589adf8daac0d61f08a7ab9b988504",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Navigation",
"path" : "navigation\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open Applications",
"updatedAt" : "2020-12-08T15:56:35Z"
},
{
"authors" : null,
"createdAt" : "2020-10-21T20:39:40+01:00",
"currentDirectoryPath" : null,
"description" : "Opens the URL in the clipboard.",
"filename" : "open-url-from-clipboard.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🌐"
},
"identifier" : "4af1087d8e456a23c50ebb8a66e44618",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Navigation",
"path" : "navigation\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open URL From Clipboard",
"updatedAt" : "2020-12-08T15:56:35Z"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-06-23T14:44:22+02:00",
"currentDirectoryPath" : null,
"description" : "Quit the application. Edit the command to change the default values (Application: \"\", Force quit?: \"No\").",
"filename" : "quit-application.applescript",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/quit.png"
},
"identifier" : "6cadd1b2f46cf256ef300204493c98be",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Navigation",
"path" : "navigation\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Quit Application",
"updatedAt" : "2021-06-23T14:44:22+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-06-23T14:44:22+02:00",
"currentDirectoryPath" : null,
"description" : "Restart the application. Edit the command to change the default values (Application: \"\", Force restart?: \"No\").",
"filename" : "restart-application.applescript",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/restart.png"
},
"identifier" : "1fd3b81609ac36ee68e94ef9d596c992",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Navigation",
"path" : "navigation\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Restart Application",
"updatedAt" : "2021-06-23T14:44:22+02:00"
},
{
"authors" : [
{
"name" : "Jax0rz",
"url" : null
}
],
"createdAt" : "2021-01-02T22:32:06+08:00",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "justfocus.applescript",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/justfocus.png"
},
"identifier" : "dbac73d9ab9489dddbd4d469fe7d78d5",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Navigation",
"path" : "navigation\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "JustFocus",
"updatedAt" : "2021-01-02T22:32:06+08:00"
},
{
"authors" : [
{
"name" : "Bryce Carr",
"url" : "https:\/\/github.com\/bdcarr"
}
],
"createdAt" : "2021-01-16T15:18:30+11:00",
"currentDirectoryPath" : null,
"description" : "Creates a new document in Pixelmator Pro from the image stored in your clipboard.",
"filename" : "open-clipboard-in-pixelmator-pro.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : ".\/images\/pixelmator-pro-2.0.png"
},
"identifier" : "3882ed8e4e4ae9a271faf3e1217aa420",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Pixelmator Pro",
"path" : "navigation\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open Image From Clipboard",
"updatedAt" : "2021-01-16T15:18:30+11:00"
},
{
"authors" : [
{
"name" : "Jax0rz",
"url" : null
}
],
"createdAt" : "2020-12-27T11:33:45+08:00",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "search-in-dash.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/dash.png"
},
"identifier" : "dab344a07ad07deff043fe6b175f5bba",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Navigation",
"path" : "navigation\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search in Dash",
"updatedAt" : "2021-01-05T12:30:16Z"
},
{
"authors" : [
{
"name" : "Kirill Gorbachyonok",
"url" : "https:\/\/github.com\/japanese-goblinn"
}
],
"createdAt" : "2020-11-21T21:18:47+03:00",
"currentDirectoryPath" : null,
"description" : "Open current Finder directory in iTerm",
"filename" : "open-iterm-from-finder.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/iterm-logo.png"
},
"identifier" : "9372e8eeb30e3ac54983a368557e28ae",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Navigation",
"path" : "navigation\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open Current Finder Directory in iTerm",
"updatedAt" : "2020-11-23T12:53:48-05:00"
},
{
"authors" : null,
"createdAt" : "2020-09-30T12:56:01+01:00",
"currentDirectoryPath" : null,
"description" : "Opens the Desktop folder in the Finder.",
"filename" : "open-desktop.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/folder-desktop.png"
},
"identifier" : "1df1267f357b2170a39ace35a5c54d93",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Navigation",
"path" : "navigation\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open Desktop",
"updatedAt" : "2021-04-27T16:34:55-04:00"
},
{
"authors" : null,
"createdAt" : "2020-09-30T12:56:01+01:00",
"currentDirectoryPath" : null,
"description" : "Opens the last file that was downloaded",
"filename" : "open-last-downloaded.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/folder-downloads.png"
},
"identifier" : "3ad14a4406ddef3807e797a606132af0",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Navigation",
"path" : "navigation\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open Last Downloaded",
"updatedAt" : "2022-03-30T20:25:55Z"
},
{
"authors" : null,
"createdAt" : "2020-09-30T12:56:01+01:00",
"currentDirectoryPath" : null,
"description" : "Opens the Documents folder in the Finder.",
"filename" : "open-documents.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/folder-documents.png"
},
"identifier" : "02d590df526d1ec16128e7d2d4aed59d",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Navigation",
"path" : "navigation\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open Documents",
"updatedAt" : "2021-04-27T16:34:55-04:00"
},
{
"authors" : [
{
"name" : "Kirill Gorbachyonok",
"url" : "https:\/\/github.com\/japanese-goblinn"
}
],
"createdAt" : "2020-11-21T21:18:47+03:00",
"currentDirectoryPath" : null,
"description" : "Open current iTerm directory in Finder",
"filename" : "open-finder-from-iterm.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/iterm-logo.png"
},
"identifier" : "75c0bc225c4f59daad97f45bf71529b3",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Navigation",
"path" : "navigation\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open Current iTerm Directory in Finder",
"updatedAt" : "2020-11-23T12:53:48-05:00"
},
{
"authors" : null,
"createdAt" : "2020-10-22T14:44:20+03:00",
"currentDirectoryPath" : null,
"description" : "Opens the URL from the clipboard in the desktop app.",
"filename" : "open-desktop-url-from-clipboard.swift",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🖥"
},
"identifier" : "3b6e1fc94fc9416b9373ee2af2703af2",
"isTemplate" : false,
"language" : "swift",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Navigation",
"path" : "navigation\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open Clipboard URL on Desktop",
"updatedAt" : "2020-12-08T15:56:35Z"
},
{
"authors" : null,
"createdAt" : "2020-09-30T12:56:01+01:00",
"currentDirectoryPath" : null,
"description" : "Opens the Home folder in the Finder.",
"filename" : "open-home.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/folder-home.png"
},
"identifier" : "5b107b5c47c444820e449275b4e46735",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Navigation",
"path" : "navigation\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open Home",
"updatedAt" : "2021-04-27T16:34:55-04:00"
},
{
"authors" : null,
"createdAt" : "2020-09-30T12:56:01+01:00",
"currentDirectoryPath" : null,
"description" : "Opens the Downloads folder in the Finder.",
"filename" : "open-downloads.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/folder-downloads.png"
},
"identifier" : "699e4a1746f3c3144f2a3f8ffb43d9c8",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Navigation",
"path" : "navigation\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open Downloads",
"updatedAt" : "2021-04-28T11:35:25-04:00"
},
{
"authors" : [
{
"name" : "Chris Bailey",
"url" : "https:\/\/raycast.com\/that70schris"
}
],
"createdAt" : "2024-08-13T00:40:38-04:00",
"currentDirectoryPath" : null,
"description" : "Easily hide your foremost application",
"filename" : "hide-application.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🫥"
},
"identifier" : "47f61692f25fabb33a1748ded306439c",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Navigation",
"path" : "navigation\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Hide Current Application",
"updatedAt" : "2024-08-13T00:40:38-04:00"
}
]
},
{
"name" : "Remote Control",
"path" : "remote-control",
"scriptCommands" : [
],
"subGroups" : [
{
"name" : "Denon AVR",
"path" : "denon-avr",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Rediwed",
"url" : "github.com\/Rediwed"
}
],
"createdAt" : "2022-02-09T11:13:32+01:00",
"currentDirectoryPath" : null,
"description" : "Powers off a modern Denon AVR if it is currently powered on",
"filename" : "power-off.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/denon_logo.png"
},
"identifier" : "fab79cda1a0e2629cbda49e0f90547c4",
"isTemplate" : false,
"language" : "applescript",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Denon AVR",
"path" : "remote-control\/denon-avr\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Power Off",
"updatedAt" : "2022-02-09T10:16:51Z"
},
{
"authors" : [
{
"name" : "Rediwed",
"url" : "github.com\/Rediwed"
}
],
"createdAt" : "2022-02-09T11:13:32+01:00",
"currentDirectoryPath" : null,
"description" : "Helperscript to configure Denon AVR Script Commands",
"filename" : "configure.applescript",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/denon_logo.png"
},
"identifier" : "81f31547ecb4c9fa94c1f3ff80a16dae",
"isTemplate" : false,
"language" : "applescript",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Denon AVR",
"path" : "remote-control\/denon-avr\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Configure",
"updatedAt" : "2022-02-09T10:16:51Z"
},
{
"authors" : [
{
"name" : "Rediwed",
"url" : "github.com\/Rediwed"
}
],
"createdAt" : "2022-02-09T11:13:32+01:00",
"currentDirectoryPath" : null,
"description" : "Increases the volume of your Denon AVR by one unit",
"filename" : "volume-up.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/denon_logo.png"
},
"identifier" : "5faba9ab561f16071df3aae37783ec75",
"isTemplate" : false,
"language" : "applescript",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Denon AVR",
"path" : "remote-control\/denon-avr\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Volume Up",
"updatedAt" : "2022-02-09T10:16:51Z"
},
{
"authors" : [
{
"name" : "Rediwed",
"url" : "github.com\/Rediwed"
}
],
"createdAt" : "2022-02-09T11:13:32+01:00",
"currentDirectoryPath" : null,
"description" : "Decreases the volume of your Denon AVR by one unit",
"filename" : "volume-down.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/denon_logo.png"
},
"identifier" : "9d67ff8a8aa5d86f53abf5a999eecd4d",
"isTemplate" : false,
"language" : "applescript",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Denon AVR",
"path" : "remote-control\/denon-avr\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Volume Down",
"updatedAt" : "2022-02-09T10:16:51Z"
},
{
"authors" : [
{
"name" : "Rediwed",
"url" : "github.com\/Rediwed"
}
],
"createdAt" : "2022-02-09T11:13:32+01:00",
"currentDirectoryPath" : null,
"description" : "Powers on a modern Denon AVR if it is currently powered off",
"filename" : "power-on.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/denon_logo.png"
},
"identifier" : "61d307f4135abdf1944ff25f7ab77c84",
"isTemplate" : false,
"language" : "applescript",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Denon AVR",
"path" : "remote-control\/denon-avr\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Power On",
"updatedAt" : "2022-02-09T10:16:51Z"
}
]
},
{
"name" : "Ddc",
"path" : "ddc",
"scriptCommands" : [
],
"subGroups" : [
{
"name" : "X86",
"path" : "x86",
"scriptCommands" : [
{
"authors" : [
{
"name" : "goodhyun",
"url" : null
}
],
"createdAt" : "2022-02-24T17:18:38+09:00",
"currentDirectoryPath" : null,
"description" : "This script will switch the external display screen to DP.",
"filename" : "screen-dp.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "📺"
},
"identifier" : "604dc19d758c3ba4240bd41436ecfc69",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "External Display",
"path" : "remote-control\/ddc\/x86\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Switch to DP",
"updatedAt" : "2022-02-24T08:21:35Z"
},
{
"authors" : [
{
"name" : "goodhyun",
"url" : null
}
],
"createdAt" : "2022-02-24T17:18:38+09:00",
"currentDirectoryPath" : null,
"description" : "This script will switch the external display screen to HDMI.",
"filename" : "screen-hdmi.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "📺"
},
"identifier" : "5c5b8dce88c2fb37b74dfd96eacdfcb6",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "External Display",
"path" : "remote-control\/ddc\/x86\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Switch to HDMI",
"updatedAt" : "2022-02-24T08:21:35Z"
}
]
},
{
"name" : "Arm64",
"path" : "arm64",
"scriptCommands" : [
{
"authors" : [
{
"name" : "goodhyun",
"url" : null
}
],
"createdAt" : "2022-02-24T17:18:38+09:00",
"currentDirectoryPath" : null,
"description" : "This script will switch the external display screen to DP.",
"filename" : "screen-dp.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "📺"
},
"identifier" : "604dc19d758c3ba4240bd41436ecfc69",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "External Display",
"path" : "remote-control\/ddc\/arm64\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Switch to DP",
"updatedAt" : "2022-02-24T08:21:35Z"
},
{
"authors" : [
{
"name" : "goodhyun",
"url" : null
}
],
"createdAt" : "2022-02-24T17:18:38+09:00",
"currentDirectoryPath" : null,
"description" : "This script will switch the external display screen to HDMI.",
"filename" : "screen-hdmi.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "📺"
},
"identifier" : "5c5b8dce88c2fb37b74dfd96eacdfcb6",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "External Display",
"path" : "remote-control\/ddc\/arm64\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Switch to HDMI",
"updatedAt" : "2022-02-24T08:21:35Z"
}
]
}
]
},
{
"name" : "Samsung TV",
"path" : "samsung-tv",
"readme" : "remote-control\/samsung-tv\/README.md",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Darryl Brooks",
"url" : "https:\/\/github.com\/DarrylBrooks97"
}
],
"createdAt" : "2021-08-20T17:37:33-05:00",
"currentDirectoryPath" : null,
"description" : "Turns off a Samsung TV.",
"filename" : "turn-off.template.py",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/logo.png"
},
"identifier" : "3d94ec3aa6c87dc268d5331e3dcd5f6b",
"isTemplate" : true,
"language" : "python",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Samsung TV",
"path" : "remote-control\/samsung-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Turn Off TV",
"updatedAt" : "2021-08-23T10:12:10Z"
},
{
"authors" : [
{
"name" : "Darryl Brooks",
"url" : "https:\/\/github.com\/DarrylBrooks97"
}
],
"createdAt" : "2021-08-20T17:37:33-05:00",
"currentDirectoryPath" : null,
"description" : "Turns on a Samsung TV.",
"filename" : "turn-on.template.py",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/logo.png"
},
"identifier" : "8502bb2e79d9a698a2c729d0f9b18925",
"isTemplate" : true,
"language" : "python",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Samsung TV",
"path" : "remote-control\/samsung-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Turn On TV",
"updatedAt" : "2021-08-23T10:12:10Z"
}
]
},
{
"name" : "LG TV",
"path" : "lg-tv",
"readme" : "remote-control\/lg-tv\/README.md",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-07-09T02:52:48+02:00",
"currentDirectoryPath" : null,
"description" : "Close the application by its ID.",
"filename" : "close-app.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/lg.png"
},
"identifier" : "139825c01bb2a7ea16cbbe87c4b0eea7",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "LG TV",
"path" : "remote-control\/lg-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Close App",
"updatedAt" : "2021-07-09T02:52:48+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-07-09T02:52:48+02:00",
"currentDirectoryPath" : null,
"description" : "Open the application with the given payload.",
"filename" : "open-app-with-payload.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/lg.png"
},
"identifier" : "e78c3c2e7bc669488295056a0bb5b127",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "LG TV",
"path" : "remote-control\/lg-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open App With Payload",
"updatedAt" : "2021-07-09T02:52:48+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-07-09T02:52:48+02:00",
"currentDirectoryPath" : null,
"description" : "Show the configuration of the library.",
"filename" : "show-config.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/lg.png"
},
"identifier" : "44ab198b6bcf302c779a63b734ce1c82",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "LG TV",
"path" : "remote-control\/lg-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Show Config",
"updatedAt" : "2021-07-09T02:52:48+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-07-09T02:52:48+02:00",
"currentDirectoryPath" : null,
"description" : "Show the list of launch points.",
"filename" : "list-launch-points.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/lg.png"
},
"identifier" : "04bab301934dac7d4a84a6e4590cff97",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "LG TV",
"path" : "remote-control\/lg-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "List Launch Points",
"updatedAt" : "2021-07-09T02:52:48+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-07-09T02:52:48+02:00",
"currentDirectoryPath" : null,
"description" : "Turn off the 3D mode.",
"filename" : "turn-off-3d.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/lg.png"
},
"identifier" : "27a3333d3f495bf482a7afc5768dc86b",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "LG TV",
"path" : "remote-control\/lg-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Turn Off 3D",
"updatedAt" : "2021-07-09T02:52:48+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-07-09T02:52:48+02:00",
"currentDirectoryPath" : null,
"description" : "Show the audio status.",
"filename" : "show-audio-status.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/lg.png"
},
"identifier" : "69a89ed81cd740a4ae70b2e41b401f5d",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "LG TV",
"path" : "remote-control\/lg-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Show Audio Status",
"updatedAt" : "2021-07-09T02:52:48+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-07-09T02:52:48+02:00",
"currentDirectoryPath" : null,
"description" : "Show information about the TV.",
"filename" : "show-tv-info.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/lg.png"
},
"identifier" : "4ffdde8a9a73be8bdae9e0003e41cd66",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "LG TV",
"path" : "remote-control\/lg-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Show TV Info",
"updatedAt" : "2021-07-09T02:52:48+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-07-09T02:52:48+02:00",
"currentDirectoryPath" : null,
"description" : "Show the list of services.",
"filename" : "list-services.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/lg.png"
},
"identifier" : "95174c27967fd70d9c92485f72119313",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "LG TV",
"path" : "remote-control\/lg-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "List Services",
"updatedAt" : "2021-07-09T02:52:48+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-07-09T02:52:48+02:00",
"currentDirectoryPath" : null,
"description" : "Scan to find the TV. The TV has to be turned on.",
"filename" : "scan.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/lg.png"
},
"identifier" : "43253c0894482fb74159234c227953b7",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "LG TV",
"path" : "remote-control\/lg-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Scan",
"updatedAt" : "2021-07-09T02:52:48+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-07-09T02:52:48+02:00",
"currentDirectoryPath" : null,
"description" : "Show picture settings.",
"filename" : "show-picture-settings.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/lg.png"
},
"identifier" : "4ee1796b14d5028927be17ee44ebf54f",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "LG TV",
"path" : "remote-control\/lg-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Show Picture Settings",
"updatedAt" : "2021-07-09T02:52:48+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-07-09T02:52:48+02:00",
"currentDirectoryPath" : null,
"description" : "Show information about the software.",
"filename" : "show-software-info.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/lg.png"
},
"identifier" : "d5f1dbf7b9ddfbf76eae82107e37f267",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "LG TV",
"path" : "remote-control\/lg-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Show Software Info",
"updatedAt" : "2021-07-09T02:52:48+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-07-09T02:52:48+02:00",
"currentDirectoryPath" : null,
"description" : "Show information about the TV channel.",
"filename" : "show-channel.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/lg.png"
},
"identifier" : "5fb2727e83fcd23d8c545102ca088d3d",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "LG TV",
"path" : "remote-control\/lg-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Show Channel",
"updatedAt" : "2021-07-09T02:52:48+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-07-09T02:52:48+02:00",
"currentDirectoryPath" : null,
"description" : "Show the list of applications.",
"filename" : "list-apps.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/lg.png"
},
"identifier" : "5e28000d1949bec829e3e2861b52e785",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "LG TV",
"path" : "remote-control\/lg-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "List Apps",
"updatedAt" : "2021-07-09T02:52:48+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-07-09T02:52:48+02:00",
"currentDirectoryPath" : null,
"description" : "Authenticate the library. The TV has to be turned on. You have to provide the IP address of the TV and accept the connection on the TV.",
"filename" : "authenticate.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/lg.png"
},
"identifier" : "74a50a0b785132731aaa13d435ef4a2e",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "LG TV",
"path" : "remote-control\/lg-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Authenticate",
"updatedAt" : "2021-07-09T02:52:48+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-07-09T02:52:48+02:00",
"currentDirectoryPath" : null,
"description" : "Open the application by its ID.",
"filename" : "open-app.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/lg.png"
},
"identifier" : "e467133629c17d2130d0b6a5f58b746e",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "LG TV",
"path" : "remote-control\/lg-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open App",
"updatedAt" : "2021-07-09T02:52:48+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-07-09T02:52:48+02:00",
"currentDirectoryPath" : null,
"description" : "Open Youtube with the given video ID.",
"filename" : "open-youtube-id.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/lg.png"
},
"identifier" : "edc01fb091bfd6952cba207273392b6e",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "LG TV",
"path" : "remote-control\/lg-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open Youtube (ID)",
"updatedAt" : "2021-07-09T02:52:48+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-07-09T02:52:48+02:00",
"currentDirectoryPath" : null,
"description" : "Stop the media.",
"filename" : "stop-media.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/lg.png"
},
"identifier" : "2f44779614466f754e39de741154ee19",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "LG TV",
"path" : "remote-control\/lg-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Stop Media",
"updatedAt" : "2021-07-09T02:52:48+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-07-09T02:52:48+02:00",
"currentDirectoryPath" : null,
"description" : "Unmute the TV.",
"filename" : "unmute.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/lg.png"
},
"identifier" : "f3bc72e257bea3f096e7bd3b66cec79f",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "LG TV",
"path" : "remote-control\/lg-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Unmute",
"updatedAt" : "2021-07-09T02:52:48+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-07-09T02:52:48+02:00",
"currentDirectoryPath" : null,
"description" : "Send the notification and show it on the TV.",
"filename" : "send-notification.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/lg.png"
},
"identifier" : "b6323b459cfde9bd61c4e539899af6fa",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "LG TV",
"path" : "remote-control\/lg-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Send Notification",
"updatedAt" : "2021-07-09T02:52:48+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-07-09T02:52:48+02:00",
"currentDirectoryPath" : null,
"description" : "Show the sound output.",
"filename" : "show-sound-output.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/lg.png"
},
"identifier" : "eee4d1c090fb5d4509ae13868eca9a7f",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "LG TV",
"path" : "remote-control\/lg-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Show Sound Output",
"updatedAt" : "2021-07-09T02:52:48+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-07-09T02:52:48+02:00",
"currentDirectoryPath" : null,
"description" : "Show the audio volume.",
"filename" : "show-audio-volume.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/lg.png"
},
"identifier" : "b4fabfe5562df1ed618507177cd471aa",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "LG TV",
"path" : "remote-control\/lg-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Show Audio Volume",
"updatedAt" : "2021-07-09T02:52:48+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-07-09T02:52:48+02:00",
"currentDirectoryPath" : null,
"description" : "Execute the given command on TV.",
"filename" : "execute-command.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/lg.png"
},
"identifier" : "7fdbf16ac52e3e0b8da4ae75119c559c",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "LG TV",
"path" : "remote-control\/lg-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Execute Command",
"updatedAt" : "2021-07-09T02:52:48+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-07-09T02:52:48+02:00",
"currentDirectoryPath" : null,
"description" : "Show information about the foreground application.",
"filename" : "show-fg-app-info.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/lg.png"
},
"identifier" : "534cb7263206875df399ff73306cf4e0",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "LG TV",
"path" : "remote-control\/lg-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Show Foreground App Info",
"updatedAt" : "2021-07-09T02:52:48+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-07-09T02:52:48+02:00",
"currentDirectoryPath" : null,
"description" : "Turn on the screen.",
"filename" : "turn-on-screen.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/lg.png"
},
"identifier" : "9f958723e90790b78f41511ee47b5aa8",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "LG TV",
"path" : "remote-control\/lg-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Turn On Screen",
"updatedAt" : "2021-07-09T02:52:48+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-07-09T02:52:48+02:00",
"currentDirectoryPath" : null,
"description" : "Show the power state.",
"filename" : "show-power-state.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/lg.png"
},
"identifier" : "eddaa29eb8119bb1187111060f9d5261",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "LG TV",
"path" : "remote-control\/lg-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Show Power State",
"updatedAt" : "2021-07-09T02:52:48+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-07-09T02:52:48+02:00",
"currentDirectoryPath" : null,
"description" : "Play the media.",
"filename" : "play-media.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/lg.png"
},
"identifier" : "046b37f6df217de570cd661202f147d5",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "LG TV",
"path" : "remote-control\/lg-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Play Media",
"updatedAt" : "2021-07-09T02:52:48+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-07-09T02:52:48+02:00",
"currentDirectoryPath" : null,
"description" : "Change the sound output. Possible \"Output Type\" values: tv_speaker | external_optical | external_arc | external_speaker | lineout | headphone | tv_external_speaker | tv_speaker_headphone | bt_soundbar.",
"filename" : "change-sound-output.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/lg.png"
},
"identifier" : "92e31125a765419b484225d005349bbe",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "LG TV",
"path" : "remote-control\/lg-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Change Sound Output",
"updatedAt" : "2021-07-09T02:52:48+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-07-09T02:52:48+02:00",
"currentDirectoryPath" : null,
"description" : "Open Youtube with the given video URL. The URL has to start with \"http:\/\/\" or \"https:\/\/\" prefix.",
"filename" : "open-youtube-url.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/lg.png"
},
"identifier" : "1b3173b6d5599269237ec698f7e25f5a",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "LG TV",
"path" : "remote-control\/lg-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open Youtube (URL)",
"updatedAt" : "2021-07-09T02:52:48+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-07-09T02:52:48+02:00",
"currentDirectoryPath" : null,
"description" : "Send the notification with the icon and show it on the TV.",
"filename" : "send-notification-with-icon.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/lg.png"
},
"identifier" : "704cb889c24c763ab173ca2d6f005f97",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "LG TV",
"path" : "remote-control\/lg-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Send Notification With Icon",
"updatedAt" : "2021-07-09T02:52:48+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-07-09T02:52:48+02:00",
"currentDirectoryPath" : null,
"description" : "Show the list of inputs.",
"filename" : "list-inputs.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/lg.png"
},
"identifier" : "be6b15255dff22445bde8a59508116f6",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "LG TV",
"path" : "remote-control\/lg-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "List Inputs",
"updatedAt" : "2021-07-09T02:52:48+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-07-09T02:52:48+02:00",
"currentDirectoryPath" : null,
"description" : "Turn on the TV.",
"filename" : "turn-on.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/lg.png"
},
"identifier" : "63090b3ec7187945b62fce1238cf2af3",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "LG TV",
"path" : "remote-control\/lg-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Turn On",
"updatedAt" : "2021-07-09T02:52:48+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-07-09T02:52:48+02:00",
"currentDirectoryPath" : null,
"description" : "Pause the media.",
"filename" : "pause-media.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/lg.png"
},
"identifier" : "8742d8e473f35985239b53c684057c57",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "LG TV",
"path" : "remote-control\/lg-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Pause Media",
"updatedAt" : "2021-07-09T02:52:48+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-07-09T02:52:48+02:00",
"currentDirectoryPath" : null,
"description" : "Switch to the next TV channel.",
"filename" : "switch-next-channel.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/lg.png"
},
"identifier" : "f9dce7bb8d885c0ea5f07707315b1081",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "LG TV",
"path" : "remote-control\/lg-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Switch To Next Channel",
"updatedAt" : "2021-07-09T02:52:48+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-07-09T02:52:48+02:00",
"currentDirectoryPath" : null,
"description" : "Turn off the TV.",
"filename" : "turn-off.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/lg.png"
},
"identifier" : "922d7eeb985eea027b7c991ed67416ca",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "LG TV",
"path" : "remote-control\/lg-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Turn Off",
"updatedAt" : "2021-07-09T02:52:48+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-07-09T02:52:48+02:00",
"currentDirectoryPath" : null,
"description" : "Switch to the previous TV channel.",
"filename" : "switch-previous-channel.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/lg.png"
},
"identifier" : "a20d5850aa9f2630a4f65cc78c271d0d",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "LG TV",
"path" : "remote-control\/lg-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Switch To Previous Channel",
"updatedAt" : "2021-07-09T02:52:48+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-07-09T02:52:48+02:00",
"currentDirectoryPath" : null,
"description" : "Turn the volume up.",
"filename" : "turn-volume-up.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/lg.png"
},
"identifier" : "5f0f0848dc260276f5355b446f10a168",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "LG TV",
"path" : "remote-control\/lg-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Turn Volume Up",
"updatedAt" : "2021-07-09T02:52:48+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-07-09T02:52:48+02:00",
"currentDirectoryPath" : null,
"description" : "Change the TV channel by its ID.",
"filename" : "change-channel.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/lg.png"
},
"identifier" : "18f3567ca221111e3673195b2cf9af0d",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "LG TV",
"path" : "remote-control\/lg-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Change Channel",
"updatedAt" : "2021-07-09T02:52:48+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-07-09T02:52:48+02:00",
"currentDirectoryPath" : null,
"description" : "Open the browser with the given URL. The URL has to start with \"http:\/\/\" or \"https:\/\/\" prefix.",
"filename" : "open-browser.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/lg.png"
},
"identifier" : "f3237372781a3e881610a829fef162f2",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "LG TV",
"path" : "remote-control\/lg-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open Browser",
"updatedAt" : "2021-07-09T02:52:48+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-07-09T02:52:48+02:00",
"currentDirectoryPath" : null,
"description" : "Turn on the 3D mode.",
"filename" : "turn-on-3d.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/lg.png"
},
"identifier" : "9349225f968d01f1c20cf93b2cf80a8b",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "LG TV",
"path" : "remote-control\/lg-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Turn On 3D",
"updatedAt" : "2021-07-09T02:52:48+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-07-09T02:52:48+02:00",
"currentDirectoryPath" : null,
"description" : "Rewind the media.",
"filename" : "rewind-media.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/lg.png"
},
"identifier" : "e4a54596a914816f8cee8f454d89d8f5",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "LG TV",
"path" : "remote-control\/lg-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Rewind Media",
"updatedAt" : "2021-07-09T02:52:48+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-07-09T02:52:48+02:00",
"currentDirectoryPath" : null,
"description" : "Change the input by its ID.",
"filename" : "change-input.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/lg.png"
},
"identifier" : "5906fe2cceeb97d71366559cf48e2008",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "LG TV",
"path" : "remote-control\/lg-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Change Input",
"updatedAt" : "2021-07-09T02:52:48+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-07-09T02:52:48+02:00",
"currentDirectoryPath" : null,
"description" : "Turn off the screen.",
"filename" : "turn-off-screen.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/lg.png"
},
"identifier" : "2a4ba28c6785f55fcdbef026cd4cae17",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "LG TV",
"path" : "remote-control\/lg-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Turn Off Screen",
"updatedAt" : "2021-07-09T02:52:48+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-07-09T02:52:48+02:00",
"currentDirectoryPath" : null,
"description" : "Mute the TV.",
"filename" : "mute.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/lg.png"
},
"identifier" : "07b43012e1ccbf2901709c0d4c84bc5d",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "LG TV",
"path" : "remote-control\/lg-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Mute",
"updatedAt" : "2021-07-09T02:52:48+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-07-09T02:52:48+02:00",
"currentDirectoryPath" : null,
"description" : "Turn the volume down.",
"filename" : "turn-volume-down.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/lg.png"
},
"identifier" : "b84e91ddb1aa4e95b83b9eac4ab7bf21",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "LG TV",
"path" : "remote-control\/lg-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Turn Volume Down",
"updatedAt" : "2021-07-09T02:52:48+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-07-09T02:52:48+02:00",
"currentDirectoryPath" : null,
"description" : "Fast forward the media.",
"filename" : "fast-forward-media.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/lg.png"
},
"identifier" : "71bfe79390a649059a900ae918bb799d",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "LG TV",
"path" : "remote-control\/lg-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Fast Forward Media",
"updatedAt" : "2021-07-09T02:52:48+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-07-09T02:52:48+02:00",
"currentDirectoryPath" : null,
"description" : "Show the cursor socket.",
"filename" : "show-cursor-socket.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/lg.png"
},
"identifier" : "48ec07a14fd7018898c0eca7b317d3b1",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "LG TV",
"path" : "remote-control\/lg-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Show Cursor Socket",
"updatedAt" : "2021-07-09T02:52:48+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-07-09T02:52:48+02:00",
"currentDirectoryPath" : null,
"description" : "Change the volume level.",
"filename" : "change-volume.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/lg.png"
},
"identifier" : "bd193c0cf866ed98f4944fc6a80bf49f",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "LG TV",
"path" : "remote-control\/lg-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Change Volume",
"updatedAt" : "2021-07-09T02:52:48+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-07-09T02:52:48+02:00",
"currentDirectoryPath" : null,
"description" : "Show the list of TV channels.",
"filename" : "list-channels.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/lg.png"
},
"identifier" : "f24a8d248138846ce37350af4b5fa7df",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "LG TV",
"path" : "remote-control\/lg-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "List Channels",
"updatedAt" : "2021-07-09T02:52:48+02:00"
}
]
}
]
},
{
"name" : "Math",
"path" : "math",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Petr Nikolaev",
"url" : "https:\/\/github.com\/pitnikola"
}
],
"createdAt" : "2021-02-05T13:43:54Z",
"currentDirectoryPath" : null,
"description" : "Calculate percentage increase between \"from\" and \"to\" values.",
"filename" : "calculate-growth.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "📈"
},
"identifier" : "a733748a4340860d44b583174bed4aa8",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Calculate Growth",
"path" : "math\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Calculate Growth %",
"updatedAt" : "2021-02-05T13:43:54Z"
},
{
"authors" : [
{
"name" : "es183923",
"url" : "https:\/\/github.com\/es183923"
}
],
"createdAt" : "2021-04-28T16:57:16-04:00",
"currentDirectoryPath" : null,
"description" : "Use Wolfram Alpha to answer your query",
"filename" : "wolfram-alpha.template.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/wolfram-alpha.png"
},
"identifier" : "b8941ff8daf7b80d6ba25e7a1d759659",
"isTemplate" : true,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Math",
"path" : "math\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Wolfram Alpha",
"updatedAt" : "2021-04-28T20:59:27Z"
},
{
"authors" : [
{
"name" : "cSharp",
"url" : "https:\/\/github.com\/noidwasavailable"
}
],
"createdAt" : "2023-09-06T00:23:42+09:00",
"currentDirectoryPath" : null,
"description" : "nCr: Calculate combinations",
"filename" : "calculate-combinations.js",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "𝐂"
},
"identifier" : "7d453c1dd055288ddc8c81714ed8194b",
"isTemplate" : false,
"language" : "node",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Calculate Combinations",
"path" : "math\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "nCr: Calculate Combinations",
"updatedAt" : "2023-09-06T00:23:42+09:00"
},
{
"authors" : [
{
"name" : "Matt Gleich",
"url" : "https:\/\/mattglei.ch"
}
],
"createdAt" : "2022-02-04T00:21:07-05:00",
"currentDirectoryPath" : null,
"description" : "Evaluate LaTeX expressions and get the product copied to your clipboard",
"filename" : "latex-calculator.py",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🧮"
},
"identifier" : "99c77768765823d1f57e72e84d005f64",
"isTemplate" : false,
"language" : "python",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Math",
"path" : "math\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "LaTeX Calculator",
"updatedAt" : "2022-02-04T10:14:08Z"
},
{
"authors" : [
{
"name" : "Samuel Barton",
"url" : "https:\/\/github.com\/samueldbarton"
}
],
"createdAt" : "2024-11-18T09:32:56-06:00",
"currentDirectoryPath" : null,
"description" : "Calculate the CAGR between \"from\" and \"to\" values over given \"years,\" then copy the result.",
"filename" : "calculate-CAGR.sh",
"hasArguments" : true,
"icon" : null,
"identifier" : "5acd1b95964396ecfbe1aee4841ddb0a",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Math",
"path" : "math\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Calculate CAGR Percentage",
"updatedAt" : "2024-11-18T09:32:56-06:00"
},
{
"authors" : [
{
"name" : "Matt Gleich",
"url" : "https:\/\/mattglei.ch"
}
],
"createdAt" : "2021-11-17T11:41:42-05:00",
"currentDirectoryPath" : null,
"description" : "Generate a number between a given range (inclusive) and then copy the value",
"filename" : "random-number.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🔢"
},
"identifier" : "36ce3407031e4f15536ed06711a94b08",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Math",
"path" : "math\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Generate Random Number",
"updatedAt" : "2021-11-17T11:41:42-05:00"
}
]
},
{
"name" : "Dashboard",
"path" : "dashboard",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-11-05T19:28:32-05:00",
"currentDirectoryPath" : null,
"description" : "Get current weather report from [wttr.in](https:\/\/wttr.in\/).",
"filename" : "current-weather.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🌦️"
},
"identifier" : "633427580d7acc72e502b5c78376d066",
"isTemplate" : false,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Dashboard",
"path" : "dashboard\/",
"refreshTime" : "1h",
"schemaVersion" : 1,
"title" : "Current Weather",
"updatedAt" : "2022-07-01T16:07:45+02:00"
},
{
"authors" : [
{
"name" : "Tanguy Le Stradic",
"url" : "https:\/\/github.com\/tanguyls"
}
],
"createdAt" : "2020-11-16T20:42:01+01:00",
"currentDirectoryPath" : null,
"description" : "Get current Bitcoin price from Coindesk.",
"filename" : "bitcoin-price-usd.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/bitcoin-logo.png"
},
"identifier" : "e425a0838f6a64e832ffa9a112c8fb67",
"isTemplate" : false,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Dashboard",
"path" : "dashboard\/",
"refreshTime" : "1h",
"schemaVersion" : 1,
"title" : "Bitcoin Price",
"updatedAt" : "2020-11-23T17:47:38+01:00"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-11-08T13:50:51-05:00",
"currentDirectoryPath" : null,
"description" : "Test download and upload connection speed using [Speedtest](https:\/\/www.speedtest.net\/apps\/cli).",
"filename" : "speedtest.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/speedtest-logo.png"
},
"identifier" : "d70a6a0bd6c62e53037715b0f51f86dd",
"isTemplate" : false,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Internet",
"path" : "dashboard\/",
"refreshTime" : "20m",
"schemaVersion" : 1,
"title" : "Speedtest",
"updatedAt" : "2021-02-27T15:39:22-08:00"
},
{
"authors" : [
{
"name" : "Astrit",
"url" : "https:\/\/github.com\/astrit"
}
],
"createdAt" : "2022-02-23T23:10:21+01:00",
"currentDirectoryPath" : null,
"description" : "Fear & Greed Index from CNN",
"filename" : "fear-index.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "😱 "
},
"identifier" : "7862558b671bcea3f416d6bb8901d12f",
"isTemplate" : false,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Fear & Greed Index",
"path" : "dashboard\/",
"refreshTime" : "12h",
"schemaVersion" : 1,
"title" : "Fear Index",
"updatedAt" : "2022-02-23T23:10:21+01:00"
},
{
"authors" : [
{
"name" : "Clark Dinnison",
"url" : "https:\/\/github.com\/cdinnison"
}
],
"createdAt" : "2021-02-04T00:45:59-08:00",
"currentDirectoryPath" : null,
"description" : "Get current Ethereum price from CoinGecko.",
"filename" : "ethereum-price-usd.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/ethereum-logo.png"
},
"identifier" : "b295025d81c6f298f4d83e302e084ad9",
"isTemplate" : false,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Dashboard",
"path" : "dashboard\/",
"refreshTime" : "1h",
"schemaVersion" : 1,
"title" : "Ethereum Price",
"updatedAt" : "2021-02-04T00:45:59-08:00"
},
{
"authors" : [
{
"name" : "Thomas Paul Mann",
"url" : "https:\/\/github.com\/thomaspaulmann"
}
],
"createdAt" : "2021-01-27T23:15:56Z",
"currentDirectoryPath" : null,
"description" : "Shows the followers, favorites and friends count of your Twitter account.",
"filename" : "twitter-statistics.template.rb",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/twitter.png"
},
"identifier" : "1bde64c963c2cc5e3ffc510d7568f210",
"isTemplate" : true,
"language" : "ruby",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Twitter",
"path" : "dashboard\/",
"refreshTime" : "1h",
"schemaVersion" : 1,
"title" : "Twitter Statistics",
"updatedAt" : "2021-07-23T17:26:29-04:00"
},
{
"authors" : [
{
"name" : "Stefan de Graaf",
"url" : "https:\/\/github.com\/DBZFYAM"
}
],
"createdAt" : "2021-05-20T01:23:39+02:00",
"currentDirectoryPath" : null,
"description" : "Retrieves the value of precious metals per 1 oz",
"filename" : "precious-metals.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/precious-metals.png"
},
"identifier" : "322ece7c0e5dcc2c35a997d7b968b724",
"isTemplate" : false,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Dashboard",
"path" : "dashboard\/",
"refreshTime" : "1h",
"schemaVersion" : 1,
"title" : "Metals Price",
"updatedAt" : "2021-05-20T01:23:39+02:00"
},
{
"authors" : [
{
"name" : "Jesse Claven",
"url" : "https:\/\/github.com\/jesse-c"
}
],
"createdAt" : "2021-05-01T17:46:57+01:00",
"currentDirectoryPath" : null,
"description" : "Show SABnzbd's queue status",
"filename" : "sabnzbd-queue-status.template.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🤖"
},
"identifier" : "b56a25c7f8c0bef6d3608a98ea809b00",
"isTemplate" : true,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Dashboard",
"path" : "dashboard\/",
"refreshTime" : "1m",
"schemaVersion" : 1,
"title" : "SABnzbd Queue",
"updatedAt" : "2021-05-01T17:46:57+01:00"
},
{
"authors" : null,
"createdAt" : "2020-10-16T17:38:24+02:00",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "system-activity.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "📈"
},
"identifier" : "89218de6222b35bac76e4b051930dd11",
"isTemplate" : false,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Dashboard",
"path" : "dashboard\/",
"refreshTime" : "5s",
"schemaVersion" : 1,
"title" : "System Activity",
"updatedAt" : "2020-11-23T12:53:48-05:00"
},
{
"authors" : [
{
"name" : "Manan Mehta",
"url" : "https:\/\/github.com\/mehtamanan"
}
],
"createdAt" : "2021-03-01T03:37:28-08:00",
"currentDirectoryPath" : null,
"description" : "Gets crypto prices from Binance",
"filename" : "crypto-portfolio.py",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "💰"
},
"identifier" : "1e2edbef6b7ee380b6a3f8fb71614ce8",
"isTemplate" : false,
"language" : "python",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Money",
"path" : "dashboard\/",
"refreshTime" : "5m",
"schemaVersion" : 1,
"title" : "Crypto",
"updatedAt" : "2021-03-01T16:54:23Z"
},
{
"authors" : [
{
"name" : "nagauta",
"url" : "https:\/\/github.com\/nagauta"
}
],
"createdAt" : "2023-05-04T00:27:11+09:00",
"currentDirectoryPath" : null,
"description" : "Get total usage of OpenAI API",
"filename" : "open-ai-usage.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "💲"
},
"identifier" : "0ddcc5df2535bb2a723ebcd790f2e937",
"isTemplate" : false,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "dashboard\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Check Usage of OpenAI API",
"updatedAt" : "2023-05-04T14:08:10+09:00"
},
{
"authors" : [
{
"name" : "Clu Soh",
"url" : "https:\/\/github.com\/designedbyclu"
}
],
"createdAt" : "2021-02-04T00:45:59-08:00",
"currentDirectoryPath" : null,
"description" : "Checking DOGE coin price",
"filename" : "doge.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/dogecoin-logo.png"
},
"identifier" : "ef5ccfacde23ff614355afb1f378cc1b",
"isTemplate" : false,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Dashboard",
"path" : "dashboard\/",
"refreshTime" : "1h",
"schemaVersion" : 1,
"title" : "DOGE Price",
"updatedAt" : "2021-05-10T13:42:50+08:00"
},
{
"authors" : [
{
"name" : "Phil Salant",
"url" : "https:\/\/github.com\/PSalant726"
}
],
"createdAt" : "2021-01-24T18:51:50-05:00",
"currentDirectoryPath" : null,
"description" : "Check if this machine is using NextDNS.",
"filename" : "nextdns-status-check.py",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/nextdns.png"
},
"identifier" : "36bf8f74da76a691998c7a356d8dbd8d",
"isTemplate" : false,
"language" : "python",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Dashboard",
"path" : "dashboard\/",
"refreshTime" : "1h",
"schemaVersion" : 1,
"title" : "NextDNS Status",
"updatedAt" : "2021-01-26T14:46:55Z"
},
{
"authors" : [
{
"name" : "Mortada Sarheed",
"url" : "https:\/\/github.com\/mSarheed"
}
],
"createdAt" : "2023-02-06T09:47:01+01:00",
"currentDirectoryPath" : null,
"description" : "Get the status of your Tesla vehicle",
"filename" : "tesla.template.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🚘"
},
"identifier" : "92b07ce3fd4dd31dc4dde74af562bc59",
"isTemplate" : true,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Tesla.Template",
"path" : "dashboard\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Tesla",
"updatedAt" : "2023-02-06T08:49:49Z"
},
{
"authors" : [
{
"name" : "Thomas Paul Mann",
"url" : "https:\/\/github.com\/thomaspaulmann"
}
],
"createdAt" : "2020-12-01T15:19:07Z",
"currentDirectoryPath" : null,
"description" : "See the year progress on your desktop.",
"filename" : "year-progress.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "⏱"
},
"identifier" : "f91b94065511ac6266f5b2499368af3a",
"isTemplate" : false,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Dashboard",
"path" : "dashboard\/",
"refreshTime" : "1h",
"schemaVersion" : 1,
"title" : "Year Progress",
"updatedAt" : "2021-01-28T17:52:04+03:00"
},
{
"authors" : [
{
"name" : "Astrit",
"url" : "https:\/\/github.com\/astrit"
}
],
"createdAt" : "2021-11-09T10:29:38+01:00",
"currentDirectoryPath" : null,
"description" : "Shows YouTube Subscribers, Views and Videos",
"filename" : "youtube-statistics.template.rb",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/youtube.png"
},
"identifier" : "561f7ed8faa600880f0a583a964d481f",
"isTemplate" : true,
"language" : "ruby",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "YouTube Statistics",
"path" : "dashboard\/",
"refreshTime" : "1h",
"schemaVersion" : 1,
"title" : "YouTube Statistics",
"updatedAt" : "2021-11-09T09:49:02Z"
},
{
"authors" : [
{
"name" : "Thomas Paul Mann",
"url" : "https:\/\/github.com\/thomaspaulmann"
}
],
"createdAt" : "2021-02-15T15:57:43Z",
"currentDirectoryPath" : null,
"description" : "Keep track of your stock portfolio.",
"filename" : "stock-portfolio.rb",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "📈"
},
"identifier" : "116c44f780e379c97aaa32826ff6dbb8",
"isTemplate" : false,
"language" : "ruby",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Stock Portfolio",
"path" : "dashboard\/",
"refreshTime" : "1h",
"schemaVersion" : 1,
"title" : "Stocks",
"updatedAt" : "2021-02-15T16:05:12Z"
},
{
"authors" : [
{
"name" : "Jesse Claven",
"url" : "https:\/\/github.com\/jesse-c"
}
],
"createdAt" : "2021-01-16T14:01:54Z",
"currentDirectoryPath" : null,
"description" : "Show the time from elsewhere in the world",
"filename" : "world-time.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🕐"
},
"identifier" : "0fe9fe7b1ee089f32c2d6fc739e8364b",
"isTemplate" : false,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Dashboard",
"path" : "dashboard\/",
"refreshTime" : "5s",
"schemaVersion" : 1,
"title" : "World Time",
"updatedAt" : "2021-02-20T12:41:02+01:00"
}
],
"subGroups" : [
{
"name" : "Mood Meter",
"path" : "mood-meter",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Federico Miraglia",
"url" : "https:\/\/github.com\/Mitra98t"
}
],
"createdAt" : "2021-10-07T10:32:15+02:00",
"currentDirectoryPath" : null,
"description" : "Add mood value to current or specified date ",
"filename" : "add-mood.js",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "☕️"
},
"identifier" : "0e526e9f9e5f652b170303c129ed23b0",
"isTemplate" : false,
"language" : "node",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Dashboard",
"path" : "dashboard\/mood-meter\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Add Mood",
"updatedAt" : "2021-10-07T10:32:15+02:00"
},
{
"authors" : [
{
"name" : "Federico Miraglia",
"url" : "https:\/\/github.com\/Mitra98t"
}
],
"createdAt" : "2021-10-07T10:32:15+02:00",
"currentDirectoryPath" : null,
"description" : "Displays month mood table ",
"filename" : "display-mood-month.js",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "☕️"
},
"identifier" : "e48bdecd3f81809ea28118f115a94d95",
"isTemplate" : false,
"language" : "node",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Dashboard",
"path" : "dashboard\/mood-meter\/",
"refreshTime" : "5s",
"schemaVersion" : 1,
"title" : "Display Mood Month",
"updatedAt" : "2021-10-07T10:32:15+02:00"
},
{
"authors" : [
{
"name" : "Federico Miraglia",
"url" : "https:\/\/github.com\/Mitra98t"
}
],
"createdAt" : "2021-10-07T10:32:15+02:00",
"currentDirectoryPath" : null,
"description" : "Displays year mood table ",
"filename" : "display-mood-year.js",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "☕️"
},
"identifier" : "7c2a11ff6675fb93687733d284c4b862",
"isTemplate" : false,
"language" : "node",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Dashboard",
"path" : "dashboard\/mood-meter\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Display Mood Year",
"updatedAt" : "2021-10-07T10:32:15+02:00"
}
]
},
{
"name" : "Open Weather",
"path" : "open-weather",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Marek Mašek",
"url" : "https:\/\/github.com\/marekmasek"
}
],
"createdAt" : "2022-04-03T20:33:02+02:00",
"currentDirectoryPath" : null,
"description" : "Get current weather from OpenWeather",
"filename" : "weather-current.template.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "⛅️"
},
"identifier" : "e3d36b7b7215c9fabcc2ca76608cd650",
"isTemplate" : true,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "OpenWeather",
"path" : "dashboard\/open-weather\/",
"refreshTime" : "30m",
"schemaVersion" : 1,
"title" : "Current Weather",
"updatedAt" : "2022-04-03T20:33:02+02:00"
},
{
"authors" : [
{
"name" : "Marek Mašek",
"url" : "https:\/\/github.com\/marekmasek"
}
],
"createdAt" : "2022-04-03T20:33:02+02:00",
"currentDirectoryPath" : null,
"description" : "Get weather forecast from OpenWeather",
"filename" : "weather-forecast.template.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "⛅️"
},
"identifier" : "99c2bb05fdc937398f9b0ca9c21c3de0",
"isTemplate" : true,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "OpenWeather",
"path" : "dashboard\/open-weather\/",
"refreshTime" : "30m",
"schemaVersion" : 1,
"title" : "Weather Forecast",
"updatedAt" : "2022-04-03T20:33:02+02:00"
}
]
},
{
"name" : "Firebase",
"path" : "firebase",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Marek Mašek",
"url" : "https:\/\/github.com\/marekmasek"
}
],
"createdAt" : "2022-03-30T22:44:18+02:00",
"currentDirectoryPath" : null,
"description" : "Get values from Firebase Realtime Database",
"filename" : "firebase-realtime-db-get-data.template.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/firebase.png"
},
"identifier" : "dd152410f57df463a043081efbc26960",
"isTemplate" : true,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Firebase",
"path" : "dashboard\/firebase\/",
"refreshTime" : "10m",
"schemaVersion" : 1,
"title" : "Get data from Firebase",
"updatedAt" : "2022-03-30T22:44:18+02:00"
},
{
"authors" : [
{
"name" : "João Melo",
"url" : "https:\/\/github.com\/joaopcm"
}
],
"createdAt" : "2022-12-30T14:08:40-03:00",
"currentDirectoryPath" : null,
"description" : "Get token from Firebase Authentication service",
"filename" : "firebase-authentication-get-token.template.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/firebase.png"
},
"identifier" : "d4bf22f455beb60e3044429453e05102",
"isTemplate" : true,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Firebase Authentication",
"path" : "dashboard\/firebase\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Get Authorization Token",
"updatedAt" : "2022-12-30T17:11:26Z"
}
]
},
{
"name" : "Countdowns",
"path" : "countdowns",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Valentin Chrétien",
"url" : "https:\/\/github.com\/valentinchrt"
}
],
"createdAt" : "2020-12-02T15:46:55+01:00",
"currentDirectoryPath" : null,
"description" : "See how many days until Christmas.",
"filename" : "countdown-to-christmas.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🎅🏻"
},
"identifier" : "e3746d89850312e10ed4fad53103dbba",
"isTemplate" : false,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Countdown To Christmas",
"path" : "dashboard\/countdowns\/",
"refreshTime" : "1h",
"schemaVersion" : 1,
"title" : "Countdown to Christmas",
"updatedAt" : "2020-12-04T22:42:54-05:00"
},
{
"authors" : [
{
"name" : "Valentin Chrétien",
"url" : "https:\/\/github.com\/valentinchrt"
}
],
"createdAt" : "2020-12-02T15:50:36+01:00",
"currentDirectoryPath" : null,
"description" : "Create countdowns via Raycast.",
"filename" : "create-countdown.template.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "⏱"
},
"identifier" : "1e963e6123f7e0860c7bf241fce505e4",
"isTemplate" : true,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Create Countdown.Template",
"path" : "dashboard\/countdowns\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Create Countdown",
"updatedAt" : "2021-02-22T23:18:02+01:00"
},
{
"authors" : [
{
"name" : "Valentin Chrétien",
"url" : "https:\/\/github.com\/valentinchrt"
}
],
"createdAt" : "2020-12-02T15:49:04+01:00",
"currentDirectoryPath" : null,
"description" : "See how many days\/hours until a specific date.",
"filename" : "countdown-to-date.template.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "⏱"
},
"identifier" : "3b7be449b1353fb738e2b5e0111b652b",
"isTemplate" : true,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Countdown To Date.Template",
"path" : "dashboard\/countdowns\/",
"refreshTime" : "10m",
"schemaVersion" : 1,
"title" : "Countdown to Date",
"updatedAt" : "2021-01-07T00:32:38+08:00"
}
]
}
]
},
{
"name" : "System",
"path" : "system",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Yohanes Bandung Bondowoso",
"url" : "https:\/\/github.com\/ybbond"
}
],
"createdAt" : "2021-02-24T14:24:25+07:00",
"currentDirectoryPath" : null,
"description" : "Set Frontmost Web Browser as Default Browser.",
"filename" : "default-browser-front-most-app.applescript",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🧭"
},
"identifier" : "5b00f6eb9391d53cc153ef3a1231f8ea",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Browsing",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Set Frontmost App as Default Browser",
"updatedAt" : "2024-04-22T16:22:28+10:00"
},
{
"authors" : [
{
"name" : "Valentin Chrétien",
"url" : "https:\/\/twitter.com\/valentinchrt"
}
],
"createdAt" : "2020-10-30T19:33:06+01:00",
"currentDirectoryPath" : null,
"description" : "A script command to start your current screen saver.",
"filename" : "screensaver.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🌀"
},
"identifier" : "016b30488e412822a94cd3586934f0d3",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Screen Saver",
"updatedAt" : "2020-11-23T12:53:48-05:00"
},
{
"authors" : [
{
"name" : "Felipe Turcheti",
"url" : "https:\/\/felipeturcheti.com"
}
],
"createdAt" : "2021-03-18T14:47:46-03:00",
"currentDirectoryPath" : null,
"description" : "Uninstall applications with AppCleaner",
"filename" : "uninstall-with-appcleaner.applescript",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🗑"
},
"identifier" : "7796b8e6036fed3a0b4373925268f8d9",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Uninstall with AppCleaner",
"updatedAt" : "2021-03-18T14:47:46-03:00"
},
{
"authors" : [
{
"name" : "Raphael-KR",
"url" : "https:\/\/github.com\/Raphael-KR"
}
],
"createdAt" : "2025-08-23T18:49:50+09:00",
"currentDirectoryPath" : null,
"description" : "Toggle natural trackpad\/mouse scrolling setting for macOS 15.6.1+",
"filename" : "toggle-natural-scrolling-macos15.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🖱"
},
"identifier" : "3ccaeabe09d36538f01f592bc7b3e51e",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Toggle Natural Scrolling (macOS 15+)",
"updatedAt" : "2025-08-25T09:08:49Z"
},
{
"authors" : [
{
"name" : "Aaron Miller",
"url" : "https:\/\/github.com\/aaronhmiller"
}
],
"createdAt" : "2021-08-07T14:30:22-07:00",
"currentDirectoryPath" : null,
"description" : "This script screenshots the entire screen and saves it to the clipboard.",
"filename" : "capture-fullscreen-to-clipboard.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "💻"
},
"identifier" : "344e66ee76bea921b245701f7c638ece",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Capture Fullscreen to Clipboard",
"updatedAt" : "2021-08-07T19:28:35-07:00"
},
{
"authors" : [
{
"name" : "benyn",
"url" : "github.com\/benyn"
}
],
"createdAt" : "2023-05-06T14:02:11-07:00",
"currentDirectoryPath" : null,
"description" : "Close all notification alerts staying on screen, e.g., Calendar notifications.",
"filename" : "dismiss-notifications.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🔕"
},
"identifier" : "d1d5f97ad62a6692d70fc17da0a71157",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Dismiss Notifications",
"updatedAt" : "2025-05-18T15:56:50-07:00"
},
{
"authors" : [
{
"name" : "Alexander Steffen",
"url" : "https:\/\/github.com\/alexjsteffen"
}
],
"createdAt" : "2022-02-20T17:12:23-08:00",
"currentDirectoryPath" : null,
"description" : "Close all open Finder windows. ",
"filename" : "close-finder-windows.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🔪"
},
"identifier" : "9ea2842daeb65fb34b307cce6ed0bb58",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Close All Finder Windows",
"updatedAt" : "2022-02-20T17:12:23-08:00"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-11-22T12:35:00-05:00",
"currentDirectoryPath" : null,
"description" : "Report process with largest system CPU usage.",
"filename" : "largest-cpu-process.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "📈"
},
"identifier" : "eaca5331de591791a0e9debbce8c94d9",
"isTemplate" : false,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : "3m",
"schemaVersion" : 1,
"title" : "Largest CPU Process",
"updatedAt" : "2020-11-28T13:04:44-05:00"
},
{
"authors" : [
{
"name" : "Jesse Claven",
"url" : "https:\/\/github.com\/jesse-c"
}
],
"createdAt" : "2020-12-18T16:52:19Z",
"currentDirectoryPath" : null,
"description" : "Sample a color from anywhere on your screen.",
"filename" : "sample-color.swift",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🎨"
},
"identifier" : "4600a7cb879326d93a1fa82615819092",
"isTemplate" : false,
"language" : "swift",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Sample Color",
"updatedAt" : "2021-07-21T10:01:35-04:00"
},
{
"authors" : [
{
"name" : "Jelte Lagendijk",
"url" : "https:\/\/raycast.com\/j3lte"
}
],
"createdAt" : "2024-04-22T08:23:05+02:00",
"currentDirectoryPath" : null,
"description" : "Set the position of the Dock in the screen",
"filename" : "dock-set-position.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🤖"
},
"identifier" : "4d015ec34744b1b005c63343cace870a",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Dock Position",
"updatedAt" : "2024-04-22T08:23:05+02:00"
},
{
"authors" : [
{
"name" : "Yan Smaliak",
"url" : "https:\/\/github.com\/ysmaliak"
}
],
"createdAt" : "2021-06-23T23:17:52+03:00",
"currentDirectoryPath" : null,
"description" : "Shows caffeinate status and time left if it's running",
"filename" : "caffeinate-status.swift",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "☕️"
},
"identifier" : "ea698b6674bb57715a2b7c4a06fc428c",
"isTemplate" : false,
"language" : "swift",
"mode" : "inline",
"needsConfirmation" : false,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : "30s",
"schemaVersion" : 1,
"title" : "Caffeinate",
"updatedAt" : "2021-06-24T14:36:25+03:00"
},
{
"authors" : [
{
"name" : "Jordi Clement",
"url" : "https:\/\/github.com\/jordicl"
}
],
"createdAt" : "2021-03-08T18:14:50+01:00",
"currentDirectoryPath" : null,
"description" : "Restart the Finder",
"filename" : "restart-finder.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "💀"
},
"identifier" : "e21a9f0baf43d6e8a7655e597151673f",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Restart the Finder",
"updatedAt" : "2021-03-09T10:35:42+01:00"
},
{
"authors" : null,
"createdAt" : "2020-09-30T12:56:51+01:00",
"currentDirectoryPath" : null,
"description" : "Empty the trash.",
"filename" : "empty-trash.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🗑"
},
"identifier" : "3528e589140c649bb7a6f0b43938f491",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Empty Trash",
"updatedAt" : "2021-03-04T21:05:10+01:00"
},
{
"authors" : [
{
"name" : "Jordi Clement",
"url" : "https:\/\/github.com\/jordicl"
}
],
"createdAt" : "2021-03-04T21:13:00+01:00",
"currentDirectoryPath" : null,
"description" : "Restart the Dock",
"filename" : "restart-dock.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "💀"
},
"identifier" : "ac9e0060f3e114b655c2723eb5e99933",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Restart the Dock",
"updatedAt" : "2021-03-09T11:24:27+01:00"
},
{
"authors" : [
{
"name" : "LokHsu",
"url" : "https:\/\/github.com\/lokhsu"
}
],
"createdAt" : "2021-05-03T21:46:57+08:00",
"currentDirectoryPath" : null,
"description" : "Batch modify the file in the current directory or the specified extension of the selected file",
"filename" : "modify-extension.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🌵"
},
"identifier" : "2097c4d5e252e7befea4b6f519104025",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Modify Extension",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Modify File Extension",
"updatedAt" : "2021-05-03T21:46:57+08:00"
},
{
"authors" : [
{
"name" : "Antonio Dal Sie",
"url" : "https:\/\/github.com\/exodusanto"
}
],
"createdAt" : "2021-04-07T09:25:23+02:00",
"currentDirectoryPath" : null,
"description" : "Set system brightness",
"filename" : "brightness.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "☀️"
},
"identifier" : "0dbc3c0fcfd039a658a1d9c2535797c1",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System brightness",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Brightness",
"updatedAt" : "2021-04-07T09:46:29+02:00"
},
{
"authors" : [
{
"name" : "Alexandru Turcanu",
"url" : "https:\/\/github.com\/Pondorasti"
}
],
"createdAt" : "2021-03-04T16:13:12-08:00",
"currentDirectoryPath" : null,
"description" : "Adds an invisible icon to the Dock as a separator.",
"filename" : "add-spacer-to-dock.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "💻"
},
"identifier" : "5641c6bbfdfad513d605e225848002a5",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Add Spacer to Dock",
"updatedAt" : "2021-03-08T00:46:38Z"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-11-07T10:22:15-05:00",
"currentDirectoryPath" : null,
"description" : "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).",
"filename" : "wallpaper-refresh.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🖼️"
},
"identifier" : "cf466f9ba5a9baad7701991e639e3171",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Refresh Wallpaper",
"updatedAt" : "2021-06-04T16:35:43-04:00"
},
{
"authors" : [
{
"name" : "Marcos Sánchez-Dehesa",
"url" : "https:\/\/github.com\/dehesa"
}
],
"createdAt" : "2023-02-22T16:16:58+11:00",
"currentDirectoryPath" : null,
"description" : "Set Google Chrome as the default browser.",
"filename" : "default-browser-chrome.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/chrome.png"
},
"identifier" : "2d63f1a6bc8d207d320f0e6faf37b1c0",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Browser",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Default to Chrome",
"updatedAt" : "2023-02-22T16:16:58+11:00"
},
{
"authors" : [
{
"name" : "Yan Smaliak",
"url" : "https:\/\/github.com\/ysmaliak"
}
],
"createdAt" : "2021-06-23T19:47:11+03:00",
"currentDirectoryPath" : null,
"description" : "Stops all caffeinate sessions",
"filename" : "caffeinate-disable.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "☕️"
},
"identifier" : "b8f343e8f5516c3671d7e09e7f5af6b5",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : false,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Disable Caffeinate",
"updatedAt" : "2021-06-23T19:47:11+03:00"
},
{
"authors" : [
{
"name" : "BhEaN",
"url" : "https:\/\/github.com\/bhean"
}
],
"createdAt" : "2021-11-03T21:02:51+01:00",
"currentDirectoryPath" : null,
"description" : "Toggle Night Shift mode (until tomorrow\/sunrise). Required [nightlight](https:\/\/github.com\/smudge\/nightlight)",
"filename" : "nightshift.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🌘"
},
"identifier" : "574594655373e8a41dd88ae601f9466d",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Toggle Night Shift",
"updatedAt" : "2021-11-03T21:02:51+01:00"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-11-16T16:22:21-05:00",
"currentDirectoryPath" : null,
"description" : "Turn on \"do not disturb\" mode. Does [not work on Big Sur](https:\/\/github.com\/sindresorhus\/do-not-disturb-cli\/issues\/2).",
"filename" : "dnd-on.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "😴"
},
"identifier" : "2b8fb6e3f5c529d56b7223878a4ba142",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Turn On Do Not Disturb",
"updatedAt" : "2020-11-29T19:34:24-05:00"
},
{
"authors" : [
{
"name" : "Marcos Sánchez-Dehesa",
"url" : "https:\/\/github.com\/dehesa"
}
],
"createdAt" : "2023-02-22T16:16:58+11:00",
"currentDirectoryPath" : null,
"description" : "Set Firefox as the default browser.",
"filename" : "default-browser-firefox.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/firefox.png"
},
"identifier" : "4299cbf700855d5ae55f6a730ff28a85",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Browser",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Default to Firefox",
"updatedAt" : "2024-01-05T16:03:05-08:00"
},
{
"authors" : [
{
"name" : "Fahim Faisal",
"url" : "https:\/\/github.com\/i3p9"
}
],
"createdAt" : "2022-03-13T18:10:53+06:00",
"currentDirectoryPath" : null,
"description" : "Get Battery percentage, time remaining, charge status, charger wattage, total cycles etc.",
"filename" : "battery-info.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🔋"
},
"identifier" : "682c9017c86e7caafe835fb510cb33e1",
"isTemplate" : false,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : "3m",
"schemaVersion" : 1,
"title" : "Battery Info",
"updatedAt" : "2022-03-16T15:16:35+06:00"
},
{
"authors" : [
{
"name" : "Antonio Dal Sie",
"url" : "https:\/\/github.com\/exodusanto"
}
],
"createdAt" : "2021-04-08T11:08:42+02:00",
"currentDirectoryPath" : null,
"description" : "Do Not Disturb",
"filename" : "do-not-disturb.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🔕"
},
"identifier" : "7d8dda695f270869220063893beb9160",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Do Not Disturb",
"updatedAt" : "2021-11-16T14:59:56+01:00"
},
{
"authors" : [
{
"name" : "Roland Leth",
"url" : "https:\/\/runtimesharks.com"
}
],
"createdAt" : "2021-03-09T08:11:04+02:00",
"currentDirectoryPath" : null,
"description" : "Quits an app, by name or process id.",
"filename" : "quit-app.swift",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "💥"
},
"identifier" : "99fbf722b84d6f89aa7ff40585bf3980",
"isTemplate" : false,
"language" : "swift",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Quit app",
"updatedAt" : "2021-03-10T20:57:40+02:00"
},
{
"authors" : [
{
"name" : "Senthil Prabhu",
"url" : "https:\/\/github.com\/senthilprabhut"
}
],
"createdAt" : "2021-05-20T13:39:40-07:00",
"currentDirectoryPath" : null,
"description" : "Show or hide all filename extensions (like .txt, .png)",
"filename" : "toggle-filename-extensions.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "👓"
},
"identifier" : "4057115ba5d08cf0a62f8193c9c6916e",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Toggle Filename Extensions",
"updatedAt" : "2021-05-21T11:41:19+03:00"
},
{
"authors" : [
{
"name" : "Seypopi",
"url" : "https:\/\/github.com\/Seypopi"
}
],
"createdAt" : "2021-07-06T15:48:02+02:00",
"currentDirectoryPath" : null,
"description" : "Empty the desktop.",
"filename" : "move-desktop-to-trash.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🗑"
},
"identifier" : "cc2b535578d9865c8bfbb6deea863b05",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : true,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Move Desktop to Trash",
"updatedAt" : "2021-07-06T15:39:42Z"
},
{
"authors" : [
{
"name" : "Linus Salzmann",
"url" : "https:\/\/github.com\/linus569"
}
],
"createdAt" : "2021-04-06T21:08:50+02:00",
"currentDirectoryPath" : null,
"description" : "Force kill all AirDrop processes",
"filename" : "kill-airdrop.processes.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🔫"
},
"identifier" : "4678220973dc093f7a732eae15a4f71b",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Kill AirDrop Processes",
"updatedAt" : "2021-04-06T23:07:39Z"
},
{
"authors" : [
{
"name" : "Aaron Miller",
"url" : "https:\/\/github.com\/aaronhmiller"
}
],
"createdAt" : "2021-08-07T14:30:22-07:00",
"currentDirectoryPath" : null,
"description" : "This script screenshots the selected area and saves it to the desktop.",
"filename" : "capture-screen-selection-to-desktop.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "💻"
},
"identifier" : "aa330e29461867df6c3f22fc9b9a2c68",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Capture Screen Selection to Desktop",
"updatedAt" : "2021-08-07T19:28:35-07:00"
},
{
"authors" : [
{
"name" : "Marcos Sánchez-Dehesa",
"url" : "https:\/\/github.com\/dehesa"
}
],
"createdAt" : "2023-02-22T16:16:58+11:00",
"currentDirectoryPath" : null,
"description" : "Set Arc as the default browser.",
"filename" : "default-browser-arc.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/arc.png"
},
"identifier" : "bfadc3d5abe379f7bfaee8db90c11379",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Browser",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Default to Arc",
"updatedAt" : "2024-01-05T16:03:05-08:00"
},
{
"authors" : [
{
"name" : "Jelte Lagendijk",
"url" : "https:\/\/raycast.com\/j3lte"
}
],
"createdAt" : "2024-04-22T08:23:05+02:00",
"currentDirectoryPath" : null,
"description" : "Set the Dock autohide",
"filename" : "dock-set-autohide.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🤖"
},
"identifier" : "2e9f26f5c37a3f3c74cae49c82fc0fd5",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Dock Set Autohide",
"updatedAt" : "2024-04-22T08:23:05+02:00"
},
{
"authors" : [
{
"name" : "Astrit",
"url" : "https:\/\/github.com\/astrit"
}
],
"createdAt" : "2021-11-17T17:41:07+01:00",
"currentDirectoryPath" : null,
"description" : "Resize and center the frontmost window to any custom size.",
"filename" : "custom-window.applescript",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/custom-window-size.png"
},
"identifier" : "13a15c297e5092141c7507de2af3385f",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Custom Window Size",
"updatedAt" : "2021-11-17T17:41:07+01:00"
},
{
"authors" : [
{
"name" : "Federico Zivolo",
"url" : "https:\/\/github.com\/FezVrasta"
}
],
"createdAt" : "2024-01-20T13:56:53+01:00",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "toggle-desktop-widget.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🔄"
},
"identifier" : "79982c901bf4cd65eda80b5f7039d1d0",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Toggle Desktop Widget",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Toggle Desktop Widgets",
"updatedAt" : "2024-01-22T22:39:53Z"
},
{
"authors" : [
{
"name" : "Marcos Sánchez-Dehesa",
"url" : "https:\/\/github.com\/dehesa"
}
],
"createdAt" : "2023-02-22T16:16:58+11:00",
"currentDirectoryPath" : null,
"description" : "Set Chromium as the default browser.",
"filename" : "default-browser-chromium.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/chrome-icon.png"
},
"identifier" : "3502698721f8a80ac7cf5e3e3909f615",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Browser",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Default to Chromium",
"updatedAt" : "2023-02-22T16:16:58+11:00"
},
{
"authors" : [
{
"name" : "LokHsu",
"url" : "https:\/\/github.com\/lokhsu"
}
],
"createdAt" : "2020-12-27T13:59:31+08:00",
"currentDirectoryPath" : null,
"description" : "Create files in the front window or desktop of the visit",
"filename" : "create-new-file.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "📄"
},
"identifier" : "320da8947dc06b150318183a5ce92a06",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Create New File",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Create New File",
"updatedAt" : "2021-05-19T13:49:26+08:00"
},
{
"authors" : null,
"createdAt" : "2020-10-07T15:10:25+01:00",
"currentDirectoryPath" : null,
"description" : "Quits all running applications except Finder and Raycast.",
"filename" : "quit-all-apps.swift",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "💥"
},
"identifier" : "5d9a1236ff0ca1878cfcf271e88c6fdc",
"isTemplate" : false,
"language" : "swift",
"mode" : "silent",
"needsConfirmation" : true,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Quit All Applications",
"updatedAt" : "2021-03-27T23:04:19-04:00"
},
{
"authors" : [
{
"name" : "Aaron Miller",
"url" : "https:\/\/github.com\/aaronhmiller"
}
],
"createdAt" : "2021-08-07T14:30:22-07:00",
"currentDirectoryPath" : null,
"description" : "This script screenshots the entire screen and saves it to the desktop.",
"filename" : "capture-fullscreen-to-desktop.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "💻"
},
"identifier" : "e888ca0de9036c3e6f270c06ffa9904b",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Capture Fullscreen to Desktop",
"updatedAt" : "2021-08-07T19:28:35-07:00"
},
{
"authors" : [
{
"name" : "Bin Hua",
"url" : "https:\/\/github.com\/hzb"
}
],
"createdAt" : "2021-03-24T16:38:17+08:00",
"currentDirectoryPath" : "\/",
"description" : "Open a folder on macOS ",
"filename" : "open-folder.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "📁"
},
"identifier" : "c0a453ce75451b01821ade7b0bbf4fe7",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : false,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open Folder",
"updatedAt" : "2021-03-26T22:22:05+08:00"
},
{
"authors" : [
{
"name" : "Jax0rz",
"url" : null
}
],
"createdAt" : "2020-12-27T15:11:24+08:00",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "move-downloads-to-trash.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/move-downloads-to-trash.png"
},
"identifier" : "cc40d3eee37779e218239dfad2fca26e",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : true,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Move Downloads to Trash",
"updatedAt" : "2020-12-30T22:13:18+08:00"
},
{
"authors" : [
{
"name" : "zhe",
"url" : "https:\/\/github.com\/wmszhe"
}
],
"createdAt" : "2022-07-22T17:53:33+08:00",
"currentDirectoryPath" : null,
"description" : "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",
"filename" : "ocr.swift",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🖼"
},
"identifier" : "83aec5a2b407fa4ad1c7c485b8c49199",
"isTemplate" : false,
"language" : "swift",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Productivity",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "OCR",
"updatedAt" : "2024-06-22T16:19:22+09:00"
},
{
"authors" : [
{
"name" : "Aaron Miller",
"url" : "https:\/\/github.com\/aaronhmiller"
}
],
"createdAt" : "2021-08-07T14:30:22-07:00",
"currentDirectoryPath" : null,
"description" : "This script screenshots the selected area and saves it to the clipboard.",
"filename" : "capture-screen-selection-to-clipboard.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "💻"
},
"identifier" : "1b20aab42e5e5b6af164dbbcaedb0dfc",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Capture Screen Selection to Clipboard",
"updatedAt" : "2021-08-07T19:28:35-07:00"
},
{
"authors" : [
{
"name" : "StepaniaH",
"url" : "https:\/\/github.com\/StepaniaH"
}
],
"createdAt" : "2024-12-16T23:44:40+08:00",
"currentDirectoryPath" : null,
"description" : "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 `--`.",
"filename" : "rename-videos-pictures.py",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "📂"
},
"identifier" : "360d8e4290996f7b2b40dc6e388e30f2",
"isTemplate" : false,
"language" : "python",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Rename Videos Pictures",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Rename Video",
"updatedAt" : "2024-12-18T23:56:00+08:00"
},
{
"authors" : [
{
"name" : "Marcos Sánchez-Dehesa",
"url" : "https:\/\/github.com\/dehesa"
}
],
"createdAt" : "2023-02-22T16:16:58+11:00",
"currentDirectoryPath" : null,
"description" : "Set Safari as the default browser.",
"filename" : "default-browser-safari.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/safari.png"
},
"identifier" : "b56ccc81272dbe8beb92bdcdb77e8dce",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Browser",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Default to Safari",
"updatedAt" : "2024-01-05T16:03:05-08:00"
},
{
"authors" : [
{
"name" : "Yohanes Bandung Bondowoso",
"url" : "https:\/\/github.com\/ybbond"
}
],
"createdAt" : "2021-03-03T20:29:30+07:00",
"currentDirectoryPath" : null,
"description" : "Toggle flip (rotate) or revert the to °",
"filename" : "toggle-flip-screen.template.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🖥"
},
"identifier" : "334e278cca7425e66cb394fbd049f0b4",
"isTemplate" : true,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Toggle Flip Screen.Template",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Toggle Flip Screen to °",
"updatedAt" : "2021-03-04T20:17:31+07:00"
},
{
"authors" : [
{
"name" : "Thiago Holanda",
"url" : "https:\/\/twitter.com\/tholanda"
}
],
"createdAt" : "2020-09-30T23:35:51+02:00",
"currentDirectoryPath" : null,
"description" : "Show and hide hidden files\/folders which starts with \".\" (dot), i.e: .bash_rc, .ssh",
"filename" : "toggle-hidden-files.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "👓"
},
"identifier" : "3dfa6a8ce847abf5dfcbe74c0ce49b60",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Toggle Hidden Files",
"updatedAt" : "2020-11-23T12:53:48-05:00"
},
{
"authors" : [
{
"name" : "Ernest Ojeh",
"url" : "https:\/\/github.com\/namzo"
}
],
"createdAt" : "2022-02-21T17:47:42+01:00",
"currentDirectoryPath" : null,
"description" : "This script minimizes all windows of currently running apps",
"filename" : "minimize-all-windows.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/minimize-window.png"
},
"identifier" : "3b65d4ebb56ca0837e508f63395b1230",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Minimize All Windows",
"updatedAt" : "2022-02-21T17:47:42+01:00"
},
{
"authors" : [
{
"name" : "AndriiBarabash",
"url" : "https:\/\/github.com\/AndriiBarabash"
}
],
"createdAt" : "2025-03-10T00:16:14+01:00",
"currentDirectoryPath" : null,
"description" : "Put your Mac to sleep (in X minutes).",
"filename" : "sleep-timer.applescript",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "😴"
},
"identifier" : "ff43a32961d94da6001ad37ab79dd032",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Sleep Timer",
"updatedAt" : "2025-03-10T10:57:38+01:00"
},
{
"authors" : [
{
"name" : "Jelte Lagendijk",
"url" : "https:\/\/raycast.com\/j3lte"
}
],
"createdAt" : "2024-04-22T08:23:05+02:00",
"currentDirectoryPath" : null,
"description" : "Toggle the Dock Autohide",
"filename" : "dock-autohide-toggle.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🤖"
},
"identifier" : "48c4f52d832201490101c47dd2963bbd",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Toggle Dock Autohide",
"updatedAt" : "2024-04-22T08:23:05+02:00"
},
{
"authors" : [
{
"name" : "Archie Lacoin",
"url" : "https:\/\/github.com\/pomdtr"
},
{
"name" : "LanikSJ",
"url" : "https:\/\/github.com\/LanikSJ"
}
],
"createdAt" : "2022-04-18T08:53:46-07:00",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "network-quality.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🌐"
},
"identifier" : "c8ccba60ea98f52ca4712bbd2ff58c26",
"isTemplate" : false,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : "20m",
"schemaVersion" : 1,
"title" : "Network Quality",
"updatedAt" : "2022-12-30T13:32:07-05:00"
},
{
"authors" : [
{
"name" : "Thiago Holanda",
"url" : "https:\/\/twitter.com\/tholanda"
}
],
"createdAt" : "2020-10-01T00:09:58+02:00",
"currentDirectoryPath" : null,
"description" : "Script Command to switch between the system appearance, light and dark mode.",
"filename" : "toggle-system-appearance.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🌗"
},
"identifier" : "54d34ecb5dca7bdc00363d43019e68ba",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Toggle System Appearance",
"updatedAt" : "2020-11-23T12:53:48-05:00"
},
{
"authors" : [
{
"name" : "Yan Smaliak",
"url" : "https:\/\/github.com\/ysmaliak"
}
],
"createdAt" : "2021-06-23T19:47:11+03:00",
"currentDirectoryPath" : null,
"description" : "Starts a caffeinated session",
"filename" : "caffeinate-enable.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "☕️"
},
"identifier" : "61b64ef5d74932f70a3a2108e7055eb0",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : false,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Enable Caffeinate",
"updatedAt" : "2021-06-23T19:47:11+03:00"
},
{
"authors" : [
{
"name" : "Vincent Dörig",
"url" : "https:\/\/github.com\/vincentdoerig"
}
],
"createdAt" : "2021-01-07T23:20:03+01:00",
"currentDirectoryPath" : null,
"description" : "Toggle your Bluetooth connection.",
"filename" : "bluetooth.template.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/bluetooth.png"
},
"identifier" : "30f23f25c1f216807d6c631e69f9ae93",
"isTemplate" : true,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Toggle Bluetooth",
"updatedAt" : "2021-01-11T18:50:50+01:00"
},
{
"authors" : [
{
"name" : "Vicent Gozalbes",
"url" : "https:\/\/github.com\/vigosan"
}
],
"createdAt" : "2025-10-29T15:39:18+01:00",
"currentDirectoryPath" : null,
"description" : "Move selected files in Finder to Trash",
"filename" : "delete-selected-files.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🗑"
},
"identifier" : "af948d8e2733b1384754ecae8a626949",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Delete Selected Files",
"updatedAt" : "2025-10-29T15:39:18+01:00"
},
{
"authors" : null,
"createdAt" : "2020-10-19T11:37:16+01:00",
"currentDirectoryPath" : null,
"description" : "Opens the last downloaded file.",
"filename" : "open-last-download.swift",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "💁♂️"
},
"identifier" : "8ecb691cd7cda27f0ca184089e9ded6d",
"isTemplate" : false,
"language" : "swift",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open Last Download",
"updatedAt" : "2020-12-08T15:56:35Z"
},
{
"authors" : [
{
"name" : "Roland Leth",
"url" : "https:\/\/runtimesharks.com"
}
],
"createdAt" : "2021-03-09T08:15:32+02:00",
"currentDirectoryPath" : null,
"description" : "List running app showing their process id, CPU usage, name, and optionally the process path.",
"filename" : "list-processes.rb",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🔡"
},
"identifier" : "48b4a9d8681ee2e0253e2d4615dfc02c",
"isTemplate" : false,
"language" : "ruby",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Running processes",
"updatedAt" : "2021-03-10T21:13:32+02:00"
},
{
"authors" : null,
"createdAt" : "2020-09-30T12:56:01+01:00",
"currentDirectoryPath" : null,
"description" : "Empty Clipboard",
"filename" : "empty-clipboard.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "📋"
},
"identifier" : "be0936bf596d8169ae630f87eab769e3",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Empty Clipboard",
"updatedAt" : "2021-04-29T18:06:28+03:00"
},
{
"authors" : null,
"createdAt" : "2020-09-30T12:57:05+01:00",
"currentDirectoryPath" : null,
"description" : "Ejects all mounted disk images.",
"filename" : "eject-all-disks.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "📀"
},
"identifier" : "eb7f2c4c74a87108fea2c25aae466749",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Eject All Disks",
"updatedAt" : "2020-12-08T15:56:35Z"
},
{
"authors" : [
{
"name" : "Juan Luis Romero",
"url" : "https:\/\/github.com\/JuanluR8"
}
],
"createdAt" : "2021-09-27T19:10:12+02:00",
"currentDirectoryPath" : null,
"description" : "Show free space in your mounted disks",
"filename" : "disk-free.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "💾"
},
"identifier" : "4d24ea15b68e1be01b6a06843150c795",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Disk Free",
"updatedAt" : "2021-09-28T06:22:27Z"
},
{
"authors" : [
{
"name" : "Astrit Malsia",
"url" : "https:\/\/github.com\/astrit"
}
],
"createdAt" : "2021-10-26T02:13:10+02:00",
"currentDirectoryPath" : null,
"description" : "Copy Wi-Fi password from current session",
"filename" : "wifi-password.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "📟"
},
"identifier" : "3da4fa8456e609ec2fd7fbadf9ab49a0",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Copy Wi-Fi Password",
"updatedAt" : "2021-11-03T20:29:35Z"
},
{
"authors" : [
{
"name" : "Astrit",
"url" : "https:\/\/github.com\/astrit"
}
],
"createdAt" : "2021-11-07T13:19:22+01:00",
"currentDirectoryPath" : null,
"description" : "A script command to enable and disable .DS_Store",
"filename" : "toggle-ds-store.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🧬"
},
"identifier" : "3c4ebd8411dc67d65ea9d93787e1cfe1",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Toggle .DS_Store",
"updatedAt" : "2021-11-07T13:19:22+01:00"
},
{
"authors" : [
{
"name" : "Jesse Claven",
"url" : "https:\/\/github.com\/jesse-c"
}
],
"createdAt" : "2021-04-27T06:02:41Z",
"currentDirectoryPath" : null,
"description" : "Show disk usage for \/ (root)",
"filename" : "disk-usage.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "💿"
},
"identifier" : "aadf056d506a2abb91cef252e2e7a1f6",
"isTemplate" : false,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : "1m",
"schemaVersion" : 1,
"title" : "Disk Usage",
"updatedAt" : "2021-04-27T06:02:41Z"
},
{
"authors" : [
{
"name" : "Jax0rz",
"url" : null
}
],
"createdAt" : "2020-12-27T13:59:31+08:00",
"currentDirectoryPath" : null,
"description" : "Create New File in Finder is a script to make your Finder better.You can use this script to create a plain text file.",
"filename" : "create-new-file-in-finder.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/new-file.png"
},
"identifier" : "e070238afa3a97fcd9b65cc1766a6959",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Create New File in Finder",
"updatedAt" : "2020-12-30T22:13:18+08:00"
},
{
"authors" : [
{
"name" : "Yan Smaliak",
"url" : "https:\/\/github.com\/ysmaliak"
}
],
"createdAt" : "2021-06-23T19:47:11+03:00",
"currentDirectoryPath" : null,
"description" : "Shows caffeinate status",
"filename" : "caffeinate-status.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "☕️"
},
"identifier" : "983e3f9a1dd803134bc1cd49ace17de2",
"isTemplate" : false,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : false,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : "30s",
"schemaVersion" : 1,
"title" : "Caffeinate",
"updatedAt" : "2021-06-23T19:47:11+03:00"
},
{
"authors" : [
{
"name" : "xxchan",
"url" : "https:\/\/github.com\/xxchan"
}
],
"createdAt" : "2023-01-31T01:00:23+01:00",
"currentDirectoryPath" : null,
"description" : "Open Image from Clipboard in Preview for OCR or other purposes.",
"filename" : "open-image-from-clipboard.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "📋"
},
"identifier" : "02b393208c74661deadfc66ddf16da87",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Clipboard",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open Image",
"updatedAt" : "2023-01-31T01:00:23+01:00"
},
{
"authors" : [
{
"name" : "Brandon Escamilla",
"url" : "https:\/\/github.com\/brandonescamilla"
}
],
"createdAt" : "2021-02-24T14:05:17-06:00",
"currentDirectoryPath" : null,
"description" : "Opens default email application, and creates a new email with the given inputs.",
"filename" : "new-email.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "📧"
},
"identifier" : "d6d20418f4f0ebfa5a7a77a7bc9f0458",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Create Email",
"updatedAt" : "2021-02-25T10:47:45Z"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-11-22T12:35:00-05:00",
"currentDirectoryPath" : null,
"description" : "Report process with largest system RAM usage.",
"filename" : "largest-ram-process.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "📈"
},
"identifier" : "440bfcf128135809ae63ab885832e3f1",
"isTemplate" : false,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : "3m",
"schemaVersion" : 1,
"title" : "Largest RAM Process",
"updatedAt" : "2020-11-28T13:04:44-05:00"
},
{
"authors" : [
{
"name" : "Zach Dawson",
"url" : "https:\/\/raycast.com\/zdawz"
}
],
"createdAt" : "2023-12-22T08:19:14-06:00",
"currentDirectoryPath" : null,
"description" : "Resets the macOS Launchpad to its default state",
"filename" : "reset-launchpad.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🚀"
},
"identifier" : "1c9956877da036e214c52ae82f128cb1",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Reset Launchpad",
"updatedAt" : "2023-12-22T14:21:54Z"
},
{
"authors" : [
{
"name" : "Kailash Yellareddy",
"url" : "https:\/\/github.com\/kyellareddy"
}
],
"createdAt" : "2023-07-03T17:20:46-07:00",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "Network Info.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🛜"
},
"identifier" : "83cefb2a99e7b3a81e177ccef088a8f3",
"isTemplate" : false,
"language" : "python",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Network Info",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Network Info",
"updatedAt" : "2023-07-04T10:01:20Z"
},
{
"authors" : [
{
"name" : "Juan Luis Romero",
"url" : "https:\/\/github.com\/JuanluR8"
}
],
"createdAt" : "2024-04-22T08:23:25+02:00",
"currentDirectoryPath" : null,
"description" : "Display CPU usage percent",
"filename" : "inline-cpu-usage-percent.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🖥️"
},
"identifier" : "88b8ff2c77f987a58eadc153ac8e9629",
"isTemplate" : false,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : "10s",
"schemaVersion" : 1,
"title" : "CPU Usage",
"updatedAt" : "2024-04-22T06:25:56Z"
},
{
"authors" : [
{
"name" : "aaqifshafi",
"url" : "https:\/\/github.com\/aaqifshafi"
}
],
"createdAt" : "2025-10-24T17:32:55+05:30",
"currentDirectoryPath" : null,
"description" : "Kill running processes on the given ports",
"filename" : "kill-a-process-on-port.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🚫"
},
"identifier" : "71d24aef7a640392ef09a32800fd05e3",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Kill A Process On Port",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Kill a process on PORT",
"updatedAt" : "2025-10-24T17:32:55+05:30"
},
{
"authors" : [
{
"name" : "Felipe Turcheti",
"url" : "https:\/\/felipeturcheti.com"
}
],
"createdAt" : "2021-06-14T14:36:05-03:00",
"currentDirectoryPath" : null,
"description" : "Flush DNS cache",
"filename" : "flush-dns.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "💨"
},
"identifier" : "63e51cac9289a2734e161cc8306805b4",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Flush DNS",
"updatedAt" : "2021-06-14T14:36:05-03:00"
},
{
"authors" : [
{
"name" : "Angelos Michalopoulos",
"url" : null
}
],
"createdAt" : "2024-11-18T17:33:08+02:00",
"currentDirectoryPath" : null,
"description" : "Get One-Time Password (OTP) from Apple Password Manager",
"filename" : "otp.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🔑"
},
"identifier" : "7115fa08d182688291508d427a6ce246",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "One-Time Password",
"updatedAt" : "2024-11-18T17:33:08+02:00"
},
{
"authors" : [
{
"name" : "Raycast",
"url" : "https:\/\/raycast.com"
}
],
"createdAt" : "2020-09-30T12:57:18+01:00",
"currentDirectoryPath" : null,
"description" : "A script command to show and hide icons of Desktop folder",
"filename" : "toggle-desktop-icons.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🖥"
},
"identifier" : "a7b34fe82f84acdef7c4ca687a7dbad8",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Toggle Desktop Icons",
"updatedAt" : "2022-01-15T18:22:57+08:00"
},
{
"authors" : [
{
"name" : "Vincent Dörig",
"url" : "https:\/\/github.com\/vincentdoerig"
}
],
"createdAt" : "2021-01-07T22:11:14+01:00",
"currentDirectoryPath" : null,
"description" : "Toggle your Wi-Fi connection.",
"filename" : "wifi.template.applescript",
"hasArguments" : false,
"icon" : {
"dark" : "images\/wifi.png",
"light" : "images\/wifi-dark.png"
},
"identifier" : "a67b13df28ceb5db8ea7a322df56a3b3",
"isTemplate" : true,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Toggle Wi-Fi",
"updatedAt" : "2021-01-11T18:50:50+01:00"
},
{
"authors" : null,
"createdAt" : "2020-11-05T19:09:05Z",
"currentDirectoryPath" : null,
"description" : "Copy the last downloaded file to the clipboard.",
"filename" : "copy-last-download.swift",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "💁"
},
"identifier" : "19d49b55a44b69e9229b63c27724c02f",
"isTemplate" : false,
"language" : "swift",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Copy Last Download",
"updatedAt" : "2020-12-08T15:56:35Z"
},
{
"authors" : null,
"createdAt" : "2020-11-05T19:08:41Z",
"currentDirectoryPath" : null,
"description" : "Copies the calendar availability of today.",
"filename" : "copy-availability.swift",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "📅"
},
"identifier" : "7f78eb54a08af1d516202dd647999a27",
"isTemplate" : false,
"language" : "swift",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Copy Availability",
"updatedAt" : "2022-08-08T14:02:44+02:00"
},
{
"authors" : [
{
"name" : "Wiley Marques",
"url" : "https:\/\/twitter.com\/wileymarques"
}
],
"createdAt" : "2021-04-29T12:05:47-03:00",
"currentDirectoryPath" : null,
"description" : "Script Command to change natural trackpad\/mouse scrolling setting. Reverting the setting value each time.",
"filename" : "toggle-natural-scrolling.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🖱"
},
"identifier" : "ebea0e4ea60f055ea23d01a8feaf7605",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Toggle Natural Scrolling",
"updatedAt" : "2024-04-25T21:10:36+05:45"
},
{
"authors" : [
{
"name" : "Kailash Yellareddy",
"url" : "https:\/\/github.com\/kyellareddy"
}
],
"createdAt" : "2023-07-03T14:02:07-07:00",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "Low Power Mode.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🔋"
},
"identifier" : "abb0ce225a8aa3cc33d242788d9fbc94",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Low Power Mode",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Low Power Mode",
"updatedAt" : "2023-07-03T21:06:13Z"
},
{
"authors" : null,
"createdAt" : "2020-10-19T11:37:24+01:00",
"currentDirectoryPath" : null,
"description" : "Copies the last screenshot to the clipboard.",
"filename" : "copy-last-screenshot.swift",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "📸"
},
"identifier" : "adddad32ea0805637e3ede7ea4799468",
"isTemplate" : false,
"language" : "swift",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Copy Last Screenshot",
"updatedAt" : "2020-12-08T15:56:35Z"
},
{
"authors" : [
{
"name" : "Felipe Turcheti",
"url" : "https:\/\/felipeturcheti.com"
}
],
"createdAt" : "2024-08-05T09:48:29-06:00",
"currentDirectoryPath" : null,
"description" : "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.",
"filename" : "copy-selection-to-clipboard.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "??"
},
"identifier" : "c76e2bb24d45b402577be451771a6171",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Copy Finder Selection to Clipboard",
"updatedAt" : "2024-08-05T09:48:29-06:00"
},
{
"authors" : [
{
"name" : "Yufei Kang",
"url" : "kangyufei.net"
},
{
"name" : "LanikSJ",
"url" : "https:\/\/github.com\/LanikSJ"
}
],
"createdAt" : "2022-04-20T11:03:29-07:00",
"currentDirectoryPath" : null,
"description" : "Save Image From Clipboard",
"filename" : "save-image-from-clipboard.py",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🤖"
},
"identifier" : "9b9abd66aac59663e406febe5530ed84",
"isTemplate" : false,
"language" : "python",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Clipboard",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Save Image From Clipboard",
"updatedAt" : "2022-05-28T15:53:15+09:00"
},
{
"authors" : null,
"createdAt" : "2020-09-30T12:56:01+01:00",
"currentDirectoryPath" : null,
"description" : "Restarts computer.",
"filename" : "restart.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "♻️"
},
"identifier" : "f8b93ee900b7689ca9709b9dc26b6489",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Restart",
"updatedAt" : "2020-12-08T15:56:35Z"
},
{
"authors" : [
{
"name" : "Gustavo Santana",
"url" : "https:\/\/github.com\/gumadeiras"
}
],
"createdAt" : "2021-05-28T10:21:59-04:00",
"currentDirectoryPath" : null,
"description" : "Force kill a running process",
"filename" : "kill-process.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "⚠️"
},
"identifier" : "d9997f08d544ad8daea8a0e8ffa3ff67",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Kill Running Process",
"updatedAt" : "2021-05-28T10:21:59-04:00"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-11-16T16:22:21-05:00",
"currentDirectoryPath" : null,
"description" : "Turn off \"do not disturb\" mode. Does [not work on Big Sur](https:\/\/github.com\/sindresorhus\/do-not-disturb-cli\/issues\/2).",
"filename" : "dnd-off.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "😴"
},
"identifier" : "cbf4272986da4e74e4c985f1dde580fd",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Turn Off Do Not Disturb",
"updatedAt" : "2020-11-29T19:34:24-05:00"
},
{
"authors" : [
{
"name" : "Alexandru Turcanu",
"url" : "https:\/\/github.com\/Pondorasti"
}
],
"createdAt" : "2021-03-07T17:33:55-08:00",
"currentDirectoryPath" : null,
"description" : "Get current network connections.",
"filename" : "network-status.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "📶"
},
"identifier" : "3ad91860d37f423dfb97bc3e5737e369",
"isTemplate" : false,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : "1m",
"schemaVersion" : 1,
"title" : "Network Status",
"updatedAt" : "2021-03-11T11:38:48-08:00"
},
{
"authors" : null,
"createdAt" : "2025-09-05T10:08:41-05:00",
"currentDirectoryPath" : null,
"description" : "Copies a summary of today's meetings to the clipboard.",
"filename" : "meeting_summary_script.swift",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "📝"
},
"identifier" : "3542086084234d14d5e94041c7c2915b",
"isTemplate" : false,
"language" : "swift",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Copy Meeting Summary",
"updatedAt" : "2025-09-05T10:08:41-05:00"
},
{
"authors" : null,
"createdAt" : "2020-09-30T12:56:01+01:00",
"currentDirectoryPath" : null,
"description" : "Shuts down computer.",
"filename" : "shutdown.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🛌"
},
"identifier" : "e769db5b986361ec1d91728682177a0f",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Shut Down",
"updatedAt" : "2020-12-08T15:56:35Z"
},
{
"authors" : [
{
"name" : "Amir Hossein SamadiPour",
"url" : "https:\/\/github.com\/SamadiPour"
}
],
"createdAt" : "2022-08-06T01:15:04+04:30",
"currentDirectoryPath" : null,
"description" : "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).",
"filename" : "toggle-battery-charging.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🔋"
},
"identifier" : "9ef75d2415c5c413099e591710f0c054",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Toggle Battery Charging",
"updatedAt" : "2022-08-18T12:53:36Z"
},
{
"authors" : [
{
"name" : "AlexGadd",
"url" : "https:\/\/raycast.com\/AlexGadd"
}
],
"createdAt" : "2025-10-25T01:03:45+13:00",
"currentDirectoryPath" : null,
"description" : "Takes your clipboard then types each character in the clipboard",
"filename" : "paste-clipboard.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "📋"
},
"identifier" : "b6b6c23a4d07188552b17cba337131f8",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Type Clipboard in Search",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Type Clipboard",
"updatedAt" : "2025-11-04T23:39:34+13:00"
},
{
"authors" : null,
"createdAt" : "2020-09-30T12:56:01+01:00",
"currentDirectoryPath" : null,
"description" : "Puts computer to sleep.",
"filename" : "sleep.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "😴"
},
"identifier" : "c132dfd91b11f3580b63945272683ea8",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Sleep",
"updatedAt" : "2020-12-08T15:56:35Z"
},
{
"authors" : [
{
"name" : "Ivan Rybalko",
"url" : "https:\/\/github.com\/ivribalko"
}
],
"createdAt" : "2023-09-06T00:16:33-04:00",
"currentDirectoryPath" : null,
"description" : "Prevent sleep from closing laptop lid (clamshell mode)",
"filename" : "toggle-lid-sleep.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🐚"
},
"identifier" : "417db530f5bb78e762778ce4c5904d26",
"isTemplate" : false,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Toggle Lid Sleep",
"updatedAt" : "2023-09-07T11:09:47-04:00"
},
{
"authors" : [
{
"name" : "Felipe Turcheti",
"url" : "https:\/\/felipeturcheti.com"
}
],
"createdAt" : "2021-04-14T12:11:14-03:00",
"currentDirectoryPath" : null,
"description" : "Open selected items in Finder with the given application.",
"filename" : "open-selection-with.applescript",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🗃"
},
"identifier" : "b1987f2e21f020ceee84b57772d3f15a",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open Selection With",
"updatedAt" : "2021-07-23T17:36:34-04:00"
},
{
"authors" : [
{
"name" : "Quentin Eude",
"url" : "https:\/\/www.github.com\/qeude"
}
],
"createdAt" : "2021-05-27T23:18:58+02:00",
"currentDirectoryPath" : null,
"description" : "Updates community Script Commands to their last available version from the GitHub repository.",
"filename" : "update-scripts-command.template.py",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "♻️"
},
"identifier" : "13f3f5d751ba32a69ff8268898874db8",
"isTemplate" : true,
"language" : "python",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Utilities",
"path" : "system\/",
"refreshTime" : "1d",
"schemaVersion" : 1,
"title" : "Update Community Scripts",
"updatedAt" : "2021-07-23T17:37:52-04:00"
}
],
"subGroups" : [
{
"name" : "VPN",
"path" : "vpn",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Alexandru Turcanu",
"url" : "https:\/\/github.com\/Pondorasti"
}
],
"createdAt" : "2021-03-04T18:45:43-08:00",
"currentDirectoryPath" : null,
"description" : "Stop VPN connection.",
"filename" : "vpn-status.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "📡"
},
"identifier" : "e9c6739e7bcaf94d8b07432be4faaacf",
"isTemplate" : false,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "VPN",
"path" : "system\/vpn\/",
"refreshTime" : "1m",
"schemaVersion" : 1,
"title" : "VPN Status",
"updatedAt" : "2021-03-13T13:30:31-08:00"
},
{
"authors" : [
{
"name" : "Alexandru Turcanu",
"url" : "https:\/\/github.com\/Pondorasti"
}
],
"createdAt" : "2021-03-04T18:45:43-08:00",
"currentDirectoryPath" : null,
"description" : "Stop VPN connection.",
"filename" : "vpn-stop.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "📡"
},
"identifier" : "53cbd464f25c9755071a1e7c119b2b44",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "VPN",
"path" : "system\/vpn\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Disconnect",
"updatedAt" : "2021-03-05T15:58:14-08:00"
},
{
"authors" : [
{
"name" : "Alexandru Turcanu",
"url" : "https:\/\/github.com\/Pondorasti"
}
],
"createdAt" : "2021-03-04T18:44:00-08:00",
"currentDirectoryPath" : null,
"description" : "Start VPN connection.",
"filename" : "vpn-start.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "📡"
},
"identifier" : "c92872a6233d078b2eb41eb0e4b9faa8",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "VPN",
"path" : "system\/vpn\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Connect",
"updatedAt" : "2021-03-06T21:56:49-08:00"
}
]
},
{
"name" : "Magic Keyboard Switcher",
"path" : "magic-keyboard-switcher",
"readme" : "system\/magic-keyboard-switcher\/README.md",
"scriptCommands" : [
{
"authors" : [
{
"name" : "blastik",
"url" : "https:\/\/github.com\/blastik"
}
],
"createdAt" : "2025-09-24T17:50:16+02:00",
"currentDirectoryPath" : null,
"description" : "Switch a single magic keyboard between computers",
"filename" : "magic-keyboard-switcher.template.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/logo.png"
},
"identifier" : "ebd6d04790272dd639e870be745a66db",
"isTemplate" : true,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/magic-keyboard-switcher\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Magic Keyboard switcher",
"updatedAt" : "2025-09-24T17:59:07+02:00"
}
]
},
{
"name" : "Vpnutil",
"path" : "vpnutil",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Sergey Fuksman",
"url" : "https:\/\/github.com\/fuksman"
}
],
"createdAt" : "2021-10-08T20:08:21+03:00",
"currentDirectoryPath" : null,
"description" : "Start VPN connection.",
"filename" : "vpnutil-start.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "📡"
},
"identifier" : "b65509f00ff96881390957a20ef127da",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "VPN",
"path" : "system\/vpnutil\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Start VPN",
"updatedAt" : "2021-10-08T20:08:21+03:00"
},
{
"authors" : [
{
"name" : "Sergey Fuksman",
"url" : "https:\/\/github.com\/fuksman"
}
],
"createdAt" : "2021-10-08T20:08:21+03:00",
"currentDirectoryPath" : null,
"description" : "Stop VPN connection",
"filename" : "vpnutil-stop.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "📡"
},
"identifier" : "bedab222fcfd49e2dd9c66d87ac8262e",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "VPN",
"path" : "system\/vpnutil\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Stop VPN",
"updatedAt" : "2021-10-08T20:08:21+03:00"
},
{
"authors" : [
{
"name" : "Sergey Fuksman",
"url" : "https:\/\/github.com\/fuksman"
}
],
"createdAt" : "2021-10-08T20:08:21+03:00",
"currentDirectoryPath" : null,
"description" : "Check VPN connection",
"filename" : "vpnutil-status.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "📡"
},
"identifier" : "9673d2c49273541b6cb9d367f1c89946",
"isTemplate" : false,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "VPN",
"path" : "system\/vpnutil\/",
"refreshTime" : "30s",
"schemaVersion" : 1,
"title" : "VPN Status",
"updatedAt" : "2021-10-08T20:08:21+03:00"
},
{
"authors" : [
{
"name" : "Sergey Fuksman",
"url" : "https:\/\/github.com\/fuksman"
}
],
"createdAt" : "2021-10-08T20:08:21+03:00",
"currentDirectoryPath" : null,
"description" : "Toggle VPN connection",
"filename" : "vpnutil-toggle.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "📡"
},
"identifier" : "362f65162d24f126ffdabdf0c773d358",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "VPN",
"path" : "system\/vpnutil\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Toggle VPN",
"updatedAt" : "2021-10-08T20:08:21+03:00"
}
]
},
{
"name" : "Audio",
"path" : "audio",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Quentin Eude",
"url" : "https:\/\/www.github.com\/qeude"
}
],
"createdAt" : "2021-05-11T13:56:09+02:00",
"currentDirectoryPath" : null,
"description" : "Get the current battery status of your AirPods.",
"filename" : "airpodsbattery.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "⚡️"
},
"identifier" : "2c840755252ffd42ed783bcfb4134f56",
"isTemplate" : false,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Audio",
"path" : "system\/audio\/",
"refreshTime" : "10m",
"schemaVersion" : 1,
"title" : "AirPods Battery Level",
"updatedAt" : "2022-02-07T20:12:21-05:00"
},
{
"authors" : [
{
"name" : "Nichlas W. Andersen",
"url" : "https:\/\/github.com\/itsnwa"
}
],
"createdAt" : "2021-01-27T15:25:23+01:00",
"currentDirectoryPath" : null,
"description" : "Toggle AirPods bluetooth device",
"filename" : "toggle-airpods.template.swift",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/airpod.png"
},
"identifier" : "e8755f7caafc73caae63ce7c94750cdf",
"isTemplate" : true,
"language" : "swift",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Audio",
"path" : "system\/audio\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Toggle AirPods",
"updatedAt" : "2021-04-16T19:18:39+03:00"
},
{
"authors" : [
{
"name" : "Mortada Sarheed",
"url" : "https:\/\/github.com\/mSarheed"
}
],
"createdAt" : "2023-02-03T08:45:57+01:00",
"currentDirectoryPath" : null,
"description" : "Get the battery level of your bluetooth headphones",
"filename" : "bluetooth-headphones-battery-level.template.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🎧"
},
"identifier" : "0e6a4e95c4fef0b4d461f56d1ab20367",
"isTemplate" : true,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Audio",
"path" : "system\/audio\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Headphones Battery Level",
"updatedAt" : "2023-02-03T07:51:37Z"
},
{
"authors" : [
{
"name" : "mmerle",
"url" : "https:\/\/github.com\/mmerle"
}
],
"createdAt" : "2021-01-27T12:34:54-05:00",
"currentDirectoryPath" : null,
"description" : "Switch audio output to desired device.",
"filename" : "audio-output-switch.template.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🔊"
},
"identifier" : "8dd25c9a462a193eb17953c7190d9772",
"isTemplate" : true,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Audio",
"path" : "system\/audio\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Switch Audio to ",
"updatedAt" : "2021-11-07T15:24:00-05:00"
},
{
"authors" : [
{
"name" : "Maxim Krouk",
"url" : "https:\/\/github.com\/maximkrouk"
}
],
"createdAt" : "2020-11-25T18:28:38+03:00",
"currentDirectoryPath" : null,
"description" : "Reloads CoreAudio.",
"filename" : "reload-coreaudio.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🎧"
},
"identifier" : "580b49c0d52425d9cab1cd4ac703fd44",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/audio\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Reload CoreAudio",
"updatedAt" : "2021-04-16T19:18:39+03:00"
},
{
"authors" : [
{
"name" : "Annie Ma",
"url" : "http:\/\/www.anniema.co\/"
}
],
"createdAt" : "2024-01-26T14:05:08-08:00",
"currentDirectoryPath" : null,
"description" : "Toggles notification sounds.",
"filename" : "toggle-mute-notification-sounds.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🔔"
},
"identifier" : "a3b32fd55c23706603f24da4c74fd8d0",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/audio\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Toggle Mute Notifcation Sounds",
"updatedAt" : "2024-02-01T16:53:25Z"
},
{
"authors" : [
{
"name" : "Roland Leth",
"url" : "https:\/\/runtimesharks.com"
}
],
"createdAt" : "2021-04-16T19:19:51+03:00",
"currentDirectoryPath" : null,
"description" : "Lists all audio devices",
"filename" : "get-audio-devices.swift",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🔈"
},
"identifier" : "cf5a5edf5cd9fc9c369f149911456157",
"isTemplate" : false,
"language" : "swift",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Audio",
"path" : "system\/audio\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Audio devices",
"updatedAt" : "2022-04-24T19:49:41+08:00"
},
{
"authors" : [
{
"name" : "Roland Leth",
"url" : "https:\/\/runtimesharks.com"
}
],
"createdAt" : "2021-04-16T19:19:51+03:00",
"currentDirectoryPath" : null,
"description" : "Shows the selected audio devices for input and output",
"filename" : "get-selected-audio-device.swift",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🔈"
},
"identifier" : "d8885d2f00ea821ec2656fd57afb7651",
"isTemplate" : false,
"language" : "swift",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Audio",
"path" : "system\/audio\/",
"refreshTime" : "10m",
"schemaVersion" : 1,
"title" : "Audio devices",
"updatedAt" : "2022-04-24T19:49:41+08:00"
},
{
"authors" : [
{
"name" : "Roland Leth",
"url" : "https:\/\/runtimesharks.com"
}
],
"createdAt" : "2021-04-16T19:19:51+03:00",
"currentDirectoryPath" : null,
"description" : "Sets the input (i), the output (o) or both (b) audio sources, based on name. If `both` is passed, but no input or output device is found with the given name, it will still try to set the other one. For example, if you're trying to set both to \"External mic\", which doesn't have an input source, it will still set the output to the mic; vice-versa for a speaker.",
"filename" : "set-audio-device.swift",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🎧"
},
"identifier" : "c53a8be130421322b399134699321dd3",
"isTemplate" : false,
"language" : "swift",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Audio",
"path" : "system\/audio\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Set audio device",
"updatedAt" : "2022-04-24T19:49:41+08:00"
},
{
"authors" : [
{
"name" : "Matthew Morek",
"url" : "https:\/\/github.com\/matthewmorek"
}
],
"createdAt" : "2021-02-18T12:31:04Z",
"currentDirectoryPath" : null,
"description" : "Toggles microphone.",
"filename" : "toggle-mic.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🎙"
},
"identifier" : "f429f9a5cb87014a029d0a64cc5ce0f5",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "System",
"path" : "system\/audio\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Toggle Microphone",
"updatedAt" : "2021-04-16T19:18:39+03:00"
}
]
}
]
},
{
"name" : "Dashboards",
"path" : "dashboards",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Sam Wright",
"url" : "https:\/\/raycast.com\/samywamy10"
}
],
"createdAt" : "2024-04-11T17:21:31+10:00",
"currentDirectoryPath" : null,
"description" : "Runs an iPerf Speed Test.",
"filename" : "iperf-speed-test.template.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "💾"
},
"identifier" : "804d7f7d15474c0b6f5798afa59badee",
"isTemplate" : true,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "iPerf",
"path" : "dashboards\/",
"refreshTime" : "1h",
"schemaVersion" : 1,
"title" : "Speed Test",
"updatedAt" : "2024-04-11T07:23:05Z"
}
]
},
{
"name" : "Ai",
"path" : "ai",
"scriptCommands" : [
],
"subGroups" : [
{
"name" : "Gemini",
"path" : "gemini",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Est7",
"url" : "https:\/\/github.com\/est7"
},
{
"name" : "Nimo Beeren",
"url" : "https:\/\/github.com\/nimobeeren"
}
],
"createdAt" : "2025-04-24T11:38:46+08:00",
"currentDirectoryPath" : null,
"description" : "Open Gemini in Chrome browser and submit a prompt with optional selected text as context",
"filename" : "gemini.js",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : ".\/images\/icon-gemini.svg"
},
"identifier" : "2a9c8b6698663cc8834ace7501bc9bec",
"isTemplate" : false,
"language" : "node",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Gemini",
"path" : "ai\/gemini\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Ask Gemini",
"updatedAt" : "2025-05-13T08:32:11Z"
}
]
}
]
},
{
"name" : "Developer Utils",
"path" : "developer-utils",
"scriptCommands" : [
{
"authors" : null,
"createdAt" : "2020-09-30T12:56:01+01:00",
"currentDirectoryPath" : null,
"description" : "Escapes shell character string and copies it again.",
"filename" : "escape-shell-chars.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "💻"
},
"identifier" : "3556af78a49b7e2967aaf62fdf7af394",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Developer Utilities",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Escape String for Shell",
"updatedAt" : "2020-12-09T22:19:19Z"
},
{
"authors" : [
{
"name" : "Tommaso Panozzo",
"url" : null
}
],
"createdAt" : "2021-01-19T19:47:37+01:00",
"currentDirectoryPath" : null,
"description" : "Perform a dig command with the specified options",
"filename" : "dig.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🌍"
},
"identifier" : "76e8a2bdb0755914ef14a8ace3a58bfd",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Internet",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Dig",
"updatedAt" : "2021-01-20T15:45:08+01:00"
},
{
"authors" : [
{
"name" : "es183923",
"url" : null
}
],
"createdAt" : "2021-06-21T19:28:31-04:00",
"currentDirectoryPath" : null,
"description" : "Counts the characters of either the clipboard or the passed argument",
"filename" : "count-characters.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🤖"
},
"identifier" : "a33b175caa4abccee75bc6ad6d6b5e67",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Developer Utilities",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Count Characters Bash",
"updatedAt" : "2021-06-23T07:27:53Z"
},
{
"authors" : [
{
"name" : "Stephen Kaplan",
"url" : "https:\/\/github.com\/SKaplanOfficial"
}
],
"createdAt" : "2023-11-08T05:45:01-05:00",
"currentDirectoryPath" : null,
"description" : "Opens the Scripting Dictionary for the given application, defaulting to the active application if none is provided.",
"filename" : "view-scripting-dictionary.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "📖"
},
"identifier" : "2185a0ecf69c65f22c0ce316008c1bfb",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Developer Utils",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "View Scripting Dictionary",
"updatedAt" : "2023-11-08T05:45:01-05:00"
},
{
"authors" : [
{
"name" : "Nitin Gupta",
"url" : "https:\/\/twitter.com\/gniting"
}
],
"createdAt" : "2021-01-21T22:44:40+01:00",
"currentDirectoryPath" : null,
"description" : "Transform the case of clipboard content. Defaults to lower case if no conversion type is specified.",
"filename" : "transform-case.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🔠"
},
"identifier" : "92d1c03818363583b0df10944cdc072d",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Developer Utils",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Transform Case",
"updatedAt" : "2021-01-24T20:18:06Z"
},
{
"authors" : [
{
"name" : "Bin Hua",
"url" : "https:\/\/github.com\/hzb"
}
],
"createdAt" : "2021-03-26T16:54:25+08:00",
"currentDirectoryPath" : null,
"description" : "Decode the base64 string ",
"filename" : "base64-decode-input.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🔓"
},
"identifier" : "cf858f45021ed3976ffa1cd6ac33f582",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : false,
"packageName" : "Developer Utilities",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Base64 Decode",
"updatedAt" : "2021-03-26T10:57:36+01:00"
},
{
"authors" : null,
"createdAt" : "2020-12-09T16:57:40+01:00",
"currentDirectoryPath" : null,
"description" : "Encodes clipboard content url and copies it again.",
"filename" : "encode-url.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "💻"
},
"identifier" : "e03f480894d930f587385b48fdced736",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Developer Utilities",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Encode URL",
"updatedAt" : "2020-12-09T16:57:40+01:00"
},
{
"authors" : null,
"createdAt" : "2020-09-30T12:56:01+01:00",
"currentDirectoryPath" : null,
"description" : "Encodes clipboard content to Base64 and copies it again.",
"filename" : "encode-base64.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "💻"
},
"identifier" : "80c6334563b22e1d01c5913e6d871f77",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Developer Utilities",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Encode Base64",
"updatedAt" : "2020-12-08T15:56:35Z"
},
{
"authors" : null,
"createdAt" : "2020-09-30T15:49:35+02:00",
"currentDirectoryPath" : null,
"description" : "Decodes JSON web token from the clipboard.",
"filename" : "decode-jwt.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/jwt-logo.png"
},
"identifier" : "51e8857c2a5589de87c92ea2f20af7a9",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Developer Utilities",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Decode JWT",
"updatedAt" : "2020-12-08T15:56:35Z"
},
{
"authors" : [
{
"name" : "everdrone",
"url" : "https:\/\/github.com\/everdrone"
}
],
"createdAt" : "2021-06-14T20:09:49+02:00",
"currentDirectoryPath" : null,
"description" : "Generates an iOS style password",
"filename" : "genpasswd.py",
"hasArguments" : true,
"icon" : {
"dark" : "images\/genpasswd-iconDark.png",
"light" : "images\/genpasswd.png"
},
"identifier" : "9dc51af4c249558a100fad853ffcc352",
"isTemplate" : false,
"language" : "python",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Security",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Generate Password",
"updatedAt" : "2022-03-21T14:57:32-04:00"
},
{
"authors" : [
{
"name" : "Jesse Claven",
"url" : "https:\/\/github.com\/jesse-c"
}
],
"createdAt" : "2021-01-04T23:05:52Z",
"currentDirectoryPath" : null,
"description" : "Check if a website is up",
"filename" : "is-it-up.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🌐"
},
"identifier" : "2889ef24ae8d92015ae9500dfc3e704a",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Developer Utils",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Is It Up?",
"updatedAt" : "2023-02-21T22:56:29-05:00"
},
{
"authors" : [
{
"name" : "Andrii Barabash",
"url" : "https:\/\/github.com\/AndriiBarabash"
}
],
"createdAt" : "2025-09-27T20:40:28+02:00",
"currentDirectoryPath" : null,
"description" : "Toggles an SSH SOCKS proxy tunnel on and off.",
"filename" : "toggle_ssh_proxy_tunnel.template.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🔒"
},
"identifier" : "aae74278107ffa5f34b3733eb2c8a813",
"isTemplate" : true,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Developer Utilities",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Toggle SSH SOCKS Tunnel",
"updatedAt" : "2025-09-29T13:44:50Z"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
},
{
"name" : "Ronan Rodrigo Nunes",
"url" : "https:\/\/ronanrodrigo.dev"
}
],
"createdAt" : "2020-10-31T13:18:27-04:00",
"currentDirectoryPath" : null,
"description" : "Whois of URL.",
"filename" : "whois.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🌐"
},
"identifier" : "de0fd04fb4dac9268fcd8c745ab009e4",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Internet",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Whois",
"updatedAt" : "2021-02-19T19:09:37-03:00"
},
{
"authors" : [
{
"name" : "Federico Miraglia",
"url" : "https:\/\/github.com\/Mitra98t"
}
],
"createdAt" : "2021-08-30T10:40:35+02:00",
"currentDirectoryPath" : null,
"description" : "Add or Subtract specified amount of time from given date.",
"filename" : "time-calculator.js",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🕒"
},
"identifier" : "1de7d90505c68023321e8f8e32908e30",
"isTemplate" : false,
"language" : "node",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Developer Utilities",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Time Calculator",
"updatedAt" : "2021-08-30T17:05:39+02:00"
},
{
"authors" : [
{
"name" : "Maxim Krouk",
"url" : "https:\/\/github.com\/maximkrouk"
}
],
"createdAt" : "2020-11-04T15:26:50+03:00",
"currentDirectoryPath" : "~\/Downloads",
"description" : "Records simulator to Downloads folder",
"filename" : "record-simulator.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "📱"
},
"identifier" : "9d80c6864ac75f2e9051fe6b9f0e2186",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : true,
"packageName" : "Developer Utilities",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Record Simulator",
"updatedAt" : "2020-11-27T15:54:09+03:00"
},
{
"authors" : [
{
"name" : "Dean Moore",
"url" : "https:\/\/github.com\/moored"
}
],
"createdAt" : "2021-01-18T10:28:52-05:00",
"currentDirectoryPath" : null,
"description" : "Use [swiftformat](https:\/\/github.com\/nicklockwood\/SwiftFormat) to format clipboard content.",
"filename" : "format-swift.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/swift.png"
},
"identifier" : "e88c615ae9cd3edd3deab50e75554356",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Developer Utilities",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Format Swift",
"updatedAt" : "2021-01-18T10:28:52-05:00"
},
{
"authors" : [
{
"name" : "Senthil Prabhu",
"url" : null
}
],
"createdAt" : "2021-05-15T18:30:49-07:00",
"currentDirectoryPath" : null,
"description" : "Get JSON-formatted text",
"filename" : "json-stringify-text.js",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "💻"
},
"identifier" : "a4b5279dada552a93c9f6a4a2b7515fd",
"isTemplate" : false,
"language" : "node",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Developer Utilities",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Json Stringify Text",
"updatedAt" : "2021-05-15T18:30:49-07:00"
},
{
"authors" : [
{
"name" : "Bin Hua",
"url" : "https:\/\/github.com\/hzb"
}
],
"createdAt" : "2021-03-26T16:54:25+08:00",
"currentDirectoryPath" : null,
"description" : "Hashing any text data by using MD5 ",
"filename" : "md5-hash.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🔐"
},
"identifier" : "33557a7c765e2f161ce57838089fa133",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : false,
"packageName" : "Developer Utilities",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "MD5 Hash",
"updatedAt" : "2021-03-26T10:57:36+01:00"
},
{
"authors" : [
{
"name" : "Kabilan VS",
"url" : "https:\/\/github.com\/KABILAN235"
}
],
"createdAt" : "2021-08-17T13:10:32+05:30",
"currentDirectoryPath" : null,
"description" : "Creates A Flutter Project from Raycast",
"filename" : "flutter-create.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/flutter.png"
},
"identifier" : "c618b8ddac2e75b88bb80f7f992ba09b",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "flutter-create",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Flutter Create Project",
"updatedAt" : "2021-08-17T16:40:16Z"
},
{
"authors" : [
{
"name" : "Vishal Telangre",
"url" : "https:\/\/github.com\/vishaltelangre"
}
],
"createdAt" : "2020-11-30T21:05:51+02:00",
"currentDirectoryPath" : null,
"description" : "Copies full path of the currently focused Finder window",
"filename" : "copy-focused-finder-window-path.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "📁"
},
"identifier" : "6e8e65e874ff14cff3f49c902d7481b9",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Developer Utils",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Copy Focused Finder Window Path",
"updatedAt" : "2022-04-24T12:29:22+05:30"
},
{
"authors" : [
{
"name" : "Angelos Michalopoulos",
"url" : "https:\/\/github.com\/miagg"
}
],
"createdAt" : "2022-08-19T13:26:13+03:00",
"currentDirectoryPath" : null,
"description" : "Copying the default SSH public key to the clipboard",
"filename" : "copy-ssh-public-key.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🔑"
},
"identifier" : "47d77dea587aac1516a1fb3d1ab9408c",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Developer Utils",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Copy SSH Public Key",
"updatedAt" : "2022-08-19T13:26:13+03:00"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-11-09T15:37:42-05:00",
"currentDirectoryPath" : null,
"description" : "Ping an IP address or URL on an interval.",
"filename" : "ping-monitor.template.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🌐"
},
"identifier" : "37d45215abd0ff3284bb55a695316b26",
"isTemplate" : true,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Internet",
"path" : "developer-utils\/",
"refreshTime" : "10m",
"schemaVersion" : 1,
"title" : "Ping Monitor",
"updatedAt" : "2020-11-28T12:02:29-05:00"
},
{
"authors" : [
{
"name" : "Wesley Martin",
"url" : "https:\/\/github.com\/itsmewes"
}
],
"createdAt" : "2020-11-30T21:05:51+02:00",
"currentDirectoryPath" : null,
"description" : "Runs the specified command in the path of the frontmost Finder window.",
"filename" : "run-command-in-finder.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🛠"
},
"identifier" : "1d9d4db0327b77156dd2f3d90bc2178d",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Developer Utils",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Run Command On Front Finder Window",
"updatedAt" : "2022-01-17T18:22:39-08:00"
},
{
"authors" : [
{
"name" : "Thiago Holanda",
"url" : "https:\/\/twitter.com\/tholanda"
}
],
"createdAt" : "2021-06-05T21:07:26+02:00",
"currentDirectoryPath" : null,
"description" : "Search for Script Commands available in the Raycast repository",
"filename" : "search-script-command.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🔎"
},
"identifier" : "15992addc83ee43764382a5e2542d881",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Searches",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search Script Command",
"updatedAt" : "2021-06-05T21:13:58+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-07-04T18:33:53+02:00",
"currentDirectoryPath" : null,
"description" : "Query the cheat.sh service (https:\/\/github.com\/chubin\/cheat.sh). You can change the color style in the script.",
"filename" : "cheat.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/cheat.png"
},
"identifier" : "d9751e4c2bbea57167d0deb109c59ed2",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Developer Utilities",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Query cheat.sh",
"updatedAt" : "2023-09-06T19:19:46-05:00"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-11-29T23:38:39-05:00",
"currentDirectoryPath" : null,
"description" : "Add one or multiple SSH keys to your SSH agent (with Terminal).",
"filename" : "add-ssh-keys.template.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🔑"
},
"identifier" : "0e05c991f24731e6a1e58371f344e642",
"isTemplate" : true,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Developer Utilities",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Add SSH Keys (with Terminal)",
"updatedAt" : "2020-11-30T12:43:15-05:00"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-10-31T13:18:27-04:00",
"currentDirectoryPath" : null,
"description" : "Ping an IP address or URL.",
"filename" : "ping.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🌐"
},
"identifier" : "d54133efdfb60f4a106d5e71bca70d62",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Internet",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Ping",
"updatedAt" : "2020-11-28T12:02:29-05:00"
},
{
"authors" : null,
"createdAt" : "2020-12-09T16:57:40+01:00",
"currentDirectoryPath" : null,
"description" : "Decodes clipboard content url and copies it again.",
"filename" : "decode-url.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "💻"
},
"identifier" : "c2ef9c99c73b7a1d8630561785f9ea8e",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Developer Utilities",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Decode URL",
"updatedAt" : "2020-12-09T16:57:40+01:00"
},
{
"authors" : [
{
"name" : "Nikita Galaiko",
"url" : "https:\/\/github.com\/ngalaiko"
}
],
"createdAt" : "2021-08-18T17:37:27+02:00",
"currentDirectoryPath" : null,
"description" : "Unshortens clipboard content url and copies the result again.",
"filename" : "unshorten-url.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🔗"
},
"identifier" : "51d92211ad21137b75d754f3b9667925",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Developer Utilities",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Unshorten URL",
"updatedAt" : "2021-08-18T17:37:27+02:00"
},
{
"authors" : [
{
"name" : "Bin Hua",
"url" : "https:\/\/github.com\/hzb"
}
],
"createdAt" : "2021-03-26T16:54:25+08:00",
"currentDirectoryPath" : null,
"description" : "Hashing any text data by using SHA1 ",
"filename" : "sha1-hash.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🔐"
},
"identifier" : "1ad5c7f8159fc0dae9adfecbcfca4d8b",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : false,
"packageName" : "Developer Utilities",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "SHA1 Hash",
"updatedAt" : "2021-03-26T10:57:36+01:00"
},
{
"authors" : [
{
"name" : "David Molinero",
"url" : "https:\/\/github.com\/doktor500"
}
],
"createdAt" : "2021-12-20T12:46:48Z",
"currentDirectoryPath" : null,
"description" : "Generates a ULID and copies it to the clipboard.",
"filename" : "generate-ulid.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "💻"
},
"identifier" : "17aae21d1f94cccc5275cb681e873b28",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Developer Utilities",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Generate ULID",
"updatedAt" : "2021-12-20T12:48:58Z"
},
{
"authors" : [
{
"name" : "tiancheng92",
"url" : "https:\/\/github.com\/tiancheng92"
}
],
"createdAt" : "2021-05-04T20:09:17+08:00",
"currentDirectoryPath" : null,
"description" : "Convert the copied JSON into a golang structure.",
"filename" : "json-to-go-struct.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/go.png"
},
"identifier" : "bd5ad11d3fcb36ac7933708b79445f81",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Developer Utilities",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "JSON to Go Struct",
"updatedAt" : "2021-05-04T20:09:17+08:00"
},
{
"authors" : null,
"createdAt" : "2020-09-30T12:56:01+01:00",
"currentDirectoryPath" : null,
"description" : "Generates a UUID and copies it to the clipboard.",
"filename" : "generate-uuid.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "💻"
},
"identifier" : "15e0cdafaec4ea8f9b3238e01492e2b6",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Developer Utilities",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Generate UUID",
"updatedAt" : "2020-12-08T15:56:35Z"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-11-26T03:10:03-05:00",
"currentDirectoryPath" : "~\/Desktop",
"description" : "Run [Pa11y](https:\/\/github.com\/pa11y\/pa11y) web accessibility tool on specified path or URL.",
"filename" : "pa11y.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/pa11y-logo.png"
},
"identifier" : "309d6bde81fe018c53614348ce28d182",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Developer Utilities",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Run Pa11y",
"updatedAt" : "2020-11-28T12:02:29-05:00"
},
{
"authors" : [
{
"name" : "Thomas Paul Mann",
"url" : "https:\/\/github.com\/thomaspaulmann"
}
],
"createdAt" : "2021-02-16T22:31:57Z",
"currentDirectoryPath" : null,
"description" : "Create beautiful images of your code with https:\/\/ray.so",
"filename" : "create-image-from-code.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : ".\/images\/ray-so.png"
},
"identifier" : "88ae1869a8a7487db63e8ff43fb3db43",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Create Image From Code",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Create Image from Code",
"updatedAt" : "2024-03-12T21:01:55+07:00"
},
{
"authors" : [
{
"name" : "Roland Leth",
"url" : "https:\/\/runtimesharks.com"
}
],
"createdAt" : "2021-03-26T10:48:43+02:00",
"currentDirectoryPath" : null,
"description" : "Ignore package folders (node_modules, Pods, etc) from Time Machine backups. They might not be big in size (altough they do add up), but they usually have tens of thousands of files, making backups slower than they should be. Many files are worse than big files when copying. You can also add a Spotlight comment to each file, to easily be able to exclude the same folders from Spotlight indexing (disabled by default).",
"filename" : "ignore-package-folders-time-machine.template.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🧹"
},
"identifier" : "fd4d560b89abd1d877259b62d388d85a",
"isTemplate" : true,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Developer Utilities",
"path" : "developer-utils\/",
"refreshTime" : "1d",
"schemaVersion" : 1,
"title" : "Ignore Package Folders",
"updatedAt" : "2021-05-11T19:04:01+03:00"
},
{
"authors" : [
{
"name" : "Ted Spare",
"url" : "https:\/\/y.at\/🤘🐊🗿🚀"
}
],
"createdAt" : "2021-04-09T14:49:09-04:00",
"currentDirectoryPath" : null,
"description" : "Check the availability of a domain with the Vercel API.",
"filename" : "check-domain.template.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🌐"
},
"identifier" : "6ff5efc0b5b6574ac92dcb9ffb4ba55d",
"isTemplate" : true,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Developer Utils",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Check Domain",
"updatedAt" : "2021-04-09T16:30:08-04:00"
},
{
"authors" : null,
"createdAt" : "2020-10-22T17:56:24+01:00",
"currentDirectoryPath" : null,
"description" : "Copy one paragraph of Lorem Ipsum to clipboard.",
"filename" : "lorem-ipsum.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "📝"
},
"identifier" : "0e5e11aa786ebad91ffd4fa5749560ba",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Developer Utilities",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Copy Lorem Ipsum",
"updatedAt" : "2020-12-08T15:56:35Z"
},
{
"authors" : [
{
"name" : "Achille Lacoin",
"url" : "https:\/\/github.com\/pomdtr"
}
],
"createdAt" : "2021-03-13T18:40:29+01:00",
"currentDirectoryPath" : null,
"description" : "Print the tldr documentation for a command",
"filename" : "tldr.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🤖"
},
"identifier" : "fca22a689bb0bb51b37dd478c37ca23a",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Developer Utils",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Print TLDR doc",
"updatedAt" : "2021-03-16T06:39:37Z"
},
{
"authors" : [
{
"name" : "Boyang Xu",
"url" : "https:\/\/github.com\/BoyangMichael"
}
],
"createdAt" : "2021-02-18T22:35:37+01:00",
"currentDirectoryPath" : null,
"description" : "Run arbitrary bash command and return output in Raycast.",
"filename" : "run-bash-command.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/run-bash-command.png"
},
"identifier" : "29f3afd5e2cbb58c3472b93950e66acc",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Bash Command",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Run Command",
"updatedAt" : "2021-03-03T20:40:04+01:00"
},
{
"authors" : [
{
"name" : "Ronan Rodrigo Nunes",
"url" : "https:\/\/ronanrodrigo.dev"
}
],
"createdAt" : "2021-02-19T19:00:50-03:00",
"currentDirectoryPath" : null,
"description" : "Get info about Apple API errors",
"filename" : "error-info.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "ℹ️"
},
"identifier" : "5d3a49d1e7ac5a244f43ec1e52cdd247",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Developer Utilities",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Error Info",
"updatedAt" : "2021-03-01T16:54:23Z"
},
{
"authors" : [
{
"name" : "decaylala",
"url" : "https:\/\/github.com\/decaylala"
}
],
"createdAt" : "2023-09-05T23:21:57+08:00",
"currentDirectoryPath" : null,
"description" : "Join multiple lines of text from the clipboard into a single line, separated by a specified delimiter.",
"filename" : "join-lines.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🛠"
},
"identifier" : "ed8ed8f5841fbb881efe5a16aef73695",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Developer Utilities",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Join Clipboard Lines by Delimiter",
"updatedAt" : "2023-09-05T15:24:46Z"
},
{
"authors" : [
{
"name" : "Bin Hua",
"url" : "https:\/\/github.com\/hzb"
}
],
"createdAt" : "2021-03-26T16:54:25+08:00",
"currentDirectoryPath" : null,
"description" : "Encode any text data by using base64",
"filename" : "base64-encode-input.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🔐"
},
"identifier" : "413fdbfe4e1e457bcaa4dc47a186f9c8",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : false,
"packageName" : "Developer Utilities",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Base64 Encode",
"updatedAt" : "2021-03-26T10:57:36+01:00"
},
{
"authors" : [
{
"name" : "Annie Ma",
"url" : "http:\/\/www.anniema.co\/"
}
],
"createdAt" : "2024-01-26T02:19:25-07:00",
"currentDirectoryPath" : null,
"description" : "This script deletes the line at cursor position.",
"filename" : "delete-current-line.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "⌨️"
},
"identifier" : "155fc5e8e485cc9d9f7a08797ea68597",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Developer Utilities",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Delete Current Line",
"updatedAt" : "2024-01-26T09:21:48Z"
},
{
"authors" : [
{
"name" : "Nitin Gupta",
"url" : "https:\/\/twitter.com\/gniting"
}
],
"createdAt" : "2021-01-21T16:59:53+01:00",
"currentDirectoryPath" : null,
"description" : "Generate a strong password of requested character length",
"filename" : "strong-password-generator.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🔐"
},
"identifier" : "80a1fdca81c2624ad48f4ce213548c3f",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Developer Utils",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Strong Password Generator",
"updatedAt" : "2021-01-24T20:15:25Z"
},
{
"authors" : null,
"createdAt" : "2020-09-30T12:56:01+01:00",
"currentDirectoryPath" : null,
"description" : "Decodes clipboard content to Base64 and copies it again.",
"filename" : "decode-base64.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "💻"
},
"identifier" : "fb9ce529b10e97d45f16f0509c8de8a4",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Developer Utilities",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Decode Base64",
"updatedAt" : "2020-12-08T15:56:35Z"
},
{
"authors" : [
{
"name" : "Kirill Gorbachyonok",
"url" : "https:\/\/github.com\/japanese-goblinn"
}
],
"createdAt" : "2021-06-14T20:33:34+03:00",
"currentDirectoryPath" : null,
"description" : "This script clears all Xcode related junk.",
"filename" : "clear_xcode.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🧹"
},
"identifier" : "f667f25957f079e625220ac6a9c06c36",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Xcode",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Clear All Related Junk",
"updatedAt" : "2023-02-10T21:22:03-06:00"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2021-07-27T20:25:40-04:00",
"currentDirectoryPath" : null,
"description" : "Copy the current epoch Unix timestamp.",
"filename" : "unix-timestamp.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "⏱️"
},
"identifier" : "ef251d58c5886e790c7388ae3e69ff48",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Developer Utils",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Copy Current Epoch Unix Timestamp",
"updatedAt" : "2021-07-29T11:41:55Z"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-10-30T16:44:15-04:00",
"currentDirectoryPath" : null,
"description" : "Save URL to [Wayback Machine](https:\/\/web.archive.org\/).",
"filename" : "wayback-machine-save.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/ia-logo.jpg"
},
"identifier" : "bca52e4f447bf57ba31d0b6328767d4d",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Internet",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Save URL to Wayback Machine",
"updatedAt" : "2020-11-28T13:47:03-05:00"
},
{
"authors" : [
{
"name" : "Roland Leth",
"url" : "https:\/\/runtimesharks.com"
}
],
"createdAt" : "2021-03-11T14:33:06+02:00",
"currentDirectoryPath" : null,
"description" : "Generates a .gitignore file via https:\/\/gitignore.io",
"filename" : "generate-git-ignore.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🤐"
},
"identifier" : "19cb3794d5961cfc2c000ba8dc1f360b",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Developer Utilities",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Create .gitignore",
"updatedAt" : "2021-03-12T13:26:05+01:00"
},
{
"authors" : null,
"createdAt" : "2020-09-30T12:56:01+01:00",
"currentDirectoryPath" : null,
"description" : "Pretty prints the JSON currently in the clipboard.",
"filename" : "prettify-json.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "💻"
},
"identifier" : "793262298b9e39806d6a8ea2c3cce0d7",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Developer Utilities",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Prettify JSON",
"updatedAt" : "2020-12-08T15:56:35Z"
},
{
"authors" : [
{
"name" : "Tomás Martins",
"url" : "https:\/\/github.com\/tfmart"
}
],
"createdAt" : "2021-08-31T17:46:47-03:00",
"currentDirectoryPath" : null,
"description" : "Opens a URL inside the currently booted iOS Simulator. Can be used to open deeplinks",
"filename" : "open-link-simulator.applescript",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🔗"
},
"identifier" : "3e18b6a937423f4bfd1058e830fe5757",
"isTemplate" : false,
"language" : "applescript",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Developer Utilities",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open Deep Link",
"updatedAt" : "2021-09-01T13:11:06Z"
},
{
"authors" : [
{
"name" : "Kiko Beats",
"url" : "https:\/\/github.com\/kikobeats"
}
],
"createdAt" : "2022-01-03T14:02:54+01:00",
"currentDirectoryPath" : null,
"description" : "Microlink API integration",
"filename" : "microlink.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/microlink.png"
},
"identifier" : "e9302dbc4177d6533a9279fd03436425",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Microlink",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Microlink API",
"updatedAt" : "2022-01-05T11:19:54+01:00"
},
{
"authors" : null,
"createdAt" : "2020-09-30T13:01:03+01:00",
"currentDirectoryPath" : null,
"description" : "Clear the derived data of Xcode.",
"filename" : "clear-derived-data.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🧹"
},
"identifier" : "ccd9291be77cdeda87ed3b37bfc25085",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Xcode",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Clear Derived Data",
"updatedAt" : "2020-12-08T15:56:35Z"
},
{
"authors" : [
{
"name" : "Saimir S.",
"url" : "https:\/\/www.saimirsulaj.com"
}
],
"createdAt" : "2021-05-27T00:08:52-07:00",
"currentDirectoryPath" : null,
"description" : "Utility to convert numbers between bases. Can be one number or a list of string-delimited numbers.",
"filename" : "base-converter.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🤖"
},
"identifier" : "daefa8c3358b3663e42f53aa3f08210c",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Developer Utilities",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Base Converter",
"updatedAt" : "2021-05-31T13:00:42-07:00"
},
{
"authors" : [
{
"name" : "Angelos Michalopoulos",
"url" : "https:\/\/github.com\/miagg"
}
],
"createdAt" : "2022-08-19T12:58:32+03:00",
"currentDirectoryPath" : null,
"description" : "Get the TTFB (Time to First Byte) of a website",
"filename" : "get-ttfb.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🕐"
},
"identifier" : "d4474b109eb271a2ce54473c58edb94d",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Developer Utils",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Get TTFB (Time to First Byte)",
"updatedAt" : "2023-01-05T20:54:09+02:00"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2021-07-16T22:04:43-04:00",
"currentDirectoryPath" : null,
"description" : "Trim full git commit hash down to seven characters.",
"filename" : "trim-git-commit-hash.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "✂"
},
"identifier" : "fac2d5bdb898b7e6f0d2e5ce93a44df7",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Developer Utilities",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Trim Git Commit Hash",
"updatedAt" : "2021-07-19T14:40:00Z"
},
{
"authors" : [
{
"name" : "Federico Miraglia",
"url" : "https:\/\/github.com\/Mitra98t"
}
],
"createdAt" : "2021-08-30T10:40:35+02:00",
"currentDirectoryPath" : null,
"description" : "Given two dates returns the time between them in multiple units of measure.",
"filename" : "time-between-dates.js",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🕒"
},
"identifier" : "61a5ca9258cedf7950981a96058b12bc",
"isTemplate" : false,
"language" : "node",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Developer Utilities",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Time Between Dates",
"updatedAt" : "2021-08-30T17:05:39+02:00"
},
{
"authors" : [
{
"name" : "Sven Hofmann",
"url" : "https:\/\/github.com\/hofmannsven"
}
],
"createdAt" : "2020-11-12T20:31:09+01:00",
"currentDirectoryPath" : null,
"description" : "Generates a random password and copies it to the clipboard.",
"filename" : "generate-password.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🔐"
},
"identifier" : "a9156493eb0a70991d4fa0c6e86eb266",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Developer Utilities",
"path" : "developer-utils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Generate Password",
"updatedAt" : "2020-11-23T12:53:48-05:00"
}
],
"subGroups" : [
{
"name" : "Xcode",
"path" : "xcode",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Sergey Korobyin",
"url" : "https:\/\/github.com\/huangsemao"
}
],
"createdAt" : "2021-09-27T01:47:33+03:00",
"currentDirectoryPath" : null,
"description" : "Open recent Xcode project",
"filename" : "xcode-recent-project.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/xcode.png"
},
"identifier" : "1e147f71972fc7e7512ae987ef3c458c",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : false,
"packageName" : "Developer Utilities",
"path" : "developer-utils\/xcode\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Recent Project",
"updatedAt" : "2021-09-28T19:41:01+03:00"
},
{
"authors" : [
{
"name" : "Sergey Korobyin",
"url" : "https:\/\/github.com\/huangsemao"
}
],
"createdAt" : "2021-09-27T01:47:33+03:00",
"currentDirectoryPath" : null,
"description" : "Open the last Xcode project ",
"filename" : "xcode-last-project.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/xcode.png"
},
"identifier" : "3604faee01a482d8272b529b4d0384b7",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : false,
"packageName" : "Developer Utilities",
"path" : "developer-utils\/xcode\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Last Project",
"updatedAt" : "2021-09-28T19:41:01+03:00"
}
]
},
{
"name" : "Docker",
"path" : "docker",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Fabián Delgado",
"url" : null
}
],
"createdAt" : "2021-09-21T14:21:48-03:00",
"currentDirectoryPath" : null,
"description" : "Runs a Docker container",
"filename" : "run-docker.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "▶️"
},
"identifier" : "79e2d77eee8042ec057f2786356d44dc",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : true,
"packageName" : "Docker",
"path" : "developer-utils\/docker\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Run",
"updatedAt" : "2021-09-21T14:21:48-03:00"
},
{
"authors" : [
{
"name" : "Sebastian Kroll",
"url" : null
}
],
"createdAt" : "2021-06-04T16:19:49+02:00",
"currentDirectoryPath" : null,
"description" : "Remove unused data (system prune)",
"filename" : "docker-system-prune.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/docker.png"
},
"identifier" : "95f636043fb2a5e955d988fa82a0d0bc",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Docker",
"path" : "developer-utils\/docker\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "System Prune",
"updatedAt" : "2021-06-04T19:48:34+02:00"
},
{
"authors" : [
{
"name" : "Sebastian Kroll",
"url" : null
}
],
"createdAt" : "2021-06-04T16:19:49+02:00",
"currentDirectoryPath" : null,
"description" : "List containers in Docker",
"filename" : "docker-ps.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/docker.png"
},
"identifier" : "b9734d1d53f83eeb9e6e134548846d56",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Docker",
"path" : "developer-utils\/docker\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "List Containers",
"updatedAt" : "2021-06-04T18:57:07+02:00"
},
{
"authors" : [
{
"name" : "Fabián Delgado",
"url" : null
}
],
"createdAt" : "2021-06-06T21:26:12+02:00",
"currentDirectoryPath" : null,
"description" : "Stops a Docker container",
"filename" : "stop-docker.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "⏹️"
},
"identifier" : "9684377a02881cbf7dcf91f76712c550",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : true,
"packageName" : "Docker",
"path" : "developer-utils\/docker\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Stop",
"updatedAt" : "2021-09-21T14:21:48-03:00"
},
{
"authors" : [
{
"name" : "Quentin Eude",
"url" : null
}
],
"createdAt" : "2021-06-06T21:26:12+02:00",
"currentDirectoryPath" : null,
"description" : "Script that cleans Docker images, volumes, and containers",
"filename" : "clean-docker.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🧹"
},
"identifier" : "7220089fce735f0f32ad17bb19da6dd7",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : true,
"packageName" : "Docker",
"path" : "developer-utils\/docker\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Clean",
"updatedAt" : "2021-06-12T17:33:18Z"
},
{
"authors" : [
{
"name" : "Sebastian Kroll",
"url" : null
}
],
"createdAt" : "2021-06-04T16:19:49+02:00",
"currentDirectoryPath" : null,
"description" : "List images in Docker",
"filename" : "docker-images.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/docker.png"
},
"identifier" : "d510dd549de0f922fae2bebd9af9e9b9",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Docker",
"path" : "developer-utils\/docker\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "List Images",
"updatedAt" : "2021-06-04T18:57:07+02:00"
}
]
},
{
"name" : "GitLab",
"path" : "gitlab",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Michael Aigner",
"url" : "https:\/\/github.com\/tonka3000"
}
],
"createdAt" : "2020-12-06T19:31:30+01:00",
"currentDirectoryPath" : null,
"description" : "Show merge requests from GitLab",
"filename" : "gitlab-mergerequests.template.py",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/gitlab.png"
},
"identifier" : "254da90334e688f80da3ae9271149ab0",
"isTemplate" : true,
"language" : "python",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "GitLab",
"path" : "developer-utils\/gitlab\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Merge Requests",
"updatedAt" : "2021-05-20T22:33:40+02:00"
},
{
"authors" : [
{
"name" : "Michael Aigner",
"url" : "https:\/\/github.com\/tonka3000"
}
],
"createdAt" : "2020-12-06T19:31:30+01:00",
"currentDirectoryPath" : null,
"description" : "Show todos from GitLab",
"filename" : "gitlab-todos.template.py",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/gitlab.png"
},
"identifier" : "5e7219e2862849a3b1493f75be378574",
"isTemplate" : true,
"language" : "python",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "GitLab",
"path" : "developer-utils\/gitlab\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "To-Dos",
"updatedAt" : "2021-05-20T22:34:31+02:00"
},
{
"authors" : [
{
"name" : "Michael Aigner",
"url" : "https:\/\/github.com\/tonka3000"
}
],
"createdAt" : "2020-12-06T19:31:30+01:00",
"currentDirectoryPath" : null,
"description" : "Show issues from GitLab",
"filename" : "gitlab-issues.template.py",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/gitlab.png"
},
"identifier" : "592433d14d3ad035934bb7c059358afb",
"isTemplate" : true,
"language" : "python",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "GitLab",
"path" : "developer-utils\/gitlab\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Issues",
"updatedAt" : "2021-05-20T22:32:25+02:00"
}
]
},
{
"name" : "Minikube",
"path" : "minikube",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Daniils Petrovs",
"url" : "https:\/\/danpetrov.xyz"
}
],
"createdAt" : "2022-08-06T20:55:00+02:00",
"currentDirectoryPath" : null,
"description" : "Start Minikube cluster",
"filename" : "minikube-start.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🚀"
},
"identifier" : "1d2543332c8c0ca25fe54aed2ee3f982",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Minikube",
"path" : "developer-utils\/minikube\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Start",
"updatedAt" : "2022-08-06T20:55:00+02:00"
},
{
"authors" : [
{
"name" : "Daniils Petrovs",
"url" : "https:\/\/danpetrov.xyz"
}
],
"createdAt" : "2022-08-06T20:55:00+02:00",
"currentDirectoryPath" : null,
"description" : "Pause Minikube cluster",
"filename" : "minikube-config-set.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "⚙️"
},
"identifier" : "d6f637554979e38d38f4149244d245c1",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Minikube",
"path" : "developer-utils\/minikube\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Config Set",
"updatedAt" : "2022-08-06T20:55:00+02:00"
},
{
"authors" : [
{
"name" : "Daniils Petrovs",
"url" : "https:\/\/danpetrov.xyz"
}
],
"createdAt" : "2022-08-06T20:55:00+02:00",
"currentDirectoryPath" : null,
"description" : "Stops a running Minikube cluster",
"filename" : "minikube-stop.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🤖"
},
"identifier" : "8b6bf7326d5c1bee0c704d3decf724de",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Minikube",
"path" : "developer-utils\/minikube\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Stop",
"updatedAt" : "2022-08-06T20:55:00+02:00"
},
{
"authors" : [
{
"name" : "Daniils Petrovs",
"url" : "https:\/\/danpetrov.xyz"
}
],
"createdAt" : "2022-08-06T20:55:00+02:00",
"currentDirectoryPath" : null,
"description" : "Pause Minikube cluster",
"filename" : "minikube-unpause.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "⏸"
},
"identifier" : "c164a2e673e4cf59c3180d154f1e78c6",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Minikube",
"path" : "developer-utils\/minikube\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Unpause",
"updatedAt" : "2022-08-06T20:55:00+02:00"
},
{
"authors" : [
{
"name" : "Daniils Petrovs",
"url" : "https:\/\/danpetrov.xyz"
}
],
"createdAt" : "2022-08-06T20:55:00+02:00",
"currentDirectoryPath" : null,
"description" : "Show Minikube cluster status",
"filename" : "minikube-status.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "ℹ️"
},
"identifier" : "606629ecfbefdad4b07765587a208546",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Minikube",
"path" : "developer-utils\/minikube\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Status",
"updatedAt" : "2022-08-06T20:55:00+02:00"
},
{
"authors" : [
{
"name" : "Daniils Petrovs",
"url" : "https:\/\/danpetrov.xyz"
}
],
"createdAt" : "2022-08-06T20:55:00+02:00",
"currentDirectoryPath" : null,
"description" : "Pause Minikube cluster",
"filename" : "minikube-pause.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "⏸"
},
"identifier" : "8b95921fd6d9305ef97cd1e7ab038594",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Minikube",
"path" : "developer-utils\/minikube\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Pause",
"updatedAt" : "2022-08-06T20:55:00+02:00"
}
]
},
{
"name" : "Google",
"path" : "google",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-11-09T11:57:38-05:00",
"currentDirectoryPath" : null,
"description" : "Run a [PageSpeed Insights](https:\/\/developers.google.com\/speed\/pagespeed\/insights\/) analysis on desktop of URL.",
"filename" : "google-psi-desktop.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/google-psi-logo.png"
},
"identifier" : "75d5bcfc2c27d0a67a02e8832413ea05",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Google",
"path" : "developer-utils\/google\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "PageSpeed Insights - Desktop",
"updatedAt" : "2020-11-28T13:47:03-05:00"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-11-09T11:57:38-05:00",
"currentDirectoryPath" : null,
"description" : "Run a [PageSpeed Insights](https:\/\/developers.google.com\/speed\/pagespeed\/insights\/) analysis on mobile of URL.",
"filename" : "google-psi-mobile.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/google-psi-logo.png"
},
"identifier" : "e7ea215de7f19cf0b6379a5c6845ce9b",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Google",
"path" : "developer-utils\/google\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "PageSpeed Insights - Mobile",
"updatedAt" : "2020-11-28T13:47:03-05:00"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-11-09T11:57:38-05:00",
"currentDirectoryPath" : "~\/Desktop",
"description" : "Open a [Lighthouse](https:\/\/developers.google.com\/web\/tools\/lighthouse\/) report of URL.",
"filename" : "google-lighthouse.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/google-lighthouse-logo.png"
},
"identifier" : "133261278856325c8efd9cbfb976ee89",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Google",
"path" : "developer-utils\/google\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Lighthouse",
"updatedAt" : "2020-11-28T13:47:03-05:00"
}
]
},
{
"name" : "Cloudflare",
"path" : "cloudflare",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2021-02-08T14:08:53-05:00",
"currentDirectoryPath" : null,
"description" : "Purge Cloudflare cache for zone.",
"filename" : "purge-cloudflare-cache.template.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/cloudflare-logo.png"
},
"identifier" : "1a0200798cf02f1d51373e7abe1c28d7",
"isTemplate" : true,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Developer Utilities",
"path" : "developer-utils\/cloudflare\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Purge Cloudflare cache",
"updatedAt" : "2021-02-12T11:49:03+01:00"
}
]
},
{
"name" : "Brew",
"path" : "brew",
"scriptCommands" : [
{
"authors" : [
{
"name" : "LanikSJ",
"url" : "https:\/\/github.com\/LanikSJ"
}
],
"createdAt" : "2022-03-03T00:32:00-08:00",
"currentDirectoryPath" : null,
"description" : "Updates brew and upgrades every outdated app",
"filename" : "brew-cask-upgrade.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🍺"
},
"identifier" : "d1c2825e774ea720d9897eaf8a0d7b9d",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Brew",
"path" : "developer-utils\/brew\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Cask Upgrade",
"updatedAt" : "2022-03-03T00:32:00-08:00"
},
{
"authors" : [
{
"name" : "Alex Zotov",
"url" : "https:\/\/github.com\/lex4hex"
}
],
"createdAt" : "2020-11-30T22:12:12+01:00",
"currentDirectoryPath" : null,
"description" : "Installs specified brew package.",
"filename" : "brew-install.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🍺"
},
"identifier" : "adca4439b61acdf144d8c88eccc99015",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : true,
"packageName" : "Brew",
"path" : "developer-utils\/brew\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Install a package",
"updatedAt" : "2021-02-27T17:45:55+01:00"
},
{
"authors" : [
{
"name" : "Thiago Holanda",
"url" : "https:\/\/twitter.com\/tholanda"
}
],
"createdAt" : "2020-11-30T22:12:12+01:00",
"currentDirectoryPath" : null,
"description" : "Run Brew Doctor",
"filename" : "brew-doctor.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🍺"
},
"identifier" : "10533c5bd131980a3c04140be37c08df",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Brew",
"path" : "developer-utils\/brew\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Doctor",
"updatedAt" : "2021-02-25T00:34:23Z"
},
{
"authors" : [
{
"name" : "Thiago Holanda",
"url" : "https:\/\/twitter.com\/tholanda"
}
],
"createdAt" : "2020-11-30T22:12:12+01:00",
"currentDirectoryPath" : null,
"description" : "Show list of outdated formulae",
"filename" : "brew-outdated.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🍺"
},
"identifier" : "7c4d3d97c9fb7c35484b619b6b0b4baa",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Brew",
"path" : "developer-utils\/brew\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Outdated List",
"updatedAt" : "2021-02-25T00:34:23Z"
},
{
"authors" : [
{
"name" : "owpac",
"url" : "https:\/\/github.com\/Owpac"
}
],
"createdAt" : "2020-11-30T22:12:12+01:00",
"currentDirectoryPath" : null,
"description" : "Show list of installed brew formulae that are not dependencies of other installed formula.",
"filename" : "brew-leaves.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🍺"
},
"identifier" : "06b8fc10bd7a10a81c62b0497065bbef",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Brew",
"path" : "developer-utils\/brew\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Leaves",
"updatedAt" : "2021-07-27T09:53:34+02:00"
},
{
"authors" : [
{
"name" : "Thiago Holanda",
"url" : "https:\/\/twitter.com\/tholanda"
}
],
"createdAt" : "2020-11-30T22:12:12+01:00",
"currentDirectoryPath" : null,
"description" : "Start Service in Brew",
"filename" : "brew-services-start.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🍺"
},
"identifier" : "14f68427c73fceff2728ea49d7913910",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Brew",
"path" : "developer-utils\/brew\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Start Service",
"updatedAt" : "2021-02-25T00:34:23Z"
},
{
"authors" : [
{
"name" : "chengzhiqi",
"url" : "https:\/\/twitter.com\/1872Fate"
}
],
"createdAt" : "2020-11-30T22:12:12+01:00",
"currentDirectoryPath" : null,
"description" : "Show Brew List",
"filename" : "brew-list.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🍺"
},
"identifier" : "b3fc6fec062d9818837b5c81ce8c9289",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Brew",
"path" : "developer-utils\/brew\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "List",
"updatedAt" : "2021-03-19T16:42:53Z"
},
{
"authors" : [
{
"name" : "Thiago Holanda",
"url" : "https:\/\/twitter.com\/tholanda"
}
],
"createdAt" : "2020-11-30T22:12:12+01:00",
"currentDirectoryPath" : null,
"description" : "Run Brew Upgrade",
"filename" : "brew-upgrade.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🍺"
},
"identifier" : "e3f952d3afb2505f743d46dead96f0be",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Brew",
"path" : "developer-utils\/brew\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Upgrade",
"updatedAt" : "2021-02-25T00:34:23Z"
},
{
"authors" : [
{
"name" : "Thiago Holanda",
"url" : "https:\/\/twitter.com\/tholanda"
}
],
"createdAt" : "2020-11-30T22:12:12+01:00",
"currentDirectoryPath" : null,
"description" : "Stop Service in Brew",
"filename" : "brew-services-stop.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🍺"
},
"identifier" : "966dcea0d9a03789afb749ede84d2a5c",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Brew",
"path" : "developer-utils\/brew\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Stop Service",
"updatedAt" : "2021-02-25T00:34:23Z"
},
{
"authors" : [
{
"name" : "chengzhiqi",
"url" : "https:\/\/twitter.com\/1872Fate"
}
],
"createdAt" : "2020-11-30T22:12:12+01:00",
"currentDirectoryPath" : null,
"description" : "Run Brew Update",
"filename" : "brew-update.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🍺"
},
"identifier" : "ebc4e137618151763aabdb69ffbab710",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Brew",
"path" : "developer-utils\/brew\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Update",
"updatedAt" : "2021-03-19T16:42:53Z"
},
{
"authors" : [
{
"name" : "es183923",
"url" : "github.com\/es183923"
}
],
"createdAt" : "2020-11-30T22:12:12+01:00",
"currentDirectoryPath" : null,
"description" : "Restart Service in Brew",
"filename" : "brew-services-restart.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🍺"
},
"identifier" : "9bd016400e1090535e0049cf056f61d0",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Brew",
"path" : "developer-utils\/brew\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Restart Service",
"updatedAt" : "2021-09-07T10:00:18Z"
},
{
"authors" : [
{
"name" : "StevenRCE0",
"url" : "https:\/\/github.com\/StevenRCE0"
}
],
"createdAt" : "2022-04-06T00:01:05+08:00",
"currentDirectoryPath" : null,
"description" : "Uninstalls an Specified Application Using Homebrew",
"filename" : "brew-uninstall-application.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🍺"
},
"identifier" : "90405cfd617b86b933e641e182bb12c9",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Brew",
"path" : "developer-utils\/brew\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Uninstall",
"updatedAt" : "2022-04-06T00:01:05+08:00"
},
{
"authors" : [
{
"name" : "Thiago Holanda",
"url" : "https:\/\/twitter.com\/tholanda"
}
],
"createdAt" : "2020-11-30T22:12:12+01:00",
"currentDirectoryPath" : null,
"description" : "Show Brew Services List",
"filename" : "brew-services-list.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🍺"
},
"identifier" : "d054a5f29c43451ae7057b53796ea450",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Brew",
"path" : "developer-utils\/brew\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Services List",
"updatedAt" : "2021-02-25T00:34:23Z"
}
]
},
{
"name" : "Solana",
"path" : "solana",
"scriptCommands" : [
{
"authors" : [
{
"name" : "bjoerndotsol",
"url" : "https:\/\/github.com\/bjoerndotsol"
}
],
"createdAt" : "2025-11-09T12:49:22+04:00",
"currentDirectoryPath" : null,
"description" : "Extract transaction from Blink endpoint in clipboard and replaces with the transaction",
"filename" : "solana-tx-blink-extract.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : ".\/images\/solana-logo.png"
},
"identifier" : "b6d5f4f47851592cfb80de671a69b6d6",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Solana",
"path" : "developer-utils\/solana\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Extract Transaction from Blink Response",
"updatedAt" : "2025-11-09T12:49:22+04:00"
},
{
"authors" : [
{
"name" : "bjoerndotsol",
"url" : "https:\/\/github.com\/bjoerndotsol"
}
],
"createdAt" : "2025-11-09T12:49:22+04:00",
"currentDirectoryPath" : null,
"description" : "Opens a Solana transaction in Solscan. Network: empty\/mainnet, d\/dev\/devnet, t\/test\/testnet",
"filename" : "solana-tx-details.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : ".\/images\/solana-logo.png"
},
"identifier" : "8d593a4cf4ef3adafe986a1c06b00909",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Solana",
"path" : "developer-utils\/solana\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "View Solana Transaction",
"updatedAt" : "2025-11-09T12:49:22+04:00"
},
{
"authors" : [
{
"name" : "bjoerndotsol",
"url" : "https:\/\/github.com\/bjoerndotsol"
}
],
"createdAt" : "2025-11-09T12:49:22+04:00",
"currentDirectoryPath" : null,
"description" : "Extracts the message from a signed Solana transaction and opens Explorer's Inspector with it.",
"filename" : "solana-tx-inspector.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : ".\/images\/solana-logo.png"
},
"identifier" : "a2218c35f59137757e59aa21f61cb1a0",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Solana",
"path" : "developer-utils\/solana\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open in Solana Inspector",
"updatedAt" : "2025-11-09T12:49:22+04:00"
}
]
},
{
"name" : "GitHub",
"path" : "github",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-10-30T17:06:29-04:00",
"currentDirectoryPath" : null,
"description" : "Create a GitHub Gist from clipboard contents and copy Gist URL.",
"filename" : "create-github-gist.template.sh",
"hasArguments" : false,
"icon" : {
"dark" : "images\/github-logo-iconDark.png",
"light" : "images\/github-logo.png"
},
"identifier" : "2a28a49eb7824d5f54861fe0c9245a11",
"isTemplate" : true,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : true,
"packageName" : "GitHub",
"path" : "developer-utils\/github\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Create GitHub Gist from Clipboard",
"updatedAt" : "2021-05-02T10:22:03-07:00"
},
{
"authors" : [
{
"name" : "Thomas Paul Mann",
"url" : "https:\/\/github.com\/thomaspaulmann"
}
],
"createdAt" : "2020-11-27T10:40:24Z",
"currentDirectoryPath" : null,
"description" : "Show statistics of your GitHub repository.",
"filename" : "github-repository-stars.template.rb",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "⭐️"
},
"identifier" : "bda99211bf65f1b5219db20e1b8f1b3d",
"isTemplate" : true,
"language" : "ruby",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "GitHub",
"path" : "developer-utils\/github\/",
"refreshTime" : "1h",
"schemaVersion" : 1,
"title" : "Repository Statistics",
"updatedAt" : "2020-11-27T10:40:24Z"
},
{
"authors" : [
{
"name" : "Astrit",
"url" : "https:\/\/github.com\/astrit"
}
],
"createdAt" : "2021-11-19T19:14:43+01:00",
"currentDirectoryPath" : null,
"description" : "Show GitHub user contributions from the current year",
"filename" : "github-contributions.template.sh",
"hasArguments" : false,
"icon" : {
"dark" : "images\/github-logo-iconDark.png",
"light" : "images\/github-logo.png"
},
"identifier" : "23544f0e4fd17e7d9cfb092fd82e1452",
"isTemplate" : true,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "GitHub Contributions",
"path" : "developer-utils\/github\/",
"refreshTime" : "2h",
"schemaVersion" : 1,
"title" : "GitHub Contributions",
"updatedAt" : "2021-11-19T19:14:43+01:00"
},
{
"authors" : [
{
"name" : "Valdir Junior",
"url" : "https:\/\/github.com\/valdirjunior011 "
}
],
"createdAt" : "2023-07-25T02:12:24+02:00",
"currentDirectoryPath" : null,
"description" : "Show statistics of your GitHub repositories.",
"filename" : "github-repository-stars_all_repos_template.rb",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "⭐️"
},
"identifier" : "b1a1df37b2ee1f7965f5bad16f491ddd",
"isTemplate" : true,
"language" : "ruby",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "GitHub",
"path" : "developer-utils\/github\/",
"refreshTime" : "1h",
"schemaVersion" : 1,
"title" : "Repository Statistics",
"updatedAt" : "2023-07-25T00:17:33Z"
},
{
"authors" : [
{
"name" : "Phil Salant",
"url" : "https:\/\/github.com\/PSalant726"
}
],
"createdAt" : "2021-01-18T17:35:59-05:00",
"currentDirectoryPath" : null,
"description" : "Open a repository, pull request, or issue on GitHub",
"filename" : "open-gh-repo-pr-or-issue.sh",
"hasArguments" : true,
"icon" : {
"dark" : "images\/github-logo-iconDark.png",
"light" : "images\/github-logo.png"
},
"identifier" : "454c25458144284fc3c579691f9904b5",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "GitHub",
"path" : "developer-utils\/github\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Visit a Repository, Pull Request, or Issue",
"updatedAt" : "2021-01-23T18:06:29-05:00"
},
{
"authors" : [
{
"name" : "Faye Sipiano",
"url" : "https:\/\/github.com\/FSipiano"
}
],
"createdAt" : "2021-03-17T17:31:38Z",
"currentDirectoryPath" : null,
"description" : "Display number of open pull requests",
"filename" : "github-open-pull-requests.template.rb",
"hasArguments" : false,
"icon" : {
"dark" : "images\/github-logo-iconDark.png",
"light" : "images\/github-logo.png"
},
"identifier" : "07da15e048906bd7b5ee0275044649f8",
"isTemplate" : true,
"language" : "ruby",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "GitHub",
"path" : "developer-utils\/github\/",
"refreshTime" : "5m",
"schemaVersion" : 1,
"title" : "Open Pull Requests",
"updatedAt" : "2021-03-18T11:30:06Z"
},
{
"authors" : [
{
"name" : "Faye Sipiano",
"url" : "https:\/\/github.com\/FSipiano"
}
],
"createdAt" : "2021-03-17T17:31:38Z",
"currentDirectoryPath" : null,
"description" : "Display (detailed) GitHub pull requests",
"filename" : "github-open-pull-requests-details.template.rb",
"hasArguments" : false,
"icon" : {
"dark" : "images\/github-logo-iconDark.png",
"light" : "images\/github-logo.png"
},
"identifier" : "d01e8e7a75307d40d48797d8ec6041b8",
"isTemplate" : true,
"language" : "ruby",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "GitHub",
"path" : "developer-utils\/github\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Show Open Pull Requests",
"updatedAt" : "2021-05-02T10:25:44-07:00"
},
{
"authors" : [
{
"name" : "Faye Sipiano",
"url" : "https:\/\/github.com\/FSipiano"
}
],
"createdAt" : "2021-03-17T17:31:38Z",
"currentDirectoryPath" : null,
"description" : "Open your GitHub pull requests page",
"filename" : "github-open-pull-requests-page.sh",
"hasArguments" : false,
"icon" : {
"dark" : "images\/github-logo-iconDark.png",
"light" : "images\/github-logo.png"
},
"identifier" : "1568c128b1e4e3897c8f2a65bb14d551",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "GitHub",
"path" : "developer-utils\/github\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open Pull Requests page",
"updatedAt" : "2021-03-18T11:30:06Z"
},
{
"authors" : [
{
"name" : "Vince Picone",
"url" : "https:\/\/github.com\/vpicone"
}
],
"createdAt" : "2021-03-17T17:31:38Z",
"currentDirectoryPath" : null,
"description" : "Display number of Pull Requests requesting your review",
"filename" : "github-review-requests.template.rb",
"hasArguments" : false,
"icon" : {
"dark" : "images\/github-logo-iconDark.png",
"light" : "images\/github-logo.png"
},
"identifier" : "d1fc531c2aa8d1bac53ac6f630c1ca90",
"isTemplate" : true,
"language" : "ruby",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "GitHub",
"path" : "developer-utils\/github\/",
"refreshTime" : "5m",
"schemaVersion" : 1,
"title" : "Show Review Requests",
"updatedAt" : "2021-11-03T15:03:45-05:00"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-10-30T17:06:29-04:00",
"currentDirectoryPath" : null,
"description" : "Display (detailed) number of unread GitHub notifications.",
"filename" : "github-unread-notifications.template.sh",
"hasArguments" : false,
"icon" : {
"dark" : "images\/github-logo-iconDark.png",
"light" : "images\/github-logo.png"
},
"identifier" : "9d6b84dd61dd585e27274651a7fda8fe",
"isTemplate" : true,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "GitHub",
"path" : "developer-utils\/github\/",
"refreshTime" : "5m",
"schemaVersion" : 1,
"title" : "Unread Notifications",
"updatedAt" : "2021-08-20T16:42:39-04:00"
},
{
"authors" : [
{
"name" : "Thomas Paul Mann",
"url" : "https:\/\/github.com\/thomaspaulmann"
}
],
"createdAt" : "2021-04-22T16:12:34+01:00",
"currentDirectoryPath" : null,
"description" : "Opens the commit history of the filepath in the clipboard or the frontmost window. Alternatively can open the file view on GitHub.",
"filename" : "github-open-commit-history.sh",
"hasArguments" : false,
"icon" : {
"dark" : ".\/images\/github-logo-iconDark.png",
"light" : ".\/images\/github-logo.png"
},
"identifier" : "2331a0f74a526204c81966b567479a1c",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "GitHub",
"path" : "developer-utils\/github\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open Commit History",
"updatedAt" : "2021-04-22T17:15:50+01:00"
}
]
},
{
"name" : "Aws",
"path" : "aws",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Chris Cook",
"url" : "https:\/\/github.com\/zirkelc"
}
],
"createdAt" : "2024-06-14T14:31:44+02:00",
"currentDirectoryPath" : null,
"description" : "Download from Amazon S3 via URL",
"filename" : "amazon-s3-download.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/amazon-s3.png"
},
"identifier" : "b4dd5f3fe1c6dd1b9b44fc9f0fe88364",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "AWS",
"path" : "developer-utils\/aws\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "S3 Download",
"updatedAt" : "2024-09-17T11:36:59+02:00"
},
{
"authors" : [
{
"name" : "David Molinero",
"url" : "https:\/\/github.com\/doktor500"
}
],
"createdAt" : "2021-12-15T22:46:57+01:00",
"currentDirectoryPath" : null,
"description" : "Login to AWS using aws-sso-util",
"filename" : "aws-sso-util.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/aws-sso-util.png"
},
"identifier" : "97368460c4c6dd74419fb9fa3769c23e",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "AWS",
"path" : "developer-utils\/aws\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Single Sign-On",
"updatedAt" : "2021-12-19T15:22:29Z"
},
{
"authors" : [
{
"name" : "Oğuzhan Yılmaz",
"url" : "https:\/\/github.com\/c1982"
}
],
"createdAt" : "2020-12-29T23:14:00+03:00",
"currentDirectoryPath" : null,
"description" : "Copies the AWS IPv4 to the clipboard.",
"filename" : "whatismyregion.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🤖"
},
"identifier" : "3c3c86c801d87462b02da5e9a2b8af00",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Developer Utilities",
"path" : "developer-utils\/aws\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Find AWS Region by IP",
"updatedAt" : "2021-01-04T13:34:28Z"
}
]
},
{
"name" : "Sentry",
"path" : "sentry",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Thomas Paul Mann",
"url" : "https:\/\/github.com\/thomaspaulmann"
}
],
"createdAt" : "2020-12-02T09:13:05Z",
"currentDirectoryPath" : null,
"description" : "Show unresolved issues of the last 24 hours from Sentry.",
"filename" : "sentry-unresolved-issues.template.py",
"hasArguments" : false,
"icon" : {
"dark" : "images\/sentry-dark.png",
"light" : "images\/sentry.png"
},
"identifier" : "d965f2571912eb46a116071bd5a25111",
"isTemplate" : true,
"language" : "python",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Sentry",
"path" : "developer-utils\/sentry\/",
"refreshTime" : "1h",
"schemaVersion" : 1,
"title" : "Unresolved Issues",
"updatedAt" : "2020-12-02T09:13:05Z"
},
{
"authors" : [
{
"name" : "Phil Salant",
"url" : "https:\/\/github.com\/PSalant726"
},
{
"name" : "Thomas Paul Mann",
"url" : "https:\/\/github.com\/thomaspaulmann"
}
],
"createdAt" : "2020-12-02T09:13:05Z",
"currentDirectoryPath" : null,
"description" : "Show unresolved issues in the last 24 hours (by project) from Sentry.",
"filename" : "sentry-unresolved-issues-by-project.template.py",
"hasArguments" : true,
"icon" : {
"dark" : "images\/sentry-dark.png",
"light" : "images\/sentry.png"
},
"identifier" : "cd9dc8603b5433fe83c15dd43785add6",
"isTemplate" : true,
"language" : "python",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Sentry",
"path" : "developer-utils\/sentry\/",
"refreshTime" : "1h",
"schemaVersion" : 1,
"title" : "Unresolved Issues By Project",
"updatedAt" : "2021-02-20T19:00:22-05:00"
}
]
},
{
"name" : "Ip",
"path" : "ip",
"scriptCommands" : [
{
"authors" : null,
"createdAt" : "2020-09-30T13:18:04+01:00",
"currentDirectoryPath" : null,
"description" : "Copies the local IPv4 to the clipboard.",
"filename" : "get-local-ip-v4.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🌐"
},
"identifier" : "2d00ef79e3863dac5effcc73a62d3222",
"isTemplate" : false,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Internet",
"path" : "developer-utils\/ip\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Local IPv4",
"updatedAt" : "2022-01-19T12:05:31+01:00"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-10-31T13:10:47-04:00",
"currentDirectoryPath" : null,
"description" : "Get IPv6 address of URL.",
"filename" : "get-url-ip-v6.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🌐"
},
"identifier" : "7eaf42e6a3c85eeff9f35a84b6b80706",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Internet",
"path" : "developer-utils\/ip\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "URL IPv6",
"updatedAt" : "2021-07-06T10:54:12+02:00"
},
{
"authors" : null,
"createdAt" : "2020-09-30T13:18:04+01:00",
"currentDirectoryPath" : null,
"description" : "Copies the external IPv4 to the clipboard.",
"filename" : "get-external-ip-v4.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🌐"
},
"identifier" : "31067b36b44e2c92476986f5be766a64",
"isTemplate" : false,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Internet",
"path" : "developer-utils\/ip\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "External IPv4",
"updatedAt" : "2022-01-19T12:05:31+01:00"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-10-31T13:10:47-04:00",
"currentDirectoryPath" : null,
"description" : "Get IPv4 address of URL.",
"filename" : "get-url-ip-v4.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🌐"
},
"identifier" : "5fc170964dbedecab11873849783b580",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Internet",
"path" : "developer-utils\/ip\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "URL IPv4",
"updatedAt" : "2021-07-06T10:54:12+02:00"
},
{
"authors" : null,
"createdAt" : "2020-09-30T13:18:04+01:00",
"currentDirectoryPath" : null,
"description" : "Copies the external IPv6 to the clipboard.",
"filename" : "get-external-ip-v6.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🌐"
},
"identifier" : "76ee0abac28dee6ac5bcab6a13719a2a",
"isTemplate" : false,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Internet",
"path" : "developer-utils\/ip\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "External IPv6",
"updatedAt" : "2022-01-19T12:05:31+01:00"
},
{
"authors" : null,
"createdAt" : "2020-09-30T13:18:04+01:00",
"currentDirectoryPath" : null,
"description" : "Copies the local IPv6 to the clipboard.",
"filename" : "get-local-ip-v6.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🌐"
},
"identifier" : "b8e90aa9ba83248b67f79cf54ad42a70",
"isTemplate" : false,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Internet",
"path" : "developer-utils\/ip\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Local IPv6",
"updatedAt" : "2022-01-19T12:05:31+01:00"
}
]
},
{
"name" : "Vscode",
"path" : "vscode",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Maksim Zemlyanikin",
"url" : "https:\/\/github.com\/Maksimka101"
}
],
"createdAt" : "2021-10-11T13:31:08+03:00",
"currentDirectoryPath" : null,
"description" : "Finds path to the given directory which must be a VS Code or Git project and opens it with VS Code",
"filename" : "open-project-in-vscode.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/vscode.png"
},
"identifier" : "66befabf033302a672d20d8d207a3dfd",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "VS Code",
"path" : "developer-utils\/vscode\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open Project",
"updatedAt" : "2022-11-08T14:51:04+05:30"
},
{
"authors" : [
{
"name" : "chohner",
"url" : "https:\/\/github.com\/chohner"
}
],
"createdAt" : "2021-02-22T11:26:39+01:00",
"currentDirectoryPath" : null,
"description" : "Opens current topmost directory in VS Code",
"filename" : "open-folder-in-vscode.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/vscode.png"
},
"identifier" : "2b0b56d7b5b14aacf924a1a6f236ecb3",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "VS Code",
"path" : "developer-utils\/vscode\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open Directory",
"updatedAt" : "2022-11-08T14:51:04+05:30"
}
]
},
{
"name" : "Git",
"path" : "git",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Thomas Paul Mann",
"url" : "https:\/\/github.com\/thomaspaulmann"
}
],
"createdAt" : "2021-07-19T15:52:56+01:00",
"currentDirectoryPath" : "~\/Developer\/script-commands",
"description" : "Shows the status of your Git repository.",
"filename" : "git-status.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : ".\/images\/git.png"
},
"identifier" : "6ecda0ea71b6028d26ad0d114417d2b4",
"isTemplate" : false,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Git",
"path" : "developer-utils\/git\/",
"refreshTime" : "5m",
"schemaVersion" : 1,
"title" : "Status",
"updatedAt" : "2021-07-19T15:52:56+01:00"
},
{
"authors" : [
{
"name" : "Thomas Paul Mann",
"url" : "https:\/\/github.com\/thomaspaulmann"
}
],
"createdAt" : "2021-07-19T15:52:56+01:00",
"currentDirectoryPath" : "~\/Developer\/script-commands",
"description" : "Switch to a new branch. If not name was provided, it checks out the default branch.",
"filename" : "git-switch-branch.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : ".\/images\/git.png"
},
"identifier" : "8211369aa865446a41bcd4c5b1f1d6f4",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Git",
"path" : "developer-utils\/git\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Switch Branch",
"updatedAt" : "2021-07-19T15:52:56+01:00"
},
{
"authors" : [
{
"name" : "Thomas Paul Mann",
"url" : "https:\/\/github.com\/thomaspaulmann"
}
],
"createdAt" : "2021-07-19T15:52:56+01:00",
"currentDirectoryPath" : "~\/Developer\/script-commands",
"description" : "Pulls, rebases and pushes your changes.",
"filename" : "git-sync-changes.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : ".\/images\/git.png"
},
"identifier" : "f2d387141a75ac5d60fb34cc853a452d",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Git",
"path" : "developer-utils\/git\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Sync Changes",
"updatedAt" : "2021-07-19T15:52:56+01:00"
},
{
"authors" : [
{
"name" : "Thomas Paul Mann",
"url" : "https:\/\/github.com\/thomaspaulmann"
}
],
"createdAt" : "2021-07-19T15:52:56+01:00",
"currentDirectoryPath" : null,
"description" : "Lists your commits from the last 24 hours. Optionally specify since when, e.g. \"1 week\".",
"filename" : "git-standup.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : ".\/images\/git.png"
},
"identifier" : "1e8d6e949bd023be73d76a0b4c921ddf",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Git",
"path" : "developer-utils\/git\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Standup",
"updatedAt" : "2021-08-06T19:27:39+02:00"
},
{
"authors" : [
{
"name" : "Thomas Paul Mann",
"url" : "https:\/\/github.com\/thomaspaulmann"
}
],
"createdAt" : "2021-07-19T15:52:56+01:00",
"currentDirectoryPath" : "~\/Developer\/script-commands",
"description" : "Clear all changes",
"filename" : "git-clear-changes.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : ".\/images\/git.png"
},
"identifier" : "b92aaee255e5488a0eb3b8be826ebbbb",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : true,
"packageName" : "Git",
"path" : "developer-utils\/git\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Clear Changes",
"updatedAt" : "2021-07-19T15:52:56+01:00"
},
{
"authors" : [
{
"name" : "Thomas Paul Mann",
"url" : "https:\/\/github.com\/thomaspaulmann"
}
],
"createdAt" : "2021-07-19T15:52:56+01:00",
"currentDirectoryPath" : "~\/Developer\/script-commands",
"description" : "Commit all pending changes. If no commit message is provided, it will amend the changes.",
"filename" : "git-save-changes.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : ".\/images\/git.png"
},
"identifier" : "2db5481c5b71c36aa1723c442f12c949",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Git",
"path" : "developer-utils\/git\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Save Changes",
"updatedAt" : "2021-07-19T15:52:56+01:00"
}
]
}
]
},
{
"name" : "Communication",
"path" : "communication",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-11-16T16:14:09-05:00",
"currentDirectoryPath" : null,
"description" : "Use [xkcdpass](https:\/\/github.com\/redacted\/XKCD-password-generator) to create a passphrase.",
"filename" : "xkcdpass.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🔐"
},
"identifier" : "e48d4638b40bf69a6c441a609f09e27b",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Communication",
"path" : "communication\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Generate Passphrase",
"updatedAt" : "2020-12-09T15:47:57-05:00"
},
{
"authors" : [
{
"name" : "Leo Fritsch",
"url" : "https:\/\/github.com\/leofritsch"
}
],
"createdAt" : "2023-06-26T20:03:01+02:00",
"currentDirectoryPath" : null,
"description" : "Let Me Google That For You",
"filename" : "let-me-google-that.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🤡"
},
"identifier" : "8c26812f87ffcd8305d704e94d8146eb",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Communication",
"path" : "communication\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Let Me Google That",
"updatedAt" : "2023-06-27T09:57:07Z"
},
{
"authors" : [
{
"name" : "Alexander JH Steffen",
"url" : "https:\/\/github.com\/alexjsteffen"
}
],
"createdAt" : "2021-12-20T07:46:10-05:00",
"currentDirectoryPath" : null,
"description" : "Place a telephone call via your iPhone on Wi-Fi.",
"filename" : "call-with-iphone.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "📱"
},
"identifier" : "6a212b23c41606e8701b64a7e18a00bb",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Communication",
"path" : "communication\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Call with iPhone",
"updatedAt" : "2021-12-20T07:46:10-05:00"
},
{
"authors" : [
{
"name" : "Felipe Turcheti",
"url" : "https:\/\/felipeturcheti.com"
}
],
"createdAt" : "2021-04-14T11:35:06-03:00",
"currentDirectoryPath" : null,
"description" : "Convert text to audible speech.",
"filename" : "say.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🗣"
},
"identifier" : "36d92cab708c342b05f9c7ac27e5e96f",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Communication",
"path" : "communication\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Say",
"updatedAt" : "2021-04-14T12:13:12-03:00"
},
{
"authors" : [
{
"name" : "Petr Nikolaev",
"url" : "https:\/\/github.com\/PitNikola"
}
],
"createdAt" : "2021-03-14T20:36:28Z",
"currentDirectoryPath" : null,
"description" : "Share secret securely using https:\/\/share.doppler.com\/.",
"filename" : "share-secret-doppler.py",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/doppler-logo.png"
},
"identifier" : "348009c977b2cf35d589b7723f89b8ed",
"isTemplate" : false,
"language" : "python",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Doppler",
"path" : "communication\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Share Secret from Clipboard",
"updatedAt" : "2021-03-14T20:36:28Z"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
},
{
"name" : "Thiago Holanda",
"url" : "https:\/\/twitter.com\/tholanda"
}
],
"createdAt" : "2020-11-09T09:32:06-05:00",
"currentDirectoryPath" : null,
"description" : "Get most recent two-factor authentication code from iMessages.",
"filename" : "imessage-2fa.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🔐"
},
"identifier" : "12f0f2ced06b2baa123a6105dbfaca73",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "iMessage",
"path" : "communication\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "2FA from iMessages",
"updatedAt" : "2020-11-28T13:47:10-05:00"
}
],
"subGroups" : [
{
"name" : "Google Meet",
"path" : "google-meet",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Mujib Azizi",
"url" : "https:\/\/github.com\/mujibazizi"
}
],
"createdAt" : "2021-03-30T10:13:53+02:00",
"currentDirectoryPath" : null,
"description" : "Start a Google Meet session",
"filename" : "meet.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/logo.png"
},
"identifier" : "05b7c0a10c2a7fe1d487f1d608b3a9b3",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Google",
"path" : "communication\/google-meet\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open Google Meet",
"updatedAt" : "2021-07-14T20:00:21+02:00"
}
]
},
{
"name" : "Mail",
"path" : "mail",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Ben Yoon",
"url" : "https:\/\/github.com\/benyn"
}
],
"createdAt" : "2023-02-02T13:38:06-08:00",
"currentDirectoryPath" : null,
"description" : "Open the last received email in your inbox in Mail.app",
"filename" : "open-most-recent-email.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "✉️"
},
"identifier" : "3766484ecb1942dab17dd995c1e51f14",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Mail",
"path" : "communication\/mail\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open Most Recent Email",
"updatedAt" : "2023-02-03T00:48:14Z"
}
]
},
{
"name" : "DuckDuckGo Email Protection",
"path" : "duckduckgo-email-protection",
"readme" : "communication\/duckduckgo-email-protection\/README.md",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Rediwed",
"url" : "github.com\/Rediwed"
}
],
"createdAt" : "2022-02-10T09:48:48+01:00",
"currentDirectoryPath" : null,
"description" : "Use this script command to configure your @duck.com authorizationID",
"filename" : "configure-@duck.com-script-command.applescript",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/duckduckgo_logo.png"
},
"identifier" : "f21768def3b65261d459100b8eac5e8c",
"isTemplate" : false,
"language" : "applescript",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "DuckDuckGo Email Protection",
"path" : "communication\/duckduckgo-email-protection\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Configure",
"updatedAt" : "2022-02-10T09:48:48+01:00"
},
{
"authors" : [
{
"name" : "Rediwed",
"url" : "github.com\/Rediwed"
}
],
"createdAt" : "2022-02-10T09:48:48+01:00",
"currentDirectoryPath" : null,
"description" : "This script command generates a unique private @duck.com email address.",
"filename" : "generate-unique-email-address.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/duckduckgo_logo.png"
},
"identifier" : "6c12d494954c21d0580e847a688d9eb3",
"isTemplate" : false,
"language" : "applescript",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "DuckDuckGo Email Protection",
"path" : "communication\/duckduckgo-email-protection\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Generate Unique Address",
"updatedAt" : "2024-07-14T22:23:53+08:00"
}
]
},
{
"name" : "Messenger",
"path" : "messenger",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-05-18T17:49:46+02:00",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "messenger-open-conversation.applescript",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/messenger.png"
},
"identifier" : "d323b0b1ce4d1b6c8f6397c079a23681",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Messenger",
"path" : "communication\/messenger\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open Conversation",
"updatedAt" : "2021-07-23T17:47:14-04:00"
}
]
},
{
"name" : "Zoom",
"path" : "zoom",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Faris Aziz",
"url" : "https:\/\/github.com\/farisaziz12"
}
],
"createdAt" : "2021-05-02T20:25:26+02:00",
"currentDirectoryPath" : null,
"description" : "Leaves Current Zoom meeting",
"filename" : "leave-meeting.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/zoom-logo.png"
},
"identifier" : "1bfa04dd638bb1a5f9d93f3a556e96a3",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : true,
"packageName" : "Zoom",
"path" : "communication\/zoom\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Leave Meeting",
"updatedAt" : "2021-05-03T09:54:17Z"
},
{
"authors" : [
{
"name" : "Leo Voon",
"url" : "https:\/\/github.com\/leovoon"
}
],
"createdAt" : "2023-03-31T09:30:18+08:00",
"currentDirectoryPath" : null,
"description" : "Rename your profile in Zoom Meeting App (Mac Only) and cliclick.",
"filename" : "rename-profile.applescript",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/zoom-logo.png"
},
"identifier" : "ff7531c3b095eb59465663d7b2e5626b",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Zoom",
"path" : "communication\/zoom\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Rename Profile",
"updatedAt" : "2023-03-31T03:48:28Z"
},
{
"authors" : [
{
"name" : "Luigi Cardito",
"url" : "https:\/\/github.com\/lcardito"
},
{
"name" : "Faris Aziz",
"url" : "https:\/\/github.com\/farisaziz12"
}
],
"createdAt" : "2021-08-31T10:32:28+02:00",
"currentDirectoryPath" : null,
"description" : "Show\/Hide your microphone in the current meeting",
"filename" : "toggle-video.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/zoom-logo.png"
},
"identifier" : "a36414a653b2c264285dc7fd4b62563b",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Zoom",
"path" : "communication\/zoom\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Toggle Video",
"updatedAt" : "2021-08-31T16:37:44+02:00"
},
{
"authors" : [
{
"name" : "Luigi Cardito",
"url" : "https:\/\/github.com\/lcardito"
},
{
"name" : "Faris Aziz",
"url" : "https:\/\/github.com\/farisaziz12"
}
],
"createdAt" : "2021-08-31T10:32:28+02:00",
"currentDirectoryPath" : null,
"description" : "Mute\/Unmute your microphone in the current meeting",
"filename" : "toggle-mic.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/zoom-logo.png"
},
"identifier" : "5f4ac638a28f19b6fa2f377204f1d6dc",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Zoom",
"path" : "communication\/zoom\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Toggle Microphone",
"updatedAt" : "2021-08-31T16:37:44+02:00"
}
]
},
{
"name" : "Slack",
"path" : "slack",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-05-16T16:05:58+02:00",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "slack-open-workspace-by-index.applescript",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/slack-logo.png"
},
"identifier" : "4a802368b9f32f0e1f2f6a44338f7ce8",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Slack",
"path" : "communication\/slack\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open Workspace by Index",
"updatedAt" : "2021-07-23T17:47:56-04:00"
},
{
"authors" : [
{
"name" : "alongat",
"url" : "https:\/\/github.com\/alongat"
}
],
"createdAt" : "2021-01-05T21:47:13+02:00",
"currentDirectoryPath" : null,
"description" : "Set your status in Slack to a song currently playing in Spotify.",
"filename" : "set-slack-status-spotify.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/slack-logo.png"
},
"identifier" : "01d42581576437961b8a3aa2af5e6b93",
"isTemplate" : false,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Slack",
"path" : "communication\/slack\/",
"refreshTime" : "30s",
"schemaVersion" : 1,
"title" : "Set Status in Slack to Spotify Song",
"updatedAt" : "2021-01-24T22:49:22+02:00"
},
{
"authors" : [
{
"name" : "Sam Ching",
"url" : "https:\/\/github.com\/samching"
}
],
"createdAt" : "2020-11-26T13:39:55Z",
"currentDirectoryPath" : null,
"description" : "Clear DND Status in Slack",
"filename" : "clear-slack-DND-status.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/slack-logo.png"
},
"identifier" : "05872fc3bb67f93dd979fe0f25b06545",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Slack",
"path" : "communication\/slack\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Clear Slack DND",
"updatedAt" : "2021-01-24T22:49:22+02:00"
},
{
"authors" : [
{
"name" : "Zeb Pykosz",
"url" : "https:\/\/github.com\/zebapy"
}
],
"createdAt" : "2020-11-26T13:39:55Z",
"currentDirectoryPath" : null,
"description" : "Create a Slack reminder",
"filename" : "add-slack-reminder.template.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "⏰"
},
"identifier" : "8f2bf69938e8df32b08bf016b259d993",
"isTemplate" : true,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Slack",
"path" : "communication\/slack\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Add Reminder",
"updatedAt" : "2022-01-15T18:23:42Z"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-05-18T10:01:58+02:00",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "slack-open-workspace-by-name.applescript",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/slack-logo.png"
},
"identifier" : "d2fdd94734c119a616fe67b54ebcdd7c",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Slack",
"path" : "communication\/slack\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open Workspace by Name",
"updatedAt" : "2021-07-23T17:48:20-04:00"
},
{
"authors" : [
{
"name" : "Thomas Paul Mann",
"url" : "https:\/\/github.com\/thomaspaulmann"
}
],
"createdAt" : "2020-11-26T13:39:55Z",
"currentDirectoryPath" : null,
"description" : "Clear your status in Slack.",
"filename" : "clear-slack-status.template.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🧼"
},
"identifier" : "17d4ffd95aaa50ac53208639c1807969",
"isTemplate" : true,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Slack",
"path" : "communication\/slack\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Clear Status",
"updatedAt" : "2020-11-26T13:44:17Z"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-05-18T07:53:58+02:00",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "slack-jump-to.applescript",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/slack-logo.png"
},
"identifier" : "27ca9558af53540a5077aa69fcbcd4db",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Slack",
"path" : "communication\/slack\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Jump to...",
"updatedAt" : "2021-07-23T17:47:47-04:00"
},
{
"authors" : [
{
"name" : "alongat",
"url" : "https:\/\/github.com\/alongat"
}
],
"createdAt" : "2021-01-16T22:05:43+02:00",
"currentDirectoryPath" : null,
"description" : "Set your status in Slack to WFH or WFO depending on your WiFi",
"filename" : "set-slack-wfh-status.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/slack-logo.png"
},
"identifier" : "2f4a857abf56b4212c65bae64c6ccd1a",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Slack",
"path" : "communication\/slack\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Set WFH Status in Slack",
"updatedAt" : "2021-01-24T22:49:22+02:00"
},
{
"authors" : [
{
"name" : "Faris Aziz",
"url" : "https:\/\/github.com\/farisaziz12"
}
],
"createdAt" : "2021-05-03T16:28:28+02:00",
"currentDirectoryPath" : null,
"description" : "This script posts a message text to a slack channel and sets active status (defaults to random good morning message in #general)",
"filename" : "slack-send-message.applescript",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/slack-logo.png"
},
"identifier" : "1461432132438418bd52997cf850803f",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : true,
"packageName" : "Slack",
"path" : "communication\/slack\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Send Message in Channel",
"updatedAt" : "2021-05-03T14:30:44Z"
},
{
"authors" : [
{
"name" : "Thomas Paul Mann",
"url" : "https:\/\/github.com\/thomaspaulmann"
}
],
"createdAt" : "2020-11-26T13:39:55Z",
"currentDirectoryPath" : null,
"description" : "Set your status in Slack.",
"filename" : "set-slack-status.template.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "☕️"
},
"identifier" : "57e23350fff64274696cfe28cce9d8ee",
"isTemplate" : true,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Slack",
"path" : "communication\/slack\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Set Status to Coffee",
"updatedAt" : "2020-11-26T18:24:36Z"
},
{
"authors" : [
{
"name" : "Sam Ching",
"url" : "https:\/\/github.com\/samching"
}
],
"createdAt" : "2020-11-29T18:11:58-05:00",
"currentDirectoryPath" : null,
"description" : "Set your DND status in Slack",
"filename" : "set-slack-DND-status.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/slack-logo.png"
},
"identifier" : "2b163126ade42de031d2e7ebe0a63c00",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Slack",
"path" : "communication\/slack\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Set DND Status",
"updatedAt" : "2021-03-04T08:32:41+01:00"
},
{
"authors" : [
{
"name" : "Cody Carrell",
"url" : "https:\/\/raycast.com\/sourcecody"
}
],
"createdAt" : "2024-03-10T17:10:31-04:00",
"currentDirectoryPath" : null,
"description" : "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.",
"filename" : "slack-dev-mode.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/slack-logo.png"
},
"identifier" : "7c43ddc9b86f860583abf7ea64a4d324",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Slack",
"path" : "communication\/slack\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Launch Dev Mode",
"updatedAt" : "2024-03-10T21:12:02Z"
}
]
},
{
"name" : "Cloudup",
"path" : "cloudup",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-11-07T14:59:48-05:00",
"currentDirectoryPath" : null,
"description" : "Upload path or URL in clipboard to [Cloudup](https:\/\/cloudup.com\/).",
"filename" : "cloudup-upload.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/cloudup-logo.png"
},
"identifier" : "1d19e17167ac0881721d259150cbd124",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Cloudup",
"path" : "communication\/cloudup\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Upload",
"updatedAt" : "2020-11-28T13:47:03-05:00"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-11-07T14:59:48-05:00",
"currentDirectoryPath" : null,
"description" : "Open file dialog and upload to [Cloudup](https:\/\/cloudup.com\/).",
"filename" : "cloudup-pick.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/cloudup-logo.png"
},
"identifier" : "dde6ec22216c5e9e5befc0f6f7d03530",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Cloudup",
"path" : "communication\/cloudup\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Pick",
"updatedAt" : "2020-11-28T13:47:03-05:00"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-11-07T14:59:48-05:00",
"currentDirectoryPath" : null,
"description" : "Upload clipboard contents to [Cloudup](https:\/\/cloudup.com\/).",
"filename" : "cloudup-paste.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/cloudup-logo.png"
},
"identifier" : "c95e8b9dcdd3aff96e0e7d2499528210",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Cloudup",
"path" : "communication\/cloudup\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Paste",
"updatedAt" : "2020-11-28T13:47:03-05:00"
}
]
},
{
"name" : "Emojis",
"path" : "emojis",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-11-16T16:27:42-05:00",
"currentDirectoryPath" : null,
"description" : "Search for emojis related to input.",
"filename" : "emojis-search.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "📙"
},
"identifier" : "ca84f5b82455c8b57880dbd2257b2137",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Communication",
"path" : "communication\/emojis\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search Emojis",
"updatedAt" : "2020-11-28T13:47:03-05:00"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-11-16T16:27:42-05:00",
"currentDirectoryPath" : null,
"description" : "Copy first emoji related to input.",
"filename" : "emoji-copy.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "📙"
},
"identifier" : "0b6610d2a4025e0cde003b6de4d28026",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Communication",
"path" : "communication\/emojis\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search and Copy First Related Emoji",
"updatedAt" : "2020-11-28T12:02:29-05:00"
},
{
"authors" : [
{
"name" : "Tomohiro Nishimura",
"url" : "https:\/\/github.com\/Sixeight"
}
],
"createdAt" : "2025-01-23T18:29:53+09:00",
"currentDirectoryPath" : null,
"description" : "Copy a random emoji to the clipboard.",
"filename" : "random-emoji.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🎲"
},
"identifier" : "52479cec0740642d40a8902ee5efa1fe",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Emojis",
"path" : "communication\/emojis\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Random Emoji",
"updatedAt" : "2025-03-25T19:27:06+09:00"
}
]
},
{
"name" : "Gmail",
"path" : "gmail",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Michael Aigner",
"url" : "https:\/\/github.com\/tonka3000"
}
],
"createdAt" : "2020-12-07T17:06:46+01:00",
"currentDirectoryPath" : null,
"description" : "Open gmail.com in the default browser",
"filename" : "google-gmail.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/google-gmail-logo.png"
},
"identifier" : "662ff76918550ca9bf46ad724d87ac91",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Google",
"path" : "communication\/gmail\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Gmail",
"updatedAt" : "2020-12-07T20:12:02Z"
}
]
}
]
},
{
"name" : "Web Searches",
"path" : "web-searches",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Jon Callahan",
"url" : "https:\/\/www.joncallahan.com"
}
],
"createdAt" : "2020-11-27T06:57:40-08:00",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "mozilla-developer-network.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/mozilla-developer-network.png"
},
"identifier" : "a62ffa9e47fad8ce4b16d33b46fa7ada",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search MDN (Mozilla Developer Network)",
"updatedAt" : "2021-02-22T23:18:02+01:00"
},
{
"authors" : [
{
"name" : "Jax0rz",
"url" : null
}
],
"createdAt" : "2020-12-27T11:33:45+08:00",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "search-in-bilibili.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/bilibili.png"
},
"identifier" : "6a254f4ee998b0831f7cfd45da57c005",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search in Bilibili",
"updatedAt" : "2021-01-05T12:30:16Z"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-11-24T02:48:26-05:00",
"currentDirectoryPath" : null,
"description" : "Search [cdnjs.com](https:\/\/cdnjs.com\/) for library.",
"filename" : "search-cdnjs.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/cloudflare-logo.png"
},
"identifier" : "bf8c3f617de74111aa361af48038d25f",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search cdnjs",
"updatedAt" : "2021-02-22T23:18:02+01:00"
},
{
"authors" : [
{
"name" : "Andrei Borisov",
"url" : "https:\/\/github.com\/andreiborisov"
}
],
"createdAt" : "2020-11-19T15:07:52Z",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "kinopoisk.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/kinopoisk.png"
},
"identifier" : "3035530c75101abbeb24a0a27b0ed685",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search in Kinopoisk",
"updatedAt" : "2021-01-29T19:03:28+03:00"
},
{
"authors" : [
{
"name" : "Roland Leth",
"url" : "https:\/\/runtimesharks.com"
}
],
"createdAt" : "2021-03-14T10:07:47+02:00",
"currentDirectoryPath" : null,
"description" : "Translates via Google Translate",
"filename" : "google-translate.rb",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🌍"
},
"identifier" : "63a5465b18915d379fa63a6a3339652a",
"isTemplate" : false,
"language" : "ruby",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Google Translate",
"updatedAt" : "2021-08-27T15:40:05+02:00"
},
{
"authors" : [
{
"name" : "Zander Martineau",
"url" : "https:\/\/zander.wtf"
}
],
"createdAt" : "2020-11-24T21:18:01Z",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "giphy.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/giphy.png"
},
"identifier" : "3613b602176200bab2cb81cf3e3a31fc",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Giphy search",
"updatedAt" : "2021-02-22T23:18:02+01:00"
},
{
"authors" : null,
"createdAt" : "2020-11-19T15:07:52Z",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "yandex-search.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/yandex.png"
},
"identifier" : "14ac258936b541c8b080afd875c888e9",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search in Yandex",
"updatedAt" : "2021-04-27T23:35:53+03:00"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-11-29T20:42:38-05:00",
"currentDirectoryPath" : null,
"description" : "Search Netflix.",
"filename" : "search-netflix.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/netflix-logo.png"
},
"identifier" : "f23559720b44c78c6c763f9f999153e8",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search Netflix",
"updatedAt" : "2021-02-22T23:18:02+01:00"
},
{
"authors" : [
{
"name" : "Benedict Neo",
"url" : "https:\/\/github.com\/benthecoder"
}
],
"createdAt" : "2021-05-04T20:17:28+08:00",
"currentDirectoryPath" : null,
"description" : "Searches coinmarketcap currencies.",
"filename" : "search-coinmarketcap.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🪙"
},
"identifier" : "451ddeb79ef02e03e6af7132ceba99c0",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Search Coinmarketcap",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "CoinMarketCap Search",
"updatedAt" : "2021-05-04T15:47:27+02:00"
},
{
"authors" : [
{
"name" : "sunbufu",
"url" : "https:\/\/sunbufu.github.io\/"
}
],
"createdAt" : "2021-02-16T17:51:26+08:00",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "translate-with-baidu.template.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/baidu-translate.png"
},
"identifier" : "2747cbdea0aa1fd082620aca852a9c11",
"isTemplate" : true,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Translate with Baidu",
"updatedAt" : "2021-02-16T17:51:26+08:00"
},
{
"authors" : [
{
"name" : "Andrei Borisov",
"url" : "https:\/\/github.com\/andreiborisov"
}
],
"createdAt" : "2021-01-30T23:52:56+03:00",
"currentDirectoryPath" : null,
"description" : "Search in App Store app",
"filename" : "app-store.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/app-store.png"
},
"identifier" : "94217255062eb0133a0d4cd0d2bfd91b",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search in App Store",
"updatedAt" : "2021-01-30T23:52:56+03:00"
},
{
"authors" : [
{
"name" : "Zander Martineau",
"url" : "https:\/\/zander.wtf"
}
],
"createdAt" : "2020-11-24T21:18:01Z",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "njt.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🐸"
},
"identifier" : "bf292fd5c6a6daeb7cb500aed47c97ce",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "njt",
"updatedAt" : "2021-02-22T23:18:02+01:00"
},
{
"authors" : null,
"createdAt" : "2020-11-19T21:13:15Z",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "npmjs.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/npmjs.png"
},
"identifier" : "1c60d434bfa470adfa9e5c4fad31a29a",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search npm Packages",
"updatedAt" : "2021-02-22T23:18:02+01:00"
},
{
"authors" : [
{
"name" : "Phil Salant",
"url" : "https:\/\/github.com\/PSalant726"
}
],
"createdAt" : "2021-01-15T19:33:39-05:00",
"currentDirectoryPath" : null,
"description" : "Search pkg.go.dev for package documentation",
"filename" : "pkg-go-dev.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/go.png"
},
"identifier" : "3e353cacc9a32594ee0e35b6d429860c",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search Go Package Documentation",
"updatedAt" : "2021-01-18T16:44:26Z"
},
{
"authors" : [
{
"name" : "Zander Martineau",
"url" : "https:\/\/zander.wtf"
}
],
"createdAt" : "2020-11-19T21:13:15Z",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "repo.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "📦"
},
"identifier" : "fd304aeeb3b07086af4d259dc6bd8a44",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open npm Package Repo",
"updatedAt" : "2021-02-22T23:18:02+01:00"
},
{
"authors" : [
{
"name" : "Jax0rz",
"url" : null
}
],
"createdAt" : "2020-12-27T11:33:45+08:00",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "search-in-baidu.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/baidu.png"
},
"identifier" : "6e554e964804583913116bab85b8f8ce",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search in Baidu",
"updatedAt" : "2021-01-05T12:30:16Z"
},
{
"authors" : [
{
"name" : "Chris Koerner Zeller",
"url" : "https:\/\/github.com\/ChessMess"
}
],
"createdAt" : "2021-03-04T09:55:55-05:00",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "search-in-dndbeyond.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : ".\/images\/ddbicon.png"
},
"identifier" : "1a0ffb01f735b1adb548ece3b463d337",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search in DnDBeyond.com",
"updatedAt" : "2021-03-04T12:35:48-05:00"
},
{
"authors" : null,
"createdAt" : "2020-11-19T15:07:52Z",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "twitter-search.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/twitter.png"
},
"identifier" : "5325fd3de931054a254082b1ce061ec9",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search in Twitter",
"updatedAt" : "2021-02-22T23:18:02+01:00"
},
{
"authors" : [
{
"name" : "Jax0rz",
"url" : null
}
],
"createdAt" : "2020-12-27T11:33:45+08:00",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "search-in-zhihu.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/zhihu.png"
},
"identifier" : "24dc5c3101863a686c8199013859f430",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search in Zhihu",
"updatedAt" : "2021-01-05T12:30:16Z"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-11-24T12:49:12-05:00",
"currentDirectoryPath" : null,
"description" : "Search [Unsplash](https:\/\/unsplash.com).",
"filename" : "search-unsplash.sh",
"hasArguments" : true,
"icon" : {
"dark" : "images\/unsplash-logo-iconDark.png",
"light" : "images\/unsplash-logo.png"
},
"identifier" : "5d394ef839f8f7cde7314acce890d250",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search Unsplash",
"updatedAt" : "2020-12-02T14:53:50-05:00"
},
{
"authors" : [
{
"name" : "Alessandra Pereyra",
"url" : "https:\/\/github.com\/alessandrapereyra"
}
],
"createdAt" : "2022-09-09T11:36:33-05:00",
"currentDirectoryPath" : null,
"description" : "Open 17TRACK with the tracking code found in the clipboard",
"filename" : "clipboard-to-17track.js",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🚚"
},
"identifier" : "5bf7134b1d8dfeca8b30b6b3a598f247",
"isTemplate" : false,
"language" : "node",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Clipboard to 17TRACK",
"updatedAt" : "2022-09-09T11:36:33-05:00"
},
{
"authors" : [
{
"name" : "Wade Garrett",
"url" : "https:\/\/wadegarrett.com"
}
],
"createdAt" : "2021-05-26T23:53:16-05:00",
"currentDirectoryPath" : null,
"description" : "Search [pub.dev](https:\/\/pub.dev\/) for packages to build Dart and Flutter apps.",
"filename" : "pub-search.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/dart-logo.png"
},
"identifier" : "1e4035244521e2dcd75dfd628233b19a",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Pub.dev Search",
"updatedAt" : "2021-05-31T09:21:31Z"
},
{
"authors" : [
{
"name" : "sunbufu",
"url" : "https:\/\/sunbufu.github.io\/"
}
],
"createdAt" : "2021-02-16T17:51:26+08:00",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "translate-with-google.template.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/google-translate.png"
},
"identifier" : "66a9a660752d72d78d5d210da52f9364",
"isTemplate" : true,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Translate with Google",
"updatedAt" : "2021-02-16T17:51:26+08:00"
},
{
"authors" : null,
"createdAt" : "2020-11-19T15:07:52Z",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "amazon.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/amazon.png"
},
"identifier" : "7ca50f13f43b953f6d587c52f61005a9",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search in Amazon",
"updatedAt" : "2021-04-02T14:02:23-04:00"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-11-24T12:49:12-05:00",
"currentDirectoryPath" : null,
"description" : "Search [WP Engine](https:\/\/wpengine.com) installs.",
"filename" : "search-wpengine-installs.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/wpengine-logo.png"
},
"identifier" : "77cda0a2c18fa52437888cd6cca81d42",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search WP Engine Installs",
"updatedAt" : "2021-02-22T23:18:02+01:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-05-17T01:54:39+02:00",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "check-weather.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🌦"
},
"identifier" : "89e16f559eec7369f442eb1208c72107",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "wttr.in",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Check Weather",
"updatedAt" : "2021-05-18T07:57:13+02:00"
},
{
"authors" : [
{
"name" : "Zander Martineau",
"url" : "https:\/\/zander.wtf"
}
],
"createdAt" : "2020-11-24T21:18:01Z",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "unfurl.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🔗"
},
"identifier" : "19f9cd5c3c78c5008f84417d01f14dee",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Unfurl URL",
"updatedAt" : "2021-02-22T23:18:02+01:00"
},
{
"authors" : [
{
"name" : "Jax0rz",
"url" : null
}
],
"createdAt" : "2020-12-27T11:33:45+08:00",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "search-in-wikipedia.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/wikipedia.png"
},
"identifier" : "9eeb58b0819b5d0cfa9a84b739077880",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search in Wikipedia",
"updatedAt" : "2021-02-16T16:00:45Z"
},
{
"authors" : [
{
"name" : "Razvan Azamfirei",
"url" : "https:\/\/github.com\/razvanazamfirei"
}
],
"createdAt" : "2022-12-16T16:54:47-05:00",
"currentDirectoryPath" : null,
"description" : "Parses and opens DOI links in your browser",
"filename" : "doi.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "📖"
},
"identifier" : "f0a1d84b48cb82b7b89f17f05565d7f5",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "DOI",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Find Paper",
"updatedAt" : "2022-12-16T16:54:47-05:00"
},
{
"authors" : [
{
"name" : "Benedict Neo",
"url" : "https:\/\/github.com\/benthecoder"
}
],
"createdAt" : "2021-05-07T03:17:13+08:00",
"currentDirectoryPath" : null,
"description" : "Search for emojis at emojipedia.",
"filename" : "search-emojipedia.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🔎"
},
"identifier" : "dff7a5b11421eb5fbca70e5e567526e2",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search in Emojipedia",
"updatedAt" : "2021-05-07T07:58:55+02:00"
},
{
"authors" : [
{
"name" : "Daniel Sieradski",
"url" : "https:\/\/github.com\/selfagency"
}
],
"createdAt" : "2023-04-20T10:30:42-04:00",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "opensecrets.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/opensecrets.png"
},
"identifier" : "38597aea679968985276b287c7860174",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search OpenSecrets.org",
"updatedAt" : "2023-04-24T06:57:26Z"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-12-04T22:42:03-05:00",
"currentDirectoryPath" : null,
"description" : "Open specified [WP Engine](https:\/\/wpengine.com) install.",
"filename" : "wpengine-install.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/wpengine-logo.png"
},
"identifier" : "5949a935338b8a2cd8808c92a5a78aa5",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open WP Engine Install",
"updatedAt" : "2020-12-07T10:40:46-05:00"
},
{
"authors" : [
{
"name" : "Zander Martineau",
"url" : "https:\/\/zander.wtf"
}
],
"createdAt" : "2020-11-24T21:18:01Z",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "caniuse.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "❓"
},
"identifier" : "d57b60f7bec95ebaf6ecd985d539eb33",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Caniuse.com search",
"updatedAt" : "2021-02-22T23:18:02+01:00"
},
{
"authors" : [
{
"name" : "Tanguy Le Stradic",
"url" : "https:\/\/github.com\/tanguyls"
}
],
"createdAt" : "2020-12-07T20:16:05+01:00",
"currentDirectoryPath" : null,
"description" : "Search files in Figma",
"filename" : "figma.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/figma.png"
},
"identifier" : "689f477e616d7c7a0439c66b2a26c2cc",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search in Figma",
"updatedAt" : "2021-02-22T23:18:02+01:00"
},
{
"authors" : [
{
"name" : "Matthew Gleich",
"url" : "https:\/\/mattglei.ch"
}
],
"createdAt" : "2021-03-13T17:27:25-05:00",
"currentDirectoryPath" : null,
"description" : "Search for a rust crate on crates.io",
"filename" : "rust-crate.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : ".\/images\/cargo-logo.png"
},
"identifier" : "9bc23b6009c4631c2153c0f4b8712369",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Search",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search for Crate",
"updatedAt" : "2021-03-17T00:15:37-04:00"
},
{
"authors" : [
{
"name" : "Zander Martineau",
"url" : "https:\/\/zander.wtf"
}
],
"createdAt" : "2020-11-19T21:13:15Z",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "npms.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/npms.png"
},
"identifier" : "c50c4272f0b39efd127d169968b96a9c",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "npms",
"updatedAt" : "2021-02-22T23:18:02+01:00"
},
{
"authors" : [
{
"name" : "Sasivarnan R",
"url" : "https:\/\/github.com\/sasivarnan"
}
],
"createdAt" : "2020-11-22T18:23:32+05:30",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "ecosia.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/ecosia.png"
},
"identifier" : "758a76a0377d915c7cb7817c11d78a8c",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search in Ecosia",
"updatedAt" : "2021-02-22T23:18:02+01:00"
},
{
"authors" : [
{
"name" : "sunbufu",
"url" : "https:\/\/sunbufu.github.io\/"
}
],
"createdAt" : "2021-02-13T21:40:07+08:00",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "search-in-jingdong.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/jingdong.png"
},
"identifier" : "147fa1b2258dddb1bdfe2b851fb7136d",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search in Jingdong",
"updatedAt" : "2021-02-16T17:51:26+08:00"
},
{
"authors" : null,
"createdAt" : "2020-11-19T15:07:52Z",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "grep-app-search.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "https:\/\/grep.app\/favicon.ico"
},
"identifier" : "3c1b4b1b7f98114881247bd9e9c44166",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search in grep.app",
"updatedAt" : "2021-02-22T23:18:02+01:00"
},
{
"authors" : [
{
"name" : "Phil Salant",
"url" : "https:\/\/github.com\/PSalant726"
}
],
"createdAt" : "2021-03-03T16:44:26-05:00",
"currentDirectoryPath" : null,
"description" : "Search PostgreSQL documentation",
"filename" : "postgresql.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/psql.png"
},
"identifier" : "613c71297c151b108ad75ab5a7c1ecd6",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "PostgreSQL Documentation",
"updatedAt" : "2021-03-04T12:40:16-05:00"
},
{
"authors" : [
{
"name" : "Razvan Azamfirei",
"url" : "https:\/\/github.com\/razvanazamfirei"
}
],
"createdAt" : "2022-12-16T16:54:47-05:00",
"currentDirectoryPath" : null,
"description" : "Scans clipboard and opens DOI links in your browser",
"filename" : "doi-clipboard.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "📖"
},
"identifier" : "5a5b14ccec3b42e5980dbd993beee9db",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "DOI",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Find Paper",
"updatedAt" : "2022-12-16T16:54:47-05:00"
},
{
"authors" : [
{
"name" : "Achille Lacoin",
"url" : "https:\/\/github.com\/pomdtr"
}
],
"createdAt" : "2021-05-23T18:01:06+02:00",
"currentDirectoryPath" : null,
"description" : "Open the first DuckDuckGo search result page for your query (also supports bang!)",
"filename" : "im-feeling-ducky.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : ".\/images\/duck-duck-go.png"
},
"identifier" : "3ee1a0eaf376792ede9a3bfdb91e3b74",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "I'm Feeling Ducky",
"updatedAt" : "2021-05-23T18:01:06+02:00"
},
{
"authors" : [
{
"name" : "Marco Varisco",
"url" : "https:\/\/github.com\/mava"
}
],
"createdAt" : "2021-04-17T17:04:15-04:00",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "arxiv.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/arxiv.png"
},
"identifier" : "60c8adb8288a5cf3ceb6936b1184f15a",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search in arXiv",
"updatedAt" : "2021-04-22T23:08:33-04:00"
},
{
"authors" : null,
"createdAt" : "2021-02-26T19:18:23Z",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "search-swift-github.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : ".\/images\/swift.png"
},
"identifier" : "ded067c8f231e019897a58bd2b5bb30c",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search Swift Code",
"updatedAt" : "2021-02-26T19:18:23Z"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-11-24T12:49:12-05:00",
"currentDirectoryPath" : null,
"description" : "Search [GitHub](https:\/\/github.com).",
"filename" : "search-github.sh",
"hasArguments" : true,
"icon" : {
"dark" : "images\/github-logo-iconDark.png",
"light" : "images\/github-logo.png"
},
"identifier" : "5eb2c938ea4fc44d2615230d2249305f",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search GitHub",
"updatedAt" : "2021-02-22T23:18:02+01:00"
},
{
"authors" : null,
"createdAt" : "2020-11-19T15:07:52Z",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "duck-duck-go.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/duck-duck-go.png"
},
"identifier" : "137568a154ee81cb2a1ca68aa4bbfd0d",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search in DuckDuckGo",
"updatedAt" : "2021-01-05T12:30:16Z"
},
{
"authors" : [
{
"name" : "Francois",
"url" : "https:\/\/github.com\/AsterYujano"
}
],
"createdAt" : "2020-12-27T11:33:45+08:00",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "search-in-devhints.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/devhints.png"
},
"identifier" : "f6f2addf68e5f329bd2e1351cc9a264c",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search in devhints.io",
"updatedAt" : "2021-02-24T15:01:38+01:00"
},
{
"authors" : [
{
"name" : "Lucas Costa",
"url" : "https:\/\/github.com\/lucasrcosta"
}
],
"createdAt" : "2021-02-19T16:13:59-08:00",
"currentDirectoryPath" : null,
"description" : "Search IMDB.",
"filename" : "search-imdb.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/imdb.png"
},
"identifier" : "9319290c0a1ce9fdd2bfb087fc36e79f",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search IMDB",
"updatedAt" : "2021-02-21T22:06:55Z"
},
{
"authors" : null,
"createdAt" : "2020-11-19T15:07:52Z",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "youtube.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/youtube.png"
},
"identifier" : "aed6056723b8ff63788a8cec2fdfa88a",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search in YouTube",
"updatedAt" : "2021-01-05T12:30:16Z"
},
{
"authors" : [
{
"name" : "Zander Martineau",
"url" : "https:\/\/zander.wtf"
}
],
"createdAt" : "2020-11-19T21:13:15Z",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "bundlephobia.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "📦"
},
"identifier" : "be1cdb15aaca06deb525512db504e89a",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Bundlephobia cost",
"updatedAt" : "2021-02-22T23:18:02+01:00"
},
{
"authors" : [
{
"name" : "The Swift Package Index",
"url" : "https:\/\/swiftpackageindex.com"
}
],
"createdAt" : "2021-05-20T16:49:36+01:00",
"currentDirectoryPath" : null,
"description" : "Search for Swift packages in the Swift Package Index.",
"filename" : "swift-package-index.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/spi.png"
},
"identifier" : "143dfe6f71f6a1dfcaf7aed15c9397c3",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Swift Package Index",
"updatedAt" : "2021-05-20T16:49:36+01:00"
},
{
"authors" : null,
"createdAt" : "2020-11-19T15:07:52Z",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "crunchbase.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/crunchbase.png"
},
"identifier" : "31c55bcec6408a3702a8f834a2b6457e",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search in Crunchbase",
"updatedAt" : "2021-02-22T23:18:02+01:00"
},
{
"authors" : null,
"createdAt" : "2020-11-19T15:07:52Z",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "google-search.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/google.png"
},
"identifier" : "892301cd7b236406f6efc128ae07c4e3",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search in Google",
"updatedAt" : "2021-01-05T12:30:16Z"
},
{
"authors" : [
{
"name" : "Zander Martineau",
"url" : "https:\/\/zander.wtf"
}
],
"createdAt" : "2020-11-24T21:18:01Z",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "wayback-machine.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/ia-logo.jpg"
},
"identifier" : "3438cbb2bcc47a029bd463eb8229b673",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Wayback Machine Search",
"updatedAt" : "2021-02-22T23:18:02+01:00"
},
{
"authors" : [
{
"name" : "Shannon Matthews",
"url" : "https:\/\/github.com\/s-oram"
}
],
"createdAt" : "2020-11-22T18:23:32+05:30",
"currentDirectoryPath" : null,
"description" : "Search Hacker News",
"filename" : "search-hacker-news.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/hacker-news.png"
},
"identifier" : "6c9056611a35538a19c2beaec400e9f7",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search Hacker News",
"updatedAt" : "2021-05-23T10:40:15+10:00"
},
{
"authors" : [
{
"name" : "Tanguy Le Stradic",
"url" : "https:\/\/github.com\/tanguyls"
}
],
"createdAt" : "2021-04-09T11:42:18+02:00",
"currentDirectoryPath" : null,
"description" : "Find emails using hunter.io",
"filename" : "hunter.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/hunter.png"
},
"identifier" : "8e6cff3c40f958a3693db43e85566ffa",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Find Email Address With Hunter",
"updatedAt" : "2021-04-09T11:25:34Z"
},
{
"authors" : null,
"createdAt" : "2021-02-19T09:10:21Z",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "google-maps.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/google-map.png"
},
"identifier" : "8a71bb6b31307d65cf23a94c619c9971",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Google Maps",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search Google Maps",
"updatedAt" : "2024-12-05T12:33:50+01:00"
},
{
"authors" : [
{
"name" : "Alexandru Turcanu",
"url" : "https:\/\/github.com\/Pondorasti"
}
],
"createdAt" : "2021-07-13T21:10:54-07:00",
"currentDirectoryPath" : null,
"description" : "Search for Script Commands in the [Unofficial Raycast Script Commands Marketplace](https:\/\/scriptcommands.alexandru.so).",
"filename" : "search-script-command-marketplace.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/marketplace-logo.png"
},
"identifier" : "701670f20721b663d34caa4ebd42fddf",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search Script Command",
"updatedAt" : "2024-12-04T11:52:04+01:00"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-12-07T17:32:35-05:00",
"currentDirectoryPath" : null,
"description" : "Search [PHP official documentation](https:\/\/www.php.net\/docs.php).",
"filename" : "search-php-docs.sh",
"hasArguments" : true,
"icon" : {
"dark" : "images\/php-logo-iconDark.png",
"light" : "images\/php-logo.png"
},
"identifier" : "ca1b15b0f16563f3865627097186d05b",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search PHP Docs",
"updatedAt" : "2021-02-22T23:18:02+01:00"
},
{
"authors" : [
{
"name" : "quelhasu",
"url" : "https:\/\/github.com\/quelhasu"
}
],
"createdAt" : "2021-02-05T16:26:45+01:00",
"currentDirectoryPath" : null,
"description" : "Find the current Spotify track's gender in Chosic",
"filename" : "search-gender-in-chosic.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/chosic.png"
},
"identifier" : "5cd6572c960465d18d40d39e4b5063d6",
"isTemplate" : false,
"language" : "applescript",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search Genre in Chosic",
"updatedAt" : "2021-02-12T11:28:52Z"
},
{
"authors" : [
{
"name" : "Jesse Traynham",
"url" : "https:\/\/github.com\/traynham"
}
],
"createdAt" : "2020-12-07T19:59:12Z",
"currentDirectoryPath" : null,
"description" : "Search in MDN (Mozilla) Docs by topic",
"filename" : "mdn.sh",
"hasArguments" : true,
"icon" : {
"dark" : "images\/mdn_dark.png",
"light" : "images\/mdn_light.png"
},
"identifier" : "991511e9548f80fc5f5dfa70172df0c9",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search in MDN (Mozilla) Docs by Topic",
"updatedAt" : "2021-02-22T23:18:02+01:00"
},
{
"authors" : [
{
"name" : "Nitin Gupta",
"url" : "https:\/\/twitter.com\/gniting"
}
],
"createdAt" : "2021-01-22T22:46:49+01:00",
"currentDirectoryPath" : null,
"description" : "Search LinkedIn",
"filename" : "search-linkedin.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/linkedin.png"
},
"identifier" : "2b9bc8a44f2880a46505af014d37d620",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search LinkedIn",
"updatedAt" : "2021-01-24T20:18:06Z"
},
{
"authors" : [
{
"name" : "lemorage",
"url" : "https:\/\/raycast.com\/lemorage"
}
],
"createdAt" : "2024-09-19T08:42:28+08:00",
"currentDirectoryPath" : null,
"description" : "Search Rust documentation",
"filename" : "search-rust-docs.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/rust.png"
},
"identifier" : "2f4472d80148aaadabf915529d6f68c9",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search Rust Documentation",
"updatedAt" : "2024-09-19T08:42:28+08:00"
},
{
"authors" : [
{
"name" : "Jax0rz",
"url" : null
}
],
"createdAt" : "2020-12-27T19:22:09+08:00",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "search-in-taobao.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/taobao.png"
},
"identifier" : "04277ba6da1c3e592466a9823125dd6e",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search in Taobao",
"updatedAt" : "2021-01-05T12:30:16Z"
},
{
"authors" : [
{
"name" : "Lucas Costa",
"url" : "https:\/\/github.com\/lucasrcosta"
}
],
"createdAt" : "2021-02-20T16:54:22-08:00",
"currentDirectoryPath" : null,
"description" : "Search Python Package Index (PyPI)",
"filename" : "search-pypi.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/pip.png"
},
"identifier" : "c49e96e50bc2c30920f468d9057ec3a7",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search Python Package Index (PyPI)",
"updatedAt" : "2021-05-10T09:23:50+02:00"
},
{
"authors" : [
{
"name" : "Lucas Costa",
"url" : "https:\/\/github.com\/lucasrcosta"
}
],
"createdAt" : "2021-02-20T16:54:22-08:00",
"currentDirectoryPath" : null,
"description" : "Search Python 3 Documentation",
"filename" : "search-python3-docs.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/python.png"
},
"identifier" : "3e2a25007598f01b5e8e5b437759c3f0",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "web-searches\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search Python 3 Documentation",
"updatedAt" : "2021-05-10T09:23:50+02:00"
}
],
"subGroups" : [
{
"name" : "WordPress",
"path" : "wordpress",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-11-24T12:49:12-05:00",
"currentDirectoryPath" : null,
"description" : "Search [WordPress Developer documentation](https:\/\/developer.wordpress.org\/reference\/).",
"filename" : "search-wordpress-docs.sh",
"hasArguments" : true,
"icon" : {
"dark" : "images\/wordpress-logo-iconDark.png",
"light" : "images\/wordpress-logo.png"
},
"identifier" : "a98925d26c19810371ec37ed064dd70a",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "WordPress",
"path" : "web-searches\/wordpress\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search WordPress Docs",
"updatedAt" : "2021-02-22T23:18:02+01:00"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-11-30T16:27:32-05:00",
"currentDirectoryPath" : null,
"description" : "Open [WordPress CLI command reference](https:\/\/developer.wordpress.org\/cli\/commands\/) for specified command.",
"filename" : "wordpress-cli-command.sh",
"hasArguments" : true,
"icon" : {
"dark" : "images\/wordpress-logo-iconDark.png",
"light" : "images\/wordpress-logo.png"
},
"identifier" : "ab5499094ef6353357d01f817812ba76",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "WordPress",
"path" : "web-searches\/wordpress\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "WordPress CLI Command",
"updatedAt" : "2020-12-04T22:07:52-05:00"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-11-29T21:19:56-05:00",
"currentDirectoryPath" : null,
"description" : "Open [WordPress functions reference](https:\/\/developer.wordpress.org\/reference\/functions\/) for specified function.",
"filename" : "wordpress-functions-reference.sh",
"hasArguments" : true,
"icon" : {
"dark" : "images\/wordpress-logo-iconDark.png",
"light" : "images\/wordpress-logo.png"
},
"identifier" : "b149ed5a6cce9f124a9219f368de7ecc",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "WordPress",
"path" : "web-searches\/wordpress\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "WordPress Functions Reference",
"updatedAt" : "2021-02-22T23:18:02+01:00"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-11-29T21:19:56-05:00",
"currentDirectoryPath" : null,
"description" : "Open [WordPress classes reference](https:\/\/developer.wordpress.org\/reference\/classes\/) for specified class.",
"filename" : "wordpress-classes-reference.sh",
"hasArguments" : true,
"icon" : {
"dark" : "images\/wordpress-logo-iconDark.png",
"light" : "images\/wordpress-logo.png"
},
"identifier" : "358cd33183b77c7770949c0b0ab732d3",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "WordPress",
"path" : "web-searches\/wordpress\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "WordPress Classes Reference",
"updatedAt" : "2021-02-22T23:18:02+01:00"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-11-30T14:19:51-05:00",
"currentDirectoryPath" : null,
"description" : "Open [WordPress hooks reference](https:\/\/developer.wordpress.org\/reference\/hooks\/) for specified hook.",
"filename" : "wordpress-hooks-reference.sh",
"hasArguments" : true,
"icon" : {
"dark" : "images\/wordpress-logo-iconDark.png",
"light" : "images\/wordpress-logo.png"
},
"identifier" : "9f17bba3f9bf3cd0276fcb70cef3023f",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "WordPress",
"path" : "web-searches\/wordpress\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "WordPress Hooks Reference",
"updatedAt" : "2021-02-22T23:18:02+01:00"
}
]
}
]
},
{
"name" : "Apps",
"path" : "apps",
"scriptCommands" : [
],
"subGroups" : [
{
"name" : "MeetingBar",
"path" : "meetingbar",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-08-23T05:05:54+02:00",
"currentDirectoryPath" : null,
"description" : "Join the ongoing or upcoming meeting.",
"filename" : "meetingbar-join-meeting.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/meetingbar.png"
},
"identifier" : "b8993c798f512a75626c91ead46662be",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "MeetingBar",
"path" : "apps\/meetingbar\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Join Meeting",
"updatedAt" : "2021-08-23T12:18:02+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-08-23T05:05:54+02:00",
"currentDirectoryPath" : null,
"description" : "Create a new meeting.",
"filename" : "meetingbar-create-meeting.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/meetingbar.png"
},
"identifier" : "79b4a204b8d40f498a14d7d0623bac23",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "MeetingBar",
"path" : "apps\/meetingbar\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Create Meeting",
"updatedAt" : "2021-08-23T12:18:02+02:00"
}
]
},
{
"name" : "Lungo",
"path" : "lungo",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Lungo",
"url" : "https:\/\/sindresorhus.com\/lungo"
}
],
"createdAt" : "2021-10-29T16:08:45+07:00",
"currentDirectoryPath" : null,
"description" : "Toggle Lungo.",
"filename" : "lungo-toggle.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : ".\/images\/lungo.png"
},
"identifier" : "1e1201142099074bd201c2e04bfed472",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Lungo",
"path" : "apps\/lungo\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Toggle",
"updatedAt" : "2021-10-29T16:08:45+07:00"
},
{
"authors" : [
{
"name" : "Lungo",
"url" : "https:\/\/sindresorhus.com\/lungo"
}
],
"createdAt" : "2021-10-29T16:08:45+07:00",
"currentDirectoryPath" : null,
"description" : "Deactivate Lungo.",
"filename" : "lungo-activate.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : ".\/images\/lungo.png"
},
"identifier" : "e41a768d833a7cca41cb21491926b013",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Lungo",
"path" : "apps\/lungo\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Activate",
"updatedAt" : "2021-10-29T16:08:45+07:00"
},
{
"authors" : [
{
"name" : "Lungo",
"url" : "https:\/\/sindresorhus.com\/lungo"
}
],
"createdAt" : "2021-10-29T16:08:45+07:00",
"currentDirectoryPath" : null,
"description" : "Deactivate Lungo.",
"filename" : "lungo-deactivate.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : ".\/images\/lungo.png"
},
"identifier" : "7ad4b7c36c41fb0730596bdd72a12515",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Lungo",
"path" : "apps\/lungo\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Deactivate",
"updatedAt" : "2021-10-29T16:08:45+07:00"
}
]
},
{
"name" : "iTerm",
"path" : "iterm",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Andrei Borisov",
"url" : "https:\/\/github.com\/andreiborisov"
}
],
"createdAt" : "2021-02-02T11:58:56+03:00",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "iterm-run-shell-command.applescript",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/iterm.png"
},
"identifier" : "aad45bb498bc30bd7cf7c2e9405c1477",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "iTerm",
"path" : "apps\/iterm\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Run Shell Command",
"updatedAt" : "2021-02-02T11:58:56+03:00"
},
{
"authors" : [
{
"name" : "sunrisewestern",
"url" : "https:\/\/github.com\/sunrisewestern"
}
],
"createdAt" : "2024-05-23T03:31:30-04:00",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "iterm-open-profile-in-new-window.applescript",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🤖"
},
"identifier" : "c3e9bc8ec6236fd9d214785417f4c420",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "iTerm",
"path" : "apps\/iterm\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open profile",
"updatedAt" : "2024-05-23T07:33:06Z"
}
]
},
{
"name" : "Cleanshot",
"path" : "cleanshot",
"scriptCommands" : [
{
"authors" : [
{
"name" : "CleanShot X",
"url" : "https:\/\/twitter.com\/CleanShot_app"
}
],
"createdAt" : "2021-03-01T16:53:29Z",
"currentDirectoryPath" : null,
"description" : "Opens a new Quick Access Overlay with the specified image or video.",
"filename" : "cleanshot-add-quick-access-overlay.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : ".\/images\/add-quick-access-overlay.png"
},
"identifier" : "7239456521bcd7c3373cf8870936d3a7",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "CleanShot X",
"path" : "apps\/cleanshot\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Add Quick Access Overlay",
"updatedAt" : "2021-07-20T15:49:26+01:00"
},
{
"authors" : [
{
"name" : "CleanShot X",
"url" : "https:\/\/twitter.com\/CleanShot_app"
}
],
"createdAt" : "2021-03-01T16:53:29Z",
"currentDirectoryPath" : null,
"description" : "Opens Text Recognition (OCR) tool or extracts text from the specified file.",
"filename" : "cleanshot-capture-text.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : ".\/images\/capture-text.png"
},
"identifier" : "7fe6d44fdbe6d9bb201ff65b756d860f",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "CleanShot X",
"path" : "apps\/cleanshot\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Capture Text",
"updatedAt" : "2021-07-20T15:49:26+01:00"
},
{
"authors" : [
{
"name" : "CleanShot X",
"url" : "https:\/\/twitter.com\/CleanShot_app"
}
],
"createdAt" : "2021-03-01T16:53:29Z",
"currentDirectoryPath" : null,
"description" : "Take a screenshot of a window.",
"filename" : "cleanshot-capture-window.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : ".\/images\/capture-window.png"
},
"identifier" : "3d218b4cbed21f7454562678b6a0b8ee",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "CleanShot X",
"path" : "apps\/cleanshot\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Capture Window",
"updatedAt" : "2021-05-28T10:40:03+01:00"
},
{
"authors" : [
{
"name" : "CleanShot X",
"url" : "https:\/\/twitter.com\/CleanShot_app"
}
],
"createdAt" : "2021-03-01T16:53:29Z",
"currentDirectoryPath" : null,
"description" : "Take a screenshot of the previously specified area of your screen.",
"filename" : "cleanshot-capture-previous-area.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : ".\/images\/capture-previous-area.png"
},
"identifier" : "43f62174fe500ba2f6cb4661195f3ebb",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "CleanShot X",
"path" : "apps\/cleanshot\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Capture Previous Area",
"updatedAt" : "2021-05-28T10:40:03+01:00"
},
{
"authors" : [
{
"name" : "CleanShot X",
"url" : "https:\/\/twitter.com\/CleanShot_app"
}
],
"createdAt" : "2021-03-01T16:53:29Z",
"currentDirectoryPath" : null,
"description" : "Restore the recently closed file.",
"filename" : "cleanshot-restore.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : ".\/images\/restore.png"
},
"identifier" : "775af547f54533d780759eea34761aeb",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "CleanShot X",
"path" : "apps\/cleanshot\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Restore Recently Closed File",
"updatedAt" : "2021-05-28T10:40:03+01:00"
},
{
"authors" : [
{
"name" : "CleanShot X",
"url" : "https:\/\/twitter.com\/CleanShot_app"
}
],
"createdAt" : "2021-03-01T16:53:29Z",
"currentDirectoryPath" : null,
"description" : "Pin a screenshot to the screen.",
"filename" : "cleanshot-pin.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : ".\/images\/pin.png"
},
"identifier" : "938d3ce2be34e29a9f58d9099996e9ef",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "CleanShot X",
"path" : "apps\/cleanshot\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Pin to the Screen",
"updatedAt" : "2021-05-28T10:40:03+01:00"
},
{
"authors" : [
{
"name" : "CleanShot X",
"url" : "https:\/\/twitter.com\/CleanShot_app"
}
],
"createdAt" : "2021-03-01T16:53:29Z",
"currentDirectoryPath" : null,
"description" : "Opens specified file in Annotate.",
"filename" : "cleanshot-annotate.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : ".\/images\/annotate.png"
},
"identifier" : "ca28647e99a4bbdea940fed93e688236",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "CleanShot X",
"path" : "apps\/cleanshot\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Annotate",
"updatedAt" : "2021-07-20T15:49:26+01:00"
},
{
"authors" : [
{
"name" : "CleanShot X",
"url" : "https:\/\/twitter.com\/CleanShot_app"
}
],
"createdAt" : "2021-03-01T16:53:29Z",
"currentDirectoryPath" : null,
"description" : "Take a screenshot of a specific area on your screen.",
"filename" : "cleanshot-capture-area.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : ".\/images\/capture-area.png"
},
"identifier" : "f0cd821e3dea3225012f1ee24e0ee2a6",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "CleanShot X",
"path" : "apps\/cleanshot\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Capture Area",
"updatedAt" : "2021-05-28T10:40:29+01:00"
},
{
"authors" : [
{
"name" : "CleanShot X",
"url" : "https:\/\/twitter.com\/CleanShot_app"
}
],
"createdAt" : "2021-03-01T16:53:29Z",
"currentDirectoryPath" : null,
"description" : "Open screenshot that is currently in the clipboard.",
"filename" : "cleanshot-open-from-clipboard.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : ".\/images\/clipboard.png"
},
"identifier" : "6c834b826f74f76d659ee54377d73e9e",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "CleanShot X",
"path" : "apps\/cleanshot\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open from Clipboard",
"updatedAt" : "2021-05-28T10:40:03+01:00"
},
{
"authors" : [
{
"name" : "CleanShot X",
"url" : "https:\/\/twitter.com\/CleanShot_app"
}
],
"createdAt" : "2021-03-01T16:53:29Z",
"currentDirectoryPath" : null,
"description" : "Take a screenshot of your screen.",
"filename" : "cleanshot-capture-fullscreen.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : ".\/images\/capture-fullscreen.png"
},
"identifier" : "b4bdb548dc357d8483d2c7afda0fa2ad",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "CleanShot X",
"path" : "apps\/cleanshot\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Capture Fullscreen",
"updatedAt" : "2021-05-28T10:40:03+01:00"
},
{
"authors" : [
{
"name" : "Danylo Zalizchuk",
"url" : "https:\/\/raycast.com\/danulqua"
}
],
"createdAt" : "2023-08-16T16:56:54+03:00",
"currentDirectoryPath" : null,
"description" : "Start a screen recording with keystrokes using the Keystroke Pro app and save it as a video or an optimized GIF file.",
"filename" : "cleanshot-record-screen-with-keystroke-pro.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : ".\/images\/record-screen-keystroke-pro.png"
},
"identifier" : "2b2c4df77dc49c058edc490dd1e4d066",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "CleanShot X",
"path" : "apps\/cleanshot\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Record Screen With Keystroke Pro",
"updatedAt" : "2023-08-16T16:56:54+03:00"
},
{
"authors" : [
{
"name" : "CleanShot X",
"url" : "https:\/\/twitter.com\/CleanShot_app"
}
],
"createdAt" : "2021-03-01T16:53:29Z",
"currentDirectoryPath" : null,
"description" : "Take a screenshot after a specified delay to capture the perfect moment.",
"filename" : "cleanshot-self-timer.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : ".\/images\/self-timer.png"
},
"identifier" : "7ff128b4069f95b91a61d2a920748340",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "CleanShot X",
"path" : "apps\/cleanshot\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Self-Timer",
"updatedAt" : "2021-05-28T10:40:03+01:00"
},
{
"authors" : [
{
"name" : "CleanShot X",
"url" : "https:\/\/twitter.com\/CleanShot_app"
}
],
"createdAt" : "2021-03-01T16:53:29Z",
"currentDirectoryPath" : null,
"description" : "Capture any scrollable content.",
"filename" : "cleanshot-scrolling-capture.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : ".\/images\/scrolling-capture.png"
},
"identifier" : "66f040a60fe27b26e31f2dfea19a9200",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "CleanShot X",
"path" : "apps\/cleanshot\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Scrolling Capture",
"updatedAt" : "2021-05-28T10:40:03+01:00"
},
{
"authors" : [
{
"name" : "CleanShot X",
"url" : "https:\/\/twitter.com\/CleanShot_app"
}
],
"createdAt" : "2021-03-01T16:53:29Z",
"currentDirectoryPath" : null,
"description" : "Start a screen recording and save it as a video or an optimized GIF file.",
"filename" : "cleanshot-record-screen.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : ".\/images\/record-screen.png"
},
"identifier" : "745e006488dbf13262100b0d9992bd06",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "CleanShot X",
"path" : "apps\/cleanshot\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Record Screen",
"updatedAt" : "2021-05-28T10:40:03+01:00"
},
{
"authors" : [
{
"name" : "CleanShot X",
"url" : "https:\/\/twitter.com\/CleanShot_app"
}
],
"createdAt" : "2021-03-01T16:53:29Z",
"currentDirectoryPath" : null,
"description" : "Hide clutter on your Desktop.",
"filename" : "cleanshot-toggle-desktop-icons.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : ".\/images\/toggle-desktop-icons.png"
},
"identifier" : "12f891f99170ce75263600efdf9819e7",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "CleanShot X",
"path" : "apps\/cleanshot\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Toggle Desktop Icons",
"updatedAt" : "2021-05-28T10:40:29+01:00"
}
]
},
{
"name" : "Craft",
"path" : "craft",
"scriptCommands" : [
{
"authors" : [
{
"name" : "James Lyons",
"url" : "https:\/\/github.com\/jamesjlyons"
}
],
"createdAt" : "2021-03-23T13:32:38-07:00",
"currentDirectoryPath" : null,
"description" : "Searches in Workspace in Craft",
"filename" : "craft-search-workspace.template.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : ".\/images\/craft.png"
},
"identifier" : "e2b36133ba62c2b1adf96510991fa097",
"isTemplate" : true,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Craft",
"path" : "apps\/craft\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search in Workspace",
"updatedAt" : "2021-03-23T13:32:38-07:00"
},
{
"authors" : [
{
"name" : "James Lyons",
"url" : "https:\/\/github.com\/jamesjlyons"
}
],
"createdAt" : "2021-03-23T13:32:38-07:00",
"currentDirectoryPath" : null,
"description" : "Creates a doc in Craft",
"filename" : "craft-create-doc.template.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : ".\/images\/craft.png"
},
"identifier" : "ceaaea45ae0681858ca57b43e3c711c1",
"isTemplate" : true,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Craft",
"path" : "apps\/craft\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Create Doc",
"updatedAt" : "2021-03-23T13:32:38-07:00"
}
]
},
{
"name" : "Wikipedia",
"path" : "wikipedia",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Juan I. Serra",
"url" : "https:\/\/twitter.com\/jiserra"
}
],
"createdAt" : "2021-07-20T16:18:28-04:00",
"currentDirectoryPath" : null,
"description" : "Search Wikipedia and display the result in Raycast",
"filename" : "wikipedia-search.py",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/wikipedia.png"
},
"identifier" : "598f86d0a3b9f15d762df1930ee39665",
"isTemplate" : false,
"language" : "python",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Wikipedia",
"path" : "apps\/wikipedia\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Wikipedia Search",
"updatedAt" : "2021-07-23T17:46:53-04:00"
}
]
},
{
"name" : "GoodLinks",
"path" : "goodlinks",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Filip Chabik",
"url" : "https:\/\/github.com\/hadret"
}
],
"createdAt" : "2022-09-21T21:19:09+02:00",
"currentDirectoryPath" : null,
"description" : "Show Read list in the GoodLinks app",
"filename" : "goodlinks-read-list.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/goodlinks.png"
},
"identifier" : "c0796027794a07c76f5eb52bab4e8d39",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "GoodLinks",
"path" : "apps\/goodlinks\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Show Read List",
"updatedAt" : "2022-09-21T21:19:09+02:00"
},
{
"authors" : [
{
"name" : "Filip Chabik",
"url" : "https:\/\/github.com\/hadret"
}
],
"createdAt" : "2022-09-21T21:19:09+02:00",
"currentDirectoryPath" : null,
"description" : "Open a link in the GoodLinks app",
"filename" : "goodlinks-open-link.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/goodlinks.png"
},
"identifier" : "3636d0d2ff5bb61acff5b577e364122a",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "GoodLinks",
"path" : "apps\/goodlinks\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open Link",
"updatedAt" : "2022-09-21T21:19:09+02:00"
},
{
"authors" : [
{
"name" : "Filip Chabik",
"url" : "https:\/\/github.com\/hadret"
}
],
"createdAt" : "2022-09-21T21:19:09+02:00",
"currentDirectoryPath" : null,
"description" : "Show Untagged list in the GoodLinks app",
"filename" : "goodlinks-untagged-list.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/goodlinks.png"
},
"identifier" : "c80ffd45f9345adbcc18b9140d865da0",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "GoodLinks",
"path" : "apps\/goodlinks\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Show Untagged List",
"updatedAt" : "2022-09-21T21:19:09+02:00"
},
{
"authors" : [
{
"name" : "Filip Chabik",
"url" : "https:\/\/github.com\/hadret"
}
],
"createdAt" : "2022-09-21T21:19:09+02:00",
"currentDirectoryPath" : null,
"description" : "Show Unread list in the GoodLinks app",
"filename" : "goodlinks-unread-list.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/goodlinks.png"
},
"identifier" : "bfd473a3c237f50761e5716e9abee708",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "GoodLinks",
"path" : "apps\/goodlinks\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Show Unread List",
"updatedAt" : "2022-09-21T21:19:09+02:00"
},
{
"authors" : [
{
"name" : "Filip Chabik",
"url" : "https:\/\/github.com\/hadret"
}
],
"createdAt" : "2022-09-21T21:19:09+02:00",
"currentDirectoryPath" : null,
"description" : "Open the last unread link in the GoodLinks app",
"filename" : "goodlinks-last-unread-link.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/goodlinks.png"
},
"identifier" : "574ebc7209ea95507f347597e25cc284",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "GoodLinks",
"path" : "apps\/goodlinks\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open Last Unread Link",
"updatedAt" : "2022-09-21T21:19:09+02:00"
},
{
"authors" : [
{
"name" : "Filip Chabik",
"url" : "https:\/\/github.com\/hadret"
}
],
"createdAt" : "2022-09-21T21:19:09+02:00",
"currentDirectoryPath" : null,
"description" : "Show Starred list in the GoodLinks app",
"filename" : "goodlinks-starred-list.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/goodlinks.png"
},
"identifier" : "1b30afbd9d13fa4c0361905818295682",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "GoodLinks",
"path" : "apps\/goodlinks\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Show Starred List",
"updatedAt" : "2022-09-21T21:19:09+02:00"
},
{
"authors" : [
{
"name" : "Filip Chabik",
"url" : "https:\/\/github.com\/hadret"
}
],
"createdAt" : "2022-09-21T21:19:09+02:00",
"currentDirectoryPath" : null,
"description" : "Saves a new link to GoodLinks",
"filename" : "goodlinks-save-link.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/goodlinks.png"
},
"identifier" : "3a5576e914a31aadb395f733a49f047d",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "GoodLinks",
"path" : "apps\/goodlinks\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Save Link",
"updatedAt" : "2022-09-21T21:19:09+02:00"
},
{
"authors" : [
{
"name" : "Filip Chabik",
"url" : "https:\/\/github.com\/hadret"
}
],
"createdAt" : "2022-09-21T21:19:09+02:00",
"currentDirectoryPath" : null,
"description" : "Open a random unread link in the GoodLinks app",
"filename" : "goodlinks-random-unread-link.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/goodlinks.png"
},
"identifier" : "b3f2decfb875757a8a2bcebf5904a88f",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "GoodLinks",
"path" : "apps\/goodlinks\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open Random Unread Link",
"updatedAt" : "2022-09-21T21:19:09+02:00"
},
{
"authors" : [
{
"name" : "Filip Chabik",
"url" : "https:\/\/github.com\/hadret"
}
],
"createdAt" : "2022-09-21T21:19:09+02:00",
"currentDirectoryPath" : null,
"description" : "Show links tagged with the specified tag in the GoodLinks app",
"filename" : "goodlinks-tagged-links.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/goodlinks.png"
},
"identifier" : "10a6aa033cfb6122dfbbe70eaa5ea8e8",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "GoodLinks",
"path" : "apps\/goodlinks\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Show Tag",
"updatedAt" : "2022-09-21T21:19:09+02:00"
}
]
},
{
"name" : "Terminal Translate",
"path" : "terminal-translate",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Fatpandac",
"url" : "https:\/\/github.com\/Fatpandac"
}
],
"createdAt" : "2022-04-04T02:34:41+08:00",
"currentDirectoryPath" : null,
"description" : "Translate word or sentence.",
"filename" : "translate.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "📖"
},
"identifier" : "8cd0465bb037880e1fcc57beb8ffea49",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Terminal Translate",
"path" : "apps\/terminal-translate\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Translate",
"updatedAt" : "2022-04-04T02:34:41+08:00"
}
]
},
{
"name" : "BusyCal",
"path" : "busycal",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Annie Ma",
"url" : "www.anniema.co"
}
],
"createdAt" : "2024-02-06T01:35:01-07:00",
"currentDirectoryPath" : null,
"description" : "Creates new events or tasks in BusyCal.",
"filename" : "new-busycal-event-or-task.applescript",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/busycal.png"
},
"identifier" : "e4f836d21d4fcb8bcf522b1393aad74a",
"isTemplate" : false,
"language" : "applescript",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "BusyCal",
"path" : "apps\/busycal\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Create Event\/Task",
"updatedAt" : "2024-02-06T08:36:45Z"
}
]
},
{
"name" : "Stickies",
"path" : "stickies",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Annie Ma",
"url" : "http:\/\/www.anniema.co\/"
}
],
"createdAt" : "2024-01-26T02:19:25-07:00",
"currentDirectoryPath" : null,
"description" : "This script creates a new floating note in the Apple Stickies application",
"filename" : "new-floating-sticky.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/stickies.png"
},
"identifier" : "dae7953c0397480c8d99a3b0f56176b7",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Stickies",
"path" : "apps\/stickies\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "New Floating Sticky Note",
"updatedAt" : "2024-01-26T09:21:48Z"
}
]
},
{
"name" : "Bartender",
"path" : "bartender",
"scriptCommands" : [
{
"authors" : null,
"createdAt" : "2023-06-02T15:26:22+08:00",
"currentDirectoryPath" : null,
"description" : "Perform a quick search of Menu Bar Items, in Bartender 4",
"filename" : "bartender-search.applescript",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/bartender-icon.png"
},
"identifier" : "be9bfa8f7ef781753490380437a674aa",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Bartender.app",
"path" : "apps\/bartender\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search Bartender",
"updatedAt" : "2023-06-02T15:26:22+08:00"
}
]
},
{
"name" : "Playground",
"path" : "playground",
"readme" : "apps\/playground\/README.md",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Quentin Eude",
"url" : "https:\/\/github.com\/qeude"
}
],
"createdAt" : "2021-06-14T20:32:07+02:00",
"currentDirectoryPath" : null,
"description" : "Create and open a new view based Swift Playground",
"filename" : "open-new-view-playground.py",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🕊"
},
"identifier" : "830a18fee37d756c1a00a65e286113a3",
"isTemplate" : false,
"language" : "python",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Swift Playgrounds",
"path" : "apps\/playground\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Create View Based",
"updatedAt" : "2021-06-14T20:32:07+02:00"
},
{
"authors" : [
{
"name" : "Quentin Eude",
"url" : "https:\/\/github.com\/qeude"
}
],
"createdAt" : "2021-06-14T20:32:07+02:00",
"currentDirectoryPath" : null,
"description" : "Create and open a new basic Swift Playground",
"filename" : "open-new-playground.py",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🕊"
},
"identifier" : "23040420c0f901b4bd478a02943591c5",
"isTemplate" : false,
"language" : "python",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Swift Playgrounds",
"path" : "apps\/playground\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Create Basic",
"updatedAt" : "2021-06-14T20:32:07+02:00"
}
]
},
{
"name" : "Eudic",
"path" : "eudic",
"scriptCommands" : [
{
"authors" : [
{
"name" : "jingyi",
"url" : "https:\/\/jingyi.blog"
}
],
"createdAt" : "2023-02-25T09:21:48+08:00",
"currentDirectoryPath" : null,
"description" : "look up in eudic",
"filename" : "look-up-in-eudic.applescript",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : ".\/images\/eudic.png"
},
"identifier" : "0d031b91eae5648603862a92b89d0ef5",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Eudic",
"path" : "apps\/eudic\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Look up Word",
"updatedAt" : "2023-02-25T09:21:48+08:00"
}
]
},
{
"name" : "One Thing",
"path" : "one-thing",
"scriptCommands" : [
{
"authors" : [
{
"name" : "One Thing",
"url" : "https:\/\/sindresorhus.com\/one-thing"
}
],
"createdAt" : "2022-01-16T17:00:05+07:00",
"currentDirectoryPath" : null,
"description" : "Set the text shown in One Thing app.",
"filename" : "one-thing-set-text.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : ".\/images\/one-thing.png"
},
"identifier" : "64b8520de38fe85dbc3fc84d16d26db9",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "One Thing",
"path" : "apps\/one-thing\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Set Text",
"updatedAt" : "2023-02-03T19:59:31+07:00"
},
{
"authors" : [
{
"name" : "One Thing",
"url" : "https:\/\/sindresorhus.com\/one-thing"
}
],
"createdAt" : "2022-01-16T17:00:05+07:00",
"currentDirectoryPath" : null,
"description" : "Clear the text shown in One Thing app.",
"filename" : "one-thing-clear-text.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : ".\/images\/one-thing.png"
},
"identifier" : "d6364a4011082d1d7dbfeb99a5cd55bf",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "One Thing",
"path" : "apps\/one-thing\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Clear Text",
"updatedAt" : "2023-02-03T19:59:31+07:00"
}
]
},
{
"name" : "Evernote",
"path" : "evernote",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Aaron Miller",
"url" : "https:\/\/github.com\/aaronhmiller"
}
],
"createdAt" : "2021-08-13T13:17:23-07:00",
"currentDirectoryPath" : null,
"description" : "Creates a new Evernote, pastes in the contents of the clipboard, and positions the cursor in the title area.",
"filename" : "create-note-paste-clipboard.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : ".\/images\/evernote.png"
},
"identifier" : "d35a432612f0fce10372d3b066dc49e6",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Evernote",
"path" : "apps\/evernote\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Create Evernote Paste Clipboard",
"updatedAt" : "2021-08-13T13:17:23-07:00"
},
{
"authors" : [
{
"name" : "Aaron Miller",
"url" : "https:\/\/github.com\/aaronhmiller"
}
],
"createdAt" : "2021-08-13T13:17:23-07:00",
"currentDirectoryPath" : null,
"description" : "Creates a new Evernote.",
"filename" : "create-note.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : ".\/images\/evernote.png"
},
"identifier" : "f546136ca9bad8f3b77a31e1ff0aecd0",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Evernote",
"path" : "apps\/evernote\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Create Evernote",
"updatedAt" : "2021-08-13T13:17:23-07:00"
}
]
},
{
"name" : "NotePlan3",
"path" : "noteplan3",
"readme" : "apps\/noteplan3\/README.md",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Göran Damberg",
"url" : "https:\/\/github.com\/gdamberg"
}
],
"createdAt" : "2021-06-23T09:20:05+02:00",
"currentDirectoryPath" : null,
"description" : "Append to daily note",
"filename" : "noteplan-append-daily-note.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/noteplan3.png"
},
"identifier" : "d802c64f73f9e89996597e76af3d5094",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "NotePlan3",
"path" : "apps\/noteplan3\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Append To Daily Note",
"updatedAt" : "2021-06-23T09:20:05+02:00"
},
{
"authors" : [
{
"name" : "Göran Damberg",
"url" : "https:\/\/github.com\/gdamberg"
}
],
"createdAt" : "2021-06-23T09:20:05+02:00",
"currentDirectoryPath" : null,
"description" : "Create a new note from clipboard",
"filename" : "noteplan-new-note-from-clipboard.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/noteplan3.png"
},
"identifier" : "2562e5c7b3258337f783b8210e796d55",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "NotePlan3",
"path" : "apps\/noteplan3\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "New Note From Clipboard",
"updatedAt" : "2021-06-23T09:20:05+02:00"
}
]
},
{
"name" : "Amphetamine",
"path" : "amphetamine",
"scriptCommands" : [
{
"authors" : [
{
"name" : "James Lyons",
"url" : "https:\/\/github.com\/jamesjlyons"
}
],
"createdAt" : "2021-01-07T18:10:56-08:00",
"currentDirectoryPath" : null,
"description" : "Start Default Amphetamine Session",
"filename" : "amphetamine-on.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/amphetamine.png"
},
"identifier" : "6c247430747abf30a7011ae37d87ca7b",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Amphetamine",
"path" : "apps\/amphetamine\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Start Default Session",
"updatedAt" : "2021-05-28T10:35:03+01:00"
},
{
"authors" : [
{
"name" : "James Lyons",
"url" : "https:\/\/github.com\/jamesjlyons"
}
],
"createdAt" : "2021-01-07T18:10:56-08:00",
"currentDirectoryPath" : null,
"description" : "Stop Current Amphetamine Session",
"filename" : "amphetamine-off.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/amphetamine.png"
},
"identifier" : "7663eee08fb216262ad4e904c0ed4c7a",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Amphetamine",
"path" : "apps\/amphetamine\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "End Session",
"updatedAt" : "2021-05-28T10:34:50+01:00"
}
]
},
{
"name" : "Find My",
"path" : "find-my",
"readme" : "apps\/find-my\/README.md",
"scriptCommands" : [
{
"authors" : null,
"createdAt" : "2025-06-12T06:53:33-07:00",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "fmp.js",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/find-my-icon.png"
},
"identifier" : "206851d53c58c074472f7acb20ceeb08",
"isTemplate" : false,
"language" : "node",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "FindMy",
"path" : "apps\/find-my\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Find My Phone (Auto Sound)",
"updatedAt" : "2025-06-12T06:53:33-07:00"
}
]
},
{
"name" : "Bear",
"path" : "bear",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Tanay Nistala",
"url" : "https:\/\/github.com\/tanaynistala"
}
],
"createdAt" : "2020-12-08T15:05:55+05:30",
"currentDirectoryPath" : null,
"description" : "Open the Today section in Bear.",
"filename" : "bear-today.sh",
"hasArguments" : true,
"icon" : {
"dark" : "images\/bear-dark.png",
"light" : "images\/bear-light.png"
},
"identifier" : "a3ba0dc119ef33bb239b30ae6cb4d1e8",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Bear",
"path" : "apps\/bear\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open Today",
"updatedAt" : "2021-05-28T10:36:54+01:00"
},
{
"authors" : [
{
"name" : "Tanay Nistala",
"url" : "https:\/\/github.com\/tanaynistala"
}
],
"createdAt" : "2020-12-08T15:05:55+05:30",
"currentDirectoryPath" : null,
"description" : "Open the specified tag in Bear.",
"filename" : "bear-open-tag.sh",
"hasArguments" : true,
"icon" : {
"dark" : "images\/bear-dark.png",
"light" : "images\/bear-light.png"
},
"identifier" : "b0cc37027abe39c7a0cb5053b8a9f4ec",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Bear",
"path" : "apps\/bear\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open Tag",
"updatedAt" : "2021-05-28T10:36:54+01:00"
},
{
"authors" : [
{
"name" : "Tanay Nistala",
"url" : "https:\/\/github.com\/tanaynistala"
}
],
"createdAt" : "2020-12-08T15:05:55+05:30",
"currentDirectoryPath" : null,
"description" : "Add a new note to Bear.",
"filename" : "bear-add-note.sh",
"hasArguments" : true,
"icon" : {
"dark" : "images\/bear-dark.png",
"light" : "images\/bear-light.png"
},
"identifier" : "1bdff208152a457aab81e00fda092d6c",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Bear",
"path" : "apps\/bear\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Add Note",
"updatedAt" : "2021-05-28T10:35:40+01:00"
},
{
"authors" : [
{
"name" : "Tanay Nistala",
"url" : "https:\/\/github.com\/tanaynistala"
}
],
"createdAt" : "2020-12-08T15:05:55+05:30",
"currentDirectoryPath" : null,
"description" : "Search notes by keyword and\/or tag in Bear.",
"filename" : "bear-search.sh",
"hasArguments" : true,
"icon" : {
"dark" : "images\/bear-dark.png",
"light" : "images\/bear-light.png"
},
"identifier" : "e7cdad30d00d056c56e710729f1a6531",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Bear",
"path" : "apps\/bear\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search",
"updatedAt" : "2021-06-14T14:17:13-05:00"
},
{
"authors" : [
{
"name" : "Tanay Nistala",
"url" : "https:\/\/github.com\/tanaynistala"
}
],
"createdAt" : "2020-12-08T15:05:55+05:30",
"currentDirectoryPath" : null,
"description" : "Open the Todo section in Bear.",
"filename" : "bear-todo.sh",
"hasArguments" : true,
"icon" : {
"dark" : "images\/bear-dark.png",
"light" : "images\/bear-light.png"
},
"identifier" : "ae50306d0334257a49487d71a72598c6",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Bear",
"path" : "apps\/bear\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open Todos",
"updatedAt" : "2021-05-28T10:38:31+01:00"
},
{
"authors" : [
{
"name" : "Tanay Nistala",
"url" : "https:\/\/github.com\/tanaynistala"
}
],
"createdAt" : "2020-12-08T15:05:55+05:30",
"currentDirectoryPath" : null,
"description" : "Open the specified note in Bear.",
"filename" : "bear-open-note.sh",
"hasArguments" : true,
"icon" : {
"dark" : "images\/bear-dark.png",
"light" : "images\/bear-light.png"
},
"identifier" : "24d03b4080ea3b49d348721ec0865b40",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Bear",
"path" : "apps\/bear\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open Note",
"updatedAt" : "2021-05-28T10:36:54+01:00"
}
]
},
{
"name" : "Mail",
"path" : "mail",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Jesse Claven",
"url" : "https:\/\/github.com\/jesse-c"
}
],
"createdAt" : "2021-05-22T16:27:53+01:00",
"currentDirectoryPath" : null,
"description" : "Copies the foreground Mail deeplink",
"filename" : "copy-foreground-mail-deeplink.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "📧"
},
"identifier" : "2b57bf3c301e2230d812bba90896fc1f",
"isTemplate" : false,
"language" : "applescript",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Mail",
"path" : "apps\/mail\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Copy Foreground Mail Deeplink",
"updatedAt" : "2021-05-22T16:27:53+01:00"
},
{
"authors" : [
{
"name" : "RealTong",
"url" : "https:\/\/raycast.com\/RealTong"
}
],
"createdAt" : "2024-03-02T12:46:14+08:00",
"currentDirectoryPath" : null,
"description" : "Copy the captcha from the emlx file.",
"filename" : "copy-captcha-from-mail.py",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : ".\/images\/mail.png"
},
"identifier" : "eb5104b3db21de0c7ea654c49319716a",
"isTemplate" : false,
"language" : "python",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Mail",
"path" : "apps\/mail\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "CaptchaFromMail",
"updatedAt" : "2024-03-02T12:46:14+08:00"
}
]
},
{
"name" : "Claude",
"path" : "claude",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Nimo Beeren",
"url" : "https:\/\/github.com\/nimobeeren"
}
],
"createdAt" : "2024-08-07T21:01:27+02:00",
"currentDirectoryPath" : null,
"description" : "Open Claude in Chrome browser and submit a prompt",
"filename" : "claude.js",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "✨"
},
"identifier" : "cd9356ee79829cf478bdcd127c673a0c",
"isTemplate" : false,
"language" : "node",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Claude",
"path" : "apps\/claude\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Ask Claude",
"updatedAt" : "2024-08-30T13:09:27Z"
}
]
},
{
"name" : "TunnelBlick",
"path" : "tunnelblick",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Achille Lacoin",
"url" : "https:\/\/github.com\/pomdtr"
}
],
"createdAt" : "2021-03-14T17:37:20+01:00",
"currentDirectoryPath" : null,
"description" : "Disconnect a VPN configuration.",
"filename" : "tunnelblick-disconnect.applescript",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/tunnelblick.png"
},
"identifier" : "6abb4b2ece585f7043d27e0f70c8ed0c",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : false,
"packageName" : "Tunnelblick",
"path" : "apps\/tunnelblick\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Tunnelblick: Disconnect",
"updatedAt" : "2021-03-16T12:21:52+05:30"
},
{
"authors" : [
{
"name" : "Achille Lacoin",
"url" : "https:\/\/github.com\/pomdtr"
}
],
"createdAt" : "2021-03-14T17:37:20+01:00",
"currentDirectoryPath" : null,
"description" : "Connect a VPN configuration.",
"filename" : "tunnelblick-connect.applescript",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/tunnelblick.png"
},
"identifier" : "b16beed5521082645dbed303aaf63699",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : false,
"packageName" : "Tunnelblick",
"path" : "apps\/tunnelblick\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Tunnelblick: Connect",
"updatedAt" : "2021-03-16T12:21:13+05:30"
},
{
"authors" : [
{
"name" : "Achille Lacoin",
"url" : "https:\/\/github.com\/pomdtr"
}
],
"createdAt" : "2021-03-14T17:37:20+01:00",
"currentDirectoryPath" : null,
"description" : "Disconnect all connected VPN configurations.",
"filename" : "tunnelblick-disconnect-all.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/tunnelblick.png"
},
"identifier" : "f19aef4b963a8b078a2ece2685c9ea64",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : false,
"packageName" : "Tunnelblick",
"path" : "apps\/tunnelblick\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Tunnelblick: Disconnect All",
"updatedAt" : "2021-03-14T17:37:20+01:00"
},
{
"authors" : [
{
"name" : "Achille Lacoin",
"url" : "https:\/\/github.com\/pomdtr"
}
],
"createdAt" : "2021-03-14T17:37:20+01:00",
"currentDirectoryPath" : null,
"description" : "Connect all unconnected VPN configurations.",
"filename" : "tunnelblick-connect-all.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/tunnelblick.png"
},
"identifier" : "1d7014bbdf04ed245c83da0d5a682c17",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : false,
"packageName" : "TunnelBlick",
"path" : "apps\/tunnelblick\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Tunnelblick: Connect All",
"updatedAt" : "2021-03-14T17:37:20+01:00"
}
]
},
{
"name" : "Baremetrics",
"path" : "baremetrics",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Valentin Chrétien",
"url" : "https:\/\/github.com\/valentinchrt"
}
],
"createdAt" : "2022-09-15T11:09:04+02:00",
"currentDirectoryPath" : null,
"description" : "Display Average revenue per user (ARPU)",
"filename" : "get-arpu.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/baremetrics.png"
},
"identifier" : "61cffadab08d5776aa9c0cdba919f9b4",
"isTemplate" : false,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Baremetrics",
"path" : "apps\/baremetrics\/",
"refreshTime" : "1h",
"schemaVersion" : 1,
"title" : "Average Revenue Per User",
"updatedAt" : "2022-09-15T11:09:04+02:00"
},
{
"authors" : [
{
"name" : "Valentin Chrétien",
"url" : "https:\/\/github.com\/valentinchrt"
}
],
"createdAt" : "2022-09-15T11:09:04+02:00",
"currentDirectoryPath" : null,
"description" : "Display Annual Recurring Revenue (ARR)",
"filename" : "get-arr.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/baremetrics.png"
},
"identifier" : "7eb95607eb6cb96ad5f62844ccd08157",
"isTemplate" : false,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Baremetrics",
"path" : "apps\/baremetrics\/",
"refreshTime" : "1h",
"schemaVersion" : 1,
"title" : "Annual Recurring Revenue",
"updatedAt" : "2022-09-15T11:09:04+02:00"
},
{
"authors" : [
{
"name" : "Valentin Chrétien",
"url" : "https:\/\/github.com\/valentinchrt"
}
],
"createdAt" : "2022-09-15T11:09:04+02:00",
"currentDirectoryPath" : null,
"description" : "Display Lifetime Value (LTV)",
"filename" : "get-ltv.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/baremetrics.png"
},
"identifier" : "28fcd48e5fdd0d94cd0fc0caa85ec6f7",
"isTemplate" : false,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Baremetrics",
"path" : "apps\/baremetrics\/",
"refreshTime" : "1h",
"schemaVersion" : 1,
"title" : "Lifetime Value",
"updatedAt" : "2022-09-15T11:09:04+02:00"
},
{
"authors" : [
{
"name" : "Valentin Chrétien",
"url" : "https:\/\/github.com\/valentinchrt"
}
],
"createdAt" : "2022-09-15T11:09:04+02:00",
"currentDirectoryPath" : null,
"description" : "Display Monthly Recurring Revenue (MRR)",
"filename" : "get-mrr.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/baremetrics.png"
},
"identifier" : "c93a6f26b13a627e732b5ca104457e35",
"isTemplate" : false,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Baremetrics",
"path" : "apps\/baremetrics\/",
"refreshTime" : "1h",
"schemaVersion" : 1,
"title" : "Monthly Recurring Revenue",
"updatedAt" : "2022-09-15T11:09:04+02:00"
},
{
"authors" : [
{
"name" : "Valentin Chrétien",
"url" : "https:\/\/github.com\/valentinchrt"
}
],
"createdAt" : "2022-09-15T11:09:04+02:00",
"currentDirectoryPath" : null,
"description" : "Display Revenue Dashboard",
"filename" : "simple-dashboard.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/baremetrics.png"
},
"identifier" : "8cff2dce2132b4b23e143ff7dfda31f8",
"isTemplate" : false,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Baremetrics",
"path" : "apps\/baremetrics\/",
"refreshTime" : "1h",
"schemaVersion" : 1,
"title" : "Revenue",
"updatedAt" : "2022-09-15T11:09:04+02:00"
}
]
},
{
"name" : "Message",
"path" : "Message",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Fatpandac",
"url" : "https:\/\/github.com\/Fatpandac"
}
],
"createdAt" : "2022-06-23T18:59:56+08:00",
"currentDirectoryPath" : null,
"description" : "Copy verification code from a message.",
"filename" : "copycode.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/Message.png"
},
"identifier" : "f07bfd0fc382e1e3a7a1ca7b8b23221d",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Messages",
"path" : "apps\/Message\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Copy Code",
"updatedAt" : "2022-06-23T18:59:56+08:00"
}
]
},
{
"name" : "Ferdi",
"path" : "ferdi",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-05-17T16:20:13+02:00",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "ferdi-open-service-by-name.applescript",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/ferdi.png"
},
"identifier" : "10ad2d03caaee101d4862f1a21cc1234",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Ferdi",
"path" : "apps\/ferdi\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open Service by Name",
"updatedAt" : "2021-07-23T17:46:29-04:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-05-16T16:05:58+02:00",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "ferdi-open-service-by-index.applescript",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/ferdi.png"
},
"identifier" : "504a15f524e5a1a6da75cc4a72e59c9e",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Ferdi",
"path" : "apps\/ferdi\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open Service by Index",
"updatedAt" : "2021-07-23T17:46:11-04:00"
}
]
},
{
"name" : "HazeOver",
"path" : "hazeover",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Thomas Paul Mann",
"url" : "https:\/\/github.com\/thomaspaulmann"
}
],
"createdAt" : "2021-01-24T20:19:30Z",
"currentDirectoryPath" : null,
"description" : "Set dimming intensity of background windows.",
"filename" : "hazeover-set-intensity.applescript",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/hazeover.png"
},
"identifier" : "f26557a194748a37e12e64003b1f2c6f",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "HazeOver",
"path" : "apps\/hazeover\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Set Intensity",
"updatedAt" : "2021-05-28T10:42:00+01:00"
},
{
"authors" : [
{
"name" : "Thomas Paul Mann",
"url" : "https:\/\/github.com\/thomaspaulmann"
}
],
"createdAt" : "2021-01-24T20:19:30Z",
"currentDirectoryPath" : null,
"description" : "Toggle dimming of all background windows.",
"filename" : "hazeover-toggle-dimming.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/hazeover.png"
},
"identifier" : "5368be37ae49d353930157085116709f",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "HazeOver",
"path" : "apps\/hazeover\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Toggle Dimming",
"updatedAt" : "2021-05-28T10:42:00+01:00"
}
]
},
{
"name" : "iconsur",
"path" : "iconsur",
"scriptCommands" : [
{
"authors" : [
{
"name" : "StevenRCE0",
"url" : "https:\/\/github.com\/StevenRCE0"
}
],
"createdAt" : "2021-08-27T15:06:06+08:00",
"currentDirectoryPath" : null,
"description" : "Change App icons to match Big Sur",
"filename" : "iconsur.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🅱️"
},
"identifier" : "10ce792f9f21acf4813a7307956a1999",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "iconsur",
"path" : "apps\/iconsur\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Change Application Icon",
"updatedAt" : "2022-02-22T00:14:05+08:00"
}
]
},
{
"name" : "Pulse Secure",
"path" : "pulse-secure",
"readme" : "apps\/pulse-secure\/README.md",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-06-14T20:14:26+02:00",
"currentDirectoryPath" : null,
"description" : "Resume the suspended connection.",
"filename" : "pulse-secure-resume.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/pulse-secure.png"
},
"identifier" : "137e52f49aba309c60fb9bc9427bda4d",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Pulse Secure",
"path" : "apps\/pulse-secure\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Resume",
"updatedAt" : "2021-06-14T20:14:26+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-06-14T20:14:26+02:00",
"currentDirectoryPath" : null,
"description" : "Connect to the given \/ default connection with the given \/ default username.",
"filename" : "pulse-secure-connect.applescript",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/pulse-secure.png"
},
"identifier" : "8776f55ec372ac1d0a62bc9267777ace",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Pulse Secure",
"path" : "apps\/pulse-secure\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Connect \/ Reconnect",
"updatedAt" : "2021-06-16T14:42:20+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-06-14T20:14:26+02:00",
"currentDirectoryPath" : null,
"description" : "Suspend the active connection.",
"filename" : "pulse-secure-suspend.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/pulse-secure.png"
},
"identifier" : "c5e03d8d6265725238c13d8b285c48f6",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Pulse Secure",
"path" : "apps\/pulse-secure\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Suspend",
"updatedAt" : "2021-06-14T20:14:26+02:00"
},
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-06-14T20:14:26+02:00",
"currentDirectoryPath" : null,
"description" : "Disconnect \/ cancel the active connection.",
"filename" : "pulse-secure-disconnect.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/pulse-secure.png"
},
"identifier" : "03191a91d92833853d2a70fad5f19424",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Pulse Secure",
"path" : "apps\/pulse-secure\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Disconnect \/ Cancel",
"updatedAt" : "2021-06-14T20:14:26+02:00"
}
]
},
{
"name" : "Downie",
"path" : "downie",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Clu Soh",
"url" : "https:\/\/twitter.com\/designedbyclu"
}
],
"createdAt" : "2022-06-14T15:34:34+08:00",
"currentDirectoryPath" : null,
"description" : "Download video from Pasteboard link",
"filename" : "download-video.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/downie.png"
},
"identifier" : "2003cce30b2c40d492dfd7a17e5afeb3",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Downie",
"path" : "apps\/downie\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Download Video",
"updatedAt" : "2022-08-25T12:14:46+08:00"
}
]
},
{
"name" : "Focus",
"path" : "focus",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Ernest Ojeh",
"url" : "https:\/\/github.com\/namzo"
}
],
"createdAt" : "2022-01-28T20:18:00+01:00",
"currentDirectoryPath" : null,
"description" : "Start a custom focus session. If you don't enter any values, it starts an untimed focus session.",
"filename" : "focus-start-custom-session.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/focus-logo.png"
},
"identifier" : "80dd2db0a8e0b267adf52209d1e2b66a",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Focus",
"path" : "apps\/focus\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Start Custom Focus Session",
"updatedAt" : "2022-02-09T09:15:31+01:00"
},
{
"authors" : [
{
"name" : "Ernest Ojeh",
"url" : "https:\/\/github.com\/namzo"
}
],
"createdAt" : "2022-01-28T20:18:00+01:00",
"currentDirectoryPath" : null,
"description" : "Open focus preferences.",
"filename" : "focus-preferences.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/focus-logo.png"
},
"identifier" : "26e49cef06b6a50e9c2a2288a0b3e5de",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Focus",
"path" : "apps\/focus\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open Focus Preferences",
"updatedAt" : "2022-02-09T09:15:31+01:00"
},
{
"authors" : [
{
"name" : "Ernest Ojeh",
"url" : "https:\/\/github.com\/namzo"
}
],
"createdAt" : "2022-01-28T20:18:00+01:00",
"currentDirectoryPath" : null,
"description" : "Stop the current focus session.",
"filename" : "focus-stop-session.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/focus-logo.png"
},
"identifier" : "2f0e5d4a017c664641797d3ccad1fbe1",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Focus",
"path" : "apps\/focus\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Stop Focus Session (Unfocus)",
"updatedAt" : "2022-02-09T09:15:31+01:00"
},
{
"authors" : [
{
"name" : "Ernest Ojeh",
"url" : "https:\/\/github.com\/namzo"
}
],
"createdAt" : "2022-01-28T20:18:00+01:00",
"currentDirectoryPath" : null,
"description" : "Take 5 minutes break.",
"filename" : "focus-start-break-5.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/focus-logo.png"
},
"identifier" : "11136efc43088020c73969f86e0dd6d2",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Focus",
"path" : "apps\/focus\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Take 5 Minutes Break",
"updatedAt" : "2022-02-09T09:15:31+01:00"
},
{
"authors" : [
{
"name" : "Ernest Ojeh",
"url" : "https:\/\/github.com\/namzo"
}
],
"createdAt" : "2022-01-28T20:18:00+01:00",
"currentDirectoryPath" : null,
"description" : "Toggle between start session (untimed) and stop session.",
"filename" : "focus-toggle-focus.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/focus-logo.png"
},
"identifier" : "87f5cb4aa46375da34318fc091f250b0",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Focus",
"path" : "apps\/focus\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Toggle Focus Session",
"updatedAt" : "2022-02-09T09:15:31+01:00"
},
{
"authors" : [
{
"name" : "Ernest Ojeh",
"url" : "https:\/\/github.com\/namzo"
}
],
"createdAt" : "2022-01-28T20:18:00+01:00",
"currentDirectoryPath" : null,
"description" : "Start an untimed focus session.",
"filename" : "focus-start-session.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/focus-logo.png"
},
"identifier" : "870e8c9bf851b140036bb6959e990571",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Focus",
"path" : "apps\/focus\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Start Focus Session (Focus)",
"updatedAt" : "2022-02-09T09:15:31+01:00"
},
{
"authors" : [
{
"name" : "Ernest Ojeh",
"url" : "https:\/\/github.com\/namzo"
}
],
"createdAt" : "2022-01-28T20:18:00+01:00",
"currentDirectoryPath" : null,
"description" : "Stop break and continues the current focus session.",
"filename" : "focus-stop-break.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/focus-logo.png"
},
"identifier" : "301323d2b2b7165ab0364ea4a600f4d5",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Focus",
"path" : "apps\/focus\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Stop Break (Unbreak)",
"updatedAt" : "2022-02-09T09:15:31+01:00"
},
{
"authors" : [
{
"name" : "Ernest Ojeh",
"url" : "https:\/\/github.com\/namzo"
}
],
"createdAt" : "2022-01-28T20:18:00+01:00",
"currentDirectoryPath" : null,
"description" : "Start a custom break. If you don't enter any values, it uses the last break duration.",
"filename" : "focus-start-custom-break.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/focus-logo.png"
},
"identifier" : "a8c3ae965a33e0ac2098e35ea49ffdd0",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Focus",
"path" : "apps\/focus\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Start Custom Break",
"updatedAt" : "2022-02-09T09:15:31+01:00"
},
{
"authors" : [
{
"name" : "Ernest Ojeh",
"url" : "https:\/\/github.com\/namzo"
}
],
"createdAt" : "2022-01-28T20:18:00+01:00",
"currentDirectoryPath" : null,
"description" : "Start a 25 minutes focus session.",
"filename" : "focus-start-session-25.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/focus-logo.png"
},
"identifier" : "c98d57dfcdd3aa35ed145b6a221377e5",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Focus",
"path" : "apps\/focus\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Start 25 minutes Focus Session",
"updatedAt" : "2022-02-09T09:15:31+01:00"
}
]
},
{
"name" : "Plash",
"path" : "plash",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Plash",
"url" : "https:\/\/github.com\/sindresorhus\/Plash"
}
],
"createdAt" : "2021-05-28T01:55:40+07:00",
"currentDirectoryPath" : null,
"description" : "Reload the current website in Plash.",
"filename" : "plash-reload-website.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : ".\/images\/plash.png"
},
"identifier" : "efba722b5a535ab230ffe426bbd3aa00",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Plash",
"path" : "apps\/plash\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Reload Website",
"updatedAt" : "2021-06-04T23:56:19+07:00"
},
{
"authors" : [
{
"name" : "Plash",
"url" : "https:\/\/github.com\/sindresorhus\/Plash"
}
],
"createdAt" : "2021-05-28T01:55:40+07:00",
"currentDirectoryPath" : null,
"description" : "Switch to the next website in the list in Plash.",
"filename" : "plash-next-website.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : ".\/images\/plash.png"
},
"identifier" : "4871914878a1c9aca9d14b7114a76df2",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Plash",
"path" : "apps\/plash\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Next Website",
"updatedAt" : "2021-06-04T23:56:19+07:00"
},
{
"authors" : [
{
"name" : "Plash",
"url" : "https:\/\/github.com\/sindresorhus\/Plash"
}
],
"createdAt" : "2021-05-28T01:55:40+07:00",
"currentDirectoryPath" : null,
"description" : "Switch to the previous website in the list in Plash.",
"filename" : "plash-previous-website.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : ".\/images\/plash.png"
},
"identifier" : "ffed236c901c236e41814468c88c82ea",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Plash",
"path" : "apps\/plash\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Previous Website",
"updatedAt" : "2021-06-04T23:56:19+07:00"
},
{
"authors" : [
{
"name" : "Plash",
"url" : "https:\/\/github.com\/sindresorhus\/Plash"
}
],
"createdAt" : "2021-05-28T01:55:40+07:00",
"currentDirectoryPath" : null,
"description" : "Switch to a random website from the list of websites in Plash.",
"filename" : "plash-random-website.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : ".\/images\/plash.png"
},
"identifier" : "10bddde306d0bfdae3624cb8cdddd0b0",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Plash",
"path" : "apps\/plash\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Switch to Random Website",
"updatedAt" : "2021-06-04T23:56:19+07:00"
},
{
"authors" : [
{
"name" : "Plash",
"url" : "https:\/\/github.com\/sindresorhus\/Plash"
}
],
"createdAt" : "2021-05-28T01:55:40+07:00",
"currentDirectoryPath" : null,
"description" : "Toggle browsing mode in Plash.",
"filename" : "plash-toggle-browser-mode.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : ".\/images\/plash.png"
},
"identifier" : "a0a1cd94513bf76d8c8ec9bec1ce7ec2",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Plash",
"path" : "apps\/plash\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Toggle Browsing Mode",
"updatedAt" : "2021-05-28T10:24:58+01:00"
},
{
"authors" : [
{
"name" : "Plash",
"url" : "https:\/\/github.com\/sindresorhus\/Plash"
}
],
"createdAt" : "2021-05-28T01:55:40+07:00",
"currentDirectoryPath" : null,
"description" : "Add a website to Plash.",
"filename" : "plash-add-website.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : ".\/images\/plash.png"
},
"identifier" : "d65493aee461a49dbf2b6ef976857898",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Plash",
"path" : "apps\/plash\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Add Website",
"updatedAt" : "2021-06-04T23:56:19+07:00"
}
]
},
{
"name" : "Mullvad",
"path" : "mullvad",
"readme" : "apps\/mullvad\/README.md",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Phil Salant",
"url" : "https:\/\/github.com\/PSalant726"
}
],
"createdAt" : "2021-03-25T18:08:20-04:00",
"currentDirectoryPath" : null,
"description" : "Disconnect from the Mullvad VPN tunnel.",
"filename" : "disconnect.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/mullvad.png"
},
"identifier" : "a16754f03ea5fa74d3d05116c6f23ed1",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Mullvad",
"path" : "apps\/mullvad\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Disconnect",
"updatedAt" : "2021-03-25T22:10:33Z"
},
{
"authors" : [
{
"name" : "Phil Salant",
"url" : "https:\/\/github.com\/PSalant726"
}
],
"createdAt" : "2021-03-25T18:08:20-04:00",
"currentDirectoryPath" : null,
"description" : "Connect the Mullvad VPN tunnel using the specified location.",
"filename" : "location.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/mullvad.png"
},
"identifier" : "bfd215e3646e02a03ad2b15ad2a97557",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Mullvad",
"path" : "apps\/mullvad\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Connect to Location",
"updatedAt" : "2022-08-25T19:51:18Z"
},
{
"authors" : [
{
"name" : "Phil Salant",
"url" : "https:\/\/github.com\/PSalant726"
}
],
"createdAt" : "2021-03-25T18:08:20-04:00",
"currentDirectoryPath" : null,
"description" : "Search the list of available entities to which a Mullvad VPN tunnel connection can be made.",
"filename" : "search.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/mullvad.png"
},
"identifier" : "5773c509e585b2181a22e12e75b4cf0f",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Mullvad",
"path" : "apps\/mullvad\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search Countries, Cities, and Hostnames",
"updatedAt" : "2021-03-25T22:10:33Z"
},
{
"authors" : [
{
"name" : "Phil Salant",
"url" : "https:\/\/github.com\/PSalant726"
}
],
"createdAt" : "2021-03-25T18:08:20-04:00",
"currentDirectoryPath" : null,
"description" : "Display the current status of the Mullvad VPN tunnel connection.",
"filename" : "status.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/mullvad.png"
},
"identifier" : "cd0323ea623775b56c6aaf7f2123bb14",
"isTemplate" : false,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Mullvad",
"path" : "apps\/mullvad\/",
"refreshTime" : "5m",
"schemaVersion" : 1,
"title" : "Mullvad Status",
"updatedAt" : "2022-08-25T19:51:18Z"
},
{
"authors" : [
{
"name" : "Phil Salant",
"url" : "https:\/\/github.com\/PSalant726"
}
],
"createdAt" : "2021-03-25T18:08:20-04:00",
"currentDirectoryPath" : null,
"description" : "Force the client to reconnect to the Mullvad VPN tunnel.",
"filename" : "reconnect.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/mullvad.png"
},
"identifier" : "3712d89f71b9d5508b039c4a8b0a1a8c",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Mullvad",
"path" : "apps\/mullvad\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Reconnect",
"updatedAt" : "2022-08-25T19:51:18Z"
},
{
"authors" : [
{
"name" : "Phil Salant",
"url" : "https:\/\/github.com\/PSalant726"
}
],
"createdAt" : "2021-03-25T18:08:20-04:00",
"currentDirectoryPath" : null,
"description" : "Connect the Mullvad VPN tunnel using the most recent configuration settings.",
"filename" : "connect.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/mullvad.png"
},
"identifier" : "a7c6ddf80482ff3f287840cdf2f6a8f9",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Mullvad",
"path" : "apps\/mullvad\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Connect",
"updatedAt" : "2022-08-25T19:51:18Z"
}
]
},
{
"name" : "Timing",
"path" : "timing",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Landen Danyluk",
"url" : "https:\/\/github.com\/landendanyluk"
}
],
"createdAt" : "2022-07-23T23:10:15-05:00",
"currentDirectoryPath" : null,
"description" : "Start a timer",
"filename" : "timing-start-timer.js",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/timing-logo.png"
},
"identifier" : "e76f98fba595acb6590639f1d8705b5a",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Timing",
"path" : "apps\/timing\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Start Timer",
"updatedAt" : "2022-07-23T23:10:15-05:00"
},
{
"authors" : [
{
"name" : "Landen Danyluk",
"url" : "https:\/\/github.com\/landendanyluk"
}
],
"createdAt" : "2022-07-23T23:10:15-05:00",
"currentDirectoryPath" : null,
"description" : "Stop the active timer",
"filename" : "timing-stop-timer.js",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/timing-logo.png"
},
"identifier" : "b8f7a1b309c9fd169a4bb20d08748dcb",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Timing",
"path" : "apps\/timing\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Stop Timer",
"updatedAt" : "2022-07-23T23:10:15-05:00"
}
]
},
{
"name" : "OpenVPN",
"path" : "openvpn",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Aaron Miller",
"url" : "https:\/\/github.com\/aaronhmiller"
}
],
"createdAt" : "2021-08-16T13:21:15-07:00",
"currentDirectoryPath" : null,
"description" : "Prepares OpenVPN Connect client to connect or reconnect.",
"filename" : "connect-openvpn.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : ".\/images\/openvpn.png"
},
"identifier" : "a345726ad1219631c162173e74cc319c",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "OpenVPN",
"path" : "apps\/openvpn\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Connect OpenVPN",
"updatedAt" : "2021-08-16T13:21:15-07:00"
},
{
"authors" : [
{
"name" : "Aaron Miller",
"url" : "https:\/\/github.com\/aaronhmiller"
}
],
"createdAt" : "2021-08-16T13:21:15-07:00",
"currentDirectoryPath" : null,
"description" : "Quits the OpenVPN Connect client.",
"filename" : "quit-openvpn.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : ".\/images\/openvpn.png"
},
"identifier" : "d0b3d1b64e34e581d9224b2efbce2c6e",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "OpenVPN",
"path" : "apps\/openvpn\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Quit OpenVPN",
"updatedAt" : "2021-08-16T13:21:15-07:00"
},
{
"authors" : [
{
"name" : "Aaron Miller",
"url" : "https:\/\/github.com\/aaronhmiller"
}
],
"createdAt" : "2021-08-16T13:21:15-07:00",
"currentDirectoryPath" : null,
"description" : "Disconnects the OpenVPN Connect client from VPN.",
"filename" : "disconnect-openvpn.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : ".\/images\/openvpn.png"
},
"identifier" : "d63f02150ae5a9a98eadc250ec299d40",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "OpenVPN",
"path" : "apps\/openvpn\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Disconnect OpenVPN",
"updatedAt" : "2021-08-16T13:21:15-07:00"
}
]
},
{
"name" : "Todoist",
"path" : "todoist",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Faris Aziz",
"url" : "https:\/\/github.com\/farisaziz12"
}
],
"createdAt" : "2021-05-04T12:12:44+02:00",
"currentDirectoryPath" : null,
"description" : "Create Task",
"filename" : "create-task.template.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/todoist-logo.png"
},
"identifier" : "306fdf2b185a4c91bdc04007b23bd008",
"isTemplate" : true,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Todoist",
"path" : "apps\/todoist\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Create Task",
"updatedAt" : "2023-03-18T04:02:12+03:00"
},
{
"authors" : [
{
"name" : "Faris Aziz",
"url" : "https:\/\/github.com\/farisaziz12"
}
],
"createdAt" : "2021-05-04T12:12:44+02:00",
"currentDirectoryPath" : null,
"description" : "Gets All Todoist tasks",
"filename" : "get-tasks.template.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/todoist-logo.png"
},
"identifier" : "ef1425a55c8acd3fad650cc85a6ae88a",
"isTemplate" : true,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : false,
"packageName" : "Todoist",
"path" : "apps\/todoist\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Get Tasks",
"updatedAt" : "2021-05-04T10:14:48Z"
}
]
},
{
"name" : "WebStorm",
"path" : "webstorm",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Daniel Stovv",
"url" : "https:\/\/github.com\/stovv"
}
],
"createdAt" : "2022-01-27T15:04:54+03:00",
"currentDirectoryPath" : null,
"description" : "Open WebStorm projects",
"filename" : "open-workspace.template.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/webstorm.png"
},
"identifier" : "8db170a15f9f700cf1a5bc69152e3e3e",
"isTemplate" : true,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "WebStorm",
"path" : "apps\/webstorm\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open",
"updatedAt" : "2022-01-27T12:07:09Z"
}
]
},
{
"name" : "Translate Shell",
"path" : "translate-shell",
"scriptCommands" : [
{
"authors" : [
{
"name" : "tiancheng92",
"url" : "https:\/\/github.com\/tiancheng92"
}
],
"createdAt" : "2021-05-03T20:56:05+08:00",
"currentDirectoryPath" : null,
"description" : "Translate and copy brief translation to clipboard.",
"filename" : "translate-to-en.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "📖"
},
"identifier" : "ad28b67b7a6ad68e8fe478ae135e8795",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Translate Shell",
"path" : "apps\/translate-shell\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Translate to EN",
"updatedAt" : "2021-05-07T07:58:55+02:00"
},
{
"authors" : [
{
"name" : "tiancheng92",
"url" : "https:\/\/github.com\/tiancheng92"
}
],
"createdAt" : "2021-05-03T20:56:05+08:00",
"currentDirectoryPath" : null,
"description" : "Translate and copy brief translation to clipboard.",
"filename" : "translate-to-zh.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "📖"
},
"identifier" : "cb355a2a427be58d5695011f2d8cd64a",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Translate Shell",
"path" : "apps\/translate-shell\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Translate to ZH",
"updatedAt" : "2021-05-07T07:58:55+02:00"
},
{
"authors" : [
{
"name" : "Marcel Bochtler",
"url" : "https:\/\/github.com\/MarcelBochtler"
}
],
"createdAt" : "2021-05-07T07:58:55+02:00",
"currentDirectoryPath" : null,
"description" : "Translate text using translate-shell.",
"filename" : "translate-shell-language-pair.py",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🌍"
},
"identifier" : "e9776d8d1e5db81fb7f49a4df06af0f0",
"isTemplate" : false,
"language" : "python",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Translate Shell Language Pair",
"path" : "apps\/translate-shell\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Translate Shell",
"updatedAt" : "2021-07-15T22:22:31+02:00"
}
]
},
{
"name" : "Notes",
"path" : "notes",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Vardan Sawhney",
"url" : "https:\/\/github.com\/commai"
}
],
"createdAt" : "2021-08-03T09:54:13-04:00",
"currentDirectoryPath" : null,
"description" : "Open Note via its Title",
"filename" : "open-note.applescript",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : ".\/images\/notes.png"
},
"identifier" : "9295d4230a85f19a25e491154c2cc2ae",
"isTemplate" : false,
"language" : "applescript",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Notes",
"path" : "apps\/notes\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open Note",
"updatedAt" : "2021-08-03T09:54:13-04:00"
},
{
"authors" : [
{
"name" : "Ayoub Gharbi",
"url" : "github.com\/ayoub-g"
}
],
"createdAt" : "2021-08-19T11:57:46+01:00",
"currentDirectoryPath" : null,
"description" : "This script searches for a note, given its exact name, or a substring, the search does not consider case",
"filename" : "search-note-by-name.applescript",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : ".\/images\/notes.png"
},
"identifier" : "2742cc92859fb01b45bbed9bd2ba3dc8",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Notes",
"path" : "apps\/notes\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search Note By Name",
"updatedAt" : "2021-08-19T11:57:46+01:00"
},
{
"authors" : [
{
"name" : "Ayoub Gharbi",
"url" : "https:\/\/github.com\/ayoub-g"
}
],
"createdAt" : "2021-08-20T22:46:40+01:00",
"currentDirectoryPath" : null,
"description" : "Script to append to an existing note content from clipboard.",
"filename" : "append-note-from-clipboard.applescript",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : ".\/images\/notes.png"
},
"identifier" : "8e61646606984a27fa52fabeda748f01",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Notes",
"path" : "apps\/notes\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Append Content From Clipboard",
"updatedAt" : "2021-08-20T22:46:40+01:00"
},
{
"authors" : [
{
"name" : "Ayoub Gharbi",
"url" : "https:\/\/github.com\/ayoub-g"
}
],
"createdAt" : "2021-07-21T23:46:22-04:00",
"currentDirectoryPath" : null,
"description" : "Create Note From Clipboard",
"filename" : "create-note-from-clipboard.applescript",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : ".\/images\/notes.png"
},
"identifier" : "4186e11daddefc7d27d89b3943eb4b44",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Notes",
"path" : "apps\/notes\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Create Note From Clipboard",
"updatedAt" : "2024-03-01T12:51:47+01:00"
},
{
"authors" : [
{
"name" : "Vardan Sawhney",
"url" : "https:\/\/github.com\/commai"
}
],
"createdAt" : "2021-07-21T23:46:22-04:00",
"currentDirectoryPath" : null,
"description" : "Create a new Note ",
"filename" : "create-note.applescript",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : ".\/images\/notes.png"
},
"identifier" : "e9cecac4bfa067f607c15ef602dae3d9",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Notes",
"path" : "apps\/notes\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Create Note",
"updatedAt" : "2021-07-23T21:06:02-04:00"
}
]
},
{
"name" : "Y Pomodoro",
"path" : "y-pomodoro",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Jesse Claven",
"url" : "https:\/\/github.com\/jesse-c"
}
],
"createdAt" : "2021-08-20T22:47:15+01:00",
"currentDirectoryPath" : null,
"description" : "Pause active pomodoro timer using [y-pomodoro](https:\/\/github.com\/jesse-c\/y-pomodoro)",
"filename" : "pause.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🍅"
},
"identifier" : "d2836820287e44cb9f83f4dd84f8fdd1",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "y-pomodoro",
"path" : "apps\/y-pomodoro\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Pause",
"updatedAt" : "2021-08-20T22:47:15+01:00"
},
{
"authors" : [
{
"name" : "Jesse Claven",
"url" : "https:\/\/github.com\/jesse-c"
}
],
"createdAt" : "2021-08-20T22:47:15+01:00",
"currentDirectoryPath" : null,
"description" : "Show active pomodoro timer using [y-pomodoro](https:\/\/github.com\/jesse-c\/y-pomodoro)",
"filename" : "show.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🍅"
},
"identifier" : "8c775fb12a394e545e09c5dc3f4f5385",
"isTemplate" : false,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "y-pomodoro",
"path" : "apps\/y-pomodoro\/",
"refreshTime" : "15s",
"schemaVersion" : 1,
"title" : "Show",
"updatedAt" : "2021-08-20T22:47:15+01:00"
},
{
"authors" : [
{
"name" : "Jesse Claven",
"url" : "https:\/\/github.com\/jesse-c"
}
],
"createdAt" : "2021-08-20T22:47:15+01:00",
"currentDirectoryPath" : null,
"description" : "Resume active pomodoro timer using [y-pomodoro](https:\/\/github.com\/jesse-c\/y-pomodoro)",
"filename" : "resume.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🍅"
},
"identifier" : "3f8075486c097397d65b6911816fba51",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "y-pomodoro",
"path" : "apps\/y-pomodoro\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Resume",
"updatedAt" : "2021-08-20T22:47:15+01:00"
},
{
"authors" : [
{
"name" : "Jesse Claven",
"url" : "https:\/\/github.com\/jesse-c"
}
],
"createdAt" : "2021-08-20T22:47:15+01:00",
"currentDirectoryPath" : null,
"description" : "Stop active pomodoro timer using [y-pomodoro](https:\/\/github.com\/jesse-c\/y-pomodoro)",
"filename" : "stop.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🍅"
},
"identifier" : "e265864f8039fb0d44199d08a552c4f5",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "y-pomodoro",
"path" : "apps\/y-pomodoro\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Stop",
"updatedAt" : "2021-08-20T22:47:15+01:00"
},
{
"authors" : [
{
"name" : "Jesse Claven",
"url" : "https:\/\/github.com\/jesse-c"
}
],
"createdAt" : "2021-08-20T22:47:15+01:00",
"currentDirectoryPath" : null,
"description" : "Start a pomodoro timer using [y-pomodoro](https:\/\/github.com\/jesse-c\/y-pomodoro)",
"filename" : "start.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🍅"
},
"identifier" : "205772935becd5940672978344fe329f",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "y-pomodoro",
"path" : "apps\/y-pomodoro\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Start",
"updatedAt" : "2021-08-20T22:47:15+01:00"
}
]
},
{
"name" : "PhpStorm",
"path" : "phpstorm",
"scriptCommands" : [
{
"authors" : null,
"createdAt" : "2021-08-06T16:17:35+04:00",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "recent-projects.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "icon.icns"
},
"identifier" : "636e401e276ed8883dff6e76bf1983b4",
"isTemplate" : false,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "PhpStorm",
"path" : "apps\/phpstorm\/",
"refreshTime" : "5m",
"schemaVersion" : 1,
"title" : "Update Recent Projects",
"updatedAt" : "2021-08-06T16:17:35+04:00"
}
]
},
{
"name" : "Fantastical",
"path" : "fantastical",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Robert Cooper",
"url" : "https:\/\/github.com\/robertcoopercode"
}
],
"createdAt" : "2021-03-23T16:29:01-04:00",
"currentDirectoryPath" : null,
"description" : "Create an event in Fantastical",
"filename" : "create-event.applescript",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : ".\/images\/fantastical.png"
},
"identifier" : "7634569101c20232ebf8ecfce9624c61",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Fantastical",
"path" : "apps\/fantastical\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Create Event",
"updatedAt" : "2021-05-28T10:41:12+01:00"
},
{
"authors" : [
{
"name" : "Vardan Sawhney",
"url" : "https:\/\/github.com\/commai"
}
],
"createdAt" : "2021-06-03T00:04:35-04:00",
"currentDirectoryPath" : null,
"description" : "Speed up setting reminders for Fantastical by invoking this script.",
"filename" : "create-todo-in-fantastical.applescript",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : ".\/images\/fantastical.png"
},
"identifier" : "ed64cfea0aefdda6f31454176ecc101f",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Fantastical",
"path" : "apps\/fantastical\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Create Task",
"updatedAt" : "2021-06-03T00:04:35-04:00"
}
]
},
{
"name" : "Safari",
"path" : "safari",
"readme" : "apps\/safari\/README.md",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Thomas Paul Mann",
"url" : "https:\/\/github.com\/thomaspaulmann"
}
],
"createdAt" : "2021-03-09T15:09:02Z",
"currentDirectoryPath" : null,
"description" : "Close all tabs besides the currently active tab.",
"filename" : "safari-close-other-tabs.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/safari.png"
},
"identifier" : "38cc0dc04da036a099b3e37fd711ef8d",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Safari",
"path" : "apps\/safari\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Close Other Tabs",
"updatedAt" : "2021-03-09T15:09:02Z"
},
{
"authors" : [
{
"name" : "Dave Lehman",
"url" : "https:\/\/github.com\/dlehman"
}
],
"createdAt" : "2021-08-19T12:49:15-05:00",
"currentDirectoryPath" : null,
"description" : "Open current Safari URL in new tab in Firefox",
"filename" : "safari-current-page-url-in-firefox.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/safari.png"
},
"identifier" : "953364ac2c0ce7e6bbb02efeed35bfd6",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Safari",
"path" : "apps\/safari\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open Safari URL in Firefox",
"updatedAt" : "2021-08-20T09:04:17-05:00"
},
{
"authors" : [
{
"name" : "Aaron Miller",
"url" : "https:\/\/github.com\/aaronhmiller"
}
],
"createdAt" : "2021-08-06T10:24:49-07:00",
"currentDirectoryPath" : null,
"description" : "This script clears cache and reloads the page of the frontmost Safari window.",
"filename" : "safari-clear-cache-reload.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/safari.png"
},
"identifier" : "ce0ee1596099e7699e99d6267b097f3d",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Safari",
"path" : "apps\/safari\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Clear Cache and Refresh Page",
"updatedAt" : "2021-08-06T10:24:49-07:00"
},
{
"authors" : [
{
"name" : "Thomas Paul Mann",
"url" : "https:\/\/github.com\/thomaspaulmann"
}
],
"createdAt" : "2021-03-09T15:09:02Z",
"currentDirectoryPath" : null,
"description" : "Add a new Reading List item with the given URL. Allows a custom title to be specified.",
"filename" : "safari-create-reading-list-item.applescript",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/safari.png"
},
"identifier" : "77a2ff3bf579994aa3624feb9aca64a4",
"isTemplate" : false,
"language" : "applescript",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Safari",
"path" : "apps\/safari\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Add Item to Reading List",
"updatedAt" : "2021-03-09T15:09:02Z"
},
{
"authors" : [
{
"name" : "Michael Bianco",
"url" : "https:\/\/github.com\/iloveitaly"
}
],
"createdAt" : "2024-08-21T08:30:36-06:00",
"currentDirectoryPath" : null,
"description" : "Download the currently active tab's URL.",
"filename" : "safari-download-url.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/safari.png"
},
"identifier" : "3fe3287d74734aa1adaf454aa6be4dce",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Safari",
"path" : "apps\/safari\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Download Current URL",
"updatedAt" : "2024-08-30T13:02:53Z"
},
{
"authors" : [
{
"name" : "Thomas Paul Mann",
"url" : "https:\/\/github.com\/thomaspaulmann"
}
],
"createdAt" : "2021-03-09T15:09:02Z",
"currentDirectoryPath" : null,
"description" : "Close tabs with the same URL.",
"filename" : "safari-close-duplicated-tabs.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/safari.png"
},
"identifier" : "3910bc8358dde77be0359ef115f703a6",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Safari",
"path" : "apps\/safari\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Close Duplicated Tabs",
"updatedAt" : "2021-03-09T15:11:52Z"
},
{
"authors" : [
{
"name" : "Thomas Paul Mann",
"url" : "https:\/\/github.com\/thomaspaulmann"
}
],
"createdAt" : "2021-03-09T15:09:02Z",
"currentDirectoryPath" : null,
"description" : "Close all tabs to the right side of the currently active tab.",
"filename" : "safari-close-tabs-right.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/safari.png"
},
"identifier" : "779e79e3334dca627507dc1737a1cf27",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Safari",
"path" : "apps\/safari\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Close Tabs to the Right",
"updatedAt" : "2021-03-09T15:09:02Z"
},
{
"authors" : [
{
"name" : "Thomas Paul Mann",
"url" : "https:\/\/github.com\/thomaspaulmann"
}
],
"createdAt" : "2021-03-09T15:09:02Z",
"currentDirectoryPath" : null,
"description" : "Close all tabs to the left side of the currently active tab.",
"filename" : "safari-close-tabs-left.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/safari.png"
},
"identifier" : "98ee4a51212c322cf544c0e756ca3383",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Safari",
"path" : "apps\/safari\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Close Tabs to the Left",
"updatedAt" : "2021-03-09T15:09:02Z"
},
{
"authors" : [
{
"name" : "Thomas Paul Mann",
"url" : "https:\/\/github.com\/thomaspaulmann"
}
],
"createdAt" : "2021-03-09T15:09:02Z",
"currentDirectoryPath" : null,
"description" : "Duplicates and opens the currently active tab.",
"filename" : "safari-duplicate-tab.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/safari.png"
},
"identifier" : "6727e9a045a860d1a726af83df1b9df3",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Safari",
"path" : "apps\/safari\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Duplicate Tab",
"updatedAt" : "2021-03-09T15:09:02Z"
},
{
"authors" : [
{
"name" : "Thomas Paul Mann",
"url" : "https:\/\/github.com\/thomaspaulmann"
}
],
"createdAt" : "2021-03-09T15:09:02Z",
"currentDirectoryPath" : null,
"description" : "Close all tabs in the frontmost window",
"filename" : "safari-close-all-tabs.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/safari.png"
},
"identifier" : "1cd7846276f766bc2b17a7a99bed645a",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Safari",
"path" : "apps\/safari\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Close All Tabs",
"updatedAt" : "2021-03-09T15:09:02Z"
},
{
"authors" : [
{
"name" : "smxl",
"url" : "https:\/\/github.com\/smxl"
}
],
"createdAt" : "2023-02-16T13:11:13+08:00",
"currentDirectoryPath" : null,
"description" : "Open Bing in Safari with Edge User-Agent",
"filename" : "safari-bing-edge-user-agent.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/safari.png"
},
"identifier" : "f88a9b8ee459537aa8da40d071ab6232",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Safari",
"path" : "apps\/safari\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open Bing with Edge User-Agent",
"updatedAt" : "2023-02-17T18:29:04+09:00"
},
{
"authors" : [
{
"name" : "Dave Lehman",
"url" : "https:\/\/github.com\/dlehman"
}
],
"createdAt" : "2021-08-19T12:49:15-05:00",
"currentDirectoryPath" : null,
"description" : "Open current Safari URL in new tab in Chrome",
"filename" : "safari-current-page-url-in-chrome.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/safari.png"
},
"identifier" : "82f9f4b17a97bf774484f7946245c318",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Safari",
"path" : "apps\/safari\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open Safari URL in Chrome",
"updatedAt" : "2021-08-20T09:04:07-05:00"
}
]
},
{
"name" : "Dictionary",
"path" : "dictionary",
"scriptCommands" : [
{
"authors" : [
{
"name" : "yayiji",
"url" : "https:\/\/github.com\/yayiji"
}
],
"createdAt" : "2022-10-19T02:28:10+08:00",
"currentDirectoryPath" : null,
"description" : "Look up selected text in Dictionary",
"filename" : "look-up-in-dictionary.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/dictionary.icns"
},
"identifier" : "5952f1e95fc51a30ab3a3d3538dfe273",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Dictionary",
"path" : "apps\/dictionary\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Look up in Dictionary",
"updatedAt" : "2022-10-19T02:28:10+08:00"
}
]
},
{
"name" : "Raycast",
"path" : "raycast",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Fatpandac",
"url" : "https:\/\/github.com\/Fatpandac"
}
],
"createdAt" : "2022-05-19T01:47:07+08:00",
"currentDirectoryPath" : null,
"description" : "Set Confetti to run for a number of times and during intervals",
"filename" : "celebrate.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🎉"
},
"identifier" : "c9ab115f10c7edb801658fe3f94c2886",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Raycast",
"path" : "apps\/raycast\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Celebrate",
"updatedAt" : "2022-05-19T10:24:28+08:00"
}
]
},
{
"name" : "Surfshark",
"path" : "surfshark",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Jordi Clement",
"url" : "https:\/\/github.com\/jordicl"
}
],
"createdAt" : "2021-03-04T23:14:49+01:00",
"currentDirectoryPath" : null,
"description" : "Start Surfshark VPN connection",
"filename" : "surfshark-vpn-start.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/surfshark.png"
},
"identifier" : "b3f462e20e0dfbe32bbe6647d34b39f3",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Surfshark",
"path" : "apps\/surfshark\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "VPN Connect",
"updatedAt" : "2021-03-08T18:01:25+01:00"
},
{
"authors" : [
{
"name" : "Jordi Clement",
"url" : "https:\/\/github.com\/jordicl"
}
],
"createdAt" : "2021-03-04T23:14:49+01:00",
"currentDirectoryPath" : null,
"description" : "Stop Surfshark VPN connection",
"filename" : "surfshark-vpn-stop.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/surfshark.png"
},
"identifier" : "ee1e49d67e3b13e5a97141a3b9c4ecac",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Surfshark",
"path" : "apps\/surfshark\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "VPN Disconnect",
"updatedAt" : "2021-03-08T18:01:25+01:00"
},
{
"authors" : [
{
"name" : "Jordi Clement",
"url" : "https:\/\/github.com\/jordicl"
}
],
"createdAt" : "2021-03-04T23:14:49+01:00",
"currentDirectoryPath" : null,
"description" : "Get Surfshark VPN status",
"filename" : "surfshark-vpn-status.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/surfshark.png"
},
"identifier" : "bdb5be9e3fc0587bacc025ba8b39a4cc",
"isTemplate" : false,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Surfshark",
"path" : "apps\/surfshark\/",
"refreshTime" : "10s",
"schemaVersion" : 1,
"title" : "Surfshark VPN Status",
"updatedAt" : "2021-03-08T18:01:25+01:00"
}
]
},
{
"name" : "DND Me",
"path" : "dnd-me",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Roland Leth",
"url" : "https:\/\/runtimesharks.com\/projects\/dnd-me"
}
],
"createdAt" : "2021-04-21T11:07:25+03:00",
"currentDirectoryPath" : null,
"description" : "Stops DND via DND Me.",
"filename" : "stop-dnd-me.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🔔"
},
"identifier" : "b382cc160f69b4551ceddaab6d613f1a",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "DND Me",
"path" : "apps\/dnd-me\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Stop DND",
"updatedAt" : "2021-05-28T10:40:03+01:00"
},
{
"authors" : [
{
"name" : "Roland Leth",
"url" : "https:\/\/runtimesharks.com\/projects\/dnd-me"
}
],
"createdAt" : "2021-04-21T11:07:25+03:00",
"currentDirectoryPath" : null,
"description" : "Starts DND via DND Me. The parameter has to be a menu item or slider equivalent: 15m, 30m, 1h, 2h, ..., 12h, next, next-hour, next-half-hour; it defaults to next. next-hour means the next 60m mark, next-half-hour means the next 30m mark and next means the first of the two. For example, if it's 9:22, next-hour means 10:00, next-half-hour means 9:30 and next means 9:30.",
"filename" : "start-dnd-me.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🔕"
},
"identifier" : "98631b11572aad898f0ff5303c51aeaf",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "DND Me",
"path" : "apps\/dnd-me\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Start DND",
"updatedAt" : "2021-05-28T10:40:03+01:00"
}
]
},
{
"name" : "Tailscale",
"path" : "tailscale",
"readme" : "apps\/tailscale\/README.md",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Ross Zurowski",
"url" : "https:\/\/github.com\/rosszurowski"
}
],
"createdAt" : "2021-06-14T15:33:18-04:00",
"currentDirectoryPath" : null,
"description" : "Disconnects from Tailscale",
"filename" : "tailscale-disconnect.sh",
"hasArguments" : false,
"icon" : {
"dark" : ".\/images\/tailscale-iconDark.png",
"light" : ".\/images\/tailscale-icon.png"
},
"identifier" : "e8490d25ff8264ba488daca5cf1bd686",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Tailscale",
"path" : "apps\/tailscale\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Disconnect",
"updatedAt" : "2021-06-14T15:33:18-04:00"
},
{
"authors" : [
{
"name" : "Ross Zurowski",
"url" : "https:\/\/github.com\/rosszurowski"
}
],
"createdAt" : "2021-06-14T15:33:18-04:00",
"currentDirectoryPath" : null,
"description" : "Gets your private Tailscale IP",
"filename" : "tailscale-ip.sh",
"hasArguments" : false,
"icon" : {
"dark" : ".\/images\/tailscale-iconDark.png",
"light" : ".\/images\/tailscale-icon.png"
},
"identifier" : "95bc0bc6cbf4aa67028652f54fc1009c",
"isTemplate" : false,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Tailscale",
"path" : "apps\/tailscale\/",
"refreshTime" : "1d",
"schemaVersion" : 1,
"title" : "Get IP",
"updatedAt" : "2021-06-14T15:33:18-04:00"
},
{
"authors" : [
{
"name" : "Ross Zurowski",
"url" : "https:\/\/github.com\/rosszurowski"
}
],
"createdAt" : "2021-06-14T15:33:18-04:00",
"currentDirectoryPath" : null,
"description" : "Connects to Tailscale",
"filename" : "tailscale-connect.sh",
"hasArguments" : false,
"icon" : {
"dark" : ".\/images\/tailscale-iconDark.png",
"light" : ".\/images\/tailscale-icon.png"
},
"identifier" : "3264e1d35d86b9573e5d3962b64992f6",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Tailscale",
"path" : "apps\/tailscale\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Connect",
"updatedAt" : "2021-06-14T15:33:18-04:00"
},
{
"authors" : [
{
"name" : "Ross Zurowski",
"url" : "https:\/\/github.com\/rosszurowski"
},
{
"name" : "Daniel Schoemer",
"url" : "https:\/\/github.com\/quatauta"
}
],
"createdAt" : "2021-06-14T15:33:18-04:00",
"currentDirectoryPath" : null,
"description" : "Switches Tailscale networks",
"filename" : "tailscale-switch.sh",
"hasArguments" : false,
"icon" : {
"dark" : ".\/images\/tailscale-iconDark.png",
"light" : ".\/images\/tailscale-icon.png"
},
"identifier" : "d80b655296e9ce8762ff310a4dc45d7a",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Tailscale",
"path" : "apps\/tailscale\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Switch Account",
"updatedAt" : "2024-08-19T14:49:32+02:00"
}
]
},
{
"name" : "Deepl",
"path" : "deepl",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Jono Hewitt",
"url" : "https:\/\/github.com\/jonohewitt"
}
],
"createdAt" : "2021-03-16T15:22:56+01:00",
"currentDirectoryPath" : null,
"description" : "Translate text on the DeepL website. Translates to a default language if no \"to\" argument is given.",
"filename" : "deepl-web-translate.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/deepl.png"
},
"identifier" : "0c7a95c20bc816c7db4e9b84ed604c0e",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Web Searches",
"path" : "apps\/deepl\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "DeepL Web Translate",
"updatedAt" : "2021-04-07T20:04:04+08:00"
},
{
"authors" : [
{
"name" : "Jono Hewitt",
"url" : "https:\/\/github.com\/jonohewitt"
}
],
"createdAt" : "2021-03-12T22:44:13+01:00",
"currentDirectoryPath" : null,
"description" : "Translate text in DeepL for Mac. Features options to input from the clipboard as well as automatically copy translation results.",
"filename" : "deepl-app-translate.applescript",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/deepl.png"
},
"identifier" : "13e79a758f8e2822baea735ea52075c5",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Apps",
"path" : "apps\/deepl\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "DeepL App Translate",
"updatedAt" : "2022-02-07T03:09:14+01:00"
}
]
},
{
"name" : "WARP",
"path" : "warp",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Sergey Fuksman",
"url" : "https:\/\/github.com\/fuksman"
}
],
"createdAt" : "2021-11-03T23:01:39+03:00",
"currentDirectoryPath" : null,
"description" : "Disconnect from WARP",
"filename" : "warp-stop.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/warp.png"
},
"identifier" : "84f6a46d9901c80cc7dd7a7d71e833db",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "WARP",
"path" : "apps\/warp\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Disconnect",
"updatedAt" : "2022-11-21T00:02:28+07:00"
},
{
"authors" : [
{
"name" : "Sergey Fuksman",
"url" : "https:\/\/github.com\/fuksman"
}
],
"createdAt" : "2021-11-03T23:01:39+03:00",
"currentDirectoryPath" : null,
"description" : "Toggle Connection",
"filename" : "warp-toggle.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/warp.png"
},
"identifier" : "7792a62e2ea9c46c3c44aa5c7ea0a3fe",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "WARP",
"path" : "apps\/warp\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Toggle WARP",
"updatedAt" : "2022-11-21T00:02:28+07:00"
},
{
"authors" : [
{
"name" : "Sergey Fuksman",
"url" : "https:\/\/github.com\/fuksman"
}
],
"createdAt" : "2021-11-03T23:01:39+03:00",
"currentDirectoryPath" : null,
"description" : "Check WARP connection",
"filename" : "warp-status.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/warp.png"
},
"identifier" : "e24da24122bfc2592adaf22617c9b2ee",
"isTemplate" : false,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "WARP",
"path" : "apps\/warp\/",
"refreshTime" : "30s",
"schemaVersion" : 1,
"title" : "WARP Status",
"updatedAt" : "2022-11-21T00:02:28+07:00"
},
{
"authors" : [
{
"name" : "Sergey Fuksman",
"url" : "https:\/\/github.com\/fuksman"
}
],
"createdAt" : "2021-11-03T23:01:39+03:00",
"currentDirectoryPath" : null,
"description" : "Create a connection to WARP",
"filename" : "warp-start.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/warp.png"
},
"identifier" : "5e1bf486a85fcd82a889fc34e2f23399",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "WARP",
"path" : "apps\/warp\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Connect",
"updatedAt" : "2022-11-21T00:02:28+07:00"
},
{
"authors" : [
{
"name" : "Daniils Petrovs",
"url" : "https:\/\/github.com\/danirukun"
}
],
"createdAt" : "2021-11-03T23:01:39+03:00",
"currentDirectoryPath" : null,
"description" : "Force WARP reauthentication",
"filename" : "warp-reauth.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/warp.png"
},
"identifier" : "a47be00594b26ffd668ccf35ac6d9a10",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "WARP",
"path" : "apps\/warp\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Reauthenticate",
"updatedAt" : "2023-08-10T10:55:06+02:00"
}
]
},
{
"name" : "Medo",
"path" : "medo",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Aayush ",
"url" : "https:\/\/github.com\/Aayush9029"
}
],
"createdAt" : "2022-03-27T16:04:55-04:00",
"currentDirectoryPath" : null,
"description" : "Add a new task with priority ",
"filename" : "medo-float-small.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : ".\/images\/medo.png"
},
"identifier" : "53656a8d7f20d1e46864d16a171f415e",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Medo",
"path" : "apps\/medo\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Medo Float Small",
"updatedAt" : "2022-03-27T16:04:55-04:00"
},
{
"authors" : [
{
"name" : "Aayush ",
"url" : "https:\/\/github.com\/Aayush9029"
}
],
"createdAt" : "2022-03-27T16:04:55-04:00",
"currentDirectoryPath" : null,
"description" : "Add a new task with priority ",
"filename" : "medo-float-large.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : ".\/images\/medo.png"
},
"identifier" : "1b642fee34bc69c2bfffff0474590cda",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Medo",
"path" : "apps\/medo\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Medo Float Large",
"updatedAt" : "2022-03-27T16:04:55-04:00"
},
{
"authors" : [
{
"name" : "Aayush ",
"url" : "https:\/\/github.com\/Aayush9029"
}
],
"createdAt" : "2022-03-27T16:04:55-04:00",
"currentDirectoryPath" : null,
"description" : "Add a new task",
"filename" : "add-task.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : ".\/images\/medo.png"
},
"identifier" : "964abdac20ce59cf52a6d150569ed68c",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Medo",
"path" : "apps\/medo\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Add Task",
"updatedAt" : "2022-03-27T16:04:55-04:00"
},
{
"authors" : [
{
"name" : "Aayush ",
"url" : "https:\/\/github.com\/Aayush9029"
}
],
"createdAt" : "2022-03-27T16:04:55-04:00",
"currentDirectoryPath" : null,
"description" : "Add a new task with priority ",
"filename" : "medo-float.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : ".\/images\/medo.png"
},
"identifier" : "d17151bc9fa155a91dd7a260bf330279",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Medo",
"path" : "apps\/medo\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Medo Float",
"updatedAt" : "2022-03-27T16:04:55-04:00"
}
]
},
{
"name" : "Agenda",
"path" : "agenda",
"readme" : "apps\/agenda\/README.md",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Michael Ellis",
"url" : "https:\/\/github.com\/mtellis2"
}
],
"createdAt" : "2021-06-26T15:52:43-04:00",
"currentDirectoryPath" : null,
"description" : "Opens Agenda - Today Overview",
"filename" : "agenda-today.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/agenda.png"
},
"identifier" : "7f50aaf0597b597069fb354a58a4573b",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Agenda",
"path" : "apps\/agenda\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Agenda Today Overview",
"updatedAt" : "2021-06-26T15:52:43-04:00"
},
{
"authors" : [
{
"name" : "Michael Ellis",
"url" : "https:\/\/github.com\/mtellis2"
}
],
"createdAt" : "2021-06-26T15:52:43-04:00",
"currentDirectoryPath" : null,
"description" : "Opens Agenda - On the Agenda Overview",
"filename" : "agenda-on-the-agenda.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/agenda.png"
},
"identifier" : "8e019b6506bee0ffad51b2a625ed0d0b",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Agenda",
"path" : "apps\/agenda\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "On the Agenda Overview",
"updatedAt" : "2021-06-26T15:52:43-04:00"
},
{
"authors" : [
{
"name" : "Michael Ellis",
"url" : "https:\/\/github.com\/mtellis2"
}
],
"createdAt" : "2021-06-26T15:52:43-04:00",
"currentDirectoryPath" : null,
"description" : "Creates New Note and adds it to On the Agenda",
"filename" : "agenda-new-note.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/agenda.png"
},
"identifier" : "9b7ee4e0b61fcd48feeb8280ac0adbdf",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Agenda",
"path" : "apps\/agenda\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Create New On the Agenda Note",
"updatedAt" : "2021-06-26T15:52:43-04:00"
}
]
},
{
"name" : "Sip",
"path" : "sip",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Sip",
"url" : "https:\/\/twitter.com\/sip_app\/"
}
],
"createdAt" : "2021-03-09T18:54:05-08:00",
"currentDirectoryPath" : null,
"description" : " Add a color to your Sip history.",
"filename" : "sip-add-hex-color.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : ".\/images\/sip.png"
},
"identifier" : "1464e6600c3226f74b04dfa0dd946eac",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Sip",
"path" : "apps\/sip\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : " Add Color to History",
"updatedAt" : "2021-05-28T10:43:11+01:00"
},
{
"authors" : [
{
"name" : "Sip",
"url" : "https:\/\/twitter.com\/sip_app\/"
}
],
"createdAt" : "2021-03-09T18:54:05-08:00",
"currentDirectoryPath" : null,
"description" : "Open Sip Contrast Checker.",
"filename" : "sip-open-check-contrast.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : ".\/images\/sip.png"
},
"identifier" : "3c16dd65bb4f638b006b4e71787ff835",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Sip",
"path" : "apps\/sip\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open Contrast Checker",
"updatedAt" : "2021-05-28T10:43:11+01:00"
},
{
"authors" : [
{
"name" : "Sip",
"url" : "https:\/\/twitter.com\/sip_app\/"
}
],
"createdAt" : "2021-03-09T18:54:05-08:00",
"currentDirectoryPath" : null,
"description" : "Pick a color value from your screen.",
"filename" : "sip-show-picker.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : ".\/images\/sip.png"
},
"identifier" : "e0a9a42ede865f3c4b41b8212b7abf47",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Sip",
"path" : "apps\/sip\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Show Color Picker",
"updatedAt" : "2021-05-28T10:43:11+01:00"
},
{
"authors" : [
{
"name" : "Sip",
"url" : "https:\/\/twitter.com\/sip_app\/"
}
],
"createdAt" : "2021-03-09T18:54:05-08:00",
"currentDirectoryPath" : null,
"description" : "Open Sip Contrast Checker.",
"filename" : "sip-check-contrast-hex.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : ".\/images\/sip.png"
},
"identifier" : "23c64d597f80a9cc2b19cc5e5ed8c27d",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Sip",
"path" : "apps\/sip\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Check Contrast",
"updatedAt" : "2021-05-28T10:43:11+01:00"
}
]
},
{
"name" : "Obsidian",
"path" : "obsidian",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Yiyao Wei",
"url" : "https:\/\/github.com\/HotThoughts"
}
],
"createdAt" : "2021-07-18T15:40:05+02:00",
"currentDirectoryPath" : null,
"description" : "Create a new note",
"filename" : "obsidian-create-note.template.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : ".\/images\/obsidian.png"
},
"identifier" : "5e5d144d98524911ae3b2198de181c01",
"isTemplate" : true,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Obsidian",
"path" : "apps\/obsidian\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Create Note",
"updatedAt" : "2021-07-19T22:03:48+02:00"
},
{
"authors" : [
{
"name" : "Yiyao Wei",
"url" : "https:\/\/github.com\/HotThoughts"
}
],
"createdAt" : "2021-07-18T15:40:05+02:00",
"currentDirectoryPath" : null,
"description" : "Search Obsidian Vault",
"filename" : "obsidian-search-vault.template.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : ".\/images\/obsidian.png"
},
"identifier" : "220bea9681acc6640802b8cb8b0ee55d",
"isTemplate" : true,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Obsidian",
"path" : "apps\/obsidian\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search in Vault",
"updatedAt" : "2021-07-19T22:03:48+02:00"
}
]
},
{
"name" : "Things",
"path" : "things",
"readme" : "apps\/things\/README.md",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Things",
"url" : "https:\/\/twitter.com\/culturedcode\/"
}
],
"createdAt" : "2021-03-03T19:17:44Z",
"currentDirectoryPath" : null,
"description" : "Get an overview of your completed tasks for today.",
"filename" : "things-today.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/things.png"
},
"identifier" : "f5c008fbbafb56d3dd35483b209357f5",
"isTemplate" : false,
"language" : "applescript",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Things",
"path" : "apps\/things\/",
"refreshTime" : "1m",
"schemaVersion" : 1,
"title" : "Today",
"updatedAt" : "2021-03-03T19:17:44Z"
},
{
"authors" : [
{
"name" : "Things",
"url" : "https:\/\/twitter.com\/culturedcode\/"
}
],
"createdAt" : "2021-03-03T19:17:44Z",
"currentDirectoryPath" : null,
"description" : "Search To-Dos with a query.",
"filename" : "things-search-to-dos.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/things.png"
},
"identifier" : "81182c169dbbf72ba9dfbbfea713275b",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Things",
"path" : "apps\/things\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search To-Dos",
"updatedAt" : "2021-03-03T19:17:44Z"
},
{
"authors" : [
{
"name" : "Things",
"url" : "https:\/\/twitter.com\/culturedcode\/"
}
],
"createdAt" : "2021-03-03T19:17:44Z",
"currentDirectoryPath" : null,
"description" : "Create a new To-Do with title and optional deadline.",
"filename" : "things-create-todo.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/things.png"
},
"identifier" : "f5ae3372a366a985c4a630f8f3412f83",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Things",
"path" : "apps\/things\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Create To-Do",
"updatedAt" : "2021-08-09T22:29:37+02:00"
},
{
"authors" : [
{
"name" : "Things",
"url" : "https:\/\/twitter.com\/culturedcode\/"
}
],
"createdAt" : "2021-03-03T19:17:44Z",
"currentDirectoryPath" : null,
"description" : "Show your current To-Do to stay focused.",
"filename" : "things-current-todo.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/things.png"
},
"identifier" : "7a61aa9d34f92172b970cf9ff88113af",
"isTemplate" : false,
"language" : "applescript",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Things",
"path" : "apps\/things\/",
"refreshTime" : "1m",
"schemaVersion" : 1,
"title" : "Current To-Do",
"updatedAt" : "2021-03-03T19:17:44Z"
}
]
},
{
"name" : "Chatgpt",
"path" : "chatgpt",
"scriptCommands" : [
{
"authors" : [
{
"name" : "gintonyc",
"url" : "https:\/\/raycast.com\/gintonyc"
}
],
"createdAt" : "2023-06-05T12:05:06+08:00",
"currentDirectoryPath" : null,
"description" : "Open chatgpt in safari",
"filename" : "chatgpt-open-safari.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/chatgpt.png"
},
"identifier" : "9dd095ddbac7bc040b2af63d1532a3d1",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Chatgpt Util",
"path" : "apps\/chatgpt\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "chatgpt",
"updatedAt" : "2023-06-05T07:04:09Z"
}
]
},
{
"name" : "Trello",
"path" : "trello",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Michael Francis",
"url" : "https:\/\/github.com\/mikefrancis"
}
],
"createdAt" : "2021-08-12T08:49:15+01:00",
"currentDirectoryPath" : null,
"description" : "Create a new Trello card",
"filename" : "create-trello-card.template.py",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : ".\/images\/logo.png"
},
"identifier" : "0ab076acf65d71d43777520db336ca41",
"isTemplate" : true,
"language" : "python",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Trello",
"path" : "apps\/trello\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Create Card",
"updatedAt" : "2021-08-12T07:51:38Z"
}
]
},
{
"name" : "MenubarX",
"path" : "menubarx",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Clu Soh",
"url" : "https:\/\/twitter.com\/designedbyclu"
}
],
"createdAt" : "2022-06-14T15:34:34+08:00",
"currentDirectoryPath" : null,
"description" : "Open Pasteboard link in MenubarX",
"filename" : "open-in-menubarx.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/menubarx_logo.png"
},
"identifier" : "d919503ba27fcc13e43995035a1a51e2",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "MenubarX",
"path" : "apps\/menubarx\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open in MenubarX",
"updatedAt" : "2022-06-14T15:34:34+08:00"
},
{
"authors" : [
{
"name" : "Clu Soh",
"url" : "https:\/\/twitter.com\/designedbyclu"
}
],
"createdAt" : "2022-06-14T15:34:34+08:00",
"currentDirectoryPath" : null,
"description" : "Open X Tab in your menubar",
"filename" : "open-tab-in-menubar.applescript",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/menubarx_logo.png"
},
"identifier" : "cc7255205230e541123c8c720f81d511",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "MenubarX",
"path" : "apps\/menubarx\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open Tabs",
"updatedAt" : "2022-06-14T15:34:34+08:00"
},
{
"authors" : [
{
"name" : "Clu Soh",
"url" : "https:\/\/twitter.com\/designedbyclu"
}
],
"createdAt" : "2022-06-14T15:34:34+08:00",
"currentDirectoryPath" : null,
"description" : "Close last viewed tab in MenubarX",
"filename" : "close-last-menubarx-tab.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/menubarx_logo.png"
},
"identifier" : "48706938160df7f4d61a274a752dea5b",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "MenubarX",
"path" : "apps\/menubarx\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Close Last Tab",
"updatedAt" : "2022-06-14T15:34:34+08:00"
}
]
},
{
"name" : "Viscosity",
"path" : "viscosity",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Luigi Cardito (credits Achille Lacoin https:\/\/github.com\/pomdtr)",
"url" : "https:\/\/github.com\/lcardito"
}
],
"createdAt" : "2021-03-23T21:40:02+01:00",
"currentDirectoryPath" : null,
"description" : "Disconnect all connected VPN configurations.",
"filename" : "viscosity-disconnect-all.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/viscosity.png"
},
"identifier" : "e271e6ed237d2a3fb9c8a401ff15503e",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : false,
"packageName" : "Viscosity",
"path" : "apps\/viscosity\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Viscosity: Disconnect All",
"updatedAt" : "2021-03-23T21:40:02+01:00"
},
{
"authors" : [
{
"name" : "Luigi Cardito (credits Achille Lacoin https:\/\/github.com\/pomdtr)",
"url" : "https:\/\/github.com\/lcardito"
}
],
"createdAt" : "2021-03-23T21:40:02+01:00",
"currentDirectoryPath" : null,
"description" : "Connect a VPN viscosity configuration.",
"filename" : "viscosity-connect.applescript",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/viscosity.png"
},
"identifier" : "aff632e02a4d4991a02dcb2e998b5598",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : false,
"packageName" : "Viscosity",
"path" : "apps\/viscosity\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Viscosity: Connect",
"updatedAt" : "2021-03-23T21:40:02+01:00"
},
{
"authors" : [
{
"name" : "Luigi Cardito (credits Achille Lacoin https:\/\/github.com\/pomdtr)",
"url" : "https:\/\/github.com\/lcardito"
}
],
"createdAt" : "2021-03-14T17:37:20+01:00",
"currentDirectoryPath" : null,
"description" : "Disconnect a VPN configuration.",
"filename" : "viscosity-disconnect.applescript",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/viscosity.png"
},
"identifier" : "3026d9f845bb1212453542c8faac0c99",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : false,
"packageName" : "Viscosity",
"path" : "apps\/viscosity\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Viscosity: Disconnect",
"updatedAt" : "2021-03-23T21:40:02+01:00"
},
{
"authors" : [
{
"name" : "Luigi Cardito (credits Achille Lacoin https:\/\/github.com\/pomdtr)",
"url" : "https:\/\/github.com\/lcardito"
}
],
"createdAt" : "2021-03-14T17:37:20+01:00",
"currentDirectoryPath" : null,
"description" : "Connect all unconnected VPN configurations.",
"filename" : "viscosity-connect-all.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/viscosity.png"
},
"identifier" : "71345f2d9ab8ad5b476cd4adeff8e1e7",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : false,
"packageName" : "Viscosity",
"path" : "apps\/viscosity\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Viscosity: Connect All",
"updatedAt" : "2021-03-23T21:40:02+01:00"
}
]
},
{
"name" : "ExpressVPN",
"path" : "expressvpn",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Amir Hossein SamadiPour",
"url" : "https:\/\/github.com\/SamadiPour"
}
],
"createdAt" : "2022-07-22T18:26:50+04:30",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "expressvpn-reconnect.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/expressvpn_logo.svg"
},
"identifier" : "3bada318c2097f51fcbec7513b5ecaa6",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "ExpressVPN",
"path" : "apps\/expressvpn\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Reconnect",
"updatedAt" : "2022-07-22T18:26:50+04:30"
},
{
"authors" : [
{
"name" : "Amir Hossein SamadiPour",
"url" : "https:\/\/github.com\/SamadiPour"
}
],
"createdAt" : "2022-07-22T18:26:50+04:30",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "expressvpn-disconnect.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/expressvpn_logo.svg"
},
"identifier" : "f8d7cbf3a379d469dd987f032de1656c",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "ExpressVPN",
"path" : "apps\/expressvpn\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Disconnect",
"updatedAt" : "2022-07-22T18:26:50+04:30"
},
{
"authors" : [
{
"name" : "Amir Hossein SamadiPour",
"url" : "https:\/\/github.com\/SamadiPour"
}
],
"createdAt" : "2022-07-22T18:26:50+04:30",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "expressvpn-connect.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/expressvpn_logo.svg"
},
"identifier" : "3c0176e3dc0c58d220cd3f9fdb90e4c5",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "ExpressVPN",
"path" : "apps\/expressvpn\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Connect",
"updatedAt" : "2022-07-22T18:26:50+04:30"
}
]
},
{
"name" : "Quip",
"path" : "quip",
"readme" : "apps\/quip\/README.org",
"scriptCommands" : [
{
"authors" : [
{
"name" : "zzamboni",
"url" : "https:\/\/raycast.com\/zzamboni"
}
],
"createdAt" : "2023-07-12T10:50:40+02:00",
"currentDirectoryPath" : null,
"description" : "Configure your Quip API token and other defaults in quip_config.ini",
"filename" : "quip-new.template.py",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "\/Applications\/Quip.app\/Contents\/Resources\/AppIcon.icns"
},
"identifier" : "d8fa7bc18200bc8e62536c5dd1c5a6f9",
"isTemplate" : true,
"language" : "python",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Quip utilities",
"path" : "apps\/quip\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "{{commandtitle}}",
"updatedAt" : "2023-07-12T10:50:40+02:00"
},
{
"authors" : [
{
"name" : "diego_zamboni",
"url" : "https:\/\/raycast.com\/diego_zamboni"
}
],
"createdAt" : "2023-07-12T10:50:40+02:00",
"currentDirectoryPath" : null,
"description" : "Create script commands for creating Quip documents, based on the configuration in quip_config.ini.",
"filename" : "set-up-quip-commands.py",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "\/Applications\/Quip.app\/Contents\/Resources\/AppIcon.icns"
},
"identifier" : "fdc5f3fc9cc957f068cd9ec6a7c031b6",
"isTemplate" : false,
"language" : "python",
"mode" : "fullOutput",
"needsConfirmation" : true,
"packageName" : "Quip utilities",
"path" : "apps\/quip\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Set up Quip commands",
"updatedAt" : "2023-07-12T10:50:40+02:00"
}
]
},
{
"name" : "Hyper",
"path" : "hyper",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Eliot Hertenstein",
"url" : "https:\/\/github.com\/eIiot"
}
],
"createdAt" : "2022-02-18T02:19:33-08:00",
"currentDirectoryPath" : "~",
"description" : "Run a terminal using Hyper",
"filename" : "hyper-run-shell-command.applescript",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/hyper.png"
},
"identifier" : "49608e0b2c2375fec1a6f173155333af",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Hyper",
"path" : "apps\/hyper\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Run Shell Command",
"updatedAt" : "2022-02-18T19:08:51-08:00"
}
]
},
{
"name" : "Reminders",
"path" : "reminders",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Andrei Nedelcu",
"url" : "https:\/\/dinosaurgame.net"
}
],
"createdAt" : "2022-02-07T04:07:49+02:00",
"currentDirectoryPath" : null,
"description" : "Add a new reminder.",
"filename" : "reminders-create-reminder.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/reminders.png"
},
"identifier" : "75a45615fac6beb2797006d141e954b6",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Create Reminder",
"path" : "apps\/reminders\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Add Reminder",
"updatedAt" : "2022-02-07T02:10:02Z"
}
]
},
{
"name" : "Devutils",
"path" : "devutils",
"scriptCommands" : [
{
"authors" : [
{
"name" : "DevUtils.app",
"url" : "https:\/\/devutils.app"
}
],
"createdAt" : "2022-01-23T16:30:27+07:00",
"currentDirectoryPath" : null,
"description" : "Convert your current clipboard from CSV to JSON",
"filename" : "csv2json.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/devutils.png"
},
"identifier" : "96351002cef0c040a5c35e6f2e04a7a0",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "DevUtils.app",
"path" : "apps\/devutils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "CSV to JSON",
"updatedAt" : "2022-01-23T16:30:27+07:00"
},
{
"authors" : [
{
"name" : "DevUtils.app",
"url" : "https:\/\/devutils.app"
}
],
"createdAt" : "2022-01-23T16:30:27+07:00",
"currentDirectoryPath" : null,
"description" : "Escape (or unescape) the HTML entities your current clipboard string",
"filename" : "htmlencode.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/devutils.png"
},
"identifier" : "7b2949bdb3461fae767de2e8a2686153",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "DevUtils.app",
"path" : "apps\/devutils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "HTML Entity Encode\/Decode",
"updatedAt" : "2022-01-23T16:30:27+07:00"
},
{
"authors" : [
{
"name" : "DevUtils.app",
"url" : "https:\/\/devutils.app"
}
],
"createdAt" : "2022-01-23T16:30:27+07:00",
"currentDirectoryPath" : null,
"description" : "Beautify or minify your current clipboard as XML",
"filename" : "xmlformatter.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/devutils.png"
},
"identifier" : "c1fd8764b8bb26e465a7a48dc3d55b89",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "DevUtils.app",
"path" : "apps\/devutils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "XML Beautify\/Minify",
"updatedAt" : "2022-01-23T16:30:27+07:00"
},
{
"authors" : [
{
"name" : "DevUtils.app",
"url" : "https:\/\/devutils.app"
}
],
"createdAt" : "2022-01-23T16:30:27+07:00",
"currentDirectoryPath" : null,
"description" : "Convert the HTML string in clipboard to JSX",
"filename" : "html2jsx.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/devutils.png"
},
"identifier" : "5d48ac8248afc31799260e5ee0af87b1",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "DevUtils.app",
"path" : "apps\/devutils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "HTML to JSX",
"updatedAt" : "2022-01-23T16:30:27+07:00"
},
{
"authors" : [
{
"name" : "DevUtils.app",
"url" : "https:\/\/devutils.app"
}
],
"createdAt" : "2022-01-23T16:30:27+07:00",
"currentDirectoryPath" : null,
"description" : "Escape (or unescape) backslashes in your current clipboard string",
"filename" : "backslash.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/devutils.png"
},
"identifier" : "1fe92d44c297f36a443e1741eb727317",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "DevUtils.app",
"path" : "apps\/devutils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Backslash Escape\/Unescape",
"updatedAt" : "2022-01-23T16:30:27+07:00"
},
{
"authors" : [
{
"name" : "DevUtils.app",
"url" : "https:\/\/devutils.app"
}
],
"createdAt" : "2022-01-23T16:30:27+07:00",
"currentDirectoryPath" : null,
"description" : "Get some randomly generated lorem ipsum strings",
"filename" : "loremipsum.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/devutils.png"
},
"identifier" : "34c135d0d015486dc28c4a1789dd9c5e",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "DevUtils.app",
"path" : "apps\/devutils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Lorem Ipsum Generator",
"updatedAt" : "2022-01-23T16:30:27+07:00"
},
{
"authors" : [
{
"name" : "DevUtils.app",
"url" : "https:\/\/devutils.app"
}
],
"createdAt" : "2022-01-23T16:30:27+07:00",
"currentDirectoryPath" : null,
"description" : "Decode and verify the current JWT token in your clipboard",
"filename" : "jwt.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/devutils.png"
},
"identifier" : "03b13d316e4eaf0c2cf02eec27ad6d49",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "DevUtils.app",
"path" : "apps\/devutils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "JWT Debugger",
"updatedAt" : "2022-01-23T16:30:27+07:00"
},
{
"authors" : [
{
"name" : "DevUtils.app",
"url" : "https:\/\/devutils.app"
}
],
"createdAt" : "2022-01-23T16:30:27+07:00",
"currentDirectoryPath" : null,
"description" : "Beautify or minify your current clipboard as ERB",
"filename" : "erbformatter.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/devutils.png"
},
"identifier" : "c0862014d90bee6995ecfbf61b5468d2",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "DevUtils.app",
"path" : "apps\/devutils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "ERB Beautify\/Minify",
"updatedAt" : "2022-01-23T16:30:27+07:00"
},
{
"authors" : [
{
"name" : "DevUtils.app",
"url" : "https:\/\/devutils.app"
}
],
"createdAt" : "2022-01-23T16:30:27+07:00",
"currentDirectoryPath" : null,
"description" : "Format the SQL string currently in your clipboard",
"filename" : "sqlformatter.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/devutils.png"
},
"identifier" : "9ec928b585e7c1b2de1f2e13cb3fab26",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "DevUtils.app",
"path" : "apps\/devutils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "SQL Formatter",
"updatedAt" : "2022-01-23T16:30:27+07:00"
},
{
"authors" : [
{
"name" : "DevUtils.app",
"url" : "https:\/\/devutils.app"
}
],
"createdAt" : "2022-01-23T16:30:27+07:00",
"currentDirectoryPath" : null,
"description" : "Inspect your current clipboard string (length, words count, unicode, etc.)",
"filename" : "stringinspect.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/devutils.png"
},
"identifier" : "3da94b4e417bf5ff6e44b67869a7d612",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "DevUtils.app",
"path" : "apps\/devutils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "String Inspector",
"updatedAt" : "2022-01-23T16:30:27+07:00"
},
{
"authors" : [
{
"name" : "DevUtils.app",
"url" : "https:\/\/devutils.app"
}
],
"createdAt" : "2022-01-23T16:30:27+07:00",
"currentDirectoryPath" : null,
"description" : "Decode the Base64 string in clipboard (if it’s decodable)",
"filename" : "base64encode.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/devutils.png"
},
"identifier" : "65ca896b0c3fb60ad6f189616c8c7524",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "DevUtils.app",
"path" : "apps\/devutils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Base64 String Encode\/Decode",
"updatedAt" : "2022-01-23T16:30:27+07:00"
},
{
"authors" : [
{
"name" : "DevUtils.app",
"url" : "https:\/\/devutils.app"
}
],
"createdAt" : "2022-01-23T16:30:27+07:00",
"currentDirectoryPath" : null,
"description" : "Convert your current clipboard from JSON to CSV",
"filename" : "json2csv.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/devutils.png"
},
"identifier" : "77e0bc4cd51d4d5cd1560c0c2b420214",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "DevUtils.app",
"path" : "apps\/devutils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "JSON to CSV",
"updatedAt" : "2022-01-23T16:30:27+07:00"
},
{
"authors" : [
{
"name" : "DevUtils.app",
"url" : "https:\/\/devutils.app"
}
],
"createdAt" : "2022-01-23T16:30:27+07:00",
"currentDirectoryPath" : null,
"description" : "Beautify or minify your current clipboard as CSS",
"filename" : "cssformatter.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/devutils.png"
},
"identifier" : "55e6391c0919e4ce410977d7791d75f3",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "DevUtils.app",
"path" : "apps\/devutils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "CSS Beautify\/Minify",
"updatedAt" : "2022-01-23T16:30:27+07:00"
},
{
"authors" : [
{
"name" : "DevUtils.app",
"url" : "https:\/\/devutils.app"
}
],
"createdAt" : "2022-01-23T16:30:27+07:00",
"currentDirectoryPath" : null,
"description" : "Convert your current clipboard from JSON to YAML",
"filename" : "json2yaml.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/devutils.png"
},
"identifier" : "7fda6adb9ccc8f154619301140faa03c",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "DevUtils.app",
"path" : "apps\/devutils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "JSON to YAML",
"updatedAt" : "2022-01-23T16:30:27+07:00"
},
{
"authors" : [
{
"name" : "DevUtils.app",
"url" : "https:\/\/devutils.app"
}
],
"createdAt" : "2022-01-23T16:30:27+07:00",
"currentDirectoryPath" : null,
"description" : "Calculate the hash of your current clipboard string",
"filename" : "hashing.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/devutils.png"
},
"identifier" : "660dc6a522fbb4c1d25fdd5c4bc43503",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "DevUtils.app",
"path" : "apps\/devutils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Hash Generator",
"updatedAt" : "2022-01-23T16:30:27+07:00"
},
{
"authors" : [
{
"name" : "DevUtils.app",
"url" : "https:\/\/devutils.app"
}
],
"createdAt" : "2022-01-23T16:30:27+07:00",
"currentDirectoryPath" : null,
"description" : "Parse the cron job expression in clipboard (if it’s a valid cron expression)",
"filename" : "cronparser.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/devutils.png"
},
"identifier" : "e92d8c824922446f81d842b8a75abeea",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "DevUtils.app",
"path" : "apps\/devutils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Cron Job Parser",
"updatedAt" : "2022-01-23T16:30:27+07:00"
},
{
"authors" : [
{
"name" : "DevUtils.app",
"url" : "https:\/\/devutils.app"
}
],
"createdAt" : "2022-01-23T16:30:27+07:00",
"currentDirectoryPath" : null,
"description" : "Decode the current URL string in your clipboard (if any)",
"filename" : "urlencode.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/devutils.png"
},
"identifier" : "4770cbb56d80eed7a9092dcb84442724",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "DevUtils.app",
"path" : "apps\/devutils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "URL Encode\/Decode",
"updatedAt" : "2022-01-23T16:30:27+07:00"
},
{
"authors" : [
{
"name" : "DevUtils.app",
"url" : "https:\/\/devutils.app"
}
],
"createdAt" : "2022-01-23T16:30:27+07:00",
"currentDirectoryPath" : null,
"description" : "Decode the UUID in your clipboard (if any), or generate UUIDs",
"filename" : "uuidtool.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/devutils.png"
},
"identifier" : "64fd318687c1f6e5e92033e62fe3b8a2",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "DevUtils.app",
"path" : "apps\/devutils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "UUID\/ULID Generate\/Decode",
"updatedAt" : "2022-01-23T16:30:27+07:00"
},
{
"authors" : [
{
"name" : "DevUtils.app",
"url" : "https:\/\/devutils.app"
}
],
"createdAt" : "2022-01-23T16:30:27+07:00",
"currentDirectoryPath" : null,
"description" : "Decode the Base64 string in clipboard to an image (if it’s decodable)",
"filename" : "base64image.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/devutils.png"
},
"identifier" : "6f08b5175968433d58c9b9565fa8e3b5",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "DevUtils.app",
"path" : "apps\/devutils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Base64 Image Encode\/Decode",
"updatedAt" : "2022-01-23T16:30:27+07:00"
},
{
"authors" : [
{
"name" : "DevUtils.app",
"url" : "https:\/\/devutils.app"
}
],
"createdAt" : "2022-01-23T16:30:27+07:00",
"currentDirectoryPath" : null,
"description" : "Beautify or minify your current clipboard as LESS",
"filename" : "lessformatter.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/devutils.png"
},
"identifier" : "3a70a1e6d6df5384d2ca515a3c31ffb2",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "DevUtils.app",
"path" : "apps\/devutils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "LESS Beautify\/Minify",
"updatedAt" : "2022-01-23T16:30:27+07:00"
},
{
"authors" : [
{
"name" : "DevUtils.app",
"url" : "https:\/\/devutils.app"
}
],
"createdAt" : "2022-01-23T16:30:27+07:00",
"currentDirectoryPath" : null,
"description" : "Convert your current clipboard from YAML to JSON",
"filename" : "yaml2json.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/devutils.png"
},
"identifier" : "302fe47b8006d28fe4e9693471193e00",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "DevUtils.app",
"path" : "apps\/devutils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "YAML to JSON",
"updatedAt" : "2022-01-23T16:30:27+07:00"
},
{
"authors" : [
{
"name" : "DevUtils.app",
"url" : "https:\/\/devutils.app"
}
],
"createdAt" : "2022-01-23T16:30:27+07:00",
"currentDirectoryPath" : null,
"description" : "Format the JSON string currently in your clipboard (if it’s a valid JSON)",
"filename" : "jsonformatter.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/devutils.png"
},
"identifier" : "2ff9ca437fae33af3b7e744a05842fe2",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "DevUtils.app",
"path" : "apps\/devutils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "JSON Format\/Validate",
"updatedAt" : "2022-01-23T16:30:27+07:00"
},
{
"authors" : [
{
"name" : "DevUtils.app",
"url" : "https:\/\/devutils.app"
}
],
"createdAt" : "2022-01-23T16:30:27+07:00",
"currentDirectoryPath" : null,
"description" : "Show a HTML preview of your current clipboard string",
"filename" : "htmlpreview.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/devutils.png"
},
"identifier" : "ea972077aa252a09b9755043ddb3ee56",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "DevUtils.app",
"path" : "apps\/devutils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "HTML Preview",
"updatedAt" : "2022-01-23T16:30:27+07:00"
},
{
"authors" : [
{
"name" : "DevUtils.app",
"url" : "https:\/\/devutils.app"
}
],
"createdAt" : "2022-01-23T16:30:27+07:00",
"currentDirectoryPath" : null,
"description" : "Convert a string in clipboard into various naming conventions",
"filename" : "stringcaseconverter.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/devutils.png"
},
"identifier" : "da658bbfc3056122cfa25655191ba46e",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "DevUtils.app",
"path" : "apps\/devutils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "String Case Converter",
"updatedAt" : "2022-01-23T16:30:27+07:00"
},
{
"authors" : [
{
"name" : "DevUtils.app",
"url" : "https:\/\/devutils.app"
}
],
"createdAt" : "2022-01-23T16:30:27+07:00",
"currentDirectoryPath" : null,
"description" : "Test your regular expression with a string and inspect matches, groups, etc.",
"filename" : "regextester.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/devutils.png"
},
"identifier" : "6fdaca184e9aaf35ed9935ca7765c887",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "DevUtils.app",
"path" : "apps\/devutils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "RegExp Tester",
"updatedAt" : "2022-01-23T16:30:27+07:00"
},
{
"authors" : [
{
"name" : "DevUtils.app",
"url" : "https:\/\/devutils.app"
}
],
"createdAt" : "2022-01-23T16:30:27+07:00",
"currentDirectoryPath" : null,
"description" : "Preview the markdown string currently in your clipboard",
"filename" : "markdownpreview.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/devutils.png"
},
"identifier" : "4e9b6a8f59213b7740cf8ea0681d7489",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "DevUtils.app",
"path" : "apps\/devutils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Markdown Preview",
"updatedAt" : "2022-01-23T16:30:27+07:00"
},
{
"authors" : [
{
"name" : "DevUtils.app",
"url" : "https:\/\/devutils.app"
}
],
"createdAt" : "2022-01-23T16:30:27+07:00",
"currentDirectoryPath" : null,
"description" : "Beautify or minify your current clipboard as SCSS",
"filename" : "scssformatter.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/devutils.png"
},
"identifier" : "9e6ab71f9cf6a8621606b3934345e1ef",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "DevUtils.app",
"path" : "apps\/devutils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "SCSS Beautify\/Minify",
"updatedAt" : "2022-01-23T16:30:27+07:00"
},
{
"authors" : [
{
"name" : "DevUtils.app",
"url" : "https:\/\/devutils.app"
}
],
"createdAt" : "2022-01-23T16:30:27+07:00",
"currentDirectoryPath" : null,
"description" : "Compare two texts and find diff (per characters, words, lines, etc.)",
"filename" : "textdiff.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/devutils.png"
},
"identifier" : "59f6ce6bc50e81065dbe667b82c1771f",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "DevUtils.app",
"path" : "apps\/devutils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Text Diff Checker",
"updatedAt" : "2022-01-23T16:30:27+07:00"
},
{
"authors" : [
{
"name" : "DevUtils.app",
"url" : "https:\/\/devutils.app"
}
],
"createdAt" : "2022-01-23T16:30:27+07:00",
"currentDirectoryPath" : null,
"description" : "Beautify or minify your current clipboard as HTML",
"filename" : "htmlformatter.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/devutils.png"
},
"identifier" : "6c594f59f7c3fa76ddbb219689014e61",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "DevUtils.app",
"path" : "apps\/devutils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "HTML Beautify\/Minify",
"updatedAt" : "2022-01-23T16:30:27+07:00"
},
{
"authors" : [
{
"name" : "DevUtils.app",
"url" : "https:\/\/devutils.app"
}
],
"createdAt" : "2022-01-23T16:30:27+07:00",
"currentDirectoryPath" : null,
"description" : "Convert numbers between bases (oct, hex, binary, etc.)",
"filename" : "numberbase.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/devutils.png"
},
"identifier" : "b49f9f56ffad1e4e2127df82116d0f3d",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "DevUtils.app",
"path" : "apps\/devutils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Number Base Converter",
"updatedAt" : "2022-01-23T16:30:27+07:00"
},
{
"authors" : [
{
"name" : "DevUtils.app",
"url" : "https:\/\/devutils.app"
}
],
"createdAt" : "2022-01-23T16:30:27+07:00",
"currentDirectoryPath" : null,
"description" : "Parse the URL string currently in your clipboard",
"filename" : "querystringparser.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/devutils.png"
},
"identifier" : "995abb11b07f6e5776a94c91448cc54b",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "DevUtils.app",
"path" : "apps\/devutils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "URL Parser",
"updatedAt" : "2022-01-23T16:30:27+07:00"
},
{
"authors" : [
{
"name" : "DevUtils.app",
"url" : "https:\/\/devutils.app"
}
],
"createdAt" : "2022-01-23T16:30:27+07:00",
"currentDirectoryPath" : null,
"description" : "Generate a QR code from your current clipboard string",
"filename" : "qrcode.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/devutils.png"
},
"identifier" : "9e5235df4808af09a9c965f83873718d",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "DevUtils.app",
"path" : "apps\/devutils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "QR Code Reader\/Generator",
"updatedAt" : "2022-01-23T16:30:27+07:00"
},
{
"authors" : [
{
"name" : "DevUtils.app",
"url" : "https:\/\/devutils.app"
}
],
"createdAt" : "2022-01-23T16:30:27+07:00",
"currentDirectoryPath" : null,
"description" : "Beautify or minify your current clipboard as JavaScript",
"filename" : "jsformatter.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/devutils.png"
},
"identifier" : "9d6c09efd9fa58b456df731a9758eb3e",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "DevUtils.app",
"path" : "apps\/devutils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "JS Beautify\/Minify",
"updatedAt" : "2022-01-23T16:30:27+07:00"
},
{
"authors" : [
{
"name" : "DevUtils.app",
"url" : "https:\/\/devutils.app"
}
],
"createdAt" : "2022-01-23T16:30:27+07:00",
"currentDirectoryPath" : null,
"description" : "Parse and display UNIX the timestamp string currently in your clipboard",
"filename" : "unixtime.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/devutils.png"
},
"identifier" : "b54dbb6855fc539be668f972f6ad4de0",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "DevUtils.app",
"path" : "apps\/devutils\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Unix Time Converter",
"updatedAt" : "2022-01-23T16:30:27+07:00"
}
]
},
{
"name" : "Espanso",
"path" : "espanso",
"scriptCommands" : [
{
"authors" : [
{
"name" : "es183923",
"url" : "https:\/\/github.com\/es183923"
}
],
"createdAt" : "2021-05-11T20:44:52-04:00",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "enable-espanso.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/espanso.png"
},
"identifier" : "e2ba4a2b364b245d6ce4402f7f2dc936",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Espanso",
"path" : "apps\/espanso\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Enable Espanso",
"updatedAt" : "2021-05-14T16:44:53Z"
},
{
"authors" : [
{
"name" : "Max Stoiber",
"url" : "https:\/\/github.com\/mxstbr"
}
],
"createdAt" : "2021-04-30T10:29:47+02:00",
"currentDirectoryPath" : null,
"description" : "Add a text expansion to expanso",
"filename" : "espanso-create-expansion.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/espanso.png"
},
"identifier" : "8913cd83010b84c681d85d018013a800",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Espanso",
"path" : "apps\/espanso\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Create Text Expansion",
"updatedAt" : "2021-05-11T20:46:55-04:00"
},
{
"authors" : [
{
"name" : "es183923",
"url" : "https:\/\/github.com\/es183923"
}
],
"createdAt" : "2021-05-11T20:44:52-04:00",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "start-espanso.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/espanso.png"
},
"identifier" : "2465c28979527987108461aaa939717a",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Espanso",
"path" : "apps\/espanso\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Start Espanso",
"updatedAt" : "2021-05-14T16:44:53Z"
},
{
"authors" : [
{
"name" : "es183923",
"url" : "https:\/\/github.com\/es183923"
}
],
"createdAt" : "2021-05-11T20:44:52-04:00",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "disable-espanso.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/espanso.png"
},
"identifier" : "9a5666c27b2dd8eeb9b7f6e664019e13",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Espanso",
"path" : "apps\/espanso\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Disable Espanso",
"updatedAt" : "2021-05-14T16:44:53Z"
},
{
"authors" : [
{
"name" : "es183923",
"url" : "https:\/\/github.com\/es183923"
}
],
"createdAt" : "2021-05-11T20:44:52-04:00",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "restart-espanso.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/espanso.png"
},
"identifier" : "483881356febc3e29f60c16e6675ffeb",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Espanso",
"path" : "apps\/espanso\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Restart Espanso",
"updatedAt" : "2021-05-14T16:44:53Z"
},
{
"authors" : [
{
"name" : "es183923",
"url" : "https:\/\/github.com\/es183923"
}
],
"createdAt" : "2021-05-11T20:44:52-04:00",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "stop-espanso.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/espanso.png"
},
"identifier" : "50101f86c29a34ecdfc3fa2ea5d5109e",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Espanso",
"path" : "apps\/espanso\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Stop Espanso",
"updatedAt" : "2021-05-14T16:44:53Z"
}
]
},
{
"name" : "SideNotes",
"path" : "sidenotes",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Marcel Bochtler",
"url" : "https:\/\/github.com\/MarcelBochtler"
}
],
"createdAt" : "2021-03-07T06:29:59-08:00",
"currentDirectoryPath" : null,
"description" : "Create a new note within the selected or the first SideNotes folder.",
"filename" : "sidenotes-create-note.applescript",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/sidenotes.png"
},
"identifier" : "053dffcafea188ea1d0f4789fefb085b",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "SideNotes",
"path" : "apps\/sidenotes\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "SideNotes create",
"updatedAt" : "2021-03-07T06:29:59-08:00"
}
]
},
{
"name" : "Sublime",
"path" : "sublime",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Rock Hu",
"url" : "https:\/\/twitter.com\/0xRock"
}
],
"createdAt" : "2022-05-27T10:22:01-07:00",
"currentDirectoryPath" : null,
"description" : "Open currently focused directory in Sublime",
"filename" : "open-with-sublime.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "https:\/\/cdn.worldvectorlogo.com\/logos\/sublime-text.svg"
},
"identifier" : "dbc6916febf1c2218e0cef9c4e3d5e96",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Sublime",
"path" : "apps\/sublime\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Open with Sublime",
"updatedAt" : "2022-05-27T18:41:22+01:00"
}
]
},
{
"name" : "Session",
"path" : "session",
"scriptCommands" : [
{
"authors" : [
{
"name" : "James Lyons",
"url" : "https:\/\/github.com\/jamesjlyons"
}
],
"createdAt" : "2021-03-29T10:46:13-07:00",
"currentDirectoryPath" : null,
"description" : "Starts a focus session in Session app with the previous intent and duration",
"filename" : "session-start-previous.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/session.png"
},
"identifier" : "6f4911496269d10725259483c0b9125b",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Session",
"path" : "apps\/session\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Start Previous Session",
"updatedAt" : "2021-03-29T10:46:13-07:00"
},
{
"authors" : [
{
"name" : "James Lyons",
"url" : "https:\/\/github.com\/jamesjlyons"
}
],
"createdAt" : "2021-03-29T10:46:13-07:00",
"currentDirectoryPath" : null,
"description" : "Finishes a focus session in Session app",
"filename" : "session-finish.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/session.png"
},
"identifier" : "1a0f03f376b59043abf161176414d158",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Session",
"path" : "apps\/session\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Finish Session",
"updatedAt" : "2021-03-29T10:46:13-07:00"
},
{
"authors" : [
{
"name" : "James Lyons",
"url" : "https:\/\/github.com\/jamesjlyons"
}
],
"createdAt" : "2021-03-29T10:46:13-07:00",
"currentDirectoryPath" : null,
"description" : "Starts a focus session in Session app",
"filename" : "session-pause.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/session.png"
},
"identifier" : "2edff21d2006d1ae7559d4cf6173b845",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Session",
"path" : "apps\/session\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Pause Session",
"updatedAt" : "2021-03-29T10:46:13-07:00"
},
{
"authors" : [
{
"name" : "James Lyons",
"url" : "https:\/\/github.com\/jamesjlyons"
}
],
"createdAt" : "2021-03-29T10:46:13-07:00",
"currentDirectoryPath" : null,
"description" : "Starts a focus session in Session app",
"filename" : "session-start-new.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/session.png"
},
"identifier" : "92ffe9f3858ffdbae4bcfa0a185feb7a",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Session",
"path" : "apps\/session\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Start Session",
"updatedAt" : "2021-03-29T10:46:13-07:00"
},
{
"authors" : [
{
"name" : "James Lyons",
"url" : "https:\/\/github.com\/jamesjlyons"
}
],
"createdAt" : "2021-03-29T10:46:13-07:00",
"currentDirectoryPath" : null,
"description" : "Starts a focus session in Session app",
"filename" : "session-abandon.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/session.png"
},
"identifier" : "8faf6b45a243e039e253dddab88afad9",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Session",
"path" : "apps\/session\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Abandon Session",
"updatedAt" : "2021-03-29T10:46:13-07:00"
}
]
}
]
},
{
"name" : "Culture",
"path" : "culture",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Muneeb Ajaz",
"url" : "https:\/\/github.com\/mianmuneebajaz"
}
],
"createdAt" : "2025-11-28T22:05:40+05:00",
"currentDirectoryPath" : null,
"description" : "Get the current and next prayer times for a specific city and country.",
"filename" : "prayer-summary.template.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🕌"
},
"identifier" : "19dc8f6e68b90c17c70dd7ee3e05d5e6",
"isTemplate" : true,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Culture",
"path" : "culture\/",
"refreshTime" : "2m",
"schemaVersion" : 1,
"title" : "Prayer Summary",
"updatedAt" : "2025-11-28T17:06:38Z"
},
{
"authors" : [
{
"name" : "Emircan Erkul",
"url" : "https:\/\/emircanerkul.com"
}
],
"createdAt" : "2022-11-17T12:22:40+03:00",
"currentDirectoryPath" : null,
"description" : "Prayer Times grabbed from the aladhan.com.",
"filename" : "prayer-times.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🕌"
},
"identifier" : "ebda5e51cd4760fb9dbce650e41a9142",
"isTemplate" : false,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Culture",
"path" : "culture\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Prayer Times",
"updatedAt" : "2024-07-20T15:38:18+03:00"
}
]
},
{
"name" : "Productivity",
"path" : "productivity",
"scriptCommands" : [
],
"subGroups" : [
{
"name" : "Imgur",
"path" : "imgur",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Fahim Faisal",
"url" : "https:\/\/github.com\/i3p9"
}
],
"createdAt" : "2021-08-19T04:36:52+06:00",
"currentDirectoryPath" : null,
"description" : "Upload your last screenshot to Imgur and copy the image link to clipboard",
"filename" : "imgur-upload-latest-screenshot.template.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "☁️"
},
"identifier" : "fb44bae955f942707a724e0c14063627",
"isTemplate" : true,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Upload to Imgur",
"path" : "productivity\/imgur\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Upload Latest Screenshot to Imgur",
"updatedAt" : "2022-11-13T01:47:18+08:00"
},
{
"authors" : [
{
"name" : "Fahim Faisal",
"url" : "https:\/\/github.com\/i3p9"
}
],
"createdAt" : "2021-08-26T01:16:19+06:00",
"currentDirectoryPath" : null,
"description" : "Upload Image from your Clipboard and copy the image link to clipboard",
"filename" : "imgur-upload-clipboard-image.template.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "📋"
},
"identifier" : "4041c74c3a091d708e0e58c159d5024e",
"isTemplate" : true,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Uploads Copied Image or Image from Clipboard",
"path" : "productivity\/imgur\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Clipboard to Imgur",
"updatedAt" : "2023-07-12T15:49:52+08:00"
},
{
"authors" : [
{
"name" : "Fahim Faisal",
"url" : "https:\/\/github.com\/i3p9"
}
],
"createdAt" : "2021-08-19T04:36:52+06:00",
"currentDirectoryPath" : null,
"description" : "Opens default screenshot interface and immediately uploads and copies link to clipboard",
"filename" : "screenshot-and-imgur.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "📷"
},
"identifier" : "06f3fa5d901f894dba435781da31037d",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Opens Screenshot Interface and Uploads",
"path" : "productivity\/imgur\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Screenshot and Imgur",
"updatedAt" : "2022-11-13T01:47:18+08:00"
}
]
},
{
"name" : "tesseract",
"path" : "tesseract",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Diego Lopes",
"url" : "https:\/\/github.com\/Dihgg"
}
],
"createdAt" : "2021-09-28T10:37:53-03:00",
"currentDirectoryPath" : null,
"description" : "Tesseract OCR",
"filename" : "tesseract-ocr.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🔍"
},
"identifier" : "25b6650479ec5f66c13955ef072ebf65",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "tesseract",
"path" : "productivity\/tesseract\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "OCR Screenshot",
"updatedAt" : "2021-11-05T00:12:23+03:00"
}
]
},
{
"name" : "Bitwarden",
"path" : "bitwarden",
"readme" : "productivity\/bitwarden\/README.md",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Phil Salant",
"url" : "https:\/\/github.com\/PSalant726"
}
],
"createdAt" : "2021-02-03T02:57:58-05:00",
"currentDirectoryPath" : null,
"description" : "Search all items in a Bitwarden vault, and copy the password of the first search result to the clipboard.",
"filename" : "copy-first-matching-password.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/bitwarden.png"
},
"identifier" : "72075d66d7c96563327670d572148a5c",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Bitwarden",
"path" : "productivity\/bitwarden\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Copy First Matching Password",
"updatedAt" : "2022-11-17T10:35:57+01:00"
},
{
"authors" : [
{
"name" : "Phil Salant",
"url" : "https:\/\/github.com\/PSalant726"
}
],
"createdAt" : "2021-03-29T13:44:44-04:00",
"currentDirectoryPath" : null,
"description" : "Delete a Bitwarden Send.",
"filename" : "delete-send.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/bitwarden.png"
},
"identifier" : "c379a38ce1c09e8d957bd3be837d9ebd",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : true,
"packageName" : "Bitwarden",
"path" : "productivity\/bitwarden\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Delete a Send",
"updatedAt" : "2022-11-17T10:35:57+01:00"
},
{
"authors" : [
{
"name" : "Phil Salant",
"url" : "https:\/\/github.com\/PSalant726"
}
],
"createdAt" : "2021-02-03T02:57:58-05:00",
"currentDirectoryPath" : null,
"description" : "Lock a Bitwarden session.",
"filename" : "lock.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/bitwarden.png"
},
"identifier" : "2a9be47e57277d4fa9cb8a226abd9b4e",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Bitwarden",
"path" : "productivity\/bitwarden\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Lock Session",
"updatedAt" : "2022-11-17T10:35:57+01:00"
},
{
"authors" : [
{
"name" : "Phil Salant",
"url" : "https:\/\/github.com\/PSalant726"
}
],
"createdAt" : "2021-02-03T02:57:58-05:00",
"currentDirectoryPath" : null,
"description" : "View the content of a text-only Bitwarden Send.",
"filename" : "receive-text-send.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/bitwarden.png"
},
"identifier" : "f850482284a0f897ac026bb0ed8514d2",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Bitwarden",
"path" : "productivity\/bitwarden\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Receive a Text Send",
"updatedAt" : "2022-11-17T10:35:57+01:00"
},
{
"authors" : [
{
"name" : "Phil Salant",
"url" : "https:\/\/github.com\/PSalant726"
}
],
"createdAt" : "2021-02-03T02:57:58-05:00",
"currentDirectoryPath" : null,
"description" : "Create a new text-only Bitwarden Send.",
"filename" : "create-text-send.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/bitwarden.png"
},
"identifier" : "ef085c701b79f8559894d964b6244742",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Bitwarden",
"path" : "productivity\/bitwarden\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Create a Text Send",
"updatedAt" : "2022-11-17T10:35:57+01:00"
},
{
"authors" : [
{
"name" : "Phil Salant",
"url" : "https:\/\/github.com\/PSalant726"
}
],
"createdAt" : "2021-02-03T02:57:58-05:00",
"currentDirectoryPath" : null,
"description" : "Search all items in a Bitwarden vault.",
"filename" : "search-vault-items.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/bitwarden.png"
},
"identifier" : "1e0fc8f792351eeff8d1f403cef716f5",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Bitwarden",
"path" : "productivity\/bitwarden\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search Vault Items",
"updatedAt" : "2022-11-17T10:35:57+01:00"
},
{
"authors" : [
{
"name" : "Phil Salant",
"url" : "https:\/\/github.com\/PSalant726"
}
],
"createdAt" : "2021-02-03T02:57:58-05:00",
"currentDirectoryPath" : null,
"description" : "Display the authentication and lock status of the user's Bitwarden session.",
"filename" : "status.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/bitwarden.png"
},
"identifier" : "d86ee71986d686b7dfdeac1101e869ef",
"isTemplate" : false,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Bitwarden",
"path" : "productivity\/bitwarden\/",
"refreshTime" : "5m",
"schemaVersion" : 1,
"title" : "Bitwarden Status",
"updatedAt" : "2022-11-17T10:35:57+01:00"
},
{
"authors" : [
{
"name" : "Phil Salant",
"url" : "https:\/\/github.com\/PSalant726"
}
],
"createdAt" : "2021-03-29T13:44:44-04:00",
"currentDirectoryPath" : null,
"description" : "Edit an existing Bitwarden Send.",
"filename" : "edit-send.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/bitwarden.png"
},
"identifier" : "11b9241c955e4217f11a3e797189a3ab",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Bitwarden",
"path" : "productivity\/bitwarden\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Edit a Send",
"updatedAt" : "2022-11-17T10:35:57+01:00"
},
{
"authors" : [
{
"name" : "Phil Salant",
"url" : "https:\/\/github.com\/PSalant726"
}
],
"createdAt" : "2021-02-03T02:57:58-05:00",
"currentDirectoryPath" : null,
"description" : "List all Bitwarden text Sends created in the currently unlocked account.",
"filename" : "list-sends.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/bitwarden.png"
},
"identifier" : "10d61b623f51ab4e5a12cb1df29a16c0",
"isTemplate" : false,
"language" : "bash",
"mode" : "fullOutput",
"needsConfirmation" : null,
"packageName" : "Bitwarden",
"path" : "productivity\/bitwarden\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "List All Text Sends",
"updatedAt" : "2022-11-17T10:35:57+01:00"
},
{
"authors" : [
{
"name" : "Phil Salant",
"url" : "https:\/\/github.com\/PSalant726"
}
],
"createdAt" : "2021-02-03T02:57:58-05:00",
"currentDirectoryPath" : null,
"description" : "Unlock an authenticated Bitwarden session.",
"filename" : "unlock.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/bitwarden.png"
},
"identifier" : "0d6dbf49507170aa4af614cbb4b16613",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Bitwarden",
"path" : "productivity\/bitwarden\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Unlock Session",
"updatedAt" : "2022-11-17T10:35:57+01:00"
},
{
"authors" : [
{
"name" : "Phil Salant",
"url" : "https:\/\/github.com\/PSalant726"
}
],
"createdAt" : "2021-02-03T02:57:58-05:00",
"currentDirectoryPath" : null,
"description" : "Log out of Bitwarden.",
"filename" : "log-out.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/bitwarden.png"
},
"identifier" : "b0e4b9ddb57fdd18854bc8436273b550",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Bitwarden",
"path" : "productivity\/bitwarden\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Log Out",
"updatedAt" : "2022-11-17T10:35:57+01:00"
},
{
"authors" : [
{
"name" : "Phil Salant",
"url" : "https:\/\/github.com\/int3rrupt"
}
],
"createdAt" : "2021-02-03T02:57:58-05:00",
"currentDirectoryPath" : null,
"description" : "Search all items in a Bitwarden vault, and copy the TOTP of the first search result to the clipboard.",
"filename" : "copy-first-matching-totp.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/bitwarden.png"
},
"identifier" : "5ddedd2cc4ce0ce27ea9da0db895b05d",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Bitwarden",
"path" : "productivity\/bitwarden\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Copy First Matching TOTP",
"updatedAt" : "2022-11-17T10:35:57+01:00"
},
{
"authors" : [
{
"name" : "Marcel Bochtler",
"url" : "https:\/\/github.com\/MarcelBochtler"
}
],
"createdAt" : "2021-11-03T21:02:13+01:00",
"currentDirectoryPath" : null,
"description" : "Log in to Bitwarden using an API key.",
"filename" : "log-in-apikey.template.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/bitwarden.png"
},
"identifier" : "837bd1e9a8fe1ed4fa905be4f9cbc492",
"isTemplate" : true,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Bitwarden",
"path" : "productivity\/bitwarden\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Log In",
"updatedAt" : "2022-11-17T10:35:57+01:00"
},
{
"authors" : [
{
"name" : "Phil Salant",
"url" : "https:\/\/github.com\/PSalant726"
}
],
"createdAt" : "2021-02-03T02:57:58-05:00",
"currentDirectoryPath" : null,
"description" : "Log in to Bitwarden.",
"filename" : "log-in.template.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/bitwarden.png"
},
"identifier" : "8bbdf715852f934a47421e7f13d67602",
"isTemplate" : true,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Bitwarden",
"path" : "productivity\/bitwarden\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Log In",
"updatedAt" : "2022-11-17T10:35:57+01:00"
}
]
},
{
"name" : "stopwatch",
"path" : "stopwatch",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Achille Lacoin",
"url" : "https:\/\/github.com\/pomdtr"
}
],
"createdAt" : "2021-07-20T10:03:49+02:00",
"currentDirectoryPath" : null,
"description" : "Stop active stopwatch, copy total time",
"filename" : "stopwatch-stop.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "⏱"
},
"identifier" : "110dc9e3b77c64b836c60d3d594188fc",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "stopwatch",
"path" : "productivity\/stopwatch\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Stop Stopwatch",
"updatedAt" : "2021-07-22T02:04:44+02:00"
},
{
"authors" : [
{
"name" : "Achille Lacoin",
"url" : "https:\/\/github.com\/pomdtr"
}
],
"createdAt" : "2021-07-20T10:03:49+02:00",
"currentDirectoryPath" : null,
"description" : "Status of active stopwatch",
"filename" : "stopwatch-progress.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "⏱"
},
"identifier" : "f6096eb20938dba1a3849e659fa2b2f1",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "stopwatch",
"path" : "productivity\/stopwatch\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Show Stopwatch Progress",
"updatedAt" : "2021-07-22T02:04:44+02:00"
},
{
"authors" : [
{
"name" : "Achille Lacoin",
"url" : "https:\/\/github.com\/pomdtr"
}
],
"createdAt" : "2021-07-20T10:03:49+02:00",
"currentDirectoryPath" : null,
"description" : "Start a stopwatch",
"filename" : "stopwatch-start.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "⏱"
},
"identifier" : "1568cbaa51ba27ed4145f76259db8858",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "stopwatch",
"path" : "productivity\/stopwatch\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Start Stopwatch",
"updatedAt" : "2021-07-22T02:04:44+02:00"
}
]
},
{
"name" : "Pomodoro",
"path" : "pomodoro",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Thomas Paul Mann",
"url" : "https:\/\/github.com\/thomaspaulmann"
}
],
"createdAt" : "2021-07-19T21:12:36+01:00",
"currentDirectoryPath" : null,
"description" : "Stop active Pomodoro timer",
"filename" : "pomodoro-stop-timer.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🍅"
},
"identifier" : "57bc11aa3ebc78b95739a25d57f8fbbf",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Pomodoro",
"path" : "productivity\/pomodoro\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Stop Timer",
"updatedAt" : "2021-07-19T21:29:39+01:00"
},
{
"authors" : [
{
"name" : "Thomas Paul Mann",
"url" : "https:\/\/github.com\/thomaspaulmann"
}
],
"createdAt" : "2021-07-19T21:12:36+01:00",
"currentDirectoryPath" : null,
"description" : "Start a Pomodoro timer",
"filename" : "pomodoro-start-timer.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🍅"
},
"identifier" : "a1854deed46e0b0c83de7237488abd55",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Pomodoro",
"path" : "productivity\/pomodoro\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Start Timer",
"updatedAt" : "2021-07-19T21:29:39+01:00"
},
{
"authors" : [
{
"name" : "Thomas Paul Mann",
"url" : "https:\/\/github.com\/thomaspaulmann"
}
],
"createdAt" : "2021-07-19T21:12:36+01:00",
"currentDirectoryPath" : null,
"description" : "Status of a Pomodoro timer",
"filename" : "pomodoro-status.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🍅"
},
"identifier" : "8d7cb365a32acef7c7539511b0b4c130",
"isTemplate" : false,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Pomodoro",
"path" : "productivity\/pomodoro\/",
"refreshTime" : "30s",
"schemaVersion" : 1,
"title" : "Status",
"updatedAt" : "2021-07-19T21:12:36+01:00"
}
]
},
{
"name" : "QPDF",
"path" : "qpdf",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Nicklas Jakobsen",
"url" : "https:\/\/github.com\/nicklasjm"
}
],
"createdAt" : "2025-11-28T18:07:29+01:00",
"currentDirectoryPath" : null,
"description" : "Compress selected PDF files. Note: This script requires 'qpdf' to be installed via Homebrew.",
"filename" : "compress-pdf-qpdf.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "🗜️"
},
"identifier" : "ba848d41adad37a9407e0c61e56b545c",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "QPDF",
"path" : "productivity\/qpdf\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Compress PDF",
"updatedAt" : "2025-11-28T18:07:29+01:00"
}
]
},
{
"name" : "macOCR",
"path" : "macocr",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Jakub Lanski",
"url" : "https:\/\/github.com\/jaklan"
}
],
"createdAt" : "2021-11-10T11:40:57+01:00",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "macocr-run-ocr.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "📸"
},
"identifier" : "90d13e130e8494fa8012db4823c580dd",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "macOCR",
"path" : "productivity\/macocr\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Run OCR",
"updatedAt" : "2021-11-11T04:18:19+01:00"
}
]
},
{
"name" : "Writing",
"path" : "writing",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Benny Wong",
"url" : "https:\/\/bwong.net"
}
],
"createdAt" : "2022-01-29T12:34:13-05:00",
"currentDirectoryPath" : null,
"description" : "Counts the number of words of the text in the clipboard",
"filename" : "word-count.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🤖"
},
"identifier" : "4757d0ea5b9d6eedf37b64f283531315",
"isTemplate" : false,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Writing",
"path" : "productivity\/writing\/",
"refreshTime" : "15s",
"schemaVersion" : 1,
"title" : "Word Count",
"updatedAt" : "2022-10-31T10:14:18+01:00"
},
{
"authors" : [
{
"name" : "Alessandra Pereyra",
"url" : "https:\/\/github.com\/alessandrapereyra"
}
],
"createdAt" : "2022-09-04T19:45:53-05:00",
"currentDirectoryPath" : null,
"description" : "Directly use macOS Dictionary",
"filename" : "dictionary-lookup.swift",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "📖"
},
"identifier" : "be57af80902c33cee913774b6e58d678",
"isTemplate" : false,
"language" : "swift",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Writing",
"path" : "productivity\/writing\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Dictionary Lookup",
"updatedAt" : "2022-10-31T10:14:18+01:00"
}
]
}
]
},
{
"name" : "Media",
"path" : "media",
"scriptCommands" : [
],
"subGroups" : [
{
"name" : "Speaker Setup",
"path" : "speaker-setup",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Kailash Yellareddy",
"url" : "https:\/\/github.com\/kyellareddy"
}
],
"createdAt" : "2024-01-09T01:17:34-08:00",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "speaker-setup.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🔊"
},
"identifier" : "7920ccb4e58a80afd149f6ce81e8f185",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Speaker Setup",
"path" : "media\/speaker-setup\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Speaker Setup",
"updatedAt" : "2024-04-07T23:23:52+04:00"
}
]
},
{
"name" : "Apple Music",
"path" : "apple-music",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-11-07T10:09:28-05:00",
"currentDirectoryPath" : null,
"description" : "Stop Music.",
"filename" : "apple-music-stop.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/apple-music-logo.png"
},
"identifier" : "5f611223b0b8e4aac6f6a58b10eb18ec",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Music",
"path" : "media\/apple-music\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Stop",
"updatedAt" : "2020-11-28T12:26:29-05:00"
},
{
"authors" : [
{
"name" : "Juan I. Serra",
"url" : "https:\/\/github.com\/jiserra"
}
],
"createdAt" : "2022-01-10T11:21:09-04:00",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "apple-music-volume-up.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/apple-music-logo.png"
},
"identifier" : "c8f4c5a2218803961dcd04ac173cabe6",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Music",
"path" : "media\/apple-music\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Apple Music Volume Up",
"updatedAt" : "2022-01-10T11:21:09-04:00"
},
{
"authors" : [
{
"name" : "Jordi Clement",
"url" : "https:\/\/github.com\/jordicl"
}
],
"createdAt" : "2021-03-05T16:50:23+01:00",
"currentDirectoryPath" : null,
"description" : "Go to Artist page in the Apple Music App",
"filename" : "apple-music-go-to-artist-page.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/apple-music-logo.png"
},
"identifier" : "6304c471969765a50361ee95d2b1a013",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Music",
"path" : "media\/apple-music\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Go to Artist in Apple Music",
"updatedAt" : "2021-03-08T14:53:49+01:00"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-11-07T10:09:28-05:00",
"currentDirectoryPath" : null,
"description" : "Toggle shuffle setting in Music.",
"filename" : "apple-music-shuffle.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/apple-music-logo.png"
},
"identifier" : "3c91d60443b3ddd0d18e9734d8fe6572",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Music",
"path" : "media\/apple-music\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Toggle Shuffle",
"updatedAt" : "2020-11-28T12:26:29-05:00"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-11-07T10:09:28-05:00",
"currentDirectoryPath" : null,
"description" : "Toggle repeat setting in Music.",
"filename" : "apple-music-repeat.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/apple-music-logo.png"
},
"identifier" : "c62c215553360ac8aa21353903f753a1",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Music",
"path" : "media\/apple-music\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Toggle Repeat",
"updatedAt" : "2020-11-28T13:47:03-05:00"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-11-07T10:09:28-05:00",
"currentDirectoryPath" : null,
"description" : "Previous track in Music.",
"filename" : "apple-music-previous.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/apple-music-logo.png"
},
"identifier" : "b815ba6d731f3c2d103d91ea8e6b1763",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Music",
"path" : "media\/apple-music\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Previous Track",
"updatedAt" : "2020-11-28T13:47:03-05:00"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-11-07T10:09:28-05:00",
"currentDirectoryPath" : null,
"description" : "Pause Music.",
"filename" : "apple-music-pause.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/apple-music-logo.png"
},
"identifier" : "d76db4a3ed282224bf7e5af8a82c62ce",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Music",
"path" : "media\/apple-music\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Pause",
"updatedAt" : "2020-11-28T12:26:29-05:00"
},
{
"authors" : [
{
"name" : "Juan I. Serra",
"url" : "https:\/\/github.com\/jiserra"
}
],
"createdAt" : "2022-01-10T11:21:09-04:00",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "apple-music-volume-down.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/apple-music-logo.png"
},
"identifier" : "e976c6ae51adec3ce4530235790c6761",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Music",
"path" : "media\/apple-music\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Apple Music Volume Down",
"updatedAt" : "2022-01-10T11:21:09-04:00"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-12-10T16:16:07-05:00",
"currentDirectoryPath" : null,
"description" : "Set volume in Music.",
"filename" : "apple-music-set-volume.applescript",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/apple-music-logo.png"
},
"identifier" : "0b9f2dc6c068d19f045b0d4a1a05870d",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Music",
"path" : "media\/apple-music\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Set Volume",
"updatedAt" : "2020-12-11T00:15:58Z"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-11-07T10:09:28-05:00",
"currentDirectoryPath" : null,
"description" : "Play Music.",
"filename" : "apple-music-play.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/apple-music-logo.png"
},
"identifier" : "d5222ded53a633aa88805aa3f462f208",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Music",
"path" : "media\/apple-music\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Play",
"updatedAt" : "2020-11-28T12:26:29-05:00"
},
{
"authors" : [
{
"name" : "StevenRCE0",
"url" : "https:\/\/github.com\/StevenRCE0"
}
],
"createdAt" : "2021-08-18T09:16:28+08:00",
"currentDirectoryPath" : null,
"description" : "Search using the native UI",
"filename" : "apple-music-search.applescript",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/apple-music-logo.png"
},
"identifier" : "8596be52df39001815a5ed2803155afc",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Apple Music",
"path" : "media\/apple-music\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Search",
"updatedAt" : "2021-12-20T20:53:03+08:00"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-11-07T10:09:28-05:00",
"currentDirectoryPath" : null,
"description" : "Next track in Music.",
"filename" : "apple-music-next.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/apple-music-logo.png"
},
"identifier" : "8611be488c5cc0e37d0c2e565ce23f68",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Music",
"path" : "media\/apple-music\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Next Track",
"updatedAt" : "2020-11-28T13:47:03-05:00"
},
{
"authors" : [
{
"name" : "mmerle",
"url" : "https:\/\/github.com\/mmerle"
}
],
"createdAt" : "2020-11-30T12:52:41Z",
"currentDirectoryPath" : null,
"description" : "Show currently playing track in Music.",
"filename" : "apple-music-current-track.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/apple-music-logo.png"
},
"identifier" : "41db4193526a667ad73d8742fc72d7de",
"isTemplate" : false,
"language" : "applescript",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Music",
"path" : "media\/apple-music\/",
"refreshTime" : "10s",
"schemaVersion" : 1,
"title" : "Current Track",
"updatedAt" : "2021-01-21T12:38:38-05:00"
},
{
"authors" : [
{
"name" : "Bryan Schuetz",
"url" : "https:\/\/github.com\/bryanschuetz"
}
],
"createdAt" : "2021-09-24T08:42:54-04:00",
"currentDirectoryPath" : null,
"description" : "Let the algorithm know how you feel about the currently playing track.",
"filename" : "apple-music-hate-current-track.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/apple-music-logo.png"
},
"identifier" : "f7d43db5dbd64ecab0104afe7dd4c5e1",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Apple Music",
"path" : "media\/apple-music\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Hate Current Track",
"updatedAt" : "2021-09-24T08:42:54-04:00"
},
{
"authors" : [
{
"name" : "Bryan Schuetz",
"url" : "https:\/\/github.com\/bryanschuetz"
}
],
"createdAt" : "2021-09-24T08:42:54-04:00",
"currentDirectoryPath" : null,
"description" : "Let the algorithm know how you feel about the currently playing track.",
"filename" : "apple-music-love-current-track.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/apple-music-logo.png"
},
"identifier" : "1f71dc54a2c61ca4ebede7924eaf73e8",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Apple Music",
"path" : "media\/apple-music\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Love Current Track",
"updatedAt" : "2024-02-27T09:52:24-05:00"
}
]
},
{
"name" : "Cmus",
"path" : "cmus",
"scriptCommands" : [
{
"authors" : [
{
"name" : "mmerle",
"url" : "https:\/\/github.com\/mmerle"
}
],
"createdAt" : "2020-11-25T03:49:04-05:00",
"currentDirectoryPath" : null,
"description" : "Toggles the shuffle option if cmus is running",
"filename" : "toggle-shuffle.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🔀"
},
"identifier" : "bcd4e5cb33e09e0841cf483ecafaf53a",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Cmus",
"path" : "media\/cmus\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Toggle Shuffle",
"updatedAt" : "2020-11-25T03:49:04-05:00"
},
{
"authors" : [
{
"name" : "mmerle",
"url" : "https:\/\/github.com\/mmerle"
}
],
"createdAt" : "2020-11-25T03:49:04-05:00",
"currentDirectoryPath" : null,
"description" : "Goes back a track if cmus is running",
"filename" : "previous-track.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "⏪"
},
"identifier" : "42ce25d5b673898cc98599ca064d2ff6",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Cmus",
"path" : "media\/cmus\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Previous Track",
"updatedAt" : "2020-11-25T03:49:04-05:00"
},
{
"authors" : [
{
"name" : "mmerle",
"url" : "https:\/\/github.com\/mmerle"
}
],
"createdAt" : "2020-11-25T03:49:04-05:00",
"currentDirectoryPath" : null,
"description" : "Toggles the play\/pause state if cmus is running",
"filename" : "play-pause.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "⏯"
},
"identifier" : "c3a1b04149db8dfc9b1a23beed4ff6ea",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Cmus",
"path" : "media\/cmus\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Toggle Play\/Pause",
"updatedAt" : "2020-11-25T03:49:04-05:00"
},
{
"authors" : [
{
"name" : "mmerle",
"url" : "https:\/\/github.com\/mmerle"
}
],
"createdAt" : "2020-11-25T03:49:04-05:00",
"currentDirectoryPath" : null,
"description" : "Toggles the repeat option if cmus is running",
"filename" : "toggle-repeat.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "🔁"
},
"identifier" : "9c6d2889c9c1a87d976069e01e42611a",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Cmus",
"path" : "media\/cmus\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Toggle Repeat",
"updatedAt" : "2020-11-25T03:49:04-05:00"
},
{
"authors" : [
{
"name" : "mmerle",
"url" : "https:\/\/github.com\/mmerle"
}
],
"createdAt" : "2020-11-25T03:49:04-05:00",
"currentDirectoryPath" : null,
"description" : "Goes forward a track if cmus is running",
"filename" : "next-track.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "⏩"
},
"identifier" : "28623c177a9fae398cef860f1d42cfca",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Cmus",
"path" : "media\/cmus\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Next Track",
"updatedAt" : "2020-11-25T03:49:04-05:00"
},
{
"authors" : [
{
"name" : "mmerle",
"url" : "https:\/\/github.com\/mmerle"
}
],
"createdAt" : "2020-11-25T03:49:04-05:00",
"currentDirectoryPath" : null,
"description" : "Shows info on the current track if cmus is running",
"filename" : "track-info.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "ℹ️"
},
"identifier" : "a59730f5b518bf0015017075092fcd55",
"isTemplate" : false,
"language" : "bash",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Cmus",
"path" : "media\/cmus\/",
"refreshTime" : "10s",
"schemaVersion" : 1,
"title" : "Current Track",
"updatedAt" : "2020-11-25T03:49:04-05:00"
}
]
},
{
"name" : "Endel",
"path" : "endel",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Sergey Korobyin",
"url" : "https:\/\/github.com\/huangsemao"
}
],
"createdAt" : "2021-10-06T15:53:54+03:00",
"currentDirectoryPath" : null,
"description" : "Set focus mode at Endel ",
"filename" : "endel-sleep.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/endel.png"
},
"identifier" : "882873a4414a4785a11184e942127bae",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : false,
"packageName" : "Endel",
"path" : "media\/endel\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Sleep",
"updatedAt" : "2021-10-06T15:53:54+03:00"
},
{
"authors" : [
{
"name" : "Sergey Korobyin",
"url" : "https:\/\/github.com\/huangsemao"
}
],
"createdAt" : "2021-10-06T15:53:54+03:00",
"currentDirectoryPath" : null,
"description" : "Set relax mode at Endel ",
"filename" : "endel-relax.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/endel.png"
},
"identifier" : "4b091a5a2e460f0e65e66ff8ce57ff4d",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : false,
"packageName" : "Endel",
"path" : "media\/endel\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Relax",
"updatedAt" : "2021-10-06T15:53:54+03:00"
},
{
"authors" : [
{
"name" : "Sergey Korobyin",
"url" : "https:\/\/github.com\/huangsemao"
}
],
"createdAt" : "2021-10-06T15:53:54+03:00",
"currentDirectoryPath" : null,
"description" : "Run Workout scenario at Endel ",
"filename" : "endel-scenarios-workout.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/endel.png"
},
"identifier" : "e12f2795c9fd7861d63892302fcce623",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : false,
"packageName" : "Endel",
"path" : "media\/endel\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Workout",
"updatedAt" : "2021-10-06T15:53:54+03:00"
},
{
"authors" : [
{
"name" : "Sergey Korobyin",
"url" : "https:\/\/github.com\/huangsemao"
}
],
"createdAt" : "2021-10-06T15:53:54+03:00",
"currentDirectoryPath" : null,
"description" : "Run Deep Work scenario at Endel ",
"filename" : "endel-scenarios-deepwork.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/endel.png"
},
"identifier" : "e137539f2ad45ca56293ed3f849f82a3",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : false,
"packageName" : "Endel",
"path" : "media\/endel\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Deep Work",
"updatedAt" : "2021-10-06T15:53:54+03:00"
},
{
"authors" : [
{
"name" : "Sergey Korobyin",
"url" : "https:\/\/github.com\/huangsemao"
}
],
"createdAt" : "2021-10-06T15:53:54+03:00",
"currentDirectoryPath" : null,
"description" : "Set focus mode at Endel ",
"filename" : "endel-focus.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/endel.png"
},
"identifier" : "0d39ac92f6ee5586b718d24e095b9477",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : false,
"packageName" : "Endel",
"path" : "media\/endel\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Focus",
"updatedAt" : "2021-10-06T15:53:54+03:00"
},
{
"authors" : [
{
"name" : "Sergey Korobyin",
"url" : "https:\/\/github.com\/huangsemao"
}
],
"createdAt" : "2021-10-06T15:53:54+03:00",
"currentDirectoryPath" : null,
"description" : "Run Yoga scenario at Endel ",
"filename" : "endel-scenarios-yoga.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/endel.png"
},
"identifier" : "7f208b21990d3049368276de95cef101",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : false,
"packageName" : "Endel",
"path" : "media\/endel\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Yoga",
"updatedAt" : "2021-10-06T15:53:54+03:00"
},
{
"authors" : [
{
"name" : "Sergey Korobyin",
"url" : "https:\/\/github.com\/huangsemao"
}
],
"createdAt" : "2021-10-06T15:53:54+03:00",
"currentDirectoryPath" : null,
"description" : "Set study mode at Endel ",
"filename" : "endel-study.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/endel.png"
},
"identifier" : "ce29578447010dd36480bd25ff785cef",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : false,
"packageName" : "Endel",
"path" : "media\/endel\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Study",
"updatedAt" : "2021-10-06T15:53:54+03:00"
},
{
"authors" : [
{
"name" : "Sergey Korobyin",
"url" : "https:\/\/github.com\/huangsemao"
}
],
"createdAt" : "2021-10-06T15:53:54+03:00",
"currentDirectoryPath" : null,
"description" : "Run Read scenario at Endel ",
"filename" : "endel-scenarios-read.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/endel.png"
},
"identifier" : "1b2102711e0cbd6f4b249756ddb2bdf4",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : false,
"packageName" : "Endel",
"path" : "media\/endel\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Read",
"updatedAt" : "2021-10-06T15:53:54+03:00"
},
{
"authors" : [
{
"name" : "Sergey Korobyin",
"url" : "https:\/\/github.com\/huangsemao"
}
],
"createdAt" : "2021-10-06T15:53:54+03:00",
"currentDirectoryPath" : null,
"description" : "Run Power Nap scenario at Endel ",
"filename" : "endel-scenarios-powernap.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/endel.png"
},
"identifier" : "1c78bc5186a9516d6ce228be1b9b188a",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : false,
"packageName" : "Endel",
"path" : "media\/endel\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Power Nap",
"updatedAt" : "2021-10-06T15:53:54+03:00"
},
{
"authors" : [
{
"name" : "Sergey Korobyin",
"url" : "https:\/\/github.com\/huangsemao"
}
],
"createdAt" : "2021-10-06T15:53:54+03:00",
"currentDirectoryPath" : null,
"description" : "Set AI lullaby mode at Endel ",
"filename" : "endel-lullaby.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/endel.png"
},
"identifier" : "74bec6706807ff93e3c8b524ab208bd6",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : false,
"packageName" : "Endel",
"path" : "media\/endel\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Lullaby",
"updatedAt" : "2021-10-06T15:53:54+03:00"
},
{
"authors" : [
{
"name" : "Sergey Korobyin",
"url" : "https:\/\/github.com\/huangsemao"
}
],
"createdAt" : "2021-10-06T15:53:54+03:00",
"currentDirectoryPath" : null,
"description" : "Run Homework scenario at Endel ",
"filename" : "endel-scenarios-homework.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/endel.png"
},
"identifier" : "279f29dacf815dc3e32427a904d21443",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : false,
"packageName" : "Endel",
"path" : "media\/endel\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Homework",
"updatedAt" : "2021-10-06T15:53:54+03:00"
},
{
"authors" : [
{
"name" : "Sergey Korobyin",
"url" : "https:\/\/github.com\/huangsemao"
}
],
"createdAt" : "2021-10-06T15:53:54+03:00",
"currentDirectoryPath" : null,
"description" : "Run Meditate scenario at Endel ",
"filename" : "endel-scenarios-meditate.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/endel.png"
},
"identifier" : "fd592987dee95de1ab1e746d66a296d1",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : false,
"packageName" : "Endel",
"path" : "media\/endel\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Meditate",
"updatedAt" : "2021-10-06T15:53:54+03:00"
},
{
"authors" : [
{
"name" : "Sergey Korobyin",
"url" : "https:\/\/github.com\/huangsemao"
}
],
"createdAt" : "2021-10-06T15:53:54+03:00",
"currentDirectoryPath" : null,
"description" : "Set deep focus mode at Endel ",
"filename" : "endel-deep-focus.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/endel.png"
},
"identifier" : "879912a57f3ee1fc9c177f5687710e68",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : false,
"packageName" : "Endel",
"path" : "media\/endel\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Deep Focus",
"updatedAt" : "2021-10-06T15:53:54+03:00"
},
{
"authors" : [
{
"name" : "Sergey Korobyin",
"url" : "https:\/\/github.com\/huangsemao"
}
],
"createdAt" : "2021-10-06T15:53:54+03:00",
"currentDirectoryPath" : null,
"description" : "Run Self Care scenario at Endel ",
"filename" : "endel-scenarios-selfcare.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/endel.png"
},
"identifier" : "7395fcee323302f9ebf5131b6bf01bd1",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : false,
"packageName" : "Endel",
"path" : "media\/endel\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Self Care",
"updatedAt" : "2021-10-06T15:53:54+03:00"
},
{
"authors" : [
{
"name" : "Sergey Korobyin",
"url" : "https:\/\/github.com\/huangsemao"
}
],
"createdAt" : "2021-10-06T15:53:54+03:00",
"currentDirectoryPath" : null,
"description" : "Set Alarm in Endel ",
"filename" : "endel-alarm.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/endel.png"
},
"identifier" : "3308542a1a6cfcabd9576c90af4d7ef1",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : false,
"packageName" : "Endel",
"path" : "media\/endel\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Set Alarm",
"updatedAt" : "2021-10-06T15:53:54+03:00"
},
{
"authors" : [
{
"name" : "Sergey Korobyin",
"url" : "https:\/\/github.com\/huangsemao"
}
],
"createdAt" : "2021-10-06T15:53:54+03:00",
"currentDirectoryPath" : null,
"description" : "Set wiggly wisdom mode at Endel ",
"filename" : "endel-wisdom.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/endel.png"
},
"identifier" : "63f5ba97d67a53656d14772b71d1d81c",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : false,
"packageName" : "Endel",
"path" : "media\/endel\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Wiggly Wisdom",
"updatedAt" : "2021-10-06T15:53:54+03:00"
},
{
"authors" : [
{
"name" : "Sergey Korobyin",
"url" : "https:\/\/github.com\/huangsemao"
}
],
"createdAt" : "2021-10-06T15:53:54+03:00",
"currentDirectoryPath" : null,
"description" : "Run Unwind scenario at Endel ",
"filename" : "endel-scenarios-unwind.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/endel.png"
},
"identifier" : "214e40e5bed0a266493139305e88d92b",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : false,
"packageName" : "Endel",
"path" : "media\/endel\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Unwind",
"updatedAt" : "2021-10-06T15:53:54+03:00"
},
{
"authors" : [
{
"name" : "Sergey Korobyin",
"url" : "https:\/\/github.com\/huangsemao"
}
],
"createdAt" : "2021-10-06T15:53:54+03:00",
"currentDirectoryPath" : null,
"description" : "Set recovery mode at Endel ",
"filename" : "endel-recovery.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/endel.png"
},
"identifier" : "9acba1d018ec7f24f3616937cfc303e5",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : false,
"packageName" : "Endel",
"path" : "media\/endel\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Recovery",
"updatedAt" : "2021-10-06T15:53:54+03:00"
},
{
"authors" : [
{
"name" : "Sergey Korobyin",
"url" : "https:\/\/github.com\/huangsemao"
}
],
"createdAt" : "2021-10-06T15:53:54+03:00",
"currentDirectoryPath" : null,
"description" : "Set Timer in Endel ",
"filename" : "endel-timer.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/endel.png"
},
"identifier" : "7b92a6f72056f8a2e67e96151c57a6c6",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : false,
"packageName" : "Endel",
"path" : "media\/endel\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Set Timer",
"updatedAt" : "2021-10-06T15:53:54+03:00"
}
]
},
{
"name" : "Spotify",
"path" : "spotify",
"scriptCommands" : [
{
"authors" : null,
"createdAt" : "2020-09-30T12:56:51+01:00",
"currentDirectoryPath" : null,
"description" : "Skips to the next track in Spotify.",
"filename" : "spotify-next-track.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/spotify-logo.png"
},
"identifier" : "8c44f76642edf5e2d589761ea2760802",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Spotify",
"path" : "media\/spotify\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Next Track",
"updatedAt" : "2020-12-08T15:56:35Z"
},
{
"authors" : null,
"createdAt" : "2020-09-30T12:56:51+01:00",
"currentDirectoryPath" : null,
"description" : "Toggles play or pause of current track in Spotify.",
"filename" : "spotify-play-pause.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/spotify-logo.png"
},
"identifier" : "d12611a4f464cf6a5566a7163f1de3a0",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Spotify",
"path" : "media\/spotify\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Toggle Play\/Pause",
"updatedAt" : "2020-12-08T15:56:35Z"
},
{
"authors" : [
{
"name" : "Nichlas Wærnes Andersen",
"url" : "https:\/\/twitter.com\/nichlaswa"
}
],
"createdAt" : "2021-05-27T12:22:24+02:00",
"currentDirectoryPath" : null,
"description" : "Play ${commandName} on Spotify",
"filename" : "create-spotify-command.js",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : ".\/images\/spotify-logo.png"
},
"identifier" : "4a0c3ae9f9dc6dd5d6e060f802ea486c",
"isTemplate" : false,
"language" : "node",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Spotify",
"path" : "media\/spotify\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "${commandName}",
"updatedAt" : "2021-09-29T08:15:53+02:00"
},
{
"authors" : [
{
"name" : "Jack LaFond",
"url" : "https:\/\/github.com\/jacc"
}
],
"createdAt" : "2020-11-19T12:24:17-05:00",
"currentDirectoryPath" : null,
"description" : "Get link to current Spotify playing song",
"filename" : "spotify-now-playing-url.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/spotify-logo.png"
},
"identifier" : "26d699efd0fe0362dc9fd911a844e217",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Spotify",
"path" : "media\/spotify\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Copy Current Playing Song URL",
"updatedAt" : "2020-11-27T11:56:35+03:00"
},
{
"authors" : [
{
"name" : "Thomas Paul Mann",
"url" : "https:\/\/github.com\/thomaspaulmann"
}
],
"createdAt" : "2021-01-26T20:54:37Z",
"currentDirectoryPath" : null,
"description" : "Play playlist or track in Spotify.",
"filename" : "spotify-play-playlist.template.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/spotify-logo.png"
},
"identifier" : "8e28e54269f27849b00b363c8a0271be",
"isTemplate" : true,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Spotify",
"path" : "media\/spotify\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Play Track or Playlist",
"updatedAt" : "2021-01-26T20:55:11Z"
},
{
"authors" : null,
"createdAt" : "2020-09-30T12:56:51+01:00",
"currentDirectoryPath" : null,
"description" : "Plays current track in Spotify.",
"filename" : "spotify-play.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/spotify-logo.png"
},
"identifier" : "ce1534fc1817423b44a814c15f9c5da3",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Spotify",
"path" : "media\/spotify\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Play",
"updatedAt" : "2020-12-08T15:56:35Z"
},
{
"authors" : [
{
"name" : "Thomas Paul Mann",
"url" : "https:\/\/github.com\/thomaspaulmann"
}
],
"createdAt" : "2020-11-30T12:52:41Z",
"currentDirectoryPath" : null,
"description" : "Show currently playing track in Spotify.",
"filename" : "spotify-current-track.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/spotify-logo.png"
},
"identifier" : "2eb202dd044979361f9d435198280920",
"isTemplate" : false,
"language" : "applescript",
"mode" : "inline",
"needsConfirmation" : null,
"packageName" : "Spotify",
"path" : "media\/spotify\/",
"refreshTime" : "30s",
"schemaVersion" : 1,
"title" : "Current Track",
"updatedAt" : "2020-11-30T12:52:41Z"
},
{
"authors" : null,
"createdAt" : "2020-09-30T12:56:51+01:00",
"currentDirectoryPath" : null,
"description" : "Skips to the previous track in Spotify.",
"filename" : "spotify-previous-track.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/spotify-logo.png"
},
"identifier" : "ecba3dd8e10f26c95ab053667087a7e4",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Spotify",
"path" : "media\/spotify\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Previous Track",
"updatedAt" : "2020-12-08T15:56:35Z"
},
{
"authors" : null,
"createdAt" : "2020-09-30T12:56:01+01:00",
"currentDirectoryPath" : null,
"description" : "Pause current track in Spotify.",
"filename" : "spotify-pause.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/spotify-logo.png"
},
"identifier" : "771e99988a2f4107d87c5bea5f5b6ba8",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Spotify",
"path" : "media\/spotify\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Pause",
"updatedAt" : "2020-12-08T15:56:35Z"
}
]
},
{
"name" : "foobar2000",
"path" : "foobar2000",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Jing Li",
"url" : "https:\/\/github.com\/lixeon"
}
],
"createdAt" : "2022-06-03T15:00:35+08:00",
"currentDirectoryPath" : null,
"description" : "Shortcuts to next foobar2000 for Mac v2.3.0",
"filename" : "foobar2000-next.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/foobar2000.png"
},
"identifier" : "37d028897c09ceb93626ab043cb05849",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "foobar2000",
"path" : "media\/foobar2000\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Next foobar2000",
"updatedAt" : "2022-06-03T15:00:35+08:00"
},
{
"authors" : [
{
"name" : "Jing Li",
"url" : "https:\/\/github.com\/lixeon"
}
],
"createdAt" : "2022-06-03T15:00:35+08:00",
"currentDirectoryPath" : null,
"description" : "Shortcuts to pause foobar2000 for Mac v2.3.0",
"filename" : "foobar2000-pause.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/foobar2000.png"
},
"identifier" : "9628f178c067958b737c469c1cda07bf",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "foobar2000",
"path" : "media\/foobar2000\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Pause foobar2000",
"updatedAt" : "2022-06-03T15:00:35+08:00"
},
{
"authors" : [
{
"name" : "Jing Li",
"url" : "https:\/\/github.com\/lixeon"
}
],
"createdAt" : "2022-06-03T15:00:35+08:00",
"currentDirectoryPath" : null,
"description" : "Shortcuts to Previous foobar2000 for Mac v2.3.0",
"filename" : "foobar2000-pervious.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/foobar2000.png"
},
"identifier" : "849beafb523bee8e7e82e39dfd8113d3",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "foobar2000",
"path" : "media\/foobar2000\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Previous foobar2000",
"updatedAt" : "2022-06-03T15:00:35+08:00"
}
]
},
{
"name" : "Lowfi",
"path" : "lowfi",
"scriptCommands" : [
{
"authors" : null,
"createdAt" : "2024-11-24T04:45:52+01:00",
"currentDirectoryPath" : null,
"description" : null,
"filename" : "lowfi.sh",
"hasArguments" : false,
"icon" : null,
"identifier" : "afcc05d7a53abe6543c98f59f23bb7e5",
"isTemplate" : false,
"language" : "bash",
"mode" : "compact",
"needsConfirmation" : null,
"packageName" : "Music",
"path" : "media\/lowfi\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Lowfi",
"updatedAt" : "2024-12-11T20:08:12Z"
}
]
},
{
"name" : "Apple Tv",
"path" : "apple-tv",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-12-10T16:16:07-05:00",
"currentDirectoryPath" : null,
"description" : "Set volume in TV.",
"filename" : "apple-tv-set-volume.applescript",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/apple-tv-logo.png"
},
"identifier" : "b8b242b26206ce310623087bf68b63b4",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "TV",
"path" : "media\/apple-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Set Volume",
"updatedAt" : "2020-12-11T00:16:06Z"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-12-10T16:16:07-05:00",
"currentDirectoryPath" : null,
"description" : "Play specified movie from library in TV.",
"filename" : "apple-tv-play-movie.applescript",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/apple-tv-logo.png"
},
"identifier" : "618183dcffc4c4c0474c2e4fb02098b5",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "TV",
"path" : "media\/apple-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Play Movie",
"updatedAt" : "2020-12-11T23:18:29-05:00"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-11-07T10:09:28-05:00",
"currentDirectoryPath" : null,
"description" : "Play TV.",
"filename" : "apple-tv-play.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/apple-tv-logo.png"
},
"identifier" : "2de283dab829856b6f5d63a9841aef4b",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "TV",
"path" : "media\/apple-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Play",
"updatedAt" : "2020-11-28T13:47:03-05:00"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-11-07T10:09:28-05:00",
"currentDirectoryPath" : null,
"description" : "Pause TV.",
"filename" : "apple-tv-pause.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/apple-tv-logo.png"
},
"identifier" : "e98f6e9d7e98856405e28d1d28005846",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "TV",
"path" : "media\/apple-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Pause",
"updatedAt" : "2020-11-28T13:47:03-05:00"
},
{
"authors" : [
{
"name" : "Caleb Stauffer",
"url" : "https:\/\/github.com\/crstauf"
}
],
"createdAt" : "2020-11-07T14:59:48-05:00",
"currentDirectoryPath" : null,
"description" : "Stop TV.",
"filename" : "apple-tv-stop.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/apple-tv-logo.png"
},
"identifier" : "a57140b9ba8d6f6227d413c0d0caeca5",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "TV",
"path" : "media\/apple-tv\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Stop",
"updatedAt" : "2020-11-28T13:47:03-05:00"
}
]
},
{
"name" : "Sonos",
"path" : "sonos",
"readme" : "media\/sonos\/README.md",
"scriptCommands" : [
{
"authors" : [
{
"name" : "David Blackman",
"url" : "https:\/\/github.com\/whizziwig"
}
],
"createdAt" : "2022-01-02T10:24:52-08:00",
"currentDirectoryPath" : null,
"description" : "Sets volume of Sonos.",
"filename" : "sonos-volume-set.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/sonos-logo.png"
},
"identifier" : "085acb7129481eed8d148f6ca7b32404",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Sonos",
"path" : "media\/sonos\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Set Volume",
"updatedAt" : "2022-01-02T10:24:52-08:00"
},
{
"authors" : [
{
"name" : "David Blackman",
"url" : "https:\/\/github.com\/whizziwig"
}
],
"createdAt" : "2022-01-02T10:24:52-08:00",
"currentDirectoryPath" : null,
"description" : "Raises volume of Sonos.",
"filename" : "sonos-volume-down.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/sonos-logo.png"
},
"identifier" : "a300f2524b7bd3e43710d309ff82eed1",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Sonos",
"path" : "media\/sonos\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Volume Down",
"updatedAt" : "2022-01-02T10:24:52-08:00"
},
{
"authors" : [
{
"name" : "David Blackman",
"url" : "https:\/\/github.com\/whizziwig"
}
],
"createdAt" : "2022-01-02T10:24:52-08:00",
"currentDirectoryPath" : null,
"description" : "Raises volume of Sonos.",
"filename" : "sonos-volume-up.sh",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/sonos-logo.png"
},
"identifier" : "f0a7189878e31e38c10433ca9b69239c",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Sonos",
"path" : "media\/sonos\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Volume Up",
"updatedAt" : "2022-01-02T10:24:52-08:00"
},
{
"authors" : [
{
"name" : "David Blackman",
"url" : "https:\/\/github.com\/whizziwig"
}
],
"createdAt" : "2022-01-02T10:24:52-08:00",
"currentDirectoryPath" : null,
"description" : "Play from Sonos favorites.",
"filename" : "sonos-play-favorite.sh",
"hasArguments" : true,
"icon" : {
"dark" : null,
"light" : "images\/sonos-logo.png"
},
"identifier" : "da8d3ee4cc8a4c646953f6dc401b7383",
"isTemplate" : false,
"language" : "bash",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Sonos",
"path" : "media\/sonos\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Play Favorite",
"updatedAt" : "2022-01-02T10:24:52-08:00"
}
]
},
{
"name" : "Tidal",
"path" : "tidal",
"scriptCommands" : [
{
"authors" : [
{
"name" : "Charles Harries",
"url" : "https:\/\/github.com\/charlesharries"
}
],
"createdAt" : "2022-02-01T13:37:24Z",
"currentDirectoryPath" : null,
"description" : "Play the current track in Tidal.",
"filename" : "tidal-play.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/tidal-logo.png"
},
"identifier" : "2ea9c044515312cbf87dac8fb5e0c92a",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Tidal Play",
"path" : "media\/tidal\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Play",
"updatedAt" : "2022-02-01T13:37:24Z"
},
{
"authors" : [
{
"name" : "Charles Harries",
"url" : "https:\/\/github.com\/charlesharries"
}
],
"createdAt" : "2022-02-01T13:37:24Z",
"currentDirectoryPath" : null,
"description" : "Skip to the next track in Tidal.",
"filename" : "tidal-next-track.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/tidal-logo.png"
},
"identifier" : "aac66a366cec215c8594f02cf425bcb0",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Tidal Next Track",
"path" : "media\/tidal\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Next Track",
"updatedAt" : "2022-02-01T14:38:40Z"
},
{
"authors" : [
{
"name" : "Charles Harries",
"url" : "https:\/\/github.com\/charlesharries"
}
],
"createdAt" : "2022-02-01T13:37:24Z",
"currentDirectoryPath" : null,
"description" : "Pause the current track in Tidal.",
"filename" : "tidal-pause.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/tidal-logo.png"
},
"identifier" : "58a1d13baec2c61c0a7ee815126b4fd9",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Tidal Pause",
"path" : "media\/tidal\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Pause",
"updatedAt" : "2022-02-01T13:37:24Z"
},
{
"authors" : [
{
"name" : "Charles Harries",
"url" : "https:\/\/github.com\/charlesharries"
}
],
"createdAt" : "2022-02-01T13:37:24Z",
"currentDirectoryPath" : null,
"description" : "Skip back to the previous track in Tidal.",
"filename" : "tidal-previous-track.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/tidal-logo.png"
},
"identifier" : "2a30f2daec4a4df68c4f0dae82c0e6ba",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Tidal Previous Track",
"path" : "media\/tidal\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Previous Track",
"updatedAt" : "2022-02-01T14:38:40Z"
},
{
"authors" : [
{
"name" : "Cebrail AKTAS",
"url" : "https:\/\/github.com\/AktasC"
}
],
"createdAt" : "2022-09-12T17:06:01+02:00",
"currentDirectoryPath" : null,
"description" : "Play\/Pause Tidal",
"filename" : "tidal.applescript",
"hasArguments" : false,
"icon" : {
"dark" : null,
"light" : "images\/tidal-logo.png"
},
"identifier" : "ee85b0d540c79e75859c0753aadee02a",
"isTemplate" : false,
"language" : "applescript",
"mode" : "silent",
"needsConfirmation" : null,
"packageName" : "Tidal",
"path" : "media\/tidal\/",
"refreshTime" : null,
"schemaVersion" : 1,
"title" : "Toggle Play\/Pause",
"updatedAt" : "2022-09-13T08:16:43Z"
}
]
}
]
}
],
"languages" : [
{
"displayName" : "Ruby",
"icon" : "icon-ruby.png",
"name" : "ruby"
},
{
"displayName" : "Bash",
"icon" : "icon-bash.png",
"name" : "bash"
},
{
"displayName" : "AppleScript",
"icon" : "icon-applescript.png",
"name" : "applescript"
},
{
"displayName" : "Node",
"icon" : "icon-nodejs.png",
"name" : "node"
},
{
"displayName" : "Swift",
"icon" : "icon-swift.png",
"name" : "swift"
},
{
"displayName" : "Python",
"icon" : "icon-python.png",
"name" : "python"
}
],
"metadata" : [
],
"totalScriptCommands" : 849,
"updatedAt" : "2025-11-28T17:08:40Z"
}
================================================
FILE: commands/home/elgato/elgato-key-light-decrease-brightness.template.rb
================================================
#!/usr/bin/env ruby
# Parameters
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Decrease Brightness
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/elgato.png
# @raycast.packageName Elgato Key Light
# Documentation:
# @raycast.author Thomas Paul Mann
# @raycast.authorURL https://github.com/thomaspaulmann
# @raycast.description Decrease brightness of Elgato Key Light by 5%.
# Configuration
HOST=""
PORT=""
# Main program
require "json"
require "net/http"
require "uri"
uri = URI("http://#{HOST}:#{PORT}/elgato/lights")
req = Net::HTTP::Get.new(uri)
res = Net::HTTP.start(uri.hostname, uri.port) { |http|
http.request(req)
}
if res.code == "200"
result = JSON.parse(res.body)
first_light = result["lights"].first()
if first_light.nil?
puts "Failed parsing first light"
exit(1)
end
brightness = first_light["brightness"]
brightness -= 5
brightness = brightness.clamp(0, 100)
uri = URI("http://#{HOST}:#{PORT}/elgato/lights")
req = Net::HTTP::Put.new(uri)
req.body = {
"numberOfLights": 1,
"lights": [
{
"brightness": brightness
}
]
}.to_json
res = Net::HTTP.start(uri.hostname, uri.port) { |http|
http.request(req)
}
if res.code == "200"
puts "Decreased brightness to #{brightness}%"
else
puts "Failed decreasing brightness"
exit(1)
end
else
puts "Failed loading lights"
exit(1)
end
================================================
FILE: commands/home/elgato/elgato-key-light-increase-brightness.template.rb
================================================
#!/usr/bin/env ruby
# Parameters
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Increase Brightness
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/elgato.png
# @raycast.packageName Elgato Key Light
# Documentation:
# @raycast.author Thomas Paul Mann
# @raycast.authorURL https://github.com/thomaspaulmann
# @raycast.description Increase brightness of Elgato Key Light by 5%.
# Configuration
HOST=""
PORT=""
# Main program
require "json"
require "net/http"
require "uri"
uri = URI("http://#{HOST}:#{PORT}/elgato/lights")
req = Net::HTTP::Get.new(uri)
res = Net::HTTP.start(uri.hostname, uri.port) { |http|
http.request(req)
}
if res.code == "200"
result = JSON.parse(res.body)
first_light = result["lights"].first()
if first_light.nil?
puts "Failed parsing first light"
exit(1)
end
brightness = first_light["brightness"]
brightness += 5
brightness = brightness.clamp(0, 100)
uri = URI("http://#{HOST}:#{PORT}/elgato/lights")
req = Net::HTTP::Put.new(uri)
req.body = {
"numberOfLights": 1,
"lights": [
{
"brightness": brightness
}
]
}.to_json
res = Net::HTTP.start(uri.hostname, uri.port) { |http|
http.request(req)
}
if res.code == "200"
puts "Increased brightness to #{brightness}%"
else
puts "Failed increasing brightness"
exit(1)
end
else
puts "Failed loading lights"
exit(1)
end
================================================
FILE: commands/home/elgato/elgato-key-light-turn-off.template.rb
================================================
#!/usr/bin/env ruby
# Parameters
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Turn Off
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/elgato.png
# @raycast.packageName Elgato Key Light
# Documentation:
# @raycast.author Thomas Paul Mann
# @raycast.authorURL https://github.com/thomaspaulmann
# @raycast.description Turn off Elgato Key Light.
# Configuration
HOST=""
PORT=""
# Main program
require "json"
require "net/http"
require "uri"
if HOST.empty? || PORT.empty?
puts "No host or port provided"
exit(1)
end
uri = URI("http://#{HOST}:#{PORT}/elgato/lights")
req = Net::HTTP::Put.new(uri)
req.body = {
"numberOfLights": 1,
"lights": [
{
"on": 0
}
]
}.to_json
res = Net::HTTP.start(uri.hostname, uri.port) { |http|
http.request(req)
}
if res.code == "200"
puts "Turned off light"
else
puts "Failed turning off light"
exit(1)
end
================================================
FILE: commands/home/elgato/elgato-key-light-turn-on.template.rb
================================================
#!/usr/bin/env ruby
# Parameters
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Turn On
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/elgato.png
# @raycast.packageName Elgato Key Light
# Documentation:
# @raycast.author Thomas Paul Mann
# @raycast.authorURL https://github.com/thomaspaulmann
# @raycast.description Turn on Elgato Key Light.
# Configuration
HOST=""
PORT=""
# Main program
require "json"
require "net/http"
require "uri"
if HOST.empty? || PORT.empty?
puts "No host or port provided"
exit(1)
end
uri = URI("http://#{HOST}:#{PORT}/elgato/lights")
req = Net::HTTP::Put.new(uri)
req.body = {
"numberOfLights": 1,
"lights": [
{
"on": 1
}
]
}.to_json
res = Net::HTTP.start(uri.hostname, uri.port) { |http|
http.request(req)
}
if res.code == "200"
puts "Turned on light"
else
puts "Failed turning on light"
exit(1)
end
================================================
FILE: commands/home/philips-hue/hue-bulb.template.mjs
================================================
#!/usr/bin/env zx
// Required parameters:
// @raycast.schemaVersion 1
// @raycast.title Set Light Bulb
// @raycast.mode silent
// @raycast.packageName Philips Hue
// Optional parameters:
// @raycast.icon 💡
// @raycast.argument1 { "type": "text", "placeholder": "preset", "optional": true }
// @raycast.argument2 { "type": "text", "placeholder": "value (hsb or brightness)", "optional": true }
// @raycast.argument3 { "type": "text", "placeholder": "bulb", "optional": true }
// Documentation:
// @raycast.author Jono Hewitt
// @raycast.authorURL https://github.com/jonohewitt
// @raycast.description Set a specified or default individual color bulb to a preset, hsb or brightness value. Leave preset and value arguments empty to toggle a bulb on or off.
// This script requires:
// • A global install of zx. To install, run 'npm i -g zx' or 'yarn global add zx'.
// More info: https://github.com/google/zx
// • Your Hue Bridge local IP address, e.g 192.168.1.2
// • An authorized username, e.g 1028d66426293e821ecfd9ef1a0731df
// • A default light bulb ID, e.g 5
// Follow the steps here for the bridge IP and how to create a username:
// https://developers.meethue.com/develop/get-started-2/
// Then go to https:///api//lights to see the number ID associated with each bulb you've set up.
// Assign one of these numbers to the defaultBulb variable below, then add each other bulb in the first section of the script.
// The script uses comma separated HSB, a.k.a HSV, (Hue: 0-360, Saturation: 0-100, Brightness: 0-100) for inputting color values.
// If only one number is provided, it is assumed to be brightness (0-100)
// If neither a preset nor value are provided, the current 'on' state for the bulb is toggled
// Remember to remove .template from the filename after customizing.
const hueBridgeIP = '' // e.g 192.168.1.2
const userID = '' // e.g 1028d66426293e821ecfd9ef1a0731df
const defaultBulb = '' // e.g 5
// Necessary to prevent fetch logging to the console automatically
$.verbose = false
const [presetInput, valueInput, bulbInput] = process.argv.slice(3)
let on, hue, sat, bri, bulbID, data
// Fetch existing data for all bulbs
const prevBulbData = await fetch(
`http://${hueBridgeIP}/api/${userID}/lights/`,
{ method: 'get' }
).then(res => res.json())
if (bulbInput) {
// If the bulbInput string matches a name assigned to one of the bulbs on the Hue bridge,
// the script will automatically use its ID instead of testing against the names in the switch statement
const matchedBulb = Object.entries(prevBulbData).find(
bulb => bulb[1].name.toLowerCase() === bulbInput.toLowerCase()
)
if (matchedBulb) bulbID = matchedBulb[0]
else {
// Assign bulb IDs to input strings here, some examples are included already
// The defaultBulb id assigned in the top config will be used if a bulb argument isn't provided
// The switch converts all inputs to lowercase, so you should only use lowercase for the case statements.
// That way, the Raycast input will be case insensitive.
switch (bulbInput.toLowerCase()) {
// Multiple inputs can be assigned to the same bulb by stacking case statements
case 'main':
case 'ceiling':
bulbID = 5
break
case 'lamp':
case 'desk':
bulbID = 4
break
// Add more presets with more case statements here
default:
console.error(`${bulbInput} isn't configured yet!`)
process.exit(1)
}
}
} else bulbID = defaultBulb
if (!prevBulbData[bulbID]) {
console.error(`Bulb ID: ${bulbID} wasn't found on your Hue bridge!`)
process.exit(1)
}
// Assign your presets here, some examples are included already
if (presetInput) {
switch (presetInput.toLowerCase()) {
case 'on':
on = true
break
case 'off':
on = false
break
case 'sunset':
on = true
hue = 15
sat = 100
bri = 20
break
case 'bright':
on = true
hue = 45
sat = 25
bri = 100
break
// Add more presets with more case statements here
default:
console.error('Preset not found!')
process.exit(1)
}
// If there isn't any presetInput or valueInput, this condition toggles the bulb on or off
// Remove if you would rather receive a 'No data provided' error without any changes made
} else if (!valueInput) on = !prevBulbData[bulbID].state.on
// If a color input is provided, this section tests and assigns the values from it
// This section doesn't require any further configuration
if (valueInput) {
// Check for letters or hashtags in the input implying a HEX value
const hexRegex = /[a-zA-Z]|#/
if (hexRegex.test(valueInput)) {
console.error("HEX values aren't supported!")
process.exit(1)
}
// Validate the input format
const formatRegex =
/^\d+\.?\d*\W?$|^\d+\.?\d*\W?,\s?\d+\.?\d*\W?,\s?\d+\.?\d*\W?$/
if (!formatRegex.test(valueInput)) {
console.error("HSB or brightness input isn't formatted correctly!")
process.exit(1)
}
// Split the comma separated HSB string into an array,
// remove any non-numeric characters other than decimal points, e.g degree or percentage symbols
const hsbArray = valueInput
.split(',')
.map(value => value.replace(/(?=\D)[^\.]/g, ''))
// Test for out of bounds color values
function checkValue(value, limit) {
if (value > limit) {
console.error('Bad value input!')
process.exit(1)
} else return value
}
// If the array only has one entry, assign it to brightness
if (hsbArray.length === 1) {
bri = checkValue(hsbArray[0], 100)
on = true
// Otherwise assign each entry as HSB values
} else {
hue = checkValue(hsbArray[0], 360)
sat = checkValue(hsbArray[1], 100)
bri = checkValue(hsbArray[2], 100)
on = true
}
}
// Convert the color model
if (hue) hue = Math.floor((hue * 65535) / 360)
if (sat) sat = Math.floor((sat * 254) / 100)
if (bri) bri = Math.floor((bri * 254) / 100)
// If there is color information, include it all in the data
if (hue !== undefined) data = { on: on, hue: hue, sat: sat, bri: bri }
// If there is only brightness info, update it without overwriting the existing color data
else if (bri !== undefined) data = { on: on, bri: bri }
// Otherwise only change the "on" state without overwriting the existing color data
else if (on !== undefined) data = { on: on }
else {
console.error('No data provided!')
process.exit(1)
}
await fetch(`http://${hueBridgeIP}/api/${userID}/lights/${bulbID}/state`, {
method: 'put',
body: JSON.stringify(data),
headers: { 'Content-Type': 'application/json' },
})
.then(res => res.json())
.then(data => {
if (data.every(message => message.success)) {
console.log(`${prevBulbData[bulbID].name} bulb updated!`)
}
})
================================================
FILE: commands/home/philips-hue/hue-lights-inline.template.mjs
================================================
#!/usr/bin/env zx
// Required parameters:
// @raycast.schemaVersion 1
// @raycast.title Lights
// @raycast.mode inline
// @raycast.packageName Philips Hue
// Optional parameters:
// @raycast.icon 💡
// @raycast.refreshTime 2m
// Documentation:
// @raycast.author Jono Hewitt
// @raycast.authorURL https://github.com/jonohewitt
// @raycast.description Show inline summary of any Hue compatible lights. Choose to show on/off, brightness percentage, color temperature or hue, saturation, brightness values. Recommended to have already assigned names to lights in the Hue app.
// This script requires:
// • A global install of zx. To install, run 'npm i -g zx' or 'yarn global add zx'.
// More info: https://github.com/google/zx
// • Your Hue Bridge local IP address, e.g 192.168.1.2
// • An authorized username, e.g 1028d66426293e821ecfd9ef1a0731df
// • Names to be assigned to the bulbs. You can do this in the Hue app.
// Follow the steps here for the bridge IP and how to create a username:
// https://developers.meethue.com/develop/get-started-2/
// Remember to remove .template from the filename after customizing.
// Config:
const hueBridgeIP = '' // e.g 192.168.1.2
const userID = '' // e.g 1028d66426293e821ecfd9ef1a0731df
// 0 for On/Off
// 1 for brightness percentage,
// 2 for Hue, Saturation, Brightness if supported by full color bulbs,
// or color temperature in K and brightness percentage in temperature only lights, e.g 'White Ambiance'
const outputType = 1
// Optional:
// Specify which lights you want to include, in order, by their name (case sensitive).
// These names must have already been assigned to the lights via the Hue app.
// Use an empty array for all lights.
const chosenLights = [] // E.g ['Main', 'Desk']
// Optional:
// If you want to use a different bulb name to the name in your Hue settings, you can assign that here.
// The object key is the Hue name and the value is your arbitrary custom name.
const customNames = {} // E.g { Main: 'Ceiling', Desk: 'Lamp' }
// Code:
// Necessary to prevent fetch logging to the console automatically
$.verbose = false
// Collect data on all lights connected to the bridge
const lightsData = await fetch(`http://${hueBridgeIP}/api/${userID}/lights`, {
method: 'get',
}).then(res => res.json())
Object.keys(customNames)
.concat(chosenLights)
.forEach(lightName => {
if (!Object.entries(lightsData).find(bulb => bulb[1].name === lightName)) {
console.error(
`"${lightName}" isn't a bulb name yet! Check chosenLights & customNames`
)
process.exit(1)
}
})
const reducer = (output, bulb) => {
output += `${customNames[bulb.name] || bulb.name}: `
if (bulb.state.reachable && bulb.state.on) {
// Conditions are stacked with logical OR operators so that no bulb is asked for values it doesn't support
if (outputType === 0 || bulb.type === 'On/off light') {
output += 'On, '
} else if (outputType === 1 || bulb.type === 'Dimmable light') {
// Convert brightness from (0-254) to (0-100%)
output += `${Math.round((bulb.state.bri / 254) * 100)}%, `
} else if (outputType === 2) {
if (bulb.type === 'Color temperature light') {
// Convert color temperature from mired units to kelvin units
output += `${Math.round(1000000 / bulb.state.ct)} K, ${Math.round(
(bulb.state.bri / 254) * 100
)}%, `
} else if (
bulb.type === 'Color light' ||
bulb.type === 'Extended color light'
) {
// Convert hue from (0-65535) to (0-360°)
output += `${Math.round((bulb.state.hue / 65535) * 360)}°, ${Math.round(
(bulb.state.sat / 254) * 100
)}%, ${Math.round((bulb.state.bri / 254) * 100)}% — `
}
}
} else if (bulb.state.reachable) output += 'Off, '
// Usually this means the light has been turned off manually at a switch
else output += 'Unreachable, '
return output
}
const inlineOutput = Object.entries(lightsData)
.map(entry => entry[1])
.filter(light => !chosenLights.length || chosenLights.includes(light.name))
.sort((a, b) => {
if (chosenLights.length) {
return chosenLights.indexOf(a.name) - chosenLights.indexOf(b.name)
}
})
.reduce(reducer, '')
.slice(0, -2)
console.log(inlineOutput || 'No lights found, check your configuration!')
================================================
FILE: commands/home/philips-hue/hue-room.template.mjs
================================================
#!/usr/bin/env zx
// Required parameters:
// @raycast.schemaVersion 1
// @raycast.title Set Room Lights
// @raycast.mode silent
// @raycast.packageName Philips Hue
// Optional parameters:
// @raycast.icon 💡
// @raycast.argument1 { "type": "text", "placeholder": "preset", "optional": true }
// @raycast.argument2 { "type": "text", "placeholder": "value (hsb or brightness)", "optional": true }
// @raycast.argument3 { "type": "text", "placeholder": "room", "optional": true }
// Documentation:
// @raycast.author Jono Hewitt
// @raycast.authorURL https://github.com/jonohewitt
// @raycast.description Set a specified or default room of color bulbs to a preset, hsb or brightness value. Leave preset and value arguments empty to toggle a room on or off.
// This script requires:
// • A global install of zx. To install, run 'npm i -g zx' or 'yarn global add zx'.
// More info: https://github.com/google/zx
// • Your Hue Bridge local IP address, e.g 192.168.1.2
// • An authorized username, e.g 1028d66426293e821ecfd9ef1a0731df
// • A group/room ID, e.g 2
// Follow the steps here for the bridge IP and how to create a username:
// https://developers.meethue.com/develop/get-started-2/
// Then go to https:///api//groups to see the number ID associated with each room you've set up.
// Assign one of these numbers to the defaultRoom variable below, then add each other room in the first section of the script.
// The script uses comma separated HSB, a.k.a HSV, (Hue: 0-360, Saturation: 0-100, Brightness: 0-100) for inputting color values.
// If only one number is provided, it is assumed to be brightness (0-100)
// If neither a preset nor value are provided, the current 'on' state for the room is toggled
// Remember to remove .template from the filename after customizing.
const hueBridgeIP = '' // e.g 192.168.1.2
const userID = '' // e.g 1028d66426293e821ecfd9ef1a0731df
const defaultRoom = '' // e.g 2
// Necessary to prevent fetch logging to the console automatically
$.verbose = false
const [presetInput, valueInput, roomInput] = process.argv.slice(3)
let on, hue, sat, bri, roomID, data
// Fetch existing data for all rooms
const prevRoomData = await fetch(
`http://${hueBridgeIP}/api/${userID}/groups/`,
{ method: 'get' }
).then(res => res.json())
if (roomInput) {
// If the roomInput string matches a name assigned to one of the rooms on the Hue bridge,
// the script will automatically use its ID instead of testing against the names in the switch statement
const matchedRoom = Object.entries(prevRoomData).find(
room => room[1].name.toLowerCase() === roomInput.toLowerCase()
)
if (matchedRoom) roomID = matchedRoom[0]
else {
// Assign room IDs to input strings here, some examples are included already
// The defaultRoom id assigned in the top config will be used if a room argument isn't provided
// The switch converts all inputs to lowercase, so you should only use lowercase for the case statements.
// That way, the Raycast input will be case insensitive.
switch (roomInput.toLowerCase()) {
// Multiple inputs can be assigned to the same room by stacking case statements
case 'dining room':
case 'dining':
case 'din':
roomID = 2 // Change these numbers to match your API results
break
case 'study':
case 'office':
roomID = 3
break
// Add more presets with more case statements here
default:
console.error(`${roomInput} isn't configured yet!`)
process.exit(1)
}
}
} else roomID = defaultRoom
if (!prevRoomData[roomID]) {
console.error(`Room ID: ${roomID} wasn't found on your Hue bridge!`)
process.exit(1)
}
// Assign your presets here, some examples are included already
if (presetInput) {
switch (presetInput.toLowerCase()) {
case 'on':
on = true
break
case 'off':
on = false
break
case 'sunset':
on = true
hue = 15
sat = 100
bri = 20
break
case 'bright':
on = true
hue = 45
sat = 25
bri = 100
break
// Add more presets with more case statements here
default:
console.error('Preset not found!')
process.exit(1)
}
// If there isn't any presetInput or valueInput, this condition toggles the room on or off
// Remove if you would rather receive a 'No data provided' error without any changes made
} else if (!valueInput) on = !prevRoomData[roomID].state.any_on
// If a color input is provided, this section tests and assigns the values from it
// This section doesn't require any further configuration
if (valueInput) {
// Check for letters or hashtags in the input implying a HEX value
const hexRegex = /[a-zA-Z]|#/
if (hexRegex.test(valueInput)) {
console.error("HEX values aren't supported!")
process.exit(1)
}
// Validate the input format
const formatRegex =
/^\d+\.?\d*\W?$|^\d+\.?\d*\W?,\s?\d+\.?\d*\W?,\s?\d+\.?\d*\W?$/
if (!formatRegex.test(valueInput)) {
console.error("HSB or brightness input isn't formatted correctly!")
process.exit(1)
}
// Split the comma separated HSB string into an array,
// remove any non-numeric characters other than decimal points, e.g degree or percentage symbols
const hsbArray = valueInput
.split(',')
.map(value => value.replace(/(?=\D)[^\.]/g, ''))
// Test for out of bounds color values
function checkValue(value, limit) {
if (value > limit) {
console.error('Bad value input!')
process.exit(1)
} else return value
}
// If the array only has one entry, assign it to brightness
if (hsbArray.length === 1) {
bri = checkValue(hsbArray[0], 100)
on = true
// Otherwise assign each entry as HSB values
} else {
hue = checkValue(hsbArray[0], 360)
sat = checkValue(hsbArray[1], 100)
bri = checkValue(hsbArray[2], 100)
on = true
}
}
// Convert the color model
if (hue) hue = Math.floor((hue * 65535) / 360)
if (sat) sat = Math.floor((sat * 254) / 100)
if (bri) bri = Math.floor((bri * 254) / 100)
// If there is color information, include it all in the data
if (hue !== undefined) data = { on: on, hue: hue, sat: sat, bri: bri }
// If there is only brightness info, update it without overwriting the existing color data
else if (bri !== undefined) data = { on: on, bri: bri }
// Otherwise only change the "on" state without overwriting the existing color data
else if (on !== undefined) data = { on: on }
else {
console.error('No data provided!')
process.exit(1)
}
await fetch(`http://${hueBridgeIP}/api/${userID}/groups/${roomID}/action`, {
method: 'put',
body: JSON.stringify(data),
headers: { 'Content-Type': 'application/json' },
})
.then(res => res.json())
.then(data => {
if (data.every(message => message.success)) {
console.log(`${prevRoomData[roomID].name} lights updated!`)
}
})
================================================
FILE: commands/home/philips-hue/hue-rooms-inline.template.mjs
================================================
#!/usr/bin/env zx
// Required parameters:
// @raycast.schemaVersion 1
// @raycast.title Rooms
// @raycast.mode inline
// @raycast.packageName Philips Hue
// Optional parameters:
// @raycast.icon 💡
// @raycast.refreshTime 2m
// Documentation:
// @raycast.author Jono Hewitt
// @raycast.authorURL https://github.com/jonohewitt
// @raycast.description Show inline summary about your rooms of Hue compatible lights. Choose to show the number of lights on out of the room total, or use more general terms such as "All on". Requires rooms to have already been set up in the Hue app.
// This script requires:
// • A global install of zx. To install, run 'npm i -g zx' or 'yarn global add zx'.
// More info: https://github.com/google/zx
// • Your Hue Bridge local IP address, e.g 192.168.1.2
// • An authorized username, e.g 1028d66426293e821ecfd9ef1a0731df
// • Names to be assigned to the rooms. You can do this in the Hue app.
// Follow the steps here for the bridge IP and how to create a username:
// https://developers.meethue.com/develop/get-started-2/
// Remember to remove .template from the filename after customizing.
// Config:
const hueBridgeIP = '' // e.g 192.168.1.2
const userID = '' // e.g 1028d66426293e821ecfd9ef1a0731df
const specificOutput = true // true for e.g "2/2 lights on", false for "All on" / "Some on" / "All off"
// Optional:
// Specify which rooms you want to include, in order, by their name (case sensitive).
// These names must have already been assigned to the rooms via the Hue app.
// Use an empty array for all rooms.
const chosenRooms = [] // E.g ['Bedroom', 'Study']
// Optional:
// If you want to use a different room name to the name in your Hue settings, you can assign that here.
// The object key is the Hue name and the value is your arbitrary custom name.
const customNames = {} // E.g { Bedroom: 'My room', Study: 'Office' }
// Code:
// Necessary to prevent fetch logging to the console automatically
$.verbose = false
// The Hue API doesn't provide 'reachable' data for groups, so this is collected from each light instead
const lightsData = await fetch(`http://${hueBridgeIP}/api/${userID}/lights`, {
method: 'get',
}).then(res => res.json())
const roomsData = await fetch(`http://${hueBridgeIP}/api/${userID}/groups`, {
method: 'get',
}).then(res => res.json())
Object.keys(customNames)
.concat(chosenRooms)
.forEach(roomName => {
if (!Object.entries(roomsData).find(room => room[1].name === roomName)) {
console.error(
`"${roomName}" isn't a room name yet! Check chosenRooms & customNames`
)
process.exit(1)
}
})
const reducer = (output, room) => {
const totalLights = room.lights.length
const onLights = room.lights.filter(
id => lightsData[id].state.on && lightsData[id].state.reachable
).length
if (totalLights > 0) {
output += `${customNames[room.name] || room.name}: `
if (specificOutput) output += `${onLights}/${totalLights} lights on, `
else {
if (onLights === totalLights) output += 'All on, '
else if (onLights > 0) output += 'Some on, '
else output += 'All off, '
}
}
return output
}
const inlineOutput = Object.entries(roomsData)
.map(entry => entry[1])
.filter(room => !chosenRooms.length || chosenRooms.includes(room.name))
.sort((a, b) => {
if (chosenRooms.length) {
return chosenRooms.indexOf(a.name) - chosenRooms.indexOf(b.name)
}
})
.reduce(reducer, '')
.slice(0, -2)
console.log(inlineOutput || 'No rooms found, check your configuration!')
================================================
FILE: commands/math/calculate-CAGR.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Calculate CAGR Percentage
# @raycast.mode compact
# @raycast.packageName Math
# Optional parameters:
# @raycast.argument1 { "type": "text", "placeholder": "From" }
# @raycast.argument2 { "type": "text", "placeholder": "To" }
# @raycast.argument3 { "type": "text", "placeholder": "Years" }
# Documentation:
# @raycast.author Samuel Barton
# @raycast.authorURL https://github.com/samueldbarton
# @raycast.description Calculate the CAGR between "from" and "to" values over given "years," then copy the result.
CAGR=$(echo "scale=4; e( l($2 / $1) / $3 ) - 1" | bc -l)
CAGR=$(echo "scale=2; $CAGR * 100" | bc -l)
CAGR=$(printf "%.2f" "$CAGR")
echo "$CAGR" | pbcopy
echo "The CAGR from $1 to $2 over $3 years is $CAGR%. CAGR copied to clipboard."
================================================
FILE: commands/math/calculate-combinations.js
================================================
#!/usr/bin/env node
// Dependency: This script requires Nodejs.
// Install Node: https://nodejs.org/en/download/
// Required parameters:
// @raycast.schemaVersion 1
// @raycast.title nCr: Calculate Combinations
// @raycast.mode silent
// Optional parameters:
// @raycast.icon 𝐂
// @raycast.argument1 { "type": "text", "placeholder": "n" }
// @raycast.argument2 { "type": "text", "placeholder": "r" }
// Documentation:
// @raycast.description nCr: Calculate combinations
// @raycast.author cSharp
// @raycast.authorURL https://github.com/noidwasavailable
const child_process = require('child_process');
// Function to copy data to clipboard
const pbcopy = (data) => {
return new Promise(function (resolve, reject) {
const child = child_process.spawn('pbcopy');
child.on('error', function (err) {
reject(err);
});
child.on('close', function (err) {
resolve(data);
});
child.stdin.write(data);
child.stdin.end();
});
};
// get args
const n = Number(process.argv.slice(2)[0]);
const r = Number(process.argv.slice(2)[1]);
// performance optimizations
const memoize = (fn) => {
const cache = {};
return (...args) => {
const n = args[0];
if (n in cache) {
return cache[n];
}
const result = fn(n);
cache[n] = result;
return result;
};
};
// factorial function
const factorial = memoize((n) => {
if (n === 0 || n === 1) {
return 1;
} else {
return n * factorial(n - 1);
}
});
// calculate nCr
const nCr = factorial(n) / (factorial(r) * factorial(n - r));
console.log(`${n} choose ${r} = ${nCr}`);
pbcopy(`${nCr}`);
return nCr;
================================================
FILE: commands/math/calculate-growth.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Calculate Growth %
# @raycast.mode compact
# Optional parameters:
# @raycast.icon 📈
# @raycast.argument1 { "type": "text", "placeholder": "From" }
# @raycast.argument2 { "type": "text", "placeholder": "To" }
# Documentation:
# @raycast.author Petr Nikolaev
# @raycast.authorURL https://github.com/pitnikola
# @raycast.description Calculate percentage increase between "from" and "to" values.
GROWTH=$(echo "($2 / $1 - 1) * 100" | bc -l)
GROWTH=$(printf "%.1f" $GROWTH)
echo "$GROWTH" | pbcopy
echo "Growth from $1 to $2 is $GROWTH%. Copied to clipboard."
================================================
FILE: commands/math/latex-calculator.py
================================================
#!/usr/bin/env python3
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title LaTeX Calculator
# @raycast.mode silent
# @raycast.packageName Math
#
# Optional parameters:
# @raycast.icon 🧮
# @raycast.argument1 { "type": "text", "placeholder": "\\frac{4}{2}}", "optional": true}
#
# Documentation:
# @raycast.description Evaluate LaTeX expressions and get the product copied to your clipboard
# @raycast.author Matt Gleich
# @raycast.authorURL https://mattglei.ch
import pyperclip
from sympy.parsing.latex import parse_latex
import sys
result = float(parse_latex(sys.argv[1]).evalf())
if result.is_integer():
result = round(result)
pyperclip.copy(result)
print(f"Copied {result} to clipboard")
================================================
FILE: commands/math/random-number.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Generate Random Number
# @raycast.mode silent
# @raycast.packageName Math
# @raycast.argument1 { "type": "text", "placeholder": "From"}
# @raycast.argument2 { "type": "text", "placeholder": "To"}
#
# Optional parameters:
# @raycast.icon 🔢
#
# Documentation:
# @raycast.description Generate a number between a given range (inclusive) and then copy the value
# @raycast.author Matt Gleich
# @raycast.authorURL https://mattglei.ch
VALUE=$(jot -r 1 $1 $2)
echo $VALUE | pbcopy
echo "Copied value of" $VALUE
================================================
FILE: commands/math/wolfram-alpha.template.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Wolfram Alpha
# @raycast.mode fullOutput
# Optional parameters:
# @raycast.icon images/wolfram-alpha.png
# @raycast.argument1 { "type": "text", "placeholder": "query" }
# @raycast.packageName Math
# Documentation:
# @raycast.description Use Wolfram Alpha to answer your query
# @raycast.author es183923
# @raycast.authorURL https://github.com/es183923
# Configuration
# Get a Wolfram Alpha API app (https://products.wolframalpha.com/api/) and put in the id below
WA_APP_ID=""
# units (`metric` or `imperial`)
units="metric"
encodedtext=$(echo $1 | curl -Gso /dev/null -w %{url_effective} --data-urlencode @- "" | cut -c 3- || true)
result=$(curl -s "http://api.wolframalpha.com/v1/result?appid=${WA_APP_ID}&i=${encodedtext}&units=${units}")
echo $result
================================================
FILE: commands/media/apple-music/apple-music-current-track.applescript
================================================
#!/usr/bin/osascript
# @raycast.schemaVersion 1
# @raycast.title Current Track
# @raycast.mode inline
# @raycast.refreshTime 10s
# @raycast.packageName Music
# @raycast.icon images/apple-music-logo.png
# @raycast.author mmerle
# @raycast.authorURL https://github.com/mmerle
# @raycast.description Show currently playing track in Music.
if application "Music" is not running then
log "Not playing"
return
end if
property currentTrackName : "Unknown Track"
property currentTrackArtist : "Unknown Artist"
property playerState : "stopped"
tell application "Music"
try
set currentTrackName to name of the current track
set currentTrackArtist to artist of the current track
set playerState to player state as string
end try
end tell
if playerState is "playing" then
log currentTrackName & " - " & currentTrackArtist
else if playerState is "paused" then
log currentTrackName & " - " & currentTrackArtist & " (Paused)"
else
log "Not playing"
end if
================================================
FILE: commands/media/apple-music/apple-music-go-to-artist-page.sh
================================================
#!/bin/bash
# Dependency: This script requires `jq` cli installed: https://stedolan.github.io/jq/
# Install via homebrew: `brew install jq`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Go to Artist in Apple Music
# @raycast.mode silent
# @raycast.packageName Music
# Optional parameters:
# @raycast.author Jordi Clement
# @raycast.authorURL https://github.com/jordicl
# @raycast.description Go to Artist page in the Apple Music App
# @raycast.argument1 { "type": "text", "placeholder": "artist", "percentEncoded": true}
# @raycast.icon images/apple-music-logo.png
if ! command -v jq &> /dev/null; then
echo "jq is required. Install using homebrew: brew install jq";
exit 1;
fi
url=$(curl -s https://itunes.apple.com/search\?term=$1\&entity=musicArtist | jq '.results[0].artistLinkUrl' | sed 's/https/itms/g' | sed 's/"//g')
osascript -e 'on run {myurl}' -e 'open location myurl' -e 'end run' $url
================================================
FILE: commands/media/apple-music/apple-music-hate-current-track.applescript
================================================
#!/usr/bin/osascript
# @raycast.title Hate Current Track
# @raycast.author Bryan Schuetz
# @raycast.authorURL https://github.com/bryanschuetz
# @raycast.description Let the algorithm know how you feel about the currently playing track.
# @raycast.icon images/apple-music-logo.png
# @raycast.placeholder Hate it
# @raycast.mode silent
# @raycast.packageName Apple Music
# @raycast.schemaVersion 1
tell application "Music"
set disliked of current track to true
log "Litterally, the worst."
end tell
================================================
FILE: commands/media/apple-music/apple-music-love-current-track.applescript
================================================
#!/usr/bin/osascript
# @raycast.title Love Current Track
# @raycast.author Bryan Schuetz
# @raycast.authorURL https://github.com/bryanschuetz
# @raycast.description Let the algorithm know how you feel about the currently playing track.
# @raycast.icon images/apple-music-logo.png
# @raycast.placeholder Love It <3
# @raycast.mode silent
# @raycast.packageName Apple Music
# @raycast.schemaVersion 1
tell application "Music"
if player state is playing then
set favorited of current track to true
log "<3 Yeah, the song is now favorited"
else
return "No track is currently playing."
end if
end tell
================================================
FILE: commands/media/apple-music/apple-music-next.applescript
================================================
#!/usr/bin/osascript
# @raycast.title Next Track
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Next track in Music.
# @raycast.icon images/apple-music-logo.png
# @raycast.mode silent
# @raycast.packageName Music
# @raycast.schemaVersion 1
tell application "Music"
next track
end tell
do shell script "echo Next track"
================================================
FILE: commands/media/apple-music/apple-music-pause.applescript
================================================
#!/usr/bin/osascript
# @raycast.title Pause
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Pause Music.
# @raycast.icon images/apple-music-logo.png
# @raycast.mode silent
# @raycast.packageName Music
# @raycast.schemaVersion 1
tell application "Music"
if player state is playing then
pause
do shell script "echo Paused music"
end if
end tell
================================================
FILE: commands/media/apple-music/apple-music-play.applescript
================================================
#!/usr/bin/osascript
# @raycast.title Play
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Play Music.
# @raycast.icon images/apple-music-logo.png
# @raycast.mode silent
# @raycast.packageName Music
# @raycast.schemaVersion 1
tell application "Music"
if player state is paused then
play
do shell script "echo Playing music"
end if
end tell
================================================
FILE: commands/media/apple-music/apple-music-previous.applescript
================================================
#!/usr/bin/osascript
# @raycast.title Previous Track
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Previous track in Music.
# @raycast.icon images/apple-music-logo.png
# @raycast.mode silent
# @raycast.packageName Music
# @raycast.schemaVersion 1
tell application "Music"
previous track
end tell
do shell script "echo Previous track"
================================================
FILE: commands/media/apple-music/apple-music-repeat.applescript
================================================
#!/usr/bin/osascript
# @raycast.title Toggle Repeat
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Toggle repeat setting in Music.
# @raycast.icon images/apple-music-logo.png
# @raycast.mode silent
# @raycast.packageName Music
# @raycast.schemaVersion 1
tell application "Music"
if song repeat = off then
set song repeat to all
do shell script "echo Repeating playlist"
else if song repeat = all then
set song repeat to one
do shell script "echo Repeating track"
else if song repeat = one
set song repeat to off
do shell script "echo Repeating off"
end if
end tell
================================================
FILE: commands/media/apple-music/apple-music-search.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Search
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/apple-music-logo.png
# @raycast.argument1 { "type": "text", "placeholder": "Artist or Music" }
# @raycast.packageName Apple Music
# Documentation:
# @raycast.description Search using the native UI
# @raycast.author StevenRCE0
# @raycast.authorURL https://github.com/StevenRCE0
on run argv
set savedClipboard to the clipboard
set the clipboard to ({item 1 of argv} as text)
try
do shell script "open /System/Applications/Music.app"
tell application "Music" to activate
set using to "Music"
on error
try
do shell script "open /Applications/iTunes.app"
tell application "iTunes" to activate
set using to "iTunes"
end try
end try
# Argh, the window title varies... Add your language if it's not here...
set musicWindow to {"Music", "ミュージック", "音乐", "音樂"}
set notShowing to true
set toLaunch to true
repeat while toLaunch
if using is "Music" and application "Music" is running then set toLaunch to false
if using is "iTunes" and application "iTunes" is running then set toLaunch to false
delay 0.5
end repeat
# Thanks StactOverflow user mklement0 for the code below detecting window name ;-)
# Tell the *process* to count its windows and return its front window's name.
tell application "System Events"
# Get the frontmost app's *process* object.
set frontAppProcess to first application process whose frontmost is true
end tell
tell frontAppProcess
if (count of windows) > 0 then
set window_name to name of front window
if window_name is in musicWindow then
set notShowing to false
end if
end if
end tell
if notShowing is true then
tell application "System Events" to keystroke "0" using command down
end if
delay 0.1
tell application "System Events"
keystroke "f" using command down
keystroke "a" using command down
keystroke "v" using command down
key code 36
end tell
delay 5
set the clipboard to savedClipboard
log "Done"
end run
================================================
FILE: commands/media/apple-music/apple-music-set-volume.applescript
================================================
#!/usr/bin/osascript
# @raycast.title Set Volume
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Set volume in Music.
# @raycast.icon images/apple-music-logo.png
# @raycast.mode silent
# @raycast.packageName Music
# @raycast.schemaVersion 1
# @raycast.argument1 { "type": "text", "placeholder": "Level" }
on run argv
tell application "Music"
set the sound volume to (item 1 of argv)
end tell
end run
================================================
FILE: commands/media/apple-music/apple-music-shuffle.applescript
================================================
#!/usr/bin/osascript
# @raycast.title Toggle Shuffle
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Toggle shuffle setting in Music.
# @raycast.icon images/apple-music-logo.png
# @raycast.mode silent
# @raycast.packageName Music
# @raycast.schemaVersion 1
tell application "Music"
if shuffle enabled = false then
set shuffle enabled to true
do shell script "echo Shuffle playlist on"
else if shuffle enabled = true then
set shuffle enabled to false
do shell script "echo Shuffle playlist off"
end if
end tell
================================================
FILE: commands/media/apple-music/apple-music-stop.applescript
================================================
#!/usr/bin/osascript
# @raycast.title Stop
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Stop Music.
# @raycast.icon images/apple-music-logo.png
# @raycast.mode silent
# @raycast.packageName Music
# @raycast.schemaVersion 1
tell application "Music"
stop
end tell
do shell script "echo Stopped music"
================================================
FILE: commands/media/apple-music/apple-music-volume-down.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Apple Music Volume Down
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/apple-music-logo.png
# Documentation:
# @raycast.author Juan I. Serra
# @raycast.authorURL https://github.com/jiserra
# @raycast.packageName Music
try
tell application "Music"
set sound volume to sound volume - 5
do shell script "echo '⬇'"
end tell
end try
================================================
FILE: commands/media/apple-music/apple-music-volume-up.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Apple Music Volume Up
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/apple-music-logo.png
# Documentation:
# @raycast.author Juan I. Serra
# @raycast.authorURL https://github.com/jiserra
# @raycast.packageName Music
try
tell application "Music"
set sound volume to sound volume + 5
do shell script "echo '⬆'"
end tell
end try
================================================
FILE: commands/media/apple-tv/apple-tv-pause.applescript
================================================
#!/usr/bin/osascript
# @raycast.title Pause
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Pause TV.
# @raycast.icon images/apple-tv-logo.png
# @raycast.mode silent
# @raycast.packageName TV
# @raycast.schemaVersion 1
tell application "TV"
if player state is playing then
pause
do shell script "echo Paused TV"
end if
end tell
================================================
FILE: commands/media/apple-tv/apple-tv-play-movie.applescript
================================================
#!/usr/bin/osascript
## Contributions welcome to also play TV shows.
# @raycast.title Play Movie
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Play specified movie from library in TV.
# @raycast.icon images/apple-tv-logo.png
# @raycast.mode silent
# @raycast.packageName TV
# @raycast.schemaVersion 1
# @raycast.argument1 { "type": "text", "placeholder": "Movie" }
on run argv
tell application "TV"
try
activate
play track (item 1 of argv)
on error
log "Unable to play \"" & (item 1 of argv) & "\""
end try
end tell
end run
================================================
FILE: commands/media/apple-tv/apple-tv-play.applescript
================================================
#!/usr/bin/osascript
# @raycast.title Play
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Play TV.
# @raycast.icon images/apple-tv-logo.png
# @raycast.mode silent
# @raycast.packageName TV
# @raycast.schemaVersion 1
tell application "TV"
if player state is paused then
play
do shell script "echo Playing TV"
end if
end tell
================================================
FILE: commands/media/apple-tv/apple-tv-set-volume.applescript
================================================
#!/usr/bin/osascript
# @raycast.title Set Volume
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Set volume in TV.
# @raycast.icon images/apple-tv-logo.png
# @raycast.mode silent
# @raycast.packageName TV
# @raycast.schemaVersion 1
# @raycast.argument1 { "type": "text", "placeholder": "Level" }
on run argv
tell application "TV"
set the sound volume to (item 1 of argv)
end tell
end run
================================================
FILE: commands/media/apple-tv/apple-tv-stop.applescript
================================================
#!/usr/bin/osascript
# @raycast.title Stop
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Stop TV.
# @raycast.icon images/apple-tv-logo.png
# @raycast.mode silent
# @raycast.packageName TV
# @raycast.schemaVersion 1
tell application "TV"
stop
end tell
do shell script "echo Stopped TV"
================================================
FILE: commands/media/cmus/next-track.sh
================================================
#!/bin/bash
# @raycast.schemaVersion 1
# @raycast.title Next Track
# @raycast.mode silent
#
# @raycast.icon ⏩
# @raycast.packageName Cmus
#
# @raycast.description Goes forward a track if cmus is running
# @raycast.author mmerle
# @raycast.authorURL https://github.com/mmerle
cmus-remote --next
================================================
FILE: commands/media/cmus/play-pause.sh
================================================
#!/bin/bash
# @raycast.schemaVersion 1
# @raycast.title Toggle Play/Pause
# @raycast.mode silent
#
# @raycast.icon ⏯
# @raycast.packageName Cmus
#
# @raycast.description Toggles the play/pause state if cmus is running
# @raycast.author mmerle
# @raycast.authorURL https://github.com/mmerle
cmus-remote --pause
================================================
FILE: commands/media/cmus/previous-track.sh
================================================
#!/bin/bash
# @raycast.schemaVersion 1
# @raycast.title Previous Track
# @raycast.mode silent
#
# @raycast.icon ⏪
# @raycast.packageName Cmus
#
# @raycast.description Goes back a track if cmus is running
# @raycast.author mmerle
# @raycast.authorURL https://github.com/mmerle
cmus-remote --prev
================================================
FILE: commands/media/cmus/toggle-repeat.sh
================================================
#!/bin/bash
# @raycast.schemaVersion 1
# @raycast.title Toggle Repeat
# @raycast.mode silent
#
# @raycast.icon 🔁
# @raycast.packageName Cmus
#
# @raycast.description Toggles the repeat option if cmus is running
# @raycast.author mmerle
# @raycast.authorURL https://github.com/mmerle
cmus-remote --repeat
================================================
FILE: commands/media/cmus/toggle-shuffle.sh
================================================
#!/bin/bash
# @raycast.schemaVersion 1
# @raycast.title Toggle Shuffle
# @raycast.mode silent
#
# @raycast.icon 🔀
# @raycast.packageName Cmus
#
# @raycast.description Toggles the shuffle option if cmus is running
# @raycast.author mmerle
# @raycast.authorURL https://github.com/mmerle
cmus-remote --shuffle
================================================
FILE: commands/media/cmus/track-info.sh
================================================
#!/bin/bash
# @raycast.schemaVersion 1
# @raycast.title Current Track
# @raycast.mode inline
# @raycast.refreshTime 10s
#
# @raycast.icon ℹ️
# @raycast.packageName Cmus
#
# @raycast.description Shows info on the current track if cmus is running
# @raycast.author mmerle
# @raycast.authorURL https://github.com/mmerle
#
# Modified script from https://github.com/Anachron/i3blocks/blob/master/blocks/cmus
cmus-remote >& /dev/null
if [[ $? -eq 0 ]]; then
info_cmus=$(cmus-remote -Q)
info_status=$(echo "${info_cmus}" | sed -n -e 's/^.*status//p' | head -n 1)
track_title=$(echo "${info_cmus}" | sed -n -e 's/^.*title//p' | head -n 1)
track_artist=$(echo "${info_cmus}" | sed -n -e 's/^.*artist//p' | head -n 1)
track_album=$(echo "${info_cmus}" | sed -n -e 's/^.*album//p' | head -n 1)
if [[ $info_status == *"playing"* ]]; then
out_text="${track_title} —${track_artist}"
else
out_text="[PAUSED] ${track_title} —${track_artist}"
fi
else
out_text="Cmus is not running"
fi
echo ${out_text}
================================================
FILE: commands/media/endel/endel-alarm.sh
================================================
#!/bin/bash
# Limitation: Endel URL scheme is not final and could be changed in the future
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Set Alarm
# @raycast.mode silent
# @raycast.packageName Endel
#
# Optional parameters:
# @raycast.icon images/endel.png
# @raycast.needsConfirmation false
#
# Documentation:
# @raycast.description Set Alarm in Endel
# @raycast.author Sergey Korobyin
# @raycast.authorURL https://github.com/huangsemao
open "endel://?type=alarm"
================================================
FILE: commands/media/endel/endel-deep-focus.sh
================================================
#!/bin/bash
# Limitation: Endel URL scheme is not final and could be changed in the future
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Deep Focus
# @raycast.mode silent
# @raycast.packageName Endel
#
# Optional parameters:
# @raycast.icon images/endel.png
# @raycast.needsConfirmation false
#
# Documentation:
# @raycast.description Set deep focus mode at Endel
# @raycast.author Sergey Korobyin
# @raycast.authorURL https://github.com/huangsemao
open "endel://?type=playing_mode&value=plastikman"
================================================
FILE: commands/media/endel/endel-focus.sh
================================================
#!/bin/bash
# Limitation: Endel URL scheme is not final and could be changed in the future
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Focus
# @raycast.mode silent
# @raycast.packageName Endel
#
# Optional parameters:
# @raycast.icon images/endel.png
# @raycast.needsConfirmation false
#
# Documentation:
# @raycast.description Set focus mode at Endel
# @raycast.author Sergey Korobyin
# @raycast.authorURL https://github.com/huangsemao
open "endel://?type=playing_mode&value=focus"
================================================
FILE: commands/media/endel/endel-lullaby.sh
================================================
#!/bin/bash
# Limitation: Endel URL scheme is not final and could be changed in the future
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Lullaby
# @raycast.mode silent
# @raycast.packageName Endel
#
# Optional parameters:
# @raycast.icon images/endel.png
# @raycast.needsConfirmation false
#
# Documentation:
# @raycast.description Set AI lullaby mode at Endel
# @raycast.author Sergey Korobyin
# @raycast.authorURL https://github.com/huangsemao
open "endel://?type=playing_mode&value=grimes"
================================================
FILE: commands/media/endel/endel-recovery.sh
================================================
#!/bin/bash
# Limitation: Endel URL scheme is not final and could be changed in the future
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Recovery
# @raycast.mode silent
# @raycast.packageName Endel
#
# Optional parameters:
# @raycast.icon images/endel.png
# @raycast.needsConfirmation false
#
# Documentation:
# @raycast.description Set recovery mode at Endel
# @raycast.author Sergey Korobyin
# @raycast.authorURL https://github.com/huangsemao
open "endel://?type=playing_mode&value=recovery"
================================================
FILE: commands/media/endel/endel-relax.sh
================================================
#!/bin/bash
# Limitation: Endel URL scheme is not final and could be changed in the future
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Relax
# @raycast.mode silent
# @raycast.packageName Endel
#
# Optional parameters:
# @raycast.icon images/endel.png
# @raycast.needsConfirmation false
#
# Documentation:
# @raycast.description Set relax mode at Endel
# @raycast.author Sergey Korobyin
# @raycast.authorURL https://github.com/huangsemao
open "endel://?type=playing_mode&value=relax"
================================================
FILE: commands/media/endel/endel-scenarios-deepwork.sh
================================================
#!/bin/bash
# Limitation: Endel URL scheme is not final and could be changed in the future
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Deep Work
# @raycast.mode silent
# @raycast.packageName Endel
# @raycast.argument1 { "type": "text", "placeholder": "Minutes", "percentEncoded": false}
#
# Optional parameters:
# @raycast.icon images/endel.png
# @raycast.needsConfirmation false
#
# Documentation:
# @raycast.description Run Deep Work scenario at Endel
# @raycast.author Sergey Korobyin
# @raycast.authorURL https://github.com/huangsemao
MINUTES=$1
MINUTES=$((MINUTES * 60))
open "endel://?type=scenario&value=working&duration=$MINUTES"
================================================
FILE: commands/media/endel/endel-scenarios-homework.sh
================================================
#!/bin/bash
# Limitation: Endel URL scheme is not final and could be changed in the future
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Homework
# @raycast.mode silent
# @raycast.packageName Endel
# @raycast.argument1 { "type": "text", "placeholder": "Minutes", "percentEncoded": false}
#
# Optional parameters:
# @raycast.icon images/endel.png
# @raycast.needsConfirmation false
#
# Documentation:
# @raycast.description Run Homework scenario at Endel
# @raycast.author Sergey Korobyin
# @raycast.authorURL https://github.com/huangsemao
MINUTES=$1
MINUTES=$((MINUTES * 60))
open "endel://?type=scenario&value=studies&duration=$MINUTES"
================================================
FILE: commands/media/endel/endel-scenarios-meditate.sh
================================================
#!/bin/bash
# Limitation: Endel URL scheme is not final and could be changed in the future
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Meditate
# @raycast.mode silent
# @raycast.packageName Endel
# @raycast.argument1 { "type": "text", "placeholder": "Minutes", "percentEncoded": false}
#
# Optional parameters:
# @raycast.icon images/endel.png
# @raycast.needsConfirmation false
#
# Documentation:
# @raycast.description Run Meditate scenario at Endel
# @raycast.author Sergey Korobyin
# @raycast.authorURL https://github.com/huangsemao
MINUTES=$1
MINUTES=$((MINUTES * 60))
open "endel://?type=scenario&value=meditation&duration=$MINUTES"
================================================
FILE: commands/media/endel/endel-scenarios-powernap.sh
================================================
#!/bin/bash
# Limitation: Endel URL scheme is not final and could be changed in the future
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Power Nap
# @raycast.mode silent
# @raycast.packageName Endel
# @raycast.argument1 { "type": "text", "placeholder": "Minutes", "percentEncoded": false}
#
# Optional parameters:
# @raycast.icon images/endel.png
# @raycast.needsConfirmation false
#
# Documentation:
# @raycast.description Run Power Nap scenario at Endel
# @raycast.author Sergey Korobyin
# @raycast.authorURL https://github.com/huangsemao
MINUTES=$1
MINUTES=$((MINUTES * 60))
open "endel://?type=scenario&value=powerNap&duration=$MINUTES"
================================================
FILE: commands/media/endel/endel-scenarios-read.sh
================================================
#!/bin/bash
# Limitation: Endel URL scheme is not final and could be changed in the future
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Read
# @raycast.mode silent
# @raycast.packageName Endel
# @raycast.argument1 { "type": "text", "placeholder": "Minutes", "percentEncoded": false}
#
# Optional parameters:
# @raycast.icon images/endel.png
# @raycast.needsConfirmation false
#
# Documentation:
# @raycast.description Run Read scenario at Endel
# @raycast.author Sergey Korobyin
# @raycast.authorURL https://github.com/huangsemao
MINUTES=$1
MINUTES=$((MINUTES * 60))
open "endel://?type=scenario&value=reading&duration=$MINUTES"
================================================
FILE: commands/media/endel/endel-scenarios-selfcare.sh
================================================
#!/bin/bash
# Limitation: Endel URL scheme is not final and could be changed in the future
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Self Care
# @raycast.mode silent
# @raycast.packageName Endel
# @raycast.argument1 { "type": "text", "placeholder": "Minutes", "percentEncoded": false}
#
# Optional parameters:
# @raycast.icon images/endel.png
# @raycast.needsConfirmation false
#
# Documentation:
# @raycast.description Run Self Care scenario at Endel
# @raycast.author Sergey Korobyin
# @raycast.authorURL https://github.com/huangsemao
MINUTES=$1
MINUTES=$((MINUTES * 60))
open "endel://?type=scenario&value=selfCare&duration=$MINUTES"
================================================
FILE: commands/media/endel/endel-scenarios-unwind.sh
================================================
#!/bin/bash
# Limitation: Endel URL scheme is not final and could be changed in the future
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Unwind
# @raycast.mode silent
# @raycast.packageName Endel
# @raycast.argument1 { "type": "text", "placeholder": "Minutes", "percentEncoded": false}
#
# Optional parameters:
# @raycast.icon images/endel.png
# @raycast.needsConfirmation false
#
# Documentation:
# @raycast.description Run Unwind scenario at Endel
# @raycast.author Sergey Korobyin
# @raycast.authorURL https://github.com/huangsemao
MINUTES=$1
MINUTES=$((MINUTES * 60))
open "endel://?type=scenario&value=unwind&duration=$MINUTES"
================================================
FILE: commands/media/endel/endel-scenarios-workout.sh
================================================
#!/bin/bash
# Limitation: Endel URL scheme is not final and could be changed in the future
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Workout
# @raycast.mode silent
# @raycast.packageName Endel
# @raycast.argument1 { "type": "text", "placeholder": "Minutes", "percentEncoded": false}
#
# Optional parameters:
# @raycast.icon images/endel.png
# @raycast.needsConfirmation false
#
# Documentation:
# @raycast.description Run Workout scenario at Endel
# @raycast.author Sergey Korobyin
# @raycast.authorURL https://github.com/huangsemao
MINUTES=$1
MINUTES=$((MINUTES * 60))
open "endel://?type=scenario&value=sports&duration=$MINUTES"
================================================
FILE: commands/media/endel/endel-scenarios-yoga.sh
================================================
#!/bin/bash
# Limitation: Endel URL scheme is not final and could be changed in the future
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Yoga
# @raycast.mode silent
# @raycast.packageName Endel
# @raycast.argument1 { "type": "text", "placeholder": "Minutes", "percentEncoded": false}
#
# Optional parameters:
# @raycast.icon images/endel.png
# @raycast.needsConfirmation false
#
# Documentation:
# @raycast.description Run Yoga scenario at Endel
# @raycast.author Sergey Korobyin
# @raycast.authorURL https://github.com/huangsemao
MINUTES=$1
MINUTES=$((MINUTES * 60))
open "endel://?type=scenario&value=yoga&duration=$MINUTES"
================================================
FILE: commands/media/endel/endel-sleep.sh
================================================
#!/bin/bash
# Limitation: Endel URL scheme is not final and could be changed in the future
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Sleep
# @raycast.mode silent
# @raycast.packageName Endel
#
# Optional parameters:
# @raycast.icon images/endel.png
# @raycast.needsConfirmation false
#
# Documentation:
# @raycast.description Set focus mode at Endel
# @raycast.author Sergey Korobyin
# @raycast.authorURL https://github.com/huangsemao
open "endel://?type=playing_mode&value=sleep"
================================================
FILE: commands/media/endel/endel-study.sh
================================================
#!/bin/bash
# Limitation: Endel URL scheme is not final and could be changed in the future
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Study
# @raycast.mode silent
# @raycast.packageName Endel
#
# Optional parameters:
# @raycast.icon images/endel.png
# @raycast.needsConfirmation false
#
# Documentation:
# @raycast.description Set study mode at Endel
# @raycast.author Sergey Korobyin
# @raycast.authorURL https://github.com/huangsemao
open "endel://?type=playing_mode&value=study"
================================================
FILE: commands/media/endel/endel-timer.sh
================================================
#!/bin/bash
# Limitation: Endel URL scheme is not final and could be changed in the future
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Set Timer
# @raycast.mode silent
# @raycast.packageName Endel
#
# Optional parameters:
# @raycast.icon images/endel.png
# @raycast.needsConfirmation false
#
# Documentation:
# @raycast.description Set Timer in Endel
# @raycast.author Sergey Korobyin
# @raycast.authorURL https://github.com/huangsemao
open "endel://?type=timer"
================================================
FILE: commands/media/endel/endel-wisdom.sh
================================================
#!/bin/bash
# Limitation: Endel URL scheme is not final and could be changed in the future
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Wiggly Wisdom
# @raycast.mode silent
# @raycast.packageName Endel
#
# Optional parameters:
# @raycast.icon images/endel.png
# @raycast.needsConfirmation false
#
# Documentation:
# @raycast.description Set wiggly wisdom mode at Endel
# @raycast.author Sergey Korobyin
# @raycast.authorURL https://github.com/huangsemao
open "endel://?type=playing_mode&value=alanwatts"
================================================
FILE: commands/media/foobar2000/foobar2000-next.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Next foobar2000
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/foobar2000.png
# @raycast.packageName foobar2000
# Documentation:
# @raycast.description Shortcuts to next foobar2000 for Mac v2.3.0
# @raycast.author Jing Li
# @raycast.authorURL https://github.com/lixeon
tell application "System Events"
tell process "foobar2000"
click menu item "Next" of menu "Playback" of menu bar item "Playback" of menu bar 1
end tell
end tell
================================================
FILE: commands/media/foobar2000/foobar2000-pause.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Pause foobar2000
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/foobar2000.png
# @raycast.packageName foobar2000
# Documentation:
# @raycast.description Shortcuts to pause foobar2000 for Mac v2.3.0
# @raycast.author Jing Li
# @raycast.authorURL https://github.com/lixeon
tell application "System Events"
tell process "foobar2000"
click menu item "Pause" of menu "Playback" of menu bar item "Playback" of menu bar 1
end tell
end tell
================================================
FILE: commands/media/foobar2000/foobar2000-pervious.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Previous foobar2000
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/foobar2000.png
# @raycast.packageName foobar2000
# Documentation:
# @raycast.description Shortcuts to Previous foobar2000 for Mac v2.3.0
# @raycast.author Jing Li
# @raycast.authorURL https://github.com/lixeon
tell application "System Events"
tell process "foobar2000"
click menu item "Previous" of menu "Playback" of menu bar item "Playback" of menu bar 1
end tell
end tell
================================================
FILE: commands/media/lowfi/lowfi.sh
================================================
#!/bin/bash
# Note: lowfi and WezTerm required
#
# Install lowfi at https://github.com/talwat/lowfi
# or by cargo: cargo install lowfi
#
# Install WezTerm at https://wezfurlong.org/wezterm/install/macos.html
# or by homebrew: brew install --cask wezterm
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Lowfi
# @raycast.mode compact
# @raycast.packageName Music
# Optional parameters:
# @raycast.icon
export PATH="$HOME/.cargo/bin:$PATH"
# Check if lowfi is already running
if pgrep -f "lowfi$" > /dev/null; then
echo "Found existing lowfi process"
# Use AppleScript to find and focus the lowfi window
osascript -e '
-- First activate WezTerm application
tell application "WezTerm" to activate
-- Then focus the specific window
tell application "System Events"
tell process "wezterm-gui"
-- Get all windows
set allWindows to every window
repeat with w in allWindows
if title of w contains "lowfi" then
-- Try multiple methods to bring window to front
set frontmost to true
set value of attribute "AXMain" of w to true
perform action "AXRaise" of w
set position of w to {0, 40}
-- Click the window to ensure focus
click w
return "Found and focused lowfi window"
end if
end repeat
end tell
end tell
return "Could not find lowfi window"
'
else
echo "Starting new lowfi instance"
/Applications/WezTerm.app/Contents/MacOS/wezterm start -- lowfi &
fi
================================================
FILE: commands/media/sonos/README.md
================================================
These controls require the soco-cli tool to be installed from https://github.com/avantrec/soco-cli
This is usually all you need (possibly using `pip3`)
```
pip install soco-cli
```
================================================
FILE: commands/media/sonos/sonos-play-favorite.sh
================================================
#!/bin/bash
# Dependency: This script requires `soco` cli installed: https://github.com/avantrec/soco-cli
# Install via pip: `pip install soco-cli`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Play Favorite
# @raycast.mode silent
# @raycast.packageName Sonos
# Optional parameters:
# @raycast.icon images/sonos-logo.png
# Documentation:
# @raycast.description Play from Sonos favorites.
# @raycast.author David Blackman
# @raycast.authorURL https://github.com/whizziwig
# @raycast.argument1 { "type": "text", "placeholder": "Favorite Search" }
if ! command -v soco &> /dev/null; then
echo "soco command is required (https://github.com/avantrec/soco-cli).";
exit 1;
fi
soco _all_ play_fav "$1"
================================================
FILE: commands/media/sonos/sonos-volume-down.sh
================================================
#!/bin/bash
# Dependency: This script requires `soco` cli installed: https://github.com/avantrec/soco-cli
# Install via pip: `pip install soco-cli`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Volume Down
# @raycast.mode silent
# @raycast.packageName Sonos
# Optional parameters:
# @raycast.icon images/sonos-logo.png
# Documentation:
# @raycast.description Raises volume of Sonos.
# @raycast.author David Blackman
# @raycast.authorURL https://github.com/whizziwig
if ! command -v soco &> /dev/null; then
echo "soco command is required (https://github.com/avantrec/soco-cli).";
exit 1;
fi
soco _all_ relative_volume -5
================================================
FILE: commands/media/sonos/sonos-volume-set.sh
================================================
#!/bin/bash
# Dependency: This script requires `soco` cli installed: https://github.com/avantrec/soco-cli
# Install via pip: `pip install soco-cli`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Set Volume
# @raycast.mode silent
# @raycast.packageName Sonos
# Optional parameters:
# @raycast.icon images/sonos-logo.png
# Documentation:
# @raycast.description Sets volume of Sonos.
# @raycast.author David Blackman
# @raycast.authorURL https://github.com/whizziwig
# @raycast.argument1 { "type": "text", "placeholder": "Level" }
if ! command -v soco &> /dev/null; then
echo "soco command is required (https://github.com/avantrec/soco-cli).";
exit 1;
fi
soco _all_ volume $1
================================================
FILE: commands/media/sonos/sonos-volume-up.sh
================================================
#!/bin/bash
# Dependency: This script requires `soco` cli installed: https://github.com/avantrec/soco-cli
# Install via pip: `pip install soco-cli`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Volume Up
# @raycast.mode silent
# @raycast.packageName Sonos
# Optional parameters:
# @raycast.icon images/sonos-logo.png
# Documentation:
# @raycast.description Raises volume of Sonos.
# @raycast.author David Blackman
# @raycast.authorURL https://github.com/whizziwig
if ! command -v soco &> /dev/null; then
echo "soco command is required (https://github.com/avantrec/soco-cli).";
exit 1;
fi
soco _all_ relative_volume +5
================================================
FILE: commands/media/speaker-setup/speaker-setup.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Speaker Setup
# @raycast.mode compact
# Optional parameters:
# @raycast.icon 🔊
# Documentation:
# @raycast.author Kailash Yellareddy
# @raycast.authorURL https://github.com/kyellareddy
# SETUP:
# 1. Download the files Left.mp3 and Right.mp3
# 2. Replace "Left.mp3" in line 21 with the file path for the file Left.mp3
# 3. Replace "Right.mp3" in line 24 with the file path for the file Right.mp3
# Play the first audio file
afplay Left.mp3
# Play the second audio file
afplay Right.mp3
================================================
FILE: commands/media/spotify/create-spotify-command.js
================================================
#!/usr/bin/env node
// Required parameters:
// @raycast.schemaVersion 1
// @raycast.title Create Spotify Command
// @raycast.mode silent
// Optional parameters:
// @raycast.icon ./images/spotify-create.png
// @raycast.packageName Spotify
// @raycast.argument1 { "type": "text", "placeholder": "Discover Weekly" }
// Documentation:
// @raycast.description Create Spotify Shortcut Command from the Spotify URL that's in your clipboard
// @raycast.author Nichlas Wærnes Andersen
// @raycast.authorURL https://twitter.com/nichlaswa
import fs from "fs";
import { execSync } from "child_process";
// Get Clipboard contents
const URL = execSync("pbpaste").toString();
// Filter out the information from URL
const code = URL?.split("/")[4].split("?")[0];
const type = URL?.split("/")[3];
console.log(`code: ${code}, type: ${type}`);
const [commandName] = process.argv.slice(2);
// Create a new Spotify script
const scriptContent = `#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title ${commandName}
# @raycast.mode silent
# @raycast.packageName Spotify
#
# Optional parameters:
# @raycast.icon ./images/spotify-logo.png
#
# Documentation:
# @raycast.description Play ${commandName} on Spotify
# @raycast.author Nichlas W. Andersen
# @raycast.authorURL https://twitter.com/nichlaswa
property uri: "spotify:${type}:${code}"
tell application "Spotify" to play track uri`;
// Slugify
const slugify = (string) => {
const a =
"àáâäæãåāăąçćčđďèéêëēėęěğǵḧîïíīįìłḿñńǹňôöòóœøōõőṕŕřßśšşșťțûüùúūǘůűųẃẍÿýžźż·/_,:;";
const b =
"aaaaaaaaaacccddeeeeeeeegghiiiiiilmnnnnoooooooooprrsssssttuuuuuuuuuwxyyzzz------";
const p = new RegExp(a.split("").join("|"), "g");
return string
.toString()
.toLowerCase()
.replace(/\s+/g, "-") // Replace spaces with -
.replace(p, (c) => b.charAt(a.indexOf(c))) // Replace special characters
.replace(/&/g, "-and-") // Replace & with 'and'
.replace(/[^\w\-]+/g, "") // Remove all non-word characters
.replace(/\-\-+/g, "-") // Replace multiple - with single -
.replace(/^-+/, "") // Trim - from start of text
.replace(/-+$/, ""); // Trim - from end of text
};
// Write script to disk
if (!/track|album|playlist/.test(type)) {
console.log("Could not find Spotify URL in clipboard");
} else {
fs.writeFileSync(
`./spotify-play-${slugify(commandName)}.applescript`,
scriptContent
);
console.log(`${commandName} is ready`);
}
================================================
FILE: commands/media/spotify/spotify-current-track.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Current Track
# @raycast.mode inline
# @raycast.refreshTime 30s
# Optional parameters:
# @raycast.packageName Spotify
# @raycast.icon images/spotify-logo.png
# Documentation:
# @raycast.author Thomas Paul Mann
# @raycast.authorURL https://github.com/thomaspaulmann
# @raycast.description Show currently playing track in Spotify.
if application "Spotify" is not running then
log "Not playing"
return
end if
property currentTrackName : "Unknown Track"
property currentTrackArtist : "Unknown Artist"
property playerState : "stopped"
tell application "Spotify"
try
set currentTrackName to name of the current track
set currentTrackArtist to artist of the current track
set playerState to player state as string
end try
end tell
if playerState is "playing" then
log currentTrackName & " by " & currentTrackArtist
else if playerState is "paused" then
log currentTrackName & " by " & currentTrackArtist & " (Paused)"
else
log "Not playing"
end if
================================================
FILE: commands/media/spotify/spotify-next-track.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Next Track
# @raycast.mode silent
# @raycast.packageName Spotify
# Optional parameters:
# @raycast.icon images/spotify-logo.png
# Documentation:
# @raycast.description Skips to the next track in Spotify.
tell application "Spotify" to next track
================================================
FILE: commands/media/spotify/spotify-now-playing-url.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Copy Current Playing Song URL
# @raycast.mode silent
# @raycast.packageName Spotify
# Optional parameters:
# @raycast.icon images/spotify-logo.png
# Documentation:
# @raycast.author Jack LaFond
# @raycast.authorURL https://github.com/jacc
# @raycast.description Get link to current Spotify playing song
tell application "Spotify"
set spotifyURL to spotify url of the current track
end tell
set AppleScript's text item delimiters to ":"
set idPart to third text item of spotifyURL
set the clipboard to ("https://open.spotify.com/track/" & idPart)
log "Copied to clipboard"
================================================
FILE: commands/media/spotify/spotify-pause.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Pause
# @raycast.mode silent
# @raycast.packageName Spotify
# Optional parameters:
# @raycast.icon images/spotify-logo.png
# Documentation:
# @raycast.description Pause current track in Spotify.
tell application "Spotify" to pause
================================================
FILE: commands/media/spotify/spotify-play-pause.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Toggle Play/Pause
# @raycast.mode silent
# @raycast.packageName Spotify
# Optional parameters:
# @raycast.icon images/spotify-logo.png
# Documentation:
# @raycast.description Toggles play or pause of current track in Spotify.
tell application "Spotify" to playpause
================================================
FILE: commands/media/spotify/spotify-play-playlist.template.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Play Track or Playlist
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName Spotify
# @raycast.icon images/spotify-logo.png
# Documentation:
# @raycast.author Thomas Paul Mann
# @raycast.authorURL https://github.com/thomaspaulmann
# @raycast.description Play playlist or track in Spotify.
# Customization:
# 1. Copy URI of track or playlist from Spotify, e.g. your discover weekly
# 2. Adjust title and description of command
property uri: ""
tell application "Spotify" to play track uri
================================================
FILE: commands/media/spotify/spotify-play.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Play
# @raycast.mode silent
# @raycast.packageName Spotify
# Optional parameters:
# @raycast.icon images/spotify-logo.png
# Documentation:
# @raycast.description Plays current track in Spotify.
tell application "Spotify" to play
================================================
FILE: commands/media/spotify/spotify-previous-track.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Previous Track
# @raycast.mode silent
# @raycast.packageName Spotify
# Optional parameters:
# @raycast.icon images/spotify-logo.png
# Documentation:
# @raycast.description Skips to the previous track in Spotify.
tell application "Spotify" to previous track
================================================
FILE: commands/media/tidal/tidal-next-track.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Next Track
# @raycast.mode silent
# @raycast.packagename Tidal
# Optional parameters
# @raycast.icon images/tidal-logo.png
# Documentation:
# @raycast.author Charles Harries
# @raycast.authorURL https://github.com/charlesharries
# @raycast.description Skip to the next track in Tidal.
tell application "System Events"
tell process "TIDAL"
click menu item "Next" of menu "Playback" of menu bar 1
end tell
end tell
return
================================================
FILE: commands/media/tidal/tidal-pause.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Pause
# @raycast.mode silent
# @raycast.packagename Tidal
# Optional parameters
# @raycast.icon images/tidal-logo.png
# Documentation:
# @raycast.author Charles Harries
# @raycast.authorURL https://github.com/charlesharries
# @raycast.description Pause the current track in Tidal.
tell application "System Events"
tell process "TIDAL"
if name of menu item 0 of menu "Playback" of menu bar 1 is "Pause" then
click menu item "Pause" of menu "Playback" of menu bar 1
end if
end tell
end tell
return
================================================
FILE: commands/media/tidal/tidal-play.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Play
# @raycast.mode silent
# @raycast.packagename Tidal
# Optional parameters
# @raycast.icon images/tidal-logo.png
# Documentation:
# @raycast.author Charles Harries
# @raycast.authorURL https://github.com/charlesharries
# @raycast.description Play the current track in Tidal.
tell application "System Events"
tell process "TIDAL"
if name of menu item 0 of menu "Playback" of menu bar 1 is "Play" then
click menu item "Play" of menu "Playback" of menu bar 1
end if
end tell
end tell
return
================================================
FILE: commands/media/tidal/tidal-previous-track.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Previous Track
# @raycast.mode silent
# @raycast.packagename Tidal
# Optional parameters
# @raycast.icon images/tidal-logo.png
# Documentation:
# @raycast.author Charles Harries
# @raycast.authorURL https://github.com/charlesharries
# @raycast.description Skip back to the previous track in Tidal.
tell application "System Events"
tell process "TIDAL"
click menu item "Previous" of menu "Playback" of menu bar 1
end tell
end tell
return
================================================
FILE: commands/media/tidal/tidal.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Toggle Play/Pause
# @raycast.mode silent
# @raycast.packagename Tidal
# Optional parameters
# @raycast.icon images/tidal-logo.png
# Documentation:
# @raycast.author Cebrail AKTAS
# @raycast.authorURL https://github.com/AktasC
# @raycast.description Play/Pause Tidal
tell application "System Events"
tell process "TIDAL"
click first menu item of menu "Playback" of menu bar 1
if name of first menu item of menu "Playback" of menu bar 1 is "Play" then
log "▶️"
else
log "⏸"
end if
end tell
end tell
================================================
FILE: commands/navigation/hide-application.applescript
================================================
#!/usr/bin/osascript
# @raycast.schemaVersion 1
# @raycast.author Chris Bailey
# @raycast.authorURL https://raycast.com/that70schris
# @raycast.description Easily hide your foremost application
# @raycast.packageName Navigation
# @raycast.title Hide Current Application
# @raycast.mode silent
# @raycast.icon 🫥
tell application "System Events"
tell (first process whose frontmost is true)
set _name to displayed name
end tell
set visible of application process _name to false
end tell
================================================
FILE: commands/navigation/justfocus.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title JustFocus
# @raycast.mode silent
# @raycast.packageName Navigation
# Optional parameters:
# @raycast.icon images/justfocus.png
# @raycast.argument1 { "type": "text", "placeholder": "po,sb,lb,stop" }
# Documentation:
# @raycast.author Jax0rz
# @authorURL https://github.com/Jax0rz
on run argv
set q to item 1 of argv
if ((q as string) is equal to "po") then
tell application "JustFocus"
launch
start pomodoro
end tell
else if ((q as string) is equal to "sb") then
tell application "JustFocus"
launch
short break
end tell
else if ((q as string) is equal to "lb") then
tell application "JustFocus"
launch
long break
end tell
else if ((q as string) is equal to "stop") then
tell application "JustFocus"
stop
end tell
end if
end run
================================================
FILE: commands/navigation/open-applications.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open Applications
# @raycast.mode silent
# @raycast.packageName Navigation
# Optional parameters:
# @raycast.icon 📂
# Documentation:
# @raycast.description Opens the Applications folder in the Finder.
open /Applications
================================================
FILE: commands/navigation/open-clipboard-in-pixelmator-pro.applescript
================================================
#!/usr/bin/osascript
# Dependency: This script requires Pixelmator Pro to be installed: https://www.pixelmator.com/pro/
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open Image From Clipboard
# @raycast.mode silent
# @raycast.packageName Pixelmator Pro
# Optional parameters:
# @raycast.icon ./images/pixelmator-pro-2.0.png
# @raycast.author Bryce Carr
# @raycast.authorURL https://github.com/bdcarr
# Documentation:
# @raycast.description Creates a new document in Pixelmator Pro from the image stored in your clipboard.
activate application "Pixelmator Pro"
tell application "Pixelmator Pro" to make document from clipboard
return
================================================
FILE: commands/navigation/open-desktop-url-from-clipboard.swift
================================================
#!/usr/bin/swift
// Required parameters:
// @raycast.schemaVersion 1
// @raycast.title Open Clipboard URL on Desktop
// @raycast.mode silent
// @raycast.packageName Navigation
// Optional parameters:
// @raycast.icon 🖥
// Documentation:
// @raycast.description Opens the URL from the clipboard in the desktop app.
import Cocoa
guard let string = NSPasteboard.general.string(forType: .string) else {
throw CocoaError(.serviceInvalidPasteboardData)
}
guard let url = URL(string: string) else {
throw URLError(.unsupportedURL)
}
func mapURLWithPrefix(_ prefix: String, scheme: String) -> (URL) -> URL? {
return { url in
guard let httpsRange = url.absoluteString.range(of: prefix) else { return nil }
let suffix = url.absoluteString[httpsRange.upperBound...]
return URL(string: scheme + suffix)
}
}
let mapURLs = [
mapURLWithPrefix("https://www.notion.so/", scheme: "notion://"),
mapURLWithPrefix("https://linear.app/", scheme: "linear://"),
mapURLWithPrefix("https://www.figma.com/", scheme: "figma://"),
]
guard
let mappedURL = mapURLs.lazy.compactMap({ $0(url) }).first,
let appURL = NSWorkspace.shared.urlForApplication(toOpen: mappedURL),
NSWorkspace.shared.open(mappedURL)
else {
NSWorkspace.shared.open(url)
exit(0)
}
print("URL is open in \(appURL.deletingPathExtension().lastPathComponent)")
================================================
FILE: commands/navigation/open-desktop.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open Desktop
# @raycast.mode silent
# @raycast.packageName Navigation
# Optional parameters:
# @raycast.icon images/folder-desktop.png
# Documentation:
# @raycast.description Opens the Desktop folder in the Finder.
open ~/Desktop
================================================
FILE: commands/navigation/open-documents.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open Documents
# @raycast.mode silent
# @raycast.packageName Navigation
# Optional parameters:
# @raycast.icon images/folder-documents.png
# Documentation:
# @raycast.description Opens the Documents folder in the Finder.
open ~/Documents
================================================
FILE: commands/navigation/open-downloads.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open Downloads
# @raycast.mode silent
# @raycast.packageName Navigation
# Optional parameters:
# @raycast.icon images/folder-downloads.png
# Documentation:
# @raycast.description Opens the Downloads folder in the Finder.
open ~/Downloads
================================================
FILE: commands/navigation/open-finder-from-iterm.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open Current iTerm Directory in Finder
# @raycast.mode silent
# @raycast.packageName Navigation
#
# Optional parameters:
# @raycast.icon images/iterm-logo.png
#
# Documentation:
# @raycast.description Open current iTerm directory in Finder
# @raycast.author Kirill Gorbachyonok
# @raycast.authorURL https://github.com/japanese-goblinn
tell application "iTerm"
tell the current session of current window
write text "open -a Finder ./"
end tell
end tell
================================================
FILE: commands/navigation/open-finder-from-terminal.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open Current Terminal Directory in Finder
# @raycast.mode silent
# @raycast.packageName Navigation
#
# Optional parameters:
# @raycast.icon 📟
#
# Documentation:
# @raycast.description Open current Terminal directory in Finder
# @raycast.author Kirill Gorbachyonok
# @raycast.authorURL https://github.com/japanese-goblinn
tell application "Terminal"
if not (exists window 1) then reopen
activate
if busy of window 1 then
tell application "System Events" to keystroke "t" using command down
end if
do script "open -a Finder ./" in window 1
end tell
================================================
FILE: commands/navigation/open-finder.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open Finder
# @raycast.mode silent
# Optional parameters:
# @raycast.icon 🔍
# @raycast.argument1 { "type": "text", "optional": true, "placeholder": "Folder" }
# @raycast.packageName Navigation
# Documentation:
# @raycast.description Open Finder at Home folder or argument location
# @raycast.author Afraz
# @raycast.authorURL https://github.com/afrazkhan
LOCATION=$1
if ! [[ "$LOCATION" =~ ^/ ]]; then
LOCATION="$HOME/$LOCATION"
fi
open "$LOCATION"
================================================
FILE: commands/navigation/open-home.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open Home
# @raycast.mode silent
# @raycast.packageName Navigation
# Optional parameters:
# @raycast.icon images/folder-home.png
# Documentation:
# @raycast.description Opens the Home folder in the Finder.
open ~
================================================
FILE: commands/navigation/open-iterm-from-finder.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open Current Finder Directory in iTerm
# @raycast.mode silent
# @raycast.packageName Navigation
#
# Optional parameters:
# @raycast.icon images/iterm-logo.png
#
# Documentation:
# @raycast.description Open current Finder directory in iTerm
# @raycast.author Kirill Gorbachyonok
# @raycast.authorURL https://github.com/japanese-goblinn
tell application "Finder"
set pathList to (quoted form of POSIX path of (folder of the front window as alias))
set command to "clear; cd " & pathList
end tell
tell application "iTerm"
activate
set hasNoWindows to ((count of windows) is 0)
if hasNoWindows then
create window with default profile
end if
select first window
tell the first window
if hasNoWindows is false then
create tab with default profile
end if
tell current session to write text command
end tell
end tell
================================================
FILE: commands/navigation/open-last-downloaded.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open Last Downloaded
# @raycast.mode silent
# @raycast.packageName Navigation
# Optional parameters:
# @raycast.icon images/folder-downloads.png
# Documentation:
# @raycast.description Opens the last file that was downloaded
open ~/"Downloads/$(ls -tr ~/Downloads/ | tail -n 1)"
================================================
FILE: commands/navigation/open-library.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open Library
# @raycast.mode silent
# @raycast.packageName Navigation
# Optional parameters:
# @raycast.icon images/folder-library.png
# Documentation:
# @raycast.description Opens the Library folder in the Finder.
open ~/Library
================================================
FILE: commands/navigation/open-terminal-from-finder.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open Current Finder Directory in Terminal
# @raycast.mode silent
# @raycast.packageName Navigation
#
# Optional parameters:
# @raycast.icon 📟
#
# Documentation:
# @raycast.description Open current Finder directory in Terminal
# @raycast.author Kirill Gorbachyonok
# @raycast.authorURL https://github.com/japanese-goblinn
tell application "Finder"
-- Check if there's a selection; works if there's a window open or not.
if selection is not {} then
set i to item 1 of (get selection)
-- If it's an alias, set the item to the original item.
if class of i is alias file then
set i to original item of i
end if
-- If it's a folder, use its path.
if class of i is folder then
set p to i
else
-- If it's an item, use its container's path.
set p to container of i
end if
else if (window 1 exists) and (folder of window 1 exists) then
-- If a window exist, use its folder property as the path.
set p to folder of window 1
else
-- Fallback to the Desktop, as nothing is open or selected.
set p to path to desktop folder
end if
set command to "cd " & quoted form of POSIX path of (p as alias) & ";clear;"
end tell
tell application "Terminal"
if not (exists window 1) then reopen
activate
if busy of window 1 then
tell application "System Events" to keystroke "t" using command down
end if
do script command in window 1
end tell
return ""
================================================
FILE: commands/navigation/open-url-from-clipboard.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open URL From Clipboard
# @raycast.mode silent
# @raycast.packageName Navigation
# Optional parameters:
# @raycast.icon 🌐
# Documentation:
# @raycast.description Opens the URL in the clipboard.
regex='(https?|ftp|file)://[-A-Za-z0-9\+&@#/%?=~_|!:,.;]*[-A-Za-z0-9\+&@#/%=~_|]'
pasteboardString=$(pbpaste)
if [[ $pasteboardString =~ $regex ]]
then
open $pasteboardString
else
echo "String in clipboard is a not valid URL"
fi
================================================
FILE: commands/navigation/quit-application.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Quit Application
# @raycast.mode silent
# @raycast.packageName Navigation
# Optional parameters:
# @raycast.icon images/quit.png
# @raycast.argument1 { "type": "text", "placeholder": "Name", "optional": true }
# @raycast.argument2 { "type": "text", "placeholder": "Force quit?", "optional": true }
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Quit the application. Edit the command to change the default values (Application: "", Force quit?: "No").
on run argv
### Configuration ###
set defaultApp to ""
set defaultForceQuit to false
### End of configuration ###
try
set app_ to getApplication(item 1 of argv, defaultApp)
set forceQuit to getForceQuit(item 2 of argv, defaultForceQuit)
quitApplication(app_, forceQuit)
on error errorMessage
return errorMessage
end try
end run
### Functions ###
on getApplication(query, defaultApp)
set app_ to query
if app_ = "" then
set app_ to defaultApp
if app_ = "" then error "Default application is not set, edit the command file"
else if not applicationExists(query) then
set app_ to findMatchingApplication(query)
if app_ = "" then error "No application matching \"" & query & "\" is running"
end if
return app_
end getApplication
on applicationExists(app_)
tell application "System Events"
return (first process whose name = app_) exists
end tell
end applicationExists
on findMatchingApplication(query)
tell application "System Events"
try
return name of first process whose name contains query
on error
return ""
end try
end tell
end findMatchingApplication
on getForceQuit(arg, defaultForceQuit)
set forceQuit to arg
if forceQuit = "" then
set forceQuit to defaultForceQuit
else if forceQuit is in {"no", "n"} then
set forceQuit to false
else if forceQuit is in {"yes", "y"} then
set forceQuit to true
else
error "Wrong value of the \"Force quit?\" argument: use \"y(es)\" or \"n(o)\""
end if
return forceQuit
end getForceQuit
on quitApplication(app_, forceQuit)
tell application app_
if not forceQuit then
quit
else
do shell script "pkill -i " & app_
end if
end tell
end quitApplication
================================================
FILE: commands/navigation/restart-application.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Restart Application
# @raycast.mode silent
# @raycast.packageName Navigation
# Optional parameters:
# @raycast.icon images/restart.png
# @raycast.argument1 { "type": "text", "placeholder": "Name", "optional": true }
# @raycast.argument2 { "type": "text", "placeholder": "Force restart?", "optional": true }
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Restart the application. Edit the command to change the default values (Application: "", Force restart?: "No").
on run argv
### Configuration ###
set defaultApp to ""
set defaultForceRestart to false
### End of configuration ###
try
set app_ to getApplication(item 1 of argv, defaultApp)
set forceRestart to getForceRestart(item 2 of argv, defaultForceRestart)
restartApplication(app_, forceRestart)
on error errorMessage
return errorMessage
end try
end run
### Functions ###
on getApplication(query, defaultApp)
set app_ to query
if app_ = "" then
set app_ to defaultApp
if app_ = "" then error "Default application is not set, edit the command file"
else if not applicationExists(query) then
set app_ to findMatchingApplication(query)
if app_ = "" then error "No application matching \"" & query & "\" is running"
end if
return app_
end getApplication
on applicationExists(app_)
tell application "System Events"
return (first process whose name = app_) exists
end tell
end applicationExists
on findMatchingApplication(query)
tell application "System Events"
try
return name of first process whose name contains query
on error
return ""
end try
end tell
end findMatchingApplication
on getForceRestart(arg, defaultForceRestart)
set forceRestart to arg
if forceRestart = "" then
set forceRestart to defaultForceRestart
else if forceRestart is in {"no", "n"} then
set forceRestart to false
else if forceRestart is in {"yes", "y"} then
set forceRestart to true
else
error "Wrong value of the \"Force restart?\" argument: use \"y(es)\" or \"n(o)\""
end if
return forceRestart
end getForceRestart
on restartApplication(app_, forceRestart)
tell application app_
if not forceRestart then
quit
else
do shell script "pkill -i " & app_
end if
repeat
if not it is running then
exit repeat
else
delay 0.1
end if
end repeat
activate
end tell
end restartApplication
================================================
FILE: commands/navigation/search-in-dash.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.author Jax0rz
# @authorURL https://github.com/Jax0rz
# @raycast.schemaVersion 1
# @raycast.title Search in Dash
# @raycast.mode silent
# @raycast.packageName Navigation
# Optional parameters:
# @raycast.icon images/dash.png
# @raycast.argument1 { "type": "text", "placeholder": "Doc(egs:javascript)", "percentEncoded": true}
# @raycast.argument2 { "type": "text", "placeholder": "Keyword", "percentEncoded": true}
open "dash-plugin://keys=$1&query=$2"
================================================
FILE: commands/navigation/search-in-devdocs.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.author Jax0rz
# @authorURL https://github.com/Jax0rz
# @raycast.schemaVersion 1
# @raycast.title Search in Devdocs
# @raycast.mode silent
# @raycast.packageName Navigation
# Optional parameters:
# @raycast.icon images/devdocs.png
# @raycast.argument1 { "type": "text", "placeholder": "doc", "percentEncoded": true}
# @raycast.argument2 { "type": "text", "placeholder": "term", "percentEncoded": true}
open "devdocs-macos://search?doc=$1&term=$2"
================================================
FILE: commands/productivity/bitwarden/README.md
================================================
# Bitwarden Package
A package of script commands to interact with [Bitwarden Vaults](https://bitwarden.com/) and [Bitwarden Sends](https://bitwarden.com/products/send/), wrapping the [Bitwarden CLI](https://bitwarden.com/help/article/cli/).
- [Dependencies](#dependencies)
- [Authentication Command Usage](#authentication-command-usage)
* [Log In](#log-in)
* [Log In with API Key](#log-in-with-api-key)
* [Log Out](#log-out)
* [Lock Session](#lock-session)
* [Unlock Session](#unlock-session)
* [Bitwarden Status](#bitwarden-status)
- [Bitwarden Vault Command Usage](#bitwarden-vault-command-usage)
* [Search Vault Items](#search-vault-items)
* [Copy First Matching Password](#copy-first-matching-password)
* [Copy First Matching TOTP](#copy-first-matching-totp)
- [Bitwarden Send Command Usage](#bitwarden-send-command-usage)
* [Create a Text Send](#create-a-text-send)
* [Receive a Text Send](#receive-a-text-send)
* [List All Text Sends](#list-all-text-sends)
* [Edit a Send](#edit-a-send)
* [Delete a Send](#delete-a-send)
- [Appx: About Authentication](#appx--about-authentication)
* [Session Tokens](#session-tokens)
+ [Session Token Manipulation](#session-token-manipulation)
* [Troubleshooting](#troubleshooting)
## Dependencies
All authentication and vault-related commands in this package require the [Bitwarden CLI](https://bitwarden.com/help/article/cli/) v1.14.0 or later. Bitwarden Send-related commands require v1.15.1 or later. The _Bitwarden Status_, _Search Vault Items_, _Copy First Matching Password_, _Copy First Matching TOTP_, and Bitwarden Send-related commands (except _Delete a Send_) also require the [`jq` utility](https://stedolan.github.io/jq/).
Install the latest version of both dependencies via homebrew:
```sh
$ brew install bitwarden-cli jq
```
Additional installation options are available in the tools' respective documentation.
## Authentication Command Usage
### Log In
This command executes in `silent` mode, and both authenticates and unlocks a Bitwarden account session.
**If you use multifactor authentication to log in to your Bitwarden account, be sure to set the value of the `MFA_METHOD` variable.** The [values available to use](https://bitwarden.com/help/article/cli/#enums) are:
| MFA Method | Value |
|-------------------|:-----:|
| Authenticator App | 0 |
| Email | 1 |
| Yubikey | 3 |
If you _do not_ use multifactor authentication to log in to your Bitwarden account, leave this variable set to `""`, and optionally remove the MFA Code argument (or leave it blank when logging in). Enabling multifactor authentication is encouraged.
### Log In with API Key
This command executes in `silent` mode, and both authenticates and unlocks a Bitwarden account session using an alternative authentication method required when Bitwarden thinks the authentication comes from bot traffic. See the [Bitwarden CLI documentation](https://bitwarden.com/help/article/cli-auth-challenges/) for more information. Be sure to set the values of the `BW_CLIENTID` and `BW_CLIENTSECRET` variables. These credentials can be found in the account settings of [the web vault](https://vault.bitwarden.com/#/settings/account) (in the "API Key" section).
### Log Out
This command executes in `silent` mode, and deauthenticates the authenticated Bitwarden session.
### Lock Session
This command executes in `silent` mode, and locks the authenticated Bitwarden session without deauthenticating.
### Unlock Session
This command executes in `silent` mode, and unlocks the authenticated Bitwarden session.
### Bitwarden Status
This dashboard command will show the current authentication and/or lock state of the Bitwarden session. It automatically updates every five minutes. The possible states are "Unauthenticated", "Locked", and "Unlocked".
## Bitwarden Vault Command Usage
### Search Vault Items
This command executes in `fullOutput` mode, searches **items** in the unlocked Bitwarden vault, and prints all search results in the following format:
```json
{
"name": "Service Name",
"username": "username",
// optional password
"password": "password",
"uris": [
"https://www.example.com",
"https://www.another-example.com"
],
"lastUpdated": "2020-11-29T20:39:56.509Z",
"notes": "Notes appear here",
"fields": [
{
"name": "Custom Field Name 1",
"value": "Custom Field Value 1",
"type": 0
},
// Optional hidden field
{
"name": "Custom Field Name 2",
"value": "Custom Field Value 2",
"type": 1
}
]
}
```
> The `"type"` property of `fields` objects are not included in the actual output. They are displayed here to illustrate that the first field is not a hidden field, but the second field is.
Passwords and hidden fields are omitted by default. Pass `y` as the value of the `Include Passwords?` argument to include them. You can modify the above format using the `output_format` variable.
### Copy First Matching Password
This command executes in `silent` mode, searches the unlocked Bitwarden vault, and copies the password associated with the first search result to the clipboard.
### Copy First Matching TOTP
This command executes in `silent` mode, searches the unlocked Bitwarden vault, and copies the TOTP associated with the first search result to the clipboard.
## Bitwarden Send Command Usage
### Create a Text Send
This command executes in `silent` mode, creates a new hidden text Send with the provided details, and copies the Send's URL to the clipboard. The Send's deletion date is automatically set to the default value of 7 days from the creation date.
### Receive a Text Send
This command executes in `fullOutput` mode and displays the title and text content of the specified text Send. If the Send is password protected, provide the password as the value of the "Password" argument. If the Send's text is hidden by default, pass "y" as the value of the "Show Hidden Text?" argument to display it.
> **Note:** Because of the behavior of the [`bw send receive`](https://bitwarden.com/help/article/send-cli/#receive) command, there is no way for this script command to exit with an error when attempting to receive a password-protected Send without providing a password.
### List All Text Sends
This command executes in `fullOutput` mode and displays all text sends created in the currently unlocked Bitwarden account. Pass "y" as the value of the "Show Hidden Text?" argument to display the text content of any hidden Sends.
### Edit a Send
This command executes in `fullOutput` mode and displays the updated Send after making the desired modifications. To determine the correct ID of the Send to update, use the _List All Text Sends_ command. The possible "Attribute"s that can be updated are:
| Value in _List All Text Sends_ Output | Value to Pass as "Attribute" to Update | Notes |
|---------------------------------------|----------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `name` | name | |
| `id` | | Although the [`bw send edit` command](https://bitwarden.com/help/article/send-cli/#edit) documentation states that it's possible to edit a Send's ID, a bug in v1.15.1 prevents this from being possible. |
| `text` | text | |
| `deletionDate` | deletionDate | Use ISO-8601 date format. |
| `expirationDate` | expirationDate | Use ISO-8601 date format. |
| `maxAccessCount` | maxAccessCount | |
| `accessCount` | accessCount | |
| `passwordSet` | | It is not currently possible to remove a password from a Send using the `bw` CLI. |
| `notes` | notes | |
| `url` | url | |
| | password | A Send's password is never displayed in the JSON response from the CLI. You can still update a Send's password using this script command. Note that attempting to update a password to `""` (to effectively remove the password) will throw an error. |
| | disabled | (Boolean) Controls whether the Send can be received by others. |
| | hidden | (Boolean) Controls whether the Send's text is hidden by default. |
> Values not present in the _Value to Pass as "Attribute" to Update_ column cannot be modified.
### Delete a Send
This command executes in `silent` mode and deletes the Send with the passed ID value. To retrieve the ID value of a Send to delete, use the _List All Text Sends_ command.
## Appx: About Authentication
Bitwarden sessions are separately authenticated and locked. All unlocked sessions are authenticated, but not all authenticated sessions are unlocked. The included _Log In_ command will both authenticate **and** unlock the authenticated session, but you do not need to log out in order to secure your session. Simply using the _Lock_ command will do so, and you can then use _Unlock_ later before using commands again.
> For more information on session management, see the [Bitwarden CLI documentation](https://bitwarden.com/help/article/cli/#session-management).
### Session Tokens
The Bitwarden CLI uses a session token system to maintain the lock/unlock state of an authenticated session, and this package utilizes the macOS keychain to store and maintain these session tokens. Running the _Lock_ and _Log Out_ commands in this package will invalidate any existing session tokens and remove them from the keychain. Conversely, running the _Log In_ and _Unlock_ commands will create a new session token and store it in the keychain accordingly, while both invalidating and overwriting any existing session token that may exist.
#### Session Token Manipulation
> Manipulating your session token directly, via either the command line or the Keychain Access UI is discouraged. See below for troubleshooting if you choose to do so anyway.
Tokens are stored in the macOS keychain under the user's account and the `raycast-bitwarden` service. When the session is both authenticated and unlocked, you can retrieve your session token via the command line with:
```sh
$ security find-generic-password -a ${USER} -s raycast-bitwarden
```
You can manually remove your session token with:
```sh
$ security delete-generic-password -a ${USER} -s raycast-bitwarden
```
> **IMPORTANT:**
>Removing your session token using this method will only prevent this package from executing script commands. The Bitwarden session itself will remain unlocked, and accessible via the Bitwarden CLI by including the `--session {{token}}` argument when executing CLI commands.
New session tokens can only be created using the Bitwarden CLI. Creating a new session token will invalidate any tokens created previously. To create a new session token, use [the `bw login` command](https://bitwarden.com/help/article/cli/#logging-in) if not already authenticated, otherwise use [the `bw unlock` command](https://bitwarden.com/help/article/cli/#locking). To restore usage of this package after creating a new session token, run:
```sh
security add-generic-password -U -a ${USER} -s raycast-bitwarden -w {{token}}
```
### Troubleshooting
If you use the Bitwarden CLI and/or `security` command in your command line, or the Keychain Access UI to manipulate your session token (and therefore your session's lock status, from the perspective of this package), you may encounter errors using the package's script commands. In the event that the _Session Status_ command does not align with the CLI status' output, try running the _Log Out_ command, or:
```sh
$ bw logout && security delete-generic-password -a ${USER} -s raycast-bitwarden
```
This will invalidate any existing session tokens and remove them from your keychain. You may then create a new session token, and store it accordingly, using the _Log In_ command.
================================================
FILE: commands/productivity/bitwarden/copy-first-matching-password.sh
================================================
#!/bin/bash
# Dependencies:
# 1. The Bitwarden CLI: https://bitwarden.com/help/article/cli/
# 2. The `jq` utility: https://stedolan.github.io/jq/
#
# Install via homebrew: `brew install bitwarden-cli jq`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Copy First Matching Password
# @raycast.mode silent
#
# Optional parameters:
# @raycast.packageName Bitwarden
# @raycast.icon images/bitwarden.png
# @raycast.argument1 { "type": "text", "placeholder": "Query" }
#
# Documentation
# @raycast.author Phil Salant
# @raycast.authorURL https://github.com/PSalant726
# @raycast.description Search all items in a Bitwarden vault, and copy the password of the first search result to the clipboard.
notFound() {
echo "The query '${BASH_ARGV[0]}' did not return a password."
exit 1
}
if ! command -v bw &> /dev/null; then
echo "The Bitwarden CLI is not installed."
exit 1
elif ! command -v jq &> /dev/null; then
echo "The jq utility is not installed."
exit 1
fi
token=$(security find-generic-password -a ${USER} -s raycast-bitwarden -w 2> /dev/null)
token_status=$?
session=""
if [ $token_status -eq 0 ]; then
session="--session $token"
fi
bw unlock --check $session > /dev/null 2>&1
unlocked_status=$?
if [ $unlocked_status -ne 0 ]; then
echo "Vault is locked!"
exit 1
fi
item=$(bw list items --search "$1" $session 2> /dev/null | jq ".[0] | { name: .name, password: .login.password }")
name=$(echo $item | jq --exit-status ".name") || notFound
password=$(echo $item | jq --raw-output --exit-status ".password") || notFound
echo -n $password | pbcopy
unset password
echo "Copied the password for '$name' to the clipboard."
exit 0
================================================
FILE: commands/productivity/bitwarden/copy-first-matching-totp.sh
================================================
#!/bin/bash
# Dependencies:
# 1. The Bitwarden CLI: https://bitwarden.com/help/article/cli/
# 2. The `jq` utility: https://stedolan.github.io/jq/
#
# Install via homebrew: `brew install bitwarden-cli jq`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Copy First Matching TOTP
# @raycast.mode silent
#
# Optional parameters:
# @raycast.packageName Bitwarden
# @raycast.icon images/bitwarden.png
# @raycast.argument1 { "type": "text", "placeholder": "Query" }
#
# Documentation
# @raycast.author Adrian Reyes
# @raycast.author Phil Salant
# @raycast.authorURL https://github.com/int3rrupt
# @raycast.description Search all items in a Bitwarden vault, and copy the TOTP of the first search result to the clipboard.
itemNotFound() {
echo "The query '${BASH_ARGV[0]}' did not return any items."
exit 1
}
totpNotFound() {
echo "The item '$1' does not have a TOTP configured."
exit 1
}
if ! command -v bw &> /dev/null; then
echo "The Bitwarden CLI is not installed."
exit 1
elif ! command -v jq &> /dev/null; then
echo "The jq utility is not installed."
exit 1
fi
token=$(security find-generic-password -a ${USER} -s raycast-bitwarden -w 2> /dev/null)
token_status=$?
session=""
if [ $token_status -eq 0 ]; then
session="--session $token"
fi
bw unlock --check $session > /dev/null 2>&1
unlocked_status=$?
if [ $unlocked_status -ne 0 ]; then
echo "Vault is locked!"
exit 1
fi
item=$(bw list items --search "$1" $session 2> /dev/null | jq ".[0] | { id: .id, name: .name }")
name=$(echo $item | jq --exit-status ".name") || itemNotFound
id=$(echo $item | jq --raw-output --exit-status ".id") || itemNotFound
totp=$(bw get totp $id $session 2> /dev/null)
test $? -eq 0 || totpNotFound "$name"
echo -n $totp | pbcopy
unset totp
echo "Copied the TOTP for '$name' to the clipboard."
exit 0
================================================
FILE: commands/productivity/bitwarden/create-text-send.sh
================================================
#!/bin/bash
# Dependencies:
# 1. The Bitwarden CLI: https://bitwarden.com/help/article/cli/
# 2. The `jq` utility: https://stedolan.github.io/jq/
#
# Install via homebrew: `brew install bitwarden-cli jq`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Create a Text Send
# @raycast.mode silent
#
# Optional parameters:
# @raycast.packageName Bitwarden
# @raycast.icon images/bitwarden.png
# @raycast.argument1 { "type": "text", "placeholder": "Text" }
# @raycast.argument2 { "type": "text", "placeholder": "Name", "optional": true }
# @raycast.argument3 { "type": "text", "placeholder": "Password", "optional": true, "secure": true }
#
# Documentation
# @raycast.author Phil Salant
# @raycast.authorURL https://github.com/PSalant726
# @raycast.description Create a new text-only Bitwarden Send.
if ! command -v bw &> /dev/null; then
echo "The Bitwarden CLI is not installed."
exit 1
elif ! command -v jq &> /dev/null; then
echo "The jq utility is not installed."
exit 1
fi
token=$(security find-generic-password -a ${USER} -s raycast-bitwarden -w 2> /dev/null)
token_status=$?
session=""
if [ $token_status -eq 0 ]; then
session="--session $token"
fi
bw unlock --check $session > /dev/null 2>&1
unlocked_status=$?
if [ $unlocked_status -ne 0 ]; then
echo "Session is locked. Use the Log In or Unlock command to create a Send."
exit 1
fi
filter=(".text.text=\"$1\" | .text.hidden=true | .notes=\"\"")
if [[ -n $2 ]]; then
filter+=(" | .name=\"$2\"")
fi
if [[ -n $3 ]]; then
filter+=(" | .password=\"$3\"")
fi
encoded=$(bw send template send.text | jq "$(echo -n "${filter[@]}")" | bw encode)
send=$(bw send create $session $encoded)
send_status=$?
if [ $send_status -ne 0 ]; then
echo "Failed to create Send"
exit 1
fi
echo $send | grep -o 'https://send.bitwarden.com/.*' | pbcopy
echo "Send created! It's URL has been copied to the clipboard."
================================================
FILE: commands/productivity/bitwarden/delete-send.sh
================================================
#!/bin/bash
# Dependency:
# The Bitwarden CLI: https://bitwarden.com/help/article/cli/
# Install via homebrew: `brew install bitwarden-cli`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Delete a Send
# @raycast.mode silent
#
# Optional parameters:
# @raycast.packageName Bitwarden
# @raycast.icon images/bitwarden.png
# @raycast.needsConfirmation true
# @raycast.argument1 { "type": "text", "placeholder": "Send ID" }
#
# Documentation
# @raycast.author Phil Salant
# @raycast.authorURL https://github.com/PSalant726
# @raycast.description Delete a Bitwarden Send.
if ! command -v bw &> /dev/null; then
echo "The Bitwarden CLI is not installed."
exit 1
fi
token=$(security find-generic-password -a ${USER} -s raycast-bitwarden -w 2> /dev/null)
token_status=$?
session=""
if [ $token_status -eq 0 ]; then
session="--session $token"
fi
bw unlock --check $session > /dev/null 2>&1
unlocked_status=$?
if [ $unlocked_status -ne 0 ]; then
echo "Session is locked. Use the Log In or Unlock command to delete a Send."
exit 1
fi
bw send delete $1 $session 2> /dev/null
delete_status=$?
if [ $delete_status -ne 0 ]; then
printf "Failed to delete Send with ID '%s'" $1
exit 1
fi
printf "Deleted Send with ID '%s'" $1
================================================
FILE: commands/productivity/bitwarden/edit-send.sh
================================================
#!/bin/bash
# Dependencies:
# 1. The Bitwarden CLI: https://bitwarden.com/help/article/cli/
# 2. The `jq` utility: https://stedolan.github.io/jq/
#
# Install via homebrew: `brew install bitwarden-cli jq`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Edit a Send
# @raycast.mode fullOutput
#
# Optional parameters:
# @raycast.packageName Bitwarden
# @raycast.icon images/bitwarden.png
# @raycast.argument1 { "type": "text", "placeholder": "Send ID" }
# @raycast.argument2 { "type": "text", "placeholder": "Attribute" }
# @raycast.argument3 { "type": "text", "placeholder": "New Value" }
#
# Documentation
# @raycast.author Phil Salant
# @raycast.authorURL https://github.com/PSalant726
# @raycast.description Edit an existing Bitwarden Send.
if ! command -v bw &> /dev/null; then
echo "The Bitwarden CLI is not installed."
exit 1
elif ! command -v jq &> /dev/null; then
echo "The jq utility is not installed."
exit 1
fi
token=$(security find-generic-password -a ${USER} -s raycast-bitwarden -w 2> /dev/null)
token_status=$?
session=""
if [ $token_status -eq 0 ]; then
session="--session $token"
fi
bw unlock --check $session > /dev/null 2>&1
unlocked_status=$?
if [ $unlocked_status -ne 0 ]; then
echo "Session is locked. Use the Log In or Unlock command to edit a Send."
exit 1
fi
send=$(bw send get $1 $session 2> /dev/null)
send_status=$?
if [ $send_status -ne 0 ]; then
printf "No send found with ID '%s'" $1
exit 1
fi
update=""
case $2 in
"")
echo "Please provide an attribute to update"
exit 1
;;
"id")
echo "Updating a Send's ID is not supported"
exit 1
;;
"text")
update=".text.text=\"$3\""
;;
"hidden")
update=".text.hidden=\"$3\""
;;
"url")
update=".accessUrl=\"$3\""
;;
*)
update=".$2"
;;
esac
$send | jq "$update" | bw encode | bw send edit $session | jq --color-output
================================================
FILE: commands/productivity/bitwarden/list-sends.sh
================================================
#!/bin/bash
# Dependencies:
# 1. The Bitwarden CLI: https://bitwarden.com/help/article/cli/
# 2. The `jq` utility: https://stedolan.github.io/jq/
#
# Install via homebrew: `brew install bitwarden-cli jq`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title List All Text Sends
# @raycast.mode fullOutput
#
# Optional parameters:
# @raycast.packageName Bitwarden
# @raycast.icon images/bitwarden.png
# @raycast.argument1 { "type": "text", "placeholder": "Show Hidden Text? (y/n)", "optional": true }
#
# Documentation
# @raycast.author Phil Salant
# @raycast.authorURL https://github.com/PSalant726
# @raycast.description List all Bitwarden text Sends created in the currently unlocked account.
if ! command -v bw &> /dev/null; then
echo "The Bitwarden CLI is not installed."
exit 1
elif ! command -v jq &> /dev/null; then
echo "The jq utility is not installed."
exit 1
fi
token=$(security find-generic-password -a ${USER} -s raycast-bitwarden -w 2> /dev/null)
token_status=$?
session=""
if [ $token_status -eq 0 ]; then
session="--session $token"
fi
bw unlock --check $session > /dev/null 2>&1
unlocked_status=$?
if [ $unlocked_status -ne 0 ]; then
echo "Session is locked. Use the Log In or Unlock command to list Sends."
exit 1
fi
bw sync $session > /dev/null 2>&1
text_content="(if (.text.hidden and (\"$1\" != \"y\")) then \"=== TEXT HIDDEN ===\" else .text.text end)"
output_format="{ name, id, text: $text_content, deletionDate, expirationDate, maxAccessCount, accessCount, passwordSet, notes, url: .accessUrl }"
bw send list $session | jq --color-output "map($output_format)"
================================================
FILE: commands/productivity/bitwarden/lock.sh
================================================
#!/bin/bash
# Dependency: This script requires the Bitwarden CLI:
# https://bitwarden.com/help/article/cli/
#
# Install via homebrew: `brew install bitwarden-cli`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Lock Session
# @raycast.mode silent
#
# Optional parameters:
# @raycast.packageName Bitwarden
# @raycast.icon images/bitwarden.png
#
# Documentation
# @raycast.author Phil Salant
# @raycast.authorURL https://github.com/PSalant726
# @raycast.description Lock a Bitwarden session.
if ! command -v bw &> /dev/null; then
echo "The Bitwarden CLI is not installed."
exit 1
fi
security delete-generic-password -a ${USER} -s raycast-bitwarden > /dev/null 2>&1
bw lock
================================================
FILE: commands/productivity/bitwarden/log-in-apikey.template.sh
================================================
#!/bin/bash
# Dependency: This script requires the Bitwarden CLI:
# https://bitwarden.com/help/article/cli/
#
# Install via homebrew: `brew install bitwarden-cli`
# These values can be found in the "API Key" section of a web vault:
# https://vault.bitwarden.com/#/settings/account
BW_CLIENTID=""
BW_CLIENTSECRET=""
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Log In
# @raycast.mode silent
#
# Optional parameters:
# @raycast.packageName Bitwarden
# @raycast.icon images/bitwarden.png
# @raycast.argument1 { "type": "text", "placeholder": "Master Password", "secure": true }
#
# Documentation
# @raycast.author Marcel Bochtler
# @raycast.authorURL https://github.com/MarcelBochtler
# @raycast.description Log in to Bitwarden using an API key.
if [ -z "$BW_CLIENTID" ] || [ -z "$BW_CLIENTSECRET" ]; then
echo "Error: API key not set."
exit 1
fi
login_token=$(BW_CLIENTID=$BW_CLIENTID BW_CLIENTSECRET=$BW_CLIENTSECRET bw --raw login --apikey)
login_status=$?
if [ $login_status -ne 0 ]; then
echo $login_token
exit 1
fi
unlock_token=$(bw --raw unlock "$1")
unlock_status=$?
if [ $unlock_status -eq 0 ]; then
security add-generic-password -U -a ${USER} -s raycast-bitwarden -j "Bitwarden session token for use with Raycast" -w $unlock_token
echo "Login successful! Your session is now unlocked."
exit 0
else
echo $unlock_token
exit 1
fi
================================================
FILE: commands/productivity/bitwarden/log-in.template.sh
================================================
#!/bin/bash
# Dependency: This script requires the Bitwarden CLI:
# https://bitwarden.com/help/article/cli/
#
# Install via homebrew: `brew install bitwarden-cli`
# If logging in with multi-factor authentication, set the `MFA_METHOD`
# as necessary. Otherwise, leave this variable set to the empty string.
#
# Authenticator: 0
# Email: 1
# Yubikey: 3
MFA_METHOD=""
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Log In
# @raycast.mode silent
#
# Optional parameters:
# @raycast.packageName Bitwarden
# @raycast.icon images/bitwarden.png
# @raycast.argument1 { "type": "text", "placeholder": "Email" }
# @raycast.argument2 { "type": "text", "placeholder": "Master Password", "secure": true }
# @raycast.argument3 { "type": "text", "placeholder": "MFA Code", "optional": true }
#
# Documentation
# @raycast.author Phil Salant
# @raycast.authorURL https://github.com/PSalant726
# @raycast.description Log in to Bitwarden.
if ! command -v bw &> /dev/null; then
echo "The Bitwarden CLI is not installed."
exit 1
fi
if [ -n "$MFA_METHOD" ]; then
mfa="--method $MFA_METHOD --code $3"
fi
out=$(bw --raw login $1 $2 $mfa)
status=$?
if [ $status -eq 0 ]; then
security add-generic-password -U -a ${USER} -s raycast-bitwarden -j "Bitwarden session token for use with Raycast" -w $out
unset out
echo "Login successful! Your session is now unlocked."
exit 0
else
echo $out
exit 1
fi
================================================
FILE: commands/productivity/bitwarden/log-out.sh
================================================
#!/bin/bash
# Dependency: This script requires the Bitwarden CLI:
# https://bitwarden.com/help/article/cli/
#
# Install via homebrew: `brew install bitwarden-cli`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Log Out
# @raycast.mode silent
#
# Optional parameters:
# @raycast.packageName Bitwarden
# @raycast.icon images/bitwarden.png
#
# Documentation
# @raycast.author Phil Salant
# @raycast.authorURL https://github.com/PSalant726
# @raycast.description Log out of Bitwarden.
if ! command -v bw &> /dev/null; then
echo "The Bitwarden CLI is not installed."
exit 1
fi
security delete-generic-password -a ${USER} -s raycast-bitwarden > /dev/null 2>&1
bw logout
================================================
FILE: commands/productivity/bitwarden/receive-text-send.sh
================================================
#!/bin/bash
# Dependencies:
# 1. The Bitwarden CLI: https://bitwarden.com/help/article/cli/
# 2. The `jq` utility: https://stedolan.github.io/jq/
#
# Install via homebrew: `brew install bitwarden-cli jq`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Receive a Text Send
# @raycast.mode fullOutput
#
# Optional parameters:
# @raycast.packageName Bitwarden
# @raycast.icon images/bitwarden.png
# @raycast.argument1 { "type": "text", "placeholder": "Send URL" }
# @raycast.argument2 { "type": "text", "placeholder": "Password", "optional": true, "secure": true }
# @raycast.argument3 { "type": "text", "placeholder": "Show Hidden Text? (y/n)", "optional": true }
#
# Documentation
# @raycast.author Phil Salant
# @raycast.authorURL https://github.com/PSalant726
# @raycast.description View the content of a text-only Bitwarden Send.
if ! command -v bw &> /dev/null; then
echo "The Bitwarden CLI is not installed."
exit 1
elif ! command -v jq &> /dev/null; then
echo "The jq utility is not installed."
exit 1
fi
token=$(security find-generic-password -a ${USER} -s raycast-bitwarden -w 2> /dev/null)
token_status=$?
session=""
if [ $token_status -eq 0 ]; then
session="--session $token"
fi
bw unlock --check $session > /dev/null 2>&1
unlocked_status=$?
if [ $unlocked_status -ne 0 ]; then
echo "Session is locked. Use the Log In or Unlock command to view a Send."
exit 1
fi
password=""
if [[ -n $2 ]]; then
password="--password $2"
fi
send=$(bw send receive --obj $password $session $1)
if [[ $send == *"Invalid password"* ]]; then
echo $send
exit 1
fi
name=$(echo "$send" | jq --raw-output ".name")
text=$(echo "$send" | jq --raw-output "if (.text.hidden and (\"$3\" != \"y\")) then \"=== TEXT HIDDEN ===\" else .text.text end")
printf "%s\n\n%s\n" "$name" "$text"
================================================
FILE: commands/productivity/bitwarden/search-vault-items.sh
================================================
#!/bin/bash
# Dependencies:
# 1. The Bitwarden CLI: https://bitwarden.com/help/article/cli/
# 2. The `jq` utility: https://stedolan.github.io/jq/
#
# Install via homebrew: `brew install bitwarden-cli jq`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Search Vault Items
# @raycast.mode fullOutput
#
# Optional parameters:
# @raycast.packageName Bitwarden
# @raycast.icon images/bitwarden.png
# @raycast.argument1 { "type": "text", "placeholder": "Query" }
# @raycast.argument2 { "type": "text", "placeholder": "Include Passwords? (y/n)", "optional": true }
#
# Documentation
# @raycast.author Phil Salant
# @raycast.authorURL https://github.com/PSalant726
# @raycast.description Search all items in a Bitwarden vault.
if ! command -v bw &> /dev/null; then
echo "The Bitwarden CLI is not installed (https://bitwarden.com/help/article/cli/)."
echo "Install via Homebrew with 'brew install bitwarden-cli'"
exit 1
elif ! command -v jq &> /dev/null; then
echo "The jq utility is not installed (https://stedolan.github.io/jq/)."
echo "Install via Homebrew with 'brew install jq'"
exit 1
fi
token=$(security find-generic-password -a ${USER} -s raycast-bitwarden -w 2> /dev/null)
token_status=$?
session_args=""
if [ $token_status -eq 0 ]; then
session_args="--session $token"
fi
bw unlock --check $session_args > /dev/null 2>&1
unlocked_status=$?
if [ $unlocked_status -ne 0 ]; then
echo "Vault is locked. Use the 'Log In' or 'Unlock' commands to enable searching."
exit 0
fi
password=""
fields=", fields: [[.fields[]? | select(.type != 1)][]? | { name, value }]"
if [[ -n $2 && $2 == "y" ]]; then
password="password: .login.password,"
fields=", fields: [.fields[]? | { name, value }]"
fi
output_format="{ name, username: .login.username, $password uris: [.login.uris[]?.uri], lastUpdated: .revisionDate, notes $fields }"
bw list items $session_args --search "$1" | jq --color-output "map($output_format)"
================================================
FILE: commands/productivity/bitwarden/status.sh
================================================
#!/bin/bash
# Dependencies:
# 1. The Bitwarden CLI: https://bitwarden.com/help/article/cli/
# 2. The `jq` utility: https://stedolan.github.io/jq/
#
# Install via homebrew: `brew install bitwarden-cli jq`
# IMPORTANT:
# This script only displays accurate session statuses when you have
# previously used the `Log In`, `Unlock`, `Lock`, and `Log Out`
# scripts within this package. If you're getting unexpected results
# or errors, try running the `Log Out` script, or:
# bw logout && security delete-generic-password -a ${USER} -s raycast-bitwarden
# and logging in again using the `Log In` script.
# Parameters
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Bitwarden Status
# @raycast.mode inline
# Conditional parameters:
# @raycast.refreshTime 5m
# Optional parameters:
# @raycast.packageName Bitwarden
# @raycast.icon images/bitwarden.png
# Documentation:
# @raycast.author Phil Salant
# @raycast.authorURL https://github.com/PSalant726
# @raycast.description Display the authentication and lock status of the user's Bitwarden session.
if ! command -v bw &> /dev/null; then
echo "⚠️ The Bitwarden CLI is not installed"
exit 1
elif ! command -v jq &> /dev/null; then
echo "⚠️ The jq utility is not installed"
exit 1
fi
token=$(security find-generic-password -a ${USER} -s raycast-bitwarden -w 2> /dev/null)
token_status=$?
delete_token() {
if [ $token_status -eq 0 ]; then
security delete-generic-password -a ${USER} -s raycast-bitwarden > /dev/null 2>&1
fi
unset token
}
session=""
if [ $token_status -eq 0 ]; then
session="--session $token"
fi
case $(bw --raw status $session 2> /dev/null | jq --raw-output '.status') in
unauthenticated)
delete_token
echo "❌ Logged out"
exit 0
;;
locked)
delete_token
echo "🔒 Locked"
exit 0
;;
unlocked)
echo "✅ Unlocked"
unset token
exit 0
;;
*)
echo "⚠️ An error occurred. Please try again."
unset token
exit 1
;;
esac
================================================
FILE: commands/productivity/bitwarden/unlock.sh
================================================
#!/bin/bash
# Dependency: This script requires the Bitwarden CLI:
# https://bitwarden.com/help/article/cli/
#
# Install via homebrew: `brew install bitwarden-cli`
# IMPORTANT:
# You must first authenticate your session using the `Log In` script
# before this script will work as expected. Note that using the
# `Log In` script will automatically unlock the session in addition
# to authenticating.
#
# Use this script only for unlocking an authenticated, but locked,
# session. You can check your session's authentication and lock status
# using the `Session Status` command.
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Unlock Session
# @raycast.mode silent
#
# Optional parameters:
# @raycast.packageName Bitwarden
# @raycast.icon images/bitwarden.png
# @raycast.argument1 { "type": "text", "placeholder": "Master Password", "secure": true }
#
# Documentation
# @raycast.author Phil Salant
# @raycast.authorURL https://github.com/PSalant726
# @raycast.description Unlock an authenticated Bitwarden session.
if ! command -v bw &> /dev/null; then
echo "The Bitwarden CLI is not installed."
exit 1
fi
out=$(bw --raw unlock "$1")
status=$?
if [ $status -eq 0 ]; then
security add-generic-password -U -a ${USER} -s raycast-bitwarden -j "Bitwarden session token for use with Raycast" -w $out
unset out
echo "Session unlocked"
exit 0
else
echo $out
exit 1
fi
================================================
FILE: commands/productivity/imgur/imgur-upload-clipboard-image.template.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Clipboard to Imgur
# @raycast.mode silent
# @raycast.packageName Uploads Copied Image or Image from Clipboard
#
# Optional parameters:
# @raycast.icon 📋
#
# Documentation:
# @raycast.description Upload Image from your Clipboard and copy the image link to clipboard
# @raycast.author Fahim Faisal
# @raycast.authorURL https://github.com/i3p9
#Dependency: pngpaste and imagemagick (Install via brew install pngpaste imagemagick)
#pngpaste required to grab image from clipboard
#imagemagick required to convert heic image to jpg (imgur doesnt accept heic files)
#pngpaste check
t=$(which pngpaste)
if [ -z "$t" ]; then
echo "pngpaste not found, install using brew install pngpaste"
exit -1
fi
#imagemagick check
m=$(which magick)
if [ -z "$m" ]; then
echo "imagemagick not found, install using brew install imagemagick"
exit -1
fi
#Client ID, use your own client ID. Get it from https://api.imgur.com/oauth2/addclient (Select anonymous usage as auth type)
client_id="" #CAN NOT BE EMPTY
if [ "$client_id" == "" ]; then
echo "No API Key found. Configure your own key before running"
exit -1
fi
function upload {
curl --location --request POST 'https://api.imgur.com/3/image' --header "Authorization: Client-ID $client_id" --form "image=$1"
}
#Grab full file path from clipboard if there's an image
file_img=$(osascript -e "POSIX path of (the clipboard as «class furl»)")
ext="${file_img##*.}"
case "$ext" in
png|jpg|jpeg|gif) #If image file is found in clipboard
output=$(upload "@$file_img") 2>/dev/null
;;
heic|HEIC) #HEIC conversion to JPG as Imgur doesnt suppot heic natively
clip_img="$(mktemp).jpg"
magick convert "${file_img}" "${clip_img}"
echo "${clip_img}"
output=$(upload "@$clip_img") 2>/dev/null
;;
*)
# check clipboard via pngpaste
clip_img="$(mktemp).png"
pngpaste "${clip_img}"
output=$(upload "@$clip_img") 2>/dev/null
;;
esac
jobdone=1
#Parse response from Imgur
if echo "$output" | grep -q 'success="0"'; then
echo "From Imgur: Upload Error, try again" >&2
elif echo "$output" | grep -q 'Imgur is over capacity!'; then
echo "From Imgur: Upload Error, try again" >&2
else
url="${output##*\"link\":\"}"
url="${url%%\"\}*}"
delete_hash="${output##*}"
delete_hash="${delete_hash%%*}"
echo -n "$url" | sed 's/\\\//\//g' | pbcopy
jobdone=0
fi
#Error handling is a solid "ehhh" (for now)
if [ "$jobdone" -ne 1 ]; then
echo "Upload Successful, link copied to clipboard"
else
echo "No image/image file found in clipboard, try again."
fi
================================================
FILE: commands/productivity/imgur/imgur-upload-latest-screenshot.template.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Upload Latest Screenshot to Imgur
# @raycast.mode silent
# @raycast.packageName Upload to Imgur
#
# Optional parameters:
# @raycast.icon ☁️
#
# Documentation:
# @raycast.description Upload your last screenshot to Imgur and copy the image link to clipboard
# @raycast.author Fahim Faisal
# @raycast.authorURL https://github.com/i3p9
# Get screenshot location and latest screenshot
DIR=$(defaults read com.apple.screencapture location)
FILE=$(ls -t "$DIR" | head -n 1)
FILELOC="$DIR/$FILE"
#Client ID, use your own client ID. Get it from https://api.imgur.com/oauth2/addclient (Select anonymous usage as auth type)
client_id="" #CAN NOT BE EMPTY
if [ "$client_id" == "" ]; then
echo "No API Key found. Configure your own key before running"
exit -1
fi
function upload {
curl --location --request POST 'https://api.imgur.com/3/image' --header "Authorization: Client-ID $client_id" --form "image=$1"
}
output=$(upload "@$FILELOC") 2>/dev/null
if echo "$output" | grep -q 'success="0"'; then
echo "From Imgur: Upload Error, try again" >&2
else
#grab the image link and delete hash from curl response
url="${output##*\"link\":\"}"
url="${url%%\"\}*}"
delete_hash="${output##*}"
delete_hash="${delete_hash%%*}"
#Copy to clipboard
echo -n "$url" | pbcopy
echo "Link copied to clipboard"
fi
================================================
FILE: commands/productivity/imgur/screenshot-and-imgur.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Screenshot and Imgur
# @raycast.mode silent
# @raycast.packageName Opens Screenshot Interface and Uploads
#
# Optional parameters:
# @raycast.icon 📷
#
# Documentation:
# @raycast.description Opens default screenshot interface and immediately uploads and copies link to clipboard
# @raycast.author Fahim Faisal
# @raycast.authorURL https://github.com/i3p9
#Client ID, use your own client ID. Get it from https://api.imgur.com/oauth2/addclient (Select anonymous usage as auth type)
client_id="" #CAN NOT BE EMPTY
if [ "$client_id" == "" ]; then
echo "No API Key found. Configure your own key before running"
exit -1
fi
function upload {
curl --location --request POST 'https://api.imgur.com/3/image' --header "Authorization: Client-ID $client_id" --form "image=$1"
}
#Opens screenshot interface
screencapture -c -s
#Grabs the screenshot from clipboard into a png file, uploads
clip_img="$(mktemp).png"
pngpaste "${clip_img}"
output=$(upload "@$clip_img") 2>/dev/null
#Parse response from Imgur
if echo "$output" | grep -q 'success="0"'; then
echo "From Imgur: Upload Error, try again" >&2
elif echo "$output" | grep -q 'Imgur is over capacity!'; then
echo "From Imgur: Upload Error, try again" >&2
else
url="${output##*\"link\":\"}"
url="${url%%\"\}*}"
delete_hash="${output##*}"
delete_hash="${delete_hash%%*}"
echo -n "$url" | pbcopy
echo "Screenshotted and Uploaded, Image link copied to clipboard"
fi
================================================
FILE: commands/productivity/macocr/macocr-run-ocr.sh
================================================
#!/bin/bash
# Dependency: This script requires `macOCR` to be installed: https://github.com/schappim/macOCR
# Install via homebrew: `brew install schappim/ocr/ocr`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Run OCR
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName macOCR
# @raycast.icon 📸
# @raycast.argument1 { "type": "text", "placeholder": "Language (default: en-US)", "optional": true }
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
if ! command -v ocr &> /dev/null; then
echo "macOCR has to be installed (https://github.com/schappim/macOCR)";
exit 1;
fi
result=$(ocr -l ${1:-"en-US"})
echo $result | tee >(pbcopy)
================================================
FILE: commands/productivity/pomodoro/pomodoro-start-timer.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Start Timer
# @raycast.mode silent
# Optional parameters:
# @raycast.icon 🍅
# @raycast.argument1 { "type": "text", "placeholder": "Duration", "optional": true }
# @raycast.packageName Pomodoro
# Documentation:
# @raycast.description Start a Pomodoro timer
# @raycast.author Thomas Paul Mann
# @raycast.authorURL https://github.com/thomaspaulmann
FILENAME="pomodoro_timer_end.txt"
if [ -n "$1" ]; then
DURATION_IN_MINUTES="$1"
else
DURATION_IN_MINUTES="20"
fi
NOW=$(date +"%s")
END=$(( $NOW + ($DURATION_IN_MINUTES * 60) ))
echo $END > $FILENAME
echo "Started timer for $DURATION_IN_MINUTES minutes"
================================================
FILE: commands/productivity/pomodoro/pomodoro-status.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Status
# @raycast.mode inline
# Conditional parameters:
# @raycast.refreshTime 30s
# Optional parameters:
# @raycast.icon 🍅
# @raycast.packageName Pomodoro
# Documentation:
# @raycast.description Status of a Pomodoro timer
# @raycast.author Thomas Paul Mann
# @raycast.authorURL https://github.com/thomaspaulmann
FILENAME="pomodoro_timer_end.txt"
if [ -f "$FILENAME" ]; then
END=$(cat $FILENAME)
NOW=$(date +"%s")
TIME_REMAINING_IN_MINUTES=$(( ($END - $NOW) / 60 ))
if [ "$TIME_REMAINING_IN_MINUTES" -lt "-5" ]; then
rm $FILENAME
echo -e "\\033[31mTimer ended\\033[0m"
elif [ "$TIME_REMAINING_IN_MINUTES" -lt "0" ]; then
echo -e "\\033[31mTimer ended\\033[0m"
elif [ "$TIME_REMAINING_IN_MINUTES" -lt "3" ]; then
echo -e "\\033[31m$TIME_REMAINING_IN_MINUTES minutes remaining\\033[0m"
elif [ "$TIME_REMAINING_IN_MINUTES" -lt "10" ]; then
echo -e "\\033[33m$TIME_REMAINING_IN_MINUTES minutes remaining\\033[0m"
else
echo -e "\\033[32m$TIME_REMAINING_IN_MINUTES minutes remaining\\033[0m"
fi
else
echo "No active timer"
fi
================================================
FILE: commands/productivity/pomodoro/pomodoro-stop-timer.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Stop Timer
# @raycast.mode silent
# Optional parameters:
# @raycast.icon 🍅
# @raycast.packageName Pomodoro
# Documentation:
# @raycast.description Stop active Pomodoro timer
# @raycast.author Thomas Paul Mann
# @raycast.authorURL https://github.com/thomaspaulmann
FILENAME="pomodoro_timer_end.txt"
rm $FILENAME
echo "Stopped timer"
================================================
FILE: commands/productivity/qpdf/compress-pdf-qpdf.sh
================================================
#!/bin/bash
# Dependency: This script requires `qpdf` installed: https://github.com/qpdf/qpdf
# Install via homebrew: `brew install qpdf`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Compress PDF
# @raycast.mode compact
# @raycast.packageName QPDF
# Optional parameters:
# @raycast.icon 🗜️
# @raycast.argument1 { "type": "text", "placeholder": "Quality (0-100, default: 50)", "optional": true }
# Documentation:
# @raycast.description Compress selected PDF files. Note: This script requires 'qpdf' to be installed via Homebrew.
# @raycast.author Nicklas Jakobsen
# @raycast.authorURL https://github.com/nicklasjm
# Configuration
QUALITY="${1:-50}"
export PATH="/opt/homebrew/bin:/usr/local/bin:$PATH"
# Check for qpdf dependency
if ! command -v qpdf &> /dev/null; then
echo "Error: qpdf is not installed."
echo "Run 'brew install qpdf' in Terminal."
exit 1
fi
# Get files via AppleScript
SELECTED_FILES=$(osascript < /dev/stderr
exit 1
fi
NOW=$(date +"%s")
START=$(<"$TMPDIR/raycast-stopwatch-start.txt")
DIFF=$((NOW - START))
if [ $DIFF -lt 60 ]; then
printf '%02ds' $((DIFF%60))
elif [ $DIFF -lt 3600 ]; then
printf '%02dm:%02ds' $((DIFF%3600/60)) $((DIFF%60))
else
printf '%02dh:%02dm:%02ds' $((DIFF/3600)) $((DIFF%3600/60)) $((DIFF%60))
fi
================================================
FILE: commands/productivity/stopwatch/stopwatch-start.sh
================================================
#!/usr/bin/env bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Start Stopwatch
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ⏱
# @raycast.packageName stopwatch
# Documentation:
# @raycast.description Start a stopwatch
# @raycast.author Achille Lacoin
# @raycast.authorURL https://github.com/pomdtr
if [ -f "$TMPDIR/raycast-stopwatch-start.txt" ]; then
echo "A stopwatch already exists!" > /dev/stderr
exit 1
fi
date +"%s" > "$TMPDIR/raycast-stopwatch-start.txt"
echo "Stopwatch started!"
================================================
FILE: commands/productivity/stopwatch/stopwatch-stop.sh
================================================
#!/usr/bin/env bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Stop Stopwatch
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ⏱
# @raycast.packageName stopwatch
# Documentation:
# @raycast.description Stop active stopwatch, copy total time
# @raycast.author Achille Lacoin
# @raycast.authorURL https://github.com/pomdtr
set -e
PROGRESS=$(./stopwatch-progress.sh)
rm "$TMPDIR/raycast-stopwatch-start.txt"
pbcopy <<< "$PROGRESS"
echo "FINAL TIME -> $PROGRESS"
================================================
FILE: commands/productivity/tesseract/tesseract-ocr.sh
================================================
#!/bin/bash
# Dependency: This script requires the `tesseract` cli to be installed: https://github.com/tesseract-ocr/tesseract
# Install via homebrew: `brew install tesseract`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title OCR Screenshot
# @raycast.mode silent
# Optional parameters:
# @raycast.icon 🔍
# @raycast.argument1 { "type": "text", "placeholder": "Language", "optional": true }
# @raycast.packageName tesseract
# Documentation:
# @raycast.description Tesseract OCR
# @raycast.author Diego Lopes
# @raycast.authorURL https://github.com/Dihgg
if ! command -v tesseract &> /dev/null; then
echo "tesseract command is required (https://github.com/tesseract-ocr/tesseract)"
exit 1;
fi
TEMP_FILE=$(mktemp)
screencapture -i "$TEMP_FILE"
LANG=${1:-eng}
tesseract "$TEMP_FILE" stdout -l $LANG | LANG=en_US.UTF-8 pbcopy
echo "Gathered text copied to clipboard"
================================================
FILE: commands/productivity/writing/dictionary-lookup.swift
================================================
#!/usr/bin/swift
// Required parameters:
// @raycast.schemaVersion 1
// @raycast.title Dictionary Lookup
// @raycast.mode compact
// Optional parameters:
// @raycast.icon 📖
// @raycast.packageName Writing
// @raycast.argument1 { "type": "text", "placeholder": "word or phrase" }
// Documentation:
// @raycast.description Directly use macOS Dictionary
// @raycast.author Alessandra Pereyra
// @raycast.authorURL https://github.com/alessandrapereyra
import Cocoa
import CoreServices.DictionaryServices
func translate(_ text: String) -> String? {
let nsstring = text as NSString
let cfrange = CFRange(location: 0, length: nsstring.length)
guard let definition = DCSCopyTextDefinition(nil, nsstring, cfrange) else {
return nil
}
var foundDefinitions = String(definition.takeRetainedValue()).components(separatedBy: "\n")
if foundDefinitions.count > 1 {
foundDefinitions.removeFirst()
foundDefinitions.removeFirst()
foundDefinitions.removeLast()
}
return foundDefinitions.joined(separator: " • ")
}
let text = CommandLine.arguments[1]
let definition = translate(text) ?? "No definition found for \"\(text)\""
print(definition)
================================================
FILE: commands/productivity/writing/word-count.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Word Count
# @raycast.mode inline
# @raycast.refreshTime 15s
# Optional parameters:
# @raycast.icon 🤖
# @raycast.packageName Writing
# Documentation:
# @raycast.description Counts the number of words of the text in the clipboard
# @raycast.author Benny Wong
# @raycast.authorURL https://bwong.net
pbpaste | wc | awk '{print "Words: " $2 ", Lines: " $1 ", Characters: ", $3}'
================================================
FILE: commands/remote-control/ddc/arm64/screen-dp.sh
================================================
#!/bin/bash
# Dependency: This script requires `m1ddc` cli installed: https://github.com/waydabber/m1ddc
# Install via github: `https://github.com/waydabber/m1ddc`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Switch to DP
# @raycast.mode compact
# Optional parameters:
# @raycast.icon 📺
# @raycast.author goodhyun
# @raycast.packageName External Display
# @raycast.description This script will switch the external display screen to DP.
if ! command -v m1ddc &> /dev/null; then
echo "m1ddc command is required (https://github.com/waydabber/m1ddc).";
exit 1;
fi
m1ddc set input 15
================================================
FILE: commands/remote-control/ddc/arm64/screen-hdmi.sh
================================================
#!/bin/bash
# Dependency: This script requires `m1ddc` cli installed: https://github.com/waydabber/m1ddc
# Install via github: `https://github.com/waydabber/m1ddc`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Switch to HDMI
# @raycast.mode compact
# Optional parameters:
# @raycast.icon 📺
# @raycast.author goodhyun
# @raycast.packageName External Display
# @raycast.description This script will switch the external display screen to HDMI.
if ! command -v m1ddc &> /dev/null; then
echo "m1ddc command is required (https://github.com/waydabber/m1ddc).";
exit 1;
fi
m1ddc set input 17
================================================
FILE: commands/remote-control/ddc/x86/screen-dp.sh
================================================
#!/bin/bash
# Dependency: This script requires `ddcctl` cli installed: https://github.com/kfix/ddcctl
# Install via homebrew: `brew install ddcctl`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Switch to DP
# @raycast.mode compact
# Optional parameters:
# @raycast.icon 📺
# @raycast.author goodhyun
# @raycast.packageName External Display
# @raycast.description This script will switch the external display screen to DP.
if ! command -v ddcctl &> /dev/null; then
echo "ddcctl command is required (https://github.com/kfix/ddcctl).";
exit 1;
fi
ddcctl -d 1 -i 15
================================================
FILE: commands/remote-control/ddc/x86/screen-hdmi.sh
================================================
#!/bin/bash
# Dependency: This script requires `ddcctl` cli installed: https://github.com/kfix/ddcctl
# Install via homebrew: `brew install ddcctl`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Switch to HDMI
# @raycast.mode compact
# Optional parameters:
# @raycast.icon 📺
# @raycast.author goodhyun
# @raycast.packageName External Display
# @raycast.description This script will switch the external display screen to HDMI.
if ! command -v ddcctl &> /dev/null; then
echo "ddcctl command is required (https://github.com/kfix/ddcctl).";
exit 1;
fi
ddcctl -d 1 -i 17
================================================
FILE: commands/remote-control/denon-avr/configure.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Configure
# @raycast.mode compact
# Optional parameters:
# @raycast.icon images/denon_logo.png
# @raycast.argument1 { "type": "text", "placeholder": "Denon AVR IP" }
# @raycast.argument2 { "type": "text", "placeholder": "Method (Classic or Modern)" }
# @raycast.packageName Denon AVR
# Documentation:
# @raycast.description Helperscript to configure Denon AVR Script Commands
# @raycast.author Rediwed
# @raycast.authorURL github.com/Rediwed
on run argv
try
checkAlive(item 1 of argv)
writeIP(item 1 of argv)
setMethod(item 2 of argv)
log "Configuration success!"
on error err_msg
tell me to error "An error has occured: " & err_msg
end try
end run
on checkAlive(ip_address)
try
do shell script "ping -c 1 " & ip_address
on error
tell me to error "Ip-address " & ip_address & " is incorrect, please adjust"
end try
end checkAlive
on writeIP(ip_address)
do shell script "defaults write com.Rediwed.DenonAVR ip_address " & ip_address
return
end writeIP
on setMethod(Method)
set Method to (do shell script "echo " & (quoted form of Method) & " | tr '[:upper:]' '[:lower:]'")
do shell script "defaults write com.Rediwed.DenonAVR method " & Method
end setMethod
================================================
FILE: commands/remote-control/denon-avr/power-off.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Power Off
# @raycast.mode compact
# Optional parameters:
# @raycast.icon images/denon_logo.png
# @raycast.packageName Denon AVR
# Documentation:
# @raycast.description Powers off a modern Denon AVR if it is currently powered on
# @raycast.author Rediwed
# @raycast.authorURL github.com/Rediwed
on run
set ip_address to (do shell script "defaults read com.Rediwed.DenonAVR ip_address")
if (do shell script "defaults read com.Rediwed.DenonAVR method") = "modern" then
runModern(ip_address)
else
runClassic(ip_address)
end if
end run
on runModern(ip_address)
do shell script "curl " & ip_address & ":8080/goform/formiPhoneAppDirect.xml?PWSTANDBY"
log "Powering on..."
end runModern
on runClassic(ip_address)
#classic is not yet set-up
#do shell script "curl 192.168.0.214:8080//goform/formiPhoneAppDirect.xml?MV" & (item 1 of argv)
log "Classic has not yet been set-up"
end runClassic
================================================
FILE: commands/remote-control/denon-avr/power-on.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Power On
# @raycast.mode compact
# Optional parameters:
# @raycast.icon images/denon_logo.png
# @raycast.packageName Denon AVR
# Documentation:
# @raycast.description Powers on a modern Denon AVR if it is currently powered off
# @raycast.author Rediwed
# @raycast.authorURL github.com/Rediwed
on run
set ip_address to (do shell script "defaults read com.Rediwed.DenonAVR ip_address")
if (do shell script "defaults read com.Rediwed.DenonAVR method") = "modern" then
runModern(ip_address)
else
runClassic(ip_address)
end if
end run
on runModern(ip_address)
do shell script "curl " & ip_address & ":8080/goform/formiPhoneAppDirect.xml?PWON"
log "Powering on..."
end runModern
on runClassic(ip_address)
#classic is not yet set-up
#do shell script "curl 192.168.0.214:8080//goform/formiPhoneAppDirect.xml?MV" & (item 1 of argv)
log "Classic has not yet been set-up"
end runClassic
================================================
FILE: commands/remote-control/denon-avr/set-volume.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Set Volume
# @raycast.mode compact
# Optional parameters:
# @raycast.icon images/denon_logo.png
# @raycast.argument1 { "type": "text", "placeholder": "Placeholder" }
# @raycast.packageName Denon AVR
# Documentation:
# @raycast.description Sets the Denon AVR to a specific volume level (between 0 and 80)
# @raycast.author Rediwed
# @raycast.authorURL github.com/Rediwed
on run argv
if 0 (item 1 of argv) and (item 1 of argv) 80 then
set ip_address to (do shell script "defaults read com.Rediwed.DenonAVR ip_address")
if (do shell script "defaults read com.Rediwed.DenonAVR method") = "modern" then
runModern(ip_address, item 1 of argv)
else
runClassic(ip_address, item 1 of argv)
end if
else
log "Command not executed, illegal volume!"
end if
end run
on runModern(ip_address, volume_level)
do shell script "curl " & ip_address & ":8080//goform/formiPhoneAppDirect.xml?MV" & (volume_level)
log "Volume set to " & volume_level & "!"
end runModern
on runClassic(ip_address, volume_level)
#classic is not yet set-up
#do shell script "curl 192.168.0.214:8080//goform/formiPhoneAppDirect.xml?MV" & (item 1 of argv)
log "Classic has not yet been set-up"
end runClassic
================================================
FILE: commands/remote-control/denon-avr/volume-down.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Volume Down
# @raycast.mode compact
# Optional parameters:
# @raycast.icon images/denon_logo.png
# @raycast.packageName Denon AVR
# Documentation:
# @raycast.description Decreases the volume of your Denon AVR by one unit
# @raycast.author Rediwed
# @raycast.authorURL github.com/Rediwed
on run
set ip_address to (do shell script "defaults read com.Rediwed.DenonAVR ip_address")
if (do shell script "defaults read com.Rediwed.DenonAVR method") = "modern" then
runModern(ip_address)
else
runClassic(ip_address)
end if
end run
on runModern(ip_address)
do shell script "curl " & ip_address & ":8080/goform/formiPhoneAppDirect.xml?MVDOWN"
log "Volume decreased!"
end runModern
on runClassic(ip_address)
#classic is not yet set-up
#do shell script "curl 192.168.0.214:8080//goform/formiPhoneAppDirect.xml?MV" & (item 1 of argv)
log "Classic has not yet been set-up"
end runClassic
================================================
FILE: commands/remote-control/denon-avr/volume-up.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Volume Up
# @raycast.mode compact
# Optional parameters:
# @raycast.icon images/denon_logo.png
# @raycast.packageName Denon AVR
# Documentation:
# @raycast.description Increases the volume of your Denon AVR by one unit
# @raycast.author Rediwed
# @raycast.authorURL github.com/Rediwed
on run
set ip_address to (do shell script "defaults read com.Rediwed.DenonAVR ip_address")
if (do shell script "defaults read com.Rediwed.DenonAVR method") = "modern" then
runModern(ip_address)
else
runClassic(ip_address)
end if
end run
on runModern(ip_address)
do shell script "curl " & ip_address & ":8080/goform/formiPhoneAppDirect.xml?MVUP"
log "Volume increased!"
end runModern
on runClassic(ip_address)
#classic is not yet set-up
#do shell script "curl 192.168.0.214:8080//goform/formiPhoneAppDirect.xml?MV" & (item 1 of argv)
log "Classic has not yet been set-up"
end runClassic
================================================
FILE: commands/remote-control/lg-tv/README.md
================================================
## LG TV (powered by [LGWebOSRemote](https://github.com/klattimer/LGWebOSRemote))

Manage your LG TV with the collection of scripts that execute the [LGWebOSRemote commands](https://github.com/klattimer/LGWebOSRemote) via [Raycast](http://raycast.com).
### Initial setup
0. (Optional) Assign a static IP address to the TV.
> This step is optional, but highly recommended to avoid re-authentication when the IP changes. The instruction depends on the router model, but the phrase you are looking for is `DHCP`:
>
> - Asus: https://www.asus.com/support/FAQ/114068/
> - TP-Link: https://www.tp-link.com/us/support/faq/560/
> - etc.
1. Install the `LGWebOSRemote` library system-wide.
> The recommended way is to use **[pipx](https://github.com/pypa/pipx)**:
>
> `pipx install git+https://github.com/klattimer/LGWebOSRemote`
2. Run the `Scan` command.
> Remember the TV has to be turned on.
3. Copy the TV IP address from the output.
```python
{"result": "ok", "count": 1, "list": [{"uuid": "some-long-id", "model": "OLED55C11LB", "address": "192.168.1.200"}]}
```
4. Run the `Authenticate` command with the obtained IP.
> Remember the TV has to be turned on and you have to accept the connection on the TV.
5. Voilà, now you can control the TV!
### Available scripts
All the scripts with their descriptions can be found [here](https://github.com/raycast/script-commands/tree/master/commands#lg-tv).
### Known issues
- Commands' outputs are quite messy, e.g. always include `DEBUG` messages (bug in the library).
- Only one TV configuration at a time is supported (bug in the library).
- `Execute Command` command doesn't work (bug in the library).
- `Send Notification With Icon` command doesn't work (bug in the library).
- `Open Youtube (URL)` and `Open Youtube (ID)` commands don't seem to work (but try them yourself).
- `Show Config` command runs forever - you have to cancel the process with `Control+C` (bug in the library).
- Commands are not documented, so some of them are not obvious to use, e.g. `Open App With Payload`.
**If you find out any more issues related to the library, not the Raycast scripts, please report them in [the LGWebOSRemote repository](https://github.com/klattimer/LGWebOSRemote) or... just contribute to the library by fixing them 🙂**
================================================
FILE: commands/remote-control/lg-tv/authenticate.sh
================================================
#!/usr/bin/env bash
# Dependencies:
# LGWebOSRemote: https://github.com/klattimer/LGWebOSRemote
# Recommended installation:
# Use pipx (https://github.com/pypa/pipx) to install the package system-wide:
# pipx install git+https://github.com/klattimer/LGWebOSRemote
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Authenticate
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName LG TV
# @raycast.icon images/lg.png
# @raycast.argument1 { "type": "text", "placeholder": "TV IP Address" }
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Authenticate the library. The TV has to be turned on. You have to provide the IP address of the TV and accept the connection on the TV.
# Modified PATH to include pipx-installed packages. If you used a different installation method, adjust the variable properly to make the 'lgtv' package detectable.
PATH="$HOME/.local/bin:$PATH"
lgtv auth $1 tv
================================================
FILE: commands/remote-control/lg-tv/change-channel.sh
================================================
#!/usr/bin/env bash
# Dependencies:
# LGWebOSRemote: https://github.com/klattimer/LGWebOSRemote
# Recommended installation:
# Use pipx (https://github.com/pypa/pipx) to install the package system-wide:
# pipx install git+https://github.com/klattimer/LGWebOSRemote
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Change Channel
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName LG TV
# @raycast.icon images/lg.png
# @raycast.argument1 { "type": "text", "placeholder": "Channel ID" }
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Change the TV channel by its ID.
# Modified PATH to include pipx-installed packages. If you used a different installation method, adjust the variable properly to make the 'lgtv' package detectable.
PATH="$HOME/.local/bin:$PATH"
lgtv tv setTVChannel $1
================================================
FILE: commands/remote-control/lg-tv/change-input.sh
================================================
#!/usr/bin/env bash
# Dependencies:
# LGWebOSRemote: https://github.com/klattimer/LGWebOSRemote
# Recommended installation:
# Use pipx (https://github.com/pypa/pipx) to install the package system-wide:
# pipx install git+https://github.com/klattimer/LGWebOSRemote
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Change Input
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName LG TV
# @raycast.icon images/lg.png
# @raycast.argument1 { "type": "text", "placeholder": "Input ID" }
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Change the input by its ID.
# Modified PATH to include pipx-installed packages. If you used a different installation method, adjust the variable properly to make the 'lgtv' package detectable.
PATH="$HOME/.local/bin:$PATH"
lgtv tv setInput $1
================================================
FILE: commands/remote-control/lg-tv/change-sound-output.sh
================================================
#!/usr/bin/env bash
# Dependencies:
# LGWebOSRemote: https://github.com/klattimer/LGWebOSRemote
# Recommended installation:
# Use pipx (https://github.com/pypa/pipx) to install the package system-wide:
# pipx install git+https://github.com/klattimer/LGWebOSRemote
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Change Sound Output
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName LG TV
# @raycast.icon images/lg.png
# @raycast.argument1 { "type": "text", "placeholder": "Output Type" }
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Change the sound output. Possible "Output Type" values: tv_speaker | external_optical | external_arc | external_speaker | lineout | headphone | tv_external_speaker | tv_speaker_headphone | bt_soundbar.
# Modified PATH to include pipx-installed packages. If you used a different installation method, adjust the variable properly to make the 'lgtv' package detectable.
PATH="$HOME/.local/bin:$PATH"
lgtv tv setSoundOutput $1
================================================
FILE: commands/remote-control/lg-tv/change-volume.sh
================================================
#!/usr/bin/env bash
# Dependencies:
# LGWebOSRemote: https://github.com/klattimer/LGWebOSRemote
# Recommended installation:
# Use pipx (https://github.com/pypa/pipx) to install the package system-wide:
# pipx install git+https://github.com/klattimer/LGWebOSRemote
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Change Volume
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName LG TV
# @raycast.icon images/lg.png
# @raycast.argument1 { "type": "text", "placeholder": "Volume Level" }
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Change the volume level.
# Modified PATH to include pipx-installed packages. If you used a different installation method, adjust the variable properly to make the 'lgtv' package detectable.
PATH="$HOME/.local/bin:$PATH"
lgtv tv setVolume $1
================================================
FILE: commands/remote-control/lg-tv/close-app.sh
================================================
#!/usr/bin/env bash
# Dependencies:
# LGWebOSRemote: https://github.com/klattimer/LGWebOSRemote
# Recommended installation:
# Use pipx (https://github.com/pypa/pipx) to install the package system-wide:
# pipx install git+https://github.com/klattimer/LGWebOSRemote
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Close App
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName LG TV
# @raycast.icon images/lg.png
# @raycast.argument1 { "type": "text", "placeholder": "App ID" }
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Close the application by its ID.
# Modified PATH to include pipx-installed packages. If you used a different installation method, adjust the variable properly to make the 'lgtv' package detectable.
PATH="$HOME/.local/bin:$PATH"
lgtv tv closeApp $1
================================================
FILE: commands/remote-control/lg-tv/execute-command.sh
================================================
#!/usr/bin/env bash
# Dependencies:
# LGWebOSRemote: https://github.com/klattimer/LGWebOSRemote
# Recommended installation:
# Use pipx (https://github.com/pypa/pipx) to install the package system-wide:
# pipx install git+https://github.com/klattimer/LGWebOSRemote
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Execute Command
# @raycast.mode fullOutput
# Optional parameters:
# @raycast.packageName LG TV
# @raycast.icon images/lg.png
# @raycast.argument1 { "type": "text", "placeholder": "Command" }
# @raycast.argument2 { "type": "text", "placeholder": "Arguments" }
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Execute the given command on TV.
# Modified PATH to include pipx-installed packages. If you used a different installation method, adjust the variable properly to make the 'lgtv' package detectable.
PATH="$HOME/.local/bin:$PATH"
lgtv tv execute $1 $2
================================================
FILE: commands/remote-control/lg-tv/fast-forward-media.sh
================================================
#!/usr/bin/env bash
# Dependencies:
# LGWebOSRemote: https://github.com/klattimer/LGWebOSRemote
# Recommended installation:
# Use pipx (https://github.com/pypa/pipx) to install the package system-wide:
# pipx install git+https://github.com/klattimer/LGWebOSRemote
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Fast Forward Media
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName LG TV
# @raycast.icon images/lg.png
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Fast forward the media.
# Modified PATH to include pipx-installed packages. If you used a different installation method, adjust the variable properly to make the 'lgtv' package detectable.
PATH="$HOME/.local/bin:$PATH"
lgtv tv inputMediaFastForward
================================================
FILE: commands/remote-control/lg-tv/list-apps.sh
================================================
#!/usr/bin/env bash
# Dependencies:
# LGWebOSRemote: https://github.com/klattimer/LGWebOSRemote
# Recommended installation:
# Use pipx (https://github.com/pypa/pipx) to install the package system-wide:
# pipx install git+https://github.com/klattimer/LGWebOSRemote
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title List Apps
# @raycast.mode fullOutput
# Optional parameters:
# @raycast.packageName LG TV
# @raycast.icon images/lg.png
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Show the list of applications.
# Modified PATH to include pipx-installed packages. If you used a different installation method, adjust the variable properly to make the 'lgtv' package detectable.
PATH="$HOME/.local/bin:$PATH"
lgtv tv listApps
================================================
FILE: commands/remote-control/lg-tv/list-channels.sh
================================================
#!/usr/bin/env bash
# Dependencies:
# LGWebOSRemote: https://github.com/klattimer/LGWebOSRemote
# Recommended installation:
# Use pipx (https://github.com/pypa/pipx) to install the package system-wide:
# pipx install git+https://github.com/klattimer/LGWebOSRemote
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title List Channels
# @raycast.mode fullOutput
# Optional parameters:
# @raycast.packageName LG TV
# @raycast.icon images/lg.png
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Show the list of TV channels.
# Modified PATH to include pipx-installed packages. If you used a different installation method, adjust the variable properly to make the 'lgtv' package detectable.
PATH="$HOME/.local/bin:$PATH"
lgtv tv listChannels
================================================
FILE: commands/remote-control/lg-tv/list-inputs.sh
================================================
#!/usr/bin/env bash
# Dependencies:
# LGWebOSRemote: https://github.com/klattimer/LGWebOSRemote
# Recommended installation:
# Use pipx (https://github.com/pypa/pipx) to install the package system-wide:
# pipx install git+https://github.com/klattimer/LGWebOSRemote
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title List Inputs
# @raycast.mode fullOutput
# Optional parameters:
# @raycast.packageName LG TV
# @raycast.icon images/lg.png
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Show the list of inputs.
# Modified PATH to include pipx-installed packages. If you used a different installation method, adjust the variable properly to make the 'lgtv' package detectable.
PATH="$HOME/.local/bin:$PATH"
lgtv tv listInputs
================================================
FILE: commands/remote-control/lg-tv/list-launch-points.sh
================================================
#!/usr/bin/env bash
# Dependencies:
# LGWebOSRemote: https://github.com/klattimer/LGWebOSRemote
# Recommended installation:
# Use pipx (https://github.com/pypa/pipx) to install the package system-wide:
# pipx install git+https://github.com/klattimer/LGWebOSRemote
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title List Launch Points
# @raycast.mode fullOutput
# Optional parameters:
# @raycast.packageName LG TV
# @raycast.icon images/lg.png
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Show the list of launch points.
# Modified PATH to include pipx-installed packages. If you used a different installation method, adjust the variable properly to make the 'lgtv' package detectable.
PATH="$HOME/.local/bin:$PATH"
lgtv tv listLaunchPoints
================================================
FILE: commands/remote-control/lg-tv/list-services.sh
================================================
#!/usr/bin/env bash
# Dependencies:
# LGWebOSRemote: https://github.com/klattimer/LGWebOSRemote
# Recommended installation:
# Use pipx (https://github.com/pypa/pipx) to install the package system-wide:
# pipx install git+https://github.com/klattimer/LGWebOSRemote
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title List Services
# @raycast.mode fullOutput
# Optional parameters:
# @raycast.packageName LG TV
# @raycast.icon images/lg.png
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Show the list of services.
# Modified PATH to include pipx-installed packages. If you used a different installation method, adjust the variable properly to make the 'lgtv' package detectable.
PATH="$HOME/.local/bin:$PATH"
lgtv tv listServices
================================================
FILE: commands/remote-control/lg-tv/mute.sh
================================================
#!/usr/bin/env bash
# Dependencies:
# LGWebOSRemote: https://github.com/klattimer/LGWebOSRemote
# Recommended installation:
# Use pipx (https://github.com/pypa/pipx) to install the package system-wide:
# pipx install git+https://github.com/klattimer/LGWebOSRemote
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Mute
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName LG TV
# @raycast.icon images/lg.png
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Mute the TV.
# Modified PATH to include pipx-installed packages. If you used a different installation method, adjust the variable properly to make the 'lgtv' package detectable.
PATH="$HOME/.local/bin:$PATH"
lgtv tv mute true
================================================
FILE: commands/remote-control/lg-tv/open-app-with-payload.sh
================================================
#!/usr/bin/env bash
# Dependencies:
# LGWebOSRemote: https://github.com/klattimer/LGWebOSRemote
# Recommended installation:
# Use pipx (https://github.com/pypa/pipx) to install the package system-wide:
# pipx install git+https://github.com/klattimer/LGWebOSRemote
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open App With Payload
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName LG TV
# @raycast.icon images/lg.png
# @raycast.argument1 { "type": "text", "placeholder": "Payload" }
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Open the application with the given payload.
# Modified PATH to include pipx-installed packages. If you used a different installation method, adjust the variable properly to make the 'lgtv' package detectable.
PATH="$HOME/.local/bin:$PATH"
lgtv tv openAppWithPayload $1
================================================
FILE: commands/remote-control/lg-tv/open-app.sh
================================================
#!/usr/bin/env bash
# Dependencies:
# LGWebOSRemote: https://github.com/klattimer/LGWebOSRemote
# Recommended installation:
# Use pipx (https://github.com/pypa/pipx) to install the package system-wide:
# pipx install git+https://github.com/klattimer/LGWebOSRemote
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open App
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName LG TV
# @raycast.icon images/lg.png
# @raycast.argument1 { "type": "text", "placeholder": "App ID" }
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Open the application by its ID.
# Modified PATH to include pipx-installed packages. If you used a different installation method, adjust the variable properly to make the 'lgtv' package detectable.
PATH="$HOME/.local/bin:$PATH"
lgtv tv startApp $1
================================================
FILE: commands/remote-control/lg-tv/open-browser.sh
================================================
#!/usr/bin/env bash
# Dependencies:
# LGWebOSRemote: https://github.com/klattimer/LGWebOSRemote
# Recommended installation:
# Use pipx (https://github.com/pypa/pipx) to install the package system-wide:
# pipx install git+https://github.com/klattimer/LGWebOSRemote
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open Browser
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName LG TV
# @raycast.icon images/lg.png
# @raycast.argument1 { "type": "text", "placeholder": "Page URL" }
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Open the browser with the given URL. The URL has to start with "http://" or "https://" prefix.
# Modified PATH to include pipx-installed packages. If you used a different installation method, adjust the variable properly to make the 'lgtv' package detectable.
PATH="$HOME/.local/bin:$PATH"
lgtv tv openBrowserAt $1
================================================
FILE: commands/remote-control/lg-tv/open-youtube-id.sh
================================================
#!/usr/bin/env bash
# Dependencies:
# LGWebOSRemote: https://github.com/klattimer/LGWebOSRemote
# Recommended installation:
# Use pipx (https://github.com/pypa/pipx) to install the package system-wide:
# pipx install git+https://github.com/klattimer/LGWebOSRemote
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open Youtube (ID)
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName LG TV
# @raycast.icon images/lg.png
# @raycast.argument1 { "type": "text", "placeholder": "Video ID" }
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Open Youtube with the given video ID.
# Modified PATH to include pipx-installed packages. If you used a different installation method, adjust the variable properly to make the 'lgtv' package detectable.
PATH="$HOME/.local/bin:$PATH"
lgtv tv openYoutubeId $1
================================================
FILE: commands/remote-control/lg-tv/open-youtube-url.sh
================================================
#!/usr/bin/env bash
# Dependencies:
# LGWebOSRemote: https://github.com/klattimer/LGWebOSRemote
# Recommended installation:
# Use pipx (https://github.com/pypa/pipx) to install the package system-wide:
# pipx install git+https://github.com/klattimer/LGWebOSRemote
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open Youtube (URL)
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName LG TV
# @raycast.icon images/lg.png
# @raycast.argument1 { "type": "text", "placeholder": "Video URL" }
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Open Youtube with the given video URL. The URL has to start with "http://" or "https://" prefix.
# Modified PATH to include pipx-installed packages. If you used a different installation method, adjust the variable properly to make the 'lgtv' package detectable.
PATH="$HOME/.local/bin:$PATH"
lgtv tv openYoutubeURL $1
================================================
FILE: commands/remote-control/lg-tv/pause-media.sh
================================================
#!/usr/bin/env bash
# Dependencies:
# LGWebOSRemote: https://github.com/klattimer/LGWebOSRemote
# Recommended installation:
# Use pipx (https://github.com/pypa/pipx) to install the package system-wide:
# pipx install git+https://github.com/klattimer/LGWebOSRemote
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Pause Media
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName LG TV
# @raycast.icon images/lg.png
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Pause the media.
# Modified PATH to include pipx-installed packages. If you used a different installation method, adjust the variable properly to make the 'lgtv' package detectable.
PATH="$HOME/.local/bin:$PATH"
lgtv tv inputMediaPause
================================================
FILE: commands/remote-control/lg-tv/play-media.sh
================================================
#!/usr/bin/env bash
# Dependencies:
# LGWebOSRemote: https://github.com/klattimer/LGWebOSRemote
# Recommended installation:
# Use pipx (https://github.com/pypa/pipx) to install the package system-wide:
# pipx install git+https://github.com/klattimer/LGWebOSRemote
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Play Media
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName LG TV
# @raycast.icon images/lg.png
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Play the media.
# Modified PATH to include pipx-installed packages. If you used a different installation method, adjust the variable properly to make the 'lgtv' package detectable.
PATH="$HOME/.local/bin:$PATH"
lgtv tv inputMediaPlay
================================================
FILE: commands/remote-control/lg-tv/rewind-media.sh
================================================
#!/usr/bin/env bash
# Dependencies:
# LGWebOSRemote: https://github.com/klattimer/LGWebOSRemote
# Recommended installation:
# Use pipx (https://github.com/pypa/pipx) to install the package system-wide:
# pipx install git+https://github.com/klattimer/LGWebOSRemote
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Rewind Media
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName LG TV
# @raycast.icon images/lg.png
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Rewind the media.
# Modified PATH to include pipx-installed packages. If you used a different installation method, adjust the variable properly to make the 'lgtv' package detectable.
PATH="$HOME/.local/bin:$PATH"
lgtv tv inputMediaRewind
================================================
FILE: commands/remote-control/lg-tv/scan.sh
================================================
#!/usr/bin/env bash
# Dependencies:
# LGWebOSRemote: https://github.com/klattimer/LGWebOSRemote
# Recommended installation:
# Use pipx (https://github.com/pypa/pipx) to install the package system-wide:
# pipx install git+https://github.com/klattimer/LGWebOSRemote
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Scan
# @raycast.mode fullOutput
# Optional parameters:
# @raycast.packageName LG TV
# @raycast.icon images/lg.png
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Scan to find the TV. The TV has to be turned on.
# Modified PATH to include pipx-installed packages. If you used a different installation method, adjust the variable properly to make the 'lgtv' package detectable.
PATH="$HOME/.local/bin:$PATH"
lgtv scan
================================================
FILE: commands/remote-control/lg-tv/send-notification-with-icon.sh
================================================
#!/usr/bin/env bash
# Dependencies:
# LGWebOSRemote: https://github.com/klattimer/LGWebOSRemote
# Recommended installation:
# Use pipx (https://github.com/pypa/pipx) to install the package system-wide:
# pipx install git+https://github.com/klattimer/LGWebOSRemote
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Send Notification With Icon
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName LG TV
# @raycast.icon images/lg.png
# @raycast.argument1 { "type": "text", "placeholder": "Message" }
# @raycast.argument2 { "type": "text", "placeholder": "Icon Path / URL" }
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Send the notification with the icon and show it on the TV.
# Modified PATH to include pipx-installed packages. If you used a different installation method, adjust the variable properly to make the 'lgtv' package detectable.
PATH="$HOME/.local/bin:$PATH"
lgtv tv notificationWithIcon $1 $2
================================================
FILE: commands/remote-control/lg-tv/send-notification.sh
================================================
#!/usr/bin/env bash
# Dependencies:
# LGWebOSRemote: https://github.com/klattimer/LGWebOSRemote
# Recommended installation:
# Use pipx (https://github.com/pypa/pipx) to install the package system-wide:
# pipx install git+https://github.com/klattimer/LGWebOSRemote
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Send Notification
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName LG TV
# @raycast.icon images/lg.png
# @raycast.argument1 { "type": "text", "placeholder": "Message" }
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Send the notification and show it on the TV.
# Modified PATH to include pipx-installed packages. If you used a different installation method, adjust the variable properly to make the 'lgtv' package detectable.
PATH="$HOME/.local/bin:$PATH"
lgtv tv notification $1
================================================
FILE: commands/remote-control/lg-tv/show-audio-status.sh
================================================
#!/usr/bin/env bash
# Dependencies:
# LGWebOSRemote: https://github.com/klattimer/LGWebOSRemote
# Recommended installation:
# Use pipx (https://github.com/pypa/pipx) to install the package system-wide:
# pipx install git+https://github.com/klattimer/LGWebOSRemote
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Show Audio Status
# @raycast.mode fullOutput
# Optional parameters:
# @raycast.packageName LG TV
# @raycast.icon images/lg.png
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Show the audio status.
# Modified PATH to include pipx-installed packages. If you used a different installation method, adjust the variable properly to make the 'lgtv' package detectable.
PATH="$HOME/.local/bin:$PATH"
lgtv tv audioStatus
================================================
FILE: commands/remote-control/lg-tv/show-audio-volume.sh
================================================
#!/usr/bin/env bash
# Dependencies:
# LGWebOSRemote: https://github.com/klattimer/LGWebOSRemote
# Recommended installation:
# Use pipx (https://github.com/pypa/pipx) to install the package system-wide:
# pipx install git+https://github.com/klattimer/LGWebOSRemote
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Show Audio Volume
# @raycast.mode fullOutput
# Optional parameters:
# @raycast.packageName LG TV
# @raycast.icon images/lg.png
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Show the audio volume.
# Modified PATH to include pipx-installed packages. If you used a different installation method, adjust the variable properly to make the 'lgtv' package detectable.
PATH="$HOME/.local/bin:$PATH"
lgtv tv audioVolume
================================================
FILE: commands/remote-control/lg-tv/show-channel.sh
================================================
#!/usr/bin/env bash
# Dependencies:
# LGWebOSRemote: https://github.com/klattimer/LGWebOSRemote
# Recommended installation:
# Use pipx (https://github.com/pypa/pipx) to install the package system-wide:
# pipx install git+https://github.com/klattimer/LGWebOSRemote
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Show Channel
# @raycast.mode fullOutput
# Optional parameters:
# @raycast.packageName LG TV
# @raycast.icon images/lg.png
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Show information about the TV channel.
# Modified PATH to include pipx-installed packages. If you used a different installation method, adjust the variable properly to make the 'lgtv' package detectable.
PATH="$HOME/.local/bin:$PATH"
lgtv tv getTVChannel
================================================
FILE: commands/remote-control/lg-tv/show-config.sh
================================================
#!/usr/bin/env bash
# Dependencies:
# LGWebOSRemote: https://github.com/klattimer/LGWebOSRemote
# Recommended installation:
# Use pipx (https://github.com/pypa/pipx) to install the package system-wide:
# pipx install git+https://github.com/klattimer/LGWebOSRemote
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Show Config
# @raycast.mode fullOutput
# Optional parameters:
# @raycast.packageName LG TV
# @raycast.icon images/lg.png
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Show the configuration of the library.
# Modified PATH to include pipx-installed packages. If you used a different installation method, adjust the variable properly to make the 'lgtv' package detectable.
PATH="$HOME/.local/bin:$PATH"
lgtv tv serialise
================================================
FILE: commands/remote-control/lg-tv/show-cursor-socket.sh
================================================
#!/usr/bin/env bash
# Dependencies:
# LGWebOSRemote: https://github.com/klattimer/LGWebOSRemote
# Recommended installation:
# Use pipx (https://github.com/pypa/pipx) to install the package system-wide:
# pipx install git+https://github.com/klattimer/LGWebOSRemote
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Show Cursor Socket
# @raycast.mode fullOutput
# Optional parameters:
# @raycast.packageName LG TV
# @raycast.icon images/lg.png
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Show the cursor socket.
# Modified PATH to include pipx-installed packages. If you used a different installation method, adjust the variable properly to make the 'lgtv' package detectable.
PATH="$HOME/.local/bin:$PATH"
lgtv tv getCursorSocket
================================================
FILE: commands/remote-control/lg-tv/show-fg-app-info.sh
================================================
#!/usr/bin/env bash
# Dependencies:
# LGWebOSRemote: https://github.com/klattimer/LGWebOSRemote
# Recommended installation:
# Use pipx (https://github.com/pypa/pipx) to install the package system-wide:
# pipx install git+https://github.com/klattimer/LGWebOSRemote
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Show Foreground App Info
# @raycast.mode fullOutput
# Optional parameters:
# @raycast.packageName LG TV
# @raycast.icon images/lg.png
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Show information about the foreground application.
# Modified PATH to include pipx-installed packages. If you used a different installation method, adjust the variable properly to make the 'lgtv' package detectable.
PATH="$HOME/.local/bin:$PATH"
lgtv tv getForegroundAppInfo
================================================
FILE: commands/remote-control/lg-tv/show-picture-settings.sh
================================================
#!/usr/bin/env bash
# Dependencies:
# LGWebOSRemote: https://github.com/klattimer/LGWebOSRemote
# Recommended installation:
# Use pipx (https://github.com/pypa/pipx) to install the package system-wide:
# pipx install git+https://github.com/klattimer/LGWebOSRemote
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Show Picture Settings
# @raycast.mode fullOutput
# Optional parameters:
# @raycast.packageName LG TV
# @raycast.icon images/lg.png
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Show picture settings.
# Modified PATH to include pipx-installed packages. If you used a different installation method, adjust the variable properly to make the 'lgtv' package detectable.
PATH="$HOME/.local/bin:$PATH"
lgtv tv getPictureSettings
================================================
FILE: commands/remote-control/lg-tv/show-power-state.sh
================================================
#!/usr/bin/env bash
# Dependencies:
# LGWebOSRemote: https://github.com/klattimer/LGWebOSRemote
# Recommended installation:
# Use pipx (https://github.com/pypa/pipx) to install the package system-wide:
# pipx install git+https://github.com/klattimer/LGWebOSRemote
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Show Power State
# @raycast.mode fullOutput
# Optional parameters:
# @raycast.packageName LG TV
# @raycast.icon images/lg.png
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Show the power state.
# Modified PATH to include pipx-installed packages. If you used a different installation method, adjust the variable properly to make the 'lgtv' package detectable.
PATH="$HOME/.local/bin:$PATH"
lgtv tv getPowerState
================================================
FILE: commands/remote-control/lg-tv/show-software-info.sh
================================================
#!/usr/bin/env bash
# Dependencies:
# LGWebOSRemote: https://github.com/klattimer/LGWebOSRemote
# Recommended installation:
# Use pipx (https://github.com/pypa/pipx) to install the package system-wide:
# pipx install git+https://github.com/klattimer/LGWebOSRemote
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Show Software Info
# @raycast.mode fullOutput
# Optional parameters:
# @raycast.packageName LG TV
# @raycast.icon images/lg.png
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Show information about the software.
# Modified PATH to include pipx-installed packages. If you used a different installation method, adjust the variable properly to make the 'lgtv' package detectable.
PATH="$HOME/.local/bin:$PATH"
lgtv tv swInfo
================================================
FILE: commands/remote-control/lg-tv/show-sound-output.sh
================================================
#!/usr/bin/env bash
# Dependencies:
# LGWebOSRemote: https://github.com/klattimer/LGWebOSRemote
# Recommended installation:
# Use pipx (https://github.com/pypa/pipx) to install the package system-wide:
# pipx install git+https://github.com/klattimer/LGWebOSRemote
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Show Sound Output
# @raycast.mode fullOutput
# Optional parameters:
# @raycast.packageName LG TV
# @raycast.icon images/lg.png
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Show the sound output.
# Modified PATH to include pipx-installed packages. If you used a different installation method, adjust the variable properly to make the 'lgtv' package detectable.
PATH="$HOME/.local/bin:$PATH"
lgtv tv getSoundOutput
================================================
FILE: commands/remote-control/lg-tv/show-tv-info.sh
================================================
#!/usr/bin/env bash
# Dependencies:
# LGWebOSRemote: https://github.com/klattimer/LGWebOSRemote
# Recommended installation:
# Use pipx (https://github.com/pypa/pipx) to install the package system-wide:
# pipx install git+https://github.com/klattimer/LGWebOSRemote
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Show TV Info
# @raycast.mode fullOutput
# Optional parameters:
# @raycast.packageName LG TV
# @raycast.icon images/lg.png
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Show information about the TV.
# Modified PATH to include pipx-installed packages. If you used a different installation method, adjust the variable properly to make the 'lgtv' package detectable.
PATH="$HOME/.local/bin:$PATH"
lgtv tv getSystemInfo
================================================
FILE: commands/remote-control/lg-tv/stop-media.sh
================================================
#!/usr/bin/env bash
# Dependencies:
# LGWebOSRemote: https://github.com/klattimer/LGWebOSRemote
# Recommended installation:
# Use pipx (https://github.com/pypa/pipx) to install the package system-wide:
# pipx install git+https://github.com/klattimer/LGWebOSRemote
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Stop Media
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName LG TV
# @raycast.icon images/lg.png
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Stop the media.
# Modified PATH to include pipx-installed packages. If you used a different installation method, adjust the variable properly to make the 'lgtv' package detectable.
PATH="$HOME/.local/bin:$PATH"
lgtv tv inputMediaStop
================================================
FILE: commands/remote-control/lg-tv/switch-next-channel.sh
================================================
#!/usr/bin/env bash
# Dependencies:
# LGWebOSRemote: https://github.com/klattimer/LGWebOSRemote
# Recommended installation:
# Use pipx (https://github.com/pypa/pipx) to install the package system-wide:
# pipx install git+https://github.com/klattimer/LGWebOSRemote
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Switch To Next Channel
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName LG TV
# @raycast.icon images/lg.png
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Switch to the next TV channel.
# Modified PATH to include pipx-installed packages. If you used a different installation method, adjust the variable properly to make the 'lgtv' package detectable.
PATH="$HOME/.local/bin:$PATH"
lgtv tv inputChannelUp
================================================
FILE: commands/remote-control/lg-tv/switch-previous-channel.sh
================================================
#!/usr/bin/env bash
# Dependencies:
# LGWebOSRemote: https://github.com/klattimer/LGWebOSRemote
# Recommended installation:
# Use pipx (https://github.com/pypa/pipx) to install the package system-wide:
# pipx install git+https://github.com/klattimer/LGWebOSRemote
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Switch To Previous Channel
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName LG TV
# @raycast.icon images/lg.png
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Switch to the previous TV channel.
# Modified PATH to include pipx-installed packages. If you used a different installation method, adjust the variable properly to make the 'lgtv' package detectable.
PATH="$HOME/.local/bin:$PATH"
lgtv tv inputChannelDown
================================================
FILE: commands/remote-control/lg-tv/turn-off-3d.sh
================================================
#!/usr/bin/env bash
# Dependencies:
# LGWebOSRemote: https://github.com/klattimer/LGWebOSRemote
# Recommended installation:
# Use pipx (https://github.com/pypa/pipx) to install the package system-wide:
# pipx install git+https://github.com/klattimer/LGWebOSRemote
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Turn Off 3D
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName LG TV
# @raycast.icon images/lg.png
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Turn off the 3D mode.
# Modified PATH to include pipx-installed packages. If you used a different installation method, adjust the variable properly to make the 'lgtv' package detectable.
PATH="$HOME/.local/bin:$PATH"
lgtv tv input3DOff
================================================
FILE: commands/remote-control/lg-tv/turn-off-screen.sh
================================================
#!/usr/bin/env bash
# Dependencies:
# LGWebOSRemote: https://github.com/klattimer/LGWebOSRemote
# Recommended installation:
# Use pipx (https://github.com/pypa/pipx) to install the package system-wide:
# pipx install git+https://github.com/klattimer/LGWebOSRemote
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Turn Off Screen
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName LG TV
# @raycast.icon images/lg.png
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Turn off the screen.
# Modified PATH to include pipx-installed packages. If you used a different installation method, adjust the variable properly to make the 'lgtv' package detectable.
PATH="$HOME/.local/bin:$PATH"
lgtv tv screenOff
================================================
FILE: commands/remote-control/lg-tv/turn-off.sh
================================================
#!/usr/bin/env bash
# Dependencies:
# LGWebOSRemote: https://github.com/klattimer/LGWebOSRemote
# Recommended installation:
# Use pipx (https://github.com/pypa/pipx) to install the package system-wide:
# pipx install git+https://github.com/klattimer/LGWebOSRemote
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Turn Off
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName LG TV
# @raycast.icon images/lg.png
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Turn off the TV.
# Modified PATH to include pipx-installed packages. If you used a different installation method, adjust the variable properly to make the 'lgtv' package detectable.
PATH="$HOME/.local/bin:$PATH"
lgtv tv off
================================================
FILE: commands/remote-control/lg-tv/turn-on-3d.sh
================================================
#!/usr/bin/env bash
# Dependencies:
# LGWebOSRemote: https://github.com/klattimer/LGWebOSRemote
# Recommended installation:
# Use pipx (https://github.com/pypa/pipx) to install the package system-wide:
# pipx install git+https://github.com/klattimer/LGWebOSRemote
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Turn On 3D
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName LG TV
# @raycast.icon images/lg.png
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Turn on the 3D mode.
# Modified PATH to include pipx-installed packages. If you used a different installation method, adjust the variable properly to make the 'lgtv' package detectable.
PATH="$HOME/.local/bin:$PATH"
lgtv tv input3DOn
================================================
FILE: commands/remote-control/lg-tv/turn-on-screen.sh
================================================
#!/usr/bin/env bash
# Dependencies:
# LGWebOSRemote: https://github.com/klattimer/LGWebOSRemote
# Recommended installation:
# Use pipx (https://github.com/pypa/pipx) to install the package system-wide:
# pipx install git+https://github.com/klattimer/LGWebOSRemote
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Turn On Screen
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName LG TV
# @raycast.icon images/lg.png
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Turn on the screen.
# Modified PATH to include pipx-installed packages. If you used a different installation method, adjust the variable properly to make the 'lgtv' package detectable.
PATH="$HOME/.local/bin:$PATH"
lgtv tv screenOn
================================================
FILE: commands/remote-control/lg-tv/turn-on.sh
================================================
#!/usr/bin/env bash
# Dependencies:
# LGWebOSRemote: https://github.com/klattimer/LGWebOSRemote
# Recommended installation:
# Use pipx (https://github.com/pypa/pipx) to install the package system-wide:
# pipx install git+https://github.com/klattimer/LGWebOSRemote
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Turn On
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName LG TV
# @raycast.icon images/lg.png
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Turn on the TV.
# Modified PATH to include pipx-installed packages. If you used a different installation method, adjust the variable properly to make the 'lgtv' package detectable.
PATH="$HOME/.local/bin:$PATH"
lgtv tv on
================================================
FILE: commands/remote-control/lg-tv/turn-volume-down.sh
================================================
#!/usr/bin/env bash
# Dependencies:
# LGWebOSRemote: https://github.com/klattimer/LGWebOSRemote
# Recommended installation:
# Use pipx (https://github.com/pypa/pipx) to install the package system-wide:
# pipx install git+https://github.com/klattimer/LGWebOSRemote
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Turn Volume Down
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName LG TV
# @raycast.icon images/lg.png
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Turn the volume down.
# Modified PATH to include pipx-installed packages. If you used a different installation method, adjust the variable properly to make the 'lgtv' package detectable.
PATH="$HOME/.local/bin:$PATH"
lgtv tv volumeDown
================================================
FILE: commands/remote-control/lg-tv/turn-volume-up.sh
================================================
#!/usr/bin/env bash
# Dependencies:
# LGWebOSRemote: https://github.com/klattimer/LGWebOSRemote
# Recommended installation:
# Use pipx (https://github.com/pypa/pipx) to install the package system-wide:
# pipx install git+https://github.com/klattimer/LGWebOSRemote
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Turn Volume Up
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName LG TV
# @raycast.icon images/lg.png
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Turn the volume up.
# Modified PATH to include pipx-installed packages. If you used a different installation method, adjust the variable properly to make the 'lgtv' package detectable.
PATH="$HOME/.local/bin:$PATH"
lgtv tv volumeUp
================================================
FILE: commands/remote-control/lg-tv/unmute.sh
================================================
#!/usr/bin/env bash
# Dependencies:
# LGWebOSRemote: https://github.com/klattimer/LGWebOSRemote
# Recommended installation:
# Use pipx (https://github.com/pypa/pipx) to install the package system-wide:
# pipx install git+https://github.com/klattimer/LGWebOSRemote
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Unmute
# @raycast.mode silent
# Optional parameters:
# @raycast.packageName LG TV
# @raycast.icon images/lg.png
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# @raycast.description Unmute the TV.
# Modified PATH to include pipx-installed packages. If you used a different installation method, adjust the variable properly to make the 'lgtv' package detectable.
PATH="$HOME/.local/bin:$PATH"
lgtv tv mute false
================================================
FILE: commands/remote-control/samsung-tv/README.md
================================================
## Samsung TV

Manage your Samsung TV via [Raycast](http://raycast.com).
### Compatibility
> [Here](https://developer.samsung.com/smarttv/develop/specifications/tv-model-groups.html) are a complete list of compatible Samsung models that will be able to use these commands
### Initial setup
1. Install the `wakeonlan` module
> `pip3 install wakeonlan`
2. Obtain your preferred Samsung TV's IP and MAC Address then update the `turn-on.template.py` and `turn-off.template.py`
> Remember to remove the **.template.** from the scripts after updating
3. Reload your scripts and Voilà ! Now you can control the TV via Raycast!
### Important
- First time users will need to allow the device to connect to it
- Some TVs will need the user to allow IP remote devices to connect to it
### Known issues
- After turning the TV off. Users cannot turn the TV back via `Turn on TV` command until ~10-15 secs later
================================================
FILE: commands/remote-control/samsung-tv/samsungexceptions.py
================================================
class ConnectionFailure(Exception):
"""Error during connection."""
pass
class ResponseError(Exception):
"""Error in response."""
pass
class HttpApiError(Exception):
"""Error using HTTP API."""
pass
================================================
FILE: commands/remote-control/samsung-tv/samsunghelper.py
================================================
"""
SamsungTVWS - Samsung Smart TV WS API wrapper
"""
import base64
import json
import time
import ssl
import logging
import websocket
import samsungexceptions as exceptions
import samsungshortcuts as shortcuts
_LOGGING = logging.getLogger(__name__)
class SamsungTVWS:
_URL_FORMAT = 'ws://{host}:{port}/api/v2/channels/samsung.remote.control?name={name}'
_SSL_URL_FORMAT = 'wss://{host}:{port}/api/v2/channels/samsung.remote.control?name={name}&token={token}'
def __init__(self, host, port=8002, timeout=None, key_press_delay=1,
name='SamsungTvRemote',token=None,token_file=None):
self.host = host
self.port = port
self.timeout = None if timeout == 0 else timeout
self.token = token
self.token_file = token_file
self.key_press_delay = key_press_delay
self.name = name
self.connection = None
def _get_token(self):
if self.token_file is not None:
try:
with open(self.token_file, 'r') as token_file:
return token_file.readline()
except:
return ''
else:
return self.token
def _set_token(self, token):
_LOGGING.info('New token %s', token)
if self.token_file is not None:
_LOGGING.debug('Save token to file: %s', token)
with open(self.token_file, 'w') as token_file:
token_file.write(token)
else:
self.token = token
def _serialize_string(self, string):
if isinstance(string, str):
string = str.encode(string)
return base64.b64encode(string).decode('utf-8')
def _is_ssl_connection(self):
return self.port == 8002
def _format_websocket_url(self):
params = {
'host': self.host,
'port': self.port,
'name': self._serialize_string(self.name),
'token': self._get_token(),
}
if self._is_ssl_connection():
return self._SSL_URL_FORMAT.format(**params)
else:
return self._URL_FORMAT.format(**params)
def _ws_send(self, command, key_press_delay=None):
if self.connection is None:
self.open()
payload = json.dumps(command)
self.connection.send(payload)
delay = self.key_press_delay if key_press_delay is None else key_press_delay
time.sleep(delay)
def _process_api_response(self, response):
try:
return json.loads(response)
except json.JSONDecodeError:
_LOGGING.debug('Failed to parse response from TV. response text: %s', response)
raise exceptions.ResponseError('Failed to parse response from TV. Maybe feature not supported on this model')
def open(self):
url = self._format_websocket_url()
sslopt = {'cert_reqs': ssl.CERT_NONE} if self._is_ssl_connection() else {}
self.connection = websocket.create_connection(
url,
self.timeout,
sslopt=sslopt,
connection='Connection: Upgrade'
)
response = self._process_api_response(self.connection.recv())
if response.get('data') and response.get('data').get('token'):
token = response.get('data').get('token')
_LOGGING.debug('Got token %s', token)
self._set_token(token)
if response['event'] != 'ms.channel.connect':
self.close()
raise exceptions.ConnectionFailure(response)
def close(self):
if self.connection:
self.connection.close()
self.connection = None
_LOGGING.debug('Connection closed.')
def send_key(self, key, times=1, key_press_delay=None, cmd='Click'):
for _ in range(times):
self._ws_send(
{
'method': 'ms.remote.control',
'params': {
'Cmd': cmd,
'DataOfCmd': key,
'Option': 'false',
'TypeOfRemote': 'SendRemoteKey'
}
},
key_press_delay
)
def shortcuts(self):
return shortcuts.SamsungTVShortcuts(self)
================================================
FILE: commands/remote-control/samsung-tv/samsungshortcuts.py
================================================
"""
SamsungTVWS - Samsung Smart TV WS API wrapper
"""
class SamsungTVShortcuts:
def __init__(self, remote):
self.remote = remote
# power
def power(self):
self.remote.send_key('KEY_POWER')
================================================
FILE: commands/remote-control/samsung-tv/turn-off.template.py
================================================
#!/usr/bin/env python3
# How to use this script?
# It's a template which needs further setup. Duplicate the file,
# remove `.template.` from the filename and place your TVs IP address within the host parameter
# You need to copy samsunghelper.py, samsungshortcuts.py, and samsungexceptions.py next to
# the enabled script command otherwise it won't work.
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Turn Off TV
# @raycast.mode compact
# Optional parameters:
# @raycast.packageName Samsung TV
# @raycast.icon images/logo.png
# Documentation:
# @raycast.author Darryl Brooks
# @raycast.authorURL https://github.com/DarrylBrooks97
# @raycast.description Turns off a Samsung TV.
import sys
import os
from samsunghelper import SamsungTVWS
sys.path.append('../')
# Your TVs IP Address should be within the TV's network settings menu
ip_address = '192.168.0.00'
# This will allow one time authentication on the TV.
# Caches TV ssl token for later use.
token_file = os.path.dirname(os.path.realpath(__file__)) + '/tv-token.txt'
tv = SamsungTVWS(host=ip_address, port=8002,token_file=token_file)
tv.shortcuts().power()
================================================
FILE: commands/remote-control/samsung-tv/turn-on.template.py
================================================
#!/usr/bin/env python3
# How to use this script?
# It's a template which needs further setup. Duplicate the file,
# remove `.template.` from the filename and set your TVs MAC Address as a parameter.
# You need to copy samsunghelper.py, samsungshortcuts.py and samsungexceptions.py next to the script command
# otherwise it won't work.
# Dependency: This script requires the following Python libraries: `wakeonlan`
# Install them with `pip3 install wakeonlan`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Turn On TV
# @raycast.mode compact
# Optional parameters:
# @raycast.packageName Samsung TV
# @raycast.icon images/logo.png
# Documentation:
# @raycast.author Darryl Brooks
# @raycast.authorURL https://github.com/DarrylBrooks97
# @raycast.description Turns on a Samsung TV.
import wakeonlan
# Your TVs MAC Address should be within the TV's network settings menu
mac_address = '00:00:00:00:00:00'
wakeonlan.send_magic_packet(mac_address)
================================================
FILE: commands/system/Low Power Mode.sh
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Low Power Mode
# @raycast.mode silent
# @raycast.icon 🔋
# @raycast.author Kailash Yellareddy
# @raycast.authorURL https://github.com/kyellareddy
on getLowPowerMode(str)
set trimmedStr to do shell script "echo " & quoted form of str & " | xargs" -- trim trailing spaces
set lastChar to character (length of trimmedStr) of trimmedStr -- get last character
set mode to lastChar as number -- convert to number
return mode
end getLowPowerMode
tell application "System Settings"
set output to do shell script "pmset -g | grep lowpowermode"
end tell
set result to getLowPowerMode(output)
if result = 0 then
tell application "System Settings"
do shell script "pmset -a lowpowermode 1" with administrator privileges
end tell
do shell script "echo Low Power Mode turned on."
else
tell application "System Settings"
do shell script "pmset -a lowpowermode 0" with administrator privileges
end tell
# This makes the brightness 100% again, if it doesn't go all the way to 100% for you, change the number of times it repeats.
repeat 25 times
tell application "System Events"
key code 144
end tell
end repeat
end if
================================================
FILE: commands/system/Network Info.sh
================================================
#!/usr/bin/env python3
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Network Info
# @raycast.mode fullOutput
# @raycast.icon 🛜
# @raycast.author Kailash Yellareddy
# @raycast.authorURL https://github.com/kyellareddy
import urllib.request, json
with urllib.request.urlopen("http://ip-api.com/json") as url:
data = json.load(url)
print("IP address:", data["query"])
print("ISP:", data["isp"])
print("City:", data["city"])
print("Region:", data["regionName"])
print("Country:", data["country"])
print("ZIP:", data["zip"])
================================================
FILE: commands/system/add-spacer-to-dock.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Add Spacer to Dock
# @raycast.mode compact
# Optional parameters:
# @raycast.icon 💻
# @Documentation:
# @raycast.packageName System
# @raycast.description Adds an invisible icon to the Dock as a separator.
# @raycast.author Alexandru Turcanu
# @raycast.authorURL https://github.com/Pondorasti
defaults write com.apple.dock persistent-apps -array-add '{"tile-type"="spacer-tile";}'
killall Dock
echo "Added spacer to dock"
================================================
FILE: commands/system/audio/airpodsbattery.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title AirPods Battery Level
# @raycast.mode inline
# Optional parameters:
# @raycast.icon ⚡️
# @raycast.packageName Audio
# @raycast.refreshTime 10m
# Documentation:
# @raycast.description Get the current battery status of your AirPods.
# @raycast.author Quentin Eude
# @raycast.authorURL https://www.github.com/qeude
# This should be changed every time new AirPods models are released.
airpods_product_ids=("0x200E" "0x200F" "0x2002" "0x2013")
airpods_max_product_ids=("0x200A")
delimiter=" 🎧 "
function join_by { local d=${1-} f=${2-}; if shift 2; then printf %s "$f" "${@/#/$d}"; fi; }
system_profiler=$(system_profiler SPBluetoothDataType 2>/dev/null)
mac_addresses=($(grep -b2 "Minor Type: Headphones"<<<"${system_profiler}" | awk '/Address/{print $3}'))
airpods_list=()
for i in "${mac_addresses[@]}"; do
mac_address_system_profiler=$(grep -ia11 "${i}"<<<"${system_profiler}")
# $(grep -ia11 "${mac_addr}"<<<"${system_profiler}"|awk '/Product ID/{print $3}')
product_id=$(echo "$mac_address_system_profiler" | awk '/Product ID/{print $3}')
if [[ ! "${airpods_product_ids[*]}" =~ $product_id && ! "${airpods_max_product_ids[*]}" =~ $product_id ]]; then
continue
fi
airpods_list+=("$i,$product_id,$(echo "$mac_address_system_profiler" | awk '{if ($0 ~ /Connected: Yes/) {print 1} else if ($0 ~ /Connected: No/) {print 0}}')")
done
if [[ "${airpods_list[*]}" =~ ",1" ]]; then
# Started here, we are going to assume that we only take the first connected AirPods
mac_address=${airpods_list[0]%,*,*}
temp=${airpods_list[0]#*,*}
product_id=${temp%*,*}
default=$(grep -ia6 '"'"${mac_address}"'"'<<<"$(defaults read /Library/Preferences/com.apple.Bluetooth)")
if [[ "${airpods_product_ids[*]}" =~ $product_id ]]; then
battery_infos=("BatteryPercentCase,Case" "BatteryPercentLeft,Left" "BatteryPercentRight,Right")
declare -a result_array
for i in "${battery_infos[@]}"; do
key=${i%,*};
val=${i#*,};
battery_level=$(echo "$default" | grep "$key" | tr -d \; | awk '{print $3}')
# Not displaying info when battery level is 0% since it means not connected for the system
# When batteries are empty, the device will stay at 1%
if [[ $battery_level == 0 ]]; then
continue
fi
result_array+=("$val $battery_level%")
done
join_by "$delimiter" "${result_array[@]}"
exit 0
elif [[ " ${airpods_max_product_ids[*]} " =~ ${product_id} ]]; then
battery_single=$(echo "$default" | grep BatteryPercentSingle | tr -d \; | awk '{print $3}')
echo "🎧 $battery_single%"
exit 0
else
echo "No AirPods connected. 🤷"
exit 0
fi
else
echo "No AirPods connected. 🤷"
exit 0
fi
================================================
FILE: commands/system/audio/audio-output-switch.template.applescript
================================================
#!/usr/bin/osascript
# How to use this script?
# It's a template which needs further setup. Duplicate the file,
# remove `.template.` from the filename,
# Replace all instances of with the name of your desired audio output device
# @raycast.schemaVersion 1
# @raycast.title Switch Audio to
# @raycast.mode silent
# @raycast.packageName Audio
# @raycast.icon 🔊
# @raycast.author mmerle
# @raycast.authorURL https://github.com/mmerle
# @raycast.description Switch audio output to desired device.
set asrc to ""
tell application "System Preferences"
reveal anchor "output" of pane id "com.apple.preference.sound"
delay 1
tell application "System Events"
tell process "System Preferences"
select (row 1 of table 1 of scroll area 1 of tab group 1 of window "Sound" whose value of text field 1 is asrc)
end tell
end tell
quit
end tell
do shell script "echo Audio switched to "
================================================
FILE: commands/system/audio/bluetooth-headphones-battery-level.template.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Headphones Battery Level
# @raycast.mode silent
# Optional parameters:
# @raycast.icon 🎧
# @raycast.packageName Audio
# Documentation:
# @raycast.description Get the battery level of your bluetooth headphones
# @raycast.author Mortada Sarheed
# @raycast.authorURL https://github.com/mSarheed
# Find the mac address of your headhpones by holding down option-key (⌥) (+ click on your bluetooth icon in the menubar or control centre.
# The mac address for your headphones should look something like this A1-23-45-B6-C7, change the dashes(-) to colons (:), so A1:23:45:B6:C7
macAddr="XX:XX:XX:XX:XX"
call="system_profiler SPBluetoothDataType"
# Finds the name of the Headphones
headphonesName=$($call | grep -B1 "$macAddr" | head -n 1 | sed 's/.$//')
batteryLevel=$($call | grep -A4 "$macAddr" | grep 'Battery Level:' | grep -Eo '[0-9]{1,4}')
if [ "$batteryLevel" != "" ]; then
echo '🔋'$headphonesName' is at '$batteryLevel'% 🔋'
else
echo "🎧 Headphones aren't connected 🤷🏻♂️"
fi
================================================
FILE: commands/system/audio/get-audio-devices.swift
================================================
#!/usr/bin/swift
// Required parameters:
// @raycast.schemaVersion 1
// @raycast.title Audio devices
// @raycast.mode fullOutput
// Optional parameters:
// @raycast.icon 🔈
// @raycast.packageName Audio
// Documentation:
// @raycast.description Lists all audio devices
// @raycast.author Roland Leth
// @raycast.authorURL https://runtimesharks.com
import Foundation
import CoreAudio
// Based on https://stackoverflow.com/a/58618034/793916
// Equivalent of kAudioObjectPropertyElementMain to prevent SDK compatibility issues.
private let audioObjectPropertyElementMain: AudioObjectPropertyElement = 0
final class AudioDevice {
let audioDeviceID: AudioDeviceID
init(deviceID: AudioDeviceID) {
self.audioDeviceID = deviceID
}
var hasOutput: Bool {
var address: AudioObjectPropertyAddress = AudioObjectPropertyAddress(
mSelector: AudioObjectPropertySelector(kAudioDevicePropertyStreamConfiguration),
mScope: AudioObjectPropertyScope(kAudioDevicePropertyScopeOutput),
mElement: audioObjectPropertyElementMain)
var propSize: UInt32 = 0
var result = AudioObjectGetPropertyDataSize(
audioDeviceID,
&address,
0,
nil,
&propSize)
if (result != 0) {
return false
}
let bufferList = UnsafeMutablePointer.allocate(capacity: Int(propSize))
defer {
bufferList.deallocate()
}
result = AudioObjectGetPropertyData(audioDeviceID, &address, 0, nil, &propSize, bufferList)
if (result != 0) {
return false
}
let buffers = UnsafeMutableAudioBufferListPointer(bufferList)
return buffers.contains { $0.mNumberChannels > 0 }
}
var name: String? {
var address = AudioObjectPropertyAddress(
mSelector: AudioObjectPropertySelector(kAudioObjectPropertyName),
mScope: AudioObjectPropertyScope(kAudioObjectPropertyScopeGlobal),
mElement: audioObjectPropertyElementMain)
var name: CFString? = nil
var propSize = UInt32(MemoryLayout.size)
let result = AudioObjectGetPropertyData(audioDeviceID, &address, 0, nil, &propSize, &name)
if (result != 0) {
return nil
}
return name as String?
}
}
func findDevices() -> [AudioDevice] {
var address = AudioObjectPropertyAddress(
mSelector: AudioObjectPropertySelector(kAudioHardwarePropertyDevices),
mScope: AudioObjectPropertyScope(kAudioObjectPropertyScopeGlobal),
mElement: audioObjectPropertyElementMain)
var propSize: UInt32 = 0
var result = AudioObjectGetPropertyDataSize(
AudioObjectID(kAudioObjectSystemObject),
&address,
0,
nil,
&propSize)
if (result != 0) {
print("Error \(result) from AudioObjectGetPropertyDataSize")
return []
}
let numDevices = Int(propSize / UInt32(MemoryLayout.size))
var devids = Array(repeating: AudioDeviceID(), count: numDevices)
result = AudioObjectGetPropertyData(
AudioObjectID(kAudioObjectSystemObject),
&address,
0,
nil,
&propSize,
&devids)
if (result != 0) {
print("Error \(result) from AudioObjectGetPropertyData")
return []
}
return (0.. String? {
var id = AudioObjectID(kAudioObjectSystemObject)
var idSize = UInt32(MemoryLayout.size(ofValue: id))
let selector = output
? kAudioHardwarePropertyDefaultOutputDevice
: kAudioHardwarePropertyDefaultInputDevice
var idPropertyAddress = AudioObjectPropertyAddress(
mSelector: AudioObjectPropertySelector(selector),
mScope: AudioObjectPropertyScope(kAudioObjectPropertyScopeGlobal),
mElement: audioObjectPropertyElementMain)
let result = AudioObjectGetPropertyData(
id,
&idPropertyAddress,
0,
nil,
&idSize,
&id)
if (result != 0) {
return nil
}
return (output ? outputs : inputs).first { $0.audioDeviceID == id }?.name
}
let outputDevice = selectedDevice(output: true)
let inputDevice = selectedDevice(output: false)
let inputNames = inputs
.compactMap(\.name)
.map { inputDevice == $0 ? "* \($0)" : $0 }
.sorted()
.joined(separator: "\n")
let outputNames = outputs
.compactMap(\.name)
.map { outputDevice == $0 ? "* \($0)" : $0 }
.sorted()
.joined(separator: "\n")
print("Inputs:\n\(inputNames)\n\nOutputs:\n\(outputNames)")
================================================
FILE: commands/system/audio/get-selected-audio-device.swift
================================================
#!/usr/bin/swift
// Required parameters:
// @raycast.schemaVersion 1
// @raycast.title Audio devices
// @raycast.mode inline
// @raycast.refreshTime 10m
// Optional parameters:
// @raycast.icon 🔈
// @raycast.packageName Audio
// Documentation:
// @raycast.description Shows the selected audio devices for input and output
// @raycast.author Roland Leth
// @raycast.authorURL https://runtimesharks.com
import Foundation
import CoreAudio
// Based on https://stackoverflow.com/a/58618034/793916
// Equivalent of kAudioObjectPropertyElementMain to prevent SDK compatibility issues.
private let audioObjectPropertyElementMain: AudioObjectPropertyElement = 0
final class AudioDevice {
let audioDeviceID: AudioDeviceID
init(deviceID: AudioDeviceID) {
self.audioDeviceID = deviceID
}
var hasOutput: Bool {
var address: AudioObjectPropertyAddress = AudioObjectPropertyAddress(
mSelector: AudioObjectPropertySelector(kAudioDevicePropertyStreamConfiguration),
mScope: AudioObjectPropertyScope(kAudioDevicePropertyScopeOutput),
mElement: audioObjectPropertyElementMain)
var propSize: UInt32 = 0
var result = AudioObjectGetPropertyDataSize(
audioDeviceID,
&address,
0,
nil,
&propSize)
if (result != 0) {
return false
}
let bufferList = UnsafeMutablePointer.allocate(capacity: Int(propSize))
defer {
bufferList.deallocate()
}
result = AudioObjectGetPropertyData(audioDeviceID, &address, 0, nil, &propSize, bufferList)
if (result != 0) {
return false
}
let buffers = UnsafeMutableAudioBufferListPointer(bufferList)
return buffers.contains { $0.mNumberChannels > 0 }
}
var name: String? {
var address = AudioObjectPropertyAddress(
mSelector: AudioObjectPropertySelector(kAudioObjectPropertyName),
mScope: AudioObjectPropertyScope(kAudioObjectPropertyScopeGlobal),
mElement: audioObjectPropertyElementMain)
var name: CFString? = nil
var propSize = UInt32(MemoryLayout.size)
let result = AudioObjectGetPropertyData(audioDeviceID, &address, 0, nil, &propSize, &name)
if (result != 0) {
return nil
}
return name as String?
}
}
func findDevices() -> [AudioDevice] {
var address = AudioObjectPropertyAddress(
mSelector: AudioObjectPropertySelector(kAudioHardwarePropertyDevices),
mScope: AudioObjectPropertyScope(kAudioObjectPropertyScopeGlobal),
mElement: audioObjectPropertyElementMain)
var propSize: UInt32 = 0
var result = AudioObjectGetPropertyDataSize(
AudioObjectID(kAudioObjectSystemObject),
&address,
0,
nil,
&propSize)
if (result != 0) {
print("Error \(result) from AudioObjectGetPropertyDataSize")
return []
}
let numDevices = Int(propSize / UInt32(MemoryLayout.size))
var devids = Array(repeating: AudioDeviceID(), count: numDevices)
result = AudioObjectGetPropertyData(
AudioObjectID(kAudioObjectSystemObject),
&address,
0,
nil,
&propSize,
&devids)
if (result != 0) {
print("Error \(result) from AudioObjectGetPropertyData")
return []
}
return (0.. String? {
var id = AudioObjectID(kAudioObjectSystemObject)
var idSize = UInt32(MemoryLayout.size(ofValue: id))
let selector = output
? kAudioHardwarePropertyDefaultOutputDevice
: kAudioHardwarePropertyDefaultInputDevice
var idPropertyAddress = AudioObjectPropertyAddress(
mSelector: AudioObjectPropertySelector(selector),
mScope: AudioObjectPropertyScope(kAudioObjectPropertyScopeGlobal),
mElement: audioObjectPropertyElementMain)
let result = AudioObjectGetPropertyData(
id,
&idPropertyAddress,
0,
nil,
&idSize,
&id)
if (result != 0) {
return nil
}
return (output ? outputs : inputs).first { $0.audioDeviceID == id }?.name
}
let outputDevice = selectedDevice(output: true)
let inputDevice = selectedDevice(output: false)
let inputName = inputs
.compactMap(\.name)
.filter { inputDevice == $0 }
.first
let outputName = outputs
.compactMap(\.name)
.filter { outputDevice == $0 }
.first
switch (inputName, outputName) {
case (let inputName?, let outputName?):
print("\(inputName) | \(outputName)")
case (let inputName?, nil):
print("\(inputName)")
case (nil, let outputName?):
print("\(outputName)")
case (nil, nil):
print("No devices found")
}
================================================
FILE: commands/system/audio/reload-coreaudio.sh
================================================
#!/bin/zsh
# @raycast.schemaVersion 1
# @raycast.title Reload CoreAudio
# @raycast.mode silent
# @raycast.author Maxim Krouk
# @raycast.authorURL https://github.com/maximkrouk
# @raycast.description Reloads CoreAudio.
# @raycast.icon 🎧
# @raycast.packageName System
sudo launchctl stop com.apple.audio.coreaudiod && sudo launchctl start com.apple.audio.coreaudiod
echo "Done"
================================================
FILE: commands/system/audio/set-audio-device.swift
================================================
#!/usr/bin/swift
// Required parameters:
// @raycast.schemaVersion 1
// @raycast.title Set audio device
// @raycast.mode silent
// Optional parameters:
// @raycast.icon 🎧
// @raycast.argument1 { "type": "text", "placeholder": "Name" }
// @raycast.argument2 { "type": "text", "placeholder": "Type (i/o/b)", "optional": true }
// @raycast.packageName Audio
// Documentation:
// @raycast.description Sets the input (i), the output (o) or both (b) audio sources, based on name. If `both` is passed, but no input or output device is found with the given name, it will still try to set the other one. For example, if you're trying to set both to "External mic", which doesn't have an input source, it will still set the output to the mic; vice-versa for a speaker.
// @raycast.author Roland Leth
// @raycast.authorURL https://runtimesharks.com
// Change lines 29 and 30 if you'd like another default,
// which currently sets both when no parameter is passed.
let arguments = Array(CommandLine.arguments.dropFirst())
let query = arguments.first!
let changeType: DeviceType = arguments.count >= 2
? ["input", "i"].contains(arguments[1])
? .input
: ["output", "o"].contains(arguments[1])
? .output
: .both
: .both
import Foundation
import CoreAudio
// Based on https://stackoverflow.com/a/58618034/793916
// Equivalent of kAudioObjectPropertyElementMain to prevent SDK compatibility issues.
private let audioObjectPropertyElementMain: AudioObjectPropertyElement = 0
struct DeviceType: OptionSet {
static let input = DeviceType(rawValue: 1 << 0)
static let output = DeviceType(rawValue: 1 << 1)
static let both: DeviceType = [.input, .output]
let rawValue: Int
var value: String {
switch self {
case .input:
return "input"
case .output:
return "output"
case .both:
return "both"
default:
return ""
}
}
}
final class AudioDevice {
let audioDeviceID: AudioDeviceID
init(deviceID: AudioDeviceID) {
self.audioDeviceID = deviceID
}
var hasOutput: Bool {
var address = AudioObjectPropertyAddress(
mSelector: AudioObjectPropertySelector(kAudioDevicePropertyStreamConfiguration),
mScope: AudioObjectPropertyScope(kAudioDevicePropertyScopeOutput),
mElement: audioObjectPropertyElementMain)
var propSize = UInt32(MemoryLayout.size)
var result = AudioObjectGetPropertyDataSize(audioDeviceID, &address, 0, nil, &propSize)
if (result != 0) {
return false
}
let bufferList = UnsafeMutablePointer.allocate(capacity: Int(propSize))
defer {
bufferList.deallocate()
}
result = AudioObjectGetPropertyData(audioDeviceID, &address, 0, nil, &propSize, bufferList)
if (result != 0) {
return false
}
let buffers = UnsafeMutableAudioBufferListPointer(bufferList)
return buffers.contains { $0.mNumberChannels > 0 }
}
var name: String? {
var address = AudioObjectPropertyAddress(
mSelector: AudioObjectPropertySelector(kAudioObjectPropertyName),
mScope: AudioObjectPropertyScope(kAudioObjectPropertyScopeGlobal),
mElement: audioObjectPropertyElementMain)
var name: CFString? = nil
var propSize = UInt32(MemoryLayout.size)
let result = AudioObjectGetPropertyData(audioDeviceID, &address, 0, nil, &propSize, &name)
if (result != 0) {
return nil
}
return name as String?
}
}
func findDevices() -> [AudioDevice] {
var propSize: UInt32 = 0
var address = AudioObjectPropertyAddress(
mSelector: AudioObjectPropertySelector(kAudioHardwarePropertyDevices),
mScope: AudioObjectPropertyScope(kAudioObjectPropertyScopeGlobal),
mElement: audioObjectPropertyElementMain)
var result = AudioObjectGetPropertyDataSize(
AudioObjectID(kAudioObjectSystemObject),
&address,
0,
nil,
&propSize)
if (result != 0) {
print("Error \(result) from AudioObjectGetPropertyDataSize")
return []
}
let numDevices = Int(propSize / UInt32(MemoryLayout.size))
var devids = Array(repeating: AudioDeviceID(), count: numDevices)
result = AudioObjectGetPropertyData(
AudioObjectID(kAudioObjectSystemObject),
&address,
0,
nil,
&propSize,
&devids)
if (result != 0) {
print("Error \(result) from AudioObjectGetPropertyData")
return []
}
return (0.. (Bool, String) {
let devices = findDevices()
guard
let device = devices.first(where: {
$0.name?.localizedCaseInsensitiveContains(query) == true
&& (deviceType.contains(.input) ? !$0.hasOutput : $0.hasOutput)
})
else {
return (false, query)
}
let deviceName = device.name ?? query
var deviceId = device.audioDeviceID
let deviceIdSize = UInt32(MemoryLayout.size(ofValue: deviceId))
let selector = deviceType.contains(.input)
? kAudioHardwarePropertyDefaultInputDevice
: kAudioHardwarePropertyDefaultOutputDevice
var deviceIdPropertyAddress = AudioObjectPropertyAddress(
mSelector: AudioObjectPropertySelector(selector),
mScope: AudioObjectPropertyScope(kAudioObjectPropertyScopeGlobal),
mElement: audioObjectPropertyElementMain)
let result = AudioObjectSetPropertyData(
AudioObjectID(kAudioObjectSystemObject),
&deviceIdPropertyAddress,
0,
nil,
deviceIdSize,
&deviceId)
if (result != 0) {
return (false, deviceName)
}
return (true, deviceName)
}
switch changeType {
case .input,
.output:
let i = set(changeType, to: query)
guard i.0 else {
print("Could not set \(changeType.value) to \(i.1)")
exit(1)
}
print("Set \(changeType.value) to \(i.1)")
case .both:
let i = set(.input, to: query)
let o = set(.output, to: query)
switch (i.0, o.0) {
case (false, false):
print("Could not set any device to \(i.1)")
case (true, false):
print("Set input to \(i.1)")
case (false, true):
print("Set output to \(i.1)")
case (true, true):
print("Set both to \(i.1) & \(o.1)")
}
default:
exit(1)
}
================================================
FILE: commands/system/audio/toggle-airpods.template.swift
================================================
#!/usr/bin/swift
// Required parameters:
// @raycast.schemaVersion 1
// @raycast.title Toggle AirPods
// @raycast.mode silent
// @raycast.packageName Audio
//
// Optional parameters:
// @raycast.icon images/airpod.png
//
// Documentation:
// @raycast.description Toggle AirPods bluetooth device
// @raycast.author Nichlas W. Andersen
// @raycast.authorURL https://github.com/itsnwa
import IOBluetooth
// Get your device's MAC address by option (⌥) + clicking the bluetooth icon in the menu bar
let deviceAddress = ""
func toggleAirPods() {
guard let bluetoothDevice = IOBluetoothDevice(addressString: deviceAddress) else {
print("Device not found")
exit(1)
}
if !bluetoothDevice.isPaired() {
print("Device not paired")
exit(1)
}
if bluetoothDevice.isConnected() {
print("AirPods Disconnected")
bluetoothDevice.closeConnection()
} else {
print("AirPods Connected")
bluetoothDevice.openConnection()
}
}
toggleAirPods()
================================================
FILE: commands/system/audio/toggle-mic.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Toggle Microphone
# @raycast.mode silent
# @raycast.packageName System
# Optional parameters:
# @raycast.icon 🎙
# Documentation:
# @raycast.author Matthew Morek
# @raycast.authorURL https://github.com/matthewmorek
# @raycast.description Toggles microphone.
on getMicrophoneVolume()
input volume of (get volume settings)
end getMicrophoneVolume
on disableMicrophone()
set volume input volume 0
log "Microphone turned off 🔴"
end disableMicrophone
on enableMicrophone()
set volume input volume 100
log "Microphone turned on 🟢"
end enableMicrophone
if getMicrophoneVolume() is greater than 0 then
disableMicrophone()
else
enableMicrophone()
end if
================================================
FILE: commands/system/audio/toggle-mute-notification-sounds.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Toggle Mute Notifcation Sounds
# @raycast.mode silent
# @raycast.packageName System
# Optional parameters:
# @raycast.icon 🔔
# Documentation:
# @raycast.author Annie Ma
# @raycast.authorURL http://www.anniema.co/
# @raycast.description Toggles notification sounds.
set volumeSettings to get volume settings
set alertVolume to alert volume of volumeSettings
if alertVolume > 0 then
set volume alert volume 0
display notification "" with title "Muted notification sounds"
else
set volume alert volume 100
display notification "" with title "Unmuted notification sounds"
end if
================================================
FILE: commands/system/battery-info.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Battery Info
# @raycast.mode inline
# @raycast.refreshTime 3m
# @raycast.packageName System
#
# Optional parameters:
# @raycast.icon 🔋
#
# Documentation:
# @raycast.description Get Battery percentage, time remaining, charge status, charger wattage, total cycles etc.
# @raycast.author Fahim Faisal
# @raycast.authorURL https://github.com/i3p9
BATT_PERCENTAGE=$(pmset -g batt | grep "InternalBattery-0" | awk '{print $3}')
CHARGE_STATUS=$(pmset -g batt | grep "InternalBattery-0" | awk '{print $4}')
TIME_REMAINING=$(pmset -g batt | grep "InternalBattery-0" | awk '{print $5}')
CYCLE_COUNT=$(system_profiler SPPowerDataType | grep "Cycle Count" | awk '{print $3}')
CHARGE_WATT=$(pmset -g ac | grep "Wattage" | awk '{print $3}')
BATT=${BATT_PERCENTAGE%??}
if [[ "$CHARGE_STATUS" == "charging;" ]]; then
#Charging
if [[ "$TIME_REMAINING" == "(no" ]]; then
TO_SHOW="⚡${BATT}% - No Estimation Yet (Charging at ${CHARGE_WATT}) - ${CYCLE_COUNT} Cycles"
echo $TO_SHOW
else
if [[ "$TIME_REMAINING" != "(no" ]]; then
RE_MIN=${TIME_REMAINING##*:}
RE_HOUR=${TIME_REMAINING%%:*}
if [[ "$RE_HOUR" == "0" ]]; then
TIME_REMAINING_FORMATTED="${RE_MIN}m"
else
TIME_REMAINING_FORMATTED="${RE_HOUR}h ${RE_MIN}m"
fi
fi
TO_SHOW="⚡${BATT}% - ${TIME_REMAINING_FORMATTED} to Full (Charging at ${CHARGE_WATT}) - ${CYCLE_COUNT} Cycles"
echo $TO_SHOW
fi
elif [[ "$CHARGE_STATUS" == "finishing" ]]; then
#Finishing Charning, xx:xx time remaining
TIME_REMAINING=$(pmset -g batt | grep "InternalBattery-0" | awk '{print $6}')
RE_MIN=${TIME_REMAINING##*:}
RE_HOUR=${TIME_REMAINING%%:*}
if [[ "$RE_HOUR" == "0" ]]; then
if [[ "$RE_MIN" == "00" ]]; then
FULLY_CHARGED_FLAG="TRUE"
fi
TIME_REMAINING_FORMATTED="${RE_MIN}m"
else
TIME_REMAINING_FORMATTED="${RE_HOUR}h ${RE_MIN}m"
fi
if [[ "$TIME_REMAINING" == "(no" ]]; then
TO_SHOW="⚡${BATT}% - No Estimation Yet (Charging at ${CHARGE_WATT}) - ${CYCLE_COUNT} Cycles"
echo $TO_SHOW
elif [[ "$FULLY_CHARGED_FLAG" = "TRUE" ]]; then
TO_SHOW="⚡${BATT}% - Fully Charged (Power Connected at ${CHARGE_WATT}) - ${CYCLE_COUNT} Cycles"
echo $TO_SHOW
else
TO_SHOW="⚡${BATT}% - ${TIME_REMAINING_FORMATTED} to Full (Charging at ${CHARGE_WATT}) - ${CYCLE_COUNT} Cycles"
echo $TO_SHOW
fi
elif [[ "$CHARGE_STATUS" == "charged;" ]]; then
#Fully charged
TO_SHOW="⚡${BATT}% - Fully Charged (Power Connected at ${CHARGE_WATT}) - ${CYCLE_COUNT} Cycles"
echo $TO_SHOW
elif [[ "$CHARGE_STATUS" == "discharging;" ]]; then
#Discharging
if [[ "$TIME_REMAINING" == "(no" ]]; then
TO_SHOW="${BATT}% - No Estimation Yet - ${CYCLE_COUNT} Cycles"
echo $TO_SHOW
else
if [[ "$TIME_REMAINING" != "(no" ]]; then
RE_MIN=${TIME_REMAINING##*:}
RE_HOUR=${TIME_REMAINING%%:*}
if [[ "$RE_HOUR" == "0" ]]; then
TIME_REMAINING_FORMATTED="${RE_MIN}m"
else
TIME_REMAINING_FORMATTED="${RE_HOUR}h ${RE_MIN}m"
fi
fi
TO_SHOW="${BATT}% - ${TIME_REMAINING_FORMATTED} Remaining - ${CYCLE_COUNT} Cycles"
echo $TO_SHOW
fi
fi
================================================
FILE: commands/system/bluetooth.template.applescript
================================================
#!/usr/bin/osascript
# @raycast.title Toggle Bluetooth
# @raycast.author Vincent Dörig
# @raycast.authorURL https://github.com/vincentdoerig
# @raycast.description Toggle your Bluetooth connection.
# @raycast.icon images/bluetooth.png
# @raycast.mode silent
# @raycast.packageName System
# @raycast.schemaVersion 1
# set this variable to the equivalent of "Control Center" in your system language
set ControlCenterWindow to "Control Center"
tell application "System Events"
tell process "ControlCenter"
click menu bar item "Bluetooth" of menu bar 1
set BluetoothSwitch to checkbox "Bluetooth" of group 1 of window ControlCenterWindow
click BluetoothSwitch
delay 1
if value of BluetoothSwitch is 0 then
do shell script "echo Bluetooth turned off"
else
do shell script "echo Bluetooth turned on"
end if
end tell
end tell
================================================
FILE: commands/system/brightness.sh
================================================
#!/bin/bash
# Dependency: This script requires `brightness` cli installed: http://bergdesign.com/brightness/
# Install via homebrew: `brew install brightness`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Brightness
# @raycast.mode silent
#
# Optional parameters:
# @raycast.icon ☀️
# @raycast.packageName System brightness
# @raycast.argument1 { "type": "text", "placeholder": "brightness", "percentEncoded": false }
#
# @Documentation:
# @raycast.description Set system brightness
# @raycast.author Antonio Dal Sie
# @raycast.authorURL https://github.com/exodusanto
brightness $(awk '{print $1*$2}' <<<"${1} 0.01")
================================================
FILE: commands/system/caffeinate-disable.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Disable Caffeinate
# @raycast.mode silent
# @raycast.packageName System
#
# Optional parameters:
# @raycast.icon ☕️
# @raycast.needsConfirmation false
#
# Documentation:
# @raycast.description Stops all caffeinate sessions
# @raycast.author Yan Smaliak
# @raycast.authorURL https://github.com/ysmaliak
killall caffeinate
echo "Disable caffeinate"
================================================
FILE: commands/system/caffeinate-enable.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Enable Caffeinate
# @raycast.mode silent
# @raycast.packageName System
#
# Optional parameters:
# @raycast.icon ☕️
# @raycast.needsConfirmation false
# @raycast.argument1 { "type": "text", "placeholder": "Time", "percentEncoded": true, "optional": true }
#
# Documentation:
# @raycast.description Starts a caffeinated session
# @raycast.author Yan Smaliak
# @raycast.authorURL https://github.com/ysmaliak
if [ -z "$1" ]
then
killall caffeinate
caffeinate -t 3600 &>/dev/null &
echo "Enable caffeinate for 1h"
else
unit=$(echo -n $1 | tail -c 1)
timeValueLenght=$((${#1}-1))
timeValue=$(echo $1 | cut -c1-$timeValueLenght)
if [ "$timeValue" -eq "$timeValue" ] 2>/dev/null
then
if [[ $unit == "s" ]]
then
seconds=$(( $timeValue ))
elif [[ $unit == "m" ]]
then
seconds=$(( $timeValue*60 ))
elif [[ $unit == "h" ]]
then
seconds=$(( $timeValue*3600 ))
elif [[ $unit == "d" ]]
then
seconds=$(( $timeValue*86400 ))
else
echo "Wrong time input!"
exit 1
fi
killall caffeinate
caffeinate -t $seconds &>/dev/null &
echo "Enable caffeinate for $1"
else
echo "Wrong time input!"
exit 1
fi
fi
================================================
FILE: commands/system/caffeinate-status.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Caffeinate
# @raycast.mode inline
# @raycast.packageName System
# @raycast.refreshTime 30s
#
# Optional parameters:
# @raycast.icon ☕️
# @raycast.needsConfirmation false
#
# Documentation:
# @raycast.description Shows caffeinate status
# @raycast.author Yan Smaliak
# @raycast.authorURL https://github.com/ysmaliak
caffeinate_ps=$(ps aux | grep '\d caffeinate')
if [ -z "$caffeinate_ps" ]
then
echo "Caffeinate is not active"
else
echo "Caffeinate is running"
fi
================================================
FILE: commands/system/caffeinate-status.swift
================================================
#!/usr/bin/swift
// Required parameters:
// @raycast.schemaVersion 1
// @raycast.title Caffeinate
// @raycast.mode inline
// @raycast.packageName System
// @raycast.refreshTime 30s
//
// Optional parameters:
// @raycast.icon ☕️
// @raycast.needsConfirmation false
//
// Documentation:
// @raycast.description Shows caffeinate status and time left if it's running
// @raycast.author Yan Smaliak
// @raycast.authorURL https://github.com/ysmaliak
import Foundation
func shell(_ command: String) -> String {
let task = Process()
let pipe = Pipe()
task.standardOutput = pipe
task.standardError = pipe
task.arguments = ["-c", command]
task.launchPath = "/bin/bash"
task.launch()
let data = pipe.fileHandleForReading.readDataToEndOfFile()
let output = String(data: data, encoding: .utf8)!
return output
}
func secondsToDhm(_ seconds: Int) -> (Int, Int, Int) {
(seconds / 86400, (seconds % 86400) / 3600, (seconds % 3600) / 60)
}
let caffeinate_processes = shell("ps aux -O lstart | grep '\\d caffeinate'")
if caffeinate_processes.isEmpty {
print("Caffeinate is not active")
exit(0)
}
let formatter = DateFormatter()
formatter.dateFormat = "E MMM d HH:mm:ss yyyy"
let compactDateTimeFormatter = DateFormatter()
compactDateTimeFormatter.dateFormat = "MMM d, HH:mm"
let compactTimeFormatter = DateFormatter()
compactTimeFormatter.dateFormat = "HH:mm"
let currentDateTime = Date()
var maxDateTime: Date?
var latestStartDateTime: Date?
let separate_processes = caffeinate_processes.components(separatedBy: "\n")
separate_processes.forEach { process in
let process_components = process
.components(separatedBy: " ")
.filter { !$0.isEmpty }
if !process_components.isEmpty {
let startDateTimeElements = [process_components[14], process_components[15], process_components[16], process_components[17], process_components[18]]
let startDateTimeString = startDateTimeElements.joined(separator:" ")
if let startDateTime = formatter.date(from: startDateTimeString), let timeInterval = Double(process_components[24]) {
let endDateTime = startDateTime.addingTimeInterval(timeInterval)
if let maxTimeToCompare = maxDateTime {
if endDateTime > maxTimeToCompare {
maxDateTime = endDateTime
latestStartDateTime = startDateTime
}
} else {
maxDateTime = endDateTime
latestStartDateTime = startDateTime
}
} else {
print("Something went wrong!")
exit(1)
}
}
}
if let maxDateTime = maxDateTime, let latestStartDateTime = latestStartDateTime {
let (d, h, m) = secondsToDhm(Int(maxDateTime - currentDateTime))
let hmString: String = (d > 0 ? "\(d)d " : "") + (h > 0 ? "\(h)h " : "") + (m > 0 ? "\(m)m" : "")
let calendar = Calendar.current
let startDateTimeString = calendar.isDate(latestStartDateTime, inSameDayAs: currentDateTime) ?
"at \(compactTimeFormatter.string(from: latestStartDateTime))" :
"on \(compactDateTimeFormatter.string(from: latestStartDateTime))"
print("Started \(startDateTimeString). Expires in \(hmString)")
} else {
print("Something went wrong!")
exit(1)
}
extension Date {
static func - (lhs: Date, rhs: Date) -> TimeInterval {
return lhs.timeIntervalSinceReferenceDate - rhs.timeIntervalSinceReferenceDate
}
}
================================================
FILE: commands/system/capture-fullscreen-to-clipboard.sh
================================================
#!/bin/sh
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Capture Fullscreen to Clipboard
# @raycast.mode silent
# @raycast.packageName System
#
# Optional parameters:
# @raycast.icon 💻
#
# Documentation:
# @raycast.description This script screenshots the entire screen and saves it to the clipboard.
# @raycast.author Aaron Miller
# @raycast.authorURL https://github.com/aaronhmiller
screencapture -c
echo "Screenshot saved to clipboard"
================================================
FILE: commands/system/capture-fullscreen-to-desktop.sh
================================================
#!/bin/sh
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Capture Fullscreen to Desktop
# @raycast.mode silent
# @raycast.packageName System
#
# Optional parameters:
# @raycast.icon 💻
#
# Documentation:
# @raycast.description This script screenshots the entire screen and saves it to the desktop.
# @raycast.author Aaron Miller
# @raycast.authorURL https://github.com/aaronhmiller
screencapture ~/Desktop/"Screen Shot $(date +"%F at %-I.%M.%S %p")".png
echo "Screenshot saved to desktop"
================================================
FILE: commands/system/capture-screen-selection-to-clipboard.sh
================================================
#!/bin/sh
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Capture Screen Selection to Clipboard
# @raycast.mode silent
# @raycast.packageName System
#
# Optional parameters:
# @raycast.icon 💻
#
# Documentation:
# @raycast.description This script screenshots the selected area and saves it to the clipboard.
# @raycast.author Aaron Miller
# @raycast.authorURL https://github.com/aaronhmiller
screencapture -ci
echo "Selection saved to clipboard"
================================================
FILE: commands/system/capture-screen-selection-to-desktop.sh
================================================
#!/bin/sh
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Capture Screen Selection to Desktop
# @raycast.mode silent
# @raycast.packageName System
#
# Optional parameters:
# @raycast.icon 💻
#
# Documentation:
# @raycast.description This script screenshots the selected area and saves it to the desktop.
# @raycast.author Aaron Miller
# @raycast.authorURL https://github.com/aaronhmiller
screencapture -i ~/Desktop/"Screen Shot $(date +"%F at %-I.%M.%S %p")".png
echo "Selection saved to desktop"
================================================
FILE: commands/system/close-finder-windows.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Close All Finder Windows
# @raycast.mode silent
# @raycast.packageName System
#
# Optional parameters:
# @raycast.icon 🔪
#
# Documentation:
# @raycast.description Close all open Finder windows.
# @raycast.author Alexander Steffen
# @raycast.authorURL https://github.com/alexjsteffen
tell application "Finder" to close windows
================================================
FILE: commands/system/copy-availability.swift
================================================
#!/usr/bin/swift
// Required parameters:
// @raycast.schemaVersion 1
// @raycast.title Copy Availability
// @raycast.mode silent
// @raycast.packageName System
//
// Optional parameters:
// @raycast.icon 📅
// @raycast.argument1 { "type": "text", "placeholder": "9:00", "optional": true }
// @raycast.argument2 { "type": "text", "placeholder": "17:00", "optional": true }
//
// Documentation:
// @raycast.description Copies the calendar availability of today.
import AppKit
import EventKit
let now = Date()
let calendar: Calendar = .current
do {
let workDay: (startDate: Date, endDate: Date)
let today: (startDate: Date, endDate: Date, events: [EKEvent])
do {
// Retrieve the range for today (from 00:00 to 23:59)
today.startDate = calendar.startOfDay(for: now)
today.endDate = calendar.date(byAdding: .day, value: 1, to: today.startDate)!
// Parse the optional arguments
let timeFormatter = DateFormatter()
timeFormatter.dateFormat = "HH:mm"
var arguments = try CommandLine.arguments.dropFirst().prefix(2).map { arg throws -> Date? in
var iterator = arg.split(separator: ":").makeIterator()
guard let hours = iterator.next() else { return nil }
let minutes = iterator.next() ?? "00"
guard hours.allSatisfy(\.isNumber),
minutes.allSatisfy(\.isNumber),
let date = timeFormatter.date(from: "\(hours):\(minutes)") else { throw Error.invalidInput(arg) }
return date
}.makeIterator()
// Compose the working day range (checking that start is not after end)
workDay.startDate = arguments.next().flatMap { $0 } ?? calendar.date(bySettingHour: 9, minute: 0, second: 0, of: now)!
workDay.endDate = arguments.next().flatMap { $0 } ?? calendar.date(bySettingHour: 17, minute: 0, second: 0, of: now)!
guard workDay.startDate < workDay.endDate else { throw Error.invalidRange }
// Retrieve all the events for today
let store = EKEventStore()
let predicate = store.predicateForEvents(withStart: today.startDate, end: today.endDate, calendars: nil)
today.events = store.events(matching: predicate).filter { !$0.isAllDay }
}
let availability: String
if today.events.isEmpty {
availability = "I'm available the full day."
} else if calendar.component(.hour, from: now) < 12,
today.events.allSatisfy({ calendar.component(.hour, from: $0.endDate) >= 12 }) {
availability = "I'm available in the morning."
} else if today.events.allSatisfy({ calendar.component(.hour, from: $0.endDate) <= 11 }) {
availability = "I'm available in the afternoon."
} else {
let allowedRange = workDay.startDate...workDay.endDate
let busy = busyRanges(during: allowedRange, events: today.events)
let available = availableRanges(during: allowedRange, busy: busy)
let timeFormatter = DateFormatter()
timeFormatter.dateStyle = .none
timeFormatter.timeStyle = .short
let availableTimes = available
.map { (from: timeFormatter.string(from: $0.lowerBound), to: timeFormatter.string(from: $0.upperBound)) }
.map { "- \($0.from) - \($0.to)" }
.joined(separator: "\n")
availability = "Here's my availability for today:\n\(availableTimes)"
}
NSPasteboard.general.declareTypes([NSPasteboard.PasteboardType.string], owner: nil)
NSPasteboard.general.setString(availability, forType: NSPasteboard.PasteboardType.string)
print("Copied availability")
} catch Error.invalidInput(let arg) {
print("Invalid date input: '\(arg)'")
} catch Error.invalidRange {
print("The input date range is invalid")
} catch {
print("Unknown error.")
}
// MARK: - Convenience
private enum Error: Swift.Error {
case invalidInput(String)
case invalidRange
}
private func busyRanges(during allowedRange: ClosedRange, events: [EKEvent]) -> [ClosedRange] {
let busyRanges = events
.compactMap { $0.startDate...$0.endDate }
.sorted(by: { $0.lowerBound < $1.lowerBound })
var result: [ClosedRange] = []
for busy in busyRanges.sorted(by: { $0.lowerBound < $1.lowerBound }) {
guard busy.upperBound > allowedRange.lowerBound,
busy.lowerBound < allowedRange.upperBound else { continue }
let start = max(busy.lowerBound, allowedRange.lowerBound)
let end = min(busy.upperBound, allowedRange.upperBound)
guard start < end else { continue }
guard let last = result.last else {
result.append(start...end)
continue
}
if start > last.upperBound {
result.append(start...end)
} else {
result[result.endIndex - 1] = min(start, last.lowerBound)...max(end, last.upperBound)
}
}
return result
}
private func availableRanges(during allowedRange: ClosedRange, busy busyRanges: [ClosedRange]) -> [ClosedRange] {
var result: [ClosedRange] = []
var milestone: Date = allowedRange.lowerBound
for busy in busyRanges {
if busy.lowerBound > milestone {
result.append(milestone...busy.lowerBound)
}
milestone = busy.upperBound
}
if milestone < allowedRange.upperBound {
result.append(milestone...allowedRange.upperBound)
}
return result
}
================================================
FILE: commands/system/copy-last-download.swift
================================================
#!/usr/bin/swift
// Required parameters:
// @raycast.schemaVersion 1
// @raycast.title Copy Last Download
// @raycast.mode silent
// @raycast.packageName System
//
// Optional parameters:
// @raycast.icon 💁
//
// Documentation:
// @raycast.description Copy the last downloaded file to the clipboard.
import AppKit
// MARK: - Main
guard let download = getLatestDownload() else {
print("No recent downloads")
exit(1)
}
copyToPasteboard(download)
print("Copied \(download.lastPathComponent)")
// MARK: - Convenience
func getLatestDownload() -> URL? {
guard let downloadsDirectory = FileManager.default.urls(for: .downloadsDirectory, in: .userDomainMask).first else { return nil }
return try? FileManager.default
.contentsOfDirectory(at: downloadsDirectory, includingPropertiesForKeys: [.addedToDirectoryDateKey], options: .skipsHiddenFiles)
.sorted { $0.addedToDirectoryDate > $1.addedToDirectoryDate }
.first
}
func copyToPasteboard(_ url: URL) {
NSPasteboard.general.clearContents()
NSPasteboard.general.writeObjects([url as NSPasteboardWriting])
}
extension URL {
var addedToDirectoryDate: Date {
return (try? resourceValues(forKeys: [.addedToDirectoryDateKey]).addedToDirectoryDate) ?? .distantPast
}
}
================================================
FILE: commands/system/copy-last-screenshot.swift
================================================
#!/usr/bin/swift
// Required parameters:
// @raycast.schemaVersion 1
// @raycast.title Copy Last Screenshot
// @raycast.mode silent
// @raycast.packageName System
// Optional parameters:
// @raycast.icon 📸
// Documentation:
// @raycast.description Copies the last screenshot to the clipboard.
import Cocoa
// MARK: - Main
let query = NSMetadataQuery()
guard let lastScreenshot = query.searchScreenshots()?.first, let path = lastScreenshot.value(forAttribute: "kMDItemPath") as? String else {
print("Cannot find screenshot")
exit(1)
}
let fileURL = URL(fileURLWithPath: path)
NSPasteboard.general.clearContents()
NSPasteboard.general.writeObjects([fileURL as NSPasteboardWriting])
print("Copied last screenshot")
// MARK: - Convenience
extension NSMetadataQuery {
func searchScreenshots() -> [NSMetadataItem]? {
predicate = NSPredicate(format: "kMDItemIsScreenCapture = 1")
sortDescriptors = [NSSortDescriptor(key: "kMDItemFSCreationDate", ascending: false)]
NotificationCenter.default.addObserver(forName: .NSMetadataQueryDidFinishGathering, object: nil, queue: nil) { [weak self] _ in
self?.disableUpdates()
self?.stop()
CFRunLoopStop(CFRunLoopGetCurrent());
}
guard start() else { return nil }
CFRunLoopRun()
return results.compactMap { $0 as? NSMetadataItem }
}
}
================================================
FILE: commands/system/copy-selection-to-clipboard.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Copy Finder Selection to Clipboard
# @raycast.mode silent
# @raycast.packageName System
#
# Optional parameters:
# @raycast.icon ??
#
# Documentation:
# @raycast.description 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.
# @raycast.author Felipe Turcheti
# @raycast.authorURL https://felipeturcheti.com
on run
log "Copying contents of the selected items to the clipboard..."
tell application "Finder"
-- get Finder selected items
set theItems to selection
end tell
-- create a list to store contents of all selected items
set allContents to ""
-- for each item in the Finder selection
repeat with itemRef in theItems
-- get the item path
set theItem to POSIX path of (itemRef as string)
-- read the content of the item
set fileDescriptor to open for access (POSIX file theItem)
set fileContent to read fileDescriptor for (get eof fileDescriptor)
close access fileDescriptor
-- add the content to the list
set allContents to allContents & fileContent & "
"
end repeat
-- set the clipboard to the combined contents
set the clipboard to allContents
end run
================================================
FILE: commands/system/create-new-file-in-finder.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.author Jax0rz
# @authorURL https://github.com/Jax0rz
# @raycast.schemaVersion 1
# @raycast.title Create New File in Finder
# @raycast.mode silent
# @raycast.packageName System
# @raycast.description Create New File in Finder is a script to make your Finder better.You can use this script to create a plain text file.
# Optional parameters:
# @raycast.icon images/new-file.png
set file_name to "untitled"
set file_ext to ".txt"
set is_desktop to false
-- get folder path and if we're in desktop (no folder opened)
try
tell application "Finder"
set this_folder to (folder of the front Finder window) as alias
end tell
on error
-- no open folder windows
set this_folder to path to desktop folder as alias
set is_desktop to true
end try
-- get the new file name (do not override an already existing file)
tell application "System Events"
set file_list to get the name of every disk item of this_folder
end tell
set new_file to file_name & file_ext
set x to 1
repeat
if new_file is in file_list then
set new_file to file_name & " " & x & file_ext
set x to x + 1
else
exit repeat
end if
end repeat
-- create and select the new file
tell application "Finder"
activate
set the_file to make new file at folder this_folder with properties {name:new_file}
if is_desktop is false then
reveal the_file
else
select window of desktop
set selection to the_file
delay 0.1
end if
end tell
-- press enter (rename)
tell application "System Events"
tell process "Finder"
keystroke return
end tell
end tell
================================================
FILE: commands/system/create-new-file.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Create New File
# @raycast.mode silent
# Optional parameters:
# @raycast.icon 📄
# @Documentation:
# @raycast.description Create files in the front window or desktop of the visit
# @raycast.author LokHsu
# @raycast.authorURL https://github.com/lokhsu
set file_name to "untitled"
set file_ext to ".txt"
set is_desktop to false
-- get folder path
try
tell application "Finder"
set this_folder to folder of the front window as alias
end tell
on error -- no open folder windows
set this_folder to path to desktop folder as alias
set is_desktop to true
end try
-- get the new file name (do not override an already existing file)
tell application "Finder"
set file_list to name of every file of this_folder
end tell
set new_file to file_name & file_ext
set x to 1
repeat
if new_file is in file_list then
set new_file to file_name & x & file_ext
set x to x + 1
else
exit repeat
end if
end repeat
-- create and select the new file
tell application "Finder"
activate
set the_file to make new file at folder this_folder with properties {name:new_file}
if is_desktop is false then
reveal the_file
else
select window of desktop
set selection to the_file
delay 0.1
end if
end tell
-- press enter (rename)
tell application "System Events"
tell process "Finder"
keystroke return
end tell
end tell
================================================
FILE: commands/system/custom-window.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Custom Window Size
# @raycast.mode silent
# @raycast.packageName System
# Optional parameters:
# @raycast.icon images/custom-window-size.png
# Documentation:
# @raycast.author Astrit
# @raycast.authorURL https://github.com/astrit
# @raycast.description Resize and center the frontmost window to any custom size.
# @raycast.argument1 { "type": "text", "placeholder": "Width" }
# @raycast.argument2 { "type": "text", "placeholder": "Height" }
on run argv
tell application "System Events"
set frontApp to name of first application process whose frontmost is true
end tell
tell application "Finder"
get bounds of window of desktop
end tell
tell application "Finder"
set desktopBounds to bounds of window of desktop
set screenWidth to item 3 of desktopBounds
set screenHeight to item 4 of desktopBounds
end tell
set theApp to frontApp
set appWidth to "" & ( item 1 of argv )
set appHeight to "" & ( item 2 of argv )
tell application frontApp to activate
tell application "System Events" to tell application process frontApp
try
set size of window 1 to {appWidth, appHeight}
set position of window 1 to {(screenWidth - appWidth) / 2.0, (screenHeight - appHeight) / 2.0}
on error errmess
log errmess
-- no window open
end try
end tell
end run
================================================
FILE: commands/system/default-browser-arc.applescript
================================================
#!/usr/bin/osascript
# Dependency: requires defaultbrowser (https://github.com/kerma/defaultbrowser)
# Install via Homebrew: `brew install defaultbrowser`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Default to Arc
# @raycast.mode silent
# @raycast.packageName Browser
# Optional parameters:
# @raycast.icon images/arc.png
# Documentation:
# @raycast.author Marcos Sánchez-Dehesa
# @raycast.authorURL https://github.com/dehesa
# @raycast.description Set Arc as the default browser.
# check to see what the current browser is
set currentDefaultBrowser to my getCurrentDefaultBrowser()
set repeatCount to 0
tell application "System Events"
try
my changeDefaultBrowser("browser")
repeat until button 2 of window 1 of process "CoreServicesUIAgent" exists
delay 0.01
set repeatCount to repeatCount + 1
if repeatCount = 15 then exit repeat
end repeat
try
# if Chrome is the current default browser, the order of the buttons is reversed. Click button 1 to change the default browser to Arc.
if currentDefaultBrowser contains "com.google.chrome" then
click button 1 of window 1 of process "CoreServicesUIAgent"
else # otherwise click button 2 to change the default browser to Arc.
click button 2 of window 1 of process "CoreServicesUIAgent"
end if
log "Arc is now your default browser"
on error
log "Arc is already your default browser"
end try
on error
log "The \"defaultbrowser\" CLI tool is required: https://github.com/kerma/defaultbrowser 🔥"
end try
end tell
to getCurrentDefaultBrowser()
set filePath to "~/Library/Preferences/com.apple.LaunchServices/com.apple.launchservices.secure.plist"
set output to do shell script "plutil -p " & filePath & " | awk '/LSHandlerRoleAll/{a=$3}/LSHandlerURLScheme/{if($3==\"\\\"https\\\"\") print a}'"
return output
end getCurrentDefaultBrowser
to changeDefaultBrowser(thebrowser)
do shell script "
if ! command -v defaultbrowser &> /dev/null; then
exit 1
fi
defaultbrowser " & thebrowser & "
exit 0
"
end changeDefaultBrowser
================================================
FILE: commands/system/default-browser-chrome.applescript
================================================
#!/usr/bin/osascript
# Dependency: requires defaultbrowser (https://github.com/kerma/defaultbrowser)
# Install via Homebrew: `brew install defaultbrowser`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Default to Chrome
# @raycast.mode silent
# @raycast.packageName Browser
# Optional parameters:
# @raycast.icon images/chrome.png
# Documentation:
# @raycast.author Marcos Sánchez-Dehesa
# @raycast.authorURL https://github.com/dehesa
# @raycast.description Set Google Chrome as the default browser.
set repeatCount to 0
tell application "System Events"
try
my changeDefaultBrowser("chrome")
repeat until button 2 of window 1 of process "CoreServicesUIAgent" exists
delay 0.01
set repeatCount to repeatCount + 1
if repeatCount = 15 then exit repeat
end repeat
try
click button 2 of window 1 of process "CoreServicesUIAgent"
log "Google Chrome is now your default browser"
on error
log "Google Chrome is already your default browser"
end try
on error
log "The \"defaultbrowser\" CLI tool is required: https://github.com/kerma/defaultbrowser 🔥"
end try
end tell
to changeDefaultBrowser(thebrowser)
do shell script "
if ! command -v defaultbrowser &> /dev/null; then
exit 1
fi
defaultbrowser " & thebrowser & "
exit 0
"
end changeDefaultBrowser
================================================
FILE: commands/system/default-browser-chromium.applescript
================================================
#!/usr/bin/osascript
# Dependency: requires defaultbrowser (https://github.com/kerma/defaultbrowser)
# Install via Homebrew: `brew install defaultbrowser`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Default to Chromium
# @raycast.mode silent
# @raycast.packageName Browser
# Optional parameters:
# @raycast.icon images/chrome-icon.png
# Documentation:
# @raycast.author Marcos Sánchez-Dehesa
# @raycast.authorURL https://github.com/dehesa
# @raycast.description Set Chromium as the default browser.
set repeatCount to 0
tell application "System Events"
try
my changeDefaultBrowser("chromium")
repeat until button 2 of window 1 of process "CoreServicesUIAgent" exists
delay 0.01
set repeatCount to repeatCount + 1
if repeatCount = 15 then exit repeat
end repeat
try
click button 2 of window 1 of process "CoreServicesUIAgent"
log "Chromium is now your default browser"
on error
log "Chromium is already your default browser"
end try
on error
log "The \"defaultbrowser\" CLI tool is required: https://github.com/kerma/defaultbrowser 🔥"
end try
end tell
to changeDefaultBrowser(thebrowser)
do shell script "
if ! command -v defaultbrowser &> /dev/null; then
exit 1
fi
defaultbrowser " & thebrowser & "
exit 0
"
end changeDefaultBrowser
================================================
FILE: commands/system/default-browser-firefox.applescript
================================================
#!/usr/bin/osascript
# Dependency: requires defaultbrowser (https://github.com/kerma/defaultbrowser)
# Install via Homebrew: `brew install defaultbrowser`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Default to Firefox
# @raycast.mode silent
# @raycast.packageName Browser
# Optional parameters:
# @raycast.icon images/firefox.png
# Documentation:
# @raycast.author Marcos Sánchez-Dehesa
# @raycast.authorURL https://github.com/dehesa
# @raycast.description Set Firefox as the default browser.
# check to see what the current browser is
set currentDefaultBrowser to my getCurrentDefaultBrowser()
set repeatCount to 0
tell application "System Events"
try
my changeDefaultBrowser("firefox")
repeat until button 2 of window 1 of process "CoreServicesUIAgent" exists
delay 0.01
set repeatCount to repeatCount + 1
if repeatCount = 15 then exit repeat
end repeat
try
# if Chrome is the current default browser, the order of the buttons is reversed. Click button 1 to change the default browser to FF.
if currentDefaultBrowser contains "com.google.chrome" then
click button 1 of window 1 of process "CoreServicesUIAgent"
else # otherwise click button 2 to change the default browser to FF.
click button 2 of window 1 of process "CoreServicesUIAgent"
end if
log "Firefox is now your default browser"
on error
log "Firefox is already your default browser"
end try
on error
log "The \"defaultbrowser\" CLI tool is required: https://github.com/kerma/defaultbrowser 🔥"
end try
end tell
to getCurrentDefaultBrowser()
set filePath to "~/Library/Preferences/com.apple.LaunchServices/com.apple.launchservices.secure.plist"
set output to do shell script "plutil -p " & filePath & " | awk '/LSHandlerRoleAll/{a=$3}/LSHandlerURLScheme/{if($3==\"\\\"https\\\"\") print a}'"
return output
end getCurrentDefaultBrowser
to changeDefaultBrowser(thebrowser)
do shell script "
if ! command -v defaultbrowser &> /dev/null; then
exit 1
fi
defaultbrowser " & thebrowser & "
exit 0
"
end changeDefaultBrowser
================================================
FILE: commands/system/default-browser-front-most-app.applescript
================================================
#!/usr/bin/osascript
# Dependency: requires defaultbrowser (https://github.com/kerma/defaultbrowser/)
# Install via Homebrew: `brew install defaultbrowser`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Set Frontmost App as Default Browser
# @raycast.mode silent
# Browser dev is developer version of Google Chrome
# @raycast.argument1 { "type": "text", "placeholder": "Browser (chrome, dev, safari, firefox)", "optional": true }
# Optional parameters:
# @raycast.packageName Browsing
# @raycast.icon 🧭
# Documentation:
# @raycast.author Yohanes Bandung Bondowoso
# @raycast.authorURL https://github.com/ybbond
# @raycast.description Set Frontmost Web Browser as Default Browser.
# raycastArgv is Raycast argument
on run {raycastArgv}
if (raycastArgv is equal to "") then
tell application "System Events"
tell (first process whose frontmost is true)
set appName to displayed name
end tell
end tell
set browserName to appName
if (appName contains "Brave Browser") then
set browserName to "browser"
else if (appName is equal to "Safari") then
set browserName to "safari"
else if (appName is equal to "Safari Technology Preview") then
set browserName to "safaritechnologypreview"
else if (appName contains "Firefox Dev") then
set browserName to "firefoxdeveloperedition"
# set Google chrome dev as default browser
# it need to put before Chrome
else if (appName contains "dev") then
set browserName to "dev"
else if (appName contains "Chrome") then
set browserName to "chrome"
else if (appName is equal to "Chromium") then
set browserName to "chromium"
else if (appName is equal to "Firefox") then
set browserName to "firefox"
else if (appName is equal to "SigmaOS") then
set browserName to "macos"
else if (appName is equal to "Arc") then
set browserName to "browser"
end if
else
# appName is used for print log message
if (raycastArgv is equal to "dev")
set appName to "Chrome dev"
else
set appName to raycastArgv
end if
set browserName to raycastArgv
end if
# display dialog ("Set defaut browser is " & raycastArgv & "!")
try
set commandResult to do shell script "defaultbrowser" & space & browserName & space & "2>/dev/null "
if (commandResult contains "The command exited with a non-zero status") then
log "Shell command 'defaultbrowser' is required."
else if (commandResult contains "is already set as the default HTTP handler" or commandResult is equal to "") then
log appName & space & "already set as default browser"
else if (commandResult contains "is not available as an HTTP handler") then
log appName & space & "is not a web browser, or not handled yet :("
end if
on error errStr
set commandResult to errStr
if (commandResult contains "The command exited with a non-zero status") then
log "Shell command 'defaultbrowser' is required."
else if (commandResult contains "is already set as the default HTTP handler" or commandResult is equal to "") then
log appName & space & "already set as default browser"
else if (commandResult contains "is not available as an HTTP handler") then
log appName & space & "is not a web browser, or not handled yet :("
end if
end try
try
tell application "System Events"
tell application process "CoreServicesUIAgent"
tell window 1
tell (first button whose name starts with "use")
perform action "AXPress"
log appName & space & "set as default browser"
end tell
end tell
end tell
end tell
end try
end run
================================================
FILE: commands/system/default-browser-safari.applescript
================================================
#!/usr/bin/osascript
# Dependency: requires defaultbrowser (https://github.com/kerma/defaultbrowser)
# Install via Homebrew: `brew install defaultbrowser`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Default to Safari
# @raycast.mode silent
# @raycast.packageName Browser
# Optional parameters:
# @raycast.icon images/safari.png
# Documentation:
# @raycast.author Marcos Sánchez-Dehesa
# @raycast.authorURL https://github.com/dehesa
# @raycast.description Set Safari as the default browser.
# check to see what the current browser is
set currentDefaultBrowser to my getCurrentDefaultBrowser()
set repeatCount to 0
tell application "System Events"
try
my changeDefaultBrowser("safari")
repeat until button 2 of window 1 of process "CoreServicesUIAgent" exists
delay 0.01
set repeatCount to repeatCount + 1
if repeatCount = 15 then exit repeat
end repeat
try
# if Chrome is the current default browser, the order of the buttons is reversed. Click button 1 to change the default browser to Safari.
if currentDefaultBrowser contains "com.google.chrome" then
click button 1 of window 1 of process "CoreServicesUIAgent"
else # otherwise click button 2 to change the default browser to Safari.
click button 2 of window 1 of process "CoreServicesUIAgent"
end if
log "Safari is now your default browser"
on error
log "Safari is already your default browser"
end try
on error
log "The \"defaultbrowser\" CLI tool is required: https://github.com/kerma/defaultbrowser 🔥"
end try
end tell
to getCurrentDefaultBrowser()
set filePath to "~/Library/Preferences/com.apple.LaunchServices/com.apple.launchservices.secure.plist"
set output to do shell script "plutil -p " & filePath & " | awk '/LSHandlerRoleAll/{a=$3}/LSHandlerURLScheme/{if($3==\"\\\"https\\\"\") print a}'"
return output
end getCurrentDefaultBrowser
to changeDefaultBrowser(thebrowser)
do shell script "
if ! command -v defaultbrowser &> /dev/null; then
exit 1
fi
defaultbrowser " & thebrowser & "
exit 0
"
end changeDefaultBrowser
================================================
FILE: commands/system/delete-selected-files.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Delete Selected Files
# @raycast.mode silent
# Optional parameters:
# @raycast.icon 🗑
# @raycast.packageName System
# Documentation:
# @raycast.description Move selected files in Finder to Trash
# @raycast.author Vicent Gozalbes
# @raycast.authorURL https://github.com/vigosan
file_count=$(osascript <<'ENDAPPLE'
tell application "Finder"
set selectedItems to selection
if (count of selectedItems) is 0 then
return 0
end if
delete selectedItems
return count of selectedItems
end tell
ENDAPPLE
)
if [ "$file_count" -eq 0 ]; then
exit 1
fi
if [ $file_count -eq 1 ]; then
message="1 item moved to Trash"
else
message="$file_count items moved to Trash"
fi
osascript -e "display notification \"$message\" with title \"Trash\""
================================================
FILE: commands/system/disk-free.sh
================================================
#!/bin/bash
# Addapted from existing Alfred workflow
# https://github.com/packal/repository/tree/master/com.ctn.diskfree
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Disk Free
# @raycast.packageName Utils
# @raycast.mode fullOutput
# Optional parameters:
# @raycast.packageName System
# @raycast.icon 💾
# Documentation:
# @raycast.description Show free space in your mounted disks
# @raycast.author Juan Luis Romero
# @raycast.authorURL https://github.com/JuanluR8
# EXAMPLE:
# Macintosh HD: 95% (361 Gb) free
# 15 Gb used of 500 Gb total
GREEN='\033[1;32m'
YELLOW='\033[1;33m'
RED='\033[1;31m'
NC='\033[0;m'
while read -r item; do
[[ $item == /dev/* ]] || continue
items=($item)
path="${items[@]:8}"
[[ "$path" == "/" ]] && name="$(diskutil info ${items[0]} | sed -nE 's/^ *Volume Name: +([^ ].*) *$/\1/p')" || name="${path##*/}"
size=${items[1]:0:$((${#items[1]}-1))}
size_unit=${items[1]:$((${#items[1]}-1))}b
used=${items[2]:0:$((${#items[2]}-1))}
used_unit=${items[2]:$((${#items[2]}-1))}b
free=${items[3]:0:$((${#items[3]}-1))}
free_unit=${items[3]:$((${#items[3]}-1))}b
perc=$((100-${items[4]:0:$((${#items[4]}-1))}))
color=$NC
if [[ perc -ge 70 ]]; then
color=$GREEN
elif [[ perc -lt 70 ]] && [[ perc -ge 30 ]]; then
color=$YELLOW
else
color=$RED
fi
echo -e $name':' ${color} $perc'%' ${NC} '('$free $free_unit') free'
echo $used $used_unit 'used of' $size $size_unit 'total'
echo ''
done < <(df -Hl)
================================================
FILE: commands/system/disk-usage.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Disk Usage
# @raycast.mode inline
# @raycast.refreshTime 1m
# Optional parameters:
# @raycast.icon 💿
# @raycast.packageName System
# Documentation:
# @raycast.description Show disk usage for / (root)
# @raycast.author Jesse Claven
# @raycast.authorURL https://github.com/jesse-c
# Example:
#
# Filesystem Size Used Avail Capacity iused ifree %iused Mounted on
# /dev/disk1s6s1 113Gi 15Gi 3.4Gi 82% 563983 1182278497 0% /
x=$(df -h / | awk 'FNR == 2 {printf "Root: %s available of %s",$4,$2;}')
echo "$x"
================================================
FILE: commands/system/dismiss-notifications.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Dismiss Notifications
# @raycast.mode silent
# Optional parameters:
# @raycast.icon 🔕
# @raycast.packageName System
# Documentation:
# @raycast.description Close all notification alerts staying on screen, e.g., Calendar notifications.
# @raycast.author benyn
# @raycast.authorURL github.com/benyn
tell application "System Events" to tell process "NotificationCenter"
-- Exit if there are no visible notifications.
if not (window "Notification Center" exists) then return
-- `notificationContainer` refers to the UI element (of class `group`) holding notifications and can be either:
-- - A single, individual notification, or
-- - A collection of individual notifications and groups of stacked notifications.
set notificationContainer to a reference to group 1 of scroll area 1 of group 1 of group 1 of window "Notification Center"
-- If it is a collection, close notifications and groups in reverse order to avoid index changes.
set notificationGroups to a reference to groups of notificationContainer
repeat with i from (number of notificationGroups) to 1 by -1
set g to item i of notificationGroups
repeat with a in (actions of g whose description is "Close" or description starts with "Clear")
-- Ignore errors that happen if the last remaining item is an individual notification,
-- and `notificationCenter` is no longer a `group` of `group`s.
-- The final remaining notification will be closed in the second repeat statement below.
ignoring application responses
perform a
end ignoring
end repeat
end repeat
-- Close the `notificationContainer` itself. This handles:
-- - A single, individual notification that was `notificationContainer` from the start, or
-- - The last remaining individual notification after the loop above.
repeat with a in (actions of notificationContainer whose description is "Close" or description starts with "Clear")
perform a
end repeat
end tell
-- Prevent Raycast from displaying the successful result message.
return
================================================
FILE: commands/system/dnd-off.sh
================================================
#!/bin/bash
# Dependency: do-not-disturb-cli (https://github.com/sindresorhus/do-not-disturb-cli)
# Install via npm: `npm install --global do-not-disturb-cli`
## Contributions welcome for a reliable, dependency-free version.
# @raycast.title Turn Off Do Not Disturb
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Turn off "do not disturb" mode. Does [not work on Big Sur](https://github.com/sindresorhus/do-not-disturb-cli/issues/2).
# @raycast.icon 😴
# @raycast.mode silent
# @raycast.packageName System
# @raycast.schemaVersion 1
if ! command -v do-not-disturb &> /dev/null; then
echo "do-not-disturb-cli is required (https://github.com/sindresorhus/do-not-disturb-cli).";
exit 1;
fi
status=$(do-not-disturb status)
if [[ $status = "off" ]]; then
echo "DND already off"
exit 0
fi
do-not-disturb off
status=$(do-not-disturb status)
if [[ $status = "off" ]]; then
echo "Turned DND off"
else
echo "Unable to turn DND off"
fi
================================================
FILE: commands/system/dnd-on.sh
================================================
#!/bin/bash
# Dependency: do-not-disturb-cli (https://github.com/sindresorhus/do-not-disturb-cli)
# Install via npm: `npm install --global do-not-disturb-cli`
## Contributions welcome for a reliable, dependency-free version.
# @raycast.title Turn On Do Not Disturb
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Turn on "do not disturb" mode. Does [not work on Big Sur](https://github.com/sindresorhus/do-not-disturb-cli/issues/2).
# @raycast.icon 😴
# @raycast.mode silent
# @raycast.packageName System
# @raycast.schemaVersion 1
if ! command -v do-not-disturb &> /dev/null; then
echo "do-not-disturb-cli is required (https://github.com/sindresorhus/do-not-disturb-cli).";
exit 1;
fi
status=$(do-not-disturb status)
if [[ $status = "on" ]]; then
echo "DND already on"
exit 0
fi
do-not-disturb on
status=$(do-not-disturb status)
if [[ $status = "on" ]]; then
echo "Turned DND on"
else
echo "Unable to turn DND on"
fi
================================================
FILE: commands/system/do-not-disturb.sh
================================================
#!/usr/bin/env bash
# Dependency: This script requires `calm-notifications` cli installed: https://github.com/vitorgalvao/tiny-scripts/blob/master/calm-notifications
# Install via homebrew: `brew install vitorgalvao/tiny-scripts/calm-notifications`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Do Not Disturb
# @raycast.mode compact
#
# Optional parameters:
# @raycast.icon 🔕
# @raycast.packageName System
# @raycast.argument1 { "type": "text", "placeholder": "Command (default: toggle)", "optional": true, "percentEncoded": true }
#
# @Documentation:
# @raycast.description Do Not Disturb
# @raycast.author Antonio Dal Sie
# @raycast.authorURL https://github.com/exodusanto
cmd=${1:-"toggle"}
if [[ "$cmd" != "on" && "$cmd" != "off" && "$cmd" != "toggle" ]]; then
echo "Unsupported command: $1 (must be [on/off/toggle])"
exit 1
fi
calm-notifications $cmd
echo "Do Not Disturb $(calm-notifications status)"
================================================
FILE: commands/system/dock-autohide-toggle.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Toggle Dock Autohide
# @raycast.mode silent
# Optional parameters:
# @raycast.icon 🤖
# @raycast.packageName System
# Documentation:
# @raycast.description Toggle the Dock Autohide
# @raycast.author Jelte Lagendijk
# @raycast.authorURL https://raycast.com/j3lte
autohide=$(defaults read com.apple.dock autohide)
if [[ $autohide == 1 ]]; then
defaults write com.apple.dock autohide -bool false; killall Dock
else
defaults write com.apple.dock autohide -bool true; killall Dock
fi
================================================
FILE: commands/system/dock-set-autohide.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Dock Set Autohide
# @raycast.mode silent
# Optional parameters:
# @raycast.icon 🤖
# @raycast.argument1 { "type": "dropdown", "placeholder": "On/Off", "data": [{"title": "Off", "value": "false"}, {"title": "On", "value": "true"}] }
# @raycast.packageName System
# Documentation:
# @raycast.description Set the Dock autohide
# @raycast.author Jelte Lagendijk
# @raycast.authorURL https://raycast.com/j3lte
defaults write com.apple.dock autohide -bool $1; killall Dock
================================================
FILE: commands/system/dock-set-position.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Dock Position
# @raycast.mode silent
# Optional parameters:
# @raycast.icon 🤖
# @raycast.argument1 { "type": "dropdown", "placeholder": "Position on Screen", "data": [{"title": "Left", "value": "left"}, {"title": "Right", "value": "right"}, {"title": "Bottom", "value": "bottom"}] }
# @raycast.packageName System
# Documentation:
# @raycast.description Set the position of the Dock in the screen
# @raycast.author Jelte Lagendijk
# @raycast.authorURL https://raycast.com/j3lte
defaults write com.apple.dock orientation -string $1; killall Dock
================================================
FILE: commands/system/eject-all-disks.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Eject All Disks
# @raycast.mode silent
# @raycast.packageName System
# Optional parameters:
# @raycast.icon 📀
# Documentation:
# @raycast.description Ejects all mounted disk images.
tell application "Finder" to eject (every disk whose ejectable is true and local volume is true and free space is not equal to 0)
================================================
FILE: commands/system/empty-clipboard.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Empty Clipboard
# @raycast.mode silent
# Optional parameters:
# @raycast.icon 📋
# @raycast.packageName System
# Documentation:
# @raycast.description Empty Clipboard
/usr/bin/pbcopy < /dev/null
echo "Clipboard emptied"
================================================
FILE: commands/system/empty-trash.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Empty Trash
# @raycast.mode silent
# @raycast.packageName System
# Optional parameters:
# @raycast.icon 🗑
# Documentation:
# @raycast.description Empty the trash.
on run
try
tell application "Finder" to empty trash
end try
end run
================================================
FILE: commands/system/flush-dns.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Flush DNS
# @raycast.mode silent
# @raycast.packageName System
# Optional parameters:
# @raycast.icon 💨
# Documentation:
# @raycast.description Flush DNS cache
# @raycast.author Felipe Turcheti
# @raycast.authorURL https://felipeturcheti.com
sudo dscacheutil -flushcache
sudo killall -HUP mDNSResponder
echo "DNS cache flushed"
================================================
FILE: commands/system/inline-cpu-usage-percent.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title CPU Usage
# @raycast.mode inline
# @raycast.packageName System
# @raycast.refreshTime 10s
# Optional parameters:
# @raycast.icon 🖥️
# Documentation:
# @raycast.description Display CPU usage percent
# @raycast.author Juan Luis Romero
# @raycast.authorURL https://github.com/JuanluR8
output=$(top -l 1 | grep "CPU usage")
cpu_usage=$(echo "$output" | awk -F " " '{print $3}' | cut -d% -f1)
echo "CPU Usage: ${cpu_usage}%"
================================================
FILE: commands/system/kill-a-process-on-port.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Kill a process on PORT
# @raycast.mode compact
# Optional parameters:
# @raycast.icon 🚫
# @raycast.argument1 { "type": "text", "placeholder": "Ports (e.g. 3000 5000)" }
# Documentation:
# @raycast.description Kill running processes on the given ports
# @raycast.author aaqifshafi
# @raycast.authorURL https://github.com/aaqifshafi
if [ $# -eq 0 ]; then
echo "Provide at least one port number."
exit 1
fi
for port in "$@"
do
pid=$(lsof -ti tcp:$port)
if [ -n "$pid" ]; then
kill -9 $pid
echo "Killed process $pid on port $port"
else
echo "No process found on port $port"
fi
done
================================================
FILE: commands/system/kill-airdrop.processes.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Kill AirDrop Processes
# @raycast.mode silent
# @raycast.packageName System
# Optional parameters:
# @raycast.icon 🔫
# @Documentation:
# @raycast.description Force kill all AirDrop processes
# @raycast.author Linus Salzmann
# @raycast.authorURL https://github.com/linus569
killall -9 'AirDrop'
================================================
FILE: commands/system/kill-process.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Kill Running Process
# @raycast.mode silent
# @raycast.packageName System
#
# Optional parameters:
# @raycast.icon ⚠️
# @raycast.argument1 { "type": "text", "placeholder": "process name" }
# Documentation:
# @raycast.description Force kill a running process
# @raycast.author Gustavo Santana
# @raycast.authorURL https://github.com/gumadeiras
pkill -9 "$1"
================================================
FILE: commands/system/largest-cpu-process.sh
================================================
#!/bin/bash
# @raycast.title Largest CPU Process
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Report process with largest system CPU usage.
# @raycast.icon 📈
# @raycast.mode inline
# @raycast.packageName System
# @raycast.refreshTime 3m
# @raycast.schemaVersion 1
output=$(ps -exco pcpu,comm | sort -k 1 -n -r | head -n 1)
percentage=$(echo -e "$output" | awk -F " " '{ st = index($0," ");print $1}')
# Using awk like in largest-ram-consumer doesn't work, so do this instead.
cmd=${output/$percentage/}
# Remove leading whitespace...?
cmd=$(echo "$cmd" | awk '{$1=$1};1')
echo "${cmd} - ${percentage}%"
================================================
FILE: commands/system/largest-ram-process.sh
================================================
#!/bin/bash
# @raycast.title Largest RAM Process
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Report process with largest system RAM usage.
# @raycast.icon 📈
# @raycast.mode inline
# @raycast.packageName System
# @raycast.refreshTime 3m
# @raycast.schemaVersion 1
output=$(ps -exco rss,comm | sort -k 1 -n -r | head -n 1)
kbytes=$(echo "$output" | awk -F " " '{ st = index($0," ");print $1}')
cmd=$(echo "$output" | awk -F " " '{ st = index($0," ");print substr($0,st+1)}')
## Kilobytes (no decimal places)
print_as_kb=$(echo "$kbytes < 1024" | bc -l)
if (( print_as_kb )); then
echo "${cmd} - ${kbytes} KB"
exit 0
fi
## Megabytes (one decimal place)
mbytes=$(echo "scale=1; $kbytes / 1024" | bc -l)
print_as_mb=$(echo "$mbytes < 1024" | bc -l)
if (( print_as_mb )); then
echo "${cmd} - ${mbytes} MB"
exit 0
fi
## Gigabytes (two decimal places)
gbytes=$( echo "scale=2; $kbytes / 1024 / 1024" | bc -l)
echo "${cmd} - ${gbytes} GB"
================================================
FILE: commands/system/list-processes.rb
================================================
#!/usr/bin/ruby
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Running processes
# @raycast.mode fullOutput
# @raycast.packageName System
# Optional parameters:
# @raycast.icon 🔡
# @raycast.argument1 { "type": "text", "placeholder": "Paths (no)", "optional": true }
# @raycast.argument2 { "type": "text", "placeholder": "Count (15)", "optional": true }
# Documentation:
# @raycast.description List running app showing their process id, CPU usage, name, and optionally the process path.
# @raycast.author Roland Leth
# @raycast.authorURL https://runtimesharks.com
items = []
showPaths = ["yes", "y", "true"].include?(ARGV[0])
count = ARGV[1] == "" ? "15" : ARGV[1]
# Assemble an array of each matching process.
# -e shows all processes, -c shows only the executable name.
# The pid, pcpu, and comm show only the process's PID, CPU usage and path, respectively.
processes = `ps -eo pid,pcpu,comm | sort -nrk 2,3 | head -n #{count}`.split("\n")
processes.each do |process|
# Extract the PID, CPU usage, and path from the line (lines are in the form of `123 12.3 /path/to/process`).
processId, processCpu, processPath = process.match(/(\d+)\s+(\d+[\.|\,]\d+)\s+(.*)/).captures
# Isolate the name of the process.
processName = processPath.match(/[^\/]*[^\/]*$/i)[0]
base = processCpu + "% @ " + processName + " (" + processId + ")"
if showPaths then
items.push(base + " -- " + processPath)
else
items.push(base)
end
end
puts items.join("\n")
================================================
FILE: commands/system/magic-keyboard-switcher/README.md
================================================
# magic-keyboard-switcher
Script command to easility switch the bluetooth connectivity of a single Magic Keyboard between several computers.
## How to setup
1. Install [blueutil](https://github.com/toy/blueutil). You can use [brew](https://brew.sh/) - `brew install blueutil`
2. Find out your Magic Keyboard bluetooth MAC address. With the keyboard connected, keep the Option key pressed while you click on your status bar bluetooth icon.
3. Open the script file, set your Magic Keyboard bluetooth MAC address in the `BTMAC` variable and review the blueutil binary location set in the `BIN` variable.
4. Remove `.template` from the file name.
5. Say Ok when prompted about giving Bluetooth permissions to Raycast after executing the script command.
## How to switch the Magic Keyboard between computers
It's desirable to have Raycast and this script command installed in both computers.
First, run the script command in the one that has the keyboard currently connected. It will disconnect it and make it discoverable.
Second, run the script command in the other computer. It should connect it.
================================================
FILE: commands/system/magic-keyboard-switcher/magic-keyboard-switcher.template.sh
================================================
#!/bin/bash
# Dependency: This script requires `blueutil` cli installed: https://github.com/toy/blueutil
# Install via homebrew: `brew install blueutil`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Magic Keyboard switcher
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/logo.png
# @raycast.packageName System
# Documentation:
# @raycast.author blastik
# @raycast.authorURL https://github.com/blastik
# @raycast.description Switch a single magic keyboard between computers
# blueutil location
BIN=/opt/homebrew/bin/blueutil
# Your Magic Keyboard MAC Address
BTMAC='XX:XX:XX:XX:XX:XX'
CMD_VAL="$($BIN --is-connected $BTMAC)"
CMD_UNPAIR="$BIN --unpair $BTMAC"
CMD_PAIR="$BIN --pair $BTMAC"
CMD_CONN="$BIN --connect $BTMAC"
if ! command -v blueutil &> /dev/null; then
echo "blueutil command is required (https://github.com/toy/blueutil).";
exit 1;
fi
if [[ "$CMD_VAL" -eq 1 ]]; then
echo "Connected to $BTMAC"
echo "Going to disconnect $BTMAC"
$($CMD_UNPAIR)
if [[ $? -eq 0 ]]; then
echo "Disconnected from $BTMAC"
else
echo "Failed to disconnect from $BTMAC"
exit 1
fi
else
echo "Not connected to $BTMAC"
$($CMD_PAIR)
sleep 1
$($CMD_CONN)
if [[ $? -eq 0 ]]; then
echo "Connected to $BTMAC"
else
echo "Failed to connect to $BTMAC"
exit 1
fi
fi
================================================
FILE: commands/system/meeting_summary_script.swift
================================================
#!/usr/bin/swift
// Required parameters:
// @raycast.schemaVersion 1
// @raycast.title Copy Meeting Summary
// @raycast.mode silent
// @raycast.packageName System
//
// Optional parameters:
// @raycast.icon 📝
//
// Documentation:
// @raycast.description Copies a summary of today's meetings to the clipboard.
import AppKit
import EventKit
let now = Date()
let calendar: Calendar = .current
do {
let today: (startDate: Date, endDate: Date, events: [EKEvent])
do {
// Retrieve the range for today (from 00:00 to 23:59)
today.startDate = calendar.startOfDay(for: now)
today.endDate = calendar.date(byAdding: .day, value: 1, to: today.startDate)!
// Retrieve all the events for today
let store = EKEventStore()
let predicate = store.predicateForEvents(withStart: today.startDate, end: today.endDate, calendars: nil)
today.events = store.events(matching: predicate)
.filter { !$0.isAllDay } // Exclude all-day events
.sorted { $0.startDate < $1.startDate } // Sort by start time
}
let summary: String
if today.events.isEmpty {
summary = "No meetings scheduled for today."
} else {
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .full
dateFormatter.timeStyle = .none
let todayString = dateFormatter.string(from: now)
let timeFormatter = DateFormatter()
timeFormatter.dateStyle = .none
timeFormatter.timeStyle = .short
timeFormatter.timeZone = TimeZone.current
let meetingList = today.events.map { event in
let startTime = timeFormatter.string(from: event.startDate)
let title = event.title ?? "Untitled Event"
let timezone = timeFormatter.timeZone.abbreviation() ?? ""
var meetingInfo = timezone.isEmpty ? "• \(startTime): \(title)" : "• \(startTime) \(timezone): \(title)"
// Add location if available
if let location = event.location, !location.isEmpty {
meetingInfo += " (\(location))"
}
// Add notes if available (first line only to keep it concise)
if let notes = event.notes, !notes.isEmpty {
let firstLine = notes.components(separatedBy: .newlines).first ?? ""
let cleanedNotes = firstLine.trimmingCharacters(in: .whitespacesAndNewlines)
// Filter out junk characters (like the -::~: pattern)
let validNotes = cleanedNotes.filter { char in
char.isLetter || char.isNumber || char.isWhitespace || char.isPunctuation && !"-:~".contains(char)
}
if !validNotes.isEmpty && validNotes.count <= 100 && !validNotes.allSatisfy({ "-:~".contains($0) }) {
meetingInfo += "\n Notes: \(String(validNotes))"
}
}
return meetingInfo
}.joined(separator: "\n")
let meetingCount = today.events.count
summary = """
Meetings:
\(meetingList)
"""
}
NSPasteboard.general.declareTypes([NSPasteboard.PasteboardType.string], owner: nil)
NSPasteboard.general.setString(summary, forType: NSPasteboard.PasteboardType.string)
print("Copied meeting summary to clipboard")
} catch {
print("Error retrieving calendar events: \(error)")
}
================================================
FILE: commands/system/minimize-all-windows.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Minimize All Windows
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/minimize-window.png
# @raycast.packageName System
# Documentation:
# @raycast.author Ernest Ojeh
# @raycast.authorURL https://github.com/namzo
# @raycast.description This script minimizes all windows of currently running apps
tell application "System Events"
keystroke "hm" using {command down, option down}
end tell
================================================
FILE: commands/system/modify-extension.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Modify File Extension
# @raycast.mode compact
# Optional parameters:
# @raycast.icon 🌵
# @raycast.argument1 { "type": "text", "placeholder": "Before" }
# @raycast.argument2 { "type": "text", "placeholder": "After" }
# @Documentation:
# @raycast.description Batch modify the file in the current directory or the specified extension of the selected file
# @raycast.author LokHsu
# @raycast.authorURL https://github.com/lokhsu
finder=$(
osascript </dev/null; then
echo " (No Internet)"
fi
}
current_device=$(route get default 2>/dev/null | grep "interface" | awk '{print $2}')
# Exit if there's no connection
if [ -z "$current_device" ]; then
echo "No connection"
exit 0;
fi
service_info=$(networksetup -listnetworkserviceorder | grep "$current_device")
service_name=$(echo "$service_info" | awk -F "(, )|(: )|[)]" '{print $2}')
wifi_ssid=$(get_wifi_ssid)
network_status=""
if grep -q "USB" <<< "$service_name"; then
network_status+="Ethernet"
network_status+=$(get_internet_status)
# Check if also connected to Wi-fi
if [ -n "$wifi_ssid" ]; then
network_status+=" | $wifi_ssid"
fi
elif grep -q "Wi-Fi" <<< "$service_name"; then
network_status+="$wifi_ssid"
network_status+=$(get_internet_status)
fi
echo "$network_status"
================================================
FILE: commands/system/new-email.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Create Email
# @raycast.mode silent
# @raycast.author Brandon Escamilla
# @raycast.authorURL https://github.com/brandonescamilla
# Optional parameters:
# @raycast.icon 📧
# @raycast.packageName System
# @raycast.argument1 { "type": "text", "placeholder": "To", "optional": true, "percentEncoded": true }
# @raycast.argument2 { "type": "text", "placeholder": "Subject", "optional": true, "percentEncoded": true }
# @raycast.argument3 { "type": "text", "placeholder": "Body", "optional": true, "percentEncoded": true }
# Documentation:
# @raycast.description Opens default email application, and creates a new email with the given inputs.
open "mailto:${1}?subject=${2}&body=${3}"
================================================
FILE: commands/system/nightshift.sh
================================================
#!/bin/bash
# Dependency: This script requires `nightlight` to be installed: https://github.com/smudge/nightlight
# Install via homebrew: `brew install smudge/smudge/nightlight`
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Toggle Night Shift
# @raycast.mode compact
# Optional parameters:
# @raycast.icon 🌘
# @raycast.packageName System
# Documentation:
# @raycast.description Toggle Night Shift mode (until tomorrow/sunrise). Required [nightlight](https://github.com/smudge/nightlight)
# @raycast.author BhEaN
# @raycast.authorURL https://github.com/bhean
if ! command -v nightlight &> /dev/null; then
echo "Download nightlight is required (https://github.com/smudge/nightlight)".
exit 1;
fi
nightlight toggle
status=$(nightlight status)
echo "Night Shift ${status}"
================================================
FILE: commands/system/ocr.swift
================================================
#!/usr/bin/swift
// Required parameters:
// @raycast.schemaVersion 1
// @raycast.title OCR
// @raycast.mode silent
// Optional parameters:
// @raycast.icon 🖼
// @raycast.packageName Productivity
// Documentation:
// @raycast.author zhe
// @raycast.authorURL https://github.com/wmszhe
// @raycast.description 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
import Foundation
import CoreImage
import Cocoa
import Vision
let screenCapturePath = "/tmp/ocr.png"
let recognitionLanguages = ["zh-Hans", "en-US"]
let joiner = " "
@discardableResult
func screenCapture(_ command: String) throws -> String {
let task = Process()
let pipe = Pipe()
task.launchPath = "/bin/bash"
task.arguments = ["-c", command]
task.standardOutput = pipe
task.standardError = pipe
try task.run()
let data = pipe.fileHandleForReading.readDataToEndOfFile()
if let output = String(data: data, encoding: .utf8) {
return output
} else {
throw NSError(domain: "error", code: -1, userInfo: nil)
}
}
func convertCIImageToCGImage(inputImage: CIImage) -> CGImage? {
let context = CIContext(options: nil)
return context.createCGImage(inputImage, from: inputImage.extent)
}
func paste(text: String) {
let pasteboard = NSPasteboard.general
pasteboard.declareTypes([.string], owner: nil)
pasteboard.clearContents()
pasteboard.setString(text, forType: .string)
}
func recognizeTextHandler(request: VNRequest, error: Error?) {
guard let observations = request.results as? [VNRecognizedTextObservation] else {
return
}
let recognizedStrings = observations.compactMap { observation in
// Return the string of the top VNRecognizedText instance.
observation.topCandidates(1).first?.string
}
// Process the recognized strings.
let result = recognizedStrings.joined(separator: joiner)
print("The text content is: " + result)
paste(text: result)
}
func detectText(fileName: URL) {
guard
let ciImage = CIImage(contentsOf: fileName),
let img = convertCIImageToCGImage(inputImage: ciImage)
else {
return
}
let requestHandler = VNImageRequestHandler(cgImage: img)
// Create a new request to recognize text.
let request = VNRecognizeTextRequest(completionHandler: recognizeTextHandler)
request.recognitionLanguages = recognitionLanguages
do {
// Perform the text-recognition request.
try requestHandler.perform([request])
} catch {
print("Unable to perform the requests: \(error).")
}
}
func detectImage(fileName: URL) -> Bool {
let detector = CIDetector(ofType: CIDetectorTypeQRCode, context: nil, options: nil)
guard let ciImage = CIImage(contentsOf: fileName), let features = detector?.features(in: ciImage) else {
return false
}
var isQRCode = false
var result = ""
for feature in features as! [CIQRCodeFeature] {
if feature.type == "QRCode" {
isQRCode = true
}
result += feature.messageString ?? ""
result += "\n"
}
if isQRCode {
print("QR code analysis results: " + result)
paste(text: result)
}
return isQRCode
}
func main() {
// Only support the system above macOS 10.15
guard #available(OSX 10.15, *) else {
return print("Only support the system above macOS 10.15")
}
do {
// It must be ensured that the screenshot is preserved successfully
try screenCapture("/usr/sbin/screencapture -i " + screenCapturePath)
print("screen capture complete, Image preservation location: " + screenCapturePath)
} catch {
return print("\(error)")
}
// Determine whether the picture contains a QR code, if it contain a QR code, Copy the QR code content to the clipboard
guard detectImage(fileName: URL(fileURLWithPath: screenCapturePath)) else {
// If do not include QR codes, identify text content and supplement to clipboard
return detectText(fileName: URL(fileURLWithPath: screenCapturePath))
}
}
main()
================================================
FILE: commands/system/open-folder.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open Folder
# @raycast.mode silent
# @raycast.packageName System
#
# Optional parameters:
# @raycast.icon 📁
# @raycast.currentDirectoryPath /
# @raycast.needsConfirmation false
# @raycast.argument1 { "type": "text", "placeholder": "folder_Path", "optional": false }
#
# Documentation:
# @raycast.description Open a folder on macOS
# @raycast.author Bin Hua
# @raycast.authorURL https://github.com/hzb
if [[ ${1} =~ "~" ]]
then
open $(sed -r 's#~#'$HOME'#' <<< "$1")
else
open ${1}
fi
================================================
FILE: commands/system/open-image-from-clipboard.sh
================================================
#!/bin/bash
# Dependency: `brew install pngpaste coreutils`
# pngpaste required to grab image from clipboard
# coreutils required to create temp file with suffix
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open Image
# @raycast.mode compact
# Optional parameters:
# @raycast.icon 📋
# @raycast.packageName Clipboard
# Documentation:
# @raycast.description Open Image from Clipboard in Preview for OCR or other purposes.
# @raycast.author xxchan
# @raycast.authorURL https://github.com/xxchan
tempfile=$(gmktemp --suffix=.png) && pngpaste $tempfile && open $tempfile
================================================
FILE: commands/system/open-last-download.swift
================================================
#!/usr/bin/swift
// Required parameters:
// @raycast.schemaVersion 1
// @raycast.title Open Last Download
// @raycast.mode silent
// @raycast.packageName System
// Optional parameters:
// @raycast.icon 💁♂️
// Documentation:
// @raycast.description Opens the last downloaded file.
import AppKit
// MARK: - Convenience
extension URL {
var addedToDirectoryDate: Date {
return (try? resourceValues(forKeys: [.addedToDirectoryDateKey]).addedToDirectoryDate) ?? .distantPast
}
}
func failure(_ message: String) -> Never {
print(message)
exit(1)
}
// MARK: - Main
do {
let downloadsDirectory = FileManager.default.urls(for: .downloadsDirectory, in: .userDomainMask).first!
let downloads = try FileManager.default.contentsOfDirectory(at: downloadsDirectory, includingPropertiesForKeys: [.addedToDirectoryDateKey], options: .skipsHiddenFiles)
guard let lastDownload = downloads.sorted(by: { $0.addedToDirectoryDate > $1.addedToDirectoryDate }).first else {
failure("No downloaded files")
}
NSWorkspace.shared.open(lastDownload)
} catch {
failure(error.localizedDescription)
}
================================================
FILE: commands/system/open-selection-with.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open Selection With
# @raycast.mode silent
# @raycast.packageName System
# @raycast.argument1 { "type": "text", "placeholder": "Application", "optional": false }
#
# Optional parameters:
# @raycast.icon 🗃
#
# Documentation:
# @raycast.description Open selected items in Finder with the given application.
# @raycast.author Felipe Turcheti
# @raycast.authorURL https://felipeturcheti.com
on run {appName}
log "Opening selection with \"" & appName & "\"…"
-- get the bundle id for the application name received as a parameter
set bundleId to id of application appName
tell application "Finder"
-- get Finder selected items
set theItems to selection
-- get the path for the application with the bundle id defined above
set appPath to (POSIX path of (application file id bundleId as alias))
end tell
-- for each item in the Finder selection
repeat with itemRef in theItems
-- get the item path
set theItem to POSIX path of (itemRef as string)
-- set a shell command to open the item with the desired application
-- note:
-- opening the file with applescript often results in permission errors
-- but opening it with a shell script seems to bypass this issue
set command to "open -a " & quoted form of appPath & " " & quoted form of theItem
do shell script command
end repeat
end run
================================================
FILE: commands/system/otp.sh
================================================
#!/bin/bash
# Dependency: This script requires `apw`, `jq` and `awk` to be installed and in $PATH
#
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title One-Time Password
# @raycast.mode silent
#
# Optional parameters:
# @raycast.icon 🔑
# @raycast.packageName System
# @raycast.argument1 { "type": "text", "placeholder": "Domain" }
# @raycast.argument2 { "type": "text", "placeholder": "Username Index", "optional": true }
#
# @raycast.description Get One-Time Password (OTP) from Apple Password Manager
# @raycast.author Angelos Michalopoulos
# @raycase.authorURL https://github.com/miagg
if ! command -v apw &> /dev/null || ! command -v jq &> /dev/null || ! command -v awk &> /dev/null; then
echo "This function requires apw, jq and awk to be installed"
exit 1
fi
UINDEX=$((${2:-1} - 1))
CODES=$(apw otp get "$1" 2>/dev/null)
STATUS=$?
# ✋ If return code 9, not authenticated, run apw auth
if [ $STATUS -eq 9 ]; then
echo "Please authenticate first by running 'apw auth'"
exit 1
fi
# ✋ If return code 3, domain not found, alert user
if [ $STATUS -eq 3 ]; then
echo "Domain $1 not found"
exit 1
fi
# Grab available OTP codes for domain
CODES_COUNT=$(echo $CODES | jq '.results | length')
if [ $CODES_COUNT -gt 1 ]; then
CODE=$(echo $CODES | jq -r ".results[$UINDEX].code")
USERNAME=$(echo $CODES | jq -r ".results[$UINDEX].username")
if [ "$CODE" == "null" ]; then
echo "Please provide an index between 1 and $CODES_COUNT"
exit 1
fi
else
CODE=$(echo $CODES | jq -r '.results[0].code')
USERNAME=$(echo $CODES | jq -r ".results[0].username")
fi
echo $CODE | pbcopy
echo "OTP code for $USERNAME copied to clipboard"
================================================
FILE: commands/system/paste-clipboard.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Type Clipboard
# @raycast.mode silent
# Optional parameters:
# @raycast.icon 📋
# @raycast.packageName Type Clipboard in Search
# Documentation:
# @raycast.description Takes your clipboard then types each character in the clipboard
# @raycast.author AlexGadd
# @raycast.authorURL https://raycast.com/AlexGadd
sleep 0.3
#returns "true" or "false" if key is held down
commandKeyDown=$(osascript -l JavaScript -e "ObjC.import('Cocoa'); ($.NSEvent.modifierFlags & $.NSEventModifierFlagCommand) > 1")
controlKeyDown=$(osascript -l JavaScript -e "ObjC.import('Cocoa'); ($.NSEvent.modifierFlags & $.NSEventModifierFlagControl) > 1")
optionKeyDown=$(osascript -l JavaScript -e "ObjC.import('Cocoa'); ($.NSEvent.modifierFlags & $.NSEventModifierFlagOption) > 1")
shiftKeyDown=$(osascript -l JavaScript -e "ObjC.import('Cocoa'); ($.NSEvent.modifierFlags & $.NSEventModifierFlagShift) > 1")
functionKeyDown=$(osascript -l JavaScript -e "ObjC.import('Cocoa'); ($.NSEvent.modifierFlags & $.NSEventModifierFlagFunction) > 1")
keys=("$commandKeyDown" "$controlKeyDown" "$optionKeyDown" "$shiftKeyDown" "$functionKeyDown")
anyPressed=false
for key in "${keys[@]}"; do
if [[ $key == "true" ]]; then
anyPressed=true
break
fi
done
if $anyPressed; then
osascript -e 'set theAlertText to "Modifier key held"' \
-e 'set theAlertMessage to "To allow this script to function, please ensure you do not hold any modifier keys down while the paste script runs"' \
-e 'display alert theAlertText message theAlertMessage as critical buttons {"OK"} default button "OK"' \
else
osascript -e 'set clipboardContent to the clipboard' \
-e 'set charCount to count of characters of clipboardContent' \
-e 'tell application "System Events"' \
-e ' repeat with i from 1 to charCount' \
-e ' set theChar to character i of clipboardContent' \
-e ' keystroke theChar' \
-e ' end repeat' \
-e 'end tell'
fi
================================================
FILE: commands/system/quit-all-apps.swift
================================================
#!/usr/bin/swift
// NOTE: This script will only work in Raycast 0.30.0+
//
// Required parameters:
// @raycast.schemaVersion 1
// @raycast.title Quit All Applications
// @raycast.mode silent
// @raycast.packageName System
//
// Optional parameters:
// @raycast.icon 💥
// @raycast.needsConfirmation true
//
// Documentation:
// @raycast.description Quits all running applications except Finder and Raycast.
import AppKit
let finderBundleIdentifier = "com.apple.finder"
NSWorkspace.shared.runningApplications
.filter {
$0 != NSRunningApplication.current
&& $0.activationPolicy == .regular
&& $0.bundleIdentifier != finderBundleIdentifier
}
.forEach { $0.terminate() }
print("Quit all applications")
================================================
FILE: commands/system/quit-app.swift
================================================
#!/usr/bin/swift
// Required parameters:
// @raycast.schemaVersion 1
// @raycast.title Quit app
// @raycast.mode silent
// @raycast.packageName System
// Optional parameters:
// @raycast.icon 💥
// @raycast.argument1 { "type": "text", "placeholder": "Name or pid" }
// Documentation:
// @raycast.description Quits an app, by name or process id.
// @raycast.author Roland Leth
// @raycast.authorURL https://runtimesharks.com
import AppKit
let argument = Array(CommandLine.arguments.dropFirst()).first!
let runningApps = NSWorkspace.shared.runningApplications
if let processId = Int(argument) {
runningApps
.first { $0.processIdentifier == processId }
.map {
$0.terminate()
print("Quit \($0.localizedName ?? "\(processId)")")
exit(0)
}
print("No apps with process id \(processId)")
exit(1)
}
let apps = runningApps.filter {
$0.localizedName?.localizedCaseInsensitiveContains(argument) == true
}
if apps.isEmpty {
print("No apps with name \(argument)")
exit(1)
}
apps.first.map {
// If there's just one match, quit it and exit.
guard apps.count == 1 else { return }
$0.terminate()
print("Quit \($0.localizedName ?? argument)")
exit(0)
}
runningApps
.first { $0.localizedName?.localizedCaseInsensitiveCompare(argument) == .orderedSame }
.map {
// If an exact match exists, quit that and exit, even if there are several results.
$0.terminate()
print("Quit \($0.localizedName ?? argument)")
exit(0)
}
let names = apps
.compactMap { $0.localizedName }
.joined(separator: ", ")
if names.isEmpty {
// Just in case `localizedName` were all `nil`, which shouldn't really happen.
print("Multiple apps found")
} else {
print("Multiple apps found: \(names)")
}
================================================
FILE: commands/system/rename-videos-pictures.py
================================================
#!/usr/bin/env python3
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Rename Video
# @raycast.mode fullOutput
# Optional parameters:
# @raycast.icon 📂
# @raycast.argument1 { "type": "text", "placeholder": "Directory's absolute path", "optional": false }
# @raycast.argument2 { "type": "text", "placeholder": "Type (video/image/all)", "optional": true }
# @raycast.argument3 { "type": "text", "placeholder": "Dry Run (true/false)", "optional": true }
# Documentation:
# @raycast.description 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 `--`.
# @raycast.author StepaniaH
# @raycast.authorURL https://github.com/StepaniaH
import os
import sys
import datetime
import argparse
import re
class RenameFilesAsDate:
def __init__(self, root_directory):
self.root_directory = os.path.expanduser(root_directory)
self.error_files = {}
self.video_extensions = ('.mp4', '.avi', '.mov', '.mkv', '.wmv', '.flv', '.webm', '.m4v', '.3gp')
self.image_extensions = ('.jpg', '.jpeg', '.png', '.gif', '.webp', '.bmp', '.tiff', '.svg', '.heic')
def rename_files(self, file_type='all', dry_run=False):
current_date = datetime.datetime.now().strftime("%m%d")
self._process_directory(self.root_directory, current_date, file_type, dry_run)
if self.error_files:
print("\nThe following files could not be renamed:")
for original_path, error in self.error_files.items():
print(f"{original_path}: {error}")
def _is_already_renamed(self, filename, current_date):
"""Check if the file has been named according to the target format"""
base_name = os.path.splitext(filename)[0]
pattern = re.compile(f'^.*-{current_date}-\\d+$')
return bool(pattern.match(base_name))
def _get_max_sequence_number(self, directory, current_date):
"""Get the largest serial number existing in the current directory"""
max_seq = 0
pattern = re.compile(f'^.*-{current_date}-(\\d+)$')
for entry in os.listdir(directory):
match = pattern.match(os.path.splitext(entry)[0])
if match:
seq_num = int(match.group(1))
max_seq = max(max_seq, seq_num)
return max_seq
def _process_directory(self, directory, current_date, file_type, dry_run):
folder_name = os.path.basename(directory)
supported_extensions = self._get_supported_extensions(file_type)
# First collect the files that need to be renamed
files_to_rename = []
for entry in os.listdir(directory):
entry_path = os.path.join(directory, entry)
if os.path.isfile(entry_path):
if entry.lower().endswith(supported_extensions):
if not self._is_already_renamed(entry, current_date):
files_to_rename.append(entry)
elif os.path.isdir(entry_path):
self._process_directory(entry_path, current_date, file_type, dry_run)
if files_to_rename:
# Get the largest serial number existing in the current directory
count = self._get_max_sequence_number(directory, current_date) + 1
total_files = len(files_to_rename)
num_digits = len(str(total_files + count - 1))
# Rename collected files
for entry in sorted(files_to_rename): # Sort to ensure consistent rename order
entry_path = os.path.join(directory, entry)
new_name = f"{folder_name}-{current_date}-{count:0{num_digits}d}{os.path.splitext(entry)[1].lower()}"
new_path = os.path.join(directory, new_name)
if dry_run:
print(f"Would rename: {entry} -> {new_name}")
else:
try:
os.rename(entry_path, new_path)
print(f"Renamed: {entry} -> {new_name}")
except OSError as e:
self.error_files[entry_path] = f"Rename failed: {str(e)}"
continue
count += 1
def _get_supported_extensions(self, file_type):
if file_type == 'video':
return self.video_extensions
elif file_type == 'image':
return self.image_extensions
return self.video_extensions + self.image_extensions
def main():
args = sys.argv[1:]
directory = None
file_type = 'all'
dry_run = False
if len(args) >= 1:
directory = args[0]
if len(args) >= 2 and args[1]:
file_type = args[1]
if len(args) >= 3 and args[2]:
dry_run = args[2].lower() == 'true'
if not directory:
print("Error: Directory argument is required.")
sys.exit(1)
renamer = RenameFilesAsDate(directory)
renamer.rename_files(file_type, dry_run)
if __name__ == '__main__':
main()
================================================
FILE: commands/system/reset-launchpad.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Reset Launchpad
# @raycast.mode silent
# Optional parameters:
# @raycast.icon 🚀
# @raycast.packageName System
# Documentation:
# @raycast.description Resets the macOS Launchpad to its default state
# @raycast.author Zach Dawson
# @raycast.authorURL https://raycast.com/zdawz
defaults write com.apple.dock ResetLaunchPad -bool true
killall Dock
================================================
FILE: commands/system/restart-dock.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Restart the Dock
# @raycast.mode silent
# @raycast.packageName System
# Optional parameters:
# @raycast.icon 💀
# @raycast.author Jordi Clement
# @raycast.authorURL https://github.com/jordicl
# Documentation:
# @raycast.description Restart the Dock
killall Dock
echo "Restarted the Dock"
================================================
FILE: commands/system/restart-finder.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Restart the Finder
# @raycast.mode silent
# @raycast.packageName System
# Optional parameters:
# @raycast.icon 💀
# @raycast.author Jordi Clement
# @raycast.authorURL https://github.com/jordicl
# Documentation:
# @raycast.description Restart the Finder
killall Finder
echo "Restarted the Finder"
================================================
FILE: commands/system/restart.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Restart
# @raycast.mode silent
# @raycast.packageName System
# Optional parameters:
# @raycast.icon ♻️
# Documentation:
# @raycast.description Restarts computer.
tell application "Finder" to restart
================================================
FILE: commands/system/sample-color.swift
================================================
#!/usr/bin/swift
// Required parameters:
// @raycast.schemaVersion 1
// @raycast.title Sample Color
// @raycast.mode silent
// @raycast.packageName System
//
// Optional parameters:
// @raycast.icon 🎨
//
// Documentation:
// @raycast.description Sample a color from anywhere on your screen.
// @raycast.author Jesse Claven
// @raycast.authorURL https://github.com/jesse-c
import AppKit
guard #available(OSX 10.15, *) else {
print("macOS 10.15 or greater required")
exit(1)
}
extension NSColor {
var hexAlphaString: String {
let r = lroundf(Float(redComponent) * 0xFF)
let g = lroundf(Float(greenComponent) * 0xFF)
let b = lroundf(Float(blueComponent) * 0xFF)
return String(format: "#%02lX%02lX%02lX", r, g, b)
}
}
func copyToPasteboard(_ color: String) {
NSPasteboard.general.clearContents()
NSPasteboard.general.writeObjects([color as NSPasteboardWriting])
}
let sampler = NSColorSampler()
sampler.show { selectedColor in
if let selectedColor = selectedColor {
let hexTuple = selectedColor.hexAlphaString
copyToPasteboard(hexTuple)
print("Sampled color: \(hexTuple)")
exit(0)
} else {
print("Sampled color: none")
exit(0)
}
}
RunLoop.main.run()
================================================
FILE: commands/system/save-image-from-clipboard.py
================================================
#!/usr/bin/env python3
# Dependency: This script requires Pillow Python module
# Install via Python: python3 -m pip install Pillow
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Save Image From Clipboard
# @raycast.mode silent
# @raycast.packageName Clipboard
# Optional parameters:
# @raycast.icon 🤖
# Documentation:
# @raycast.description Save Image From Clipboard
# @raycast.author Yufei Kang
# @raycast.authorURL kangyufei.net
# @raycast.author LanikSJ
# @raycast.authorURL https://github.com/LanikSJ
from datetime import datetime
from pathlib import Path
from PIL import ImageGrab
home = Path.home()
def save_image():
im = ImageGrab.grabclipboard()
if im != None:
filepath = home / "Downloads/ScreenShot-{}.png".format(
datetime.now().strftime("%Y%m%d-%H%M%S")
)
im.save(filepath.as_posix())
print(f"OK Saved In: {filepath}")
else:
print("No Image in Clipboard")
if __name__ == "__main__":
save_image()
================================================
FILE: commands/system/screensaver.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Screen Saver
# @raycast.mode silent
# @raycast.packageName System
# Optional parameters:
# @raycast.icon 🌀
# @raycast.author Valentin Chrétien
# @raycast.authorURL https://twitter.com/valentinchrt
# @raycast.description A script command to start your current screen saver.
tell application "System Events"
start current screen saver
end tell
================================================
FILE: commands/system/shutdown.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Shut Down
# @raycast.mode silent
# @raycast.packageName System
# Optional parameters:
# @raycast.icon 🛌
# Documentation:
# @raycast.description Shuts down computer.
tell application "Finder" to shut down
================================================
FILE: commands/system/sleep-timer.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Sleep Timer
# @raycast.mode silent
# @raycast.description Put your Mac to sleep (in X minutes).
# @raycast.packageName System
# Optional parameters:
# @raycast.icon 😴
# @raycast.argument1 { "optional": true, "type": "text", "placeholder": "(in) minutes" }
# Documentation:
# @raycast.author AndriiBarabash
# @raycast.authorURL https://github.com/AndriiBarabash
on run argv
delay (item 1 of argv) * 60
tell application "Finder" to sleep
end run
================================================
FILE: commands/system/sleep.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Sleep
# @raycast.mode silent
# @raycast.packageName System
# Optional parameters:
# @raycast.icon 😴
# Documentation:
# @raycast.description Puts computer to sleep.
tell application "Finder" to sleep
================================================
FILE: commands/system/toggle-battery-charging.sh
================================================
#!/bin/bash
# Note: You must do two steps for this script to work.
# 1- run "curl https://raw.githubusercontent.com/actuallymentor/battery/main/setup.sh | sudo bash" to install smc and battery script
# 2- run "battery visudo" to add battery command to sudoers
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Toggle Battery Charging
# @raycast.mode silent
# Optional parameters:
# @raycast.icon 🔋
# @raycast.packageName System
# Documentation:
# @raycast.description 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).
# @raycast.author Amir Hossein SamadiPour
# @raycast.authorURL https://github.com/SamadiPour
hex_status=$( smc -k CH0B -r | awk '{print $4}' | sed s:\):: )
if [[ "$hex_status" == "00" ]]; then
battery charging off
echo "Charging OFF"
else
battery charging on
echo "Charging ON"
fi
================================================
FILE: commands/system/toggle-desktop-icons.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Toggle Desktop Icons
# @raycast.mode silent
# @raycast.packageName System
# Optional parameters:
# @raycast.icon 🖥
# @raycast.author Raycast
# @raycast.authorURL https://raycast.com
# @raycast.description A script command to show and hide icons of Desktop folder
try
set CurSet to do shell script "defaults read com.apple.finder CreateDesktop"
on error
set CurSet to "1"
end try
if CurSet is "1" then
set NewSet to false
else
set NewSet to true
end if
do shell script "defaults write com.apple.finder CreateDesktop -bool " & NewSet
tell application "Finder" to quit
set inTime to current date
repeat
-- check Finder process not exist
tell application "System Events"
if "Finder" is not in (get name of processes) then exit repeat
end tell
-- if repeat run for 10s, exit repeat
if (current date) - inTime is greater than 10 then exit repeat
delay 0.2
end repeat
tell application "Finder"
try
activate
end try
end tell
================================================
FILE: commands/system/toggle-desktop-widget.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Toggle Desktop Widgets
# @raycast.mode silent
# Optional parameters:
# @raycast.icon 🔄
# Documentation:
# @raycast.author Federico Zivolo
# @raycast.authorURL https://github.com/FezVrasta
# Get the current value of the preference
current_value=$(defaults read com.apple.WindowManager StandardHideWidgets)
# Toggle the value
if [[ $current_value == 1 ]]; then
new_value=0
else
new_value=1
fi
# Write the new value to the preference
defaults write com.apple.WindowManager StandardHideWidgets -int $new_value
================================================
FILE: commands/system/toggle-ds-store.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Toggle .DS_Store
# @raycast.mode silent
# @raycast.packageName System
# Optional parameters:
# @raycast.icon 🧬
# @raycast.author Astrit
# @raycast.authorURL https://github.com/astrit
# @raycast.description A script command to enable and disable .DS_Store
try
set ToggleDSStore to do shell script "defaults read com.apple.desktopservices"
on error
set ToggleDSStore to "1"
end try
if ToggleDSStore is "1" then
do shell script "defaults write com.apple.desktopservices DSDontWriteNetworkStores true"
set DSStoreStatus to ".DS_Store Deactivated"
else
do shell script "defaults delete com.apple.desktopservices DSDontWriteNetworkStores"
set DSStoreStatus to ".DS_Store Activated"
end if
DSStoreStatus
================================================
FILE: commands/system/toggle-filename-extensions.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Toggle Filename Extensions
# @raycast.mode silent
# Optional parameters:
# @raycast.icon 👓
# @raycast.packageName System
# Documentation:
# @raycast.description Show or hide all filename extensions (like .txt, .png)
# @raycast.author Senthil Prabhu
# @raycast.authorURL https://github.com/senthilprabhut
# Get the current setting value
try
set CurSet to do shell script "defaults read NSGlobalDomain AppleShowAllExtensions"
on error
set CurSet to "1"
end try
if CurSet is "1" then
set NewSet to false
else
set NewSet to true
end if
do shell script "defaults write NSGlobalDomain AppleShowAllExtensions -bool " & NewSet
# Restart Finder
do shell script "killall Finder"
# Show message
if CurSet is "1" then
log "Show all filename extensions disabled"
else
log "Show all filename extensions enabled"
end if
================================================
FILE: commands/system/toggle-flip-screen.template.applescript
================================================
#!/usr/bin/osascript
# How to use this script?
# It's a template which needs further setup. Duplicate the file,
# remove `.template.` from the filename,
# Replace all instances of with the name of your monitor.
# Monitor name can be seen by open System Preferences → Display,
# and look at the window's title name. example: DELL P2212H.
# Replace all instances of to 90, 180 or 270
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Toggle Flip Screen to °
# @raycast.mode silent
# Optional parameters:
# @raycast.icon 🖥
# @Documentation:
# @raycast.description Toggle flip (rotate) or revert the to °
# @raycast.author Yohanes Bandung Bondowoso
# @raycast.authorURL https://github.com/ybbond
use scripting additions
set displayName to ""
set targetDegree to "°"
if running of application "System Preferences" then
quit application "System Preferences"
end if
tell application "System Preferences"
activate
reveal anchor "displaysDisplayTab" of pane id "com.apple.preference.displays"
end tell
tell application "System Events" to tell process "System Preferences"
set currentCount to 0
repeat while currentCount < 5
if exists tab group 1 of window displayName then
set currentCount to 5
else
delay 0.5
set currentCount to currentCount + 1
end if
end repeat
try
tell window displayName
if exists pop up button 2 of tab group 1 then
tell pop up button 2 of tab group 1
if (value) contains "Standard" then
set currentAction to "Flipping"
click
click menu item targetDegree of menu 1
else
set currentAction to "Reverting"
click
click menu item "Standard" of menu 1
end if
end tell
else
tell pop up button 1 of tab group 1
if (value) contains "Standard" then
set currentAction to "Flipping"
click
click menu item targetDegree of menu 1
else
set currentAction to "Reverting"
click
click menu item "Standard" of menu 1
end if
end tell
end if
end tell
on error errString
log "Some error, please contact me so I can try to fix :)"
end try
end tell
log currentAction & space & "display succeed"
tell application "System Preferences"
quit
end tell
tell application "System Events"
quit
end tell
================================================
FILE: commands/system/toggle-hidden-files.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Toggle Hidden Files
# @raycast.mode silent
# @raycast.packageName System
# Optional parameters:
# @raycast.icon 👓
# @raycast.author Thiago Holanda
# @raycast.authorURL https://twitter.com/tholanda
# @raycast.description Show and hide hidden files/folders which starts with "." (dot), i.e: .bash_rc, .ssh
try
set VisibleFiles to do shell script "defaults read com.apple.finder AppleShowAllFiles"
on error
set VisibleFiles to "1"
end try
if VisibleFiles is "1" then
set NewSet to false
else
set NewSet to true
end if
do shell script "defaults write com.apple.finder AppleShowAllFiles -bool " & NewSet
do shell script "killall Finder"
================================================
FILE: commands/system/toggle-lid-sleep.sh
================================================
#!/bin/bash
# Note: You must add pmset to sudoers for this script to work.
# 1- run to create file and open editor:
# sudo visudo -f /etc/sudoers.d/pmset
# 2- press 'i' to enter input mode
# 3- paste this line into the editor:
# ALL ALL=NOPASSWD: /usr/bin/pmset
# 4- press 'esc' to exit input mode
# 5- type this to exit and save file:
# :wq
# Note: this will not prevent laptop sleep from timeout.
# Refer to System Settings and search for 'sleep' there for
# things like 'Turn display off on battery when inactive' and
# 'Prevent automatic sleeping on power adapter when the display is off'
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Toggle Lid Sleep
# @raycast.mode inline
# Optional parameters:
# @raycast.icon 🐚
# @raycast.packageName System
# Documentation:
# @raycast.description Prevent sleep from closing laptop lid (clamshell mode)
# @raycast.author Ivan Rybalko
# @raycast.authorURL https://github.com/ivribalko
validate_exit_code()
{
if [ $? -ne 0 ]; then
echo "probably missing sudoers, see sources for how-to."
exit 1
fi
}
if [[ $(pmset -g | grep SleepDisabled | cut -f3) -eq '1' ]]; then
sudo pmset disablesleep 0 2> /dev/null
validate_exit_code
echo now on 💤
else
sudo pmset disablesleep 1 2> /dev/null
validate_exit_code
echo now off ☕
fi
================================================
FILE: commands/system/toggle-natural-scrolling-macos15.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Toggle Natural Scrolling (macOS 15+)
# @raycast.mode silent
# @raycast.packageName System
# Optional parameters:
# @raycast.icon 🖱
# @raycast.author Raphael-KR
# @raycast.authorURL https://github.com/Raphael-KR
# @raycast.description Toggle natural trackpad/mouse scrolling setting for macOS 15.6.1+
set macVersion to system version of (system info)
if macVersion is greater than or equal to "15" then
try
set isNaturalScrolling to (do shell script "defaults read .GlobalPreferences 'com.apple.swipescrolldirection' 2>/dev/null || echo '1'")
if isNaturalScrolling is "1" then
do shell script "defaults write .GlobalPreferences 'com.apple.swipescrolldirection' -bool NO"
display notification "Natural Scrolling: OFF" with title "Trackpad Settings"
else
do shell script "defaults write .GlobalPreferences 'com.apple.swipescrolldirection' -bool YES"
display notification "Natural Scrolling: ON" with title "Trackpad Settings"
end if
do shell script "/System/Library/PrivateFrameworks/SystemAdministration.framework/Resources/activateSettings -u"
on error e
display notification "Using GUI method as fallback" with title "Trackpad Settings"
tell application "System Settings"
activate
set current pane to pane "com.apple.preference.trackpad"
end tell
delay 0.6
tell application "System Events"
tell process "System Settings"
click radio button 2 of tab group 1 of window "Trackpad"
click checkbox 1 of tab group 1 of window "Trackpad"
end tell
end tell
tell application "System Settings" to quit
end try
else
display notification "For macOS 14 and earlier, use the original script" with title "Compatibility Note"
tell application "System Settings"
activate
set current pane to pane "com.apple.preference.trackpad"
end tell
delay 0.6
tell application "System Events"
tell process "System Settings"
click radio button 2 of tab group 1 of window "Trackpad"
click checkbox 1 of tab group 1 of window "Trackpad"
end tell
end tell
tell application "System Settings" to quit
end if
================================================
FILE: commands/system/toggle-natural-scrolling.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Toggle Natural Scrolling
# @raycast.mode silent
# @raycast.packageName System
# Optional parameters:
# @raycast.icon 🖱
# @raycast.author Wiley Marques
# @raycast.authorURL https://twitter.com/wileymarques
# @raycast.description Script Command to change natural trackpad/mouse scrolling setting. Reverting the setting value each time.
set macVersion to system version of (system info)
if macVersion is greater than or equal to "14" then
set isNaturalScrolling to (do shell script "defaults -currentHost read NSGlobalDomain com.apple.swipescrolldirection")
if isNaturalScrolling is "1" then
do shell script "defaults -currentHost write NSGlobalDomain com.apple.swipescrolldirection -bool NO"
else
do shell script "defaults -currentHost write NSGlobalDomain com.apple.swipescrolldirection -bool YES"
end if
do shell script "/System/Library/PrivateFrameworks/SystemAdministration.framework/Resources/activateSettings -u"
else
tell application "System Settings"
activate
set current pane to pane "com.apple.preference.trackpad"
end tell
delay 0.6
tell application "System Events"
tell process "System Preferences"
click radio button 2 of tab group 1 of window "Trackpad"
click checkbox 1 of tab group 1 of window "Trackpad"
end tell
end tell
tell application "System Settings" to quit
end if
================================================
FILE: commands/system/toggle-sidecar.template.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Toggle Sidecar
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/apple_sidecar.png
# @raycast.packageName System
# Documentation:
# @raycast.description Toggles on/off a Sidecar screen.
# @raycast.author Marcos Snchez-Dehesa
# @raycast.authorURL https://www.github.com/dehesa
# The name of the device to be connected as a sidecar screen (e.g. the name of your iPad).
# You can figure out the exact device's name by going to System Preferences > Displays > Add Display.
set displayName to "Honiara"
# If your system is not in English, you should change this text to text display in the pop up menu item in System Preferences > Displays > Add Display.
set menuItemName to "Add Display"
# The System Preferences > Displays screen takes a long time to load (I don't know why). This delay waits for the screen to properly load. Your system may need less or more seconds. Do some trial and errors.
set delayInSeconds to 1.8
tell application "System Preferences"
activate
set current pane to pane id "com.apple.preference.displays"
delay delayInSeconds
tell application "System Events"
tell first window of application process "System Preferences"
tell pop up button menuItemName
click
click menu item displayName of menu menuItemName
end tell
end tell
end tell
quit
end tell
================================================
FILE: commands/system/toggle-system-appearance.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Toggle System Appearance
# @raycast.mode silent
# @raycast.packageName System
# Optional parameters:
# @raycast.icon 🌗
# @raycast.author Thiago Holanda
# @raycast.authorURL https://twitter.com/tholanda
# @raycast.description Script Command to switch between the system appearance, light and dark mode.
tell application "System Events" to tell appearance preferences to set dark mode to not dark mode
================================================
FILE: commands/system/uninstall-with-appcleaner.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Uninstall with AppCleaner
# @raycast.mode silent
# @raycast.packageName System
# @raycast.argument1 { "type": "text", "placeholder": "Application", "optional": false }
#
# Optional parameters:
# @raycast.icon 🗑
#
# Documentation:
# @raycast.description Uninstall applications with AppCleaner
# @raycast.author Felipe Turcheti
# @raycast.authorURL https://felipeturcheti.com
on run {appName}
set bundleId to id of application appName
tell application "Finder"
set appPath to (POSIX path of (application file id bundleId as alias))
do shell script "open -a AppCleaner \"" & appPath & "\""
log "Opening \"" & appName & "\" in AppCleaner…"
end tell
end run
================================================
FILE: commands/system/update-scripts-command.template.py
================================================
#!/usr/bin/env python3
# How to use this script?
# It's a template which needs further setup. Duplicate the file,
# remove `.template.` from the filename and set `path_to_scripts` and
# ignored_files vars.
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Update Community Scripts
# @raycast.description Updates community Script Commands to their last available version from the GitHub repository.
# @raycast.mode compact
# @raycast.refreshTime 1d
# Optional parameters:
# @raycast.icon ♻️
# @raycast.packageName Utilities
# Documentation:
# @raycast.author Quentin Eude
# @raycast.authorURL https://www.github.com/qeude
import os
import json
from glob import glob
from shutil import copyfile, rmtree
from datetime import datetime
from dataclasses import dataclass
# 🚨 SHOULD BE CHANGED ACCORDING TO YOUR NEEDS
# This should be changed with the path to your root Raycast scripts folder.
# eg: path_to_scripts = "/Users/quentin/Raycast Scripts"
path_to_scripts = "/PATH/TO/ROOT/SCRIPTS/FOLDER/"
# 🚨 SHOULD BE CHANGED ACCORDING TO YOUR NEEDS
# Keep it unchanged if you don't want to ignore scripts.
# Here you can ignore some files if you don't want to sync some of those.
# eg: ["toggle-airpods.swift", "airpodsbattery.sh"]
ignored_files = []
@dataclass
class RepoScriptFile:
filename: str
updated_at: datetime
@dataclass
class LocalScriptFile:
filename: str
full_path: str
def get_files(root_path, extensions):
all_files = []
for ext in extensions:
all_files.extend([LocalScriptFile(filename=os.path.basename(x), full_path=os.path.abspath(x)) for x in glob(f"{root_path}/**/*{ext}", recursive=True)])
return all_files
def save_last_update_date():
with open(f"{os.path.dirname(__file__)}/.update-scripts-command", "w") as file:
file.write(datetime.now().astimezone().isoformat())
def read_last_update_date():
try:
with open(f"{os.path.dirname(__file__)}/.update-scripts-command", "r") as file:
return datetime.fromisoformat(file.read())
except:
return None
repo_path = "/tmp/script-commands"
scripts_path = f"{repo_path}/commands/"
def get_files_to_update(base_date=None, base_local_files=None):
flatten = lambda t: [item for sublist in t for item in sublist]
def find(key, dictionary):
for k, v in dictionary.items():
if k == key:
yield v
elif isinstance(v, dict):
for result in find(key, v):
yield result
elif isinstance(v, list):
for d in v:
for result in find(key, d):
yield result
with open(f"{repo_path}/commands/extensions.json") as json_file:
data = json.load(json_file)
script_files = [RepoScriptFile(updated_at=datetime.fromisoformat(file.get("updatedAt")), filename=file.get("filename"))
for file in flatten(find("scriptCommands", data))]
if base_date is not None:
script_files = [f for f in script_files if f.updated_at > base_date]
base_filenames = [f.filename for f in base_local_files]
return [f.filename for f in script_files if f.filename in base_filenames]
if not os.path.exists(path_to_scripts) and not os.path.isdir(path_to_scripts):
print(f"🚨 Invalid path to scripts. Please change it in the script file here: {__file__}")
exit()
rmtree(repo_path, ignore_errors=True)
# Doing this here to avoid problems with updated scripts during the process.
now = datetime.now()
os.system(f"git clone -q https://github.com/raycast/script-commands.git {repo_path} > /dev/null")
local_scripts_files = get_files(path_to_scripts, (".py", ".swift", ".sh", ".js", ".applescript", ".rb"))
last_updated_date = read_last_update_date()
files_to_update = get_files_to_update(last_updated_date, local_scripts_files)
for file in files_to_update:
file_basename = os.path.basename(file)
# We are ignoring current file to avoid weird behavior.
if file == __file__ or file_basename in ignored_files:
continue
repo_files = [os.path.abspath(x) for x in glob(f"{repo_path}/**/{file_basename}", recursive=True)]
if repo_files:
copyfile(repo_files[0], file)
rmtree(repo_path, ignore_errors=True)
save_last_update_date()
if not files_to_update:
print("🙌 Everything is up to date.")
elif len(files_to_update) == 1:
print("♻️ Updated 1 script.")
else:
print(f"♻️ Updated {len(files_to_update)} scripts.")
exit()
================================================
FILE: commands/system/vpn/vpn-config.sh
================================================
#!/usr/bin/env bash
# Name of your VPN Config from System Preferences
export VPN_NAME=""
if [ -z "$VPN_NAME" ]; then
echo "\$VPN_NAME is empty";
echo "Please, rename it in \"vpn-config.sh\".";
exit 1;
fi
================================================
FILE: commands/system/vpn/vpn-start.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Connect
# @raycast.mode compact
# Optional parameters:
# @raycast.icon 📡
# @Documentation:
# @raycast.packageName VPN
# @raycast.description Start VPN connection.
# @raycast.author Alexandru Turcanu
# @raycast.authorURL https://github.com/Pondorasti
source vpn-config.sh
VPN=$VPN_NAME
# Source: https://superuser.com/a/736859
function isnt_connected () {
scutil --nc status "$VPN" | sed -n 1p | grep -qv Connected
}
function poll_until_connected () {
let loops=0 || true
let max_loops=200 # 200 * 0.1 is 20 seconds. Bash doesn't support floats
while isnt_connected "$VPN"; do
sleep 0.1 # can't use a variable here, bash doesn't have floats
let loops=$loops+1
[ $loops -gt $max_loops ] && break
done
[ $loops -le $max_loops ]
}
networksetup -connectpppoeservice "$VPN"
if poll_until_connected "$VPN"; then
echo "Connected to $VPN!"
else
echo "Couldn't connect to $VPN"
scutil --nc stop "$VPN"
exit 1;
fi
================================================
FILE: commands/system/vpn/vpn-status.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title VPN Status
# @raycast.mode inline
# @raycast.refreshTime 1m
# Optional parameters:
# @raycast.icon 📡
# @Documentation:
# @raycast.packageName VPN
# @raycast.description Stop VPN connection.
# @raycast.author Alexandru Turcanu
# @raycast.authorURL https://github.com/Pondorasti
source vpn-config.sh
VPN=$VPN_NAME
status=$(scutil --nc status "$VPN" | sed -n 1p)
if [ "$status" == "Connected" ]; then
echo "$status to $VPN"
exit 0
fi
echo "$status"
================================================
FILE: commands/system/vpn/vpn-stop.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Disconnect
# @raycast.mode compact
# Optional parameters:
# @raycast.icon 📡
# @Documentation:
# @raycast.packageName VPN
# @raycast.description Stop VPN connection.
# @raycast.author Alexandru Turcanu
# @raycast.authorURL https://github.com/Pondorasti
source vpn-config.sh
VPN=$VPN_NAME
networksetup -disconnectpppoeservice "$VPN"
echo "Disconnected from $VPN!"
================================================
FILE: commands/system/vpnutil/vpnutil-config.template.sh
================================================
#!/usr/bin/env bash
# Based on https://github.com/raycast/script-commands/tree/master/commands/system/vpn
# Dependency: vpnutil https://github.com/Timac/VPNStatus/releases/latest
# Installation:
# 1. Download vpnutil.zip
# 2. Uncompress
# 3. Move vpnutil to /usr/local/bin
# 4. Run manually once to bypass GateKeeper protection:
# - Right-click the app in the Finder
# - Select Open
# - Click on the Open button
# How to use this script?
# It's a template which needs further setup. Duplicate the file,
# remove `.template.` from the filename and set `VPN_NAME` variable.
# 🚨 Set name of your VPN Config from System Preferences
export VPN_NAME="VPN_NAME_FROM_SYSTEM_PREFERENCES"
if [ -z "$VPN_NAME" ]; then
echo "\$VPN_NAME is empty";
echo "Please, rename it in \"vpn-config.sh\".";
exit 1;
fi
if ! command -v vpnutil &> /dev/null; then
echo "vpnutil is required (https://github.com/Timac/VPNStatus/releases/latest).";
exit 1;
fi
================================================
FILE: commands/system/vpnutil/vpnutil-start.sh
================================================
#!/bin/bash
# Based on https://github.com/raycast/script-commands/tree/master/commands/system/vpn
# Depends on vpnutil: https://github.com/Timac/VPNStatus/releases/latest
# Installation:
# 1. Download vpnutil.zip
# 2. Uncompress
# 3. Move vpnutil to /usr/local/bin
# 4. Run manually once to bypass GateKeeper protection:
# - Right-click the app in the Finder
# - Select Open
# - Click on the Open button
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Start VPN
# @raycast.mode compact
# Optional parameters:
# @raycast.icon 📡
# @Documentation:
# @raycast.packageName VPN
# @raycast.description Start VPN connection.
# @raycast.author Sergey Fuksman
# @raycast.authorURL https://github.com/fuksman
CONFIG=vpnutil-config.sh
if [ ! -f $CONFIG ]; then
echo "Create a vpn-config.sh from template!"
exit 1
fi
# shellcheck source=/dev/null
source $CONFIG
VPN=$VPN_NAME
# Source: https://superuser.com/a/736859
function isnt_connected () {
vpnutil status "$VPN" | sed -n 1p | grep -qv Connected
}
function poll_until_connected () {
(( loops=0 ))
(( max_loops=200 )) # 200 * 0.1 is 20 seconds. Bash doesn't support floats
while isnt_connected "$VPN"; do
sleep 0.1 # can't use a variable here, bash doesn't have floats
(( loops=loops+1 ))
[ "$loops" -gt "$max_loops" ] && break
done
[ "$loops" -le "$max_loops" ]
}
vpnutil start "$VPN"
if poll_until_connected "$VPN"; then
echo "Connected to $VPN!"
else
echo "Couldn't connect to $VPN"
vpnutil stop "$VPN"
exit 1;
fi
================================================
FILE: commands/system/vpnutil/vpnutil-status.sh
================================================
#!/bin/bash
# Based on https://github.com/raycast/script-commands/tree/master/commands/system/vpn
# Dependency: vpnutil https://github.com/Timac/VPNStatus/releases/latest
# Installation:
# 1. Download vpnutil.zip
# 2. Uncompress
# 3. Move vpnutil to /usr/local/bin
# 4. Run manually once to bypass GateKeeper protection:
# - Right-click the app in the Finder
# - Select Open
# - Click on the Open button
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title VPN Status
# @raycast.mode inline
# @raycast.refreshTime 30s
# Optional parameters:
# @raycast.icon 📡
# @Documentation:
# @raycast.packageName VPN
# @raycast.description Check VPN connection
# @raycast.author Sergey Fuksman
# @raycast.authorURL https://github.com/fuksman
CONFIG=vpnutil-config.sh
if [ ! -f $CONFIG ]; then
echo "Create a vpn-config.sh from template!"
exit 1
fi
# shellcheck source=/dev/null
source $CONFIG
VPN=$VPN_NAME
status=$(vpnutil status "$VPN" | sed -n 1p | awk 'NF>1{print $NF}')
if [ "$status" == "Connected" ]; then
echo "$status to $VPN"
exit 0
fi
echo "$status"
================================================
FILE: commands/system/vpnutil/vpnutil-stop.sh
================================================
#!/bin/bash
# Based on https://github.com/raycast/script-commands/tree/master/commands/system/vpn
# Dependency: vpnutil https://github.com/Timac/VPNStatus/releases/latest
# Installation:
# 1. Download vpnutil.zip
# 2. Uncompress
# 3. Move vpnutil to /usr/local/bin
# 4. Run manually once to bypass GateKeeper protection:
# - Right-click the app in the Finder
# - Select Open
# - Click on the Open button
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Stop VPN
# @raycast.mode compact
# Optional parameters:
# @raycast.icon 📡
# @Documentation:
# @raycast.packageName VPN
# @raycast.description Stop VPN connection
# @raycast.author Sergey Fuksman
# @raycast.authorURL https://github.com/fuksman
CONFIG=vpnutil-config.sh
if [ ! -f $CONFIG ]; then
echo "Create a vpn-config.sh from template!"
exit 1
fi
# shellcheck source=/dev/null
source $CONFIG
VPN=$VPN_NAME
# Source: https://superuser.com/a/736859
function isnt_connected () {
vpnutil status "$VPN" | sed -n 1p | grep -qv Connected
}
if isnt_connected "$VPN"; then
echo "$VPN isn't connected"
exit 1
else
vpnutil stop "$VPN"
echo "Disconnected from $VPN"
fi
================================================
FILE: commands/system/vpnutil/vpnutil-toggle.sh
================================================
#!/bin/bash
# Based on https://github.com/raycast/script-commands/tree/master/commands/system/vpn
# Dependency: vpnutil https://github.com/Timac/VPNStatus/releases/latest
# Installation:
# 1. Download vpnutil.zip
# 2. Uncompress
# 3. Move vpnutil to /usr/local/bin
# 4. Run manually once to bypass GateKeeper protection:
# - Right-click the app in the Finder
# - Select Open
# - Click on the Open button
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Toggle VPN
# @raycast.mode compact
# Optional parameters:
# @raycast.icon 📡
# @Documentation:
# @raycast.packageName VPN
# @raycast.description Toggle VPN connection
# @raycast.author Sergey Fuksman
# @raycast.authorURL https://github.com/fuksman
CONFIG=vpnutil-config.sh
if [ ! -f $CONFIG ]; then
echo "Create a vpn-config.sh from template!"
exit 1
fi
# shellcheck source=/dev/null
source $CONFIG
VPN=$VPN_NAME
# Source: https://superuser.com/a/736859
function isnt_connected () {
vpnutil status "$VPN" | sed -n 1p | grep -qv Connected
}
function poll_until_connected () {
(( loops=0 ))
(( max_loops=200 )) # 200 * 0.1 is 20 seconds. Bash doesn't support floats
while isnt_connected "$VPN"; do
sleep 0.1 # can't use a variable here, bash doesn't have floats
(( loops=loops+1 ))
[ "$loops" -gt "$max_loops" ] && break
done
[ "$loops" -le "$max_loops" ]
}
if isnt_connected "$VPN"; then
vpnutil start "$VPN"
if poll_until_connected "$VPN"; then
echo "Connected to $VPN!"
else
echo "Couldn't connect to $VPN"
vpnutil stop "$VPN"
exit 1
fi
else
vpnutil stop "$VPN"
echo "Disconnected from $VPN"
fi
================================================
FILE: commands/system/wallpaper-refresh.applescript
================================================
#!/usr/bin/osascript
# @raycast.title Refresh Wallpaper
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description 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).
# @raycast.icon 🖼️
# @raycast.mode silent
# @raycast.packageName System
# @raycast.schemaVersion 1
tell application "System Events"
set rotinterval to change interval of current desktop
set change interval of current desktop to rotinterval
end tell
do shell script "echo Refreshed wallpaper"
================================================
FILE: commands/system/wifi-password.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Copy Wi-Fi Password
# @raycast.mode silent
# Optional parameters:
# @raycast.icon 📟
# Documentation:
# @raycast.description Copy Wi-Fi password from current session
# @raycast.author Astrit Malsia
# @raycast.authorURL https://github.com/astrit
# @raycast.packageName System
airport="/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport"
# get current ssid
ssid="`$airport -I | awk '/ SSID/ {print substr($0, index($0, $2))}'`"
# get keychain access
pwd="`security find-generic-password -D 'AirPort network password' -ga \"$ssid\" 2>&1 >/dev/null`"
# password cleanup
pwd=$(echo "$pwd" | sed -e "s/^.*\"\(.*\)\".*$/\1/")
# copy the password
echo $pwd | pbcopy
# print
echo "Password $pwd is copied!"
================================================
FILE: commands/system/wifi.template.applescript
================================================
#!/usr/bin/osascript
# @raycast.title Toggle Wi-Fi
# @raycast.author Vincent Dörig
# @raycast.authorURL https://github.com/vincentdoerig
# @raycast.description Toggle your Wi-Fi connection.
# @raycast.icon images/wifi-dark.png
# @raycast.iconDark images/wifi.png
# @raycast.mode silent
# @raycast.packageName System
# @raycast.schemaVersion 1
# Wi-Fi interface, should normally be either `en0` or `en1`
# ⌥ + click the wifi icon in your menu bar to display the Wi-Fi interface name
set Interface to "en0"
set NetworkStatus to (do shell script "networksetup -getairportnetwork " & Interface)
if (NetworkStatus contains "off") then
# turn Wi-Fi on
do shell script "networksetup -setairportpower Interface on"
do shell script "echo Wi-Fi turned on"
else
# turn Wi-Fi off
do shell script "networksetup -setairportpower Interface off"
do shell script "echo Wi-Fi turned off"
end if
================================================
FILE: commands/web-searches/amazon.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Search in Amazon
# @raycast.mode silent
# @raycast.packageName Web Searches
# Optional parameters:
# @raycast.icon images/amazon.png
# @raycast.argument1 { "type": "text", "placeholder": "query", "percentEncoded": true }
open "https://www.amazon.com/s?k=$1"
================================================
FILE: commands/web-searches/app-store.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Search in App Store
# @raycast.mode silent
# @raycast.packageName Web Searches
# Optional parameters:
# @raycast.icon images/app-store.png
# @raycast.argument1 { "type": "text", "placeholder": "query", "percentEncoded": true }
# Documentation
# @raycast.author Andrei Borisov
# @raycast.authorURL https://github.com/andreiborisov
# @raycast.description Search in App Store app
open "macappstore://ax.search.itunes.apple.com/WebObjects/MZSearch.woa/wa/search?q=$1"
================================================
FILE: commands/web-searches/arxiv.sh
================================================
#!/bin/bash
#
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Search in arXiv
# @raycast.mode silent
#
# Optional parameters:
# @raycast.packageName Web Searches
# @raycast.icon images/arxiv.png
# @raycast.argument1 { "type": "text", "placeholder": "Query", "percentEncoded": true }
# @raycast.argument2 { "type": "text", "placeholder": "Field (default: all)", "optional": true, "percentEncoded": true }
# @raycast.author Marco Varisco
# @raycast.authorURL https://github.com/mava
archive="" # Leave empty to search in all archives, or use one of the available archives:
# physics astro-ph cond-mat gr-qc hep-ex hep-lat hep-ph hep-th math-ph nlin nucl-ex nucl-th quant-ph
# cs econ eess math q-bio q-fin stat
# For example, uncomment the following line to search only in archive math:
# archive="math"
case $(tr "[:upper:]" "[:lower:]" <<< $2) in
""|"al"|"all")
searchtype="all"
;;
"ti"|"tit"|"titl"|"title"|"titles")
searchtype="title"
;;
"au"|"aut"|"auth"|"autho"|"author"|"authors")
searchtype="author"
;;
"ab"|"abs"|"abst"|"abstr"|"abstra"|"abstrac"|"abstract"|"abstracts")
searchtype="abstract"
;;
"co"|"com"|"comm"|"comme"|"commen"|"comment"|"comments")
searchtype="comments"
;;
*)
searchtype=$2
;;
esac
open "https://arxiv.org/search/$archive?query=$1&searchtype=$searchtype"
================================================
FILE: commands/web-searches/bnf-search.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title BNF Search
# @raycast.mode silent
# Optional parameters:
# @raycast.icon 💊
# @raycast.packageName Medical
# @raycast.argument1 { "type": "dropdown", "placeholder": "Source", "data": [{"title": "BNF (Adults)", "value": "bnf"}, {"title": "BNFC (Children)", "value": "bnfc"}] }
# @raycast.argument2 { "type": "text", "placeholder": "Medication (e.g. Paracetamol)" }
# Documentation:
# @raycast.description Search the British National Formulary (BNF) or BNFC directly.
# @raycast.author Jack Smith
# @raycast.authorURL https://github.com/myusualonewastaken
SOURCE="$1"
INPUT="$2"
if [ "$SOURCE" == "bnfc" ]; then
BASE_DOMAIN="bnfc.nice.org.uk"
else
BASE_DOMAIN="bnf.nice.org.uk"
fi
# Clean up input: Lowercase, replace spaces with dashes
SLUG=$(echo "$INPUT" | tr '[:upper:]' '[:lower:]' | tr ' ' '-')
DIRECT_URL="https://$BASE_DOMAIN/drugs/$SLUG/"
SEARCH_URL="https://$BASE_DOMAIN/search?q=$INPUT"
# Check URL with a fake User-Agent to avoid being blocked
# -o /dev/null: Ignore the page content
# --silent: Don't show loading bars
# --head: Only check the headers
# --write-out '%{http_code}': Tell us the status code (e.g., 200 or 404)
STATUS=$(curl -o /dev/null --silent --head --write-out '%{http_code}' -A "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)" "$DIRECT_URL")
# If the status is 200 (OK), open the direct page. Otherwise, search.
if [ "$STATUS" -eq 200 ]; then
open "$DIRECT_URL"
else
open "$SEARCH_URL"
fi
================================================
FILE: commands/web-searches/bundlephobia.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Bundlephobia cost
# @raycast.mode silent
# @raycast.author Zander Martineau
# @raycast.authorURL https://zander.wtf
# Optional parameters:
# @raycast.icon 📦
# @raycast.packageName Web Searches
# @raycast.argument1 { "type": "text", "placeholder": "package name", "percentEncoded": true }
open "https://bundlephobia.com/result?p=${1}"
================================================
FILE: commands/web-searches/caniuse.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Caniuse.com search
# @raycast.mode silent
# @raycast.author Zander Martineau
# @raycast.authorURL https://zander.wtf
# Optional parameters:
# @raycast.icon ❓
# @raycast.packageName Web searches
# @raycast.argument1 { "type": "text", "placeholder": "feature", "percentEncoded": true }
open "https://caniuse.com/#search=${1}"
================================================
FILE: commands/web-searches/check-weather.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Check Weather
# @raycast.mode silent
# Optional parameters:
# @raycast.icon 🌦
# @raycast.packageName wttr.in
# @raycast.argument1 { "type": "text", "placeholder": "Location", "optional": true}
# @raycast.argument2 { "type": "text", "placeholder": "Options", "optional": true}
# Documentation:
# @raycast.author Jakub Lanski
# @raycast.authorURL https://github.com/jaklan
# $1 (Location) - e.g. "warsaw", "warsaw poland", "warsaw usa"; default: current location
# $2 (Options) - e.g. "0", "1", "0q", "format=v2"; more info:
# https://wttr.in/:help
# https://github.com/chubin/wttr.in
open "https://wttr.in/$1?$2"
================================================
FILE: commands/web-searches/clipboard-to-17track.js
================================================
#!/usr/bin/env node
// Dependency: This script requires Nodejs.
// Install Node: https://nodejs.org/en/download/
// Required parameters:
// @raycast.schemaVersion 1
// @raycast.title Clipboard to 17TRACK
// @raycast.mode silent
// @raycast.packageName Web Searches
// Optional parameters:
// @raycast.icon 🚚
// Documentation:
// @raycast.description Open 17TRACK with the tracking code found in the clipboard
// @raycast.author Alessandra Pereyra
// @raycast.authorURL https://github.com/alessandrapereyra
const child_process = require("child_process");
const trackingCode = child_process.execSync("pbpaste").toString();
const url = `https://t.17track.net/en#nums=${trackingCode}`;
child_process.execSync(`open "${url}"`);
================================================
FILE: commands/web-searches/crunchbase.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Search in Crunchbase
# @raycast.mode silent
# @raycast.packageName Web Searches
# Optional parameters:
# @raycast.icon images/crunchbase.png
# @raycast.argument1 { "type": "text", "placeholder": "query", "percentEncoded": true }
open "https://www.crunchbase.com/textsearch?q=${1}"
================================================
FILE: commands/web-searches/doi-clipboard.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Find Paper
# @raycast.mode silent
# Optional parameters:
# @raycast.icon 📖
# @raycast.packageName DOI
# Documentation:
# @raycast.description Scans clipboard and opens DOI links in your browser
# @raycast.author Razvan Azamfirei
# @raycast.authorURL https://github.com/razvanazamfirei
LINK="$(pbpaste)"
REGEX="^doi: 10."
if [[ "$LINK" =~ ^doi:10. ]]; then
IN="$LINK"
arrIN=("${IN//doi:/}")
URL="https://doi.org/${arrIN[0]}"
open "$URL"
elif [[ "$LINK" =~ ^doi/10. ]]; then
IN="$LINK"
arrIN=("${IN//doi///}")
URL="https://doi.org/${arrIN[0]}"
open "$URL"
elif [[ "$LINK" =~ ${REGEX} ]]; then
IN="$LINK"
arrIN=("${IN//doi: //}")
URL="https://doi.org/${arrIN[0]}"
open "$URL"
elif [[ "$LINK" =~ ^10. ]]; then
URL="https://doi.org/${LINK}"
open "$URL"
else
echo "Please specify a DOI"
exit 1
fi
================================================
FILE: commands/web-searches/doi.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Find Paper
# @raycast.mode silent
# Optional parameters:
# @raycast.icon 📖
# @raycast.argument1 { "type": "text", "placeholder": "DOI" }
# @raycast.packageName DOI
# Documentation:
# @raycast.description Parses and opens DOI links in your browser
# @raycast.author Razvan Azamfirei
# @raycast.authorURL https://github.com/razvanazamfirei
LINK="$1"
REGEX="^doi: 10."
if [[ "$LINK" =~ ^doi:10. ]]; then
IN="$LINK"
arrIN=("${IN//doi:/}")
URL="https://doi.org/${arrIN[0]}"
open "$URL"
elif [[ "$LINK" =~ ^doi/10. ]]; then
IN="$LINK"
arrIN=("${IN//doi///}")
URL="https://doi.org/${arrIN[0]}"
open "$URL"
elif [[ "$LINK" =~ ${REGEX} ]]; then
IN="$LINK"
arrIN=("${IN//doi: //}")
URL="https://doi.org/${arrIN[0]}"
open "$URL"
elif [[ "$LINK" =~ ^10. ]]; then
URL="https://doi.org/${LINK}"
open "$URL"
else
echo "Please specify a DOI"
exit 1
fi
================================================
FILE: commands/web-searches/duck-duck-go.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Search in DuckDuckGo
# @raycast.mode silent
# @raycast.packageName Web Searches
# Optional parameters:
# @raycast.icon images/duck-duck-go.png
# @raycast.argument1 { "type": "text", "placeholder": "query", "percentEncoded": true}
open "https://duckduckgo.com/?q=$1"
================================================
FILE: commands/web-searches/ecosia.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Search in Ecosia
# @raycast.mode silent
# @raycast.packageName Web Searches
# Optional parameters:
# @raycast.icon images/ecosia.png
# @raycast.argument1 { "type": "text", "placeholder": "query", "percentEncoded": true }
# Documentation:
# @raycast.author Sasivarnan R
# @raycast.authorURL https://github.com/sasivarnan
open "https://www.ecosia.org/search?q=${1}"
================================================
FILE: commands/web-searches/figma.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Search in Figma
# @raycast.mode silent
# @raycast.packageName Web Searches
# Optional parameters:
# @raycast.icon images/figma.png
# @raycast.argument1 { "type": "text", "placeholder": "query", "percentEncoded": true }
# Documentation:
# @raycast.description Search files in Figma
# @raycast.author Tanguy Le Stradic
# @raycast.authorURL https://github.com/tanguyls
# Configuration
# To retrieve your Figma team_id, do the following:
# 1. Go to https://www.figma.com/files
# 2. Click on "Search"
# 3. The current URL should now have an 18-digit id, that's your team_id. If you're using a personal workspace, leave the below variable blank.
TEAM_ID=""
open "https://www.figma.com/files/$TEAM_ID/search?model_type=files&q=${1}"
================================================
FILE: commands/web-searches/giphy.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Giphy search
# @raycast.mode silent
# @raycast.author Zander Martineau
# @raycast.authorURL https://zander.wtf
# Optional parameters:
# @raycast.icon images/giphy.png
# @raycast.packageName Web searches
# @raycast.argument1 { "type": "text", "placeholder": "search", "percentEncoded": true }
open "https://giphy.com/search/${1}"
================================================
FILE: commands/web-searches/google-maps.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Search Google Maps
# @raycast.mode silent
# @raycast.packageName Google Maps
# Optional parameters:
# @raycast.icon images/google-map.png
# @raycast.argument1 { "type": "text", "placeholder": "Location", "optional": true}
# @raycast.argument2 { "type": "text", "placeholder": "Destination", "optional": true}
first_argument=${1// /+}
second_argument=${2// /+}
if [ "$1" != "" ]; then
if [ "$2" = "" ]; then
open "https://www.google.com/maps/dir/?api=1&origin=$first_argument"
else
open "https://www.google.com/maps/dir/?api=1&origin=$first_argument&destination=$second_argument"
fi
elif [ "$1" = "" ] && [ "$2" != "" ]; then
open "https://www.google.com/maps/dir/?api=1&origin=Current+Location&destination=$second_argument"
else
open "https://www.google.com/maps"
fi
================================================
FILE: commands/web-searches/google-search.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Search in Google
# @raycast.mode silent
# @raycast.packageName Web Searches
# Optional parameters:
# @raycast.icon images/google.png
# @raycast.argument1 { "type": "text", "placeholder": "query", "percentEncoded": true}
open "https://www.google.com/search?q=$1"
================================================
FILE: commands/web-searches/google-translate.rb
================================================
#!/usr/bin/ruby
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Google Translate
# @raycast.mode compact
# @raycast.packageName Web Searches
# Optional parameters:
# @raycast.icon 🌍
# @raycast.argument1 { "type": "text", "placeholder": "Query" }
# @raycast.argument2 { "type": "text", "placeholder": "From", "optional": true }
# @raycast.argument3 { "type": "text", "placeholder": "To", "optional": true }
# Documentation:
# @raycast.description Translates via Google Translate
# @raycast.author Roland Leth
# @raycast.authorURL https://runtimesharks.com
# Usually translations are short enough, which is why this uses a `compact` mode,
# but if you'll be using it for longer translations, change line 6 to `fullOutput`.
# If you do change to `fullOutput`, you might also want to change the last line
# of the script to `.join("\n\n")`, so each result appears on its own line.
require 'net/http'
require 'json'
require 'open-uri'
q = ARGV[0]
sl = ARGV[1].nil? || ARGV[1].empty? ? "en" : ARGV[1] # Source language
tl = ARGV[2].nil? || ARGV[2].empty? ? "ro" : ARGV[2] # Target language
# If the length of the query is less than 2, it won't return anything valid.
if q.length < 2
exit 1
end
uri = URI('https://translate.googleapis.com/translate_a/single')
uri.query = URI::encode_www_form(
'client' => 'gtx',
'sl' => sl,
'tl' => tl,
'dt' => 't',
'q' => q
)
http = Net::HTTP.new(uri.host, 80)
request = Net::HTTP::Get.new(uri, initheader = {'Content-Type' => 'application/json', 'Accept' => 'application/json'})
results = http.request(request).read_body.force_encoding('UTF-8')
puts JSON.parse(results)[0][0]
.filter { |r| r.is_a? String and r != q }
.uniq
.join(", ")
================================================
FILE: commands/web-searches/grep-app-search.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Search in grep.app
# @raycast.mode silent
# @raycast.packageName Web Searches
# Optional parameters:
# @raycast.icon https://grep.app/favicon.ico
# @raycast.argument1 { "type": "text", "placeholder": "query", "percentEncoded": true }
open "https://grep.app/search?q=${1}"
================================================
FILE: commands/web-searches/hunter.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Find Email Address With Hunter
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/hunter.png
# @raycast.argument1 { "type": "text", "placeholder": "First Name", "percentEncoded": true, "optional": false }
# @raycast.argument2 { "type": "text", "placeholder": "Last Name", "percentEncoded": true, "optional": false }
# @raycast.argument3 { "type": "text", "placeholder": "Domain", "percentEncoded": true, "optional": false }
# @raycast.packageName Web Searches
# Documentation:
# @raycast.description Find emails using hunter.io
# @raycast.author Tanguy Le Stradic
# @raycast.authorURL https://github.com/tanguyls
first_name=$1
last_name=$2
domain=$3
open https://hunter.io/find/$domain/$first_name%20$last_name
================================================
FILE: commands/web-searches/im-feeling-ducky.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title I'm Feeling Ducky
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ./images/duck-duck-go.png
# @raycast.argument1 { "type": "text", "placeholder": "Query" }
# @raycast.packageName Web Searches
# Documentation:
# @raycast.description Open the first DuckDuckGo search result page for your query (also supports bang!)
# @raycast.author Achille Lacoin
# @raycast.authorURL https://github.com/pomdtr
# region-specific search e.g. 'us-en' for US (default);
# visit https://duckduckgo.com/params
REGION=us-en
if ! command -v tldr &>/dev/null; then
echo "ddgr is not installed."
echo "Installation instructions: https://github.com/jarun/ddgr#installation"
exit 1
fi
query=$1
ddgr --ducky --noprompt "$query" --reg "$REGION" &> /dev/null
================================================
FILE: commands/web-searches/kinopoisk.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Search in Kinopoisk
# @raycast.mode silent
# @raycast.packageName Web Searches
# Optional parameters:
# @raycast.icon images/kinopoisk.png
# @raycast.argument1 { "type": "text", "placeholder": "query", "percentEncoded": true }
# Documentation
# @raycast.author Andrei Borisov
# @raycast.authorURL https://github.com/andreiborisov
open "https://www.kinopoisk.ru/index.php?kp_query=$1"
================================================
FILE: commands/web-searches/mdn.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Search in MDN (Mozilla) Docs by Topic
# @raycast.mode silent
#
# Optional parameters:
# @raycast.packageName Web Searches
# @raycast.icon images/mdn_light.png
# @raycast.iconDark images/mdn_dark.png
# @raycast.argument1 { "type": "text", "placeholder": "js, css, html", "optional": true, "percentEncoded": true }
# @raycast.argument2 { "type": "text", "placeholder": "query", "percentEncoded": true }
#
# Documentation:
# @raycast.author Jesse Traynham
# @raycast.authorURL https://github.com/traynham
# @raycast.description Search in MDN (Mozilla) Docs by topic
open "https://developer.mozilla.org/search?topic=${1}&q=${2}"
================================================
FILE: commands/web-searches/mozilla-developer-network.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Search MDN (Mozilla Developer Network)
# @raycast.mode silent
# @raycast.packageName Web Searches
# @raycast.author Jon Callahan
# @raycast.authorURL https://www.joncallahan.com
# Optional parameters:
# @raycast.icon images/mozilla-developer-network.png
# @raycast.argument1 { "type": "text", "placeholder": "query", "percentEncoded": true }
open "https://developer.mozilla.org/search?q=${1}"
================================================
FILE: commands/web-searches/njt.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title njt
# @raycast.mode silent
# @raycast.author Zander Martineau
# @raycast.authorURL https://zander.wtf
# Optional parameters:
# @raycast.icon 🐸
# @raycast.packageName Web Searches
# @raycast.argument1 { "type": "text", "placeholder": "package-name [destination]", "percentEncoded": true }
open "https://njt.now.sh/jump?from=raycast&to=${1}"
================================================
FILE: commands/web-searches/npmjs.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Search npm Packages
# @raycast.mode silent
# @raycast.packageName Web Searches
# Optional parameters:
# @raycast.icon images/npmjs.png
# @raycast.argument1 { "type": "text", "placeholder": "package name", "percentEncoded": true }
open "https://www.npmjs.com/search?q=${1}"
================================================
FILE: commands/web-searches/npms.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title npms
# @raycast.mode silent
# @raycast.author Zander Martineau
# @raycast.authorURL https://zander.wtf
# Optional parameters:
# @raycast.icon images/npms.png
# @raycast.packageName Web Searches
# @raycast.argument1 { "type": "text", "placeholder": "package name", "percentEncoded": true }
open "https://npms.io/search?q=${1}"
================================================
FILE: commands/web-searches/opensecrets.sh
================================================
#!/bin/bash
#
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Search OpenSecrets.org
# @raycast.mode silent
#
# Optional parameters:
# @raycast.packageName Web Searches
# @raycast.icon images/opensecrets.png
# @raycast.argument1 { "type": "text", "placeholder": "Query", "percentEncoded": true }
# @raycast.argument2 { "type": "text", "placeholder": "Type (default: donor)", "optional": true, "percentEncoded": true }
# @raycast.author Daniel Sieradski
# @raycast.authorURL https://github.com/selfagency
case $(tr "[:upper:]" "[:lower:]" <<<$2) in
"" | "d" | "donor" | "donors")
searchtype="donors"
;;
"p" | "pol" | "pols" | "politician" | "politicians" | "l" | "lob" | "lobbyist" | "lobbyists")
searchtype="indiv"
;;
"o" | "org" | "orgs" | "organization" | "organizations")
searchtype="orgs"
;;
"n" | "news")
searchtype="news"
;;
"s" | "site")
searchtype="site"
;;
*)
searchtype=$2
;;
esac
open "https://www.opensecrets.org/search?q=$1&type=$searchtype"
================================================
FILE: commands/web-searches/pkg-go-dev.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Search Go Package Documentation
# @raycast.mode silent
#
# Optional parameters:
# @raycast.packageName Web Searches
# @raycast.icon images/go.png
# @raycast.argument1 { "type": "text", "placeholder": "Package", "percentEncoded": true }
# @raycast.argument2 { "type": "text", "placeholder": "Version (default: latest)", "optional": true }
# Note: For standard library packages, prefix the version with 'go'. For others, prefix with 'v'.
# Ex: To search for documentation on the 'time' package from Go version 1.12.3, pass 'go1.12.3'.
# To search for documentation on the 'github.com/gorilla/mux' package from version 1.7.0, pass 'v1.7.0'.
#
# Documentation:
# @raycast.author Phil Salant
# @raycast.authorURL https://github.com/PSalant726
# @raycast.description Search pkg.go.dev for package documentation
version=""
if [ -n "$2" ]; then
version="@$2"
fi
open "https://pkg.go.dev/$1$version"
================================================
FILE: commands/web-searches/postgresql.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title PostgreSQL Documentation
# @raycast.mode silent
#
# Optional parameters:
# @raycast.packageName Web Searches
# @raycast.icon images/psql.png
# @raycast.argument1 { "type": "text", "placeholder": "Query", "percentEncoded": true }
#
# Documentation:
# @raycast.author Phil Salant
# @raycast.authorURL https://github.com/PSalant726
# @raycast.description Search PostgreSQL documentation
open "https://www.postgresql.org/search/?q=$1"
================================================
FILE: commands/web-searches/pub-search.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Pub.dev Search
# @raycast.description Search [pub.dev](https://pub.dev/) for packages to build Dart and Flutter apps.
# @raycast.mode silent
# @raycast.author Wade Garrett
# @raycast.authorURL https://wadegarrett.com
# Optional parameters:
# @raycast.icon images/dart-logo.png
# @raycast.packageName Web Searches
# @raycast.argument1 { "type": "text", "placeholder": "search", "percentEncoded": true }
open "https://pub.dev/packages?q=${1}"
================================================
FILE: commands/web-searches/repo.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Open npm Package Repo
# @raycast.mode silent
# @raycast.author Zander Martineau
# @raycast.authorURL https://zander.wtf
# Optional parameters:
# @raycast.icon 📦
# @raycast.packageName Web Searches
# @raycast.argument1 { "type": "text", "placeholder": "package name", "percentEncoded": true }
open "http://ghub.io/${1}"
================================================
FILE: commands/web-searches/rust-crate.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Search for Crate
# @raycast.mode silent
# @raycast.packageName Web Search
# @raycast.argument1 { "type": "text", "placeholder": "Name", "percentEncoded": true }
#
# Optional parameters:
# @raycast.icon ./images/cargo-logo.png
#
# Documentation:
# @raycast.description Search for a rust crate on crates.io
# @raycast.author Matthew Gleich
# @raycast.authorURL https://mattglei.ch
open "https://crates.io/search?q=$1"
================================================
FILE: commands/web-searches/search-cdnjs.sh
================================================
#!/bin/bash
# @raycast.title Search cdnjs
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Search [cdnjs.com](https://cdnjs.com/) for library.
# @raycast.icon images/cloudflare-logo.png
# @raycast.mode silent
# @raycast.packageName Web Searches
# @raycast.schemaVersion 1
# @raycast.argument1 { "type": "text", "placeholder": "Library", "percentEncoded": true }
open "https://cdnjs.com/libraries?q=${1}"
================================================
FILE: commands/web-searches/search-coinmarketcap.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title CoinMarketCap Search
# @raycast.mode compact
# Optional parameters:
# @raycast.icon 🪙
# @raycast.argument1 { "type": "text", "placeholder": "Placeholder" }
# Documentation:
# @raycast.description Searches coinmarketcap currencies.
# @raycast.author Benedict Neo
# @raycast.authorURL https://github.com/benthecoder
open "https://coinmarketcap.com/currencies/$1"
================================================
FILE: commands/web-searches/search-emojipedia.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Search in Emojipedia
# @raycast.mode silent
# @raycast.packageName Web Searches
# Optional parameters:
# @raycast.icon 🔎
# @raycast.argument1 { "type": "text", "placeholder": "query", "percentEncoded": true}
# Documentation:
# @raycast.description Search for emojis at emojipedia.
# @raycast.author Benedict Neo
# @raycast.authorURL https://github.com/benthecoder
open "https://emojipedia.org/search/?q=$1"
================================================
FILE: commands/web-searches/search-gender-in-chosic.applescript
================================================
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Search Genre in Chosic
# @raycast.mode inline
# Optional parameters:
# @raycast.packageName Web Searches
# @raycast.icon images/chosic.png
# Documentation:
# @raycast.description Find the current Spotify track's gender in Chosic
# @raycast.author quelhasu
# @raycast.authorURL https://github.com/quelhasu
tell application "Spotify"
try
set spotifyURI to spotify url of the current track
set trackName to name of the current track
set trackArtist to artist of the current track
end try
end tell
set AppleScript's text item delimiters to ":"
set trackID to third text item of spotifyURI
log trackName & " ~ " & trackArtist
open location "https://www.chosic.com/music-genre-finder/?track=" & trackID
================================================
FILE: commands/web-searches/search-github.sh
================================================
#!/bin/bash
# @raycast.title Search GitHub
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Search [GitHub](https://github.com).
# @raycast.icon images/github-logo.png
# @raycast.iconDark images/github-logo-iconDark.png
# @raycast.mode silent
# @raycast.packageName Web Searches
# @raycast.schemaVersion 1
# @raycast.argument1 { "type": "text", "placeholder": "Query", "percentEncoded": true }
open "https://github.com/search?q=${1}"
================================================
FILE: commands/web-searches/search-hacker-news.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Search Hacker News
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/hacker-news.png
# @raycast.argument1 { "type": "text", "placeholder": "query", "percentEncoded": true }
# @raycast.packageName Web Searches
# Documentation:
# @raycast.description Search Hacker News
# @raycast.authorURL https://github.com/s-oram
# @raycast.author Shannon Matthews
open -n "https://hn.algolia.com/?q=${1}"
================================================
FILE: commands/web-searches/search-imdb.sh
================================================
#!/bin/bash
# @raycast.title Search IMDB
# @raycast.author Lucas Costa
# @raycast.authorURL https://github.com/lucasrcosta
# @raycast.description Search IMDB.
# @raycast.icon images/imdb.png
# @raycast.mode silent
# @raycast.packageName Web Searches
# @raycast.schemaVersion 1
# @raycast.argument1 { "type": "text", "placeholder": "Title", "percentEncoded": true }
open "https://www.imdb.com/find?q=${1}"
================================================
FILE: commands/web-searches/search-in-baidu.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.author Jax0rz
# @authorURL https://github.com/Jax0rz
# @raycast.schemaVersion 1
# @raycast.title Search in Baidu
# @raycast.mode silent
# @raycast.packageName Web Searches
# Optional parameters:
# @raycast.icon images/baidu.png
# @raycast.argument1 { "type": "text", "placeholder": "关键词...", "percentEncoded": true }
open "https://www.baidu.com/s?wd=$1"
================================================
FILE: commands/web-searches/search-in-bilibili.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.author Jax0rz
# @authorURL https://github.com/Jax0rz
# @raycast.schemaVersion 1
# @raycast.title Search in Bilibili
# @raycast.mode silent
# @raycast.packageName Web Searches
# Optional parameters:
# @raycast.icon images/bilibili.png
# @raycast.argument1 { "type": "text", "placeholder": "关键词...", "percentEncoded": true }
open "https://search.bilibili.com/all?keyword=$1"
================================================
FILE: commands/web-searches/search-in-devhints.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.author Francois
# @raycast.authorURL https://github.com/AsterYujano
# @raycast.schemaVersion 1
# @raycast.title Search in devhints.io
# @raycast.mode silent
# @raycast.packageName Web Searches
# Optional parameters:
# @raycast.icon images/devhints.png
# @raycast.argument1 { "type": "text", "placeholder": "Search term...", "percentEncoded": true }
open "https://devhints.io/?q=$1"
================================================
FILE: commands/web-searches/search-in-dndbeyond.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Search in DnDBeyond.com
# @raycast.mode silent
# @raycast.author Chris Koerner Zeller
# @raycast.authorURL https://github.com/ChessMess
# Optional parameters:
# @raycast.icon ./images/ddbicon.png
# @raycast.packageName Web Searches
# @raycast.argument1 { "type": "text", "placeholder": "Searching for", "percentEncoded": true }
# @raycast.argument2 { "type": "text", "placeholder": "Category", "optional": true}
# @raycast.argument3 { "type": "text", "placeholder": "Subcategory", "optional": true}
case ${2} in
'c'|'ch'|'cha'|'char'|'character'|'characters')
c='characters'
f='spells,backgrounds,classes,feats,races'
;;
'cl'|'class'|'classes')
c='characters'
f='classes'
;;
'com'|'compendium')
c='compendium'
f='actions,compendium,conditions,skills,rules,weapon-property'
;;
'e'|'eq'|'equip'|'equipment')
c='equipment'
f='equipment,magic-items'
;;
'f'|'fe'|'ft'|'feat'|'feats')
c='characters'
f='feats'
;;
'i'|'it'|'ite'|'itm'|'item'|'items')
c='items'
f='equipment,magic-items'
;;
'm'|'mag'|'magic'|'magical')
c='items'
f='spells,magic-items'
;;
'mi'|'magicitems'|'magic items'|'magic-items')
c='items'
f='magic-items'
;;
'r'|'ra'|'rac'|'race'|'races')
c='characters'
f='races'
;;
'r'|'rule'|'rules')
c='rules'
f='rules'
;;
's'|'sp'|'spell'|'spells')
c='spells'
f='spells'
;;
'sk'|'skill'|'skills')
c='skills'
f='skills'
;;
'v'|'vehicle')
c='vehicle'
f='vehicle'
;;
'w'|'weap'|'weapon')
c='equipment'
f='equipment,magic-items'
;;
*)
c=${2}
f=${3}
;;
esac
open "https://dndbeyond.com/search?q=${1}&c=${c}&f=${f}"
================================================
FILE: commands/web-searches/search-in-jingdong.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.author sunbufu
# @raycast.authorURL https://sunbufu.github.io/
# @raycast.schemaVersion 1
# @raycast.title Search in Jingdong
# @raycast.mode silent
# @raycast.packageName Web Searches
# Optional parameters:
# @raycast.icon images/jingdong.png
# @raycast.argument1 { "type": "text", "placeholder": "keyword", "percentEncoded": true }
open "https://search.jd.com/Search?keyword=$1"
================================================
FILE: commands/web-searches/search-in-taobao.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.author Jax0rz
# @authorURL https://github.com/Jax0rz
# @raycast.schemaVersion 1
# @raycast.title Search in Taobao
# @raycast.mode silent
# @raycast.packageName Web Searches
# Optional parameters:
# @raycast.icon images/taobao.png
# @raycast.argument1 { "type": "text", "placeholder": "Placeholder", "percentEncoded": true }
open "https://s.taobao.com/search?q=$1"
================================================
FILE: commands/web-searches/search-in-wikipedia.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.author Jax0rz
# @authorURL https://github.com/Jax0rz
# @raycast.schemaVersion 1
# @raycast.title Search in Wikipedia
# @raycast.mode silent
# @raycast.packageName Web Searches
# Optional parameters:
# @raycast.icon images/wikipedia.png
# @raycast.argument1 { "type": "text", "placeholder": "Search term...", "percentEncoded": true }
domain="zh"
open "https://$domain.wikipedia.org/w/index.php?search=$1"
================================================
FILE: commands/web-searches/search-in-zhihu.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.author Jax0rz
# @authorURL https://github.com/Jax0rz
# @raycast.schemaVersion 1
# @raycast.title Search in Zhihu
# @raycast.mode silent
# @raycast.packageName Web Searches
# Optional parameters:
# @raycast.icon images/zhihu.png
# @raycast.argument1 { "type": "text", "placeholder": "关键词...", "percentEncoded": true}
open "https://www.zhihu.com/search?type=content&q=$1"
================================================
FILE: commands/web-searches/search-linkedin.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Search LinkedIn
# @raycast.mode silent
# @raycast.packageName Web Searches
# Optional parameters:
# @raycast.icon images/linkedin.png
# @raycast.argument1 { "type": "text", "placeholder": "Search for?", "percentEncoded": true}
# Documentation:
# @raycast.author Nitin Gupta
# @raycast.authorURL https://twitter.com/gniting
# @raycast.description Search LinkedIn
open "https://www.linkedin.com/search/results/all/?keywords=${1}"
================================================
FILE: commands/web-searches/search-netflix.sh
================================================
#!/bin/bash
# @raycast.title Search Netflix
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Search Netflix.
# @raycast.icon images/netflix-logo.png
# @raycast.mode silent
# @raycast.packageName Web Searches
# @raycast.schemaVersion 1
# @raycast.argument1 { "type": "text", "placeholder": "Title", "percentEncoded": true }
open "https://www.netflix.com/search?q=${1}"
================================================
FILE: commands/web-searches/search-php-docs.sh
================================================
#!/bin/bash
# @raycast.title Search PHP Docs
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Search [PHP official documentation](https://www.php.net/docs.php).
# @raycast.icon images/php-logo.png
# @raycast.iconDark images/php-logo-iconDark.png
# @raycast.mode silent
# @raycast.packageName Web Searches
# @raycast.schemaVersion 1
# @raycast.argument1 { "type": "text", "placeholder": "Query", "percentEncoded": true }
open "https://www.php.net/manual-lookup.php?pattern=${1}&scope=quickref"
================================================
FILE: commands/web-searches/search-pypi.sh
================================================
#!/bin/bash
# @raycast.title Search Python Package Index (PyPI)
# @raycast.author Lucas Costa
# @raycast.authorURL https://github.com/lucasrcosta
# @raycast.description Search Python Package Index (PyPI)
# @raycast.icon images/pip.png
# @raycast.mode silent
# @raycast.packageName Web Searches
# @raycast.schemaVersion 1
# @raycast.argument1 { "type": "text", "placeholder": "Title", "percentEncoded": true }
open "https://pypi.org/search/?q=${1}"
================================================
FILE: commands/web-searches/search-python3-docs.sh
================================================
#!/bin/bash
# @raycast.title Search Python 3 Documentation
# @raycast.author Lucas Costa
# @raycast.authorURL https://github.com/lucasrcosta
# @raycast.description Search Python 3 Documentation
# @raycast.icon images/python.png
# @raycast.mode silent
# @raycast.packageName Web Searches
# @raycast.schemaVersion 1
# @raycast.argument1 { "type": "text", "placeholder": "Title", "percentEncoded": true }
open "https://docs.python.org/3/search.html?q=${1}"
================================================
FILE: commands/web-searches/search-rust-docs.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Search Rust Documentation
# @raycast.mode silent
#
# Optional parameters:
# @raycast.packageName Web Searches
# @raycast.icon images/rust.png
# @raycast.argument1 { "type": "text", "placeholder": "Name", "percentEncoded": true }
#
# Example query:
# Searching for `expect` will open this link in your browser:
# `https://doc.rust-lang.org/std/?search=expect`.
#
# Documentation:
# @raycast.author lemorage
# @raycast.authorURL https://raycast.com/lemorage
# @raycast.description Search Rust documentation
query=$(echo "$1" | sed 's/ /%20/g')
open "https://doc.rust-lang.org/std/?search=$query"
================================================
FILE: commands/web-searches/search-script-command-marketplace.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Search Script Command
# @raycast.mode compact
# Optional parameters:
# @raycast.icon images/marketplace-logo.png
# @raycast.argument1 { "type": "text", "placeholder": "query"}
# @raycast.packageName Web Searches
# @raycast.description Search for Script Commands in the [Unofficial Raycast Script Commands Marketplace](https://scriptcommands.alexandru.so).
# Documentation:
# @raycast.author Alexandru Turcanu
# @raycast.authorURL https://github.com/Pondorasti
open "https://scriptcommands.alexandru.so/?search=$1"
================================================
FILE: commands/web-searches/search-swift-github.sh
================================================
#!/bin/bash
# @raycast.schemaVersion 1
# @raycast.title Search Swift Code
# @raycast.mode silent
# @raycast.icon ./images/swift.png
# @raycast.packageName Web Searches
# @raycast.argument1 { "type": "text", "placeholder": "Query", "urlencoded": true, "optional": true }
if [[ -z "$1" ]]
then
QUERY=$(pbpaste)
else
QUERY=$1
fi
open "https://github.com/search?q=$QUERY&l=Swift&type=code"
================================================
FILE: commands/web-searches/search-unsplash.sh
================================================
#!/bin/bash
# @raycast.title Search Unsplash
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Search [Unsplash](https://unsplash.com).
# @raycast.icon images/unsplash-logo.png
# @raycast.iconDark images/unsplash-logo-iconDark.png
# @raycast.mode silent
# @raycast.packageName Web Searches
# @raycast.schemaVersion 1
# @raycast.argument1 { "type": "text", "placeholder": "Query" }
open "https://unsplash.com/s/photos/${1// /-}"
================================================
FILE: commands/web-searches/search-wpengine-installs.sh
================================================
#!/bin/bash
# @raycast.title Search WP Engine Installs
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Search [WP Engine](https://wpengine.com) installs.
# @raycast.icon images/wpengine-logo.png
# @raycast.mode silent
# @raycast.packageName Web Searches
# @raycast.schemaVersion 1
# @raycast.argument1 { "type": "text", "placeholder": "Query", "percentEncoded": true }
open "https://my.wpengine.com/omni_search?q=${1}"
================================================
FILE: commands/web-searches/swift-package-index.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Swift Package Index
# @raycast.mode silent
# @raycast.packageName Web Searches
# Optional parameters:
# @raycast.icon images/spi.png
# @raycast.argument1 { "type": "text", "placeholder": "query", "percentEncoded": true, "optional": true }
# Documentation
# @raycast.author The Swift Package Index
# @raycast.authorURL https://swiftpackageindex.com
# @raycast.description Search for Swift packages in the Swift Package Index.
if [[ -z "$1" ]]
then
open "https://swiftpackageindex.com/"
else
open "https://swiftpackageindex.com/search?query=$1"
fi
================================================
FILE: commands/web-searches/translate-with-baidu.template.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.author sunbufu
# @raycast.authorURL https://sunbufu.github.io/
# @raycast.schemaVersion 1
# @raycast.title Translate with Baidu
# @raycast.mode silent
# @raycast.packageName Web Searches
# Optional parameters:
# @raycast.icon images/baidu-translate.png
# @raycast.argument1 { "type": "text", "placeholder": "keyword", "percentEncoded": true }
# Most common acronyms
# en = English
# spa = Spanish
# fra = French
# pt = Portuguese
# zh = Chinese
# more to come
# For the source language, you can also use "auto", for automatic detection
source="" # Source language acronym
destination="" # Destination language acronym
open "https://fanyi.baidu.com/#$source/$destination/$1"
================================================
FILE: commands/web-searches/translate-with-google.template.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.author sunbufu
# @raycast.authorURL https://sunbufu.github.io/
# @raycast.schemaVersion 1
# @raycast.title Translate with Google
# @raycast.mode silent
# @raycast.packageName Web Searches
# Optional parameters:
# @raycast.icon images/google-translate.png
# @raycast.argument1 { "type": "text", "placeholder": "keyword", "percentEncoded": true }
# Most common acronyms
# en = English
# es = Spanish
# fr = French
# pt = Portuguese
# zh-CN = Chinese
# more to come
# For the source language, you can also use "auto", for automatic detection
source="" # Source language acronym
destination="" # Destination language acronym
# You can use "translate.google.cn" in China.
domain="translate.google.com"
open "https://$domain/?sl=$source&tl=$destination&text=$1&op=translate"
================================================
FILE: commands/web-searches/twitter-search.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Search in Twitter
# @raycast.mode silent
# @raycast.packageName Web Searches
# Optional parameters:
# @raycast.icon images/twitter.png
# @raycast.argument1 { "type": "text", "placeholder": "query", "percentEncoded": true }
open "https://twitter.com/search?q=${1}&src=typed_query"
================================================
FILE: commands/web-searches/unfurl.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Unfurl URL
# @raycast.mode silent
# @raycast.author Zander Martineau
# @raycast.authorURL https://zander.wtf
# Optional parameters:
# @raycast.icon 🔗
# @raycast.packageName Web Searches
# @raycast.argument1 { "type": "text", "placeholder": "url", "percentEncoded": true }
open "https://unfurler.com/?url=${1}"
================================================
FILE: commands/web-searches/wayback-machine.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Wayback Machine Search
# @raycast.mode silent
# @raycast.author Zander Martineau
# @raycast.authorURL https://zander.wtf
# Optional parameters:
# @raycast.icon images/ia-logo.jpg
# @raycast.packageName Web Searches
# @raycast.argument1 { "type": "text", "placeholder": "url", "percentEncoded": true }
open "https://web.archive.org/web/*/${1}"
================================================
FILE: commands/web-searches/wordpress/search-wordpress-docs.sh
================================================
#!/bin/bash
# @raycast.title Search WordPress Docs
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Search [WordPress Developer documentation](https://developer.wordpress.org/reference/).
# @raycast.icon images/wordpress-logo.png
# @raycast.iconDark images/wordpress-logo-iconDark.png
# @raycast.mode silent
# @raycast.packageName WordPress
# @raycast.schemaVersion 1
# @raycast.argument1 { "type": "text", "placeholder": "Query", "percentEncoded": true }
open "https://wordpress.org/search/${1}?in=developer_documentation"
================================================
FILE: commands/web-searches/wordpress/wordpress-classes-reference.sh
================================================
#!/bin/bash
# @raycast.title WordPress Classes Reference
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Open [WordPress classes reference](https://developer.wordpress.org/reference/classes/) for specified class.
# @raycast.icon images/wordpress-logo.png
# @raycast.iconDark images/wordpress-logo-iconDark.png
# @raycast.mode silent
# @raycast.packageName WordPress
# @raycast.schemaVersion 1
# @raycast.argument1 { "type": "text", "placeholder": "Class name", "percentEncoded": true }
open "https://developer.wordpress.org/reference/classes/${1}/"
================================================
FILE: commands/web-searches/wordpress/wordpress-cli-command.sh
================================================
#!/bin/bash
# @raycast.title WordPress CLI Command
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Open [WordPress CLI command reference](https://developer.wordpress.org/cli/commands/) for specified command.
# @raycast.icon images/wordpress-logo.png
# @raycast.iconDark images/wordpress-logo-iconDark.png
# @raycast.mode silent
# @raycast.packageName WordPress
# @raycast.schemaVersion 1
# @raycast.argument1 { "type": "text", "placeholder": "Command" }
open "https://developer.wordpress.org/cli/commands/${1// //}/"
================================================
FILE: commands/web-searches/wordpress/wordpress-functions-reference.sh
================================================
#!/bin/bash
# @raycast.title WordPress Functions Reference
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Open [WordPress functions reference](https://developer.wordpress.org/reference/functions/) for specified function.
# @raycast.icon images/wordpress-logo.png
# @raycast.iconDark images/wordpress-logo-iconDark.png
# @raycast.mode silent
# @raycast.packageName WordPress
# @raycast.schemaVersion 1
# @raycast.argument1 { "type": "text", "placeholder": "Function name", "percentEncoded": true }
open "https://developer.wordpress.org/reference/functions/${1}/"
================================================
FILE: commands/web-searches/wordpress/wordpress-hooks-reference.sh
================================================
#!/bin/bash
# @raycast.title WordPress Hooks Reference
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Open [WordPress hooks reference](https://developer.wordpress.org/reference/hooks/) for specified hook.
# @raycast.icon images/wordpress-logo.png
# @raycast.iconDark images/wordpress-logo-iconDark.png
# @raycast.mode silent
# @raycast.packageName WordPress
# @raycast.schemaVersion 1
# @raycast.argument1 { "type": "text", "placeholder": "Hook name", "percentEncoded": true }
open "https://developer.wordpress.org/reference/hooks/${1}/"
================================================
FILE: commands/web-searches/wpengine-install.sh
================================================
#!/bin/bash
# @raycast.title Open WP Engine Install
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Open specified [WP Engine](https://wpengine.com) install.
# @raycast.icon images/wpengine-logo.png
# @raycast.mode silent
# @raycast.packageName Web Searches
# @raycast.schemaVersion 1
# @raycast.argument1 { "type": "text", "placeholder": "Install" }
open "https://my.wpengine.com/installs/${1// /}"
================================================
FILE: commands/web-searches/yandex-search.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Search in Yandex
# @raycast.mode silent
# Optional parameters:
# @raycast.icon images/yandex.png
# @raycast.argument1 { "type": "text", "placeholder": "query", "percentEncoded": true}
# @raycast.packageName Web Searches
open "https://yandex.com/search/?text=$1"
================================================
FILE: commands/web-searches/youtube.sh
================================================
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Search in YouTube
# @raycast.mode silent
# @raycast.packageName Web Searches
# Optional parameters:
# @raycast.icon images/youtube.png
# @raycast.argument1 { "type": "text", "placeholder": "query", "percentEncoded": true }
open "https://www.youtube.com/results?search_query=$1"
================================================
FILE: documentation/ARGUMENTS.md
================================================
## Arguments
Raycast allows you to set arguments for your script to enable you to do things like set items on a todo list or search Google for specified terms.
Use `argument[1..3]` metadata to specify custom arguments that will be displayed as inputs in the search bar when the script is selected.

The value of the argument metadata parameter should be valid json with these fields:
| Field | Description | Required | App Version |
| ----- | ----------- | -------- | ----------- |
| type | The argument type. We currently support `"text"`, `"password"` (for secure entry), and `"dropdown"`. When the type is `password`, entered text will be replaced with asterisks. Most common use case – passing passwords or secrets to commands. | ✅ | 1.64.0+ |
| placeholder | Placeholder for the input field. | ✅ | 1.2.0+ |
| optional | Set to `true` if you want to mark the argument as optional. When not provided, the argument is considered to be required (Raycast will not allow executing the script if the argument input is empty) | | 1.3.0+ |
| percentEncoded | Set to `true` if you want Raycast to perform percent-encoding on the argument value before passing it to the script. Can be handy for scripts that pass the argument directly to URL query | | 1.4.0+ |
| data | An array of objects with `title` and `value` properties, e.g.: `[{"title": "Item 1", "value": "1"}]` | ✅ when `type` is `dropdown`. | 1.64.0+ |
| ~~secure~~ | Deprecated in favor of `"type" = "password"` | | 1.18.0+ |
💡 **Maximum number of arguments:** 3 (if you have a use case that requires more, please let us know via feedback or in the [Slack community](https://www.raycast.com/community))
Here's an example of a simple web search script with two arguments:
```
#!/bin/bash
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Search Flights
# @raycast.mode silent
# Optional parameters:
# @raycast.icon 🛩
# @raycast.packageName Web Searches
# @raycast.argument1 { "type": "text", "placeholder": "from city", "percentEncoded": true }
# @raycast.argument2 { "type": "text", "placeholder": "to city", "optional": true, "percentEncoded": true }
open "https://www.google.com/search?q=flights%20from%20$1%20to%20$2"
```
💡**Pro tip:** When typing alias + space, Raycast will automatically move focus to the first input field.
================================================
FILE: documentation/OUTPUTMODES.md
================================================
## Output modes
Here, you can browse the range of ways that Raycast lets you view your data, whether you need to display a range of items such as open pull requests, or whether you just need confirmation that your script has run successfully.
In `fullOutput` the entire output is presented on a separate view, similar to a terminal window. This is handy when your script generates output to consume.

In `compact` mode the last line of the standard output is shown in the toast

In `silent` mode the last line (if exists) will be shown in overlaying HUD toast after Raycast window is closed.

In `inline` mode, the first line of output will be directly shown in the command item and automatically refresh according to the specified `refreshTime`. Tip: Set your dashboard items as favorites via the action menu in Raycast.
**NOTE:** `refreshTime` parameter is required for `inline` mode. When not specified, `compact` mode will be used instead.

**🚨 Hint:** use `cmd k` to access extra functionality such as adding to favorites or reordering the root search preferences.
Please note that long-running tasks generating a lot of partial data are not supported for `compact`, `silent`, and `inline` modes. For example, the `zip` command generates a lot of partial logs when compressing folders with many files. Scripts using `zip` won't work on `compact`, `silent`, and `inline`; but they will work in `fullOutput`. To make it work in the other modes you need to use the `zip -q` flag.
# ANSI Supported Colors 🎨
We support colors for `inline` and `fullOutput` mode scripts for you to customize generated output by changing its background and foreground color.

Escape code is in linux format: `0x1B`
Colors are adapted to current users appearance settings (light and dark themes)
| Color | # Foreground | # Background | Light | Dark |
| ------ | ------------ | ------------ | ----- | ---- |
| Black | 30 | 40 | #000000 | #000000 |
| Red | 31 | 41 | #B12424 | #FF6363 |
| Green | 32 | 42 | #006B4F | #59D499 |
| Yellow | 33 | 43 | #F8A300 | #FFC531 |
| Blue | 34 | 44 | #138AF2 | #56C2FF |
| Magenta | 35 | 45 | #9A1B6E | #CF2F98 |
| Cyan | 36 | 46 | #3EB8BF | #52EEE5 |
| White | 97 | 107 | #FFFFFF | #FFFFFF |
## Other colors
We also support [8-bit](https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit) and [24-bit](https://en.wikipedia.org/wiki/ANSI_escape_code#24-bit) color codes if you need a wider range of colors.
**Other supported codes:**
| Code | Name |
| ---- | ---- |
| 0 | Reset (normal) |
| 4 | Underline |
| 9 | Crossed out |
| 24 | Not underlined |
| 29 | Not crossed out |
**💡Hint:** Unsupported terminal codes will be stripped out from output and ignored.
**Example:**

| Script | Code |
| ------ | ---- |
| bash | `echo -e '\033[31;42mred text on green background\033[0m'` |
| bash tput | `export TERM=linux; echo "$(tput setaf 1)$(tput setab 2)red text on green background$(tput sgr0)";` |
| swift | `print("\\u{001B}[31;42mred text on green background\\u{001B}[0m")` |
| osascript | `do shell script "echo '\\033[31;42mred text on green background\\033[0m'"`|
| node.js | `console.log('\x1b[31;42mred text on green background\x1b[0m')`
================================================
FILE: templates/script-command.template.applescript
================================================
#!/usr/bin/osascript
# Raycast Script Command Template
#
# Duplicate this file and remove ".template" from the filename to get started.
# See full documentation here: https://github.com/raycast/script-commands
#
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title My First Script
# @raycast.mode fullOutput
# @raycast.packageName Raycast Scripts
#
# Optional parameters:
# @raycast.icon 🤖
# @raycast.currentDirectoryPath ~
# @raycast.needsConfirmation false
# @raycast.argument1 { "type": "text", "placeholder": "Arg1" }
#
# Documentation:
# @raycast.description Write a nice and descriptive summary about your script command here
# @raycast.author Your name
# @raycast.authorURL An URL for one of your social medias
on run argv
log "Hello from My First Script: " & ( item 1 of argv )
end run
================================================
FILE: templates/script-command.template.cs
================================================
#!/usr/bin/env dotnet
// Raycast Script Command Template
//
// Dependency: This script requires .NET 10
// Install .NET: https://dotnet.microsoft.com/
//
// Duplicate this file and remove ".template" from the filename to get started.
// See full documentation here: https://github.com/raycast/script-commands
//
// Required parameters:
// @raycast.schemaVersion 1
// @raycast.title My First Script
// @raycast.mode fullOutput
// @raycast.packageName Raycast Scripts
//
// Optional parameters:
// @raycast.icon 🤖
// @raycast.currentDirectoryPath ~
// @raycast.needsConfirmation false
//
// Documentation:
// @raycast.description Write a nice and descriptive summary about your script command here
// @raycast.author Your name
// @raycast.authorURL An URL for one of your social medias
Console.WriteLine("Hello World!");
================================================
FILE: templates/script-command.template.js
================================================
#!/usr/bin/env node
// Raycast Script Command Template
//
// Dependency: This script requires Nodejs.
// Install Node: https://nodejs.org/en/download/
//
// Duplicate this file and remove ".template" from the filename to get started.
// See full documentation here: https://github.com/raycast/script-commands
//
// Required parameters:
// @raycast.schemaVersion 1
// @raycast.title My First Script
// @raycast.mode fullOutput
// @raycast.packageName Raycast Scripts
//
// Optional parameters:
// @raycast.icon 🤖
// @raycast.argument1 { "type": "text", "placeholder": "js, css, html", "optional": true}
// @raycast.argument2 { "type": "text", "placeholder": "query" }
//
// Documentation:
// @raycast.description Write a nice and descriptive summary about your script command here
// @raycast.author Your name
// @raycast.authorURL An URL for one of your social medias
/*
ABOUT THIS TEMPLATE:
This template is meant to be a quick starting point for creating a script command using Nodejs.
This template demonstrates the following ideas:
* Extracting passed arguments.
* Using both required and optional arguments
* URI Encoding
* Outputting result to Raycast
* Opening a url using exec and the unix open command
* Use of destructuring
* Use of template literals
*/
const { exec } = require('child_process')
// Use destructuring to grab arguments.
// Use slice to start from position 3.
let [topic, query] = process.argv.slice(2)
let uri = `https://developer.mozilla.org/search?topic=${topic}&q=${encodeURIComponent(query)}`
// console.log() displays output in fullOutput mode.
console.log(`The arguments are: \n ${process.argv.join('\n ')}\n`)
console.log(`Your topic is "${topic}"`)
console.log(`Your query is "${query}"`)
console.log(`Your query uri encoded is "${encodeURIComponent(query)}"`)
console.log(`The uri is "${uri}"`)
// Uncomment the exec line below to open this query in your web browser.
// Use double quotes around the uri to avoid processing issues.
//exec(`open "${uri}"`)
================================================
FILE: templates/script-command.template.php
================================================
#!/usr/bin/env php
# Raycast Script Command Template
#
# Dependency: This script requires PHP
# Install PHP: http://www.https://www.php.net/
#
# Duplicate this file and remove ".template" from the filename to get started.
# See full documentation here: https://github.com/raycast/script-commands
#
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title My First Script
# @raycast.mode fullOutput
# @raycast.packageName Raycast Scripts
#
# Optional parameters:
# @raycast.icon 🤖
# @raycast.currentDirectoryPath ~
# @raycast.needsConfirmation false
#
# Documentation:
# @raycast.description Write a nice and descriptive summary about your script command here
# @raycast.author Your name
# @raycast.authorURL An URL for one of your social medias