Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

Github banner

Discord Twitter GitHub Repo stars docs.rs Crates.io MSRV

A Rust library for high-quality screen capture that leverages native OS APIs for optimal performance!

  1. macOS: ScreenCaptureKit
  2. Windows: Windows.Graphics.Capture
  3. Linux: Pipewire

Features

  1. Cross-platform across Windows, Mac and Linux!
  2. Checks for support and recording permissions.
  3. Query list of captureable targets (displays and windows).
  4. Exclude certain targets from being captured.

Contributing

We found most of Rust's tooling around screen capture either very outdated, non-performant or platform-specific. This project is our attempt to change that. Contributions, PRs and Issues are most welcome!

If you want to contribute code, here's a quick primer:

  1. Clone the repo and run it with cargo run.
  2. Explore the API and library code in lib.rs.
  3. Platform-specific code lives in the win, mac and linux modules.
  4. The main.rs is a small program that "consumes" the library, for easy testing.

Usage

use scap::{
    capturer::{Point, Area, Size, Capturer, Options},
    frame::Frame,
};

fn main() {
    // Check if the platform is supported
    if !scap::is_supported() {
        println!("❌ Platform not supported");
        return;
    }

    // Check if we have permission to capture screen
    // If we don't, request it.
    if !scap::has_permission() {
        println!("❌ Permission not granted. Requesting permission...");
        if !scap::request_permission() {
            println!("❌ Permission denied");
            return;
        }
    }

    // Get recording targets
    let targets = scap::get_all_targets();
    println!("Targets: {:?}", targets);

    // All your displays and windows are targets
    // You can filter this and capture the one you need.

    // Create Options
    let options = Options {
        fps: 60,
        target: None, // None captures the primary display
        show_cursor: true,
        show_highlight: true,
        excluded_targets: None,
        output_type: scap::frame::FrameType::BGRAFrame,
        output_resolution: scap::capturer::Resolution::_720p,
        crop_area: Some(Area {
            origin: Point { x: 0.0, y: 0.0 },
            size: Size {
                width: 2000.0,
                height: 1000.0,
            },
        }),
        ..Default::default()
    };

    // Create Capturer
    let mut capturer = Capturer::build(options).unwrap();

    // Start Capture
    capturer.start_capture();

    let mut input = String::new();
    std::io::stdin().read_line(&mut input).unwrap();

    // Stop Capture
    capturer.stop_capture();
}

Python bindings

The optional Python extension is built with maturin and returns captured data as owned NumPy arrays. Install a development build with:

python -m pip install maturin numpy
maturin develop --features python

Example:

import scap

if not scap.has_permission():
    if not scap.request_permission():
        raise RuntimeError("screen capture permission was denied")

options = scap.CaptureOptions(
    fps=30,
    output_type="bgra",
    output_resolution="720p",
)
capturer = scap.Capturer(options)
capturer.start()
try:
    frame = capturer.next_frame()
    print(frame.data.shape, frame.data.dtype, frame.format)
finally:
    capturer.stop()

Video arrays currently contain the native packed byte order reported by frame.format (rgb, rgbx, xbgr, bgrx, bgr0, or bgra) and have shape (height, width, channels). Audio arrays contain the owned raw bytes as a one-dimensional uint8 NumPy array; AudioFrameInfo exposes the sample format, channel count, sample rate, sample count, and planar layout.

The extension is feature-gated, so normal Rust builds are unchanged. macOS requires Screen Recording permission.

Linux capture backends

On Linux, PyScap prefers PipeWire through the XDG Desktop Portal. This remains the recommended backend for normal Wayland desktop screen sharing because the portal provides user-controlled source selection. Set SCAP_BACKEND=pipewire to require it.

For X11 desktops and headless virtual displays, set SCAP_BACKEND=x11. The X11 backend connects to the server named by DISPLAY and captures that screen's root window. It uses MIT-SHM when the X server permits it and falls back to the core X11 GetImage request otherwise. X11 capture is display-level; it does not provide the portal's interactive window or monitor picker.

When captures_audio=True, Linux records stereo 48 kHz signed 16-bit PCM from the default PulseAudio/PipeWire-Pulse output monitor. Set SCAP_AUDIO_SOURCE to override the source name. The PulseAudio client libraries and a running audio server must be available; headless systems normally need a null sink for Chromium to produce capturable audio.

For example, start Xvfb and capture its 1920x1080 screen:

Xvfb :99 -screen 0 1920x1080x24 &
DISPLAY=:99 SCAP_BACKEND=x11 python capture.py

An explicit backend is never silently replaced by another backend. With no SCAP_BACKEND, PyScap probes PipeWire and the ScreenCast portal first, then falls back to X11 when DISPLAY points to a usable X server.

License

The code in this repository is open-sourced under the MIT license, though it may be relying on dependencies that are licensed differently. Please consult their documentation for exact terms.

Contributors

Pranav Joglekar
Pranav Joglekar

💻
Siddharth
Siddharth

💻
Rohan Punjani
Rohan Punjani

