Stengo/DeskPad
A virtual monitor for screen sharing
Single-maintainer risk — review before adopting
worst of 4 axestop contributor handles 91% of recent commits; no tests detected…
Has a license, tests, and CI — clean foundation to fork and modify.
Documented and popular — useful reference codebase to read through.
No critical CVEs, sane security posture — runnable as-is.
- ✓Last commit 2mo ago
- ✓8 active contributors
- ✓MIT licensed
Show 3 more →Show less
- ⚠Single-maintainer risk — top contributor 91% of recent commits
- ⚠No CI workflows detected
- ⚠No test directory detected
What would change the summary?
- →Use as dependency Mixed → Healthy if: diversify commit ownership (top <90%); 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.
[](https://repopilot.app/r/stengo/deskpad)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/stengo/deskpad on X, Slack, or LinkedIn.
Onboarding doc
Onboarding: Stengo/DeskPad
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/Stengo/DeskPad 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 — Single-maintainer risk — review before adopting
- Last commit 2mo ago
- 8 active contributors
- MIT licensed
- ⚠ Single-maintainer risk — top contributor 91% 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 Stengo/DeskPad
repo on your machine still matches what RepoPilot saw. If any fail,
the artifact is stale — regenerate it at
repopilot.app/r/Stengo/DeskPad.
What it runs against: a local clone of Stengo/DeskPad — 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 Stengo/DeskPad | 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 | 5 critical file paths still exist | Catches refactors that moved load-bearing code |
| 5 | Last commit ≤ 101 days ago | Catches sudden abandonment since generation |
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of Stengo/DeskPad. If you don't
# have one yet, run these first:
#
# git clone https://github.com/Stengo/DeskPad.git
# cd DeskPad
#
# 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 Stengo/DeskPad and re-run."
exit 2
fi
# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "Stengo/DeskPad(\\.git)?\\b" \\
&& ok "origin remote is Stengo/DeskPad" \\
|| miss "origin remote is not Stengo/DeskPad (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"
# 4. Critical files exist
test -f "DeskPad/main.swift" \\
&& ok "DeskPad/main.swift" \\
|| miss "missing critical file: DeskPad/main.swift"
test -f "DeskPad/AppDelegate.swift" \\
&& ok "DeskPad/AppDelegate.swift" \\
|| miss "missing critical file: DeskPad/AppDelegate.swift"
test -f "DeskPad/Backend/Store.swift" \\
&& ok "DeskPad/Backend/Store.swift" \\
|| miss "missing critical file: DeskPad/Backend/Store.swift"
test -f "DeskPad/Backend/AppState.swift" \\
&& ok "DeskPad/Backend/AppState.swift" \\
|| miss "missing critical file: DeskPad/Backend/AppState.swift"
test -f "DeskPad/Backend/SideEffectsMiddleware.swift" \\
&& ok "DeskPad/Backend/SideEffectsMiddleware.swift" \\
|| miss "missing critical file: DeskPad/Backend/SideEffectsMiddleware.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 101 ]; then
ok "last commit was $days_since_last days ago (artifact saw ~71d)"
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/Stengo/DeskPad"
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
DeskPad is a native macOS application that creates a virtual display and mirrors it within an app window, solving the problem of screen sharing when the presenter's monitor is much larger than the audience's typical viewing size. It uses the CoreGraphics virtual display APIs (via CGVirtualDisplayPrivate.h) to register a pseudo-monitor with macOS, allowing windows to be arranged on it and displayed within a managed window frame for easier, more shareable screen presentations. Monolithic Xcode project (DeskPad.xcodeproj) with a clear separation into Backend (state management via Store.swift, SideEffectsMiddleware.swift, and domain-specific state like ScreenConfiguration and MouseLocation) and Frontend (ViewController-based UI in DeskPad/Frontend/Screen). AppDelegate.swift serves as the entry point; state flows through a Redux-like pattern with AppState.swift as the root.
👥Who it's for
Content creators, presenters, and educators on macOS who need to share their screen but want to control the visible workspace size independently of their physical monitor resolution. Also useful for software demonstrators who want a consistent, smaller display area for recording or streaming to remote audiences.
🌱Maturity & risk
This is an actively maintained, single-maintainer project with a polished release pipeline (Homebrew distribution available). The codebase is small (~14K Swift, ~3K Objective-C) and well-structured, but the lack of visible test files (no Tests/ directory in file list), minimal issue/PR data provided, and unclear last commit recency suggest it's a stable but lean utility rather than a heavily tested, enterprise-grade application.
Single maintainer (Stengo) creates continuity risk if the author becomes unavailable. The project depends on private Apple APIs (CGVirtualDisplayPrivate.h) which are not publicly documented and subject to breaking changes across macOS versions. No visible automated testing or CI configuration (no .github/workflows, no .travis.yml, etc.) makes regression detection manual. The Bridging Header and Objective-C interop for private APIs introduce fragility.
Active areas of work
No specific PR or milestone data is provided in the repository snapshot. The README indicates active maintenance (Homebrew integration, troubleshooting section added for screen recording permissions), suggesting recent work on compatibility and user experience hardening.
🚀Get running
git clone https://github.com/Stengo/DeskPad.git
cd DeskPad
open DeskPad.xcodeproj
Then build and run in Xcode (Cmd+R). No external package manager (CocoaPods, Carthage) is visible in the file list; dependencies appear to be managed via Swift Package Manager (BuildTools/Package.swift exists but is minimal).
Daily commands: Open DeskPad.xcodeproj in Xcode and press Cmd+R to build and launch. No Makefile or command-line build script is visible; the primary workflow is Xcode IDE-driven. The app runs as a standard macOS application after building.
🗺️Map of the codebase
DeskPad/main.swift— Application entry point that initializes the app delegate and sets up the main application loop.DeskPad/AppDelegate.swift— Core lifecycle manager that handles app startup, virtual display creation, and integration with the system.DeskPad/Backend/Store.swift— Redux-style state store that manages all application state and dispatches actions through middleware.DeskPad/Backend/AppState.swift— Defines the complete application state structure including screen configuration and mouse location tracking.DeskPad/Backend/SideEffectsMiddleware.swift— Middleware layer that orchestrates side effects from screen configuration and mouse location state changes.DeskPad/Frontend/Screen/ScreenViewController.swift— Primary UI controller that renders the virtual monitor view and responds to state changes from the store.DeskPad/SubscriberViewController.swift— Base view controller that subscribes to state changes and propagates updates to child view controllers.
🧩Components & responsibilities
- AppDelegate (Swift, AppKit) — App lifecycle management, virtual display initialization, and top-level view setup
- Failure mode: If display creation fails, app becomes unusable; crash or graceful degradation needed
- Redux Store (Swift (custom implementation)) — Single source of truth for app state; processes actions through reducers and notifies subscribers
- Failure mode: State corruption leads
🛠️How to make changes
Add a New Screen Configuration Property
- Add the new property to ScreenConfigurationState struct in ScreenConfigurationState.swift (
DeskPad/Backend/ScreenConfiguration/ScreenConfigurationState.swift) - Create or update a reducer to handle actions that modify this property (
DeskPad/Backend/ScreenConfiguration/ScreenConfigurationState.swift) - If system side effects are needed, add logic to ScreenConfigurationSideEffect.swift to handle the state change (
DeskPad/Backend/ScreenConfiguration/ScreenConfigurationSideEffect.swift) - Update ScreenViewData.swift to expose the new property to the UI layer (
DeskPad/Frontend/Screen/ScreenViewData.swift) - Modify ScreenViewController.swift to render or respond to the new property (
DeskPad/Frontend/Screen/ScreenViewController.swift)
Add a New State Domain (e.g., Recording, Settings)
- Create a new directory under DeskPad/Backend with State and SideEffect files following the pattern of MouseLocation or ScreenConfiguration (
DeskPad/Backend/) - Define the state struct and reducer functions in the new [Domain]State.swift file (
DeskPad/Backend/[NewDomain]/[NewDomain]State.swift) - Implement side effects in [Domain]SideEffect.swift that respond to state changes (
DeskPad/Backend/[NewDomain]/[NewDomain]SideEffect.swift) - Add the new state to AppState.swift struct composition (
DeskPad/Backend/AppState.swift) - Register side effects in SideEffectsMiddleware.swift to process actions from the new domain (
DeskPad/Backend/SideEffectsMiddleware.swift)
Respond to Store State Changes in UI
- Extend ScreenViewController (or create a new controller inheriting from SubscriberViewController) to subscribe to store updates (
DeskPad/Frontend/Screen/ScreenViewController.swift) - Implement the store.subscribe() pattern to map AppState to ScreenViewData in the view controller (
DeskPad/Frontend/Screen/ScreenViewController.swift) - Update ScreenViewData.swift to include the new state values you need to display (
DeskPad/Frontend/Screen/ScreenViewData.swift) - Dispatch actions to the store (via store.dispatch()) in response to user interactions (
DeskPad/Frontend/Screen/ScreenViewController.swift)
🔧Why these technologies
- Swift + AppKit — Native macOS development with full access to system display APIs and window management
- Redux-style State Management — Centralized state enables predictable UI updates and clean separation between state mutations and side effects
- CoreGraphics Virtual Display APIs — Required to create and manage virtual monitors at the OS level; accessed via private C headers
- MVC Architecture with SubscriberViewController — AppKit-native pattern that cleanly binds store state changes to UI rendering
⚖️Trade-offs already made
-
Use of private CoreGraphics APIs (CGVirtualDisplayPrivate.h)
- Why: Public APIs for virtual displays were limited at the time of development; private APIs offer full control
- Consequence: App may break on macOS updates; requires careful version testing and maintenance
-
Redux-style store in Swift (custom implementation, no external library)
- Why: Avoids heavy external dependencies; keeps codebase compact and under direct control
- Consequence: Requires manual state management discipline; cannot leverage mature Redux ecosystem tooling
-
Single virtual display per application instance
- Why: Simplifies state management and avoids complexity of multi-display coordination
- Consequence: Users cannot create multiple virtual monitors in one session; must launch separate instances
🚫Non-goals (don't propose these)
- Does not support real-time screen capture or video streaming directly (uses native virtual display mirroring)
- Not designed for Linux or Windows (macOS-specific using AppKit and CoreGraphics)
- Does not include built-in recording or export functionality for captured displays
- No remote connectivity layer (relies on user's existing screen sharing solution to share the virtual monitor view)
🪤Traps & gotchas
Private API Risk: CGVirtualDisplayPrivate.h uses undocumented Apple APIs; no guarantee of forward compatibility across macOS versions or in future sandbox restrictions. Entitlements: DeskPad.entitlements must include screen recording and system events permissions; users must grant these manually in System Settings (README Troubleshooting section confirms this is a real friction point). Display Naming: The virtual display must be registered with a unique identifier; conflicts with other virtual display apps (e.g., Barrier, Luna Display SDKs) could cause unpredictable behavior. No Tests: No visible test suite (XCTest targets) means changes rely on manual testing on multiple macOS versions. Window Positioning: The app uses NSScreen APIs which may behave unexpectedly across Multi-Display, Notch scenarios, and arrangement changes.
🏗️Architecture
💡Concepts to learn
- Virtual Display / Pseudo-Monitor — DeskPad's core function is creating a fake display that macOS recognizes as a real monitor; understanding how CoreGraphics exposes this capability is essential to the entire project.
- Redux / Flux State Management — The Backend uses a Redux-like pattern (Store, Actions, Middleware, State slices) to manage display configuration and mouse tracking; a contributor must understand this pattern to modify app behavior.
- Side Effects in State Management — SideEffectsMiddleware.swift separates pure state mutations from impure operations (system calls, OS notifications); understanding this separation is crucial for adding new features without corrupting state logic.
- AppKit Window and View Lifecycle — ScreenViewController.swift and AppDelegate.swift manage macOS window creation, display configuration changes, and layout updates; AppKit lifecycle knowledge is mandatory for UI modifications.
- Objective-C / Swift Bridging — DeskPad-Bridging-Header.h bridges Swift code to private Objective-C APIs (CGVirtualDisplayPrivate.h); understanding interop is essential when touching system integration code.
- Mouse Location Tracking & Event Interception — MouseLocationSideEffect.swift continuously monitors cursor position to detect when the user hovers over the virtual display; event monitoring patterns are critical for the 'blue highlight on focus' feature.
- macOS Display Configuration & Resolution Scaling — ScreenConfigurationSideEffect.swift and NSScreen+Extensions.swift adapt to user-selected resolutions in System Settings; understanding DPI scaling and display bounds is necessary for proper rendering.
🔗Related repos
gnachman/iTerm2— Terminal emulator with custom window/display management; demonstrates AppKit window control patterns and private API bridging similar to DeskPad's approach.jordanbaird/Ice— macOS menu bar utility written in Swift; shows modern Swift + AppKit patterns for system integration and state management in a lightweight app.MonitorControl/MonitorControl— macOS app for controlling external display settings; uses similar Display enumeration and configuration APIs (NSScreen, CoreGraphics) that DeskPad depends on.Apple/swift-evolution— Swift language evolution proposals; relevant for understanding Swift concurrency and AppKit modernization discussions that could impact DeskPad's future architecture.Homebrew/homebrew-cask— Package repository where DeskPad is distributed; understanding cask manifests and installation hooks helps with release automation and user distribution.
🪄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 unit tests for Store.swift and SideEffectsMiddleware.swift
The Backend architecture uses a Redux-like pattern (Store, SideEffectsMiddleware) but has no visible test coverage. These core state management files are critical for the virtual display functionality and would benefit from unit tests covering state transitions, side effects execution, and middleware chaining.
- [ ] Create DeskPadTests target if missing (referenced in .xcodeproj structure)
- [ ] Add unit tests for Store.swift covering state mutations and subscriber notifications
- [ ] Add unit tests for SideEffectsMiddleware.swift covering side effect execution order and error handling
- [ ] Test MouseLocationSideEffect.swift and ScreenConfigurationSideEffect.swift state transitions
- [ ] Ensure tests cover edge cases in AppState.swift
Extract and document the virtual display bridge layer (CGVirtualDisplayPrivate.h and usage)
The repo uses private Apple frameworks (CGVirtualDisplay) via CGVirtualDisplayPrivate.h bridging header, which is undocumented. A new contributor would struggle understanding how virtual displays are created/managed. Creating a wrapper module with documentation would improve maintainability.
- [ ] Create DeskPad/Backend/VirtualDisplay/VirtualDisplayManager.swift wrapper around private APIs
- [ ] Document the bridging header imports and which private frameworks are used
- [ ] Add inline code comments explaining lifecycle of virtual display creation/teardown
- [ ] Document required entitlements in DeskPad.entitlements relevant to virtual displays
- [ ] Add a VIRTUAL_DISPLAY_IMPLEMENTATION.md file explaining the private API usage and potential future macOS compatibility issues
Add GitHub Actions CI workflow for Swift build and code quality checks
The repo has no visible CI configuration (.github/workflows missing). Given it's an Xcode project targeting macOS, a GitHub Actions workflow would catch build regressions, verify the project builds on each PR, and establish code quality standards for contributors.
- [ ] Create .github/workflows/build.yml with Xcode build step for macOS
- [ ] Add build verification for both Debug and Release configurations
- [ ] Integrate SwiftLint via workflow (install via BuildTools/Package.swift pattern already in use)
- [ ] Add entitlements validation step to ensure DeskPad.entitlements doesn't break on changes
- [ ] Document in CONTRIBUTING.md the expected CI checks before submitting PRs
🌿Good first issues
- Add XCTest unit tests for DeskPad/Backend/AppState.swift and Store.swift to verify state mutations and action dispatch logic; currently there is no test infrastructure visible in the repo.
- Document the private API usage in DeskPad/CGVirtualDisplayPrivate.h with comments explaining each function signature and its macOS version support (e.g., which versions introduced CGVirtualDisplayCreate); future maintainers will benefit from understanding the compatibility matrix.
- Extend DeskPad/Helpers/NSScreen+Extensions.swift with a helper method to detect notch-aware safe areas on modern MacBook Pros and apply padding in ScreenViewController.swift to prevent UI overlap with the notch.
⭐Top contributors
Click to expand
Top contributors
- @Stengo — 75 commits
- @lionelpere — 1 commits
- @MohamedElashri — 1 commits
- @men232 — 1 commits
- @mrienstra — 1 commits
📝Recent commits
Click to expand
Recent commits
c3349f0— Restructure README (Stengo)546845e— Merge pull request #23 from mrienstra/patch-widescreen (Stengo)c09ac6a— Merge pull request #34 from MohamedElashri/main (Stengo)1cb6824— Merge pull request #59 from lionelpere/improve-permissions-section-readme (Stengo)186ddf3— Improve readability of screen recording permissions section (lionelpere)639865c— Fixbrew installcommand in README (MohamedElashri)f9efab4— Bump to next minor version (Stengo)c0fac65— Merge pull request #32 from men232/main (Stengo)2b96774— Fixes disappearing cursor on external display (men232)b9061d9— Add 32:9 & 21:9 ultrawide resolutions (mrienstra)
🔒Security observations
DeskPad is a native macOS application with moderate security concerns. The primary risk is the use of private/undocumented Core Graphics APIs (CGVirtualDisplay), which violates Apple's terms of service and creates maintenance and compatibility risks. The application also lacks visibility into dependency security status. Code signing and entitlements appear to be configured but should be verified. The codebase would benefit from automated security scanning and stricter version control practices (removing user-specific files). The application does not appear to have injection vulnerabilities, hardcoded credentials, or web-based attack surfaces based on the available file structure.
- High · Use of Private API (CGVirtualDisplay) —
DeskPad/CGVirtualDisplayPrivate.h, DeskPad/DeskPad-Bridging-Header.h. The codebase includes CGVirtualDisplayPrivate.h and appears to use private/undocumented Core Graphics APIs. Apple explicitly prohibits the use of private APIs in App Store submissions and this violates Apple's developer terms of service. Private APIs may change without notice between OS updates, causing app crashes or unexpected behavior. Fix: Replace private API usage with public alternatives from the IOKit framework or use Apple's official virtual display APIs if available. If this app is distributed outside the App Store, document this limitation clearly. - Medium · Missing Code Signing and Entitlements Validation —
DeskPad/DeskPad.entitlements. While DeskPad.entitlements exists, the codebase appears to require elevated privileges (virtual display creation). Without proper code signing and entitlements, the application may fail to function on modern macOS or could be exploited by unsigned third-party code. Fix: Ensure the application is properly code-signed with a valid developer certificate. Verify that all required entitlements are correctly specified and minimally scoped. Test on different macOS versions to ensure functionality. - Medium · Incomplete Dependency Management Information —
BuildTools/Package.resolved, DeskPad.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved. The Package.resolved files exist but content was not provided for analysis. Without visibility into resolved dependency versions, transitive dependencies, and known CVEs, potential vulnerable dependencies could exist. Fix: Regularly audit dependencies using tools like 'swift package show-dependencies' and check for known CVEs. Keep all dependencies up-to-date and monitor security advisories for Swift packages used. - Low · Xcodedata and User-Specific Files in Repository —
DeskPad.xcodeproj/xcuserdata/. The repository contains xcuserdata directories which are user-specific Xcode settings that should typically be excluded from version control. While not a direct security issue, this can lead to unintended disclosure of user preferences or build settings. Fix: Add xcuserdata/ to .gitignore to prevent committing user-specific Xcode settings and preferences. - Low · No Visible Security Testing Infrastructure —
Repository root. The codebase structure does not show evidence of security testing, fuzzing, or vulnerability scanning configurations (no GitHub security workflows, SBOM, or security scanning configuration visible). Fix: Implement automated security scanning using tools like SAST scanners compatible with Swift (e.g., SwiftLint with security rules). Consider adding GitHub Actions for dependency scanning and code analysis in CI/CD pipeline.
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.