diff --git a/bin/delete-device.php b/bin/delete-device.php
new file mode 100755
index 0000000..e791411
--- /dev/null
+++ b/bin/delete-device.php
@@ -0,0 +1,97 @@
+#!/usr/bin/env php
+ |
+ | |
+ | This program is free software: you can redistribute it and/or modify |
+ | it under the terms of the GNU Affero General Public License as published |
+ | by the Free Software Foundation, either version 3 of the License, or |
+ | (at your option) any later version. |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU Affero General Public License for more details. |
+ | |
+ | You should have received a copy of the GNU Affero General Public License |
+ | along with this program. If not, see |
+ +--------------------------------------------------------------------------+
+ | Author: Christian Mollekopf |
+ +--------------------------------------------------------------------------+
+*/
+
+
+define('RCUBE_INSTALL_PATH', realpath(dirname(__FILE__) . '/../') . '/');
+define('RCUBE_PLUGINS_DIR', RCUBE_INSTALL_PATH . 'lib/plugins/');
+
+// Define include path
+$include_path = RCUBE_INSTALL_PATH . 'lib' . PATH_SEPARATOR;
+$include_path .= RCUBE_INSTALL_PATH . 'lib/ext' . PATH_SEPARATOR;
+$include_path .= ini_get('include_path');
+set_include_path($include_path);
+
+// include composer autoloader (if available)
+if (@file_exists(RCUBE_INSTALL_PATH . 'vendor/autoload.php')) {
+ require RCUBE_INSTALL_PATH . 'vendor/autoload.php';
+}
+
+// include global functions from Roundcube Framework
+require_once 'Roundcube/bootstrap.php';
+
+$opts = rcube_utils::get_opt([
+ 's' => 'since', // Deletes *all* devices that haven't been used since the given timestamp. Doesn't take owner and device id into account. Timestamp format e.g.: "2024-11-01"
+ 'o' => 'owner',
+ 'd' => 'deviceid',
+]);
+
+$rcube = \rcube::get_instance();
+$db = $rcube->get_dbh();
+
+if (!empty($opts['since'])) {
+ $since = $opts['since'];
+ $since = new DateTime($since);
+ print("Removing all devices that haven't been used since: " . $since->format('Y-m-d H:i:s') . "\n");
+
+ $db->query(
+ "DELETE FROM `syncroton_device`"
+ . " WHERE `lastping` < ? OR `lastping` = NULL",
+ $since->format('Y-m-d H:i:s')
+ );
+ return;
+}
+
+if (empty($opts['deviceid'])) {
+ rcube::raise_error("Device id not specified (--deviceid).", false, true);
+}
+$device = $opts['deviceid'];
+
+if (empty($opts['owner'])) {
+ rcube::raise_error("owner not specified (--owner).", false, true);
+}
+$owner = $opts['owner'];
+
+$select = $db->query(
+ "SELECT `user_id` FROM `users`"
+ . " WHERE `username` = ?"
+ . " ORDER BY `user_id` DESC",
+ \strtolower($owner)
+);
+
+if ($data = $db->fetch_assoc($select)) {
+ $userid = $data['user_id'];
+} else {
+ rcube::raise_error("User not found in roundcube database, aborting: $email.", false, true);
+}
+
+print("Found the user with id: $userid\n");
+
+$db->query(
+ "DELETE FROM syncroton_device WHERE owner_id = ? AND deviceid = ?",
+ $userid,
+ $device
+);
+
+print("Deleted the device with the deviceid: $deviceid\n");