| 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 | Коды ошибок |
| 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.
| 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 |
| 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+ 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 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.
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
┌─────────────────────────────────────────────────────────┐
│ BLIP ID Grid 8×8 Peers Chat / Call │
│ ┌─┬─┬─┬─┬─┬─┬─┬─┐ #17 Online ┌──────────┐ │
│ │1│2│3│…│ │ │ │64│ ──► #42 Offline ──► │ messages │ │
│ └─┴─┴─┴─┴─┴─┴─┴─┘ └──────────┘ │
└─────────────────────────────────────────────────────────┘
| Layer | Technology |
|---|---|
| Shell | Electron 35 |
| Bundler | Vite 6 |
| UI | Vanilla JS + CSS |
| Discovery | dgram + multicast-dns |
| Media | WebRTC (RTCPeerConnection) |
| Fonts | Minecraft (bundled woff2) |
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 installpostinstall copies the Minecraft font into renderer/assets/fonts/.
Development (hot-reload)
npm run electron:devVite at http://localhost:5173 + Electron.
Run locally
npm run build
npx electron .Or npm start (runs prebuild automatically).
Desktop builds
Icons: root icon.svg → npm run build:icons → build/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.
| 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 |
| 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"
}- Launch BLIP on each machine on the same network (or VPN such as Hamachi / Radmin).
- Pick a free number on the 8×8 grid.
- Open SETTINGS: display name, EN / RU, themes, notifications, audio devices.
- DIAL — enter a BLIP ID (centered); MESSAGE opens chat, CALL starts a voice call.
- PEERS — online list with Mesh Pulse latency (auto refresh every minute); click to chat; right-click for Mesh label, ping, block.
- 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.
- 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.
- Calls (1:1) — separate window: M mute, D deafen, S screen share, F fullscreen, Esc hang up.
- 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.
| 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) |
| 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.
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)
| 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 |
| 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) |
- Confirm both PCs are on the same subnet (or the same Hamachi / Radmin / Tailscale network).
- Allow UDP 42069 and TCP 42070 in the firewall (Windows: Start → Windows Defender Firewall → Allow an app).
- Do not run two BLIP windows on one PC — ports collide; use a VM or a second device.
- If you are not using a mesh VPN, try disabling unrelated VPN clients that isolate broadcast.
- By default BLIP WebRTC uses host candidates only (STUN/TURN off) — same L2 / VPN segment required.
- On Tailscale or multi-subnet VPN: Settings → Network → STUN / TURN, enable, and add
stun:/turn:lines; start a new call after saving. - Check that no corporate firewall blocks peer-to-peer UDP between the devices.
- Retry after both peers show online in Peers with a fresh Mesh Pulse latency.
- Toast shows Error NNN only — look up the number below (dev builds also print
[BLIP ENNN/…]in the terminal).
- Elevated apps — capturing a window that runs as Administrator usually fails when BLIP itself is not elevated. Run BLIP as admin only if you must share those windows, or share the full screen instead.
- DRM / protected content — Netflix, some games, and other protected video surfaces may show a black frame. This is an OS/DRM restriction, not a BLIP bug.
- WSL / remote desktops — sources under WSL GUI or nested RDP sessions may be missing or blank in the picker. Prefer a normal desktop session.
- If the picker is empty or capture fails, the toast shows codes 300–304 (see table below). Retry the picker after closing other capture apps.
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 |
| 300 | CAPTURE_NO_SOURCE |
No screen/window id for capture |
| 301 | CAPTURE_GETUSERMEDIA_FAILED |
Desktop getUserMedia rejected |
| 302 | CAPTURE_SOURCE_NOT_FOUND |
Selected source disappeared |
| 303 | CAPTURE_LIST_SOURCES_FAILED |
desktopCapturer.getSources failed |
| 304 | CAPTURE_PICKER_EMPTY |
No shareable screens/windows |
| 310 | OVERLAY_PUSH_FAILED |
Overlay HUD update failed |
| 311 | PRESENCE_DETECT_FAILED |
Foreground presence probe failed |
| 312 | OVERLAY_WINDOW_FAILED |
Overlay window create/show failed |
| 320 | BOOT_PRELOAD_MISSING |
Renderer missing preload bridge |
| 321 | BOOT_INIT_FAILED |
Renderer boot threw |
| 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 / E117–E129.
- Check Settings → Network size limit (1–100 GB).
- Receiver must be online and not blocked under Privacy.
- For BEACON seeds, confirm the publisher is still seeding and the
blip://seed/…link is intact.
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.
This project is licensed under GNU GPL v3 — krwg.
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+ — тестовая подписка: автор отрабатывает лицензионное приложение с офлайн-проверкой ключа. Ключи выдаются лично, бесплатно — пишите на 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 installpostinstall копирует шрифт Minecraft в renderer/assets/fonts/.
Разработка (hot-reload)
npm run electron:devVite → http://localhost:5173 + Electron.
Локальный запуск
npm run build
npx electron .или npm start (сборка через prebuild).
Сборка desktop
Иконка: корневой icon.svg → npm run build:icons → build/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 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"
}- Запустите BLIP на каждом ПК в одной сети (или VPN: Hamachi / Radmin).
- Выберите свободный номер на сетке 8×8.
- НАСТРОЙКИ: имя, EN / RU, темы, уведомления, устройства звука.
- НАБОР — введите BLIP ID (по центру); СООБЩЕНИЕ — чат, ЗВОНОК — голосовой звонок.
- АБОНЕНТЫ — список в сети, Пульс · N мс (автораз в минуту); клик — чат; ПКМ — Mesh label, пинг, блок.
- ЧАТ — «печатает…»; непрочитанное на Чат; Ctrl+F — поиск в открытом чате; в hub — ГРП / ГОЛОС у групп.
- Группы — из hub: текстовые и голосовые каналы (вход/выход в главном окне, mute/deafen/экран). ГРП ЗВОНОК — legacy-окно Групповой звонок; активный звонок — полоса «войти» в hub.
- Звонок 1:1 — отдельное окно: M / D / S / F / Esc.
- Профиль — аватар уходит абонентам по 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) |
- Оба ПК в одной подсети (или в одной сети Hamachi / Radmin / Tailscale).
- Откройте порты UDP 42069 и TCP 42070 в брандмауэре (Пуск → Брандмауэр Windows → Разрешить приложение).
- Не запускайте два окна BLIP на одном ПК — порты заняты; используйте VM или второе устройство.
- Если mesh-VPN не нужен — отключите посторонние VPN, которые режут broadcast.
- По умолчанию WebRTC — только host-кандидаты (STUN/TURN выкл): нужна одна L2 / VPN-сегмент.
- Tailscale или разные подсети: Настройки → Сеть → STUN / TURN, включите и добавьте строки
stun:/turn:; начните новый звонок после сохранения. - Проверьте, что корпоративный firewall не блокирует P2P UDP между устройствами.
- Убедитесь, что оба пира online в Абоненты и есть свежий Mesh Pulse.
- В тосте только Ошибка NNN — расшифровка ниже (в дев-сборке детали в терминале:
[BLIP ENNN/…]).
- Права администратора — окно, запущенное от имени администратора, часто не захватывается, если сам BLIP не elevated. Либо запусти BLIP от админа, либо шарь весь экран.
- DRM / защищённый контент — Netflix, часть игр и защищённое видео могут давать чёрный кадр. Это ограничение ОС/DRM.
- WSL / удалённый рабочий стол — источники WSL GUI или вложенного RDP могут отсутствовать или быть пустыми в пикере. Лучше обычный десктоп.
- Пустой пикер или сбой захвата — коды 300–304 в таблице ниже. Закрой другие приложения захвата и выбери источник снова.
В клиенте показывается только номер. Полный текст — в терминале 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 |
| 300 | CAPTURE_NO_SOURCE |
Нет id экрана/окна для захвата |
| 301 | CAPTURE_GETUSERMEDIA_FAILED |
Desktop getUserMedia отклонён |
| 302 | CAPTURE_SOURCE_NOT_FOUND |
Выбранный источник исчез |
| 303 | CAPTURE_LIST_SOURCES_FAILED |
Сбой desktopCapturer.getSources |
| 304 | CAPTURE_PICKER_EMPTY |
Нет экранов/окон для шаринга |
| 310 | OVERLAY_PUSH_FAILED |
Не удалось обновить overlay HUD |
| 311 | PRESENCE_DETECT_FAILED |
Сбой детекта foreground |
| 312 | OVERLAY_WINDOW_FAILED |
Не удалось создать/показать overlay |
| 320 | BOOT_PRELOAD_MISSING |
Нет preload-моста в renderer |
| 321 | BOOT_INIT_FAILED |
Сбой boot UI |
| 999 | UNKNOWN |
Не классифицировано — смотри лог терминала |
Звонки Morse → 1.1.x: держите Настройки → Сеть → Разрешить старые версии BLIP включённым. При любом close-family Morse один раз ретраит plaintext. В терминале смотри E130/MODERN vs E131/LEGACY и nested cause у E109 / E117–E129.
- Проверьте лимит в Настройки → Сеть (1–100 ГБ).
- Получатель должен быть online и не в блоке (Конфиденциальность).
- Для сидов BEACON — раздающий ещё сидит, ссылка
blip://seed/…цела.
По LAN можно утащить пароли и токены. Держите опцию выкл, пока она реально не нужна; лучше режим «доверенные» / активный чат — считайте канал общим для всей вашей mesh-сети.
Проект распространяется под GNU GPL v3 — krwg.
Шрифт Minecraft — отдельно, MIT (см. renderer/assets/fonts/README.md).