Introduction
ProtectASM is a system monitoring tool for notifying about physical hardware changes. It’ll send a push notification to the device’s owner’s phone, for example, when a USB device is plugged in or disconnected.
Status
Not recommended for “production” use without deep technical knowledge!
Currently the background service and app binaries need to be installed manually as there is no packaging or installers.
Public remote notification server running at https://protectasm-demo.midka.dev.
Feature list
- Unix support
- Detect monitor connect/disconnect
- Detect USB connect/disconnect
- Send notifications with minimal user information
- Registration with only using a display name for the device
- Authentication using ED25519 keypairs
- Send notifications using ntfy
- Online healthcheck to make sure user is notified if device loses internet access
- Windows support (planned, lack of time)
- Screensaver (fun idea, lack of time)
- Alarm sounds/flashing screen if a device is disconnected while user is away (fun idea, lack of time)
- More notification providers, for example, signal or matrix (lack of time)
- Proper installer / packaging (lack of time)
Motivation for making this project
In February 2026 I (Midka) was participating in the Assembly LAN party with a computer-seat ticket. However, I didn’t want to leave my devices alone as easily disconnectable peripherals could be stolen. As a quick solution, I wrote a small shell script that pings my server every 15 seconds with the current amount of connected USB devices and monitors. It worked fine but I wanted to try and make a better version before the next event in August. I also wanted to learn some technologies that I’ve not used before much.
Technology choices
- Programming Language: Rust
- Desktop User Interface: Qt6 using cxx-qt
- I made a small KDE widget using QML a couple months ago and wanted to expand my knowledge with writing a proper desktop application using QT.
- Database: fjall-rs.
- I have previous experience with SQLite and PostgresQL. I wanted to try something completely new to me; an embedded database written in Rust.
Contributing
All contributions are welcome in the form of code, documentation, ideas, issues, anything!
Code contributions: https://codeberg.org/project-protectasm/ProtectASM
Issues and discussions: https://codeberg.org/project-protectasm/ProtectASM/issues/new
License
ProtectASM is licensed under MIT. This documentation is licensed under MIT.
Installation
Configuration
Technical introduction
Technical architecture
User’s device
- runs the
engineas a background process- for example as systemd service or a Windows service
- has the
appbinary, acts as an interface for managing the engine - uses
protocolfor communication between them - on initial startup:
enginegenerates a device identity (keypair) and then registers with the ProtectASM server
ProtectASM server
- runs the
serverbehing a reverse proxy or something - configured with a matrix bot account for notifications (possibly more providers later)
- requires no user information for registration
- automatically removes devices after 30 days if there’s no communication in that time
- option to extend the time by some amount (Assembly events are 6 months apart so it could get annoying to always set it up again)
- it should be a separate option to enable/disable the device but still keep the configuration stored
- notification targets need to be verified somehow (possibly send a code and then ask for the code?)
- only accepts signed messages from devices using their keypair
- if a device has lost its private key, it must register as a new device and the old data will be deleted according to the settings
- ratelimits!
Contributors
- midka – development and documentation