2ede253b39831e38c4397dcafccada16d25fe785
Replace the internal single-node clipboard with real clipboard paste: the prompt composer uploads pasted image files as references, and the canvas pastes clipboard images as nodes and clipboard text as text nodes anchored at the pointer, reading from the async clipboard API on the context-menu paste action. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
img-infinite-canvas
Moteva 风格的 AI 设计工作台复刻 MVP:主页 Prompt 创建项目,项目页提供无限画布、节点拖拽、缩放平移、右侧设计对话、历史回放、图片资产上传、项目保存与再生成。
Stack
- Backend: go-zero, DDD layering, sqlc, pgx, PostgreSQL optional persistence
- Cache: memory or Redis, default memory
- Agent: sky-valley/pi Go agent runtime adapter, local desktop agent disabled
- Image storage: memory, MinIO, AWS S3, Cloudflare R2, Aliyun OSS
- Frontend: Next.js App Router, pnpm, Vite artifact build, TypeScript, gzip, i18n
- Deploy: local binary, Docker Compose, k3s manifests
Run Locally
Backend:
cd server
go mod tidy
go run . -f etc/config.yaml
Frontend:
cd frontend
pnpm install
pnpm dev
Open http://localhost:5173. Next.js rewrites /api to http://localhost:8888 in development. pnpm build runs next build and vite build, producing gzip assets in frontend/dist.
Cache Config
Default in-memory cache:
Cache:
Driver: memory
TTLSeconds: 300
Redis cache:
Cache:
Driver: redis
Addr: localhost:6379
Password: ""
DB: 0
TTLSeconds: 300
Storage Config
Default memory storage is useful for local UI work:
Storage:
Driver: memory
Image Object Storage
Default memory mode is useful for local prototyping. Production can use MinIO, AWS S3, Cloudflare R2, or Aliyun OSS:
ObjectStorage:
Driver: minio # memory|minio|s3|aws|r2|aliyun
Bucket: canvas-assets
Endpoint: localhost:9000
Region: us-east-1
AccessKey: canvas
SecretKey: canvas-secret
PublicBase: http://localhost:9000/canvas-assets
UseSSL: false
ExpiresIn: 900
PostgreSQL storage:
Storage:
Driver: postgres
DataSource: postgres://canvas:canvas@localhost:5432/canvas?sslmode=disable
Docker Compose
cd deploy
docker compose up --build
Open http://localhost:3000.
k3s
Build and load/push these images first:
docker build -t img-infinite-canvas-api:latest server
docker build -t img-infinite-canvas-web:latest frontend
kubectl apply -f deploy/k3s/img-infinite-canvas.yaml
The sample ingress host is canvas.local.
API
See server/API.md.
Description
Languages
Go
44.3%
TypeScript
43%
CSS
11.6%
HTML
1%