Skip to content

Releases: isaac-tes/arxiv-digest

v0.7.1

Choose a tag to compare

@github-actions github-actions released this 14 Oct 09:04
613f6da

Added

  • Unsaved-changes marks in the GUI, like the iOS app's save bar. While the working config differs from the saved profile or project config, a bar at the top lists the changes by tab (e.g. Authors: + Ada Lovelace, Sidebar: top n: 20 → 60), with Discard and Save. The affected tabs get an orange dot, each tab lists its own unsaved entries above its table, and the keyword, author, low-priority and feed tables mark unsaved rows with ● and show edits typed but not saved yet.
  • Open PDF button on each paper card (the arXiv /pdf/ page).
  • iOS: unsaved-changes marks like the web app. The save bar lists what changed per section (e.g. Keywords: + quantum geometry), changed Config pages get a dot, unsaved keywords, authors, low-priority terms and feeds are marked ●, and the Config and Settings tabs get their own badge.
  • Web app and iOS app feature table in the iPhone app docs, and a contributing rule that new features land on both sides.
  • Copy or download the working config as JSON: the GUI's Profiles tab has Download working config (JSON) and Copy working config (JSON) under Save (handy right after loading a starter preset), and the iOS app has Copy config JSON next to Export config in Settings → Config file. Same format as profile Export / Import.

Changed

  • Tab Save buttons persist: Save core keywords / authors / low-priority terms, Save feeds and Apply weights now write that tab's settings to the loaded profile, or to arxiv_config.json when no profile is loaded, instead of only the session. Other unsaved edits are not written with them.
  • Paper card actions: Save to Zotero, Add author, Open PDF and Remove (formerly ✕) form one equal-width column under the centred score; on a narrow card they move below the abstract as a 2×2 grid. Column layouts across the GUI wrap instead of squeezing labels letter by letter.
  • Day lists start with the newest day, in the web app's Day picker, the iOS app's day chips and the digest server's available_days.
  • iOS: no refetch until arXiv has something new. On this device, fetched papers are kept until arXiv's next announcement (Sunday to Thursday, 20:00 US Eastern), so opening the app again fetches nothing. After an announcement the app asks only for the latest days, keeps the rest of the week and drops papers older than seven days; a pull to refresh does the same. If a feed failed last time, or the cache is more than a week old, it fetches the whole week again.
  • The iOS app version now follows pyproject.toml: a build step copies it into the app, so the app always shows the release it was built from.
  • Shorter README with a new hero image and a tour of the web app: what the app does, a four-line quick start, the iPhone app and CLI, and links to the guides; the detailed GUI, CLI and scoring reference lives in the docs. The starter-preset table moved to the GUI guide, and the update-from-a-clone steps to the Quickstart.
  • Animated previews: a zooming tour of the web app (GIF in the README, video in the GUI guide) and of the iPhone app (in the iPhone app docs). scripts/record_showcase.py re-records all of them, plus the hero image and a GitHub social-preview image, from the live apps with a demo configuration, without touching your own config or showing your Zotero library.

Fixed

  • Typing in the keyword, author, low-priority and feed tables or the scoring weights no longer reruns the whole page (which looked like a re-fetch); only that editor reruns until you save.
  • iOS: sub- and superscripts in titles render properly. They are drawn as real lowered and raised text, so $\mathbb{Z}_N$ shows ℤ with a lowered N instead of ℤ_N, and SC$^{\text{sharp}}$ no longer mixes odd superscript letters.
  • A blank row added to a table is no longer saved as the text "None" (keywords, authors, low-priority terms and feeds).
  • Tests never touch your real files: the suite now isolates ~/.arxiv_scraper and arxiv_config.json; some GUI tests used to overwrite them.
  • Author names and card details are readable when the GUI's theme differs from the system's: with a light macOS/Windows appearance and Streamlit set to Dark (or the reverse), they were drawn dark grey on dark (or light on light). They now follow the theme Streamlit shows.
  • The Papers tab's JSON download button no longer drops onto its own row next to the search box at common window widths.
  • A paper's section shows just the day (e.g. Fri, 9 Oct 2026) on GUI cards and in the text and Markdown digests, instead of arXiv's raw (showing 24 of 24 entries ) header when the past week came from the listing pages.

