RepoPilotOpen in app →

Yummypets/YPImagePicker

📸 Instagram-like image picker & filters for iOS

Mixed

Mixed signals — read the receipts

worst of 4 axes
Use as dependencyMixed

no tests detected; no CI workflows detected

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.

  • Last commit 1w ago
  • 25+ active contributors
  • MIT licensed
Show 3 more →
  • Concentrated ownership — top contributor handles 62% of recent commits
  • No CI workflows detected
  • No test directory detected
What would change the summary?
  • Use as dependency MixedHealthy if: add a test suite

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/yummypets/ypimagepicker?axis=fork)](https://repopilot.app/r/yummypets/ypimagepicker)

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

Onboarding doc

Onboarding: Yummypets/YPImagePicker

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/Yummypets/YPImagePicker 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 — Mixed signals — read the receipts

  • Last commit 1w ago
  • 25+ active contributors
  • MIT licensed
  • ⚠ Concentrated ownership — top contributor handles 62% of recent commits
  • ⚠ No CI workflows detected
  • ⚠ 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 Yummypets/YPImagePicker repo on your machine still matches what RepoPilot saw. If any fail, the artifact is stale — regenerate it at repopilot.app/r/Yummypets/YPImagePicker.

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

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

# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "Yummypets/YPImagePicker(\\.git)?\\b" \\
  && ok "origin remote is Yummypets/YPImagePicker" \\
  || miss "origin remote is not Yummypets/YPImagePicker (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 "Source/Configuration/YPImagePickerConfiguration.swift" \\
  && ok "Source/Configuration/YPImagePickerConfiguration.swift" \\
  || miss "missing critical file: Source/Configuration/YPImagePickerConfiguration.swift"
test -f "Source/Filters/Photo/YPFilter.swift" \\
  && ok "Source/Filters/Photo/YPFilter.swift" \\
  || miss "missing critical file: Source/Filters/Photo/YPFilter.swift"
test -f "Source/Helpers/Permissions/YPPermissionManager.swift" \\
  && ok "Source/Helpers/Permissions/YPPermissionManager.swift" \\
  || miss "missing critical file: Source/Helpers/Permissions/YPPermissionManager.swift"
test -f "Source/Helpers/Extensions/AVAsset+Extensions.swift" \\
  && ok "Source/Helpers/Extensions/AVAsset+Extensions.swift" \\
  || miss "missing critical file: Source/Helpers/Extensions/AVAsset+Extensions.swift"
test -f "Source/Filters/Crop/YPCropView.swift" \\
  && ok "Source/Filters/Crop/YPCropView.swift" \\
  || miss "missing critical file: Source/Filters/Crop/YPCropView.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 40 ]; then
  ok "last commit was $days_since_last days ago (artifact saw ~10d)"
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/Yummypets/YPImagePicker"
  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

YPImagePicker is a pure Swift library that provides an Instagram-like photo and video picker UI for iOS apps. It includes built-in support for camera capture, photo library browsing, video recording/trimming, image cropping, real-time filters, flash control, and multiple selection—all with a polished, customizable interface that matches modern iOS design patterns. Modular structure: Example/ contains a runnable demo app (AppDelegate.swift, ExampleViewController.swift, storyboards); the main library code lives in a separate folder (inferred from SPM manifest at .swiftpm/xcode/); .swiftlint.yml enforces code quality. GitHub workflows and issue templates suggest CI automation. Pure Swift with some legacy Objective-C compatibility layer.

👥Who it's for

iOS app developers (Swift/Objective-C) who need a production-ready, feature-rich image/video picker component with Instagram-style UX, without building these capabilities from scratch. Particularly useful for social apps, messaging apps, and content creation tools.

🌱Maturity & risk

Production-ready and actively maintained. The repo shows 316KB of Swift code, supports both CocoaPods and SPM package managers, has comprehensive CI/CD setup (.github/ISSUE_TEMPLATE/, .swiftlint.yml), and demonstrates maturity through version tagging and dual distribution channels. Last activity suggests ongoing maintenance, though specific commit history not shown in this snapshot.

Low-to-medium risk: single maintainer (Yummypets org) is a potential concern, but the MIT license and established distribution (CocoaPods + SPM) reduce adoption friction. The 535 lines of Objective-C legacy code suggest potential bridging complexity. No open-issue or PR data visible, so backlog health is unknown. Dependency surface is likely small given the pure Swift approach, but PHAsset/AVFoundation framework dependencies tie this tightly to iOS platform APIs.

Active areas of work

No specific PR/issue/milestone data visible in the file snapshot, but the presence of multiple GitHub issue templates (bug_report.md, feature_request.md, custom.md) and a CODE_OF_CONDUCT.md indicate active community engagement. The repo is likely receiving bug reports and feature requests for filter improvements, video trimming UX, and API customization.

🚀Get running

Check README for instructions.

Daily commands: Open Example/Example.xcodeproj in Xcode, select the Example target, and press Run (Cmd+R). No external services required—the picker uses only on-device APIs (camera, photo library, filters).

🗺️Map of the codebase

  • Source/Configuration/YPImagePickerConfiguration.swift — Core configuration entry point defining all picker behavior, appearance, and constraints that every feature builds upon
  • Source/Filters/Photo/YPFilter.swift — Central filter abstraction and CIImage processing pipeline used by both photo and video filtering workflows
  • Source/Helpers/Permissions/YPPermissionManager.swift — Permission handling for camera and photo library access—required before any media capture or selection can occur
  • Source/Helpers/Extensions/AVAsset+Extensions.swift — Video asset utilities and thumbnail extraction that underpin video preview and processing workflows
  • Source/Filters/Crop/YPCropView.swift — Custom crop gesture handling and viewport rendering logic used in both photo and video crop screens
  • Source/Configuration/YPImageSize.swift — Image dimension constraints and scaling logic applied globally across picker output
  • Example/ExampleViewController.swift — Example integration showing picker initialization and callback patterns—reference implementation for adopters

🛠️How to make changes

Add a New Filter

  1. Define the filter parameters and CIFilter composition in YPFilter.swift, adding a new case to the filter enum and implementing CIImage transformation (Source/Filters/Photo/YPFilter.swift)
  2. Add the filter to the picker's filter list configuration in YPImagePickerConfiguration.swift under the filters array (Source/Configuration/YPImagePickerConfiguration.swift)
  3. Create thumbnail rendering logic in YPFilterCollectionViewCell.swift if custom preview needed (Source/Filters/Photo/YPFilterCollectionViewCell.swift)
  4. Test filter application in YPPhotoFiltersVC.swift and YPVideoFiltersVC.swift with live preview (Source/Filters/Photo/YPPhotoFiltersVC.swift)

Customize Picker Appearance

  1. Modify YPColors.swift to change the color scheme across the entire picker UI (Source/Configuration/YPColors.swift)
  2. Update YPFonts.swift to adjust typography for buttons, labels, and headers (Source/Configuration/YPFonts.swift)
  3. Replace icon assets in YPIcons.swift to use custom icon set (Source/Configuration/YPIcons.swift)
  4. Pass customized configuration object to YPImagePicker initialization in your view controller (Example/ExampleViewController.swift)

Add Localization Support

  1. Add new language string entries to YPWordings.swift with localized text for UI labels (Source/Configuration/YPWordings.swift)
  2. Update all screen type strings in YPPickerScreen.swift with localized variants (Source/Configuration/YPPickerScreen.swift)
  3. Pass localized YPImagePickerConfiguration to picker with language-specific wordings (Source/Configuration/YPImagePickerConfiguration.swift)

Request Media Permissions

  1. Check permission status and request camera/library access in YPPermissionManager.swift before presenting picker (Source/Helpers/Permissions/YPPermissionManager.swift)
  2. Handle permission denied state using YPPermissionDeniedPopup.swift to show user action dialog (Source/Helpers/Permissions/YPPermissionDeniedPopup.swift)
  3. Implement required Info.plist keys for NSCameraUsageDescription and NSPhotoLibraryUsageDescription (Example/Info.plist)

🔧Why these technologies

  • Core Image (CIImage) — Non-destructive, real-time filter application with GPU acceleration for smooth preview on mobile
  • AVFoundation — Native iOS video capture, composition, and export with hardware-level codec support for video filtering
  • Photos Framework (PHAsset) — Unified access to device photo library with caching and thumbnail generation without writing to disk
  • Swift 5 / UIKit — Type-safe, expressive language with UIKit for fine-grained control over custom gestures and crop interactions

⚖️Trade-offs already made

  • Custom crop view with gesture handling instead of using native crop UI

    • Why: Enables unified experience across photo and video, and matches Instagram-like customization requirements
    • Consequence: Higher maintenance burden for gesture state management and crop region calculations; potential edge cases on different device sizes
  • Real-time filter preview with CPU-backed CIImage rendering

    • Why: Provides immediate visual feedback without requiring intermediate encode/decode cycles
    • Consequence: May cause frame drops on older devices with slower GPUs during complex filter chains; requires memory management for large images
  • Configuration object with immutable settings vs runtime state mutations

    • Why: Prevents accidental UX inconsistencies and makes behavior predictable and testable
    • Consequence: Configuration must be set before picker initialization; cannot change themes mid-session
  • Permission checks at picker launch rather than lazy on first camera/library access

    • Why: Clear UX flow and predictable permission prompts upfront
    • Consequence: Users must grant permissions even if they only want to use one feature (e.g., only library, not camera)

🚫Non-goals (don't propose these)

  • Real-time video recording and streaming (only selection and post-processing)
  • Advanced video editing (trimming, transitions, multi-layer composition beyond basic export

🪤Traps & gotchas

Camera/Library permissions: The picker requires NSCameraUsageDescription and NSPhotoLibraryUsageDescription in Info.plist—missing these will cause runtime permission dialogs to fail silently or crash. Swift version: Built for Swift 5; older projects may face compatibility issues if forced into lower Swift versions. Asset import side effects: Example/Assets.xcassets contains many icon variants; if modifying the example app's app icon, ensure all size variants are present or Xcode will fail archive builds. Video codec constraints: Video trimming likely uses AVFoundation; some codec/container combinations may not be supported—test with actual video files. PhotosUI vs Photos: The library may use the older Photos.framework; newer iOS 14+ PhotosUI.framework features may not be available.

🏗️Architecture

💡Concepts to learn

  • AVFoundation video capture & trimming — Core to YPImagePicker's video recording and trim features; understanding AVCaptureSession, CMTime, and AVAsset is essential for video picker modifications.
  • Core Image filters (CIFilter) — Implements the real-time filter effects shown in the UI; YPImagePicker likely uses CIContext and filter chains to apply Instagram-like looks.
  • Photos framework (PHAsset, PHAssetCollection) — Powers the photo library picker—YPImagePicker must query albums, fetch images, and handle permissions via PHAsset APIs.
  • Storyboard-based UI + programmatic customization — YPImagePicker appears to use Storyboards (Main.storyboard, LaunchScreen.storyboard) for base layouts but allows runtime customization via config objects—understanding this hybrid approach is key to modifying UI.
  • Swift Package Manager (SPM) structure — YPImagePicker supports both CocoaPods and SPM distribution; understanding the Package.swift manifest and .swiftpm folder is needed to publish updates or fork for private use.
  • Image cropping & aspect ratio constraints — Crop feature likely involves custom gesture handling (UIPanGestureRecognizer, UIPinchGestureRecognizer) and CGAffineTransform math; essential for modifying crop UI behavior.
  • Permission handling (Camera, Photos, Microphone) — YPImagePicker must gracefully handle privacy prompts and fallbacks when permissions are denied; mishandling causes poor UX or app rejections.
  • coyotedev/PhotoBrowser — Alternative lightweight photo picker/browser for iOS; simpler but less feature-rich than YPImagePicker—useful to study for minimalist design patterns.
  • ivanvorobei/SwiftUI-Gallery — SwiftUI-based gallery/picker alternative; shows how to port image picking UX to modern SwiftUI if you're moving away from UIKit.
  • onevcat/Kingfisher — Popular Swift image loading/caching library; often used alongside YPImagePicker to handle downloaded/filtered image persistence.
  • uber/image-stitching — Advanced image manipulation library; useful if you need to extend YPImagePicker with multi-image stitching or advanced compositions.
  • Alamofire/Alamofire — De-facto HTTP client for iOS; commonly paired with YPImagePicker in apps that upload picked images to servers.

🪄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 GitHub Actions workflow for Swift linting and build validation

The repo has a .swiftlint.yml configuration file but no CI workflow to enforce it on PRs. This prevents contributors from catching style violations early and ensures consistent code quality across the codebase. A Swift build + SwiftLint workflow would be a high-value addition for maintainability.

  • [ ] Create .github/workflows/swift-lint-and-build.yml that runs on pull_request and push events
  • [ ] Configure workflow to run swift build and swiftlint against Source/ directory
  • [ ] Ensure workflow validates against .swiftlint.yml ruleset
  • [ ] Add status badge to README.md linking to workflow

Add unit tests for YPImagePickerConfiguration and Configuration modules

The Source/Configuration/ directory contains 5 configuration files (YPColors, YPFonts, YPIcons, YPImagePickerConfiguration, YPWordings, YPImageSize) that likely contain critical logic for app behavior, but there are no visible test files in the repo structure. These are ideal for unit testing to prevent regressions in customization options.

  • [ ] Create Tests/ directory at repo root
  • [ ] Add YPImagePickerConfigurationTests.swift testing configuration defaults and overrides
  • [ ] Add YPColorsTests.swift validating color palette initialization and accessibility
  • [ ] Add YPIconsTests.swift ensuring all required icons are properly configured
  • [ ] Integrate tests into the Swift package Package.swift as a test target

Create comprehensive feature documentation in README for configuration options

The README is incomplete (truncated at codebeat badge) and lacks documentation for the extensive configuration system visible in Source/Configuration/. New contributors and users can't discover customization options like YPColors, YPFonts, YPWordings, and YPImageSize without diving into source code.

  • [ ] Expand README.md with 'Configuration' section documenting YPImagePickerConfiguration
  • [ ] Add code examples showing how to customize YPColors, YPFonts, and YPWordings
  • [ ] Document YPPickerScreen enum options and YPImageSize configuration
  • [ ] Add table of all customizable properties with type and default value
  • [ ] Include before/after screenshots demonstrating color and font customization

🌿Good first issues

  • Add unit tests for the filter pipeline. Currently no Tests/ folder is visible in the file list—a new contributor could add XCTest cases for core filter operations (e.g., applying a filter to a UIImage, chaining filters).: Testing filters ensures visual output is predictable across device models and ensures regressions are caught early.
  • Expand README with code examples for common customization tasks (e.g., changing button colors, hiding the flash button, restricting video length). Currently the README is thin on configuration details.: Better onboarding docs reduce support burden and lower adoption friction for new users.
  • Refactor legacy Objective-C code (the 535 lines mentioned) into pure Swift or document the bridging layer. Create a doc or issue tracking which ObjC remnants remain and why.: Cleaner architecture and easier maintenance; helps new contributors understand why legacy code exists instead of deleting it by accident.

Top contributors

Click to expand

📝Recent commits

Click to expand
  • 6e9de9f — Merge pull request #851 from johnnyoin/master (NikKovIos)
  • 61cffdf — Call fitImage at loading if onlySquare (johnnyoin)
  • d89c0e1 — Merge pull request #844 from EchoLunar/master (NikKovIos)
  • 9118654 — Merge pull request #849 from techinpark/feature/exif (NikKovIos)
  • cf2d9c2 — Merge pull request #852 from arubio-z/master (NikKovIos)
  • 5f9a729 — Update YPLibraryVC.swift (arubio-z)
  • 582010f — refactor: Remove unused metadataForImageData method (techinpark)
  • ace5785 — Merge branch 'master' of https://github.com/techinpark/YPImagePicker into feature/exif (techinpark)
  • 45cda90 — Configure the background color of previewViewContainer.backgroundColor using YPConfig.colors.photoVideoScreenBackgroundC (droog)
  • 4f4f767 — Corrected crop and docs. (NikKovIos)

🔒Security observations

YPImagePicker is an Instagram-like media picker library with a relatively clean structure. The primary security concerns stem from incomplete data visibility: (1) Dependency files (Package.swift and Podfile) were not provided, preventing vulnerability assessment of third-party libraries - this is critical for a package distribution; (2) Core implementation files lack detailed review for input validation in media processing; (3) Permission handling and privacy compliance need verification. The codebase appears to follow good iOS practices (Swift, SPM support) but requires comprehensive dependency auditing and input validation review before assessment can be completed with high confidence.

  • Medium · Missing Package.swift Dependency Analysis — Package.swift. The Package.swift file content was not provided for analysis. This file defines all Swift Package Manager dependencies and their versions. Without reviewing it, we cannot verify if outdated or vulnerable dependencies are being used. Fix: Provide the complete Package.swift file content and cross-reference all dependencies against known vulnerability databases (NVD, GitHub Security Advisories). Use 'swift package update' with pinned versions to ensure reproducibility and regular security updates.
  • Medium · Podfile Dependency Management Not Reviewed — Podfile. The Podfile exists but its contents were not provided. CocoaPods dependencies may include vulnerable versions that could compromise the application. Without the actual dependency specifications, version constraints, and whether pod sources are verified, security cannot be fully assessed. Fix: Review Podfile to ensure: (1) all dependencies are from trusted sources, (2) versions are pinned or use appropriate version constraints, (3) regular dependency audits are performed using 'pod outdated', (4) consider using CocoaPods-based vulnerability scanning tools.
  • Low · No Visible Input Validation in File Structure — Source/Filters/Photo/, Source/Filters/Video/, Source/Helpers/Extensions/AVAsset+Extensions.swift. While the file structure shows photo/video picker functionality with filters, the actual implementation files' content was not provided for detailed analysis. Image processing and file handling can be vulnerable to malformed input if not properly validated. Fix: Ensure all media file inputs are validated for: (1) file type/magic numbers, (2) file size limits, (3) metadata sanitization to prevent exif injection attacks, (4) proper error handling for malformed media.
  • Low · Camera and Photo Library Permissions Not Visible — Example/Info.plist, Source/. The codebase handles camera access and photo library operations but the Info.plist privacy descriptions and permission request implementations are not fully visible in the provided structure. Improper permission handling can lead to unexpected behavior or security issues. Fix: Verify that Info.plist contains proper privacy descriptions for: NSCameraUsageDescription, NSPhotoLibraryUsageDescription, NSPhotoLibraryAddOnlyUsageDescription. Implement proper permission request flows using AVCaptureDevice and PHPhotoLibrary with appropriate error handling.
  • Low · No Code Signing Configuration Visible — Project configuration files. The provided file structure does not include explicit code signing configurations or provisioning profiles. While this may be managed through Xcode, lack of visible security configuration documentation is a minor concern. Fix: Ensure automatic code signing is properly configured in Xcode build settings. Verify that the correct development team and provisioning profiles are used. Document code signing requirements for contributors.

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 · Yummypets/YPImagePicker — RepoPilot