Skip to content
CAI
Software that uses CAICheck a score

mczachurski/wallpapper

50.5

Weak · 30 September 2026

1k

lines of production code

Swift

primary language

2

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This system is a macOS-focused toolkit for generating and analyzing dynamic wallpapers, primarily based on solar coordinates and time. It provides command-line utilities to create HEIC files with embedded metadata for light/dark mode sequences and to extract EXIF data from existing images. The codebase is structured as a shared library supporting these two distinct console applications.

Features

Initial release of wallpapper and wallpapper-exif tools

This change introduces the initial version of the wallpapper project, providing console applications for macOS to create dynamic wallpapers. It includes a build script (build.sh) and a LICENSE file, along with comprehensive documentation in the README explaining how to install via Homebrew or manually, and how to use the tools to generate wallpapers based on solar coordinates, time, or OS appearance settings.

(repo-wide) · high confidence

Library restructuring and new dynamic wallpaper generation capabilities

The codebase has been reorganized into the WallpapperLib module, moving core logic from the previous wallpapper source directory. This update introduces a new ImageMetadataGenerator that creates HEIC dynamic wallpapers with embedded metadata for solar, time-based, and appearance (light/dark mode) sequences, including a configurable output quality parameter. It also adds a DynamicWallpaperExtractor to read and decode these metadata sequences into property lists, a LocationExtractor for parsing EXIF GPS and creation date data, and SunCalculations to determine sun position based on location and time. Additionally, the ConsoleIO utility now supports a debug output type.

Sources/WallpapperLib · high confidence

Removals

Removal of legacy SequenceInfo and SequenceItem types

The \SequenceInfo\ and \SequenceItem\ classes, previously used for decoding specific sequence data from property lists, have been removed from the codebase. This change eliminates the legacy data structures that handled sequence items with attributes like alpha (\a\), z-order (\z\), index (\i\), and offset (\o\), simplifying the property list parsing logic.

Sources/wallpapper/PropertyList · high confidence

Removal of legacy error types

The \AddTagImageError\, \InputFileNotExistsError\, \NamespaceNotRegisteredError\, and \NotSupportedSystemError\ classes have been removed from the \Sources/wallpapper/Errors\ directory. This cleanup eliminates unused or obsolete error definitions, simplifying the error handling structure for users and developers.

Sources/wallpapper/Errors · high confidence

Behavioural changes

Removal of legacy PictureInfo and ThemeMode model structures

The legacy \PictureInfo\ and \ThemeMode\ model files have been removed from the application. This change eliminates the previous data structures used for storing picture metadata (such as filename, primary status, and theme mode) and the specific light/dark theme enumeration, indicating a shift in how wallpaper data and theme preferences are handled internally.

Sources/wallpapper/Model · high confidence

Wallpapper tool gains image quality control and metadata extraction

The Wallpapper command-line utility now supports specifying output image quality via the new -q flag, allowing users to adjust the compression level of generated HEIC files. Additionally, a new -e extraction mode has been added, enabling the tool to read HEIC files and output their embedded metadata (such as sun position data) as JSON, rather than only generating wallpapers from JSON inputs.

Sources/Wallpapper · high confidence

Dependencies

Swift 5.2 migration and package structure reorganization

The project has been updated to require Swift 5.2 and restructured to expose a shared library (WallpapperLib) alongside two distinct executables: the main 'wallpapper' application and a new 'wallpapper-exif' tool. This change shifts the package from a single-target layout to a modular design where both applications depend on the common library.

(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

Score

  • CAI 56 → 50 (-5.3)
  • Rubric changed (rubric-2026.09.11 → rubric-2026.09.18) — scores are not directly comparable.

Lenses

  • Code Health 95 → 95 (+0.0)
  • Architecture 100 → 98 (-2.4)
  • Maturity 55 → 55 (+0.0)
  • Readiness 31 → 23 (-8.8)
  • Security 97 → 97 (+0.0)

Resolved (2)

  • Documentation: no architecture or design documentation (README.md)
  • Off-boarding risk: anonymized user #1

New (4)

  • Inconsistent Extraction/Processing Naming: The library uses getImageMetadata for metadata retrieval, but extract for both dynamic wallpaper processing and location extraction. While extract is used twice, the semantic difference between 'getting metadata' and 'extracting location/wallpaper' is blurred. More critically, ImageMetadataGenerator is a 'Generator' that 'gets' data, whereas DynamicWallpaperExtractor and LocationExtractor are 'Extractors' that 'extract' data. The naming convention for the action (getImageMetadata vs extract) is inconsistent across similar data-retrieval/transformation roles.
  • Off the main sequence: WallpapperLib
  • Off-boarding risk: anonymized user #1
  • Redundant Error Types: Three distinct error types (ImageMetadataGeneratorError, ExifExtractorError, MetadataExtractorError) are defined with identical structure (a single message property). This suggests a lack of a unified error handling strategy or inheritance hierarchy, leading to unnecessary type proliferation.

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

Survey your own repository

mczachurski/wallpapper 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 30 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 64d6e2b2088c990e0e7ea0deff8710bca93233fa — the exact code this score is about.
  • Scored under rubric-2026.09.18 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-cb25ca4feafa.