{% extends "base.html" %} {% from "_help.html" import info %} {% from "_miss_surface.html" import status_icon, verify_stamp %} {% from "_icon_btn.html" import icon_button %} {% from "_job_status.html" import job_status %} {% block title %}Wanted — Paperful{% endblock %} {% block body_attrs %}{% if request.query_params.get('run') or request.query_params.get('poll') %} data-poll-run="{{ request.query_params.get('run') or request.query_params.get('poll') }}"{% endif %}{% endblock %} {% block content %}

Wanted

PDFs for items in {{ prefs.collection or 'the collection in the header' }}. Missing has no file yet; Held has a file that is not attached or does not match; Have is done. Preview shows what would happen, Grab downloads to out/, Attach writes held files into the library.

{% if coach %}
{{ coach }} System
{% endif %} {% if error %}
{{ error }}
{% endif %} {{ job_status(job) }}

Have {{ counts.have }} · Held {{ counts.held }} · Missing {{ counts.missing }}{% if prefs.collection %} · Report{% endif %}{% if pending and pending.total %} · Waiting from Discover {{ pending.total }}{% endif %}

{% if not prefs.collection %}

Pick a collection first

Wanted works on one collection at a time. Open Library and press the target icon next to the collection you want to fill.

{% elif counts.have + counts.held + counts.missing == 0 and not error %}

Nothing to fetch here

This collection has no items, or the library did not return any. Try another collection on Library, or add papers on Discover.

{% endif %}
Missing {{ counts.missing }} {{ info("Items with no stored PDF. This is the usual list to Preview and Grab.") }} Held {{ counts.held }} {{ info("A PDF was downloaded or linked, but it is not attached yet, the DOI does not match, or the file still needs a check.") }} Have {{ counts.have }} {{ info("A PDF whose DOI matches the library item is already on the record.") }}

Fetch

{% if attach_mode == 'auto' %}Grab saves PDFs to out/ and attaches them when the library can be written (Zotero 10 or newer; on 7–9 the files stay on disk). Change this under Settings.{% else %}Grab saves PDFs to out/ only. Press Attach for the copies you trust.{% if show_auto_attach_setting %} Settings can make Grab attach automatically.{% endif %}{% endif %} Tick rows below to work on a subset; with nothing ticked, Preview and Grab use the whole Missing list.

{% if prefs.advanced %}
Filters {{ info("Narrow which items this run considers. Leave blank to use the whole Missing list (or your ticked rows).") }}

Optional limits. Undated items are dropped when you set a year range.

{% endif %}

Actions {{ info("Preview is safe. Grab downloads to Paperful. Attach writes held files into the library.") }}

{{ info("Show which items would be fetched, without downloading.") }} {% if attach_mode == 'auto' %} {{ info("Download PDFs into the out/ folder on this computer and attach them into the library when write access is available (Zotero 10 or newer).") }} {% else %} {{ info("Download PDFs into the out/ folder on this computer. They are not attached until you Attach.") }} {% endif %} {{ info("Write PDFs from the out/ folder into the library. Needs Zotero 10 or newer; on 7–9, attach those files in Zotero. Skips PDFs whose DOI does not match the item (use Advanced to override). CLI paperful run attaches mismatches unless you pass --strict-pdf-doi.") }}

Items

{% if wanted_pagination.total %} {{ wanted_pagination.range_start }}–{{ wanted_pagination.range_end }} of {{ wanted_pagination.total }} {% else %} 0 of 0 {% endif %} {% if wanted_pagination.prev_url %} Previous {% endif %} Page {{ wanted_pagination.page }} / {{ wanted_pagination.page_count }} {% if wanted_pagination.next_url %} Next {% endif %}

Tick rows to limit Fetch (and Advanced attach, recover, handoff, or reachout) to those items. The icon on the right says why an item is missing or held — hover or focus it.

{% for row in rows %} {% else %} {% endfor %}
{{ tab|capitalize }} items in {{ prefs.collection }}
SelectTitleDetail
{{ row.title }} {% if row.miss_plain %}{{ row.miss_plain }}{% endif %} {% if row.miss_plain %}{{ status_icon(row.miss_surface, row.miss_plain, row.miss_detail) }} {% elif row.state %}{{ verify_stamp(row.stamp) }}{{ status_icon(row.state, row.verify_plain, row.verify_tip) }} {% endif %} {% if row.has_summary %}summary{% endif %} {{ icon_button('Detail', 'detail', drawer='d-' ~ row.key) }}
No {{ tab }} items{% if wanted_pagination.q %} match “{{ wanted_pagination.q }}”{% endif %}.
{% if prefs.advanced %}
Advanced overrides and recovery

These can attach a PDF that is the wrong paper, or open many browser tabs. Preview first when a Preview button is offered.

Attach {{ info("Write held PDFs into the library, including files the usual Attach button would refuse.") }}

Use these only when you have looked at the held file and still want it on the item.

{{ info("Show which held files would be attached with the overrides above, without writing to the library.") }}
{{ info("Apply the last successful attach preview. Disabled until a Preview attach has finished.") }}

Recover {{ info("Re-run the browser agent on items a Grab already missed. Needs LLM config and the browser-agent extra.") }}

This opens a real browser and tries publisher pages one by one. It is slower than Grab and can hit captchas.

{{ info("Show which items would be sent to the browser agent, without opening a browser.") }}
{{ info("Run the last successful recover preview in a headed browser. Disabled until a Preview recover has finished.") }}

Handoff {{ info("Open publisher pages in your own browser so you can download PDFs by hand. Paperful never clicks Request full-text for you.") }}

Use this when automated fetch cannot get a file — typically paywalled papers you can reach yourself.

Inbox {{ info("A drop folder for PDFs you downloaded yourself. Paperful matches files to library items by DOI or title.") }}

Put hand-downloaded PDFs in the configured inbox folder, then drain it here.

{{ info("Match whatever is waiting in the drop folder and attach the hits. Unmatched files stay put.") }}

Reachout {{ info("Export a list of authors to ask for a PDF (ResearchGate and similar). Paperful never sends mail.") }}

Builds a contact list for items that are still missing. Optional Twenty lookup fills emails when that integration is on.

{% endif %} {% if pending and (pending.total or pending.error) %}
Waiting from Discover {{ pending.total }} {% if pending.error %}
{{ pending.error }}
{% endif %}

Papers you kept on Discover, or that a watch or keepup digest proposed, that are not in this collection yet. Preview add → Apply add creates metadata parents here; they then appear under Missing. These come from every topic run, not only ones about this collection. Open queue · Following

{% if pending.total %}
    {% for row in pending.rows[:10] %}
  • {% if row.doi %} {% else %} {{ row.title }} no DOI — add in Discover {% endif %} {{ row.source_plain }}{% if row.why %}Why suggested: {{ row.why }}{% endif %}
  • {% endfor %}
{% if pending.total > 10 %}

and {{ pending.total - 10 }} more (open Discover to add the rest).

{% endif %}
{{ info("Classify the ticked DOIs against this collection without writing. Rows without a DOI stay for Discover.") }} {{ info("Create metadata parents for the last successful Preview add. They land under Missing. Disabled until a Preview add has finished.") }}
{% endif %}
{% endif %} {% endblock %}