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 releaseV1.
| 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) ๐ค 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) |
- Java 21 or higher (download)
- (Optional) Maven to build from source
# 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.
For continuous operation (even without a logged-in user) SignalReport can be installed as a background service.
- Download and unpack
signalreport_windows.zip - Right-click
install.batโ "Run as administrator" - The script installs the service, creates a desktop shortcut and sets up the firewall
- Download and unpack
signalreport_mac-linux.zip - Open a terminal and run:
sudo bash install.sh - The service is set up as a systemd service (Linux) or launchd service (macOS)
๐ก The
signalreport.jarmust 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.jsonare preserved. To update, just drop the newsignalreport.jarnext to the script and run it again.
- 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.
- 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.
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.
| Web interface | PDF report (excerpt) | DNS benchmark |
|---|---|---|
![]() |
![]() |
![]() |
| Live charts, statistics, settings | Professional report for ISPs | Comparison of global DNS servers |
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!
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.
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>.jsonfile (e.g.nl.json) modelled onde.jsoninto alang/folder next tosignalreport.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
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:
- Generate the PDF via "๐ PDF report (12 months)"
- Save it as
signalreport-providername-complaint-2026-03-25.pdf- 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."
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)
- Full LaTeX documentation as PDF:
signalreport-dokumentation.pdfContains UML diagrams, architecture description, implementation details and the test report. (Document language: German.) - Architecture overview:
docs/Architecture.md - Project structure:
docs/ProjectStructure.md - UML diagrams: all 7 diagrams as PNG and PlantUML in
docs/diagrams/:class-diagram.pngโ class structurecomponent-diagram.pngโ component overviewsequence-measurement.pngโ measurement flowsequence-pdf.pngโ PDF export processusecase-diagram.pngโ use casesdeployment-diagram.pngโ deployment scenariosstate-diagram-auth.pngโ authentication states
- 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)
SignalReport is open source! You can:
- ๐ Report bugs (issues)
- ๐ก Suggest new features
- ๐ Improve the documentation
- ๐ Contribute translations (a new
lang/<code>.jsonmodelled onde.json)
MIT License โ see the LICENSE file.
Free to use for private and commercial purposes โ with attribution.
This project uses great open-source libraries and services:
Backend libraries (Maven/Java):
- Javalin โ lightweight web framework
- H2 Database โ embedded SQL database
- Jackson โ JSON serialisation (config, API)
- OpenPDF โ PDF creation
- JFreeChart โ chart generation for PDF reports
- dnsjava โ DNS queries for the benchmark
- SLF4J + Logback โ logging
- JUnit 5 โ test framework
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:
- Apache Maven โ build system
- Apache Commons Daemon โ service installation (procrun/jsvc)
Documentation & development:
- PlantUML โ UML diagrams
- LaTeX โ project documentation
- EmojiTerra โ emoji reference
- StackOverflow โ Q&A platform for software developers
- Hitchhikerโs Guide to PlantUML โ nomen est omen
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)
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.



