KindleEar's last release tag is 21 months older than its last commit
Aggregates RSS and web content(Calibre recipe), sends to Kindle, and includes an e-ink optimized online reader.
At a glance
- What is it?
- A Flask aggregator that turns RSS, Atom, JSON feeds and Calibre recipes into epub or mobi files and pushes them to a Kindle, with two text to speech clients and an e-ink reader. Its tags stopped in December 2024 while commits kept landing, and its public demo hands out admin/admin.
- Who is it for?
- KindleEar fits a self hosted setup where you want feed aggregation, Calibre recipes and TTS in one Flask app, and the dependency list is small enough to read in a minute: Flask, gunicorn, peewee, feedparser and two speech clients. Verify three things before you rely on it.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 8 days ago.
- What is it written in?
- Mainly Python, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 5, 2026, and from our analysis. They are not legal advice.
Editorial analysis
Three release tags in 2024, then twenty-one months of commits with no tag
The release history is short and stops. The tags are 3.1.6 on 2024-09-03, 3.2 on 2024-11-19 and 3.3 on 2024-12-25. The last push to the default branch, master, is dated 2026-09-27. That gap is the first thing to settle before reading anything else, because the repository is not archived and the commits are recent, yet no release has been cut since the end of 2024. Anything pinned to a tag gets December 2024 code; anything tracking master gets work that has never carried a version number.
The README is on the same clock. Its announcement section is headed Nov 19, 2024 and describes the 3.2 release, and the line under it claims the Gemini, Grok, Mistral and Groq APIs are free to use by now. A statement about somebody else's pricing written on a date in 2024 is a snapshot with an expiry on it, and the section has not been touched since. The features it announces for 3.2 include full support for Python 3, cross-platform support described as freedom from dependence on the GAE platform, support for Calibre recipe format without modification, a built-in library of over a thousand recipe files, and a built-in online reader for e-ink screens.
The public demo is one shared Koyeb instance with admin/admin published in the readme
The README opens with a demo site at kindleear.koyeb.app and describes it as a free service hosted on Koyeb. The login username and password are `admin/admin`. All data is cleared automatically after a period of inactivity, the README says, invites any operations, and suggests using it to test ebook pushing. Three facts sit next to each other there: published default credentials, a shared instance, and an invitation to run the operation that sends files to a Kindle account.
The period of inactivity is not given a number, and the feature list behind that invitation includes multiple account management with multiple users and multiple Kindles, plus a built-in sharing library where users subscribe to feeds other users have shared. So the demo is not a stateless sandbox, it holds feed setups for more than one person, and the credentials for anything you connect there are worth thinking about before you connect them. Nothing here says the instance is unsafe or that a report has been filed. It says the readme hands you the keys and tells you to use the machine.
Four App Engine YAML files sit at the root of a release that promised freedom from GAE
The root of the repository carries `app.yaml`, `cron.yaml`, `dispatch.yaml` and `queue.yaml`, plus a `.gcloudignore`. Those are Google App Engine configuration files, and `cron.yaml` and `queue.yaml` are the platform's own formats for scheduled jobs and task queues. The announcement for 3.2 lists cross-platform support as a significant update, phrased as freedom from dependence on the GAE platform. Both things are in the tree at once.
A `docker/` directory sits alongside them, and the introduction says the application can be deployed on various Python-hosting platforms or a VPS. So the deployment story is genuinely plural, and the leftover platform config is what that transition leaves behind rather than a contradiction of the claim. The dependency file carries the same history in comment form, including `#appengine-python-standard~=1.1.6` and Google Cloud client lines. Read the root directory as an archive of supported platforms: a Docker path, a plain Python path, and an App Engine path that nobody deleted.
The commented dependency block is the clearest record of the old architecture
The bottom of requirements.txt is fourteen commented lines, and each one still carries a version pin:
#pymysql~=1.1.1
#psycopg2-binary~=2.9.9
#weedata>=0.2.7,<1.0.0
#google-cloud-datastore~=2.19.0
#pymongo~=4.6.3
#redis~=5.0.3They name MySQL and PostgreSQL drivers, a Datastore client, MongoDB, Redis, Google Cloud Tasks, Celery, eventlet, Flask RQ, the App Engine standard library, Google text to speech and SQLAlchemy. Every one of those is a deployment backend or a job queue. In the active half of the same file the only database library left is `peewee~=3.17.8`, which is an SQLite ORM, so the data layer that survived the 3.2 rewrite is a single local file. Keeping the pins instead of deleting the lines means the file also records the exact compatible-release ranges the project used to run on, which is more useful than a bare list of removed packages would have been.
Two speech clients are pinned, and none of the four announced model APIs has a client
The 3.2 announcement calls the summarizer AI driven and names four model APIs as free to use. The dependency file has no client library for Gemini, Grok, Mistral or Groq. The only HTTP client in it is `requests~=2.32.4`, so any model call has to go through it as a plain request rather than a vendor SDK.
The speech side is different. `gtts~=2.5.4` and `edge-tts~=7.2.2` are both active pins, so the text to speech feature has two implementations rather than one. Content extraction has its own set: `beautifulsoup4~=4.13.5`, `lxml~=5.3.0`, `lxml-html-clean~=0.4.1`, `html2text~=2024.2.26`, `html5lib~=1.1`, `justext~=3.1.1` for boilerplate removal, and `chardet~=5.2.0` with `feedparser~=6.0.11` for encoding and feed parsing. Two dictionaries, `chunspell~=2.0.4` and `marisa-trie~=1.2.1`, come next, which points at spell checking over the aggregated text rather than at the speech path.
The Evernote, Pocket, Instapaper and wallabag line is the vaguest claim in the feature list
One feature bullet reads integration with systems like Evernote, Pocket, Instapaper and wallabag. No library for any of those four services appears in requirements.txt. The same file does pin two outbound mail services, `sendgrid~=6.11.0` and `mailjet-rest~=1.3.4`, while the feature bullet above it describes a convenient email forwarding service. Those are transactional mail APIs with their own accounts and credentials, not an SMTP relay pointed at your own mail server, so whatever the forwarding feature does, it is configured through those two services rather than through a host and port you supply.
The browser extension gets one line in the announcement, describing recipe creation without coding, and the author marks that line with a parenthetical that reads as a claim they are not asking you to take at face value. The feature list below does not mention the extension again, and nothing in the root directory advertises it. Treat it as an announced extra rather than a documented feature.
pyproject.toml configures a type checker and declares no package at all
The pyproject file contains a single table, `[tool.pyright]`. There is no project table, no build system entry and no dependency list, so the repository is not installable as a package from it; `main.py` at the root is the entry point, and the tree also holds `application/`, `config.py`, `tests/`, `tools/`, `docs/`, `wiki/`, `AGENTS.md`, `app.yaml`, `requirements.txt` and both `readme.md` and `readme_zh.md`.
Inside that table, `include` and `extraPaths` both point at `application/lib`, `reportMissingImports` is true, `reportMissingTypeStubs` is false, and `stubPath` is `typings`, the hand maintained stub directory at the root. The two report flags are a deliberate split: a missing module is an error while a missing stub is not, which is the setting for a codebase that types some modules by hand and borrows the rest. `tests/` is excluded, so the test directory is not type checked. The README carries no installation section and no command of any kind, which leaves the project documentation site at cdhigh.github.io/KindleEar and the demo instance as the only stated routes in.
Editorial conclusion
KindleEar fits a self hosted setup where you want feed aggregation, Calibre recipes and TTS in one Flask app, and the dependency list is small enough to read in a minute: Flask, gunicorn, peewee, feedparser and two speech clients. Verify three things before you rely on it. First, version pinning, because the newest tag is 3.3 from 2024-12-25 while the last push was 2026-09-27, so a tag does not describe the current state of master. Second, the announcement's claim that the Gemini, Grok, Mistral and Groq APIs are free to use, which was written on Nov 19, 2024 and says nothing about those tiers now. Third, where you run it: the demo site at kindleear.koyeb.app is one shared instance with the published credentials admin/admin, and the feature list includes multi-user accounts and a feed sharing library, so put your own instance in front of anything real.
Frequently asked questions
What does KindleEar need installed to run?
The README gives no install command. The repository root carries requirements.txt with Flask~=3.0.3, gunicorn~=23.0.0, peewee~=3.17.8 and feedparser~=6.0.11 among the active pins, main.py at the root as the entry point, and the stated routes in are the project documentation site at cdhigh.github.io/KindleEar and the demo instance.
Which version of KindleEar is the newest release?
Tag 3.3, dated 2024-12-25, with 3.2 on 2024-11-19 and 3.1.6 on 2024-09-03 before it. The default branch master was pushed to on 2026-09-27, so commits exist well past the newest tag.
What credentials does the KindleEar demo site use?
The README states the login username and password are `admin/admin` on the free Koyeb hosted demo at kindleear.koyeb.app, and that data is cleared automatically after a period of inactivity. The feature list covers multiple users and a shared feed library, so the instance is not single tenant.
Does KindleEar bundle Calibre recipes?
The announcement for release 3.2 lists support for Calibre recipe format without modification and a built-in library of over a thousand recipe files. The feature list also names unlimited RSS, Atom and JSON collection and unlimited custom feeds where you enter the link and title directly.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/cdhigh-kindleear)