/ 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.