Files
wehub-resource-sync 426e9eeabd
Benchmark Bridge Tests / benchmark (bunx @biomejs/biome check packages/lifeops-bench/src, benchmark-lint) (push) Waiting to run
Benchmark Bridge Tests / benchmark (bunx vitest run --config packages/lifeops-bench/vitest.config.ts --root packages/lifeops-bench --passWithNoTests, benchmark-tests) (push) Waiting to run
Build Agent Image / build-and-push (push) Waiting to run
Chat shell gestures / Chat shell gesture + parity e2e (push) Waiting to run
ci / test (push) Waiting to run
ci / lint-and-format (push) Waiting to run
ci / build (push) Waiting to run
ci / dev-startup (push) Waiting to run
Cloud Gateway Discord / Test (push) Waiting to run
Cloud Gateway Webhook / Test (push) Waiting to run
Cloud Tests / lint-and-types (push) Waiting to run
Cloud Tests / unit-tests (push) Waiting to run
Cloud Tests / integration-tests (push) Waiting to run
Cloud Tests / e2e-tests (push) Blocked by required conditions
CodeQL Advanced / Analyze (javascript-typescript) (push) Waiting to run
Deploy Apps Worker (Product 2) / Determine environment (push) Waiting to run
Deploy Apps Worker (Product 2) / Deploy apps worker to apps-control host (${{ needs.determine-env.outputs.environment }}) (push) Blocked by required conditions
Deploy Eliza Provisioning Worker / Determine environment (push) Waiting to run
Deploy Eliza Provisioning Worker / Deploy worker to Hetzner host (${{ needs.determine-env.outputs.environment }} @ ${{ needs.determine-env.outputs.deployment_sha }}) (push) Blocked by required conditions
Dev Smoke / Classify changed paths (push) Waiting to run
Dev Smoke / bun run dev onboarding chat (push) Blocked by required conditions
Dev Smoke / Vite HMR dependency-level smoke (push) Blocked by required conditions
Electrobun Submodule Guard / electrobun gitlink is fetchable (push) Waiting to run
gitleaks / gitleaks (push) Waiting to run
Markdown Links / Relative Markdown Links (push) Waiting to run
Publish @elizaos/example-code / check_npm (push) Waiting to run
Publish @elizaos/example-code / publish_npm (push) Blocked by required conditions
Publish @elizaos/plugin-elizacloud / verify_version (push) Waiting to run
Publish @elizaos/plugin-elizacloud / publish_npm (push) Blocked by required conditions
Quality (Extended) / Homepage Build (PR smoke) (push) Waiting to run
Quality (Extended) / Comment-only diff guard (push) Waiting to run
Quality (Extended) / Format + Type Safety Ratchet (push) Waiting to run
Quality (Extended) / Develop Gate (secret scan + UI determinism) (push) Waiting to run
Quality (Extended) / Develop Gate (lint) (push) Waiting to run
Sandbox Live Smoke / Sandbox live smoke (push) Waiting to run
Snap Build & Test / Build Snap (amd64) (push) Waiting to run
Snap Build & Test / Build Snap (arm64) (push) Waiting to run
supply-chain / sbom (push) Waiting to run
supply-chain / vulnerability-scan (push) Waiting to run
Build, Push & Deploy to Phala Cloud / build-and-push (push) Waiting to run
Test Packaging / Validate Packaging Configs (push) Waiting to run
Test Packaging / PyPI on Python ${{ matrix.python }} (push) Waiting to run
Test Packaging / Pack & Test JS Tarballs (push) Waiting to run
Test Packaging / elizaos CLI global-install smoke (node + bun) (push) Waiting to run
UI Fixture E2E / ui-fixture-e2e (push) Waiting to run
UI Fixture E2E / fixture-e2e (push) Waiting to run
UI Story Gate / story-gate (push) Waiting to run
vault-ci / test (macos-latest) (push) Waiting to run
vault-ci / test (ubuntu-latest) (push) Waiting to run
vault-ci / test (windows-latest) (push) Waiting to run
vault-ci / app-core wiring tests (push) Waiting to run
verify-patches / verify patches/CHECKSUMS.sha256 (push) Waiting to run
Voice Benchmark Smoke / voice-emotion fixture smoke (push) Waiting to run
Voice Benchmark Smoke / voiceagentbench fixture smoke (push) Waiting to run
Voice Benchmark Smoke / voicebench-quality unit smoke (push) Waiting to run
Voice Benchmark Smoke / voicebench TypeScript unit (no audio) (push) Waiting to run
Voice Benchmark Smoke / voice bench smoke summary (push) Blocked by required conditions
Windows CI / windows ([bun run --cwd packages/app-core test bun run --cwd packages/elizaos test bun run --cwd packages/cloud/shared test], app-and-cli) (push) Waiting to run
Windows CI / windows ([bun run --cwd packages/scenario-runner test bun run --cwd packages/vault test bun run --cwd packages/security test bun run --cwd plugins/plugin-coding-tools test], framework-packages) (push) Waiting to run
Windows CI / windows ([bun run --cwd plugins/plugin-elizacloud test bun run --cwd plugins/plugin-discord test bun run --cwd plugins/plugin-anthropic test bun run --cwd plugins/plugin-openai test bun run --cwd plugins/plugin-app-control test bun run --cwd plugins/pl… (push) Waiting to run
Windows CI / windows ([node packages/scripts/run-turbo.mjs run build --filter=@elizaos/core --filter=@elizaos/shared --filter=@elizaos/agent --concurrency=4 node packages/scripts/run-bash-linux-only.mjs scripts/verify-riscv64-buildpaths.sh node packages/scripts/run… (push) Waiting to run
Windows CI / windows ([node packages/scripts/run-turbo.mjs run typecheck --filter=@elizaos/core --filter=@elizaos/shared --filter=@elizaos/cloud-shared --concurrency=4 bun run --cwd packages/core test bun run --cwd packages/shared test], core-runtime, 75) (push) Waiting to run
Test Packaging / Build & Test PyPI Package (push) Waiting to run
Voice Workbench / headless workbench (mocked backends) (push) Has been cancelled
Voice Workbench / real acoustic lane (nightly, provisioned only) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:43:05 +08:00
..

@elizaos/capacitor-screencapture

Cross-platform screen capture Capacitor plugin for elizaOS. Captures screenshots and records the screen on browser (Web API), iOS (ReplayKit + AVFoundation), and Android (MediaProjection).

What it does

  • Screenshot: Captures a single frame of the screen as a base64-encoded PNG, JPEG, or WebP image.
  • Screen recording: Records the screen to a video file (WebM on browser, MP4 on native), with optional audio from the system, microphone, or both.
  • Pause / resume: Pause and resume an active recording without creating a new file (Android requires API 24+).
  • Permission checks: Query and request screen-capture and microphone permissions in a unified cross-platform API.
  • Live events: Subscribe to recordingState and error events emitted during recording.

Platform support

Feature Browser iOS Android
Screenshot Yes (getDisplayMedia) Yes (UIKit) Yes (MediaProjection)
Screen recording Yes (MediaRecorder) Yes (ReplayKit) Yes (MediaRecorder)
Pause/resume Yes Yes API 24+ only
System audio Browser-dependent Yes (RPSampleBufferType.audioApp) No (microphone only)
Microphone audio Yes Yes Yes

Installation

npm install @elizaos/capacitor-screencapture
npx cap sync

For iOS, add to your app's Info.plist:

<key>NSMicrophoneUsageDescription</key>
<string>Microphone is used to capture audio during screen recording.</string>

For Android 14+ (API 34), declare in AndroidManifest.xml:

<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION" />

This is in addition to the FOREGROUND_SERVICE permission that this plugin's own AndroidManifest.xml already declares.

Usage

import { ScreenCapture } from '@elizaos/capacitor-screencapture';

// Check support
const { supported, features } = await ScreenCapture.isSupported();

// Take a screenshot
const shot = await ScreenCapture.captureScreenshot({ format: 'png', quality: 100 });
// shot.base64 contains the image data

// Record the screen
await ScreenCapture.startRecording({
  quality: 'high',        // 'low' | 'medium' | 'high' | 'highest'
  fps: 30,
  captureSystemAudio: true,
  captureMicrophone: false,
  maxDuration: 300,       // seconds; undefined = unlimited
});

// Listen for state updates
const handle = await ScreenCapture.addListener('recordingState', (state) => {
  console.log(`Recording: ${state.isRecording}, duration: ${state.duration}s`);
});

// Stop and get the result
const result = await ScreenCapture.stopRecording();
// result.path — blob: URL (browser) or filesystem path (native)
// result.mimeType — video/webm (browser) or video/mp4 (native)

await handle.remove();

Permissions

Screen capture permission works differently per platform:

  • Browser: getDisplayMedia always shows an OS-level picker dialog. There is no way to pre-grant or query this permission. checkPermissions() returns "prompt" when the API is available.
  • iOS: Screenshots use UIKit only — no permission required. startRecording uses ReplayKit, which shows a system broadcast picker on first use.
  • Android: captureScreenshot and startRecording both trigger a MediaProjection consent dialog. Microphone permission (RECORD_AUDIO) is requested at runtime when captureMicrophone: true.
// Check permissions
const status = await ScreenCapture.checkPermissions();
// status.screenCapture: 'granted' | 'denied' | 'prompt' | 'not_supported'
// status.microphone:    'granted' | 'denied' | 'prompt'

// Request microphone permission before recording with audio
await ScreenCapture.requestPermissions();

Output formats

Platform Screenshot Recording
Browser PNG / JPEG / WebP video/webm (VP9 preferred), blob: URL
iOS PNG / JPEG / WebP (WebP requires iOS 14+) video/mp4 (H.264 + AAC), file:// path
Android PNG / JPEG / WebP (WebP lossy requires API 30+) video/mp4 (H.264), file path

Recording options

Option Type Default Description
quality 'low' | 'medium' | 'high' | 'highest' 'high' Quality preset (sets bitrate on iOS; sets fps + bitrate on Android)
fps number 30 Frames per second (160; overrides quality preset)
bitrate number Estimated Video bitrate in bits/s (overrides quality preset)
maxDuration number unlimited Stop automatically after N seconds
maxFileSize number unlimited Stop automatically after N bytes
captureSystemAudio boolean true Include app/system audio (browser + iOS; Android records microphone only)
captureMicrophone boolean false Include microphone audio in recording

Building from source

bun run --cwd plugins/plugin-native-screencapture build

This runs tsc then rollup and outputs dist/esm/, dist/plugin.js (IIFE), and dist/plugin.cjs.js.