Dashboard¶
The Dashboard is the first page operators see after logging in. It provides a real-time operational summary of the C2 infrastructure -- active beacons, running listeners, sessions, campaigns -- alongside charts and an activity feed that aggregate data from multiple sources.
Overview¶
The dashboard is composed of four sections:
- Stat cards -- animated counters showing active beacons, running listeners, sessions, and campaigns
- Charts row -- beacon status distribution (donut), OS distribution (donut), and a 24-hour check-in timeline (area chart)
- Activity feed -- a unified timeline merging beacon check-ins, listener state changes, and campaign updates
- Quick actions -- shortcut buttons for common operator tasks
graph TB
subgraph Dashboard
A[Stat Cards Row]
B[Charts Row]
C[Activity Feed]
D[Quick Actions]
end
subgraph "Data Sources"
E[Beacons API]
F[Listeners API]
G[Sessions API]
H[Campaigns API]
I[Stats API]
end
E --> A
E --> B
E --> C
F --> A
F --> C
G --> A
H --> A
H --> C
I --> A Stat Cards¶
The top row displays four animated stat cards with live counters. Each card links to its respective management page.
| Card | Value | Link |
|---|---|---|
| Active Beacons | Active / Total beacons | Cockpit |
| Listeners | Running / Total listeners | Listeners |
| Sessions | Total sessions across campaigns | Campaigns |
| Campaigns | Active / Total campaigns | Campaigns |
Cards use staggered entrance animations on page load and animated number transitions when values change. A card turns green when its primary metric is non-zero (e.g., at least one active beacon or running listener).
Active beacon calculation
A beacon is considered "active" if its last check-in is within 1.5x its configured sleep interval. For example, a beacon with a 60-second sleep is active if it checked in within the last 90 seconds. This same threshold is used throughout the platform.
Charts¶
The charts row displays three visualizations side by side, each with a freshness indicator showing when the underlying data was last refreshed.
Beacon Status Distribution¶
A donut chart showing the count of beacons in each status category:
| Status | Color | Meaning |
|---|---|---|
| ACTIVE | Green | Checked in within the expected interval |
| DORMANT | Yellow | Missed expected check-in but not yet dead |
| DEAD | Red | No check-in for an extended period |
The center of the donut displays the total beacon count. When no beacons exist, a placeholder message is shown instead.
OS Distribution¶
A donut chart breaking down beacons by operating system. OS names are normalized for clarity:
windows (amd64)becomes Windows- OS strings containing
serverbecome Windows Server linuxvariants become Linuxdarwin/macosvariants become macOS
When only a single OS is present, the chart displays a large numeric count instead of a donut.
Check-in Timeline (24h)¶
An area chart showing beacon check-in activity over the last 24 hours, bucketed by hour. The chart includes:
- Hourly check-in counts along the Y axis
- Hour labels (HH:00) along the X axis
- A gradient fill under the area line
- A peak count summary below the chart
Activity Feed¶
The activity feed merges events from three sources into a single reverse-chronological timeline (newest first), displaying the 30 most recent events.
| Event Type | Source | Display |
|---|---|---|
beacon_checkin | Beacons | Hostname, IP, username, OS, and beacon status badge |
listener_change | Listeners | Listener name, status, protocol and bind address |
campaign_change | Campaigns | Campaign name, status, beacon and credential counts |
Each event shows:
- A color-coded status dot (green for active/running, yellow for dormant/paused, red for dead/error, gray for stopped/archived)
- An icon indicating the event type (signal for beacons, radio for listeners, target for campaigns)
- A relative timestamp (e.g., "3 minutes ago")
- A status badge
Interactive elements
Beacon hostnames in the activity feed display a hover card with detailed beacon information (PID, integrity level, sleep interval). IP addresses support click-to-copy for quick use in other tools.
Freshness Indicator¶
Both the charts and the activity feed display a freshness indicator showing when the underlying data was last fetched. This helps operators distinguish between stale data and a genuinely quiet engagement.
Quick Actions¶
The quick actions panel on the right side of the dashboard provides one-click navigation to common tasks:
| Action | Destination | Description |
|---|---|---|
| New Listener | /listeners/new | Create a C2 listener |
| Generate Payload | /payloads/generate | Build a new implant |
| Open Cockpit | /cockpit | Topology and shell access |
| View Beacons | /cockpit | Active C2 implants |
Stats API¶
The dashboard stat cards are powered by a consolidated stats endpoint that returns all sidebar badge counts in a single response. This avoids N+1 API calls when rendering the sidebar and dashboard simultaneously.
Response fields:
| Field | Type | Description |
|---|---|---|
active_beacons | int | Beacons currently within their check-in threshold (computed from in-memory registry) |
running_listeners | int | Listeners with status running |
targets | int | Total discovered targets |
services | int | Total discovered network services |
credentials | int | Total harvested credentials |
downloads | int | Total downloaded files |
keystrokes | int | Total keystroke capture records |
screenshots | int | Total captured screenshots |
Active beacons are computed in real-time
The active_beacons count is not a database query -- it is computed from the in-memory BeaconRegistry by checking each beacon's last_seen against a threshold of 1.5x its sleep interval. All other counts come from database aggregation queries.
Data Refresh¶
Dashboard data refreshes automatically through React Query's polling mechanism:
| Data Source | Refresh Interval | Method |
|---|---|---|
| Beacons | 10 seconds | Polling via useBeacons hook |
| Listeners | Default (on focus) | Polling via useListeners hook |
| Sessions | Default (on focus) | Polling via useSessions hook |
| Campaigns | Default (on focus) | Polling via useC2Campaigns hook |
Beacon data refreshes most frequently (every 10 seconds) because check-in recency is critical for operational awareness. Other data sources refresh on window focus or navigation, which is sufficient for less volatile data.
Next Steps¶
- UI Walkthrough -- learn how to navigate the full operator interface
- Core Concepts -- understand beacons, listeners, and the C2 lifecycle