Перейти к содержанию
Публикация AiManual

Как Claude запоминает ваш компьютер: локальные идентификаторы, реестр устройств и сброс через PowerShell

Разбор того, что Claude Desktop и Claude Code пишут на диск в Windows: machineID и userID в ~/.claude.json, ant-did и ant-device-registry.json, Chromium-профиль

Коротко

Что будет в материале

  1. 01

    Что Claude пишет на диск: карта локальных идентификаторов

  2. 02

    machineID и userID в ~/.claude.json: что это и почему они не привязаны к аккаунту

  3. 03

    Десктопный слой: ant-did, ant-device-registry.json и соли телеметрии

  4. 04

    Chromium-профиль Electron: cookies claude.ai, Local Storage и analytics-идентификаторы

Claude Desktop и Claude Code в Windows хранят на диске долгоживущие идентификаторы, которые живут отдельно от аккаунта. Основная точка входа — файл %USERPROFILE%\.claude.json: внутри лежат machineID и userID, по 32 случайных байта в hex, то есть строки длиной 64 символа. К логину они не привязаны: под какой учёткой вы ни зашли на этой машине, пара значений остаётся прежней.

Метки распределены по трём слоям, и слои независимы друг от друга. CLI-слой — ~/.claude.json с machineID и userID. Десктопный слой — ant-did, файл ant-device-registry.json и соли телеметрии. Браузерный слой — Chromium-профиль внутри Electron с cookies claude.ai, Local Storage и analytics-идентификаторами. Сброс одного слоя не задевает два других, поэтому чистить приходится все три.

И главное сразу: локальный сброс возможен, но он не делает вас полностью «новым» для сервера. Локаль ОС, часовой пояс, IP, TLS-отпечаток и серверная связка аккаунтов остаются вне досягаемости любого клинера. Ниже — что именно клиент пишет на диск и как этим управлять.

Дисклеймер из самого исследования: это разбор того, что клиент пишет на ваш собственный компьютер, и утилита для управления своими локальными данными. Вмешательства в чужие системы или серверную часть здесь нет.

Что Claude пишет на диск: карта локальных идентификаторов

Локальный след состоит из нескольких файлов, разбросанных по разным подсистемам. Прежде чем что-то сбрасывать, полезно понять, что искать нужно в трёх местах, а не в одном: JSON-конфиг CLI, каталог данных десктопного приложения и профиль Chromium внутри него.

СлойЧто хранитГде искать на Windows
CLI (Claude Code)machineID, userID, firstStartTime, oauthAccount%USERPROFILE%\.claude.json
Десктоп (Claude Desktop)ant-did, реестр устройств, соли телеметрииant-device-registry.json в каталоге данных приложения
Chromium-профиль Electroncookies claude.ai, Local Storage, analytics-идентификаторыпрофиль Chromium внутри каталога данных приложения

Три слоя идентификаторов: CLI, десктоп, Chromium-профиль

CLI-слой отвечает за machineID и userID в ~/.claude.json. Это статические строки, которые клиент читает при старте и записывает обратно только при генерации новых значений.

Десктопный слой добавляет ant-did, ant-device-registry.json и соли телеметрии. Эти метки относятся к самому приложению Claude Desktop, а не к CLI, и живут в его каталоге данных.

Браузерный слой — Chromium внутри Electron. Cookies claude.ai, данные Local Storage и analytics-идентификаторы лежат в профиле браузерного движка. Формально это часть десктопного приложения, но хранилище у него своё, и почистить его отдельно от JSON-конфигов можно только понимая, что оно существует.

Пути на Windows: где искать файлы

Подтверждённый путь один: %USERPROFILE%\.claude.json. В Unix-нотации это ~/.claude.json, о котором пишет автор разбора на Habr. Откройте файл в любом текстовом редакторе — это обычный JSON.

Для десктопной части точные каталоги зависят от сборки приложения, и публичный разбор их не приводит. Практичный подход: искать файл по имени ant-device-registry.json в каталоге данных приложения. Приложения на Electron в Windows обычно держат пользовательские данные в каталоге вида %APPDATA%\<Имя приложения>, но это общая конвенция платформы, а не гарантия. Проверяйте по факту на своей машине, а не по чужому скриншоту.

Профиль Chromium лежит внутри того же каталога данных. Опознаётся по характерному набору файлов браузерного профиля: хранилище Local Storage, база cookies, кэш. Точные имена файлов зависят от версии Chromium, встроенного в сборку, поэтому надёжнее искать по структуре каталога.

machineID и userID в ~/.claude.json: что это и почему они не привязаны к аккаунту

%USERPROFILE%\.claude.json хранит не только кэши фич и список проектов. Внутри лежат два долгоживущих идентификатора, и выглядят они так:

