English | ็ฎไฝไธญๆ
Mobile-friendly CI/CD tool for viewing code diffs when developing via SSH with Claude Code. Automatically captures changes, generates HTML diffs, uploads to cloud storage, and sends notifications.
Problem: Can't view code diffs on mobile devices when using Claude Code via SSH.
Solution: Auto-capture changes โ Generate mobile HTML diffs โ Upload to cloud โ Send notification links.
- ๐ฑ Mobile-optimized diff viewing
- ๐ Claude Code hook integration
- โ๏ธ Cloud storage (R2, S3, OSS)
- ๐ฌ Multi-channel notifications (Telegram, DingTalk, WeChat Work, Email)
- ๐งช Playwright testing support
- ๐ Deployment webhooks
# Global install (recommended)
npm install -g ccanywhere
ccanywhere init
# Or project-specific
npm install -D ccanywhereCreate ccanywhere.config.json:
{
"artifacts": {
"baseUrl": "https://artifacts.example.com",
"storage": {
"provider": "r2",
"r2": {
"accountId": "YOUR_ACCOUNT_ID",
"accessKeyId": "YOUR_ACCESS_KEY",
"secretAccessKey": "YOUR_SECRET_KEY",
"bucket": "my-bucket"
}
}
},
"notifications": {
"channels": ["telegram"],
"telegram": {
"botToken": "YOUR_BOT_TOKEN",
"chatId": "YOUR_CHAT_ID"
}
}
}# Test configuration
ccanywhere test --all
# Run pipeline
ccanywhere runccanywhere init # Initialize configuration
ccanywhere run # Run build pipeline
ccanywhere test # Test configuration
ccanywhere register # Manage Claude Code hooks
ccanywhere cleanup # Clean old artifacts
ccanywhere info # Show configuration infoccanywhere test --all # Test everything
ccanywhere test --notifications # Test notifications only
ccanywhere test --deployment # Test deployment only
ccanywhere test --notifications --send --title "Test" --message "Hello"ccanywhere register # Register Stop hook
ccanywhere register --status # Check hook status
ccanywhere register --remove # Remove hooks- Environment variables (highest priority)
- Project config (
ccanywhere.config.json) - User config (
~/.claude/ccanywhere.config.json) - Defaults
Store common settings in ~/.claude/ccanywhere.config.json:
{
"notifications": {
"channels": ["telegram"],
"telegram": {
"botToken": "YOUR_BOT_TOKEN",
"chatId": "YOUR_CHAT_ID"
}
}
}Set system environment variables to override configuration:
# Storage
export STORAGE_PROVIDER=r2
export R2_ACCOUNT_ID=your-account-id
export R2_ACCESS_KEY_ID=your-key
export R2_SECRET_ACCESS_KEY=your-secret
export R2_BUCKET=my-bucket
# Notifications
export BOT_TOKEN_TELEGRAM=your-token
export CHAT_ID_TELEGRAM=your-chat-id
# Optional
export DEPLOYMENT_WEBHOOK_URL=https://deploy.example.com/webhook- Create bot via @BotFather
- Get bot token
- Add bot to chat and get chat ID
{
"email": {
"to": "admin@example.com",
"smtp": {
"host": "smtp.gmail.com",
"port": 587,
"user": "your-email@gmail.com",
"pass": "your-app-password"
}
}
}{
"dingtalk": "https://oapi.dingtalk.com/robot/send?access_token=TOKEN",
"wecom": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=KEY"
}# Install Playwright
npm install -D @playwright/test
npx playwright install
# Configure in ccanywhere.config.json
{
"test": {
"enabled": true,
"configFile": "./playwright.config.ts"
}
}Files are organized as: {folder}/{project-name}/{filename}
- GitHub repo:
https://github.com/owner/repo - Storage path:
diffs/owner/repo/diff-123.html
{
"deployment": "https://deploy.example.com/webhook"
}Webhook receives:
ref: Git commit hashbranch: Current branchtrigger: "ccanywhere"timestamp: Unix timestamp
# Setup
git clone https://github.com/mylukin/ccanywhere.git
cd ccanywhere
npm install
# Development
npm run dev
# Test
npm test
# Build
npm run build
# Lint & Format
npm run lint
npm run formatMIT
Made with โค๏ธ for developers who code anywhere ๐ฑ๐ป๐