outskirts home
Documentation menu

Changelog

Every change of outskirts, newest first. The master section lists what is merged and not released yet. This page is generated from CHANGELOG.md at each build.

On this page

master#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • None.

3.18.0 (2026-11-04)#

Breaking#

  • None.

Enhancements#

  • A JSON Schema of the configuration file, outskirts.schema.json (generated by outskirts config schema), with one entry per setting: type, description, default and allowed values. The examples/*.yml files and the file written by scan --setup start with the yaml-language-server comment for editor completion. New outskirts config check [--config <file>] [--project-root <dir>] validates a configuration file without scanning: unknown keys (with a suggestion), wrong types, quoted booleans, invalid report_exclude entries, retain_attributes, baseline and output paths; exits 1 on any problem. Closes #228 and the config check part of #227.
  • --changed-since <ref> (changed_since) keeps only the results whose file changed since the merge base of <ref> and HEAD, committed, uncommitted or untracked changes included; --changed-lines (changed_lines) further keeps only the results whose line falls inside a changed hunk. The whole project is still analysed; the filter runs after the baseline. Outside a git work tree or with an unknown ref the scan stops with an explicit error. The README gains a "Pull request checks" paragraph. Closes #231.
  • --quiet prints nothing on stdout when a scan reports no result, in every format; together with --write-results <file> the report goes to the file only. Exit statuses are unchanged. Closes #296 (requested upstream in peripheryapp/periphery#933 and #1129).
  • README: Baseline section, GitHub Actions and GitLab CI recipes, Framework conventions section, configuration schema and config check documentation; CONTRIBUTING: "Adding an option" checklist.

Bug Fixes#

  • None.

3.17.0 (2026-11-04)#

Breaking#

  • None.

Enhancements#

  • The build cache key now covers the build arguments passed after --; output and report options (--format, --baseline, --write-baseline, --strict, --report-include, --report-exclude, --relative-results) never trigger a new build. Scans with different build arguments no longer share one index store, and existing caches keep their names. The README explains how the cache is keyed and how to reuse an existing build with --skip-build --index-store-path.
  • New opt-in analysis --detect-unused-metal-functions (detect_unused_metal_functions): the .metal files of the project are read by a lightweight parser, and the kernel, vertex, fragment, [[visible]] and [[stitchable]] functions that no Swift string literal names (makeFunction(name:), MTLFunctionDescriptor.name, MTLFunctionStitchingFunctionNode(name:)) are reported as unused; a literal naming a function that no .metal file declares is reported as missingMetalFunction. A name that is not a plain literal retains every Metal function, and a library created at run time (makeLibrary(source:) and the like) disables the missingMetalFunction results. Prompted by the upstream discussion peripheryapp/periphery#1119.

Bug Fixes#

  • None.

3.16.1 (2026-11-03)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • The build cache now lives in ~/Library/Caches/com.github.tiny-earth-moon.outskirts, under the new name. The first scan moves a cache left under the former com.github.tiny-earth-moon.periphery directory, so nothing is rebuilt; when both exist the old one is removed, and outskirts clear-cache removes it too if it is still there.
  • The last comments in the sources that referred to the tool as Periphery now say outskirts.

3.16.0 (2026-11-03)#

Breaking#

  • None. The executable, the configuration file and the comment commands keep working under their periphery names.

Enhancements#

  • The project is now named outskirts: it finds what lies at the outskirts of your Swift project, the code nothing reaches. The executable is outskirts and periphery remains available as an alias; .outskirts.yml is read before .periphery.yml, and // outskirts:ignore is equivalent to // periphery:ignore. The repository moved to tiny-earth-moon/outskirts, where the update check now looks for releases; the SARIF driver is named outskirts. See Migrating from Periphery.
  • Linux is now built and tested in CI, in the official Swift 6.4 container and on the minimum toolchain (Swift 6.1); the standard streams are read through a small C shim and the SARIF fingerprints no longer need CryptoKit, so the sarif format is available on Linux. #219

Bug Fixes#

  • None.

3.15.0 (2026-11-03)#

Breaking#

  • None.

Enhancements#

  • New --relative-to <dir> option (configuration key relative_results_base): the base of the paths emitted with --relative-results, and of the github-actions, gitlab-codequality, codeclimate and sarif outputs. It defaults to the project root, so existing output is unchanged; in a repository that holds several projects, --relative-to "$GITHUB_WORKSPACE" or --relative-to "$CI_PROJECT_DIR" attaches annotations to files. #225
  • Baselines can now only shrink: entries that no longer match any result are logged (listed with --verbose), --prune-baseline (prune_baseline) rewrites the baseline without them, and --strict-baseline (strict_baseline) fails the scan when there are any. Baselines are written in a readable, sorted v2 format that lists the kind, name and file of each entry; v1 files are still read. #215
  • New sarif output format (SARIF 2.1.0) for GitHub Code Scanning and other SARIF consumers, with one rule per result kind, stable fingerprints and the redundant conformances as related locations. #213

Bug Fixes#

  • None.

3.14.1 (2026-11-03)#

Breaking#

  • None.

Enhancements#

  • The Code Climate output now carries the type, check_name and categories fields required by the Code Climate engine specification. #221

Bug Fixes#

  • Fixed a data race on the error propagated by concurrent indexing jobs (JobPool) and on the update checker state; the first error is now kept behind a Mutex. The mutable statics shared across threads are gone and Logger, Extensions, Shared and Configuration build in the Swift 6 language mode. #181
  • The parser now uses swift-syntax 604, matching the Swift 6.4 toolchain of CI, the Homebrew bottle and current Xcode. #186

3.14.0 (2026-11-02)#

Breaking#

  • None.

Enhancements#

  • Unused generic parameters of structs, classes, enums and actors (phantom types such as Tagged<UserTag>) are no longer reported by default; the new report_unused_type_parameters option (--report-unused-type-parameters) restores these results. #190

Bug Fixes#

  • None.

3.13.4 (2026-11-02)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • isolated parameters, including = #isolation, are no longer reported as unused. #197
  • A property-wrapped parameter used only through its $ projection is no longer reported as unused. #207
  • Parameters of @available(*, unavailable) stubs are no longer reported as unused. #209
  • _body(configuration:) and other underscored witnesses of SwiftUI styles such as TextFieldStyle are retained. #194
  • Live-preview retention covers WidgetKit #Preview(as:) and PreviewProvider previews of widgets. #204
  • C-exported and linker-visible declarations (@c, @_cdecl, @used, @_silgen_name) are retained. #177
  • dynamicallyCall methods of a @dynamicCallable type are retained when the type is called. #196
  • Classes named by valueTransformerName or representedClassName in a Core Data model are retained. #195
  • Optional properties written through a stored key path are no longer reported as unassigned. #198
  • References in top-level code of main.swift no longer attach to the preceding declaration. #189
  • A type whose extension carries @main is retained as the entry point. #205
  • A public protocol whose public extension witnesses a requirement of another public protocol is no longer reported as redundantly public. #187
  • Types used only through inline arrays ([N of T]) or pack expansions are no longer reported as redundantly public. #202
  • Results no longer depend on formatting: one-line enum cases, subscripts and typealiases are analysed like multi-line ones. #188
  • Unused and assign-only properties of @Observable classes are now reported, as for plain classes; scans of projects using Observation may show new results. #178

3.13.3 (2026-11-02)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • JSON and redundant-conformance output is now deterministic across runs: results, attributes and references are emitted in a stable order. #174
  • Synthetic result ids no longer contain a line, a column or an absolute String Catalog path, so baselines survive line shifts and other checkouts. The ids of unused imports, empty extensions and String Catalog keys, and the matching CodeClimate and GitLab fingerprints, change once; baselines written by earlier versions still match, with a warning to rewrite them with --write-baseline. #182
  • A .periphery.yml value of the wrong type or an invalid enum value now prints a warning naming the key, instead of being ignored silently. #175
  • A generic project configuration may omit keys, and a malformed one, like a malformed baseline or JSON package manifest, fails with a readable message naming the key at fault. #185
  • A command-line value now overrides .periphery.yml even when it equals the default; every boolean option also accepts --no-<option>. #199
  • The github-actions, gitlab-codequality and codeclimate formats always use relative paths, and their prerequisites are checked before the scan. #200
  • --baseline, --write-baseline and --write-results paths are validated before the scan starts. #210
  • Ctrl-C (SIGINT) and SIGTERM now exit with a non-zero status (130 and 143). #183
  • Verbose and debug logs go to stderr, so JSON, CSV and other machine-readable output on stdout stays valid. #184
  • Invalid Swift versions, guided-setup answers and project paths fail with a readable error instead of crashing. #180

3.13.2 (2026-11-02)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • The only explicit initializer of a class that a macro such as SwiftData's @Model expands is no longer reported unused: implicit, macro-generated initializers no longer count against the sole-initializer rule. #173
  • CSV output: the Modifiers and Attributes columns are no longer swapped, and fields containing a comma, a double quote or a line break are quoted per RFC 4180. Rows of declarations with attributes change shape; the header is unchanged. Contributed by @badrisatyam1-ctrl. #176
  • GitHub Actions output escapes %, carriage returns and line feeds in messages, and : and , in the file and title properties, so a name or hint containing them no longer cuts the annotation short. #176
  • GitHub Markdown output escapes | and replaces line breaks in table cells, so each result stays on one row. #176

3.13.1 (2026-11-02)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • A long chain of references between declarations no longer crashes the scan with a stack overflow: used declarations are now marked with an explicit worklist instead of recursion. #172

3.13.0 (2026-11-01)#

Breaking#

  • Bazel support is removed: the Bazel module and rules, the --bazel scan mode and every --bazel-* option. Passing one of these options, or a bazel or bazel_* key in the configuration file, fails with an explicit error; agoodkind/periphery maintains a Bazel mode. #165

Enhancements#

  • Homebrew bottle: brew install tiny-earth-moon/tap/periphery pours a prebuilt bottle on Apple silicon with macOS 27 or later, instead of building from source. The bottle loads libIndexStore.dylib from /Applications/Xcode.app, or else from the Command Line Tools; with neither, brew reinstall --build-from-source periphery builds it locally. #123

Bug Fixes#

  • None.

3.12.16 (2026-11-01)#

Breaking#

  • None.

Enhancements#

  • Bazel: Swift protobuf targets (ProtobufAPIVersionCheckRetainer), Apple embedded targets and resource buckets, storyboard and XIB resource groups, and Core Data model paths, ported from agoodkind/periphery with the original author kept; two verification workflows scan the Bazel fixtures in CI. #122
  • String Catalog parse failures now carry a readable description with the catalog path. #122

Bug Fixes#

  • Declarations that only appear inside a platform conditional block (#if os, #if canImport, …) no longer retain themselves: the extended type of an extension, declared functions, protocols and type aliases are not collected as references anymore, so unused declarations in such blocks can be reported. #122

3.12.15 (2026-11-01)#

Breaking#

  • None.

Enhancements#

  • New opt-in detect_unused_asset_catalog_images / --detect-unused-asset-catalog-images: reports asset catalog images (.imageset, .symbolset) never referenced by their generated symbol, a string literal, a XIB/storyboard or Info.plist (unusedAssetCatalogImage); app icons are never reported. #81

Bug Fixes#

  • None.

3.12.14 (2026-11-01)#

Breaking#

  • None.

Enhancements#

  • New opt-in enable_redundant_public_members / --enable-redundant-public-members: extends the redundant public accessibility analysis to the members of public types, reporting a public member never referenced outside its module (protocol requirements, open, override, @inlinable and implicit members stay silent). #75
  • New opt-in enable_empty_extension_analysis / --enable-empty-extension-analysis: reports empty extensions (extension Foo {}, with only comments, @available or empty #if branches) by a syntactic pass, since the index store has no entry for them (emptyExtension). #74

Bug Fixes#

  • None.

3.12.13 (2026-11-01)#

Breaking#

  • None.

Enhancements#

  • New opt-in enable_unused_system_imports / --enable-unused-system-imports: reports unused imports of system frameworks (Foundation, AppKit, UIKit, …) using the system module units of the index store; an import that may re-export a used module is never reported. #95
  • New opt-in enable_redundant_access_level_analysis / --enable-redundant-access-level-analysis: reports access modifiers identical to the default of their context, such as internal at file level or fileprivate inside a private type (redundantAccessLevel). #87

Bug Fixes#

  • Setter access modifiers (private(set), internal(set)) are no longer taken as the declaration's access level: internal(set) public var now counts as public in every analysis, including the redundant public accessibility analysis. #87

3.12.12 (2026-11-01)#

Breaking#

  • Commands are run without a shell: each element of build_arguments, xcode_list_arguments and of the CLI arguments after -- is passed as exactly one argument. An element such as "-destination generic/platform=iOS" is no longer split by the shell and must be written as two elements. #143
  • The cache directory moves from ~/Library/Caches/com.github.peripheryapp to ~/Library/Caches/com.github.tiny-earth-moon.periphery; the cache is rebuilt on the next scan. #149

Enhancements#

  • New opt-in enable_open_final_analysis / --enable-open-final-analysis: reports open declarations never subclassed or overridden outside their module and non-final classes and members with no subclass or override (redundantOpenAccessibility, missingFinal). #72
  • Repository hardening: CI token restricted to read, actions pinned by commit, SECURITY.md, Dependabot, pinned Docker images; the upstream Bazel Central Registry publishing files are removed. #141
  • The swift-index-store and swift-filename-matcher dependencies are fetched from forks under this account, at the same revision and tag. #150

Bug Fixes#

  • Security: commands no longer run through /bin/bash -c; scheme names, paths, build arguments and Bazel queries are passed literally, so a crafted project or configuration can no longer execute code through the shell. The Bazel generated files move from the world-shared /var/tmp/periphery_bazel to a per-user directory under the cache. #143
  • Periphery no longer contacts api.periphery.pro after a scan (project line count was sent, with a promotional message). #140
  • The update check queries this repository's releases and no longer prints the upstream sponsor message. #139
  • The guided setup error links to this repository's README. #149

3.12.11 (2026-11-01)#

Breaking#

  • None.

Enhancements#

  • New opt-in enable_unassigned_optional_analysis / --enable-unassigned-optional-analysis: reports stored optional properties that are read but never assigned (always nil). #76
  • New retain_js_accessible / --retain-js-accessible: retains protocols inheriting from JavaScriptCore's JSExport, their members and the conforming members. #71
  • New retain_runtime_localized_keys / --retain-runtime-localized-keys (default false) to keep every String Catalog key when a runtime lookup has no literal prefix. #135

Bug Fixes#

  • 3.12.10 regression: a String(localized:) lookup with a non-literal key retained every key of every String Catalog, hiding all unused keys. Such lookups now retain nothing and log one warning per call site; a missing generated string symbols file falls back to literal detection instead of retaining the module's catalogs. #135
  • SwiftPM: hidden directories under a target are no longer picked up by the implicit xib / Core Data model discovery. Imported from agoodkind/periphery (author Alex Goodkind). #121

3.12.10 (2026-11-01)#

Breaking#

  • None.

Enhancements#

  • INFOPLIST_FILE build setting variables ($(PROJECT_DIR), $(TARGET_NAME), …) are expanded from the project; an unresolvable variable logs a warning and the plist is skipped for that target. #120

Bug Fixes#

  • SwiftUI @State reads under Xcode 27: top-level $state reads are retained; fixture and SPM test imported from agoodkind/periphery (author Alex Goodkind), single retention mechanism kept. #118
  • String Catalog: keys of runtime lookups are retained by literal prefix (scoped to the module for bundle: .module), keys referenced through Xcode 26+ generated string symbols are no longer all marked used, ternary keys pinned by imported tests (agoodkind/periphery, author Alex Goodkind). #120
  • An unreadable or missing String Catalog, xib, Info.plist, Core Data model or mapping model now raises an explicit error instead of being silently ignored. #120

3.12.9 (2026-11-01)#

Breaking#

  • None.

Enhancements#

  • New opt-in detect_unused_asset_catalog_colors / --detect-unused-asset-catalog-colors: reports unused Xcode asset catalog colors from GeneratedAssetSymbols.swift (indexed through a precise exception to index_exclude), one result per color with its .colorset path; colors referenced by name (string literals, xib/storyboard, global accent color) count as used. #80
  • examples/ directory with commented .periphery.yml scenarios. #79
  • README: ready-to-paste Xcode Run Script build phase (#90); merging the results of several build configurations explained as an intersection, with a jq recipe (#77); fork identity, Credits section and contribution rules for imports.

Bug Fixes#

  • Shell commands read stdout and stderr concurrently, no deadlock on large output. Imported from agoodkind/periphery (author Alex Goodkind). #117
  • Fixture and test pinning buildPartialBlock retention in result builders. Imported from agoodkind/periphery (author Alex Goodkind). #119

3.12.8 (2026-11-01)#

Breaking#

  • None.

Enhancements#

  • New retain_unused_parameters_without_default / --retain-unused-parameters-without-default option (default false): an unused function parameter with no default value is retained, since removing it is source-breaking for callers; parameters with a default value stay reported. #83

Bug Fixes#

  • None.

3.12.7 (2026-11-01)#

Breaking#

  • None.

Enhancements#

  • New retain_attributes / --retain-attributes option: declarations carrying one of the listed attributes (e.g. OptionGroup, objc) are retained as if annotated // periphery:ignore; the Attribute:kind1,kind2 form restricts it to declaration kinds. Kind identifiers are shared with report_exclude kinds; unknown kinds raise a usage error before the scan. #84

Bug Fixes#

  • None.

3.12.6 (2026-11-01)#

Breaking#

  • None.

Enhancements#

  • report_exclude entries may carry kinds ({path: "**/SharedKit/**", kinds: [unused.function, unused.var.parameter]} or the compact "**/SharedKit/**:unused.function,unused.var.parameter") so that only those result kinds are excluded under the matched paths; plain strings keep excluding everything. Unknown kinds raise a usage error before the scan. --report-exclude accepts the compact form. #86

Bug Fixes#

  • None.

3.12.5 (2026-11-01)#

Breaking#

  • None.

Enhancements#

  • Warn about source files of scanned targets that have no index data (paths listed with --verbose), and fail with an explicit error when no expected source file is indexed, instead of reporting "No unused code detected" on an unusable index. #93

Bug Fixes#

  • None.

3.12.4 (2026-11-01)#

Breaking#

  • None.

Enhancements#

  • New opt-in option retain_synthesized_uses / --retain-synthesized-uses (default false): stored properties of a struct whose instance is passed to print, debugPrint, dump, String(describing:), String(reflecting:) or interpolated into a string are retained (classes only through dump, recursive on nested structs; types with their own description and computed properties are excluded). Closes #85.
  • Regression test pins that a property used as a Dictionary key (then read through .keys) is referenced and not assign-only (upstream #412, already correct with Swift 6.4). Closes #85.

Bug Fixes#

  • None.

3.12.3 (2026-11-01)#

Breaking#

  • None.

Enhancements#

  • New option cache_max_age_days / --cache-max-age-days (default 14, 0 disables): after an Xcode scan, DerivedData-* folders of the Periphery cache unused for longer than this age are evicted and logged with their size; the current scan's folder is never evicted. Closes #82.

Bug Fixes#

  • periphery clear-cache removes the cache through FileManager instead of rm -rf, tolerates entries already gone, does not follow symbolic links and reports every path it could not remove. Closes #82.

3.12.2 (2026-11-01)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • periphery scan --skip-build without --index-store-path now falls back to Xcode's DerivedData index store (~/Library/Developer/Xcode/DerivedData/<Project>-*/Index.noindex/DataStore, newest first) and reports the paths tried when none exists. Closes #91.

