Skip to content

About

Independent open source Pico e-paper reader firmware with browser flashing

Resources

Code of conduct

Contributing

Security policy

Stars

19 stars

Watchers

1 watching

Forks

Latest commit

 

History

118 Commits

Folders and files

kiikoread

The public project name is kiikoread. The website calls the device an ink-screen reader; the GitHub URL and legacy update/backup filenames remain compatible. Firmware UI branding also uses kiikoread. The bright-white website includes screen previews, features, version selection, web USB flashing, Bin downloads and an online user manual. Stage it with python3 tools/stage_public_flash.py _site; both GitHub Pages and Cloudflare Pages can serve _site. The PDF can be regenerated from docs/user-manual.zh-CN.json with tools/build_user_manual.py --font /path/to/a/static-CJK.ttf (Python ReportLab required). Official firmware binaries are stored in GitHub Releases. The verified site staging step retrieves the matching assets; do not publish the raw flash directory. Device OTA checks https://kiikoread.com/update.json first, with the existing GitHub Pages feed as a fallback. Stage the primary site with python3 tools/stage_public_flash.py _site --ota-origin https://kiikoread.com; keep the default origin for GitHub Pages.

简体中文 · 日本語 · Third-party notices

An independent, open-source reading firmware for the MindReset RDP-G01-W ESP32-S3 e-paper board. It is based on MindReset's official demo firmware, but is not an official MindReset release.

The current interface has Home, Bookshelf, Files, and Settings. It reads EPUB and TXT books from a TF card, remembers reading progress, and supports Wi-Fi, hotspot, or USB file transfer. The online flasher installs the same firmware image as the local flash/ bundle.

Current release: rc90

This release improves startup recovery and cover-cache memory use, restores reading after deep sleep, adds custom middle-hold actions and protects the Tools entry. Tickets use the system font; home and reader titles reuse their respective active fonts at native sizes. USB, TF and OTA share one build and short device notes. rc87 is withdrawn; original rc85/rc86 releases remain selectable. See the changelog.

Main refresh and reader controls

Settings → Display → Main refresh mode offers ordinary, fast and water, defaulting to ordinary. Ordinary/water retain grays; fast uses monochrome covers and fine checkerboard acrylic. Four main screens retain navigation icons/labels and locally move the selection marker. Navigation feedback preserves its gray background in all modes.

The source version of main-screen water refresh uses 16 bands, launching one per tick to reduce the animation from 83 to 52 ticks. It retains the 12ms target and all 37 phases per pixel: the software target falls from about 996ms to 624ms, while actual page switches also include rendering and scan time. Bands are slightly wider; gray waveforms, fixed navigation and failure recovery remain, and reader page turns are unaffected. This optimization is not included in the published rc89 firmware; optical gray quality and ghosting still require device acceptance.

List covers bounce gently and settle before opening. Only the cover movement region updates: fast mode uses monochrome differentials, ordinary/water retain grays, without an extra feedback frame.

Swipe down from the top edge to open the WiFi, Bluetooth, refresh and lock controls; swipe up, tap outside or press Back to close. WiFi connects the last saved network or disconnects it, unless a transfer is busy. Reader key controls offer custom actions and two presets. The default is Previous / Tools / Next; the second is Home / Full screen / Tools. A middle hold defaults to refresh and can also be mapped to Home or other actions. At least one of the three short presses or the middle hold must open Tools; startup and backup restoration repair a missing entry to middle-short Tools. Center double taps always toggle full screen, independently of mappings. Single taps use left/right halves or upper 1/3 / lower 2/3. New books open full screen; a page turn dismisses Tools and returns to full screen. These choices persist across reboot and configuration restore.

The firmware checkpoints the book, position and full-screen state before lock, consuming deep-wake resume only once. Interrupted opening routes to an operable recovery page with the book name, Home and confirmed deletion, without automatic retries. Tickets always use the system face and restore the reader face on light wake. Quick controls retain grayscale borders in all main modes. Fast mode retains only BW covers; ordinary/water retain only gray covers and free obsolete formats on a policy change. Home resume titles reuse the active system face at 40px; reader book/chapter titles reuse the reader face at 32/48px. Outlines rasterize directly without additional built-in fonts or simultaneously loading system and reader faces; unavailable faces retain the safe built-in missing-glyph fallback. These changes are included in rc88.

Keyboard

Rename, profile name, status signature, shelf search and WiFi password fields share one keyboard. T9 inputs Chinese Pinyin only; QWERTY supports Chinese/English and case switching. Digits are entered from the numeric panel only. Continuous Pinyin uses 487 offline common phrases, pageable homophones and continuations; select a candidate before saving. Tap text or caret arrows to insert and delete in the middle. Holding backspace for half a second repeats deletion, removing pending Pinyin before text at the caret; release or move away to stop. Ordinary input/deletion refreshes changed regions only. After six candidate-strip changes, a 700 ms touch-free pause triggers one local grayscale settle; typing, held deletion and layout switches defer or cancel it. Keys darken/inset on press and restore on release. T9 More cycles through readings; homophones remain available across batches. The embedded black face covers all 6,763 GB2312 Han characters without a TF font package. WiFi passwords use ASCII QWERTY, digits and symbols. Both AP and STA web transfer pages can save or clear the persistent status signature (up to 95 UTF-8 bytes). These features are included in the rc86 release.

