Postman запер всех в облаке. Как мы расковыряли его LevelDB и сделали оффлайн-конвертер

Привет, VC!


Если в вашей работе или в стеке вашей команды используется Postman, вы наверняка знаете про недавнюю драму: разработчики окончательно похоронили оффлайн-режим Scratch Pad. Теперь, чтобы сохранить хотя бы один запрос, окружение или переменную, десктопный клиент требует обязательной авторизации и отправки данных во внешнее облако.


Для финтеха, банков, телекома и проектов с жестким комплаенсом это стало головной болью:

1. В коллекциях запросов постоянно живут боевые JWT-токены, секретные ключи доступа и внутренние адреса закрытых микросервисов. Выгружать их на сторонние зарубежные серверы категорически запрещено политиками ИБ.

2. Разработчики начали массово миг рировать в открытые и локальные альтернативы (в первую очередь Bruno и Insomnia).

3. Но внезапно обнаружилось: в актуальной 12-й версии Postman спрятал локальные файлы так, что забрать их скопом без облачного логина — отдельная исследовательская задача.


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


Куда Postman прячет данные?


Десктопный Postman — классическое Electron-приложение. Все самое интересное происходит в директории профиля пользователя:

%APPDATA%\Postman (на Windows) или ~/.config/Postman (на Linux/macOS).


Внутри профиля находится директория локальных баз данных:

Postman\Partitions\<UUID>\IndexedDB\https_desktop.postman.com_0.indexeddb.leveldb


Здесь живет Chromium IndexedDB на движке LevelDB.

Данные в ней сериализованы внутренним бинарным механизмом V8 Structured Serialization (v8::ValueSerializer).


В логах упреждающей записи LevelDB (*.log) обнаружился ключевой реестр путей:

8o"?primaryPath".E:/projects/postman/collections/My API"?associatedPathsA?...type" collection


Оказалось, что Postman хранит точные локальные пути ко всем коллекциям прямо в таблицах LevelDB, даже если в интерфейсе они скрыты.


Новый модульный формат Postman v12


Когда коллекция сохраняется локально, Postman v12 разбивает её на модульное дерево YAML-файлов:

- .resources/definition.yaml — манифест коллекции со всеми системными переменными (baseUrl, токены).

- Вложенные папки с файлами вида Create Order.request.yaml с декларативным описанием запросов.


Сторонние клиенты (Bruno, Insomnia, Hoppscotch) не умеют открывать эти модульные папки напрямую — им требуется либо классический JSON Postman v2.1, либо спецификация OpenAPI.


Что умеет созданная утилита Postman Vault:


Мы упаковали логику в открытую консольную утилиту и веб-интерфейс:

1. Автопоиск: Сама находит установленный Postman, считывает реестр LevelDB и выводит список всех найденных на диске коллекций.

2. Экспорт в 1 клик:

- В классический формат Postman Collection v2.1.0 (для импорта в Bruno или Insomnia без потери папок, тестов и скриптов предзапросов).

- В чистую спецификацию OpenAPI 3.0.3 (Swagger).

3. Санитизация секретов: Автоматически находит хардкод-токены, приватные заголовки и пароли в окружениях и заменяет их на безопасные плейсхолдеры перед выгрузкой в Git.

4. Локальный Web UI: Поднимает локальный интерфейс на localhost:4567 без единого внешнего запроса в сеть.


Проверка совместимости


Все экспортированные коллекции мы прогнали через консольный раннер Newman (официальный CLI от Postman):

- 100% тестов пройдены успешно.

- Все 14 ассертов на статус-коды и JSON-схемы валидны.

- Импорт в Bruno сработал штатно с сохранением вложенных директорий.


Открытый исходный код


Утилита полностью бесплатна, не требует регистрации, не содержит телеметрии и лицензирована под MIT.


Репозиторий на GitHub: https://github.com/kiliankaena85-byte/postman-vault


Буду рад конструктивному фидбеку и звездочкам на GitHub!

11