OffLoadAI переносит и удаляет файлы, поэтому безопасность данных для него — главное требование, а не дополнение.
Не создавайте публичный issue. Используйте приватный отчёт GitHub: вкладка Security → Report a vulnerability в репозитории.
Оригинал удаляется только после проверенной копии. Каждый файл копируется с подсчётом SHA-256 и сбрасывается на носитель через F_FULLFSYNC (обычный fsync на macOS оставляет данные в кеше самого накопителя). Копия пишется и перечитывается мимо кеша памяти (F_NOCACHE), поэтому сверка читает носитель, а не страницы, совпавшие с оригиналом в памяти. Затем проверяется, что оригинал не менялся во время переноса (размеры и даты файлов и каталогов). Копия пишется под временным именем и переименовывается только после сверки, каталог после переименования тоже сбрасывается на носитель; при сбое удаляется лишь незаконченная копия.
Два независимых подсчёта перед удалением. Содержимое папки считается двумя разными системными механизмами — readdir и fts. Если подсчёты разошлись хоть на один объект, перенос останавливается и ничего не удаляется. FileManager.enumerator не используется: он молча скрывает файлы с именами на «._», и такие файлы исчезли бы вместе с оригиналом.
Не трогает то, что сломает приложения. Пакеты виртуальных машин и медиатек (.utm, .photoslibrary и др.), данные приложений в ~/Library, ~/.ssh и другие служебные папки перенести нельзя — даже если они лежат глубоко внутри выбранной папки.
Открытые файлы. Пока файлы открыты в другом приложении, перенос запрещён. Проверка идёт при плане и ещё раз — перед копированием и перед удалением оригинала: план может часами стоять в окне подтверждения. Если проверить не удалось при плане, OffLoadAI требует явного подтверждения, а не считает, что всё чисто. Архив на диске, который удаляется после «Зашифровать перенесённое» или «Вернуть и удалить с диска», тоже должен быть закрыт и не меняться с начала копирования, иначе он остаётся на месте.
Внешние программы запускаются без оболочки. Аргументы передаются массивом, поэтому пробелы, кавычки, ;, $() и обратные кавычки в путях не становятся командами. Системные программы (hdiutil, lsof, du, ssh-keygen) берутся только из /usr/bin, /bin, /usr/sbin, /sbin; переменная PATH не используется. Окружение запущенным программам передаётся только нужное — PATH из известных каталогов, домашняя папка, язык и куда подключаться Docker; свои RESTIC_PASSWORD или ANTHROPIC_API_KEY человека до restic и Claude Code не доходят и не подменяют введённый пароль или вход.
Файлы назначения не перезаписываются. Они открываются с O_EXCL | O_NOFOLLOW: подложенная символическая ссылка на месте копии не приведёт к записи в чужой файл. Это касается и спутников архива — списка сумм .sha256 и прав .modes.json: они пишутся так же и до переименования архива, а имя архива выбирается свободным вместе с ними. Служебные файлы с внешнего диска (журнал, списки, метки копирования) читаются без перехода по ссылкам, только если это обычный файл нужного размера: ссылка на /dev/zero или FIFO на их месте не подвешивает программу. Исходные файлы открываются с O_NOFOLLOW: если файл подменят ссылкой между проверкой и копированием, чтение не уйдёт по ней.
Сейф. Зашифрованный sparsebundle (AES-256, APFS внутри) на внешнем диске. Корень открытого тома сразу получает права 700: иначе, пока сейф открыт, его читали бы другие учётные записи этого Mac (файлы копируются со своими правами, .env и .npmrc обычно 644). Пароль — не короче 16 символов и от 60 бит по оценке, которая снижает цену повторов, клавиатурных рядов, годов, словарных слов и их записи с заменами («P@ssw0rd»). Управляющие символы в пароле не принимаются: hdiutil обрезает пароль на нулевом байте. Пароль передаётся hdiutil только через stdin (аргументы командной строки видны любому процессу через ps), не сохраняется, не пишется в журналы и стирается из полей ввода сразу после попытки. Смена пароля (hdiutil chpass) передаёт старый и новый пароли так же, через stdin.
Шифрование подтверждает macOS, а не файл на диске. До открытия — hdiutil isencrypted: образ должен быть зашифрован и иметь хотя бы один пароль. Проверено на подделках: образ с восемью байтами encrcdsa в token система называет незашифрованным, а заголовок, набитый нулями, — зашифрованным, но без единого пароля; оба отклоняются. После открытия — hdiutil info: ключ image-encrypted уже подключённого тома, найденного строго по точке монтирования; не подтвердилось — том отключается, ничего не записав. Ни hdiutil imageinfo, ни diskutil image info не используются: на зашифрованном образе они вызывают системное окно с запросом пароля.
Автозакрытие. Сейф закрывается при сне, блокировке экрана, заставке, смене пользователя, простое (по умолчанию 30 минут) и выходе из OffLoadAI. Событие, пришедшее, пока сейф открывается, не теряется: сейф закроется сразу после открытия. Пока сейф открыт, выбрать другой диск нельзя — иначе прежний сейф остался бы открытым без присмотра. Если в сейф идёт копирование, закрытие откладывается до его конца или, по настройке, прерывает копирование (оригиналы при этом не удаляются). Закрытие без принуждения не обрывает файлы, открытые в других программах.
Место на диске. Свободным в сейфе считается меньшее из свободного внутри образа и на самом диске за вычетом запаса, иначе разрежённый образ упёрся бы в заполненный диск посреди копирования.
Журнал на внешнем диске считается недоверенным. Перед возвратом данных пути проверяются: архив должен лежать на внешнем томе (в /Volumes) и не вести через символическую ссылку, путь возврата — проходить те же правила, что и перенос, без ... Ссылки в пути возврата разворачиваются, даже когда самого пути ещё нет: URL.resolvingSymlinksInPath() такой путь оставляет как есть, и подложенная в журнал запись вида «Documents/Фото/old/LaunchAgents/…», где old — ссылка на ~/Library, иначе прошла бы проверку. Размер журнала ограничен, биты setuid/setgid при возврате прав не восстанавливаются — ни из списка прав, ни из прав самого архива. Путь возврата не может проходить через .git (оттуда git сам запускает хуки), а скрытые папки с ключами сравниваются без учёта регистра: «/.SSH» на обычном диске Mac — та же папка, что «/.ssh». В места с оговорками (скрытые папки программ — оттуда они читают настройки и код) возврат идёт, только если перенос записан и в журнале на этом Mac: подложенная запись на диске туда ничего не положит. Настоящие файлы с именами на «._» возвращаются; пропускаются только двойники AppleDouble, которые macOS создаёт сама, — их нет в списке сумм переноса. На exFAT и FAT такие файлы положить нельзя вовсе (macOS хранит в «._X» атрибуты файла X и перезаписывает его), поэтому перенос папки с ними туда отклоняется заранее — в сейф и на APFS можно. Права применяются только к объектам, которые действительно восстановлены, поэтому подложенная в архив символическая ссылка не позволит изменить права файла за пределами папки.
Docker. OffLoadAI работает только с Docker на этом Mac: если контекст Docker или DOCKER_HOST ведут на сервер, очистка и архивация отказываются, а не удаляют кеш, образы и тома там. Имена томов проверяются по формату Docker: иначе имя вида /Users/you:/v превратило бы -v в монтирование папки с Mac. Архив тома сверяется с томом по содержимому: SHA-256 каждого файла и полный список путей, ошибки tar и find не теряются в конвейере (pipefail), поэтому обрезанный или испорченный архив не даст удалить том. Вспомогательный образ собирается из alpine, закреплённого по digest, и узнаётся по своей метке, а не только по тегу. Возврат пишет только в том, созданный этим же возвратом (одноразовая метка): если проверить, есть ли том, не удалось, возврат останавливается, а не распаковывает архив в живой том. Контейнеры запускаются с --network none и --log-driver none (иначе поток архива пишется в лог внутри Docker.raw и забивает диск), у каждого есть имя, чтобы останавливать сам контейнер, а не только клиент. Во время архивации отслеживаются рост Docker.raw и свободное место на Mac; если диска Docker Desktop нет (OrbStack, Colima), об этом говорится, и остаётся защита по свободному месту. Независимо от вспомогательного образа архив перед удалением тома читает системный tar на Mac: число записей должно совпасть с числом путей в томе. Если очистка Docker остановилась на полпути, итог говорит, что сделана часть, а не «не получилось». Очистка в разделе «Docker» вызывает только docker container prune, docker image prune, docker image prune --all и docker builder prune --all. Сразу отмечены только кеш сборки и образы без имени; все неиспользуемые образы (--all) — только по отметке человека: собранный им и никуда не отправленный образ не скачать. В демонстрационном режиме (OFFLOAD_DEMO=1) Docker и машины UTM не опрашиваются и не трогаются: показываются вымышленные тома и машины. Тома не удаляются никогда (ни docker volume prune, ни --volumes), остановленные контейнеры — только если их отметить, потому что записанное внутри контейнера, а не в томе, пропадает вместе с ним.
Разбор ничего не делает без вашего «да» и ничего не удаляет безвозвратно, пока вы сами не попросите. Найденное раскладывается по вопросам, и на каждый нужно ответить. Удалить разбор предлагает только: мусор из списка мест, которые программы пересоздают сами (кеши сборки Xcode, пакеты Homebrew, npm, pip, Yarn, Cargo, Gradle, CocoaPods, Go, кеши Chrome, Spotify, VS Code, кеши и индексы сред JetBrains — без их локальной истории правок, прошивки iPhone); кеш сборки и образы Docker без имени — остатки пересборок (образы с именем, тома и контейнеры — никогда: собранный человеком и никуда не отправленный образ не скачать); лишние копии одинаковых файлов; установщики (.dmg, .pkg, .xip) старше недели. Кеш открытой программы в вопрос не входит. «Разрешить всё» отвечает «да» на всё, кроме установщиков: удалить их можно только отдельным ответом на их вопрос. Виртуальные машины UTM разбор не удаляет никогда: UTM помнит машины по месту, и удалять или переносить их нужно в нём самом. Зашифрованный .dmg (это видно по hdiutil isencrypted без пароля, а у подключённого образа — по hdiutil info; если hdiutil не ответил, образ считается зашифрованным) и .iso, к которому бывает подключена виртуальная машина, удалить из разбора нельзя. Остальные личные файлы удалить из разбора нельзя вовсе — только убрать в сейф тем же переносом со сверкой. Перед переносом правила проверяются заново по содержимому; если нашлась оговорка, которой человек не видел, когда отвечал (например, папку меняли вчера), объект остаётся на месте. Всё удаляемое, кроме образов Docker, уходит в Корзину, и вернуть это на прежние места можно у своего вопроса. «Удалить насовсем» удаляет из Корзины только то, что туда отправил этот разбор, и только после подтверждения.
«Разрешить всё» не срабатывает от клавиши Return: ответ «да» на все вопросы — только нажатием самой кнопки.
Помощник только советует. Кроме него, в сеть выходят только сообщения о новых версиях, если человек их включил (см. ниже); остальной OffLoadAI в сеть не ходит. Помощник работает, только если человек согласился — отдельно на каждый вариант, потому что сведения уходят в разные места: через Claude Code и по ключу Anthropic API — в Anthropic, в Ollama — никуда с этого Mac (только 127.0.0.1), на сервер OffLoadAI — туда (только по https), и вместе с вопросом уходит ключ OffLoadAI Pro, а в нём номер и имя, которое назвал покупатель. Согласие отзывается одной кнопкой; начатый вопрос при этом прерывается. Модели уходят путь от домашней папки (без имени пользователя), размер, дата, пометка правил и до десяти имён внутри папки, кроме секретов по имени. Начало небольших текстовых файлов (до 20 строк) — только если человек это включил, и никогда — у таблиц (.csv, .tsv: так выглядят выгрузки паролей из браузеров), файлов, которые правила бэкапа считают секретами, и файлов, в начале которых видны пароль или PIN (по-русски и по-английски), ключ, токен (GitHub, Slack, OpenAI, Anthropic, Stripe, AWS, Google, Telegram-бот, JWT), пароль в адресе, пара «почта:пароль», номер карты, длинная строка, похожая на ключ, или фраза восстановления кошелька. Такой файл не показывается вовсе, а не по кусочку. Файлы, которые лежат только в облаке, не скачиваются. Всё, что уходит модели, — данные, а не указания, и ответ модели сам ничего не делает: каждый совет выполняет человек кнопкой, тем же переносом со сверкой или Корзиной, что и без помощника. Советы проверяются правилами OffLoadAI: запрещённое — только «оставить», с оговорками — не в Корзину, а в сейф, а удалить можно только то, что разрешает разбор (места, которые программы создают заново, и установщики старше недели), — остальное помощник может советовать только убрать в сейф, что бы ни ответила модель, поддавшись, например, имени или тексту файла. Перед удалением это проверяется ещё раз, по свежим сведениям с диска; отправленное в Корзину возвращается на прежнее место кнопкой «Вернуть». Ключ Anthropic API хранится в связке ключей macOS (на Windows — зашифрованным DPAPI) и уходит только заголовком запроса. Claude Code запускается без инструментов и доступа к файлам: сведения он получает только через stdin.
Сообщения о новых версиях — только по согласию. Пока человек не ответил на вопрос или если выключил их, OffLoadAI в сеть не ходит. Включённые — раз в сутки делают один запрос GET https://api.github.com/repos/audit0/Offload/releases/latest: без cookies и без номера версии программы, GitHub видит только адрес сети. «Проверить обновления…» делает тот же запрос по нажатию. Из ответа берётся только номер выпуска — три числа; черновики и предварительные выпуски не считаются, а страница выпуска строится из номера, а не берётся из ответа. Ничего не скачивается и не ставится само: обновляется человек командой установки, которая сверяет архив.
Без повышения прав. OffLoadAI работает от имени пользователя, не использует sudo и привилегированные помощники. Режим снимков экрана (OFFLOAD_SNAPSHOT_DIR) работает только вместе с демонстрационным: иначе любая программа под этой учётной записью запустила бы OffLoadAI с полным доступом к диску и получила бы снимки ваших папок.
- Подпись ad-hoc, без нотаризации Apple. Скачанный через браузер DMG macOS при первом запуске заблокирует — разрешить можно в «Системных настройках → Конфиденциальность и безопасность». Команда установки обходит это законно: файлы, скачанные
curl, не получают карантинный атрибут. - Установка через
curl | zsh. Скрипт проверяет SHA-256 архива по файлу из того же релиза, целостность подписи и идентификатор приложения. Это защищает от повреждения при загрузке, но не от подмены релиза: ad-hoc подпись может поставить кто угодно, она подтверждает только, что файлы приложения не изменены после подписи. Начиная с v0.3.1 релиз подписывается подтверждением сборки GitHub (attestation, Sigstore); если установлен и настроенgh, установщик проверяет его и отказывается ставить неподтверждённый архив. Безghпроверить можно вручную:gh attestation verify OffLoadAI.zip --repo audit0/Offload. Чтобы зафиксировать версию, укажитеOFFLOAD_VERSION=vX.Y.Z; перед запуском скрипт можно прочитать. dockerиzstdищутся в/opt/homebrew/binи/usr/local/bin— эти каталоги доступны пользователю на запись. Системные программы оттуда не берутся.- Пакет
tarво вспомогательном образе ставится из репозитория Alpine при сборке образа и по версии не закреплён (база закреплена по digest). - Секреты в начале файлов для помощника распознаются по словам и по виду — это эвристика: пароль без подписи и в необычном формате она может не узнать. Поэтому начало файлов по умолчанию не уходит вовсе, а включает это человек сам.
- Секреты в открытом бэкапе распознаются по именам, папкам и содержимому небольших файлов настроек (ключи, токены GitHub, AWS, Slack, пароли в адресах). Это эвристика: токен в файле с необычным именем и форматом она может не узнать. Бэкап с ключами надёжнее вести в сейф.
- Оценка пароля не знает всех словарей: пароль из редкого слова с заменами (вроде «Tr0ub4dor&3») она оценит выше, чем он стоит. Надёжнее всего — фраза из 4–6 случайных слов.
- Строки в Swift нельзя надёжно затереть в памяти, поэтому пароль контейнера может оставаться в памяти процесса до его завершения.
- Расширенные атрибуты (метки Finder, карантин) и жёсткие ссылки при переносе не сохраняются — иначе на exFAT появляются служебные файлы
._*. OffLoadAI пересчитывает такие объекты заранее и показывает это оговоркой в окне переноса, до подтверждения удаления оригинала. - Список контрольных сумм рядом с архивом ловит порчу носителя, но не подмену: он лежит на том же недоверенном диске и правится вместе с архивом.
- Ключ OffLoadAI Pro проверяется на Mac подписью Ed25519 встроенным открытым ключом, без сети: при покупке и запуске OffLoadAI никуда не обращается. Ключ хранится в настройках программы открыто: в нём только номер, имя, которое назвал покупатель, и даты. Отсутствие ключа и конец пробы никогда не закрывают сейф, возврат перенесённого, возврат тома Docker и восстановление из iCloud — ограничивается только новое «да» на возможности Pro, начатое доделывается. Защита от копирования намеренно честная: пробу можно сбросить, а программу — собрать из исходников без проверки.
- OffLoadAI не защищает от других программ, запущенных под той же учётной записью.
- Сейф не даёт скрытых томов, правдоподобного отрицания, каскадов шифров и ключевых файлов, как VeraCrypt: используется родной формат образов macOS.
- Пока сейф открыт, его содержимое доступно всем программам под вашей учётной записью; вредоносная программа на Mac может перехватить пароль при вводе.
- Место, освобождённое внутри большого сейфа, идёт под новые данные, но на диск не возвращается:
hdiutil compactна образах в несколько гигабайт и больше проверенно возвращает мало или ничего. OffLoadAI показывает, сколько вернулось на самом деле. - После «Зашифровать перенесённое» удалённые открытые копии физически могут оставаться в памяти SSD или флешки, пока контроллер их не перезапишет. Полную гарантию даёт только диск, зашифрованный целиком (APFS с шифрованием).
- Журнал переносов на Mac (
~/Library/Application Support/Offload) хранит пути и имена перенесённого, в том числе в сейф. Он защищён FileVault, если тот включён. - База решений разбора (
~/Library/Application Support/Offload/decisions.sqlite, права0600) хранит пути, размеры, даты изменения, вид объекта (папка, проект, файл, копия), что предлагалось и что вы выбрали — чтобы в следующий раз предлагать то же и учиться вашим привычкам, — а также отпечатки файлов для поиска дубликатов: путь, размер, дату изменения, номер файла и SHA-256 содержимого, чтобы не читать заново неизменившиеся файлы. По отпечатку можно проверить, лежит ли у вас известный кому-то файл, поэтому база защищена так же, как журнал: никуда не отправляется, читается только вашей учётной записью и защищена FileVault, если тот включён. Значения передаются в SQLite только параметрами запроса, путь не может стать командой. В базу пишутся только ваши ответы «да», то, что вы вернули из Корзины, и машины, которые вы решили оставить; «не сейчас» не пишется. Там же — пути, которые вы просили больше не предлагать («Не предлагать больше»); вернуть их можно на первой странице «Разобрать». Кнопка «Забыть мои решения» удаляет все решения; итоги прошлых разборов и список «не предлагать» остаются, а отпечатки забываются сами, когда файла больше нет. - Привычки (обучение на решениях) работают только на этом Mac: модель — счёт похожих решений, она строится заново из базы при каждом разборе и никуда не отправляется. В вопросы об удалении привычка ничего не добавляет: удалить предлагается только то, что перечислено выше. Привычка может добавить похожее в вопрос о сейфе или бэкапе или убрать из вопроса то, что вы обычно оставляете, — и только если это для объекта разрешено. Копию, которая остаётся, привычки не трогают.
- Лишняя копия одинакового файла удаляется только в Корзину и только после того, как её содержимое заново сверено с остающейся копией байт в байт: отпечатку из базы для удаления не доверяем. Одна копия каждого файла остаётся всегда. Копии из медиатек «Музыки» и «TV», из пакетов и git-проектов, клоны APFS, файлы iCloud, которых нет на Mac, а также копии зашифрованных
.dmgи образов.isoне удаляются; внутрь пакетов и git-проектов поиск не заходит. Файл, на который ссылается программа по пути (например, каталог Lightroom), распознать нельзя — такую копию можно вернуть из Корзины. Внутрь окружений Python (site-packages,pyvenv.cfg,conda-meta), git-репозиториев (и тех, что лежат прямо в домашней папке) и дисков, подключённых внутри домашней папки, поиск не заходит. Если «Рабочий стол» и «Документы» синхронизируются с iCloud, удалённая копия удаляется и на других устройствах — вернуть её можно из Корзины на этом Mac. Кнопка «Вернуть» у вопроса живёт, пока открыт разбор; прежде чем закончить разбор с непустым списком отправленного в Корзину, OffLoadAI спрашивает.
Версия для Windows (windows/) держит те же правила; ниже — чем они там обеспечены и в чём отличаются.
- Копия и сверка. Файл назначения создаётся с
CREATE_NEW— существующий файл или подложенная ссылка не перезаписываются; источник открывается сFILE_FLAG_OPEN_REPARSE_POINTи проверяется, что это не ссылка (сжатые WOF, дедуплицированные и облачные файлы читаются обычным открытием, но только если это тот же файл по номеру). Данные сбрасываются на носитель черезFlushFileBuffers— он сбрасывает и кеш самого накопителя; копия перечитывается мимо кеша Windows (FILE_FLAG_NO_BUFFERING, выровненный буфер). Пути длиннее 260 знаков открываются через\\?\. - Два независимых подсчёта. Перед удалением содержимое считают два разных механизма:
FindFirstFileExи перечисление .NET (NtQueryDirectoryFile); разошлись — ничего не удаляется. Скрытые и системные файлы не прячутся ни одним из них. Служебные файлы Проводника (desktop.ini,Thumbs.db) едут в копию, но сверке не мешают, как.DS_Storeна Mac. - Открытые файлы. Каждый объект открывается с правом на удаление и разрешением остальным делать что угодно: если его держит программа, Windows отвечает «занят». Кто держит — называет Restart Manager (то, что на Mac делает
lsof). Там же видно, что удалить нельзя (нет права на удаление) — до того, как удалено хоть что-то. Атрибут «только чтение» при удалении снимается: так git держит свои объекты. - Правила путей. Нельзя трогать: профиль целиком и его стандартные папки,
AppData(кроме прошивок и резервных копий iPhone, логов и дампов сбоев), реестр пользователя (NTUSER.DAT),.git, папки с ключами (.ssh,.aws,.nuget…), папки OneDrive и iCloud (перенос удалил бы файлы и из облака), диски и файлы виртуальных машин (.vhdx,.vdi,.vmdk,.vbox,.vmx, WSLext4.vhdx,VirtualBox VMs), каталоги Lightroom и медиатеку iTunes, данные Docker Desktop. Пути сравниваются без учёта регистра, короткие имена 8.3 и точки соединения разворачиваются — в том числе в пути, которого ещё нет. - Журнал на внешнем диске — недоверенный. Пути в нём должны быть полными, на диске с буквой, без
..,\\?\, сетевых путей и потоков NTFS (файл:поток), архив — не на системном диске и не через ссылку. Буквы дисков в Windows меняются, поэтому запись с диска переписывается на тот же путь на этом диске, только если архив там действительно лежит. Переносы, сделанные на Mac, распознаются и не возвращаются — это делает версия для Mac. Спутник с атрибутами называется.attrs.json(не.modes.json), чтобы версия для Mac не приняла атрибуты Windows за права POSIX; «системный» атрибут из недоверенного архива не восстанавливается. - Сейф — BitLocker. Образ VHDX с NTFS, зашифрованный BitLocker (XTS-AES-256, шифруется только занятое место — том создаётся пустым). Своего шифрования OffLoadAI не изобретает. Пароль уходит в BitLocker через WMI (
Win32_EncryptableVolume) — не в командную строку и не в файл. До открытия шифрование проверяется разбором самого образа без прав администратора: заголовок BitLocker, хотя бы один пароль и никакого «открытого ключа» (при нём BitLocker приостановлен и данные читаются без пароля); после открытия — у самого BitLocker: том зашифрован целиком, защита включена, есть пароль; не подтвердилось — том отключается, ничего не записав. Корень открытого тома закрывается от других учётных записей (доступ — вы, SYSTEM и администраторы), индексатор Windows в сейф не заходит. Образ подключён, пока жив процесс, который за ним следит: закрылся OffLoadAI — закрылся сейф. - Права администратора — только сейфу. Подключить образ и открыть BitLocker Windows разрешает только администратору, поэтому при первой операции с сейфом Windows один раз спрашивает разрешение (UAC) и запускается второй процесс OffLoadAI. Связь с ним — именованный канал, доступный только вашей учётной записи и администраторам; каждая сторона проверяет, что на другом конце тот самый процесс. Помощник выполняет только операции сейфа над файлами
.vhdxи завершается вместе с программой, закрыв всё, что открыл. Остальной OffLoadAI работает с обычными правами. - Копия заголовка — три блока метаданных BitLocker по 64 КБ, снятые с закрытого образа (права — только владельцу). Восстанавливается она на закрытый образ и проверяется открытием паролем; не подошла — прежние метаданные возвращаются, а на время работы они лежат рядом с образом.
- Сжатие сейфа. TRIM через образ VHDX до файла не доходит, поэтому «Вернуть место на диск» переписывает сейф заново: новый образ с тем же паролем, копирование со сверкой, и только потом замена. После этого старые копии заголовка к сейфу не подходят — OffLoadAI об этом говорит.
- Корзина. Удаляемое уходит в Корзину Windows так же, как из Проводника; OffLoadAI запоминает, куда легло каждое, и возвращает или удаляет насовсем только то самое (по номеру файла). То, что больше Корзины (Windows удалила бы это насовсем, не спросив), в Корзину не отправляется вовсе.
- Внешние программы запускаются без оболочки; системные (
powershell,tar,ssh-keygen,defrag) — только изSystem32, сторонние (docker,zstd,restic) — из известных каталогов. Окружение у них, как на Mac, — только нужное: каталоги Windows, профиль, временная папка, настройки Docker и VirtualBox (до этой версии передавалось всё окружение, и свойRESTIC_PASSWORDчеловека подменял пароль, введённый в OffLoadAI). Сценарии PowerShell, которые OffLoadAI запускает для разметки дисков, секретов не содержат. - Установка командой
irm … | iexсверяет SHA-256 и, если естьgh, подтверждение сборки.OffLoadAI.exeне подписан сертификатом: при запуске файла, скачанного браузером, Windows SmartScreen попросит подтвердить запуск. Файлы, скачанные установщиком PowerShell, отметки «из интернета» не получают. - Ограничения, которых нет на Mac: сейфу нужна Windows 10/11 Pro, Enterprise или Education (в Home нет BitLocker); символические ссылки при переносе Windows создаёт только администратору или в режиме разработчика — без этого перенос папки с ними отклоняется заранее (точки соединения создаются всегда); журнал и база решений лежат в
%LOCALAPPDATA%\Offloadи защищены правами профиля и BitLocker системного диска, если он включён.
Report vulnerabilities privately via Security → Report a vulnerability. OffLoadAI deletes an original only after a byte-for-byte SHA-256 verified copy and a check that the source did not change; refuses to move app-registered bundles and app data; runs external tools without a shell, with only the environment they need (your own RESTIC_PASSWORD or ANTHROPIC_API_KEY never reaches restic or Claude Code), and system tools only from system directories; cross-checks two independent traversals (readdir and fts) before deleting anything; trashes a redundant duplicate only after re-comparing it byte-for-byte with the copy that stays (one copy of every file always stays, library media, bundles, git projects, APFS clones, not-downloaded iCloud files, encrypted .dmg and .iso images are never removed); cleanup acts only on your explicit "yes" to each question: deletion is offered only for regenerable caches from a fixed list (not caches of running apps), Docker build cache and dangling images (never tagged images, volumes or containers), redundant duplicate copies, and installers older than a week (only by their own answer, never by "Allow all"); UTM virtual machines are never deleted — that is done in UTM itself; everything it deletes except Docker images goes to the Trash with one-click "put back" (permanent deletion only on request, only of what this run trashed); learns habits from your own answers only on this Mac (a habit never adds anything to a deletion question; "Forget my decisions" clears them); never overwrites destination files or follows symlinks when reading sources (O_EXCL | O_NOFOLLOW); applies restored permissions only to paths that were actually restored; passes the vault password to hdiutil via stdin; treats the on-drive journal as untrusted; validates Docker volume names and runs helper containers with --network none --log-driver none; refuses to touch a non-local Docker context; verifies Docker volume archives by per-file content hashes; restores only into a volume it created itself; locks the vault root to the owner (700); flushes copies with F_FULLFSYNC and verifies them bypassing the page cache. Only two optional parts go online, each only with consent: a daily new-version check if you turn it on (one GitHub API request for the latest release number, no cookies, nothing about the computer or files; nothing is downloaded or installed automatically), and the AI assistant: it runs only with consent given per backend (Anthropic via Claude Code or an API key, local Ollama, or the OffLoadAI server, which also receives the Pro key with the buyer's name) and revocable at any time; it sends paths relative to home, sizes, dates and rule marks — the beginning of small text files only if you turn that on, and never for spreadsheets, key files or text that looks like a password, token, card number or recovery phrase; its advice is re-checked by the same rules (it can suggest deleting only regenerable caches and installers older than a week, anything else only moving to the vault), re-checked again before trashing, and every action is your click. Known limitations: ad-hoc signing without notarization, checksum-from-same-release in the curl installer, heuristic secret detection for open backups and for assistant previews (off by default). The Windows version (windows/) keeps the same rules with Windows mechanisms: CREATE_NEW + reparse-point-safe opens, FlushFileBuffers and unbuffered verification, two traversals (FindFirstFileEx and .NET enumeration), Restart Manager for open files, a BitLocker (XTS-AES-256) VHDX vault whose encryption is verified from the image header before opening and by BitLocker itself after, password passed to BitLocker via WMI, administrator rights only for an elevated vault helper process reached over an ACL-restricted, peer-verified named pipe, and the Windows Recycle Bin with identity checks.