3.12.1 (2026-10-31)#

Breaking#

  • None.

Enhancements#

  • Regression tests pin that declarations local to a live #Preview (locals, nested functions and the types they reference) are retained while a preview that only references dead code stays reported. Closes #92.
  • Regression tests pin protocol requirements implemented in extensions (conformance extension, separate extension, superclass extension, external protocols, init/subscript/static/associatedtype, conditional conformance, @objc optional requirements, AppIntents types, cross-module protocols); a member made redundant by a protocol default implementation stays reported. Closes #89.

Bug Fixes#

  • The sole explicit initializer of a class is no longer reported as unused: removing it would leave the class without any initializer and break the build when a stored property has no default value. Classes with several uncalled initializers and structs keep reporting them. Closes #88.

3.12.0 (2026-10-29)#

Breaking#

  • None.

Enhancements#

  • New opt-in localized_string_key_literal_match option (--localized-string-key-literal-match): any non-interpolated string literal equal to a String Catalog key marks that key as used, whatever its type or position, for code bases that carry keys as String. The README documents the collision risk and recommends LocalizedStringResource. Closes #66.
  • AppIntents localized literals are now detected: ParameterSummaryString (Summary, When/otherwise), IntentDialog, AppShortcutPhrase, and the @Parameter/@Property attribute arguments (title, description, request dialogs). Closes #68.
  • Regression tests pin that escaped characters (\", \t, \\, \u{…}, multi-line and raw literals) in catalogue keys are matched by their decoded value. Closes #64.

Bug Fixes#

  • None.

3.11.0 (2026-10-29)#

Breaking#

  • None.

Enhancements#

  • Interpolated string literals in localized positions ("Hello \(name)") are now matched to their String Catalog format keys (%@, %lld, %lf), the catalogue key being the reference. Closes #61.
  • Literals returned from switch/if expressions, functions, computed properties and closures typed LocalizedStringKey/LocalizedStringResource/String.LocalizationValue, as well as ternaries, labeled struct initializer arguments and typed array/tuple elements, are now retained as key usages. Closes #61.
  • New localized_string_key_patterns option (globs or /regex/) to declare keys built at runtime (e.g. quickChat.*) as used; documented in the README. Closes #61.

Bug Fixes#

  • None.

3.10.0 (2026-10-29)#

Breaking#

  • None.

Enhancements#

  • String Catalog key usage is now detected from the type of the receiving parameter (LocalizedStringKey, LocalizedStringResource, String.LocalizationValue, DisplayRepresentation, IntentDescription), covering Button, Label, Toggle, Section, .navigationTitle, Text and custom initializers, plus annotated declarations (static let x: LocalizedStringResource = "…"). Closes #58.
  • New localized_string_catalog_exclude option (globs) to skip catalogues from the unused-key analysis; **/InfoPlist.xcstrings and **/AppShortcuts.xcstrings are excluded by default. Interpolated and dynamic keys are documented as a known limitation in the README. Closes #58.

Bug Fixes#

  • None.

3.9.0 (2026-10-28)#

Breaking#

  • None.

Enhancements#

  • Unused String Catalog (.xcstrings) keys are now reported: keys never referenced by NSLocalizedString, String(localized:), LocalizedStringKey, Text("…") or Bundle.localizedString literals are flagged, with an opt-out disable_unused_localized_string_analysis. Keys used through generated symbols (String(localized: .key)), dynamic keys and SwiftUI initializers taking a LocalizedStringKey (Button, Label, .navigationTitle) are not yet tracked and may be reported as unused. Ported from upstream #893 by Ian Leitch. Closes #55.

Bug Fixes#

  • ExpressibleByArgument conformances in ScanCommand are spelled with their module, which silences the retroactive-conformance warnings under Bazel. Fixes #53.

3.8.10 (2026-10-28)#

Breaking#

  • None.

Enhancements#

  • CI re-enabled on GitHub Actions; tool pins aligned (swiftformat 0.64.2, swiftlint 0.65.1); dependencies bumped (xcodeproj 9.17.6, swift-argument-parser 1.8.2, swift-system 1.8.1, Yams 6.2.2, AEXML 4.7.3).

Bug Fixes#

  • #Preview expansions that preview a used SwiftUI view are now retained together with the code they reference, so helpers used only from a live preview are no longer reported as unused; previews of unused code stay unused. Fixes #15.
  • public members inside a non-public extension of a non-public type are now reported as redundant public accessibility; extensions of external types are assumed public. Fixes #45.

3.8.9 (2026-10-28)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • With Xcode 27, a SwiftUI @State property used only through its projected value ($foo) or backing storage (_foo) is no longer reported as unused. Fixes #36. Under Xcode 27 only @State is a macro (@Environment, @FocusState, @Binding, @AppStorage and others remain property wrappers); a property initialized via _foo = State(wrappedValue:) is also retained. Known limitation: the fix only applies with Xcode 27 (Swift 6.4); earlier toolchains do not exhibit the problem.
  • Retain every implicit result builder entry point: buildBlock of any arity, buildPartialBlock(first:) and buildPartialBlock(accumulated:next:). #30
  • The SPM driver now indexes .xcdatamodeld Core Data models, declared or implicit, under each target folder, so classes referenced only by a model (e.g. value transformers) are no longer reported as unused. Fixes #33.

3.8.8 (2026-10-27)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • The SPM driver now discovers implicit .xib and .storyboard resources under each target folder, so private @IBAction / @IBOutlet connected in Interface Builder are retained like in Xcode projects. Fixes #13.

3.8.7 (2026-10-27)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • public macro declarations are now visited and retained by --retain-public, as are associated types of public protocols. Fixes #7.

3.8.6 (2026-10-27)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • A declaration exposed through a public @resultBuilder from another module is no longer reported as redundant public (RedundantExplicitPublicAccessibilityMarker). Fixes #10.
  • Added a regression test for #8: retention under #if !os(...) (covered since 3.8.2).

3.8.5 (2026-10-27)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Run xcodebuild -list in Periphery's own DerivedData location (-IDECustomDerivedDataLocation) and honor --clean-build before listing schemes. Fixes #3. Port of peripheryapp/periphery#1147 by @lukaskollmer.

3.8.4 (2026-10-27)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Fix infinite recursion when expanding paths if a directory name begins with, or is exactly, **. Fixes #4. Port of peripheryapp/periphery#1145 by @ZevEisenberg.

3.8.3 (2026-10-26)#

Breaking#

  • None.

Enhancements#

  • Support Xcode 16+ file system synchronized groups (PBXFileSystemSynchronizedRootGroup), including membership exceptions. Fixes #6.

Bug Fixes#

  • Retain declarations marked @available(<platform>, unavailable) and declarations referenced only inside platform-conditional #if blocks (os, targetEnvironment, arch, canImport); opt out with --disable-platform-conditional-retention. Fixes #14.
  • Locate the SwiftPM index store with the Swift 6.4 swiftbuild backend (.build/out) as well as the native backend, via swift build --show-bin-path; clear error when no store is found. Fixes #2.

3.8.2 (2026-10-26)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Fix: deterministic DerivedData cache path (schemes were hashed from an unordered Set), #5 / upstream #1141.
  • Retain declarations marked @available(<platform>, unavailable) and declarations referenced only inside platform-conditional #if blocks (os, targetEnvironment, arch, canImport); opt out with --disable-platform-conditional-retention. Fixes #14.

3.8.1 (2026-10-25)#

Maintained fork (tiny-earth-moon/periphery) of the archived peripheryapp/periphery.

Breaking#

  • None.

Enhancements#

  • None. Maintained fork: builds with Xcode 27.1 / Swift 6.4; no functional change.

Bug Fixes#

  • None.

3.8.0 (2026-07-25)#

Breaking#

  • None.

Enhancements#

  • Added the --retain-equatable-properties and --retain-hashable-properties options to retain all properties on Equatable and Hashable types.
  • Expose a stable @periphery//bazel:generated package group so Bazel projects can grant visibility to Periphery's generated scan target and use --bazel-check-visibility safely.
  • Added a --bazel-query option to override the default Bazel top-level target query.

Bug Fixes#

  • Follow embedded bundle and plugin edges transitively in the generated Bazel scan rule so custom Bazel queries can avoid building incorrectly transitioned targets while still analyzing extension- and plugin-reachable code.
  • The --write-results file is now written even when a scan produces no results, instead of being left absent from a prior run.

3.7.4 (2026-04-26)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Fix Homebrew releases.

3.7.3 (2026-04-25)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Fix mixed Swift/Objective-C indexing failures caused by non-Swift symbols being processed from the index store, which could trigger unknown extension reference errors and duplicate declaration conflicts.

3.7.2 (2026-03-31)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Fix Homebrew Linux builds failing to link libIndexStore when Swift is resolved through shimmed toolchain paths.

3.7.1 (2026-03-31)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Fix runtime crash due to absolute libIndexStore.dylib path in pre-built binary.
  • Fix building on Linux with SwiftPM and non-standard Swift install location for Homebrew release.

3.7.0 (2026-03-30)#

Breaking#

  • None.

Enhancements#

  • Added support for Bazel 9.x.

Bug Fixes#

  • Fix false positive redundant public accessibility for types used in typed throws clauses, e.g. throws(MyError).
  • Fix false positive superfluous ignore comment results for assign-only properties.
  • Fix incorrect generic protocol extension handling in Swift 6.2.4.

3.6.0 (2026-02-18)#

Breaking#

  • The minimum supported Swift version is now 6.1.2.

Enhancements#

  • Added the --bazel-check-visibility to disable passing --check_visibility=false to bazel run.

Bug Fixes#

  • Fix some causes of potentially non-deterministic results.
  • Fix incorrect superfluous ignore comment results for protocol members.

3.5.1 (2026-02-15)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Fix false positive redundant public accessibility for types used in same-type generic requirements on extensions, e.g. extension SomeProtocol where Self == MyType.
  • Exclude declarations ignored by a file-level // periphery:ignore:all comment from superfluous ignore comment detection.
  • Superfluous ignore comment results are now included in baselines.

3.5.0 (2026-02-11)#

Breaking#

  • The --no-color option has been replaced with --color=never.

Enhancements#

  • The --color option now accepts one of auto, always and never. In auto mode, color is disabled for dumb terminals and non-TTYs.
  • Added detection of superfluous // periphery:ignore comments. A result is now reported when an ignore comment is unnecessary because the declaration is actually used. Can be disabled with --no-superfluous-ignore-comments.
  • More unused code is now reported in a single scan, rather than requiring repeated remove-and-rescan cycles.

Bug Fixes#

  • Fix IBAction methods with named parameters or no parameters incorrectly marked as unused.
  • Fix --retain-swift-ui-previews for the #Preview macro.

3.4.0 (2026-01-06)#

Breaking#

  • None.

Enhancements#

  • Added the --no-color/--color option to disable/enable colored output.
  • Added the --no-retain-spi option to not retain the given SPI (System Programming Interface) attributed members when using --retain-public.
  • Exclude wrapped properties from assign-only analysis, as Periphery cannot observe the behavior of the property wrapper.
  • Improved the readability of result messages.
  • Improved Interface Builder file parsing to detect unused @IBOutlet, @IBAction, @IBInspectable, and @IBSegueAction members. Previously, all @IB* members were blindly retained if their containing class was referenced in a XIB or storyboard.

Bug Fixes#

  • Fix redundant public accessibility false positive for types referenced via static members in property initializers.
  • Fix inline ignore comment not working on properties.
  • Fix false positive when a constrained protocol extension provides a default implementation that satisfies a requirement of the constraining protocol.
  • Fix indexing of xib/storyboard files in SPM projects.
  • Fix types conforming to App Intents protocols being reported as unused.
  • Fix superclass initializer reported as unused when called on subclass.
  • Fix unused parameter false-positive for parameters used in closure capture lists.
  • Fix sorting of results with a location override.

3.3.0 (2025-12-13)#

Breaking#

  • None.

Enhancements#

  • Added the --retain-unused-imported-modules option.
  • Added the --format gitlab-codemagic formatting option for GitLabs Code Quality artifact reports
  • Added the --bazel-index-store option to specify the path of a global index store.

Bug Fixes#

  • Fix concurrent mutation crash.
  • Fix unused import false-positive for when a declaration's associated types are declared in different module than module that declares the declaration.
  • Fix unused import false-positive for modules that export unindexed modules.
  • Exclude conditionally imported modules from unused import detection, as they may provide symbols for code that was not compiled.
  • Fix --retain-assign-only-property-types for properties with trailing comments.
  • Fix unused parameter analysis for parameters with name enclosed by backticks.
  • Fix indexing of Xcode resources (storyboards, etc.) in projects using file system folders.
  • Fix infinite loop loading Xcode projects with circular references.

3.2.0 (2025-06-27)#

Breaking#

  • The bazel-out directory is no longer automatically excluded from results to allow for the detection of unused code in generated files. Use --report-exclude "**/bazel-out/**/*" to apply the previous behavior.

Enhancements#

  • Added the --write-results <file> option.
  • Added the github-markdown output format.
  • Added the ability to override the result location and kind with a comment command. This can be used in cases where the unused code exists in a generated source file, but the code to be removed exists in another file.
    // periphery:override location="some/dir/en.lproj/Feature.strings:1:1" kind="localized string"
    var generatedProperty: String = "abc123"
    
    some/dir/en.lproj/Feature.strings:1:1: warning: Localized string 'generatedProperty' is unused
    

Bug Fixes#

  • Fix unused import false-positives where the only referenced declaration is generated by a macro.
  • Fix building with Bazel on Linux by excluding Xcode support.
  • Fix slow baseline filtering for large projects with many results.
  • Fix inconsistent unused parameter results when the function is declared in a file that is a member of multiple targets.
  • Fix inconsistent results caused by identical extensions declared in different modules.
  • Static @_dynamicReplacement members are now retained.
  • Fix possible concurrent mutation crash when accessing filename matching configuration options.

3.1.0 (2025-04-05)#

Breaking#

  • Assign-only property analysis is disabled with Swift 6.1 due to a Swift bug: https://github.com/swiftlang/swift/issues/80394.

Enhancements#

  • Comment commands can now be placed inline with declarations:
    class Foo { // periphery:ignore
      ...
    }
    

Bug Fixes#

  • Unused parameter warnings are suppressed in @available(*, unavailable) functions.
  • Fix handling of Xcode projects with single and double quotes in their path and scheme names.
  • @_dynamicReplacement members are now retained.
  • Fix infinite loading of circular Xcode project references.

3.0.3 (2025-03-15)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Rebuilt defective release binary.

3.0.2 (2025-03-03)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Updated XcodeProj dependency provides support for Xcode 16's new project format.
  • Fix retain comment commands for imports.

3.0.1 (2024-12-28)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • A clean build is no longer required when a file is deleted from the scanned project.

3.0.0 (2024-12-27)#

Breaking#

3.0 is a major breaking change and requires some manual migration, please see the 3.0 Migration Guide.

  • Support for installing via CocoaPods has been removed.
  • Removed support for Swift 5.9/Xcode 15.2.
  • Periphery is now available directly from Homebrew, and the peripheryapp/periphery tap is no longer updated. To migrate run the following:
brew remove periphery
brew untap peripheryapp/periphery
brew update
brew install periphery

Enhancements#

  • Added support for Swift Testing.

Bug Fixes#

  • Fix numerous issues where generated code could not be scanned.
  • Fix support for Xcode's new folder format.
  • Fix cloning private Swift package repositories.

2.21.2 (2024-11-01)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Fix parsing of Xcode 16 projects.

2.21.1 (2024-09-28)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Enums with the @main attribute are now retained.
  • Fixed issue in Swift 6 where declarations that override external type members are incorrectly identified as unused.
  • Unused public/exported imports are excluded from the results even if unused in the declaring file as the exported symbols may be referenced in other files, and thus removing the import would result in a build failure.

2.21.0 (2024-06-15)#

Breaking#

  • Removed support for Swift 5.8/Xcode 14.3.

Enhancements#

  • Added baseline support. Write a baseline with --write-baseline <file> and use it with --baseline <file>.

Bug Fixes#

  • Fix local Swift package support.

2.20.0 (2024-05-29)#

Breaking#

  • None.

Enhancements#

  • Added GitHub Actions output formatter.

Bug Fixes#

  • Disable unused import analysis for files retained with --retain-files.
  • Fix handling of Xcode project paths containing spaces.
  • Fix bug causing non-deterministic results for structs with implicit initializers.

2.19.0 (2024-05-20)#

Breaking#

  • None.

Enhancements#

  • Unused import detection is now enabled by default.
  • Added the --retain-encodable-properties option to retain all properties on Encodable types only.
  • Added the --xcode-list-arguments option to pass additional arguments to xcodebuild -list.
  • Added the --skip-schemes-validation option to skip validation of Xcode schemes.

Bug Fixes#

  • @State and @Binding properties are now excluded from assign-only property analysis.
  • Unused imports are now detected in files containing no references.

2.18.0 (2024-01-21)#

Breaking#

  • The command-line parsing strategy for options that were delimited by a pipe or comma has changed. These options are now parsed as a space delimited list, e.g --option "arg1" "arg2".
  • The option --external-encodable-protocols is deprecated, use --external-codable-protocols instead.

Enhancements#

  • Add experimental unused import analysis option --enable-unused-import-analysis.
  • Add experimental automatic code removal option --auto-remove.
  • Assign-only properties on structs with synthesized initializers are now detected.
  • Added the --retain-codable-properties option to retain all properties on Codable types.
  • Results for redundant protocol conformances will now list the inherited protocols that should replace the redundant conformance, if any.
  • Added the --retain-files option to retain all declarations within the given files.

Bug Fixes#

  • Subscript functions required by @dynamicMemberLookup are now retained.
  • A newline is no longer printed before non-Xcode formatted results.
  • --external-codable-protocols now retains enums that conform to CodingKey.
  • Fix public accessibility false-positive for actors.
  • Fix public accessibility false-positive for property wrappers.
  • Fix public accessibility false-positive for declarations referenced from a public @inlinable function.
  • Fix public accessibility false-positive for function parameter default values.
  • Fix public accessibility false-positive for inherited and default associated types.
  • Fix public accessibility false-positive for generic types used in the generic argument clause of a return type.
  • Fix public accessibility false-positive for retained/ignored declarations.
  • Fix public accessibility false-positive for enum case parameter types.
  • Fix public accessibility false-positive for properties initialized with generic specialized types.
  • Types associated with assign-only properties are no longer identified as unused until the property is removed.
  • Classes referenced in Info.plist as NSPrincipalClass and WKExtensionDelegateClassName are now retained.

2.17.1 (2023-12-04)#

Breaking#

  • None.

Enhancements#

  • Add support for indexing plist files via the generic --file-targets-path option.

Bug Fixes#

  • None.

2.17.0 (2023-11-23)#

Breaking#

  • None.

Enhancements#

  • Added the --relative-results option to output result paths relative to the current directory.
  • --quiet now silences warnings too.

Bug Fixes#

  • Fix redundant public accessibility analysis for protocol members declared in extensions that are referenced cross-module where the protocol itself is not.
  • Remove checks causing errors when scanning multi-platform projects.
  • Additional arguments passed through to xcodebuild/swift are now quoted automatically as needed.

2.16.0 (2023-09-27)#

Breaking#

  • None.

Enhancements#

  • SwiftUI previews (PreviewProvider) are no longer retained by default. Retain them with --retain-swift-ui-previews.

Bug Fixes#

  • Fix retaining members of public generic protocol extensions with --retain-public.

2.15.1 (2023-09-17)#

Breaking#

  • None.

Enhancements#

  • Swift 5.9 support.

Bug Fixes#

  • Path forward slashes in JSON output formats are no longer escaped.
  • INDEX_ENABLE_DATA_STORE is now forcefully enabled as it's required for indexing in some cases.

2.15.0 (2023-07-04)#

Breaking#

  • Swift 5.7 and macOS 12 are no longer supported.

Enhancements#

  • Reduced indexing and analysis runtime by ~60%.

Bug Fixes#

  • Fix indexing multi-platform projects such as those containing watchOS extensions.
  • Subclasses of CLKComplicationPrincipalClass referenced from an Info.plist are now retained.

2.14.1 (2023-06-25)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Revert SwiftPM binary command plugin. Sorry folks, but SwiftPM doesn't provide the appropriate permissions for Periphery to build projects in the sandbox.

2.14.0 (2023-06-24)#

Breaking#

  • None.

Enhancements#

  • Add the --retain-objc-annotated option.
  • Added support for SwiftPM binary command plugin.

Bug Fixes#

  • None.

2.13.0 (2023-05-14)#

Breaking#

  • None.

Enhancements#

  • Improve indexing performance when multiple index stores are provided.
  • Added --external-test-case-classes option to allow external types to be treated as XCTestCase subclasses.
  • Comment commands now support trailing comments, e.g // periphery:ignore - explanation of why this is necessary

Bug Fixes#

  • Fix handling of relative paths in --file-targets-path.
  • Fix redundant public accessibility false positives when --retain-objc-accessible is enabled.

2.12.3 (2023-03-22)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Fix index/report exclude regression.

2.12.2 (2023-03-19)#

Breaking#

  • None.

Enhancements#

  • Significantly improve the performance of index and report filtering.
  • Moderate improvements to indexing and analysis performance.

Bug Fixes#

  • COMPILER_INDEX_STORE_ENABLE is now forcefully enabled as it's required for indexing.
  • Fix false positive where a typealias is extended but otherwise unused.
  • Fix redundant accessibility analysis for function metatype arguments.
  • Fix redundant accessibility analysis for property types inferred from a function call initializer.

2.12.1 (2023-03-04)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Fix JSON deserialization crash caused by unrelated warnings in the output from xcodebuild -list -json.
  • Retain all @MainActor annotated types and their constructors to workaround a bug in Swift 5.7.
  • Retain all constructors on types instantiated via Self(...) to workaround false positives caused by a bug in Swift.
  • Set<AnyCancellable> and NSKeyValueObservation are now included in the default values for --retain-assign-only-property-types.
  • Improve accuracy of guard-let shorthand workaround.
  • Fix unused parameter false positive result for parameter used within a nested computed variable.

2.12.0 (2023-01-13)#

Breaking#

  • None.

Enhancements#

  • Add CodeClimate output formatter available via the --format codeclimate option.
  • Add support for third-party build systems, such as Bazel.

Bug Fixes#

  • Enums that conform to SwiftUI special Provider protocols are now retained, as was already the case for structs and classes.

2.11.0 (2023-01-08)#

Breaking#

  • None.

Enhancements#

  • Add clear-cache command.
  • Add support for analyzing local SwiftPM packages in Xcode projects.

Bug Fixes#

  • AnyCancellable properties are now excluded from assign-only property analysis.

2.10.3 (2023-01-02)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Fix retaining CodingKeys enum in a struct whose Codable conformance is declared in an extension.
  • Used tagged dependencies to prevent "unsafe build flags" error from SwiftPM.
  • Fix old index store use by including Xcode version hash in DerivedData directory name.

2.10.2 (2022-11-27)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Fix guard-let shorthand syntax.
  • Fix accuracy of unused parameter analysis for overridden and protocol conforming functions.
  • Fix retaining buildFinalResult(_:) and buildLimitedAvailability(_:) result builder methods.

2.10.1 (2022-11-20)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Fix error building with SwiftPM and Swift 5.7: the target 'PeripheryKit' in product 'periphery' contains unsafe build flags
  • Fix unused parameter analysis for shorthand if-let syntax.
  • Workaround Swift shorthand if-let syntax bug (https://github.com/apple/swift/issues/61509). Global properties are not handled by this workaround.
  • Fix retaining inferred associated types.
  • Fix redundant public accessibility analysis for types used in closure signatures.
  • Conflicting index store units are now detected and result in an error.

2.10.0 (2022-10-10)#

Breaking#

  • Swift 5.6 or later is now required.

Enhancements#

  • Add --report-include option to filter reported violations with an allowlist.
  • Support for reading Xcode 14 generated index stores.

Bug Fixes#

  • None.

2.9.0 (2022-05-08)#

Breaking#

  • Swift 5.5 or later is now required.

Enhancements#

  • Add support for Swift 5.6.
  • Output is now line buffered when writing to a fifo/pipe.

Bug Fixes#

  • IBSegueAction annotated functions are now retained.

2.8.6 (2022-01-06)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Fix another crash while indexing.

2.8.5 (2022-01-03)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Fix a crash while indexing.

2.8.4 (2021-12-30)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Fix false positive when protocols requirements are satisfied in another file from the one that declares the conformance.
  • Fix redundant public accessibility analysis of enum associated value types.
  • Fix redundant public accessibility analysis of aliased types.
  • Comment commands can now retain redundant protocols.
  • Fix excluding paths that contain relative components, e.g --report-exclude "../file.swift".

2.8.3 (2021-11-29)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Fix false positive when a class inherits a class with the same name from another module.
  • Retain parameters on protocol function members implemented by an external type.
  • Unused function parameters on unimplemented protocol function members are now retained, as the function may still be referenced from an existential type.
  • Fix incorrect redundant public accessibility on a public superclass when a subclass is used in another module.
  • Result Builder static methods are now retained.
  • Assign-only properties that are assigned multiple times in the same method are now correctly identified as assign-only.
  • Fix issue where properties with identical names at different scopes could cause inconsistent results from assign-only property analysis.

2.8.2 (2021-11-06)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • The DEVELOPER_DIR environment variable is now respected.
  • Updated XcodeProj dependency resolves building with Xcode 13.

2.8.1 (2021-08-01)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Fix comment ignore command for properties with multiple bindings.

2.8.0 (2021-07-23)#

Breaking#

  • --index-exclude and --report-exclude options now accept Bash version 4 glob syntax. Therefore, recursive globs "**" are now supported.

Enhancements#

  • SwiftUI @(UI/NS)ApplicationDelegateAdaptor wrapped properties and now retained.
  • All file types can now be excluded from indexing.

Bug Fixes#

  • None.

2.7.1 (2021-07-04)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Fix crash caused by cyclic inherited type references.

2.7.0 (2021-06-29)#

Breaking#

  • None.

Enhancements#

  • NSEntityMigrationPolicy subclasses referenced by .xcmappingmodel are now retained.
  • ValueTransformer subclasses referenced by .xcdatamodeld are now retained.
  • Properties of types directly or indirectly conforming to Encodable are now automatically retained. The --external-encodable-protocols option has been added to instruct Periphery that the specified external protocols also inherit Encodable.

Bug Fixes#

  • Fix --index-exclude resulting in an error about unindexed files.
  • Fix an error during guided setup when xcodebuild is not setup for command line use.
  • CodingKey enums of Encodable conforming types are now also retained like Decodable types.
  • Fix detection of assign-only properties when the getter is shadowed by a parameter with the same name.

2.6.0 (2021-06-08)#

Breaking#

  • Removed support for Swift <= 5.2.

Enhancements#

  • Using an index store that does not contain complete data for the requested targets now results in an error.
  • The --index-store-path option now implies --skip-build.
  • Guided setup now omits the --targets option from the generated command when 'all' targets are selected for SwiftPM projects.
  • Add option to guided setup to save the configuration to '.periphery.yml'.

Bug Fixes#

  • Fix parsing INFOPLIST_FILE references containing $(SRCROOT).

2.5.2 (2021-06-03)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Fix erroneous results for explicit 'getter' accessors.

2.5.1 (2021-06-02)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Fix an issue where scans with many schemes could breaking loading of the index store.

2.5.0 (2021-05-27)#

Breaking#

  • None.

Enhancements#

  • Add redundant public accessibility analysis.
  • Add arm64 support.
  • Add --retain-assign-only-property-types option to retain assign-only properties based on their type.
  • Declarations in an entry point file (e.g main.swift) are no longer blindly retained, even if unused.
  • Additional arguments passed to xcodebuild can now override the default set of environment based arguments.

Bug Fixes#

  • Fix issue where protocol property references could be incorrectly associated with the getter/setter rather than the property itself, leading to erroneous results.
  • Fix unused parameter false positive result for identical function signatures at the same location in different files.

2.4.3 (2021-03-05)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Retain constructors of generic structs that cannot be identified as used due to Swift bug SR-7093.

2.4.2 (2021-02-11)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • In Swift 5.3 and lower, all optional protocol members are now retained in order to workaround a Swift bug. This bug is resolved in Swift 5.4.
  • Cases of public enums are now also retained when using --retain-public.
  • Open method parameters are now also retained when using --retain-public.
  • Empty public protocols that have an implementation in extensions are no longer identified as redundant.
  • Foreign protocol method parameters are no longer identified as unused.

2.4.1 (2020-12-20)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Fix ignore comments on protocol declarations.

2.4.0 (2020-12-19)#

Breaking#

  • The --xcargs option has been removed, and superseded by passing arguments following the -- terminator. E.g periphery scan --xcargs --foo is now periphery scan -- --foo. This feature can also be used to pass arguments to swift build for SwiftPM projects.

Enhancements#

  • None.

Bug Fixes#

  • None.

2.3.3 (2020-12-17)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Improve unused parameter location identification.

2.3.2 (2020-12-10)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Fix indexing failure on unhandled declaration kinds, such as 'commentTag'.
  • --retain-objc-accessible also retains private declarations explicitly attributed with @objc.

2.3.1 (2020-12-06)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Fix crash during indexing phase.

2.3.0 (2020-12-05)#

Breaking#

  • JSON and CSV output formats have changed to reflect the fact that declarations can have multiple IDs if they're members of multiple build targets.
  • Declarations accessible by the Objective-C runtime are no longer retained by default. The --no-retain-objc-annotated option has been removed, and --retain-objc-accessible added.

Enhancements#

  • Protocols that are never used as an existential type are now explicitly identified as redundant rather than simply unused, which could be confusing.
  • Add --clean-build flag to clean build artifacts before the build step.
  • Add support for files that are members of multiple build targets. Such files no longer produce erroneous results.

Bug Fixes#

  • Protocol members whose implementation is provided by an external type, yet aren't referenced via a value type are now identified as unused.
  • @IBInspectable properties are now retained.
  • Declarations ignored with a '// periphery:ignore' comment now also retain their references to other declarations.
  • Fix running Periphery from within Xcode where Xcode's environment variables could cause build failures or incorrect results.
  • Fix an issue where a protocol could incorrectly retain references to methods in an unused conforming declaration.

2.2.2 (2020-11-23)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Extension classes referenced in Info.plist as NSExtensionPrincipalClass are now retained.

2.2.1 (2020-11-22)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Fix unused parameter identification when surrounded with backquotes.

2.2.0 (2020-11-21)#

Breaking#

  • None.

Enhancements#

  • Add support for SwiftPM & Xcode mixed projects.

Bug Fixes#

  • None.

2.1.1 (2020-11-18)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • IBOutlets and IBActions that reside in a base class that are referenced only via a subclass are now retained.

2.1.0 (2020-11-14)#

Breaking#

  • None.

Enhancements#

  • Added a Checkstyle output formatter.

Bug Fixes#

  • Fix Swift 5.2 support.
  • Updated Yams dependency to fix building with Swift for Tensorflow.
  • Fix possible concurrent mutation crash.
  • Classes & structs that conform to SwiftUI's LibraryContentProvider are now retained.

2.0.1 (2020-11-10)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Fix version number.

2.0.0 (2020-11-10)#

Breaking#

  • SourceKit based indexing has been removed, the IndexStore indexer is now the sole indexer. Therefore, the following scan options have been removed: --use-index-store, --use-build-log, --save-build-log.
  • The scan-syntax command has been removed.

Enhancements#

  • Support for code comments to ignore unused declarations.
  • Support for analyzing Swift Package Manager projects.
  • Linux support for Swift Package Manager projects.
  • Assign-only property detection is back and enabled by default. Disable it with --retain-assign-only-properties.
  • Added --skip-build option to skip the build phase.

Bug Fixes#

  • UISceneDelegateClassName & UISceneClassName referenced in Info.plist are now retained.
  • Ignore parameters from functions annotated with @IBAction.
  • Classes & structs that conform to SwiftUI's PreviewProvider are now retained.
  • Support @main entry points.
  • Fix unused recursive function detection when using the index store.
  • Properties named in struct implicit constructors are now retained.
  • Implicit declarations such as struct constructors are now retained.
  • A typealias that defines an associatedtype in an external protocol is now retained.
  • All custom appendInterpolation methods are now retained, as they cannot be identified as unused due to https://github.com/apple/swift/issues/56189
  • Fixed path resolution for nested projects in Xcode workspaces.
  • wrappedValue and projectedValue properties in property wrappers are now retained.
  • XCTestManifests.swift is now treated as an entry point file like LinuxMain.swift.
  • Updated XcodeProj dependency to resolve some Xcode project parsing issues.

1.8.0 (2020-10-3)#

Breaking#

  • Aggressive Mode has been removed as it provided little value.
  • Removed undocumented diagnosis console feature.

Enhancements#

  • Add Xcode 12 support.

Bug Fixes#

  • Fixed an issue where implicit declarations inserted by SourceKit could cause incorrect results.

1.7.1 (2020-04-18)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Fix --exclude option for scan-syntax.
  • Bundle lib_InternalSwiftSyntaxParser.dylib in the release archive.

1.7.0 (2020-04-17)#

Breaking#

  • None.

Enhancements#

  • Support for Xcode 11.4, Swift 5.2.
  • Experimental IndexStore based indexer.

Bug Fixes#

  • Fix shell escaping issues.

1.6.0 (2020-03-28)#

Breaking#

  • None.

Enhancements#

  • Add support for Xcode 11.3.

Bug Fixes#

  • None.

1.5.1 (2019-07-06)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Fix CocoaPod.

1.5.0 (2019-07-06)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Xcode 10.2 compatibly.

1.4.0 (2019-03-02)#

Breaking#

  • None.

Enhancements#

Bug Fixes#

1.3.0 (2019-02-10)#

Breaking#

  • First open-source release.

Enhancements#

  • None.

Bug Fixes#

  • None.

1.2.3 (2019-01-05)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Don't attempt to syntax scan directories ending with .swift.
  • Detect invalid xcodeproj references.

1.2.2 (2018-12-19)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Fix infinate loop from parsing projects with cyclic references.

1.2.1 (2018-12-12)#

Breaking#

  • None.

Enhancements#

  • Improve performance of scan-syntax command.

Bug Fixes#

  • Fix parsing of #warning and #error directives.

1.2.0 (2018-12-11)#

Breaking#

  • None.

Enhancements#

  • Unused function prameter analysis.
  • Terminate all child processes on SIGINT.
  • Exclude pod schemes from guided setup.
  • Remove retain ObjC question from guided setup.

Bug Fixes#

  • Avoid passing 'CURRENT_ARCH' and 'arch' environment variables to xcodebuild when their value is 'undefined_arch'.

1.1.3 (2018-11-10)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Improved target module name identification.

1.1.2 (2018-10-31)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Fix crash when inspecting project configuration for nested .xcodeproj.
  • Detect .xcodeproj referenced from within groups in an .xcworkspace.

1.1.1 (2018-10-26)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Projects nested within other projects are now identified.

1.1.0 (2018-10-29)#

Breaking#

  • None.

Enhancements#

  • Label results identified by aggressive mode.
  • Add compiler flags to speed up build phase.
  • Schemes are built in the order they're given.
  • Add error hint for CocoaPods bug #8000.
  • Add support for YAML configuration.

Bug Fixes#

  • Retain XCTestCase classes that do not directly inherit XCTestCase.

1.0.0 (2018-10-20)#

Breaking#

  • None.

Enhancements#

  • No more trial mode - 100% of results are now free. Advanced features require a Pro license.

Bug Fixes#

  • Fixed issue with poor performance resulting in a segmentation fault.

0.12.2 (2018-09-27)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Ensures Xcode is configured for command-line use.

0.12.1 (2018-09-26)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Built with a static Swift stdlib.
  • Ignore xcworkspace generated by Swift Package Manager inside the xcodeproj.

0.12.0 (2018-09-24)#

Breaking#

  • None.

Enhancements#

  • Support for saving, and using build logs in order to skip the build phase.
  • All output format types are now available in trial mode.

Bug Fixes#

  • Unused code with cyclic dependencies is now detected.
  • Protocol declarations implemented in a subclass of the conforming class are now identified as used.
  • Protocols that inherit a foreign protocol (e.g from Foundation) are now treated differently than other protocols, as Periphery cannot detect declarations that are used internally by the foreign module. For example, if your class conforms to Comparable and implements <(lhs:rhs:), the behavior of sort() may be altered, yet Periphery does not have visibility of any directs call to <(lhs:rhs:).

0.11.2 (2018-08-07)#

Breaking#

  • None.

Enhancements#

  • --report-exclude and --index-exclude options now expect a pipe character to delimit multiple globs.

Bug Fixes#

  • None.

0.11.1 (2018-08-06)#

Breaking#

  • None.

Enhancements#

  • Identify LinuxMain.swift as an entry point.

Bug Fixes#

  • Fix regression of handling schemes and targets containing spaces.

0.11.0 (2018-08-04)#

Breaking#

  • None.

Enhancements#

  • Added tips for eliminating false positives in trial mode.
  • Added check-update command.
  • Added ability to exclude files either from indexing or final report.

Bug Fixes#

  • None.

0.10.0 (2018-07-10)#

Breaking#

  • None.

Enhancements#

  • Added support for Xcode 10.
  • Warn about source files that are members of multiple targets.
  • Diagnosis console now lists active references as their source location.

Bug Fixes#

  • Fixed issue where error messages would not be printed before Periphery exits.

0.9.0 (2018-06-22)#

Breaking#

  • None.

Enhancements#

  • Added guided setup flow.

Bug Fixes#

  • None.

0.8.1 (2018-06-13)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Handle explicitly defined PRODUCT_MODULE_NAME.

0.8.0 (2018-06-12)#

Breaking#

  • None.

Enhancements#

  • Added support for Xcode's new build system.
  • Added support for analyzing XCTest targets.
  • Added interactive diagnosis console, enabled with the --diagnose option.
  • Licenses can now be activated using --email and --key options instead of entering them interactively.

Bug Fixes#

  • Improve parsing of xcodebuild -list output.
  • Type aliases that define an associated type are now identified as used.

0.7.3 (2018-05-11)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Workaround issue with xcodebuild using non-UTF8 encoding.

0.7.2 (2018-05-03)#

Breaking#

  • None.

Enhancements#

  • Enable analysis of CocoaPod targets.

Bug Fixes#

  • None.

0.7.1 (2018-05-01)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Improve scheme identification for older workspaces.
  • Fix handling of source files containing single quotes.
  • Fix handling of paths to swiftc that contain hyphens e.g Xcode-9.3.app.

0.7.0 (2018-04-29)#

Breaking#

  • None.

Enhancements#

  • Disabled code signing as it's not necessary and can cause build failures.
  • Schemes are no longer required to be marked as shared in order to be discovered.

Bug Fixes#

  • Fixed discovery of xibs/storyboards that reside within a Base.jproj.
  • Fix retention of protocol declarations with a default implementation within an extension.

0.6.2 (2018-04-26)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Correctly handle projects containing spaces their PRODUCT_NAME.
  • Add support for missing declaration kinds.

0.6.1 (2018-04-25)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Improve xcodebuild swiftc argument parsing such that CoreData generated model file arguments are retained.
  • Improved invalid scheme error message.

0.6.0 (2018-04-21)#

Breaking#

  • None.

Enhancements#

  • Added trial mode.

Bug Fixes#

  • None.

0.5.0 (2018-04-17)#

Breaking#

  • The --retain-all-enum-cases option has been removed. Unused cases of enums that are not raw representable are always identified. Unused cases of raw representable enums are now implicitly used since their use may be completely dynamic. --aggressive analysis disables this implicit behavior.
  • The --retain-objc-annotated option is now enabled by default.

Enhancements#

  • Xcode format output is colored to improve readability.

Bug Fixes#

  • CodingKey enums are now correctly identified as used if the enclosing class or struct conforms to Decodable.

0.4.0 (2018-04-16)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Fix retention of declarations marked @IBOutlet or @IBAction.

0.3.0 (2018-04-14)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Fix issue parsing Xcode projects that contained groups without an associated physical directory.

0.2.0 (2018-04-09)#

Breaking#

  • None.

Enhancements#

  • None.

Bug Fixes#

  • Added --project option for use with projects that do not have an .xcworkspace.

0.1.0 (2018-04-07)#

  • Initial release.

Generated from CHANGELOG.md, filled by each release.