diff --git a/apps/web/components/apps/App.tsx b/apps/web/components/apps/App.tsx
index f390eab310..187a115c3b 100644
--- a/apps/web/components/apps/App.tsx
+++ b/apps/web/components/apps/App.tsx
@@ -66,7 +66,9 @@ const Component = ({
}
);
- const allowedMultipleInstalls = categories.indexOf("calendar") > -1;
+ // variant not other allows, an app to be shown in calendar category without requiring an actual calendar connection e.g. vimcal
+ // Such apps, can only be installed once.
+ const allowedMultipleInstalls = categories.indexOf("calendar") > -1 && variant !== "other";
return (
diff --git a/packages/app-store/apps.metadata.generated.ts b/packages/app-store/apps.metadata.generated.ts
index 1cc1b00518..d11dd7f1db 100644
--- a/packages/app-store/apps.metadata.generated.ts
+++ b/packages/app-store/apps.metadata.generated.ts
@@ -39,6 +39,7 @@ import { metadata as stripepayment_meta } from "./stripepayment/_metadata";
import { metadata as tandemvideo_meta } from "./tandemvideo/_metadata";
import { metadata as telegram_meta } from "./telegram/_metadata";
import { metadata as typeform_meta } from "./typeform/_metadata";
+import { metadata as vimcal_meta } from "./vimcal/_metadata";
import { metadata as vital_meta } from "./vital/_metadata";
import { metadata as weather_in_your_calendar_meta } from "./weather_in_your_calendar/_metadata";
import { metadata as whatsapp_meta } from "./whatsapp/_metadata";
@@ -86,6 +87,7 @@ export const appStoreMetadata = {
tandemvideo: tandemvideo_meta,
telegram: telegram_meta,
typeform: typeform_meta,
+ vimcal: vimcal_meta,
vital: vital_meta,
weather_in_your_calendar: weather_in_your_calendar_meta,
whatsapp: whatsapp_meta,
diff --git a/packages/app-store/apps.server.generated.ts b/packages/app-store/apps.server.generated.ts
index 1bd44d031f..a0b3ddfa99 100644
--- a/packages/app-store/apps.server.generated.ts
+++ b/packages/app-store/apps.server.generated.ts
@@ -38,6 +38,7 @@ export const apiHandlers = {
tandemvideo: import("./tandemvideo/api"),
telegram: import("./telegram/api"),
typeform: import("./typeform/api"),
+ vimcal: import("./vimcal/api"),
vital: import("./vital/api"),
weather_in_your_calendar: import("./weather_in_your_calendar/api"),
whatsapp: import("./whatsapp/api"),
diff --git a/packages/app-store/vimcal/README.mdx b/packages/app-store/vimcal/README.mdx
new file mode 100644
index 0000000000..5a5eeb3407
--- /dev/null
+++ b/packages/app-store/vimcal/README.mdx
@@ -0,0 +1,11 @@
+---
+description: The world's fastest calendar, beautifully designed for a remote world
+items:
+ - /api/app-store/vimcal/1.gif
+ - /api/app-store/vimcal/2.gif
+ - /api/app-store/vimcal/3.gif
+ - /api/app-store/vimcal/4.gif
+---
+
+{description}
+
diff --git a/packages/app-store/vimcal/_metadata.ts b/packages/app-store/vimcal/_metadata.ts
new file mode 100644
index 0000000000..9c7f2aa320
--- /dev/null
+++ b/packages/app-store/vimcal/_metadata.ts
@@ -0,0 +1,10 @@
+import type { AppMeta } from "@calcom/types/App";
+
+import config from "./config.json";
+
+export const metadata = {
+ category: "other",
+ ...config,
+} as AppMeta;
+
+export default metadata;
diff --git a/packages/app-store/vimcal/api/add.ts b/packages/app-store/vimcal/api/add.ts
new file mode 100644
index 0000000000..a9a7df96d3
--- /dev/null
+++ b/packages/app-store/vimcal/api/add.ts
@@ -0,0 +1,21 @@
+import { AppDeclarativeHandler } from "@calcom/types/AppHandler";
+
+import { createDefaultInstallation } from "../../_utils/installation";
+import appConfig from "../config.json";
+
+const handler: AppDeclarativeHandler = {
+ // Instead of passing appType and slug from here, api/integrations/[..args] should be able to derive and pass these directly to createCredential
+ appType: appConfig.type,
+ variant: appConfig.variant,
+ slug: appConfig.slug,
+ supportsMultipleInstalls: false,
+ handlerType: "add",
+ redirect: {
+ newTab: true,
+ url: "https://cal.com/blog/cal-plus-vimcal",
+ },
+ createCredential: ({ appType, user, slug }) =>
+ createDefaultInstallation({ appType, userId: user.id, slug, key: {} }),
+};
+
+export default handler;
diff --git a/packages/app-store/vimcal/api/index.ts b/packages/app-store/vimcal/api/index.ts
new file mode 100644
index 0000000000..4c0d2ead01
--- /dev/null
+++ b/packages/app-store/vimcal/api/index.ts
@@ -0,0 +1 @@
+export { default as add } from "./add";
diff --git a/packages/app-store/vimcal/components/.gitkeep b/packages/app-store/vimcal/components/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/packages/app-store/vimcal/config.json b/packages/app-store/vimcal/config.json
new file mode 100644
index 0000000000..41bfd3b790
--- /dev/null
+++ b/packages/app-store/vimcal/config.json
@@ -0,0 +1,16 @@
+{
+ "/*": "Don't modify slug - If required, do it using cli edit command",
+ "name": "Vimcal",
+ "slug": "vimcal",
+ "type": "vimcal_other",
+ "imageSrc": "/api/app-store/vimcal/icon.svg",
+ "logo": "/api/app-store/vimcal/icon.svg",
+ "url": "https://cal.com/apps/vimcal",
+ "variant": "other",
+ "categories": ["calendar"],
+ "publisher": "Cal.com, Inc.",
+ "email": "support@cal.com",
+ "description": "The world's fastest calendar, beautifully designed for a remote world\r",
+ "extendsFeature": "User",
+ "__createdUsingCli": true
+}
diff --git a/packages/app-store/vimcal/index.ts b/packages/app-store/vimcal/index.ts
new file mode 100644
index 0000000000..5d372ceda3
--- /dev/null
+++ b/packages/app-store/vimcal/index.ts
@@ -0,0 +1,2 @@
+export * as api from "./api";
+export { metadata } from "./_metadata";
diff --git a/packages/app-store/vimcal/package.json b/packages/app-store/vimcal/package.json
new file mode 100644
index 0000000000..4262385361
--- /dev/null
+++ b/packages/app-store/vimcal/package.json
@@ -0,0 +1,14 @@
+{
+ "$schema": "https://json.schemastore.org/package.json",
+ "private": true,
+ "name": "@calcom/vimcal",
+ "version": "0.0.0",
+ "main": "./index.ts",
+ "description": "The world's fastest calendar, beautifully designed for a remote world\r",
+ "dependencies": {
+ "@calcom/lib": "*"
+ },
+ "devDependencies": {
+ "@calcom/types": "*"
+ }
+}
diff --git a/packages/app-store/vimcal/static/1.avif b/packages/app-store/vimcal/static/1.avif
new file mode 100644
index 0000000000..84b29b685e
Binary files /dev/null and b/packages/app-store/vimcal/static/1.avif differ
diff --git a/packages/app-store/vimcal/static/1.gif b/packages/app-store/vimcal/static/1.gif
new file mode 100644
index 0000000000..af2618b6ef
Binary files /dev/null and b/packages/app-store/vimcal/static/1.gif differ
diff --git a/packages/app-store/vimcal/static/2.avif b/packages/app-store/vimcal/static/2.avif
new file mode 100644
index 0000000000..0a686d8657
Binary files /dev/null and b/packages/app-store/vimcal/static/2.avif differ
diff --git a/packages/app-store/vimcal/static/2.gif b/packages/app-store/vimcal/static/2.gif
new file mode 100644
index 0000000000..cc6a50a5c7
Binary files /dev/null and b/packages/app-store/vimcal/static/2.gif differ
diff --git a/packages/app-store/vimcal/static/3.avif b/packages/app-store/vimcal/static/3.avif
new file mode 100644
index 0000000000..94d6e369da
Binary files /dev/null and b/packages/app-store/vimcal/static/3.avif differ
diff --git a/packages/app-store/vimcal/static/3.gif b/packages/app-store/vimcal/static/3.gif
new file mode 100644
index 0000000000..49b5db53e1
Binary files /dev/null and b/packages/app-store/vimcal/static/3.gif differ
diff --git a/packages/app-store/vimcal/static/4.avif b/packages/app-store/vimcal/static/4.avif
new file mode 100644
index 0000000000..0f5e3dc4c8
Binary files /dev/null and b/packages/app-store/vimcal/static/4.avif differ
diff --git a/packages/app-store/vimcal/static/4.gif b/packages/app-store/vimcal/static/4.gif
new file mode 100644
index 0000000000..3c820e8ed9
Binary files /dev/null and b/packages/app-store/vimcal/static/4.gif differ
diff --git a/packages/app-store/vimcal/static/icon.svg b/packages/app-store/vimcal/static/icon.svg
new file mode 100644
index 0000000000..ee58606924
--- /dev/null
+++ b/packages/app-store/vimcal/static/icon.svg
@@ -0,0 +1,28 @@
+
diff --git a/packages/prisma/seed-app-store.config.json b/packages/prisma/seed-app-store.config.json
index 2d9e156f39..2c24a3f852 100644
--- a/packages/prisma/seed-app-store.config.json
+++ b/packages/prisma/seed-app-store.config.json
@@ -143,5 +143,11 @@
"categories": ["video"],
"slug": "signal",
"type": "signal_video"
+ },
+ {
+ "dirName": "vimcal",
+ "categories": ["calendar"],
+ "slug": "vimcal",
+ "type": "vimcal_other"
}
]