Skip to main content

syryn

syryn

Bluetooth identity beacon for headless Linux devices.

The name comes from Сирин — a bird from Slavic mythology known for its voice. Syryn speaks when asked: it listens on a Bluetooth RFCOMM channel and responds with the device's hostname, mDNS address, and active network interfaces.


What it does

Run syryn on a headless mini-PC. From any nearby Bluetooth device, send STATUS — and get back:

hostname: panteon-john
mdns: panteon-john.local
eth0: 192.168.0.131
wlan0: 192.168.1.44
external_ip: 93.12.34.56

No display needed. No SSH session. No prior knowledge of the IP address.

Zero-touch: the IP is the Bluetooth name

You don't even need a terminal app. While syryn runs, the device's Bluetooth name is its current IP:

P:192.168.0.131

Open the ordinary Bluetooth settings on any phone or laptop and read it from the scan list — no app, no pairing, no commands. The name follows the IP: when DHCP hands out a new address, the name changes within --interval seconds (default 15).

Where you look What you see How
Android — Settings → Bluetooth → pair new device P:192.168.0.131 classic BR/EDR name (adapter alias)
iPhone / iPad — Settings → Bluetooth P:192.168.0.131 BLE advertisement with the HID service UUID (iOS lists only "connectable kinds" of devices)
Windows 10/11 laptop nearby pop-up toast "New Bluetooth device found: P:192.168.0.131" Microsoft Swift Pair beacon
macOS / Linux — Bluetooth settings P:192.168.0.131 classic name / BLE

Notes:

  • The prefix is P by default (--prefix X to change, --prefix "" for the bare IP).
  • A BLE packet has room for ~15 name characters. If P: + a long IP (e.g. P:192.168.100.200) doesn't fit, the BLE name becomes the bare IP — never a truncated one. The classic name always has the full label.
  • The IP shown is the one on the LAN cable (wired Ethernet port: eth0, enp3s0, USB-Ethernet enx…) — Wi-Fi, docker/veth bridges and VPN tunnels are ignored. With no cable / no DHCP lease the name is P:no-lan. --iface auto uses the default-route interface instead (may be Wi-Fi); --iface wlan0 pins a specific one.
  • Devices you already paired with may cache the old name; unpaired scans show the current one.
  • Tapping the entry on iPhone/Windows tries to pair as a keyboard and fails harmlessly — you only need to read the name.
  • Swift Pair pop-up appears only when the laptop is close (Windows uses a signal-strength threshold) and Settings → Bluetooth → "Show notifications to connect using Swift Pair" is on (default).

One-line install (starts on every boot)

curl -fsSL https://raw.githubusercontent.com/szholobetsky/syryn/main/install.sh | sudo sh

Installs BlueZ + D-Bus bindings, puts syryn into /opt/syryn, and registers a systemd service. Do it once while you still have a screen or SSH; after that the device announces its IP by itself on every boot. Logs: journalctl -u syryn -f.

If syryn is already installed via pip/pipx:

sudo "$(command -v syryn)" install            # deps check + systemd unit + start
sudo "$(command -v syryn)" install --pin 1234 # flags are baked into the service
sudo "$(command -v syryn)" uninstall
syryn install --dry-run                       # preview, changes nothing

Install & quick start (manual)

1. System packages (one-time)

syryn uses the BlueZ D-Bus API directly — no PyBluez2 required.

Debian / Ubuntu / Xubuntu:

sudo apt install bluez python3-dbus python3-gi

Fedora / RHEL:

sudo dnf install bluez python3-dbus python3-gobject

2. Enable Bluetooth

sudo systemctl enable bluetooth --now   # start and enable on boot

rfkill list                             # check if adapter is blocked
sudo rfkill unblock bluetooth           # unblock if needed

bluetoothctl discoverable on            # make device visible

To keep the device permanently discoverable, add DiscoverableTimeout = 0 to /etc/bluetooth/main.conf and restart bluetooth.service.

3. Install syryn

syryn uses system D-Bus libraries. Install with --system-site-packages so pipx can find them:

pipx install syryn --system-site-packages

Or without pipx:

pip install syryn

4. Run

syryn               # auto-pairing, no PIN; name = P:<ip>
syryn --pin 1234    # hardcoded PIN for all incoming pairs
syryn -q            # quiet mode, no log output
syryn status        # print the STATUS text locally and exit
syryn --iface auto  # name from the default-route interface instead of the LAN cable
syryn --no-name     # keep the hostname as the Bluetooth name
syryn --no-ble      # classic Bluetooth only (no iPhone visibility, no Windows pop-up)
syryn --no-swiftpair

Syryn registers a Serial Port Profile (SPP) via BlueZ and a pairing agent so connecting devices are accepted automatically (no manual PIN prompt). The device name visible to other devices is P:<ip> while syryn runs; on exit it reverts to the system hostname (set via hostnamectl set-hostname <name>). With --no-name the hostname is kept all the time.

5. Connect from another device

From any device with a Bluetooth terminal app (e.g. Serial Bluetooth Terminal on Android):

  1. Scan for Bluetooth devices — the headless device appears as P:<ip> (or by hostname with --no-name)
  2. Pair (accepted automatically by syryn)
  3. Connect to the Syryn service (Serial Port)
  4. Send STATUS — receive hostname, mDNS, interfaces, external IP

Requirements

  • Linux with BlueZ (bluetoothd running)
  • Python 3.10+
  • python3-dbus + python3-gi (system packages) — BlueZ D-Bus interface and pairing agent
  • BLE name/pop-up: BlueZ 5.43+ with an LE-capable adapter (otherwise syryn falls back to the classic name only)
  • syryn install: systemd
  • psutil, requests (installed automatically via pip)

Part of the SIMARGL toolkit

syryn is one of ten tools that together form an intellectual development support system:

Tool Role
simargl Task-to-code retrieval — given a task description, finds which files and modules are likely affected, using semantic similarity over git history
svitovyd Project map — scans any codebase and produces a structural map of definitions and cross-file dependencies; queried from the CLI, a web UI with a layered map, or an MCP server
1bcoder AI coding assistant for small local models — surgical context management, agents, parallel inference, proc scripts
yasna Session memory — indexes conversations from all AI agents so you can find what was discussed, when, and where
radogast Context drift monitor — measures how far an AI agent's conversation has drifted from the original task
vyrii Local AI web UI — chat, translate, web research, RAG and file management in the browser (Flask; Gradio optional); powered by Ollama or any OpenAI-compatible backend
syryn Bluetooth identity beacon for headless devices — the device's IP is its Bluetooth name; hostname, mDNS and network interfaces on request
alkonost Browser cockpit for 1bcoder's flows — the deepagent_* spec pipeline (plan tree → specs → task board) and the glossary (build, browse, search), tuned for small local models
gamayun Statistical ontology without an LLM — builds triples of terms, identifiers, files and modules from task history or a folder of documents and code; every triple carries its significance test
mokosh Dataset gathering — commits of a git repository and the tasks of its tracker (Jira, GitHub, GitLab, YouTrack) in one SQLite database that the other tools read
  • simargl finds the code related to a task by vector search over the task history (embeddings).
  • svitovyd answers: how is the code structured and what depends on what?
  • 1bcoder answers: how do I work with local models efficiently?
  • yasna answers: where did I already discuss this?
  • radogast answers: is the AI agent still on track toward the goal?
  • vyrii answers: how do I access all of this through a browser?
  • syryn answers: what is the address of this headless device?
  • alkonost answers: how do I turn one task description into a reviewed, working plan — and see the project's glossary — without a big model or a big context window?
  • gamayun finds the code related to a task through an ontology of significant links between words, files and modules (no LLM).
  • mokosh prepares the initial dataset from version control and the issue tracker.

Together they cover the full development loop: understand the codebase, find relevant history, work with AI locally, remember what was decided, and verify the context stays on target.


(c) 2026 Stanislav Zholobetskyi, Oleh Andriichuk Institute for Information Recording, National Academy of Sciences of Ukraine, Kyiv PhD research: «Intelligent Technology for Software Development and Maintenance Support»

Metadata

Release files for syryn 0.1.11

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for syryn 0.1.11
File Size Uploaded Provenance Actions
syryn-0.1.11.tar.gz 38.1 kB Without provenance Details for syryn-0.1.11.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for syryn 0.1.11
File Interpreter ABI Platform Actions
syryn-0.1.11-py3-none-any.whl Python 3 none any Details for syryn-0.1.11-py3-none-any.whl

Total release size: 75.4 kB

Release files / syryn-0.1.11.tar.gz

Download URL syryn-0.1.11.tar.gz
Size 38.1 kB
Tags Source
SHA-256 checksum
How to use checksums
30494743d9f16a487087240ab1032cfd89aad3d8128df5fe041333130ad766b1
BLAKE2b-256 checksum
How to use checksums
2079e4389e5050b4c6f7d751be1ccfa534aef0e9e52ff0297b4311de967762c6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.9

Release files / syryn-0.1.11-py3-none-any.whl

Download URL syryn-0.1.11-py3-none-any.whl
Size 37.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
f9b861cb2a22f0fb4416ff9ce6db67554d738f092139f2dab9d7f1b06d7bc718
BLAKE2b-256 checksum
How to use checksums
44eead82b82783a862bc33a3399804d99d65d016addb72126ef776b522a83322
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.9

Security for syryn 0.1.11

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page