RepoPilotOpen in app β†’

pedrommcarrasco/Brooklyn

🍎 Screensaver inspired by Apple's Event on October 30, 2018

Mixed

Stale β€” last commit 2y ago

worst of 4 axes
Use as dependencyMixed

last commit was 2y ago; no tests 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.

  • βœ“13 active contributors
  • βœ“MIT licensed
  • βœ“CI configured
Show 3 more β†’
  • ⚠Stale β€” last commit 2y ago
  • ⚠Concentrated ownership β€” top contributor handles 73% of recent commits
  • ⚠No test directory detected
What would change the summary?
  • β†’Use as dependency Mixed β†’ Healthy if: 1 commit in the last 365 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.

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

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

Onboarding doc

Onboarding: pedrommcarrasco/Brooklyn

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/pedrommcarrasco/Brooklyn 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 2y ago

  • 13 active contributors
  • MIT licensed
  • CI configured
  • ⚠ Stale β€” last commit 2y ago
  • ⚠ Concentrated ownership β€” top contributor handles 73% 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 pedrommcarrasco/Brooklyn repo on your machine still matches what RepoPilot saw. If any fail, the artifact is stale β€” regenerate it at repopilot.app/r/pedrommcarrasco/Brooklyn.

What it runs against: a local clone of pedrommcarrasco/Brooklyn β€” 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 pedrommcarrasco/Brooklyn | 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 ≀ 608 days ago | Catches sudden abandonment since generation |

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

# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "pedrommcarrasco/Brooklyn(\\.git)?\\b" \\
  && ok "origin remote is pedrommcarrasco/Brooklyn" \\
  || miss "origin remote is not pedrommcarrasco/Brooklyn (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 "Brooklyn/Contexts/BrooklynManager.swift" \\
  && ok "Brooklyn/Contexts/BrooklynManager.swift" \\
  || miss "missing critical file: Brooklyn/Contexts/BrooklynManager.swift"
test -f "Brooklyn/Contexts/Screen Saver/BrooklynView.swift" \\
  && ok "Brooklyn/Contexts/Screen Saver/BrooklynView.swift" \\
  || miss "missing critical file: Brooklyn/Contexts/Screen Saver/BrooklynView.swift"
test -f "Brooklyn/Contexts/LoopPlayer.swift" \\
  && ok "Brooklyn/Contexts/LoopPlayer.swift" \\
  || miss "missing critical file: Brooklyn/Contexts/LoopPlayer.swift"
test -f "Brooklyn/Enumerations/Animation.swift" \\
  && ok "Brooklyn/Enumerations/Animation.swift" \\
  || miss "missing critical file: Brooklyn/Enumerations/Animation.swift"
test -f "Brooklyn/Contexts/Database.swift" \\
  && ok "Brooklyn/Contexts/Database.swift" \\
  || miss "missing critical file: Brooklyn/Contexts/Database.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 608 ]; then
  ok "last commit was $days_since_last days ago (artifact saw ~578d)"
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/pedrommcarrasco/Brooklyn"
  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

Brooklyn is a macOS screensaver that recreates the animations from Apple's October 30, 2018 special event at the Brooklyn Academy of Music, built in Swift using AVPlayer for video playback. It bundles 50+ pre-recorded MP4 animations and provides a preferences UI to select which animations display, loop count, and randomization order. Monolithic Xcode project (Brooklyn.xcodeproj) structured by concern: Contexts/ (BrooklynManager, LoopPlayer, Database, Preferences UI via XIB), Enumerations/ (Animation enum driving animation selection), Extensions/ (utility categories on AVPlayerItem, NSTableView, String localization), and Resources/Animations/ containing 50+ MP4 video files.

πŸ‘₯Who it's for

macOS users who want an aesthetically polished, internet-free screensaver; maintainers of open-source screensaver projects; Swift developers learning to build screensaver bundles and preferences UIs for System Preferences.

🌱Maturity & risk

Moderately mature but no longer actively maintained: the author explicitly states in the README it doesn't generate income to justify investment. It has GitHub releases (v2.1.0), Travis CI integration, and runs on El Capitan+ (10.11+), but the lack of recent commits and the maintenance warning indicate it's in maintenance mode rather than active development.

Single-author project with explicit non-maintenance warning; screensaver bundles are macOS-specific and fragile across OS updates (Big Sur gatekeeper issues already documented); no visible test suite; depends on hardcoded MP4 assets in the bundle that could bitrot. Commercial support is now available on a fee basis only.

Active areas of work

Project is in maintenance mode with no active development visible. The README states the author is no longer actively maintaining it and will only address bugs for a fee. No recent PR activity or milestone work is evident from the provided file structure.

πŸš€Get running

