Skip to content

krwg/blip

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

171 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
icon-main

BLIP

Tagline

Version Electron License Platform P2P WebRTC Offline Vite i18n

Stars Downloads Last Commit Issues PRs Contributors


You're on the grid. You're the signal. English · Русский · Сайт

Navigation

Section English Русский
Testing (one PC) Testing Тестирование
Overview Overview Обзор
Features Features Возможности
MESH+ MESH+ MESH+
Signal Corps Signal Corps Сигнал Корпс
Architecture Architecture Архитектура
Stack Stack Стек
Quick start Quick start Быстрый старт
npm scripts npm scripts Скрипты npm
Ports Ports Порты
Usage Usage Использование
Shortcuts Shortcuts Горячие клавиши
Fonts Fonts Шрифты
Project layout Project layout Структура
Design tokens Design Дизайн
License License Лицензия
Community Community Сообщество
Landing Pages Сайт
Troubleshooting Troubleshooting Устранение неполадок
Error codes Error codes Коды ошибок

English

Testing on one PC

Approach Works for chat/calls?
Two BLIP windows on the same PC No — both try to bind UDP 42069 and TCP 42070; the second copy usually fails or cannot discover the first.
VM (VirtualBox / Hyper-V) with bridged network Yes — guest gets its own IP; install or run BLIP in the VM.
Second device on the same Wi‑Fi (laptop, old PC) Yes — recommended.
Hamachi / Radmin VPN between two machines Yes — same as LAN.
Phone No mobile app yet — desktop only.

Quick VM flow: host runs BLIP (ID 1), VM runs BLIP (ID 2), same subnet via bridged adapter, allow firewall for ports 42069–42070.

Overview

What Desktop app: text, voice, and video over LAN / Hamachi / Radmin VPN
Release 2.0.0 — Morse (in development; see CHANGELOG.md; last published: 1.1.1 Beacon)
Identity BLIP ID 1–64 (8×8 grid, Minecraft-style chunk metaphor)
Servers None — UDP broadcast, TCP, and WebRTC peer-to-peer only
Sign-up None
UI Pixel-art × liquid glass × brutalism, 0px border-radius

Features

Feature Description
BLIP ID Pick a number on the 8×8 grid; conflicts resolved via TCP ping
Discovery UDP 42069 + mDNS fallback
Chat TCP messages, receipts (✓/✓✓), reactions, LAN images, linkify, emoji picker, Ctrl+F search, export, typing, unread
Groups Group chat (beta), custom name & avatar, voice channels in the community view (host star relay); LAN avatar sync; legacy group call window still available
Favorites Star peers locally; sorted first on Peers and Chat
Presence Online / Away / Busy in Profile (UDP announce)
Calls Separate 1:1 and group call windows; WebRTC voice/video (LAN, no STUN/TURN)
Screen share 720p+ capture, theater layout, fullscreen (F), stream/fullscreen quality in Settings
Mesh Pulse Live LAN heartbeat — auto ping every minute, latency under each peer
Trust & block First-chat confirm; local block list; Settings → Privacy
Avatars 8×8 auto-generated from BLIP ID; regenerate in Settings
Themes Light/dark palettes + animated backgrounds (EN/RU names)
Sound Chiptune Web Audio — SIGNAL / PULSE FX packs, MESH / GRID call melodies; preview in Settings → Sound; DND mutes all
Files P2P send in chat (1–100 GB limit in Settings, chunked); drag & drop; group inline ≤768 KB + chunked to all members
BEACON LAN mesh file library (МАЯК): publish seeds, multi-peer download, pause/resume seeding, blip://seed/…, .blip descriptors, transfer hub
Clipboard Optional LAN clipboard sync — Settings → Network (off / active chat / trusted peers)
Status Custom status line on LAN (Profile) — “In game”, AFK, etc.
Handshake Ed25519 signed announce + TCP mesh handshake (0.5+); VPN/Tailscale IP routes update discovery; block list enforced in main
Shortcuts In-window + system-wide (Alt+1–4, tray-safe)
Languages Full English / Russian UI (including group call chrome and badges)
Settings Profile, privacy/block list, appearance, network, shortcuts, call devices, transfers
Window Custom title bar, system tray / menu bar, close-to-tray, launch at login (Windows / macOS 12+ / Linux — see docs/PACKAGING.md)
Updates Auto-check on startup (Setup / AppImage / mac zip feeds — see docs/PACKAGING.md)
MESH+ Optional test tier — extra customization, early features, profile badge; keys free from the author (details)

MESH+

MESH+ is a test subscription the author uses to learn how to ship a license-checked desktop app (offline key, author verification). Keys are issued personally, free of charge — email blipteam@icloud.com. Paste your BLIP-XXXX-… key in Settings → MESH+.

