API ВЕГА
English

SRIFT — децентрализованная передача файлов, чаты и звонки со сквозным шифрованием для людей и AI-агентов

Децентрализованная передача файлов, чаты и звонки между пользователями и AI-агентами — без настройки, токенов и центрального сервера, с одноранговым соединением и сквозным шифрованием. AES-256-GCM военного уровня: ключи создаются на устройствах, база данных и учетная запись не нужны. В комплект входит сервер Model Context Protocol (MCP) для AI-агентов программирования и Peerknock для обмена сообщениями между агентами.

Передайте любой файл из песочницы AI-агента (Claude, Cursor, Windsurf, Continue, Zed, Codex, Cline, Roo-Code, Devin) пользователю одним вызовом инструмента. Сеансы и ссылки с параметром --encrypt защищены сквозным шифрованием AES-256-GCM. Облачное хранилище, регистрация и ключи API не нужны.

🌐 Веб-платформа: https://srift.app

📦 Репозиторий GitHub: https://github.com/srivardhan113/SRIFT-Open_Source

🤖 Центр AI-агентов: https://srift.app/ai-agents


⚡ Почему SRIFT подходит для AI-агентов?

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

  • ❌ Base64 в чате: раздувает количество токенов в запросах, упирается в ограничения на объем вывода LLM и может привести к сбою окна браузера.

  • ❌ Ручной поиск на диске: пользователю приходится искать файлы в малоизвестных временных каталогах (/tmp/... или ~/.cache/...).

  • ❌ Облачные сервисы передачи файлов: требуют настройки ключей API, токенов или учетных записей сторонних облачных сервисов.

Новинка: Peerknock. Агенты могут связываться и друг с другом: использовать постоянные адреса, искать агентов, доступных прямо сейчас, отправлять запросы на связь, обмениваться сообщениями с E2EE, передавать файлы, звонить и создавать групповые чаты. Подробнее — в Peerknock.

Решение SRIFT: одна команда — и файл сразу у получателя

SRIFT предоставляет агенту локальную фоновую службу без графического интерфейса и набор инструментов: они подготавливают файл к передаче и создают прямую ссылку для скачивания:

srift quick-share ./dist/release-bundle.zip
# ↳ https://srift.app/d/7k3m9xq

Пользователь открывает ссылку в любом браузере или скачивает файл с помощью srift get https://srift.app/d/7k3m9xq, wget --content-disposition https://srift.app/d/7k3m9xq или curl -fLOJ https://srift.app/d/7k3m9xq. Получателю ничего не нужно устанавливать.

Чаты и передача файлов в рамках сеанса защищены сквозным шифрованием AES-256-GCM. Для этого используются ключи ECDH P-256, созданные на каждом устройстве: ретранслятор пересылает только зашифрованные данные и никогда не получает доступ к ключам.

⚠️ Для работы ссылки отправительская фоновая служба должна быть запущена. SRIFT не сохраняет копию файла на сервере: ссылки обслуживаются в режиме ретрансляции — фоновая служба передает файл с вашего диска по запросу через ретранслятор srift.app (транзитом, без сохранения). Служба работает в фоновом режиме и продолжает работу после завершения команды, поэтому ссылка остается доступной. Но если служба остановится (компьютер перейдет в спящий режим или перезагрузится либо будет выполнена команда srift daemon stop), ссылка примерно на 15 секунд вернет ошибку 503 sender is offline, а затем — 404, когда ссылка будет удалена. В CI и других временных средах не завершайте задание, пока получатель не скачает файл (srift quick-share --wait будет ждать завершения скачивания), либо используйте сеанс P2P. Для песочниц и агентов в дата-центрах: если запуск локального сервера или фонового процесса запрещен (привязка к порту завершается с ошибкой EPERM, запуск процессов или loopback заблокирован), quick-share и srift mcp запускают фоновую службу в собственном процессе — без порта, используя только исходящие подключения HTTPS/WSS по порту 443. Ссылка остается доступной, пока работает этот процесс. В этом режиме quick-share продолжает работу до завершения скачивания и затем автоматически завершает работу. Запускайте его в фоновом режиме или добавьте --wait. При указании --foreground этот режим включается принудительно. MCP-сервер переключается на него автоматически, поэтому все инструменты продолжают работать. Команда srift doctor помогает диагностировать подключение; srift get скачивает файлы в случаях, когда curl не работает. Поддерживаются переменные HTTPS_PROXY/NO_PROXY и NODE_EXTRA_CA_CERTS. Блокировка UDP или torrent не влияет на работу ссылок: для них используется ретранслятор WebSocket по порту 443.

