<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/an-introduction-to-canvas-in-gnu-emacs-oqxrkwsf0" -->

---
title: An Introduction to Canvas in GNU Emacs | daily.dev
description: A new canvas feature has been merged into upstream GNU Emacs, landing in the Emacs 32 release cycle. It exposes an ARGB32 pixel buffer as a new image type,...
canonical: https://daily.dev/posts/an-introduction-to-canvas-in-gnu-emacs-oqxrkwsf0
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: An Introduction to Canvas in GNU Emacs | daily.dev
og:description: A new canvas feature has been merged into upstream GNU Emacs, landing in the Emacs 32 release cycle. It exposes an ARGB32 pixel buffer as a new image type,...
og:url: https://daily.dev/posts/an-introduction-to-canvas-in-gnu-emacs-oqxrkwsf0
og:image: https://api.daily.dev/og/posts/OQXRKWsf0.png
og:image:alt: An Introduction to Canvas in GNU Emacs
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# An Introduction to Canvas in GNU Emacs

**[Lobsters](https://daily.dev/sources/lobsters)** · 23 min read · 0 upvotes · 0 comments

## Summary

A new canvas feature has been merged into upstream GNU Emacs, landing in the Emacs 32 release cycle. It exposes an ARGB32 pixel buffer as a new image type, accessible both from Emacs Lisp and via the dynamic module API, letting developers update pixels directly and redraw with canvas-refresh without triggering a full redisplay. The author, who built the Emacs Reader project, walks through the FAQ, the underlying image/text-property API, and three demos: a bouncing ball, a chaotic double pendulum, and a 3D rotating points-in-space renderer built via a C dynamic module ported from tsoding's olive.c.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://monadicsheep.org/blog/an-introduction-to-canvas-in-emacs.html>

## Questions this post answers

### What is the new canvas feature merged into GNU Emacs and which version will it ship in?

Canvas is a new Emacs image type that exposes a raw ARGB32 pixel buffer, mergeable and updatable without passing image data through strings or triggering a full redisplay. It integrates with the existing image API, requires a unique :id property, and can be manipulated from Emacs Lisp or via the dynamic module API using canvas_data and canvas-refresh. It will ship as part of the Emacs 32 release cycle.

_Developers tracking new Emacs capabilities can follow canvas API changes on daily.dev before Emacs 32 lands._

### How does Emacs canvas-refresh differ from calling redisplay when updating a canvas image?

canvas-refresh only updates the specific glyphs belonging to that canvas instead of triggering Emacs's full redisplay, which tries to update every changed glyph in the frame. This makes canvas animations significantly cheaper, allowing smooth updates at 25, 30, and 60 FPS without lagging the rest of an Emacs session. If double-buffering is enabled, redisplay is still needed just to flip buffers, not to draw the canvas itself.

_Anyone optimizing Emacs Lisp rendering performance can dig into redisplay tradeoffs like this on daily.dev._

### Is the new Emacs canvas feature hardware-accelerated like HTML5 Canvas?

No, the Emacs canvas is not hardware-accelerated and has no relation to HTML5 Canvas in implementation. It simply exposes a raw pixel buffer that Emacs redisplays as it changes; developers can compute pixels with GPU acceleration outside Emacs and then write the results into the canvas's pixel buffer to gain the performance benefit where it matters most, such as pixel and texture math.

_Developers comparing Emacs graphics options against web canvas APIs can weigh the tradeoffs on daily.dev._

## Community take

How the wider developer community reacted, aggregated from 1 discussion and 8 comments across lobsters (as of 2026-08-23).

**TL;DR:** Reaction is enthusiastic, celebrating this as a major milestone for graphics capability, with excitement about future uses like efficient PDF/video viewing and scientific paper editing; a small tangent debates whether it's conceptually similar to HTML5 Canvas.

**Sentiment:** 85% positive · 15% mixed · 0% skeptical

**The case for**

- Seen as opening the door to much better PDF and video viewing support in the editor.
- Could enable strong UX for editing scientific papers via typst integration.
- Viewed as evidence the editor still attracts significant, high-quality contributions.

**By community**

- lobsters (positive): Commenters are celebratory about the contribution and excited about downstream uses, with only a minor side debate over the HTML5 Canvas comparison.

**Hottest debate:** Whether this canvas feature is conceptually related to HTML5 Canvas or fundamentally different.

**Open questions**

- Whether recordings of the related development livestreams will be uploaded.

**Highlights**

> We are so back!!!, As someone who has been very closely following the timeline, I feel really happy with what divya, minad, tusharhero have achived. I know how hard divya has worked for this. Truly a new era for emacs graphics.
> — [untrusem on lobsters · 7 points](https://lobste.rs/s/9xglf3/introduction_canvas_gnu_emacs#c_1jkhyu)

> In addition to amazing pdf support, I'm really excited what this could mean for typst support. With canvas support, we could see really amazing UX for editing scientific papers.
> — [zxtx on lobsters · 2 points](https://lobste.rs/s/9xglf3/introduction_canvas_gnu_emacs#c_rmkq0c)

> Been following the work on emacs-reader and canvas for more than a year now, can't wait to be able to (efficiently) read PDFs and watch videos in Emacs :) p.s. I don't see any of the recent livestreams on https://tv.dyne.org/a/divyaranjan/videos, are there any plans to upload the recordings?
> — [achyudh on lobsters · 1 points](https://lobste.rs/s/9xglf3/introduction_canvas_gnu_emacs#c_xz9ep9)

> haha, not sure how you got the 'yes' from the explanation. They are related insofar as at a higher-level they can be seen as 'displaying some graphics'. The underlying architecture is fundamentally different.
> — [divya on lobsters · 1 points, 1 comments](https://lobste.rs/s/9xglf3/introduction_canvas_gnu_emacs#c_jctqhx)

**Source threads**

- [lobsters](https://lobste.rs/s/9xglf3/introduction_canvas_gnu_emacs) · 39 points · 8 comments

## Similar posts on daily.dev

- [The Web Is Fun Again: First Experiments with HTML in Canvas – Frontend Masters Blog](https://daily.dev/posts/the-web-is-fun-again-first-experiments-with-html-in-canvas-frontend-masters-blog-n0q3syc0y) · Frontend Masters · 3 upvotes · 0 comments
- [Emacs 31 Is Around the Corner: The Changes I'm Already Daily Driving](https://daily.dev/posts/emacs-31-is-around-the-corner-the-changes-i-m-already-daily-driving-3tjpkrvpn) · Lobsters · 0 upvotes · 0 comments
- [Exploring the HTML-in-Canvas Proposal](https://daily.dev/posts/exploring-the-html-in-canvas-proposal-62dkmwqtx) · Codrops · 2 upvotes · 0 comments

---

Tags: [#c](https://daily.dev/tags/c)

[View this post on daily.dev](https://daily.dev/posts/an-introduction-to-canvas-in-gnu-emacs-oqxrkwsf0)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"An Introduction to Canvas in GNU Emacs","url":"https://daily.dev/posts/an-introduction-to-canvas-in-gnu-emacs-oqxrkwsf0","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/an-introduction-to-canvas-in-gnu-emacs-oqxrkwsf0"},"datePublished":"2026-08-23T18:09:51.877Z","dateModified":"2026-08-23T21:40:30.124Z","description":"A new canvas feature has been merged into upstream GNU Emacs, landing in the Emacs 32 release cycle. It exposes an ARGB32 pixel buffer as a new image type,...","image":"https://media.daily.dev/image/upload/s--foaA6JGU--/f_auto/v1722860399/public/Placeholder%2004","thumbnailUrl":"https://media.daily.dev/image/upload/s--foaA6JGU--/f_auto/v1722860399/public/Placeholder%2004","isAccessibleForFree":true,"articleSection":"Lobsters","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"Lobsters","logo":"https://media.daily.dev/image/upload/s--tl8v_Fku--/f_auto,t_logo/v1698841318/logos/lobste.jpg","url":"https://daily.dev/sources/lobsters"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/an-introduction-to-canvas-in-gnu-emacs-oqxrkwsf0","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":0},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"c","timeRequired":"PT23M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Lobsters","item":"https://daily.dev/sources/lobsters"},{"@type":"ListItem","position":3,"name":"An Introduction to Canvas in GNU Emacs"}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/an-introduction-to-canvas-in-gnu-emacs-oqxrkwsf0#faq","mainEntity":[{"@type":"Question","name":"What is the new canvas feature merged into GNU Emacs and which version will it ship in?","acceptedAnswer":{"@type":"Answer","text":"Canvas is a new Emacs image type that exposes a raw ARGB32 pixel buffer, mergeable and updatable without passing image data through strings or triggering a full redisplay. It integrates with the existing image API, requires a unique :id property, and can be manipulated from Emacs Lisp or via the dynamic module API using canvas_data and canvas-refresh. It will ship as part of the Emacs 32 release cycle. Developers tracking new Emacs capabilities can follow canvas API changes on daily.dev before Emacs 32 lands."}},{"@type":"Question","name":"How does Emacs canvas-refresh differ from calling redisplay when updating a canvas image?","acceptedAnswer":{"@type":"Answer","text":"canvas-refresh only updates the specific glyphs belonging to that canvas instead of triggering Emacs's full redisplay, which tries to update every changed glyph in the frame. This makes canvas animations significantly cheaper, allowing smooth updates at 25, 30, and 60 FPS without lagging the rest of an Emacs session. If double-buffering is enabled, redisplay is still needed just to flip buffers, not to draw the canvas itself. Anyone optimizing Emacs Lisp rendering performance can dig into redisplay tradeoffs like this on daily.dev."}},{"@type":"Question","name":"Is the new Emacs canvas feature hardware-accelerated like HTML5 Canvas?","acceptedAnswer":{"@type":"Answer","text":"No, the Emacs canvas is not hardware-accelerated and has no relation to HTML5 Canvas in implementation. It simply exposes a raw pixel buffer that Emacs redisplays as it changes; developers can compute pixels with GPU acceleration outside Emacs and then write the results into the canvas's pixel buffer to gain the performance benefit where it matters most, such as pixel and texture math. Developers comparing Emacs graphics options against web canvas APIs can weigh the tradeoffs on daily.dev."}}]}
```

