Rasterize imported SVG/CAD sources to a transparent WebP render texture and carry it as an optional renderContent alongside the original content through the domain node, snapshot normalization, and reference images. Add canvasNodeRenderContent and prefer it for artboard, layer, generated-file, and project thumbnail previews while keeping content as the crop/download/ model-reference source. Generalize the SVG rasterizer with a render purpose and add upload/reference coverage. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
img-infinite-canvas
Moteva 风格的 AI 设计工作台复刻 MVP:主页 Prompt 创建项目,项目页提供无限画布、节点拖拽、缩放平移、右侧设计对话、历史回放、图片与 DWG/DXF 图纸导入、项目保存与再生成。
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.
CAD Import
The canvas asset picker and drag-and-drop surface accept DWG and DXF files up to 24 MB. Conversion runs locally in a browser worker, uploads a sanitized derived SVG, and leaves the source file unchanged. DXF supports ASCII and binary drawings; DWG supports AutoCAD R14 through AutoCAD 2018 format families.
Derived CAD SVGs retain bounded semantic metadata for drawing units, layers, reusable blocks, entity types, visible labels, and crop-indexed bounds. Agent Chat sends this metadata as hidden reference context while rasterizing only the model-bound image input to transparent WebP. Vector crop keeps the original SVG and creates a smaller transparent WebP sibling beside it with crop-specific semantic context, ready for follow-up questions in Agent Chat.
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.