RepoPilotOpen in app →

Code52/carnac

A utility to give some insight into how you use your keyboard

Mixed

Stale — last commit 3y ago

worst of 4 axes
Use as dependencyConcerns

non-standard license (MS-PL); last commit was 3y ago…

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-isMixed

last commit was 3y ago; no CI workflows detected

  • 10 active contributors
  • MS-PL licensed
  • Tests present
Show 4 more →
  • Stale — last commit 3y ago
  • Concentrated ownership — top contributor handles 68% of recent commits
  • Non-standard license (MS-PL) — review terms
  • No CI workflows detected
What would change the summary?
  • Use as dependency ConcernsMixed if: clarify license terms
  • Deploy as-is MixedHealthy 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.

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

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

Onboarding doc

Onboarding: Code52/carnac

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/Code52/carnac 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 3y ago

  • 10 active contributors
  • MS-PL licensed
  • Tests present
  • ⚠ Stale — last commit 3y ago
  • ⚠ Concentrated ownership — top contributor handles 68% of recent commits
  • ⚠ Non-standard license (MS-PL) — review terms
  • ⚠ 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 Code52/carnac repo on your machine still matches what RepoPilot saw. If any fail, the artifact is stale — regenerate it at repopilot.app/r/Code52/carnac.

What it runs against: a local clone of Code52/carnac — 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 Code52/carnac | Confirms the artifact applies here, not a fork | | 2 | License is still MS-PL | 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 ≤ 1207 days ago | Catches sudden abandonment since generation |

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

# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "Code52/carnac(\\.git)?\\b" \\
  && ok "origin remote is Code52/carnac" \\
  || miss "origin remote is not Code52/carnac (artifact may be from a fork)"

# 2. License matches what RepoPilot saw
(grep -qiE "^(MS-PL)" LICENSE 2>/dev/null \\
   || grep -qiE "\"license\"\\s*:\\s*\"MS-PL\"" package.json 2>/dev/null) \\
  && ok "license is MS-PL" \\
  || miss "license drift — was MS-PL 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 "src/Carnac.Logic/KeyMonitor/InterceptKeys.cs" \\
  && ok "src/Carnac.Logic/KeyMonitor/InterceptKeys.cs" \\
  || miss "missing critical file: src/Carnac.Logic/KeyMonitor/InterceptKeys.cs"
test -f "src/Carnac.Logic/KeysController.cs" \\
  && ok "src/Carnac.Logic/KeysController.cs" \\
  || miss "missing critical file: src/Carnac.Logic/KeysController.cs"
test -f "src/Carnac.Logic/KeyProvider.cs" \\
  && ok "src/Carnac.Logic/KeyProvider.cs" \\
  || miss "missing critical file: src/Carnac.Logic/KeyProvider.cs"
test -f "src/Carnac.Logic/MessageProvider.cs" \\
  && ok "src/Carnac.Logic/MessageProvider.cs" \\
  || miss "missing critical file: src/Carnac.Logic/MessageProvider.cs"
test -f "src/Carnac.Logic/ShortcutProvider.cs" \\
  && ok "src/Carnac.Logic/ShortcutProvider.cs" \\
  || miss "missing critical file: src/Carnac.Logic/ShortcutProvider.cs"

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

Carnac is a keyboard activity monitor and visualization utility for Windows that captures and displays keystrokes in real-time during presentations, screencasts, and development sessions. It uses low-level keyboard interception via InterceptKeys.cs to log key presses, pairs them with application-specific shortcut definitions from YAML keymaps (Visual Studio, VS Code, Chrome, Resharper, etc.), and renders a non-intrusive popup showing recently pressed keys and their associated commands. Classic layered C# application: src/Carnac.Logic/ contains core business logic (KeyMonitor via InterceptKeys.cs, KeyProvider.cs for key translation, MessageProvider.cs for display text, and KeysController.cs orchestrating capture). Configuration lives in YAML files under Keymaps/ (chrome.yml, visual-studio.yml, vscode.yml, etc.). Models in Models/ define KeyPress, Message, PopupSettings. Native P/Invoke wrappers in Native/ (DEVMODE, DISPLAY_DEVICE, etc.) handle Windows interop. A separate UI/presentation layer exists but is not detailed in the file listing.

👥Who it's for

