CORSA is a decentralized messenger and DEX-oriented communication project that is currently being rebuilt around the Gazeta protocol.
Current repository status:
- current Corsa version: see
internal/core/config.CorsaVersion - Go-based desktop and node foundation
- desktop chat-style UI with identity list and direct messaging
- mesh-style peer sync between local nodes
- node role model:
fullorclient - identity based on public-key fingerprint addresses
- signed and encrypted direct addressed messages over the mesh
- signed box-key discovery with local TOFU trust pinning
- every message carries a UUID, deletion flag, timestamp, and optional TTL
- messages outside the allowed clock drift are rejected and not forwarded
Gazetaanonymous encrypted notices with TTL- primary wire protocol is JSON frames over TCP
Main docs:
- architecture: docs/architecture.md
- protocol: docs/protocol.md
- encryption: docs/encryption.md
Desktop localization:
- built-in UI languages: English, Arabic, Spanish, Chinese, Russian, French
- startup default can be set with
CORSA_LANGUAGE=en|ar|es|zh|ru|fr - language can also be switched directly in the desktop UI
- desktop remembers the last selected language per identity
Repository layout:
cmd/corsa-desktop— desktop application with embedded local nodecmd/corsa-node— standalone node processinternal/core— protocol, identity, node, servicesdocs— architecture and protocol notes
Git hooks:
- hook installer:
scripts/install-hooks.sh - current pre-commit hook runs
make lint - install with:
make install-hooks - verify with:
make hooks-status - expected value:
./scripts/hooks/
Run examples:
CORSA_LISTEN_ADDRESS=:64646 CORSA_BOOTSTRAP_PEER=127.0.0.1:64647 GOCACHE=$(pwd)/.gocache GOMODCACHE=$(pwd)/.gomodcache go run ./cmd/corsa-desktopCORSA_LISTEN_ADDRESS=:64647 CORSA_BOOTSTRAP_PEER=127.0.0.1:64646 GOCACHE=$(pwd)/.gocache GOMODCACHE=$(pwd)/.gomodcache go run ./cmd/corsa-desktopDefault identity files are created under .corsa/ and are separated by listen port.
Default bootstrap seed:
65.108.204.190:64646
For public or VPS nodes, the practical network settings are:
CORSA_LISTEN_ADDRESS— local bind addressCORSA_ADVERTISE_ADDRESS— external address announced to peersCORSA_BOOTSTRAP_PEERS— comma-separated seed listCORSA_TRUST_STORE_PATH— local pinned-contact trust databaseCORSA_NODE_TYPE—fullorclientCORSA_MAX_CLOCK_DRIFT_SECONDS— allowed past/future clock drift for relayed messages, default600
Message metadata and relay rules:
- each
SEND_MESSAGEframe carriesmessage-id,flag,timestamp, andttl-seconds FETCH_MESSAGE_IDS <topic>returns only UUIDs for lightweight syncFETCH_MESSAGE <topic> <uuid>loads one message by UUID- the preferred protocol form is one JSON object per line
- supported flags:
immutablesender-deleteany-deleteauto-delete-ttl
auto-delete-ttlmessages are removed automatically afterttl-seconds- nodes reject and do not forward messages that are too far in the past or future
Node roles:
full— forwards mesh traffic, relays direct messages andGazetanoticesclient— syncs peers and contacts, stores local traffic, but does not forward mesh traffic- default for
corsa-node:full - default for
corsa-desktop:full - recommended future default for mobile/light client:
client
Example:
CORSA_LISTEN_ADDRESS=:64646 \
CORSA_ADVERTISE_ADDRESS=<your-public-ip>:64646 \
CORSA_BOOTSTRAP_PEERS=65.108.204.190:64646 \
GOCACHE=$(pwd)/.gocache \
GOMODCACHE=$(pwd)/.gomodcache \
go run ./cmd/corsa-nodeDocker example:
docker compose up -d --buildThe container runs as non-root user corsa (uid=10001).
The included docker-compose.yaml already uses:
restart: unless-stopped- named volume
corsa-data - non-root runtime user
Manual docker run example:
docker volume create corsa-data
docker run -d -p 64646:64646 \
--name corsa-node \
--restart unless-stopped \
-e CORSA_LISTEN_ADDRESS=:64646 \
-e CORSA_ADVERTISE_ADDRESS=<your-public-ip>:64646 \
-e CORSA_BOOTSTRAP_PEERS=65.108.204.190:64646 \
-v corsa-data:/home/corsa/.corsa \
corsa-nodeFor host bind mount usage, prepare the directory for uid=10001 first:
mkdir -p .corsa
sudo chown -R 10001:10001 .corsa
docker run -d -p 64646:64646 \
--name corsa-node \
--restart unless-stopped \
-e CORSA_LISTEN_ADDRESS=:64646 \
-e CORSA_ADVERTISE_ADDRESS=<your-public-ip>:64646 \
-e CORSA_BOOTSTRAP_PEERS=65.108.204.190:64646 \
-v $(pwd)/.corsa:/home/corsa/.corsa \
corsa-nodeCORSA — это децентрализованный мессенджер и коммуникационный слой для DEX, который сейчас пересобирается вокруг протокола Gazeta.
Текущее состояние репозитория:
- текущая версия Corsa: см.
internal/core/config.CorsaVersion - Go-основа для desktop-приложения и ноды
- desktop UI в формате чата: список identity слева и direct messaging справа
- mesh-синхронизация между локальными узлами
- модель ролей узла:
fullилиclient - identity через адрес как fingerprint публичного ключа
- подписанные и зашифрованные адресные direct-сообщения поверх mesh
- подписанное распространение box key и локальный TOFU trust pinning
- каждое сообщение несет UUID, флаг удаления, timestamp и опциональный TTL
- сообщения вне допустимого дрейфа времени отклоняются и не форвардятся
- анонимные зашифрованные объявления
Gazetaс временем жизни
Основные документы:
- архитектура: docs/architecture.md
- протокол: docs/protocol.md
- шифрование: docs/encryption.md
Локализация desktop-клиента:
- встроенные языки UI: английский, арабский, испанский, китайский, русский и французский
- стартовый язык можно задать через
CORSA_LANGUAGE=en|ar|es|zh|ru|fr - язык также можно переключать прямо в desktop UI
- desktop-клиент запоминает последний выбранный язык отдельно для каждой identity
Структура репозитория:
cmd/corsa-desktop— desktop-приложение со встроенной локальной нодойcmd/corsa-node— отдельный процесс нодыinternal/core— протокол, identity, нода, сервисыdocs— описание архитектуры и протокола
Git хуки:
- установщик хука:
scripts/install-hooks.sh - текущий
pre-commitзапускаетmake lint - установить:
make install-hooks - проверить:
make hooks-status - ожидаемое значение:
./scripts/hooks/
Примеры запуска:
CORSA_LISTEN_ADDRESS=:64646 CORSA_BOOTSTRAP_PEER=127.0.0.1:64647 GOCACHE=$(pwd)/.gocache GOMODCACHE=$(pwd)/.gomodcache go run ./cmd/corsa-desktopCORSA_LISTEN_ADDRESS=:64647 CORSA_BOOTSTRAP_PEER=127.0.0.1:64646 GOCACHE=$(pwd)/.gocache GOMODCACHE=$(pwd)/.gomodcache go run ./cmd/corsa-desktopПо умолчанию identity-файлы создаются в .corsa/ и разделяются по порту прослушивания.
Для публичных или VPS-нод практические сетевые настройки такие:
CORSA_LISTEN_ADDRESS— локальный bind-адресCORSA_ADVERTISE_ADDRESS— внешний адрес, который нода объявляет пирамCORSA_BOOTSTRAP_PEERS— список seed-нод через запятуюCORSA_TRUST_STORE_PATH— локальная база pinned-контактовCORSA_NODE_TYPE—fullилиclientCORSA_MAX_CLOCK_DRIFT_SECONDS— допустимый дрейф времени для ретранслируемых сообщений, по умолчанию600
Метаданные сообщений и правила relay:
- каждый
SEND_MESSAGEкадр несетmessage-id,flag,timestampиttl-seconds FETCH_MESSAGE_IDS <topic>возвращает только UUID для легкой синхронизацииFETCH_MESSAGE <topic> <uuid>загружает одно сообщение по UUID- поддерживаемые флаги:
immutablesender-deleteany-deleteauto-delete-ttl
- сообщения с
auto-delete-ttlавтоматически удаляются послеttl-seconds - ноды отклоняют и не форвардят сообщения, которые слишком далеко в прошлом или будущем
- основной wire-format теперь: один JSON-объект на строку
Роли узла:
full— форвардит mesh-трафик, ретранслирует direct messages иGazetanoticesclient— синкает peers и contacts, хранит локальный трафик, но не делает mesh-forwarding- значение по умолчанию для
corsa-node:full - значение по умолчанию для
corsa-desktop:full - рекомендуемое будущее значение для mobile/light client:
client
Bootstrap seed по умолчанию:
65.108.204.190:64646
Пример:
CORSA_LISTEN_ADDRESS=:64646 \
CORSA_ADVERTISE_ADDRESS=<your-public-ip>:64646 \
CORSA_BOOTSTRAP_PEERS=65.108.204.190:64646 \
GOCACHE=$(pwd)/.gocache \
GOMODCACHE=$(pwd)/.gomodcache \
go run ./cmd/corsa-nodeПример через Docker:
docker compose up -d --buildКонтейнер запускается не от root, а от пользователя corsa (uid=10001).
docker-compose.yaml уже использует:
restart: unless-stopped- named volume
corsa-data - запуск не от
root
Ручной пример через docker run:
docker volume create corsa-data
docker run -d -p 64646:64646 \
--name corsa-node \
--restart unless-stopped \
-e CORSA_LISTEN_ADDRESS=:64646 \
-e CORSA_ADVERTISE_ADDRESS=<your-public-ip>:64646 \
-e CORSA_BOOTSTRAP_PEERS=65.108.204.190:64646 \
-v corsa-data:/home/corsa/.corsa \
corsa-nodeДля использования bind mount с хоста сначала подготовь каталог под uid=10001:
mkdir -p .corsa
sudo chown -R 10001:10001 .corsa
docker run -d -p 64646:64646 \
--name corsa-node \
--restart unless-stopped \
-e CORSA_LISTEN_ADDRESS=:64646 \
-e CORSA_ADVERTISE_ADDRESS=<your-public-ip>:64646 \
-e CORSA_BOOTSTRAP_PEERS=65.108.204.190:64646 \
-v $(pwd)/.corsa:/home/corsa/.corsa \
corsa-node