Today Subscribers get new features first while they are tested on the LAN
Later Planned to move today’s MESH+ features into FREE for everyone
Always Extra customization (themes, sounds, icons, status GIF, Signal Corps tools) and a MESH+ badge on your profile
Category Examples
Look & feel Animated backgrounds Ember / Rift, Wire / Static FX, Beacon / Chime melodies, custom #RRGGBB accent, six mesh app icons
Profile Status GIF cloud visible to peers on the LAN
Signal Corps Board (kanban), Canvas (32×16), Pad snapshots, Clipboard 500 entries + search
Social MESH+ badge on peers; themed chat export (PDF/HTML)

FREE keeps chat, voice/video, groups (beta), Pad, Mesh Pulse, core themes, and Clipboard (20 entries). Full list: docs/MESH-PLUS.md.

Signal Corps — the must-have mesh workspace

Signal Corps is BLIP’s flagship feature for anyone who builds on the LAN: a dedicated PROJECTS section (enable in Settings → Developer) that is not tied to groups — groups stay experimental; Signal Corps is the stable war room.

Why it matters What you get
Pair programming without the cloud Shared Pad — one notepad synced over TCP to every online peer on your mesh (LWW, 300 ms debounce); MESH+ pad snapshots with restore.
Built for dev crews ✦ Pad · ▦ Board (kanban, RMB on cards) · ◻ Canvas (32×16, brush/fill, palette) · ⧉ Clipboard (enable in Settings → Network). Board/Canvas/500-clip search need MESH+.
LAN-native Same philosophy as BLIP chat and calls — no servers, no accounts, no upload to someone else’s SaaS.
Off until you opt in Hidden by default; flip Projects in Developer and PROJECTS appears in the nav.

If you ship one BLIP feature to your squad this quarter, make it Signal Corps.

Architecture

flowchart LR
  subgraph Electron Main
    UDP[UDP Discovery :42069]
    TCP[TCP Server :42070]
    MDNS[mDNS]
    IPC[IPC Bridge]
  end

  subgraph Renderer
    UI[Vanilla JS UI]
    RTC[WebRTC]
    AUDIO[Web Audio]
  end

  UDP --> IPC
  TCP --> IPC
  MDNS --> UDP
  IPC <--> UI
  UI --> RTC
  TCP -. signaling .-> RTC
Loading
┌─────────────────────────────────────────────────────────┐
│  BLIP ID Grid 8×8          Peers          Chat / Call   │
│  ┌─┬─┬─┬─┬─┬─┬─┬─┐         #17 Online      ┌──────────┐ │
│  │1│2│3│…│ │ │ │64│  ──►   #42 Offline ──► │ messages │ │
│  └─┴─┴─┴─┴─┴─┴─┴─┘                         └──────────┘ │
└─────────────────────────────────────────────────────────┘

Stack

Layer Technology
Shell Electron 35
Bundler Vite 6
UI Vanilla JS + CSS
Discovery dgram + multicast-dns
Media WebRTC (RTCPeerConnection)
Fonts Minecraft (bundled woff2)

Quick start

Requirements

Node.js 20+ (see .nvmrc)
OS Windows 10/11, macOS 12+, Linux (packaging — docs/PACKAGING.md)
Network Same LAN / VPN (Hamachi, Radmin)

Install

git clone https://github.com/krwg/blip.git
cd blip
npm install

postinstall copies the Minecraft font into renderer/assets/fonts/.

Development (hot-reload)

npm run electron:dev

Vite at http://localhost:5173 + Electron.

Run locally

npm run build
npx electron .

Or npm start (runs prebuild automatically).

Desktop builds

Icons: root icon.svgnpm run build:iconsbuild/icon.ico / PNG (+ DMG background). Full matrix: docs/PACKAGING.md.

Command Output
npm run electron:build Windows NSIS Setup
npm run electron:build:portable Windows portable
npm run electron:build:win Setup + portable + latest.yml
npm run electron:build:mac macOS 12+ DMG + zip (build on macOS)
npm run electron:build:linux Linux AppImage + deb
npm run electron:publish:win / :mac / :linux Build + upload to GitHub Releases (GH_TOKEN)
npm run electron:build:dir dist-electron/win-unpacked/BLIP.exe (debug folder)
  • Windows NSIS: language → welcome → network tips → GPL → install folder → finish. Uninstaller can wipe %APPDATA%\BLIP.
  • macOS DMG: styled background, drag to Applications; Gatekeeper / notarization notes in PACKAGING.
  • Linux: AppImage (portable) + deb.

npm scripts

