From e49a294b72954c1bb1d139a07a644ece08b716bd Mon Sep 17 00:00:00 2001 From: Anton Date: Sun, 26 Jul 2026 17:07:53 +0200 Subject: [PATCH] Remove URL-only catalog extensions --- README.md | 7 ------- extensions/cate.confluence/README.md | 24 ----------------------- extensions/cate.confluence/manifest.json | 19 ------------------ extensions/cate.discord/README.md | 18 ----------------- extensions/cate.discord/manifest.json | 19 ------------------ extensions/cate.dynamics365/README.md | 24 ----------------------- extensions/cate.dynamics365/manifest.json | 19 ------------------ extensions/cate.hubspot/README.md | 24 ----------------------- extensions/cate.hubspot/manifest.json | 19 ------------------ extensions/cate.jira/README.md | 24 ----------------------- extensions/cate.jira/manifest.json | 19 ------------------ extensions/cate.pipedrive/README.md | 24 ----------------------- extensions/cate.pipedrive/manifest.json | 19 ------------------ extensions/cate.salesforce/README.md | 24 ----------------------- extensions/cate.salesforce/manifest.json | 19 ------------------ extensions/cate.slack/README.md | 24 ----------------------- extensions/cate.slack/manifest.json | 19 ------------------ extensions/cate.zohocrm/README.md | 24 ----------------------- extensions/cate.zohocrm/manifest.json | 19 ------------------ 19 files changed, 388 deletions(-) delete mode 100644 extensions/cate.confluence/README.md delete mode 100644 extensions/cate.confluence/manifest.json delete mode 100644 extensions/cate.discord/README.md delete mode 100644 extensions/cate.discord/manifest.json delete mode 100644 extensions/cate.dynamics365/README.md delete mode 100644 extensions/cate.dynamics365/manifest.json delete mode 100644 extensions/cate.hubspot/README.md delete mode 100644 extensions/cate.hubspot/manifest.json delete mode 100644 extensions/cate.jira/README.md delete mode 100644 extensions/cate.jira/manifest.json delete mode 100644 extensions/cate.pipedrive/README.md delete mode 100644 extensions/cate.pipedrive/manifest.json delete mode 100644 extensions/cate.salesforce/README.md delete mode 100644 extensions/cate.salesforce/manifest.json delete mode 100644 extensions/cate.slack/README.md delete mode 100644 extensions/cate.slack/manifest.json delete mode 100644 extensions/cate.zohocrm/README.md delete mode 100644 extensions/cate.zohocrm/manifest.json diff --git a/README.md b/README.md index d420f52..ef57cde 100644 --- a/README.md +++ b/README.md @@ -9,16 +9,9 @@ under `extensions/`, published to the catalog Cate ships by default. manager), `cate.usage` (agent usage and cost) - **Data** — `cate.sqlite` (read-only SQLite browser) - **Design** — `cate.excalidraw` (whiteboard), `cate.mermaid` (diagram editor) -- **Productivity** — `cate.confluence`, `cate.jira` -- **Communication** — `cate.discord`, `cate.slack` -- **Sales & CRM** — `cate.dynamics365`, `cate.hubspot`, `cate.pipedrive`, - `cate.salesforce`, `cate.zohocrm` - **Development** — `cate.frontendkit`, `cate.kitchensink` (reference apps, `"dev": true`, sideload only) -The CRM, chat and docs ones are url-mode: the manifest is a single `url`, so -there is no build, no server and no `cate.*` bridge. - ## Layout - `extensions//` — one extension diff --git a/extensions/cate.confluence/README.md b/extensions/cate.confluence/README.md deleted file mode 100644 index ed833e3..0000000 --- a/extensions/cate.confluence/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# cate.confluence - -Confluence as a canvas panel — your team's docs, pinned next to your code. - -## What it does - -- Points a panel straight at `https://home.atlassian.com/` using the manifest's `url` mode: no assets to build, no server process, no proxy. -- Runs in the extension's own persistent session partition (`persist:ext-cate.confluence`), so signing in once sticks across restarts and your Atlassian cookies are isolated from browser panels and from every other extension. -- Works where an iframe embed would not: the panel is a top-level browsing context, so Atlassian's `X-Frame-Options` / `frame-ancestors` headers don't block it. - -## Your tenant - -Confluence is tenant-hosted — your wiki lives at `https://.atlassian.net/wiki`, which a shipped manifest can't know. So the panel opens **Atlassian Home**, the tenant-agnostic launcher: sign in once and it lists the sites and apps you have access to, and you click through to your own Confluence. - -To pin your own tenant directly, sideload a copy of this extension with `url` edited to e.g. `https://your-site.atlassian.net/wiki/home`. - -## Scopes - -None. A `url` extension gets no `cateHost` bridge and no `cate.*` API — a remote origin can't prove an extension identity, so Cate attaches no preload to it (see `docs/extensions.md` → Security Hygiene). Atlassian is a third party; it should not be able to reach into the workspace. - -## Notes - -- Sign-in via "Continue with Google/Microsoft/Apple" is pushed to the system browser by Cate's OAuth handling; use email/password inside the panel. -- There is nothing to build. `build.sh` ships the directory as-is (manifest + this README). diff --git a/extensions/cate.confluence/manifest.json b/extensions/cate.confluence/manifest.json deleted file mode 100644 index 7da306d..0000000 --- a/extensions/cate.confluence/manifest.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "id": "cate.confluence", - "name": "Confluence", - "version": "1.0.0", - "category": "productivity", - "description": "Confluence as a canvas panel. Points a panel at Atlassian Home in the extension's own persistent session, so you stay signed in across restarts and can keep your team's docs next to your code.", - "url": "https://home.atlassian.com/", - "panels": [ - { - "id": "app", - "label": "Confluence", - "icon": "", - "defaultSize": { - "width": 1040, - "height": 800 - } - } - ] -} diff --git a/extensions/cate.discord/README.md b/extensions/cate.discord/README.md deleted file mode 100644 index 74b46c1..0000000 --- a/extensions/cate.discord/README.md +++ /dev/null @@ -1,18 +0,0 @@ -# cate.discord - -Discord as a canvas panel — the Discord web app, pinned next to your code. - -## What it does - -- Points a panel straight at `https://discord.com/app` using the manifest's `url` mode: no assets to build, no server process, no proxy. -- Runs in the extension's own persistent session partition (`persist:ext-cate.discord`), so signing in once sticks across restarts and your Discord cookies are isolated from browser panels and from every other extension. -- Works where an iframe embed would not: the panel is a top-level browsing context, so Discord's `X-Frame-Options` / `frame-ancestors` headers don't block it. - -## Scopes - -None. A `url` extension gets no `cateHost` bridge and no `cate.*` API — a remote origin can't prove an extension identity, so Cate attaches no preload to it (see `docs/extensions.md` → Security Hygiene). Discord itself is a third party; it should not be able to reach into the workspace. - -## Notes - -- Sign-in via "Continue with Google/Apple" is pushed to the system browser by Cate's OAuth handling; use email/password or QR sign-in inside the panel. -- There is nothing to build. `build.sh` ships the directory as-is (manifest + this README). diff --git a/extensions/cate.discord/manifest.json b/extensions/cate.discord/manifest.json deleted file mode 100644 index 70d8043..0000000 --- a/extensions/cate.discord/manifest.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "id": "cate.discord", - "name": "Discord", - "version": "1.0.0", - "category": "communication", - "description": "Discord as a canvas panel. Points a panel at the Discord web app in the extension's own persistent session, so you stay signed in across restarts and can keep a chat next to your code.", - "url": "https://discord.com/app", - "panels": [ - { - "id": "app", - "label": "Discord", - "icon": "", - "defaultSize": { - "width": 980, - "height": 720 - } - } - ] -} diff --git a/extensions/cate.dynamics365/README.md b/extensions/cate.dynamics365/README.md deleted file mode 100644 index bba1d20..0000000 --- a/extensions/cate.dynamics365/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# cate.dynamics365 - -Microsoft Dynamics 365 as a canvas panel — your CRM, pinned next to your code. - -## What it does - -- Points a panel straight at `https://www.office.com/apps` using the manifest's `url` mode: no assets to build, no server process, no proxy. -- Runs in the extension's own persistent session partition (`persist:ext-cate.dynamics365`), so signing in once sticks across restarts and your Microsoft cookies are isolated from browser panels and from every other extension. -- Works where an iframe embed would not: the panel is a top-level browsing context, so Microsoft's `X-Frame-Options` / `frame-ancestors` headers don't block it. - -## Your environment - -Dynamics 365 is environment-hosted — your apps live at `https://.crm.dynamics.com` (or `.crm4`, `.crm11`, … for your region), which a shipped manifest can't know. Microsoft **retired `home.dynamics.com` in 2021**; the documented replacement is the Microsoft 365 app launcher, which lists the Dynamics 365 apps you're licensed for and clicks through to your own environment. - -To pin your environment directly, sideload a copy with `url` edited to e.g. `https://your-org.crm.dynamics.com/main.aspx?appid=`. - -## Scopes - -None. A `url` extension gets no `cateHost` bridge and no `cate.*` API — a remote origin can't prove an extension identity, so Cate attaches no preload to it (see `docs/extensions.md` → Security Hygiene). Microsoft is a third party; it should not be able to reach into the workspace. - -## Notes - -- Microsoft sign-in runs on `login.microsoftonline.com`, which Cate treats as an OAuth host and pushes to the system browser. Expect to complete first-time sign-in there; if the panel does not pick the session up, sideload a copy pinned at your own `*.crm.dynamics.com` URL. -- There is nothing to build. `build.sh` ships the directory as-is (manifest + this README). diff --git a/extensions/cate.dynamics365/manifest.json b/extensions/cate.dynamics365/manifest.json deleted file mode 100644 index b2280ba..0000000 --- a/extensions/cate.dynamics365/manifest.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "id": "cate.dynamics365", - "name": "Microsoft Dynamics 365", - "version": "1.0.0", - "category": "sales", - "description": "Dynamics 365 as a canvas panel. Points a panel at the Microsoft 365 app launcher in the extension's own persistent session, so you stay signed in across restarts and can keep your CRM next to your code.", - "url": "https://www.office.com/apps", - "panels": [ - { - "id": "app", - "label": "Dynamics 365", - "icon": "", - "defaultSize": { - "width": 1100, - "height": 760 - } - } - ] -} diff --git a/extensions/cate.hubspot/README.md b/extensions/cate.hubspot/README.md deleted file mode 100644 index 429663c..0000000 --- a/extensions/cate.hubspot/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# cate.hubspot - -HubSpot as a canvas panel — your pipeline, pinned next to your code. - -## What it does - -- Points a panel straight at `https://app.hubspot.com/` using the manifest's `url` mode: no assets to build, no server process, no proxy. -- Runs in the extension's own persistent session partition (`persist:ext-cate.hubspot`), so signing in once sticks across restarts and your HubSpot cookies are isolated from browser panels and from every other extension. -- Works where an iframe embed would not: the panel is a top-level browsing context, so HubSpot's `X-Frame-Options` / `frame-ancestors` headers don't block it. - -## Your portal - -HubSpot is portal-scoped, but `app.hubspot.com` is portal-agnostic: it redirects to sign-in when you're signed out and to `app.hubspot.com///...` for your own portal once you're in. Nothing to edit for the common case. - -To land somewhere specific, sideload a copy with `url` edited to e.g. `https://app.hubspot.com/contacts/1234567/objects/0-3/views/all/board` (your portal id). - -## Scopes - -None. A `url` extension gets no `cateHost` bridge and no `cate.*` API — a remote origin can't prove an extension identity, so Cate attaches no preload to it (see `docs/extensions.md` → Security Hygiene). HubSpot is a third party; it should not be able to reach into the workspace. - -## Notes - -- Sign-in via "Continue with Google/Microsoft/Apple" is pushed to the system browser by Cate's OAuth handling; use email/password inside the panel. -- There is nothing to build. `build.sh` ships the directory as-is (manifest + this README). diff --git a/extensions/cate.hubspot/manifest.json b/extensions/cate.hubspot/manifest.json deleted file mode 100644 index c272101..0000000 --- a/extensions/cate.hubspot/manifest.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "id": "cate.hubspot", - "name": "HubSpot", - "version": "1.0.0", - "category": "sales", - "description": "HubSpot as a canvas panel. Points a panel at the HubSpot web app in the extension's own persistent session, so you stay signed in across restarts and can keep your pipeline next to your code.", - "url": "https://app.hubspot.com/", - "panels": [ - { - "id": "app", - "label": "HubSpot", - "icon": "", - "defaultSize": { - "width": 1100, - "height": 760 - } - } - ] -} diff --git a/extensions/cate.jira/README.md b/extensions/cate.jira/README.md deleted file mode 100644 index 899003b..0000000 --- a/extensions/cate.jira/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# cate.jira - -Jira as a canvas panel — your board, pinned next to your code. - -## What it does - -- Points a panel straight at `https://home.atlassian.com/` using the manifest's `url` mode: no assets to build, no server process, no proxy. -- Runs in the extension's own persistent session partition (`persist:ext-cate.jira`), so signing in once sticks across restarts and your Atlassian cookies are isolated from browser panels and from every other extension. -- Works where an iframe embed would not: the panel is a top-level browsing context, so Atlassian's `X-Frame-Options` / `frame-ancestors` headers don't block it. - -## Your tenant - -Jira is tenant-hosted — your board lives at `https://.atlassian.net`, which a shipped manifest can't know. So the panel opens **Atlassian Home**, the tenant-agnostic launcher: sign in once and it lists the sites and apps you have access to, and you click through to your own Jira. (Atlassian consolidated its per-product landing pages into this hub; the older `start.atlassian.com` / `team.atlassian.com` URLs redirect here.) - -To pin your own tenant directly, sideload a copy of this extension with `url` edited to e.g. `https://your-site.atlassian.net/jira/software/projects/ABC/boards/1`. - -## Scopes - -None. A `url` extension gets no `cateHost` bridge and no `cate.*` API — a remote origin can't prove an extension identity, so Cate attaches no preload to it (see `docs/extensions.md` → Security Hygiene). Atlassian is a third party; it should not be able to reach into the workspace. - -## Notes - -- Sign-in via "Continue with Google/Microsoft/Apple" is pushed to the system browser by Cate's OAuth handling; use email/password inside the panel. -- There is nothing to build. `build.sh` ships the directory as-is (manifest + this README). diff --git a/extensions/cate.jira/manifest.json b/extensions/cate.jira/manifest.json deleted file mode 100644 index 4c71acd..0000000 --- a/extensions/cate.jira/manifest.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "id": "cate.jira", - "name": "Jira", - "version": "1.0.0", - "category": "productivity", - "description": "Jira as a canvas panel. Points a panel at Atlassian Home in the extension's own persistent session, so you stay signed in across restarts and can keep your board next to your code.", - "url": "https://home.atlassian.com/", - "panels": [ - { - "id": "app", - "label": "Jira", - "icon": "", - "defaultSize": { - "width": 1100, - "height": 760 - } - } - ] -} diff --git a/extensions/cate.pipedrive/README.md b/extensions/cate.pipedrive/README.md deleted file mode 100644 index 3321b06..0000000 --- a/extensions/cate.pipedrive/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# cate.pipedrive - -Pipedrive as a canvas panel — your deal pipeline, pinned next to your code. - -## What it does - -- Points a panel straight at `https://app.pipedrive.com/` using the manifest's `url` mode: no assets to build, no server process, no proxy. -- Runs in the extension's own persistent session partition (`persist:ext-cate.pipedrive`), so signing in once sticks across restarts and your Pipedrive cookies are isolated from browser panels and from every other extension. -- Works where an iframe embed would not: the panel is a top-level browsing context, so Pipedrive's `X-Frame-Options` / `frame-ancestors` headers don't block it. - -## Your company - -Pipedrive companies have their own `https://.pipedrive.com` domain, but `app.pipedrive.com` is company-agnostic: it shows the login form when you're signed out and redirects to your own company's app once you're in. Nothing to edit for the common case. - -To pin your company directly, sideload a copy with `url` edited to e.g. `https://your-company.pipedrive.com/pipeline`. - -## Scopes - -None. A `url` extension gets no `cateHost` bridge and no `cate.*` API — a remote origin can't prove an extension identity, so Cate attaches no preload to it (see `docs/extensions.md` → Security Hygiene). Pipedrive is a third party; it should not be able to reach into the workspace. - -## Notes - -- Sign-in via "Google" or SSO is pushed to the system browser by Cate's OAuth handling; use email/password inside the panel. -- There is nothing to build. `build.sh` ships the directory as-is (manifest + this README). diff --git a/extensions/cate.pipedrive/manifest.json b/extensions/cate.pipedrive/manifest.json deleted file mode 100644 index e1bfb5c..0000000 --- a/extensions/cate.pipedrive/manifest.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "id": "cate.pipedrive", - "name": "Pipedrive", - "version": "1.0.0", - "category": "sales", - "description": "Pipedrive as a canvas panel. Points a panel at the Pipedrive web app in the extension's own persistent session, so you stay signed in across restarts and can keep your deal pipeline next to your code.", - "url": "https://app.pipedrive.com/", - "panels": [ - { - "id": "app", - "label": "Pipedrive", - "icon": "", - "defaultSize": { - "width": 1100, - "height": 760 - } - } - ] -} diff --git a/extensions/cate.salesforce/README.md b/extensions/cate.salesforce/README.md deleted file mode 100644 index a9013d3..0000000 --- a/extensions/cate.salesforce/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# cate.salesforce - -Salesforce as a canvas panel — your org, pinned next to your code. - -## What it does - -- Points a panel straight at `https://login.salesforce.com/` using the manifest's `url` mode: no assets to build, no server process, no proxy. -- Runs in the extension's own persistent session partition (`persist:ext-cate.salesforce`), so signing in once sticks across restarts and your Salesforce cookies are isolated from browser panels and from every other extension. -- Works where an iframe embed would not: the panel is a top-level browsing context, so Salesforce's `X-Frame-Options` / `frame-ancestors` headers don't block it. - -## Your org - -Salesforce is instance-hosted — your org lives at something like `https://your-org.lightning.force.com`, which a shipped manifest can't know. So the panel opens `login.salesforce.com`, the tenant-agnostic gateway: sign in (or use "Use Custom Domain" if your org enforces My Domain) and Salesforce redirects you to your own instance. - -To pin your org directly, sideload a copy with `url` edited to e.g. `https://your-org.lightning.force.com/lightning/page/home`. - -## Scopes - -None. A `url` extension gets no `cateHost` bridge and no `cate.*` API — a remote origin can't prove an extension identity, so Cate attaches no preload to it (see `docs/extensions.md` → Security Hygiene). Salesforce is a third party; it should not be able to reach into the workspace. - -## Notes - -- SSO that hands off to Google/Microsoft/Apple is pushed to the system browser by Cate's OAuth handling; use username/password (with MFA) inside the panel. -- There is nothing to build. `build.sh` ships the directory as-is (manifest + this README). diff --git a/extensions/cate.salesforce/manifest.json b/extensions/cate.salesforce/manifest.json deleted file mode 100644 index d26150b..0000000 --- a/extensions/cate.salesforce/manifest.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "id": "cate.salesforce", - "name": "Salesforce", - "version": "1.0.0", - "category": "sales", - "description": "Salesforce as a canvas panel. Points a panel at the Salesforce login gateway in the extension's own persistent session, so you stay signed in across restarts and can keep your org next to your code.", - "url": "https://login.salesforce.com/", - "panels": [ - { - "id": "app", - "label": "Salesforce", - "icon": "", - "defaultSize": { - "width": 1100, - "height": 760 - } - } - ] -} diff --git a/extensions/cate.slack/README.md b/extensions/cate.slack/README.md deleted file mode 100644 index 29c3d52..0000000 --- a/extensions/cate.slack/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# cate.slack - -Slack as a canvas panel — a channel, pinned next to your code. - -## What it does - -- Points a panel straight at `https://app.slack.com/client` using the manifest's `url` mode: no assets to build, no server process, no proxy. -- Runs in the extension's own persistent session partition (`persist:ext-cate.slack`), so signing in once sticks across restarts and your Slack cookies are isolated from browser panels and from every other extension. -- Works where an iframe embed would not: the panel is a top-level browsing context, so Slack's `X-Frame-Options` / `frame-ancestors` headers don't block it. - -## Your workspace - -Slack is workspace-hosted, but `app.slack.com/client` is workspace-agnostic: it redirects to whichever workspace you're signed into (and to the workspace picker / sign-in when you're not). Nothing to edit for the common case. - -To pin one workspace directly, sideload a copy with `url` edited to e.g. `https://app.slack.com/client/T01234567` (your team id), or `https://your-workspace.slack.com/`. - -## Scopes - -None. A `url` extension gets no `cateHost` bridge and no `cate.*` API — a remote origin can't prove an extension identity, so Cate attaches no preload to it (see `docs/extensions.md` → Security Hygiene). Slack is a third party; it should not be able to reach into the workspace. - -## Notes - -- Sign-in via "Continue with Google/Apple" is pushed to the system browser by Cate's OAuth handling; use email/magic-link or password sign-in inside the panel. -- There is nothing to build. `build.sh` ships the directory as-is (manifest + this README). diff --git a/extensions/cate.slack/manifest.json b/extensions/cate.slack/manifest.json deleted file mode 100644 index fd16757..0000000 --- a/extensions/cate.slack/manifest.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "id": "cate.slack", - "name": "Slack", - "version": "1.0.0", - "category": "communication", - "description": "Slack as a canvas panel. Points a panel at the Slack web client in the extension's own persistent session, so you stay signed in across restarts and can keep a channel next to your code.", - "url": "https://app.slack.com/client", - "panels": [ - { - "id": "app", - "label": "Slack", - "icon": "", - "defaultSize": { - "width": 1080, - "height": 760 - } - } - ] -} diff --git a/extensions/cate.zohocrm/README.md b/extensions/cate.zohocrm/README.md deleted file mode 100644 index b7447e9..0000000 --- a/extensions/cate.zohocrm/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# cate.zohocrm - -Zoho CRM as a canvas panel — your accounts and deals, pinned next to your code. - -## What it does - -- Points a panel straight at `https://crm.zoho.com/crm/ShowHomePage.do` using the manifest's `url` mode: no assets to build, no server process, no proxy. -- Runs in the extension's own persistent session partition (`persist:ext-cate.zohocrm`), so signing in once sticks across restarts and your Zoho cookies are isolated from browser panels and from every other extension. -- Works where an iframe embed would not: the panel is a top-level browsing context, so Zoho's `X-Frame-Options` / `frame-ancestors` headers don't block it. - -## Your org and data centre - -`crm.zoho.com/crm/ShowHomePage.do` is org-agnostic: signed out it redirects to `accounts.zoho.com/signin?servicename=ZohoCRM` and back to your own CRM home afterwards. (Bare `crm.zoho.com` redirects to the marketing site, which is why the manifest uses the app path.) - -Zoho runs regional data centres. If your account is on `.eu`, `.in`, `.com.au`, `.jp` or similar, sideload a copy with `url` edited to e.g. `https://crm.zoho.eu/crm/ShowHomePage.do`. - -## Scopes - -None. A `url` extension gets no `cateHost` bridge and no `cate.*` API — a remote origin can't prove an extension identity, so Cate attaches no preload to it (see `docs/extensions.md` → Security Hygiene). Zoho is a third party; it should not be able to reach into the workspace. - -## Notes - -- Sign-in via "Continue with Google/Microsoft/Apple" is pushed to the system browser by Cate's OAuth handling; use email/password inside the panel. -- There is nothing to build. `build.sh` ships the directory as-is (manifest + this README). diff --git a/extensions/cate.zohocrm/manifest.json b/extensions/cate.zohocrm/manifest.json deleted file mode 100644 index 74873c9..0000000 --- a/extensions/cate.zohocrm/manifest.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "id": "cate.zohocrm", - "name": "Zoho CRM", - "version": "1.0.0", - "category": "sales", - "description": "Zoho CRM as a canvas panel. Points a panel at the Zoho CRM home in the extension's own persistent session, so you stay signed in across restarts and can keep your accounts next to your code.", - "url": "https://crm.zoho.com/crm/ShowHomePage.do", - "panels": [ - { - "id": "app", - "label": "Zoho CRM", - "icon": "", - "defaultSize": { - "width": 1100, - "height": 760 - } - } - ] -}