ghostcanary
Endpoint security monitor. Watches your system and screams when something changes.
A loud, visible desktop canary. Not an EDR. Not a blocker. Just a watcher that talks.
What It Monitors
- Kernel drivers - new loads, disappearances
- Windows services - new services, state changes
- Processes - new process names, suspicious parent-child relationships, encoded PowerShell, download cradles
- Network connections - new outbound destinations, new listening ports, connection spikes, beaconing detection
- DNS cache - new resolutions, suspicious/DGA-like domains
- Registry autoruns - Run/RunOnce key changes
- Scheduled tasks - new tasks, removed tasks
- File system - new executables in monitored paths, startup folder modifications, System32 changes
- DLLs - unusual load paths, unsigned DLLs in signed processes
- Named pipes - new pipe creation (common C2 channel)
- WMI subscriptions - event subscription creation
- COM objects - hijack detection
- Event logs - gaps, cleared logs
Cross-platform: Windows (full support), Linux and macOS (core monitoring via psutil fallback).
Install
pip install ghostcanary
With desktop UI support (Pillow for mascot images):
pip install ghostcanary[ui]
With all optional dependencies (psutil for deeper process/network monitoring):
pip install ghostcanary[full]
Quick Start
Run the scanner
ghostcanary-scan # Continuous scanning (30s interval)
ghostcanary-scan --interval 10 # Faster scanning
ghostcanary-scan --once # Single scan and exit
ghostcanary-scan --list-logs # List monitored Windows Event Logs
Run the desktop UI
ghostcanary-ui # Floating desktop mascot with speech bubbles
ghostcanary-ui --test # Show a test bubble and exit
Run the daemon (manages scanner + UI)
ghostcanary-daemon run # Start both scanner and UI, auto-restart on crash
ghostcanary-daemon install # Add to Windows startup (requires admin)
ghostcanary-daemon uninstall # Remove from Windows startup
ghostcanary-daemon status # Check if running/installed
ghostcanary-daemon stop # Stop the daemon
How It Works
- Edge Parser scans system surfaces on a configurable interval
- Compares current state against a SQLite-backed baseline
- Emits typed signals with severity levels (INFO, WARN, ALERT, CRITICAL)
- Canary UI picks up signals and displays speech bubbles on your desktop
- Notification Center provides filterable history of all signals
No inference. No correlation. No blocking. Just facts.
Configuration
On first run, a config.yaml is created in the package directory with defaults. Key sections:
scan- interval, parallel workersbaseline- aging, frequency tracking, anomaly thresholdnetwork- spike detection, beaconing parametersbeaconing- trusted processes/destinations, scoring thresholdsprocess- suspicious parent/child relationshipsalert- sound, snooze, rate limitingui- color mode, theme
Using as a Library
import ghostcanary
# Check version
print(ghostcanary.__version__)
# Access signal types
print(ghostcanary.SignalTypes.NEW_KERNEL_DRIVER)
# Create a signal
sig = ghostcanary.Signal.create(
signal_type=ghostcanary.SignalTypes.NEW_KERNEL_DRIVER,
source_surface="CustomMonitor",
artifacts={"name": "suspicious.sys"},
severity=ghostcanary.Severity.CRITICAL,
category=ghostcanary.Category.KERNEL,
)
# Store in the signals database
db = ghostcanary.get_signals_db()
db.store(sig)
# Query signals
recent = db.get_recent(limit=10)
Signal Flow
System State (drivers, services, processes, network, ...)
|
v
Edge Parser (scan surfaces, compare baseline, emit signals)
|
v
signals.json (file-based queue) + signals.db (SQLite history)
|
v
Canary UI (poll queue, translate signal, show bubble)
Design Principles
- No inference - only detects changes, never interprets them
- No correlation - each surface is independent
- No blocking - observes, never prevents
- Local only - everything stays on this machine
- Expendable - raw logs exist elsewhere, these files can be deleted
- Visible - canary is always on screen, not hidden
- Loud - every signal gets a bubble
- Factual - dry tone, no alarm, no "attack" language
License
MIT
Metadata
Release files for ghostcanary 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| ghostcanary-0.2.0.tar.gz | 73.6 kB | Without provenance | Details for ghostcanary-0.2.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| ghostcanary-0.2.0-py3-none-any.whl | Python 3 | none | any | Details for ghostcanary-0.2.0-py3-none-any.whl |
Total release size: 141.9 kB
Release files / ghostcanary-0.2.0.tar.gz
| Download URL | ghostcanary-0.2.0.tar.gz |
|---|---|
| Size | 73.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6667a68944ab81a373bdf2cdfc1c97e251f1983f23bf6906056bad29a1b4f3d0
|
|
BLAKE2b-256 checksum How to use checksums |
31703fa8ccbf573447be09330b00faa8e814212e644be9b361e821afea18efff
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.10
|
Release files / ghostcanary-0.2.0-py3-none-any.whl
| Download URL | ghostcanary-0.2.0-py3-none-any.whl |
|---|---|
| Size | 68.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
9b6d803c52165b59c2e8d26715d33928d107d8844c78a15560579047c1fe33bc
|
|
BLAKE2b-256 checksum How to use checksums |
68f9c6ba44cbe0d7295809bda1c39f04fd46b30388f3b828635fce4171e0e19c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.10
|
Security for ghostcanary 0.2.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.