Script Purpose
npm run dev Vite dev server only
npm run build Build renderer → dist/
npm start prebuild + Electron
npm run electron:dev Vite + Electron
npm run build:icons icon.svg → icons + DMG background
npm run electron:build Windows NSIS installer
npm run electron:build:portable Windows portable .exe
npm run electron:build:win Windows Setup + portable + latest.yml
npm run electron:build:mac macOS 12+ DMG + zip
npm run electron:build:linux Linux AppImage + deb
npm run electron:publish:win / :mac / :linux Build + publish to GitHub (GH_TOKEN)
npm run release:assets List files to attach to a manual release
npm run electron:build:dir Unpacked app folder
npm run copy-fonts Copy Minecraft font from npm package

Ports & protocols

Port Protocol Purpose
42069 UDP Announce: blipId, displayName, ip
42070 TCP Messages + WebRTC signaling
UDP announce example
{
  "type": "announce",
  "blipId": 17,
  "displayName": "Cyber",
  "ip": "192.168.1.42"
}

Usage

  1. Launch BLIP on each machine on the same network (or VPN such as Hamachi / Radmin).
  2. Pick a free number on the 8×8 grid.
  3. Open SETTINGS: display name, EN / RU, themes, notifications, audio devices.
  4. DIAL — enter a BLIP ID (centered); MESSAGE opens chat, CALL starts a voice call.
  5. PEERS — online list with Mesh Pulse latency (auto refresh every minute); click to chat; right-click for Mesh label, ping, block.
  6. CHAT — typing indicator when the peer composes; unread badge on the nav until you open the thread; Ctrl+F search in the open thread; hub shows GRP / VOICE for groups.
  7. Groups — open a group from the chat hub: text channels + voice channels (join/leave in the main window, mute/deafen/share). GRP CALL opens the legacy Group call window (separate mesh call); ongoing group calls show a join bar in the hub.
  8. Calls (1:1) — separate window: M mute, D deafen, S screen share, F fullscreen, Esc hang up.
  9. Profile — upload an avatar; peers on the LAN receive it automatically. Settings → System — optional launch at login / close-to-tray (platform notes in docs/PACKAGING.md).

Open firewall ports 42069–42070 only if peers are not discovered.

Keyboard shortcuts

Scope Keys Action
Main (in window) Alt+1–4 Dial / Peers / Chat / Settings
Main Ctrl+, Settings
Main Ctrl+F Focus chat search (open conversation)
Main (system, optional) Same as above + Ctrl+Shift+D (DND), Ctrl+Shift+End (hang up) Works from tray — toggle in Settings → Shortcuts
Call window M / D / S / F Mute / deafen / screen share / fullscreen
Call window (1:1 or group) Enter Accept incoming call (1:1) / group invite
Call window Esc End / leave call
Group call window Title bar — □ × Minimize / maximize / close (close leaves the call)

Fonts

Font Used for Files
Minecraft UI, buttons, headings renderer/assets/fonts/minecraft.woff2
Minecraft Chat (as typed) same face
Fallback monospace / DOS VGA if woff2 is missing

Source: typeface-minecraft (MIT).
Re-copy manually: npm run copy-fonts.

Project layout

blip/
├── main/              # Electron: discovery, TCP, tray, window routing
├── renderer/          # UI, chat, call, group-call, i18n, styles
│   ├── call-window.html / group-call-window.html  # separate BrowserWindows
│   ├── group-call-roster.js · group-call-client.js
│   └── assets/fonts/  # Minecraft woff2/ttf
├── docs/              # ARCHITECTURE.md + GitHub Pages landing
├── build/             # icon.ico, icon.png (generated)
├── app-metadata.json  # version 2.0.0, codename Morse
├── docs/MESH-PLUS.md  # MESH+ feature list
├── ach-icons/         # achievement SVGs (bundled in renderer)
├── preload.cjs        # IPC bridge
├── scripts/           # electron-dev, copy-fonts, build-icons, sync metadata
├── icon.svg           # source app icon
└── dist/              # Vite output (after npm run build)

Design tokens

Token Value
Background #0a0a0a
Glass rgba(20,20,20,0.7) + blur(12px)
Accent #00ffc8
Danger #ff3366
Muted #333333
Borders 2px solid
Radius 0 everywhere

Community

Doc Purpose
CONTRIBUTING.md Setup, dev workflow, PR expectations
CODE_OF_CONDUCT.md Community standards
SECURITY.md Reporting vulnerabilities
CHANGELOG.md Release history
docs/MESH-PLUS.md MESH+ tier — what’s included
docs/ARCHITECTURE.md Technical map
docs/ROADMAP-2.0-MORSE.md 2.0.0 Morse development line
docs/ROADMAP-1.1-BEACON.md 1.1.0 Beacon scope (shipped)
docs/release-notes-v1.1.1-github.md GitHub Release body (1.1.1, last published)
Landing site (Pages) Static showcase (docs/index.html)

