diff --git a/frontend/src/pages/integrations/windmill/authorize.tsx b/frontend/src/pages/integrations/windmill/authorize.tsx
new file mode 100644
index 000000000..fcf7048d1
--- /dev/null
+++ b/frontend/src/pages/integrations/windmill/authorize.tsx
@@ -0,0 +1,65 @@
+import { useState } from "react";
+import { useRouter } from "next/router";
+
+import { Button, Card, CardTitle, FormControl, Input } from "../../../components/v2";
+import saveIntegrationAccessToken from "../../api/integrations/saveIntegrationAccessToken";
+
+
+export default function WindmillCreateIntegrationPage() {
+ const router = useRouter();
+ const [apiKey, setApiKey] = useState("");
+ const [apiKeyErrorText, setApiKeyErrorText] = useState("");
+ const [isLoading, setIsLoading] = useState(false);
+
+ const handleButtonClick = async () => {
+ try {
+ setApiKeyErrorText("");
+ if (apiKey.length === 0) {
+ setApiKeyErrorText("API Key cannot be blank");
+ return;
+ }
+
+ setIsLoading(true);
+
+ const integrationAuth = await saveIntegrationAccessToken({
+ workspaceId: localStorage.getItem("projectData.id"),
+ integration: "windmill",
+ accessToken: apiKey,
+ accessId: null,
+ url: null,
+ namespace: null
+ });
+
+ setIsLoading(false);
+
+ router.push(`/integrations/windmill/create?integrationAuthId=${integrationAuth._id}`);
+ } catch (err) {
+ console.error(err);
+ }
+ };
+
+ return (
+
+
+ Windmill Integration
+
+ setApiKey(e.target.value)} />
+
+
+
+
+ );
+}
+
+WindmillCreateIntegrationPage.requireAuth = true;
\ No newline at end of file
diff --git a/frontend/src/pages/integrations/windmill/create.tsx b/frontend/src/pages/integrations/windmill/create.tsx
new file mode 100644
index 000000000..519355f65
--- /dev/null
+++ b/frontend/src/pages/integrations/windmill/create.tsx
@@ -0,0 +1,156 @@
+import { useEffect, useState } from "react";
+import { useRouter } from "next/router";
+import queryString from "query-string";
+
+import {
+ Button,
+ Card,
+ CardTitle,
+ FormControl,
+ Input,
+ Select,
+ SelectItem
+} from "../../../components/v2";
+import {
+ useGetIntegrationAuthApps,
+ useGetIntegrationAuthById
+} from "../../../hooks/api/integrationAuth";
+import { useGetWorkspaceById } from "../../../hooks/api/workspace";
+import createIntegration from "../../api/integrations/createIntegration";
+
+export default function WindmillCreateIntegrationPage() {
+ const router = useRouter();
+
+ const { integrationAuthId } = queryString.parse(router.asPath.split("?")[1]);
+
+ const { data: workspace } = useGetWorkspaceById(localStorage.getItem("projectData.id") ?? "");
+ const { data: integrationAuth } = useGetIntegrationAuthById((integrationAuthId as string) ?? "");
+ const { data: integrationAuthApps } = useGetIntegrationAuthApps({
+ integrationAuthId: (integrationAuthId as string) ?? ""
+ });
+
+ const [selectedSourceEnvironment, setSelectedSourceEnvironment] = useState("");
+ const [secretPath, setSecretPath] = useState("/");
+ const [targetApp, setTargetApp] = useState("");
+
+ const [isLoading, setIsLoading] = useState(false);
+
+ useEffect(() => {
+ if (workspace) {
+ setSelectedSourceEnvironment(workspace.environments[0].slug);
+ }
+ }, [workspace]);
+
+ useEffect(() => {
+ if (integrationAuthApps) {
+ if (integrationAuthApps.length > 0) {
+ setTargetApp(integrationAuthApps[0].name);
+ } else {
+ setTargetApp("none");
+ }
+ }
+ }, [integrationAuthApps]);
+
+ const handleButtonClick = async () => {
+ try {
+ if (!integrationAuth?._id) return;
+
+ setIsLoading(true);
+
+ await createIntegration({
+ integrationAuthId: integrationAuth?._id,
+ isActive: true,
+ app: targetApp,
+ appId:
+ integrationAuthApps?.find((integrationAuthApp) => integrationAuthApp.name === targetApp)
+ ?.appId ?? null,
+ sourceEnvironment: selectedSourceEnvironment,
+ targetEnvironment: null,
+ targetEnvironmentId: null,
+ targetService: null,
+ targetServiceId: null,
+ owner: null,
+ path: null,
+ region: null,
+ secretPath
+ });
+
+ setIsLoading(false);
+
+ router.push(`/integrations/${localStorage.getItem("projectData.id")}`);
+ } catch (err) {
+ console.error(err);
+ }
+ };
+
+ return integrationAuth &&
+ workspace &&
+ selectedSourceEnvironment &&
+ integrationAuthApps &&
+ targetApp ? (
+
+
+ Windmill Integration
+
+
+
+
+ setSecretPath(evt.target.value)}
+ placeholder="Provide a path, default is /"
+ />
+
+
+
+
+
+
+
+ ) : (
+
+ );
+}
+
+WindmillCreateIntegrationPage.requireAuth = true;