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
- 3.18.0 (2026-11-04)
- 3.17.0 (2026-11-04)
- 3.16.1 (2026-11-03)
- 3.16.0 (2026-11-03)
- 3.15.0 (2026-11-03)
- 3.14.1 (2026-11-03)
- 3.14.0 (2026-11-02)
- 3.13.4 (2026-11-02)
- 3.13.3 (2026-11-02)
- 3.13.2 (2026-11-02)
- 3.13.1 (2026-11-02)
- 3.13.0 (2026-11-01)
- 3.12.16 (2026-11-01)
- 3.12.15 (2026-11-01)
- 3.12.14 (2026-11-01)
- 3.12.13 (2026-11-01)
- 3.12.12 (2026-11-01)
- 3.12.11 (2026-11-01)
- 3.12.10 (2026-11-01)
- 3.12.9 (2026-11-01)
- 3.12.8 (2026-11-01)
- 3.12.7 (2026-11-01)
- 3.12.6 (2026-11-01)
- 3.12.5 (2026-11-01)
- 3.12.4 (2026-11-01)
- 3.12.3 (2026-11-01)
- 3.12.2 (2026-11-01)
- 3.12.1 (2026-10-31)
- 3.12.0 (2026-10-29)
- 3.11.0 (2026-10-29)
- 3.10.0 (2026-10-29)
- 3.9.0 (2026-10-28)
- 3.8.10 (2026-10-28)
- 3.8.9 (2026-10-28)
- 3.8.8 (2026-10-27)
- 3.8.7 (2026-10-27)
- 3.8.6 (2026-10-27)
- 3.8.5 (2026-10-27)
- 3.8.4 (2026-10-27)
- 3.8.3 (2026-10-26)
- 3.8.2 (2026-10-26)
- 3.8.1 (2026-10-25)
- 3.8.0 (2026-07-25)
- 3.7.4 (2026-04-26)
- 3.7.3 (2026-04-25)
- 3.7.2 (2026-03-31)
- 3.7.1 (2026-03-31)
- 3.7.0 (2026-03-30)
- 3.6.0 (2026-02-18)
- 3.5.1 (2026-02-15)
- 3.5.0 (2026-02-11)
- 3.4.0 (2026-01-06)
- 3.3.0 (2025-12-13)
- 3.2.0 (2025-06-27)
- 3.1.0 (2025-04-05)
- 3.0.3 (2025-03-15)
- 3.0.2 (2025-03-03)
- 3.0.1 (2024-12-28)
- 3.0.0 (2024-12-27)
- 2.21.2 (2024-11-01)
- 2.21.1 (2024-09-28)
- 2.21.0 (2024-06-15)
- 2.20.0 (2024-05-29)
- 2.19.0 (2024-05-20)
- 2.18.0 (2024-01-21)
- 2.17.1 (2023-12-04)
- 2.17.0 (2023-11-23)
- 2.16.0 (2023-09-27)
- 2.15.1 (2023-09-17)
- 2.15.0 (2023-07-04)
- 2.14.1 (2023-06-25)
- 2.14.0 (2023-06-24)
- 2.13.0 (2023-05-14)
- 2.12.3 (2023-03-22)
- 2.12.2 (2023-03-19)
- 2.12.1 (2023-03-04)
- 2.12.0 (2023-01-13)
- 2.11.0 (2023-01-08)
- 2.10.3 (2023-01-02)
- 2.10.2 (2022-11-27)
- 2.10.1 (2022-11-20)
- 2.10.0 (2022-10-10)
- 2.9.0 (2022-05-08)
- 2.8.6 (2022-01-06)
- 2.8.5 (2022-01-03)
- 2.8.4 (2021-12-30)
- 2.8.3 (2021-11-29)
- 2.8.2 (2021-11-06)
- 2.8.1 (2021-08-01)
- 2.8.0 (2021-07-23)
- 2.7.1 (2021-07-04)
- 2.7.0 (2021-06-29)
- 2.6.0 (2021-06-08)
- 2.5.2 (2021-06-03)
- 2.5.1 (2021-06-02)
- 2.5.0 (2021-05-27)
- 2.4.3 (2021-03-05)
- 2.4.2 (2021-02-11)
- 2.4.1 (2020-12-20)
- 2.4.0 (2020-12-19)
- 2.3.3 (2020-12-17)
- 2.3.2 (2020-12-10)
- 2.3.1 (2020-12-06)
- 2.3.0 (2020-12-05)
- 2.2.2 (2020-11-23)
- 2.2.1 (2020-11-22)
- 2.2.0 (2020-11-21)
- 2.1.1 (2020-11-18)
- 2.1.0 (2020-11-14)
- 2.0.1 (2020-11-10)
- 2.0.0 (2020-11-10)
- 1.8.0 (2020-10-3)
- 1.7.1 (2020-04-18)
- 1.7.0 (2020-04-17)
- 1.6.0 (2020-03-28)
- 1.5.1 (2019-07-06)
- 1.5.0 (2019-07-06)
- 1.4.0 (2019-03-02)
- 1.3.0 (2019-02-10)
- 1.2.3 (2019-01-05)
- 1.2.2 (2018-12-19)
- 1.2.1 (2018-12-12)
- 1.2.0 (2018-12-11)
- 1.1.3 (2018-11-10)
- 1.1.2 (2018-10-31)
- 1.1.1 (2018-10-26)
- 1.1.0 (2018-10-29)
- 1.0.0 (2018-10-20)
- 0.12.2 (2018-09-27)
- 0.12.1 (2018-09-26)
- 0.12.0 (2018-09-24)
- 0.11.2 (2018-08-07)
- 0.11.1 (2018-08-06)
- 0.11.0 (2018-08-04)
- 0.10.0 (2018-07-10)
- 0.9.0 (2018-06-22)
- 0.8.1 (2018-06-13)
- 0.8.0 (2018-06-12)
- 0.7.3 (2018-05-11)
- 0.7.2 (2018-05-03)
- 0.7.1 (2018-05-01)
- 0.7.0 (2018-04-29)
- 0.6.2 (2018-04-26)
- 0.6.1 (2018-04-25)
- 0.6.0 (2018-04-21)
- 0.5.0 (2018-04-17)
- 0.4.0 (2018-04-16)
- 0.3.0 (2018-04-14)
- 0.2.0 (2018-04-09)
- 0.1.0 (2018-04-07)
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 byoutskirts config schema), with one entry per setting: type, description, default and allowed values. Theexamples/*.ymlfiles and the file written byscan --setupstart with theyaml-language-servercomment for editor completion. Newoutskirts config check [--config <file>] [--project-root <dir>]validates a configuration file without scanning: unknown keys (with a suggestion), wrong types, quoted booleans, invalidreport_excludeentries,retain_attributes, baseline and output paths; exits 1 on any problem. Closes #228 and theconfig checkpart of #227. --changed-since <ref>(changed_since) keeps only the results whose file changed since the merge base of<ref>andHEAD, 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.--quietprints 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 checkdocumentation; 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.metalfiles of the project are read by a lightweight parser, and thekernel,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.metalfile declares is reported asmissingMetalFunction. 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 themissingMetalFunctionresults. 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 formercom.github.tiny-earth-moon.peripherydirectory, so nothing is rebuilt; when both exist the old one is removed, andoutskirts clear-cacheremoves 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
peripherynames.
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
outskirtsandperipheryremains available as an alias;.outskirts.ymlis read before.periphery.yml, and// outskirts:ignoreis equivalent to// periphery:ignore. The repository moved to tiny-earth-moon/outskirts, where the update check now looks for releases; the SARIF driver is namedoutskirts. 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
sarifformat is available on Linux. #219
Bug Fixes#
- None.
3.15.0 (2026-11-03)#
Breaking#
- None.
Enhancements#
- New
--relative-to <dir>option (configuration keyrelative_results_base): the base of the paths emitted with--relative-results, and of thegithub-actions,gitlab-codequality,codeclimateandsarifoutputs. 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, sortedv2format that lists the kind, name and file of each entry;v1files are still read. #215 - New
sarifoutput 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_nameandcategoriesfields 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 aMutex. 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 newreport_unused_type_parametersoption (--report-unused-type-parameters) restores these results. #190
Bug Fixes#
- None.
3.13.4 (2026-11-02)#
Breaking#
- None.
Enhancements#
- None.
Bug Fixes#
isolatedparameters, 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 asTextFieldStyleare retained. #194- Live-preview retention covers WidgetKit
#Preview(as:)andPreviewProviderpreviews of widgets. #204 - C-exported and linker-visible declarations (
@c,@_cdecl,@used,@_silgen_name) are retained. #177 dynamicallyCallmethods of a@dynamicCallabletype are retained when the type is called. #196- Classes named by
valueTransformerNameorrepresentedClassNamein 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.swiftno longer attach to the preceding declaration. #189 - A type whose extension carries
@mainis 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
@Observableclasses 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.ymlvalue 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.ymleven when it equals the default; every boolean option also accepts--no-<option>. #199 - The
github-actions,gitlab-codequalityandcodeclimateformats always use relative paths, and their prerequisites are checked before the scan. #200 --baseline,--write-baselineand--write-resultspaths 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
@Modelexpands is no longer reported unused: implicit, macro-generated initializers no longer count against the sole-initializer rule. #173 - CSV output: the
ModifiersandAttributescolumns 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 thefileandtitleproperties, 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
--bazelscan mode and every--bazel-*option. Passing one of these options, or abazelorbazel_*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/peripherypours a prebuilt bottle on Apple silicon with macOS 27 or later, instead of building from source. The bottle loadslibIndexStore.dylibfrom/Applications/Xcode.app, or else from the Command Line Tools; with neither,brew reinstall --build-from-source peripherybuilds 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 anextension, 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 apublicmember never referenced outside its module (protocol requirements,open,override,@inlinableand implicit members stay silent). #75 - New opt-in
enable_empty_extension_analysis/--enable-empty-extension-analysis: reports empty extensions (extension Foo {}, with only comments,@availableor empty#ifbranches) 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 asinternalat file level orfileprivateinside aprivatetype (redundantAccessLevel). #87
Bug Fixes#
- Setter access modifiers (
private(set),internal(set)) are no longer taken as the declaration's access level:internal(set) public varnow counts aspublicin 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_argumentsand 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.peripheryappto~/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: reportsopendeclarations 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-storeandswift-filename-matcherdependencies 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_bazelto a per-user directory under the cache. #143 - Periphery no longer contacts
api.periphery.proafter 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'sJSExport, 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_FILEbuild 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
@Statereads under Xcode 27: top-level$statereads 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 fromGeneratedAssetSymbols.swift(indexed through a precise exception toindex_exclude), one result per color with its.colorsetpath; colors referenced by name (string literals, xib/storyboard, global accent color) count as used. #80 examples/directory with commented.periphery.ymlscenarios. #79- README: ready-to-paste Xcode Run Script build phase (#90); merging the results of several build configurations explained as an intersection, with a
jqrecipe (#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
buildPartialBlockretention 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-defaultoption (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-attributesoption: declarations carrying one of the listed attributes (e.g.OptionGroup,objc) are retained as if annotated// periphery:ignore; theAttribute:kind1,kind2form restricts it to declaration kinds. Kind identifiers are shared withreport_excludekinds; unknown kinds raise a usage error before the scan. #84
Bug Fixes#
- None.
3.12.6 (2026-11-01)#
Breaking#
- None.
Enhancements#
report_excludeentries may carrykinds({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-excludeaccepts 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 toprint,debugPrint,dump,String(describing:),String(reflecting:)or interpolated into a string are retained (classes only throughdump, 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
Dictionarykey (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-cacheremoves the cache through FileManager instead ofrm -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-buildwithout--index-store-pathnow 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,
@objcoptional 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_matchoption (--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 asString. The README documents the collision risk and recommendsLocalizedStringResource. Closes #66. - AppIntents localized literals are now detected:
ParameterSummaryString(Summary,When/otherwise),IntentDialog,AppShortcutPhrase, and the@Parameter/@Propertyattribute 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/ifexpressions, functions, computed properties and closures typedLocalizedStringKey/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_patternsoption (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), coveringButton,Label,Toggle,Section,.navigationTitle,Textand custom initializers, plus annotated declarations (static let x: LocalizedStringResource = "…"). Closes #58. - New
localized_string_catalog_excludeoption (globs) to skip catalogues from the unused-key analysis;**/InfoPlist.xcstringsand**/AppShortcuts.xcstringsare 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 byNSLocalizedString,String(localized:),LocalizedStringKey,Text("…")orBundle.localizedStringliterals are flagged, with an opt-outdisable_unused_localized_string_analysis. Keys used through generated symbols (String(localized: .key)), dynamic keys and SwiftUI initializers taking aLocalizedStringKey(Button,Label,.navigationTitle) are not yet tracked and may be reported as unused. Ported from upstream #893 by Ian Leitch. Closes #55.
Bug Fixes#
ExpressibleByArgumentconformances inScanCommandare 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#
#Previewexpansions 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.publicmembers 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
@Stateproperty used only through its projected value ($foo) or backing storage (_foo) is no longer reported as unused. Fixes #36. Under Xcode 27 only@Stateis a macro (@Environment,@FocusState,@Binding,@AppStorageand 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:
buildBlockof any arity,buildPartialBlock(first:)andbuildPartialBlock(accumulated:next:). #30 - The SPM driver now indexes
.xcdatamodeldCore 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
.xiband.storyboardresources under each target folder, so private@IBAction/@IBOutletconnected in Interface Builder are retained like in Xcode projects. Fixes #13.
3.8.7 (2026-10-27)#
Breaking#
- None.
Enhancements#
- None.
Bug Fixes#
public macrodeclarations 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
@resultBuilderfrom 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 -listin Periphery's own DerivedData location (-IDECustomDerivedDataLocation) and honor--clean-buildbefore 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#ifblocks (os,targetEnvironment,arch,canImport); opt out with--disable-platform-conditional-retention. Fixes #14. - Locate the SwiftPM index store with the Swift 6.4
swiftbuildbackend (.build/out) as well as the native backend, viaswift 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#ifblocks (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-propertiesand--retain-hashable-propertiesoptions to retain all properties onEquatableandHashabletypes. - Expose a stable
@periphery//bazel:generatedpackage group so Bazel projects can grant visibility to Periphery's generated scan target and use--bazel-check-visibilitysafely. - Added a
--bazel-queryoption 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-resultsfile 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
libIndexStorewhen 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-visibilityto disable passing--check_visibility=falsetobazel 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:allcomment from superfluous ignore comment detection. - Superfluous ignore comment results are now included in baselines.
3.5.0 (2026-02-11)#
Breaking#
- The
--no-coloroption has been replaced with--color=never.
Enhancements#
- The
--coloroption now accepts one ofauto,alwaysandnever. Inautomode, color is disabled for dumb terminals and non-TTYs. - Added detection of superfluous
// periphery:ignorecomments. 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-previewsfor the#Previewmacro.
3.4.0 (2026-01-06)#
Breaking#
- None.
Enhancements#
- Added the
--no-color/--coloroption to disable/enable colored output. - Added the
--no-retain-spioption 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@IBSegueActionmembers. 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-modulesoption. - Added the
--format gitlab-codemagicformatting option for GitLabs Code Quality artifact reports - Added the
--bazel-index-storeoption 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-typesfor 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-outdirectory 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-markdownoutput 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
@_dynamicReplacementmembers 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.
@_dynamicReplacementmembers 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/peripherytap 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
@mainattribute 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-propertiesoption to retain all properties onEncodabletypes only. - Added the
--xcode-list-argumentsoption to pass additional arguments toxcodebuild -list. - Added the
--skip-schemes-validationoption to skip validation of Xcode schemes.
Bug Fixes#
@Stateand@Bindingproperties 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-protocolsis deprecated, use--external-codable-protocolsinstead.
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-propertiesoption 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-filesoption to retain all declarations within the given files.
Bug Fixes#
- Subscript functions required by
@dynamicMemberLookupare now retained. - A newline is no longer printed before non-Xcode formatted results.
--external-codable-protocolsnow retains enums that conform toCodingKey.- 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
@inlinablefunction. - 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
NSPrincipalClassandWKExtensionDelegateClassNameare now retained.
2.17.1 (2023-12-04)#
Breaking#
- None.
Enhancements#
- Add support for indexing plist files via the generic
--file-targets-pathoption.
Bug Fixes#
- None.
2.17.0 (2023-11-23)#
Breaking#
- None.
Enhancements#
- Added the
--relative-resultsoption to output result paths relative to the current directory. --quietnow 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_STOREis 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-annotatedoption. - 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-classesoption 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-accessibleis 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_ENABLEis now forcefully enabled as it's required for indexing.- Fix false positive where a
typealiasis 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
@MainActorannotated 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>andNSKeyValueObservationare 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 codeclimateoption. - 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-cachecommand. - 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(_:)andbuildLimitedAvailability(_:)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-includeoption 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_DIRenvironment variable is now respected. - Updated
XcodeProjdependency 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-excludeand--report-excludeoptions 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#
NSEntityMigrationPolicysubclasses referenced by.xcmappingmodelare now retained.ValueTransformersubclasses referenced by.xcdatamodeldare now retained.- Properties of types directly or indirectly conforming to
Encodableare now automatically retained. The--external-encodable-protocolsoption has been added to instruct Periphery that the specified external protocols also inheritEncodable.
Bug Fixes#
- Fix
--index-excluderesulting in an error about unindexed files. - Fix an error during guided setup when
xcodebuildis not setup for command line use. CodingKeyenums ofEncodableconforming types are now also retained likeDecodabletypes.- 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-pathoption now implies--skip-build. - Guided setup now omits the
--targetsoption 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_FILEreferences 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-typesoption 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
--xcargsoption has been removed, and superseded by passing arguments following the--terminator. E.gperiphery scan --xcargs --foois nowperiphery scan -- --foo. This feature can also be used to pass arguments toswift buildfor 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-accessiblealso 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-annotatedoption has been removed, and--retain-objc-accessibleadded.
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-buildflag 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-syntaxcommand 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-buildoption 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
typealiasthat defines anassociatedtypein an external protocol is now retained. - All custom
appendInterpolationmethods 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.
wrappedValueandprojectedValueproperties in property wrappers are now retained.XCTestManifests.swiftis now treated as an entry point file likeLinuxMain.swift.- Updated
XcodeProjdependency 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#
-
New
strictoption to exit with non-zero status if any unused code is found. Cihat Gündüz #22 #23 -
Add official Homebrew support. Ian Leitch #24
Bug Fixes#
- Fix parsing of projects using Siri message intents. Ian Leitch #25 #26
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.