Testing
Use this as a short manual end-to-end checklist before shipping.
Signup flow
- Create a fresh account.
- Log in on one client device.
- Confirm the device appears in the web dashboard.
- Wait for screenshots to upload.
- Confirm logs and screenshots render on web.
- Confirm gallery view works
Partners
-
Invite a non-existent account from web.
-
Ensure an email is sent and can be used to sign up with an account
-
Ensure the account is automatically added as a partner
-
Confirm that there is clear indication of why the partner cannot see logs yet
-
Click confirm partner on the original account
-
Confirm the partner can see the logs
-
Remove the partnership and confirm they can no longer see the logs
-
Invite an existing user
-
Accept the invite from the other account.
-
Ensure the other user can accept it
Session and recovery
-
Log out and log back in on web.
-
Restart the client machine.
-
Confirm monitoring resumes automatically.
-
Confirm a bad email/password is rejected in the client
-
Confirm a bad email/password is rejected on the web
Capture checks
- Verify the capture cadence matches the configured interval.
- Leave the client idle long enough to force at least one batch upload.
- Confirm timestamps are ordered and recent.
- Confirm login/logout events
macOS
Install the .dmg, drag to Applications, and launch.
- Confirm the tray icon appears in the menu bar.
- Log in from the tray menu and confirm screenshots appear in the web app within ~10 minutes.
- Sleep and wake the machine; confirm zero-risk suspend and wake logs and that capture resumes automatically.
- Reboot the machine; confirm zero-risk shutdown and startup logs and that monitoring resumes without re-login.
- Use tray → Stop Monitoring; confirm the confirmation prompt and a high-risk user-stop log with a marker so the next start is zero-risk.
- Use tray → Logout; confirm the confirmation prompt and a high-risk logout log.
kill <daemon-pid>outside a system shutdown; confirm a 0.5-risk stop log followed by a startup classification based on the stop marker (zero-risk if within 10 seconds, otherwise high-risk).kill -9 <daemon-pid>; confirm no stop log is emitted and the next startup emits a high-risk log if the gap exceeds the 70-second ping window.- Revoke Screen Recording in System Settings; confirm capture stops and a high-risk log is emitted for the permission loss; restoring permission resumes capture.
Windows
Install the MSIX and launch from Start.
- Confirm the tray icon appears and no window opens automatically.
- Log in from the settings window and confirm screenshots appear in the web app within ~10 minutes.
- Sleep and wake the machine; confirm zero-risk suspend and wake logs and that capture resumes automatically.
- Reboot the machine; confirm zero-risk shutdown and startup logs and that monitoring restarts via the startup task without re-login.
- Sign out of the Windows user session; confirm a zero-risk session-logout log.
- Use tray → Exit; confirm the confirmation prompt and a high-risk user-stop log with a marker so the next start is zero-risk.
- Log out from the settings window; confirm a high-risk logout log.
- Force-kill
Virtue.WindowsApp.exefrom Task Manager (End Task); confirm a 0.5-risk stop log if cleanup runs, or a high-risk log on next start determined by ping timestamps. - Disable the
VirtueTrayStartuptask and reboot; confirm a high-risk log on the next time the app runs.
Linux
Install the .deb and verify.
- Run
virtue loginand confirmvirtue statusshows logged in and monitoring active. - Confirm screenshots appear in the web app within ~10 minutes.
- Suspend and resume the machine; confirm zero-risk suspend and wake logs and that capture resumes automatically.
- Reboot the machine; confirm zero-risk shutdown and startup logs and that the systemd user service starts automatically without re-login.
- Run
virtue daemon stop; confirm the confirmation prompt and a high-risk user-stop log with a marker so the nextvirtue daemon startis zero-risk. - Run
virtue logout; confirm the confirmation prompt and a high-risk logout log. - Run
systemctl --user stop virtue.service(outsidevirtue daemon stop); confirm a 0.5-risk stop log and a startup classification based on the stop marker on next start. kill <daemon-pid>(SIGTERM) outside a system shutdown; confirm a 0.5-risk stop log.kill -9 <daemon-pid>(SIGKILL); confirm no stop log is emitted and the next startup emits a high-risk log if the gap exceeds the 70-second ping window.- On Wayland without a supported capture tool, confirm the client logs a capture failure but does not crash and continues retrying uploads.
Android
Install the APK and launch.
- Log in and grant the screen capture (MediaProjection) permission; confirm a persistent foreground notification appears.
- Confirm screenshots appear in the web app within ~10 minutes.
- Swipe the app away from Recents; confirm monitoring continues via the foreground service.
- Reboot the device; confirm monitoring restarts automatically and new activity appears in the web app.
- Force-stop the app from Android Settings → Apps; confirm a high-risk tamper log is emitted and monitoring resumes on next launch.
- Revoke screen-capture permission mid-session; confirm a high-risk log is emitted for the permission loss, the app does not crash, and capture resumes when permission is re-granted.
- Sign out; confirm a high-risk logout log, the service stops, and the login screen is shown.
iOS
Build and run on a device or simulator.
- Log in and enable the Safari extension in iOS Settings with All Websites access.
- Browse in Safari and confirm screenshots appear in the web app within ~5 minutes.
- Disable the Safari extension; confirm a high-risk tamper log is emitted, new captures stop, and any queued data still uploads.
- Force-quit Safari or the extension and reopen; confirm capture resumes when Safari is active again.
- Sign out; confirm a high-risk logout log and the login screen is shown.
Specific tests
These tests might not need to be run every time.
Email change
- Go to settings
- Change your email
- Ensure new email is set to unverified
- Ensure validation email is sent and works
Password reset
-
Go to login
-
Click reset password
-
Enter email
-
Follow password reset instructions
-
Ensure password is reset and can be used to log in
-
Ensure partners can see new logs
-
Ensure you can see other partners’ logs
-
Go to login
-
Click reset password
-
Enter an email without an account
-
Ensure it says an “email was sent if an account exists” but doesn’t send an email