/ README.md
README.md
1 # palun 2 3 Local-first, peer-to-peer project management (issues/kanban/roadmaps). 4 5 A working Rust workspace with three crates: 6 7 - `core`: CRDT schema + command/query layer (pure logic) 8 - `p2p`: networking and replication glue (libp2p) 9 - `app`: Axum + Dioxus LiveView UI (white-canvas look) 10 11 Docs live in: 12 13 - `docs/spec.md` – data model + invariants 14 - `docs/protocol.md` – replication and sync approach 15 - `docs/config.md` – config file reference 16 - `docs/storage.md` – on-disk format + persistence notes 17 - `docs/ui.md` – UI flows + interaction notes 18 19 ## Quick start 20 21 ```bash 22 make run 23 ``` 24 25 Then open: 26 27 - `http://127.0.0.1:8080/` 28 29 ## Commands 30 31 ```bash 32 make fmt 33 make clippy 34 make test 35 make run 36 ``` 37 38 ## CLI 39 40 ```bash 41 pm serve 42 pm peer add <multiaddr> 43 ``` 44 45 ## Config 46 47 Default config file: `data/palun.toml` (override with `PALUN_CONFIG_PATH`). 48 49 Example: 50 51 ```toml 52 workspace_path = "data/workspace.palun" 53 http_addr = "0.0.0.0:8080" 54 public_url = "http://192.168.1.10:8080/" 55 56 [p2p] 57 key_path = "data/p2p/peer.key" 58 tcp_port = 0 59 quic_port = 0 60 mdns = true 61 62 peers = ["/ip4/192.168.1.11/tcp/4001"] 63 ``` 64 65 ## Environment 66 67 - `PALUN_CONFIG_PATH`: config file path (default `data/palun.toml`). 68 - `PALUN_HTTP_ADDR`: HTTP bind address (default `0.0.0.0:8080`). 69 - `PALUN_PUBLIC_URL`: public URL used for LAN QR output. 70 - `PALUN_WORKSPACE_PATH`: workspace file path (default `data/workspace.palun`). 71 - `PALUN_P2P_KEY_PATH`: libp2p key path (default `data/p2p/peer.key`). 72 - `PALUN_P2P_TCP_PORT`: TCP listen port (default random). 73 - `PALUN_P2P_QUIC_PORT`: QUIC listen port (default random). 74 - `PALUN_P2P_MDNS`: set to `0`/`false` to disable mDNS. 75 76 ## Notes 77 78 - We’re using **Dioxus LiveView** for the UI (server-driven over WebSockets). LiveView is currently supported in Dioxus, but development has been deprioritized (so treat it as a strategic dependency you may want to swap later). See `docs/decisions.md`. 79 - We’re using **Automerge** as the CRDT engine; its sync protocol assumes a reliable in-order stream, which maps cleanly to a libp2p substream.