What's Changed

Other Changes

  • release: v0.7.1 with promo assets, shorter README and config JSON copy by @isaac-tes in #14

Full Changelog: v0.7.0...v0.7.1

v0.7.0

Choose a tag to compare

@github-actions github-actions released this 08 Oct 10:09

Upgrading from 0.6.x: the arxiv-digest update in 0.6.x has the bug fixed here (#12), so it fails one last time. Upgrade once by hand; later updates work again:

uv tool install --reinstall 'arxiv-digest[gui] @ git+https://github.com/isaac-tes/arxiv-digest.git@v0.7.0'

Added

  • Two-way settings sync for the GUI: sidebar Sync with server shares config and removed papers with the iPhone app and other computers through the digest server (first connection asks whose config wins; offline it keeps a local copy and sends the changes made meanwhile with the next save or GUI start, so they aren't lost). Settings in ~/.arxiv_scraper/sync.json or ARXIV_DIGEST_SERVER / ARXIV_DIGEST_TOKEN.
  • iOS config file import/export: Settings → Config file exports the config as JSON (share sheet / AirDrop) and imports one from Files or AirDrop, in the same format as the GUI's profile Export / Import, so a config moves between Mac and iPhone as one file.
  • Update notice for arxiv-gui: launching the GUI prints the same one-line "newer release available, run arxiv-digest update" notice as the CLI, and the GUI sidebar shows a small note under the title. Both use the existing release check, which asks GitHub at most once a day and stays silent offline.
  • iOS Standalone mode ("On this device"), now the default for new installs: the app fetches the past week from the arXiv export API and today's /new listing, scores on the phone with a Swift port of the engine (parity-tested against the Python engine), and keeps config and removed papers on the device. No server needed (ADR 0009).
  • iOS math rendering: inline LaTeX shows as Unicode in titles and lists, and the paper page typesets math abstracts with bundled KaTeX (offline).
  • Add author from a paper: an Add author popover on each GUI paper card (and the Score result) and an authors menu in the iOS paper detail append that paper's author to the highlighted authors. It edits the working config only; Save applies it.
  • iOS app reaches parity with the web GUI (ios/). Four tabs:
    • Papers: the ranked digest for the saved timeframe and Top N, a day picker for past-week fetches, search over title/authors/abstract, swipe (or long-press) to remove a paper with Undo, a Removed papers section with Restore / Restore all, fetch notices, and Markdown/JSON export in the GUI's formats. Cards highlight keywords, named authors and feed-bonus subjects the way the GUI does.
    • Score: paste an arXiv link or id; shows the score, breakdown, and either the rank in the Papers view or the GUI's reason it is absent (below the cutoff, removed, a replacement, another day, or never fetched).
    • Config: keyword / author / low-priority editors, feeds with subscribe toggles and Include replacement submissions, scoring weights and per-feed subject bonuses, and the starter presets (Load / Add). Edits stay unsaved until Save, which confirms with a toast and re-ranks the digest.
    • Settings: server address or demo mode (built-in sample papers, no server needed), the Display toggles including Highlight keywords in summaries, per-aspect colors with font tint, and Zotero status.
  • Share to Zotero on iOS when the server has no Zotero key: the share sheet hands the arXiv page to the Zotero app.
  • Digest service: GET /digest takes day, skips the user's removed papers while ranking, and returns abstracts, breakdowns, removed papers, available days, filter counts and fetch notices. New /removed endpoints; /config/defaults, /config/presets/info and /config/presets/{name}/load; preset load/merge accept the working config and save=false.

Changed

  • BREAKING (digest server): the server now only answers the machine it runs on unless DIGEST_ACCESS_TOKEN is set, in which case every device must send it (the iOS app has an access-token field, kept in the Keychain). CORS is off by default, feed URLs must be on arxiv.org (max 50 feeds), and remote mode refuses the default JWT secret.
  • Removed unused code: the digest server's /lists and /feedback endpoints and their tables, and the matching unused iOS API calls.
  • iOS highlights: the dotted underline is off by default (Settings → Display → Underline highlights), and highlight text is darkened in light mode for readable contrast.
  • Digest service fetches the past week like the CLI: through the arXiv export API with a true seven-day window (fetch_pastweek), not the unreliable /pastweek HTML listing. The fetch cache now holds raw papers keyed on the resolved feeds, so editing keywords, weights, the day or removals re-ranks without re-fetching, and changing feeds can no longer serve another feed set's cache.
  • Score a paper (service) reports the rank shown in the Papers view or why the paper is absent, like the GUI. A paper already in the fetched digest is scored from it, so scoring keeps working while arXiv's export API is rate-limiting.
  • GET /config returns the effective config with every field filled in; invalid configs are rejected with 422.

Fixed

  • arxiv-digest update works again for uv tool / pipx installs: the upgrade requirement (and the "To upgrade manually" hint) lacked the git+ scheme, so uv rejected arxiv-digest @ https://…/arxiv-digest.git@vX.Y.Z as an archive URL. It now uses git+https://… (#12).
  • GUI: inline LaTeX in paper titles and full abstracts (e.g. $\mathbb{Z}_N$) now renders; it showed as raw $...$ because the card text sat inside a <div>, where Streamlit's Markdown (and its KaTeX) doesn't run. Math is kept verbatim (no highlight inside it), and stray Markdown characters outside math stay literal.
  • Card summaries no longer stop mid-citation: the two-sentence summary split at "et al." / "Nat." (e.g. "A recent experiment by Roy et al. (Nat."). Sentences now don't end inside parentheses, after common abbreviations (et al., Fig., Eq., Nat., Phys. Rev., e.g., …) or after an initial. Same rule in the iOS app.
  • A cleared keyword, author or low-priority list stays cleared. Loading a config or profile whose list was saved empty used to bring back the built-in defaults; now only a missing list does.
  • Zotero saves from the service put given names and surnames in the right fields (they were swapped).
  • Named authors highlight like they score in the service and the app (middle initials tolerated).

Removed

  • The service's Zotero deeplink mode. Its zotero://select link could only select an existing item, so it saved nothing (ADR 0005, amended).

What's Changed

Other Changes

  • feat: iOS app, shareable digest server and GUI sync by @isaac-tes in #13

Full Changelog: v0.6.3...v0.7.0

v0.6.3

Choose a tag to compare

@github-actions github-actions released this 30 Sep 13:30
9884523

Added

  • Remove a paper from the digest. Each paper card in the GUI has a ✕ button that drops it from the ranked list. Papers below it move up one place, and the first paper past the top-N cutoff takes the freed slot. Each profile keeps its own removal list (~/.arxiv_scraper/removed/<profile>.json, or ~/.arxiv_scraper/removed_papers.json while no profile is loaded), so removals survive page reloads, app restarts and later fetches: a paper removed from today's ranking is also absent from the week's. The sidebar now shows which profile is loaded, and Score a paper reports a removed paper as removed and ranks the others without it. A Removed papers expander above the list offers the removed papers that would otherwise be in the ranking shown (not, say, one removed from yesterday's digest), restorable one at a time or all at once. Markdown/JSON downloads follow the list as shown.

Fixed

  • Score a paper reports the rank the Papers tab shows (#7). Both tabs now build the digest the same way: replacement submissions and the Papers tab's Day choice are applied before ranking, and a hidden paper is explained as a replacement, another day, removed, or below the top-N cutoff.
  • Score a paper no longer crashes for a paper also listed in the Papers tab (#8). Each tab's Save to Zotero popover now has its own widget keys.
  • Score a paper only offers a real Restore action. If the removed paper is hidden by current filters or the top-N cutoff, the message tells you how to reveal it in the Papers tab first.
  • Loaded GUI profiles survive reloads. A fresh session restores the last loaded profile and its saved config before rendering the digest, keeping that profile's removal list active.
  • Profile names stay within their storage directories. Path-like names and the reserved (unsaved) are rejected before profile and removal files are read, written, or deleted.
  • The sidebar profile selector follows the loaded config. Switching profiles or loading a preset/import clears stale widget state before the next render.
  • Save as snapshots the current removals. The new profile's removal list is an exact copy of the current one (stale or damaged lists left under that name are replaced), and if the copy fails nothing is saved and the current profile stays active.
  • Malformed saved profiles no longer block GUI startup. The app falls back to project config and keeps the damaged file available for deletion.
  • Score a paper matches a bare arXiv ID with a version. Pasting 2607.21663v2 kept the v2, so a paper that was in the digest was reported as never fetched. The version is now stripped, as it already was for pasted URLs.

What's Changed

Other Changes

New Contributors

Full Changelog: v0.6.2...v0.6.3

v0.6.2

Choose a tag to compare

@github-actions github-actions released this 21 Sep 09:15

Fixed

  • Full author names with middle initials now match. A named author like
    Hannah Price now scores and highlights a paper whose author list renders
    the same person as Hannah M. Price (and vice versa: a config entry
    carrying the initial matches the bare name). Multi-token names match on
    given + surname within a single author, ignoring middle names/initials on
    either side, while single-token surnames keep the whole-token word-boundary
    check (so ma still never matches Mao).

Full Changelog: v0.6.1...v0.6.2

v0.6.1

Choose a tag to compare

@github-actions github-actions released this 15 Sep 12:52

Added

  • Persistent fetch cache. Fetch results are now cached on disk under
    ~/.arxiv_scraper/cache/, keyed on (timeframe, feeds, UTC day). Unlike the
    previous in-memory-only cache, this survives app restarts and reuses the same
    day's results with no network call, so a routine re-open never re-triggers
    arXiv's rate limiter. A new UTC day misses and refetches; files older than
    3 days are pruned and empty/failed fetches are never cached. Clear fetch
    cache
    now clears both the in-memory and disk layers.
  • HTML /pastweek fallback. When the export API is rate-limited or timing
    out, pastweek falls back to arXiv's HTML listing (a more tolerant host)
    instead of failing, and reports the fallback in the CLI (stderr) and GUI
    (warning).

Fixed

  • pastweek no longer hangs for minutes when arXiv rate-limits the export
    API.
    Retry backoff is capped and bounded by a ~30s wall-clock budget, a
    blocked API is detected once and skipped for the remaining feeds, and the
    GUI surfaces a clear error instead of crashing. Read timeout raised to
    (10, 60)s and request pacing set to arXiv's recommended ~3s.

Full Changelog: v0.6.0...v0.6.1

v0.6.0

Choose a tag to compare

@github-actions github-actions released this 11 Sep 16:55

Added

  • arxiv-digest update (alias: arxiv-digest upgrade). The CLI now
    self-updates: it reinstalls the tool from the latest GitHub release tag,
    so the upgrade works even without the original clone. A cached (24 h)
    check prints a one-line notice at the end of normal runs when a newer
    release is out; --no-update-check suppresses it, and notice + upgrade
    both fail silently when GitHub is unreachable.
  • Summary highlight toggle. The sidebar Display section gains a fourth
    checkbox that highlights matched keywords / low-priority terms in the
    truncated abstract summaries on the paper cards, mirroring the full-
    abstract highlight. Off by default.

Changed

  • Quickstart simplified. Setup is now clone → uv tool install '.[gui]'
    → arxiv-gui; the README leads with the quick start and moves defaults,
    starter presets, and the feature overview below it. The GUI guide lists
    the eight tabs the app actually renders, including Score a paper.
  • Architecture decision records remain in the repository but are excluded
    from the public GitHub Pages site.

Full Changelog: v0.5.6...v0.6.0

v0.5.6

Choose a tag to compare

@github-actions github-actions released this 10 Sep 14:07

Added

  • Docs badge in the README links directly to the GitHub Pages site.

Changed

  • Feed URL and timeframe handling is shared by the CLI and GUI through the
    feed_url() and fetch_pastweek() helpers.
  • Pastweek keeps a true seven-day submission window. Its day labels now use
    the announcement sections shown by arXiv, so the GUI and the arXiv listing
    use the same dates.
  • Starter presets and package metadata no longer include personal research
    profile details.
    The presets remain generic quantum-physics starting points.
  • CLI and GUI documentation now agree on JSON output, scoring, and the
    available command-line flags.

Fixed

  • Pastweek fetches now query every selected category. The export API treats
    cat:cond-mat as an exact category rather than a wildcard for feeds such as
    cond-mat.quant-gas and cond-mat.mes-hall.
  • Scores and fetched results now agree for subcategory papers. A paper that
    scores within the configured Top N is no longer omitted because its selected
    subcategory was skipped by the GUI.
  • Unknown feeds now fail clearly during pastweek fetches instead of
    producing an empty digest.
  • Author hover tooltips now render in the GUI through its CSS tooltip styles.

Full Changelog: v0.5.5...v0.5.6

v0.5.5

Choose a tag to compare

@github-actions github-actions released this 10 Sep 12:33

Added

  • Docs badge in the README links directly to the GitHub Pages site.

Changed

  • Feed URL and timeframe handling is shared by the CLI and GUI through the
    feed_url() and fetch_pastweek() helpers.
  • Starter presets and package metadata no longer include personal research
    profile details.
    The presets remain generic quantum-physics starting points.
  • CLI and GUI documentation now agree on JSON output, scoring, and the
    available command-line flags.

Fixed

  • Unknown feeds now fail clearly during pastweek fetches instead of
    producing an empty digest.
  • Author hover tooltips now render in the GUI through its CSS tooltip styles.

Full Changelog: v0.5.4...v0.5.5

v0.5.4

Choose a tag to compare

@github-actions github-actions released this 03 Sep 16:25

Added

  • Keyword and author font tinting is on by default in the GUI: the sidebar
    Font: keywords / Font: authors toggles default to checked (low-priority and
    subjects remain background-highlight only), matching the original behavior.

Changed

  • Group-library saving removed. Zotero's local HTTP API has no supported
    /groups listing or write route, so group saves could never use the local
    "Allow this application?" authorization flow. The Save-to-Zotero popover now
    saves to personal My Library collections only; to place an item in a group,
    copy/drag it there in Zotero. The cloud-API/key path, its settings, and the
    zotero_cloud module were dropped (see ADR 0002, marked superseded).

Fixed

  • False "Saved to Zotero:" toast after a denied/failed save. The save outcome
    was consumed only inside the popover, so a denial could linger and fire a
    stale success seconds later. Success is now shown only by the transient
    "Saved ✓" tick, and errors are consumed immediately — a denied or failed save
    never shows as a success.
  • arXiv pastweek fetch hardened against rate limits and timeouts. The export
    API fetch retries 429/5xx and read/connect timeouts with backoff (honoring
    Retry-After), sends a descriptive User-Agent, and uses a moderate page size
    (500) so a big query neither trips the 429 limiter nor exceeds the read
    timeout.
  • Duplicate sub-category feed requests removed. A cond-mat.* feed is no
    longer fetched when its parent cond-mat is also selected, cutting redundant
    arXiv requests while preserving dedup.

Full Changelog: v0.5.3...v0.5.4

v0.5.3

Choose a tag to compare

@github-actions github-actions released this 24 Aug 12:25

Full Changelog: v0.5.2...v0.5.3