Top AI Repos — open-source AI, indexed and scored
Top AI Repos tracks AI repositories on GitHub and answers two different questions about each one: is it moving right now, and would you bet a product on it.
Top AI Repos tracks AI repositories on GitHub and answers two different questions about each one: is it moving right now, and would you bet a product on it.
Create Alfred workflows with ease
| Date | Stars |
|---|---|
| 2026-07-24 | 2654 |
| 2026-07-25 | 2654 |
| 2026-07-28 | 2654 |
| 2026-07-30 | 2653 |
| 2026-08-06 | 2652 |
Today
-1 stars today
This week
-1 stars this week
This month
— stars this month
Momentum
0.0
growth rate 0.00%/day
# 
> Create [Alfred workflows](https://www.alfredapp.com/workflows/) with ease
## Highlights
- Easy input↔output.
- Config and [cache](#caching) handling built-in.
- Fetching remote files with optional caching.
- Publish your workflow to npm.
- Automatic [update notifications](#update-notifications).
- Easily [testable workflows](#testing).
- [Finds the `node` binary.](run-node.sh)
- Support for top-level `await`.
- Presents uncaught exceptions and unhandled Promise rejections to the user.\
*No need to manually `.catch()` top-level promises.*
## Prerequisites
You 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.
## Install
```sh
npm install alfy
```
## Usage
**IMPORTANT:** Your script will be run as [ESM](https://nodejs.org/api/esm.html).
1. Create a new blank Alfred workflow.
2. Add a `Script Filter` (right-click the canvas → `Inputs` → `Script Filter`), set `Language` to `/bin/bash`, and add the following script:
```
./node_modules/.bin/run-node index.js "$1"
```
*We can't call `node` directly as GUI apps on macOS doesn't inherit the $PATH.*
> 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.
3. Set the `Keyword` by which you want to invoke your workflow.
4. Go to your new workflow directory (right-click on the workflow in the sidebar → `Open in Finder`).
5. Initialize a repo with `npm init`.
6. Add `"type": "module"` to package.json.
7. Install Alfy with `npm install alfy`.
8. In the workflow directory, create a `index.js` file, import `alfy`, and do your thing.
## Example
Here we fetch some JSON from a placeholder API and present matching items to the user:
```js
import alfy from 'alfy';
const data = await alfy.fetch('https://jsonplaceholder.typicode.com/posts');
const items = alfy
.inputMatches(data, 'title')
.map(element => ({
title: element.title,
subtitle: element.body,
arg: element.id
}));
alfy.output(items);
```
<img src="media/screenshot.png" width="694">
###### More
Some 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).
## Update notifications
Alfy uses [alfred-notifier](https://github.com/SamVerschueren/alfred-notifier) in the background to show a notification when an update for your workflow is available.
<img src="media/screenshot-update.png" width="694">
## Caching
Alfy offers the possibility of caching data, either with the [fetch](#fetchurl-options) or directly through the [cache](#cache) object.
An 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.
## Publish to npm
By 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.
```json
{
"name": "alfred-unicorn",
"version": "1.0.0",
"description": "My awesome unicorn workflow",
"author": {
"name": "Sindre Sorhus",
"email": "[email protected]",
"url": "https://sindresorhus.com"
},
"scripts": {
"postinstall": "alfy-init",
"preuninstall": "alfy-cleanup"
},
"dependencies": {
"alfy": "*"
}
}
```
> Tip: Prefix your workflow with `alfred-` to make them easy searchable through npm.
You can remove [these](https://github.com/samverschueren/alfred-link#infoplist) properties from your `info.plist` file as they are being added autoExcerpt of 23,067 characters
Read on GitHubSindre Sorhus
74
Sam Verschueren · @stackblitz
25
9
3
3
Vincent Klaiber · @doubledip · Sweden
3
Nicolas Boisvert · @scoremedia & @scorebet · Canada
2
2
1
Anton Niklasson · Sweden
1
1
1
1
1
1
1
1
1
1
Jacob Hilker · HubSpot · United States
1
Would you bet a product on this? Bounded 0–100 and slow moving.
matched fp:5419bfe08a32305f, topic:workflow