{
  "userID": "29751f55233dc772e0f88584ffbd5317d59c84d782caf321b2ad408cc237bfb1",
  "machineID": "c6604aae3f882f340123383c64ddf99644b7d2f060177351910f4de23ecedddb",
  ...
}

Значения выглядят случайными, и они действительно случайны: machineID и userID — это 32 случайных байта в hex, отсюда и длина 64 символа у каждого.

Ключевой момент для приватности: к аккаунту они не привязаны. Под какой учёткой вы ни зашли на этой машине, пара ID остаётся прежней. Именно это позволяет связать разные аккаунты, которые работали на одном ПК: серверная сторона может сшить их через общий локальный идентификатор, даже если вы выходили из одного аккаунта и заходили в другой.

Как CLI генерирует ID: логика из claude.exe

Автор разбора вытащил логику генерации прямо из бинаря CLI claude.exe, который представляет собой упакованный Bun-проект. Это снимает вопрос «а может, это просто кэш»: значения именно генерируются и сохраняются в конфиг.

Алгоритм getUserID и getMachineID одинаковый. Если в конфиге есть валидное значение, используется оно. Если значения нет или оно не проходит проверку, клиент генерирует 32 случайных байта в hex и записывает результат в конфиг:

if (typeof r.userID === "string" && qc.test(r.userID)) return r.userID;
...
let s = Dc(32).toString("hex");
return n.setGeneratedUserID(s), Ce((g) => ({ ...g, userID: s }), e), s;

Словесное описание логики в публикации обрывается на середине фразы, но приведённый фрагмент кода показывает схему целиком: проверка формата, ветка с существующим значением, ветка с генерацией и записью.

На практике это значит ровно две вещи. Удалите поле из конфига, и при следующем запуске CLI создаст новое значение и сохранит его в тот же файл. Подставьте прежнюю строку вручную, и клиент примет её как свою, потому что проверяет формат, а не происхождение.

firstStartTime и oauthAccount: что рядом с ID

В том же файле лежат поля, которые напрямую с аккаунтом связаны:

"firstStartTime": "2026-06-10T21:27:47.643Z",
"oauthAccount": {
  "accountUuid": "…",
  "emailAddress": "…",
  "organizationUuid": "…"
}

firstStartTime фиксирует момент первого запуска на этой машине, а не дату публикации материала, из которого взят пример. Блок oauthAccount с accountUuid, emailAddress и organizationUuid — это уже привязка к аккаунту: она меняется при смене учётки.

Разделение важное. Аккаунтные поля уходят вместе с выходом из аккаунта, а machineID и userID остаются на диске и переживают эту операцию. Один и тот же компьютер под разными аккаунтами несёт одну и ту же пару локальных ID.

Десктопный слой: ant-did, ant-device-registry.json и соли телеметрии

Claude Desktop формирует собственную метрику устройства. В разборе упоминаются ant-did, файл ant-device-registry.json и соли телеметрии. ant-did работает как идентификатор устройства на стороне десктопа, ant-device-registry.json хранит реестр устройств, соли телеметрии используются как дополнительные параметры для аналитики.

Точные форматы полей и внутреннюю структуру этих файлов публичный разбор не раскрывает: они упомянуты как часть карты локального следа, без разобранных примеров. Поэтому здесь честнее говорить о назначении и расположении, чем выдумывать схему, которой в источнике нет.

Важнее другое: это отдельный слой, никак не связанный с ~/.claude.json. Сброс CLI-меток не затронет ant-did и реестр устройств, потому что они лежат в другом каталоге и обслуживаются другим кодом.

Чем десктопный слой отличается от CLI

CLI хранит machineID и userID в одном JSON-файле и не создаёт реестра устройств. Десктоп добавляет ant-did и ant-device-registry.json, то есть ведёт собственный учёт устройств.

Если вы работаете и в Claude Code, и в Claude Desktop на одной машине, чистить нужно оба слоя. Сброс только CLI оставит связку через десктопную метку, и наоборот. Это не теория заговора, а обычное следствие того, что два клиента пишут два независимых набора данных.

Chromium-профиль Electron: cookies claude.ai, Local Storage и analytics-идентификаторы

Claude Desktop собран на Electron, а значит внутри у него полноценный Chromium со своим профилем. В этом профиле хранятся cookies claude.ai, данные Local Storage и analytics-идентификаторы. JSON-конфиги и браузерное хранилище — разные вещи, и второе переживает большинство правок первого.

Что именно лежит в профиле и почему это важно

Cookies claude.ai отвечают за сессию и привязку к аккаунту. Local Storage хранит клиентские данные, включая analytics-идентификаторы. Сами analytics-идентификаторы — это метки для телеметрии, которые живут отдельно от пользовательских настроек.

