Skip to content
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions extensions/calibre-search/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
node_modules/
.DS_Store
raycast-env.d.ts
CLAUDE.md
13 changes: 13 additions & 0 deletions extensions/calibre-search/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Calibre Library Changelog

## [1.0.0] - 2026-04-20
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Changelog date should use {PR_MERGE_DATE} placeholder

The Raycast convention is to use the {PR_MERGE_DATE} template variable for initial release entries; the merge date is substituted automatically when the PR lands.

Suggested change
## [1.0.0] - 2026-04-20
## [Initial Release] - {PR_MERGE_DATE}

Rule Used: What: In Raycast extension changelogs, `{PR_MERGE_... (source)

Prompt To Fix With AI
This is a comment left during a code review.
Path: extensions/calibre-search/CHANGELOG.md
Line: 3

Comment:
**Changelog date should use `{PR_MERGE_DATE}` placeholder**

The Raycast convention is to use the `{PR_MERGE_DATE}` template variable for initial release entries; the merge date is substituted automatically when the PR lands.

```suggestion
## [Initial Release] - {PR_MERGE_DATE}
```

**Rule Used:** What: In Raycast extension changelogs, `{PR_MERGE_... ([source](https://app.greptile.com/review/custom-context?memory=799af734-ebd9-4b40-9ffd-97a70fc71c8a))

How can I resolve this? If you propose a fix, please make it concise.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!


### Added

- **Search Calibre** command: browse and search your entire Calibre library by title or author
- Book detail panel with cover image, metadata (author, year, publisher, series, formats), and synopsis
- Actions: Open in Calibre, Open File Directly, Show Synopsis, Copy Title & Author, Show in Finder
- **Add to Calibre Library** command: scan configured folders for ebook files and add them to your library
- Cover thumbnails in Add to Library (extracted from EPUB files; Quick Look previews for PDF and others)
- Support for multiple scan directories (up to 3 configurable folders)
- Supported formats: EPUB, MOBI, PDF, AZW, AZW3, KEPUB, LIT, DJVU
56 changes: 56 additions & 0 deletions extensions/calibre-search/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
# Calibre Library

A [Raycast](https://raycast.com) extension for [Calibre](https://calibre-ebook.com) — search your ebook library and add new books, without leaving the keyboard.

## Commands

### Search Calibre

Browse and search your entire Calibre library by title or author. Select a book to see its cover, metadata, and available formats in the detail panel.

**Actions:**
- **Open in Calibre** — opens Calibre and navigates directly to the book
- **Open File Directly** (`⌘O`) — opens the best available format in its default app
- **Show Synopsis** (`⌘S`) — displays the book description
- **Copy Title & Author** (`⌘C`)
- **Show in Finder** (`⌘⇧F`)

### Add to Calibre Library

Scan configured folders for ebook files and add them to your Calibre library with one keystroke. Displays cover thumbnails (extracted from EPUB files; Quick Look previews for PDF and others) alongside format, size, and modification date.

**Actions:**
- **Add to Calibre Library** — adds the book via `calibredb`; if Calibre is already open, hands off to the running instance automatically
- **Show in Finder** (`⌘F`)

## Requirements

- [Calibre](https://calibre-ebook.com/download) installed at `/Applications/calibre.app`
- Raycast 1.50+

## Configuration

Open **Raycast Settings → Extensions → Calibre Library** to configure:

| Preference | Description |
|---|---|
| **Library Path** | Path to your Calibre library folder (the one containing `metadata.db`) |
| **Add books** | Primary folder to scan for ebook files (default: `~/Downloads`) |
| **Add books (optional)** | Additional folders to scan (up to 2 extra) |

## Supported Formats

EPUB · MOBI · PDF · AZW · AZW3 · KEPUB · LIT · DJVU

## Installation

This extension is not yet published to the Raycast Store. To install manually:

```bash
git clone https://github.com/BrunoMiguelMonteiro/calibre-raycast.git
cd calibre-raycast
npm install
npm run dev
```

Then import the extension from Raycast's extension settings.
Binary file added extensions/calibre-search/assets/icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions extensions/calibre-search/eslint.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module.exports = require("@raycast/eslint-config").flat();
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Use defineConfig from eslint/config subpath

The current pattern manually calls .flat() instead of using the canonical ESLint v9 helper. The preferred pattern is:

Suggested change
module.exports = require("@raycast/eslint-config").flat();
const { defineConfig } = require("eslint/config");
const raycastConfig = require("@raycast/eslint-config");
module.exports = defineConfig([...raycastConfig]);

Rule Used: What: Enforce importing defineConfig from `"esli... (source)

Prompt To Fix With AI
This is a comment left during a code review.
Path: extensions/calibre-search/eslint.config.js
Line: 1

Comment:
**Use `defineConfig` from `eslint/config` subpath**

The current pattern manually calls `.flat()` instead of using the canonical ESLint v9 helper. The preferred pattern is:

```suggestion
const { defineConfig } = require("eslint/config");
const raycastConfig = require("@raycast/eslint-config");

module.exports = defineConfig([...raycastConfig]);
```

**Rule Used:** What: Enforce importing `defineConfig` from `"esli... ([source](https://app.greptile.com/review/custom-context?memory=645a7150-4078-490e-a70c-d6aad94e0cf5))

How can I resolve this? If you propose a fix, please make it concise.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

9 changes: 9 additions & 0 deletions extensions/calibre-search/jest.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
module.exports = {
preset: "ts-jest",
testEnvironment: "node",
testMatch: ["**/__tests__/**/*.test.ts"],
moduleNameMapper: {
"^@raycast/api$": "<rootDir>/src/__mocks__/raycast-api.ts",
"^@raycast/utils$": "<rootDir>/src/__mocks__/raycast-utils.ts",
},
};
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading