diff --git a/packages/app-store/apps.browser.generated.tsx b/packages/app-store/apps.browser.generated.tsx
index ed1a807f80..06052c1108 100644
--- a/packages/app-store/apps.browser.generated.tsx
+++ b/packages/app-store/apps.browser.generated.tsx
@@ -7,6 +7,7 @@ import dynamic from "next/dynamic";
import { metadata as applecalendar_meta } from "./applecalendar/_metadata";
import { metadata as around_meta } from "./around/_metadata";
import { metadata as caldavcalendar_meta } from "./caldavcalendar/_metadata";
+import { metadata as campfire_meta } from "./campfire/_metadata";
import { metadata as closecomothercalendar_meta } from "./closecomothercalendar/_metadata";
import { metadata as dailyvideo_meta } from "./dailyvideo/_metadata";
import { metadata as routing_forms_meta } from "./ee/routing_forms/_metadata";
@@ -38,6 +39,7 @@ export const appStoreMetadata = {
applecalendar: applecalendar_meta,
around: around_meta,
caldavcalendar: caldavcalendar_meta,
+ campfire: campfire_meta,
closecomothercalendar: closecomothercalendar_meta,
dailyvideo: dailyvideo_meta,
routing_forms: routing_forms_meta,
diff --git a/packages/app-store/apps.server.generated.ts b/packages/app-store/apps.server.generated.ts
index 30d382ff7d..494abb52af 100644
--- a/packages/app-store/apps.server.generated.ts
+++ b/packages/app-store/apps.server.generated.ts
@@ -6,6 +6,7 @@ export const apiHandlers = {
applecalendar: import("./applecalendar/api"),
around: import("./around/api"),
caldavcalendar: import("./caldavcalendar/api"),
+ campfire: import("./campfire/api"),
closecomothercalendar: import("./closecomothercalendar/api"),
routing_forms: import("./ee/routing_forms/api"),
exchange2013calendar: import("./exchange2013calendar/api"),
diff --git a/packages/app-store/campfire/README.mdx b/packages/app-store/campfire/README.mdx
new file mode 100644
index 0000000000..8ba4151d4a
--- /dev/null
+++ b/packages/app-store/campfire/README.mdx
@@ -0,0 +1,30 @@
+---
+items:
+ - /api/app-store/campfire/1.png
+ - /api/app-store/campfire/2.png
+ - /api/app-store/campfire/3.png
+ - /api/app-store/campfire/4.png
+---
+
+
+
+
+
+## Feel connected with your remote team
+Team events, new hire onboardings, coffee chats, all on Campfire. No more awkward Zoom calls.
+
+## Actually fun virtual socials
+Campfire updates your team space with new games & activities weekly. You’ll never need to find another app or plan anything - ever!
+
+## Your team's relaxed social space
+Give your team the space to unwind and connect- separate from rigid Zoom calls.
+
+### Fun & casual activities
+We deliver fun and easy-to-play games & activities for teams of 2 to 20+, so you can just relax and connect.
+
+### Organic interactions
+80% of teams that use Campfire start having spontaneous social hangouts.
+
+### Casual and friendly
+Separate work chats from social & human interactions by giving your team a more relaxed space to share.
+
diff --git a/packages/app-store/campfire/_metadata.ts b/packages/app-store/campfire/_metadata.ts
new file mode 100644
index 0000000000..9c7f2aa320
--- /dev/null
+++ b/packages/app-store/campfire/_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/campfire/api/add.ts b/packages/app-store/campfire/api/add.ts
new file mode 100644
index 0000000000..a3fb710df3
--- /dev/null
+++ b/packages/app-store/campfire/api/add.ts
@@ -0,0 +1,17 @@
+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,
+ slug: appConfig.slug,
+ supportsMultipleInstalls: false,
+ handlerType: "add",
+ redirectUrl: "/apps/installed",
+ createCredential: ({ appType, user, slug }) =>
+ createDefaultInstallation({ appType, userId: user.id, slug, key: {} }),
+};
+
+export default handler;
diff --git a/packages/app-store/campfire/api/index.ts b/packages/app-store/campfire/api/index.ts
new file mode 100644
index 0000000000..4c0d2ead01
--- /dev/null
+++ b/packages/app-store/campfire/api/index.ts
@@ -0,0 +1 @@
+export { default as add } from "./add";
diff --git a/packages/app-store/campfire/components/.gitkeep b/packages/app-store/campfire/components/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/packages/app-store/campfire/config.json b/packages/app-store/campfire/config.json
new file mode 100644
index 0000000000..d13f200ebe
--- /dev/null
+++ b/packages/app-store/campfire/config.json
@@ -0,0 +1,24 @@
+{
+ "/*": "Don't modify slug - If required, do it using cli edit command",
+ "name": "Campfire",
+ "slug": "campfire",
+ "type": "campfire_video",
+ "imageSrc": "/api/app-store/campfire/icon.svg",
+ "logo": "/api/app-store/campfire/icon.svg",
+ "url": "https://cal.com/apps/campfire",
+ "variant": "conferencing",
+ "categories": ["video"],
+ "publisher": "Cal.com, Inc.",
+ "email": "help@cal.com",
+ "description": "Feel connected with your remote team. Team events, new hire onboardings, coffee chats, all on Campfire. No more awkward Zoom calls.\r\r",
+ "__createdUsingCli": true,
+ "appData": {
+ "location": {
+ "type": "integrations:campfire_video",
+ "label": "Campfire",
+ "linkType": "static",
+ "organizerInputPlaceholder": "https://campfire.to/your-team",
+ "urlRegExp": "^http(s)?:\\/\\/(www\\.)?campfire.to\\/[a-zA-Z0-9]*"
+ }
+ }
+}
diff --git a/packages/app-store/campfire/index.ts b/packages/app-store/campfire/index.ts
new file mode 100644
index 0000000000..5d372ceda3
--- /dev/null
+++ b/packages/app-store/campfire/index.ts
@@ -0,0 +1,2 @@
+export * as api from "./api";
+export { metadata } from "./_metadata";
diff --git a/packages/app-store/campfire/package.json b/packages/app-store/campfire/package.json
new file mode 100644
index 0000000000..9ca77daa9f
--- /dev/null
+++ b/packages/app-store/campfire/package.json
@@ -0,0 +1,14 @@
+{
+ "$schema": "https://json.schemastore.org/package.json",
+ "private": true,
+ "name": "@calcom/campfire",
+ "version": "0.0.0",
+ "main": "./index.ts",
+ "description": "Feel connected with your remote team. Team events, new hire onboardings, coffee chats, all on Campfire. No more awkward Zoom calls.\r\r",
+ "dependencies": {
+ "@calcom/lib": "*"
+ },
+ "devDependencies": {
+ "@calcom/types": "*"
+ }
+}
diff --git a/packages/app-store/campfire/static/1.png b/packages/app-store/campfire/static/1.png
new file mode 100644
index 0000000000..b73d96066e
Binary files /dev/null and b/packages/app-store/campfire/static/1.png differ
diff --git a/packages/app-store/campfire/static/2.png b/packages/app-store/campfire/static/2.png
new file mode 100644
index 0000000000..7b96dc20f7
Binary files /dev/null and b/packages/app-store/campfire/static/2.png differ
diff --git a/packages/app-store/campfire/static/3.png b/packages/app-store/campfire/static/3.png
new file mode 100644
index 0000000000..c965e3968b
Binary files /dev/null and b/packages/app-store/campfire/static/3.png differ
diff --git a/packages/app-store/campfire/static/4.png b/packages/app-store/campfire/static/4.png
new file mode 100644
index 0000000000..c97dfc735d
Binary files /dev/null and b/packages/app-store/campfire/static/4.png differ
diff --git a/packages/app-store/campfire/static/icon.svg b/packages/app-store/campfire/static/icon.svg
new file mode 100644
index 0000000000..fb894c8899
--- /dev/null
+++ b/packages/app-store/campfire/static/icon.svg
@@ -0,0 +1,4 @@
+
diff --git a/packages/prisma/seed-app-store.config.json b/packages/prisma/seed-app-store.config.json
index 3f4bd7c013..7d88d9e6c9 100644
--- a/packages/prisma/seed-app-store.config.json
+++ b/packages/prisma/seed-app-store.config.json
@@ -2,50 +2,44 @@
{
"/*": "This file is auto-generated and updated by `yarn app-store create/edit`. Don't edit it manually",
"dirName": "routing_forms",
- "categories": [
- "other"
- ],
+ "categories": ["other"],
"slug": "routing_forms",
"type": "routing_forms_other"
},
{
"dirName": "whereby",
- "categories": [
- "video"
- ],
+ "categories": ["video"],
"slug": "whereby",
"type": "whereby_video"
},
{
"dirName": "around",
- "categories": [
- "video"
- ],
+ "categories": ["video"],
"slug": "around",
"type": "around_video"
},
{
"dirName": "riverside",
- "categories": [
- "video"
- ],
+ "categories": ["video"],
"slug": "riverside",
"type": "riverside_video"
},
{
"dirName": "typeform",
- "categories": [
- "other"
- ],
+ "categories": ["other"],
"slug": "typeform",
"type": "typeform_other"
},
{
"dirName": "ping",
- "categories": [
- "video"
- ],
+ "categories": ["video"],
"slug": "ping",
"type": "ping_video"
+ },
+ {
+ "dirName": "campfire",
+ "categories": ["video"],
+ "slug": "campfire",
+ "type": "campfire_video"
}
-]
\ No newline at end of file
+]