Skip to content
CAI
Software that uses CAICheck a score

wzh4869/AppPorts

61.1

Adequate · 1 October 2026

27.1k

lines of production code

Swift

with Python

2

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

AppPorts is a macOS utility designed to manage application portability and integrity by automatically re-signing apps at login to bypass Gatekeeper restrictions. It provides core functionality for scanning, migrating, and resolving application identities, supported by a native Swift launcher for handling external document associations. The system includes comprehensive test coverage for its migration and signature logic, alongside a localized user interface and a dedicated documentation site.

Features

AppPorts adds auto-re-signing at login and a redesigned About view with live contributor data

AppPorts now automatically re-signs migrated apps with ad-hoc signatures at every user login to prevent Gatekeeper blocks after restart, with the feature enabled by default and controllable in settings. The About window has been redesigned to display a scrollable list of contributors fetched from the GitHub API (cached locally) and includes a dedicated menu for sponsoring the project. The app also introduces a comprehensive language switcher in the menu bar, supporting 20+ languages including AI-translated options and Braille, alongside improved logging controls and user documentation links.

AppPorts · high confidence

Initial Xcode project structure and build configuration

The AppPorts Xcode project has been initialized with a new project.pbxproj file, defining the main AppPorts application target and an AppPortsTests unit-test bundle. The configuration includes a shared workspace, a launch scheme for building and testing, and resource references for the app icon and sponsors.json. The project is set to the zh-Hans development region with support for a wide range of languages, and the build system is configured to parallelize buildables and run tests alongside the main application.

AppPorts.xcodeproj · high confidence

Behavioural changes

License changed from MIT to Apache License 2.0

The project's open-source license has been updated from MIT to Apache License 2.0, which provides explicit patent rights and clearer terms for contributors and users.

(repo-wide) · high confidence

Stub Portal now uses a native Swift launcher instead of a bash script

The macOS Stub Portal tool has replaced its previous bash-based launcher with a native Swift application (StubLauncher). This change ensures that double-clicking associated documents in Finder correctly opens the external application, resolving a previous issue where such actions failed. The new launcher also includes built-in localization for error messages (e.g., when external storage is missing) and handles Apple Events to forward document opens to the real app bundle.

Tools · high confidence

Test coverage

Added comprehensive test coverage for AppPorts core components

Added new test suites for AppIdentityResolver, AppIdentityScanner, AppLogger, AppMigrationService, AppOperationState, AppRunningState, AppScannerSignatureCheck, and AppScanner. These tests validate application identity resolution (including wrapped bundles, stubs, and symlinks), container data scanning, diagnostic log redaction, migration workflows (move, link, restore, rollback), operation state concurrency, running application detection, and signature replacement checks.

AppPortsTests · high confidence

Dependencies

User documentation site dependencies initialized

The user documentation site now includes its dependency manifests (package.json, package-lock.json, pnpm-lock.yaml) and a VitePress cache configuration. This establishes the build environment with Vue 3.5.34, Sass 1.99.0, VitePress 1.6.4, and the vitepress-theme-teek 1.5.7 theme, ensuring consistent and reproducible builds for the documentation.

(dependencies) · high confidence

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

How this codebase got here

Score

  • CAI 67 → 61 (-6.1)
  • Rubric changed (rubric-2026.09.11 → rubric-2026.09.18) — scores are not directly comparable.

Lenses

  • Code Health 79 → 80 (+1.5)
  • Architecture 100 → 99 (-0.8)
  • Maturity 67 → 69 (+1.8)
  • Readiness 58 → 49 (-9.0)
  • Security 77 → 83 (+5.7)
  • Accessibility 67 (new)

Resolved (53)

  • CodeSigner.restoreSignature (cognitive 24) (AppPorts/Services/CodeSigner.swift)
  • CodeSigner.restoreSignature (cyclomatic 19) (AppPorts/Services/CodeSigner.swift)
  • CodeSigner.sign (cognitive 21) (AppPorts/Services/CodeSigner.swift)
  • CodeSigner.sign (cyclomatic 17) (AppPorts/Services/CodeSigner.swift)
  • DataDirMover.migrate (cognitive 33) (AppPorts/Utils/DataDirMover.swift)
  • DataDirMover.migrate (cyclomatic 18) (AppPorts/Utils/DataDirMover.swift)
  • DataDirScanner.scanLibraryDirs (cognitive 42) (AppPorts/Utils/DataDirScanner.swift)
  • DataDirScanner.scanLibraryDirs (cyclomatic 18) (AppPorts/Utils/DataDirScanner.swift)
  • Duplicated block (10 lines × 2) (AppPorts/Services/AppMigrationService.swift)
  • Duplicated block (10 lines × 2) (AppPorts/Utils/DataDirMover.swift)
  • Duplicated block (10 lines × 3) (AppPorts/ContentView.swift)
  • Duplicated block (10 lines × 3) (AppPorts/Utils/DataDirScanner.swift)
  • Duplicated block (10–12 lines × 2) (AppPorts/Services/CodeSigner.swift)
  • Duplicated block (11 lines × 2) (AppPorts/ContentView.swift)
  • Duplicated block (11–12 lines × 2) (AppPorts/Utils/FileCopier.swift)
  • Duplicated block (12 lines × 2) (AppPorts/Utils/AppScanner.swift)
  • Duplicated block (12 lines × 2) (AppPorts/Utils/DataDirMover.swift)
  • Duplicated block (12 lines × 2) (AppPorts/Views/DataDirsView.swift)
  • Duplicated block (12 lines × 2) (AppPorts/Views/DataDirsView.swift)
  • Duplicated block (12–13 lines × 2) (AppPorts/Utils/DataDirMover.swift)
  • …and 33 more

