Monitor journal RSS feeds and let an LLM surface only the papers that match your research profile.
Project description
Fitolit
A simple Python tool that finds new scientific papers that match your research interests.
Why?
SO MANY PAPERS are published every day. Some people have the magic ability to sift through this noise and find the papers that are nice and/or relevant. I am not one of them. I wrote Fitolit to automate the process of finding papers that match my interests. It is not perfect, but it does a good job of filtering out irrelevant papers, and reducing the volume of papers you need to sift through.
Fitolit monitors the RSS feeds of journals you care about, sends each paper's abstract to an LLM, and writes the papers that match your profile to a personal RSS feed. Follow that feed in any RSS reader (e.g. FreshRSS, Newsflash, ...). And that is all there is to it.
How it works
Journal RSS feeds → fetch abstracts → LLM (via OpenRouter) → personal RSS feed
- Fitolit polls the RSS feeds of papers, listed in the
paper_feed.json5config file. - For each new paper, it fetches the abstract and sends it to an LLM along with your profile prompt.
- Papers the LLM marks as relevant are appended to an RSS file on your machine.
Prerequisites
- An OpenRouter account and API key: used to call the LLM.
- FlareSolverr installed: most/all journal websites block automated requests. Running FlareSolverr in a Docker container is the easiest workaround.
Installation
pipx install fitolit
(or use uvx fitolit)
Then initialise the config files:
fitolit initialize
This creates settings.json5, paper_feed.json5, and secrets.json5 in your platform's config directory and prints their exact paths. During initialisation you will be asked where to save the output RSS feed.
Configuration
All three config files use JSON5 syntax (supports comments and trailing commas).
settings.json5
llm
| Key | Description |
|---|---|
model_to_use |
The OpenRouter model identifier to use, e.g. z-ai/glm-4.5-air. Cheaper models work ok. See the OpenRouter model list. |
prompt |
A description of your research interests. See the example settings file for a prompt template. Do not remove the final sentence about the JSON schema. Adding a few example paper titles (good and bad) works well for fine-tuning. |
max_length |
Maximum number of characters read from each abstract. Prevents a 50-page review article accidentally eating all your tokens. |
rss
| Key | Description |
|---|---|
final_feed |
Path to the output RSS file on your machine, e.g. /home/user/papers.xml. |
flaresolverr_url
URL of your FlareSolverr instance, e.g. http://localhost:8191/v1.
paper_feed.json5
A JSON5 array of RSS feed URLs for the journals you want to monitor. The example file includes some random feeds for Nature, Science, ACS, arXiv, and others. Edit it to match your interests.
If a journal's RSS feed isn't easy to find, try Lighthouse Feed Finder.
secrets.json5
{
"openrouter_key": "your-api-key-here"
}
Storing the key here is convenient but saves it as plain text. Alternatively, pass it at runtime with --openrouter_key (see below).
Usage
fitolit run
If you did not set the API key in secrets.json5, pass it directly:
fitolit run --openrouter_key YOUR_KEY
Add --log-to-file to write logs to a file instead of the terminal (useful when running in the background).
Running on a schedule
A run is pretty slow - the LLM has a lot of papers to churn trough. Especially the first run may take a while. The first time, run it where you can check in on it once every few minutes. Once you have confirmed things works, set up a daily cron job:
30 8 * * * fitolit run --log-to-file
Costs
Running this will cost you roughly €2/month using a cheap model (e.g. z-ai/glm-4.5-air). Cost will go up if you:
- use an expensive model,
- monitor many journals,
- have a high
max_length, or - have a long research profile
So keep that in mind. It is probably wise to configure some usage limits in OpenRouter, and check in once in a while.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file fitolit-0.1.0.tar.gz.
File metadata
- Download URL: fitolit-0.1.0.tar.gz
- Upload date:
- Size: 70.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.4 {"installer":{"name":"uv","version":"0.10.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Pop!_OS","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
59079be17a9f153d2449369ae7cef033e38ffea996cba71aef0e53a1e1559a6b
|
|
| MD5 |
e01d1e8ebdea49bc030cc7707602ba31
|
|
| BLAKE2b-256 |
42d8868f2b9eafa7539979a7198e9f852fa8e0b718e6fe0898a2713c1583f506
|
File details
Details for the file fitolit-0.1.0-py3-none-any.whl.
File metadata
- Download URL: fitolit-0.1.0-py3-none-any.whl
- Upload date:
- Size: 25.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.4 {"installer":{"name":"uv","version":"0.10.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Pop!_OS","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3a69152d640044da74faf127eaad9cc66fb4c550ac2186554c6768c759ddab8a
|
|
| MD5 |
8416ad1d89d3512535200a61888cffd1
|
|
| BLAKE2b-256 |
5d248804f04d8cda7b3935855623aa636d8b25976f98a590a72c1c243a534bc3
|