# Options for Radicle APIs
There are three public connections that the radicle server (node + all other related services working with the same repositories) has to expose:
1. HTTP/TLS, required for the web interface (optional, useful only in seeding nodes);
2. Git API, either over HTTP/TLS, or via SSH;
3. P2P API, which has to be encrypted.
Also, any node must expose RPC API, which can be implemented over unencrypted socket and designed to work with just a single connecting peer.
| HTTP | Git | P2P
------ | ---- | --- | ---
Clients | Browser | `git`, `rad`, `radicle-node` | `radicle-node`
Encryption | TLS | SSH, TLS, NXK^[Noise_XK] | SSH, NXK
Transports | TCP | HTTP, SSH, NETL^[Noise_XK encrypted transport layer], GIT | HTTP, SSH, NETL
Can write to a repo | No | No^[write operations must be filtered out] | Yes
Inboud connections [^repo] | Non-blocking | Non-blocking | Blocking
Outbound connections [^repo] | None | One | ?
[^repo]: per repo
Radicle node has to maintain persisting state machine - one per git repository - which should work in a locking way inside a multi-process environment (with multiple processes - or threads - trying to access/write to git repository simultaneusly).
## Possible options for combined Git+P2P connectivity
1. **uniHTTPs**: everything (both P2P and Git) muliplexed over HTTP (REST-style).
:::success
- exposes just a single port; allows combination with WebUI
:::
:::danger
- With TLS makes node keys unusable, but allows combination with Web UI
- With NXK makes traditional git connection unusable
:::
2. **uniSSH**: everything muliplexed over SSH.
:::success
- efficiently reuses node keys
- allows to avoid transport protocol implementation
:::
:::danger
- not combinable with Web UI
- poor state of rust SSH library
:::
3. **P2P+Git**: Git and P2P connections are maintained separatedly in a native way.
:::danger
- unsecure
- requires all three interfaces exposed via different ports
- complexity of managing race conditions and multiple client connections
:::
4. **NETL**^[Noise_XK encrypted transport layer]: we do a new transporting protocol tunneling both Git and P2P in a multiplexed way.
:::success
- efficiently reuses node keys
:::
:::danger
- not combinable with Web UI
- potentially will not work with normal git clients
:::
## Service providers
| uniHTTPs | uniSSH | P2P+Git | NETL
--- | --- | --- | --- | ---
P2P | Caddy + `radicle-node` | `radicle-node` | `radicle-node` | `radicle-node`
WebUI | Caddy + `radicle-node` | Caddy + `radicle-http-api` | Caddy + `radicle-http-api` | Caddy + `radicle-http-api`
Git | Caddy + `radicle-node` | `radicle-node` | `radicle-git-server` | `radicle-git-server`
Overall | Caddy, `radicle-node` | Caddy, `radicle-node`, `radicle-http-api` | Caddy, `radicle-node`, `radicle-http-api`, `radicle-git-server` | Caddy, `radicle-node`, `radicle-http-api`, `radicle-git-server`