sindresorhus/Gifski
62.7
Adequate · 27 September 2026
13.8k
lines of production code
Swift
primary language
4
measurements over time
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.