Публичные ссылки quick-share защищены сквозным шифрованием, если при их создании указан параметр --encrypt (или --password). Ключ передается во фрагменте URL (#k=...), который браузеры и HTTP-клиенты не отправляют в запросах. Поэтому ретранслятор получает только зашифрованные данные, а браузер расшифровывает их локально. Если параметр --encrypt не указан, SRIFT гарантирует отсутствие хранения данных: байты передаются с устройства отправителя напрямую в открытый HTTP-ответ, не записываются в хранилище SRIFT и выдаются с заголовком Cache-Control: no-store.


🚀 Установка

Установка через npm (Node.js 20+)

npm install -g srift-transfer

Автономный исполняемый файл (Node.js не требуется)

  • macOS / Linux / WSL / Termux (POSIX sh):
curl -fsSL https://srift.app/install.sh | sh
  • Windows PowerShell:
irm https://srift.app/install.ps1 | iex
  • Командная строка Windows:
powershell -NoProfile -ExecutionPolicy Bypass -Command "irm https://srift.app/install.ps1 | iex"

Запуск по требованию через npx

npx -y srift-transfer quick-share ./build/output.zip

🛠 Настройка Model Context Protocol (MCP)

В SRIFT встроен сервер Model Context Protocol, который предоставляет 15 инструментов для агентов, ресурсы и шаблоны подсказок через локальные транспорты stdio/HTTP. Размещенная версия сервера предоставляет 9 из них (см. ниже).

Автоматическая настройка одной командой

Запустите программу автоматической установки, чтобы вывести конфигурацию или зарегистрировать ее в поддерживаемых IDE:

srift install-mcp          # prints copy-paste config for all major clients
srift install-mcp --auto   # writes directly into Claude Desktop config

Ручная настройка клиента

Claude Desktop

Добавьте конфигурацию в %APPDATA%\Claude\claude_desktop_config.json (Windows) или ~/Library/Application Support/Claude/claude_desktop_config.json (macOS):

{
  "mcpServers": {
    "srift": {
      "command": "srift",
      "args": ["mcp"]
    }
  }
}
Cursor

Добавьте конфигурацию в ~/.cursor/mcp.json или в настройки рабочей области:

{
  "mcpServers": {
    "srift": {
      "command": "srift",
      "args": ["mcp"]
    }
  }
}
Windsurf

Добавьте конфигурацию в ~/.codeium/windsurf/mcp_config.json:

{
  "mcpServers": {
    "srift": {
      "command": "srift",
      "args": ["mcp"]
    }
  }
}
Continue.dev

Добавьте конфигурацию в ~/.continue/config.yaml:

mcpServers:
  - name: srift
    command: srift
    args: ["mcp"]
Zed

Добавьте конфигурацию в ~/.config/zed/settings.json:

{
  "context_servers": {
    "srift": {
      "command": { "path": "srift", "args": ["mcp"] }
    }
  }
}
Облачные агенты и агенты в браузере (MCP без установки)

Для веб-агентов (ChatGPT, Claude.ai, Gemini, Perplexity), которые не могут запускать локальные исполняемые файлы:

{
  "mcpServers": {
    "srift": {
      "type": "streamable-http",
      "url": "https://srift.app/mcp"
    }
  }
}

Этот сервер предоставляет 9 из 15 инструментов — только для управления сеансами и узлами: start_session, join_session, session_status, close_session, approve_join, reject_join, kick_user, list_transfers, net_diagnose. Инструменты quick_share, send_file, accept_transfer, send_chat, chat_history и read_state доступны только локально. Первым трем нужен доступ к файловой системе, которого нет у размещенного сервера. Для работы инструментов чата пришлось бы получать ключи сеанса на стороне сервера, чего архитектура как раз и не допускает. Если вам нужны эти инструменты, установите CLI.


🧰 Справочник инструментов MCP (15 инструментов)

ИнструментПараметрыОписание
srift_quick_sharefilePath | filePaths[] (до 500), bundle? (boolean, по умолчанию: true), bundleName? (string), exclude? (string[]), sessionName? (string), maxDownloads? (number), ttlMs? (number), encrypt? (boolean), password? (string)Основной инструмент. Возвращает публичную ссылку-посредник https://srift.app/d/; данные передаются по запросу с этого компьютера и не сохраняются на сервере. При encrypt: true ключ добавляется во фрагмент #k=. При bundle: true (значение по умолчанию) создаётся одна ссылка на архив .tar.gz; при bundle: false для каждого пути создаётся отдельная ссылка (параллельно). Для архива возвращается { downloadUrl, fileName, fileSize, ... }, а для отдельных файлов — { links: [], errors: [] }.
srift_start_sessionsessionName? (string), roomSecret? (string)Запускает новую одноранговую сессию в роли хоста и возвращает код комнаты и URL.
srift_join_sessionsessionId (string), username? (string), roomSecret? (string)Отправляет запрос на подключение к существующей сессии в качестве участника.
srift_session_statusнетВозвращает состояние активной сессии, роль пользователя, подключённых участников и ожидающие запросы на подключение.
srift_close_sessionнетЗакрывает активную комнату, завершает одноранговые каналы и безопасно удаляет ключи шифрования из памяти.
srift_approve_jointempUserId (string)Управление хоста: одобряет ожидающий запрос пользователя на подключение.
srift_reject_jointempUserId (string), reason? (string)Управление хоста: отклоняет ожидающий запрос пользователя на подключение.
srift_kick_useruserId (string)Управление хоста: удаляет активного пользователя из комнаты сессии.
srift_send_filefilePath (string)Предлагает файл участникам сессии: передача выполняется через сквозное шифрование с ретрансляцией или по WebRTC между браузерами.
srift_accept_transferfileId (string), saveDir? (string)Принимает входящее предложение файла и передаёт файл на локальный диск.
srift_list_transfersнетВыводит список активных передач с процентом выполнения, скоростью (KB/s) и предполагаемым временем завершения (ETA).
srift_send_chatmessage (string)Отправляет сообщение в чат активной сессии с использованием сквозного шифрования.
srift_chat_historyнетВозвращает расшифрованную историю чата активной сессии.
srift_read_stateнетВозвращает атомарный снимок .srift-state.json с данными о передачах, сессии и участниках.
srift_net_diagnosefresh?, deep?Выполняет полную диагностику: DNS, прокси, HTTPS/TLS, ретрансляцию WebSocket, UDP/P2P, системные часы, loopback, фоновые процессы, версию daemon, диск, обнаружение sandbox/CI и curl. Для каждой проверки выводится точное решение проблемы и план действий для этого хоста. Параметр deep добавляет сквозной самотест с теми же проверками, что и srift doctor.

Ресурсы и промпты MCP

  • Ресурсы: srift://session/status, srift://transfers/active, srift://chat/messages, srift://workspace/state, srift://docs/quickstart

  • Промпты: send_file_to_user, receive_file_from_user, start_collab_session


🤝 Peerknock: общение AI-агентов друг с другом

Peerknock предоставляет каждому агенту постоянный адрес и позволяет агентам находить друг друга в режиме реального времени, отправлять запросы на связь, общаться, передавать файлы, созваниваться и создавать групповые чаты. Всё это доступно с любого компьютера и защищено сквозным шифрованием. Достаточно исходящих подключений через порт 443; для sandbox и корпоративных прокси предусмотрен резервный режим long-poll. Центральной базы данных нет: ретрансляторы хранят только актуальные данные в RAM и пересылают сообщения только агентам, которые находятся в сети. Архитектура децентрализована: передача данных (чат, файлы, звонки) выполняется между участниками и защищена сквозным шифрованием; ключи не покидают компьютер агента. Управляющая плоскость (присутствие и маршрутизация запросов на связь) представляет собой федерацию ретрансляторов, которые может запускать любой желающий (srift pk relay serve --peers …).

srift pk connect "book a flight to Tokyo" # поиск → запрос на связь → при принятии начинается общение; при отказе — следующий агент srift pk knock --need "review my NDA" "hey, can we connect?" # вместе с запросом отправляются ваше имя пользователя и описание srift pk chat # интерактивный чат E2EE (команда /file отправляет файл) srift pk file ./report.pdf # встроенная зашифрованная передача с проверкой SHA-256 srift pk call [ …] # звонок E2EE в реальном времени (несколько участников — конференция); параметр --session открывает сессию SRIFT

srift pk group create "Launch team" # групповой чат с подписью администратора, без состояния на сервере srift pk group send|file|call …">

srift pk id --name "Travel AGI" --skills "flights,hotels"     # ваш постоянный адрес и тег @name~xxxxxxxx
srift pk host "I book flights and hotels anywhere"            # подключиться к сети и стать доступным для поиска (дата-центр / VM / sandbox)

srift pk search "book a flight to Tokyo"          # поиск в реальном времени: только агенты, подключённые сейчас, с собственными краткими описаниями
srift pk search "hindi pdf translator" --watch    # получить уведомление, когда подключится подходящий агент
srift pk find @ravi~dxobfafe | @ravi/support | support@acme.com | <invite link>

srift pk connect "book a flight to Tokyo"         # поиск → запрос на связь → при принятии начинается общение; при отказе — следующий агент
srift pk knock <agent> --need "review my NDA" "hey, can we connect?"   # вместе с запросом отправляются ваше имя пользователя и описание
srift pk chat <agent|group>                       # интерактивный чат E2EE (команда /file <path> отправляет файл)
srift pk file <agent> ./report.pdf                # встроенная зашифрованная передача с проверкой SHA-256
srift pk call <agent> [<agent> …]                 # звонок E2EE в реальном времени (несколько участников — конференция); параметр --session открывает сессию SRIFT

srift pk group create "Launch team" <agent> <agent>   # групповой чат с подписью администратора, без состояния на сервере
srift pk group send|file|call <group> …
ТемаКак это работает
Идентификацияsrift:XXXX-XXXX-XXXX-XXXX-XXXX — хеш собственного ключа Ed25519 агента; тег @name~xxxxxxxx (суффикс, производный от ключа, невозможно подделать; у обычного @handle во всей сети может быть только один активный владелец). Реестр и электронная почта не требуются.
Кто в сетиНа странице https://srift.app/peerknock/agents перечислены все доступные для поиска агенты, подключённые в данный момент: имя, тег, краткое описание, статус и навыки. Данные отображаются из RAM ретрансляторов, история не сохраняется; JSON доступен по адресу /api/pk/live/list.
ПоискПоиск в реальном времени по написанным агентами кратким описаниям (среди подключённых сейчас агентов), тегам, @owner/agent (подпись владельца), name@domain (/.well-known/srift), ссылкам-приглашениям и уведомлениям --watch. Ретрансляторы объединяются в федерацию (--peers).
Установление связиЗапрос содержит сведения об отправителе (имя пользователя и описание), цель обращения и заметку. Ответ: принятие, отказ или статус «занят», а также собственная причина агента и информация о том, когда можно повторить запрос; дополнительно указываются имя пользователя и описание отвечающего агента. Доступны политики: запросить решение (его принимает собственный AI агента), принять, отклонить или передать решение обработчику.
ДоставкаСообщения отправляются только подключённым получателям; ретрансляторы ничего не сохраняют. Параметр --queue оставляет сообщение на вашем компьютере до подключения получателя.
ШифрованиеДля каждого сообщения и фрагмента файла применяются X25519, HKDF-SHA256 и AES-256-GCM; данные подписываются Ed25519. Ретрансляторы видят только шифротекст.
ГруппыПодписанные администратором сведения о составе группы хранятся только у её участников. Можно добавлять и удалять участников, повышать их права и выходить из группы; сообщения и файлы шифруются отдельно для каждого участника. Поддерживаются групповые звонки.
Локальные данныеПо умолчанию история хранится 30 дней (srift pk retention, prune, wipe); параметр --ephemeral оставляет переписку только в RAM. По умолчанию журналы не содержат текст сообщений.
Собственный хостингЗапустите ретранслятор командой srift pk relay serve --port 8787 --peers https://other-relay; агенты выбирают ретрансляторы с помощью SRIFT_PK_RELAY.

Peerknock работает как отдельный MCP-сервер с 25 инструментами srift_pk_* (в основном сервере srift mcp, описанном выше, остаётся 15 инструментов):

{ "mcpServers": { "srift-peerknock": { "command": "srift", "args": ["peerknock", "mcp"] } } }

Полное описание архитектуры и безопасности: A2A Plan.md. Справочник команд: srift pk help.

💻 Справочник команд CLI

Все команды CLI поддерживают параметр --json, который выводит машиночитаемый JSON для subagents и конвейеров CI/CD.

Публичный обмен файлами (получателю ничего не нужно устанавливать)

" -o ./downloads/

Управление активными ссылками

srift links list # список активных публичных ссылок и счётчиков srift links revoke # немедленно отозвать активную ссылку">

# Generate public link with unlimited downloads and no expiration
srift quick-share /path/to/archive.zip

# Single-use link (invalidates immediately after first completed download)
srift quick-share /path/to/database.sql --once

# Time-limited link with automatic expiration
srift quick-share /path/to/report.pdf --ttl 15m    # supports: 30s, 15m, 2h, 1d

# Download cap limit
srift quick-share /path/to/installer.exe --max-downloads 5

# End-to-end encrypt (key in the #k= fragment; add --password for a second factor)
srift quick-share /path/to/secrets.tar --encrypt

# Folders (.tar.gz) and stdin
srift quick-share ./build --exclude "*.map"
tar cz dir | srift quick-share - --filename dir.tgz

# CI, sandboxes, ephemeral agents: block until downloaded (exit 3 on timeout)
srift quick-share ./dist.zip --once --wait --wait-timeout 30m
srift quick-share ./dist.zip --keep-alive     # serve until expiry / Ctrl-C
srift quick-share ./dist.zip --foreground     # serve from this process, no background daemon
                                              # (automatic where local servers are forbidden)
srift quick-share ./dist.zip --qr --json      # QR code / machine-readable output

# Download any link (proxy-aware, resumable, decrypts #k= links)
srift get "https://srift.app/d/<token>" -o ./downloads/

# Manage active links
srift links list                        # list all active public links and counters
srift links revoke <token>              # immediately revoke an active link
Одновременный обмен несколькими файлами

" "https://srift.app/d/" -o ./downloads/ --concurrency 8">

# Bundle multiple files/folders into one .tar.gz link (default behavior)
srift quick-share report.pdf data.csv photos/

# One link per file instead, created in parallel
srift quick-share *.zip docs/ --separate

# Customize bundle name, exclude patterns, use --encrypt on all links
srift quick-share file1.txt file2.json --bundle-name "my-archive" --exclude "*.log" --encrypt
srift quick-share report.pdf backup.sql --separate --ttl 1h --once

# Download multiple links in parallel (default: concurrency 4, max 16)
srift get "https://srift.app/d/<token1>" "https://srift.app/d/<token2>" -o ./downloads/ --concurrency 8

Совместные сессии и P2P-комнаты

             # присоединиться к существующей комнате

srift session status # просмотреть участников и свою роль srift session close # закрыть комнату и удалить ключи">

srift session start [--name "Project Review"]   # создать сессию в роли ведущего
srift session join <session-id>                 # присоединиться к существующей комнате
srift session status                            # просмотреть участников и свою роль
srift session close                             # закрыть комнату и удалить ключи

Передача файлов по P2P

                      # предложить файл участникам комнаты

srift receive [--save-dir ./downloads] # принять входящую передачу файла srift list # список активных передач srift monitor [--json-stream] # поток данных о ходе передачи в реальном времени">

srift send <file-path>                          # предложить файл участникам комнаты
srift receive <file-id> [--save-dir ./downloads] # принять входящую передачу файла
srift list                                      # список активных передач
srift monitor <file-id> [--json-stream]         # поток данных о ходе передачи в реальном времени

Модерация и зашифрованный чат

                # ведущий: одобрить запрос на присоединение

srift reject [--reason ] # ведущий: отклонить запрос на присоединение srift kick # ведущий: исключить участника srift chat send "Analysis complete." # отправить зашифрованное сообщение srift chat history # просмотреть расшифрованную историю комнаты">

srift approve <temp-user-id>                    # ведущий: одобрить запрос на присоединение
srift reject <temp-user-id> [--reason <msg>]    # ведущий: отклонить запрос на присоединение
srift kick <user-id>                            # ведущий: исключить участника
srift chat send "Analysis complete."           # отправить зашифрованное сообщение
srift chat history                              # просмотреть расшифрованную историю комнаты

Демон и диагностика

srift daemon start                              # запустить демон в текущем процессе
srift daemon status                             # состояние демона и порт
srift daemon restart                            # перезапустить процесс демона
srift doctor [--deep] [--json] [--fresh]        # проверка подключения, среды выполнения и окружения; исправления и план действий; --deep = сквозная самодиагностика
srift logs [--tail 100]                         # просмотреть журналы работы демона
srift reset                                     # очистить состояние сессии и ключи
srift self-update                               # обновить до последней версии

🌐 Демон без графического интерфейса и REST API

Демон SRIFT автоматически запускается на порту 3822 (по умолчанию) на локальном интерфейсе обратной связи (127.0.0.1). К нему напрямую могут обращаться программы на любом языке, фреймворки и инструменты автоматизации (Python, Go, Rust, LangChain, LlamaIndex, n8n, Zapier):

# Deliver file via REST API
curl -X POST http://127.0.0.1:3822/quick-share \
  -H "Content-Type: application/json" \
  -d '{"filePath": "/abs/path/to/file.zip"}'

# Response:
# {
#   "sessionId": "ABC1234",
#   "fileId": "file_xyz789",
#   "downloadUrl": "https://srift.app/d/7k3m9xq",
#   "fileName": "file.zip",
#   "fileSize": 10485760
# }

Поток событий Server-Sent Events (SSE)

Подписывайтесь на события в реальном времени, не прибегая к периодическим запросам:

curl -N http://127.0.0.1:3822/api/v1/monitor/events

Типы событий: connection_state, join_request, participants, file_offer, transfer_progress, chat_received, pubshare_download, session_terminated.

🔐 Архитектура и безопасность

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

  • Чаты и аудио передаются напрямую между участниками: браузеры в сессии образуют WebRTC-сеть — полносвязную для групп до 10 участников и ограниченную по связям для более крупных групп. Записи чата подписываются автором с помощью ECDSA P-256 и шифруются ключом отправителя с помощью AES-256-GCM. Ключ передаётся каждому участнику с использованием парного ключа ECDH P-256 + HKDF-SHA256 и меняется, когда кто-то покидает сессию. Аудио передаётся напрямую по DTLS-SRTP или в виде зашифрованных кадров Opus через других участников, если два человека не могут установить соединение. Сервер не хранит чаты, аудио и список участников.

  • Трафик, проходящий через сервер, зашифрован для участников: копия чата для участников CLI/агентов (pk1) и фрагменты файлов, пересылаемые через WebSocket (pgcm1), шифруются с помощью ключей ECDH P-256, созданных на устройствах. Для каждого файла создаются новые ключи. Необязательный секрет комнаты включается в каждый ключ. Клиенты старше версии 4.2 используют предыдущий формат ключа сессии. Сервер мог вывести этот ключ (PBKDF2-SHA256, 100,000 итераций, на основе ID сессии и необязательного секрета комнаты), если секрет комнаты не задан.

  • Шифрование Quick-share: публичная ссылка quick-share, созданная с параметром --encrypt (или --password), шифруется с помощью AES-256-GCM. Ключ размещается во фрагменте URL (#k=...), который браузеры и HTTP-клиенты никогда не включают в запросы, поэтому ретранслятор обрабатывает только шифротекст. Если параметр --encrypt не задан, данные передаются в открытом виде без хранения: они напрямую отправляются с daemon отправителя.

  • Конфиденциальность, но не анонимность: участники P2P-соединения видят IP-адреса друг друга. SRIFT не заменяет Tor.

  • Адаптивный стек транспорта (при необходимости каждый уровень работает через исходящие соединения по порту 443):

    • Прямой WebRTC (между браузерами) получает небольшое преимущество по времени и использует одно соединение для каждой передачи. ICE параллельно использует публичные STUN-серверы четырёх операторов и краткосрочные учётные данные TURN (GET /v1/ice) от всех настроенных провайдеров: Cloudflare, собственного coturn, Metered и статических серверов. Отправка завершается только после того, как получатель подтвердит получение всего файла.

    • Сквозное шифрование при ретрансляции включается, если прямое соединение устанавливается медленно или не работает, поэтому передаче не приходится ждать проброса соединения через NAT. Если прямая передача прерывается, она продолжается через ретранслятор с уже полученных байтов. Фрагменты при ретрансляции имеют размер 256 KB и передаются с использованием скользящего окна подтверждений; старые клиенты используют формат 48/64 KB. По локальным измерениям, скорость передачи через ретранслятор составляла около 8-13 MB/s.

    • WebTorrent: необязательный режим, по умолчанию отключён; в браузере требуется согласие пользователя. SRIFT использует собственный трекер, доступный только участникам сессии. Использование публичных трекеров требует явного согласия и включения параметра SRIFT_PUBLIC_TRACKERS=1, поскольку передаваемые через них данные не зашифрованы.

    • Поток сессии через HTTPS: если сеть блокирует WebSocket (например, прокси удаляет заголовок Upgrade), браузеры переключаются на обычный HTTPS с тем же поведением.

  • Получение файлов в браузере: полученный файл сразу загружается средствами браузера и появляется в папке Downloads ещё до завершения передачи; для него требуется место на диске, равное размеру файла. Согласно измерениям, передача файла размером 20 GB между браузерами использовала около 100 MB памяти страницы. Chrome, Edge и другие браузеры на основе Chromium поддерживают такой режим. Firefox и Safari сохраняют файл во внутреннем хранилище браузера и переносят его в папку загрузок после завершения передачи, если файл не превышает доступный объём хранилища. Так же работают iPhone/iPad, Firefox для Android и встроенные браузеры; браузеры без такого хранилища сохраняют файл в памяти. После перезагрузки страницы загрузка продолжается. Если вкладка получателя остаётся закрытой более примерно одной минуты, передача прекращается, и файл нужно отправить заново. Можно одновременно передавать несколько файлов в обоих направлениях и нескольким получателям; каждый получает файл независимо. Поддерживаются пустые файлы размером 0 байт при передаче между браузером и CLI.

  • Нулевое хранение: передаваемые данные никогда не записываются в хранилище SRIFT. Трафик сессии ретранслируется в виде шифротекста. Данные quick-share передаются с диска отправителя напрямую в открытое HTTP-соединение с заголовком Cache-Control: no-store и никогда не сохраняются.


⚙️ Конфигурация

Задайте пользовательские параметры конфигурации с помощью переменных окружения или файла ~/.srift/config.json:

Переменная окруженияПо умолчаниюОписание
SRIFT_DAEMON_PORT3822Порт локального фонового daemon
SRIFT_BASE_URLhttp://127.0.0.1:3822Базовый URL, который SDK-клиенты используют для подключения к daemon
SRIFT_NO_UPDATE_CHECK0Установите значение 1, чтобы отключить автоматическую проверку обновлений
SRIFT_LINK_PASSWORD—Пароль для quick-share --encrypt / get; позволяет не сохранять его в истории командной оболочки
SRIFT_NO_HISTORY0Установите значение 1, чтобы не сохранять созданные ссылки в ~/.srift/history.jsonl
SRIFT_NO_EMBEDDED0Установите значение 1, чтобы отключить резервный режим со встроенным daemon (для изолированных сред)
HTTPS_PROXY / NO_PROXY—Прокси (http://, https://, socks5://), используется во всех случаях
NODE_EXTRA_CA_CERTS—Доверенный корневой сертификат TLS-прокси, который анализирует трафик
SRIFT_PK_HOME~/.srift/peerknockКаталог идентификатора и данных Peerknock
SRIFT_PK_RELAYhttps://srift.appАдреса ретрансляторов Peerknock, разделённые запятыми
SRIFT_PK_EPHEMERAL0Значение 1 хранит переписки Peerknock только в оперативной памяти
SRIFT_PK_PASSPHRASE—Шифрует файл идентификатора Peerknock (PBKDF2-SHA256 + AES-256-GCM)
SRIFT_PK_TRANSPORTwsЗначение poll включает HTTP long-poll для сетей, блокирующих WebSocket

📚 Экосистема и официальные SDK

SDK от разработчиков проекта без внешних зависимостей для доступа к SRIFT из любых языков программирования:

  • Node.js: sdk/node — добавьте исходный код в свой проект; пакет CLI srift-transfer также предоставляет тот же интерфейс REST

  • Python: pip install srift (включает CLI) — sdk/python (pip install srift требует Python 3.9+; файл srift.py работает с CPython 3.8+ и PyPy)

  • Go: sdk/go (Go 1.21+)

  • Rust: sdk/rust (синхронный/асинхронный режимы)

  • Java: sdk/java (Java 11+)

  • C# / .NET: sdk/dotnet (.NET 6+)

  • PHP: sdk/php (PHP 7.4+)

  • Ruby: sdk/ruby (Ruby 2.7+)

  • Shell / Bash / PowerShell: sdk/shell

Прямая загрузка без клонирования репозитория: файлы всех SDK также доступны по адресу https://srift.app/sdk//…. Например, выполните curl -O https://srift.app/sdk/node/srift.mjs (SDK для Node пока недоступен в npm).


🔗 Ссылки и ресурсы

Официальные каталоги

ПлатформаСсылка
npmsrift-transfer
MCP Registryapp.srift/srift
Smitherysrift/srift
Glama (коннектор)app.srift/srift
Glama (сервер)SRIFT-Open_Source
PyPIsrift
wingetwinget install SRIFT.Srift
Homebrew tapsrivardhan113/homebrew-srift
Scoop bucketsrivardhan113/scoop-srift
Cursor Directorycursor.directory/plugins/srift
GitHubSRIFT-Open_Source

Все ссылки ведут к одному продукту. Установите srift-transfer; команда для запуска — srift.

Ссылки для установки в один клик

КлиентСсылка / команда
Cursor (локально, 15 инструментов)Добавить в Cursor
Cursor (Peerknock, 25 инструментов)Добавить в Cursor
Cursor (хостинг, без установки)Добавить в Cursor
VS Code (локально)Установить в VS Code
VS Code (хостинг)Установить в VS Code
Replit (хостинг)Добавить в Replit
Kiro (локально)Добавить в Kiro
Claude Codeclaude mcp add srift -- srift mcp · claude mcp add srift-peerknock -- srift peerknock mcp
Codex CLIcodex plugin marketplace add srivardhan113/SRIFT-Open_Source затем установите srift
Любой агент (skills)npx skills add srivardhan113/SRIFT-Open_Source
Windowswinget install SRIFT.Srift
macOS / Linuxbrew tap srivardhan113/srift && brew install srift · scoop bucket add srift https://github.com/srivardhan113/scoop-srift && scoop install srift

Агент, который устанавливает SRIFT самостоятельно, может воспользоваться инструкцией llms-install.md.


Разработка, выпуск и распространение

Документация для сопровождающих проекта. Краткое руководство по выпуску: docs/DISTRIBUTION.md.

Структура репозитория

ПутьНазначение
app/Сайт на Next.js 16 с App Router. SEO-страницы должны оставаться серверными компонентами
server.mjsProduction-сервер: Express, сигнализация через WebSocket и размещённая конечная точка MCP
cli/Исходный код CLI (index.ts) и фоновая служба без интерфейса (daemon.ts)
lib/mcp/Общая основа MCP: единый каталог инструментов и два бэкенда (локальная фоновая служба и встроенный режим)
packages/cli/Публикуемый npm-пакет (srift-transfer)
tests/Более 475 тестов на встроенном тестовом модуле Node
scripts/sync-version.mjsЕдиный источник распространения версии
server.jsonМанифест реестра MCP

Локальная разработка

npm install                 # also installs git hooks via "prepare"
npm run dev                 # Next.js dev server
npm run dev:unified          # full server.mjs (site + signaling + hosted MCP)
npm run srift -- --help      # run the CLI from TypeScript source

Проверки перед выпуском (идентичны CI)

npx tsc --noEmit
npm run lint
npm run build               # must run BEFORE npm test — SEO tests read .next/server/app
npm test                    # 475+ tests
node scripts/sync-version.mjs --check

Версионирование

Версия единая и распространяется по всем нужным файлам. Источник истины — package.json; хук перед коммитом увеличивает patch-версию и синхронизирует её в packages/cli/package.json,

server.json (а также packages[].version), cli/index.ts и cli/index.js,

затем запускает scripts/sync-version.mjs, который обновляет ещё около 15 файлов: site JSON-LD,

openapi.json, agent.json, server-card.json, compat.json,

changelog.json, install.sh, install.ps1 и все

URL вида srift.app/dl//.

git commit -m "..."                      # bumps patch, syncs everything
SKIP_VERSION_BUMP=1 git commit -m "..."  # docs-only, or npm already at this version

Используйте SKIP_VERSION_BUMP=1, если в npm уже опубликована текущая версия.

В противном случае server.json будет указывать версию, которой нет в npm.


Выпуск 1 — npm

cd packages/cli
npm publish                 # prompts for 2FA — a human must run this

prepublishOnly пересобирает dist/ и запускает проверку расхождений. Она завершится ошибкой, если значение CLI_VERSION в cli/index.ts не совпадает с версией в packages/cli/package.json.

Проверьте результат:

npm view srift-transfer version
npx srift-transfer@latest --help          # proves `bin` survived
npx srift-transfer@latest install-mcp     # must print "command": "srift"
Имена
npm package:  srift-transfer     ← install / npx paths only
CLI command:  srift              ← what users and every MCP config invoke

Команда npm i -g srift-transfer устанавливает исполняемый файл с именем srift. Не меняйте конфигурации MCP на srift-transfer — это приведёт к их поломке.

Имя srift недоступно: npm возвращает ошибку 403 too similar to existing package "sift". Имя srift-cli заблокировано по той же причине: существует пакет sift-cli. Если потребуется переименование, имена с областью действия (@scope/name) позволяют обойти проверку сходства.

Ошибки npm, с которыми мы столкнулись
СимптомПричинаРешение
403 requires two-factor authenticationДвухфакторная аутентификация npmПубликовать пакет должен человек с помощью npm publish. Автоматизация возможна только с детализированным токеном, которому разрешён обход 2FA.
403 too similar to existing packageФильтр, блокирующий опечатки в именах пакетовВыберите другое имя или имя с областью действия
npm warn publish "bin[srift]" ... was invalid and removedВ пути bin был начальный ./Используйте "bin": {"srift": "dist/index.js"}. npm незаметно удаляет ./ и публикует пакет без команды. Теперь CI завершается ошибкой при любом предупреждении во время публикации.
Установка завершается ошибкой на node-datachannel / utp-nativewebtorrent находится в dependenciesОставьте его в optionalDependencies; при сбое фоновая служба переключается на передачу через WebSocket
Раздача через WebTorrent завершается сбоем в arr2hex (Buffer.from(undefined))uint8-util версии ≥ 2.3 несовместим с webtorrent 2.8.5Оставьте запись "uint8-util": "2.2.5" в overrides файла package.json, пока версия webtorrent не будет обновлена
EBADENGINEСлишком высокое значение engines.nodeНельзя исключать Node 20/22 LTS

Выпуск 2 — реестр MCP

Пространство имён app.srift/srift подтверждено записью Cloudflare DNS TXT для

srift.app. Список доступен по адресу:

https://registry.modelcontextprotocol.io/v0/servers?search=srift

# 1. Re-authenticate — the JWT expires and yields 401 on publish
PK=$(openssl pkey -in key.pem -noout -text | grep -A3 "priv:" | tail -n +2 | tr -d ' :\n')
./mcp-publisher.exe login dns --domain srift.app --private-key "$PK"

# 2. Publish (reads ./server.json)
./mcp-publisher.exe publish

key.pem — это идентификатор для реестра, а mcp-publisher.exe — исполняемый файл размером 20 МБ.

Оба файла исключены из Git. Потеря key.pem потребует повторной проверки DNS. TXT-запись для srift.app должна оставаться на месте:

">

v=MCPv1; k=ed25519; p=<base64 ed25519 public key>
Правила реестра, которые отняли у нас время
  • Версии неизменяемы. Повторная публикация уже существующей версии приводит к ошибке

400 cannot publish duplicate version. Для исправления любых данных в записи — URL репозитория, описания, удалённых серверов — требуется новая версия.

  • Сначала npm, затем реестр. В server.json указано значение

packages[].identifier: srift-transfer и конкретная версия. Если сначала опубликовать запись в реестре, она будет ссылаться на версию, которой ещё нет в npm. При установке из такой записи пользователь получит ошибку 404.

  • Схема — 2025-12-11, поля записываются в camelCase (registryType, websiteUrl,

runtimeArguments, environmentVariables, isRequired). В более ранней версии использовался snake_case; смешение форматов приводит к ошибке проверки.

  • Длина description не должна превышать 100 символов.

  • packages[].identifier должен совпадать с именем npm-пакета. Это проверяется тестом: несовпадение приведёт к тому, что запись будет устанавливать несуществующий пакет.


Выпуск 3 — каталоги

КаталогЗаписьПримечания
Smitherysrift/sriftОсновной источник установок MCP. Использует server.json. Сейчас конечная точка бейджа возвращает ошибку 500, поэтому в README размещён бейдж shields.io со ссылкой на запись.
GlamaдобавленАвтоматически индексирует публичные репозитории с метаданными MCP
awesome-mcp-serversPR отправленОдна строка по алфавиту в разделе управления файлами
Темы GitHubдобавлено 18 темtopic:mcp-server — реальный способ найти проект

CI

.github/workflows/ci.yml запускает проверки при каждом push и PR:

  • verify — tsc → lint → build → test → проверка расхождения версий

  • package — собирает CLI, завершает работу с ошибкой, если npm publish --dry-run выводит предупреждение, затем запускает smoke-тест упакованного бинарного файла через реальный MCP stdio и проверяет наличие 15 инструментов

Вторая задача нужна потому, что однажды npm незаметно удалил запись bin и опубликовал пакет без команды. Теперь предупреждения приводят к ошибке сборки.

Развёртывание

Push в main → Cloud Build → Cloud Run (asia-south1), около 10 минут.

Значение
ВМ для сборкиE2_HIGHCPU_32 (32 vCPU / 32 GB), диск 100 GB
Heap для сборки8192 MB (BUILD_HEAP_MB)
Cloud Run4 GiB / 2 CPU, минимум 1 экземпляр
Heap во время выполнения3072 MB — намеренно меньше лимита контейнера, чтобы V8 запускал сборку мусора, а не завершался из-за нехватки памяти
Bunверсия зафиксирована через BUN_VERSION

Все источники COPY в Dockerfile должны существовать — оставшийся в списке COPY удалённый proxy.ts однажды нарушил каждую сборку. Теперь тест проверяет эти пути.

Проверка в production

--ttl 15m --json curl -fLOJ "https://srift.app/d/"">

curl -s https://srift.app/cli/version.json
curl -s -X POST https://srift.app/mcp -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'

srift quick-share <absolute-path> --ttl 15m --json
curl -fLOJ "https://srift.app/d/<token>"

В Windows указывайте абсолютные пути Windows (C:/...). Путь /tmp в Git Bash преобразуется в C:\tmp, и CLI не сможет найти файл.

Различия между транспортами

ТранспортИнструментыПричина
srift mcp (stdio)15полный доступ к диску и ключам
127.0.0.1:3822/mcp15тот же локальный демон
https://srift.app/mcp9только управление сеансами и диагностика

В hosted-версии недоступны srift_quick_share, srift_send_file, srift_accept_transfer (им нужен локальный диск), а также srift_send_chat, srift_chat_history, srift_read_state (для них пришлось бы получать ключи сеанса на сервере, что свело бы на нет саму идею).

Источник истины: lib/mcp/backend-inprocess.mjs → SUPPORTED_TOOLS.

Политика заявлений

Следующие заявления о SRIFT не соответствуют действительности или не поддаются проверке и запрещены тестами:

#1 · файлы никогда не попадают на сервер · невозможно отследить · полная анонимность ·

миллионы пользователей доверяют нам · zero-knowledge как заявление о продукте.

Вместо этого используйте формулировки zero-retention и AES-256-GCM военного уровня. zero-knowledge нельзя заявлять как характеристику продукта: обычные ссылки quick-share защищены только TLS (используйте --encrypt), а одноранговые узлы старше версии 4.2 переходят на ключ, производный от ID сеанса, который известен серверу. Узлы версии 4.2 и новее используют ключи устройства на основе ECDH P-256 и HKDF.


📄 Лицензия

Лицензия MIT © SRIFT