RepoPilotOpen in app →

huri000/SwiftEntryKit

SwiftEntryKit is a presentation library for iOS. It can be used to easily display overlays within your iOS apps.

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.

  • 14 active contributors
  • MIT licensed
  • CI configured
Show 3 more →
  • Tests present
  • Stale — last commit 2y ago
  • Single-maintainer risk — top contributor 84% of recent commits

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/huri000/swiftentrykit)](https://repopilot.app/r/huri000/swiftentrykit)

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/huri000/swiftentrykit on X, Slack, or LinkedIn.

Onboarding doc

Onboarding: huri000/SwiftEntryKit

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/huri000/SwiftEntryKit 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

  • 14 active contributors
  • MIT licensed
  • CI configured
  • Tests present
  • ⚠ Stale — last commit 2y ago
  • ⚠ Single-maintainer risk — top contributor 84% of recent commits

<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 huri000/SwiftEntryKit repo on your machine still matches what RepoPilot saw. If any fail, the artifact is stale — regenerate it at repopilot.app/r/huri000/SwiftEntryKit.

What it runs against: a local clone of huri000/SwiftEntryKit — 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 huri000/SwiftEntryKit | 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 ≤ 758 days ago | Catches sudden abandonment since generation |

<details> <summary><b>Run all checks</b> — paste this script from inside your clone of <code>huri000/SwiftEntryKit</code></summary>
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of huri000/SwiftEntryKit. If you don't
# have one yet, run these first:
#
#   git clone https://github.com/huri000/SwiftEntryKit.git
#   cd SwiftEntryKit
#
# 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 huri000/SwiftEntryKit and re-run."
  exit 2
fi

# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "huri000/SwiftEntryKit(\\.git)?\\b" \\
  && ok "origin remote is huri000/SwiftEntryKit" \\
  || miss "origin remote is not huri000/SwiftEntryKit (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 "Sources/SwiftEntryKit/EntryKit.swift" \\
  && ok "Sources/SwiftEntryKit/EntryKit.swift" \\
  || miss "missing critical file: Sources/SwiftEntryKit/EntryKit.swift"
test -f "Sources/SwiftEntryKit/Model/EKAttributes.swift" \\
  && ok "Sources/SwiftEntryKit/Model/EKAttributes.swift" \\
  || miss "missing critical file: Sources/SwiftEntryKit/Model/EKAttributes.swift"
test -f "Sources/SwiftEntryKit/View/EKWindowProvider.swift" \\
  && ok "Sources/SwiftEntryKit/View/EKWindowProvider.swift" \\
  || miss "missing critical file: Sources/SwiftEntryKit/View/EKWindowProvider.swift"
test -f "Sources/SwiftEntryKit/View/EKRootViewController.swift" \\
  && ok "Sources/SwiftEntryKit/View/EKRootViewController.swift" \\
  || miss "missing critical file: Sources/SwiftEntryKit/View/EKRootViewController.swift"
test -f "Sources/SwiftEntryKit/Animation/AnimationController.swift" \\
  && ok "Sources/SwiftEntryKit/Animation/AnimationController.swift" \\
  || miss "missing critical file: Sources/SwiftEntryKit/Animation/AnimationController.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 758 ]; then
  ok "last commit was $days_since_last days ago (artifact saw ~728d)"
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/huri000/SwiftEntryKit"
  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

SwiftEntryKit is a lightweight iOS presentation library that displays custom overlays, banners, and pop-ups (called 'Entries') above your app's UI without requiring view controller management. It handles the complexity of positioning, animation, dismissal, and queuing for you—letting you present alerts, notifications, or custom views with a single function call and a configuration struct. Standard Swift package structure: core library code lives in SwiftEntryKit/ directory with .swift files for presentation logic, while /Example contains a complete demo app with Xcode project, Podfile, and runnable presets. CI configured via .travis.yml; package distributed as CocoaPod via .podspec.json.

👥Who it's for

iOS app developers (both Swift and Objective-C) who need to display contextual notifications, alerts, or custom overlays and want to avoid the boilerplate of managing separate UIWindow instances, layout constraints, and animation timing. Popular in apps that show status messages, error toasts, or interactive pop-ups.

🌱Maturity & risk

Production-ready and actively maintained. The repo shows 379K lines of Swift code, CocoaPods/Carthage/SPM distribution support, comprehensive example project in /Example, CI/CD via Travis CI (.travis.yml present), and a detailed CHANGELOG.md indicating regular releases. Last activity appears recent based on the structured GitHub templates and established CI setup.

Low risk—single-maintainer repo (huri000) but no obvious breaking API changes in recent history; CHANGELOG is well-maintained. Main risk is single maintainer creating potential slow response times for critical bugs. Dependency footprint is minimal (no external pods visible in core library, though Example project uses CocoaPods). No visible dependency bloat or version conflicts in Podspec.

Active areas of work

No specific commit history visible in the data provided, but the presence of CONTRIBUTING.md, CODE_OF_CONDUCT.md, and GitHub issue templates (.github/ISSUE_TEMPLATE/bug_report.md, feature_request.md) indicates active community engagement and maintenance. The structured Example project suggests ongoing refinement for developer experience.

🚀Get running

git clone https://github.com/huri000/SwiftEntryKit.git
cd SwiftEntryKit/Example
pod install
open SwiftEntryKit.xcworkspace
# Select SwiftEntryKitDemo scheme and build

Daily commands: Open /Example/SwiftEntryKit.xcworkspace in Xcode, select the SwiftEntryKitDemo scheme, and press Cmd+R to run. The demo app showcases all presets and customization options.

🗺️Map of the codebase

  • Sources/SwiftEntryKit/EntryKit.swift — Main entry point and API surface for the library; all presentations funnel through this singleton manager
  • Sources/SwiftEntryKit/Model/EKAttributes.swift — Core configuration model defining how overlays are positioned, animated, and styled—every entry uses these attributes
  • Sources/SwiftEntryKit/View/EKWindowProvider.swift — Manages the UIWindow hierarchy that holds overlays above the app's main content—critical for rendering layer
  • Sources/SwiftEntryKit/View/EKRootViewController.swift — Root view controller managing the presentation and dismissal lifecycle of overlay views
  • Sources/SwiftEntryKit/Animation/AnimationController.swift — Orchestrates entrance, display, and exit animations for all overlay types
  • Sources/SwiftEntryKit/View/EntryView.swift — Base class wrapping user-provided content; handles layout, gestures, and interaction state
  • Example/SwiftEntryKit/AppDelegate.swift — Demo app entry point showing common usage patterns and configuration examples

🧩Components & responsibilities

  • EntryKit (Singleton Manager) (Swift, Foundation) — Public API entry point; coordinates display, dismissal, and queue management across the entire library
    • Failure mode: If EntryKit crashes, all overlay displays fail; no fallback presentation method
  • EKWindowProvider (UIKit (UIWindow, UIViewController)) — Creates and manages the UIWindow hierarchy; ensures overlay window stays above app key window
    • Failure mode: If window creation fails, overlays cannot render; may silently fail without error callback
  • EKRootViewController (UIKit (UIViewController, UIView)) — Root view controller hosting entry views; handles safe area, status bar, and lifecycle
    • Failure mode: View hierarchy corruption can cause overlays to misposition or become unresponsive
  • AnimationController (Core Animation (CABasicAnimation, CATransaction)) — Orchestrates entrance and exit animations using Core Animation
    • Failure mode: Animation failures degrade gracefully (content still visible but not animated)
  • EntryView (Content Wrapper) — Wraps user-provided content; applies layout constraints, gesture recognition

🛠️How to make changes

Create a custom overlay notification

  1. Create your custom UIView subclass to display your content (Example/SwiftEntryKit/ViewController.swift)
  2. Configure EKAttributes with position, animation, and dismissal behavior (Sources/SwiftEntryKit/Model/EKAttributes.swift)
  3. Call EntryKit.display(entry:, using:) with your view and configured attributes (Sources/SwiftEntryKit/EntryKit.swift)

Add a new preset overlay style

  1. Create a struct conforming to EKAttributes in Sources/SwiftEntryKit/Model/Presets/ (Sources/SwiftEntryKit/Model/EKAttributes.swift)
  2. Define positioning, animation, and appearance using EKAttributes enums (Sources/SwiftEntryKit/Model/EKAttributes+Position.swift)
  3. Add example usage in Example/SwiftEntryKit/ demonstrating the preset (Example/SwiftEntryKit/ViewController.swift)

Customize animation timing and easing

  1. Modify EKAttributes.Animation with desired duration and delay values (Sources/SwiftEntryKit/Model/EKAttributes+Animation.swift)
  2. Adjust AnimationController's CABasicAnimation properties for easing curves (Sources/SwiftEntryKit/Animation/AnimationController.swift)
  3. Pass custom attributes to EntryKit.display() when showing the overlay (Sources/SwiftEntryKit/EntryKit.swift)

Handle user interaction and custom gestures

  1. Configure EKAttributes.UserInteraction for tap/swipe/pan handling (Sources/SwiftEntryKit/Model/EKAttributes.swift)
  2. Implement gesture handlers in EntryView's gesture recognition logic (Sources/SwiftEntryKit/View/EntryView.swift)
  3. Call EntryKit.dismiss() or custom completion handlers from gesture callbacks (Sources/SwiftEntryKit/EntryKit.swift)

🔧Why these technologies

  • UIWindow-based overlay layer — Ensures overlays appear above all app content including navigation bars and tab bars without interfering with gesture handling
  • CABasicAnimation for transitions — Provides smooth, hardware-accelerated animations with precise timing control and spring effects
  • Singleton EntryKit manager — Simplifies API surface; one global state manager for all overlay displays and dismissals
  • FIFO queue for presentations — Prevents UI thrashing when multiple overlays are queued; ensures predictable display order

⚖️Trade-offs already made

  • Global window on top of key window instead of custom presentation controller

    • Why: Simpler implementation; works with any view hierarchy without needing presenting ViewController
    • Consequence: Less integration with UIViewController lifecycle; requires manual safe area and status bar handling
  • Wrapping user content in EntryView rather than requiring protocol conformance

    • Why: Developers can pass any UIView without modification; no boilerplate
    • Consequence: Less type safety; EntryView must handle wide range of content sizes and behaviors
  • Synchronous queue processing (one entry at a time)

    • Why: Prevents visual chaos; maintains clear presentation order and predictable behavior
    • Consequence: Cannot show multiple overlays simultaneously; sequential presentation feels slower for batches

🚫Non-goals (don't propose these)

  • Does not integrate with UIViewController presentation API (UIPresentationController)
  • Does not provide real-time notification channels or push notification handling
  • Does not manage app lifecycle events or in-app messaging subscriptions
  • Does not support non-English text layout or RTL languages (relies on system defaults)

🪤Traps & gotchas

iOS deployment target constraints (likely iOS 11+ based on modern UIKit patterns—verify in .podspec); safe area handling required for notch/Dynamic Island devices (documented in README but easy to forget in custom layouts). Entry window level manipulation can conflict with other overlay libraries—use the windowLevel attribute carefully. Orientation changes require manual constraint updates if using custom views; use the documented 'Dealing With Orientation Change' section to avoid layout bugs. CocoaPods vs. SPM distribution may have subtle differences; test with both package managers if contributing.

🏗️Architecture

💡Concepts to learn

  • UIWindow layering and windowLevel — SwiftEntryKit overlays work by creating separate UIWindow instances with custom windowLevel values; understanding z-order and window hierarchy is critical to prevent your overlays from being hidden or hiding unexpected UI
  • Safe Area (notches, Dynamic Island, home indicator) — The library explicitly documents 'Dealing With Safe Area' as a key feature; custom views in overlays must respect safeAreaInsets to render correctly on modern iPhones with notches or Dynamic Island
  • View controller lifecycle and rotation (orientation changes) — SwiftEntryKit supports displaying view controllers as overlays and requires manual constraint management on orientation changes; misunderstanding trait collections and rotational callbacks leads to layout bugs
  • Gesture recognizers and hit testing (user interaction) — The library's 'User Interaction' attribute controls whether entries intercept touches and affects how swipe-to-dismiss and tap-to-dismiss gestures work; misconfigurations break interactive overlays
  • CABasicAnimation and CAAnimationGroup (animations) — SwiftEntryKit's animation system uses Core Animation; customizing entry entrance/exit animations requires understanding keyframe animations and timing functions
  • Haptic feedback (UIFeedbackGenerator) — The library supports haptic feedback configuration; leveraging this correctly enhances perceived responsiveness but misuse (excessive vibrations) degrades UX
  • Message queuing and precedence (FIFO vs. priority-based display) — SwiftEntryKit's 'Precedence' attribute (Override/Enqueue/DisplayPriority) manages how multiple simultaneous entries are scheduled; understanding the heuristics prevents entries from being swallowed or displayed out of expected order
  • notchmeister/SwiftMessages — Popular alternative iOS message banner library with more built-in styles and simpler API, but less customizable positioning
  • RxSwiftCommunity/RxAlertViewable — Reactive wrapper for alerts and overlays using RxSwift; complements SwiftEntryKit if your app uses reactive streams
  • Daltron/NotificationBanner — Lightweight notification banner library focused on top-of-screen banners; overlaps with SwiftEntryKit's use case but less feature-rich
  • jrendel/SwiftKeychainWrapper — Common companion dependency for iOS apps storing sensitive data securely alongside UI layers like those powered by SwiftEntryKit
  • onevcat/Kingfisher — Widely used in example apps and real projects alongside SwiftEntryKit for loading images in custom overlay views

🪄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.

Migrate from Travis CI to GitHub Actions workflow

The repo currently uses .travis.yml for CI/CD (visible in file structure), but GitHub Actions is now the standard for GitHub-hosted projects. This would modernize the CI pipeline, improve integration with GitHub, and reduce external dependencies. The migration would involve creating a new workflow file that runs the example project tests and builds.

  • [ ] Create .github/workflows/ci.yml to build and test the example project
  • [ ] Add Swift version matrix testing (e.g., Swift 5.1+) in the workflow
  • [ ] Add step to run Example/SwiftEntryKit.xcodeproj tests using xcodebuild
  • [ ] Add step to validate the pod spec with 'pod spec lint'
  • [ ] Update README.md to reference the new GitHub Actions badge instead of Travis CI
  • [ ] Consider removing or archiving .travis.yml after verification

Add comprehensive unit tests for SwiftEntryKit core presentation logic

The file structure shows Example/ and Example/SwiftEntryKitTests but no visible test files in the source directory. Core presentation library functionality (overlay positioning, animation timing, state management) should have dedicated unit tests. This improves code reliability and makes future refactoring safer.

  • [ ] Create Tests/SwiftEntryKitTests/ directory structure
  • [ ] Add EKWindowTests.swift to test the main presentation window logic
  • [ ] Add EKAttributesTests.swift to test attribute configuration and validation
  • [ ] Add EKAnimationTests.swift to test entry/exit animation calculations
  • [ ] Add EKPresenterTests.swift to test the core presentation state machine
  • [ ] Ensure test coverage is tracked in .codecov.yml and CI workflow

Create SPM (Swift Package Manager) support with Package.swift manifest

The repo supports CocoaPods and Carthage but no Package.swift exists for SPM support. Since Swift Package Manager is now the standard package manager for Swift libraries and many developers prefer it, adding SPM support would increase adoption without breaking existing dependency managers.

  • [ ] Create Package.swift at the repository root with proper version and dependencies
  • [ ] Specify the correct library target(s) matching the existing source structure
  • [ ] Add SPM badge to README.md
  • [ ] Test the package with 'swift build' and 'swift test' commands
  • [ ] Verify SPM integration works in Example project by adding as a local dependency
  • [ ] Document SPM installation instructions in README.md (add to installation section)

🌿Good first issues

  • Add unit tests for the entry queueing logic in the core library (precedence/override/enqueue heuristics)—test files appear absent from the file structure, leaving behavior verification gaps.
  • Expand the presets documentation in README with code examples showing how to customize animations, shadow, and border for each preset type (currently listed but not exemplified in detail).
  • Add an example preset for dark mode support—create a .darkStyle() variant in the demo that adapts colors to trait collections and add it to the Example app's ViewController.

Top contributors

Click to expand

📝Recent commits

Click to expand
  • 5ad36cc — Release 2.0.0 (#361) (huri000)
  • cf1cde7 — Update CHANGELOG.md (huri000)
  • c2d4257 — release(1.2.7): Version bump (#331) (huri000)
  • a5db589 — fix(Division by Zero): #320 - guard division by 0 (robertodias180)
  • 2bff39f — #324: make previous window key again after dismissal (#329) (huri000)
  • cafba39 — Update CHANGELOG.md (huri000)
  • f280a02 — release(1.2.6): bump to 1.2.6 (#310) (huri000)
  • ddb673a — UITextField Delegate Functionality (#307) (alexnrhodes)
  • 64d45a9 — fix(Rollback Window): #308 - keep a weak reference to the key window at the time of generating the entry window, to be u (huri000)
  • ccc71fd — release(1.2.5): additional accessibility support (#305) (huri000)

🔒Security observations

SwiftEntryKit is a presentation library with a reasonable security posture. The main concern is the committed 'Pods' directory in version control, which should be excluded. The project would benefit from enhanced CI/CD security integration (SAST, dependency scanning, secret detection) and a formal security policy for vulnerability reporting. No evidence of hardcoded secrets, injection vulnerabilities, or critical misconfigurations was found in the analyzed files. The library itself, being primarily UI-focused, has lower risk for common vulnerabilities like SQLi or XSS, but dependency management and infrastructure security practices should be strengthened.

  • Medium · Pods Directory Committed to Repository — Example/Pods/. The 'Example/Pods' directory is committed to version control. This directory contains third-party dependencies and can become outdated, create merge conflicts, and increase repository size. It's a best practice to exclude this directory and use dependency managers to install packages. Fix: Add 'Pods/' to .gitignore and ensure developers run 'pod install' after cloning the repository. Consider using a Podfile.lock file for reproducible builds.
  • Low · Missing or Outdated Security Configuration — .travis.yml. .travis.yml file is present but CI/CD security practices should be reviewed. No evidence of secret scanning, SAST, or dependency vulnerability scanning in the visible configuration. Fix: Integrate security scanning tools such as Snyk, Dependabot, or similar services. Enable secret scanning to prevent accidental credential commits. Consider using GitHub's native security features if hosted on GitHub.
  • Low · No Code Signing Configuration Visible — Example/SwiftEntryKit.xcodeproj/project.pbxproj. For an iOS application library, code signing and certificate management should be properly configured. No explicit code signing configuration is visible in the provided file structure. Fix: Ensure proper code signing identities are used. Use automatic signing when possible and manage provisioning profiles securely. Avoid hardcoding signing certificates in the repository.
  • Low · Lack of Security Documentation — Repository Root. There is no visible SECURITY.md or security policy document for reporting vulnerabilities responsibly. Fix: Create a SECURITY.md file with instructions for responsible vulnerability disclosure. This allows security researchers to report issues privately.

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 · huri000/SwiftEntryKit — RepoPilot