canvas is a lightweight, Processing-like 2D animation and creative coding library for Go.
It combines the power and simplicity of fogleman/gg (2D vector drawing) with gopxl/pixel for window management and real-time graphics rendering.
- Simple & Intuitive: Start animating with familiar
SetupandDrawcallbacks—no window or loop boilerplate. - Rich 2D Vector Drawing: Full 2D vector graphics (shapes, paths, text, images, colors, and transformations) powered by
gg. - Interactive: Built-in mouse and keyboard handling for interactive sketches, simulations, and creative coding.
- Easy Recording & Export: Built-in automated animated GIF recording (
RecordGIF) and sequential PNG frame capture (SaveFrameSeq).
go get github.com/h8gi/canvaspackage main
import (
"github.com/h8gi/canvas"
"golang.org/x/image/colornames"
)
func main() {
c := canvas.NewCanvas(&canvas.CanvasConfig{
Width: 640,
Height: 400,
FrameRate: 60,
Title: "Hello Canvas!",
})
c.Setup(func(ctx *canvas.Context) {
ctx.Background(colornames.White)
ctx.SetColor(colornames.Green)
ctx.SetLineWidth(5)
})
c.Draw(func(ctx *canvas.Context) {
ctx.Push()
if ctx.IsMouseDragged {
ctx.SetColor(colornames.Red)
}
ctx.DrawLine(ctx.Mouse.X, ctx.Mouse.Y, ctx.PMouse.X, ctx.PMouse.Y)
ctx.Stroke()
ctx.Pop()
if ctx.IsKeyPressed(canvas.KeyUp) {
ctx.Background(colornames.White)
}
})
}| Perlin Flow Field | Boids Flocking | Particle Fountain |
|---|---|---|
![]() |
![]() |
![]() |
| Fractal Tree | Noise Landscape | Generative Grid |
![]() |
![]() |
![]() |
Explore all complete, runnable programs in the examples directory.
MIT License © 2019-2026 Hiroki Yagi (h8gi)