Troubleshooting

Peers not visible

  1. Confirm both PCs are on the same subnet (or the same Hamachi / Radmin / Tailscale network).
  2. Allow UDP 42069 and TCP 42070 in the firewall (Windows: Start → Windows Defender Firewall → Allow an app).
  3. Do not run two BLIP windows on one PC — ports collide; use a VM or a second device.
  4. If you are not using a mesh VPN, try disabling unrelated VPN clients that isolate broadcast.

Call does not connect

  1. By default BLIP WebRTC uses host candidates only (STUN/TURN off) — same L2 / VPN segment required.
  2. On Tailscale or multi-subnet VPN: Settings → Network → STUN / TURN, enable, and add stun: / turn: lines; start a new call after saving.
  3. Check that no corporate firewall blocks peer-to-peer UDP between the devices.
  4. Retry after both peers show online in Peers with a fresh Mesh Pulse latency.
  5. Toast shows Error NNN only — look up the number below (dev builds also print [BLIP ENNN/…] in the terminal).

Error codes

UI shows the number only. Full text is logged in the main-process terminal on a dev build ([BLIP E117/SOCKET_CLOSED_REMOTE_EOF] …). Source of truth: shared/blip-errors.js.

Code Id Meaning
0 OK Success
100 PEER_NOT_FOUND No online peer with that blipId in discovery
101 PEER_OFFLINE Peer row exists but online=false
102 CONNECT_TIMEOUT Outbound TCP connect timed out
103 CONNECT_FAILED TCP connect error (refused / reset / unreachable)
104 SOCKET_CLOSED Umbrella (legacy); prefer 117–129
105 HANDSHAKE_TIMEOUT No mesh-handshake-ack in time
106 HANDSHAKE_INVALID_ACK Ack failed signature / fields
107 HANDSHAKE_PUBKEY_MISMATCH TOFU key mismatch without verified announce rebind
108 HANDSHAKE_REJECTED Peer rejected / destroyed handshake
109 HANDSHAKE_PEER_CLOSED Peer closed during handshake → plaintext retry when allowed
110 COMPAT_PLAINTEXT Plaintext compat session (legacy / consent path)
111 UNENCRYPTED_DISABLED “Allow older BLIP versions” is off
112 PEER_BLOCKED Local block list
113 INVALID_PEER_ID Bad call peerId payload
114 COMPAT_RECONNECT_FAILED Second connect after peer-close failed
115 HANDSHAKE_SEND_FAILED Could not write / build handshake frame
116 SESSION_MISSING No mesh session after failure
117 SOCKET_CLOSED_REMOTE_EOF Peer FIN/RST with no local destroy tag
118 SOCKET_CLOSED_AFTER_ERROR Close after socket error event
119 SOCKET_CLOSED_LINE_TOO_LARGE Framing overflow; local destroy
120 SOCKET_CLOSED_MESH_CRYPTO AES / envelope mismatch; local destroy
121 SOCKET_CLOSED_HANDSHAKE_BAD Inbound handshake failed verify
122 SOCKET_CLOSED_PEER_BLOCKED Handshake from blocked peer
123 SOCKET_CLOSED_AUTH_GATE App frame before auth on inbound TCP
124 SOCKET_CLOSED_LOCAL_TIMEOUT We destroyed after handshake timeout
125 SOCKET_ERROR net.Socket error event
126 ENSURE_HANDSHAKE_FAILED ensurePeerSocket handshake stage failed
127 ENSURE_COMPAT_RETRY Retrying fresh plaintext session
128 SOCKET_CLOSED_BEFORE_WRITE Dead before handshake write
129 SOCKET_CLOSED_DURING_WAIT Closed while waiting for ack
130 PEER_CLASSIFIED_MODERN Dial log: treated as Morse encrypted
131 PEER_CLASSIFIED_LEGACY Dial log: treated as legacy/compat
200 CALL_OPEN_FAILED Outgoing call open failed
201 CALL_SIGNAL_FAILED Call signalling TCP write failed
202 CALL_PEER_UNREACHABLE Peer not online when starting call
203 CALL_ENSURE_FAILED Call blocked at ensurePeerSocket
999 UNKNOWN Unclassified — see terminal log

Cross-version calls (Morse → 1.1.x): keep Settings → Network → Allow older BLIP versions on. On any close-family failure Morse retries plaintext once. Watch the terminal for E130/MODERN vs E131/LEGACY and the nested cause under E109 / E117E129.

File transfer fails

  1. Check Settings → Network size limit (1–100 GB).
  2. Receiver must be online and not blocked under Privacy.
  3. For BEACON seeds, confirm the publisher is still seeding and the blip://seed/… link is intact.