New (152)

  • AppDataDirectoryRow.body (cognitive 22) (AppPorts/Views/Components/AppDataDirectoryBrowser.swift)
  • AppDataDirectoryRow.body (cyclomatic 16) (AppPorts/Views/Components/AppDataDirectoryBrowser.swift)
  • AppIdentityResolver.readBundle (cognitive 27) (AppPorts/Utils/AppIdentityResolver.swift)
  • AppIdentityResolver.readBundle (cyclomatic 20) (AppPorts/Utils/AppIdentityResolver.swift)
  • AppLogger.runDiagnosticCommand (cognitive 28) (AppPorts/Services/AppLogger.swift)
  • AppLogger.runDiagnosticCommand (cyclomatic 20) (AppPorts/Services/AppLogger.swift)
  • AppRowView.body (cognitive 21) (AppPorts/Views/Components/AppRowView.swift)
  • AppRowView.body (cyclomatic 22) (AppPorts/Views/Components/AppRowView.swift)
  • AppStoreSettingsView.settingsContent (cognitive 17) (AppPorts/Views/AppStoreSettingsView.swift)
  • AutoResignInstaller.stopLoadedTask (cognitive 20) (AppPorts/Services/AutoResignInstaller.swift)
  • AutoResignInstaller.stopLoadedTask (cyclomatic 16) (AppPorts/Services/AutoResignInstaller.swift)
  • CodeSigner.resolveAppURL (cognitive 25) (AppPorts/Services/CodeSigner.swift)
  • CodeSigner.stripSigningDetritus (cognitive 16) (AppPorts/Services/CodeSigner.swift)
  • ContainerRemountLoop.run (cognitive 23) (AppPorts/Utils/ContainerRemountLoop.swift)
  • ContainerVolumeMigrator.migrate (cognitive 29) (AppPorts/Utils/ContainerVolumeMigrator.swift)
  • ContainerVolumeMigrator.migrate (cyclomatic 25) (AppPorts/Utils/ContainerVolumeMigrator.swift)
  • ContainerVolumeMigrator.performCleanup (cognitive 54) (AppPorts/Utils/ContainerVolumeMigrator.swift)
  • ContainerVolumeMigrator.performCleanup (cyclomatic 22) (AppPorts/Utils/ContainerVolumeMigrator.swift)
  • ContainerVolumeMigrator.restore (cognitive 18) (AppPorts/Utils/ContainerVolumeMigrator.swift)
  • ContentView.body (cognitive 20) (AppPorts/ContentView.swift)
  • …and 132 more

Changes since last survey

  • 39 commits — 32 feature/other, 7 fixes

By area

  • User_docs/docs — 15 commits
  • (root) — 10 commits
  • AppPorts/Utils — 3 commits
  • AppPorts/Views — 3 commits
  • .github/workflows — 2 commits
  • AppPorts/Models — 2 commits
  • AppPorts/Appports.swift — 1 commit
  • AppPorts/Localizable.xcstrings — 1 commit
  • AppPorts/Services — 1 commit
  • docs/superpowers — 1 commit

Notable commits

  • fix: fix(signing): restore original apps from verified full backups
  • fix: fix: avoid blocking process completion callbacks
  • fix: fix: correct link in README_CN.md
  • fix: fix: resolve real app identities when scanning data
  • fix: fix: update sponsor details and timestamp in sponsors.json
  • fix: fix: 更新赞助者符华的日期并添加新赞助者VC
  • fix: fix: 移除 README 中的多余信息并添加新赞助者 VC
  • change: 1
  • change: 1
  • change: Update documentation and assets for AppPorts version 1.9.0
  • change: chore: exclude root development notes from version control
  • change: chore: prepare AppPorts 1.8.2 project and maintenance metadata
  • change: chore: update release feed for v1.9.0
  • change: chore: 删除过时的 1.8.1 更新说明文件
  • change: docs(de): sync mount migration and recovery guides
  • change: docs(en): sync mount migration and recovery guides
  • change: docs(es): sync mount migration and recovery guides
  • change: docs(fr): sync mount migration and recovery guides
  • change: docs(ja): sync mount migration and recovery guides
  • change: docs(ko): sync mount migration and recovery guides
  • …and 19 more

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

Survey your own repository

wzh4869/AppPorts was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 1 October 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit 4616d28c7d3c2ae101881657239a2a698d4e5705 — the exact code this score is about.
  • Scored under rubric-2026.09.18 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-e569280dd5e2.