Serverless, decentralized, end-to-end encrypted peer-to-peer communication daemon.
DaemonProc is the core networking daemon of the Garden of the Azazil (GOTA) ecosystem. It enables applications to communicate directly with each other across the internet β without any central server β using NAT traversal, cryptographic handshakes, and end-to-end encryption.
We're building a standard for app-to-app P2P communication that is:
- π End-to-End Encrypted β No one can read your data, not even us
- π Serverless β No central server, no single point of failure
- β‘ Fast β Direct peer connections via UDP with NAT traversal
- π§© App-Agnostic β Any application can use GOTA through a standard library
The long-term mission extends beyond simple P2P:
Phase 1 (Current) Phase 2 Phase 3
βββββββββββββββββ βββββββββββββ βββββββββββββ
P2P E2EE Mesh Network Distributed
App-to-App ββββΊ TURN/Relay ββββΊ Infrastructure
Communication Fallback & Protocol Std
DaemonProc is one component in the GOTA ecosystem. Applications never touch the network directly β they communicate through a local daemon via Unix sockets.
Machine A Machine B
ββββββββββββββββββββ ββββββββββββββββββββ
β β β β
β ββββββββββββββ β β ββββββββββββββ β
β β Your App β β β β Peer App β β
β β β β β β β β
β βββββββ¬βββββββ β β βββββββ¬βββββββ β
β β β β β β
β Unix Socket β β Unix Socket β
β (libgota) β β (libgota) β
β β β β β β
β βββββββΌβββββββ β UDP / P2P / E2EE β βββββββΌβββββββ β
β β DaemonProc ββββΌβββββββββββββββββββββββββΊββ€ β DaemonProc β β
β β β β NAT Punch + Handshake β β β β
β ββββββββββββββ β Noise Protocol IKpsk2 β ββββββββββββββ β
β β β β
ββββββββββββββββββββ ββββββββββββββββββββ
| Component | Repository | Description |
|---|---|---|
| DaemonProc | This repo | Background daemon handling P2P networking, NAT traversal, and E2EE |
| libgota | (coming soon) | Client library (.dll / .so) that applications link against for IPC |
- Your app links against
libgotaand writes data to a Unix socket - DaemonProc reads from the socket, encrypts the data, and sends it over UDP
- NAT Punching establishes a direct connection between peers
- Noise Protocol (IKpsk2) performs the cryptographic handshake
- ChaCha20-Poly1305 encrypts all traffic end-to-end
- Remote DaemonProc decrypts and delivers to the peer app via its Unix socket
| Tool | Version | Install |
|---|---|---|
| Go | 1.26.5+ | go.dev/dl |
| golangci-lint | v2.x | golangci-lint.run |
| GNU Make | Any | Pre-installed on Linux/macOS; Windows |
# Clone
git clone https://github.com/gardenoftheazazil/daemonproc.git
cd daemonproc
# Install dependencies
make deps
# Run all checks
make check
# See all available commands
make help fmt Format all Go source files.
lint Run golangci-lint on all packages.
vet Run go vet on all packages.
test Run all tests with race detector.
test-short Run tests in short mode.
cover Run tests with coverage report.
build Build the daemon binary.
deps Download and tidy Go module dependencies.
deps-upgrade Upgrade all dependencies.
check Run all quality checks (CI equivalent).
clean Remove build artifacts and coverage files.
All contributions must comply with the following rules. Pull requests that violate these rules will be automatically rejected by the CI pipeline.
Every file must pass golangci-lint run ./... with zero issues. The full configuration is defined in .golangci.yml.
π Click to expand: Full rule breakdown
Every .go file must begin with:
// Copyright (c) <year> Garden of the Azazil. All rights reserved.
// Licensed under the AGPL-3.0 License.
// See LICENSE file in the project root for full license information.| Rule | Enforced By |
|---|---|
| All exported symbols must have doc comments | revive, stylecheck |
| Every package must have a package comment | revive, stylecheck |
| All comments must end with a period | godot |
| Rule | Enforced By |
|---|---|
Go naming conventions (camelCase / PascalCase) |
revive, stylecheck |
Error types must end with Error suffix |
errname |
Error variables must be named errXxx |
stylecheck |
| Error strings must start with lowercase | revive, stylecheck |
| Consistent receiver names | revive, stylecheck |
| No shadowing predeclared identifiers | predeclared |
import (
"context" // stdlib
"golang.org/x/crypto/nacl/box" // third-party
"github.com/gardenoftheazazil/daemonproc/interfaces" // project
)| Rule | Details |
|---|---|
| Max line length | 120 characters |
| Formatting | gofmt (tabs) |
| Line endings | LF only |
No fmt.Print* in production |
Use structured logger |
No panic() |
Return errors instead |
| Rule | Enforced By |
|---|---|
| All errors must be checked | errcheck |
Wrap errors with %w |
errorlint |
Use errors.Is() for comparison |
errorlint |
| Close HTTP response bodies | bodyclose |
| Metric | Threshold |
|---|---|
| Cognitive complexity | β€ 30 |
| Cyclomatic complexity | β€ 15 |
| Nested if depth | β€ 5 |
go test ./... -race -count=1//nolint:lll // This line contains a long regex pattern that cannot be split.
var pattern = regexp.MustCompile(`...very long pattern...`)| Check | Command | Required |
|---|---|---|
| Lint | golangci-lint run ./... |
β |
| Tests | go test ./... -race -count=1 |
β |
| Review | 1 approving review | β |
Merging is blocked if any check fails.
We welcome contributions! Please read our Contributing Guide before submitting a pull request.
For security vulnerabilities, please see our Security Policy. Do NOT report security issues through public GitHub issues.
This project follows the Contributor Covenant v2.1.
This project is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0). See LICENSE for the full text.