Repository files navigation

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

constzotero=newZotero({apiKey: 'your-api-key',groupId: 12345});

Fetch Items

// Get all itemsconstitems=awaitzotero.getItems();// Get items with filtersconstitems=awaitzotero.getItems({limit: 50,start: 0,collection: 'collection-key',tag: 'important'});// Get single itemconstitem=awaitzotero.getItem('ABC123');

Create Items

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

Update Items

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

Merge Items

import{merge_items,MergeStrategy}from'zotero-lib/build/utils/merge';constresult=awaitmerge_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

VariableDescription
ZOTERO_API_KEYYour Zotero API key
ZOTERO_GROUP_IDDefault 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

newZotero(config: ZoteroConfig)

Methods

MethodDescription
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

enumMergeStrategy{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.

About

No description, website, or topics provided.

Resources

Stars

14 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

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

constzotero=newZotero({apiKey: 'your-api-key',groupId: 12345});

Fetch Items

// Get all itemsconstitems=awaitzotero.getItems();// Get items with filtersconstitems=awaitzotero.getItems({limit: 50,start: 0,collection: 'collection-key',tag: 'important'});// Get single itemconstitem=awaitzotero.getItem('ABC123');

Create Items

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

Update Items

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

Merge Items

import{merge_items,MergeStrategy}from'zotero-lib/build/utils/merge';constresult=awaitmerge_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

VariableDescription
ZOTERO_API_KEYYour Zotero API key
ZOTERO_GROUP_IDDefault 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

newZotero(config: ZoteroConfig)

Methods

MethodDescription
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

enumMergeStrategy{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.

About

No description, website, or topics provided.

Resources

Stars

14 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

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

constzotero=newZotero({apiKey: 'your-api-key',groupId: 12345});

Fetch Items

// Get all itemsconstitems=awaitzotero.getItems();// Get items with filtersconstitems=awaitzotero.getItems({limit: 50,start: 0,collection: 'collection-key',tag: 'important'});// Get single itemconstitem=awaitzotero.getItem('ABC123');

Create Items

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

Update Items

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

Merge Items

import{merge_items,MergeStrategy}from'zotero-lib/build/utils/merge';constresult=awaitmerge_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

VariableDescription
ZOTERO_API_KEYYour Zotero API key
ZOTERO_GROUP_IDDefault 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

newZotero(config: ZoteroConfig)

Methods

MethodDescription
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

enumMergeStrategy{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.

About

No description, website, or topics provided.

Resources

Stars

14 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

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

constzotero=newZotero({apiKey: 'your-api-key',groupId: 12345});

Fetch Items

// Get all itemsconstitems=awaitzotero.getItems();// Get items with filtersconstitems=awaitzotero.getItems({limit: 50,start: 0,collection: 'collection-key',tag: 'important'});// Get single itemconstitem=awaitzotero.getItem('ABC123');

Create Items

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

Update Items

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

Merge Items

import{merge_items,MergeStrategy}from'zotero-lib/build/utils/merge';constresult=awaitmerge_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

VariableDescription
ZOTERO_API_KEYYour Zotero API key
ZOTERO_GROUP_IDDefault 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

newZotero(config: ZoteroConfig)

Methods

MethodDescription
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

enumMergeStrategy{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.

About

No description, website, or topics provided.

Resources

Stars

14 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

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

constzotero=newZotero({apiKey: 'your-api-key',groupId: 12345});

Fetch Items

// Get all itemsconstitems=awaitzotero.getItems();// Get items with filtersconstitems=awaitzotero.getItems({limit: 50,start: 0,collection: 'collection-key',tag: 'important'});// Get single itemconstitem=awaitzotero.getItem('ABC123');

Create Items

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

Update Items

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

Merge Items

import{merge_items,MergeStrategy}from'zotero-lib/build/utils/merge';constresult=awaitmerge_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

VariableDescription
ZOTERO_API_KEYYour Zotero API key
ZOTERO_GROUP_IDDefault 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

newZotero(config: ZoteroConfig)

Methods

MethodDescription
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

enumMergeStrategy{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.

About

No description, website, or topics provided.

Resources

Stars

14 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

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

constzotero=newZotero({apiKey: 'your-api-key',groupId: 12345});

Fetch Items

// Get all itemsconstitems=awaitzotero.getItems();// Get items with filtersconstitems=awaitzotero.getItems({limit: 50,start: 0,collection: 'collection-key',tag: 'important'});// Get single itemconstitem=awaitzotero.getItem('ABC123');

Create Items

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

Update Items

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

Merge Items

import{merge_items,MergeStrategy}from'zotero-lib/build/utils/merge';constresult=awaitmerge_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

VariableDescription
ZOTERO_API_KEYYour Zotero API key
ZOTERO_GROUP_IDDefault 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

newZotero(config: ZoteroConfig)

Methods

MethodDescription
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

enumMergeStrategy{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.

About

No description, website, or topics provided.

Resources

Stars

14 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

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

constzotero=newZotero({apiKey: 'your-api-key',groupId: 12345});

Fetch Items

// Get all itemsconstitems=awaitzotero.getItems();// Get items with filtersconstitems=awaitzotero.getItems({limit: 50,start: 0,collection: 'collection-key',tag: 'important'});// Get single itemconstitem=awaitzotero.getItem('ABC123');

Create Items

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

Update Items

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

Merge Items

import{merge_items,MergeStrategy}from'zotero-lib/build/utils/merge';constresult=awaitmerge_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

VariableDescription
ZOTERO_API_KEYYour Zotero API key
ZOTERO_GROUP_IDDefault 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

newZotero(config: ZoteroConfig)

Methods

MethodDescription
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

enumMergeStrategy{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.

About

No description, website, or topics provided.

Resources

Stars

14 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

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

constzotero=newZotero({apiKey: 'your-api-key',groupId: 12345});

Fetch Items

// Get all itemsconstitems=awaitzotero.getItems();// Get items with filtersconstitems=awaitzotero.getItems({limit: 50,start: 0,collection: 'collection-key',tag: 'important'});// Get single itemconstitem=awaitzotero.getItem('ABC123');

Create Items

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

Update Items

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

Merge Items

import{merge_items,MergeStrategy}from'zotero-lib/build/utils/merge';constresult=awaitmerge_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

VariableDescription
ZOTERO_API_KEYYour Zotero API key
ZOTERO_GROUP_IDDefault 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

newZotero(config: ZoteroConfig)

Methods

MethodDescription
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

enumMergeStrategy{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.

About

No description, website, or topics provided.

Resources

Stars

14 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages