calimarkus/JDStatusBarNotification
Highly customizable & feature rich notifications. Interactive dismiss. Custom Views. SwiftUI. Tap-to-hold. Progress. Written in Swift, compatible for ObjC!
Looks unmaintained — solo project with stale commits
worst of 4 axeslast commit was 1y ago; single-maintainer (no co-maintainers visible)…
Has a license, tests, and CI — clean foundation to fork and modify.
Documented and popular — useful reference codebase to read through.
last commit was 1y ago; no CI workflows detected
- ✓MIT licensed
- ✓Tests present
- ⚠Stale — last commit 1y ago
Show 2 more →Show less
- ⚠Solo or near-solo (1 contributor active in recent commits)
- ⚠No CI workflows detected
What would change the summary?
- →Use as dependency Mixed → Healthy if: 1 commit in the last 365 days; onboard a second core maintainer
- →Deploy as-is Mixed → Healthy if: 1 commit in the last 180 days
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.
[](https://repopilot.app/r/calimarkus/jdstatusbarnotification)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/calimarkus/jdstatusbarnotification on X, Slack, or LinkedIn.
Onboarding doc
Onboarding: calimarkus/JDStatusBarNotification
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:
- 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. - 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.
- Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/calimarkus/JDStatusBarNotification 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
AVOID — Looks unmaintained — solo project with stale commits
- MIT licensed
- Tests present
- ⚠ Stale — last commit 1y ago
- ⚠ Solo or near-solo (1 contributor active in recent commits)
- ⚠ No CI workflows 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 calimarkus/JDStatusBarNotification
repo on your machine still matches what RepoPilot saw. If any fail,
the artifact is stale — regenerate it at
repopilot.app/r/calimarkus/JDStatusBarNotification.
What it runs against: a local clone of calimarkus/JDStatusBarNotification — 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 calimarkus/JDStatusBarNotification | Confirms the artifact applies here, not a fork |
| 2 | License is still MIT | Catches relicense before you depend on it |
| 3 | Default branch main exists | Catches branch renames |
| 4 | Last commit ≤ 538 days ago | Catches sudden abandonment since generation |
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of calimarkus/JDStatusBarNotification. If you don't
# have one yet, run these first:
#
# git clone https://github.com/calimarkus/JDStatusBarNotification.git
# cd JDStatusBarNotification
#
# 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 calimarkus/JDStatusBarNotification and re-run."
exit 2
fi
# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "calimarkus/JDStatusBarNotification(\\.git)?\\b" \\
&& ok "origin remote is calimarkus/JDStatusBarNotification" \\
|| miss "origin remote is not calimarkus/JDStatusBarNotification (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 main >/dev/null 2>&1 \\
&& ok "default branch main exists" \\
|| miss "default branch main no longer exists"
# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 538 ]; then
ok "last commit was $days_since_last days ago (artifact saw ~508d)"
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/calimarkus/JDStatusBarNotification"
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).
⚡TL;DR
JDStatusBarNotification is a Swift library that displays customizable, interactive notifications anchored below the iOS status bar/notch/Dynamic Island. It provides drag-to-dismiss gestures, progress bars, activity indicators, custom views (UIView and SwiftUI), and multiple built-in styles (pill-shaped and full-width) with adaptive layouts that work across device orientations and safe area configurations. Layered architecture: JDStatusBarNotification/Public/ exports the public API (NotificationPresenter, styles), while JDStatusBarNotification/Private/ contains implementation: NotificationWindow (UIWindow subclass for overlay), NotificationViewController (view controller lifecycle), NotificationView (layout logic), NotificationAnimator (gesture and animation state), and StyleCache (caching layer). ExampleProject demonstrates three integration patterns: classic AppDelegate, SceneDelegate, and pure SwiftUI with custom style editor.
👥Who it's for
iOS app developers (Swift and Objective-C) who need production-grade status bar notifications with rich customization without building dismissal logic, animation state machines, or safe-area-aware layout code from scratch.
🌱Maturity & risk
Production-ready and actively maintained. The codebase is 162KB Swift with well-organized public/private separation, includes comprehensive documentation in JDStatusBarNotification.docc/, supports multiple installation methods (SPM, CocoaPods, Carthage), and has multiple example projects demonstrating SwiftUI, AppDelegate, and SceneDelegate integration patterns.
Low risk: single maintainer (calimarkus) but the scope is well-defined and stable—notifications are a UI feature with limited API surface. No heavy dependency list visible in repo structure. Main risk is iOS version changes (must track safe area APIs for notch/Island), and the library's reliance on UIWindow manipulation for overlay presentation which can conflict with other window management libraries.
Active areas of work
Recent activity includes SwiftUI modifier exports and style customization enhancements (see ObservableCustomStyle.swift in ExampleProject suggesting Observable pattern adoption). The docc documentation structure is being actively maintained with guides on GettingStarted, NotificationPresenter, StatusBarNotificationStyle, and SwiftUIModifiers.
🚀Get running
git clone https://github.com/calimarkus/JDStatusBarNotification.git
cd JDStatusBarNotification
open JDStatusBarNotification.xcodeproj
# Select 'ExampleApp (SwiftUI)' scheme and press Cmd+R to run
Daily commands: Open ExampleProject in Xcode, select one of three schemes: 'ExampleApp (SwiftUI)', 'ExampleApp (AppDelegate)', or 'ExampleApp (SceneDelegate)', then Cmd+R. The SwiftUI example includes a live StyleEditorScreen for experimenting with colors, fonts, and animations.
🗺️Map of the codebase
- JDStatusBarNotification/Private/NotificationWindow.swift: Core UIWindow subclass that manages overlay presentation and safe area positioning for notch/Island/landscape
- JDStatusBarNotification/Private/NotificationView.swift: Implements adaptive layout logic for pill vs full-width, handles custom views (UIView/SwiftUI), and manages progress/activity indicator layout
- JDStatusBarNotification/Private/NotificationAnimator.swift: Orchestrates drag-to-dismiss gestures, slide animations, and state machine for interruption handling
- JDStatusBarNotification/Private/StyleCache.swift: Performance optimization layer that caches style computations to avoid recalculating colors/fonts per frame
- ExampleProject/StyleEditorScreen.swift: Live UI demonstrating every customizable parameter (fonts, colors, layout modes); essential reference for understanding style API surface
- JDStatusBarNotification.docc/StatusBarNotificationStyle.md: Authority on style customization API; defines all configurable properties and their effects
🛠️How to make changes
Start in JDStatusBarNotification/Public/ to understand the public API (NotificationPresenter.swift and styles). For layout changes, edit JDStatusBarNotification/Private/NotificationView.swift. For animation/gesture behavior, modify NotificationAnimator.swift. For new styles, extend StatusBarNotificationStyle.swift or copy ExampleStyle.swift pattern from ExampleProject/.
🪤Traps & gotchas
NotificationWindow uses keyWindow which is deprecated in iOS 13+; code must handle SceneDelegate contexts where multiple windows exist. Drag-to-dismiss uses UIDynamicBehavior internally—check NotificationAnimator.swift for spring constant assumptions. Safe area insets are cached at window creation time; rotation mid-animation may require recalculation (see DiscoveryHelper.swift). Custom SwiftUI views must explicitly manage their size proposals or layout will collapse.
💡Concepts to learn
- Safe Area Insets — JDStatusBarNotification must adapt layout for notch, Dynamic Island, and landscape safe areas; DiscoveryHelper.swift and NotificationWindow.swift rely on UIScene.windows and safeAreaInsets API to position correctly
- UIWindow Overlay Pattern — Core architectural pattern: NotificationWindow is a transparent UIWindow placed above the app window to render notifications; understanding window layering and event handling is critical to modifying presentation logic
- UIDynamicBehavior — NotificationAnimator uses UISnapBehavior for spring-physics when user drags notification to dismiss; understanding Dynamics helps modify gesture response and snap-to-position thresholds
- CABasicAnimation — Slide-in, fade, and rotation animations for notification presentation are layer-based; CABasicAnimation knowledge helps customize timing curves and duration properties visible in StyleCache
- UIGestureRecognizer State Machine — Drag-to-dismiss is implemented as a UIPanGestureRecognizer with state tracking; understanding .began, .changed, .ended, .cancelled states is essential for the dismissal interrupt logic in NotificationAnimator
- SwiftUI View Bridging (@ViewBuilder, UIViewRepresentable) — Custom views parameter in NotificationView supports both UIView and SwiftUI View; the library uses view bridging to embed SwiftUI into UIKit window—key to understanding ExampleProject's custom view examples
- DocC Documentation Catalogs — This repo uses Swift DocC (.docc folder structure) for API docs; understanding how to write .md files with symbol links and tutorials helps maintain and extend the documentation
🔗Related repos
SDCAlertView/SDCAlertView— Alternative alert/notification UI library with similar customization goals; good reference for comparison of dismissal patternstoast-swift/Toast-Swift— Toast notification library solving similar overlay-presentation problem; reference for alternative safe-area and animation strategiesTSMessages/TSMessages— Predecessor UIKit notification library (Objective-C era); JDStatusBarNotification modernizes this approach for Swift/SwiftUIpointfreeco/swift-composable-architecture— If building state-heavy notification orchestration, TCA provides patterns for managing notification queue and lifecycleapple/swift-docc— This repo uses DocC for documentation; reference implementation for API docs generation used here
🪄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 NotificationAnimator.swift
The Tests directory only contains API_tests.m and SwiftAPI_tests.swift with basic API coverage. NotificationAnimator.swift handles critical animation logic (timing, transitions, interruptions) but lacks dedicated unit tests. This is high-value because animation bugs are hard to catch in manual testing and affect user experience across all notification presentations.
- [ ] Create Tests/NotificationAnimatorTests.swift
- [ ] Add tests for animation state transitions (show/hide/dismiss)
- [ ] Add tests for drag-to-dismiss interruption scenarios
- [ ] Add tests for animation timing with different duration configurations
- [ ] Test animation cancellation and cleanup to prevent memory leaks
- [ ] Add the test file to the Tests.xcscheme
Add GitHub Actions workflow for automated testing and SwiftPM validation
The repo supports both CocoaPods (JDStatusBarNotification.podspec) and SwiftPM (Package.swift) but has no CI/CD pipeline. With multiple example app schemes, test targets, and Objective-C compatibility, automated validation on every PR would catch regressions early. This is specific because the .spi.yml exists but no corresponding GitHub Actions workflow exists.
- [ ] Create .github/workflows/swift-tests.yml
- [ ] Add job to run Tests.xcscheme on iOS 16+ simulator
- [ ] Add job to validate SwiftPM build with
swift build - [ ] Add job to validate CocoaPods with
pod lib lint - [ ] Add job to build all three example app schemes
- [ ] Ensure Objective-C compatibility is tested (API_tests.m runs)
Document the StyleCache.swift caching mechanism and add StyleCache unit tests
StyleCache.swift is a private utility that likely handles style performance optimization, but there's no documentation in JDStatusBarNotification.docc explaining how style caching works or when to invalidate it. Combined with missing unit tests, this creates maintenance risk. This is valuable because custom style users need to understand caching behavior to avoid bugs.
- [ ] Create Tests/StyleCacheTests.swift with tests for cache hit/miss scenarios
- [ ] Add tests for cache invalidation when styles are modified
- [ ] Add tests for thread safety if applicable
- [ ] Create JDStatusBarNotification.docc/StyleCaching.md documentation
- [ ] Document cache behavior in NotificationStyle.swift docstring
- [ ] Add example in ExampleProject showing custom style with cache considerations
🌿Good first issues
- Add unit tests for NotificationAnimator.swift's gesture velocity calculations and snap-to-dismiss thresholds—currently no test coverage visible for the 'tap-to-hold' timing logic mentioned in README
- Document the StyleCache invalidation strategy in JDStatusBarNotification.docc/—no explanation exists for when/how to clear the cache when styles are updated at runtime (see ObservableCustomStyle.swift pattern)
- Create a Combine example in ExampleProject (parallel to ObservableCustomStyle.swift's Swift Observation pattern) showing how to bind notification state to a PassthroughSubject for older iOS versions
📝Recent commits
Click to expand
Recent commits
42e0fac— update CHANGELOG (calimarkus)c4d3713— update hosted docs (calimarkus)d6c7f18— also add style example to SwiftUIModifiers article (calimarkus)9dea442— bump podspec (calimarkus)8214549— update hosted docs (calimarkus)b0ee4c6— exten docs (calimarkus)11568c7— bring back credit in code comment (calimarkus)c7fc4d0— update README (calimarkus)3443d2d— update docs (calimarkus)1319dd1— mv SwiftUI-Info.plist to /ExampleProject (calimarkus)
🔒Security observations
This is a well-structured Swift/Objective-C UI notification library with no critical security vulnerabilities identified. The codebase appears to be a UI component library focused on presentation logic rather than handling sensitive data or external inputs. Primary concerns are legacy Objective-C code maintenance and ensuring dependencies are properly locked. The library demonstrates good security practices by being primarily focused on UI rendering without apparent injection risks, hardcoded credentials, or misconfigurations. Recommendations focus on modernization and dependency management best practices.
- Low · Objective-C Legacy Code Present —
ExampleProject/SBAppDelegate.h, ExampleProject/SBAppDelegate.m, ExampleProject/SBExampleViewController.h, ExampleProject/SBExampleViewController.m, ExampleProject/SBSceneDelegate.h, ExampleProject/SBSceneDelegate.m, Tests/API_tests.m, ExampleProject/main.m. The codebase contains Objective-C files (SBAppDelegate.m, SBAppDelegate.h, SBExampleViewController.m, SBExampleViewController.h, SBSceneDelegate.m, SBSceneDelegate.h, API_tests.m, main.m) alongside Swift code. While not a direct vulnerability, Objective-C runtime is more susceptible to certain types of attacks and memory safety issues compared to Swift. Fix: Consider migrating Objective-C code to Swift for improved memory safety and modern language features. If legacy support is necessary, ensure strict code review and security testing for Objective-C components. - Low · Potential Information Disclosure via Documentation —
JDStatusBarNotification.docc/, docs/ directory. The repository contains extensive documentation and generated docs files that could potentially expose implementation details. While documentation is important, sensitive implementation patterns should be carefully reviewed. Fix: Review documentation files to ensure no sensitive implementation details, internal APIs, or security-critical information is exposed. Maintain a clear separation between public API documentation and internal implementation details. - Low · Missing Dependency Lock File —
Package.swift, Package.resolved (missing from file listing). The Package.swift file structure is present but no visible lock file (Package.resolved) is shown in the provided file listing. This could indicate potential supply chain risks if dependencies are not pinned to specific versions. Fix: Ensure Package.resolved is committed to version control to lock dependency versions. Regularly audit dependencies for known vulnerabilities using tools like 'swift package update' with security advisories.
LLM-derived; treat as a starting point, not a security audit.
👉Where to read next
- Open issues — current backlog
- Recent PRs — what's actively shipping
- Source on GitHub
Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.