Clipboard sync

LAN clipboard sync can forward secrets (passwords, tokens). Keep it off unless you need it; prefer trusted peers / active chat only, and treat the channel as shared with everyone who can see your mesh.

License

This project is licensed under GNU GPL v3krwg.

The Minecraft font is licensed separately under MIT (see renderer/assets/fonts/README.md).


Русский

Ты в сети. Ты сигнал.

Тестирование на одном ПК

Способ Чат / звонки?
Два окна BLIP на одном ПК Нет — порты 42069 (UDP) и 42070 (TCP) заняты; второй экземпляр не поднимется или не увидит первого.
Виртуальная машина (VirtualBox / Hyper-V, сеть bridged) Да — у гостя свой IP; BLIP в VM + на хосте.
Второе устройство в той же Wi‑Fi Да — лучший вариант.
Hamachi / Radmin VPN на двух машинах Да — как LAN.
Телефон Мобильного клиента пока нет.

Кратко: хост BLIP ID 1, в VM BLIP ID 2, одна подсеть, firewall открыт для 42069–42070.

Обзор

Что это Desktop-приложение: текст, голос и видео по LAN / Hamachi / Radmin VPN
Релиз 2.0.0 — Morse (в разработке; см. CHANGELOG.md; последний опубликованный: 1.1.1 Beacon)
Идентификация BLIP ID 1–64 (сетка 8×8)
Серверы Нет — только UDP broadcast, TCP и WebRTC между пирами
Регистрация Нет
Стиль UI Pixel-art × liquid glass × brutalism, 0px border-radius

Возможности

Функция Описание
BLIP ID Выбор номера на сетке 8×8, конфликты через TCP ping
Discovery UDP 42069 + mDNS fallback
Чат TCP: доставка/прочтение (✓/✓✓), реакции, фото по LAN, ссылки, эмодзи, Ctrl+F поиск, экспорт, «печатает…», непрочитанное
Группы Групповой чат (бета), имя и аватар, голосовые каналы в community view (релей хоста); синхронизация аватарки по LAN; отдельное окно группового звонка
Избранное Звёздочка в меню абонента; сортировка вверху на Peers и в Chat
Статус В сети / Отошёл / Занят в профиле (UDP announce)
Звонки Отдельные окна 1:1 и группового звонка; WebRTC (LAN, без STUN/TURN)
Демонстрация экрана Захват 720p+, theater, полный экран (F), качество потока/экрана в настройках
Mesh Pulse Живой пульс LAN: автопинг раз в минуту, задержка под каждым абонентом
Доверие и блок Подтверждение первого чата; локальный блок; Настройки → Конфиденциальность
Аватары Авто-генерация 8×8 от BLIP ID; кнопка «Новый аватар» в настройках
Темы Светлые/тёмные палитры и анимированные фоны (названия EN/RU)
Звук Chiptune (Web Audio): наборы СИГНАЛ / ПУЛЬС, мелодии MESH / СЕТКА; прослушивание в Настройки → Звук; DND отключает
Файлы P2P в чате (лимит 1–100 ГБ в настройках, чанки); drag & drop; в группе ≤768 КБ inline + чанки всем
МАЯК (BEACON) Меш-библиотека файлов в LAN: сиды, мульти-загрузка, пауза/стоп раздачи, blip://seed/…, дескрипторы .blip, хаб передач
Буфер обмена Синхронизация по LAN — Настройки → Сеть (выкл / активный чат / доверенные)
Статус-текст Своя строка в LAN (Профиль) — «в игре», AFK и т.д.
Handshake Подписанный announce + TCP mesh-handshake (0.5+); IP VPN/Tailscale обновляет discovery; блокировка в main
Горячие клавиши В окне + системные (Alt+1–4, из трея)
Языки Полный интерфейс EN / RU (включая групповой звонок и бейджи)
Настройки Профиль, конфиденциальность/блок, вид, сеть, горячие клавиши, звонок, передачи
Окно Свой title bar, трей / строка меню, в трей, автозапуск при входе (Windows / macOS 12+ / Linux — docs/PACKAGING.md)
Обновления Автопроверка при запуске (установщик Setup; на GitHub нужен latest.yml — см. CONTRIBUTING.md)
MESH+ Тестовая подписка — кастомизация, ранний доступ к фичам, бейдж; ключи бесплатно от автора (подробнее)

MESH+

MESH+тестовая подписка: автор отрабатывает лицензионное приложение с офлайн-проверкой ключа. Ключи выдаются лично, бесплатно — пишите на blipteam@icloud.com. Ключ BLIP-XXXX-… в Настройки → MESH+.

