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

zotero-lib

v1.1.0

Published

A powerful TypeScript library and CLI tool for interacting with the Zotero API. Part of the OpenDevEd zotzen ecosystem for managing academic libraries.

Downloads

557

Readme

zotero-lib

A powerful TypeScript library and CLI tool for interacting with the Zotero API. Part of the OpenDevEd zotzen ecosystem for managing academic libraries.

Table of Contents

Installation

As a CLI Tool (Global)

npm install -g zotero-lib
# or
yarn global add zotero-lib

As a Library (Local)

npm install zotero-lib
# or
yarn add zotero-lib

From Source

git clone https://github.com/OpenDevEd/zotero-lib.git
cd zotero-lib
npm install
npm run build

Quick Start

CLI Basics

# Show help
zotero-lib -h
zotero-lib --help

# Show version
zotero-lib -v

# Get items from a group
zotero-lib items --group-id 12345 --api-key YOUR_API_KEY --filter '{"limit": 10}'

# Create an item
zotero-lib create --group-id 12345 --api-key YOUR_API_KEY --items '{"title": "My Book", "itemType": "book"}'

Environment Variables

Set these for convenience (avoids passing --api-key every time):

export ZOTERO_API_KEY="your-api-key-here"
export ZOTERO_GROUP_ID="12345"

Or create a .env file:

ZOTERO_API_KEY=your-api-key-here
ZOTERO_GROUP_ID=12345

CLI Commands

Item Management

Create Items

# From file containing JSON
zotero-lib create --files items.json

# From command line JSON
zotero-lib create --items '{"title": "Book Title", "itemType": "book"}'

# Multiple items
zotero-lib create --items '{"title": "Book 1"}' '{"title": "Book 2"}'

Update Items

# Update by key
zotero-lib update --key ABC123 --json '{"title": "Updated Title"}'

# Replace entire item
zotero-lib update --replace --key ABC123 --json '{"title": "New Item", "itemType": "book"}'

# From file
zotero-lib update --key ABC123 --file items.json

Get Items

# Single item
zotero-lib item --key ABC123

# Multiple items with filters
zotero-lib items --filter '{"limit": 50, "start": 0}'

# Top-level items only (no attachments/notes)
zotero-lib items --top

# Items in specific collection
zotero-lib items --collection ABC123

Delete Items

# Move to trash
zotero-lib delete --key ABC123

# Permanent delete
zotero-lib delete --key ABC123 --permanent

Collection Management

# List collections
zotero-lib collections --group-id 12345

# Create collection
zotero-lib collection --group-id 12345 --name "My Collection"

# Update collection
zotero-lib update-collection --key ABC123 --name "New Name"

# Delete collection
zotero-lib delete-collection --key ABC123

Tag Management

# List tags
zotero-lib tags --group-id 12345

# Get items by tag
zotero-lib items --tag "important"

Attachments

# Add attachment
zotero-lib attachment --key ABC123 --addfiles file.pdf

# Attach link
zotero-lib attach-link --key ABC123 --url "https://example.com"

# Attach note
zotero-lib attach-note --key ABC123 --note "This is a note"

DOI Operations

# Get DOI for an item
zotero-lib get-doi --key ABC123

# Update DOI
zotero-lib update-doi --key ABC123 --doi "10.1234/example"

Field Operations

# Get field value
zotero-lib field --key ABC123 --field title

# Set field value
zotero-lib field --key ABC123 --field title --value "New Title"

# Get extra field
zotero-lib field --key ABC123 --extra --field customField

Database Sync

Sync your Zotero library locally using SQLite:

# Initial sync
zotero-lib db backup.db --sync --group-id 12345

# Incremental sync (only fetches changes since last sync)
zotero-lib db backup.db --sync

# Export to JSON
zotero-lib db backup.db --export-json=backup.json

# Lookup items locally
zotero-lib db backup.db --lookup --keys ABC123,DEF456

# Scheduled sync (daemon mode)
zotero-lib db backup.db --sync --daemon="0 * * * *"  # Every hour

