No description
Allocate now checks if pubkey already has an identity and returns it. Prevents duplicate identities for same pubkey (was causing random number assignment on cert auth). GetByPubKey returns identity with highest CreatedAt for deterministic behavior. |
||
|---|---|---|
| cmd/qccd | ||
| internal | ||
| mobile | ||
| pkg/types | ||
| .gitignore | ||
| config.yaml.example | ||
| go.mod | ||
| go.sum | ||
| LICENSE | ||
| main.go | ||
| README.md | ||
QuiC Call
A server for audio/video calls between people. A family phone system replacement.
No WebRTC. No STUN/TURN. Everything goes through the server.
How it works
- Client connects via QUIC (TLS + ACME Let's Encrypt)
- Server sends a PoW (Hashcash) challenge
- Client solves it, sends solution with their Ed25519 public key
- Server allocates a phone number (
+0 XXX YYY ZZZ), issues an X.509 certificate proving ownership - Client can re-roll the number once per 24h
- To call someone, dial their number — server relays media blindly (E2EE)
Architecture
- Transport: QUIC (hysteria fork of quic-go) over UDP
- TLS: Automatic via certmagic + Cloudflare DNS-01 (ACME)
- Auth: Proof-of-Work (Hashcash SHA-256), no passwords
- PKI: Ed25519 CA, X.509 client certs with phone number as CN
- DB: Custom append-only frame-based engine with AES-256-GCM at-rest encryption (hash-chain integrity)
- Signaling: Binary varint frames over QUIC streams
- Media relay: Unreliable QUIC datagrams, server forwards blindly
- Congestion control: Brutal (CBR) from Hysteria
- E2EE: X25519 + HKDF + ChaCha20-Poly1305 (key exchange during signaling)
Status
Pre-alpha. Server compiles and passes vet. No client application exists yet.
Quick start
# Build
go build -o qccd ./cmd/qccd
# Configure
cp config.yaml.example config.yaml
# edit config.yaml — set ACME domains, email, Cloudflare API token
# Run
./qccd server
Configuration
See config.yaml.example.
Key options:
| Field | Default | Description |
|---|---|---|
server.listen |
:1963 |
UDP listen address |
pow.difficulty |
22 |
PoW leading zero bits |
identity.cooldown |
24h |
Minimum time between number re-rolls |
identity.prefix |
+0 |
Phone number prefix |
ca.key_type |
ed25519 |
CA key type |
relay.bandwidth_up |
100 mbps |
Media relay upstream bandwidth |
Dependencies
github.com/apernet/quic-go— QUIC transport (Hysteria fork)github.com/caddyserver/certmagic+github.com/libdns/cloudflare— ACME TLSgolang.org/x/crypto— X25519, ChaCha20-Poly1305, HKDF
License
AGPL-3.0-only