E-ink is supposed to be the electronic version of dead-tree paper, but there’s one enormous difference: how you get your images and text onto it. For paper, you print on it. E-ink? Well, it depends on what it’s hooked up to. If it’s an ESP32C3-based Xteink X4 and X3, then you can just print to that, too, thanks to [Nishant Joshi]’s fork of the popular CrossPoint firmware.
The fork implements the Internet Printer Protocol, IPP, on the ESP32-C3. It makes loading documents a breeze: select the printer in your operating system, and press print. To the computer, the reader advertises itself as a printer that provides monochrome, single-sided output at 300 DPI on A5 paper, and accepts Apple raster and PWG raster formats. Of course these raster images are enormous compared to the paltry RAM available on the microcontroller, so pixels are received and written row-by-row — both to the screen directly, and to the SD card for later perusal. That makes a folder on the SD card the equivalent of a printer’s output tray.
This interface is amazing in its simplicity, and we’d love to see it in other E-ink devices. It reminds us somehow of AlphaSmart word processors — which are still relevant today in large part because their ‘file transfer’ mechanism is to pretend to be a USB keyboard and type the document onto your computer. As long as IPP is available, so too will you be able to get documents onto this e-reader.

Great Idea!
Love it! Maybe some buttons to page through multi-page files, and to go back to previous files? Then it’s like an ebook reader for printed documents.
I wonder if supporting a vector format (HP-GL, postscript, PCL) would improve speeds (both to “print” and to render) as those formats are usually tiny compared to raster. And likely this will be used more with text than graphics.
Thank you for mentioning HPGL! 😃
It used to be an exchange format in the AutoSketch and AutoCAD 1.x/2.x days.
Someone simply used HP LaserJet or HP LaserJet Plus as a printer driver, I think.
These two were the original laser printers with the 68000 processor.
They’ve used HPGL and/or PCL1.
The PenMan turtle plotter supported it, too. But I think it had shipped a DOS utility, too.
Anyway, the printer output file was sent to AUX/COMx serial port using COPY command!
These were the days, yay! 🥳
Btw, what’s also relevant here, maybe: the Epson format.
The EPSON FX-80 used ESC/P (Epson Standard Code for Printers).
That might been important to the home computer world, where needle -err- matrix printers were very common.
Maybe using the Epson ESC/POS aka Jetdirect protocol would be even better, since it’s made for rendering on low resource devices. This is a great excuse to plug one of my projects 😁 https://github.com/gilbertfl/escpos-netprinter/
Only problem I see is that it only deals with bitmap graphics, text and 1D/2D barcodes. Vector graphics would have to be a proprietary extension.
The problem is, using any non-raster format/language would mean the device has to render that into an actual image to display. And if it’s as CPU- and RAM-constrained as the article indicates, that’s moving the processing work to the wrong step in the process.
I may be way off here, but I thought printers do text rendering?
You would not download a printer, would you? ☺
Absolutely brilliant idea for an unauthenticated document transfer mechanism…
/begin{Rant}
“If it’s an ESP32C3-based Xteink X4 and X3”
I don’t like that company. The aftersales is horrible.
They messed up my order so I don’t have the case I paid for. It’s been about 2 months now. I keep mailing them and mailing them. Even if they reply it’s just nonsense. Last reply was a few days ago when they gave me the original tracking number. Not a new tracking number, no, the old one. I was promised to get a new case 3 times already, but never received a new tracking number. It’s frustrating.
/end{Rant}
Indeed, their aftersales support is abysmal unless you’re a major bulk purchasing corporate customer, and the forums are often a place for questions to die unanswered, especially when dealing with BLE. HOWEVER, the products are still quite good and very affordable, and there’s a user who pops up every now and then who I believe is connected to them in some way who is very intelligent and helpful. sprite_tm I believe is his name. Do the positives outweigh the negatives? Maybe, maybe not, but certainly your experience with their sales support in particular sounds extremely unprofessional. I hope you get it worked out soon.
Google sprite_tm, and you’ll find him here in abundance (in projects and comments), and his work on various platforms/hardware is revolutionary!! If he’s associated with that product line, get in touch with him.
Brilliant idea, as often is the case nowadays, a bit sad it was implemented by claude. Or even actually designed by it too. I don’t mean that as an anti-ai snob at all, I use it for things, but if I see Claude in the commits of something that seemed interesting it automatically loses all my curiosity, can’t help it. It becomes, ah, just another vibe-coded project, sorry but you didn’t build that. The tone of the blog was kinda giving it away anyway, bim bam boum voilà !
“I’m not an anti-AI snob at all but I snob all AI coding projects” 🙄
AI is nothing more than a coding tool, and unlike its use in arts, where intellectual property attribution is problematic, with coding the models were largely trained on open source code. So really you’re just upset that people who previously couldn’t realise their ideas because they didn’t know how to code now have a tool to do so. That’s literally snobbery.
I you use it like that. But as soon as you let it generate code, you don’t use it like a tool.
edit: wanted to add, it then becomes the author.
“I don’t mean that as an anti-ai snob at all” and then goes on to say the most anti-ai snobby statement one could possibly make. Don’t use it, Fork it and rewrite it yourself without AI, or go bowling. Everyone isn’t a programmer or developer, and everyone doesn’t have time to study to be one.
What about when people who aren’t programmers or developers take the jobs of programmers and developers, pass through education and get diplomas etc. while still technically not knowing how to program or develop?
This has been a perennial problem in engineering, whenever new tools are introduced and adopted. Like CAD tools and finite element analysis lead to a bunch of new engineers who couldn’t do the math anymore, wouldn’t do the math even if they could, so they didn’t develop the common sense through personal analysis of the cases. They blindly trusted the CAD tools and the result was a bunch of collapsed buildings.
Strawman
Yeah, this is not that at all. This is not something that will kill anyone, we’re not discussing his taking anyone’s job. This is someone saying he didn’t build this because of his choice of tool. It seems that to some people if the tool is smart enough, the person using the tool is suddenly not using a tool. Suddenly they’re stealing the credit from the tool.
Maybe we should just wait and see how long it takes for an AI coding agent to come up with the ideas and start doing the work on their own. Then at least we don’t have to hear about how people using AI aren’t doing anything, and we can start listening to people claim that AI aren’t doing anything. Somehow things are magically happening, but no one is around to do them. Unless the AI start running all the time without prompts, I think we’re in for a long wait.
Gee calm down, I just gave my honest opinion that if you used AI to build it, I’m not interested in studying what you “did” (or actually didn’t) build.
I didn’t say it’s the wrong way to do it, that everyone has time to do it by hand (although arguably, this example right here, right there would be a PERFECT candidate to take your time, study, learn, DIY and enjoy the process. In what world is there a rush to complete printing an image to an ePaper device for personal enjoyment? I don’t want to live in that world.) Just that I’m not interested. Which you could argue nobody cares about, could refrain from posting overall, fair enough.
I know it’s extremely tempting to offload the cognitive process to the machine, but you gain nothing from that. Actually you lose braincells. Fine for a one-shot script, I guess, not so much for a “personal project”. There are great uses tho like cross-checking megabytes of logs, who wants to do that by hand, it would bring nothing of value.
Also you’re attacking the wrong person because I went from 0 knowledge, not even knowing what hex is, to upstreaming linux drivers before the advent of slop, if I can do it, anyone can do. It took time, was hard, and valuable. Cheers.
If that were all you had said, no one would be replying to you right now. You said, “ah, just another vibe-coded project, sorry but you didn’t build that.”
Your arguments are akin to people who say that photographers with nice cameras don’t take nice pictures. Their cameras take nice pictures. Somehow the person using the tool did nothing and the tool did everything. The camera doesn’t point itself at a subject nor choose the lighting or sit there for an hour waiting for things to line up.
Similarly an AI coding agent doesn’t look at something they have and want to improve and come up with a “brilliant idea” of how to do it. It takes natural language and transforms it into computer code. If anything, it’s a new way of solving an old problem. How do you get the idea from your head and turn it into machine language? You did it via an IDE or text editor and a manmade language. To someone who programs in binary, YOU aren’t doing anything. You’re taking the easy route. You’re stealing credit from the compiler. That method is rewarding for you, but it doesn’t == “you didn’t build that.”
They also don’t publish code then.
What a lot of people don’t seem to understand is, that you have a responsibility for the code you share, because it has security implications. You let the code write by AI, don’t understand it, then you don’t publish/share it.
You also don’t own the code, it’s not from you (as in licensing and copyright), but that’s another matter.
I doubt the whole thing was invisioned and developed by AI. All I saw in the repo was some basic Claude metadata. Very few developers bother with actively avoiding AI-assisted programming unless they’re one of the “code is an artform” types, or their job genuinely requires them to. At this point, you are actively holding yourself back by avoiding the use of AI… Unless you were the type of guy to have programmer folklore written about him back in the 90s.
Not enough pain and suffering, eh? You expect it will suddenly make your devices explode? Somehow AI code runs but mysteriously no one can make heads or tails of it? Specifying exact operational requirements and multiple build iterations isn’t enough work to determine authorship of an admittedly brilliant idea, but a corporation that had no hand in the creation of the code it owns the copyright to somehow qualifies differently than a solo dev/maker doing their best to find success?
It must be something specific and concrete. I think we can get to the bottom of this if we look at the possibilities enough.
Advanced autocorrect is not an author. The author is still the humans involved. The degree to which the project creator copied existing work via AI versus the degree to which they did their own work can vary. If someone’s whole contribution to the process was “Expose the display of an e-reader as a printer” then the majority of the authorship belongs to the unknown authors of previous projects whose similar code was ingested into the AI. If the author did a lot of fiddling and re-prompting to get it to work, it starts becoming more similar to what you’d get if you put something together by copy-pasting code you found on stackoverflow. At no point is an inanimate object an author.
the thing is, this doesn’t solve the actual difficulty. the xteink x3’s display is much smaller than A5, and still lower than 300 DPI. so most of the pixels sent aren’t rendered.
in order to meaningfully reproduce the functionality of paper, size and DPI need to both converge towards what’s possible on a cheap printer. the protocol you use to send files to it is pretty much irrelevant to the difficulties that i face, anyways.
Sending the file at higher DPI is useful because contrary to paper, you could zoom the output when necessary.
You can also probably use a bigger epaper display without changing much to the code and the rest of the hardware. It’s just going to be more expensive.
Store on SD in the received format, and add zooming and panning.
this is not what i want. you are not understanding it and this doesn’t solve the problem
fwiw, i didn’t write this. really a bizarre impostoring
Why not just print to PDF and when it asks where you want to save the file, you save it in the device?
I see, so the issue was that there’s no straightforward way to upload files to the device. Then instead of implementing a printer server and a convoluted way of saving screenshots to a file, implement a network share that lets you upload files directly – which was the missing feature all along.
I for one like the printer emulation part because :
1) it’s something every device can do (output to printer)
2) it dissociate the original file from the output so security wise it could be seen as a secured bridge between (sometimes) malicious files (e.g. PDF) and safe to read files (e.g. PDF –> bitmap/passive format –> PDF)
Now to be complete this project would need a mode where it doesn’t output the printed file on screen, but just record it directly on the SD card in a compatible format (PDF for example).
The printing “scrambles” the original file, so if you ever want to backup and then later restore the file back into the device you’ll get generational loss. Keeping the original lets you move it in and out without loss.
The issue is RAM and processing power. The ESP32-C3 is a nice chip for smarthome work, but is rather aenemic for displaying large resolution files. Add in the physical limitations on refresh of the eink display, and a pdf just doesn’t work very well for eink devices. Also I think you’re missing the creativity/fun factor. Why not print to paper with eink? It’s quirky, it’s fun. It’s a HACK!
I think it might not support PDF..
You’d need a pretty tight subset of pdf and font support… doable, but rough. Constrained epub would be more plausible
I’d like something like this on a Boox as a little app that just dumps a PDF to storage.
I think this is great. The only thing I would add or change is the option to receive it as an epub/mobi or some equivalent format. Then it actually matches the device a bit better and would pick up multipage support without crowding the library with a bunch of one page images. Maybe tweak the firmware so that these single pages get grouped into a slideshow type multipage document which dynamically expands as pages are added? Very interesting work.
I probably commented too quickly here. I get that my suggestions don’t work given his constraints and workflow. I’m just dreaming about my Kobo which also has open source firmware. Still, I like his idea and work.
You could print to the big old Sony e-readers, and the old send-to-kindle worked by installing a virtual printer; you could send from anything that could print—it never made sense to do anything rose and in still a little mad about it.
Implementing it as a printer protocol is a brilliant idea. That’s what engineers do when allowed – we simplify stuff and make it multi- purpose.
I had almost identical usage idea months ago – to mirror my web page on an X3 or X4 and do broadcasts. I am now at the point where I need to write a display server for the e-ink device and I might just print it instead.
Here it is, the add-ins for Firefox and Chrome are already done and the Linux daemon to receive the image too:
https://github.com/wischner/tabcast
Did you evaluate any other SDK options before deciding for CrossPoint? How were they doing? I’m looking at pure SDKs such as FreeInk or OpenDisplay. did you rework CrossPoint app or used the underlying SDK/HAL?