RepoPilotOpen in app →

jonkykong/SideMenu

Simple side/slide menu control for iOS, no code necessary! Lots of customization. Add it to your project in 5 minutes or less.

Mixed

Stale — last commit 3y ago

worst of 4 axes
Use as dependencyMixed

last commit was 3y ago; top contributor handles 91% of recent commits…

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.

  • 8 active contributors
  • MIT licensed
  • CI configured
Show 3 more →
  • Stale — last commit 3y ago
  • Single-maintainer risk — top contributor 91% of recent commits
  • No test directory detected
What would change the summary?
  • Use as dependency MixedHealthy if: 1 commit in the last 365 days; diversify commit ownership (top <90%)

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 "Forkable" badge

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

Variant:
RepoPilot: Forkable
[![RepoPilot: Forkable](https://repopilot.app/api/badge/jonkykong/sidemenu?axis=fork)](https://repopilot.app/r/jonkykong/sidemenu)

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

Onboarding doc

Onboarding: jonkykong/SideMenu

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/jonkykong/SideMenu 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

WAIT — Stale — last commit 3y ago

  • 8 active contributors
  • MIT licensed
  • CI configured
  • ⚠ Stale — last commit 3y ago
  • ⚠ Single-maintainer risk — top contributor 91% of recent commits
  • ⚠ No test directory detected

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

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

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

# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "jonkykong/SideMenu(\\.git)?\\b" \\
  && ok "origin remote is jonkykong/SideMenu" \\
  || miss "origin remote is not jonkykong/SideMenu (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 "Pod/Classes/SideMenuManager.swift" \\
  && ok "Pod/Classes/SideMenuManager.swift" \\
  || miss "missing critical file: Pod/Classes/SideMenuManager.swift"
test -f "Pod/Classes/SideMenuNavigationController.swift" \\
  && ok "Pod/Classes/SideMenuNavigationController.swift" \\
  || miss "missing critical file: Pod/Classes/SideMenuNavigationController.swift"
test -f "Pod/Classes/SideMenuTransitionController.swift" \\
  && ok "Pod/Classes/SideMenuTransitionController.swift" \\
  || miss "missing critical file: Pod/Classes/SideMenuTransitionController.swift"
test -f "Pod/Classes/SideMenuPresentationController.swift" \\
  && ok "Pod/Classes/SideMenuPresentationController.swift" \\
  || miss "missing critical file: Pod/Classes/SideMenuPresentationController.swift"
test -f "Pod/Classes/SideMenuAnimationController.swift" \\
  && ok "Pod/Classes/SideMenuAnimationController.swift" \\
  || miss "missing critical file: Pod/Classes/SideMenuAnimationController.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 1216 ]; then
  ok "last commit was $days_since_last days ago (artifact saw ~1186d)"
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/jonkykong/SideMenu"
  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

SideMenu is a Swift library that implements slide-in side menu controls for iOS apps with zero-code storyboard setup and eight built-in animation styles. It wraps UIViewController presentation logic (via SideMenuPresentationController, SideMenuAnimationController) to enable hamburger menus that slide from the left or right edges with gesture recognition and customizable behavior—no boilerplate required. Pod-based library structure: core logic in Pod/Classes/ (SideMenuManager.swift, SideMenuNavigationController.swift, SideMenuPresentationController.swift, SideMenuAnimationController.swift, SideMenuInteractionController.swift handle presentation flow). Example/ contains a runnable demo app. Presentation styles defined in SideMenuPresentationStyle.swift; push coordination in SideMenuPushCoordinator.swift.

👥Who it's for

iOS developers building Swift apps who need a production-ready side menu without implementing custom UIViewControllerTransitioningDelegate logic. Particularly valuable for teams that want storyboard-based UI with minimal code coupling.

🌱Maturity & risk

Mature and stable: has 4+ years of active history, CI/CD via CircleCI, CocoaPods/Carthage/SPM support, and clear versioning. However, maintainer notes the project needs active community contributors ('SideMenu needs your help!'), suggesting reduced active development pace despite production-quality code.

Single-maintainer risk is explicit (jon kent actively soliciting help). No visible test suite in file list (ExampleTests/ exists but no unit tests for core Pod/Classes/ logic). Dependency count appears minimal (Swift stdlib + UIKit only), lowering breakage risk, but lack of automated tests means regressions could slip through on iOS version updates.

Active areas of work

No specific recent commit data visible in file list, but repo is accepting issues via .github/ISSUE_TEMPLATE/ and CONTRIBUTING.md is present, indicating ongoing community engagement. No active milestones or PRs documented in provided file structure.

🚀Get running

git clone https://github.com/jonkykong/SideMenu.git && cd SideMenu && open SideMenu.xcworkspace && pod install (if needed). Run Example/Main.storyboard in Xcode 12+ simulator to see demo.

Daily commands: Open SideMenu.xcworkspace in Xcode → select Example scheme → Cmd+R. No external services or build steps needed; SPM users: swift build.

🗺️Map of the codebase

  • Pod/Classes/SideMenuManager.swift — Central singleton managing SideMenu configuration, presentation, and gesture handling—every integration point flows through this.
  • Pod/Classes/SideMenuNavigationController.swift — Core navigation controller wrapper that presents side menus and manages the transition between main and menu view controllers.
  • Pod/Classes/SideMenuTransitionController.swift — Orchestrates custom transition animations and interactive gestures, defining the visual presentation behavior.
  • Pod/Classes/SideMenuPresentationController.swift — UIPresentationController subclass controlling layout, dimming, and positioning of the side menu during presentation.
  • Pod/Classes/SideMenuAnimationController.swift — Implements the interactive animation logic for menu slide-in/slide-out with gesture responsiveness.
  • Pod/Classes/SideMenuInteractionController.swift — Handles pan gesture recognition and drives interactive transition updates during user swipe gestures.
  • Example/MainViewController.swift — Primary example demonstrating how to integrate SideMenu and trigger menu presentation from application code.

🧩Components & responsibilities

  • SideMenuManager — Central singleton coordinator; manages menu view controller registration, gesture

🛠️How to make changes

Customize menu presentation style and animation

  1. Open Pod/Classes/SideMenuPresentationStyle.swift and review enum cases (slideIn, slideOut, dissolve, inOut) to understand available styles. (Pod/Classes/SideMenuPresentationStyle.swift)
  2. In your view controller, access SideMenuManager.default and set the menu's presentationStyle property before showing. (Pod/Classes/SideMenuManager.swift)
  3. Optionally adjust animation duration, dimming, and gesture settings via SideMenuManager.default options (defined in SideMenuManager). (Pod/Classes/SideMenuManager.swift)

Add a new side menu to the app

  1. Create a new UIViewController (e.g., RightMenuViewController) with your menu items and layout. (Example/SideMenuTableViewController.swift)
  2. Wrap it in SideMenuNavigationController and configure via its init method in your trigger action. (Pod/Classes/SideMenuNavigationController.swift)
  3. Call SideMenuManager.default.leftMenuViewController or rightMenuViewController = wrapped instance to register globally. (Pod/Classes/SideMenuManager.swift)
  4. Present the menu using SideMenuManager.default.show(menu: .left) or .right from any view controller. (Pod/Classes/SideMenuManager.swift)

Handle menu item selection and navigate to destination

  1. In your menu table or collection view delegate (e.g., SideMenuTableViewController), respond to didSelectRowAt. (Example/SideMenuTableViewController.swift)
  2. Dismiss the menu and push/present the destination controller on the menu's presentation context. (Example/SideMenuTableViewController.swift)
  3. Alternatively, set SideMenuManager delegate callbacks to handle navigation logic centrally from the manager. (Pod/Classes/SideMenuManager.swift)

Adjust gesture detection and interaction sensitivity

  1. Access SideMenuManager.default and modify enableSwipeGestures, alwaysAnimate, and panGestureEnabled properties. (Pod/Classes/SideMenuManager.swift)
  2. Review SideMenuInteractionController.swift to understand pan threshold and velocity calculations if custom tuning is needed. (Pod/Classes/SideMenuInteractionController.swift)
  3. Test swipe sensitivity by enabling/disabling gestures and monitoring gesture delegate callbacks in SideMenuManager. (Pod/Classes/SideMenuManager.swift)

🔧Why these technologies

  • UIViewControllerTransitioningDelegate & custom UIPresentationController — Enables flexible, customizable view controller transitions without requiring snapshot-based animation frameworks; allows interactive gesture control.
  • UIPanGestureRecognizer with interactive transition controller — Provides smooth, user-driven swipe-to-dismiss and swipe-to-open gestures with real-time progress feedback.
  • Swift with minimal dependencies — Keeps the library lightweight and easy to integrate into any iOS project without dependency bloat.
  • CocoaPods, Carthage, and Swift Package Manager support — Maximizes adoption across different iOS project dependency ecosystems.

⚖️Trade-offs already made

  • Single global SideMenuManager singleton

    • Why: Simplifies API and reduces boilerplate for typical single-menu use cases.
    • Consequence: Multi-menu apps must carefully manage state transitions; not ideal for complex nested menu scenarios.
  • Custom UIViewController transitions instead of UINavigationController push/pop

    • Why: Allows full control over animation style and presentation (slide, dissolve, etc.) and enables interactive gestures.
    • Consequence: Requires explicit navigation setup in child view controllers; less automatic back-button handling than UINavigationController.
  • No built-in table/collection view controller—users provide their own

    • Why: Maximum flexibility; users can design menus however they want (table, collection, custom).
    • Consequence: Slightly more setup work; requires users to implement menu item selection and navigation logic.

🚫Non-goals (don't propose these)

  • Does not provide built-in menu UI components; users supply their own UIViewController for menu content.
  • Does not handle app routing or deep linking; menu navigation is manual.
  • Does not integrate with UINavigationController push/pop stack by default.
  • Not designed for split-view iPad layouts or multi-pane navigation patterns.

🪤Traps & gotchas

Storyboard-based setup requires exact class assignments in Identity Inspector (SideMenuNavigationController class, SideMenuManager segue identifiers)—typos fail silently. Pod version pinning via CocoaPods.lock critical; Swift Package Manager integration may lag behind CocoaPods releases. Interactive gesture panRecognizer requires careful state management if mixing with other UIGestureRecognizers.

🏗️Architecture

💡Concepts to learn

  • SlideMenuControllerSwift/SlideMenuControllerSwift — Direct competitor: slide menu for Swift/iOS with similar zero-code storyboard goal; compare animation approach and customization API
  • Ramotion/side-menu-animation — Alternative with focus on animation effects; examine their CABasicAnimation patterns vs SideMenu's UIViewPropertyAnimator approach
  • InteractiveSwift/Interactive — Gesture-driven interactive transitions library; foundational concept SideMenu builds on (UIPercentDrivenInteractiveTransition patterns)
  • apple/swift-package-manager — SideMenu supports SPM; understanding Package.swift in this repo helps debug dependency resolution and binary availability
  • CocoaPods/CocoaPods — Primary distribution method for SideMenu; Podfile/Podspec patterns in this repo follow CocoaPods conventions

🪄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 comprehensive unit tests for SideMenuManager.swift

The ExampleTests directory only contains ExampleTests.swift with minimal test coverage. SideMenuManager.swift is the core orchestration class but has no dedicated unit tests. Adding tests for manager initialization, presentation/dismissal logic, and state management would improve code reliability and serve as documentation for contributors.

  • [ ] Create ExampleTests/SideMenuManagerTests.swift with test cases for SideMenuManager initialization
  • [ ] Add test cases for menu presentation, dismissal, and state transitions
  • [ ] Test SideMenuManager configuration properties (e.g., animation settings, presentation styles)
  • [ ] Update .circleci/config.yml to run unit tests as part of CI/CD pipeline if not already configured

Add GitHub Actions workflow for automated testing and deployment

The repo uses CircleCI (.circleci/config.yml) and Travis CI (.travis.yml) for CI, but adding a GitHub Actions workflow would provide native GitHub integration, reduce external dependencies, and make it easier for contributors to see test results directly in PRs. This is especially valuable for a community-maintained library.

  • [ ] Create .github/workflows/test.yml to run unit tests on push and pull requests
  • [ ] Configure the workflow to test against multiple iOS/Xcode versions
  • [ ] Add build verification step to ensure Example project compiles cleanly
  • [ ] Document the new workflow in CONTRIBUTING.md for contributor awareness

Add API documentation comments to core SideMenu classes

The Pod/Classes directory contains 14+ Swift files but several lack comprehensive documentation comments (e.g., SideMenuAnimationController.swift, SideMenuInteractionController.swift, SideMenuTransitionController.swift). Adding DocC-compatible comments would enable Xcode Quick Help and improve IDE autocomplete for library users.

  • [ ] Add documentation comments to SideMenuManager.swift public methods and properties
  • [ ] Document SideMenuPresentationStyle.swift enum cases and their visual effects
  • [ ] Add parameter and return value documentation to SideMenuAnimationController.swift animation methods
  • [ ] Create a DOCUMENTATION.md or update README with links to generated DocC output

🌿Good first issues

  • Add unit tests for Pod/Classes/SideMenuAnimationController.swift covering all 8 animation styles; currently ExampleTests/ has no coverage for animation timing or presentation logic
  • Document the SideMenuNavigationControllerDelegate protocol methods with code examples in README; currently only list-level docs exist
  • Add Xcode snippet templates (.codesnippet files) for common customizations (setting menu width, disabling gestures, custom colors) to reduce onboarding friction

Top contributors

Click to expand

📝Recent commits

Click to expand
  • 8bd4fd1 — Update podspec (jonkykong)
  • 8b71ddf — Merge pull request #1 from CLoutas/bugfix-crash-on-unwrapping-presentationController (CLoutas)
  • f09c4d0 — Fix Implicitly Unwrapped Optional Crash (CLoutas)
  • 38aa59c — Create FUNDING.yml (jonkykong)
  • be2ac45 — Change default behavior of statusBarEndAlpha as its caused confusion for users who haven't read the documentation. (jonkykong)
  • c451180 — Updated cocoapods (jonkykong)
  • 224581c — Updated podspec (jonkykong)
  • 2f4d99a — Minor bugfix for interactive pop gesture settings getting overwritten (jonkykong)
  • e10c8b8 — Switch to safer weak declarations to avoid memory access crashes (jonkykong)
  • 8314bde — Comment spelling correction (jonkykong)

🔒Security observations

The SideMenu iOS library demonstrates a generally secure codebase structure. No critical security vulnerabilities were identified through static analysis of the file structure, configuration files, or visible code patterns. The project uses standard iOS dependency management via CocoaPods and has CI/CD configured with CircleCI. Primary recommendations involve enhancing dependency vulnerability scanning in the CI/CD pipeline and following CocoaPods best practices regarding dependency management. The codebase does not appear to contain hardcoded secrets, injection vulnerabilities, or misconfigurations based on available file structure analysis. Regular dependency auditing and security scanning tool integration would further improve the security posture.

  • Low · Podfile.lock in Version Control — Podfile.lock, Pods/Manifest.lock. The Podfile.lock file is committed to the repository. While this can be intentional for reproducible builds, it may contain pinned versions of dependencies with known vulnerabilities that are not being actively updated. Fix: Regularly audit and update dependencies. Consider implementing automated dependency scanning in CI/CD pipeline (CircleCI is already configured). Use tools like CocoaPods vulnerabilities scanner or Snyk.
  • Low · Missing Security Headers in CI Configuration — .circleci/config.yml. The CircleCI configuration (.circleci/config.yml) is present but standard security scanning practices are not evident from the file structure. No SAST or dependency scanning tools are explicitly visible. Fix: Integrate security scanning tools in CI/CD pipeline such as: SwiftLint for code quality, CocoaPods vulnerability scanning, or third-party SAST tools. Add explicit security checks to the build process.
  • Low · Pods Directory in Version Control — Pods/. The entire 'Pods' directory is committed to the repository. This increases repository size and can make dependency vulnerabilities harder to track. Fix: Remove Pods directory from version control by adding it to .gitignore. Users should run 'pod install' after cloning. This is the standard CocoaPods practice and reduces repository bloat.

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.

Mixed signals · jonkykong/SideMenu — RepoPilot