# AnimeGarden's npm badge says `animegarden` and its install line says `@animegarden/client`

> AnimeGarden is a TypeScript monorepo behind a third-party mirror and aggregation front end for anime BT resources, with a broadcast schedule, a searchable resource index, RSS feeds, an open API, an MCP endpoint, an npm client and an embeddable iframe. The stack is unusually current and the release tooling is unusually tidy, with one exception worth reading before you run it. Two documentation links point at a package you are not supposed to install, and five months of commits sit past the last version bump.

**yjl9903/AnimeGarden** — 動漫花園 镜像站 | 动画 BT 资源聚合站 | 动画 BT 资源开放接口

- Repository: https://github.com/yjl9903/AnimeGarden
- Website: https://animes.garden
- Stars: 1,330 · Forks: 43
- Language: TypeScript
- License: AGPL-3.0
- Published: 2026-09-10 · Updated: 2026-09-10 · Language: en
- Canonical page: https://hysenlabs.com/projects/yjl9903-animegarden

## The npm badge and the client link both name `animegarden`, and the install says `@animegarden/client`

Two places in the README point at the unscoped npm package:

```bash
npm i @animegarden/client
```

is what the install section tells you to run, and the surrounding prose names the package `@animegarden/client`. But the badge row at the top of the file resolves to `npmjs.com/package/animegarden`, and the in-text link on the client package name resolves to the same unscoped URL. So the badge and the hyperlink agree with each other and disagree with the command.

It is a small thing, and it is the kind of small thing that costs someone an afternoon, because the package name is right there in the sentence with the link on it.

The client's own surface is thin. It exports `fetchResources`, called with no arguments for the first page or with a filter object, and `count: -1` is how you ask for everything that matches. It needs a global `Fetch`, and where the runtime lacks one the README points at `undici` or `ofetch` as a polyfill.

The full filter surface lives in `FilterOptions`, and this link is where the documentation problem starts.

## `bumpp` is the only dependency pinned to `latest`, and it is the one that pushes to git

The release script is one line:

```bash
bumpp package.json packages/*/package.json apps/*/package.json --commit --push --tag
```

One command walks the root manifest and both workspace globs, bumps the version, then commits, pushes and creates the tag. The `--push` and `--tag` flags are what make it a release command rather than a version command.

Now look at how the development dependencies are pinned. `@cloudflare/workers-types` at `5.20260707.1`, `@flydotio/dockerfile` at `0.7.10`, `@types/node` at `24.13.2`, `drizzle-kit` at `0.31.10`, `prettier` at `3.9.4`, `tsx` at `4.23.0`, `turbo` at `2.10.4`, `typescript` at `6.0.3`, `vite` at `8.2.2`, `vitest` at `4.1.10`, `wrangler` at `4.107.0`. Exact pins, no carets, across seventeen entries.

One is not: `bumpp` is `"latest"`. So the tool that rewrites your version numbers, writes the commit and pushes the tag is the single dependency in the list that floats to whatever is newest on install day. Everyone else is reproducible; the release path is not.

The safety net is elsewhere and is good: `preversion` runs `turbo run test:ci`, so the CI suite runs before the version step happens.

## The MCP endpoint is configured with a URL and nothing else

The MCP server lives at `https://api.animes.garden/mcp`, and the entire client configuration is:

```json
{
  "mcpServers": {
    "animegarden": {
      "url": "https://api.animes.garden/mcp"
    }
  }
}
```

One key, one value. No API key, no bearer token, no header, no environment variable. Whatever the endpoint exposes is exposed to anyone who has the URL, and there is no per-client identity in the configuration for an operator to key or rate-limit against.

The open API behaves the same way. The documented example is:

```bash
curl "https://api.animes.garden/resources?page=1&pageSize=10"
```

No credential in it. And the npm client takes an API key for your AI provider in other tools, not here, because this service has none.

For a public index of broadcast metadata that is a reasonable design, and it is the reason the four consumer surfaces are this cheap to adopt. It is also the reason to think about caching and request etiquette before pointing a loop at it, since `count: -1` will happily ask for every matching record in one call.

## Five months of commits sit past the last version, and the version number has not moved

The root manifest says `0.5.4`. The tags say v0.5.4 from 2026-05-04, before it v0.5.3 from 2026-03-26 and before that v0.5.2 from 2025-05-26.

The default branch was last pushed on 2026-10-02. So the tree has been moving for five months while the manifest still reports the May number and the latest release is still the May tag.

The cadence behind that is worth noting too. Between v0.5.2 and v0.5.3 there is a ten-month gap, then two releases three weeks apart, then five months of nothing. This is the pattern of a project whose releases follow the availability of something upstream rather than a schedule, which is common for a mirror.

The practical consequence is that `npm i @animegarden/client` and the repository you are reading can be different amounts of code. The manifest is a private monorepo root at version 0.5.4, so the version that reaches the registry comes from the release process, not from anything on `main`.

## One documentation link is pinned to a commit hash while every other link follows the branch

The link that explains the full filter surface points at a specific commit:

`packages/client/src/types.ts#L220` under commit `32bc3843084367338f41be7d4af47c80b639f828`.

Every other source link in the same section uses `/main/`, including the link to the `examples/` directory two sentences later. So one reference is frozen at a point in history and its neighbour tracks the branch, which is a reasonable choice for a type definition and an odd one to read without noticing.

