Skip to content

Latest commit

ย 

History

80 Commits

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

SignalReport

Java 21+ License: MIT JUnit Tests Version 2.2.1

English | Deutsch

A professional, open-source monitoring tool for the continuous supervision of your internet quality โ€“ with PDF reports for ISP complaints, IP tracking and a DNS benchmark.

๐Ÿ’ก Why SignalReport?
"My internet is slow!" is not enough for an ISP. With SignalReport you deliver verifiable, quantified evidence โ€“ not just a gut feeling.

๐Ÿ“œ Project history
SignalReport was created between January and April 2026 as the final project of the diploma course "Software Developer" at WIFI Vienna (course 18195015) and has since been actively developed further as a personal open-source project. If you want to review the exact state at the time of the diploma examination, you can find it as release V1.


๐ŸŒŸ Features

Category Functions
Monitoring ๐Ÿ” Continuous measurement (ping/DNS/HTTP + gateways)
๐Ÿงช The HTTP check rates the line, not the website: any server response counts as reachable, only timeouts and connection errors fail (the reason is logged)
โฑ๏ธ Configurable interval (5sโ€“1h, default 30s)
โธ๏ธ Maintenance window (router updates)
๐ŸŒ IP tracking (detect external IP changes)
Fault localisation & reliability ๐Ÿ›ฐ๏ธ Pinpoint router vs. internet gateway vs. ISP (traceroute gateway chain)
๐Ÿณ Virtual-gateway detection in VM/Docker
๐Ÿ“ˆ Availability, coverage, MTBF & MTTR (gap-aware)
๐Ÿ“‰ Aggregated connection outages, individually excludable from the rating
Service reachability ๐Ÿšซ Detects whether services (Facebook, Instagram, X, YouTube, WhatsApp, โ€ฆ) are reachable or blocked โ€” distinguishing DNS / TCP / SNI / block-page filtering
๐Ÿ•’ Separate slow schedule (default 6 h), line-gated, off by default
๐Ÿ“… Per-service block/outage timeline in the PDF report
Visualisation ๐Ÿ“Š Live charts with Chart.js
๐Ÿ“‹ Per-cycle measurement table (collapsible)
๐ŸŒก๏ธ Hourly heatmap (fed from the condensed hourly values)
๐Ÿ–ฅ๏ธ Web interface (responsive)
๐Ÿ”” Browser push on outages / high latency
Reports ๐Ÿ“„ PDF export (24h / 7 days / 12 months; ranges beyond 7 days are built from the hourly values and finish in seconds even with years of data)
๐Ÿ“ˆ 3 charts (PING/DNS/HTTP) with target-change markers
๐Ÿ† Top 10 worst measurements (worst hours in long reports)
โš ๏ธ Connection-outage analysis
๐Ÿ“ค CSV export: time range filtered, all raw data as ZIP (streamed), hourly values as CSV
Security ๐Ÿ” Setup wizard (web-based, no CLI)
๐Ÿ”‘ Challenge-response authentication (SHA-256)
๐Ÿ‘ฅ Admin/user roles with session management
๐Ÿ›ก๏ธ Password is never transmitted in plaintext
Data safety ๐Ÿ›Ÿ Twin database (mirrored writes)
๐Ÿฉบ Self-healing: a read that hits a corrupted page falls back to the twin and schedules a rebuild; the rebuild unites both files into a fresh, compact database (automatically at the next start, or on demand with dbrebuild.bat / dbrebuild.sh)
โšก One transaction per measurement cycle, continuous H2 background compaction
๐Ÿ›‘ Orderly stop (signalreport.jar stop, used by the Windows service) closes both databases cleanly
Data preparation ๐Ÿ—œ๏ธ Hourly condensation: count, min / average / median / 95th percentile / max and jitter per hour, type and target (measurement_hourly)
๐Ÿงน Retention: unremarkable raw measurements older than 90 days (configurable, 0 = never) are removed; failed measurements, the end of each outage, excluded measurements and maintenance markers are kept forever
๐Ÿ•’ Heavy steps only inside a time window (default 03:00โ€“05:00, or the maintenance window); the light hourly step runs continuously; "Run now" button with progress and status in the settings
๐Ÿงต Runs on its own database connections with short pauses, so measurements and the web UI never wait behind it
Internationalisation ๐ŸŒ 9 languages: Deutsch, English, Franรงais, Italiano, Espaรฑol, Portuguรชs, Tรผrkรงe, Polski, ะฃะบั€ะฐั—ะฝััŒะบะฐ
๐Ÿ”ค Applies to web UI, PDF reports and CSV exports
๐ŸŽ›๏ธ Language choice in the setup wizard and in the settings
๐Ÿ“‚ Extensible without recompiling: drop your own language file into ./lang/
Configuration โš™๏ธ Dynamic measurement targets (ping/DNS/HTTP)
๐ŸŒ DNS benchmark (servers worldwide)
๐Ÿ‘ค User info (provider/customer number for reports)

