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.
Replace port numbers with stable, named local URLs. For humans and agents.
| Date | Stars |
|---|---|
| 2026-07-31 | 10282 |
| 2026-08-01 | 10302 |
| 2026-08-06 | 10302 |
Today
— stars today
This week
— stars this week
This month
— stars this month
Momentum
35.0
growth rate 0.00%/day
# portless
Replace port numbers with stable, named .localhost URLs for local development. For humans and agents.
```diff
- "dev": "next dev" # http://localhost:3000
+ "dev": "portless run next dev" # https://myapp.localhost
```
## Install
**Global (recommended):**
```bash
npm install -g portless
```
**Or as a project dev dependency:**
```bash
npm install -D portless
```
> portless is pre-1.0. When installed per-project, different contributors may run different versions. The state directory format may change between releases, which can require re-running `portless trust`.
## Run your app
```bash
portless myapp next dev
# -> https://myapp.localhost
```
HTTPS with HTTP/2 is enabled by default. On first run, portless generates a local CA, trusts it, and binds port 443 (auto-elevates with sudo on macOS/Linux). Use `--no-tls` for plain HTTP.
The proxy auto-starts when you run an app. A random port (4000-4999) is assigned via the `PORT` environment variable. Most frameworks (Next.js, Express, Nuxt, etc.) respect this automatically. For frameworks that ignore `PORT` (Vite, VitePlus, Astro, React Router, Angular, Expo, React Native), portless auto-injects the right `--port` flag and, when needed, a matching `--host` flag.
When auto-starting, portless reuses the configuration (port, TLS, TLDs) from the most recent proxy run, so a restart or reboot does not silently revert to defaults. Explicit env vars (`PORTLESS_PORT`, `PORTLESS_HTTPS`, etc.) always take priority.
Portless stores per-user state in `~/.portless`. When the proxy runs under sudo, it resolves this path from the invoking user's home so the proxy and unprivileged app processes share the same route registrations.
In non-interactive environments (no TTY, or `CI=1`), portless exits with a descriptive error instead of prompting, so task runners like turborepo and CI scripts fail early with a clear message.
## Configuration
Bare `portless` works out of the box. It runs the `"dev"` script from `package.json` through the proxy, inferring the app name from the package name, git root, or directory:
```bash
portless # -> runs "dev" script, https://<project>.localhost
```
Use an optional `portless.json` to override defaults:
```json
{ "name": "myapp" }
```
```bash
portless # -> runs "dev" script, https://myapp.localhost
```
The script defaults to `"dev"`. The name is inferred from `package.json` if not set in config.
### Monorepo
One `portless.json` at the repo root covers all workspace packages. Portless discovers packages from `pnpm-workspace.yaml`, or the `"workspaces"` field in `package.json` (npm, yarn, bun):
```json
{
"apps": {
"apps/web": { "name": "myapp" },
"apps/api": { "name": "api.myapp" }
}
}
```
```bash
portless # from repo root: starts all workspace packages with a "dev" script
cd apps/web && portless # start just one package
```
The `apps` map is optional and only needed for name overrides. Packages not listed still auto-discover with names inferred from their `package.json`.
Without an `apps` map, hostnames follow the `<package>.<project>.localhost` convention. The project name comes from the most common npm scope across workspace packages (e.g. `@myorg/web` and `@myorg/api` produce `myorg`), falling back to the workspace root directory name. If a package's short name matches the project name, it gets the bare `<project>.localhost` without duplication.
### Config fields
| Field | Type | Default | Description |
| --------- | ------- | -------- | --------------------------------------------------------- |
| `name` | string | inferred | Base app name. Worktree prefix still applies. |
| `script` | string | `"dev"` | Name of a `package.json` script to run. |
| `appPort` | number | auto | Fixed port for the child process. |
| `proxy` | boolean | auto | Whether to rouExcerpt of 24,982 characters
Read on GitHubChris Tate · Vercel · United States
123
Railly Hugo · Vercel · Argentina
7
Tom Dale · United States
2
Elliot Liu · Australia
2
2
Ben Sabic · @Vercel, @Flash-Brew-Digital, @224-Industries · Australia
1
1
DICKY IBROHIM · Indonesia
1
1
1
1
Patrick Lenz · top.media GmbH · Germany
1
1
1
Tito · @KillzoneGaming · New Zealand
1
1
1
1
Chris Arderne · United Kingdom
1
Anshuman Bhardwaj · @vercel · India
1
Would you bet a product on this? Bounded 0–100 and slow moving.
Not classified yet. Classification runs as part of npm run ingest.