Skip to content
Open
Show file tree
Hide file tree
Changes from all 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
47 changes: 47 additions & 0 deletions docs/usage/integrations.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,3 +66,50 @@ Originally designed for Slack, this feature allows you to send your current shee
The Webhook integration extends this capability by sending your sheet to an external automation platform (like [n8n](https://n8n.io/), [Make.com](https://www.make.com/), ...) or custom service. This is especially useful if you want to: use your own AI pipeline or don't want AI to be involved at all, or store and process sheets in a custom backend, ...

The webhook gives you full control: you decide what happens with your data.


## OPDS Catalog

OPDS (Open Publication Distribution System) is a standard for publishing ebook catalogs. This read-only integration allows you to browse and download ebooks from any OPDS 1.x compatible server (like Calibre-Web, Booklore, etc.).

Add this to your [`.userprofile`](userprofile.md):

```yaml
integrations:
- provider: opds
id: [generate some uuid]
name: [some name]
feedurl: [opds feed url]
headers: # optional, for authentication
- name: [header name]
value: [header value]
```

For example, with basic authentication via header:

```yaml
integrations:
- provider: opds
id: opds-calibre-12345
name: Home Calibre
feedurl: https://calibre.example.com/opds
headers:
- name: Authorization
value: Basic dXNlcjpwYXNzd29yZA==
```

Or with an API key:

```yaml
integrations:
- provider: opds
id: opds-kavita-67890
name: Kavita Library
feedurl: https://kavita.example.com/api/opds/abc123
headers:
- name: X-API-Key
value: your-api-key-here
```

!!! note
OPDS integration is read-only. You can browse and download files (PDF and EPUB), but uploading is not supported.
5 changes: 5 additions & 0 deletions internal/integrations/integrations.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ const (
DropboxProvider = "dropbox"
GoogleProvider = "google"
LocalfsProvider = "localfs"
OPDSProvider = "opds"
)

type IntegrationProvider interface{}
Expand Down Expand Up @@ -61,6 +62,8 @@ func getIntegrationProvider(storer storage.UserStorer, uid, integrationid string
return newLocalFS(intg), nil
case WebdavProvider:
return newWebDav(intg), nil
case OPDSProvider:
return newOPDS(intg), nil
}
}
return nil, fmt.Errorf("integration not found or no implmentation (only webdav) %s", integrationid)
Expand Down Expand Up @@ -126,6 +129,8 @@ func ProviderType(n string) string {
case DropboxProvider:
fallthrough
case WebdavProvider:
fallthrough
case OPDSProvider:
return "Storage"
default:
return n
Expand Down
Loading