💻
NiiightmareXD
NiiightmareXD

💻
MAlba124
MAlba124

💻
Anubhav Singhal
Anubhav Singhal

💻
Vasu Sharma
Vasu Sharma

💻

Credits

This project builds on top of the fabulous work done by:

Metadata

Release files for lexian-pyscap 0.1.2b8

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for lexian-pyscap 0.1.2b8
File Size Uploaded Provenance Actions
lexian_pyscap-0.1.2b8.tar.gz 5.2 MB With provenance Details for lexian_pyscap-0.1.2b8.tar.gz

Built distributions (wheels)

Table of built distributions (wheels) for lexian-pyscap 0.1.2b8
File Actions
lexian_pyscap-0.1.2b8-cp313-cp313-win_amd64.whl CPython 3.13 CPython 3.13 Windows x86-64 Details for lexian_pyscap-0.1.2b8-cp313-cp313-win_amd64.whl
lexian_pyscap-0.1.2b8-cp313-cp313-manylinux_2_34_x86_64.whl CPython 3.13 CPython 3.13 Linux glibc 2.34+ x86-64 Details for lexian_pyscap-0.1.2b8-cp313-cp313-manylinux_2_34_x86_64.whl
lexian_pyscap-0.1.2b8-cp313-cp313-macosx_11_0_arm64.whl CPython 3.13 CPython 3.13 macOS 11.0+ ARM64 Details for lexian_pyscap-0.1.2b8-cp313-cp313-macosx_11_0_arm64.whl
lexian_pyscap-0.1.2b8-cp313-cp313-macosx_10_12_x86_64.whl CPython 3.13 CPython 3.13 macOS 10.12+ x86-64 Details for lexian_pyscap-0.1.2b8-cp313-cp313-macosx_10_12_x86_64.whl

Total release size: 10.3 MB

Release files / lexian_pyscap-0.1.2b8.tar.gz

Download URL lexian_pyscap-0.1.2b8.tar.gz
Size 5.2 MB
Tags Source
SHA-256 checksum
How to use checksums
c2f0e87990ad9541fa6c9abeea8e65c72a7fe3a9d7ab260cecbde225a0ec9a38
BLAKE2b-256 checksum
How to use checksums
25cdf24dbe0658dc90f8c69925e9a1c9f19d4346a84f64a2edb3d0099b8e9e8a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 19, 2026.

Transparency log

Release files / lexian_pyscap-0.1.2b8-cp313-cp313-win_amd64.whl

Download URL lexian_pyscap-0.1.2b8-cp313-cp313-win_amd64.whl
Size 348.8 kB
Tags CPython 3.13 Windows x86-64
SHA-256 checksum
How to use checksums
56008a820bad31a5b67d9e40dc072938b8a9910496e88aab9ee94095bc78cba3
BLAKE2b-256 checksum
How to use checksums
3a6cb3fda1a59a6ea70d5f7b4fc64aa8e68b5d7f6c35378df38d924cc084f205
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 19, 2026.

Transparency log

Release files / lexian_pyscap-0.1.2b8-cp313-cp313-manylinux_2_34_x86_64.whl

Download URL lexian_pyscap-0.1.2b8-cp313-cp313-manylinux_2_34_x86_64.whl
Size 4.0 MB
Tags CPython 3.13 Linux glibc 2.34+ x86-64
SHA-256 checksum
How to use checksums
4a2a38e4bcf3f0b87a4e6e781ba03559361620f71fd38a3267efd2f236edf343
BLAKE2b-256 checksum
How to use checksums
7e2c795657e6098679703a4e2b55e490bd93e3bc2f305f229c1f059cfb77acc9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 19, 2026.

Transparency log

Release files / lexian_pyscap-0.1.2b8-cp313-cp313-macosx_11_0_arm64.whl

Download URL lexian_pyscap-0.1.2b8-cp313-cp313-macosx_11_0_arm64.whl
Size 355.7 kB
Tags CPython 3.13 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
6af32a8fd499afed1dc2c321713c4fedb851c55c84eacc0b37e76bae45149697
BLAKE2b-256 checksum
How to use checksums
ebc61199a4c87d4c9f45da2c2d03f09c67c6888f47d0b597ec7d20e843fe97ae
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 19, 2026.

Transparency log

Release files / lexian_pyscap-0.1.2b8-cp313-cp313-macosx_10_12_x86_64.whl

Download URL lexian_pyscap-0.1.2b8-cp313-cp313-macosx_10_12_x86_64.whl
Size 359.0 kB
Tags CPython 3.13 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
b30a3219faa53e6fad0927612cefc1f216eb6f05e0905ab1cc83b47d868f4956
BLAKE2b-256 checksum
How to use checksums
d1350db9bf7c3ec828d30eaaa64407639b76f40da73486a37adcec3ca45055a1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 19, 2026.

Transparency log

Security for lexian-pyscap 0.1.2b8

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 5 files in this release have been uploaded with provenance metadata.

Select from 5 files

Attestation for lexian_pyscap-0.1.2b8.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 19, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page