DCanary is the world's first truly decentralized CI/CD platform that brings blockchain-level security and transparency to software deployment. Built on the Internet Computer, it eliminates single points of failure while ensuring cryptographic verification and distributed consensus for every build.
Unlike traditional platforms that rely on centralized infrastructure, DCanary leverages blockchain technology to create an immutable, transparent, and censorship-resistant deployment pipeline.
Every build is cryptographically signed and verified across multiple independent nodes.
No central authority or single point of failure. Runs entirely on blockchain infrastructure.
Familiar CLI tools, GitHub integration, and workflow patterns you already know.
Jump into our quick start guide and have your first decentralized pipeline running in just 5 minutes.
Every build is cryptographically signed and verified across multiple nodes
No central authority, runs entirely on Internet Computer blockchain
All pipeline executions are permanently recorded on-chain
Multiple executors must agree before marking builds as successful
Simple CLI, GitHub integration, familiar workflow patterns
Distributed across the globe with automatic failover
Follow these steps to set up your first decentralized CI/CD pipeline
npm install -g @dcanary/cli
Install the DCanary command-line interface globally on your system. This provides all the tools needed to create, configure, and manage your decentralized CI/CD pipelines.
Note: Requires Node.js 16+ and npm. The CLI will automatically configure your identity and connect to the Internet Computer network.
dcanary init --type nodejs
Set up DCanary configuration for your project type. This creates a dcanary.yaml
file with sensible defaults and project-specific build commands.
What this does: Creates configuration files, sets up build stages, configures secrets management, and establishes webhook endpoints for your repository.
dcanary pipeline create --name "My App" --repo "github:user/repo"
Connect your GitHub repository and create your first pipeline. This registers your project with the DCanary network and sets up the necessary smart contracts on the Internet Computer.
Behind the scenes: This deploys your pipeline configuration to a canister, generates unique webhook URLs, and enrolls your project in the consensus network.
dcanary deploy && dcanary status
Deploy your pipeline to the network and monitor its status. Your pipeline is now live and will automatically trigger on code pushes, executing builds across multiple independent nodes.
Success! Your decentralized CI/CD pipeline is now active. Configure webhooks in your repository settings to enable automatic builds on code changes.
Choose your preferred installation method
npm install -g @dcanary/cli
# Verify installation
dcanary --version
curl -fsSL https://install.dcanary.dev | bash
git clone https://github.com/modaniels/dcanary.git
cd dcanary && npm install && npm run build
npm link
Component | Minimum | Recommended |
---|---|---|
Node.js | v16.0.0 | v18.0.0+ |
RAM | 512 MB | 2 GB+ |
Storage | 100 MB | 1 GB+ |
Network | Basic internet | Stable broadband |
OS | Linux, macOS, Windows | Linux/macOS preferred |
Built on Internet Computer for true decentralization
┌─────────────────────────────────────────────────────────────────┐
│ Internet Computer Network │
├─────────────────────────────────────────────────────────────────┤
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
│ │ Webhook │ │ Pipeline │ │ Verification │ │
│ │ Canister │ │ Config │ │ Canister │ │
│ │ │ │ Canister │ │ │ │
│ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ Build Executor Canister │ │
│ │ (Orchestrates off-chain executors) │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │ │
└──────────────────────────────┼───────────────────────────────────┘
│
┌──────────────────────┼──────────────────────┐
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Executor #1 │ │ Executor #2 │ │ Executor #3 │
│ (Off-chain) │ │ (Off-chain) │ │ (Off-chain) │
│ │ │ │ │ │
│ ┌─────────────┐ │ │ ┌─────────────┐ │ │ ┌─────────────┐ │
│ │Docker/K8s/VM│ │ │ │Docker/K8s/VM│ │ │ │Docker/K8s/VM│ │
│ │Build Environment│ │ │Build Environment│ │ │Build Environment│ │
│ └─────────────┘ │ │ └─────────────┘ │ │ └─────────────┘ │
└─────────────────┘ └─────────────────┘ └─────────────────┘
Receives and validates Git push events from GitHub, GitLab, and other SCM providers
Stores immutable build configurations, secrets, and deployment instructions
Orchestrates distributed build execution across multiple independent nodes
Validates consensus results and permanently stores execution history
Independent build execution environments
Containerized or VM-based build isolation
Secure communication channels
Digital signatures and hash verification
Modern frontend deployment pipeline
Deploy a React application with automated testing, building, and deployment to a CDN. This example shows how to handle modern frontend workflows with dependency management, testing, and optimized production builds.
name: react-app-pipeline
version: "1.0"
environment:
image: "node:18-alpine"
variables:
NODE_ENV: production
CI: true
stages:
- name: install
commands:
- npm ci --production=false
cache:
paths: ["node_modules/"]
key: "${checksum:package-lock.json}"
- name: lint
commands:
- npm run lint
- npm run type-check
parallel: true
- name: test
commands:
- npm test -- --coverage --watchAll=false
coverage: true
artifacts:
- coverage/
- name: build
commands:
- npm run build
artifacts:
- build/
- package.json
- name: deploy
commands:
- aws s3 sync build/ s3://$S3_BUCKET --delete
- aws cloudfront create-invalidation --distribution-id $CLOUDFRONT_ID --paths "/*"
when: branch == "main"
environment:
variables:
AWS_REGION: us-east-1
secrets:
- NPM_TOKEN
- AWS_ACCESS_KEY_ID
- AWS_SECRET_ACCESS_KEY
- S3_BUCKET
- CLOUDFRONT_ID
notifications:
slack:
webhook: $SLACK_WEBHOOK
channels: ["#deployments"]
Git Event Processing Hub
Receives and processes Git webhook events from GitHub, GitLab, and other SCM providers. Acts as the entry point for all pipeline triggers with enterprise-grade security.
Immutable Build Definitions
Stores immutable pipeline configurations, build scripts, and encrypted secrets. Provides version control for your CI/CD definitions with blockchain-level security.
{
"name": "my-app-pipeline",
"stages": [
{"name": "install", "commands": ["npm ci"]},
{"name": "test", "commands": ["npm test"]},
{"name": "build", "commands": ["npm run build"]}
],
"environment": "node:18",
"secrets": ["NPM_TOKEN", "API_KEY"]
}
Distributed Build Orchestration
Orchestrates distributed build execution across multiple off-chain executor nodes. Manages job distribution, monitoring, and result collection with consensus verification.
Manages job distribution, monitoring, and result collection.Smart load balancing across executor nodes
Live build progress and health metrics
Cryptographic consensus verification
Byzantine Fault Tolerant Verification
Build jobs are distributed to multiple independent executor nodes (minimum 3, typically 5-7) across different geographical regions for maximum redundancy and security. Each executor receives identical build instructions but operates in complete isolation.
Each executor independently runs the same build in completely isolated environments using containerization or virtual machines. This ensures consistent results while preventing any single point of manipulation.
Executors submit cryptographically signed results including logs, artifacts, and exit codes with tamper-proof digital signatures. Each submission includes comprehensive metadata for verification.
Results are compared and verified using Byzantine fault tolerance - 2/3 majority required for success with full cryptographic audit trail. The verification process ensures no single malicious actor can compromise the build integrity.
Result: When consensus is reached, the verified artifacts are cryptographically sealed and the execution record is permanently written to the blockchain, creating an immutable deployment history.
Enterprise-Grade Protection
Ed25519 signatures for all transactions and communications
AES-256 encryption for all sensitive data and secrets
TLS 1.3 for all communications and data transfer
DCanary uses YAML configuration files to define your build and deployment pipelines. The configuration is declarative, meaning you describe what you want to happen, not how to do it. This ensures consistency and reproducibility across all executor nodes.
name: my-awesome-app
version: "1.0"
# Build environment
environment:
image: "node:18-alpine"
variables:
NODE_ENV: production
# Pipeline stages
stages:
- name: install
commands:
- npm ci --production=false
- name: lint
commands:
- npm run lint
- name: test
commands:
- npm test
coverage: true
- name: build
commands:
- npm run build
artifacts:
- dist/
- package.json
- name: deploy
commands:
- dfx deploy
when: branch == "main"
# Secrets management
secrets:
- NPM_TOKEN
- DEPLOY_KEY
# Notifications
notifications:
slack:
webhook: $SLACK_WEBHOOK
channels: ["#deployments"]
Project name, version, and description. Used for pipeline identification and management.
Docker image, environment variables, and runtime configuration for all executors.
Sequential or parallel build steps with commands, conditions, and artifact handling.
Encrypted environment variables and credentials securely distributed to executors.
stages:
- name: deploy-staging
commands:
- deploy-to-staging.sh
when: branch == "develop"
- name: deploy-production
commands:
- deploy-to-prod.sh
when: branch == "main" && tag =~ "^v[0-9]+\\."
- name: security-scan
commands:
- run-security-scan.sh
when: files_changed =~ ".*\\.(js|ts|py)$"
stages:
- name: performance-test
commands:
- run-perf-tests.sh
when: |
(branch == "main" || branch == "develop") &&
commit_message !~ "\\[skip perf\\]" &&
time_of_day >= "09:00" && time_of_day <= "17:00"
- name: weekend-maintenance
commands:
- maintenance-tasks.sh
when: day_of_week in ["saturday", "sunday"]
stages:
- name: quality-checks
parallel:
- name: lint
commands:
- npm run lint
- npm run format:check
- name: type-check
commands:
- npm run type-check
- name: security-audit
commands:
- npm audit --audit-level high
- snyk test
stages:
- name: test-matrix
matrix:
node_version: ["16", "18", "20"]
os: ["ubuntu", "alpine"]
commands:
- npm test
environment:
image: "node:${matrix.node_version}-${matrix.os}"
parallel_limit: 4
stages:
- name: install
commands:
- npm ci
cache:
paths:
- "node_modules/"
- "~/.npm/"
key: "${checksum:package-lock.json}-${env.NODE_VERSION}"
restore_keys:
- "${checksum:package-lock.json}-"
- "npm-cache-"
ttl: "7d"
stages:
- name: build
commands:
- npm run build
artifacts:
paths:
- "dist/"
- "coverage/"
name: "build-${env.BUILD_NUMBER}"
expire_in: "30d"
public: false
reports:
coverage: "coverage/lcov.info"
test: "test-results.xml"
environments:
development:
image: "node:18-alpine"
variables:
NODE_ENV: development
DEBUG: "*"
API_URL: "https://api-dev.example.com"
staging:
image: "node:18-alpine"
variables:
NODE_ENV: staging
API_URL: "https://api-staging.example.com"
resources:
cpu: "1.0"
memory: "2Gi"
production:
image: "node:18-alpine"
variables:
NODE_ENV: production
API_URL: "https://api.example.com"
resources:
cpu: "2.0"
memory: "4Gi"
security:
read_only_fs: true
no_new_privileges: true
dcanary webhook get-url --pipeline my-app
Get your unique webhook endpoint URL
In your GitHub repository settings:
dcanary webhook get-secret
)dcanary webhook test --pipeline my-app
Verify webhook is working correctly
curl -X POST https://webhook.dcanary.dev/trigger \
-H "Content-Type: application/json" \
-H "X-DCanary-Secret: your-webhook-secret" \
-d '{
"repository": "user/repo",
"ref": "refs/heads/main",
"commits": [{"id": "abc123", "message": "Update code"}]
}'
All webhooks are validated using HMAC-SHA256
Restrict webhook sources by IP addresses
dcanary dashboard --web
Launch web dashboard at http://localhost:8080
dcanary status --live
Watch build progress in real-time
Average: 3m 45s
98.5% (last 30 days)
5 nodes online
dcanary logs --follow <build-id>
dcanary logs --build <build-id>
dcanary logs --executor <executor-id>
dcanary logs --errors --last 24h
# Filter by log level
dcanary logs --level error,warn
# Search in logs
dcanary logs --search "compilation failed"
# Filter by time range
dcanary logs --since "2024-01-15 10:00" --until "2024-01-15 11:00"
# Export logs
dcanary logs --export json > build-logs.json
notifications:
slack:
webhook: $SLACK_WEBHOOK
channels: ["#deployments", "#alerts"]
on_success: true
on_failure: true
on_timeout: true
notifications:
email:
smtp_server: "smtp.gmail.com"
recipients: ["team@company.com"]
on_failure: true
digest: "daily"
Executors couldn't reach consensus on build results. This happens when different executors produce different outputs or when insufficient executors complete the build.
dcanary logs --consensus-details <build-id>
dcanary executor status --all
dcanary debug consensus <build-id>
Pipeline not starting on Git push events. This is usually due to webhook configuration issues or network connectivity problems.
dcanary webhook test --url <webhook-url>
Test webhook endpoint accessibility
dcanary webhook logs --last 24h
Check recent webhook delivery attempts
dcanary webhook validate --repo <repo>
Verify webhook configuration
Executors not joining the network or becoming unavailable during builds. This affects consensus and build reliability.
dcanary executor diagnostics
dcanary network ping --all
dcanary executor health
Builds taking too long or timing out before completion. This can be due to resource constraints, inefficient build processes, or network issues.
# Global timeout settings
timeout:
global: "45m" # Maximum total build time
stage: "15m" # Maximum per-stage time
consensus: "5m" # Consensus agreement timeout
# Per-stage timeouts
stages:
- name: long-running-task
commands:
- run-heavy-process.sh
timeout: "30m"
- name: quick-task
commands:
- quick-script.sh
timeout: "2m"
dcanary health --verbose --export health.json
Comprehensive system health report with metrics
dcanary consensus analyze <build-id> --diff
Compare executor results and identify differences
dcanary network topology --live
Real-time network connectivity visualization
dcanary perf analyze --build <build-id>
Detailed timing and resource usage analysis
dcanary perf bottlenecks --last 7d
Identify performance bottlenecks over time
dcanary metrics --grafana --export
Export metrics for external monitoring tools
dcanary debug --export
when reporting issuesdcanary init [options]
Initialize a new DCanary project
dcanary pipeline create --name <name> --repo <repo>
Create a new pipeline
dcanary deploy [environment]
Deploy pipeline to network
dcanary status [pipeline-id]
Check pipeline status and recent builds
dcanary secrets add <name> <value>
dcanary secrets list
dcanary secrets delete <name>
dcanary executor start --daemon
dcanary executor join --stake 1000
dcanary executor stats
dcanary logs --follow <build-id>
dcanary debug --export --output debug.json
dcanary validate --config dcanary.yaml
// Trigger a pipeline execution
type TriggerRequest = {
repository: string;
branch: string;
commit_sha: string;
event_type: "push" | "pull_request" | "tag";
};
// Get pipeline execution status
type StatusResponse = {
build_id: string;
status: "pending" | "running" | "success" | "failed";
executors: Array<ExecutorResult>;
consensus_reached: boolean;
};
/webhook/github/{pipeline_id}
GitHub webhook endpoint for pipeline triggers
/status/{build_id}
Get build execution status and logs
# Install executor agent
npm install -g @dcanary/executor
# Configure executor identity
dcanary executor init --identity ~/.config/dfx/identity/default
# Start executor daemon
dcanary executor start --daemon
# Join the network
dcanary executor join --stake 1000
# Start local replica
dfx start --background
# Deploy to local network
dcanary deploy --network local
# Configure mainnet
dcanary config set network ic
# Deploy to mainnet
dcanary deploy --network ic
cache:
paths:
- node_modules/
- ~/.cargo/
- target/
key: "${checksum:package-lock.json}"
stages:
- name: test
parallel:
- npm run test:unit
- npm run test:integration
- npm run test:e2e
performance:
cache:
enabled: true
paths: ["node_modules/", ".cache/"]
resources:
cpu: "4.0"
memory: "8Gi"
parallel_jobs: 3
security:
secrets_encryption: true
network_isolation: true
audit_logging: enabled
access_control:
require_2fa: true
session_timeout: "8h"