Online installation

Select the latest release or the original rc86 / rc85 build above the connection button. The publication time and TF-image download follow the selection. Ordinary installation keeps the preserve-data default for all versions.

Visit the HTTPS web flasher. Use a desktop Chrome or Edge browser with a USB data cable. Select the ink-screen reader’s serial device and follow the prompts. Check the board model before flashing. Ordinary installation preserves the device's settings and reading records, as well as TF-card contents. It does not include books or sample reading history.

If automatic entry to download mode fails on a device already running this firmware, open Settings → Upgrade & restore → BOOT flashing on the device, wait for the computer to detect its serial port again, then retry the web flasher.

The release manifest is flash/manifest.json; it flashes the bootloader, partition table, application, and the OTA data partition. Existing NVS settings and the internal book partition are preserved. The site is published from an explicit allowlist in .github/workflows/pages.yml, so local books, backups, and extra font packages are not uploaded. See the release changelog.

Online updates

Open Settings → Upgrade & restore → System update → Check for updates after connecting Wi-Fi. From rc84 onward, the update offer displays short release notes with Later and Start update buttons. Older versions can read the notes on the web flasher before updating to rc84.

The local fix releases off-screen cover caches before online updates and reports insufficient memory safely. Display scans and incremental flash writes are serialized. After at least five seconds and five percentage points of growth, progress appends only newly completed black pixels and updates the percentage, without erasing completed segments or triggering periodic page wipes. Exiting, locking and cancellation still join the worker; failed validation keeps the current boot slot.

Local TF-card updates

Local updates require one complete computer installation of an OTA base build so the bootloader and dual-slot partition table are present. That migration keeps the existing settings, reading records, internal-storage addresses, and TF-card contents. Later, copy the application image to the TF-card root as Pico-update.bin, then open Settings → Upgrade & restore → System update → TF-card update.

kiikoread checks the image project, version, size, and headers before writing the inactive firmware slot. It selects the new slot only after full image validation. If the new image resets before its first hardware and UI startup check succeeds, the bootloader returns to the previous slot. Keep power connected and the TF card inserted during installation. An application-only update cannot replace the initial OTA base installation and cannot change the bootloader or partition table.

Build from source

Use ESP-IDF v6.1 for ESP32-S3:

idf.py set-target esp32s3
idf.py build

The board-specific flash and PSRAM timing is in sdkconfig.defaults. sdkconfig.ci is for compile checks only. Follow the MindReset hardware documentation for the board. A prebuilt firmware image is provided for the RDP-G01-W only.

Books and fonts

TF storage currently supports FAT16/FAT32; exFAT is not enabled. Capacity alone does not establish compatibility. The local development build retries 40 MHz after a 250 ms settle, then falls back to 20/10 MHz, including busy high-speed negotiation. Failed card-detect communication preserves the last snapshot instead of pretending the card was removed; an unreadable detect signal permits a bounded actual mount attempt. Initialization failures never automatically suggest or perform formatting. Real removal still invalidates open-file state; recovery requires closing consumers and explicit remounting or restarting the device.

On first mount, the firmware creates books, fonts, and pictures folders on the TF card if absent. No books are preloaded. The firmware embeds a subset of Noto Sans SC Medium for the system UI and distributes no additional font package. Users may place their own compatible fonts in fonts for reading. The embedded subset remains under the SIL Open Font License.

Shelf styles retain “Dark rail” and “Acrylic shelf”, with nine books per page. Saved or restored pocket/spine choices fall back to acrylic.

The local development build adds Settings → Lock style → Library collage. Real covers keep their source aspect ratios, rounded corners and a shared 15° tilt; recent books occupy the middle. The profile name appears at the upper left, with a large book count and smaller unit at the lower right. Text is rasterized from the selected system font, never the independent reading face; light-sleep wake restores the previous font context. The collage always uses 16 grays and stable dithering, regardless of the main refresh mode. SD caches under .readpico/locks rebuild when the profile, font or library changes. First-time cover preparation takes longer; low memory uses a safe lock fallback.

Pale collage covers receive a fine rounded gray outline to keep their edges visible on white. Settings → Reading & device → Lock password adds an optional four-digit PIN, off by default. Enabling requires two matching entries; changing or disabling requires the current PIN. Wake and cold boot require verification before returning to the saved page. Pressed circles preview an input; only a valid release commits it. Cancel returns to the lock face, and Delete removes one digit. The actual lock background uses a lighter blur cached once. Wake and cold boot present the complete pad once, with a rounded lock icon and crisp controls; typing does not trigger backdrop updates. Key feedback updates locally. Text uses the selected system face, with a built-in fallback if it is unavailable. Only a salted digest is stored; ordinary configuration backups neither contain nor replace this credential.

Automatic sleep and manual lock both use the selected lock style. PIN backgrounds are reused only for the matching style and wallpaper identity; changing styles or the wallpaper causes a redraw on cold/deep wake, without changing PIN protection. To select wallpaper mode, confirm an image in the wallpaper preview.

