Strumento open source per inviare notifiche aziendali obbligatorie su rete locale Windows.
Messaggi a schermo intero che i dipendenti devono confermare con "HO LETTO". Nessun server, nessun cloud, nessun database: funziona su cartella condivisa SMB.
MustRead è un sistema di messaggistica interna per ambienti Windows aziendali che garantisce la conferma di lettura obbligatoria dei messaggi urgenti.
Quando un amministratore invia un messaggio tramite MustRead, sul PC del destinatario appare una finestra a schermo intero non chiudibile — senza pulsante X, senza ESC, senza Alt+F4 — che l'utente può chiudere solo cliccando "HO LETTO".
Perfetto per:
- 📢 Comunicazioni urgenti aziendali (manutenzioni, allarmi, avvisi IT)
- 🏭 Ambienti industriali e manifatturieri con PC condivisi
- 🏫 Scuole e università con laboratori informatici
- 🏥 Strutture sanitarie con postazioni multiple
- 🖥️ Server Terminal Services / RDP con utenti multipli
| Funzionalità | Descrizione |
|---|---|
| 📺 Notifica fullscreen | Occupa tutto lo schermo, sempre in primo piano |
| ✅ Conferma obbligatoria | L'utente deve cliccare "HO LETTO" per chiudere |
| 👤 Invio per utente | Messaggi diretti a un utente Windows specifico |
| 🖥️ Invio per computer | Messaggi diretti a un PC specifico |
| 📣 Broadcast | Invio a tutti gli utenti connessi contemporaneamente |
| 📋 Storico completo | Log di messaggi inviati, mostrati e confermati |
| 💾 Conferme durevoli | Le conferme date con la rete giù restano in coda locale e arrivano allo storico dopo |
| 🩺 Stato e diagnostica | Stato della connessione nella tray, "Verifica connessione" e log locale per utente |
| 🔌 Offline delivery | I messaggi restano in coda se il PC è offline |
| 🖧 RDP / Terminal Server | Funziona nelle sessioni Remote Desktop |
| 🔒 Autorizzazione mittenti | Solo gli utenti autorizzati possono inviare messaggi |
| ⚙️ Zero dipendenze | Solo una cartella SMB condivisa, nessun server |
| 🚀 Avvio automatico | Per l'utente dal menu tray, o per tutti gli utenti con l'MSI |
| 📦 Installer MSI | Installazione silenziosa via GPO / Intune, con percorso share preconfigurato |
┌─────────────────┐ \\SERVER\MustRead\ ┌─────────────────┐
│ PC MITTENTE │ ──── inbox/users/... ───▶ │ PC DESTINATARIO│
│ │ │ │
│ [INVIA MSG] │ cartella SMB │ ┌───────────┐ │
│ │ │ │MESSAGGIO │ │
└─────────────────┘ │ │IMPORTANTE │ │
│ │ │ │
│ │[HO LETTO] │ │
│ └───────────┘ │
└─────────────────┘
- Il mittente apre MustRead dalla tray icon e scrive il messaggio
- Sceglie il destinatario: utente specifico, PC specifico, oppure tutti
- Il messaggio viene scritto come file JSON nella cartella condivisa
- L'agent sul PC destinatario rileva il file (polling ogni N secondi)
- Appare la finestra fullscreen — l'utente non può ignorarla
- Al click su "HO LETTO" il messaggio viene registrato nello storico
- Sistema operativo: Windows 10 / Windows 11 (x64)
- Runtime: nessuno da installare (exe e MSI includono .NET 8)
- Rete: Cartella condivisa SMB accessibile in lettura/scrittura da tutti i PC
- Permessi: Nessun privilegio di amministratore richiesto per la ricezione
Dalla pagina Releases scarica i file e verifica l'integrità con SHA256SUMS.txt.
msiexec /i MustRead-v1.1.0-win-x64.msi /qn SERVERPATH=\\SERVER\MustRead AUTOSTART=1Installa in Program Files, imposta il percorso della share e l'avvio automatico per tutti gli utenti.
Dettagli in docs/setup.md.
Scarica MustRead.exe e copialo su ogni PC. Non richiede l'installazione di .NET.
Gli eseguibili non sono ancora firmati digitalmente: Windows SmartScreen può mostrare un avviso.
git clone https://github.com/pikappa13/mustread.git
cd mustread/src/MustRead.App
dotnet publish -c Release -r win-x64 --self-contained true -p:PublishSingleFile=trueCrea una cartella condivisa su un server o PC accessibile in rete:
\\SERVER\MustRead\
Struttura creata automaticamente da MustRead al primo avvio:
\\SERVER\MustRead\
├── clients\ ← presenza online dei client (heartbeat)
├── inbox\
│ ├── users\ ← messaggi per utente (es. DOMAIN_mario)
│ ├── computers\ ← messaggi per computer (es. PC-UFFICIO01)
│ └── all\ ← messaggi broadcast per tutti
├── history\
│ ├── sent.jsonl ← log messaggi inviati
│ ├── shown.jsonl ← log messaggi mostrati a schermo
│ └── read.jsonl ← log conferme di lettura
└── config\
└── authorized_senders.json ← utenti autorizzati all'invio
Al primo avvio, MustRead apre automaticamente la schermata di configurazione.
In alternativa, crea C:\ProgramData\MustRead\settings.json:
{
"serverPath": "\\\\SERVER\\MustRead",
"enableSender": true,
"enableReceiver": true,
"pollingSeconds": 3,
"allowSendToAll": true,
"applicationName": "MustRead",
"requireAuthorizedSenders": false
}| Parametro | Descrizione |
|---|---|
serverPath |
Percorso UNC della cartella condivisa |
enableSender |
Abilita la schermata di invio (solo per admin) |
enableReceiver |
Abilita la ricezione notifiche in background |
pollingSeconds |
Frequenza di controllo nuovi messaggi (secondi) |
allowSendToAll |
Abilita il broadcast a tutti gli utenti |
applicationName |
Nome visualizzato nell'interfaccia |
requireAuthorizedSenders |
Se true, senza authorized_senders.json nessuno può inviare |
Crea \\SERVER\MustRead\config\authorized_senders.json:
[
"DOMAIN\\admin1",
"DOMAIN\\it_support"
]Se il file non esiste, chiunque con enableSender: true può inviare messaggi, a meno che requireAuthorizedSenders sia true. Un file illeggibile o malformato nega sempre l'invio.
Apri Impostazioni dalla tray icon e spunta "Avvia automaticamente con Windows".
MustRead aggiunge una voce in HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run — senza privilegi di amministratore.
- Doppio clic sull'icona MustRead nella tray (in basso a destra)
- Seleziona uno o più destinatari dalla lista degli utenti online
- Scrivi il testo del messaggio
- Clicca INVIA
I destinatari online ricevono la notifica entro pollingSeconds secondi.
I destinatari offline ricevono il messaggio al prossimo avvio di MustRead.
MustRead gira in background nella system tray. Quando arriva un messaggio:
- Appare automaticamente una finestra a schermo intero
- Non può essere chiusa con ESC, Alt+F4 o il pulsante X
- L'utente deve cliccare "HO LETTO" per confermare e chiudere
- Se arrivano più messaggi, vengono mostrati in sequenza
Clic destro sull'icona tray → Storico
Tre tab: messaggi inviati, messaggi mostrati, messaggi confermati.
MustRead è compatibile con sessioni Remote Desktop (RDP) e Terminal Server:
- Funziona in ogni sessione RDP attiva purché MustRead sia avviato nella sessione
- Rileva automaticamente il tipo di sessione (
Local/RDP) - In ambienti Terminal Server, usa Group Policy o logon script per avviare MustRead per ogni utente
- Il
clientIdinclude ilsessionIdper distinguere sessioni multiple dello stesso utente
Vedere docs/rdp-deployment.md per le istruzioni dettagliate e docs/delivery-semantics.md per chi deve confermare cosa.
Q: Serve un server dedicato?
A: No. Basta una cartella condivisa Windows su qualsiasi PC o NAS della rete.
Q: Funziona senza Internet?
A: Sì, MustRead funziona interamente sulla rete locale (LAN). Non richiede connessione Internet.
Q: Un utente può ignorare il messaggio?
A: La finestra è fullscreen, sempre in primo piano, senza pulsanti di chiusura. Un utente tecnico con accesso al Task Manager può terminare il processo, ma questo viene documentato nelle limitazioni.
Q: Funziona con Active Directory?
A: Sì. MustRead usa Environment.UserDomainName e Environment.UserName — compatibile con utenti di dominio AD.
Q: Quanti PC supporta?
A: Non c'è un limite tecnico. Le prestazioni dipendono dalla velocità della rete e del file server.
Q: I messaggi sono cifrati?
A: No. I messaggi sono file JSON in chiaro. La sicurezza è delegata ai permessi NTFS della cartella condivisa. Non usare MustRead per informazioni riservate.
Q: Funziona su Windows 7?
A: No. Richiede Windows 10 o Windows 11 con .NET 8. Per Windows 7 sarebbe necessario un porting a .NET Framework 4.8.
- ❌ Non funziona se il PC è spento o ibernato
- ❌ Non mostra messaggi sulla schermata di login Windows
- ❌ Non bypassa la lock screen (schermo bloccato)
- ❌ Un amministratore può terminare il processo MustRead
- ❌ Non è un sistema di emergenza certificato
- ❌ I messaggi sono in chiaro (file JSON non cifrati)
⚠️ Per RDP: l'agent deve girare dentro la sessione dell'utente
Vedere docs/limitations.md per i dettagli.
mustread/
├── src/
│ ├── MustRead.App/ ← Applicazione principale (WinForms .NET 8)
│ │ ├── Forms/ ← UI: SenderForm, AlertForm, HistoryForm, SettingsForm
│ │ ├── Services/ ← Business logic: invio, ricezione, storico, registro
│ │ ├── Models/ ← Modelli dati: AlertMessage, ClientInfo, AppSettings
│ │ └── Utils/ ← FileLockHelper, JsonHelper, UiHelper
│ ├── MustRead.Tests/ ← Suite di test xUnit
│ └── MustRead.TestHost/ ← Eseguibile di supporto per i test multi-processo
├── .github/workflows/ ← CI: build, test, coverage, scansione vulnerabilità
├── installer/ ← Installer MSI (WiX) e smoke test
├── examples/ ← File di configurazione di esempio
├── docs/ ← Documentazione setup, RDP, limitazioni
├── MustRead.sln
├── CHANGELOG.md
├── README.md
└── LICENSE
Il piano tecnico completo, con priorità, dipendenze, criteri di accettazione e gate di rilascio, è disponibile in docs/production-roadmap.md.
- Test versionati e CI su GitHub Actions
- Stato dei messaggi letti per utente (PC condivisi e RDP)
- Scritture con lock obbligatorio e atomiche
- Autorizzazione mittenti fail-closed e validazione destinatari
- Log diagnostico locale
- Coda persistente per le conferme da sincronizzare sulla share
- Stato della connessione nella tray e "Verifica connessione"
- Test multi-processo reali e installer MSI verificato in CI
- Prova su server RDP reale con più utenti e sessioni
- Eseguibile e MSI firmati digitalmente
- Grafica rinnovata di tutte le finestre: tema coerente, testo nitido ad alta risoluzione, tema scuro, alert che non taglia i messaggi lunghi, storico in tabella
- Ricevute di lettura per destinatario visibili al mittente
- Storico con filtri, ricerca ed export CSV
- Livelli info / warning / critical e suono configurabile
- Interfaccia in italiano e inglese, accessibilità da tastiera
- Gruppi / reparti e integrazione opzionale con Active Directory
- Backend HTTP opzionale (alternativa alla cartella SMB)
Pull request benvenute! Per modifiche significative, apri prima una issue per discutere l'approccio.
git clone https://github.com/pikappa13/mustread.git
cd mustread
dotnet test MustRead.sln # tutti i test devono passare (la CI li esegue a ogni push)Distribuito sotto licenza MIT. Vedere LICENSE per i dettagli.
Sviluppato da Patrick Battistini
MustRead — Perché ogni messaggio importante merita di essere letto.