npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@junma11/dsh-scholar-lab

v0.1.4

Published

Google Scholar search agent for DSH: structured paper metadata, JCR impact factors, full abstracts, and CSV export. Installable as a profile bundle (npm) or as a dynamic Cordis plugin.

Readme

dsh-scholar-lab

Google Scholar search agent for DeepSeek Harness (DSH) — publishable as an npm profile bundle (one-command install into any DSH profile) or usable as a dynamic Cordis plugin (no install, per-session).

Search Google Scholar for academic papers and get structured metadata — title, full journal name (when resolvable), JCR impact factor + quartile, authors, year, cited-by count, abstract-excerpt snippet, PDF link, versions — plus full abstracts from publisher pages and CSV export of any result set.

Feature comparison

| Capability | This plugin (Scholar Lab for DSH) | Google Scholar Labs | | ------------------------------------------------------------------------ | --------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | | Access | No login needed, works from any session/host | Login required (no anonymous API; also no CORS from third-party pages) | | Search source | Same underlying Scholar index (classic endpoint) | Same index, but an AI "research mode" on top | | Structured metadata (title, authors, journal, year, citations) | ✅ Full structured JSON per paper | ✅ (the "familiar Scholar features") but as web UI, not structured data | | Full journal names | ✅ Resolved from bundled JCR database | Shows venue as Scholar renders it | | JCR impact factor + quartile | ✅ JCR 2025 (June 2026 release), 22.6k journals | ❌ Scholar doesn't show IFs | | Full abstract + DOI, volume/issue/pages, publisher | ✅ viascholar_abstract (publisher meta tags) | Labs gives summaries, not structured bibliographic records | | CSV export (all loaded papers, 22 columns) | ✅ One click → downloads to your laptop | ❌ No bulk/structured export | | Pagination / "load more" | ✅ Up to 100 papers per search | Page-based browsing, no export | | Use from chat / automation | ✅ Model toolsscholar_search / scholar_abstract — results feed the agent | ❌ Browser UI only |

In short

  • Scholar Labs wins on: understanding research questions — AI-generated overviews, per-paper helpfulness notes, and follow-up Q&A. It's a reading/exploration assistant.
  • This plugin wins on: structured, machine-usable data — clean metadata (title/authors/journal/year/citations), full journal names + JCR 2025 impact factors & quartiles (which Scholar never shows), full abstracts + DOIs, bulk CSV export to your laptop, pagination up to 100 papers, and deep integration with the chat agent (search results feed directly into what the assistant can reason about). No login, works everywhere.

They're complementary: use Labs when you want an AI conversation about a research area; use this plugin when you want a reproducible list of papers with bibliometrics you can export and cite-check. The panel even links to your logged-in Labs page, so both are one click apart.

Install (profile bundle — the community path)

dsh plugin --profile web add @junma11/dsh-scholar-lab
dsh web

The dsh plugin command forwards to pnpm inside the profile; any installed package declaring dsh.bundle automatically joins the profile's bundle layer stack (dsh.profile.bundles) and its cordis.patch.yml composes into the app config. Remove with:

dsh plugin --profile web remove @junma11/dsh-scholar-lab

Requires @deepseek-ai/dsh ≥ 0.1.0 and the base profile's shell service (default web profile; fetches go through curl).

What you get

| Surface | Description | | ------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | scholar_search tool | Chat-side search:query, max_results (1–20), start, year ("2020" or "2018-2023"), lang, export_csv (writes scholar-lab/scholar-export-*.csv into the workspace via the fs service) | | scholar_abstract tool | Full abstract + HighWirecitation_* metadata from a result/publisher URL | | Search panel (UI) | Run-card panel with search box, pagination ("Load more papers", deduped, ≤100), andDownload CSV (browser-side, nothing written to the host) | | Result cards | scholar_search / scholar_abstract result views with JCR IF badges |

Per-paper fields: title, authors[], authors_raw, venue, journal_full, impact_factor, jif_quartile, publisher, year, cited_by, snippet, link, pdf, versions, cluster_id, cites_id, result_id.

Package layout

| File | Contents | | ------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | lib/host.js | Packaged host half:scholar_search / scholar_abstract tools (ctx.tools.register + defineTool from @deepseek-ai/dsh-tools), the /scholar-lab/search + /scholar-lab/export webServer routes, CSV writer | | lib/client.js | Packaged client half: browser bundle in the web-shell module-table format (window.__ModuleLoader__.load), search panel + tool result cards (talks to the host over the HTTP routes) | | data/journal-impact-factors.json | JCR 2025 database (full names, IFs, quartiles) — 22,643 journals, 1.5 MB, read from the package viaimport.meta.url | | cordis.patch.yml | Bundle patch layer: inserts thescholar-lab host row (the browser row comes from the package's dsh.client manifest) | | dynamic/plugin.host.js | Dynamic Cordis plugin form (host half) — the zero-install variant; uses harness.* and host.call, no npm needed (see below) | | dynamic/plugin.client.js | Dynamic Cordis plugin form (client half) — host.call('scholar-search' / 'scholar-export') bridge |

Develop & verify locally (before publishing)

# 1. Syntax / structure checks (dynamic halves are `return { … }` bodies —
#    wrap them in a function for node --check)
node --check lib/host.js
node --check lib/client.js
node -e "new Function('return async () => {' + require('fs').readFileSync('dynamic/plugin.host.js', 'utf8') + '}')"
node -e "new Function('return async () => {' + require('fs').readFileSync('dynamic/plugin.client.js', 'utf8') + '}')"

# 2. Pack and install into a throwaway profile (or your web profile)
pnpm pack
dsh plugin --profile web add ./junma11-dsh-scholar-lab-0.1.0.tgz

# 3. Confirm the layers compose without booting
dsh --profile web --dump-config | grep -A3 scholar-lab

# 4. Boot and test
dsh web

Publish to npm

# fill in package.json: name (real scope), repository, homepage, license holder
npm login
npm publish        # scoped packages publish private by default — `publishConfig.access: "public"` is already set

Version semver; tag releases; attach the packed tarball to GitHub releases for air-gapped installs (dsh plugin --profile web add <tarball-url>).

Notes

The packaged API was mapped from the in-box bundles (@deepseek-ai/dsh-base, @deepseek-ai/dsh-web-app, @deepseek-ai/dsh-tool-web, @deepseek-ai/dsh-client-ui-cordis). Two points should be confirmed against the running app before publishing a public release:

  1. Browser → host bridge. The client bundle talks to the host over the plain same-origin HTTP routes the host half registers (/scholar-lab/search and /scholar-lab/export, same-origin enforced on POST) — the same pattern dshmarket uses. ctx.remote.* typert namespaces are first-party only and must not be used by community client bundles. If you rename the routes, change lib/host.js and the callHost calls in lib/client.js together.
  2. Slot keys. The client injects into tool.view.cordis (panel) and tool.call.toolview (result cards, keyed by tool name). If the packaged slot names differ from the dynamic runner's, adjust the slots.inject(...) calls in lib/client.js.

If a seam turns out different, fix the one file and bump a patch version — nothing else in the package changes.

Data & legal notes

  • The journal database is from hitfyd/ShowJCR v2026-1.2.
  • Scholar's ToS / rate limits: results and abstracts are cached in memory (search 10 min, abstract 30 min); a CAPTCHA/"unusual traffic" response is returned as a clear error. Document this behavior for your users.

License

MIT — covers your code in lib/ and this repo's files. The bundled JCR data is third-party (see above).

Zero-install alternative: dynamic Cordis plugin

No npm and no local files needed — the dynamic form is versioned in this repository (dynamic/plugin.host.js / dynamic/plugin.client.js, kept in sync with the packaged lib/). Create it in any session by pasting this into chat:

Create a Cordis plugin with kind: "new", idPrefix: "schlr", name "Google Scholar Lab", purpose "Search Google Scholar for papers with full journal names, JCR impact factors, and CSV export of paper metadata". Use curl to fetch the content of https://raw.githubusercontent.com/medfm-flare/dsh-scholar-lab/main/dynamic/plugin.host.js and use it as code.host; do the same with https://raw.githubusercontent.com/medfm-flare/dsh-scholar-lab/main/dynamic/plugin.client.js for code.client. If the network is unavailable, read both files from the installed package's dynamic/ folder instead.

Optional — JCR impact factors (the plugin degrades gracefully without them): fetch https://raw.githubusercontent.com/medfm-flare/dsh-scholar-lab/main/data/journal-impact-factors.json into the working directory as journal-impact-factors.json.

Dynamic plugins are per-session and in-memory — they disappear when the process restarts.