Skip to content
CAI
Software that uses CAICheck a score

sindresorhus/Gifski

62.7

Adequate · 27 September 2026

13.8k

lines of production code

Swift

primary language

4

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

Gifski is a macOS application that converts video files into animated GIFs, featuring a modern SwiftUI interface with video cropping and live preview capabilities. It integrates with the operating system via a Share Extension, allowing users to initiate conversions directly from other apps. The system relies on a Rust-based core library for encoding, wrapped by Swift code and supported by a comprehensive test suite to ensure conversion accuracy.

Features

Gifski 3.0 introduces video cropping and preview capabilities

Gifski has been rewritten in SwiftUI and now supports cropping videos before conversion, allowing users to select specific regions and aspect ratios (including custom presets like 16:9 and 1:1) via a new interactive overlay. The app also features a live preview mode to visualize the final GIF output during editing, along with a new edit screen workflow that replaces the previous direct conversion flow. This update requires macOS 15 and includes a new app icon and UI design.

Gifski · high confidence

New macOS Share Extension for video-to-GIF conversion

Users can now share video files directly from macOS apps (such as Safari or Finder) to Gifski. The new Share Extension accepts MPEG-4, M4V, and QuickTime movie files, copies them to the app's shared container, and launches the main Gifski application with the file path to begin conversion.

Share Extension · high confidence

Architecture

Shared Xcode workspace and scheme configuration

The project now includes shared Xcode workspace and scheme files, making the build configuration available to all team members and ensuring consistent settings for building, testing, and launching the Gifski app and its Share Extension. The main scheme enables code coverage and sets environment variables for debugging, while the Share Extension scheme is configured to build and launch alongside the main app.

Gifski.xcodeproj/xcshareddata · high confidence

Behavioural changes

9 commits (0 fixes) modifying Stuff

A change to existing behaviour in Stuff — 9 commits, 8 files.

Stuff · medium confidence · unverified

Added Xcode scheme for the static library target

A new Xcode scheme has been added for the 'gifski.a (static library)' target, enabling the library to be built, tested, profiled, and archived directly from the Xcode IDE. This change improves the developer workflow by allowing direct interaction with the static library component without requiring external build scripts.

gifski-api/gifski.xcodeproj/xcshareddata · high confidence

App architecture modernized with SwiftUI and new export capabilities

The application has been rewritten using SwiftUI, replacing the previous AppKit-based interface (evidenced by the removal of MainMenu.xib and AppDelegate.swift in favor of App.swift and dedicated screens like MainScreen, StartScreen, and SettingsScreen). This update introduces the ability to export modified videos alongside GIFs, adds a share extension for system-wide integration, and includes a GIF preview feature. The project structure now utilizes Swift Package Manager for dependencies and static linking for the underlying gifski library.

Gifski.xcodeproj · high confidence

Gifski 3.0.6 release and repository maintenance updates

This update introduces Gifski version 3.0.6 (project version 95) and adds official App Store metadata, including the description and keywords files, to support the app's availability on the Mac App Store. The repository structure is cleaned up by removing the \gifski-api\ git submodule and its associated \.gitmodules\ file, while updating \.gitignore\ and \.gitattributes\ to handle the vendored library directory. Additionally, SwiftLint configuration is significantly expanded to enforce stricter code quality rules, and new documentation files (\contributing.md\, \maintaining.md\, \license\) are added to guide contributors and clarify licensing.

(repo-wide) · high confidence

Gifski API restructured with new source decoders and C API updates

The gifski-api source has been reorganized to support new input formats and a refined C interface. New source decoders for GIF (gif\_source.rs) and Y4M video (y4m\_source.rs) have been added, enabling direct encoding from these formats. The C API header (gifski.h) has been updated to replace the 'once' boolean with a 'repeat' integer for loop control, and introduces new functions for setting motion quality, lossy quality, and extra encoding effort. Internal error handling has been modernized with a new GifskiError enum, and the old error\_chain-based error module has been removed. A snapcraft.yaml file has been added for packaging.

gifski-api/src · high confidence

Migrate gifski-api build system to cargo-xcode

The Xcode project for the gifski-api has been rebuilt to use the cargo-xcode toolchain, replacing the previous legacy Cargo target with a native Swift/Xcode build rule. This change updates the project object version to 90 and restructures the build files to directly invoke Cargo for building the Rust library and binary, handling multi-architecture linking (lipo) and dependency tracking within the Xcode environment. Users building this API will now rely on the cargo-xcode integration for compiling the underlying gifski Rust code.

gifski-api/gifski.xcodeproj · high confidence

