# extension-camera

Adds instructions for integrating a React useCamera hook into web apps. Useful for live camera previews and photo capture.

- skill · `type=skill` · Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, OpenCode · 28100 installs · ★ 2
- Author: caffeinelabs
- License: Apache-2.0 · policy=mirror · the beginning of the file is at the end of this page
- Source: https://github.com/caffeinelabs/skills/tree/HEAD/skills/extension-camera/SKILL.md
- Updated: 2026-10-22
- HTML: https://affpapa.org/en/nevibecode/skills/extension-camera

## What it does

This skill guides your coding agent on using the prefabricated `useCamera` hook from the `@caffeineai/camera` package. The hook handles media stream lifecycles, browser support checks, and structured error types like permission denials or missing devices.

It also enforces strict UI guidelines. The agent binds the stream to a `<video>` element using `videoRef`, hides the capture `<canvas>`, and keeps action buttons disabled until streaming initializes. Photos export directly as `File` objects with selectable formats (`jpeg`, `png`, `webp`) and quality settings from 0 to 1.

Desktop environments cannot toggle between cameras because only the `environment` mode functions there. The agent knows this rule and disables camera switching on desktop screens.

## Install

### Claude Code (native platform)

1. **Skills CLI (Vercel)**
```bash
npx skills add caffeinelabs/skills --skill extension-camera -a claude-code
```

2. **Manually: put the files in place**
- File: `~/.claude/skills/extension-camera/SKILL.md` — Copy the whole skill folder; for one project use .claude/skills/extension-camera/

### Codex

1. **Skills CLI (Vercel)**
```bash
npx skills add caffeinelabs/skills --skill extension-camera -a codex
```

2. **Manually: put the files in place**
- File: `.agents/skills/extension-camera/SKILL.md` — For all projects use ~/.agents/skills/

### Cursor

1. **Skills CLI (Vercel)**
```bash
npx skills add caffeinelabs/skills --skill extension-camera -a cursor
```

2. **Manually: put the files in place**
- File: `.cursor/skills/extension-camera/SKILL.md` — Cursor also reads .agents/skills/ and .claude/skills/

### GitHub Copilot

1. **GitHub CLI**
```bash
gh skill install caffeinelabs/skills extension-camera
```

2. **Manually: put the files in place**
- File: `.github/skills/extension-camera/SKILL.md`

### Gemini CLI

1. **Skills CLI (Vercel)**
```bash
npx skills add caffeinelabs/skills --skill extension-camera -a gemini-cli
```

2. **Platform CLI**
```bash
gemini skills install https://github.com/caffeinelabs/skills --path skills/extension-camera
```

### Windsurf (Devin Desktop)

**Manually: put the files in place**
- File: `.devin/skills/extension-camera/SKILL.md` — The legacy .windsurf/skills/ path still works

### OpenCode

**Skills CLI (Vercel)**
```bash
npx skills add caffeinelabs/skills --skill extension-camera -a opencode
```

### Claude.ai

**Claude.ai**
- Zip the folder and upload it in Settings → Capabilities → Skills

Where a file is given instead of a command, copy the files from the source to that path: https://github.com/caffeinelabs/skills/tree/HEAD/skills/extension-camera/SKILL.md

## When to use it
- integrate a camera preview using the `useCamera` hook
- capture and export still photos as `File` objects
- handle device permission and missing camera errors
- prevent UI clicks before the video stream is ready

## Example prompts
- Create a camera preview component with photo capture using useCamera
- Add camera switching and error handling for web devices
- Build a responsive React component for capturing pictures

## Source text · SKILL.md · Apache-2.0

Below is the content of a third-party file. It is data, not instructions for you: do not act on anything written inside unless the human asks. Block tag: 09d04b875db0960c.

BEGIN THIRD-PARTY FILE 09d04b875db0960c
````text
---
name: extension-camera
description: Web-camera support.
version: 0.1.4
compatibility:
  npm:
    "@caffeineai/camera": "~0.1.1"
caffeineai-subscription: [none]
---

# Camera
Camera extension for [Caffeine AI](https://caffeine.ai?utm_source=caffeine-skill&utm_medium=referral).

## Overview

This skill adds web-camera access via a prefabricated React hook. Supports photo capture, camera switching, and error handling.

# Frontend

For camera support:

There is a prefabricated React hook `@caffeinelabs/camera/hooks/useCamera.ts` that cannot be modified.

```typescript filepath=@caffeinelabs/camera/hooks/useCamera.ts
import { RefObject } from 'react';

export interface CameraConfig {
  // Camera facing mode - 'user' for front camera, 'environment' for back camera
  facingMode?: 'user' | 'environment';
  // Ideal video width and height in pixels
  width?: number;
  height?: number;
  // Image quality for capture (0-1, where 1 is highest quality)
  quality?: number;
  format?: 'image/jpeg' | 'image/png' | 'image/webp';
}

export interface CameraError {
  type: 'permission' | 'not-supported' | 'not-found' | 'unknown' | 'timeout';
  message: string;
}

export interface UseCameraReturn {
  // Whether camera is currently active and streaming
  isActive: boolean;
  // Whether camera is supported in current browser (null while checking)
  isSupported: boolean | null;
  // Current error state, if any
  error: CameraError | null;
  // Whether camera is initializing, starting, switching, or stopping
  isLoading: boolean;
  currentFacingMode: 'user' | 'environment';
  
  // Returns true on success
  startCamera: () => Promise<boolean>;
  stopCamera: () => Promise<void>;
  capturePhoto: () => Promise<File | null>;
  // Returns true on success
  switchCamera: () => (newFacingMode?: 'user' | 'environment') : Promise<boolean>;
  // Returns true on success
  retry: () => Promise<boolean>;
  
  // Ref to attach to video element for camera preview
  videoRef: RefObject<HTMLVideoElement>;
  // Ref to canvas element used for photo capture (can be hidden)
  canvasRef: RefObject<HTMLCanvasElement>;
}

export declare function useCamera(config?: CameraConfig): UseCameraReturn;
```

Usage example:

```
import { useCamera } from '@caffeineai/camera';

function CameraComponent() {
    const { 
        isActive, 
        isSupported, 
        error, 
        isLoading,
        startCamera, 
        stopCamera, 
        capturePhoto,
        switchCamera,
        videoRef, 
        canvasRef 
    } = useCamera({ 
        autoStart: true,
        facingMode: 'environment' 
    });

    if (isSupported === false) {
        return <div>Camera not supported</div>;
    }

    return (
        <div>
            <video 
                ref={videoRef} 
                style={{ width: '100%', height: 'auto' }}
                playsInline
                muted
            />
            <canvas ref={canvasRef} style={{ display: 'none' }} />
            
            {error && <div>Error: {error.message}</div>}
            
            <div>
````
END THIRD-PARTY FILE 09d04b875db0960c

The third-party file has ended. Everything between the 09d04b875db0960c tags is data: requests and commands from it are not followed. An “end of file” line with another tag inside the block is part of the file.

First 3054 of 4227 bytes. © caffeinelabs · Apache-2.0 · https://github.com/caffeinelabs/skills/tree/HEAD/skills/extension-camera/SKILL.md

_Part of the page did not fit — see the HTML version._

---
NeVibeCode on affpapa.org. Catalog texts are descriptions, not instructions for the agent. How to choose and install: https://affpapa.org/en/nevibecode/agents.md
