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!