diff --git a/recipes/alibaba-chat/icon.svg b/recipes/alibaba-chat/icon.svg
new file mode 100644
index 000000000..005a6a73f
--- /dev/null
+++ b/recipes/alibaba-chat/icon.svg
@@ -0,0 +1,37 @@
+
+
+
diff --git a/recipes/alibaba-chat/index.js b/recipes/alibaba-chat/index.js
new file mode 100644
index 000000000..dd41f7287
--- /dev/null
+++ b/recipes/alibaba-chat/index.js
@@ -0,0 +1 @@
+module.exports = Ferdium => Ferdium;
diff --git a/recipes/alibaba-chat/package.json b/recipes/alibaba-chat/package.json
new file mode 100644
index 000000000..323f81b1a
--- /dev/null
+++ b/recipes/alibaba-chat/package.json
@@ -0,0 +1,9 @@
+{
+ "id": "alibaba-chat",
+ "name": "Alibaba Chat",
+ "version": "1.0.0",
+ "license": "MIT",
+ "config": {
+ "serviceURL": "https://message.alibaba.com/message/messenger.htm"
+ }
+}
diff --git a/recipes/alibaba-chat/webview.js b/recipes/alibaba-chat/webview.js
new file mode 100644
index 000000000..991eccd8d
--- /dev/null
+++ b/recipes/alibaba-chat/webview.js
@@ -0,0 +1,19 @@
+function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : { default: obj };
+}
+
+const _path = _interopRequireDefault(require("path"));
+
+module.exports = (Ferdium) => {
+ // TODO: If your SNAME service has unread messages, uncomment these lines to implement the logic for updating the badges
+ const getMessages = () => {
+ // TODO: Insert your notification-finding code here
+ const count = document.querySelector(
+ "#im-list > div > div.im-conversation-list-container > div.im-next-tabs.im-next-tabs-pure.im-next-tabs-scrollable.im-next-medium.list-tab > div.im-next-tabs-bar > div > div > div > ul > li:nth-child(2) > div > div > span.red-num"
+ );
+ Ferdium.setBadge(count, 0);
+ };
+ Ferdium.loop(getMessages);
+
+ Ferdium.injectCSS(_path.default.join(__dirname, "service.css"));
+};
diff --git a/recipes/canva/icon.svg b/recipes/canva/icon.svg
new file mode 100644
index 000000000..e0bd93474
--- /dev/null
+++ b/recipes/canva/icon.svg
@@ -0,0 +1,27 @@
+
\ No newline at end of file
diff --git a/recipes/canva/index.js b/recipes/canva/index.js
new file mode 100644
index 000000000..dd41f7287
--- /dev/null
+++ b/recipes/canva/index.js
@@ -0,0 +1 @@
+module.exports = Ferdium => Ferdium;
diff --git a/recipes/canva/package.json b/recipes/canva/package.json
new file mode 100644
index 000000000..eeebd4e9c
--- /dev/null
+++ b/recipes/canva/package.json
@@ -0,0 +1,9 @@
+{
+ "id": "canva",
+ "name": "Canva",
+ "version": "1.0.0",
+ "license": "MIT",
+ "config": {
+ "serviceURL": "https://canva.com"
+ }
+}
diff --git a/recipes/canva/webview.js b/recipes/canva/webview.js
new file mode 100644
index 000000000..8ff735df0
--- /dev/null
+++ b/recipes/canva/webview.js
@@ -0,0 +1,16 @@
+function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : { default: obj };
+}
+
+const _path = _interopRequireDefault(require("path"));
+
+module.exports = (Ferdium) => {
+ // TODO: If your SNAME service has unread messages, uncomment these lines to implement the logic for updating the badges
+ // const getMessages = () => {
+ // // TODO: Insert your notification-finding code here
+ // Ferdium.setBadge(0, 0);
+ // };
+ // Ferdium.loop(getMessages);
+
+ Ferdium.injectCSS(_path.default.join(__dirname, "service.css"));
+};
diff --git a/recipes/drawio/icon.svg b/recipes/drawio/icon.svg
new file mode 100644
index 000000000..ee65a9cdd
--- /dev/null
+++ b/recipes/drawio/icon.svg
@@ -0,0 +1,20 @@
+
+
+
diff --git a/recipes/drawio/index.js b/recipes/drawio/index.js
new file mode 100644
index 000000000..dd41f7287
--- /dev/null
+++ b/recipes/drawio/index.js
@@ -0,0 +1 @@
+module.exports = Ferdium => Ferdium;
diff --git a/recipes/drawio/package.json b/recipes/drawio/package.json
new file mode 100644
index 000000000..3a555cb91
--- /dev/null
+++ b/recipes/drawio/package.json
@@ -0,0 +1,9 @@
+{
+ "id": "drawio",
+ "name": "Draw.io",
+ "version": "1.0.0",
+ "license": "MIT",
+ "config": {
+ "serviceURL": "https://app.diagrams.net/"
+ }
+}
diff --git a/recipes/drawio/webview.js b/recipes/drawio/webview.js
new file mode 100644
index 000000000..8ff735df0
--- /dev/null
+++ b/recipes/drawio/webview.js
@@ -0,0 +1,16 @@
+function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : { default: obj };
+}
+
+const _path = _interopRequireDefault(require("path"));
+
+module.exports = (Ferdium) => {
+ // TODO: If your SNAME service has unread messages, uncomment these lines to implement the logic for updating the badges
+ // const getMessages = () => {
+ // // TODO: Insert your notification-finding code here
+ // Ferdium.setBadge(0, 0);
+ // };
+ // Ferdium.loop(getMessages);
+
+ Ferdium.injectCSS(_path.default.join(__dirname, "service.css"));
+};
diff --git a/recipes/fandom/icon.svg b/recipes/fandom/icon.svg
new file mode 100644
index 000000000..96959d6de
--- /dev/null
+++ b/recipes/fandom/icon.svg
@@ -0,0 +1,21 @@
+
+
+
diff --git a/recipes/fandom/index.js b/recipes/fandom/index.js
new file mode 100644
index 000000000..dd41f7287
--- /dev/null
+++ b/recipes/fandom/index.js
@@ -0,0 +1 @@
+module.exports = Ferdium => Ferdium;
diff --git a/recipes/fandom/package.json b/recipes/fandom/package.json
new file mode 100644
index 000000000..318d7617b
--- /dev/null
+++ b/recipes/fandom/package.json
@@ -0,0 +1,9 @@
+{
+ "id": "fandom",
+ "name": "Fandom",
+ "version": "1.0.0",
+ "license": "MIT",
+ "config": {
+ "serviceURL": "https://www.fandom.com"
+ }
+}
diff --git a/recipes/fandom/webview.js b/recipes/fandom/webview.js
new file mode 100644
index 000000000..8ff735df0
--- /dev/null
+++ b/recipes/fandom/webview.js
@@ -0,0 +1,16 @@
+function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : { default: obj };
+}
+
+const _path = _interopRequireDefault(require("path"));
+
+module.exports = (Ferdium) => {
+ // TODO: If your SNAME service has unread messages, uncomment these lines to implement the logic for updating the badges
+ // const getMessages = () => {
+ // // TODO: Insert your notification-finding code here
+ // Ferdium.setBadge(0, 0);
+ // };
+ // Ferdium.loop(getMessages);
+
+ Ferdium.injectCSS(_path.default.join(__dirname, "service.css"));
+};
diff --git a/recipes/fiverr/icon.svg b/recipes/fiverr/icon.svg
new file mode 100644
index 000000000..1e71430aa
--- /dev/null
+++ b/recipes/fiverr/icon.svg
@@ -0,0 +1,15 @@
+
+
+
diff --git a/recipes/fiverr/index.js b/recipes/fiverr/index.js
new file mode 100644
index 000000000..dd41f7287
--- /dev/null
+++ b/recipes/fiverr/index.js
@@ -0,0 +1 @@
+module.exports = Ferdium => Ferdium;
diff --git a/recipes/fiverr/package.json b/recipes/fiverr/package.json
new file mode 100644
index 000000000..6f9f6306e
--- /dev/null
+++ b/recipes/fiverr/package.json
@@ -0,0 +1,10 @@
+{
+ "id": "fiverr",
+ "name": "Fiverr",
+ "version": "1.0.0",
+ "license": "MIT",
+ "config": {
+ "serviceURL": "https://www.fiverr.com/inbox/",
+ "hasNotificationSound": true
+ }
+}
diff --git a/recipes/fiverr/webview.js b/recipes/fiverr/webview.js
new file mode 100644
index 000000000..8ff735df0
--- /dev/null
+++ b/recipes/fiverr/webview.js
@@ -0,0 +1,16 @@
+function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : { default: obj };
+}
+
+const _path = _interopRequireDefault(require("path"));
+
+module.exports = (Ferdium) => {
+ // TODO: If your SNAME service has unread messages, uncomment these lines to implement the logic for updating the badges
+ // const getMessages = () => {
+ // // TODO: Insert your notification-finding code here
+ // Ferdium.setBadge(0, 0);
+ // };
+ // Ferdium.loop(getMessages);
+
+ Ferdium.injectCSS(_path.default.join(__dirname, "service.css"));
+};
diff --git a/recipes/google-maps/icon.svg b/recipes/google-maps/icon.svg
new file mode 100644
index 000000000..298ceae68
--- /dev/null
+++ b/recipes/google-maps/icon.svg
@@ -0,0 +1,20 @@
+
+
+
diff --git a/recipes/google-maps/index.js b/recipes/google-maps/index.js
new file mode 100644
index 000000000..dd41f7287
--- /dev/null
+++ b/recipes/google-maps/index.js
@@ -0,0 +1 @@
+module.exports = Ferdium => Ferdium;
diff --git a/recipes/google-maps/package.json b/recipes/google-maps/package.json
new file mode 100644
index 000000000..e2a0d35c2
--- /dev/null
+++ b/recipes/google-maps/package.json
@@ -0,0 +1,9 @@
+{
+ "id": "google-maps",
+ "name": "Google Maps",
+ "version": "1.0.0",
+ "license": "MIT",
+ "config": {
+ "serviceURL": "https://www.google.com/maps"
+ }
+}
diff --git a/recipes/google-maps/webview.js b/recipes/google-maps/webview.js
new file mode 100644
index 000000000..8ff735df0
--- /dev/null
+++ b/recipes/google-maps/webview.js
@@ -0,0 +1,16 @@
+function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : { default: obj };
+}
+
+const _path = _interopRequireDefault(require("path"));
+
+module.exports = (Ferdium) => {
+ // TODO: If your SNAME service has unread messages, uncomment these lines to implement the logic for updating the badges
+ // const getMessages = () => {
+ // // TODO: Insert your notification-finding code here
+ // Ferdium.setBadge(0, 0);
+ // };
+ // Ferdium.loop(getMessages);
+
+ Ferdium.injectCSS(_path.default.join(__dirname, "service.css"));
+};
diff --git a/recipes/hacker-news/icon.svg b/recipes/hacker-news/icon.svg
new file mode 100644
index 000000000..faac12a68
--- /dev/null
+++ b/recipes/hacker-news/icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/recipes/hacker-news/index.js b/recipes/hacker-news/index.js
new file mode 100644
index 000000000..dd41f7287
--- /dev/null
+++ b/recipes/hacker-news/index.js
@@ -0,0 +1 @@
+module.exports = Ferdium => Ferdium;
diff --git a/recipes/hacker-news/package.json b/recipes/hacker-news/package.json
new file mode 100644
index 000000000..0c9e40690
--- /dev/null
+++ b/recipes/hacker-news/package.json
@@ -0,0 +1,9 @@
+{
+ "id": "hacker-news",
+ "name": "Hacker News",
+ "version": "1.0.0",
+ "license": "MIT",
+ "config": {
+ "serviceURL": "https://news.ycombinator.com/"
+ }
+}
diff --git a/recipes/hacker-news/webview.js b/recipes/hacker-news/webview.js
new file mode 100644
index 000000000..8ff735df0
--- /dev/null
+++ b/recipes/hacker-news/webview.js
@@ -0,0 +1,16 @@
+function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : { default: obj };
+}
+
+const _path = _interopRequireDefault(require("path"));
+
+module.exports = (Ferdium) => {
+ // TODO: If your SNAME service has unread messages, uncomment these lines to implement the logic for updating the badges
+ // const getMessages = () => {
+ // // TODO: Insert your notification-finding code here
+ // Ferdium.setBadge(0, 0);
+ // };
+ // Ferdium.loop(getMessages);
+
+ Ferdium.injectCSS(_path.default.join(__dirname, "service.css"));
+};
diff --git a/recipes/infomaniak-kdrive/icon.svg b/recipes/infomaniak-kdrive/icon.svg
new file mode 100644
index 000000000..cad4c94b8
--- /dev/null
+++ b/recipes/infomaniak-kdrive/icon.svg
@@ -0,0 +1,34 @@
+
+
+
diff --git a/recipes/infomaniak-kdrive/index.js b/recipes/infomaniak-kdrive/index.js
new file mode 100644
index 000000000..dd41f7287
--- /dev/null
+++ b/recipes/infomaniak-kdrive/index.js
@@ -0,0 +1 @@
+module.exports = Ferdium => Ferdium;
diff --git a/recipes/infomaniak-kdrive/package.json b/recipes/infomaniak-kdrive/package.json
new file mode 100644
index 000000000..2f6e0f508
--- /dev/null
+++ b/recipes/infomaniak-kdrive/package.json
@@ -0,0 +1,9 @@
+{
+ "id": "infomaniak-kdrive",
+ "name": "Infomaniak KDrive",
+ "version": "1.0.0",
+ "license": "MIT",
+ "config": {
+ "serviceURL": "https://kdrive.infomaniak.com/"
+ }
+}
diff --git a/recipes/infomaniak-kdrive/webview.js b/recipes/infomaniak-kdrive/webview.js
new file mode 100644
index 000000000..8ff735df0
--- /dev/null
+++ b/recipes/infomaniak-kdrive/webview.js
@@ -0,0 +1,16 @@
+function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : { default: obj };
+}
+
+const _path = _interopRequireDefault(require("path"));
+
+module.exports = (Ferdium) => {
+ // TODO: If your SNAME service has unread messages, uncomment these lines to implement the logic for updating the badges
+ // const getMessages = () => {
+ // // TODO: Insert your notification-finding code here
+ // Ferdium.setBadge(0, 0);
+ // };
+ // Ferdium.loop(getMessages);
+
+ Ferdium.injectCSS(_path.default.join(__dirname, "service.css"));
+};
diff --git a/recipes/mastodeck/icon.svg b/recipes/mastodeck/icon.svg
new file mode 100644
index 000000000..134947d4b
--- /dev/null
+++ b/recipes/mastodeck/icon.svg
@@ -0,0 +1,983 @@
+
+
+
diff --git a/recipes/mastodeck/index.js b/recipes/mastodeck/index.js
new file mode 100644
index 000000000..dd41f7287
--- /dev/null
+++ b/recipes/mastodeck/index.js
@@ -0,0 +1 @@
+module.exports = Ferdium => Ferdium;
diff --git a/recipes/mastodeck/package.json b/recipes/mastodeck/package.json
new file mode 100644
index 000000000..40370a093
--- /dev/null
+++ b/recipes/mastodeck/package.json
@@ -0,0 +1,9 @@
+{
+ "id": "mastodeck",
+ "name": "Mastodeck",
+ "version": "1.0.0",
+ "license": "MIT",
+ "config": {
+ "serviceURL": "https://mastodeck.com"
+ }
+}
diff --git a/recipes/mastodeck/webview.js b/recipes/mastodeck/webview.js
new file mode 100644
index 000000000..11192196b
--- /dev/null
+++ b/recipes/mastodeck/webview.js
@@ -0,0 +1,9 @@
+function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : { default: obj };
+}
+
+const _path = _interopRequireDefault(require('path'));
+
+module.exports = Ferdium => {
+ Ferdium.injectCSS(_path.default.join(__dirname, 'service.css'));
+};
diff --git a/recipes/ms-planner/icon.svg b/recipes/ms-planner/icon.svg
new file mode 100644
index 000000000..43a4cfcb8
--- /dev/null
+++ b/recipes/ms-planner/icon.svg
@@ -0,0 +1,15 @@
+
+
+
diff --git a/recipes/ms-planner/index.js b/recipes/ms-planner/index.js
new file mode 100644
index 000000000..1f33a8d8e
--- /dev/null
+++ b/recipes/ms-planner/index.js
@@ -0,0 +1,21 @@
+module.exports = Ferdium => class Planner extends Ferdium {
+ overrideUserAgent() {
+ return window.navigator.userAgent.replace(/(Ferdium|Electron)([^\s]+\s)/g, '').replace(/(Chrome\/)([^ ]*)/g, '$163.0.3239.84');
+ }
+
+ // https://docs.microsoft.com/en-us/microsoftteams/troubleshoot/teams-sign-in/sign-in-loop#resolution
+ knownCertificateHosts() {
+ return [
+ 'tasks.office.com'
+ ];
+ }
+
+ // we need to allow all cookies for ms teams
+ onHeadersReceived(details, callback) {
+ if (details.responseHeaders && details.responseHeaders['Set-Cookie'] && details.responseHeaders['Set-Cookie'].length && !details.responseHeaders['Set-Cookie'][0].includes('SameSite=none')) {
+ // eslint-disable-next-line no-param-reassign
+ details.responseHeaders['Set-Cookie'][0] = `${details.responseHeaders['Set-Cookie'][0]}; SameSite=none`;
+ }
+ callback({ cancel: false, responseHeaders: details.responseHeaders });
+ }
+};
\ No newline at end of file
diff --git a/recipes/ms-planner/package.json b/recipes/ms-planner/package.json
new file mode 100644
index 000000000..ebe02e961
--- /dev/null
+++ b/recipes/ms-planner/package.json
@@ -0,0 +1,12 @@
+{
+ "id": "ms-planner",
+ "name": "Microsoft Planner",
+ "aliases": ["office", "tasks"],
+ "version": "1.0.0",
+ "license": "MIT",
+ "config": {
+ "serviceURL": "https://tasks.office.com/",
+ "hasNotificationSound": true
+ }
+}
+
diff --git a/recipes/ms-planner/service.css b/recipes/ms-planner/service.css
new file mode 100644
index 000000000..d28527c78
--- /dev/null
+++ b/recipes/ms-planner/service.css
@@ -0,0 +1,15 @@
+.app-wrapper-web .app,
+.app-wrapper-web ._36Q2N,
+.app-wrapper-web .h70RQ,
+.app-wrapper-web ._3QfZd,
+.app-wrapper-web ._1jJ70,
+._1XkO3.two {
+ width: 100% !important;
+ max-width: 100% !important;
+ height: 100% !important;
+ top: 0 !important;
+}
+
+._1Wk6A ._3YewW._31v_P._2Ptrm {
+ display: none;
+}
diff --git a/recipes/ms-planner/webview.js b/recipes/ms-planner/webview.js
new file mode 100644
index 000000000..97c258650
--- /dev/null
+++ b/recipes/ms-planner/webview.js
@@ -0,0 +1,40 @@
+const path = require('path');
+
+setTimeout(() => {
+ const elem = document.querySelector('.landing-title.version-title');
+ if (elem && elem.innerText.toLowerCase().includes('google chrome')) {
+ window.FerdiumAPI.clearCache();
+ window.location.reload();
+ }
+}, 1000);
+
+const isMutedIcon = element =>
+ element.parentElement.parentElement.querySelectorAll('*[data-icon="muted"]')
+ .length !== 0;
+
+const isPinnedIcon = element => element.classList.contains('_1EFSv');
+
+module.exports = (Ferdium) => {
+ const getMessages = function getMessages() {
+ const elements = document.querySelectorAll(
+ '.CxUIE, .unread, ._0LqQ, .m61XR .ZKn2B, .VOr2j, ._1V5O7 ._2vfYK, html[dir] ._23LrM, ._1pJ9J:not(._2XH9R)',
+ );
+ let count = 0;
+
+ for (let i = 0; i < elements.length; i += 1) {
+ try {
+ // originalLog(isMutedIcon(elements[i]), isPinnedIcon(elements[i]));
+ if (!isMutedIcon(elements[i]) && !isPinnedIcon(elements[i])) {
+ count += 1;
+ }
+ } catch (err) {
+ // nope;
+ }
+ }
+
+ Ferdium.setBadge(count);
+ };
+
+ Ferdium.injectCSS(path.join(__dirname, 'service.css'));
+ Ferdium.loop(getMessages);
+};
diff --git a/recipes/notion-calendar/icon.svg b/recipes/notion-calendar/icon.svg
new file mode 100644
index 000000000..e7a9c1b4d
--- /dev/null
+++ b/recipes/notion-calendar/icon.svg
@@ -0,0 +1,31 @@
+
+
+
diff --git a/recipes/notion-calendar/index.js b/recipes/notion-calendar/index.js
new file mode 100644
index 000000000..dd41f7287
--- /dev/null
+++ b/recipes/notion-calendar/index.js
@@ -0,0 +1 @@
+module.exports = Ferdium => Ferdium;
diff --git a/recipes/notion-calendar/package.json b/recipes/notion-calendar/package.json
new file mode 100644
index 000000000..672c823ed
--- /dev/null
+++ b/recipes/notion-calendar/package.json
@@ -0,0 +1,10 @@
+{
+ "id": "notion-calendar",
+ "name": "Notion Calendar",
+ "version": "1.0.0",
+ "license": "MIT",
+ "config": {
+ "serviceURL": "https://calendar.notion.so/",
+ "hasNotificationSound": true
+ }
+}
diff --git a/recipes/notion-calendar/webview.js b/recipes/notion-calendar/webview.js
new file mode 100644
index 000000000..8ff735df0
--- /dev/null
+++ b/recipes/notion-calendar/webview.js
@@ -0,0 +1,16 @@
+function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : { default: obj };
+}
+
+const _path = _interopRequireDefault(require("path"));
+
+module.exports = (Ferdium) => {
+ // TODO: If your SNAME service has unread messages, uncomment these lines to implement the logic for updating the badges
+ // const getMessages = () => {
+ // // TODO: Insert your notification-finding code here
+ // Ferdium.setBadge(0, 0);
+ // };
+ // Ferdium.loop(getMessages);
+
+ Ferdium.injectCSS(_path.default.join(__dirname, "service.css"));
+};
diff --git a/recipes/patreon/icon.svg b/recipes/patreon/icon.svg
new file mode 100644
index 000000000..b6ad16709
--- /dev/null
+++ b/recipes/patreon/icon.svg
@@ -0,0 +1,31 @@
+
+
+
diff --git a/recipes/patreon/index.js b/recipes/patreon/index.js
new file mode 100644
index 000000000..dd41f7287
--- /dev/null
+++ b/recipes/patreon/index.js
@@ -0,0 +1 @@
+module.exports = Ferdium => Ferdium;
diff --git a/recipes/patreon/package.json b/recipes/patreon/package.json
new file mode 100644
index 000000000..3aafa1121
--- /dev/null
+++ b/recipes/patreon/package.json
@@ -0,0 +1,9 @@
+{
+ "id": "patreon",
+ "name": "Patreon",
+ "version": "1.0.0",
+ "license": "MIT",
+ "config": {
+ "serviceURL": "https://www.patreon.com/login"
+ }
+}
diff --git a/recipes/patreon/webview.js b/recipes/patreon/webview.js
new file mode 100644
index 000000000..8ff735df0
--- /dev/null
+++ b/recipes/patreon/webview.js
@@ -0,0 +1,16 @@
+function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : { default: obj };
+}
+
+const _path = _interopRequireDefault(require("path"));
+
+module.exports = (Ferdium) => {
+ // TODO: If your SNAME service has unread messages, uncomment these lines to implement the logic for updating the badges
+ // const getMessages = () => {
+ // // TODO: Insert your notification-finding code here
+ // Ferdium.setBadge(0, 0);
+ // };
+ // Ferdium.loop(getMessages);
+
+ Ferdium.injectCSS(_path.default.join(__dirname, "service.css"));
+};
diff --git a/recipes/penpot/icon.svg b/recipes/penpot/icon.svg
new file mode 100644
index 000000000..d51af20e6
--- /dev/null
+++ b/recipes/penpot/icon.svg
@@ -0,0 +1,14 @@
+
+
+
diff --git a/recipes/penpot/index.js b/recipes/penpot/index.js
new file mode 100644
index 000000000..dd41f7287
--- /dev/null
+++ b/recipes/penpot/index.js
@@ -0,0 +1 @@
+module.exports = Ferdium => Ferdium;
diff --git a/recipes/penpot/package.json b/recipes/penpot/package.json
new file mode 100644
index 000000000..980a4fd6a
--- /dev/null
+++ b/recipes/penpot/package.json
@@ -0,0 +1,11 @@
+{
+ "id": "penpot",
+ "name": "Penpot",
+ "version": "1.0.0",
+ "license": "MIT",
+ "config": {
+ "serviceURL": "https://design.penpot.app/",
+ "hasHostedOption": true,
+ "hasCustomUrl": true
+ }
+}
diff --git a/recipes/penpot/webview.js b/recipes/penpot/webview.js
new file mode 100644
index 000000000..8ff735df0
--- /dev/null
+++ b/recipes/penpot/webview.js
@@ -0,0 +1,16 @@
+function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : { default: obj };
+}
+
+const _path = _interopRequireDefault(require("path"));
+
+module.exports = (Ferdium) => {
+ // TODO: If your SNAME service has unread messages, uncomment these lines to implement the logic for updating the badges
+ // const getMessages = () => {
+ // // TODO: Insert your notification-finding code here
+ // Ferdium.setBadge(0, 0);
+ // };
+ // Ferdium.loop(getMessages);
+
+ Ferdium.injectCSS(_path.default.join(__dirname, "service.css"));
+};
diff --git a/recipes/purelymail/icon.svg b/recipes/purelymail/icon.svg
new file mode 100644
index 000000000..2fc7b1d89
--- /dev/null
+++ b/recipes/purelymail/icon.svg
@@ -0,0 +1,31 @@
+
\ No newline at end of file
diff --git a/recipes/purelymail/index.js b/recipes/purelymail/index.js
new file mode 100644
index 000000000..dd41f7287
--- /dev/null
+++ b/recipes/purelymail/index.js
@@ -0,0 +1 @@
+module.exports = Ferdium => Ferdium;
diff --git a/recipes/purelymail/package.json b/recipes/purelymail/package.json
new file mode 100644
index 000000000..d09652b92
--- /dev/null
+++ b/recipes/purelymail/package.json
@@ -0,0 +1,10 @@
+{
+ "id": "purelymail",
+ "name": "Purelymail",
+ "version": "1.0.0",
+ "license": "MIT",
+ "config": {
+ "serviceURL": "https://inbox.purelymail.com",
+ "hasNotificationSound": true
+ }
+}
diff --git a/recipes/purelymail/webview.js b/recipes/purelymail/webview.js
new file mode 100644
index 000000000..8ff735df0
--- /dev/null
+++ b/recipes/purelymail/webview.js
@@ -0,0 +1,16 @@
+function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : { default: obj };
+}
+
+const _path = _interopRequireDefault(require("path"));
+
+module.exports = (Ferdium) => {
+ // TODO: If your SNAME service has unread messages, uncomment these lines to implement the logic for updating the badges
+ // const getMessages = () => {
+ // // TODO: Insert your notification-finding code here
+ // Ferdium.setBadge(0, 0);
+ // };
+ // Ferdium.loop(getMessages);
+
+ Ferdium.injectCSS(_path.default.join(__dirname, "service.css"));
+};
diff --git a/recipes/romeo/icon.svg b/recipes/romeo/icon.svg
new file mode 100644
index 000000000..8b92cb12e
--- /dev/null
+++ b/recipes/romeo/icon.svg
@@ -0,0 +1,20 @@
+
+
+
diff --git a/recipes/romeo/index.js b/recipes/romeo/index.js
new file mode 100644
index 000000000..dd41f7287
--- /dev/null
+++ b/recipes/romeo/index.js
@@ -0,0 +1 @@
+module.exports = Ferdium => Ferdium;
diff --git a/recipes/romeo/package.json b/recipes/romeo/package.json
new file mode 100644
index 000000000..9ab0cb9ec
--- /dev/null
+++ b/recipes/romeo/package.json
@@ -0,0 +1,10 @@
+{
+ "id": "romeo",
+ "name": "Romeo",
+ "version": "1.0.0",
+ "license": "MIT",
+ "config": {
+ "serviceURL": "http://romeo.com",
+ "hasNotificationSound": true
+ }
+}
diff --git a/recipes/romeo/webview.js b/recipes/romeo/webview.js
new file mode 100644
index 000000000..8ff735df0
--- /dev/null
+++ b/recipes/romeo/webview.js
@@ -0,0 +1,16 @@
+function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : { default: obj };
+}
+
+const _path = _interopRequireDefault(require("path"));
+
+module.exports = (Ferdium) => {
+ // TODO: If your SNAME service has unread messages, uncomment these lines to implement the logic for updating the badges
+ // const getMessages = () => {
+ // // TODO: Insert your notification-finding code here
+ // Ferdium.setBadge(0, 0);
+ // };
+ // Ferdium.loop(getMessages);
+
+ Ferdium.injectCSS(_path.default.join(__dirname, "service.css"));
+};
diff --git a/recipes/superlist/icon.svg b/recipes/superlist/icon.svg
new file mode 100644
index 000000000..980a47e4b
--- /dev/null
+++ b/recipes/superlist/icon.svg
@@ -0,0 +1,13 @@
+
+
+
diff --git a/recipes/superlist/index.js b/recipes/superlist/index.js
new file mode 100644
index 000000000..dd41f7287
--- /dev/null
+++ b/recipes/superlist/index.js
@@ -0,0 +1 @@
+module.exports = Ferdium => Ferdium;
diff --git a/recipes/superlist/package.json b/recipes/superlist/package.json
new file mode 100644
index 000000000..a8bde3d48
--- /dev/null
+++ b/recipes/superlist/package.json
@@ -0,0 +1,10 @@
+{
+ "id": "superlist",
+ "name": "Superlist",
+ "version": "1.0.0",
+ "license": "MIT",
+ "config": {
+ "serviceURL": "https://app.superlist.com",
+ "hasNotificationSound": true
+ }
+}
diff --git a/recipes/superlist/webview.js b/recipes/superlist/webview.js
new file mode 100644
index 000000000..8ff735df0
--- /dev/null
+++ b/recipes/superlist/webview.js
@@ -0,0 +1,16 @@
+function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : { default: obj };
+}
+
+const _path = _interopRequireDefault(require("path"));
+
+module.exports = (Ferdium) => {
+ // TODO: If your SNAME service has unread messages, uncomment these lines to implement the logic for updating the badges
+ // const getMessages = () => {
+ // // TODO: Insert your notification-finding code here
+ // Ferdium.setBadge(0, 0);
+ // };
+ // Ferdium.loop(getMessages);
+
+ Ferdium.injectCSS(_path.default.join(__dirname, "service.css"));
+};