1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[project]
name = "meshbay-node"
version = "0.11.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
|