{"id":19917409,"url":"https://github.com/ntherning/storytelreadermods","last_synced_at":"2025-06-14T01:36:32.551Z","repository":{"id":205250466,"uuid":"713320424","full_name":"ntherning/StorytelReaderMods","owner":"ntherning","description":"Modding the Storytel Reader E-ink tablet device","archived":false,"fork":false,"pushed_at":"2024-11-02T17:09:00.000Z","size":3020,"stargazers_count":26,"open_issues_count":1,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-04-07T11:51:34.756Z","etag":null,"topics":["adb","android","audiobook","custom-rom","ebook","ebook-reader","ereader","hack","hacking","mod","modding","rom","storytel","tablet"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ntherning.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2023-11-02T09:32:52.000Z","updated_at":"2025-04-03T20:39:35.000Z","dependencies_parsed_at":"2024-02-25T08:27:35.462Z","dependency_job_id":null,"html_url":"https://github.com/ntherning/StorytelReaderMods","commit_stats":null,"previous_names":["ntherning/storytelreadermods"],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ntherning%2FStorytelReaderMods","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ntherning%2FStorytelReaderMods/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ntherning%2FStorytelReaderMods/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ntherning%2FStorytelReaderMods/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ntherning","download_url":"https://codeload.github.com/ntherning/StorytelReaderMods/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252154734,"owners_count":21702982,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["adb","android","audiobook","custom-rom","ebook","ebook-reader","ereader","hack","hacking","mod","modding","rom","storytel","tablet"],"created_at":"2024-11-12T21:49:49.352Z","updated_at":"2025-05-03T06:30:49.271Z","avatar_url":"https://github.com/ntherning.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"## Introduction\n\nThe [Storytel Reader](https://www.storytel.com/reader) device (aka\n[Mofibo Reader](https://blog.mofibo.com/mofibo-reader/) in Denmark) is an\nAndroid based [e-book reader](https://en.wikipedia.org/wiki/E-reader) from\nSwedish company Storytel AB - providers of the\n[Storytel e-book and audiobook subscription service](https://www.storytel.com).\nDespite being based on Android, the device only allows one app to be run – the\nStorytel app.\n\n***Yeah, that's right, even if you paid €100 for it, you don't really own it –\ncancel that Storytel subscription and the device becomes useless.***\n\nThis project is an effort to unlock this device, to turn it into a generic\nAndroid E-ink tablet and let you do whatever you want with it.\n\n***You paid for it, so you should own it for real.***\n\n## Quickstart\n\n1. Determine [which version of the device](#versions) you have.\n2. Boot your device into [maskrom mode](#maskrom-mode).\n3. [Install](#installing-rkflashtool) `rkflashtool`.\n4. Backup the `boot` partition:\n    ```bash\n    rkflashtool r boot \u003e /some/safe/place/boot.img\n    ```\n\u003e [!IMPORTANT]\n\u003e BACKUP YOUR `boot` PARTITION!!!\n5. Download and flash the patched boot image for your device version:\n    ```bash\n    # Get patched boot image for 1st generation device\n    curl -OL \"https://github.com/ntherning/StorytelReaderMods/releases/latest/download/boot-gen1-patched.img.zip\"\n    # Extract (macOS/Linux)\n    unzip boot-gen1-patched.img.zip\n    # Extract (Windows)\n    tar -xf boot-gen1-patched.img.zip\n    # And flash it to the boot partition\n    rkflashtool w boot \u003c boot-gen1-patched.img\n\n    # Get patched boot image for 2nd generation device\n    curl -OL \"https://github.com/ntherning/StorytelReaderMods/releases/latest/download/boot-gen2-patched.img.zip\"\n    # Extract (macOS/Linux)\n    unzip boot-gen2-patched.img.zip\n    # Extract (Windows)\n    tar -xf boot-gen2-patched.img.zip\n    # And flash it to the boot partition\n    rkflashtool w boot \u003c boot-gen2-patched.img\n    ```\n6. Reboot the device:\n    ```bash\n    rkflashtool b\n    ```\n7. Install the Android SDK Platform Tools to get the ADB command which is\n   needed to install new apps to the device. The package can be downloaded\n   from https://developer.android.com/tools/releases/platform-tools. XDA has a\n   great guide on [how to install the SDK Platform Tools for Windows, macOS\n   and\n   Linux](https://www.xda-developers.com/install-adb-windows-macos-linux/#how-to-set-up-adb-on-your-computer).\n8. Congratulations! If all worked you should now be able to connect to your\n   device via [ADB](https://developer.android.com/tools/adb) and install new\n   apps and more. Have a look at the [recipes](#recipes) below for instructions\n   on how to install some useful apps.\n\n1st generation Storytel Reader device running F-Droid\n[![Photo of 1st generation Storytel Reader device running F-Droid](images/gen1-running-fdroid.jpg)](images/gen1-running-fdroid.jpg)\n\n2nd generation Storytel Reader device running RelaunchX\n[![Photo of 2nd generation Storytel Reader device running RelaunchX](images/gen2-running-relaunchx.jpg)](images/gen2-running-relaunchx.jpg)\n\n## Versions\n\nThere are two different versions of the Storytel Reader. Physically, from the\noutside, they look almost identical apart from the type of USB port they are\nequipped with – micro-USB port on the 1st generation device, USB-C on the 2nd\ngeneration device.\n\n[![Photo of 1st and 2nd generation Storytel Reader devices](images/gen1-gen2-identify.jpg)](images/gen1-gen2-identify.jpg)\n\n## Technical specifications\n\n|              | 1st generation                                                                                                                       | 2nd generation                                                                                                                       |\n|--------------|--------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------|\n| SoC          | [Rockchip RK3026](https://web.archive.org/web/20161129092652/http://www.rock-chips.com/a/en/products/RK30_Series/2013/0731/371.html) | [Rockchip RK3128](https://web.archive.org/web/20161118024804/http://www.rock-chips.com/a/en/products/RK31_Series/2014/0924/525.html) |\n| CPU          | Dual-Core ARM Cortex-A9, XXX GHz                                                                                                     | Quad-Core ARM Cortex-A7, XXX GHz                                                                                                     |\n| GPU          | ARM Mali-400MP                                                                                                                       | ARM Mali-400MP                                                                                                                       |\n| RAM          | 512 MB                                                                                                                               | 1 GB                                                                                                                                 |\n| Storage      | 8 GB eMMC                                                                                                                            | 8 GB eMMC                                                                                                                            |\n| Display      |                                                                                                                                      |                                                                                                                                      |\n| Connectivity | Wi-Fi                                                                                                                                | Wi-Fi, Bluetooth                                                                                                                     |\n| OS           | Android 4.2                                                                                                                          | Android 6                                                                                                                            |\n\n## Origin\n\nBoth generations of the device have been manufactured by the\n[Chinese company ONYX](https://onyxboox.com) and are most likely rebranded and\nslightly customized versions of devices in their\n[ONYX BOOX line of products](https://onyxboox.com/product).\n\n## Recovery mode\n\nBoth generations can be booted into recovery mode. Unfortunately not much can\nbe done from the recovery mode in terms of modding. The 1st gen device appears\nto support sideloading updates via `adb sideload` but the `update.zip` likely\nneeds to be signed with a private key which we don't have access to.\n\nThe 2nd gen device doesn't seem to support sideloading via recovery at all.\n\nBoth devices' recovery menus display options to wipe the `data` (effectively a\nfactory reset) and `cache` partitions.\n\n### 1st generation\n\nTo start the 1st generation Storytel Reader in recovery mode do the following:\n\n1. Make sure the device is powered off (blue LED is turned off) and unplugged\n   from USB.\n2. Press and hold the orange button below the screen.\n3. Press and hold the power button next to the power LED at the top of the\n   device.\n4. Keep pressing both buttons until \"Recovery system ...\" is printed on the\n   screen. It usually takes about 15 seconds.\n5. Your device is now in recovery mode.\n\n[![Photo of 1st generation Storytel Reader in recovery mode](images/gen1-recovery.jpg)](images/gen1-recovery.jpg)\n\n### 2nd generation\n\nTo start the 2nd generation Storytel Reader in recovery mode do the following:\n\n1. Make sure the device is powered off (blue power LED is off) and\n   unplugged from USB.\n2. Press and hold the orange button below the screen.\n3. Connect the device to a wall plugged charger while still holding the\n   button. **NOTE**: Do not connect the device to a PC. It will charge but\n   depending on the type of cable the device might not enter recovery mode.\n4. Keep pressing the button until \"Supported API: ...\" is printed at the\n   bottom of the screen. It may take 10-15 seconds.\n5. Your device is now in recovery mode and can be unplugged from the charger.\n\n[![Photo of 2nd generation Storytel Reader in recovery mode](images/gen2-recovery.jpg)](images/gen2-recovery.jpg)\n\n## Maskrom mode\n\n[Maskrom mode](http://rockchip.wikidot.com/how-to-enter-rockusb-maskrom-mode)\nis a special feature of the Rockchip SoCs in these devices. It gives us full\ncontrol over the flash memory partitioning, lets us backup and reflash\npartitions and modify the kernel commandline and other boot parameters. The SoC\nwill automatically enter maskrom mode if it is unable to find a partition to\nboot from. This is a very neat feature as it gives us a last resort if we\naccidentally brick the device.\n\nThe process to enter maskrom mode is the same on both generations of the\nStorytel Reader:\n\n1. Make sure the device is powered off (blue LED is turned off) and unplugged\n   from USB.\n2. Connect a USB-A data cable to your Mac or PC. It has to be USB-A and the\n   other side of the cable must be micro-USB for the 1st gen and USB-C for the\n   2nd gen. A USB-C to USB-C data cable does not seem to work for 2nd gen\n   devices.\n3. Press and hold the orange button below the screen.\n4. While pressing the button connect the USB data cable to the device.\n5. The blue power LED will light up. Keep pressing the button for a few seconds.\n\n\u003e [!IMPORTANT]\n\u003e The display will not react and the device will appear to be powered off. Don't\n\u003e worry though, the device will still enter maskrom mode.\n\n### Verify maskrom mode enabled\n\nOn **macOS**\nuse [System Report](https://support.apple.com/guide/mac-help/get-system-information-about-your-mac-syspr35536/mac).\nUnder *Hardware -\u003e USB* you should see a device with a *Vendor ID* of `0x2207`\nand *Product ID* of either `0x292c` (1st gen device) or `0x310c` (2nd gen\ndevice).\n\n[![Screenshot of macOS System Report displaying properties of connected 1st generation and 2nd generation Storytel Reader devices in maskrom mode](images/system-report-usb-devices.jpg)](images/system-report-usb-devices.jpg)\n\nOn **Linux** run `lsusb` in a terminal window:\n\n```bash\nlsusb\n# ID 2207:292c -\u003e 1st gen device\nBus 003 Device 002: ID 2207:292c Fuzhou Rockchip Electronics Company RK3026 in Mask ROM mode\n# ID 2207:310c -\u003e 2nd gen device\nBus 003 Device 003: ID 2207:310c Fuzhou Rockchip Electronics Company RK3126/RK3128 in Mask ROM mode\n```\n\nOn **Windows 10/11** launch *Device Manager* (Win+R shortcut, then type\n`devmgmt.msc`). Double-click any *Unknown device* under *Other devices* and\ncheck the *Details* tab. You should find a device with value\n`USB\\VID_2207\u0026PID_292c\u0026...` (1st gen device) or `USB\\VID_2207\u0026PID_310c\u0026...`\n(2nd gen device).\n\n[![Screenshot of Windows 10/11 Device Manager displaying properties of connected 1st generation and 2nd generation Storytel Reader devices in maskrom mode](images/windows-device-manager.png)](images/windows-device-manager.png)\n\n## Read/write flash memory partitions\n\nNow that the device is in [mask rom mode](#maskrom-mode) we can use\n`rkflashtool` to read and write partitions on the device's flash memory.\n\n### Installing rkflashtool\n\nOn **macOS** `rkflashtool` is available via [Homebrew](https://brew.sh/):\n\n```bash\nbrew install rkflashtool\n```\n\nOn **Ubuntu** and **Debian** `rkflashtool` is available in the package\nrepository:\n\n```bash\napt install -y rkflashtool\n```\n\nOn other **Linux** distributions `rkflashtool` can be built from the sources at\nhttps://github.com/ntherning/rkflashtool.\n\nOn **Windows 10/11** (64-bit) a prebuilt `rkflashtool` can be downloaded from\nthis project. Use [this download link](https://raw.githubusercontent.com/ntherning/StorytelReaderMods/main/tools/windows-x86_64/rkflashtool.exe)\nor run `curl` from `cmd.exe`:\n\n```shell\ncurl -O \"https://raw.githubusercontent.com/ntherning/StorytelReaderMods/main/tools/windows-x86_64/rkflashtool.exe\"\n```\n\nFor the remainder of this doc it is assumed that `rkflashtool.exe` is in the\ncurrent directory or has been installed to a directory listed in the Windows\n`%PATH%` environment variable.\n\n\u003e [!IMPORTANT]\n\u003e `rkflashtool` depends on [libusb](https://libusb.info/) (which is\n\u003e statically linked into the `.exe` downloaded above). To use libusb on Windows\n\u003e a [supported driver](https://github.com/libusb/libusb/wiki/Windows#user-content-Driver_Installation)\n\u003e must be installed. WinUSB is recommended and can be installed via\n\u003e [Zadig](https://zadig.akeo.ie/).\n\nHere are screenshots of Zadig installing the WinUSB driver for 1st generation\ndevice (`USB ID` is `2207:292C`) and 2nd generation device (`USB ID` is\n`2207:310C`). We have also given the devices nice descriptive names by checking\nthe *Edit* box and entering the new name in the text field. This name will be\nshown in *Device Manager*.\n\n[![Screenshot of Zadig installing WinUSB driver for 1st generation device](images/zadig-gen1.png)](images/zadig-gen1.png)\n\n[![Screenshot of Zadig installing WinUSB driver for 2nd generation device](images/zadig-gen2.png)](images/zadig-gen2.png)\n\n### Testing rkflashtool\n\nOnce `rkflashtool` has been [installed](#installing-rkflashtool) properly and\n`rkflashtool` is in the `$PATH` and a Storytel Reader device is connected in \n[maskrom mode](#maskrom-mode) you should be able to run `rkflashtool p` and get\noutput similar to:\n\n```bash\n# 1st generation device\nrkflashtool p\n\nrkflashtool: info: rkflashtool v6.1\nrkflashtool: info: Detected RK3026...\nrkflashtool: info: interface claimed\nrkflashtool: info: reading parameters at offset 0x00000000\nrkflashtool: info: size:  0x000002b1\nFIRMWARE_VER:4.2.2\nMACHINE_MODEL:rk30sdk\nMACHINE_ID:007\nMANUFACTURER:RK30SDK\nMAGIC: 0x5041524B\nATAG: 0x60000800\nMACHINE: 3066\nCHECK_MASK: 0x80\nKERNEL_IMG: 0x60408000\nWAV_ADDR:0x7ff00000\nRECOVER_KEY: 1,3,30,60,0\nPWR_HLD:0,1,A,1,1\nCMDLINE:console=ttyFIQ0 androidboot.console=ttyFIQ0 waveform_addr=0x7ff00000 init=/init initrd=0x62000000,0x00800000 mtdparts=rk29xxnand:0x00002000@0x00002000(misc),0x00004000@0x00004000(kernel),0x00008000@0x00008000(boot),0x00010000@0x00010000(recovery),0x00100000@0x00020000(backup),0x000c8000@0x00120000(cache),0x00190000@0x001e8000(userdata),0x00002000@0x00378000(kpanic),0x00100000@0x0037a000(system),-@0x0047a000(user) pcb_ver=2 onyx_emmc=1\n```\n\n```bash\n# 2nd generation device\nrkflashtool p\n\nrkflashtool: info: rkflashtool v6.1\nrkflashtool: info: Detected RK312X...\nrkflashtool: info: interface claimed\nrkflashtool: info: reading parameters at offset 0x00000000\nrkflashtool: info: size:  0x00000335\nFIRMWARE_VER:6.0.0\nMACHINE_MODEL:rk312x\nMACHINE_ID:007\nMANUFACTURER:RK30SDK\nMAGIC: 0x5041524B\nATAG: 0x60000800\nMACHINE: 312x\nCHECK_MASK: 0x80\nKERNEL_IMG: 0x60408000\n#RECOVER_KEY: 1,1,0,20,0\nCMDLINE:console=ttyFIQ0 androidboot.baseband=N/A androidboot.selinux=permissive androidboot.hardware=rk30board androidboot.console=ttyFIQ0 init=/init initrd=0x62000000,0x00800000 mtdparts=rk29xxnand:0x00002000@0x00002000(uboot),0x00002000@0x00004000(misc),0x00008000@0x00006000(resource),0x00008000@0x0000e000(kernel),0x00010000@0x00016000(boot),0x00010000@0x00026000(recovery),0x0001a000@0x00036000(backup),0x000A0000@0x00050000(cache),0x00002000@0x000F0000(kpanic),0x00300000@0x000F2000(system),0x00008000@0x003F2000(metadata),0x00020000@0x00400000(radical_update),0x00008000@0x00420000(vendor),-@0x00428000(userdata)\n```\n\n### Partitions\n\nThe `CMDLINE` parameter we get from `rkflashtool p` is the command line used to\ninitialize the Linux kernel. The `mtdparts` kernel command line parameter\nreveals how the device's flash is partitioned. After `mtdparts=rk29xxnand:`\neach partition is specified on the format `size@offset(partition_name)` where\n`size` is the size of the partition in 512 byte sectors and `offset` is the\noffset of the partition from the start of the flash memory, again in 512 byte\nsectors.\n\nThe 1st generation partition string `0x00100000@0x0037a000(system)` specifies\nthat there is a partition named `system` at sector `0x0037a000` and with a size\nof `0x00100000` sectors, i.e. 512 MB.\n\nThe last partition can look like `-@offset(partition_name)` where the `-` size\nmeans that the partition takes up the rest of the space on the flash memory.\n\n#### 1st generation device partitions\n\n| Size       | Offset     | Name     |\n|------------|------------|----------|\n| 0x00002000 | 0x00002000 | misc     |\n| 0x00004000 | 0x00004000 | kernel   |\n| 0x00008000 | 0x00008000 | boot     |\n| 0x00010000 | 0x00010000 | recovery |\n| 0x00100000 | 0x00020000 | backup   |\n| 0x000c8000 | 0x00120000 | cache    |\n| 0x00190000 | 0x001e8000 | userdata |\n| 0x00002000 | 0x00378000 | kpanic   |\n| 0x00100000 | 0x0037a000 | system   |\n| -          | 0x0047a000 | user     |\n\n#### 2nd generation device partitions\n\n| Size       | Offset     | Name           |\n|------------|------------|----------------|\n| 0x00002000 | 0x00002000 | uboot          |\n| 0x00002000 | 0x00004000 | misc           |\n| 0x00008000 | 0x00006000 | resource       |\n| 0x00008000 | 0x0000e000 | kernel         |\n| 0x00010000 | 0x00016000 | boot           |\n| 0x00010000 | 0x00026000 | recovery       |\n| 0x0001a000 | 0x00036000 | backup         |\n| 0x000A0000 | 0x00050000 | cache          |\n| 0x00002000 | 0x000F0000 | kpanic         |\n| 0x00300000 | 0x000F2000 | system         |\n| 0x00008000 | 0x003F2000 | metadata       |\n| 0x00020000 | 0x00400000 | radical_update |\n| 0x00008000 | 0x00420000 | vendor         |\n| -          | 0x00428000 | userdata       |\n\n## Patching the boot partition\n\nIn order to make modifications, such as installing custom apps, we need to\nenable [Android Debug Bridge (ADB)](https://developer.android.com/tools/adb)\nsupport on the device. Out of the box the Storytel Reader comes with ADB\ndisabled via certain properties in the `/system/build.prop` file on the `system`\npartition.\n\nOne approach to enable ADB would be to use `rkflashtool` to dump the\n`system` partition to a file, mount it locally, edit `build.prop` to set\nthe required properties and then write the modified `system` partition file back\nto the flash memory. This is easy enough on Linux as the `system` partition is\nformatted using the `ext4` filesystem, native to Linux. On Windows and macOS\n`ext4` filesystems are not that easy to mount in writable mode. Furthermore, on\nthe 2nd generation device which runs Android 6, we also have to make changes to\nother partitions in order to circumvent ADB client device authentication (for\nsome unknown reason the *Allow USB debugging* dialog is never displayed –\nthere is no way to allow the ADB client to connect).\n\nThe approach we will take here is to modify the Linux kernel ramdisk in the\n`boot` partition. We will modify the `init.rc` and set the properties which\nenable ADB *after* the `/system/build.prop` file is loaded. On 2nd generation\ndevices we will also patch the ramdisk with\n[magisk](https://github.com/topjohnwu/Magisk) to gain full root permission and\nbe able to use `su` via ADB.\n\n### Required software\n\nWe need Git and Python 3 to run the scripts to patch the `boot` partition.\n\nOn **macOS** you get Git and Python 3 by installing the Xcode command line\ndeveloper tools:\n\n```bash\nxcode-select --install\n```\n\nOr alternatively one can use [Homebrew](https://brew.sh/):\n\n```bash\nbrew install git python3\n```\n\nOn **Linux** Git and Python 3 should be available in your distribution's\npackage repository. E.g. on Ubuntu and Debian:\n\n```bash\napt install -y git python3\n```\n\nOn **Windows 10/11** download and install [Git](https://git-scm.com/download/win) and\n[Python 3](https://www.python.org/downloads/windows/). Both are available via\n[winget](https://learn.microsoft.com/en-us/windows/package-manager/winget/).\nMake sure `git.exe` and `python3.exe` is in your `PATH`.\n\n### Patching the boot partition\n\nClone this repository using `git`:\n\n```bash\ngit clone https://github.com/ntherning/StorytelReaderMods.git\ncd StorytelReaderMods/\ngit submodule init\ngit submodule update\n```\n\n#### Patching 1st generation boot partition\n\nRun `tools/repack.py` to patch the `boot` partition from a **1st generation**\ndevice:\n\n```bash\ncd StorytelReaderMods/\nmkdir tmp\nrkflashtool r boot \u003e tmp/boot.img\npython3 tools/repack.py --boot_img tmp/boot.img --out_img tmp/boot-gen1-patched.img --mods_dir mods/gen1/\n```\n\n#### Patching 2nd generation boot partition\n\nRun `tools/repack.py` to patch the `boot` partition from a **2nd generation**\ndevice:\n\n```bash\ncd StorytelReaderMods/\nmkdir tmp\nrkflashtool r boot \u003e tmp/boot.img\npython3 tools/repack.py --boot_img tmp/boot.img --out_img tmp/boot-gen2-patched.img --mods_dir mods/gen2/\n```\n\n## Recipes\n\nHere are instructions for installing some nice to have apps on your Storytel\nReader.\n\n### F-Droid\n\n[F-Droid](https://f-droid.org) is an alternative to Google Play Store for\ninstalling FOSS (Free and Open Source Software) apps. Unfortunately the latest\nversion is not compatible with the 1st generation Storytel Reader as it runs\nAndroid 4.2.2 – instead we have to use the last version compatible version.\n\n1st generation:\n```bash\ncurl -O \"https://f-droid.org/archive/org.fdroid.fdroid_1012051.apk\"\nadb install org.fdroid.fdroid_1012051.apk\n# Launch F-Droid\nadb shell monkey -p org.fdroid.fdroid -v 1\n```\n\n2nd generation:\n```bash\ncurl -O \"https://f-droid.org/F-Droid.apk\"\nadb install F-Droid.apk\n# Launch F-Droid\nadb shell monkey -p org.fdroid.fdroid -v 1\n```\n\n### RelaunchX\n\nOnce [F-Droid](#f-droid) is installed you can use it to install\n[RelaunchX](https://f-droid.org/en/packages/com.gacode.relaunchx/) – a launcher\ntargeted at devices with E-Ink displays.\n\n\u003e [!WARNING]\n\u003e After installing RelaunchX it is recommended to reboot your\n\u003e device. It has been\n\u003e [reported](https://github.com/ntherning/StorytelReaderMods/discussions/2#discussioncomment-8036927)\n\u003e that, without a reboot, no apps will show up in RelaunchX.\n\n### KOReader\n\n[KOReader](https://f-droid.org/en/packages/org.koreader.launcher.fdroid/) is\nan Ebook reader with support for many formats like PDF, DjVu, EPUB, FB2, CBZ. It\nis available via [F-Droid](#f-droid).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fntherning%2Fstorytelreadermods","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fntherning%2Fstorytelreadermods","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fntherning%2Fstorytelreadermods/lists"}