SRS Dashboard
Go to file
Lopinosaurus d34a6c97ac root-me: increase delay 2026-03-13 22:41:57 +01:00
public root-me: add sound effects 2026-03-13 22:17:59 +01:00
sound_effects root-me: add sound effects 2026-03-13 22:17:59 +01:00
.gitignore all: init 2026-03-02 12:37:37 +01:00
README.md root-me: add logins 2026-03-11 23:05:56 +01:00
alert.mp3 all: init 2026-03-02 12:37:37 +01:00
alert.sh alerts: new alerts 2026-03-03 14:07:31 +01:00
dismiss.sh all: init 2026-03-02 12:37:37 +01:00
logins.txt root-me: add gabriel 2026-03-13 18:35:54 +01:00
news.mp3 alerts: new alerts 2026-03-03 14:07:31 +01:00
package-lock.json all: init 2026-03-02 12:37:37 +01:00
package.json all: init 2026-03-02 12:37:37 +01:00
server.js root-me: increase delay 2026-03-13 22:41:57 +01:00
soft_alarm.mp3 alerts: new alerts 2026-03-03 14:07:31 +01:00

README.md

Cyber Dashboard

Real-time cyber monitoring dashboard: ANSSI/CERT-FR feeds, geopolitical news, Kaspersky live map, and Root-me ranking.

Requirements

  • Node.js ≥ 18
  • npm

Installation

npm install

Configuration

Environment variable Description Required
ROOTME_API_KEY Root-me API key (Profile → Preferences) Yes (Root-me widget)
DASHBOARD_PORT Listening port (default: 3000) No

Config files

logins.txt — one numeric Root-me user ID per line:

546528
123456

The ID can be found in the Root-me profile URL: root-me.org/Username?inc=score&id_auteur=XXXXXX

Start

ROOTME_API_KEY=<key> node server.js

Then open http://localhost:3000.

Manual alerts

# Trigger an alert
./alert.sh "INTRUSION DETECTED"

# With custom HTML
./alert.sh "TITLE" path/to/content.html

# Dismiss the alert
./dismiss.sh

Architecture

dashboard/
├── server.js          # Express + WebSocket server
├── public/
│   ├── index.html     # 2×2 grid with carousel
│   ├── style.css      # Dark cyber theme
│   └── app.js         # WS client + feed polling
├── logins.txt         # Root-me user IDs to track
├── alert.sh           # Triggers an alert via POST
└── dismiss.sh         # Dismisses the alert via DELETE

Endpoints

Method Route Description
GET /api/feeds/anssi CERT-FR bulletins (RSS)
GET /api/feeds/geo Geopolitical news (Google News RSS)
GET /api/rootme Root-me ranking (server cache)
GET /api/alert Current alert state
POST /api/alert Trigger an alert { message, html, image }
DELETE /api/alert Dismiss the alert
GET /proxy?url= HTTP proxy (strips X-Frame-Options/CSP)

WebSocket events

The server pushes the following events to all connected clients:

type Payload Description
alert { message, html, image } Alert triggered
dismiss Alert dismissed
rootme_update { ranking[] } Updated Root-me ranking
rootme_flag { login, gained, newScore } A player just flagged a challenge

Contributing

Commit conventions

<scope>: <short description>

Examples:

root-me: basic ranking
alerts: new alerts
all: init

The scope reflects the component changed (root-me, alerts, feeds, ui, server, all for cross-cutting changes).

Adding a widget

  1. Add a <section class="widget" id="widget-xxx"> in index.html
  2. Assign its grid cell in style.css (grid-column / grid-row)
  3. Add it to CAROUSEL_PAGES in app.js
  4. Add the corresponding endpoint in server.js if needed