# ๐ PaperBee
<img src="images/paperbee_logo.png" width="200" height="auto" alt="logo"/>
PaperBee is a Python application designed to **automatically search for new scientific papers and post them** to your favorite channels.
Currently supported platforms:
- ๐ฃ Slack
- ๐ข Zulip
- ๐ต Telegram
---
## ๐ How Does It Work?

PaperBee queries scientific papers using user-specified keywords from PubMed and preprint services, relying on the [findpapers](https://github.com/jonatasgrosman/findpapers/) library.
Papers are then filtered either **manually via a command-line interface** or **automatically via an LLM**.
The filtered papers are posted to a Google Sheet and, if desired, to Slack, Telegram, or Zulip channels.
PaperBee is easy to setup and configure with a simple `yml` file.
---
## ๐ฆ Installation
### 1. Download the Code and Install Dependencies
```bash
pip install paperbee
```
---
## ๐ Setup Guide
### 1. Google Sheets Integration
1. **Create a Google Service Account:**
[Official guide](https://cloud.google.com/iam/docs/service-accounts-create)
Needed to write found papers to a Google Spreadsheet.
2. **Create a JSON Key:**
[Official guide](https://cloud.google.com/iam/docs/keys-create-delete)
Download and store the JSON file securely.
3. **Enable Google Sheets API:**
In [Google Cloud Console](https://console.cloud.google.com/), enable the Google Sheets API for your service account.
4. **Create a Google Spreadsheet:**
You can copy this [template](https://docs.google.com/spreadsheets/d/13QqH13psraWsTG5GJ7jrqA8PkUvP_HlzO90BMxYwzYw/).
The sheet must have columns: `DOI`, `Date`, `PostedDate`, `IsPreprint`, `Title`, `Keywords`, `Preprint`, `URL`.
The sheet name must be `Papers`.
5. **Share the Spreadsheet:**
Add the service account email as an _Editor_.
---
### 2. ๐ Get NCBI API Key
PaperBee uses the NCBI API to fetch papers and DOIs from PubMed.
[Get your free API key here.](https://www.ncbi.nlm.nih.gov/datasets/docs/v2/api/api-keys)
---
### 3. ๐ข Setup Posting Channels
> **You must set up at least one of the three platforms below.**
#### ๐ฃ Slack (optional)
1. [Create a Slack App](https://api.slack.com/apps/new) (choose "From an app manifest").
2. Choose your workspace.
3. Copy the contents of `manifest.json` into the manifest box.
4. Review and create the app.
5. Install to Workspace and allow permissions.
6. In **OAuth & Permissions**, copy the Bot User OAuth Token.
7. In **Basic Information**, create an app-level token with `connections:write` scope.
8. Set `SLACK_CHANNEL_ID` to your desired channel's ID.
Update the **SLACK** variables in the `config.yml` file.
#### ๐ต Telegram (optional)
1. Create a Telegram bot [Follow the instructions here](https://core.telegram.org/bots/#how-do-i-create-a-bot).
2. Create a channel or group, add the bot as admin.
3. Use [@myidbot](https://t.me/myidbot) to get the channel ID.
Update the **TELEGRAM** variables in the `config.yml` file.
#### ๐ข Zulip (optional)
1. [Create a Zulip bot](https://zulip.com/help/add-a-bot-or-integration) and download the `zuliprc` file.
2. Create a stream and subscribe the bot.
Update the **ZULIP** variables in the `config.yml` file.
---
### 4. ๐ค Setup LLM for Automated Filtering (optional, but recommended)
> If you want to use LLM filtering, remember to add a `filtering_prompt.txt` file.
> See [Setup Query and LLM Filtering Prompt](#setup-query-and-llm-filtering-prompt).
#### OpenAI API
- [Sign up for OpenAI](https://platform.openai.com/signup)
- [Get your API key](https://platform.openai.com/settings/organization/api-api-keys)
- Add credits to your account.
#### Ollama (Open Source LLMs)
- [Download Ollama](https://ollama.com/download/)
- Pull your preferred model (e.g., `ollama pull llama3.2`).
Update the **LLM** variables in the `config.yml` file. (LLM_PROVIDER, LANGUAGE_MODEL, OPENAI_API_KEY)
---
## โ๏ธ Configuration
PaperBee uses a YAML configuration file to specify all arguments.
Copy and customize the template below as `config.yml`:
### Example `config.yml`
```yaml
GOOGLE_SPREADSHEET_ID: "your-google-spreadsheet-id"
GOOGLE_CREDENTIALS_JSON: "/path/to/your/google-credentials.json"
NCBI_API_KEY: "your-ncbi-api-key"
# path to the local root directory where query prompts and files are stored
LOCAL_ROOT_DIR: "/path/to/local/root/dir"
# Queries. You can set either only "query" to use in all databases or query_biorxiv and query_pubmed_arxiv.
# Note that biorxiv only accept OR boolean operator while pubmed and arxiv also accept AND and AND NOT, this is why tje two queries are separated.
# More info: https://github.com/jonatasgrosman/findpapers?tab=readme-ov-file#search-query-construction
query: "[AI for cell trajectories] OR [machine learning for cell trajectories] OR [deep learning for cell trajectories] OR [AI for cell dynamics] OR [machine learning for cell dynamics] OR [deep learning for cell dynamics]"
query_biorxiv: "[AI for cell trajectories] OR [machine learning for cell trajectories] OR [deep learning for cell trajectories] OR [AI for cell dynamics] OR [machine learning for cell dynamics] OR [deep learning for cell dynamics]"
query_pubmed_arxiv: "([single-cell transcriptomics]) AND ([Cell Dynamics]) AND ([AI] OR [machine learning] OR [deep learning]) AND NOT ([proteomics])"
# LLM Filtering (optional)
LLM_FILTERING: true
LLM_PROVIDER: "openai"
LANGUAGE_MODEL: "gpt-4o-mini"
OPENAI_API_KEY: "your-openai-api-key"
# Describe what are your interests and what kind of papers are relevant to your lab.
# Change lab focus and interests to your own. Feel free to add more details and examples, but leave the last sentence as is.
FILTERING_PROMPT: "You are a lab manager at a research lab focusing on machine learning methods development for single-cell RNA sequencing. Lab members are interested in developing methods to model cell dynamics. You are reviewing a list of research papers to determine if they are relevant to your lab. Please answer 'yes' or 'no' to the following question: Is the following research paper relevant?"
# Slack configuration
SLACK:
is_posting_on: true
bot_token: "your-slack-bot-token"
channel_id: "your-slack-channel-id"
app_token: "your-slack-app-token"
# Telegram configuration
TELEGRAM:
is_posting_on: true
bot_token: "your-telegram-bot-token"
channel_id: "your-telegram-channel-id"
# Zulip configuration
ZULIP:
is_posting_on: false
prc: "path-to-your-zulip-prc"
stream: "your-zulip-stream"
topic: "your-zulip-topic"
SLACK_TEST_CHANNEL_ID: "your-slack-test-channel-id" # not required so left outside of dictionary
TELEGRAM_TEST_CHANNEL_ID: "your-slack-test-channel-id" # not required so left outside of dictionary
GOOGLE_TEST_SPREADSHEET_ID: "your-google-test-spreadsheet-id" # not required so left outside of dictionary
```
---
### ๐ Example Query and Prompt
#### `query`
If specifying a list of keyword is enough, you can simply fit one query for all databases. Example:
```text
[AI for cell trajectories] OR [machine learning for cell trajectories] OR [deep learning for cell trajectories] OR [AI for cell dynamics] OR [machine learning for cell dynamics] OR [deep learning for cell dynamics]
```
Both Arxiv and Pubmed allow for more refined queries.
If you want to fine-tune the queries for pubmed and arxiv which allow for both AND and AND NOT boolean operators, then you will need to split the queries in two (read below).
#### `query_biorxiv`
This database has more requirements, so if your query is complex, you have to set a separate simple query for biorxiv, and a complex query for everything else. See [findpapers documentation](https://github.com/jonatasgrosman/findpapers?tab=readme-ov-file#search-query-construction) for more details. TLDR:
- Only **1-level grouping** is supported: no round brackets inside round brackets
- **Only OR connectors between parenthesis** are allowed, no `() AND ()`!
- **AND NOT is not allowed**
- All connectors must be either OR or AND. **No mixing**!
Here's an example of a valid query:
```text
[AI for cell trajectories] OR [machine learning for cell trajectories] OR [deep learning for cell trajectories] OR [AI for cell dynamics] OR [machine learning for cell dynamics] OR [deep learning for cell dynamics]
```
#### `query_pubmed_arxiv.txt`
Pubmed and Arxiv don't have such requirements, so query can be more complex:
```text
([single-cell transcriptomics]) AND ([Cell Dynamics]) AND ([AI] OR [machine learning] OR [deep learning]) AND NOT ([proteomics])
```
#### `filtering_prompt`
Simply describe your lab interests, which type of papers you want to see and which you don't. The more details, the better! But always leave the last sentence with the question as is. Here is an example:
```text
You are a lab manager at a research lab focusing on machine learning methods development for single-cell RNA sequencing. Lab members are interested in developing methods to model cell dynamics. You are reviewing a list of research papers to determine if they are relevant to your lab. Please answer 'yes' or 'no' to the following question: Is the following research paper relevant?
```
---
## โถ๏ธ Running the Bot
When everything is set up, run the bot with:
```bash
paperbee post --config /path/to/config.yml --interactive --since 10
```
- `--config` : Path to your YAML configuration file.
- `--interactive` : (Optional) Use CLI for manual filtering.
- `--since` : (Optional) How many days back to search for papers (default: last 24h).
- `--databases`: (Optional) list of databases to search, default pubmed biorxiv
See [daily_posting.py](src/PaperBee/daily_posting.py) for an example of running search from Python.
---
## ๐๏ธ Project Structure
### `manifest.json`
Configuration for Slack apps.
With a manifest, you can create or adjust an app with a pre-defined configuration.
### `src/PaperBee/papers`
Classes to fetch, format, and post papers, and update the Google Sheet.
- `utils.py` โ Preprocess `findpapers` output, extract DOIs.
- `google_sheet.py` โ Update/check the Google Sheet.
- `llm_filtering.py` โ Filter papers with LLMs.
- `cli.py` โ Interactive CLI filtering.
- `slack_papers_formatter.py` โ Format and post to Slack.
- `zulip_papers_formatter.py` โ Format and post to Zulip.
- `telegram_papers_formatter.py` โ Format and post to Telegram.
- `papers_finder.py` โ Main wrapper class.
- `daily_posting.py` โ CLI entry point.
---
## ๐งช Running Tests (Optional)
You can set up test channels for Slack/Telegram or run tests in production channels.
Set the following variables in your `config.yml`:
- `TELEGRAM_TEST_CHANNEL_ID` โ Telegram test channel ID.
- `SLACK_TEST_CHANNEL_ID` โ Slack test channel ID.
- `GOOGLE_TEST_SPREADSHEET_ID` โ Test spreadsheet ID. **Don't use a production spreadsheet!**
**Install extra dependencies:**
```bash
pip install pytest-asyncio
```
or with Poetry:
```bash
poetry install --with dev
```
**Run the tests:**
```bash
pytest
```
---
# Reference
```
@misc{shitov_patpy_2024,
author = {Lucarelli, Daniele and Shitov, Vladimir A. and Saur, Dieter and Zappia, Luke and Theis, Fabian J.},
title = {PaperBee: An Automated Daily Digest Bot for Scientific Literature Monitoring},
year = {2025},
url = {https://github.com/theislab/paperbee},
note = {Version 1.0.0}
}
```
Enjoy using ๐ **PaperBee**!
Raw data
{
"_id": null,
"home_page": "https://github.com/theislab/paperbee",
"name": "PaperBee",
"maintainer": null,
"docs_url": null,
"requires_python": "<4.0,>=3.10",
"maintainer_email": null,
"keywords": null,
"author": "Daniele Lucarelli",
"author_email": "daniele.lucarelli@tum.de",
"download_url": "https://files.pythonhosted.org/packages/2d/d4/7e7cd49dc937080685ecc8c0ff7ae9b6b0229bf45a161d3fc50fe456f3ac/paperbee-1.0.1.tar.gz",
"platform": null,
"description": "# \ud83d\udc1d PaperBee\n\n<img src=\"images/paperbee_logo.png\" width=\"200\" height=\"auto\" alt=\"logo\"/>\n\nPaperBee is a Python application designed to **automatically search for new scientific papers and post them** to your favorite channels.\nCurrently supported platforms:\n\n- \ud83d\udfe3 Slack\n- \ud83d\udfe2 Zulip\n- \ud83d\udd35 Telegram\n\n---\n\n## \ud83d\ude80 How Does It Work?\n\n\n\nPaperBee queries scientific papers using user-specified keywords from PubMed and preprint services, relying on the [findpapers](https://github.com/jonatasgrosman/findpapers/) library.\nPapers are then filtered either **manually via a command-line interface** or **automatically via an LLM**.\nThe filtered papers are posted to a Google Sheet and, if desired, to Slack, Telegram, or Zulip channels.\nPaperBee is easy to setup and configure with a simple `yml` file.\n\n---\n\n## \ud83d\udce6 Installation\n\n### 1. Download the Code and Install Dependencies\n\n```bash\npip install paperbee\n```\n\n---\n\n## \ud83d\udcdd Setup Guide\n\n### 1. Google Sheets Integration\n\n1. **Create a Google Service Account:**\n [Official guide](https://cloud.google.com/iam/docs/service-accounts-create)\n Needed to write found papers to a Google Spreadsheet.\n2. **Create a JSON Key:**\n [Official guide](https://cloud.google.com/iam/docs/keys-create-delete)\n Download and store the JSON file securely.\n3. **Enable Google Sheets API:**\n In [Google Cloud Console](https://console.cloud.google.com/), enable the Google Sheets API for your service account.\n4. **Create a Google Spreadsheet:**\n You can copy this [template](https://docs.google.com/spreadsheets/d/13QqH13psraWsTG5GJ7jrqA8PkUvP_HlzO90BMxYwzYw/).\n The sheet must have columns: `DOI`, `Date`, `PostedDate`, `IsPreprint`, `Title`, `Keywords`, `Preprint`, `URL`.\n The sheet name must be `Papers`.\n5. **Share the Spreadsheet:**\n Add the service account email as an _Editor_.\n\n---\n\n### 2. \ud83d\udd11 Get NCBI API Key\n\nPaperBee uses the NCBI API to fetch papers and DOIs from PubMed.\n[Get your free API key here.](https://www.ncbi.nlm.nih.gov/datasets/docs/v2/api/api-keys)\n\n---\n\n### 3. \ud83d\udce2 Setup Posting Channels\n\n> **You must set up at least one of the three platforms below.**\n\n#### \ud83d\udfe3 Slack (optional)\n\n1. [Create a Slack App](https://api.slack.com/apps/new) (choose \"From an app manifest\").\n2. Choose your workspace.\n3. Copy the contents of `manifest.json` into the manifest box.\n4. Review and create the app.\n5. Install to Workspace and allow permissions.\n6. In **OAuth & Permissions**, copy the Bot User OAuth Token.\n7. In **Basic Information**, create an app-level token with `connections:write` scope.\n8. Set `SLACK_CHANNEL_ID` to your desired channel's ID.\n\nUpdate the **SLACK** variables in the `config.yml` file.\n\n#### \ud83d\udd35 Telegram (optional)\n\n1. Create a Telegram bot [Follow the instructions here](https://core.telegram.org/bots/#how-do-i-create-a-bot).\n2. Create a channel or group, add the bot as admin.\n3. Use [@myidbot](https://t.me/myidbot) to get the channel ID.\n\nUpdate the **TELEGRAM** variables in the `config.yml` file.\n\n#### \ud83d\udfe2 Zulip (optional)\n\n1. [Create a Zulip bot](https://zulip.com/help/add-a-bot-or-integration) and download the `zuliprc` file.\n2. Create a stream and subscribe the bot.\n\nUpdate the **ZULIP** variables in the `config.yml` file.\n\n---\n\n### 4. \ud83e\udd16 Setup LLM for Automated Filtering (optional, but recommended)\n\n> If you want to use LLM filtering, remember to add a `filtering_prompt.txt` file.\n> See [Setup Query and LLM Filtering Prompt](#setup-query-and-llm-filtering-prompt).\n\n#### OpenAI API\n\n- [Sign up for OpenAI](https://platform.openai.com/signup)\n- [Get your API key](https://platform.openai.com/settings/organization/api-api-keys)\n- Add credits to your account.\n\n#### Ollama (Open Source LLMs)\n\n- [Download Ollama](https://ollama.com/download/)\n- Pull your preferred model (e.g., `ollama pull llama3.2`).\n\nUpdate the **LLM** variables in the `config.yml` file. (LLM_PROVIDER, LANGUAGE_MODEL, OPENAI_API_KEY)\n\n---\n\n## \u2699\ufe0f Configuration\n\nPaperBee uses a YAML configuration file to specify all arguments.\nCopy and customize the template below as `config.yml`:\n\n### Example `config.yml`\n\n```yaml\nGOOGLE_SPREADSHEET_ID: \"your-google-spreadsheet-id\"\nGOOGLE_CREDENTIALS_JSON: \"/path/to/your/google-credentials.json\"\nNCBI_API_KEY: \"your-ncbi-api-key\"\n\n# path to the local root directory where query prompts and files are stored\nLOCAL_ROOT_DIR: \"/path/to/local/root/dir\"\n\n# Queries. You can set either only \"query\" to use in all databases or query_biorxiv and query_pubmed_arxiv.\n# Note that biorxiv only accept OR boolean operator while pubmed and arxiv also accept AND and AND NOT, this is why tje two queries are separated.\n# More info: https://github.com/jonatasgrosman/findpapers?tab=readme-ov-file#search-query-construction\nquery: \"[AI for cell trajectories] OR [machine learning for cell trajectories] OR [deep learning for cell trajectories] OR [AI for cell dynamics] OR [machine learning for cell dynamics] OR [deep learning for cell dynamics]\"\nquery_biorxiv: \"[AI for cell trajectories] OR [machine learning for cell trajectories] OR [deep learning for cell trajectories] OR [AI for cell dynamics] OR [machine learning for cell dynamics] OR [deep learning for cell dynamics]\"\nquery_pubmed_arxiv: \"([single-cell transcriptomics]) AND ([Cell Dynamics]) AND ([AI] OR [machine learning] OR [deep learning]) AND NOT ([proteomics])\"\n\n# LLM Filtering (optional)\nLLM_FILTERING: true\nLLM_PROVIDER: \"openai\"\nLANGUAGE_MODEL: \"gpt-4o-mini\"\nOPENAI_API_KEY: \"your-openai-api-key\"\n# Describe what are your interests and what kind of papers are relevant to your lab.\n# Change lab focus and interests to your own. Feel free to add more details and examples, but leave the last sentence as is.\nFILTERING_PROMPT: \"You are a lab manager at a research lab focusing on machine learning methods development for single-cell RNA sequencing. Lab members are interested in developing methods to model cell dynamics. You are reviewing a list of research papers to determine if they are relevant to your lab. Please answer 'yes' or 'no' to the following question: Is the following research paper relevant?\"\n\n# Slack configuration\nSLACK:\n is_posting_on: true\n bot_token: \"your-slack-bot-token\"\n channel_id: \"your-slack-channel-id\"\n app_token: \"your-slack-app-token\"\n\n# Telegram configuration\nTELEGRAM:\n is_posting_on: true\n bot_token: \"your-telegram-bot-token\"\n channel_id: \"your-telegram-channel-id\"\n\n# Zulip configuration\nZULIP:\n is_posting_on: false\n prc: \"path-to-your-zulip-prc\"\n stream: \"your-zulip-stream\"\n topic: \"your-zulip-topic\"\n\nSLACK_TEST_CHANNEL_ID: \"your-slack-test-channel-id\" # not required so left outside of dictionary\nTELEGRAM_TEST_CHANNEL_ID: \"your-slack-test-channel-id\" # not required so left outside of dictionary\nGOOGLE_TEST_SPREADSHEET_ID: \"your-google-test-spreadsheet-id\" # not required so left outside of dictionary\n```\n\n---\n\n### \ud83d\udcc4 Example Query and Prompt\n\n#### `query`\n\nIf specifying a list of keyword is enough, you can simply fit one query for all databases. Example:\n\n```text\n[AI for cell trajectories] OR [machine learning for cell trajectories] OR [deep learning for cell trajectories] OR [AI for cell dynamics] OR [machine learning for cell dynamics] OR [deep learning for cell dynamics]\n```\n\nBoth Arxiv and Pubmed allow for more refined queries.\nIf you want to fine-tune the queries for pubmed and arxiv which allow for both AND and AND NOT boolean operators, then you will need to split the queries in two (read below).\n\n#### `query_biorxiv`\n\nThis database has more requirements, so if your query is complex, you have to set a separate simple query for biorxiv, and a complex query for everything else. See [findpapers documentation](https://github.com/jonatasgrosman/findpapers?tab=readme-ov-file#search-query-construction) for more details. TLDR:\n\n- Only **1-level grouping** is supported: no round brackets inside round brackets\n- **Only OR connectors between parenthesis** are allowed, no `() AND ()`!\n- **AND NOT is not allowed**\n- All connectors must be either OR or AND. **No mixing**!\n\nHere's an example of a valid query:\n\n```text\n[AI for cell trajectories] OR [machine learning for cell trajectories] OR [deep learning for cell trajectories] OR [AI for cell dynamics] OR [machine learning for cell dynamics] OR [deep learning for cell dynamics]\n```\n\n#### `query_pubmed_arxiv.txt`\n\nPubmed and Arxiv don't have such requirements, so query can be more complex:\n\n```text\n([single-cell transcriptomics]) AND ([Cell Dynamics]) AND ([AI] OR [machine learning] OR [deep learning]) AND NOT ([proteomics])\n```\n\n#### `filtering_prompt`\n\nSimply describe your lab interests, which type of papers you want to see and which you don't. The more details, the better! But always leave the last sentence with the question as is. Here is an example:\n\n```text\nYou are a lab manager at a research lab focusing on machine learning methods development for single-cell RNA sequencing. Lab members are interested in developing methods to model cell dynamics. You are reviewing a list of research papers to determine if they are relevant to your lab. Please answer 'yes' or 'no' to the following question: Is the following research paper relevant?\n```\n\n---\n\n## \u25b6\ufe0f Running the Bot\n\nWhen everything is set up, run the bot with:\n\n```bash\npaperbee post --config /path/to/config.yml --interactive --since 10\n```\n\n- `--config` : Path to your YAML configuration file.\n- `--interactive` : (Optional) Use CLI for manual filtering.\n- `--since` : (Optional) How many days back to search for papers (default: last 24h).\n- `--databases`: (Optional) list of databases to search, default pubmed biorxiv\n\nSee [daily_posting.py](src/PaperBee/daily_posting.py) for an example of running search from Python.\n\n---\n\n## \ud83d\uddc2\ufe0f Project Structure\n\n### `manifest.json`\n\nConfiguration for Slack apps.\nWith a manifest, you can create or adjust an app with a pre-defined configuration.\n\n### `src/PaperBee/papers`\n\nClasses to fetch, format, and post papers, and update the Google Sheet.\n\n- `utils.py` \u2013 Preprocess `findpapers` output, extract DOIs.\n- `google_sheet.py` \u2013 Update/check the Google Sheet.\n- `llm_filtering.py` \u2013 Filter papers with LLMs.\n- `cli.py` \u2013 Interactive CLI filtering.\n- `slack_papers_formatter.py` \u2013 Format and post to Slack.\n- `zulip_papers_formatter.py` \u2013 Format and post to Zulip.\n- `telegram_papers_formatter.py` \u2013 Format and post to Telegram.\n- `papers_finder.py` \u2013 Main wrapper class.\n- `daily_posting.py` \u2013 CLI entry point.\n\n---\n\n## \ud83e\uddea Running Tests (Optional)\n\nYou can set up test channels for Slack/Telegram or run tests in production channels.\nSet the following variables in your `config.yml`:\n\n- `TELEGRAM_TEST_CHANNEL_ID` \u2013 Telegram test channel ID.\n- `SLACK_TEST_CHANNEL_ID` \u2013 Slack test channel ID.\n- `GOOGLE_TEST_SPREADSHEET_ID` \u2013 Test spreadsheet ID. **Don't use a production spreadsheet!**\n\n**Install extra dependencies:**\n\n```bash\npip install pytest-asyncio\n```\n\nor with Poetry:\n\n```bash\npoetry install --with dev\n```\n\n**Run the tests:**\n\n```bash\npytest\n```\n\n---\n\n# Reference\n\n```\n@misc{shitov_patpy_2024,\n author = {Lucarelli, Daniele and Shitov, Vladimir A. and Saur, Dieter and Zappia, Luke and Theis, Fabian J.},\n title = {PaperBee: An Automated Daily Digest Bot for Scientific Literature Monitoring},\n year = {2025},\n url = {https://github.com/theislab/paperbee},\n note = {Version 1.0.0}\n}\n```\n\nEnjoy using \ud83d\udc1d **PaperBee**!\n",
"bugtrack_url": null,
"license": null,
"summary": null,
"version": "1.0.1",
"project_urls": {
"Documentation": "https://github.com/theislab/paperbee",
"Homepage": "https://github.com/theislab/paperbee",
"Repository": "https://github.com/theislab/paperbee"
},
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "5927d1c713a8dfcc58820166b5fa76189ed1ec7bc7af3fe769f02bc1138748d7",
"md5": "4ba1563530a6c00ed4d99e39af38067e",
"sha256": "4c0bbff47bad9e6a4cf2a02d3b05710e10b4baac43e0787aaa61e56bc36ae738"
},
"downloads": -1,
"filename": "paperbee-1.0.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "4ba1563530a6c00ed4d99e39af38067e",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": "<4.0,>=3.10",
"size": 26528,
"upload_time": "2025-07-08T13:06:33",
"upload_time_iso_8601": "2025-07-08T13:06:33.449102Z",
"url": "https://files.pythonhosted.org/packages/59/27/d1c713a8dfcc58820166b5fa76189ed1ec7bc7af3fe769f02bc1138748d7/paperbee-1.0.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "2dd47e7cd49dc937080685ecc8c0ff7ae9b6b0229bf45a161d3fc50fe456f3ac",
"md5": "ec3266bb03052e5cf16411d781a16086",
"sha256": "2c52079fc8911f6abaea79a99bc186314e82bf324e9247ea0dbbbc0bf53b1e59"
},
"downloads": -1,
"filename": "paperbee-1.0.1.tar.gz",
"has_sig": false,
"md5_digest": "ec3266bb03052e5cf16411d781a16086",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "<4.0,>=3.10",
"size": 24337,
"upload_time": "2025-07-08T13:06:34",
"upload_time_iso_8601": "2025-07-08T13:06:34.985026Z",
"url": "https://files.pythonhosted.org/packages/2d/d4/7e7cd49dc937080685ecc8c0ff7ae9b6b0229bf45a161d3fc50fe456f3ac/paperbee-1.0.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-07-08 13:06:34",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "theislab",
"github_project": "paperbee",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "paperbee"
}