๐Ÿš€ Quick start

Requirements

  • Java 21 or higher (download)
  • (Optional) Maven to build from source

Installation & start

# 1. Download the JAR (or build with Maven: mvn clean package)
java -jar signalreport.jar

# 2. Open the browser
http://localhost:4567

# 3. Run through the setup wizard (set an admin password)

โœ… Done! Measurement starts automatically โ€“ by default ping, DNS and HTTP (and the gateways, if set) are tested every 30 seconds.


๐Ÿ“ฆ Installation as a service

For continuous operation (even without a logged-in user) SignalReport can be installed as a background service.

Windows

  1. Download and unpack signalreport_windows.zip
  2. Right-click install.bat โ†’ "Run as administrator"
  3. The script installs the service, creates a desktop shortcut and sets up the firewall

macOS / Linux

  1. Download and unpack signalreport_mac-linux.zip
  2. Open a terminal and run: sudo bash install.sh
  3. The service is set up as a systemd service (Linux) or launchd service (macOS)

๐Ÿ’ก The signalreport.jar must be located in the same directory as the installation scripts.

๐Ÿ”„ Install or update: the script detects an existing installation and then only replaces the JAR (stop โ†’ swap โ†’ start) โ€” your data and config.json are preserved. To update, just drop the new signalreport.jar next to the script and run it again.

Uninstallation

  • Windows: right-click uninstall.bat โ†’ run as administrator
  • macOS/Linux: sudo bash uninstall.sh (in the terminal)

The uninstaller asks what to keep: nothing, the configuration (config.json), the database (your collected measurements), or both.

Database rebuild (repair and compaction)

  • Windows: right-click dbrebuild.bat โ†’ run as administrator
  • macOS/Linux: sudo bash dbrebuild.sh (in the terminal)

Stops the service, rebuilds the database from primary and shadow into a fresh, compact file (union of both, day by day; a page that is unreadable in one file is covered by the other), moves the old files to data/quarantine/rebuild_<time>/ and starts the service again. A report is written to data/signalreport_rebuild-report_<time>.txt. SignalReport also does this on its own at the next start when a read hits a corrupted page during operation.

Data preparation (hourly values and retention)

Once an hour is over, SignalReport condenses its raw measurements into hourly values and uses them for the heatmap, for reports longer than 7 days and for the hourly CSV export. Raw measurements that are older than the retention period (default 90 days) and unremarkable (successful, following a successful one) are deleted; every failed measurement, the end of each outage, excluded measurements and maintenance markers stay forever. The heavy steps (catching up on history, deleting) only run inside the configured time window โ€“ by default 03:00โ€“05:00, optionally the maintenance window. Everything is set in the settings card "Data preparation", which also shows the current state and offers "Run now" (5-minute cooldown). After an update from an older version the first run condenses the whole history; with months of data this takes a while and simply continues in the next window if it does not finish.


๐Ÿ“ธ Screenshots

Web interface PDF report (excerpt) DNS benchmark
Dashboard PDF Report DNS Benchmark
Live charts, statistics, settings Professional report for ISPs Comparison of global DNS servers

โš™๏ธ Configuration

After the first start a config.json is created. Important settings:

{
  "language": "en",
  "measurement": {
    "intervalSeconds": 30,
    "targets": {
      "ping": "8.8.8.8",
      "dns": "google.com",
      "http": "https://example.com"
    }
  },
  "maintenanceWindow": {
    "enabled": true,
    "startHour": 4,
    "startMinute": 0,
    "endHour": 4,
    "endMinute": 10
  },
  "userInfo": {
    "provider": "Oranga",
    "customerId": "08154711",
    "userName": "Matthias F."
  }
}

๐Ÿ’ก Tip: Changes made via the web interface (tab โš™๏ธ Settings) are applied and persisted immediately!

๐Ÿ›ฐ๏ธ Fault localization & virtual gateways

