RepoPilotOpen in app →

xmartlabs/XLActionController

Fully customizable and extensible action sheet controller written in Swift

Healthy

Healthy across all four use cases

Use as dependencyHealthy

Permissive license, no critical CVEs, actively maintained — safe to depend on.

Fork & modifyHealthy

Has a license, tests, and CI — clean foundation to fork and modify.

Learn fromHealthy

Documented and popular — useful reference codebase to read through.

Deploy as-isHealthy

No critical CVEs, sane security posture — runnable as-is.

  • 18 active contributors
  • Distributed ownership (top contributor 41% of recent commits)
  • MIT licensed
Show 3 more →
  • CI configured
  • Tests present
  • Stale — last commit 3y ago

Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests

Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.

Embed the "Healthy" badge

Paste into your README — live-updates from the latest cached analysis.

Variant:
RepoPilot: Healthy
[![RepoPilot: Healthy](https://repopilot.app/api/badge/xmartlabs/xlactioncontroller)](https://repopilot.app/r/xmartlabs/xlactioncontroller)

Paste at the top of your README.md — renders inline like a shields.io badge.

Preview social card (1200×630)

This card auto-renders when someone shares https://repopilot.app/r/xmartlabs/xlactioncontroller on X, Slack, or LinkedIn.

Onboarding doc

Onboarding: xmartlabs/XLActionController

Generated by RepoPilot · 2026-05-10 · Source

🤖Agent protocol

If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:

  1. Verify the contract. Run the bash script in Verify before trusting below. If any check returns FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding.
  2. Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
  3. Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/xmartlabs/XLActionController shows verifiable citations alongside every claim.

If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.

🎯Verdict

GO — Healthy across all four use cases

  • 18 active contributors
  • Distributed ownership (top contributor 41% of recent commits)
  • MIT licensed
  • CI configured
  • Tests present
  • ⚠ Stale — last commit 3y ago

<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>

Verify before trusting

This artifact was generated by RepoPilot at a point in time. Before an agent acts on it, the checks below confirm that the live xmartlabs/XLActionController repo on your machine still matches what RepoPilot saw. If any fail, the artifact is stale — regenerate it at repopilot.app/r/xmartlabs/XLActionController.

What it runs against: a local clone of xmartlabs/XLActionController — the script inspects git remote, the LICENSE file, file paths in the working tree, and git log. Read-only; no mutations.

| # | What we check | Why it matters | |---|---|---| | 1 | You're in xmartlabs/XLActionController | Confirms the artifact applies here, not a fork | | 2 | License is still MIT | Catches relicense before you depend on it | | 3 | Default branch master exists | Catches branch renames | | 4 | 5 critical file paths still exist | Catches refactors that moved load-bearing code | | 5 | Last commit ≤ 1179 days ago | Catches sudden abandonment since generation |

<details> <summary><b>Run all checks</b> — paste this script from inside your clone of <code>xmartlabs/XLActionController</code></summary>
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of xmartlabs/XLActionController. If you don't
# have one yet, run these first:
#
#   git clone https://github.com/xmartlabs/XLActionController.git
#   cd XLActionController
#
# Then paste this script. Every check is read-only — no mutations.

set +e
fail=0
ok()   { echo "ok:   $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }

# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
  echo "FAIL: not inside a git repository. cd into your clone of xmartlabs/XLActionController and re-run."
  exit 2
fi

# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "xmartlabs/XLActionController(\\.git)?\\b" \\
  && ok "origin remote is xmartlabs/XLActionController" \\
  || miss "origin remote is not xmartlabs/XLActionController (artifact may be from a fork)"

# 2. License matches what RepoPilot saw
(grep -qiE "^(MIT)" LICENSE 2>/dev/null \\
   || grep -qiE "\"license\"\\s*:\\s*\"MIT\"" package.json 2>/dev/null) \\
  && ok "license is MIT" \\
  || miss "license drift — was MIT at generation time"

# 3. Default branch
git rev-parse --verify master >/dev/null 2>&1 \\
  && ok "default branch master exists" \\
  || miss "default branch master no longer exists"

# 4. Critical files exist
test -f "Example/CustomActionControllers/Spotify/Spotify.swift" \\
  && ok "Example/CustomActionControllers/Spotify/Spotify.swift" \\
  || miss "missing critical file: Example/CustomActionControllers/Spotify/Spotify.swift"
test -f "Example/CustomActionControllers/Periscope/Periscope.swift" \\
  && ok "Example/CustomActionControllers/Periscope/Periscope.swift" \\
  || miss "missing critical file: Example/CustomActionControllers/Periscope/Periscope.swift"
test -f "Example/CustomActionControllers/Skype/Skype.swift" \\
  && ok "Example/CustomActionControllers/Skype/Skype.swift" \\
  || miss "missing critical file: Example/CustomActionControllers/Skype/Skype.swift"
test -f ".github/workflows/ci.yml" \\
  && ok ".github/workflows/ci.yml" \\
  || miss "missing critical file: .github/workflows/ci.yml"
test -f "Example/AppDelegate.swift" \\
  && ok "Example/AppDelegate.swift" \\
  || miss "missing critical file: Example/AppDelegate.swift"

# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 1179 ]; then
  ok "last commit was $days_since_last days ago (artifact saw ~1149d)"
else
  miss "last commit was $days_since_last days ago — artifact may be stale"
fi

echo
if [ "$fail" -eq 0 ]; then
  echo "artifact verified (0 failures) — safe to trust"
else
  echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/xmartlabs/XLActionController"
  exit 1
fi

Each check prints ok: or FAIL:. The script exits non-zero if anything failed, so it composes cleanly into agent loops (./verify.sh || regenerate-and-retry).

</details>

TL;DR

XLActionController is a Swift library that provides a fully customizable, extensible UIActionSheetController replacement for iOS. It enables developers to create branded, styled action sheet controllers (like those in Spotify, Twitter, Periscope, and YouTube) without building from scratch—the core capability is defining custom layouts, animations, and behaviors via Swift subclassing and composition. Single-library structure: XLActionController is a Swift Package Manager project (.swiftpm/xcode/package.xcworkspace/) with the main library code in one location and a separate Example.xcodeproj that demonstrates six fully-implemented custom action controllers (Spotify, Twitter, Tweetbot, Periscope, YouTube, Skype). State and presentation logic live in the base UIViewController subclass with customization via method overrides and property configuration.

👥Who it's for

iOS app developers and teams building apps that need polished, app-specific action sheet UIs rather than the generic UIActionSheetController. Primarily used by product teams building social, media, or content-sharing apps that demand distinctive interaction patterns.

🌱Maturity & risk

Production-ready and actively maintained. The repo includes 128KB of Swift code, full CI/CD via GitHub Actions (.github/workflows/ci.yml), CocoaPods and Carthage support, and real-world example implementations (Spotify, Twitter, Tweetbot, Periscope, YouTube, Skype). Code is well-structured with SwiftLint enforcement (.swiftlint.yml) and appears to be actively used in production apps.

Low risk for active use. The library is self-contained with minimal external dependencies (Swift-only, no third-party framework dependencies visible). SwiftPM/Xcode integration is stable. Risk is primarily limited to Swift language version updates and iOS version drift—the last commit recency is not visible in provided data, so verify CI status and changelog recency before adoption.

Active areas of work

Visible ongoing work includes CI pipeline maintenance (GitHub Actions workflow in .github/workflows/ci.yml) and example app updates (asset management for Spotify, Periscope, Skype, YouTube demos in Example/Assets.xcassets/). The CHANGELOG.md and PR template suggest active version releases and community contributions.

🚀Get running

Clone and open in Xcode: git clone https://github.com/xmartlabs/XLActionController.git && cd XLActionController && open Example.xcodeproj. For SwiftPM integration: add .package(url: "https://github.com/xmartlabs/XLActionController.git", from: "3.0.0") to Package.swift or use Xcode's Add Package dependency dialog. Run the Example scheme to see six pre-built action controller demos.

Daily commands: Open Example.xcodeproj in Xcode 12+, select the Example scheme, and run (⌘R) on any iOS 11+ simulator or device. The Example app is pre-configured with six custom action controller demonstrations that are fully interactive.

🗺️Map of the codebase

  • Example/CustomActionControllers/Spotify/Spotify.swift — Primary example implementation demonstrating the extensible action controller pattern used throughout the library
  • Example/CustomActionControllers/Periscope/Periscope.swift — Core customization example showing how to subclass and override action controller behavior
  • Example/CustomActionControllers/Skype/Skype.swift — Alternative UI pattern implementation showing the framework's flexibility with different layout approaches
  • .github/workflows/ci.yml — Build and test pipeline configuration; critical for understanding supported platforms and Swift versions
  • Example/AppDelegate.swift — Application entry point and initialization logic that sets up the example demonstrations
  • .swiftlint.yml — Code style and quality enforcement rules that all contributors must follow

🧩Components & responsibilities

  • Custom Action Controller (Spotify/Periscope/Skype) (Swift, UIViewController, UITableView, Core Animation) — Orchestrates presentation, animation, cell configuration, and user interaction for theme-specific action sheet style
    • Failure mode: Incorrect animation timing or cell layout misconfiguration results in janky presentation or unresponsive UI
  • Base Action Controller Framework (Swift protocols, UIViewController, UIGestureRecognizer) — Provides extensible foundation for custom controllers with lifecycle hooks, gesture handling, and protocol definitions
    • Failure mode: Protocol misimplementation or missing lifecycle hook leads to memory leaks or unexpected dismissal behavior
  • Custom XIB Cell (Interface Builder, XIB format, Auto Layout) — Defines visual layout and subview hierarchy for individual action items rendered in the sheet
    • Failure mode: Constraint conflicts or missing outlets prevent proper cell initialization or cause layout warnings
  • Example Application (Swift, UIKit, Storyboard, Assets) — Demonstrates all implemented action controller styles and serves as integration test for the framework
    • Failure mode: App crashes or fails to present action controllers indicates regression in framework functionality

🔀Data flow

  • UserViewController — User initiates action by tapping button or calling presentActionController()
  • ViewControllerActionController — Pass array of Action objects defining titles, images, and handler closures
  • ActionControllerUITableView/ScrollView — Populate cells by binding action data to custom cell XIB definitions
  • undefinedundefined — undefined

🛠️How to make changes

Create a New Custom Action Controller Style

  1. Create a new Swift file in Example/CustomActionControllers/{YourStyle}/{YourStyle}.swift following the pattern of Spotify.swift or Periscope.swift (Example/CustomActionControllers/Spotify/Spotify.swift)
  2. Subclass the appropriate action controller base class and override presentation/animation methods (Example/CustomActionControllers/Periscope/Periscope.swift)
  3. Create a custom XIB cell file if needed at Example/CustomActionControllers/{YourStyle}/{YourStyle}Cell.xib (Example/CustomActionControllers/Spotify/PeriscopeCell.xib)
  4. Add theme assets to Example/Assets.xcassets/{yourstyle}/ directory with appropriate image sets (Example/Assets.xcassets/spotify/sp-background.imageset/Contents.json)
  5. Wire up your new controller in the example app's main view controller to demonstrate usage (Example/Base.lproj/Main.storyboard)

Add a New Example Action to an Existing Controller

  1. Open the custom controller file (e.g., Spotify.swift) and locate the action definition section (Example/CustomActionControllers/Spotify/Spotify.swift)
  2. Add a new action object with title, image, and handler closure following existing action patterns (Example/CustomActionControllers/Periscope/Periscope.swift)
  3. Add corresponding icon asset to the theme's image set directory (Example/Assets.xcassets/spotify/sp-add-icon.imageset/Contents.json)

Customize Cell Layout and Appearance

  1. Edit or create a custom XIB cell file in Example/CustomActionControllers/{YourStyle}/ (Example/CustomActionControllers/Spotify/PeriscopeCell.xib)
  2. Configure cell subviews, constraints, and appearance in Interface Builder (Example/CustomActionControllers/Skype/SkypeCell.xib)
  3. In your Swift controller file, register the XIB and configure cell binding in the controller's setup method (Example/CustomActionControllers/Skype/Skype.swift)

🔧Why these technologies

  • Swift 5 — Modern iOS development language with strong type safety and protocol-oriented design, enabling extensible architecture
  • UIViewController subclassing — Leverages native iOS presentation controller hierarchy for seamless integration with UIKit application lifecycle
  • XIB-based custom cells — Enables visual design tool layout while maintaining programmatic customization flexibility
  • GitHub Actions CI/CD — Automated testing and build validation on every commit ensures code quality across Swift versions

⚖️Trade-offs already made

  • Fully customizable via subclassing rather than composition

    • Why: Allows maximum flexibility for developers to override behavior at any level of the presentation hierarchy
    • Consequence: Increases complexity for simple use cases; developers must understand UIViewController lifecycle and animation timing
  • Example-driven documentation with multiple themed implementations

    • Why: Demonstrates real-world design patterns (Spotify, Periscope, Skype) to guide developers by example
    • Consequence: Large example app with multiple implementations; may be overwhelming for first-time users seeking minimal setup
  • XIB-based cell layout alongside programmatic options

    • Why: Supports both visual designers and programmatic developers without forcing a single approach
    • Consequence: Dual maintenance paths and potential inconsistency between XIB and code-based implementations

🚫Non-goals (don't propose these)

  • Does not provide pre-built animation transitions beyond the base dismiss/present framework
  • Does not handle data persistence or state management; purely UI-focused
  • Does not support Android or cross-platform deployment
  • Does not include accessibility features (VoiceOver, Dynamic Type) in base implementation

🪤Traps & gotchas

No exotic hidden traps detected, but verify: (1) iOS deployment target—check Example.xcodeproj build settings and Sources/ for minimum iOS version (likely iOS 11+); (2) Swift version constraint—.swiftpm/xcode/ suggests Swift 5+, confirm Xcode version compatibility; (3) SwiftLint must pass before CI accepts PRs, so run swiftlint locally to avoid rejected builds; (4) the Example project hardcodes image assets for each themed controller, so adding a new controller requires manually creating its Assets.xcassets folder structure.

🏗️Architecture

💡Concepts to learn

  • UIViewController Subclassing & Customization — XLActionController is built entirely via UIViewController inheritance; understanding iOS view controller lifecycle, presentation, and dismissal is foundational to extending this library.
  • Custom View Animations & Transitions — Each themed action controller (Spotify, Twitter, etc.) implements custom entry/exit animations; understanding UIViewPropertyAnimator and CABasicAnimation is key to creating distinctive presentation effects.
  • Delegation & Callback Patterns — Action handlers are closures passed during Action initialization; understanding how Swift closures capture context and how to avoid retain cycles in completion handlers is essential.
  • Swift Package Manager (SPM) Manifests — XLActionController is distributed via SPM; understanding how Package.swift defines targets, products, and dependencies is needed to modify distribution or add new module targets.
  • IBInspectable & IBDesignable (Interface Builder Integration) — Custom action controllers may define IBInspectable properties for theme configuration in IB; understanding how to mark Swift properties for IB visibility enables visual customization workflows.
  • Responder Chain & Event Handling — Action sheet touch handling relies on the UIKit responder chain; understanding how touch events propagate through view hierarchies ensures custom gesture recognizers and tap handlers work correctly.
  • apple/swift-package-manager — XLActionController uses SwiftPM for distribution; understanding SPM is essential for contributing and maintaining the package manifest.
  • realm/SwiftLint — The codebase uses SwiftLint (.swiftlint.yml) to enforce code quality; understanding its rules is critical for passing CI checks.
  • mac-cain13/R.swift — Related to asset management patterns; Example app manually manages Xcassets folders, but R.swift automates type-safe asset references.

🪄PR ideas

To work on one of these in Claude Code or Cursor, paste: Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.

Add Swift Package Manager integration tests to CI workflow

The repo has .swiftpm/xcode/package.xcworkspace indicating SPM support, but .github/workflows/ci.yml likely only tests via CocoaPods/Carthage. Adding SPM build verification ensures the package resolves correctly and builds on CI, catching dependency declaration issues early.

  • [ ] Review current .github/workflows/ci.yml to identify missing SPM test steps
  • [ ] Add swift build and swift test commands to the workflow for SPM verification
  • [ ] Test against multiple Swift versions to ensure compatibility
  • [ ] Document SPM installation instructions in README if not already present

Add unit tests for XLActionController core functionality

The repo structure shows extensive Example app assets but no visible Tests/ directory. Core action sheet controller behavior (initialization, customization, animations, delegate callbacks) should have automated tests to prevent regressions and improve contributor confidence.

  • [ ] Create Tests/XLActionControllerTests/ directory structure
  • [ ] Write tests for XLActionController initialization and configuration
  • [ ] Add tests for action cell selection and callback handling
  • [ ] Add snapshot or UI tests for different style variants (Spotify, Twitter, Periscope, Skype shown in assets)
  • [ ] Integrate test target into .swiftpm/xcode/package.xcworkspace and CI workflow

Document customization API with code examples in CONTRIBUTING.md

The repo advertises 'fully customizable and extensible' but CONTRIBUTING.md likely lacks specific examples. The Example app shows Spotify/Twitter/Periscope/Skype styles but their customization code isn't documented for contributors wanting to extend behavior.

  • [ ] Expand CONTRIBUTING.md with a 'Architecture' section explaining XLActionController's extension points
  • [ ] Add code examples showing how to create custom action controller styles (reference existing Spotify/Twitter examples in Example app)
  • [ ] Document the customization API for cells, animations, and behavior
  • [ ] Link to relevant source files in the documentation for deeper learning

🌿Good first issues

  • Add unit tests for base XLActionController class—the repo shows Example controllers but no visible XCTest files in the file list; create Tests/ directory with basic initialization and action-handling tests to improve coverage.
  • Document the customization API with inline code examples in the main library headers—the Example controllers show working code, but the base class lacks detailed Swift docstrings; add /// comments explaining key override points (e.g., layout(), animate(), etc.).
  • Create a SwiftUI wrapper example—add a new Example/SwiftUIExample folder with a simple SwiftUI demo that wraps XLActionController in a UIViewControllerRepresentable, showing how modern SwiftUI developers can use this UIKit library.

Top contributors

Click to expand

📝Recent commits

Click to expand
  • c688f26 — Update README.md (Martin Barreto)
  • 8d05cf2 — Add files via upload (Martin Barreto)
  • 13d2e70 — Create FUNDING.yml (enrigalmig)
  • ec058c4 — Add Github Actions CI (#151) (mats-claassen)
  • afabde0 — update Spotify demo gif and hideCollectionViewBehindCancelView description (#149) (cecipirotto)
  • 72144c7 — Version bump 5.1.0 :rocket: (#147) (mats-claassen)
  • 6de24f2 — Add SPM subspecs (#146) (mats-claassen)
  • 12b5cd2 — Support for SPM (#144) (andrew-muzz)
  • 0e8404d — Added the ability to adjust Cancel View's Title font and size. (#145) (mohammadsuhail98)
  • 7d7cf11 — Version bump 5.0.2 (#133) (mats-claassen)

🔒Security observations

XLActionController appears to be a well-maintained iOS UI library with a clean structure and standard Swift conventions. No critical or high-severity vulnerabilities were identified based on the provided file structure. The project follows best practices with Swift linting configuration (.swiftlint.yml) and standard CI/CD setup. However, full security analysis is limited by the absence of Package.swift dependency manifest and CI workflow details. The codebase shows no obvious signs of injection vulnerabilities, hardcoded secrets, or misconfigurations. As a UI framework library with no backend/network requirements visible, the attack surface is inherently limited. Recommendation: Periodically audit dependencies and maintain security-focused code review practices.

  • Low · Missing Package.swift dependency information — Package.swift. The Package.swift file content was not provided for analysis. Without examining the dependency manifest, it's impossible to verify that all dependencies are pinned to secure versions and that no vulnerable packages are included. Fix: Provide and review Package.swift to ensure all dependencies are from trusted sources, pinned to secure versions, and regularly updated. Use Swift Package Manager's security advisories.
  • Low · CI/CD configuration not fully analyzed — .github/workflows/ci.yml. The .github/workflows/ci.yml file was not provided in the analysis. This prevents verification of secure build pipeline practices, secrets management in CI/CD, and proper code signing procedures. Fix: Review CI/CD workflows to ensure: (1) No secrets are logged or exposed in build output, (2) Code signing certificates are securely managed, (3) Dependency verification is enabled, (4) Build artifacts are properly validated.
  • Low · Example project may contain hardcoded values — Example/ directory. The Example application directory contains multiple asset files and configuration. Example projects sometimes contain hardcoded API keys, test credentials, or other sensitive values that could be accidentally committed. Fix: Ensure the Example project: (1) Does not contain real API keys or credentials, (2) Uses placeholder values for all sensitive configuration, (3) Includes .env or config files in .gitignore if they contain secrets.

LLM-derived; treat as a starting point, not a security audit.


Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.

Healthy signals · xmartlabs/XLActionController — RepoPilot