diff --git a/commands/README.md b/commands/README.md
index d7d9cbfcc..b5432590d 100644
--- a/commands/README.md
+++ b/commands/README.md
@@ -49,6 +49,7 @@ This repository contains sample commands and documentation to write your own one
- [ExpressVPN](#expressvpn)
- [Fantastical](#fantastical)
- [Ferdi](#ferdi)
+ - [FindMy](#findmy)
- [Focus](#focus)
- [GoodLinks](#goodlinks)
- [HazeOver](#hazeover)
@@ -374,6 +375,13 @@ This repository contains sample commands and documentation to write your own one
|
| [Open Service by Index](apps/ferdi/ferdi-open-service-by-index.applescript) | N/A | [Jakub Lanski](https://github.com/jaklan) | ✅ | |
|
|
| [Open Service by Name](apps/ferdi/ferdi-open-service-by-name.applescript) | N/A | [Jakub Lanski](https://github.com/jaklan) | ✅ | |
|
+
+#### Find My
+
+| Icon | Title | Description | Author | Args | Templ | Lang |
+| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
+ |
| [Find My Phone](apps/find-my/find-my-phone.js) | Play a sound on your iPhone using iCloud Find My | [Varun Vaidya](https://github.com/vsvaidya27) | | ✅ |
|
+
#### Focus
| Icon | Title | Description | Author | Args | Templ | Lang |
diff --git a/commands/apps/find-my/.env.example b/commands/apps/find-my/.env.example
new file mode 100644
index 000000000..6e3a6c985
--- /dev/null
+++ b/commands/apps/find-my/.env.example
@@ -0,0 +1,3 @@
+ICLOUD_EMAIL=
+ICLOUD_PASSWORD=
+DEVICE=
\ No newline at end of file
diff --git a/commands/apps/find-my/README.md b/commands/apps/find-my/README.md
new file mode 100644
index 000000000..55057353e
--- /dev/null
+++ b/commands/apps/find-my/README.md
@@ -0,0 +1,58 @@
+# Find My Phone Raycast
+
+I lose my phone often, so I made this.
+
+This is a Node.js script that uses Playwright to automate iCloud Find My and trigger a sound on your Apple device. It's perfect for people like me who misplace their phones and want a quick, automated way to make them ring—with Raycast.
+
+## Usage
+
+```sh
+git clone https://github.com/vsvaidya27/fmp-raycast
+cd fmp-raycast
+npm install
+cp .env.example .env
+# Edit .env with your real credentials
+chmod +x fmp.js
+```
+
+### Add to Raycast
+
+1. Open Raycast and go to **Extensions**.
+2. Click **Add**.
+3. Select **Add Script Directory**.
+4. Choose the `fmp-raycast` directory you just cloned.
+5. Set fmp as your alias for calling the script.
+
+Now you can trigger the script directly from Raycast!
+
+## How it works
+
+- Automates login to iCloud Find My using Playwright
+- Selects your device by name
+- Triggers the "Play Sound" feature to help you locate your device
+
+**Note:** You'll need to provide your iCloud credentials and device name in the `.env` file. Sometimes a 2FA check may pop up, but usually they allow you to bypass this and manual intervention is not neccesary (since you often need the very thing you are trying to find for 2FA).
+
+---
+
+## 🛠 Troubleshooting
+
+### If you get the error `env: node: No such file or directory`
+
+Raycast uses a limited shell environment, so it may not find your Node.js install.
+
+To fix it:
+
+1. Run this in Terminal to find your full Node path:
+ ```bash
+ which node
+ ```
+2. Edit the top of `fmp.js`:
+ Replace:
+ ```sh
+ #!/usr/bin/env node
+ ```
+ With:
+ ```sh
+ #!/full/path/to/node
+ ```
diff --git a/commands/apps/find-my/fmp.js b/commands/apps/find-my/fmp.js
new file mode 100755
index 000000000..e672b032b
--- /dev/null
+++ b/commands/apps/find-my/fmp.js
@@ -0,0 +1,62 @@
+#!/usr/bin/env node
+
+// Required parameters:
+// @raycast.schemaVersion 1
+// @raycast.title Find My Phone (Auto Sound)
+// @raycast.mode silent
+// @raycast.packageName FindMy
+// @raycast.icon images/find-my-icon.png
+
+require('dotenv').config();
+const { chromium } = require('playwright');
+
+(async () => {
+ const browser = await chromium.launch({ headless: false });
+ const page = await browser.newPage();
+
+ // 1. Go to iCloud Find Devices
+ await page.goto('https://www.icloud.com/find');
+
+ // 2. Click "Sign In"
+ await page.waitForSelector('text=Sign In', { timeout: 20000 });
+ await page.click('text=Sign In');
+
+ // 3. Wait for the Apple login iframe to appear
+ const frameLocator = page.frameLocator('iframe[name="aid-auth-widget"]');
+
+ // 4. Wait for the email/phone input inside the iframe
+ await frameLocator.getByRole('textbox', { name: 'Email or Phone Number' }).waitFor({ timeout: 20000 });
+
+ // 5. Fill in the email/phone
+ await frameLocator.getByRole('textbox', { name: 'Email or Phone Number' }).fill(process.env.ICLOUD_EMAIL);
+
+ // 6. Click the right-arrow button
+ await frameLocator.getByRole('button').first().click();
+
+ // 7. Wait for the "Continue with Password" button to appear, then click it
+ await frameLocator.getByRole('button', { name: /Continue with Password/i }).waitFor({ timeout: 20000 });
+ await frameLocator.getByRole('button', { name: /Continue with Password/i }).click();
+
+ // 8. Wait for password input
+ await frameLocator.getByRole('textbox', { name: 'Password' }).waitFor({ timeout: 20000 });
+ await frameLocator.getByRole('textbox', { name: 'Password' }).fill(process.env.ICLOUD_PASSWORD);
+
+ // 9. Click the arrow button to continue
+ await frameLocator.getByRole('button').first().click();
+
+ // 10. Wait for 2FA if needed; Hopefully not because this kinda defeats the purpose of automation even though its prob for the best security-wise :(
+ console.log('If prompted, please complete 2FA in the browser window. :(');
+
+ // 12. Click on your iPhone using the precise selector inside the second iframe
+ await page.locator('iframe').nth(1).contentFrame().getByTitle(process.env.DEVICE).getByTestId('show-device-name').click();
+
+ // 13. Wait for the device details panel to load
+ await page.waitForTimeout(2000);
+
+ // 14. Click the "Play Sound" button
+ await page.locator('iframe').nth(1).contentFrame().getByRole('button', { name: 'Play Sound' }).click();
+
+ console.log('✅ Play Sound triggered for ' + process.env.DEVICE + '!');
+ await browser.close();
+})();
+
diff --git a/commands/apps/find-my/images/find-my-icon.png b/commands/apps/find-my/images/find-my-icon.png
new file mode 100644
index 000000000..0862bfec8
Binary files /dev/null and b/commands/apps/find-my/images/find-my-icon.png differ
diff --git a/commands/apps/find-my/package.json b/commands/apps/find-my/package.json
new file mode 100644
index 000000000..6e278971c
--- /dev/null
+++ b/commands/apps/find-my/package.json
@@ -0,0 +1,16 @@
+{
+ "name": "findmyraycast",
+ "version": "1.0.0",
+ "main": "fmp.js",
+ "scripts": {
+ "start": "node fmp.js"
+ },
+ "keywords": [],
+ "author": "",
+ "license": "ISC",
+ "description": "",
+ "dependencies": {
+ "dotenv": "^16.5.0",
+ "playwright": "^1.52.0"
+ }
+}