Privacy policy¶
Last updated: 2026-08-28
papio runs on your computer. It has no hosted service, user account, telemetry, or analytics. This policy covers the papio application (daemon and CLI) and the papio browser extension.
Summary¶
papio does not collect your data or send it to OrgMentem.
The extension communicates with the local papio application through the browser's native-messaging interface. It does not contact OrgMentem or any other external service on its own, except when it asks a provider page to turn a link into a PDF URL.
The local application does contact third-party scholarly services to find papers. These requests include the identifier you ask papio to resolve, such as a DOI, PMID, arXiv ID, or title. Some services also receive your configured email address or API credentials. The table below lists every destination and the data it receives.
Requests to third-party services¶
Every destination below is contacted directly by the daemon on your computer. Each request carries the identifier being looked up. The “Data sent besides the lookup” column lists anything else sent.
| Service | Data sent besides the lookup | Used for | Default |
|---|---|---|---|
api.unpaywall.org |
your email (required by their terms) |
Resolving a DOI | On |
api.crossref.org |
your email, if set |
Adding metadata to a title-only request; checking a DOI's registered version relations when other candidates are exhausted | On |
api.crossref.org |
— | Daily retraction checks for papers already in your library | On |
www.ebi.ac.uk (Europe PMC) |
— | Resolving a DOI, PMID, or title | On |
export.arxiv.org |
— | Resolving an arXiv ID or DOI | On |
doi.org |
your email, in the User-Agent |
Confirming that a DOI exists before an institutional handoff | On |
Your institution's configured delivery API (document_delivery.base_url — ILLiad in v1) |
your api_key, patron_ref, and the request's bibliographic identifiers |
Submitting or polling one of your document-delivery requests | Off — requires configuration |
api.openalex.org |
your email, your API key |
Resolving and papio search |
Off |
api.core.ac.uk |
your API key | Resolving | Off |
api.crossref.org (TDM) |
your subscriber token | Resolving | Off |
api.semanticscholar.org |
your API key, if set | Resolving a DOI, arXiv ID, or PMID, and papio search when configured |
On |
api.openaire.eu |
your API token, if set | Resolving | On |
| Publisher and repository hosts | — | Downloading the PDF | On |
api.github.com |
nothing | Once a day, checking for a new papio or zotio release | On, updates.check = false disables it |
| Your webhook URL | job event and message | Job state changes | Off |
Important details¶
Email address. The email setting is sent to services that require or accept
it. Unpaywall and OpenAlex require an email address. Crossref and DOI lookup use it
when configured. Leaving it empty prevents Unpaywall and OpenAlex lookups.
Retraction checks. Retraction checks send the DOIs of papers already in your
library to Crossref. Disable them with
[sources.retraction_watch] enabled = false.
Update checks. Update checks make an unauthenticated request to the public
GitHub releases page. GitHub receives your IP address, as it would for any web
request, but papio does not send your identifiers or usage information. Disable
the check with updates.check = false.
Document delivery. Document delivery is disabled unless you configure it. When enabled, papio contacts only the institution's configured delivery service and sends the credentials and bibliographic details required by that service. It never uses a shared or papio-operated delivery service. See the configuration reference for the full field list.
Browser extension¶
- No OrgMentem data collection. The extension has no backend and does not send data to OrgMentem. It communicates with the local native-messaging host
com.orgmentem.papio. - No browser credentials leave the page. You enter institutional credentials and complete MFA or CAPTCHA in your browser. The extension never reads a password field, a cookie, or your browsing history, and it never stores or transmits a username or a session token. To tell whether your library session is live, the check it runs inside the configured library page does read that page's own visible affordances and its
localStorageandsessionStorageentries, including whether a session token found there has expired and whether it carries an identity claim. Every value is discarded in the page: only the resultingsigned in/signed out/unknownclassification comes back, and nothing else is stored or sent. - No background scraping, and scanning is explicit. Page scanning runs only when you click it, reads only the top frame of that one tab, and runs entirely inside the page: identifier detection is local JavaScript, not a network request. Your explicit click is the consent for that one scan; no separate site approval exists. Selection acts only on the papers you choose, with a maximum of 200 canonical keys per durable cohort, submitted in bounded chunks. It does not crawl, harvest, or auto-submit pages.
- Institution-session checks follow your local keep-warm mode. The default While papio has work mode checks the configured library resolver only while institutional papers are active. Always for current library keeps that resolver warm even when no paper currently needs it. Off stops automatic resolver checks. When a paper is waiting for sign-in, a completed HTTPS navigation on that paper's declared publisher host can schedule a check of the configured library resolver. This publisher-triggered path reads no publisher page content. The publisher page cannot set the popup's signed-in or signed-out verdict; that comes only from the configured library page. If papio's own resolver tab is still paused on an identity-provider page, the trigger leaves that page open and creates a muted background resolver tab for the check. The replacement surfaces only when the resolver itself says that sign-in is still required. A tracked papio tab returning from authentication can still provide the existing, same-origin release evidence for queued work, subject to current resolver access. Other hosts, queued-only work, missing institution bindings, and ambiguous institutions do not authorize this trigger. No new landing URL, page-derived publisher data, title, path, query, fragment, cookie, credential, or session token enters extension storage or a native message.
- What a scan sends to the local application. The scan itself sends nothing. When the selection workspace opens, the detected identifiers (each a
doi,pmid,arxiv, oropenalexkind and value) plus a structural count of visible records go to the local papio application so it can mark which papers you already own and which are eligible. When you submit, only the canonical keys of the rows you selected are acquired, along with the page's bare lowercase HTTPS origin and the detector name. The short citation label shown beside each row — up to 240 characters of the nearest citation-shaped container's visible text — is display-only and stays in the browser; it is never sent. No page text, path, query, fragment, page title, or credential leaves the browser for a scan. - The host-page action acknowledgement is ephemeral and local. When a popup action succeeds and transient acknowledgements are set to show for all requests, the extension briefly draws a small chip in the page you acted on. It carries one of four fixed short phrases and nothing else — no identifier, title, URL, provider name, or job id — is not interactive, sends nothing anywhere, stores nothing, and removes itself after three seconds. It reads no page content and installs no watcher or content script.
- The loss toast prefers the page when all-sites access is active. When papio loses a tab it opened for a paper, it can offer to reopen that route. With all-sites access granted, "Show the lost-tab message in the page you are reading" is on by default and draws the message into the page in front of you. Turn it off to use the small papio window instead. Revoking all-sites access turns the in-page route off, and re-granting access does not restore an explicit opt-out. Both routes show the same fixed sentence, one button, and papio's own mark. They carry no identifier, title, URL, provider name, or job reference, disappear eight seconds after arriving, and commit nothing when they go. Neither appears while a papio surface holds focus.
- The in-page loss message reads nothing. The all-sites grant lets papio reach the current HTTPS page. The loss-toast setting selects the integrated route or the separate window. When papio draws the message, it adds one element and reads nothing from the page. No selector runs, no page text is collected, and nothing about the page is stored or sent. The message renders inside a shadow root, so the page's scripts and styles do not reach it. It removes itself before reporting your choice. It is never drawn into a page papio is driving, a non-HTTPS page, or a PDF. A withdrawn grant, blocked injection, or unsafe page always falls back to papio's own window.
- Focused-surface presence is minimal and local. The feature-gated
surface_presence_v1hint carries only an opaque per-instance id, the focused surface type (popuporinbox), a boolean focused value, and a timestamp. It goes to the local daemon only. It contains no URL, title, tab id, host, identifier, or page content. - Page-bulk recovery is origin-bounded. The browser-local restart-safe cohort record stores only a bare lowercase HTTPS origin, a bounded detector identifier, and canonical keys (plus the recovery bookkeeping needed to replay chunks). It stores no path, query, fragment, page title, or bearer value.
- Ownership marks come from a local check, not the network. A page-bulk row's
owned_with_pdf/owned_missing_pdf/ownership_unknownmarks can come from your Zotero library through zotio, which the local application invokes as a local subprocess in local-only mode: the lookup answers from zotio's existing on-disk library mirror, and no network request is made for this check — in particular, papio never triggers a Zotero-account sync from a workspace scan. The mirror refreshes only through your own zotio activity (for example, when a paper is filed after acquisition), so a stale or failed check reportsownership_unknownhonestly rather than a false "not owned." - Normal browser session. The extension uses browser extension APIs and native messaging. It does not use WebDriver, CDP, or other browser-automation frameworks.
Local storage¶
Browser storage. The extension stores its settings and temporary job and tab state in browser storage. This data stays in the browser so the extension can survive service-worker suspension and reconnect to the local application. For an active institutional job, browser storage can also retain the configured library resolver as one bare HTTPS origin. A pending session-recheck reason can survive service-worker suspension beside it. Neither value contains the publisher landing, an identity-provider address, a path, query, fragment, title, cookie, credential, or permission pattern.
The dedicated page_bulk_cohort_recovery_v1 browser-local record is limited to
restart-safe replay data: a bare lowercase HTTPS origin, a detector identifier,
and the ordered canonical keys, together with opaque cohort/chunk bookkeeping
and timestamps. It never stores a path, query, fragment, page title, or bearer
value.
Browser storage for page scanning. Page scanning requires an explicit click for each scan. The browser stores only the restart-safe page-bulk cohort record described above, with no path, query, fragment, page title, or bearer value.
Application storage. The local application stores papers, metadata, and job
records in its data directory. Validated PDFs live in artifacts/. Downloaded
candidates awaiting validation live in quarantine/. Papers go only to your own
Zotero library if you enable that integration. Notification routing also keeps
the notification_intents ledger in papio.db; its payloads are durable and
may retain identifiers such as a retraction finding's DOI indefinitely. For a
single-finding integrity notice, the DOI may also appear in the macOS
Notification Center notification text, subject to your operating system's
notification and lock-screen settings.
Diagnostic captures. Diagnostic captures are sanitized HTML from pages you
choose to capture. They are stored in <data_dir>/captures/<host>/ and may still
contain article text, account labels, or other page content. Captures are retained
for 14 days and up to 10 per host by default; both limits are configurable in
[captures]. Run papio adapter captures purge to remove every capture, or
papio adapter captures purge --host <host> to remove captures for one host.
Bug reports. The data directory may also contain papio.db (request history,
titles, identifiers, and notification-intent payloads), native-host.log
(browser-session diagnostics, including URLs), a legacy adoptions/ directory
on installs that predate the browser-download adoption root, and the
update-cache*.json and retraction-cache.json files. Browser-downloaded
files awaiting adoption now live in the adoption root itself
(<your download folder>/papio by default). papio does not upload any of
these. Review and minimize them before sharing a bug report; they describe
what you have been reading.
Adapter evidence. Reaching a provider with no adapter can create a sanitized diagnostic capture, but papio never uploads it, opens a public issue, or sends telemetry. Review and minimize a capture before sharing it yourself. Sanitized HTML can still contain article text, account labels, or other page content.
Acquisition history and impact figures. The extension's figures — papers acquired, success rate, weekly acquisition trend, access-route breakdown, and human-handoff rate — are calculated locally from job records. They are displayed only to you and are never transmitted anywhere.
Permissions¶
Each browser permission is used to perform a requested download, read a page
needed for that job, run an explicit one-shot scan of the current tab, check a
configured library session while a paper is waiting for sign-in, or report a
result to the local application. For example, nativeMessaging reaches the
local daemon, downloads saves the requested PDF, activeTab permits the
top-frame scan only after you click it, and host permissions allow the
extension to read the relevant library and publisher pages. The extension
store listing explains each permission in detail.
Third parties¶
papio does not sell your data or share it for advertising, credit decisions, or unrelated purposes.
The third-party scholarly services in the table receive the data listed there because they are needed to find or download the paper you requested. During browser handoff, your browser contacts your institution and the publisher directly. papio is not an intermediary for those requests.
Changes¶
If this policy changes, the “Last updated” date above will change. The current version will always be available at this URL.
Contact¶
Questions about privacy: open an issue at github.com/OrgMentem/papio.