Сейчас Подписчики первыми получают новые фичи на время теста в LAN
Потом Планируется перенести всё из MESH+ в бесплатный уровень
Всегда Расширенная кастомизация и бейдж MESH+ в профиле
Категория Примеры
Оформление Фоны Ember / Rift, FX Wire / Static, мелодии Beacon / Chime, свой акцент #RRGGBB, иконки mesh-1…6
Профиль Гифка статуса в облачке для пиров в LAN
Сигнал Корпс Доска, Холст, снимки блокнота, буфер 500 + поиск
Соц. Бейдж MESH+ у пиров; экспорт чата с темой BLIP

FREE: чат, звонки, группы (бета), блокнот, Mesh Pulse, базовые темы, буфер (20 записей). Полный список: docs/MESH-PLUS.md.

Сигнал Корпс — главная фича для разработки в МЕШе

Сигнал Корпс — флагман BLIP для команд на ЛАН: отдельный раздел ПРОЕКТЫ (Настройки → Разработчик), без привязки к группам. Группы остаются бета; рабочий стол для девов — здесь.

Зачем Что внутри
Парное кодирование без облака Блокнот — общие заметки по TCP всем онлайн-абонентам; снимки и откат (МЭШ+).
Инструменты в стиле BLIP ✦ Блокнот · ▦ Доска (ПКМ по карточкам) · ◻ Холст (кисть/заливка) · ⧉ Буфер (вкл. в Настройки → Сеть). Доска/холст/поиск в буфере — МЭШ+.
Только ЛАН Как чат и звонки — без серверов и чужих аккаунтов.
Вкл. по желанию По умолчанию скрыто; переключатель Проекты в Разработчике — пункт ПРОЕКТЫ в меню.

Если внедрять одну фичу BLIP в команду — начните с Сигнал Корпс.

Архитектура

См. диаграмму выше — та же схема для обоих языков.

Стек

Слой Технология
Shell Electron 35
Bundler Vite 6
UI Vanilla JS + CSS
Discovery dgram + multicast-dns
Media WebRTC (RTCPeerConnection)
Fonts Minecraft (bundled woff2)

Быстрый старт

Требования

Node.js 20+ (see .nvmrc)
ОС Windows 10/11, macOS 12+, Linux (сборка — docs/PACKAGING.md)
Сеть Одна LAN / VPN (Hamachi, Radmin)

Установка

git clone https://github.com/krwg/blip.git
cd blip
npm install

postinstall копирует шрифт Minecraft в renderer/assets/fonts/.

Разработка (hot-reload)

npm run electron:dev

Vite → http://localhost:5173 + Electron.

Локальный запуск

npm run build
npx electron .

или npm start (сборка через prebuild).

Сборка desktop

Иконка: корневой icon.svgnpm run build:iconsbuild/icon.ico / PNG (+ фон DMG). Матрица: docs/PACKAGING.md.

Команда Результат
npm run electron:build Windows NSIS Setup
npm run electron:build:portable Windows portable
npm run electron:build:win Setup + portable + latest.yml
npm run electron:build:mac macOS 12+ DMG + zip (сборка на macOS)
npm run electron:build:linux Linux AppImage + deb
npm run electron:publish:win / :mac / :linux Сборка + выкладка на GitHub Releases (GH_TOKEN)
npm run electron:build:dir dist-electron/win-unpacked/BLIP.exe
  • Windows NSIS: язык → приветствие → сеть → GPL → папка → финиш. Удаление может стереть %APPDATA%\BLIP.
  • macOS DMG: стилизованный фон, перенос в Applications; Gatekeeper / нотаризация — в PACKAGING.
  • Linux: AppImage + deb.

Скрипты npm

Скрипт Назначение
npm run dev Только Vite dev-server
npm run build Сборка renderer → dist/
npm start prebuild + Electron
npm run electron:dev Vite + Electron
npm run build:icons icon.svg → иконки + фон DMG
npm run electron:build Windows NSIS
npm run electron:build:portable Windows portable .exe
npm run electron:build:win Windows Setup + portable + latest.yml
npm run electron:build:mac macOS 12+ DMG + zip
npm run electron:build:linux Linux AppImage + deb
npm run electron:publish:win / :mac / :linux Сборка + публикация на GitHub (GH_TOKEN)
npm run release:assets Список файлов для ручного релиза
npm run electron:build:dir Распакованная папка
npm run copy-fonts Скопировать Minecraft из npm-пакета

Порты и протоколы

Порт Протокол Назначение
42069 UDP Announce: blipId, displayName, ip
42070 TCP Сообщения + WebRTC signaling
Пример UDP announce
{
  "type": "announce",
  "blipId": 17,
  "displayName": "Cyber",
  "ip": "192.168.1.42"
}

Использование

  1. Запустите BLIP на каждом ПК в одной сети (или VPN: Hamachi / Radmin).
  2. Выберите свободный номер на сетке 8×8.
  3. НАСТРОЙКИ: имя, EN / RU, темы, уведомления, устройства звука.
  4. НАБОР — введите BLIP ID (по центру); СООБЩЕНИЕ — чат, ЗВОНОК — голосовой звонок.
  5. АБОНЕНТЫ — список в сети, Пульс · N мс (автораз в минуту); клик — чат; ПКМ — Mesh label, пинг, блок.
  6. ЧАТ — «печатает…»; непрочитанное на Чат; Ctrl+F — поиск в открытом чате; в hub — ГРП / ГОЛОС у групп.
  7. Группы — из hub: текстовые и голосовые каналы (вход/выход в главном окне, mute/deafen/экран). ГРП ЗВОНОК — legacy-окно Групповой звонок; активный звонок — полоса «войти» в hub.
  8. Звонок 1:1 — отдельное окно: M / D / S / F / Esc.
  9. Профиль — аватар уходит абонентам по LAN. Настройки → Системаавтозапуск / в трей (заметки по ОС — docs/PACKAGING.md).

Откройте порты 42069–42070 в firewall, только если пиры не видны.

Горячие клавиши

Область Клавиши Действие
Главное окно Alt+1–4 Набор / Абоненты / Чат / Настройки
Главное Ctrl+, Настройки
Главное Ctrl+F Поиск в открытом чате
Системные (опц.) То же + Ctrl+Shift+D (не беспокоить), Ctrl+Shift+End (сброс звонка) Из трея — в Настройки → Горячие клавиши
Окно звонка M / D / S / F Микрофон / звук / экран / полный экран
Окно звонка (1:1 или группа) Enter Принять (1:1) / приглашение в группу
Окно звонка Esc Сброс / выход из группового
Групповой звонок — □ × в title bar Свернуть / развернуть / закрыть (закрытие = выход)

Шрифты

Шрифт Где Файлы
Minecraft Весь UI renderer/assets/fonts/minecraft.woff2
Minecraft Чат тот же face
Fallback monospace если woff2 недоступен

Источник: typeface-minecraft (MIT).
Перекопировать: npm run copy-fonts.

Структура проекта

blip/
├── main/              # Electron: discovery, TCP, tray, маршрутизация окон
├── renderer/          # UI, chat, call, group-call, i18n, styles
│   ├── call-window.html / group-call-window.html
│   ├── group-call-roster.js · group-call-client.js
│   └── assets/fonts/
├── docs/              # ARCHITECTURE.md + лендинг Pages
├── app-metadata.json  # version 2.0.0, codename Morse
├── build/ · preload.cjs · scripts/ · icon.svg · dist/

Дизайн-система

Токен Значение
Background #0a0a0a
Glass rgba(20,20,20,0.7) + blur(12px)
Accent #00ffc8
Danger #ff3366
Muted #333333
Borders 2px solid
Radius 0 (везде)

Сообщество

Документ Зачем
CONTRIBUTING.md Сборка, dev, правила PR
CODE_OF_CONDUCT.md Правила сообщества
SECURITY.md Как сообщить об уязвимости
CHANGELOG.md История версий
docs/ARCHITECTURE.md Архитектура кода
docs/ROADMAP-2.0-MORSE.md Линия разработки 2.0.0 Morse
docs/ROADMAP-1.1-BEACON.md Скоуп 1.1.0 Beacon (выпущен)
docs/release-notes-v1.1.1-github.md Текст GitHub Release (1.1.1, последний опубликованный)
Landing (Pages) Статический сайт-витрина (docs/index.html)

Устранение неполадок

Пиры не видны

  1. Оба ПК в одной подсети (или в одной сети Hamachi / Radmin / Tailscale).
  2. Откройте порты UDP 42069 и TCP 42070 в брандмауэре (Пуск → Брандмауэр Windows → Разрешить приложение).
  3. Не запускайте два окна BLIP на одном ПК — порты заняты; используйте VM или второе устройство.
  4. Если mesh-VPN не нужен — отключите посторонние VPN, которые режут broadcast.

Звонок не устанавливается

  1. По умолчанию WebRTC — только host-кандидаты (STUN/TURN выкл): нужна одна L2 / VPN-сегмент.
  2. Tailscale или разные подсети: Настройки → Сеть → STUN / TURN, включите и добавьте строки stun: / turn:; начните новый звонок после сохранения.
  3. Проверьте, что корпоративный firewall не блокирует P2P UDP между устройствами.
  4. Убедитесь, что оба пира online в Абоненты и есть свежий Mesh Pulse.
  5. В тосте только Ошибка NNN — расшифровка ниже (в дев-сборке детали в терминале: [BLIP ENNN/…]).