Даже если вы сбросите ~/.claude.json и ant-did, cookies и Local Storage могут сохранить связку с аккаунтом. Полная очистка профиля — самый радикальный шаг из всех описанных, и он разлогинит вас в приложении: придётся входить заново. Это ожидаемый побочный эффект, а не баг, и решение о нём стоит принимать осознанно, а не «заодно».

Сброс через PowerShell: скрипт и что он делает

В разборе показан PowerShell-скрипт, который приводит локальный слой в состояние первого запуска. Чаты при этом остаются на месте. Код открыт на github.com/Soulringen/aegis-claude.

Логика работы укладывается в три шага: обнуление или перегенерация machineID и userID в ~/.claude.json, сброс ant-did и ant-device-registry.json, очистка analytics-идентификаторов в Chromium-профиле. Точных команд в публичном описании нет, поэтому перед запуском сверьтесь с содержимым репозитория: состав полей меняется от версии к версии клиента, и скрипт должен соответствовать вашей сборке.

Пошаговый порядок действий

  1. Закрыть Claude Desktop и Claude Code. Пока приложение работает, оно держит конфиг и может перезаписать файл после правки.
  2. Сделать бэкап ~/.claude.json и каталога данных десктопного приложения. Это дешёвая страховка на случай, если скрипт отработает не так, как ожидалось.
  3. Запустить скрипт из репозитория под своей учётной записью Windows.
  4. Проверить, что чаты, настройки и список проектов на месте.
  5. Перезапустить приложение и убедиться, что новые значения ID записались в конфиг.

Что скрипт не трогает

Скрипт работает только с идентификаторами. Чаты, настройки, список проектов и кэши фич остаются на диске. Полная очистка с удалением истории — другой сценарий, и обсуждать его нужно отдельно, с отдельными предупреждениями о потере данных.

Почему метки возвращаются: резервные копии и откатные бэкапы

Резервные копии конфигов и откатные бэкапы могут восстановить метки: файл вернётся из копии, и клиент снова прочитает старый machineID. Снапшоты системы и откат состояния работают так же. После сброса стоит проверить, не восстанавливается ли ~/.claude.json из какого-нибудь бэкапа.

Где искать бэкапы

Смотрите в трёх направлениях. Первое — собственные папки бэкапов приложений и ручные копии, которые вы делали сами. Второе — точки восстановления Windows и снапшоты файловой системы. Третье — облачные синхронизации: OneDrive, Dropbox, Google Drive и подобные сервисы, если домашний каталог или каталог данных приложения попадает в синхронизируемую папку.

Конкретные пути зависят от вашей конфигурации, поэтому принцип важнее списка: ищите любые копии %USERPROFILE%\.claude.json и каталога данных приложения. На время сброса синхронизацию стоит отключить, иначе файл вернётся с сервера быстрее, чем вы закроете терминал. Честная оговорка: сброс — локальная мера, и никакой гарантии, что метка не вернётся из копии, никто дать не может.

Границы локального сброса: что остаётся вне досягаемости

Локальный сброс не делает вас полностью «новым» для сервера. Вне досягаемости клинера остаются локаль ОС, часовой пояс, IP, TLS-отпечаток и серверная связка аккаунтов. Это не детали реализации, а сигналы, которые формируются за пределами файлов, которые правит скрипт.

Что видит сервер помимо локальных ID

Локаль операционной системы и часовой пояс приходят с каждым запросом и описывают вашу среду. IP-адрес — сетевой идентификатор, который не относится к клиентским файлам вообще. TLS-отпечаток складывается из параметров рукопожатия и характеристик клиента, а не из полей JSON. Серверная связка аккаунтов живёт на стороне сервиса: если два аккаунта уже были связаны в его данных, правки на диске этого не отменяют.

Добавьте к этому accountUuid, emailAddress и organizationUuid из oauthAccount: пока вы залогинены, привязка к аккаунту активна и лежит в том же файле, который трогает скрипт.

Практический вывод: для чего тогда сброс

Сброс полезен для управления своими локальными данными: он приводит клиент к состоянию первого запуска на вашей машине, помогает при тестировании и даёт понять, что именно приложение пишет на диск. Это инструмент прозрачности и контроля, а не способ обойти серверные ограничения. Если задача формулируется как «стать для сервиса другим человеком», локальные правки её не решают, и обещать обратное было бы нечестно.

Дисклеймер и этическая рамка

Автор исследования формулирует рамку прямо: это изучение того, что клиент пишет на диск пользователя, и утилита для управления своими локальными данными. Вмешательства в чужие системы или серверную часть в этой работе нет.

Практический порядок действий для тех, кто хочет разобраться на своей машине: откройте %USERPROFILE%\.claude.json и посмотрите, какие поля там лежат; сделайте бэкап перед любыми правками; проверьте, не синхронизируется ли каталог с облаком; сверьте скрипт с текущей версией клиента и только потом запускайте. И держите в голове, что цифровой след на стороне сервера этим не стирается.

Источники

Подписаться на канал