RepoPilotOpen in app →

teodorpatras/EasyTipView

Fully customisable tooltip view in Swift for iOS.

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.

  • 22+ active contributors
  • MIT licensed
  • CI configured
Show 3 more →
  • Tests present
  • Stale — last commit 3y ago
  • Concentrated ownership — top contributor handles 70% 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/teodorpatras/easytipview)](https://repopilot.app/r/teodorpatras/easytipview)

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

Onboarding doc

Onboarding: teodorpatras/EasyTipView

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/teodorpatras/EasyTipView 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

  • 22+ active contributors
  • MIT licensed
  • CI configured
  • Tests present
  • ⚠ Stale — last commit 3y ago
  • ⚠ Concentrated ownership — top contributor handles 70% 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 teodorpatras/EasyTipView repo on your machine still matches what RepoPilot saw. If any fail, the artifact is stale — regenerate it at repopilot.app/r/teodorpatras/EasyTipView.

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

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

# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "teodorpatras/EasyTipView(\\.git)?\\b" \\
  && ok "origin remote is teodorpatras/EasyTipView" \\
  || miss "origin remote is not teodorpatras/EasyTipView (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/EasyTipView/EasyTipView.swift" \\
  && ok "Sources/EasyTipView/EasyTipView.swift" \\
  || miss "missing critical file: Sources/EasyTipView/EasyTipView.swift"
test -f "Sources/EasyTipView/UIKitExtensions.swift" \\
  && ok "Sources/EasyTipView/UIKitExtensions.swift" \\
  || miss "missing critical file: Sources/EasyTipView/UIKitExtensions.swift"
test -f "Example/EasyTipView/ViewController.swift" \\
  && ok "Example/EasyTipView/ViewController.swift" \\
  || miss "missing critical file: Example/EasyTipView/ViewController.swift"
test -f "Package.swift" \\
  && ok "Package.swift" \\
  || miss "missing critical file: Package.swift"
test -f "EasyTipView.podspec" \\
  && ok "EasyTipView.podspec" \\
  || miss "missing critical file: EasyTipView.podspec"

# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 1081 ]; then
  ok "last commit was $days_since_last days ago (artifact saw ~1051d)"
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/teodorpatras/EasyTipView"
  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

EasyTipView is a fully customizable tooltip/popover library written in pure Swift for iOS that displays hint bubbles pointing to UIView or UIBarItem instances with automatic arrow direction adjustment and smooth animations. It solves the problem of adding native-feeling onboarding tooltips and contextual hints without building custom CALayer geometry or complex positioning logic. Simple framework structure: Sources/EasyTipView/EasyTipView.swift contains the core tooltip logic, UIKitExtensions.swift adds helper methods, Example/ holds a standalone demo app, and Tests/ contains unit tests. No package split—it's a single-module library.

👥Who it's for

iOS developers building tutorial flows, feature callouts, or contextual help systems who want drop-in tooltip UI without managing arrow geometry, positioning math, or animation timing themselves.

🌱Maturity & risk

Actively maintained and production-ready: supports Swift 5.0+, has CI via Travis CI, includes a working example app, and provides both CocoaPods and Carthage/SPM distribution. The codebase is stable (main logic in Sources/EasyTipView/EasyTipView.swift ~60KB of Swift code) with test coverage in Tests/EasyTipViewTests/Tests.swift.

Low-to-moderate risk: single-maintainer project (teodorpatras) with no visible external dependencies, reducing supply-chain risk. Main risk is iOS-version compatibility drift—the library targets iOS UIKit which evolves, but no indication of SwiftUI support means future iOS versions may require adaptation. Test coverage appears minimal based on file count.

Active areas of work

No recent commit data visible in provided metadata, so cannot determine current active development status. Look at GitHub commit history and PR queue to assess momentum.

🚀Get running

git clone https://github.com/teodorpatras/EasyTipView.git && cd EasyTipView && open EasyTipView.xcworkspace (uses Xcode workspace to manage example and main library targets together). Run tests via Xcode or xcodebuild test -workspace EasyTipView.xcworkspace -scheme EasyTipView.

Daily commands: Open EasyTipView.xcworkspace in Xcode, select the Example/EasyTipView-Example scheme, and Run (⌘R) on a simulator or device. The example ViewController.swift shows basic initialization (EasyTipView.show(animated:for:superview:with:) and dismiss patterns).

🗺️Map of the codebase

  • Sources/EasyTipView/EasyTipView.swift — Core tooltip view implementation containing all presentation logic, customization options, and lifecycle management—the foundation of the entire library.
  • Sources/EasyTipView/UIKitExtensions.swift — Critical UIKit extensions that enable geometry calculations, view positioning, and arrow drawing—required for proper tooltip placement and rendering.
  • Example/EasyTipView/ViewController.swift — Primary example implementation demonstrating all major customization patterns and usage scenarios that developers must understand.
  • Package.swift — Swift Package Manager manifest defining library metadata, platforms, and versioning—essential for understanding supported environments.
  • EasyTipView.podspec — CocoaPods specification defining library configuration, version, and distribution metadata.
  • Tests/EasyTipViewTests/Tests.swift — Test suite covering core functionality and edge cases—critical for understanding expected behavior and regression prevention.

🧩Components & responsibilities

  • EasyTipView (Main Class) (UIView, CABasicAnimation, UITapGestureRecognizer) — Orchestrates tooltip lifecycle (init, show, hide), manages preferences/appearance, handles animations, and coordinates with UIView hierarchy. Owns presentation state and gesture handling.
    • Failure mode: Unhandled frame calculations leading to off-screen tooltips; animation timing conflicts if shown/hidden rapidly.
  • UIKitExtensions (Geometry & Drawing) (CGGeometry, Quartz 2D, UIBezierPath) — Provides pure functions for positioning calculations (arrow offset, tooltip frame), custom path drawing (arrows), and safe area checks. Stateless utility layer.
    • Failure mode: Incorrect frame calculations in edge cases (near screen edges, landscape rotation); arrow rendering artifacts from bezier path errors.
  • Preferences (Configuration) (Swift Struct, UIColor, UIFont) — Value struct containing all visual customization options (colors, fonts, dimensions, corner radius). Immutable configuration passed at initialization.
    • Failure mode: Invalid color/font combinations causing poor readability; overly large preferences values breaking layout constraints.
  • ArrowPosition & Direction Enums (Swift Enum) — Type-safe enum representations of arrow placement (top/bottom/left/right) and preferred tooltip direction. Used for geometry routing.
    • Failure mode: Unimplemented position cases in drawing logic causing crashes; ambiguous diagonal positions leading to undefined behavior.

🔀Data flow

  • Developer Code (ViewController.swift)EasyTipView.init(text, preferences, arrowPosition) — Developer creates EasyTipView instance with tooltip text, customization Preferences, and arrow direction.
  • EasyTipViewUIKitExtensions.calculateFrames() — On show(), EasyTipView calls geometry helpers to compute tooltip position, arrow offset, and safe screen insets.
  • UIKitExtensionsEasyTipView (frame result) — Geometry functions return calculated CGRect frame and arrow position; EasyTipView applies to self.frame property.
  • EasyTipViewCALayer (via — undefined

🛠️How to make changes

Customize Tooltip Appearance

  1. Open Sources/EasyTipView/EasyTipView.swift and locate the Preferences struct which contains backgroundColor, textColor, font, and borderWidth properties. (Sources/EasyTipView/EasyTipView.swift)
  2. Create a custom Preferences instance with your desired colors, fonts, and dimensions, then pass it to EasyTipView.Preferences during initialization. (Sources/EasyTipView/EasyTipView.swift)
  3. Reference Example/EasyTipView/ViewController.swift to see complete customization patterns including corner radius, border color, and shadow effects. (Example/EasyTipView/ViewController.swift)

Add a New Tooltip Arrow Position

  1. Open Sources/EasyTipView/EasyTipView.swift and find the ArrowPosition enum which defines top, bottom, left, right positioning options. (Sources/EasyTipView/EasyTipView.swift)
  2. Add a new case to the ArrowPosition enum (e.g., 'topLeft' or 'bottomRight') for diagonal positioning. (Sources/EasyTipView/EasyTipView.swift)
  3. Update the arrow drawing logic in UIKitExtensions.swift in the drawArrow() function to handle the new position case. (Sources/EasyTipView/UIKitExtensions.swift)
  4. Add test cases to Tests/EasyTipViewTests/Tests.swift validating the new arrow position renders correctly. (Tests/EasyTipViewTests/Tests.swift)

Add Animation Transitions

  1. In Sources/EasyTipView/EasyTipView.swift, locate the show() and hide() methods where CABasicAnimation instances are configured. (Sources/EasyTipView/EasyTipView.swift)
  2. Modify the duration, timingFunction, or add additional CAAnimationGroup properties to create custom entrance/exit animations. (Sources/EasyTipView/EasyTipView.swift)
  3. Test the new animations in Example/EasyTipView/ViewController.swift by presenting tooltips with different configurations. (Example/EasyTipView/ViewController.swift)

🔧Why these technologies

  • Swift 5.0+ — Modern, type-safe iOS development language with improved performance and ABI stability for production tooltip library.
  • UIKit — Native iOS framework enabling direct view hierarchy manipulation, custom drawing via CALayers, and gesture handling for tooltip interactions.
  • Core Animation (CABasicAnimation, CALayer) — Provides efficient, GPU-accelerated animations for smooth fade, scale, and position transitions with minimal CPU overhead.
  • Quartz 2D (CGContext) — Low-level drawing API for custom arrow shape rendering with precise control over geometry and bezier paths.

⚖️Trade-offs already made

  • UIKit-only (no SwiftUI support in current version)

    • Why: Simpler codebase, broader device compatibility back to iOS 9, and well-tested UIView drawing patterns.
    • Consequence: SwiftUI projects must wrap EasyTipView in UIViewRepresentable; newer projects may prefer SwiftUI-native tooltip libraries.
  • Lightweight, zero external dependencies

    • Why: Minimizes bundle size and eliminates dependency version conflicts in integrator projects.
    • Consequence: All geometry, animation, and drawing logic must be custom-implemented; no reuse of proven third-party solutions.
  • Manual frame calculation and positioning logic

    • Why: Allows pixel-perfect control over tooltip placement relative to target views and screen boundaries.
    • Consequence: Complex edge cases (near screen edges, rotation, dynamic content) require careful testing and maintenance.
  • Preferences-based configuration (struct pattern)

    • Why: Value semantics enable immutable configuration and easy copying/modification without mutation side effects.
    • Consequence: Global state changes require recreating entire Preferences instances; less suitable for reactive/binding-based patterns.

🚫Non-goals (don't propose these)

  • SwiftUI native support (UIKit-only)
  • Keyboard avoidance or safe area auto-adjustment
  • Multi-line truncation with ellipsis (simple string text only)
  • Accessibility (VoiceOver) integration
  • Animation customization via closures or CATransaction hooks
  • Automatic content sizing based on text intrinsic size

🪤Traps & gotchas

EasyTipView uses CABasicAnimation for presentation/dismissal—custom animation blocks in Preferences.animationIn/Out may not respect safe area or notch insets on modern iPhones if not carefully implemented. The library integrates via UIView.addSubview() and handles its own tap-to-dismiss detection; conflicts can arise if parent view has gesture recognizers with overlapping tap regions. No explicit thread-safety docs visible—animations must be driven from main thread (standard UIKit constraint but not documented in README).

🏗️Architecture

💡Concepts to learn

  • CABasicAnimation — EasyTipView's presentation/dismissal uses CABasicAnimation for opacity and transform changes; understanding timing, keyPath, and fromValue/toValue is essential to customize animations in Preferences.animationIn/Out.
  • Hit Testing (UIView.hitTest) — EasyTipView implements custom tap-to-dismiss via hit testing to detect taps outside the tooltip bubble; understanding point-in-bounds logic prevents gesture recognizer conflicts.
  • Safe Area Layout Guides — UIKitExtensions.swift calculates positioning relative to superview safe areas to avoid notches and home indicators; incorrect safe area handling causes tooltips to overlap system UI.
  • CGPath and Bezier Curves — Arrow geometry (the triangular pointer) is drawn using UIBezierPath; understanding cubic curves and path operations is needed to extend arrow shapes beyond the four cardinal directions.
  • Delegate Pattern — EasyTipView uses weak delegate properties to notify callers of lifecycle events (didShow, didDismiss); understanding weak reference semantics prevents retain cycles in animation callbacks.
  • CGGeometry (CGPoint, CGRect, CGSize) — Positioning logic relies heavily on frame calculations, bounds unions, and offset math to place the tooltip adjacent to target views without clipping; CGGeometry is the primitive abstraction.
  • Transform and Affine Matrix Operations — EasyTipView animations use CGAffineTransform (scale, translate) to achieve entrance effects; animating the transform property in CABasicAnimation requires understanding matrix composition.
  • marmelroy/Pop — Similar popover/tooltip library for iOS with Facebook's Pop animation engine, alternative for developers wanting physics-based animations.
  • pkluz/PKHUD — Lightweight HUD/toast notification library; complementary for displaying short-lived contextual messages alongside persistent tooltips.
  • airbnb/lottie-ios — Animation library that can enhance EasyTipView presentation with complex Lottie animations instead of basic CABasicAnimation.
  • Alamofire/Alamofire — Networking library often paired with onboarding/tooltip flows in real apps to fetch tip content from backends.
  • vapor/vapor — Swift server framework—EasyTipView is client-side iOS, but Vapor backends commonly serve feature flag and tooltip metadata to mobile clients.

🪄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 EasyTipView.swift core functionality

Tests/EasyTipViewTests/Tests.swift exists but is sparse. The main EasyTipView.swift file lacks coverage for positioning logic, customization options, and edge cases. A contributor could add tests for: tooltip positioning (top/bottom/left/right), custom styling (colors, fonts, border radius), animation behavior, and constraint calculations for different screen sizes and device orientations.

  • [ ] Examine Sources/EasyTipView/EasyTipView.swift to identify positioning and layout methods
  • [ ] Add test cases in Tests/EasyTipViewTests/Tests.swift for each positioning direction
  • [ ] Add tests for EasyTipView preferences/configuration options
  • [ ] Add tests for UIKitExtensions.swift helper methods used by EasyTipView
  • [ ] Ensure tests cover iPad and iPhone layouts with different orientations

Migrate from Travis CI to GitHub Actions workflow

The repo has .travis.yml but no GitHub Actions workflow. Modern GitHub-hosted projects should use GitHub Actions for CI/CD. This would involve creating a .github/workflows/ directory with a Swift build and test workflow that replaces the Travis CI setup, providing faster feedback and better integration with the GitHub interface.

  • [ ] Create .github/workflows/swift.yml or similar
  • [ ] Add steps to checkout code, set up Swift environment, build the library (via Package.swift), and run tests
  • [ ] Verify workflow runs on multiple Swift versions and macOS versions
  • [ ] Update README.md to replace Travis CI badge with GitHub Actions badge
  • [ ] Remove or deprecate .travis.yml once workflow is verified

Add SwiftUI support documentation and example in Example app

The library currently supports UIKit (based on Sources/EasyTipView/EasyTipView.swift using UIView). The Example/EasyTipView/ViewController.swift shows UIKit usage, but there's no documentation or example for SwiftUI integration. A contributor could add a SwiftUI wrapper/bridge and include example code in Example/EasyTipView showing how to use EasyTipView in SwiftUI applications, filling a gap for modern Swift developers.

  • [ ] Create a new file Sources/EasyTipView/EasyTipViewSwiftUI.swift with a SwiftUI View wrapper around UIViewRepresentable
  • [ ] Add a new SwiftUI example view file in Example/EasyTipView/ demonstrating tooltip usage
  • [ ] Update README.md with a SwiftUI code example section
  • [ ] Add UIViewRepresentable bridging code to make EasyTipView easily usable in SwiftUI contexts
  • [ ] Ensure Example app ViewController.swift or a new SwiftUI view demonstrates the pattern

🌿Good first issues

  • Add unit tests for arrow direction calculation logic—Tests/EasyTipViewTests/Tests.swift is sparse; tests for EasyTipView's preferred arrow direction method under various superview bounds would catch regressions.
  • Document the Preferences struct properties in code comments—currently EasyTipView.Preferences has many customizable fields (textColor, backgroundColor, borderColor, font, etc.) with no per-field documentation; adding SwiftDoc comments would improve IDE hints.
  • Add SwiftUI wrapper example—Example/ only shows UIKit usage; a minimal SwiftUI wrapper (EasyTipViewModifier or similar) in a new Example/SwiftUIExample would unlock adoption in modern projects.

Top contributors

Click to expand

📝Recent commits

Click to expand
  • 8a91330 — Cannot build after changes to comply with podspec reqs (#201) (mikey-)
  • b69f6a7 — Update .travis.yml (teodorpatras)
  • 025a676 — Update README.md (teodorpatras)
  • 4d62861 — Update .travis.yml (teodorpatras)
  • 1cba0e7 — Complying to the new podspec requirements (teodorpatras)
  • 280633b — Bump version (teodorpatras)
  • 2f44309 — Update for Swift 5 (teodorpatras)
  • 7142f66 — Fix incorrect size calculation in tipViewSize and getContentRect (uson1x)
  • ce5f7c9 — Use UIEdgeInsets to set bubble/content insets (uson1x)
  • e4eec79 — Expose tap event via delegate (thepinyo-ascend)

🔒Security observations

The EasyTipView library shows reasonable security posture as a UI component library with no apparent code-level injection vulnerabilities, hardcoded secrets, or SQL-related risks. However, there are infrastructure and maintenance concerns: outdated Swift version targeting, deprecated CI/CD platform, and missing security policies. The project would benefit from modernization of tooling, dependency management verification, and establishing a security vulnerability disclosure process. As a UI-only library with minimal external dependencies, the overall risk is mitigated, but best practices should be implemented.

  • Medium · Outdated Swift Version Support — README.md, Package.swift. The README indicates Swift 5.0 support, but this is now significantly outdated. Swift 5.0 was released in 2019. Using outdated Swift versions may expose the application to known security vulnerabilities and lack modern security features available in current Swift versions. Fix: Update to the latest stable Swift version (5.9+) and test thoroughly. Update all CI/CD configurations and documentation accordingly.
  • Medium · Travis CI Usage — .travis.yml. The project uses Travis CI as indicated by .travis.yml file. Travis CI free tier for open source projects has been discontinued. The current CI/CD pipeline may be non-functional or relying on outdated infrastructure. Fix: Migrate to maintained CI/CD platforms such as GitHub Actions, GitLab CI, or CircleCI with proper security configurations and branch protection rules.
  • Low · Missing Security.md File — Repository root. No security policy or responsible disclosure file (SECURITY.md) is present in the repository. This makes it difficult for security researchers to report vulnerabilities responsibly. Fix: Create a SECURITY.md file documenting the process for reporting security vulnerabilities and the project's commitment to addressing them.
  • Low · No Dependency Pinning Information Available — Package.swift. Package.swift content was not provided for analysis. Unable to verify if dependencies are properly pinned to specific versions or use loose version constraints that could introduce vulnerability. Fix: Ensure all dependencies use specific version constraints or upper bounds to prevent automatic updates to potentially vulnerable versions. Consider using dependency scanning tools.
  • Low · Xcodeproj Files Checked Into Repository — EasyTipView.xcodeproj/project.pbxproj, Example/EasyTipView-Example.xcodeproj/project.pbxproj. Multiple .pbxproj files are checked into version control. These files can be prone to merge conflicts and may inadvertently expose configuration details. Fix: Consider using .gitignore to exclude .pbxproj files and use SPM/Carthage configuration files instead. Document build instructions clearly.

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 · teodorpatras/EasyTipView — RepoPilot