ani-gui Extensions

WASM extensions for ani-gui

5 anime providers and 3 progress trackers for ani-gui, the GUI anime streaming client.

Add to ani-gui Source code Write your own

Add this repository to ani-gui

https://anigui-ext.codingotaku.com/repository.json

There is no one-click copy without JavaScript โ€” select the URL above and copy it with your browser.

  1. Open ani-gui and go to ๐Ÿ”Œ Extensions in the sidebar.
  2. Switch to the Repos tab.
  3. Paste the URL above into the Repository URL field and press Add.
  4. Go to the Providers and Trackers tabs and press Install on what you want.
  5. Tick Enabled on the installed card. Trackers may also need Connect and sign-in before progress can sync.

Good to know: configured repositories are re-fetched on every app start, and the Refresh button on the Repos tab re-fetches on demand. Installed extensions show Update whenever a newer version is published here.

Extensions

8 enabled: 5 providers and 3 trackers. Every one is a Rust crate compiled to wasm32-unknown-unknown, and the SHA-256 below is the checksum the app verifies on download.

Providers

Anime sources: search, details, episodes, and stream or torrent links.

Trackers

Progress sync: list, update, and clear your list on a remote account.

What this is

ani-sdk is the WebAssembly extension SDK for ani-gui, a GUI anime streaming client.

There are two kinds. Providers are content sources: search, anime details, episode lists, stream and torrent links. Trackers are progress-sync services: list, update, and delete progress on a remote account. This repository currently publishes 8 extensions: 5 providers and 3 trackers.

Extensions never touch the network or the filesystem directly. Every request goes through the host via the SDK (HttpClient, HTML/regex parsing, crypto, logging), so an extension is a pure function of the JSON the host hands it.

Good to know

  • These are the reference examples. The published extensions double as the SDK's worked examples โ€” each one is a small, readable crate under examples/. Use them as starting points, and expect to adjust endpoints, selectors, and rate limits for your own sites.
  • Nothing is bundled. The app ships with no providers; it installs them from a repository manifest like this one, and verifies each .wasm against the SHA-256 checksum published in repository.json.
  • Ids are permanent. The host stores your library, favourites, and history against the extension id, so a published id is never renamed.
  • WASM is sandboxed. Extensions get no ambient authority: no sockets, no clock, no files, and a small (~8 MiB) linear memory.

Write your own extension

The SDK is a single crate with two dependencies. Add it to a cdylib, implement WasmProvider or WasmTracker, and export yourself with the export_provider! / export_tracker! macros.

cargo add ani-sdk --git https://codeberg.org/codingotaku/ani-sdk
  1. Copy the closest sample โ€” examples/providers/ or examples/trackers/ โ€” and rename the crate.
  2. Describe it in extension.json (id, name, kind, version, description, author, capabilities). That file is the single source of truth: it is embedded at compile time with extension_metadata! and served from info().
  3. Add the crate to the workspace members list. Set "enabled": false in its extension.json to keep it out of the published repository and this page while still building it locally.
  4. Run make build and add <BASE_URL>/repository.json to the Repos tab in ani-gui to try it. make serve hosts the result on localhost:8080.

Full walkthrough, API reference, ABI notes, and troubleshooting: DEVELOPMENT.md ยท README.md ยท examples/ ยท ani-gui

Repository manifest

What the app fetches, checksums included.

repository.json โ€” the manifest ani-gui actually reads
{
  "name": "ani-gui Extensions",
  "url": "https://anigui-ext.codingotaku.com/repository.json",
  "extensions": [
    {
      "id": "anidap",
      "name": "Anidap",
      "version": "0.1.0",
      "kind": "provider",
      "description": "Anidap provider - demonstrates GraphQL, retry, cookies",
      "capabilities": [
        "search",
        "browse",
        "streaming"
      ],
      "download_url": "https://anigui-ext.codingotaku.com/wasm/anidap.wasm",
      "checksum": "sha256:e36b55959cd61bc2360a260ab0b474beed4994749e850b4cf1edf0297a1f075b",
      "author": "ani-gui",
      "homepage": null
    },
    {
      "id": "anilist",
      "name": "AniList",
      "version": "0.1.0",
      "kind": "tracker",
      "description": "AniList tracker - demonstrates OAuth2, GraphQL, bearer token auth",
      "capabilities": [
        "track_progress"
      ],
      "download_url": "https://anigui-ext.codingotaku.com/wasm/anilist.wasm",
      "checksum": "sha256:374cb27ec5ce7b5f5a43985d17b26212606b097971bdb5a831bd7f558c162ca6",
      "author": "ani-gui",
      "homepage": null
    },
    {
      "id": "animehub",
      "name": "AnimeHub",
      "version": "0.1.0",
      "kind": "provider",
      "description": "AnimeHub provider - demonstrates HTML scraping, regex, HLS",
      "capabilities": [
        "search",
        "browse",
        "streaming"
      ],
      "download_url": "https://anigui-ext.codingotaku.com/wasm/animehub.wasm",
      "checksum": "sha256:3617113dd22813ebb9d8b48dd199c2dfbf0bb701d2bd26f7c8d660c776b05e2a",
      "author": "ani-gui",
      "homepage": null
    },
    {
      "id": "kitsu",
      "name": "Kitsu",
      "version": "0.1.0",
      "kind": "tracker",
      "description": "Kitsu tracker - demonstrates JSON:API, OAuth2, token refresh",
      "capabilities": [
        "track_progress"
      ],
      "download_url": "https://anigui-ext.codingotaku.com/wasm/kitsu.wasm",
      "checksum": "sha256:13e058cd3a2c1b25ccf535606c0879a9c0b7511c3c103e6b7350c9d5ccfb7b02",
      "author": "ani-gui",
      "homepage": null
    },
    {
      "id": "m3u8demo",
      "name": "M3U8 Demo",
      "version": "0.1.0",
      "kind": "provider",
      "description": "Demo provider - exercises HttpClient, m3u8 parsing and per-link headers against a stable public HLS test stream",
      "capabilities": [
        "search",
        "streaming"
      ],
      "download_url": "https://anigui-ext.codingotaku.com/wasm/m3u8demo.wasm",
      "checksum": "sha256:2fe540b4fac8aad4ff3f1494b5081edfcc8aaa6571295b30c009539d36419010",
      "author": "ani-gui",
      "homepage": null
    },
    {
      "id": "myanimelist",
      "name": "MyAnimeList",
      "version": "0.1.0",
      "kind": "tracker",
      "description": "MyAnimeList tracker stub - demonstrates minimal skeleton",
      "capabilities": [
        "track_progress"
      ],
      "download_url": "https://anigui-ext.codingotaku.com/wasm/myanimelist.wasm",
      "checksum": "sha256:aa049cb977f4379d56f905a8f6c409eff6a99261fcd5e53d854b6a5aad363a6c",
      "author": "ani-gui",
      "homepage": null
    },
    {
      "id": "nyaa",
      "name": "Nyaa",
      "version": "0.1.0",
      "kind": "provider",
      "description": "Nyaa provider - demonstrates RSS/XML parsing, torrent",
      "capabilities": [
        "search",
        "torrent"
      ],
      "download_url": "https://anigui-ext.codingotaku.com/wasm/nyaa.wasm",
      "checksum": "sha256:1cc52226423711981a4da282ea85f49f4503a9ff6c9438da6ae2c5256f6db9cc",
      "author": "ani-gui",
      "homepage": null
    },
    {
      "id": "shana",
      "name": "Shana",
      "version": "0.1.0",
      "kind": "provider",
      "description": "Shana provider - demonstrates HTML scraping, pagination",
      "capabilities": [
        "search",
        "torrent"
      ],
      "download_url": "https://anigui-ext.codingotaku.com/wasm/shana.wasm",
      "checksum": "sha256:24e778986f20b5c7b6c55a1f7903fb032048c8f3ece366736f594af159c0a53c",
      "author": "ani-gui",
      "homepage": null
    }
  ]
}