# Find inconsistent items
zotero-lib db backup.db --errors

Merge & Deduplicate

Intelligent Merge (Recommended)

# Merge duplicates with intelligent strategy
zotero-lib merge --group-id 12345 --data duplicates.json --strategy intelligent_fill

# Available strategies:
#   - intelligent_fill (default): Fill empty fields from duplicates
#   - keep_oldest: Preserve oldest item
#   - keep_newest: Preserve newest item

Deduplicate

# Find duplicates
zotero-lib deduplicate --group-id 12345 --options identical

# With output file
zotero-lib deduplicate --group-id 12345 --output duplicates.json

Other Commands

# Get item types
zotero-lib types --group-id 12345

# List groups
zotero-lib groups

# Search items
zotero-lib searches --group-id 12345

# Get library fields
zotero-lib fields --group-id 12345

# Create bibliography
zotero-lib bibliography --group-id 12345 --style apa

# Get item template
zotero-lib TEMPLATE --item-type book

Library Usage

Import the Library

import { Zotero } from 'zotero-lib';

Initialize

const zotero = new Zotero({
  apiKey: 'your-api-key',
  groupId: 12345
});

Fetch Items

// Get all items
const items = await zotero.getItems();

// Get items with filters
const items = await zotero.getItems({
  limit: 50,
  start: 0,
  collection: 'collection-key',
  tag: 'important'
});

// Get single item
const item = await zotero.getItem('ABC123');

Create Items

const newItem = await zotero.createItem({
  title: 'My Book',
  itemType: 'book',
  creators: [{
    creatorType: 'author',
    firstName: 'John',
    lastName: 'Doe'
  }]
});

Update Items

await zotero.updateItem('ABC123', {
  title: 'Updated Title'
});

Merge Items

import { merge_items, MergeStrategy } from 'zotero-lib/build/utils/merge';

const result = await merge_items(
  groupId,
  itemKeys,
  MergeStrategy.INTELLIGENT_FILL
);

console.log(result);

Configuration

Config File

Create zotero.config.json in your project root:

{
  "apiKey": "your-api-key",
  "groupId": 12345,
  "libraryType": "group"
}

Environment Variables

| Variable | Description | |----------|-------------| | ZOTERO_API_KEY | Your Zotero API key | | ZOTERO_GROUP_ID | Default group ID | | ZOTERO_LIBRARY_TYPE | 'user' or 'group' (default: 'user') |

Development

Setup

npm install
npm run build

Available Scripts

# Development
npm run dev          # Run with ts-node

# Build
npm run build        # Build for production

# Test
npm test             # Run Jest tests
npm run legacy:test  # Run legacy tests

# Lint
npx eslint src/

# Type checking
npx tsc --noEmit

# Generate docs
npm run docs         # Generate TypeScript documentation

# Publish
npm run publish:patch  # Patch release
npm run publish:minor  # Minor release
npm run publish:major  # Major release

Running Tests

# All tests
npm test

# Specific test file
npx jest tests/utils.test.ts

# With coverage
npm test -- --coverage

API Reference

Zotero Class

Constructor

new Zotero(config: ZoteroConfig)

Methods

| Method | Description | |--------|-------------| | getItems(options?) | Fetch items from library | | getItem(key) | Fetch single item | | createItem(item) | Create new item | | updateItem(key, data) | Update item | | deleteItem(key) | Delete item | | getCollections() | List collections | | createCollection(name, parent?) | Create collection | | getTags() | List tags | | getItemTypes() | List item types | | getFields() | List available fields |

Merge Strategies

enum MergeStrategy {
  INTELLIGENT_FILL = 'intelligent_fill',
  KEEP_OLDEST = 'keep_oldest',
  KEEP_NEWEST = 'keep_newest'
}

Related Projects

This library is part of the OpenDevEd zotzen ecosystem:

License

ISC License - see LICENSE file for details.

Credits

Originally built on zotero-cli by @bjohas, @retorquere, and @a1diablo.


For more details, see the full documentation or run zotero-lib --help.