The examples directory is more interesting than that, because it is where the API surface is actually shown. It holds `api.http` and `local.http`, which are REST Client files, so one of them talks to the live service and the other to a local instance. Alongside them sit `fetch.ts`, `fetch.py`, `search.ts` and `embed.html`, so the same call is demonstrated in TypeScript, in Python and as an embed.

The site generates its own client code too: the resource list page will hand you cURL, JavaScript or Python for any query you have built in the UI, which is a nicer way to learn a filter syntax than a parameter table.

## One repo, three task runners and two toolchain version files

The root carries `pnpm-workspace.yaml` and `pnpm-lock.yaml`, `turbo.json`, and a `tea.yaml`. pnpm resolves the workspace, turbo drives the per-package build, test and typecheck pipelines, and a third configuration file manages services.

The scripts show the split clearly. `build` is `turbo run build`, `dev` is `turbo run dev --parallel`, `format` is `turbo run format --parallel`, and the targeted variants filter to a single package with a trailing dot spread, `--filter @animegarden/cli...`. The dev and start pairs are also mirrored properly: `dev:server` runs `tsx apps/server/src/cli.ts start --port=8080` while `start:server` runs `node apps/server/cli.mjs start`, so development works against sources and production runs against built files.

Toolchain versions are pinned twice, in `.node-version` and in `mise.toml`, which are two different tools asserting the same thing. The manifest requires `>=v24.0.0`, note the leading `v` inside the semver range, which is tolerated but not the usual spelling.

Two more root entries earn their place. `patches/` means dependency patches are maintained in the repository rather than applied by hand, and `docker-compose.dev.yml` is the local stack. The dev server runs on port 8080, a number that appears in `package.json` and nowhere in the user-facing documentation.

## The backend is a Worker with Drizzle over SQLite, and the web app is a PWA

The dependency list names the deployment target without saying so in prose. `wrangler` at `4.107.0` and `@cloudflare/workers-types` at `5.20260707.1` put the runtime on Cloudflare Workers. `drizzle-kit` at `0.31.10` with `@types/better-sqlite3` at `7.6.13` puts the storage behind Drizzle on SQLite.

Two more entries describe the two development environments. `@vite-pwa/assets-generator` produces the service worker and icon set, so the site installs as a progressive web app. `@flydotio/dockerfile` generates a Dockerfile for local emulation of the Worker runtime, which is how you develop against the real runtime shape rather than a stub.

The web tooling is current to a degree that is worth noticing: Vite `8.2.2`, Vitest `4.1.10`, TypeScript `6.0.3`, turbo `2.10.4`, with `pnpm@12.3.4` as the declared package manager. `@total-typescript/ts-reset` is in the list too, which changes the meaning of some built-in types across the whole codebase rather than being a library you call.

For local work the repo also ships an agent skill and an `examples/local.http` file, and a `.example.env` rather than a `.env`, so nothing secret needs to exist in the tree.

## Conclusion

AnimeGarden is a good reference implementation if you want to see a media index built as a pnpm and turbo monorepo, deployed as a Cloudflare Worker with Drizzle over SQLite, and published to users through four different surfaces at once. Three things to check first. The package you want is the scoped `@animegarden/client`, not the unscoped `animegarden` that the badge and the in-text link both point at, so read the install line rather than the badge. The npm client, the open API and the MCP endpoint are all reachable without a key, which is deliberate and convenient, and also means nothing identifies a caller. And the release script commits, pushes and tags in one command using the single devDependency that is not version-pinned, so decide whether that is acceptable before you fork and release.

## FAQ

### How do I access Anime Garden data programmatically?

The open API needs no credential. `curl "https://api.animes.garden/resources?page=1&pageSize=10"` returns a page of resources, interactive Open API documentation lives at animes.garden/docs/api, and the repository's `examples/api.http` file holds more request cases. For JavaScript and TypeScript the npm package `@animegarden/client` wraps the same calls behind `fetchResources`, and the resource list page will generate cURL, JavaScript or Python code for any query.

### How do I install the AnimeGarden skill for my coding agent?

Use the Vercel skills CLI: `npx skills add https://github.com/yjl9903/AnimeGarden --skill animegarden`. The skill is for searching Anime Garden resources, and the repository ships it under a `skills/` directory alongside `.agents/` and `.codex/` configuration.

### Does Anime Garden have an MCP server?

Yes, at `https://api.animes.garden/mcp`. The whole client configuration is a single `url` key inside `mcpServers`, with no API key, token or header, so the endpoint is reachable by anyone holding the address.

### How do I embed Anime Garden content in my own site?

Copy the iframe code from the resource search page. The pattern is an iframe pointing at `//animes.garden/iframe?subject=...` with width 100% and height 600. The src is protocol-relative, so the embed follows whatever protocol the host page is served over.

### What licence is Anime Garden released under?

AGPL-3.0, copyright 2023 XLor. The repository ships a LICENSE file alongside two READMEs, Chinese and English, and credits the upstream index it mirrors along with several bangumi data sources.

## Sources

- [License: AGPL-3.0](https://github.com/yjl9903/AnimeGarden/blob/main/LICENSE)
- [Project website](https://animes.garden)
- [README](https://github.com/yjl9903/AnimeGarden/blob/main/README.md)
- [Releases](https://github.com/yjl9903/AnimeGarden/releases)
- [yjl9903/AnimeGarden on GitHub](https://github.com/yjl9903/AnimeGarden)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/yjl9903-animegarden