TXT/EPUB books opened from any TF-card directory appear on the shelf after progress is saved, including on cached returns without a rescan. Bookshelf management → Remove from shelf hides selected books while keeping their files, progress, and favorites. Reading a removed book puts it back. Removal state persists and is included in configuration backups.

TXT books and EPUB books without a valid embedded cover receive a deterministic grayscale cover shared by the shelf, home, and ticket lock screen. A valid EPUB cover takes priority. Generated covers are cached under .readpico/covers on the TF card and rebuilt when the file or title changes.

In Reading settings → Typography, first-line indent can be set to 0, 1, 2, or 3 characters (2 by default). Fine adjustment moves body first lines by 1px within -20..+20px (default 0); tap the value to reset. No-indent ignores the offset; restart and backups retain it. Body text is centered by whole-character columns to balance the side margins, and common Chinese punctuation is kept away from prohibited line starts and ends.

Horizontal swipes turn reading pages in either tap-area mode. With vertical tap areas selected, vertical swipes also turn pages. Continuous punctuation groups stay together at line boundaries. Small JPG/PNG illustrations may share a page with surrounding text; large illustrations and image-only chapters keep their own pages.

Settings → Reading & device → Automatic lock offers 1, 5, or 10 minutes of inactivity, or Off (default). Touch and button input restart the timer. Transfers and upgrades pause it. Automatic locking saves the current reading state and uses the existing light-sleep/deep-sleep lock behavior. This choice is included in settings backups.

TF-card JPG/PNG files can be up to 50 MiB, with source dimensions up to 8,192 pixels per side. They are read as streams rather than loaded entirely into memory; decoded output stays within one screen. Progressive JPEG uses the existing reduced-resolution DC decoder, and interlaced PNG remains unsupported. These TF-file limits do not change the EPUB image-resource limit below.

To back up personal settings, open Settings → Save & restore → Save to TF card. The device writes Pico-settings.backup to the TF-card root. Put that file back at the root and choose Restore from TF card to recover fonts, typography, display and lock settings, profile and status signature, saved Wi-Fi name and password, book progress, reading time, bookmarks, favorites, custom book names, and shelf removals. Book, font, avatar, and wallpaper files remain on the TF card. The backup contains the Wi-Fi password in plaintext, so keep the TF card private. Missing external fonts and images fall back to built-in options. Older backups remain readable and leave the current network configuration unchanged.

EPUB metadata is allocated for the actual book size. ZIP entries and chapters each have an 8,192-item limit; covers, images, and navigation also consume ZIP entries. A book may exceed 32 MB overall, while each XHTML resource remains limited to 4 MB and each decompressed image to 8 MB; available device memory and standard ZIP limits also apply.

EPUB body chapters begin on a new page, keeping the title with the opening text when it fits. This also applies to recognized chapter headings within one XHTML resource. TOC links, introductory information and copyright metadata are excluded from body chapter detection; ordinary subheadings continue on the current page. Detection uses authored navigation, standalone numbered headings and body structure; books without reliable markers may still need individual compatibility fixes.

Licenses and credit

The fork retains the upstream Apache-2.0 license and notices. The UI icon set comes from Lucide under its ISC notice. The modified epdiy driver uses LGPL-3.0-or-later, and pypinyin dictionary data uses MIT. See Third-party notices and component directories for the exact scope; a component license does not change the license of the entire firmware.

Please report firmware bugs in this repository, not in the MindReset upstream issue tracker. Hardware purchasing and repair remain matters for the official support channels.

File transfer

File management shows WiFi transfer, Hotspot transfer and USB transfer directly. WiFi connects to a saved network or opens network setup; hotspot mode starts the device access point; USB exposes the TF card to the computer. AP/STA browser transfer keeps directory browsing, arbitrary-file uploads and status-signature editing.

Shake-to-turn is off by default and enabled in reader Font Settings. A horizontal left/right impulse turns to the previous/next page. Slow tilts, other axes, touch and rebounds are filtered; wait through an 800 ms cooldown and rest before the next gesture. Direction and sensitivity still need device validation. The global refresh test option is removed and ignored in older configurations.

Local test: list shelf and lock feedback

Settings → Display → Shelf style adds a four-book list with uniform 120×156px covers (aspect fill, centered cropping), author, progress and favorite badges, and at most two title lines. Existing paging, management and favorite ordering remain available. The choice persists across restart and backup restoration. Normal/ripple retain gray covers; fast mode retains only BW covers.

Dark two-pixel frames and separators remain visible in fast/ripple modes. PIN entry paints the complete screen once, without a second backdrop stage. PIN input updates only the inner circular feedback and password dots with local BW differences, without rerendering artwork or glyphs. Delete removes one digit; Cancel keeps the device locked. Collage covers gain soft shadows and thinner white typography outlines, with cache invalidation. Wallpaper, ticket and collage images use physical 16-level grayscale with ordered dithering of 256-level source brightness, rather than native 256-level hardware.

About

Independent open source Pico e-paper reader firmware with browser flashing

Resources

Code of conduct

Contributing

Security policy

Stars

19 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages