{"id":13434015,"url":"https://github.com/sindresorhus/alfy","last_synced_at":"2026-02-02T08:14:02.308Z","repository":{"id":39905415,"uuid":"62888800","full_name":"sindresorhus/alfy","owner":"sindresorhus","description":"Create Alfred workflows with ease","archived":false,"fork":false,"pushed_at":"2024-07-26T11:08:13.000Z","size":628,"stargazers_count":2635,"open_issues_count":13,"forks_count":105,"subscribers_count":23,"default_branch":"main","last_synced_at":"2025-05-07T17:29:00.139Z","etag":null,"topics":["alfred","alfred-workflow","alfred3-workflow","alfy","framework","javascript","macos","nodejs","workflow"],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sindresorhus.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"license","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":"sindresorhus","open_collective":"sindresorhus","buy_me_a_coffee":"sindresorhus","custom":"https://sindresorhus.com/donate"}},"created_at":"2016-07-08T12:58:58.000Z","updated_at":"2025-05-06T02:32:08.000Z","dependencies_parsed_at":"2023-11-17T17:04:34.704Z","dependency_job_id":"8317e6d4-13f2-4b9c-836c-b5e7153cad46","html_url":"https://github.com/sindresorhus/alfy","commit_stats":{"total_commits":164,"total_committers":59,"mean_commits":"2.7796610169491527","dds":0.5914634146341464,"last_synced_commit":"fcd33259bd6ce36a997c0b904351374730799066"},"previous_names":[],"tags_count":23,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sindresorhus%2Falfy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sindresorhus%2Falfy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sindresorhus%2Falfy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sindresorhus%2Falfy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sindresorhus","download_url":"https://codeload.github.com/sindresorhus/alfy/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254101615,"owners_count":22014909,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["alfred","alfred-workflow","alfred3-workflow","alfy","framework","javascript","macos","nodejs","workflow"],"created_at":"2024-07-31T02:01:42.958Z","updated_at":"2026-02-02T08:14:02.302Z","avatar_url":"https://github.com/sindresorhus.png","language":"JavaScript","funding_links":["https://github.com/sponsors/sindresorhus","https://opencollective.com/sindresorhus","https://buymeacoffee.com/sindresorhus","https://sindresorhus.com/donate"],"categories":["JavaScript","HarmonyOS","Libraries","Building","nodejs","Helpers","📊 Data \u0026 Analytics"],"sub_categories":["Windows Manager","Workflows"],"readme":"# ![Alfy](media/header.svg)\n\n\u003e Create [Alfred workflows](https://www.alfredapp.com/workflows/) with ease\n\n## Highlights\n\n- Easy input↔output.\n- Config and [cache](#caching) handling built-in.\n- Fetching remote files with optional caching.\n- Publish your workflow to npm.\n- Automatic [update notifications](#update-notifications).\n- Easily [testable workflows](#testing).\n- [Finds the `node` binary.](run-node.sh)\n- Support for top-level `await`.\n- Presents uncaught exceptions and unhandled Promise rejections to the user.\\\n  *No need to manually `.catch()` top-level promises.*\n\n## Prerequisites\n\nYou need [Node.js 18+](https://nodejs.org) and [Alfred 4 or later](https://www.alfredapp.com) with the paid [Powerpack](https://www.alfredapp.com/powerpack/) upgrade.\n\n## Install\n\n```sh\nnpm install alfy\n```\n\n## Usage\n\n**IMPORTANT:** Your script will be run as [ESM](https://nodejs.org/api/esm.html).\n\n1. Create a new blank Alfred workflow.\n\n2. Add a `Script Filter` (right-click the canvas → `Inputs` → `Script Filter`), set `Language` to `/bin/bash`, and add the following script:\n\n```\n./node_modules/.bin/run-node index.js \"$1\"\n```\n\n*We can't call `node` directly as GUI apps on macOS doesn't inherit the $PATH.*\n\n\u003e Tip: You can use [generator-alfred](https://github.com/SamVerschueren/generator-alfred) to scaffold out an `alfy` based workflow. If so, you can skip the rest of the steps, go straight to the `index.js` and do your thing.\n\n3. Set the `Keyword` by which you want to invoke your workflow.\n\n4. Go to your new workflow directory (right-click on the workflow in the sidebar → `Open in Finder`).\n\n5. Initialize a repo with `npm init`.\n\n6. Add `\"type\": \"module\"` to package.json.\n\n7. Install Alfy with `npm install alfy`.\n\n8. In the workflow directory, create a `index.js` file, import `alfy`, and do your thing.\n\n## Example\n\nHere we fetch some JSON from a placeholder API and present matching items to the user:\n\n```js\nimport alfy from 'alfy';\n\nconst data = await alfy.fetch('https://jsonplaceholder.typicode.com/posts');\n\nconst items = alfy\n\t.inputMatches(data, 'title')\n\t.map(element =\u003e ({\n\t\ttitle: element.title,\n\t\tsubtitle: element.body,\n\t\targ: element.id\n\t}));\n\nalfy.output(items);\n```\n\n\u003cimg src=\"media/screenshot.png\" width=\"694\"\u003e\n\n###### More\n\nSome example usage in the wild: [`alfred-npms`](https://github.com/sindresorhus/alfred-npms), [`alfred-emoj`](https://github.com/sindresorhus/alfred-emoj), [`alfred-ng`](https://github.com/SamVerschueren/alfred-ng).\n\n## Update notifications\n\nAlfy uses [alfred-notifier](https://github.com/SamVerschueren/alfred-notifier) in the background to show a notification when an update for your workflow is available.\n\n\u003cimg src=\"media/screenshot-update.png\" width=\"694\"\u003e\n\n## Caching\n\nAlfy offers the possibility of caching data, either with the [fetch](#fetchurl-options) or directly through the [cache](#cache) object.\n\nAn important thing to note is that the cached data gets invalidated automatically when you update your workflow. This offers the flexibility for developers to change the structure of the cached data between workflows without having to worry about invalid older data.\n\n## Publish to npm\n\nBy adding `alfy-init` as `postinstall` and `alfy-cleanup` as `preuninstall` script, you can publish your package to [npm](https://npmjs.org) instead of to [Packal](http://www.packal.org). This way, your packages are only one simple `npm install` command away.\n\n```json\n{\n\t\"name\": \"alfred-unicorn\",\n\t\"version\": \"1.0.0\",\n\t\"description\": \"My awesome unicorn workflow\",\n\t\"author\": {\n\t\t\"name\": \"Sindre Sorhus\",\n\t\t\"email\": \"sindresorhus@gmail.com\",\n\t\t\"url\": \"https://sindresorhus.com\"\n\t},\n\t\"scripts\": {\n\t\t\"postinstall\": \"alfy-init\",\n\t\t\"preuninstall\": \"alfy-cleanup\"\n\t},\n\t\"dependencies\": {\n\t\t\"alfy\": \"*\"\n\t}\n}\n```\n\n\u003e Tip: Prefix your workflow with `alfred-` to make them easy searchable through npm.\n\nYou can remove [these](https://github.com/samverschueren/alfred-link#infoplist) properties from your `info.plist` file as they are being added automatically at install time.\n\nAfter publishing your workflow to npm, your users can easily install or update the workflow.\n\n```sh\nnpm install --global alfred-unicorn\n```\n\n\u003e Tip: instead of manually updating every workflow yourself, use the [alfred-updater](https://github.com/SamVerschueren/alfred-updater) workflow to do that for you.\n\n## Testing\n\nWorkflows can easily be tested with [alfy-test](https://github.com/SamVerschueren/alfy-test). Here is a small example.\n\n```js\nimport test from 'ava';\nimport alfyTest from 'alfy-test';\n\ntest('main', async t =\u003e {\n\tconst alfy = alfyTest();\n\n\tconst result = await alfy('workflow input');\n\n\tt.deepEqual(result, [\n\t\t{\n\t\t\ttitle: 'foo',\n\t\t\tsubtitle: 'bar'\n\t\t}\n\t]);\n});\n```\n\n## Debugging\n\nWhen developing your workflow it can be useful to be able to debug it when something is not working. This is when the [workflow debugger](https://www.alfredapp.com/help/workflows/advanced/debugger/) comes in handy. You can find it in your workflow view in Alfred. Press the insect icon to open it. It will show you the plain text output of `alfy.output()` and anything you log with `alfy.log()` or `console.error()`:\n\n```js\nimport alfy from 'alfy';\n\nconst unicorn = getUnicorn();\nalfy.log(unicorn);\n\n// You can also use console.error() for debugging\nconsole.error('Debug info:', {data: someData});\n```\n\n## Environment variables\n\nAlfred lets users set [environment variables for a workflow](https://www.alfredapp.com/help/workflows/advanced/variables/) which can then be used by that workflow. This can be useful if you, for example, need the user to specify an API token for a service. You can access the workflow environment variables from [`process.env`](https://nodejs.org/api/process.html#process_process_env). For example `process.env.apiToken`.\n\n## API\n\n### alfy\n\n#### input\n\nType: `string`\n\nInput from Alfred. What the user wrote in the input box.\n\n#### output(list, options?)\n\nReturn output to Alfred.\n\n##### list\n\nType: `object[]`\n\nList of `object` with any of the [supported properties](https://www.alfredapp.com/help/workflows/inputs/script-filter/json/).\n\nExample:\n\n```js\nimport alfy from 'alfy';\n\nalfy.output([\n\t{\n\t\ttitle: 'Unicorn'\n\t},\n\t{\n\t\ttitle: 'Rainbow'\n\t}\n]);\n```\n\n##### options\n\nType: `object`\n\n###### rerunInterval\n\nType: `number` *(seconds)*\\\nValues: `0.1...5.0`\n\nA script can be set to re-run automatically after some interval. The script will only be re-run if the script filter is still active and the user hasn't changed the state of the filter by typing and triggering a re-run. [More info.](https://www.alfredapp.com/help/workflows/inputs/script-filter/json/)\n\nFor example, it could be used to update the progress of a particular task:\n\n```js\nimport alfy from 'alfy';\n\nalfy.output(\n\t[\n\t\t{\n\t\t\ttitle: 'Downloading Unicorns…',\n\t\t\tsubtitle: `${progress}%`,\n\t\t}\n\t],\n\t{\n\t\t// Re-run and update progress every 3 seconds.\n\t\trerunInterval: 3\n\t}\n);\n```\n\n\u003cimg src=\"media/screenshot-output.png\" width=\"694\"\u003e\n\n###### variables\n\nType: `object`\n\nVariables passed out of the script filter and accessible throughout the current session as environment variables. These are session-level variables that persist for the duration of the user action. Individual items can also have their own `variables` which override these when selected.\n\n```js\nimport alfy from 'alfy';\n\nalfy.output(\n\t[\n\t\t{\n\t\t\ttitle: 'Unicorn',\n\t\t\targ: 'unicorn',\n\t\t}\n\t],\n\t{\n\t\tvariables: {animal: 'unicorn'}\n\t}\n);\n```\n\n#### log(value)\n\nLog `value` to the [Alfred workflow debugger](https://www.alfredapp.com/help/workflows/advanced/debugger/).\n\n#### matches(input, list, item?)\n\nReturns a `string[]` of items in `list` that case-insensitively contains `input`.\n\n```js\nimport alfy from 'alfy';\n\nalfy.matches('Corn', ['foo', 'unicorn']);\n//=\u003e ['unicorn']\n```\n\n##### input\n\nType: `string`\n\nText to match against the `list` items.\n\n##### list\n\nType: `string[]`\n\nList to be matched against.\n\n##### item\n\nType: `string | Function`\n\nBy default, it will match against the `list` items.\n\nSpecify a string to match against an object property:\n\n```js\nimport alfy from 'alfy';\n\nconst list = [\n\t{\n\t\ttitle: 'foo'\n\t},\n\t{\n\t\ttitle: 'unicorn'\n\t}\n];\n\nalfy.matches('Unicorn', list, 'title');\n//=\u003e [{title: 'unicorn'}]\n```\n\nOr [nested property](https://github.com/sindresorhus/dot-prop):\n\n```js\nimport alfy from 'alfy';\n\nconst list = [\n\t{\n\t\tname: {\n\t\t\tfirst: 'John',\n\t\t\tlast: 'Doe'\n\t\t}\n\t},\n\t{\n\t\tname: {\n\t\t\tfirst: 'Sindre',\n\t\t\tlast: 'Sorhus'\n\t\t}\n\t}\n];\n\nalfy.matches('sindre', list, 'name.first');\n//=\u003e [{name: {first: 'Sindre', last: 'Sorhus'}}]\n```\n\nSpecify a function to handle the matching yourself. The function receives the list item and input, both lowercased, as arguments, and is expected to return a boolean of whether it matches:\n\n```js\nimport alfy from 'alfy';\n\nconst list = ['foo', 'unicorn'];\n\n// Here we do an exact match.\n// `Foo` matches the item since it's lowercased for you.\nalfy.matches('Foo', list, (item, input) =\u003e item === input);\n//=\u003e ['foo']\n```\n\n#### inputMatches(list, item?)\n\nSame as `matches()`, but with `alfy.input` as `input`.\n\nIf you want to match against multiple items, you must define your own matching function ([as shown here](#item)). Let’s extend the [example from the beginning](#example) to search for a keyword that appears either within the `title` or `body` property or both.\n\n```js\nimport alfy from 'alfy';\n\nconst data = await alfy.fetch('https://jsonplaceholder.typicode.com/posts');\n\nconst items = alfy\n\t.inputMatches(\n\t\tdata,\n\t\t(item, input) =\u003e\n\t\t\titem.title?.toLowerCase().includes(input) ||\n\t\t\titem.body?.toLowerCase().includes(input)\n\t)\n\t.map((element) =\u003e ({\n\t\ttitle: element.title,\n\t\tsubtitle: element.body,\n\t\targ: element.id,\n\t}));\n\nalfy.output(items);\n```\n\n#### error(error)\n\nDisplay an error or error message in Alfred.\n\n**Note:** You don't need to `.catch()` top-level promises. Alfy handles that for you.\n\n##### error\n\nType: `Error | string`\n\nError or error message to be displayed.\n\n\u003cimg src=\"media/screenshot-error.png\" width=\"694\"\u003e\n\n#### fetch(url, options?)\n\nReturns a `Promise` that returns the body of the response.\n\n##### url\n\nType: `string`\n\nURL to fetch.\n\n##### options\n\nType: `object`\n\nAny of the [`got` options](https://github.com/sindresorhus/got/tree/v12.0.3#api) and the below options.\n\n###### json\n\nType: `boolean`\\\nDefault: `true`\n\nParse response body with `JSON.parse` and set `accept` header to `application/json`.\n\n###### maxAge\n\nType: `number`\n\nNumber of milliseconds this request should be cached.\n\n###### resolveBodyOnly\n\nType: `boolean`\\\nDefault: `true`\n\nWhether to resolve with only body or a full response.\n\n```js\nimport alfy from 'alfy';\n\nawait alfy.fetch('https://api.foo.com');\n//=\u003e {foo: 'bar'}\n\nawait alfy.fetch('https://api.foo.com', {\n\tresolveBodyOnly: false \n});\n/*\n{\n\tbody: {\n\t\tfoo: 'bar'\n\t},\n\theaders: {\n\t\t'content-type': 'application/json'\n\t}\n}\n*/\n```\n\n###### transform\n\nType: `Function`\n\nTransform the response body before it gets cached.\n\n```js\nimport alfy from 'alfy';\n\nawait alfy.fetch('https://api.foo.com', {\n\ttransform: body =\u003e {\n\t\tbody.foo = 'bar';\n\t\treturn body;\n\t}\n})\n```\n\nTransform the response.\n\n```js\nimport alfy from 'alfy';\n\nawait alfy.fetch('https://api.foo.com', {\n\tresolveBodyOnly: false,\n\ttransform: response =\u003e {\n\t\tresponse.body.foo = 'bar';\n\t\treturn response;\n\t}\n})\n```\n\nYou can also return a Promise.\n\n```js\nimport alfy from 'alfy';\nimport xml2js from 'xml2js';\nimport pify from 'pify';\n\nconst parseString = pify(xml2js.parseString);\n\nawait alfy.fetch('https://api.foo.com', {\n\ttransform: body =\u003e parseString(body)\n})\n```\n\n#### config\n\nType: `object`\n\nPersist config data.\n\nExports a [`conf` instance](https://github.com/sindresorhus/conf#instance) with the correct config path set.\n\nExample:\n\n```js\nimport alfy from 'alfy';\n\nalfy.config.set('unicorn', '🦄');\n\nalfy.config.get('unicorn');\n//=\u003e '🦄'\n```\n\n#### userConfig\n\nType: `Map`\n\nExports a [Map](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map) with the user workflow configuration. A workflow configuration allows your users to provide configuration information for the workflow. For instance, if you are developing a GitHub workflow, you could let your users provide their own API tokens.\n\nSee [`alfred-config`](https://github.com/SamVerschueren/alfred-config#workflow-configuration) for more details.\n\nExample:\n\n```js\nimport alfy from 'alfy';\n\nalfy.userConfig.get('apiKey');\n//=\u003e '16811cad1b8547478b3e53eae2e0f083'\n```\n\n#### cache\n\nType: `object`\n\nPersist cache data.\n\nExports a modified [`conf` instance](https://github.com/sindresorhus/conf#instance) with the correct cache path set.\n\nExample:\n\n```js\nimport alfy from 'alfy';\n\nalfy.cache.set('unicorn', '🦄');\n\nalfy.cache.get('unicorn');\n//=\u003e '🦄'\n```\n\n##### maxAge\n\nThe `set` method of this instance accepts an optional third argument where you can provide a `maxAge` option. `maxAge` is\nthe number of milliseconds the value is valid in the cache.\n\nExample:\n\n```js\nimport alfy from 'alfy';\nimport delay from 'delay';\n\nalfy.cache.set('foo', 'bar', {maxAge: 5000});\n\nalfy.cache.get('foo');\n//=\u003e 'bar'\n\n// Wait 5 seconds\nawait delay(5000);\n\nalfy.cache.get('foo');\n//=\u003e undefined\n```\n\n#### debug\n\nType: `boolean`\n\nWhether the user currently has the [workflow debugger](https://www.alfredapp.com/help/workflows/advanced/debugger/) open.\n\n#### icon\n\nType: `object`\\\nKeys: `'info' | 'warning' | 'error' | 'alert' | 'like' | 'delete'`\n\nGet various default system icons.\n\nThe most useful ones are included as keys. The rest you can get with `icon.get()`. Go to `/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources` in Finder to see them all.\n\nExample:\n\n```js\nimport alfy from 'alfy';\n\nconsole.log(alfy.icon.error);\n//=\u003e '/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/AlertStopIcon.icns'\n\nconsole.log(alfy.icon.get('Clock'));\n//=\u003e '/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/Clock.icns'\n```\n\n#### meta\n\nType: `object`\n\nExample:\n\n```js\n{\n\tname: 'Emoj',\n\tversion: '0.2.5',\n\tuid: 'user.workflow.B0AC54EC-601C-479A-9428-01F9FD732959',\n\tbundleId: 'com.sindresorhus.emoj'\n}\n```\n\n#### alfred\n\nType: `object`\n\nAlfred metadata.\n\n##### version\n\nExample: `'3.0.2'`\n\nFind out which version the user is currently running. This may be useful if your workflow depends on a particular Alfred version's features.\n\n##### theme\n\nExample: `'alfred.theme.yosemite'`\n\nCurrent theme used.\n\n##### themeBackground\n\nExample: `'rgba(255,255,255,0.98)'`\n\nIf you're creating icons on the fly, this allows you to find out the color of the theme background.\n\n##### themeSelectionBackground\n\nExample: `'rgba(255,255,255,0.98)'`\n\nThe color of the selected result.\n\n##### themeSubtext\n\nExample: `3`\n\nFind out what subtext mode the user has selected in the Appearance preferences.\n\n\u003e Usability note: This is available so developers can tweak the result text based on the user's selected mode, but a workflow's result text should not be bloated unnecessarily based on this, as the main reason users generally hide the subtext is to make Alfred look cleaner.\n\n##### data\n\nExample: `'/Users/sindresorhus/Library/Application Support/Alfred/Workflow Data/com.sindresorhus.npms'`\n\nRecommended location for non-volatile data. Just use `alfy.data` which uses this path.\n\n##### cache\n\nExample: `'/Users/sindresorhus/Library/Caches/com.runningwithcrayons.Alfred/Workflow Data/com.sindresorhus.npms'`\n\nRecommended location for volatile data. Just use `alfy.cache` which uses this path.\n\n##### preferences\n\nExample: `'/Users/sindresorhus/Dropbox/Alfred/Alfred.alfredpreferences'`\n\nThis is the location of the `Alfred.alfredpreferences`. If a user has synced their settings, this will allow you to find out where their settings are regardless of sync state.\n\n##### preferencesLocalHash\n\nExample: `'adbd4f66bc3ae8493832af61a41ee609b20d8705'`\n\nNon-synced local preferences are stored within `Alfred.alfredpreferences` under `…/preferences/local/${preferencesLocalHash}/`.\n\n## Users\n\n*Alfred workflows using Alfy*\n\n- [alfred-emoj](https://github.com/sindresorhus/alfred-emoj) - Find relevant emoji from text\n- [alfred-npms](https://github.com/sindresorhus/alfred-npms) - Search for npm packages with npms.io\n- [alfred-dark-mode](https://github.com/sindresorhus/alfred-dark-mode) - Toggle the system dark mode\n- [alfred-xcode](https://github.com/sindresorhus/alfred-xcode) - Open Xcode projects and workspaces\n- [alfred-lock](https://github.com/sindresorhus/alfred-lock) - Lock your Mac\n- [alfred-fkill](https://github.com/SamVerschueren/alfred-fkill) - Fabulously search and kill processes\n- [alfred-ng](https://github.com/SamVerschueren/alfred-ng) - Search through the Angular documentation on angular.io\n- [alfred-ionic](https://github.com/SamVerschueren/alfred-ionic) - Search through the Ionic documentation\n- [alfred-react-native](https://github.com/ekonstantinidis/alfred-react-native) - Access the React Native documentation\n- [alfred-hl](https://github.com/importre/alfred-hl) - Syntax highlight code in the clipboard\n- [alfred-workflow-docs-elastic](https://github.com/spinscale/alfred-workflow-elastic-docs) - Search the Elastic.co documentation\n- [alfredinary](https://github.com/urre/alfredinary) - Capture screenshots and upload to Cloudinary\n- [alfred-keycode](https://github.com/radibit/alfred-keycode) - Get JavaScript keycodes\n- [alfred-vue](https://github.com/radibit/alfred-vue) - Search the Vue.js API docs\n- [alfred-meteor-docs](https://github.com/wolasss/alfred-meteor-docs) - Search the Meteor docs\n- [alfred-meteor-packages](https://github.com/sasikanth513/alfred-meteor-packages) - Meteor package search\n- [alfred-climbing-grades-converter](https://github.com/wolasss/alfred-climbing-grades-converter) - Convert between climbing grading systems\n- [alfred-hotel](https://github.com/exah/alfred-hotel) - Quickly start, stop and open [Hotel](https://github.com/typicode/hotel) apps\n- [alfred-coolors](https://github.com/radibit/alfred-coolors) - Find relevant color names\n- [alfred-postico-favorites-workflow](https://github.com/payers1/alfred-postico-favorites-workflow) - Open postico favorites\n- [alfred-messages](https://github.com/briangonzalez/alfred-messages) - Message your contacts through iMessage\n- [alfred-bitbucket](https://github.com/nicklayb/alfred-bitbucket) - List you and your teams public and private Bitbucket repositories\n- [alfred-asana](https://github.com/adriantoine/alfred-asana) - Search your Asana tasks\n- [alfred-cacher](https://github.com/CacherApp/alfred-cacher) - Find a code snippet from [Cacher](https://www.cacher.io) and copy it to the clipboard\n- [alfred-loremipsum](https://github.com/AntonNiklasson/alfred-loremipsum) - Generate placeholder text\n- [alfred-packagist](https://github.com/vinkla/alfred-packagist) - Search for PHP packages with Packagist\n- [alfred-vpn](https://github.com/stve/alfred-vpn) - Connect/disconnect from VPNs\n- [alfred-yandex-translate](https://github.com/mkalygin/alfred-yandex-translate) - Translate words and text with Yandex Translate\n- [alfred-now](https://github.com/lucaperret/alfred-now) - Use [Now](https://zeit.co/now) commands within Alfred to access deployments and aliases\n- [alfred-chuck-norris-jokes](https://github.com/jeppestaerk/alfred-chuck-norris-jokes) - Get Chuck Norris jokes\n- [alfred-show-network-info](https://github.com/jeppestaerk/alfred-show-network-info) - See network info and discover local devices\n- [alfred-currency-conversion](https://github.com/jeppestaerk/alfred-currency-conversion) - See foreign exchange rates and currency conversion\n- [alfred-polyglot](https://github.com/nikersify/alfred-polyglot) - Translate text with Google Translate\n- [alfred-stock-price](https://github.com/Wei-Xia/alfred-stock-price-workflow) - Show real time stock price in US market\n- [alfred-jira](https://github.com/colinf/alfred-jira) - Convert clipboard text between Markdown and Jira markup\n- [alfred-network-location-switch](https://github.com/abdul/alfred-network-location-switch) - Switch macOS network location\n- [alfred-cool](https://github.com/nguyenvanduocit/alfred-cool) - Find cool words\n- [alfred-google-books](https://github.com/Dameck/alfred-google-books) - Search for Google Books\n- [alfred-ip](https://github.com/calpa/alfy-ip) - Find your public IP\n- [alfred-figma](https://github.com/jonrohan/alfred-figma) – Quick links and search Figma teams, projects and files\n- [alfred-flutter-docs](https://github.com/Sh1d0w/alfred-flutter-docs) – Quickly search and preview Flutter docs\n- [alfred-title](https://github.com/Kikobeats/alfred-title) – Capitalize your titles\n- [alfred-trello](https://github.com/mblode/alfred-trello) - Search your boards, quickly add cards, and view list of cards for Trello\n- [alfred-npm-versions](https://github.com/mrmartineau/alfred-npm-versions) - Lookup the latest 15 versions for an npm package\n- [alfred-github-trending](https://github.com/mikqi/alfred-github-trending) - Search trending repositories on GitHub\n- [alfred-elm](https://github.com/nicklayb/alfred-elm) - Browse Elm packages documentation\n- [alfred-imagemin](https://github.com/kawamataryo/alfred-imagemin) - Minify images with Imagemin\n- [alfred-evernote-workflow](https://github.com/jopemachine/alfred-evernote-workflow) - Search Evernote with keywords and tags\n- [alfred-deno-doc](https://github.com/jopemachine/alfred-deno-doc) - Access the Deno documentation\n- [alfred-fly](https://github.com/apollorion/fly) - Search Google Chrome bookmarks\n- [alfred-simple-email-fetcher](https://github.com/jopemachine/alfred-simple-email-fetcher) - Show unseen emails from multiple accounts using IMAP\n- [alfred-chrome-workflow](https://github.com/jopemachine/alfred-chrome-workflow) - Search Chrome's bookmarks, history and download logs\n- [alfred-code](https://github.com/shaodahong/alfred-code) - Quickly open a file in Visual Studio Code\n- [alfred-amphetamine](https://github.com/demartini/alfred-amphetamine) - Start and end sessions quickly in the Amphetamine app\n- [alfred-ids](https://github.com/rizowski/alfred-ids) - Generate various types of IDs.\n- [alfred-awesome-stars](https://github.com/jopemachine/alfred-awesome-stars) - Search starred GitHub repos through awesome-stars.\n- [alfred-pwgen](https://github.com/olssonm/alfred-password-generator) - Generate random and secure passwords.\n- [alfred-bear](https://github.com/jmeischner/alfred-bear) - Use dynamic templates with the Bear app.\n- [alfred-color-converter](https://github.com/toFrankie/alfred-color-converter) - Convert colors between RGB and Hex.\n\n## Related\n\n- [alfred-simple](https://github.com/sindresorhus/alfred-simple) - Simple theme for Alfred *(Used in the screenshots)*\n- [alfred-updater](https://github.com/SamVerschueren/alfred-updater) - Workflow updater\n- [alfred-notifier](https://github.com/SamVerschueren/alfred-notifier) - Update notifications for your workflow\n- [generator-alfred](https://github.com/samverschueren/generator-alfred) - Scaffold out an Alfred workflow\n\n## Maintainers\n\n- [Sindre Sorhus](https://github.com/sindresorhus)\n- [Sam Verschueren](https://github.com/SamVerschueren)\n- [@LitoMore](https://github.com/LitoMore)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsindresorhus%2Falfy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsindresorhus%2Falfy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsindresorhus%2Falfy/lists"}