Clone the repo with git clone https://github.com/pedrommcarrasco/Brooklyn.git && cd Brooklyn, then open Brooklyn.xcodeproj in Xcode and build with Cmd+B. Run via Product > Run or Product > Test to test the screensaver in Xcode's preview mode.

Daily commands: Open Brooklyn.xcodeproj, select the Brooklyn scheme, and press Cmd+R. To install the built screensaver: run defaults -currentHost write com.apple.screensaver moduleDict -dict moduleName Brooklyn path "$HOME/Library/Screen Savers/Brooklyn.saver" after the build finishes, or manually move the .saver bundle to ~/Library/Screen Savers and enable it in System Preferences > Desktop & Screen Saver.

πŸ—ΊοΈMap of the codebase

  • Brooklyn/Contexts/BrooklynManager.swift β€” Core screensaver orchestrator managing animation lifecycle, preferences, and playback stateβ€”every feature depends on this.
  • Brooklyn/Contexts/Screen Saver/BrooklynView.swift β€” Primary ScreenSaverView subclass rendering animations; the entry point where macOS invokes screensaver behavior.
  • Brooklyn/Contexts/LoopPlayer.swift β€” AVPlayer wrapper handling video playback, looping, and lifecycle; critical for animation delivery without crashes.
  • Brooklyn/Enumerations/Animation.swift β€” Comprehensive animation catalog defining all ~80 available videos; changing this cascades through preferences and playback.
  • Brooklyn/Contexts/Database.swift β€” UserDefaults persistence layer storing user animation selections and preferences; source of truth for screensaver state.
  • Brooklyn/Contexts/Preferences/PreferencesWindowController.swift β€” Preferences UI controller enabling animation selection and settings; bridges UI choices to Database persistence.

🧩Components & responsibilities

  • BrooklynView (Cocoa, ScreenSaver framework, CoreGraphics) β€” ScreenSaverView subclass receiving animateOneFrame() callbacks from macOS; delegates to BrooklynManager and renders AVPlayer output.
    • Failure mode: If BrooklynView crashes or hangs, entire screensaver process becomes unresponsive; user must force-quit.
  • BrooklynManager (Swift, AVFoundation, Database) β€” Stateful coordinator managing animation selection, playback lifecycle, looping, and mode transitions.
    • Failure mode: If animation selection logic fails (enum case missing), screensaver may crash or display blank screen; incorrect loop timing causes janky transitions.
  • LoopPlayer (AVFoundation, AVPlayer, Bundle resource loading) β€” Thin wrapper around AVPlayer; handles video file loading, looping, and next-animation transitions.
    • Failure mode: If video file missing or corrupted, AVPlayer errors; no fallback videoβ€”screensaver goes black until next mode/restart.
  • Database (UserDefaults, Foundation) β€” Single source of truth for user preferences (animation selection, display mode) using UserDefaults.
    • Failure mode: If UserDefaults corrupted, preferences reset to defaults; unlikely in practice but no recovery mechanism.
  • PreferencesWindowController β€” Preferences UI allowing users to select animation and configure

πŸ› οΈHow to make changes

Add a new animation video

  1. Drop the .mp4 file into Brooklyn/Resources/Animations/ (Brooklyn/Resources/Animations/)
  2. Add a new case to the Animation enum with matching filename (Brooklyn/Enumerations/Animation.swift)
  3. No further code changes needed; LoopPlayer and BrooklynManager auto-discover from enum cases

Add a new display mode (e.g., shuffle, sequential)

  1. Add a new case to the DisplayMode enum (Brooklyn/Enumerations/DisplayMode.swift)
  2. Update BrooklynManager to handle the new mode in animation selection logic (Brooklyn/Contexts/BrooklynManager.swift)
  3. Add UI control in PreferencesWindowController if user-selectable (Brooklyn/Contexts/Preferences/PreferencesWindowController.swift)

Persist a new user preference

  1. Add a new key/getter/setter method to Database class (Brooklyn/Contexts/Database.swift)
  2. Add UI control in Preferences view (Brooklyn/Contexts/Preferences/PreferencesWindowController.swift)
  3. Call Database setter when preference changes; call getter in BrooklynManager to apply setting

πŸ”§Why these technologies

  • macOS ScreenSaver framework β€” Only official API for screensaver plugins on macOS; required for system integration.
  • AVFoundation (AVPlayer, AVPlayerItem) β€” Native, performant video playback with precise control over looping and timing; eliminates need for external video libraries.
  • UserDefaults (Database wrapper) β€” Lightweight, built-in persistence for user preferences without requiring external database; adequate for screensaver config scope.
  • Swift with Cocoa (NSViewController, NSTableView) β€” Native macOS UI framework; enables preferences window and animation selection UI with native look & feel.