Коды ошибок

В клиенте показывается только номер. Полный текст — в терминале main-процесса на дев-сборке. Каталог: shared/blip-errors.js.

Код Id Смысл
0 OK Успех
100 PEER_NOT_FOUND Нет online-пира с таким номером в discovery
101 PEER_OFFLINE Пир есть, но online=false
102 CONNECT_TIMEOUT Таймаут исходящего TCP
103 CONNECT_FAILED Ошибка TCP (refuse / reset / unreachable)
104 SOCKET_CLOSED Зонтик (legacy); смотри 117–129
105 HANDSHAKE_TIMEOUT Нет mesh-handshake-ack вовремя
106 HANDSHAKE_INVALID_ACK Ack не прошёл проверку
107 HANDSHAKE_PUBKEY_MISMATCH TOFU: ключ не совпал и announce не дал rebind
108 HANDSHAKE_REJECTED Пир отклонил / разорвал handshake
109 HANDSHAKE_PEER_CLOSED Пир закрыл TCP на handshake → plaintext retry
110 COMPAT_PLAINTEXT Plaintext compat-сессия (legacy / согласие)
111 UNENCRYPTED_DISABLED Выкл. «Разрешить старые версии BLIP»
112 PEER_BLOCKED Локальный блок
113 INVALID_PEER_ID Некорректный peerId в вызове
114 COMPAT_RECONNECT_FAILED Второй connect после peer-close не удался
115 HANDSHAKE_SEND_FAILED Не удалось собрать / отправить handshake
116 SESSION_MISSING Нет mesh-сессии после ошибки
117 SOCKET_CLOSED_REMOTE_EOF Пир закрыл TCP (FIN/RST) без локального тега
118 SOCKET_CLOSED_AFTER_ERROR Close после socket error
119 SOCKET_CLOSED_LINE_TOO_LARGE Слишком длинная TCP-строка
120 SOCKET_CLOSED_MESH_CRYPTO Ошибка AES / envelope
121 SOCKET_CLOSED_HANDSHAKE_BAD Входящий handshake не прошёл verify
122 SOCKET_CLOSED_PEER_BLOCKED Handshake от заблокированного
123 SOCKET_CLOSED_AUTH_GATE Кадр до auth на inbound TCP
124 SOCKET_CLOSED_LOCAL_TIMEOUT Мы закрыли по handshake timeout
125 SOCKET_ERROR Событие error у net.Socket
126 ENSURE_HANDSHAKE_FAILED Падение стадии handshake в ensurePeerSocket
127 ENSURE_COMPAT_RETRY Повтор plaintext-сессии
128 SOCKET_CLOSED_BEFORE_WRITE Сокет умер до записи handshake
129 SOCKET_CLOSED_DURING_WAIT Закрыт в ожидании ack
130 PEER_CLASSIFIED_MODERN Лог: пир как Morse (encrypt)
131 PEER_CLASSIFIED_LEGACY Лог: пир как legacy/compat
200 CALL_OPEN_FAILED Не открылся исходящий звонок
201 CALL_SIGNAL_FAILED Сбой TCP signalling звонка
202 CALL_PEER_UNREACHABLE Пир не online при старте звонка
203 CALL_ENSURE_FAILED Звонок упал на ensurePeerSocket
999 UNKNOWN Не классифицировано — смотри лог терминала

Звонки Morse → 1.1.x: держите Настройки → Сеть → Разрешить старые версии BLIP включённым. При любом close-family Morse один раз ретраит plaintext. В терминале смотри E130/MODERN vs E131/LEGACY и nested cause у E109 / E117E129.

Файл не передаётся

  1. Проверьте лимит в Настройки → Сеть (1–100 ГБ).
  2. Получатель должен быть online и не в блоке (Конфиденциальность).
  3. Для сидов BEACON — раздающий ещё сидит, ссылка blip://seed/… цела.

Синхронизация буфера обмена

По LAN можно утащить пароли и токены. Держите опцию выкл, пока она реально не нужна; лучше режим «доверенные» / активный чат — считайте канал общим для всей вашей mesh-сети.

Лицензия

Проект распространяется под GNU GPL v3krwg.

Шрифт Minecraft — отдельно, MIT (см. renderer/assets/fonts/README.md).


BLIP · local-only · peer-to-peer · 1–64

English · Русский

About

BLIP - peer-to-peer LAN messenger for local networks, Hamachi, and Radmin VPN. Text, voice, video, screen share, and file transfer with no cloud, no servers, and no accounts. Electron + WebRTC. GPL-3.0.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages