[build-system] requires = ["hatchling"] build-backend = "hatchling.build" [project] name = "meshbay-node" version = "0.15.0" description = "MeshBay Node — local file host, streaming server, and group daemon" requires-python = ">=3.12" dependencies = [ "meshbay-common>=0.10.0", "fastapi>=0.115", # local web UI on localhost:18000 "uvicorn[standard]>=0.30", "httpx>=0.28", # hub client "watchdog>=5.0", # directory monitoring "aioice>=0.9", # ICE/STUN for NAT traversal "aioquic>=1.0", # QUIC transport (MNP v2) — implemented in Phase 5 "websockets>=12.0", # hub→node revocation push "aiortc>=1.9", # WebRTC DataChannel for browser P2P (Phase 9) "aiosqlite>=0.20", # async SQLite for chat, audit, bundle stores "guessit>=4.4", # filename parsing for the Videos app "mutagen>=1.47", # ID3/Vorbis tag + embedded cover reading for the Music app "Pillow>=10", # thumbnail generation + EXIF reading for the Photos app ] [project.optional-dependencies] # piexif: builds realistic EXIF (nested Exif/GPS sub-IFDs, matching real # camera output) for test_enrich_photo.py — Pillow itself is lenient enough # to round-trip a flat, non-standard EXIF dict, which would have hidden the # get_ifd(Exif) bug enrich_photo.py's DateTimeOriginal read had. dev = ["pytest>=8", "pytest-asyncio>=0.24", "pytest-timeout>=2.3", "ruff>=0.6", "piexif>=1.1"] [project.scripts] meshbay-node = "meshbay_node.daemon:main" [tool.hatch.build.targets.wheel] packages = ["src/meshbay_node"] # RPM/DEB: meshbay-node # Systemd service: meshbay-node.service # Config: /etc/meshbay/node.conf (or ~/.config/meshbay/node.conf per-user) # Data: ~/.local/share/meshbay/node/ # Keystore: ~/.config/meshbay/keystore.enc # Local UI: http://localhost:18000