{"repo":"dvanoni/notero","free":true,"listed":false,"github":"https://github.com/dvanoni/notero","clone":"git clone https://github.com/dvanoni/notero.git","description":"A Zotero plugin for syncing items and notes into Notion","language":"TypeScript","stars":3198,"topics":["notion","notion-database","typescript","zotero","zotero-plugin","zotero-sync"],"license":"MIT","category":"dev_tool","readme_excerpt":"# Notero\n\n[![Latest release](https://img.shields.io/github/v/release/dvanoni/notero)](https://github.com/dvanoni/notero/releases/latest)\n[![Total downloads](https://img.shields.io/github/downloads/dvanoni/notero/latest/total?sort=semver)][download]\n[![Works with Zotero](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fraw.githubusercontent.com%2Fdvanoni%2Fnotero%2Fmain%2Fpackage.json&query=%24.xpi.zoteroMinVersion&prefix=v&suffix=%2B&logo=zotero&label=Works%20with%20Zotero&color=%23CC2936)](https://www.zotero.org/)\n[![Buy me a coffee](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fapp.buymeacoffee.com%2Fapi%2Fcreators%2Fslug%2Fdvanoni&query=%24.data.public_supporters_count&prefix=%F0%9F%92%9C%20&style=social&logo=buymeacoffee&label=Buy%20me%20a%20coffee)](https://www.buymeacoffee.com/dvanoni)\n\nNotero is a [Zotero plugin](https://www.zotero.org/support/plugins) for syncing\nitems and notes into [Notion](https://www.notion.so/product). To use it:\n\n1. 💾 [Install][] the Notero plugin into Zotero.\n2. 📔 [Connect][] and configure your Notion database.\n3. 📁 Choose your Zotero collections to monitor.\n4. 📝 Add or update items in your collections.\n5. 🔄 Watch your items sync into Notion!\n\n[Install]: #install-and-configure-notero-plugin\n[Connect]: #connect-to-notion\n\n![Notero in action](docs/notero.gif)\n\nConcept by [@arhoff](https://github.com/arhoff) 👩🏻‍🔬 |\nBuilt with 💜 by [@dvanoni](https://github.com/dvanoni)\n\n## Table of Contents\n\n- [Why Use Notero?](#why-use-notero)\n- [How Notero Works](#how-notero-works)\n- [Installation and Setup](#installation-and-setup)\n- [Usage Guides](#usage-guides)\n- [Frequently Asked Questions](#frequently-asked-questions)\n- [Example Notion Databases](#example-notion-databases)\n- [Development](#development)\n\n## Why Use Notero?\n\n- Integrate your reference manager, task list, reading notes, analytical tables,\n  and drafts in one location.\n- Easily link to references when writing in Notion.\n- Create custom views to filter and sort large reference lists by project,\n  tag, author, etc.\n- Backlinks make it easy to locate any of the notes and drafts that mention\n  a reference.\n- Link references to entries in other databases, such as projects, tasks,\n  manuscripts in your publication pipeline, publishing outlets, etc.\n\n## How Notero Works\n\nThe Notero plugin watches for Zotero items being added to or modified within\nany collections that you specify in the Notero preferences. Whenever an item\nis added or modified, Notero does a few things:\n\n- Save a page with the Zotero item's properties (title, authors, etc.) into the\n  Notion database specified in Notero preferences.\n- Add a `notion` tag to the Zotero item.\n- Add an attachment to the Zotero item that links to the page in Notion.\n\nIn addition to providing a convenient way to open a Notion page from Zotero,\nthe link attachment also serves as a reference for Notero so that it can update\nthe corresponding Notion page for a given Zotero item.\n\n### Syncing Items\n\nBy default, Notero will sync items in your monitored collections whenever they\nare modified. You can disable this functionality by unchecking the **Sync when\nitems are modified** option in the Notero preferences.\n\nYou can also sync items from the collection or item context menus (right-click):\n\n- To sync all items in a collection, open the context menu for the collection\n  and select **Sync Items to Notion**.\n- To sync one item or multiple items, select the item(s) in the main pane, open\n  the context menu, and select **Sync to Notion**.\n\n> [!NOTE]\n> To prevent the \"sync on modify\" functionality from saving to Notion multiple\n> times, Notero does not notify Zotero when the tag and link attachment are\n> added to an item. This means they may not appear in Zotero immediately, and\n> you may need to navigate to a different item and back to make them appear.\n\n### Syncing Notes and PDF Annotations\n\nZotero notes associated with an item can be synced into Notion as content of the\ncorresponding page for that item. As with regular items, you can manually sync\nnotes using the **Sync to Notion** option in the context menu.\n\nAutomatic syncing of notes can be enabled via the **Sync notes** option in the\nNotero preferences. When enabled, notes will automatically sync whenever they\nare modified. Additionally, when a regular item is synced, all of its notes will\nalso sync if they have not already.\n\nTo sync annotations (notes and highlights) from a PDF, you'll first need to\nextract them into a Zotero note:\n\n1. Select an item or PDF, open the context menu, and select\n   **Add Note from Annotations**.\n2. If desired, enable highlight colors from the menu at the top-right of the\n   note panel.\n\n<details>\n  <summary>Example of creating a note from PDF annotations</summary>\n  <video src=\"https://github.com/dvanoni/notero/assets/299357/4cda5dc7-ba5b-4f5a-8f53-d6bc2c44b1dc\" />\n</details>\n\n## Installation and Setup\n\nUsing Notero involves installing the plugin in Zotero and connecting it to a\nNotion database. Detailed setup instructions are below.\n\n### Install and Configure Notero Plugin\n\n> [!IMPORTANT]\n>\n> - The latest release of Notero requires Zotero 7.0 or above.\n> - Support for Zotero 6.0.27 and above is available in Notero [v0.5.17][].\n> - See the [changelog](CHANGELOG.md) for all release notes.\n\n1. [Download][] the latest release of the `.xpi` file.\n   - Alternatively, download the `.xpi` file from the **Assets** section of the\n     [latest release][] page.\n   - Firefox users: Right-click the download link and choose **Save Link As...**\n     to download the file.\n2. Open the Zotero Plugins Manager via the **Tools → Plugins** menu item.\n3. Install the `.xpi` file by either:\n   - dragging and dropping it into the Plugins Manager window _or_\n   - selecting it using the **Install Plugin From File...** option in the\n     gear menu in the top-right corner of the window\n4. Open the Notero preferences from either the **Tools → Notero Preferences...**\n   menu item or the sidebar in the main Zotero preferences window.\n5. Configure the Notero preferences as desired.\n\n[download]: https://notero.vanoni.dev/download\n[latest release]: https://github.com/dvanoni/notero/releases/latest\n[v0.5.17]: https://github.com/dvanoni/notero/releases/tag/v0.5.17\n\n### Connect to Notion\n\n> [!NOTE]\n>\n> Before version 1.0.0, Notero required you to create your own Notion internal\n> integration and manually set the integration secret in the Notero preferences.\n> This is no longer necessary as Notero now uses a public integration with an\n> authentication flow provided by Notion.\n>\n> If you previously set up Notero with an internal integration, you can click\n> the **Upgrade Connection** button in the Notero preferences to switch to the\n> public integration as described below. Once complete, you can delete your\n> internal integration from the [Notion integrations][] page.\n\n1. Start the Notion connection process by clicking the **Connect to Notion**\n   button in the Notero preferences. This will open the Notion connection page\n   in your default web browser.\n2. On the Notion connection page, select your desired workspace from the menu\n   at the top (if you have multiple). Then, click **Next**.\n3. On the next page, choose whether you want to use a template database or\n   connect to an existing database page.\n   - If you choose to use a template, the [basic example](#basic-example)\n     database will be duplicated into your workspace.\n   - If you choose to select an existing database, you can search for and select\n     your preferred database on the next page. You can also select no database\n     and connect one later in Notion.\n4. Click **Allow access** to give Notero access to your Notion workspace and\n   database. You will then be redirected to a page that prompts you to open\n   Zotero.\n5. Click **Open Zotero** to complete the connection process in Zotero. The\n   Notero preferences should show that you are connected to your Notion\n   workspace.\n   - If Zotero does not open or successfully connect to Notion, copy the\n     connection token from the Notion connection page and paste it into the\n     **Connection Token** field in Notero preferences.\n\n<details>\n  <summary>Example of connecting to Notion</summary>\n  <video src=\"https://github.com/user-attachments/assets/6c759c9d-f032-4060-bfd0-8da285ce0c2a\" />\n</details>\n\n[Notion integrations]: https://www.notion.so/profile/integrations\n\n### Configure Notion Database\n\nIf you choose not to use the template database during the Notion connection\nprocess, you will need to create your own database. See\n[examples](#example-notion-databases) below that you can duplicate into\nyour workspace, or create one from scratch with properties described in the\n[database properties](#notion-database-properties) section below.\n\nTo give Notero access to your database, follow these steps:\n\n1. Go to the database page in your workspace.\n2. Click on the **•••** More menu in the top-right corner of the page.\n3. Scroll down to and click **Connections**.\n4. Search for and select **Notero** in the **Search for connections...** menu.\n\n<details>\n  <summary>Example of connecting database to Notero</summary>\n  <video src=\"https://github.com/user-attachments/assets/c4c25fbe-4d66-4985-a23f-1972762906a7\" />\n</details>\n\n#### Notion Database Properties\n\nNotero can sync data for the properties listed below. The only property required\nby Notero is one with the **Title** property type. The other properties are\noptional, so you can use only the ones that suit your needs.\n\nThe **Title** property can be named something other than `Name` as long as it\ndoes not conflict with any of the other property names. The name and type of\nthe other properties must be configured exactly as specified here. Note that\nproperty names are case-sensitive, so the capitalization must match exactly.\n\nSupport for customizing properties is planned for the future;\nsee issue [#355](https://github.com/dvanoni/notero/issues/355).\n\n| Property Name       | Property","default_branch":"main","files":156,"tree":[".commitlintrc.json",".github/ISSUE_TEMPLATE/feature_request.md",".github/ISSUE_TEMPLATE/something_not_working.md",".github/dependabot.yml",".github/workflows/build.yml",".github/workflows/codeql-analysis.yml",".github/workflows/crowdin.yml",".github/workflows/release-commenter.yml",".github/workflows/release.yml",".github/workflows/update-manifest.yml",".gitignore",".node-version",".release-please-manifest.json",".vite-hooks/commit-msg",".vite-hooks/pre-commit",".vite-hooks/pre-push",".zed/settings.json",".zed/tasks.json","CHANGELOG.md","LICENSE","PRIVACY.md","README.md","crowdin.yml","docs/notero.gif","package.json","pnpm-lock.yaml","pnpm-workspace.yaml","release-please-config.json","scripts/build.mts","scripts/create-xpi.mts","scripts/generate-fluent-types.mts","scripts/generate-update-manifest.mts","scripts/start.mts","scripts/utils/copy-assets.mts","scripts/utils/generate-install-manifest.mts","scripts/utils/paths.mts","scripts/utils/version.mts","src/bootstrap.ts","src/content/auth/crypto.ts","src/content/auth/index.ts","src/content/auth/notion-auth-manager.ts","src/content/auth/storage.ts","src/content/constants.ts","src/content/data/__tests__/item-data.spec.ts","src/content/data/item-data.ts","src/content/errors/ItemSyncError.ts","src/content/errors/LocalizableError.ts","src/content/errors/MissingPrefError.ts","src/content/errors/index.ts","src/content/notero.ts","src/content/plugin-info.ts","src/content/prefs/collection-sync-config.ts","src/content/prefs/notero-pref.ts","src/content/prefs/preferences.tsx","src/content/prefs/preferences.xhtml","src/content/prefs/sync-configs-table.tsx","src/content/services/__tests__/protocol-handler-extension.spec.ts","src/content/services/__tests__/sync-manager.spec.ts","src/content/services/event-manager.ts","src/content/services/index.ts","src/content/services/preference-pane-manager.ts","src/content/services/protocol-handler-extension.ts","src/content/services/service.ts","src/content/services/sync-manager.ts","src/content/services/ui-manager.ts","src/content/style/notero-48.png","src/content/style/notero-96.png","src/content/style/preferences.css","src/content/sync/__tests__/property-builder.spec.ts","src/content/sync/__tests__/sync-note-item.spec.ts","src/content/sync/__tests__/sync-regular-item.spec.ts","src/content/sync/find-duplicates.ts","src/content/sync/html-to-notion/__tests__/annotations.spec.ts","src/content/sync/html-to-notion/__tests__/fixtures/annotations.html","src/content/sync/html-to-notion/__tests__/fixtures/annotations.ts","src/content/sync/html-to-notion/__tests__/fixtures/blockquote.html","src/content/sync/html-to-notion/__tests__/fixtures/blockquote.ts","src/content/sync/html-to-notion/__tests__/fixtures/formatting.html","src/content/sync/html-to-notion/__tests__/fixtures/formatting.ts","src/content/sync/html-to-notion/__tests__/fixtures/index.ts","src/content/sync/html-to-notion/__tests__/fixtures/links.html","src/content/sync/html-to-notion/__tests__/fixtures/links.ts","src/content/sync/html-to-notion/__tests__/fixtures/nestedStyles.html","src/content/sync/html-to-notion/__tests__/fixtures/nestedStyles.ts","src/content/sync/html-to-notion/__tests__/fixtures/simple.html","src/content/sync/html-to-notion/__tests__/fixtures/simple.ts","src/content/sync/html-to-notion/__tests__/fixtures/textOnly.html","src/content/sync/html-to-notion/__tests__/fixtures/textOnly.ts","src/content/sync/html-to-notion/__tests__/fixtures/withoutContainer.html","src/content/sync/html-to-notion/__tests__/fixtures/withoutContainer.ts","src/content/sync/html-to-notion/__tests__/html-to-notion.spec.ts","src/content/sync/html-to-notion/annotations.ts","src/content/sync/html-to-notion/content-result.ts","src/content/sync/html-to-notion/dom-utils.ts","src/content/sync/html-to-notion/html-to-notion.ts","src/content/sync/html-to-notion/index.ts","src/content/sync/html-to-notion/parse-node.ts","src/content/sync/notion-client.ts","src/content/sync/notion-limits.ts","src/content/sync/notion-types.ts","src/content/sync/notion-utils/__tests__/error.spec.ts","src/content/sync/notion-utils/__tests__/url.spec.ts","src/content/sync/notion-utils/build-date.ts","src/content/sync/notion-utils/build-rich-text.ts","src/content/sync/notion-utils/error.ts","src/content/sync/notion-utils/index.ts","src/content/sync/notion-utils/normalize-id.ts","src/content/sync/notion-utils/url.ts","src/content/sync/progress-window.ts","src/content/sync/property-builder.ts","src/content/sync/sync-job.ts","src/content/sync/sync-note-item.ts","src/content/sync/sync-regular-item.ts","src/content/utils/__tests__/build-collection-full-name.spec.ts","src/content/utils/__tests__/chunk-string.spec.ts","src/content/utils/__tests__/get-item-url.spec.ts","src/content/utils/__tests__/is-object.spec.ts","src/content/utils/__tests__/truncate-middle.spec.ts","src/content/utils/base64.ts","src/content/utils/build-collection-full-name.ts","src/content/utils/chunk-string.ts","src/content/utils/elements.ts","src/content/utils/get-all-collection-items.ts","src/content/utils/get-global-notero.ts","src/content/utils/get-item-url.ts","src/content/utils/get-localized-error-message.ts","src/content/utils/get-main-window.ts","src/content/utils/index.ts","src/content/utils/is-object.ts","src/content/utils/key-value.ts","src/content/utils/logger.ts","src/content/utils/parse-item-date.ts","src/content/utils/truncate-middle.ts","src/locale/.zed/settings.json","src/locale/en-US/notero.ftl","src/locale/fluent-types.ts","src/locale/zh-CN/notero.ftl","src/prefs.js","test/setup-tests.ts","test/utils/index.ts","test/utils/window-mock.ts","test/utils/zotero-mock.ts","tsconfig.json","types/components/index.d.ts","types/components/virtualized-table.d.ts","types/global.d.ts","types/jsm.d.ts","types/l10n.d.ts","types/reset.d.ts","types/utils.d.ts","types/web-ext.d.ts","types/xpcom.d.ts","types/xul.d.ts","types/zotero.d.ts","vite.config.ts","zotero.config.example.json"],"storefront":"/r/dvanoni","claimed":false,"request_supported":{"post":"https://gitbuyer.com/r/dvanoni/notero/request-supported","requests":0},"note":"indexed from public GitHub; nothing is for sale on this page. Clone it from GitHub. Paid listings live at /search."}