βš–οΈTrade-offs already made

  • Bundle all 80+ videos in app rather than streaming/downloading

    • Why: README states 'Doesn't require internet connection'β€”offline capability is a core design goal.
    • Consequence: Large app size (~500MB+), but ensures screensaver always works without network, and no server/CDN maintenance.
  • Simple enum-based animation catalog rather than dynamic video discovery

    • Why: Type-safe, compile-time validation; avoids runtime file scanning overhead.
    • Consequence: Adding animations requires code change (enum case) and recompile; cannot hot-swap videos post-install.
  • UserDefaults persistence instead of encrypted keychain or database

    • Why: Screensaver settings are non-sensitive; UserDefaults is standard and sufficient.
    • Consequence: User animation choice is stored in plaintext; no security risk for screensaver metadata but not suitable for secrets.
  • Single-threaded AVPlayer rendering on main ScreenSaverView

    • Why: Screensaver execution model runs on main thread; AVPlayer's internal threading handles decoding.
    • Consequence: No explicit background playback; complex multi-video transitions could block UI, but single video per session avoids this.

🚫Non-goals (don't propose these)

  • Real-time streaming or CDN integration (intentionally offline)
  • Cross-platform support (macOS-only screensaver plugin)
  • User-generated content or video uploads
  • Network synchronization or cloud backup of preferences
  • Accessibility features beyond OS-provided (e.g., high contrast, audio descriptions)
  • Active maintenance or bug fixes (README states unmaintained)

πŸͺ€Traps & gotchas

Screensaver bundles must be code-signed and located in /Library/Screen Savers or ~/Library/Screen Savers; macOS Big Sur+ requires extra quarantine flag removal (xattr -d com.apple.quarantine) on the .saver bundle or Homebrew installation. The Animation enum must be manually synchronized with MP4 files on disk; no auto-discovery. Preferences are persisted per-user in UserDefaults; no cross-machine sync. The LoopPlayer likely requires careful audio/video sync management during looping to avoid stutters.

πŸ—οΈArchitecture

πŸ’‘Concepts to learn

  • ScreenSaverView (Cocoa API) β€” BrooklynView inherits from ScreenSaverView; understanding this Cocoa base class is essential to override animateOneFrame() and manage the screensaver lifecycle
  • AVPlayer video looping and composition β€” LoopPlayer likely uses AVPlayer with AVPlayerLooper (or manual queue management) to seamlessly loop videos N times without gaps; critical for smooth screensaver UX
  • macOS screensaver bundle packaging (.saver) β€” The compiled Brooklyn.saver is a special bundle format with specific directory structure (Contents/MacOS/, Contents/Resources/) and code signing requirements; affects installation and deployment
  • Interface Builder XIB format and dynamic localization β€” PreferencesWindowController.xib is hand-edited via IB; the XIBLocalizable extension custom-loads localized strings at runtime, avoiding hardcoded text in UI files
  • UserDefaults persistence for multi-value preferences β€” Database.swift stores user animation selection (multiple checked animations), loop counts, and theme preference; understanding UserDefaults encoding for complex types prevents data loss bugs
  • Deferred animation loading from disk β€” Loading 50+ MP4 files at startup would freeze the screensaver; LoopPlayer and BrooklynManager likely use lazy/streaming approaches to load only the selected animations
  • larcus94/MacOS-Screensaver β€” Another Swift-based macOS screensaver project demonstrating similar AVPlayer + ScreenSaverView patterns
  • ghomasHudson/glanceable β€” Minimalist Swift screensaver showing alternative Cocoa approaches for System Preferences integration
  • apple/swift-coredata-samples β€” Apple's official Core Data examples relevant if Brooklyn switches from UserDefaults to Core Data for preferences
  • Homebrew/homebrew-cask β€” Brooklyn is distributed via Homebrew cask; understanding cask packaging helps with build reproducibility

πŸͺ„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 to replace Travis CI for modern macOS builds

The repo uses an outdated .travis.yml configuration. GitHub Actions is now the standard for GitHub-hosted CI/CD and would provide better integration, faster builds, and maintain compatibility with modern Xcode versions. This is critical since the project targets macOS screensaver development where build reproducibility matters.

  • [ ] Create .github/workflows/build.yml to build Brooklyn.xcodeproj on macOS runners
  • [ ] Configure the workflow to test builds on multiple macOS versions (12, 13, 14)
  • [ ] Replace .travis.yml reference in README with GitHub Actions badge
  • [ ] Verify the workflow successfully builds the screensaver and runs any available tests

Add localization unit tests for String+Localized.swift extension

The repo has a localization extension (Brooklyn/Extensions/String+Localized.swift) but no visible test coverage for it. Given that the repo appears to support multiple languages (evidenced by XIBLocalizable.swift), adding tests would ensure translation keys are properly loaded and prevent runtime crashes from missing localization strings.

  • [ ] Create Brooklyn/Tests/Extensions/StringLocalizedTests.swift with unit tests
  • [ ] Test that String.localized() returns non-empty strings for all supported language keys
  • [ ] Add tests for edge cases (missing keys, empty strings, special characters in translations)
  • [ ] Verify tests run in the Brooklyn.xcscheme or create a test scheme if missing

Refactor Animation.swift and DisplayMode.swift into a separate Models group with documentation

The Enumerations folder contains domain models (Animation.swift with 50+ animation cases, DisplayMode.swift) that are data models rather than pure enumerations. This causes poor organization and makes it hard for contributors to understand the animation system. Reorganizing and documenting available animations would improve onboarding.

  • [ ] Create Brooklyn/Models/ directory and move Animation.swift and DisplayMode.swift there
  • [ ] Update Xcode project navigator to reflect new folder structure
  • [ ] Add inline documentation to Animation.swift listing all available animations with descriptions matching Brooklyn/Resources/Animations/*.mp4 files
  • [ ] Update any import statements in BrooklynView.swift, Database.swift, and PreferencesWindowController.swift

🌿Good first issues

  • Add unit tests for the Animation enum parsing and the Database preference storage layer; currently no tests visible in the file structure (would involve creating Brooklyn/Tests/ directory with XCTest cases for Animation.swift and Database.swift).
  • Create a helper script to auto-generate the Animation enum cases from the MP4 filenames in Resources/Animations/ to prevent out-of-sync bugs when adding new animations (would involve a simple shell or Swift script that reads the directory and outputs Swift enum syntax).
  • Document the exact steps to add a new animation in CONTRIBUTING.md with screenshots of how to modify Animation.swift and test in Xcode's screensaver preview mode; currently this tribal knowledge is not written down.

⭐Top contributors

Click to expand

πŸ“Recent commits

Click to expand
  • 5e4bc74 β€” Update README.md (pedrommcarrasco)
  • 337c01b β€” Update README.md (pedrommcarrasco)
  • 09c1dc7 β€” Merge pull request #112 from danielbayley/patch-1 (pedrommcarrasco)
  • a74a23b β€” Improve install instructions (danielbayley)
  • fd2704e β€” Merge pull request #99 from AxelVincent/patch-1 (pedrommcarrasco)
  • c36c096 β€” Troubleshooting for BigSur security quarantine (AxelVincent)
  • da63491 β€” Merge pull request #85 from MiConnell/homebrew_cask_syntax (pedrommcarrasco)
  • b553752 β€” update homebrew instructions in README (MiConnell)
  • ec3309a β€” Merge pull request #84 from pvanb/patch-1 (pedrommcarrasco)
  • 7ffa401 β€” Update download link to current version (2.1.0) (pvanb)

πŸ”’Security observations

The Brooklyn screensaver project has a moderate security posture with no critical vulnerabilities detected based on the available codebase structure. The primary concerns are: (1) the project is unmaintained, which prevents timely security updates; (2) lack of visible dependency management documentation; (3) minimal security hardening configurations visible in the Xcode project structure; and (4) absence of integrity verification for embedded media assets. As a screensaver (system-level component), this warrants careful review of its permissions and sandboxing before deployment. The codebase shows no obvious injection vulnerabilities, hardcoded credentials, or exposed secrets based on file naming conventions. Swift/Cocoa codebases typically have lower attack surfaces than web applications.

  • Medium Β· Project Actively Unmaintained β€” README.md, project status. The README explicitly states that Brooklyn is not actively maintained and does not receive regular security updates or bug fixes. This increases the risk of unpatched vulnerabilities accumulating over time. Fix: Consider forking and maintaining the project independently, or switching to an actively maintained alternative screensaver solution. If continuing use, conduct thorough security audits regularly.
  • Low Β· No Dependency Management File Present β€” Package management configuration. The provided package file content is empty. While this is an Xcode-based Swift project (not a typical dependency-heavy ecosystem like Node.js or Python), the absence of clear dependency tracking information makes it difficult to assess third-party library risks. Fix: For Swift projects using CocoaPods or SPM, ensure a Podfile, Podfile.lock, or Package.resolved file is present and tracked in version control. Regularly audit and update dependencies.
  • Low Β· No Security Configuration Visible β€” Brooklyn.xcodeproj configuration files. No evidence of security-related configurations such as code signing requirements, entitlements validation, or sandboxing policies specific to the screensaver context. Fix: Ensure proper code signing, validate sandboxing entitlements for screensaver bundles, and document security-relevant build settings in the project configuration.
  • Low Β· Media File Source Verification Missing β€” Brooklyn/Resources/Animations/ directory. The project contains 68+ embedded MP4 video files (animations). There is no visible mechanism for verifying the integrity or authenticity of these media files. Fix: Implement integrity checks (checksums/digital signatures) for bundled media files. Document the source of each animation and verify they haven't been tampered with during distribution.

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 Β· pedrommcarrasco/Brooklyn β€” RepoPilot