For fault localization (your own router vs. provider), SignalReport runs a traceroute at startup to find the nearest router and the gateway to the internet. When SignalReport runs inside a VM or container, the detected "router" may be a virtual NAT device rather than your real hardware:

  • The Docker default bridge (172.17.0.0/16) is skipped automatically when the real router is visible as the next hop behind it.
  • VirtualBox/QEMU NAT (10.0.2.0/24) and Docker bridges inside a container are recognised as virtual โ†’ a warning appears in the โš™๏ธ Settings tab under Gateways.
  • VMware NAT (192.168.x.2) and similar NATs in real home-network ranges cannot be told apart from a genuine router by IP, so they are deliberately not flagged automatically (to avoid false alarms).

Fix in such cases: in the โš™๏ธ Settings tab under Gateways, set the real router IP manually, or enable "do not ping continuously" for the internet gateway. Manually set IPs can optionally be kept across an IP change.


๐ŸŒ Internationalisation

SignalReport is fully multilingual โ€“ web interface, PDF reports and CSV exports. 9 languages are bundled:

๐Ÿ‡ฉ๐Ÿ‡ช Deutsch ยท ๐Ÿ‡ฌ๐Ÿ‡ง English ยท ๐Ÿ‡ซ๐Ÿ‡ท Franรงais ยท ๐Ÿ‡ฎ๐Ÿ‡น Italiano ยท ๐Ÿ‡ช๐Ÿ‡ธ Espaรฑol ยท ๐Ÿ‡ต๐Ÿ‡น Portuguรชs ยท ๐Ÿ‡น๐Ÿ‡ท Tรผrkรงe ยท ๐Ÿ‡ต๐Ÿ‡ฑ Polski ยท ๐Ÿ‡บ๐Ÿ‡ฆ ะฃะบั€ะฐั—ะฝััŒะบะฐ

  • Switching: in the setup wizard (before setting the password) or any time in the โš™๏ธ Settings tab
  • Default: fresh installations adopt the system language (otherwise English); existing installations stay on German
  • Add your own language (without recompiling): place a <code>.json file (e.g. nl.json) modelled on de.json into a lang/ folder next to signalreport.jar โ€“ it appears in the language dropdown automatically
  • Unicode in the PDF: the DejaVu font is embedded, so Turkish, Polish and Cyrillic script (Ukrainian) are rendered correctly too

๐Ÿ“Š PDF report โ€“ perfect for ISP complaints

The 12-month report contains:

  • โœ… Your customer data (name, provider, customer number)
  • โœ… Host information (hostname, hash, IPs)
  • โœ… 3 charts with red lines at target changes
  • โœ… Chronological list of the measured targets
  • โœ… Top 10 worst measurements (with timestamp)
  • โœ… Top 10 longest connection outages
  • โœ… Total number of outages

๐Ÿ“Œ How to use the report:

  1. Generate the PDF via "๐Ÿ“„ PDF report (12 months)"
  2. Save it as signalreport-providername-complaint-2026-03-25.pdf
  3. Attach it to a support email with text such as:
    "Attached is the technical evidence of repeated connection problems in the period XX to YY. Please check the line to my connection."

๐Ÿ—๏ธ Project structure

A compact overview of the directories and classes is available in docs/ProjectStructure.md; the architecture is described in docs/Architecture.md.

