open-index/open-npm huggingface dataset:
npm package: @firstform/wii-channel-renderer
Description: Standalone Wii channel banner/icon parser and canvas renderer used by WeWAD
Latest version: 0.2.6

# @firstform/wii-channel-renderer

Standalone Wii channel rendering engine extracted from WeWAD.

It parses `.wad` / `.arc` assets and renders Wii banner/icon animations to Canvas 2D, including BRLYT/BRLAN/TPL support and animation playback.

## Install

```bash
npm install @firstform/wii-channel-renderer
```

## What you get

- `processWAD(buffer, logger?)`: Parse a WAD and extract renderable banner/icon data.
- `processArchive(buffer, logger?)`: Parse a raw U8/ARC archive.
- `processZipBundle(buffer, logger?)`: Parse a ZIP of renderer resources or ARC files.
- `BannerRenderer`: Draw + animate parsed layouts on canvas.
- `parse*` utilities (`parseWAD`, `parseU8`, `parseBRLYT`, `parseBRLAN`, `parseTPL`, ...).

## Basic usage

```js
import { processWAD, BannerRenderer } from "@firstform/wii-channel-renderer";

const wadBytes = await file.arrayBuffer();
const parsed = await processWAD(wadBytes);

const banner = parsed.results.banner;
const icon = parsed.results.icon;

if (banner) {
  const canvas = document.getElementById("banner");
  const layout = banner.renderLayout;
  const startAnim = banner.animStart ?? null;
  const loopAnim = banner.animLoop ?? banner.anim;

  canvas.width = layout.width;
  canvas.height = layout.height;

  const bannerRenderer = new BannerRenderer(canvas, layout, loopAnim, banner.tplImages, {
    startAnim,
    loopAnim,
    fonts: banner.fonts,
    displayAspect: 4 / 3,
    playbackMode: "loop",
    tevQuality: "fast",
  });

  bannerRenderer.play();
}

if (icon) {
  const canvas = document.getElementById("icon");
  const layout = icon.renderLayout;
  const startAnim = icon.animStart ?? null;
  const loopAnim = icon.animLoop ?? icon.anim;

  canvas.width = layout.width;
  canvas.height = layout.height;

  const iconRenderer = new BannerRenderer(canvas, layout, loopAnim, icon.tplImages, {
    startAnim,
    loopAnim,
    fonts: icon.fonts,
    playbackMode: "loop",
    tevQuality: "fast",
  });

  iconRenderer.play();
}
```

## Common renderer options

- `startAnim`, `loopAnim`: Separate start + loop BRLAN support.
- `displayAspect`: `4 / 3`, `16 / 9`, or ratio string.
- `renderState`: Force `RSO*` state selection.
- `titleLocale`: Force title locale.
- `paneStateSelections`: Override pane-state groups.
- `playbackMode`: `"loop"` or `"hold"`.
- `tevQuality`: `"fast"` or `"accurate"`.

## Bundle helpers

Optional helpers are exported as subpaths:

```js
import { loadRendererBundle } from "@firstform/wii-channel-renderer/bundle-loader";
import { exportBundle } from "@firstform/wii-channel-renderer/export-bundle";
```

These are useful when you want to serialize parsed data into a reusable ZIP and load it later.

## Runtime requirements

Browser APIs used by the engine include:

- `CanvasRenderingContext2D`
- `ImageData`
- `OffscreenCanvas` (for export helpers)
- `createImageBitmap` (bundle loader)

If you need Node-only rendering, provide equivalent polyfills/canvas bindings.
npm package: @firsthandapi/mcp-server
Description: MCP server for FirstHandAPI — human-in-the-loop crowdsourced data collection. Claude Code + Cursor integration for collecting photos, video, audio, screen recordings from real humans with AI quality scoring.
Latest version: 0.1.0

# @firsthandapi/mcp-server — FirstHandAPI MCP Server

Official [MCP](https://modelcontextprotocol.io) server for [FirstHandAPI](https://firsthandapi.com) — human-in-the-loop (HITL) crowdsourced data collection. Enables Claude Code, Cursor, and other AI agents to collect photos, audio, video, and screen recordings from real human workers with automated AI quality scoring.

Use cases: UGC collection, ground truth data for AI evaluation, LLM training data for multimodal models.

## Installation

```bash
npm install @firsthandapi/mcp-server
```

## Configuration

### Claude Code
```json
{
  "mcpServers": {
    "firsthand": {
      "command": "npx",
      "args": ["@firsthandapi/mcp-server"],
      "env": {
        "FIRSTHAND_API_KEY": "fh_live_your_key_here"
      }
    }
  }
}
```

### Cursor
Add to `.cursor/mcp.json`:
```json
{
  "firsthand": {
    "command": "npx @firsthandapi/mcp-server",
    "env": { "FIRSTHAND_API_KEY": "fh_live_..." }
  }
}
```

## Tools

| Tool | Description |
|------|-------------|
| `create_job` | Post a content collection job |
| `get_job` | Get job status and details |
| `create_job_and_wait` | Post a job and wait for completion |
| `list_jobs` | List all jobs with filters |
| `cancel_job` | Cancel an open job |
| `get_job_files` | Get approved files with download URLs |
| `get_credits` | Check credit balance |

## Environment Variables

- `FIRSTHAND_API_KEY` (required) — Your API key
- `FIRSTHAND_BASE_URL` (optional) — API base URL (default: https://api.firsthandapi.com)
- `FIRSTHAND_TIMEOUT_MS` (optional) — Request timeout (default: 30000)

## License

Proprietary
npm package: @firsthandapi/sdk
Description: TypeScript SDK for the FirstHandAPI REST API
Latest version: 0.1.0

# @firsthandapi/sdk — FirstHandAPI TypeScript SDK

Official TypeScript SDK for [FirstHandAPI](https://firsthandapi.com) — the human-in-the-loop (HITL) crowdsourced data collection API.

Post jobs via API. Real human workers capture photos, audio, video, and screen recordings. AI ensemble (Claude Vision + Whisper) auto-scores quality. Approved files delivered to your S3 folder. Use cases: UGC collection, ground truth for AI evaluation, LLM training data.

## Installation

```bash
npm install @firsthandapi/sdk
```

## Quick Start

```typescript
import { FirstHandClient } from '@firsthandapi/sdk';

const client = new FirstHandClient({
  apiKey: 'fh_live_your_key_here',
});

// Post a content collection job
const job = await client.createJob({
  type: 'data_collection',
  description: 'Photos of grocery store shelf labels',
  files_needed: 100,
  accepted_formats: ['image/jpeg', 'image/png'],
  price_per_file_cents: 25,
});

// Wait for completion
const completed = await client.createJobAndWait({
  ...jobData,
}, 300); // wait up to 5 minutes

// Get approved files
const files = await client.getJobFiles(job.id);
files.data.forEach(file => {
  console.log(file.download_url);
});
```

## Methods

### Jobs
- `createJob(body)` — Post a new job
- `getJob(id, options?)` — Get job (supports long-poll)
- `listJobs(params?)` — List jobs
- `cancelJob(id)` — Cancel and refund
- `getJobFiles(id)` — Get approved files
- `getJobSubmissions(id)` — Get submissions
- `createJobAndWait(body, maxWait)` — Create and poll

### Billing
- `getCreditBalance()` — Check balance
- `listTransactions(params?)` — Transaction history
- `purchaseCredits(body)` — Buy credits

### Webhooks
- `createWebhookEndpoint(body)` — Register endpoint
- `listWebhookEndpoints()` — List endpoints
- `verifyWebhookSignature(payload, signature, secret)` — Verify webhook

### API Keys
- `createApiKey(body)` — Create key
- `listApiKeys()` — List keys
- `rotateApiKey(id)` — Rotate key
- `revokeApiKey(id)` — Revoke key

## Features
- Auto-retry with exponential backoff (429, 500+)
- Idempotency key generation
- Long-poll support
- TypeScript-native types

## License

Proprietary