papernym 0.1.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- papernym-0.1.2/LICENSE +21 -0
- papernym-0.1.2/PKG-INFO +365 -0
- papernym-0.1.2/README.md +341 -0
- papernym-0.1.2/pyproject.toml +48 -0
- papernym-0.1.2/setup.cfg +4 -0
- papernym-0.1.2/src/papernym/__init__.py +3 -0
- papernym-0.1.2/src/papernym/__main__.py +5 -0
- papernym-0.1.2/src/papernym/cli.py +762 -0
- papernym-0.1.2/src/papernym/core/__init__.py +1 -0
- papernym-0.1.2/src/papernym/core/apitest.py +86 -0
- papernym-0.1.2/src/papernym/core/autostart.py +86 -0
- papernym-0.1.2/src/papernym/core/config.py +229 -0
- papernym-0.1.2/src/papernym/core/db.py +283 -0
- papernym-0.1.2/src/papernym/core/engine.py +486 -0
- papernym-0.1.2/src/papernym/core/identify.py +287 -0
- papernym-0.1.2/src/papernym/core/keystore.py +121 -0
- papernym-0.1.2/src/papernym/core/lock.py +66 -0
- papernym-0.1.2/src/papernym/core/logsetup.py +36 -0
- papernym-0.1.2/src/papernym/core/naming.py +280 -0
- papernym-0.1.2/src/papernym/core/pdfread.py +198 -0
- papernym-0.1.2/src/papernym/core/sources/__init__.py +1 -0
- papernym-0.1.2/src/papernym/core/sources/arxiv.py +24 -0
- papernym-0.1.2/src/papernym/core/sources/common.py +43 -0
- papernym-0.1.2/src/papernym/core/sources/crossref.py +18 -0
- papernym-0.1.2/src/papernym/core/sources/doiorg.py +9 -0
- papernym-0.1.2/src/papernym/core/sources/http.py +62 -0
- papernym-0.1.2/src/papernym/core/sources/openalex.py +29 -0
- papernym-0.1.2/src/papernym/core/sources/semanticscholar.py +37 -0
- papernym-0.1.2/src/papernym/core/updates.py +65 -0
- papernym-0.1.2/src/papernym/core/watcher.py +194 -0
- papernym-0.1.2/src/papernym/gui/__init__.py +1 -0
- papernym-0.1.2/src/papernym/gui/__main__.py +5 -0
- papernym-0.1.2/src/papernym/gui/app.py +731 -0
- papernym-0.1.2/src/papernym/gui/common.py +84 -0
- papernym-0.1.2/src/papernym/gui/dialogs.py +225 -0
- papernym-0.1.2/src/papernym/gui/icons/arrow-dark.svg +1 -0
- papernym-0.1.2/src/papernym/gui/icons/arrow-light.svg +1 -0
- papernym-0.1.2/src/papernym/gui/icons/check-white.svg +1 -0
- papernym-0.1.2/src/papernym/gui/icons/papernym.ico +0 -0
- papernym-0.1.2/src/papernym/gui/icons/papernym.png +0 -0
- papernym-0.1.2/src/papernym/gui/icons/tray-attention-mono.png +0 -0
- papernym-0.1.2/src/papernym/gui/icons/tray-attention-white.png +0 -0
- papernym-0.1.2/src/papernym/gui/icons/tray-attention.png +0 -0
- papernym-0.1.2/src/papernym/gui/icons/tray-error-mono.png +0 -0
- papernym-0.1.2/src/papernym/gui/icons/tray-error-white.png +0 -0
- papernym-0.1.2/src/papernym/gui/icons/tray-error.png +0 -0
- papernym-0.1.2/src/papernym/gui/icons/tray-paused-mono.png +0 -0
- papernym-0.1.2/src/papernym/gui/icons/tray-paused-white.png +0 -0
- papernym-0.1.2/src/papernym/gui/icons/tray-paused.png +0 -0
- papernym-0.1.2/src/papernym/gui/icons/tray-watching-mono.png +0 -0
- papernym-0.1.2/src/papernym/gui/icons/tray-watching-white.png +0 -0
- papernym-0.1.2/src/papernym/gui/icons/tray-watching.png +0 -0
- papernym-0.1.2/src/papernym/gui/icons/tray-working-mono.png +0 -0
- papernym-0.1.2/src/papernym/gui/icons/tray-working-white.png +0 -0
- papernym-0.1.2/src/papernym/gui/icons/tray-working.png +0 -0
- papernym-0.1.2/src/papernym/gui/table.py +206 -0
- papernym-0.1.2/src/papernym/gui/tabs.py +968 -0
- papernym-0.1.2/src/papernym/gui/theme.py +126 -0
- papernym-0.1.2/src/papernym/gui/window.py +128 -0
- papernym-0.1.2/src/papernym/gui/worker.py +296 -0
- papernym-0.1.2/src/papernym.egg-info/PKG-INFO +365 -0
- papernym-0.1.2/src/papernym.egg-info/SOURCES.txt +81 -0
- papernym-0.1.2/src/papernym.egg-info/dependency_links.txt +1 -0
- papernym-0.1.2/src/papernym.egg-info/entry_points.txt +5 -0
- papernym-0.1.2/src/papernym.egg-info/requires.txt +13 -0
- papernym-0.1.2/src/papernym.egg-info/top_level.txt +1 -0
- papernym-0.1.2/tests/test_build_script.py +52 -0
- papernym-0.1.2/tests/test_cli.py +488 -0
- papernym-0.1.2/tests/test_config.py +187 -0
- papernym-0.1.2/tests/test_db.py +148 -0
- papernym-0.1.2/tests/test_edge_cases.py +183 -0
- papernym-0.1.2/tests/test_engine.py +407 -0
- papernym-0.1.2/tests/test_gui.py +603 -0
- papernym-0.1.2/tests/test_http.py +91 -0
- papernym-0.1.2/tests/test_identify.py +241 -0
- papernym-0.1.2/tests/test_lock.py +31 -0
- papernym-0.1.2/tests/test_naming.py +166 -0
- papernym-0.1.2/tests/test_pdfread.py +80 -0
- papernym-0.1.2/tests/test_regression.py +60 -0
- papernym-0.1.2/tests/test_smoke.py +9 -0
- papernym-0.1.2/tests/test_sources.py +67 -0
- papernym-0.1.2/tests/test_updates.py +29 -0
- papernym-0.1.2/tests/test_watcher.py +176 -0
papernym-0.1.2/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Xatta-Trone
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
papernym-0.1.2/PKG-INFO
ADDED
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: papernym
|
|
3
|
+
Version: 0.1.2
|
|
4
|
+
Summary: Rename academic paper PDFs using scholarly metadata
|
|
5
|
+
Author: Xatta-Trone
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/Xatta-Trone/papernym
|
|
8
|
+
Project-URL: Issues, https://github.com/Xatta-Trone/papernym/issues
|
|
9
|
+
Project-URL: Releases, https://github.com/Xatta-Trone/papernym/releases
|
|
10
|
+
Requires-Python: >=3.10
|
|
11
|
+
Description-Content-Type: text/markdown
|
|
12
|
+
License-File: LICENSE
|
|
13
|
+
Requires-Dist: keyring>=24
|
|
14
|
+
Requires-Dist: pypdfium2>=4.30
|
|
15
|
+
Requires-Dist: requests>=2.28
|
|
16
|
+
Requires-Dist: watchdog>=3.0
|
|
17
|
+
Provides-Extra: gui
|
|
18
|
+
Requires-Dist: PySide6>=6.5; extra == "gui"
|
|
19
|
+
Provides-Extra: dev
|
|
20
|
+
Requires-Dist: pytest; extra == "dev"
|
|
21
|
+
Provides-Extra: build
|
|
22
|
+
Requires-Dist: pyinstaller>=6.10; extra == "build"
|
|
23
|
+
Dynamic: license-file
|
|
24
|
+
|
|
25
|
+
<p align="center">
|
|
26
|
+
<img src="https://raw.githubusercontent.com/Xatta-Trone/papernym/main/assets/papernym-icon-1024.png" alt="PaperNym icon" width="112">
|
|
27
|
+
</p>
|
|
28
|
+
|
|
29
|
+
<h1 align="center">PaperNym</h1>
|
|
30
|
+
|
|
31
|
+
<p align="center">
|
|
32
|
+
<b>Your research papers, named properly — automatically.</b><br>
|
|
33
|
+
PaperNym watches your folders and renames academic PDFs from their real publication metadata.
|
|
34
|
+
</p>
|
|
35
|
+
|
|
36
|
+
<p align="center">
|
|
37
|
+
<sub>Pronounced <b>PAY-per-nim</b> /ˈpeɪ.pər.nɪm/: “paper” + “-nym”, as in <i>synonym</i>.</sub>
|
|
38
|
+
</p>
|
|
39
|
+
|
|
40
|
+
<p align="center">
|
|
41
|
+
<a href="https://github.com/Xatta-Trone/papernym/blob/main/LICENSE"><img alt="MIT licence" src="https://img.shields.io/badge/licence-MIT-0B5563"></a>
|
|
42
|
+
<img alt="Windows 10 and 11" src="https://img.shields.io/badge/Windows-10%20%7C%2011-0B5563">
|
|
43
|
+
<img alt="Python 3.10+" src="https://img.shields.io/badge/python-3.10%2B-FFB020">
|
|
44
|
+
</p>
|
|
45
|
+
|
|
46
|
+
```text
|
|
47
|
+
1-s2.0-S0001457525001344-main.pdf
|
|
48
|
+
-> 2025_Islam_Evaluating_crash_risk_factors_of_farm_equipment_vehicles_on_county_and_non-county_roads.pdf
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Publisher downloads arrive with names like `1-s2.0-S0001457525001344-main.pdf`,
|
|
52
|
+
`nihms-1234567.pdf` or `2403.01234v2.pdf`. PaperNym finds each paper's DOI or arXiv ID,
|
|
53
|
+
looks it up in free scholarly databases, checks that the record really belongs to the PDF,
|
|
54
|
+
and gives the file a name you can read, sort and search.
|
|
55
|
+
|
|
56
|
+
## Contents
|
|
57
|
+
|
|
58
|
+
- [Features](#features)
|
|
59
|
+
- [Install](#install)
|
|
60
|
+
- [Getting started](#getting-started)
|
|
61
|
+
- [Name formats](#name-formats)
|
|
62
|
+
- [How a paper is identified](#how-a-paper-is-identified)
|
|
63
|
+
- [Safety](#safety)
|
|
64
|
+
- [Privacy](#privacy)
|
|
65
|
+
- [API keys](#api-keys)
|
|
66
|
+
- [Command-line reference](#command-line-reference)
|
|
67
|
+
- [Settings and data](#settings-and-data)
|
|
68
|
+
- [Uninstall](#uninstall)
|
|
69
|
+
- [Development](#development)
|
|
70
|
+
- [Roadmap](#roadmap)
|
|
71
|
+
- [Licence and credits](#licence-and-credits)
|
|
72
|
+
|
|
73
|
+
## Features
|
|
74
|
+
|
|
75
|
+
- **Hands-off.** Lives in the system tray and renames new PDFs as soon as they land in a
|
|
76
|
+
watched folder, such as Downloads or your papers folder.
|
|
77
|
+
- **Accurate.** Uses Crossref, doi.org, OpenAlex, Semantic Scholar and arXiv, and verifies
|
|
78
|
+
every result against the PDF's own text. A file is left alone rather than given a wrong name.
|
|
79
|
+
- **Works offline.** When no service can be reached, papers are named from the PDF alone,
|
|
80
|
+
marked `_CHECK`, and fixed automatically once the services are back.
|
|
81
|
+
- **Your names win.** A file you rename by hand is never renamed again.
|
|
82
|
+
- **Undo anything.** Every rename is recorded; undo the last one, a whole batch, or any
|
|
83
|
+
rename from History.
|
|
84
|
+
- **15 name formats, or your own.** Year–author–title, citekeys, Zotero style, or a custom
|
|
85
|
+
template with your own text, with a live preview.
|
|
86
|
+
- **Preview first.** Dry runs show `old -> new` with checkboxes before anything is renamed.
|
|
87
|
+
- **Each paper is looked up once.** Lookups are cached, and copies of a known paper are named
|
|
88
|
+
without a web call.
|
|
89
|
+
- **Tray app and command line.** One install gives you both, sharing the same settings and
|
|
90
|
+
history.
|
|
91
|
+
- **Light and dark themes**, a keyboard-friendly interface, batched notifications, and
|
|
92
|
+
Start at login.
|
|
93
|
+
|
|
94
|
+
## Install
|
|
95
|
+
|
|
96
|
+
### Windows (recommended)
|
|
97
|
+
|
|
98
|
+
1. Download `PaperNym-Setup-<version>.exe` from the
|
|
99
|
+
[latest release](https://github.com/Xatta-Trone/papernym/releases/latest).
|
|
100
|
+
2. Run it. It installs for your user account only (no administrator rights) into
|
|
101
|
+
`%LOCALAPPDATA%\Programs\PaperNym`.
|
|
102
|
+
3. PaperNym opens and walks you through choosing folders and a name format.
|
|
103
|
+
|
|
104
|
+
> [!NOTE]
|
|
105
|
+
> The installer is not code-signed yet, so Windows SmartScreen may say
|
|
106
|
+
> "Windows protected your PC". Choose **More info → Run anyway**. You can check the
|
|
107
|
+
> download against the `.sha256` file published with each release:
|
|
108
|
+
> `certutil -hashfile PaperNym-Setup-<version>.exe SHA256`
|
|
109
|
+
|
|
110
|
+
The installer always includes the command line. It adds `papernym` to your user `PATH`
|
|
111
|
+
(open a new terminal afterwards) and registers both programs with Windows. You can also
|
|
112
|
+
choose **Start PaperNym when I log in** and a desktop shortcut.
|
|
113
|
+
|
|
114
|
+
Requirements: Windows 10 or 11 (64-bit) and an internet connection for lookups.
|
|
115
|
+
|
|
116
|
+
### From source (any platform with Python 3.10+)
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
git clone https://github.com/Xatta-Trone/papernym.git
|
|
120
|
+
cd papernym
|
|
121
|
+
python -m venv .venv
|
|
122
|
+
.venv\Scripts\activate # Linux: source .venv/bin/activate
|
|
123
|
+
pip install -e ".[gui]" # drop [gui] for the command line only
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
This gives you `papernym` (command line) and `papernym-gui` (tray app). A PyPI package and
|
|
127
|
+
tested Linux support are on the [roadmap](#roadmap).
|
|
128
|
+
|
|
129
|
+
## Getting started
|
|
130
|
+
|
|
131
|
+
### Tray app
|
|
132
|
+
|
|
133
|
+
On first start a short welcome asks for:
|
|
134
|
+
|
|
135
|
+
1. **Folders to watch**, with or without subfolders.
|
|
136
|
+
2. **A name format**, with a preview on sample papers.
|
|
137
|
+
3. **An optional OpenAlex key** and whether to start at login.
|
|
138
|
+
|
|
139
|
+
PaperNym then shows a dry run of the PDFs already in those folders. Untick anything you
|
|
140
|
+
want to keep as it is, then confirm. From then on new PDFs are renamed as they arrive.
|
|
141
|
+
|
|
142
|
+
The main window, opened from the tray icon, has these tabs:
|
|
143
|
+
|
|
144
|
+
| Tab | What it is for |
|
|
145
|
+
|---|---|
|
|
146
|
+
| Activity | Live list of renames with search, filters and paging; open, show in folder, undo, refresh |
|
|
147
|
+
| Needs attention | Papers that could not be identified: enter a DOI, edit the details, retry, or ignore |
|
|
148
|
+
| Folders | Watched folders, subfolder switch, exclude patterns; double-click a row to open it |
|
|
149
|
+
| Naming | Preset or custom format, year mode, live preview; can re-apply to earlier renames |
|
|
150
|
+
| Sources | API keys, contact email, the title-search switch, and a test of every service |
|
|
151
|
+
| History | Every rename, grouped by batch, with undo and CSV export |
|
|
152
|
+
| General | Start at login, notifications, theme, diagnostics |
|
|
153
|
+
| About | Version, links and the update check |
|
|
154
|
+
|
|
155
|
+
Closing the window keeps PaperNym running in the tray; use **Quit** in the tray menu to exit.
|
|
156
|
+
|
|
157
|
+
### Command line
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
papernym scan . --dry-run # preview names for the PDFs in this folder
|
|
161
|
+
papernym scan . # rename them (one pass; the folder is not watched)
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
To watch folders:
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
papernym add-folder "D:\Papers"
|
|
168
|
+
papernym set-format year_author_title
|
|
169
|
+
papernym scan --dry-run
|
|
170
|
+
papernym watch # scan, then keep watching until Ctrl+C
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
If a batch is not what you wanted:
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
papernym undo
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
## Name formats
|
|
180
|
+
|
|
181
|
+
Pick one of the fixed presets (`papernym formats` lists them all with examples):
|
|
182
|
+
|
|
183
|
+
| Preset | Example |
|
|
184
|
+
|---|---|
|
|
185
|
+
| `year_author_title` (default) | `2025_Smith_Deep_learning_for_crash_severity.pdf` |
|
|
186
|
+
| `author_year_title` | `Smith_2025_Deep_learning_for_crash_severity.pdf` |
|
|
187
|
+
| `year_authors_title` | `2025_Smith_et_al_Deep_learning_for_crash_severity.pdf` |
|
|
188
|
+
| `authors_year_title` | `Smith_et_al_2025_Deep_learning_for_crash_severity.pdf` |
|
|
189
|
+
| `year_author_shorttitle` | `2025_Smith_Deep_learning_for_crash_severity_prediction.pdf` |
|
|
190
|
+
| `author_year_shorttitle` | `Smith_2025_Deep_learning_for_crash_severity_prediction.pdf` |
|
|
191
|
+
| `year_author_journal_title` | `2025_Smith_Accid_Anal_Prev_Deep_learning.pdf` |
|
|
192
|
+
| `author_year_journal` | `Smith_2025_Accid_Anal_Prev.pdf` |
|
|
193
|
+
| `title_author_year` | `Deep_learning_for_crash_severity_Smith_2025.pdf` |
|
|
194
|
+
| `title_only` | `Deep_learning_for_crash_severity.pdf` |
|
|
195
|
+
| `author_year` | `Smith_2025.pdf` |
|
|
196
|
+
| `citekey` | `Smith2025DeepLearningForCrashSeverityPrediction.pdf` |
|
|
197
|
+
| `author_year_title_spaces` | `Smith (2025) Deep learning for crash severity.pdf` |
|
|
198
|
+
| `authors_year_title_spaces` | `Smith et al (2025) Deep learning for crash severity.pdf` |
|
|
199
|
+
| `authors_year_title_zotero` | `Smith et al - 2025 - Deep learning for crash severity.pdf` |
|
|
200
|
+
|
|
201
|
+
Or write a **custom template** from the tokens `{year}` `{author}` `{authors}` `{title}`
|
|
202
|
+
`{shorttitle}` `{journal}` plus your own text:
|
|
203
|
+
|
|
204
|
+
```bash
|
|
205
|
+
papernym set-format --custom "[{journal}] {author} {year} - {shorttitle}" --word-sep " "
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
Notes:
|
|
209
|
+
|
|
210
|
+
- Titles are kept as long as the file name allows. That includes Windows' full-path limit,
|
|
211
|
+
so names never break in deep folders.
|
|
212
|
+
- Accents are folded to plain letters (`Bermúdez` → `Bermudez`). Titles in non-Latin
|
|
213
|
+
scripts are kept as they are.
|
|
214
|
+
- **Year mode:** `citation` (default) uses the year the publisher cites; `online` uses the
|
|
215
|
+
first online date. Set it with `papernym set-year`.
|
|
216
|
+
- Existing files are never overwritten. If two different papers would get the same name,
|
|
217
|
+
the title is lengthened until the names differ, or `_b`, `_c` is added. A second copy of
|
|
218
|
+
the same paper gets `_dup2`.
|
|
219
|
+
|
|
220
|
+
## How a paper is identified
|
|
221
|
+
|
|
222
|
+
1. **DOI.** DOIs from the PDF's properties and text are tried in order. Each is looked up
|
|
223
|
+
in Crossref, doi.org, OpenAlex and Semantic Scholar until one answers. The returned title
|
|
224
|
+
must match the PDF's text; a DOI that belongs to a cited reference is rejected.
|
|
225
|
+
2. **arXiv ID.** From the text or the file name, looked up in arXiv and Semantic Scholar.
|
|
226
|
+
3. **Title search.** Optional and on by default; see [Privacy](#privacy). A result is
|
|
227
|
+
accepted only if the title matches closely *and* the first author's surname is printed
|
|
228
|
+
on page 1.
|
|
229
|
+
4. **Nothing found.** The file is left untouched and listed under Needs attention, where
|
|
230
|
+
you can enter the DOI yourself.
|
|
231
|
+
|
|
232
|
+
Files that are clearly not papers, such as invoices, slides and forms, are left alone.
|
|
233
|
+
|
|
234
|
+
## Safety
|
|
235
|
+
|
|
236
|
+
- Files are only ever **renamed in place**. They are never moved, overwritten, edited or
|
|
237
|
+
deleted.
|
|
238
|
+
- Every rename is recorded in History before it counts, and it can be undone.
|
|
239
|
+
- A name you give a file by hand is respected from then on.
|
|
240
|
+
- Files that are still downloading are waited for; files open in another program are
|
|
241
|
+
retried later.
|
|
242
|
+
- The tray app and the command line never rename at the same time. While the tray app is
|
|
243
|
+
running, the command line's renaming commands politely refuse.
|
|
244
|
+
|
|
245
|
+
## Privacy
|
|
246
|
+
|
|
247
|
+
PaperNym has no account, no analytics and no telemetry. The only things that leave your
|
|
248
|
+
computer are:
|
|
249
|
+
|
|
250
|
+
| Sent | To | When |
|
|
251
|
+
|---|---|---|
|
|
252
|
+
| DOIs and arXiv IDs found in your PDFs | Crossref, doi.org, OpenAlex, Semantic Scholar, arXiv | Every lookup |
|
|
253
|
+
| Paper titles | Crossref, OpenAlex, Semantic Scholar | Only while **Search by title** is on (`papernym set-title-search off` to stop) |
|
|
254
|
+
| Your email address | Crossref, as its "polite pool" contact | Only if you set one |
|
|
255
|
+
| Version number | GitHub, to check for a newer release | Once a day; can be turned off under About |
|
|
256
|
+
|
|
257
|
+
File contents and file names are never sent.
|
|
258
|
+
|
|
259
|
+
## API keys
|
|
260
|
+
|
|
261
|
+
All keys are optional. PaperNym works without any.
|
|
262
|
+
|
|
263
|
+
| Service | Why add a key | Where to get it |
|
|
264
|
+
|---|---|---|
|
|
265
|
+
| OpenAlex | Adds OpenAlex as a source; it is skipped without a key | [openalex.org/settings/api](https://openalex.org/settings/api) (free) |
|
|
266
|
+
| Semantic Scholar | Avoids the shared rate limit of keyless calls | [semanticscholar.org/product/api](https://www.semanticscholar.org/product/api) |
|
|
267
|
+
|
|
268
|
+
Add them on the **Sources** tab, or from the command line:
|
|
269
|
+
|
|
270
|
+
```bash
|
|
271
|
+
papernym set-key openalex YOUR_KEY
|
|
272
|
+
papernym set-key semanticscholar YOUR_KEY
|
|
273
|
+
papernym set-email you@university.edu # optional, for Crossref
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
Keys are kept in the system credential store: Windows Credential Manager, the Secret
|
|
277
|
+
Service (GNOME Keyring or KWallet) on Linux, or the Keychain on macOS. They are not
|
|
278
|
+
written to the settings file. Where no credential store exists, PaperNym falls back to the
|
|
279
|
+
settings file (readable only by you) and says so. The environment variables
|
|
280
|
+
`OPENALEX_API_KEY` and `S2_API_KEY` override stored keys.
|
|
281
|
+
|
|
282
|
+
## Command-line reference
|
|
283
|
+
|
|
284
|
+
| Command | What it does |
|
|
285
|
+
|---|---|
|
|
286
|
+
| `scan [FOLDER] [--dry-run] [--no-subfolders]` | One pass over the watched folders, or over `FOLDER` only |
|
|
287
|
+
| `watch [--poll]` | Scan, then keep watching until Ctrl+C |
|
|
288
|
+
| `add-folder PATH [--no-subfolders]` / `remove-folder PATH` | Manage watched folders |
|
|
289
|
+
| `exclude PATTERN` / `exclude --remove PATTERN` | Skip matching files; a pattern ending in `/` skips folders |
|
|
290
|
+
| `formats` / `set-format PRESET` | List presets, or choose one |
|
|
291
|
+
| `set-format --custom "TEMPLATE" [--word-sep _\|" "\|-\|none]` | Use your own template |
|
|
292
|
+
| `set-year citation\|online` | Year mode |
|
|
293
|
+
| `set-title-search on\|off` | Allow or stop title searches |
|
|
294
|
+
| `set-key openalex\|semanticscholar KEY` / `set-email EMAIL` | Keys and contact email |
|
|
295
|
+
| `reformat [--dry-run] [--include-manual]` | Re-apply the current format to earlier renames |
|
|
296
|
+
| `undo [--last N]` | Revert the last batch, or the last N renames |
|
|
297
|
+
| `fix PATH --doi DOI` | Name a file from a DOI you supply |
|
|
298
|
+
| `status` | Counts by status and the files needing attention |
|
|
299
|
+
| `show` | Settings, folders and where keys are stored |
|
|
300
|
+
| `test-apis` | Check every metadata service with a known paper |
|
|
301
|
+
| `compare [FOLDER]` | Show what each source returns for each PDF; renames nothing |
|
|
302
|
+
|
|
303
|
+
Each output line starts with a tag: `[ok]` renamed, `[check]` named offline (marked
|
|
304
|
+
`_CHECK`), `[?]` not identified, `[busy]` file in use, `[skip]`, `[warn]`, `[preview]` or
|
|
305
|
+
`[undo]`. Colours are switched off when the output is redirected, when `NO_COLOR` is set,
|
|
306
|
+
or with `--no-color`. Exit codes: `0` success, `1` failure, `2` usage error.
|
|
307
|
+
|
|
308
|
+
## Settings and data
|
|
309
|
+
|
|
310
|
+
| | Windows | Linux |
|
|
311
|
+
|---|---|---|
|
|
312
|
+
| Settings, history and cache | `%APPDATA%\PaperNym` | `~/.config/PaperNym` (or `$XDG_CONFIG_HOME/PaperNym`) |
|
|
313
|
+
|
|
314
|
+
Set `PAPERNYM_HOME` to use a different folder. The tray app and the command line share it,
|
|
315
|
+
so a folder added in one shows up in the other.
|
|
316
|
+
|
|
317
|
+
To try PaperNym without touching your real settings or files:
|
|
318
|
+
|
|
319
|
+
```bash
|
|
320
|
+
papernym-gui --sandbox --show # installed app: PaperNym.exe --sandbox --show
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
The sandbox uses a temporary settings folder and a temporary copy of some sample papers.
|
|
324
|
+
|
|
325
|
+
## Uninstall
|
|
326
|
+
|
|
327
|
+
Use **Settings → Apps → Installed apps → PaperNym → Uninstall**. The uninstaller removes
|
|
328
|
+
the program, its Start-menu and login entries, and the `PATH` entry. It asks whether to
|
|
329
|
+
remove your settings, history and saved keys too (the default is to keep them). Your PDFs
|
|
330
|
+
are never touched.
|
|
331
|
+
|
|
332
|
+
## Development
|
|
333
|
+
|
|
334
|
+
```bash
|
|
335
|
+
pip install -e ".[gui,dev]"
|
|
336
|
+
python -m pytest -q
|
|
337
|
+
papernym-gui --sandbox --show --debug # run the tray app from source
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
- [`docs/SPEC.md`](https://github.com/Xatta-Trone/papernym/blob/main/docs/SPEC.md) is the full specification: behaviour, naming rules, edge cases.
|
|
341
|
+
- [`docs/BUILDING.md`](https://github.com/Xatta-Trone/papernym/blob/main/docs/BUILDING.md) covers building the Windows exe and installer, and releasing.
|
|
342
|
+
- [`docs/PROGRESS.md`](https://github.com/Xatta-Trone/papernym/blob/main/docs/PROGRESS.md) is the work log and milestone checklist.
|
|
343
|
+
|
|
344
|
+
Bug reports and ideas are welcome in
|
|
345
|
+
[Issues](https://github.com/Xatta-Trone/papernym/issues). For a misnamed paper, include its
|
|
346
|
+
DOI and the output of `papernym compare` on that file, if you can.
|
|
347
|
+
|
|
348
|
+
## Roadmap
|
|
349
|
+
|
|
350
|
+
- [x] Windows tray app, command line and installer
|
|
351
|
+
- [ ] Code-signed Windows releases
|
|
352
|
+
- [ ] PyPI package (`pip install papernym` / `pipx install papernym`)
|
|
353
|
+
- [ ] Tested Linux support for the tray app and the command line
|
|
354
|
+
|
|
355
|
+
## Licence and credits
|
|
356
|
+
|
|
357
|
+
PaperNym is released under the [MIT licence](https://github.com/Xatta-Trone/papernym/blob/main/LICENSE) © 2026
|
|
358
|
+
[Xatta-Trone](https://github.com/Xatta-Trone). The Windows build bundles Qt for Python
|
|
359
|
+
(PySide6, LGPL-3.0), linked dynamically. Licences of all bundled components ship in
|
|
360
|
+
`THIRD_PARTY_LICENSES.txt`.
|
|
361
|
+
|
|
362
|
+
Metadata is provided by [Crossref](https://www.crossref.org),
|
|
363
|
+
[DOI.org](https://www.doi.org), [OpenAlex](https://openalex.org),
|
|
364
|
+
[Semantic Scholar](https://www.semanticscholar.org) and [arXiv](https://arxiv.org).
|
|
365
|
+
Thank you to these services for keeping scholarly metadata open.
|