signalreport/
โ”œโ”€โ”€ src/main/java/at/mafue/signalreport/
โ”‚   โ”œโ”€โ”€ SignalReportApp.java              # Main class (entry point, measurement loop, orderly stop)
โ”‚   โ”œโ”€โ”€ StopCommand.java                  # "signalreport.jar stop": asks the running instance to shut down cleanly
โ”‚   โ”œโ”€โ”€ RebuildCommand.java               # "signalreport.jar rebuild-db": rebuilds the database from primary + shadow
โ”‚   โ”œโ”€โ”€ ServiceReachabilityScheduler.java # Slow service-reachability loop + line-gate
โ”‚   โ”œโ”€โ”€ DataPrepScheduler.java            # Data preparation in the background: hourly condensation, backlog + retention inside the time window
โ”‚   โ”œโ”€โ”€ config/                           # Slim Config + one file per area (Measurement, Gateway, ServiceReachability, DataPrep, โ€ฆ)
โ”‚   โ”œโ”€โ”€ measurement/                      # Measurer interface + Ping/Dns/Http, Measurement, DnsBenchmark
โ”‚   โ”œโ”€โ”€ network/                          # GatewayDiscovery (traceroute), ServiceReachabilityProbe, NetworkInfo, HostIdentifier
โ”‚   โ”œโ”€โ”€ storage/                          # H2MeasurementRepository (twin DB, shadow fallback), RollupService (hourly values + retention), DatabaseRebuilder + DTOs
โ”‚   โ”œโ”€โ”€ report/                           # ReliabilityReport, ConnectivityAssessment, ServiceReachabilityAssessment/Report, PdfReportGenerator
โ”‚   โ”œโ”€โ”€ web/                              # WebServer (Javalin orchestrator), SessionManager
โ”‚   โ”‚   โ”œโ”€โ”€ view/                         #   HtmlPageRenderer, SetupPageRenderer, LoginPageRenderer
โ”‚   โ”‚   โ””โ”€โ”€ api/                          #   12 route registrars (Measurement, Reliability, ServiceReachability, Settings, DataPrep, System, โ€ฆ)
โ”‚   โ”œโ”€โ”€ i18n/                             # I18n (9 languages, extensible)
โ”‚   โ””โ”€โ”€ notification/                     # PushNotificationService
โ”œโ”€โ”€ src/test/java/at/mafue/signalreport/  # 29 test classes, 210 tests (mirror the packages above)
โ”œโ”€โ”€ src/main/resources/web/               # Static assets: app.css, app.js, logos, favicons
โ”œโ”€โ”€ src/main/resources/lang/              # Language files (de, en, fr, it, es, pt, tr, pl, uk)
โ”œโ”€โ”€ src/main/resources/fonts/             # DejaVu fonts for the PDF (Unicode/Cyrillic)
โ”œโ”€โ”€ docs/
โ”‚   โ”œโ”€โ”€ diagrams/                         # PlantUML diagrams (.puml + .png)
โ”‚   โ”œโ”€โ”€ latex/                            # Full LaTeX documentation
โ”‚   โ””โ”€โ”€ screenshots/                      # UI screenshots
โ”œโ”€โ”€ deployment/                           # Install/update, uninstall and database-rebuild scripts (Win/Linux/macOS)
โ”œโ”€โ”€ config.json                           # Auto-generated configuration
โ”œโ”€โ”€ data/                                 # H2 twin database: primary + shadow (gitignored)
โ”‚   โ””โ”€โ”€ quarantine/                       # Corrupt DB files kept for analysis
โ”œโ”€โ”€ pom.xml                               # Maven build configuration
โ””โ”€โ”€ README.md                             # This file (German version: README_de.md)

๐Ÿ“š Documentation


๐Ÿ”’ Security notes

  • Challenge-response auth: passwords are never transmitted in plaintext โ€“ SHA-256 with single-use nonces
  • Session management: 24h session timeout, secure cookie-based authentication
  • Authentication: for public IPs (e.g. a NAS with port forwarding) make sure to enable it (tab ๐Ÿ” Security)
  • Setup password: the admin password is set on first start โ€“ never leave default values!
  • Database: all data stored locally in a crash-resistant twin database (primary + shadow). No cloud dependency, no external APIs (except ipify.org for the external IP)

๐Ÿค Contributing

SignalReport is open source! You can:

  • ๐Ÿ› Report bugs (issues)
  • ๐Ÿ’ก Suggest new features
  • ๐Ÿ“ Improve the documentation
  • ๐ŸŒ Contribute translations (a new lang/<code>.json modelled on de.json)

๐Ÿ“œ License

MIT License โ€“ see the LICENSE file.
Free to use for private and commercial purposes โ€“ with attribution.


๐Ÿ™ Acknowledgements

This project uses great open-source libraries and services:

Backend libraries (Maven/Java):

Frontend (browser):

  • Chart.js โ€“ live charts in the web interface (via CDN)
  • Web Crypto API โ€“ client-side SHA-256 hashing for challenge-response auth

Fonts:

  • DejaVu Fonts โ€“ embedded Unicode font for PDF reports (Latin, Latin Extended, Cyrillic)

External services:

  • ipify.org โ€“ discovery of the external IP address

Build & deployment:

Documentation & development:

My thanks also go to:

  • Christian Schรคfer โ€“ Java course and project coaching
  • Serap Kadam โ€“ support, friendship, everything around Java
  • [Angelika Winder] โ€“ support in all situations of life (except with Java)

๐Ÿ“ฎ Contact & support

For questions about the project or technical details, feel free to open an issue on GitHub.


๐ŸŒ SignalReport
Built with โค๏ธ for everyone who wants to know how stable their internet connection really is.

About

Self-hosted internet-quality monitor (Java 21 + Javalin): continuous ping/DNS/HTTP checks, gap-aware availability & outage statistics, traceroute-based fault localisation (router vs. ISP), block detection for online services, and PDF reports for provider complaints. Web UI in 9 languages; runs as a service on Windows, Linux and macOS.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages