You are browsing as a guest. Sign up (or log in) to start making projects!

Wintergreen: highly focused E-ink reading firmware!

  • 7 Devlogs
  • 34 Total hours

Do you feel like current reading firmwares like Crosspoint & CrossInk are overcomplicated, slow, and bloated? Do you want something you can drop on your XTEINK X4 without a second thought? Do you want firmware optimized for fast, effective reading and NOTHING else?? Wintergreen is for you!!! It's highly sensible with everything you need and nothing you don't, flashing in under 10 seconds!!

Ship #1 Pending review

Wintergreen is a custom firmware for the Xteink X4 e-ink device whose ideology refocuses back to what the device was originally made for: READING. So many custom firmwares have unnecessary features, bloat and a clunky UI which makes it slow and distracting from the original intent of this device. Wintergreen is hyperfast, optimized (for page refreshes, battery life, and especially page turns) and actually thinks about the buttons you need to press to get where you need to go. It only builds and includes what you need, and extra features like wifi syncing and bluetooth page turning support is optional (yet first-class, unlike almost all other firmwares!) This firmware offers numerous design improvements such as compiling/indexing books off-device (which is a huge QoL advantage), no settings menu (everything gets hardcoded into the binary which means no flash reads!) and ONLY partial ink refreshes used everywhere in the codebase. Every small action and ink change has been very carefully considered to bring the best possible experience to this small ereader and I’m really really excited for you to try it!

  • 7 devlogs
  • 34h
Try project → See source code →
Open comments for this post

32m 37s logged

And… it’s done!!

Sorry for a bit of the delay!! I finished writing out the new release and make a video demo of what the firmware entirely looks like now. I also realized that I forgot to send an image of the Wintergreen logo that I had made a few days back… I did it all with my iPad & Apple Pencil, unlike the firmware which I forked (nous) which just… made their image with AI? It looked so dang ugly… had to humanize it (as in MAKING IT MYSELF..) and I think it looks great (not to repeat from the last devlog lol, family thinks it looks cool as well and I am very proud of it)

Anyways, I had to figure out how to compile a binary for you guys to flash without needing Platformio to build. Took me a bit to get it sorted out. Unrelated but reason why I hadn’t shipped yet is because I was trying to take a ton of sick pictures out in the wild, but it didn’t go so well. You can see some of the pics I liked in the github gallery and im putting another pic here (that you cant find anywhere else) just for fun! Anyways, gonna go ahead and ship this now (for real this time now tho lol)

0
0
19
Open comments for this post

12h 12m 30s logged

(was trying to finish the last devlog but i needed 15 minutes of logging time lol)

In the settings menu, check out the screenshot below and you’ll see a new Bluetooth clicker option!! So this one is actually insanely cool - when I did a talk at Linuxfest Northwest at Bellingham Tech in april 2026, I bought this small and simple bluetooth clicker with two buttons. And it worked great, but what if I can also use it for reading? The device has bluetooth, so I made a nice option for hardcoding a MAC address so it can connect to my clicker in just one press. Then, with the landscape option, I can leave the device on the ceiling or on a spot away (magnetically attached on to something) from my eyes and just use the page turning buttons. UNFORTUNATELY, I did not get this fully finished right now so it has errors and doesn’t connect reliably, and crashes the firmware so this is not finished as of now!!! :(

To make matters worse, I tried to get rid of the serial communication since we didn’t really need it and I had never used it, so it was kinda just bloating up the codebase and now I can’t really debug this very well.

I added the sync button in a convenient and sensible spot, but it is not functional yet. I hope for my next devlog to be my last, since I will finish the features here and make a nice video about it! Anyways, there was a ton of other stuff that I did as well but i kinda forgot, so maybe I’ll cover them in the next journal! And again, sorry for not devlogging in a bit!

— end conituation of last devlog —

ALRIGHT so i know i went over the 10 hour devlog thing and i did so much here that i dont know if i can fit it all in one devlog, but pretty much the firmware is done.

I managed to get bluetooth working perfectly! It has zero memory leaks now (this took me so many hours 😭) AND it supports queued page turns! And now you can hold the previous page button to go back, and hold the next page to open the quickmenu/select something! And connections are faster & consistent now.

The device struggled with a lot of crashes, but I’m happy to say that I’ve fixed it completely with another book format refactor!! So we can keep page caches for speedy page turns AND we get bluetooth support. Lots of safety checks to ensure memory safety!

Sync got a major rework, so now it works to disable your bluetooth device when you run a sync to preserve memory! And it disables the bluetooth option so you can’t glitch the system out. Now it’s only used for getting/removing books, and positional sync has been removed since it was kinda jank. Also fixed a bunch of stuff with the homelab so its more reliable now!

Lots of QoL stuff, like a low battery bar when you’re low on battery while reading (so it’s not distracting), better label names, removing unnecessary text like CHAPTER from the chapters selection, and faster button holding! More things like faster wakeups, refusing to boot when there’s no more SD card, and a massive cleanup because I had a really long debug session to fix the crashes with bluetooth. And I made the screen full-size vertically, for some reason we were missing some rows on the top which are now filled properly!

And the thing I’m most proud of: theres a new splash screen that I made myself!! Spent several hours perfecting it and I’m very proud of how it came out. Check it out!!!

Anyways, gonna make a vid and submit this project since I’m done!!

0
0
6
Open comments for this post

8h 31m 33s logged

HUGE usability improvements, optimizations, and the first new features of this firmware!!

So I know its been a few days since I haven’t posted an update here, but I have been reallly busy! I’ve got a lot of news, so let’s start from the top!!

Really cool thing happened today and yesterday - I brought my XTEINK X4 with me out in public! So we went to the post office (sat in line for a few hours) and read 35% of Alice in Wonderland using this custom firmware! It felt amazing, I was productive (rather than doomscrolling on my phone) and I got immersed in the story. So yeah, this firmware works. Was not distracted, and it was INSANELY efficent because my battery is still at 100% and I haven’t charged it since Friday (that’s two full days of reading and its still at full battery! Gotta love optimizing firmware and e-ink displays!!)

Now, this was mostly due to the major new optimizations that I have spent countless hours on. I experimented with turning off the display power rails after 5 seconds, but this was a realllly bad idea because I didnt test it properly and I ended up trying to read in bed with text overlapping each other because the power rails were actually needed to properly remove the old text during a page turn!!

By far the most helpful optimizations were the preloading and caching everywhere. This allowed for partial refreshes throughout everywhere on the display, which means less energy is spent on a full refresh but instead on a smaller piece of the screen. This meant that I could both improve the performance and reduce latency of the application AND reduce power usage, which was a massive win!!

I did a quick speed test comparison between my brother’s XTEINK running CrossPoint and my firmware and there is without a doubt that my firmware is faster now with these optimizations. Eyeballing it, it seems like i am getting 200% faster page turns and menu switching.

As if I couldn’t optimize more, I managed a few more major improvements. I made compiled books more sensible, since they no longer require the epub on the device and embed everything in the highly optimized binary file format. I made the file format even faster with image handling, and it is about as small file-size as it gets, so you can drop an 8GB or 4GB card in the device and get more books on it. I personally think I wouldnt ever hit 2GB of books on the device!

Structurally, the position files are no longer stored in a special directory and instead they are stored in the book folder, so you dont need to know its ID! And the actual data/settings are stored in a single file in the home now, so i just got rid of the .wintergreen/ folder, which is a nice little cleanup. This is as minimal as it gets now, SD card wise. This is better for the SD card health as well!!

As for the reading experience, there is SO much new and improved stuff. You know the sleep cover that appears when you turn the device off? It had annoying bars on the sides or the top, which was really distracting. I experimented with a background which filled to the same color as the book background, yet it was ugly and didnt work with books which had a different color on the sides.

So heres what I did differently which actually looks better than it sounds: i made the book stretch to fill! It actually makes the text look BETTER, everything looks nicer and we aren’t wasting any screen space with empty bars. Just look at the images below!! It looks amazing.

And in the quick menu, I made it so you can select the actual book to continue reading it again, without needing to move your thumb to the back button. I use this feature so often since its conveniently placed at the top near the settings, so you can adjust a setting, go up and then start reading again.

(I hit the 4000 character limit, posting a second devlog to finish this lol)

1
0
9
Open comments for this post

4h 2m 39s logged

Finally reworked the UI! After changing up the system font, I finally went through ALL of the pages, reorganized them and made it usable.

For starters, the home screen has a carousel now of the three most recently read books! I think it looks really nice. I also reworked how the buttons work, so now when you press the back button on the homepage, it’ll show you a list of all your books! This is very easily scrollable, which is perfect for a larger library. I also got rid of any unnecessary text everywhere, like the Wintergreen branding so everything just feels more clean. And it shows your reading percentage now!

I made the reader options experience SO much more intuitive. The two reader options have seperators and I renamed the menu to better match its purpose within the code. The chapters are easier to scroll now because we have adjustable button hold speeds, and the percentage of the book and chapter read has been moved into the book name and chapter name respectively!

So the buttons got me all confused, since it feels swapped sometimes. I made the side buttons intentionally swap top/botttom when you’re not in landscape, so things feel a bit more intuitive whether you’re in Portrait mode or not!

And of course the obligatory cleanup. Renamed a bunch of stuff and made the repo simpler with a massive reorganization effort, from /lib/wintergreen to just /wintergreen!

0
0
2
Open comments for this post

4h 8m 25s logged

Made a LOT of progress on the device’s usability!

First and foremost, as you can see from the images, I updated all the fonts. While yes, I would agree that Iosevka is not a great e-ink reading font, it makes for a good UI monospaced font. I also updated the font to Atkinson Hyperlegible which looks absolutely amazing. Just take a look at it yourself! I removed font sideloading so this is the forced font for all epubs. Learned a bit about font kerning and it looks pretty well-spaced now.

Secondly, the UI is a bit outdated but I got rid of even more book-related settings. Now it shows you the chapters in the book menu without any additional button presses! I am still keeping the options for landscape/horizontal mode (which also now inverts the button controls!)

Speaking of button controls, the top power button is now the action key! This is how you select a book, open the quick menu or select a chapter. It doubles as the power button when you hold it! This makes landscape reading MUCH more effective, which is a big goal of this firmware!

I went into the SD card and realized a few things. First, the epub books on the device are completely unnecessary. They are never really read from because the converted book binaries really never needed to reference them again. So now the binary book format includes everything that the epub had, and you dont need to have epubs on the device anymore - just run a script with a bunch of books and it’ll be put on the sd card automatically! This saves a lot of space and is better organized because books are now stored in folders with their images and data instead of an invisible cache folder.

Speaking of the cache folder, I made numerous improvements starting from a dramatic settings simplification going from 5 extra files to none! It’s just book positions, the persisted book settings (just the font size, orientation, and last read book!) and that’s it. It is super nice and simple now and I deduped a lot of settings that should’ve been in RAM.

I got rid of the book convert thing on the device, because now it runs on your computer! It realllly doesn’t make any sense to run computationally expensive operations on an ESP32… this is a much better way.

In terms of the UI, I got rid of the glyphs, icons, labels, hyperlinks, progress bars and dropped any of the other fonts on the device like Literata and Inter. There were also a lot of bug fixes, like making the screen actually show the book cover on sleep and opening the proper book on unsleep, at the right position. And a big one: I got rid of QEMU because I didnt really use it or need it, and it kinda bloated the codebase. That’s pretty much it!!!

0
0
23
Open comments for this post

3h 25m 30s logged

Improving the device’s performance, battery life and storage optimization

There was a lot of room for improvement on microreader’s infrastructure, and I have spent some considerable effort on making sure everything is fully optimized before I start working on redoing some of the UI.

For starters, I have removed the settings menu entirely and moved it to a text file, so everything is hardcoded at build time! This reduces the closure size and makes the system faster since it’s no longer reading from flash. You can see what the UI looks like now without the settings menu in the attached image.

There was a lot of trial and error of trying different values to see what’d work with things like SD card speed and QIO bootloader options. I found that when using the most optimal options, the device would refuse to boot or read from the SD card, so unfortunately the default bootloader options and 20mhz speed is the fastest this device can handle 😭 (tried 40 and even 26.67mhz)

I also tried using light sleeping but found that it doesn’t work either. It would’ve worked great for this device but due to some weird issues with the ESP32, when I unplug the device and run it off of battery the buttons would just stop working.

I have improved the SD card management so that there’s no backups and now there’s less overhead when writing book save data.

By far the most amount of time was spent on the config where I removed a lot of things from the closure and disabled unnecessary checks. For example, the bootloader ran a validation on the image on every boot, so disabling that made boots faster by about 100ms with zero drawbacks! I also stopped logging and kept with the repository cleanup so that now the flash went from 1.663mb/.123 to 1.573mb/.121mb, which is pretty small but still nice for making this device smaller and a lil bit faster.

So yeah, the project is in a VERY nice and optimized state right now. I am going to improve on its usability and UI!

0
0
7
Open comments for this post

44m 41s logged

Forked nous and rebranded it to Wintergreen! I laid out the project and everything in the github readme. I’m going to be optimizing this project for usability and performance over everything, unlike a lot of other custom firmwares for this device. I have gotten the builds working and there is no remnants of the original firmware that I forked from (nous or microreader) left other than the file format extensions. I will be working on those next! Very excited to start working on this!

0
0
23

Delete project?

Are you sure you want to permanently delete this project? This action cannot be undone.

All devlogs, followers, and associated data will be removed.

Followers

Loading…