Test coverage

Add comprehensive test suite for Gifski

Added a new test file (Tests.swift) containing 1983 lines of unit tests for the Gifski application. The tests cover core functionality including time remaining estimation, video conversion settings (quality, dimensions, frame rate, loop, bounce, crop), pixel buffer creation, and test video generation using AVFoundation. This establishes a baseline for verifying video processing logic and UI-related settings.

Tests · high confidence

Dependencies

Upgrades Rust dependencies and Swift package pins

The Rust \gifski-api\ library has been upgraded to version 1.34.0, bringing significant dependency updates including \clap\ to 4.5.36, \imagequant\ to 4.3.4, and \lodepng\ to 3.11.0, alongside a shift to the Rust 2021 edition and stricter build profiles. Concurrently, the Swift package resolver has been initialized with pinned versions for \Defaults\ (9.0.9), \DockProgress\ (5.1.0), \ExtendedAttributes\ (1.1.0), \sentry-cocoa\ (9.28.0), and \swift-syntax\ (603.0.2).

(dependencies) · high confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

This is the PUBLIC form of this artifact. Findings are listed in full, but the details of SECURITY findings — which rule fired, in which file, on which line, and how to fix it — are deliberately withheld, and any secret-scanner results are excluded entirely. Where detail is absent here it was REMOVED FOR PUBLICATION; it is not missing from the analysis. The complete artifact is available from the repository owner.

Score

  • CAI 47 → 63 (+15.7)
  • Rubric changed (rubric-2026.08.15 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 100 → 94 (-5.7)
  • Architecture 97 (new)
  • Maturity 54 → 63 (+9.2)
  • Readiness 21 → 44 (+23.0)
  • Security 92 → 100 (+7.5)

Resolved (6)

  • Dimension evaluation failed
  • High: security finding (details withheld)
  • No automated tests
  • No exposed public API
  • No tests found
  • Test reliability not included

New (71)

  • Banned license: imagequant
  • ClassTooLong: _EditScreen (Gifski/EditScreen.swift)
  • Crop_AppEntity.cropRect (cognitive 17) (Gifski/Intents.swift)
  • Duplicate configuration type with inconsistent field types. Both GifskiSettings and Settings represent GIF encoding configuration, but width and height use u32 in the C-API wrapper and u64 in the main API. This forces users to choose between two nearly identical types with incompatible dimensions.
  • Duplicate configuration type with inconsistent field types. The repeat field is i16 in GifskiSettings but an enum Repeat in Settings. This inconsistency in the duplicate type structure adds cognitive load.
  • FileTooLong: Gifski/EditScreen.swift (Gifski/EditScreen.swift)
  • FileTooLong: Gifski/GIFGenerator.swift (Gifski/GIFGenerator.swift)
  • FileTooLong: Gifski/Utilities.swift (Gifski/Utilities.swift)
  • Hotspot: Gifski/Utilities.swift (Gifski/Utilities.swift)
  • Inconsistent frame addition API surface. The high-level Collector only exposes add_frame_rgba and add_frame_png_*, while the C-API exposes multiple raw pixel formats (rgba, argb, rgb) and stride variants. This forces users of the C-API to handle format conversions manually that the high-level API abstracts away, or vice versa, creating a fragmented experience.
  • LoopingPlayer.updateObserver (cognitive 21) (Gifski/Utilities.swift)
  • LoopingPlayer.updateObserver (cyclomatic 18) (Gifski/Utilities.swift)
  • Low cohesion: AppState (LCOM4 4) (Gifski/AppState.swift)
  • Low cohesion: CGSize (LCOM4 8) (Gifski/Utilities.swift)
  • Low cohesion: CVPixelBuffer (LCOM4 7) (Gifski/Utilities.swift)
  • Low cohesion: URL (LCOM4 8) (Gifski/Utilities.swift)
  • Medium vulnerability: RUSTSEC-2026-0204 (gifski-api/Cargo.lock)
  • MethodTooLong: _EditScreen.body (Gifski/EditScreen.swift)
  • No ADRs found
  • Orphaned files with no living knowledge
  • …and 51 more

Changes since last survey

  • 3 commits — 3 feature/other, 0 fixes

By area

  • Gifski.xcodeproj/project.xcworkspace — 2 commits
  • (root) — 1 commit

Notable commits

  • change: 3.0.6
  • change: Prevent invalid video composition frame durations
  • change: Tweaks

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

sindresorhus/Gifski was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 27 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit e184b284886929b9401e2442629a57650d3231f4 — the exact code this score is about.
  • Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-d00c643c3f66.