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.
Files changed (83) hide show
  1. papernym-0.1.2/LICENSE +21 -0
  2. papernym-0.1.2/PKG-INFO +365 -0
  3. papernym-0.1.2/README.md +341 -0
  4. papernym-0.1.2/pyproject.toml +48 -0
  5. papernym-0.1.2/setup.cfg +4 -0
  6. papernym-0.1.2/src/papernym/__init__.py +3 -0
  7. papernym-0.1.2/src/papernym/__main__.py +5 -0
  8. papernym-0.1.2/src/papernym/cli.py +762 -0
  9. papernym-0.1.2/src/papernym/core/__init__.py +1 -0
  10. papernym-0.1.2/src/papernym/core/apitest.py +86 -0
  11. papernym-0.1.2/src/papernym/core/autostart.py +86 -0
  12. papernym-0.1.2/src/papernym/core/config.py +229 -0
  13. papernym-0.1.2/src/papernym/core/db.py +283 -0
  14. papernym-0.1.2/src/papernym/core/engine.py +486 -0
  15. papernym-0.1.2/src/papernym/core/identify.py +287 -0
  16. papernym-0.1.2/src/papernym/core/keystore.py +121 -0
  17. papernym-0.1.2/src/papernym/core/lock.py +66 -0
  18. papernym-0.1.2/src/papernym/core/logsetup.py +36 -0
  19. papernym-0.1.2/src/papernym/core/naming.py +280 -0
  20. papernym-0.1.2/src/papernym/core/pdfread.py +198 -0
  21. papernym-0.1.2/src/papernym/core/sources/__init__.py +1 -0
  22. papernym-0.1.2/src/papernym/core/sources/arxiv.py +24 -0
  23. papernym-0.1.2/src/papernym/core/sources/common.py +43 -0
  24. papernym-0.1.2/src/papernym/core/sources/crossref.py +18 -0
  25. papernym-0.1.2/src/papernym/core/sources/doiorg.py +9 -0
  26. papernym-0.1.2/src/papernym/core/sources/http.py +62 -0
  27. papernym-0.1.2/src/papernym/core/sources/openalex.py +29 -0
  28. papernym-0.1.2/src/papernym/core/sources/semanticscholar.py +37 -0
  29. papernym-0.1.2/src/papernym/core/updates.py +65 -0
  30. papernym-0.1.2/src/papernym/core/watcher.py +194 -0
  31. papernym-0.1.2/src/papernym/gui/__init__.py +1 -0
  32. papernym-0.1.2/src/papernym/gui/__main__.py +5 -0
  33. papernym-0.1.2/src/papernym/gui/app.py +731 -0
  34. papernym-0.1.2/src/papernym/gui/common.py +84 -0
  35. papernym-0.1.2/src/papernym/gui/dialogs.py +225 -0
  36. papernym-0.1.2/src/papernym/gui/icons/arrow-dark.svg +1 -0
  37. papernym-0.1.2/src/papernym/gui/icons/arrow-light.svg +1 -0
  38. papernym-0.1.2/src/papernym/gui/icons/check-white.svg +1 -0
  39. papernym-0.1.2/src/papernym/gui/icons/papernym.ico +0 -0
  40. papernym-0.1.2/src/papernym/gui/icons/papernym.png +0 -0
  41. papernym-0.1.2/src/papernym/gui/icons/tray-attention-mono.png +0 -0
  42. papernym-0.1.2/src/papernym/gui/icons/tray-attention-white.png +0 -0
  43. papernym-0.1.2/src/papernym/gui/icons/tray-attention.png +0 -0
  44. papernym-0.1.2/src/papernym/gui/icons/tray-error-mono.png +0 -0
  45. papernym-0.1.2/src/papernym/gui/icons/tray-error-white.png +0 -0
  46. papernym-0.1.2/src/papernym/gui/icons/tray-error.png +0 -0
  47. papernym-0.1.2/src/papernym/gui/icons/tray-paused-mono.png +0 -0
  48. papernym-0.1.2/src/papernym/gui/icons/tray-paused-white.png +0 -0
  49. papernym-0.1.2/src/papernym/gui/icons/tray-paused.png +0 -0
  50. papernym-0.1.2/src/papernym/gui/icons/tray-watching-mono.png +0 -0
  51. papernym-0.1.2/src/papernym/gui/icons/tray-watching-white.png +0 -0
  52. papernym-0.1.2/src/papernym/gui/icons/tray-watching.png +0 -0
  53. papernym-0.1.2/src/papernym/gui/icons/tray-working-mono.png +0 -0
  54. papernym-0.1.2/src/papernym/gui/icons/tray-working-white.png +0 -0
  55. papernym-0.1.2/src/papernym/gui/icons/tray-working.png +0 -0
  56. papernym-0.1.2/src/papernym/gui/table.py +206 -0
  57. papernym-0.1.2/src/papernym/gui/tabs.py +968 -0
  58. papernym-0.1.2/src/papernym/gui/theme.py +126 -0
  59. papernym-0.1.2/src/papernym/gui/window.py +128 -0
  60. papernym-0.1.2/src/papernym/gui/worker.py +296 -0
  61. papernym-0.1.2/src/papernym.egg-info/PKG-INFO +365 -0
  62. papernym-0.1.2/src/papernym.egg-info/SOURCES.txt +81 -0
  63. papernym-0.1.2/src/papernym.egg-info/dependency_links.txt +1 -0
  64. papernym-0.1.2/src/papernym.egg-info/entry_points.txt +5 -0
  65. papernym-0.1.2/src/papernym.egg-info/requires.txt +13 -0
  66. papernym-0.1.2/src/papernym.egg-info/top_level.txt +1 -0
  67. papernym-0.1.2/tests/test_build_script.py +52 -0
  68. papernym-0.1.2/tests/test_cli.py +488 -0
  69. papernym-0.1.2/tests/test_config.py +187 -0
  70. papernym-0.1.2/tests/test_db.py +148 -0
  71. papernym-0.1.2/tests/test_edge_cases.py +183 -0
  72. papernym-0.1.2/tests/test_engine.py +407 -0
  73. papernym-0.1.2/tests/test_gui.py +603 -0
  74. papernym-0.1.2/tests/test_http.py +91 -0
  75. papernym-0.1.2/tests/test_identify.py +241 -0
  76. papernym-0.1.2/tests/test_lock.py +31 -0
  77. papernym-0.1.2/tests/test_naming.py +166 -0
  78. papernym-0.1.2/tests/test_pdfread.py +80 -0
  79. papernym-0.1.2/tests/test_regression.py +60 -0
  80. papernym-0.1.2/tests/test_smoke.py +9 -0
  81. papernym-0.1.2/tests/test_sources.py +67 -0
  82. papernym-0.1.2/tests/test_updates.py +29 -0
  83. 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.
@@ -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.