Presenters, screencasters, and software developers who want to visualize their keyboard usage during live demos or educational content to help audiences follow along with hotkey-driven workflows in IDEs and applications.

🌱Maturity & risk

Production-ready and actively maintained. The project has a full CI/CD pipeline via AppVeyor, uses Squirrel.Windows for auto-updates, requires .NET 4.5.2, and is distributed via Chocolatey. The codebase shows deliberate architectural work (evidenced by blog-documented Rx refactorings) and includes comprehensive keymap definitions. No recent commit data provided, but the structured build system (build.cake, build.ps1) and published release mechanism indicate mature operational maturity.

Low-to-moderate risk. The project has minimal external dependencies (no NuGet lockfile visible in listing) and uses stable, long-supported frameworks (.NET 4.5.2 / WPF). The main risk is Windows-platform lock-in: all functionality depends on Windows-specific APIs (InterceptKeys uses native P/Invoke for global keyboard hooking, DesktopLockEventService monitors screen lock events). Single-maintainer concerns are typical for Code52 projects; no visible test suite coverage data in the file listing.

Active areas of work

No specific active work or PRs are visible from the provided metadata. The repository structure and documentation suggest maintenance mode with focus on stability and cross-tool keymap accuracy (seven different application keymaps are defined). The blog series linked in the README documents recent Rx-based refactorings, suggesting Reactive Extensions patterns are actively used.

🚀Get running

git clone https://github.com/Code52/carnac.git
cd carnac
.\build.ps1

The PowerShell build script will compile the project and run unit tests. Alternatively, open src/Carnac.Logic/Carnac.Logic.csproj in Visual Studio and build from the IDE.

Daily commands: The application is a Windows desktop executable. After building via build.ps1, run Setup.exe (installer) or the compiled .exe directly. Silent mode toggle via Ctrl+Alt+P is documented. No dev server required; this is a native Windows application.

🗺️Map of the codebase

  • src/Carnac.Logic/KeyMonitor/InterceptKeys.cs — Core low-level keyboard hook implementation that captures all key events; essential for understanding how Carnac monitors user input at the OS level.
  • src/Carnac.Logic/KeysController.cs — Central orchestrator that manages key capture, filtering, and message generation; every keyboard event flows through this component.
  • src/Carnac.Logic/KeyProvider.cs — Translates raw intercepted key codes into human-readable key names and handles special keys; critical for the display layer.
  • src/Carnac.Logic/MessageProvider.cs — Converts keystroke sequences into displayable messages; responsible for formatting and filtering what users see.
  • src/Carnac.Logic/ShortcutProvider.cs — Loads and matches keyboard shortcuts against application-specific keymaps (Visual Studio, Chrome, etc.); enables feature-rich keystroke recognition.
  • src/Carnac/App.xaml.cs — WPF application entry point and bootstrapper; sets up dependency injection, UI, and tray icon integration.
  • src/Carnac.Logic/Keymaps/visual-studio.yml — Example keymap configuration; demonstrates how to add application-specific shortcut definitions.

🛠️How to make changes

Add a new application keymap

  1. Create a new YAML file in src/Carnac.Logic/Keymaps/ named after the application (e.g., sublime-text.yml) (src/Carnac.Logic/Keymaps/visual-studio.yml)
  2. Define shortcuts as YAML with modifier keys (Ctrl, Shift, Alt) and key names matching the format in KeyProvider.cs (src/Carnac.Logic/KeyProvider.cs)
  3. ShortcutProvider automatically discovers and loads all YAML files in the Keymaps directory at runtime; no code changes needed (src/Carnac.Logic/ShortcutProvider.cs)
  4. Test by running the app and triggering shortcuts in the target application; messages should display recognized shortcuts (src/Carnac.Tests/KeysControllerFacts.cs)

Add a new message filter or processing rule

  1. Create a new method or class in MessageProvider.cs to implement filter logic (e.g., ignore function keys, suppress rapid repeats) (src/Carnac.Logic/MessageProvider.cs)
  2. Integrate the filter into the ProcessKeys method pipeline, inserting it before messages are accumulated into the FixedQueue (src/Carnac.Logic/Internal/FixedQueue.cs)
  3. Add test cases in MessageProviderFacts.cs to verify filter behavior with various key sequences (src/Carnac.Tests/MessageProviderFacts.cs)

Add a new display location or UI customization

  1. Extend PopupSettings.cs model to include the new configuration property (e.g., corner position, font size, transparency) (src/Carnac.Logic/Models/PopupSettings.cs)
  2. Update the WPF view (PositionOnMonitorSelector.xaml or add a new settings UI) to expose the configuration option (src/Carnac/PositionOnMonitorSelector.xaml)
  3. Modify the popup control template or codebehind in Generic.xaml to apply the new setting at render time (src/Carnac/Themes/Generic.xaml)

🔧Why these technologies

  • SetWindowsHookEx (P/Invoke) — Only way to capture keyboard input globally without losing focus; requires native interop for OS integration.
  • WPF & XAML — Desktop UI framework targeting Windows; enables rich, responsive popup rendering and multi-monitor support.
  • YAML keymaps — Human-readable, externally editable shortcut definitions; allows community contributions without code changes.
  • Squirrel.Windows — Handles auto-updates for Windows desktop apps; reduces friction for end-user deployment and version management.
  • Rx (Reactive Extensions) — Manages async key event streams and time-windowed message batching; simplifies event pipeline logic.

⚖️Trade-offs already made

  • Global keyboard hook via SetWindowsHookEx

    • Why: Required to see all keystrokes application-wide; no alternative captures input before the focused app receives it.
    • Consequence: Hook must be lightweight and never block; if it lags, entire system keyboard response degrades. Introduces small performance cost and requires careful thread safety.
  • YAML keymaps over code-based shortcuts

    • Why: Non-developers can contribute keymaps without rebuilding; easier to maintain per-application shortcuts.
    • Consequence: Each keymap is a separate file and manual configuration; no type-safety or IDE autocomplete. YAML parsing adds small startup overhead.
  • FixedQueue with bounded message retention

    • Why: Prevents unbounded memory growth; old messages are discarded as new ones arrive.
    • Consequence: Messages are not persistent; closing the app loses keyst

🪤Traps & gotchas

Windows platform lock-in: InterceptKeys.cs uses low-level Windows API hooks (SetWindowsHookEx) via P/Invoke; this will not work on non-Windows systems. Password mode (IPasswordModeService) likely requires elevation or secure desktop interaction. Monitor multi-display setup: Native/DetailedScreen.cs and Native/DEVMODE.cs suggest display enumeration is handled, but popup placement across multiple monitors may be non-trivial. Keymap YAML parsing: verify that YAML library version matches expectations in FodyWeavers.xml and project files (not visible in listing). The Fody IL-weaving configuration in FodyWeavers.xml is required for the build; missing or misconfigured Fody will fail compilation silently.

🏗️Architecture

💡Concepts to learn

  • Global Keyboard Hook (SetWindowsHookEx) — Carnac's entire keystroke capture mechanism depends on installing a low-level Windows keyboard hook; understanding hook types (WH_KEYBOARD_LL), callback invocation, and hook chain safety is critical for maintaining the feature and avoiding system instability.
  • Reactive Extensions (Rx) / IObservable<T> — The codebase is deliberately refactored to use Rx Observables for event streams (as documented in the linked blog series); understanding how keystroke events flow through Observable chains and are combined/filtered is essential for modifying the core logic.
  • P/Invoke and Native Interoperability — Carnac bridges managed C# and unmanaged Windows APIs via P/Invoke; marshaling parameters correctly for DEVMODE, DISPLAY_DEVICE, and hook callbacks is non-trivial and a common source of bugs.
  • YAML Configuration Parsing — Application shortcuts are defined in YAML keymaps (chrome.yml, visual-studio.yml, etc.); understanding the schema and parser implementation is required for adding new tools or debugging keymap matching.
  • Message Aggregation with Fixed-Size Queues — The FixedQueue<T> in Internal/FixedQueue.cs maintains a rolling window of recent keystrokes for display; this pattern avoids unbounded memory growth in long-running monitoring sessions.
  • Squirrel.Windows Auto-Update — Carnac uses Squirrel.Windows for background updates and installer management; understanding Squirrel's versioning (GitVersion.yml), release channels, and delta updates is important for deployment and troubleshooting.
  • Dependency Injection with Interface Contracts — The codebase uses interface-based design (IKeyProvider, IMessageProvider, IScreenManager, etc.) for testability and modularity; understanding the provider pattern and composition is key for extending or mocking functionality.
  • microsoft/PowerToys — Microsoft's official Windows productivity toolkit; includes keyboard remapping and activity logging as part of a broader automation suite.
  • mooz/js2-mode — Not directly related, but represents the broader ecosystem of developer productivity tools that visualize and optimize keyboard workflows.
  • Code52/DownmarkerWPF — Fellow Code52 project written in WPF/C# with similar open-source community focus; shares architectural patterns and build pipeline conventions.
  • keypirinha/Keypirinha — Keyboard-driven application launcher; complementary tool to Carnac for developers who prioritize hotkey-based workflows and keyboard visibility.

🪄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 KeysController.cs core functionality

KeysController.cs is a critical component that orchestrates key interception and message routing, but KeysControllerFacts.cs appears to be incomplete based on the test file listing. The KeyMonitor namespace (InterceptKeys.cs, DesktopLockEventService.cs) and ShortcutAccumulator.cs have complex logic around keyboard state management that lacks comprehensive test coverage. This would improve reliability for keyboard event handling.

  • [ ] Examine existing KeysControllerFacts.cs and identify gaps in test coverage
  • [ ] Add tests for key interception scenarios in KeyMonitor/InterceptKeys.cs
  • [ ] Add tests for ShortcutAccumulator.cs accumulation and reset logic
  • [ ] Add tests for PasswordModeService.cs password mode toggling behavior
  • [ ] Ensure tests cover the interaction between IKeyProvider, IMessageProvider, and IShortcutProvider interfaces

Add keymap validation and documentation for src/Carnac.Logic/Keymaps/*.yml files

The Keymaps directory contains YAML configuration files for different applications (visual-studio.yml, vscode.yml, resharper.yml, etc.), but there is no visible schema documentation or validation tests. New contributors can easily add incorrect keymap formats. Adding a schema definition and validation tests would prevent user-facing configuration errors and make contributing new keymaps easier.

  • [ ] Create a JSON schema file documenting the keymap YAML structure (e.g., keymaps/schema.json)
  • [ ] Add unit tests in Carnac.Tests to validate YAML keymap files against the schema
  • [ ] Add a test that ensures all keymap files can be parsed and loaded correctly
  • [ ] Update README.md with a 'Contributing Keymaps' section explaining the format and validation

Add integration tests for Native interop code in src/Carnac.Logic/Native/

The Native folder contains P/Invoke definitions (DEVMODE.cs, DISPLAY_DEVICE.cs, DetailedScreen.cs, Win32Methods.cs) for Windows API calls, which are critical for screen detection and display management. These are rarely tested but failures here directly impact the display notification system. Adding integration tests would catch breaking changes when updating .NET versions or Windows API assumptions.

  • [ ] Create a new test class 'ScreenManagerIntegrationTests.cs' in Carnac.Tests
  • [ ] Add tests for ScreenManager.cs using the Native interop to verify multi-monitor detection works
  • [ ] Add tests for DetailedScreen.cs coordinate transformations across different DPI settings
  • [ ] Add tests to verify DEVMODE and DISPLAY_DEVICE structures marshal correctly with actual system data
  • [ ] Document in test class any Windows version or hardware requirements for the tests

🌿Good first issues

  • Add unit tests for KeyProvider.cs: Currently no test files visible in the listing; write tests covering key code translation, modifier combinations (Ctrl+Shift+Alt), and special key handling (F1-F12, arrows).
  • Extend or create missing application keymaps: The Keymaps/ folder has 6 YAML files; identify popular tools (e.g., JetBrains IntelliJ, Sublime Text, AutoHotkey) and contribute new keymap files following the existing format.
  • Document the YAML keymap schema: Create a KEYMAP_FORMAT.md explaining the structure, required fields, and validation rules for visual-studio.yml and similar files so contributors can safely add new tools.

Top contributors

Click to expand

📝Recent commits

Click to expand
  • ac8188c — simplify the build script run on appveyor (#254) (shiftkey)
  • fdc9602 — also build tags (#252) (shiftkey)
  • 020728a — pin build dependencies to specific versions (#251) (shiftkey)
  • 321ae9e — Update to latest cake (#248) (shiftkey)
  • 7e37701 — roll github token to publish new releases (shiftkey)
  • 1dfc1d7 — Bump YamlDotNet from 4.1.0 to 5.0.0 in /src/Carnac.Logic (#247) (dependabot[bot])
  • a3ae075 — Enable TLS1.2 so Squirrel can call GitHub (hnrkndrssn)
  • 2161ab9 — Merge pull request #210 from Code52/shiftkey-patch-1 (hnrkndrssn)
  • 429ccb3 — Update the auth token in the GitHub providers too (hnrkndrssn)
  • 058c860 — update github token (shiftkey)

🔒Security observations

  • High · Keyboard Input Interception Without User Consent Indication — src/Carnac.Logic/KeyMonitor/InterceptKeys.cs, src/Carnac.Logic/PasswordModeService.cs. The application implements low-level keyboard interception via InterceptKeys.cs and KeyMonitor components. This functionality can capture sensitive keystrokes including passwords, search queries, and private communications. While the application includes a PasswordModeService, the intercepted data handling and storage mechanisms are not clearly visible in the file structure, creating potential risk for keystroke logging without adequate user awareness. Fix: Implement explicit user consent dialogs at startup, ensure captured keystroke data is never persisted to disk, implement secure in-memory storage with automatic clearing, and provide clear documentation about data handling practices.
  • High · Native Win32 P/Invoke Without Validation — src/Carnac.Logic/Win32Methods.cs, src/Carnac.Logic/Native/. The codebase uses Win32Methods.cs for direct Windows API calls. Without visible input validation and proper error handling in native interop code, this creates potential for buffer overflows, memory corruption, or privilege escalation attacks. The DEVMODE.cs and DISPLAY_DEVICE.cs structures interact with display settings which could be manipulated. Fix: Add comprehensive input validation before all P/Invoke calls, use SafeHandle wrappers for native resources, implement proper exception handling around native calls, and conduct security review of all Win32 method signatures and their usage patterns.
  • Medium · Insecure Deserialization Potential with YAML Configuration Files — src/Carnac.Logic/Keymaps/. The application loads keymap configurations from YAML files (chrome.yml, visual-studio.yml, etc.) without visible deserialization security controls. If an attacker can modify these files or supply malicious YAML, code execution may be possible depending on the YAML parser used. Fix: Use a safe YAML parser with deserialization type restrictions, validate all loaded configuration against a schema, implement file integrity checks (hashing), store keymaps in read-only locations, and consider code-signing configuration files.
  • Medium · Missing Security Headers and Validation in WPF Application — src/Carnac.Logic/KeyProvider.cs, src/Carnac.Logic/MessageProvider.cs, src/Carnac/App.xaml.cs. While this is a desktop application, the absence of visible input validation in UI-facing components (KeyProvider.cs, MessageProvider.cs) could allow UI-based injection attacks if the application processes external input or displays user-controlled content. Fix: Implement input validation and sanitization for all user inputs, escape all display output, use data binding with proper type validation in XAML, and avoid dynamic code execution.
  • Medium · Inadequate Process Information Handling — src/Carnac.Logic/AssociatedProcessUtilities.cs, src/Carnac.Logic/Models/Processinfo.cs. AssociatedProcessUtilities.cs and Processinfo.cs enumerate and track running processes. If process information is logged or transmitted without encryption, this could leak information about user activities. Fix: Ensure process information is only kept in memory and never persisted, implement data minimization (only track necessary process info), encrypt any transmitted data, and provide user controls to exclude sensitive processes.
  • Low · Dependency Management Without Lock File — src/.nuget/NuGet.Config, src/Carnac.Logic/packages.config. The NuGet.Config is present but no packages.lock.json or similar lock file is visible for dependency pinning. This could lead to supply chain attacks if dependencies are updated unexpectedly. Fix: Implement NuGet package lock files to pin all transitive dependencies, regularly audit and update dependencies, use private NuGet feeds for sensitive projects, and implement Software Composition Analysis (SCA) scanning.
  • Low · Build Configuration Exposure — appveyor.yml, build.ps1, build.cake. AppVeyor CI configuration and build scripts (build.cake, build.ps1) are present in the repository. These may contain or inadvertently expose build secrets if not properly configured. Fix: Ensure build secrets are stored in CI/CD platform secrets management, never commit credentials to version control, use IAM roles/tokens instead of hardcoded credentials, and regularly audit build logs for

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 · Code52/carnac — RepoPilot