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
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 | |
|---|---|---|---|
| ghostcanary-0.2.0.tar.gz | 73.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| ghostcanary-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
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
|