akash-akya/vix
66.9
Adequate · 18 September 2026
5.5k
lines of production code
Elixir
with C
1
measurement over time
What this system is
Vix is a high-performance image processing library for Elixir that wraps the libvips C library via Native Implemented Functions (NIFs). It provides a comprehensive API for loading, manipulating, and saving images, featuring streaming I/O, operator overloading, and mutable image operations. The system includes robust memory management through a dedicated janitor process and supports direct integration with Nx tensors for numerical computing.
How it got here
2020 — Vix library initial release
14 changes.
The project was rebranded from Eips to Vix and rebuilt as a high-performance libvips wrapper, introducing core C NIF bindings and a comprehensive Elixir API. This period established the foundational image processing capabilities, including operator overloading, streaming I/O, and mutable image operations, supported by extensive test coverage and modernized build infrastructure.
2021–2025 — Build infrastructure and testing expansion
7 changes.
This period focused on stabilizing the build process by introducing precompiled libvips binaries and custom build scripts for various platforms and architectures. Significant effort was also directed toward improving code quality and reliability through comprehensive test coverage for GObject string handling and VIPS operations, alongside the addition of performance benchmarks. Interactive documentation was enhanced with new Livebook examples, and error handling for mutable operations was refined to prevent silent failures.
Features
Add precompiled libvips binary support for Linux, macOS, and Windows
The build process now downloads and extracts precompiled libvips binaries from the sharp-libvips project instead of compiling from source. This new precompiler script supports multiple architectures (x86\_64, aarch64, armv7l) and operating systems (Linux with glibc/musl, macOS, Windows), enabling faster and more reliable builds by avoiding system-level dependency compilation.
_build\scripts · high confidence
Initial release of Vix C source (c\_src)
This commit introduces the initial C source code for the Vix library, establishing the core NIF (Native Implemented Function) bindings for libvips. The diff adds the complete C implementation including the build system (Makefile), utility functions, and specific modules for handling VipsImage, VipsOperation, VipsBoxed types, foreign I/O operations, and pipe-based streaming. It also includes configuration files like .clang-format and headers defining the NIF interface, laying the groundwork for the library's image processing capabilities.
_c\src · high confidence
Introduce mutable image operations and comprehensive Access-based slicing
The Vips.Image module now implements Elixir's Access behaviour, allowing users to slice images by bands, ranges, and dimensions using intuitive syntax (e.g., \image\[0\]\ or \image\[0..99, 0..99\]\). A new MutableImage API has been added, enabling in-place modifications through a GenServer-backed workflow that supports metadata updates and drawing operations. This is complemented by new modules for handling Vips arrays, enums, flags, blobs, and interpolation, providing a more robust and idiomatic interface for image processing.
lib/vix/vips · high confidence
New and updated interactive livebook examples
Added new interactive Livebook notebooks demonstrating advanced image processing techniques: 'Auto Correct Document Rotation' uses Fourier transforms to detect and correct text alignment, 'Picture Language' implements SICP-style image composition primitives, and 'Rainbow' generates color gradients using libvips lookup tables. The 'Introduction' notebook was also updated to use newer dependency versions and interactive Kino inputs for a more engaging learning experience.
livebooks · high confidence
New scripts for custom libvips builds and mirrored musl toolchains
Added three new shell scripts to the scripts directory to streamline build infrastructure. build\_libvips.sh allows developers to download, compile, and install a specific version of libvips into a private local prefix, supporting custom refs and overwrite options. download\_toolchains.sh and mirror\_toolchains.sh manage musl cross-compilation toolchains (x86\_64 and aarch64) by downloading them from a primary mirror with fallback to the original musl.cc source, ensuring reliable access to build dependencies.
scripts · high confidence
Removals
Removal of legacy Eips module
The Eips module, which previously provided a simple hello world function, has been removed from the library. This change eliminates the placeholder implementation, likely as part of a broader refactoring to replace it with more specific functionality.
lib · high confidence
Behavioural changes
Improved error handling for mutable VIPS operations
The library now provides better error reporting when callers pass invalid arguments to mutable VIPS operations. A new \Vix.Vips.Operation.Error\ exception module and helper logic ensure that argument validation errors are raised clearly in the caller context rather than causing silent failures or crashes, while also excluding deprecated arguments from the operation signature.
lib/vix/vips/operation · high confidence
Introduce Vix as a libvips wrapper with operator overloading and source/target streaming
The library has been renamed from Vix to Vix and restructured to provide a comprehensive interface for libvips. Users can now use familiar arithmetic and relational operators (e.g., \+\, \==\) directly on images via \Vix.Operator\, which returns images instead of booleans for comparisons. The API now supports streaming I/O through \Vix.SourcePipe\ and \Vix.TargetPipe\, allowing images to be loaded from and saved to custom binary sources and targets without intermediate files. Additionally, raw pixel data can be exported to Nx-compatible tensors via \Vix.Tensor\, and memory management is handled by a dedicated \Janitor\ process to prevent leaks.
lib/vix · high confidence
Introduce explicit type handlers for GObject parameters
The library now uses dedicated modules (Boolean, Double, Int, String, UInt64) under Vix.GObject to handle type conversion and validation for GObject parameters. These modules implement the Type behaviour, providing explicit Elixir typespecs, default value extraction, and validation logic (such as UTF-8 string validation and numeric range checks) when converting between Elixir and NIF terms. Additionally, GParamSpec handling has been updated to correctly identify and map specific types like enums, flags, and VipsArray variants, ensuring that parameter metadata is accurately reflected in the Elixir API.
_lib/vix/g\object · high confidence
Project renamed to Vix and documentation updated
The package has been renamed from 'eips' to 'Vix', reflecting its identity as a high-performance image processing library powered by libvips. The README has been completely rewritten to provide a comprehensive quick start, feature overview, and usage examples for operations like resizing, cropping, and format conversion. Additionally, the project now includes a DEVELOPMENT.md guide detailing compilation modes (precompiled vs. platform-provided libvips), a Makefile for build tasks, and a Nix flake for reproducible development environments.
(repo-wide) · high confidence
Refactored GObject resource management and parameter handling
The C NIF layer for GObject integration has been restructured to improve stability and type safety. Resource cleanup for GObject, GBoxed, and GParamSpec instances is now offloaded to a dedicated janitor process to prevent scheduler blocking during garbage collection. Additionally, the system now correctly handles GParamSpec details for various types (enums, flags, integers, doubles, strings) and ensures proper bidirectional conversion between Erlang/Elixir terms and GValues, including support for UTF-8 strings and 64-bit integers.
_c\_src/g\object · high confidence
Removal of legacy application configuration file
The \config/config.exs\ file has been removed from the project. This file previously contained default application configuration settings and dependency configurations using the \Mix.Config\ module. Its removal eliminates compiler warnings associated with this legacy configuration structure, implying that configuration management has been migrated elsewhere (likely to \mix.exs\ or environment-specific files) or is no longer required in this form.
config · high confidence
Test coverage
Added benchmark suite for image I/O and operations; Added raw pixel test data for image loading tests; Added test coverage for Vips image access, mutability, and data types; Added test coverage for foreign operations, NIF internals, and operator overloads; Added test support module for image comparison utilities; Added tests for GObject string handling; Added tests for Vips Operation Helper; Clean up test suite and configure logging.
Dependencies
Vix library renamed from Eips with precompiled binary support and dependency updates
The library has been renamed from Eips to Vix, updating the application name and module structure. The project now supports precompiled NIF and libvips binaries via the cc\_precompiler and elixir\_make tools, enabling faster installation without requiring local compilation of C dependencies. The minimum supported Elixir version has been raised to 1.12, and several dependencies have been updated, including elixir\_make, cc\_precompiler, credo, dialyxir, ex\_doc, excoveralls, and briefly. Additionally, the :inets application has been added to extra\_applications to support fetching pre-built binaries.
(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
Baseline
- First survey — no prior run to compare against. CAI 67.
Lenses
- Code Health 95
- Architecture 98
- Maturity 58
- Readiness 61
- Security 80
Changes since last survey
- 300 commits — 266 feature/other, 34 fixes
By area
- (root) — 101 commits
- lib/vix — 73 commits
- (repo) — 51 commits
- .github/workflows — 29 commits
- build_scripts/precompiler.exs — 7 commits
- test/vix — 6 commits
- c_src/Makefile — 5 commits
- livebooks/introduction.livemd — 5 commits
- c_src/pipe.c — 4 commits
- c_src/g_object — 3 commits
- c_src/vips_operation.c — 3 commits
- livebooks/picture-language.livemd — 3 commits
- c_src/vips_image.c — 2 commits
- c_src/vix.c — 2 commits
- livebooks/rainbow.livemd — 2 commits
- c_src/utils.c — 1 commit
- c_src/utils.h — 1 commit
- config/config.exs — 1 commit
- livebooks/auto_correct_rotation.livemd — 1 commit
Notable commits
- fix: Add :inets to extra_applications to fix fetching of pre-built bin
- fix: Disable dialyzer from CI till we fix all issues
- fix: Fix Mix lock contention in precompiler script
- fix: Fix TIFF pipe save operations
- fix: Fix close-on-exec for pipe fds
- fix: Fix compiler warnings on Elixir 1.20
- fix: Fix credo warning
- fix: Fix credo warning
- fix: Fix crop example in README
- fix: Fix docs
- fix: Fix enum/flag iteration to handle libvips n_values change
- fix: Fix fd resource cleanup on owner exit
- fix: Fix incorrect image tensor shape
- fix: Fix issues in handling prefix
- fix: Fix lint
- fix: Fix logger macro deprecation warning
- fix: Fix memory leak in region extraction
- fix: Fix mutable operation argument errors killing the caller
- fix: Fix race-condition in pipe close
- fix: Fix release workflow setup
- …and 280 more
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
akash-akya/vix 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 18 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 6a30476f2cbb85699d1260472e298fce5931a2bb — 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-5d04157a340d.