Skip to main content

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
  1. Fitolit polls the RSS feeds of papers, listed in the paper_feed.json5 config file.
  2. For each new paper, it fetches the abstract and sends it to an LLM along with your profile prompt.
  3. 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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fitolit-0.1.0.tar.gz (70.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

fitolit-0.1.0-py3-none-any.whl (25.9 kB view details)

Uploaded Python 3

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

Hashes for fitolit-0.1.0.tar.gz
Algorithm Hash digest
SHA256 59079be17a9f153d2449369ae7cef033e38ffea996cba71aef0e53a1e1559a6b
MD5 e01d1e8ebdea49bc030cc7707602ba31
BLAKE2b-256 42d8868f2b9eafa7539979a7198e9f852fa8e0b718e6fe0898a2713c1583f506

See more details on using hashes here.

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

Hashes for fitolit-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 3a69152d640044da74faf127eaad9cc66fb4c550ac2186554c6768c759ddab8a
MD5 8416ad1d89d3512535200a61888cffd1
BLAKE2b-256 5d248804f04d8cda7b3935855623aa636d8b25976f98a590a72c1c243a534bc3

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page