1# hacking on tangled
2
3We highly recommend [installing
4nix](https://nixos.org/download/) (the package manager)
5before working on the codebase. The nix flake provides a lot
6of helpers to get started and most importantly, builds and
7dev shells are entirely deterministic.
8
9To set up your dev environment:
10
11```bash
12nix develop
13```
14
15Non-nix users can look at the `devShell` attribute in the
16`flake.nix` file to determine necessary dependencies.
17
18## running the appview
19
20The nix flake also exposes a few `app` attributes (run `nix
21flake show` to see a full list of what the flake provides),
22one of the apps runs the appview with the `air`
23live-reloader:
24
25```bash
26TANGLED_DEV=true nix run .#watch-appview
27
28# TANGLED_DB_PATH might be of interest to point to
29# different sqlite DBs
30
31# in a separate shell, you can live-reload tailwind
32nix run .#watch-tailwind
33```
34
35To authenticate with the appview, you will need redis and
36OAUTH JWKs to be setup:
37
38```
39# oauth jwks should already be setup by the nix devshell:
40echo $TANGLED_OAUTH_JWKS
41{"crv":"P-256","d":"tELKHYH-Dko6qo4ozYcVPE1ah6LvXHFV2wpcWpi8ab4","kid":"1753352226","kty":"EC","x":"mRzYpLzAGq74kJez9UbgGfV040DxgsXpMbaVsdy8RZs","y":"azqqXzUYywMlLb2Uc5AVG18nuLXyPnXr4kI4T39eeIc"}
42
43# if not, you can set it up yourself:
44go build -o genjwks.out ./cmd/genjwks
45export TANGLED_OAUTH_JWKS="$(./genjwks.out)"
46
47# run redis in at a new shell to store oauth sessions
48redis-server
49```
50
51## running a knot
52
53An end-to-end knot setup requires setting up a machine with
54`sshd`, `AuthorizedKeysCommand`, and git user, which is
55quite cumbersome. So the nix flake provides a
56`nixosConfiguration` to do so.
57
58To begin, head to `http://localhost:3000/knots` in the browser
59and create a knot with hostname `localhost:6000`. This will
60generate a knot secret. Set `$TANGLED_VM_KNOT_SECRET` to it,
61ideally in a `.envrc` with [direnv](https://direnv.net) so you
62don't lose it.
63
64You can now start a lightweight NixOS VM using
65`nixos-shell` like so:
66
67```bash
68nix run .#vm
69# or nixos-shell --flake .#vm
70
71# hit Ctrl-a + c + q to exit the VM
72```
73
74This starts a knot on port 6000, a spindle on port 6555
75with `ssh` exposed on port 2222. You can push repositories
76to this VM with this ssh config block on your main machine:
77
78```bash
79Host nixos-shell
80 Hostname localhost
81 Port 2222
82 User git
83 IdentityFile ~/.ssh/my_tangled_key
84```
85
86Set up a remote called `local-dev` on a git repo:
87
88```bash
89git remote add local-dev git@nixos-shell:user/repo
90git push local-dev main
91```
92
93## running a spindle
94
95Be sure to set `$TANGLED_VM_SPINDLE_OWNER` to your own DID.
96The above VM should already be running a spindle on `localhost:6555`.
97You can head to the spindle dashboard on `http://localhost:3000/spindles`,
98and register a spindle with hostname `localhost:6555`. It should instantly
99be verified. You can then configure each repository to use this spindle
100and run CI jobs.
101
102Of interest when debugging spindles:
103
104```
105# service logs from journald:
106journalctl -xeu spindle
107
108# CI job logs from disk:
109ls /var/log/spindle
110
111# debugging spindle db:
112sqlite3 /var/lib/spindle/spindle.db
113
114# litecli has a nicer REPL interface:
115litecli /var/lib/spindle/spindle.db
116```