diff --git a/.eslintrc b/.eslintrc
new file mode 100644
index 0000000000000000000000000000000000000000..a07f74ba1ee16ed9c961ad3028fa2c644e58836d
--- /dev/null
+++ b/.eslintrc
@@ -0,0 +1,6 @@
+{
+  "extends": ["next", "next/core-web-vitals"],
+  "rules": {
+    "@next/next/no-img-element": "off"
+  }
+}
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..07f221634d9a490a30ce4c8dcf2a08cf9e60da5b
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,37 @@
+# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
+
+# dependencies
+/node_modules
+/.pnp
+.pnp.js
+
+# testing
+/coverage
+
+# next.js
+/.next/
+/out/
+
+# production
+/build
+
+# misc
+.DS_Store
+*.pem
+
+# debug
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# local env files
+.env
+.env.local
+.env.development.local
+.env.test.local
+.env.production.local
+
+# vercel
+.vercel
+
+.idea
diff --git a/.npmrc b/.npmrc
new file mode 100644
index 0000000000000000000000000000000000000000..521a9f7c0773588848ad5fa8a074ceca964a6b41
--- /dev/null
+++ b/.npmrc
@@ -0,0 +1 @@
+legacy-peer-deps=true
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..8edeb6df9e9a96d4c689857d030119e55e7218a6
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,60 @@
+FROM node:18 AS base
+
+# Install dependencies only when needed
+FROM base AS deps
+
+WORKDIR /app
+
+# Install dependencies based on the preferred package manager
+COPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml* ./
+RUN \
+  if [ -f yarn.lock ]; then yarn --frozen-lockfile; \
+  elif [ -f package-lock.json ]; then npm ci; \
+  elif [ -f pnpm-lock.yaml ]; then yarn global add pnpm && pnpm i --frozen-lockfile; \
+  else echo "Lockfile not found." && exit 1; \
+  fi
+
+# Uncomment the following lines if you want to use a secret at buildtime, 
+# for example to access your private npm packages
+# RUN --mount=type=secret,id=HF_EXAMPLE_SECRET,mode=0444,required=true \
+#     $(cat /run/secrets/HF_EXAMPLE_SECRET)
+
+# Rebuild the source code only when needed
+FROM base AS builder
+WORKDIR /app
+COPY --from=deps /app/node_modules ./node_modules
+COPY . .
+
+# Next.js collects completely anonymous telemetry data about general usage.
+# Learn more here: https://nextjs.org/telemetry
+# Uncomment the following line in case you want to disable telemetry during the build.
+# ENV NEXT_TELEMETRY_DISABLED 1
+
+# RUN yarn build
+
+# If you use yarn, comment out this line and use the line above
+RUN npm run build
+
+# Production image, copy all the files and run next
+FROM base AS runner
+WORKDIR /app
+
+ENV NODE_ENV production
+# Uncomment the following line in case you want to disable telemetry during runtime.
+# ENV NEXT_TELEMETRY_DISABLED 1
+
+RUN addgroup --system --gid 1001 nodejs
+RUN adduser --system --uid 1001 nextjs
+
+COPY --from=builder /app/public ./public
+
+# Automatically leverage output traces to reduce image size
+# https://nextjs.org/docs/advanced-features/output-file-tracing
+COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
+COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
+
+USER nextjs
+
+EXPOSE 3000
+
+ENV PORT 3000
\ No newline at end of file
diff --git a/README.md b/README.md
index 98437a41079b1962040d9eb9698d414583f5b50d..4128c29224efb8cd67111bcdb16444daaff27b97 100644
--- a/README.md
+++ b/README.md
@@ -1,10 +1,26 @@
----
-title: Open Codetree
-emoji: 💻
-colorFrom: pink
-colorTo: pink
-sdk: docker
-pinned: false
----
-
-Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
+
+  Next-gen online editor Playground, built with Next  and hosted with Vercel 
+
+
+    
+
+
+
+# Codetree : Standalone version 
+
+Codetree is a lightning fast ⚡️⚡️⚡️ code playground with automatic module detection as main feature. Unlike https://codepen.io/, Codetree is built on top of WebAssembly using esbuild, the code is compiled directly in your browser, without any backend and converted into machine language, allowing extremely fast execution and offline-mode.
+
+## Usage
+
+No need to install any npm package manually, codetree automatically detects the presence of import/require syntax in your file, downloads and installs npm package for you, for example just type `import React from "react"` for installing React library.
+
+## Features
+
+- Instant code compilation and preview (15x faster than codepen/codesanbox).
+
+- Automatic import of external library.
+
+- Auto-completion and intelliSense.
+
+- Offline mode.
diff --git a/_types/compilerTypes.ts b/_types/compilerTypes.ts
new file mode 100644
index 0000000000000000000000000000000000000000..0435b46b8806952873bd1ef9c9752ca39f891021
--- /dev/null
+++ b/_types/compilerTypes.ts
@@ -0,0 +1,9 @@
+export interface CompilerStatus {
+  isReady: boolean;
+  error: string;
+}
+
+export interface CompilerOutput {
+  code: string;
+  error: string;
+}
diff --git a/_types/editorTypes.ts b/_types/editorTypes.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e1b588bf2de47924a2e51a0fd150315114af708b
--- /dev/null
+++ b/_types/editorTypes.ts
@@ -0,0 +1,23 @@
+export interface LanguagePropsInterface {
+  title: string;
+  entryPoints: string;
+  monacoLanguage: string;
+  data: string;
+}
+
+export interface IObjectKeys {
+  [key: string]: LanguagePropsInterface;
+}
+
+export interface LanguagesInterface extends IObjectKeys {
+  javascript: LanguagePropsInterface;
+  css: LanguagePropsInterface;
+  html: LanguagePropsInterface;
+}
+
+export interface EditorValueInterface {
+  name: string;
+  description: string;
+  public: boolean;
+  tabs: LanguagesInterface;
+}
diff --git a/additional.d.ts b/additional.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8aaad0456d413f0c7ea25f5d5cf6cca5c6694fc2
--- /dev/null
+++ b/additional.d.ts
@@ -0,0 +1,21 @@
+import "iron-session";
+import { User } from "./graphql/generated/graphql";
+import { OauthInput, OauthProvider } from "./store/features/authSlice";
+
+declare global {
+  interface Window {
+    withOauth: (input: OauthInput, provider: OauthProvider) => void;
+  }
+}
+
+declare module "iron-session" {
+  interface IronSessionData {
+    user?: {
+      message?: string;
+      token?: string | null;
+      status: boolean;
+      data: User;
+      isLoggedIn?: boolean;
+    };
+  }
+}
diff --git a/codegen.yml b/codegen.yml
new file mode 100644
index 0000000000000000000000000000000000000000..95a4532a1c8de232986b0d16ee5f47302df65829
--- /dev/null
+++ b/codegen.yml
@@ -0,0 +1,12 @@
+overwrite: true
+schema: "http://localhost:4000/graphql"
+documents: null
+generates:
+  graphql/generated/graphql.d.ts:
+    plugins:
+      - "typescript"
+      - "typescript-operations"
+      - "typescript-react-apollo"
+  ./graphql.schema.json:
+    plugins:
+      - "introspection"
diff --git a/components/Avatar.tsx b/components/Avatar.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..d0e72360294547b486c716ce2075f8d7b533b70e
--- /dev/null
+++ b/components/Avatar.tsx
@@ -0,0 +1,57 @@
+import Image from "next/image";
+import React from "react";
+
+interface AvatarProps {
+  image?: string;
+  username?: string;
+  size?: number;
+  gradient?: boolean;
+  className?: string;
+  placeholderType?: "blur" | "empty" | undefined;
+}
+
+export const Avatar = ({
+  image,
+  username,
+  size = 45,
+  gradient,
+  className,
+  placeholderType = "blur",
+}: AvatarProps) => {
+  if (image)
+    return (
+      
+    );
+
+  return (
+    
+      
+        {username?.charAt(0).toUpperCase()}
+      
+    
+      
+        
+          {trigger}
+        
+
+        
+          {children}
+         
+       
+    
+      
+        
+          
+             
+          
+             
+         
+         
+    
 e.stopPropagation()}
+    >
+      
+        
+
+        
+          
 {
+              nativePopup({
+                pageURL: getGoogleOAuthURL(),
+                pageTitle: "Codetree authentication",
+                popupWinWidth: 490,
+                popupWinHeight: 600,
+              });
+
+              dispatch(close_modal());
+            }}
+            className="px-5 border border-gray-400 flex gap-x-5 items-center justify-center w-80 h-12 rounded-xl text-gray-300"
+          >
+            Sign in with google
+           
+
+          
 {
+              nativePopup({
+                pageURL: getGithubOAuthURL(),
+                pageTitle: "Codetree authentication",
+                popupWinWidth: 490,
+                popupWinHeight: 600,
+              });
+
+              dispatch(close_modal());
+            }}
+            className="px-5 border border-gray-400  flex gap-x-5 items-center justify-center w-80 h-12 rounded-xl text-gray-300"
+          >
+            Sign in with github
+           
+        
+      
 
+  );
+};
+
+export default AuthModal;
diff --git a/components/Modals/RootModal.tsx b/components/Modals/RootModal.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..4010e1c7db4ecffa3fc0916672dde3e9b7963867
--- /dev/null
+++ b/components/Modals/RootModal.tsx
@@ -0,0 +1,47 @@
+import React from "react";
+import { motion, AnimatePresence } from "framer-motion";
+
+import { useAppDispatch, useAppSelector } from "../../store/hook";
+import {
+  modal_state,
+  close_modal,
+  ModalEnum,
+} from "../../store/features/modalSlice";
+
+import AuthModal from "./AuthModal";
+import TemplateModal from "./TemplateModal";
+import SettingsModal from "./SettingsModal";
+
+export const RootModal = () => {
+  const { type, visible } = useAppSelector(modal_state);
+  const dispatch = useAppDispatch();
+
+  const renderModal = (type: ModalEnum) => {
+    switch (type) {
+      case ModalEnum.AUTH:
+        return 
;
+    }
+  };
+
+  return (
+     null}>
+      {visible && (
+         dispatch(close_modal())}
+        >
+          {renderModal(type)}
+         
+      )}
+     
+  );
+};
diff --git a/components/Modals/SettingsModal.tsx b/components/Modals/SettingsModal.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..91a8878e49b41ad695a1ecf704df407adfce08b9
--- /dev/null
+++ b/components/Modals/SettingsModal.tsx
@@ -0,0 +1,196 @@
+import React from "react";
+import { motion } from "framer-motion";
+import { useForm } from "react-hook-form";
+import { useAppDispatch, useAppSelector } from "../../store/hook";
+import { editor_state, set_options } from "../../store/features/editorSlice";
+import { modalVariant } from "./config";
+import { theme_state } from "../../store/features/themeSlice";
+
+const SettingsModal = () => {
+  const dispatch = useAppDispatch();
+  const { options } = useAppSelector(editor_state);
+  const { theme } = useAppSelector(theme_state);
+
+  const { register, handleSubmit } = useForm();
+
+  const onChangeOptions = ({
+    fontSize,
+    fontWeight,
+    minimapEnabled,
+    minimapScale,
+    wordWrap,
+    autoClosingBrackets,
+  }: any) => {
+    const custom = {
+      fontSize: parseInt(fontSize),
+      fontWeight: fontWeight,
+      minimap: {
+        enabled: minimapEnabled,
+        scale: parseInt(minimapScale),
+      },
+      wordWrap: wordWrap,
+      autoClosingBrackets: { autoClosingBrackets },
+      showUnused: true,
+      automaticLayout: true,
+      tabSize: 2,
+      renderLineHighlight: "none",
+      scrollbar: { verticalScrollbarSize: 10, verticalSliderSize: 10 },
+    };
+
+    dispatch(set_options(custom));
+  };
+
+  return (
+     e.stopPropagation()}
+    >
+      
+        
 Settings 
+      
+
+      
+     
+  );
+};
+
+export default SettingsModal;
diff --git a/components/Modals/TemplateModal.tsx b/components/Modals/TemplateModal.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..ba3248be01c4384ffdb22e1e9eebc9009bc5da65
--- /dev/null
+++ b/components/Modals/TemplateModal.tsx
@@ -0,0 +1,65 @@
+import { motion } from "framer-motion";
+import { useTree } from "../../hooks";
+import { treeTemplates } from "../../constants";
+import { useAppSelector } from "../../store/hook";
+import { theme_state } from "../../store/features/themeSlice";
+import { compiler_state } from "../../store/features/compilerSlice";
+import { TemplateSelectionSkeleton } from "../Skeleton/TemplateSelectionSkeleton";
+import { modalVariant } from "./config";
+
+const TemplateModal = () => {
+  const { theme } = useAppSelector(theme_state);
+  const { esbuildStatus } = useAppSelector(compiler_state);
+  const { setTree } = useTree();
+
+  let arr = [];
+
+  for (const item of Object.entries(treeTemplates)) {
+    arr.push(item);
+  }
+
+  const templates = arr.map((template, key) => (
+     setTree(template[1])}
+      className="p-2 rounded-sm"
+    >
+      
+        
+        
+          
{template[1].name}
+          
{template[1].description}
+        
+      
 
+  ));
+
+  return (
+     e.stopPropagation()}
+    >
+      
+        
Templates 
+      
+      
+        {esbuildStatus.isReady ? templates : 
+     
+  );
+};
+
+export default TemplateModal;
diff --git a/components/Modals/config.ts b/components/Modals/config.ts
new file mode 100644
index 0000000000000000000000000000000000000000..18391c22ae517ea11993c64a56f4fa15bbe6d0d8
--- /dev/null
+++ b/components/Modals/config.ts
@@ -0,0 +1,7 @@
+import { Variants } from "framer-motion";
+
+export const modalVariant: Variants = {
+  initial: { scale: 0.95, opacity: 0 },
+  animate: { scale: 1, opacity: 1 },
+  exit: { scale: 0.98, opacity: 0 },
+};
diff --git a/components/Playground/ConsoleLog.tsx b/components/Playground/ConsoleLog.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..7591d843c3643fa0ac98c079bef779adfd0f6b68
--- /dev/null
+++ b/components/Playground/ConsoleLog.tsx
@@ -0,0 +1,47 @@
+import React from "react";
+import dynamic from "next/dynamic";
+import { useAppDispatch, useAppSelector } from "../../store/hook";
+import { clear_logs } from "../../store/features/editorSlice";
+
+import { theme_state } from "../../store/features/themeSlice";
+
+const Console = dynamic(import("console-feed/lib/Component"), { ssr: false });
+
+interface LogsProps {
+  logs: any;
+}
+
+const Logs = ({ logs }: LogsProps) => {
+  const { theme } = useAppSelector(theme_state);
+  const dispatch = useAppDispatch();
+
+  return (
+    
+      
+         dispatch(clear_logs())}
+          className="editor-button h-5 mr-3"
+        >
+          Clear
+         
+      
+
+      
+        
+    
+      
+        {isCompiling && (
+          
+            
+        )}
+      
+
+      
+        
 dispatch(toggle_logs_tab())}
+          className="flex items-center cursor-pointer text-gray-400"
+        >
+          
+
+        
+          {logs.length > 0 && (
+            
+          )}
+        
+      
+    
+      
+         dispatch(open_modal(ModalEnum.TEMPLATE))}
+        />
+         dispatch(open_modal(ModalEnum.SETTINGS))}
+        />
+        
+    
();
+  const dispatch = useAppDispatch();
+
+  const htmlFrameContent = createIframeContent(tabs.css?.data, tabs.html?.data);
+
+  //=== incoming message
+  useEffect(() => {
+    window.onmessage = function (response: MessageEvent) {
+      if (response.data && response.data.source === "iframe") {
+        let errorObject = {
+          method: "error",
+          id: Date.now(),
+          data: [`${response.data.message}`],
+        };
+        dispatch(update_logs(errorObject));
+      }
+    };
+
+    if (tabs.javascript && esbuildStatus.isReady) {
+      setTimeout(async () => {
+        dispatch(
+          getCompileCode(tabs.javascript.data, tabs.javascript.entryPoints)
+        );
+      }, 50);
+    }
+  }, [dispatch, tabs, esbuildStatus.isReady]);
+
+  //=== outgoing massage
+  useEffect(() => {
+    iframe.current.srcdoc = htmlFrameContent;
+
+    setTimeout(async () => {
+      iframe?.current?.contentWindow?.postMessage(output.code, "*");
+    }, 40);
+  }, [htmlFrameContent, output]);
+
+  return (
+    
+      {/* build error */}
+      {output.error ? 
 : ""}
+
+      {/* Loading screen */}
+      {isCompiling ? (
+        
+          
+      ) : (
+        ""
+      )}
+
+      
+      {err}
+    
+  );
+};
diff --git a/components/Playground/IframeLoaderScreen.tsx b/components/Playground/IframeLoaderScreen.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..2c16de20765f0aa8222802faea93b57afcd20d18
--- /dev/null
+++ b/components/Playground/IframeLoaderScreen.tsx
@@ -0,0 +1,32 @@
+import React from "react";
+
+export const IframeLoaderScreen = () => {
+  return (
+    
+  );
+};
diff --git a/components/Playground/InputCodeTab.tsx b/components/Playground/InputCodeTab.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..63e5d188734c61013a60502e1bab9b08bde2da8f
--- /dev/null
+++ b/components/Playground/InputCodeTab.tsx
@@ -0,0 +1,36 @@
+import React, { useEffect, useState } from "react";
+import Tabs, { TabPane } from "rc-tabs";
+import { Monaco } from "./Monaco";
+import { EditorValueInterface } from "../../_types/editorTypes";
+
+const InputCode = ({ editorValue: parentEditorValue }: { editorValue: EditorValueInterface }) => {
+  const [editorValue, setEditorValue] = useState(parentEditorValue);
+  
+  // Update local state when parent state updates
+  useEffect(() => {
+    setEditorValue(parentEditorValue);
+  }, [parentEditorValue]);
+
+  const dataToMap = Object.entries(editorValue.tabs);
+
+  const tabPane = dataToMap.map((item, key) => (
+    {item[1].title}} key={key}>
+       
+  ));
+
+  return (
+    
+      {tabPane}
+     
+  );
+};
+
+const InputCodeTab = React.memo(InputCode);
+
+export default InputCodeTab;
diff --git a/components/Playground/Monaco.tsx b/components/Playground/Monaco.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..a6298a35b1c65fa0e15724172ca724211cdbb30c
--- /dev/null
+++ b/components/Playground/Monaco.tsx
@@ -0,0 +1,34 @@
+import React, { useEffect } from "react";
+import MonacoEditor from "@monaco-editor/react";
+import { useMonaco } from "../../hooks";
+import { useAppDispatch, useAppSelector } from "../../store/hook";
+import {
+  editor_state,
+  update_editor_code,
+} from "../../store/features/editorSlice";
+
+type MonacoType = { monacoLanguage: string | undefined; tab: string };
+
+export const Monaco = ({ monacoLanguage, tab }: MonacoType) => {
+  const dispatch = useAppDispatch();
+  const { monacoInputValue, options } = useAppSelector(editor_state);
+  const { onChange, onMount, code } = useMonaco();
+
+  useEffect(() => {
+    if (code && code?.length >= 1)
+      dispatch(update_editor_code({ type: tab, content: code }));
+  }, [code, dispatch, tab]);
+
+  return (
+    
+      
+        {panelA} 
+
+        
+          
+            {panelB}
+           
+
+          
+            {panelC}
+           
+         
+       
+    
(null);
+  const inputRef = useRef(null);
+  const { theme } = useAppSelector(theme_state);
+  const { esbuildStatus, isCompiling, output } = useAppSelector(compiler_state);
+  const { logs, editorValue, isLogTabOpen } = useAppSelector(editor_state);
+  const [markdownCode, setMarkdownCode] = useState('');
+  const [prevMarkdownCode, setPrevMarkdownCode] = useState(markdownCode);
+
+  const isValidCodeBlock = (markdownCode: string) => {
+    return markdownCode && markdownCode.length > 10 && markdownCode.includes('\n');
+  }
+
+  useEffect(() => {
+    const timer = setInterval(() => {
+      if (isValidCodeBlock(markdownCode) && markdownCode !== prevMarkdownCode) {
+        dispatch(update_editor_code({ type: 'javascript', content: markdownCode }));
+        setPrevMarkdownCode(markdownCode);
+      }
+    }, 2000);
+
+    return () => {
+      clearInterval(timer);
+    };
+  }, [markdownCode, prevMarkdownCode, dispatch]);
+
+
+  const { messages, input, setInput, handleSubmit } = useChat({
+    onError: (error) => {
+      console.error(error);
+    },
+  });
+
+  useEffect(() => {
+    if (!esbuildStatus.isReady) {
+      dispatch(initEsbuild());
+    }
+  }, [dispatch, esbuildStatus]);
+
+  useEffect(() => {
+    dispatch(open_modal(ModalEnum.TEMPLATE));
+  }, [dispatch]);
+
+  useEffect(() => {
+    if(isValidCodeBlock(markdownCode)) {
+      const newEditorValue = {
+        name: "React",
+        description: "By codetree",
+        public: true,
+        iconSrc: "/icons/reactjs.svg",
+        tabs: {
+          javascript: {
+            title: "JS/JSX",
+            entryPoints: "index.js",
+            monacoLanguage: "javascript",
+            data: markdownCode
+          },
+          html: {
+            title: "index.html",
+            entryPoints: "index.html",
+            monacoLanguage: "html",
+            data: ""
+          },
+          css: {
+            title: "main.css",
+            entryPoints: "main.css",
+            monacoLanguage: "css",
+            data: ""
+          }
+        }
+      };
+      
+      dispatch(set_monaco_input_value(newEditorValue as any));
+    }
+  }, [markdownCode, dispatch]);
+
+  return (
+    
+      
+        
+          
+        
+        
+          {messages?.map((message, index) => (
+            
+               (
+                     
+            
+          ))}
+        
+      
+      
}
+        panelB={
+          
+        }
+        panelC={
}
+        lastPanelVisibility={isLogTabOpen}
+      />
+
+      
+    
+       
+  );
+};
\ No newline at end of file
diff --git a/constants/index.ts b/constants/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..04f4ffcbc5e295cbf4df747206d5e020bc8c9009
--- /dev/null
+++ b/constants/index.ts
@@ -0,0 +1,2 @@
+export * from "./templates";
+export * from "./monacoOptions";
diff --git a/constants/monacoOptions.ts b/constants/monacoOptions.ts
new file mode 100644
index 0000000000000000000000000000000000000000..7d2579f80f1db4729658e902b7f6fc9e1514aba5
--- /dev/null
+++ b/constants/monacoOptions.ts
@@ -0,0 +1,16 @@
+import { editor } from "monaco-editor";
+
+export const monacoOptions: editor.IStandaloneEditorConstructionOptions = {
+  fontSize: 12,
+  fontWeight: "500",
+  minimap: {
+    enabled: false,
+  },
+  wordWrap: "on",
+  autoClosingBrackets: "always",
+  showUnused: true,
+  automaticLayout: true,
+  tabSize: 2,
+  renderLineHighlight: "none",
+  scrollbar: { verticalScrollbarSize: 10, verticalSliderSize: 10 },
+};
diff --git a/constants/templates.ts b/constants/templates.ts
new file mode 100644
index 0000000000000000000000000000000000000000..da6a9901c2dcd50742a24ac2bb62b65d356e9fa0
--- /dev/null
+++ b/constants/templates.ts
@@ -0,0 +1,271 @@
+export const treeTemplates = {
+  _empty: {
+    name: "Empty",
+    description: "By codetree",
+    public: true,
+    iconSrc: "/icons/vanilla.svg",
+    tabs: {
+      javascript: {
+        title: "app.jsx",
+        entryPoints: "index.js",
+        monacoLanguage: "javascript",
+        data: ``,
+      },
+      html: {
+        title: "index.html",
+        entryPoints: "index.html",
+        monacoLanguage: "html",
+        data: ``,
+      },
+      css: {
+        title: "main.css",
+        entryPoints: "main.css",
+        monacoLanguage: "css",
+        data: ``,
+      },
+    },
+  },
+  _vanilla: {
+    name: "Vanilla",
+    description: "By codetree",
+    public: true,
+    iconSrc: "/icons/vanilla.svg",
+    tabs: {
+      javascript: {
+        title: "JS/JSX",
+        entryPoints: "index.js",
+        monacoLanguage: "javascript",
+        data: `document.getElementById("app").innerHTML = \`
+Vanilla 
+
+  Bare minimal javascript template
+
+\`;
+`,
+      },
+      html: {
+        title: "html",
+        entryPoints: "index.html",
+        monacoLanguage: "html",
+        data: `
`,
+      },
+      css: {
+        title: "Css",
+        entryPoints: "main.css",
+        monacoLanguage: "css",
+        data: `body {
+  font-family: sans-serif;
+}
+
+#app {
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+}
+`,
+      },
+    },
+  },
+  _typescript: {
+    name: "Typescript",
+    description: "By codetree",
+    public: true,
+    iconSrc: "/icons/typescript.svg",
+    tabs: {
+      javascript: {
+        title: "Ts/Tsx",
+        entryPoints: "index.ts",
+        monacoLanguage: "typescript",
+        data: `function add(x: number, y: number): number {
+  return x + y;
+}
+
+const result = add(2,5)
+
+console.log(result)`,
+      },
+      html: {
+        title: "Html",
+        entryPoints: "index.html",
+        monacoLanguage: "html",
+        data: `
+  
Typescript 
+  
Bare minimal Typescript template 🚀
+
+      
Hello ReactTree 
+      You clicked {count} times! 
+
+       setCount(count - 1)}>Decrement 
+       setCount(count + 1)}>Increment 
+    
+  );
+}
+
+const rootElement = document.getElementById("root");
+ReactDOM.render(
+  
Codetree
+   `,
+      },
+      css: {
+        title: "Css",
+        entryPoints: "main.css",
+        monacoLanguage: "css",
+        data: `body {
+  background-color: #1d1d1d;
+  margin: 0;
+  padding: 0;
+}
+
+.wrapper {
+  display: flex;
+  height: 100vh;
+  justify-content: center;
+  align-items: center;
+}
+
+h1 {
+  max-width: 75%;
+  font-size: 100px;
+  text-align: center;
+  font-family: "Montserrat", sans-serif;
+  color: #540032;
+}
+
+.title {
+  background-image: url(https://cdn.pixabay.com/photo/2017/07/03/20/17/abstract-2468874_960_720.jpg);
+  background-attachment: fixed;
+  -webkit-text-fill-color: transparent;
+  -webkit-background-clip: text;
+}`,
+      },
+    },
+  },
+};
diff --git a/editor.d.ts b/editor.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..7dc3e2b41ff335e3b42a3dba5c5deb521efea79a
--- /dev/null
+++ b/editor.d.ts
@@ -0,0 +1,2 @@
+declare module "react-split";
+declare module "monaco-jsx-highlighter";
diff --git a/esbuild/plugins/index.ts b/esbuild/plugins/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..19bcc3b4a5c95c8bb443f0455accacb4ccbca918
--- /dev/null
+++ b/esbuild/plugins/index.ts
@@ -0,0 +1,2 @@
+export * from "./unpkg-fecth-plugin";
+export * from "./unpkg-path-plugin";
diff --git a/esbuild/plugins/unpkg-fecth-plugin.ts b/esbuild/plugins/unpkg-fecth-plugin.ts
new file mode 100644
index 0000000000000000000000000000000000000000..863547bbf43b78c0834ebdf3c84ad75c99f6959f
--- /dev/null
+++ b/esbuild/plugins/unpkg-fecth-plugin.ts
@@ -0,0 +1,85 @@
+import * as esbuild from "esbuild-wasm";
+import axios from "axios";
+import localForage from "localforage";
+
+const fileCache = localForage.createInstance({
+  name: "fileCache",
+});
+
+export const unpkgFetchPlugin = (
+  inputCode: string | undefined,
+  entryPoint: string
+): esbuild.Plugin => {
+  return {
+    name: "unpkg-fetch-plugin",
+    setup(build: esbuild.PluginBuild) {
+      //match entrypoint
+      if (entryPoint === "index.ts") {
+        build.onLoad({ filter: /(^index\.ts$)/ }, () => {
+          return {
+            loader: "tsx",
+            contents: inputCode,
+          };
+        });
+      } else {
+        build.onLoad({ filter: /(^index\.js$)/ }, () => {
+          return {
+            loader: "jsx",
+            contents: inputCode,
+          };
+        });
+      }
+
+      build.onLoad({ filter: /.*/ }, async (args: esbuild.OnLoadArgs) => {
+        const cacheResult = await fileCache.getItem(
+          args.path
+        );
+        if (cacheResult) {
+          return cacheResult;
+        }
+      });
+
+      //match css file
+      build.onLoad({ filter: /.css$/ }, async (args: esbuild.OnLoadArgs) => {
+        const { data, request } = await axios.get(args.path);
+
+        const escapedData = data
+          .replace(/\n/g, "")
+          .replace(/"/g, '\\"')
+          .replace(/'/g, "\\'");
+
+        const contents = `const style = document.createElement("style");
+               style.innerText = '${escapedData}';
+               document.head.appendChild(style);`;
+
+        const result: esbuild.OnLoadResult = {
+          loader: "jsx",
+          contents,
+          //specify the place where the content was found
+          resolveDir: new URL("./", request.responseURL).pathname,
+        };
+        //store response in cache
+        await fileCache.setItem(args.path, result);
+        return result;
+      });
+
+      //=================================================
+
+      build.onLoad({ filter: /.*/ }, async (args: esbuild.OnLoadArgs) => {
+        console.log(`...fetching ${args.path}`);
+        const { data, request } = await axios.get(args.path);
+
+        const result: esbuild.OnLoadResult = {
+          loader: "jsx",
+          contents: data,
+          //specify the place where the content was found
+          resolveDir: new URL("./", request.responseURL).pathname,
+        };
+        //store response in cache
+        await fileCache.setItem(args.path, result);
+        console.log("end of fetching");
+        return result;
+      });
+    },
+  };
+};
diff --git a/esbuild/plugins/unpkg-path-plugin.ts b/esbuild/plugins/unpkg-path-plugin.ts
new file mode 100644
index 0000000000000000000000000000000000000000..84b62b8e9846956f2cbd8050aebdb88d2b01f14d
--- /dev/null
+++ b/esbuild/plugins/unpkg-path-plugin.ts
@@ -0,0 +1,31 @@
+import * as esbuild from "esbuild-wasm";
+
+export const unpkgPathPlugin = (): esbuild.Plugin => {
+  return {
+    name: "unpkg-path-plugin",
+    setup(build: esbuild.PluginBuild) {
+      //
+      build.onResolve({ filter: /.*/ }, (args) => {
+        if (args.kind === "entry-point") {
+          return { path: args.path, namespace: "a" };
+        }
+      });
+
+      //match relative path in a module "./" or "../"
+      build.onResolve({ filter: /^\.+\// }, (args: esbuild.OnResolveArgs) => {
+        return {
+          namespace: "a",
+          path: new URL(args.path, `https://unpkg.com${args.resolveDir}/`).href,
+        };
+      });
+
+      //match main file in a module
+      build.onResolve({ filter: /.*/ }, async (args: esbuild.OnResolveArgs) => {
+        return {
+          namespace: "a",
+          path: `https://unpkg.com/${args.path}`,
+        };
+      });
+    },
+  };
+};
diff --git a/graphql.schema.json b/graphql.schema.json
new file mode 100644
index 0000000000000000000000000000000000000000..e72c2025db920b7c2a2c5cf96dbe6bac56661c50
--- /dev/null
+++ b/graphql.schema.json
@@ -0,0 +1,5321 @@
+{
+  "__schema": {
+    "queryType": {
+      "name": "Query"
+    },
+    "mutationType": {
+      "name": "Mutation"
+    },
+    "subscriptionType": {
+      "name": "Subscription"
+    },
+    "types": [
+      {
+        "kind": "OBJECT",
+        "name": "Account",
+        "description": null,
+        "fields": [
+          {
+            "name": "createdAt",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "DateTime",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "email",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "id",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "token",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "updatedAt",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "DateTime",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "AuthResponse",
+        "description": null,
+        "fields": [
+          {
+            "name": "data",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "OBJECT",
+              "name": "User",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "exp",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "DateTime",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "message",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "status",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "Boolean",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "token",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [
+          {
+            "kind": "INTERFACE",
+            "name": "Response",
+            "ofType": null
+          }
+        ],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "SCALAR",
+        "name": "Boolean",
+        "description": "The `Boolean` scalar type represents `true` or `false`.",
+        "fields": null,
+        "inputFields": null,
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "Comment",
+        "description": null,
+        "fields": [
+          {
+            "name": "author",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "OBJECT",
+              "name": "User",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "authorId",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "createdAt",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "DateTime",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "id",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "Int",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "message",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "parentId",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "Int",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "project",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "OBJECT",
+              "name": "Project",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "projectId",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "updatedAt",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "DateTime",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "CommentResponse",
+        "description": null,
+        "fields": [
+          {
+            "name": "data",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "OBJECT",
+              "name": "Comment",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "message",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "status",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "Boolean",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [
+          {
+            "kind": "INTERFACE",
+            "name": "Response",
+            "ofType": null
+          }
+        ],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "CommentSubscriptionResponse",
+        "description": null,
+        "fields": [
+          {
+            "name": "data",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "OBJECT",
+              "name": "Notification",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "message",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "type",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "ENUM",
+              "name": "PushNotificationType",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "INPUT_OBJECT",
+        "name": "CommentsInput",
+        "description": null,
+        "fields": null,
+        "inputFields": [
+          {
+            "name": "projectId",
+            "description": null,
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "CommentsResponse",
+        "description": null,
+        "fields": [
+          {
+            "name": "data",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "OBJECT",
+                "name": "Comment",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "message",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "status",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "Boolean",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [
+          {
+            "kind": "INTERFACE",
+            "name": "Response",
+            "ofType": null
+          }
+        ],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "INPUT_OBJECT",
+        "name": "CreateCommentInput",
+        "description": null,
+        "fields": null,
+        "inputFields": [
+          {
+            "name": "mentions",
+            "description": null,
+            "type": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "INPUT_OBJECT",
+                "name": "MentionsInput",
+                "ofType": null
+              }
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "message",
+            "description": null,
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "parentId",
+            "description": null,
+            "type": {
+              "kind": "SCALAR",
+              "name": "Int",
+              "ofType": null
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "projectId",
+            "description": null,
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "INPUT_OBJECT",
+        "name": "CreatePageViewInput",
+        "description": null,
+        "fields": null,
+        "inputFields": [
+          {
+            "name": "ip",
+            "description": null,
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "INPUT_OBJECT",
+        "name": "CreateProjectInput",
+        "description": null,
+        "fields": null,
+        "inputFields": [
+          {
+            "name": "content",
+            "description": null,
+            "type": {
+              "kind": "SCALAR",
+              "name": "JSON",
+              "ofType": null
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "description",
+            "description": null,
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "file",
+            "description": null,
+            "type": {
+              "kind": "SCALAR",
+              "name": "Upload",
+              "ofType": null
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "tags",
+            "description": null,
+            "type": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "INPUT_OBJECT",
+                "name": "TagInput",
+                "ofType": null
+              }
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "title",
+            "description": null,
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "SCALAR",
+        "name": "DateTime",
+        "description": null,
+        "fields": null,
+        "inputFields": null,
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "INPUT_OBJECT",
+        "name": "DeleteCommentInput",
+        "description": null,
+        "fields": null,
+        "inputFields": [
+          {
+            "name": "commentId",
+            "description": null,
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "Int",
+                "ofType": null
+              }
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "INPUT_OBJECT",
+        "name": "DeleteProjectInput",
+        "description": null,
+        "fields": null,
+        "inputFields": [
+          {
+            "name": "projectId",
+            "description": null,
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "INPUT_OBJECT",
+        "name": "GithubAuthInput",
+        "description": null,
+        "fields": null,
+        "inputFields": [
+          {
+            "name": "code",
+            "description": null,
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "INPUT_OBJECT",
+        "name": "GoogleAuthInput",
+        "description": null,
+        "fields": null,
+        "inputFields": [
+          {
+            "name": "authuser",
+            "description": null,
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "code",
+            "description": null,
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "prompt",
+            "description": null,
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "scope",
+            "description": null,
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "SCALAR",
+        "name": "Int",
+        "description": "The `Int` scalar type represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1.",
+        "fields": null,
+        "inputFields": null,
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "SCALAR",
+        "name": "JSON",
+        "description": null,
+        "fields": null,
+        "inputFields": null,
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "INPUT_OBJECT",
+        "name": "MentionsInput",
+        "description": null,
+        "fields": null,
+        "inputFields": [
+          {
+            "name": "email",
+            "description": null,
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "userId",
+            "description": null,
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "Mutation",
+        "description": null,
+        "fields": [
+          {
+            "name": "createComment",
+            "description": null,
+            "args": [
+              {
+                "name": "input",
+                "description": null,
+                "type": {
+                  "kind": "NON_NULL",
+                  "name": null,
+                  "ofType": {
+                    "kind": "INPUT_OBJECT",
+                    "name": "CreateCommentInput",
+                    "ofType": null
+                  }
+                },
+                "defaultValue": null,
+                "isDeprecated": false,
+                "deprecationReason": null
+              }
+            ],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "OBJECT",
+                "name": "CommentResponse",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "createProject",
+            "description": null,
+            "args": [
+              {
+                "name": "input",
+                "description": null,
+                "type": {
+                  "kind": "NON_NULL",
+                  "name": null,
+                  "ofType": {
+                    "kind": "INPUT_OBJECT",
+                    "name": "CreateProjectInput",
+                    "ofType": null
+                  }
+                },
+                "defaultValue": null,
+                "isDeprecated": false,
+                "deprecationReason": null
+              }
+            ],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "OBJECT",
+                "name": "ProjectResponse",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "deleteComment",
+            "description": null,
+            "args": [
+              {
+                "name": "input",
+                "description": null,
+                "type": {
+                  "kind": "NON_NULL",
+                  "name": null,
+                  "ofType": {
+                    "kind": "INPUT_OBJECT",
+                    "name": "DeleteCommentInput",
+                    "ofType": null
+                  }
+                },
+                "defaultValue": null,
+                "isDeprecated": false,
+                "deprecationReason": null
+              }
+            ],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "OBJECT",
+                "name": "CommentResponse",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "deleteProject",
+            "description": null,
+            "args": [
+              {
+                "name": "input",
+                "description": null,
+                "type": {
+                  "kind": "NON_NULL",
+                  "name": null,
+                  "ofType": {
+                    "kind": "INPUT_OBJECT",
+                    "name": "DeleteProjectInput",
+                    "ofType": null
+                  }
+                },
+                "defaultValue": null,
+                "isDeprecated": false,
+                "deprecationReason": null
+              }
+            ],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "OBJECT",
+                "name": "ProjectResponse",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "forgotPassword",
+            "description": null,
+            "args": [
+              {
+                "name": "input",
+                "description": null,
+                "type": {
+                  "kind": "NON_NULL",
+                  "name": null,
+                  "ofType": {
+                    "kind": "INPUT_OBJECT",
+                    "name": "UserForgotPasswordInput",
+                    "ofType": null
+                  }
+                },
+                "defaultValue": null,
+                "isDeprecated": false,
+                "deprecationReason": null
+              }
+            ],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "OBJECT",
+                "name": "SimpleAuthResponse",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "githubOauth",
+            "description": null,
+            "args": [
+              {
+                "name": "input",
+                "description": null,
+                "type": {
+                  "kind": "NON_NULL",
+                  "name": null,
+                  "ofType": {
+                    "kind": "INPUT_OBJECT",
+                    "name": "GithubAuthInput",
+                    "ofType": null
+                  }
+                },
+                "defaultValue": null,
+                "isDeprecated": false,
+                "deprecationReason": null
+              }
+            ],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "OBJECT",
+                "name": "AuthResponse",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "googleOauth",
+            "description": null,
+            "args": [
+              {
+                "name": "input",
+                "description": null,
+                "type": {
+                  "kind": "NON_NULL",
+                  "name": null,
+                  "ofType": {
+                    "kind": "INPUT_OBJECT",
+                    "name": "GoogleAuthInput",
+                    "ofType": null
+                  }
+                },
+                "defaultValue": null,
+                "isDeprecated": false,
+                "deprecationReason": null
+              }
+            ],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "OBJECT",
+                "name": "AuthResponse",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "login",
+            "description": null,
+            "args": [
+              {
+                "name": "input",
+                "description": null,
+                "type": {
+                  "kind": "NON_NULL",
+                  "name": null,
+                  "ofType": {
+                    "kind": "INPUT_OBJECT",
+                    "name": "UserLoginInput",
+                    "ofType": null
+                  }
+                },
+                "defaultValue": null,
+                "isDeprecated": false,
+                "deprecationReason": null
+              }
+            ],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "OBJECT",
+                "name": "AuthResponse",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "register",
+            "description": null,
+            "args": [
+              {
+                "name": "input",
+                "description": null,
+                "type": {
+                  "kind": "NON_NULL",
+                  "name": null,
+                  "ofType": {
+                    "kind": "INPUT_OBJECT",
+                    "name": "UserRegisterInput",
+                    "ofType": null
+                  }
+                },
+                "defaultValue": null,
+                "isDeprecated": false,
+                "deprecationReason": null
+              }
+            ],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "OBJECT",
+                "name": "AuthResponse",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "resetPassword",
+            "description": null,
+            "args": [
+              {
+                "name": "input",
+                "description": null,
+                "type": {
+                  "kind": "NON_NULL",
+                  "name": null,
+                  "ofType": {
+                    "kind": "INPUT_OBJECT",
+                    "name": "UserResetPasswordInput",
+                    "ofType": null
+                  }
+                },
+                "defaultValue": null,
+                "isDeprecated": false,
+                "deprecationReason": null
+              }
+            ],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "OBJECT",
+                "name": "ResetPasswordResponse",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "toggleVote",
+            "description": null,
+            "args": [
+              {
+                "name": "input",
+                "description": null,
+                "type": {
+                  "kind": "INPUT_OBJECT",
+                  "name": "ToggleVoteInput",
+                  "ofType": null
+                },
+                "defaultValue": null,
+                "isDeprecated": false,
+                "deprecationReason": null
+              }
+            ],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "OBJECT",
+                "name": "VoteResponse",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "updateComment",
+            "description": null,
+            "args": [
+              {
+                "name": "input",
+                "description": null,
+                "type": {
+                  "kind": "NON_NULL",
+                  "name": null,
+                  "ofType": {
+                    "kind": "INPUT_OBJECT",
+                    "name": "UpdateCommentInput",
+                    "ofType": null
+                  }
+                },
+                "defaultValue": null,
+                "isDeprecated": false,
+                "deprecationReason": null
+              }
+            ],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "OBJECT",
+                "name": "CommentResponse",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "updateProfile",
+            "description": null,
+            "args": [
+              {
+                "name": "input",
+                "description": null,
+                "type": {
+                  "kind": "INPUT_OBJECT",
+                  "name": "UpdateProfileInput",
+                  "ofType": null
+                },
+                "defaultValue": null,
+                "isDeprecated": false,
+                "deprecationReason": null
+              }
+            ],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "OBJECT",
+                "name": "UserResponse",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "updateProject",
+            "description": null,
+            "args": [
+              {
+                "name": "input",
+                "description": null,
+                "type": {
+                  "kind": "NON_NULL",
+                  "name": null,
+                  "ofType": {
+                    "kind": "INPUT_OBJECT",
+                    "name": "UpdateProjectInput",
+                    "ofType": null
+                  }
+                },
+                "defaultValue": null,
+                "isDeprecated": false,
+                "deprecationReason": null
+              }
+            ],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "OBJECT",
+                "name": "ProjectResponse",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "uploadFile",
+            "description": null,
+            "args": [
+              {
+                "name": "input",
+                "description": null,
+                "type": {
+                  "kind": "NON_NULL",
+                  "name": null,
+                  "ofType": {
+                    "kind": "INPUT_OBJECT",
+                    "name": "UploadInput",
+                    "ofType": null
+                  }
+                },
+                "defaultValue": null,
+                "isDeprecated": false,
+                "deprecationReason": null
+              }
+            ],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "OBJECT",
+                "name": "UploadResponse",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "verifyUser",
+            "description": null,
+            "args": [
+              {
+                "name": "input",
+                "description": null,
+                "type": {
+                  "kind": "NON_NULL",
+                  "name": null,
+                  "ofType": {
+                    "kind": "INPUT_OBJECT",
+                    "name": "UserVerifyInput",
+                    "ofType": null
+                  }
+                },
+                "defaultValue": null,
+                "isDeprecated": false,
+                "deprecationReason": null
+              }
+            ],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "OBJECT",
+                "name": "AuthResponse",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "viewNotification",
+            "description": null,
+            "args": [
+              {
+                "name": "input",
+                "description": null,
+                "type": {
+                  "kind": "NON_NULL",
+                  "name": null,
+                  "ofType": {
+                    "kind": "INPUT_OBJECT",
+                    "name": "ViewNotificationInput",
+                    "ofType": null
+                  }
+                },
+                "defaultValue": null,
+                "isDeprecated": false,
+                "deprecationReason": null
+              }
+            ],
+            "type": {
+              "kind": "INTERFACE",
+              "name": "Response",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "Notification",
+        "description": null,
+        "fields": [
+          {
+            "name": "content",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "createdAt",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "DateTime",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "id",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "Int",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "projectId",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "projectSlug",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "receiverId",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "sender",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "OBJECT",
+              "name": "User",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "senderId",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "type",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "updatedAt",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "DateTime",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "viewed",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "Boolean",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "INPUT_OBJECT",
+        "name": "NotificationInput",
+        "description": null,
+        "fields": null,
+        "inputFields": [
+          {
+            "name": "limit",
+            "description": null,
+            "type": {
+              "kind": "SCALAR",
+              "name": "Int",
+              "ofType": null
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "offset",
+            "description": null,
+            "type": {
+              "kind": "SCALAR",
+              "name": "Int",
+              "ofType": null
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "userId",
+            "description": null,
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "NotificationResponse",
+        "description": null,
+        "fields": [
+          {
+            "name": "data",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "OBJECT",
+              "name": "Notification",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "message",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "status",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "Boolean",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [
+          {
+            "kind": "INTERFACE",
+            "name": "Response",
+            "ofType": null
+          }
+        ],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "NotificationsResponse",
+        "description": null,
+        "fields": [
+          {
+            "name": "data",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "OBJECT",
+                "name": "Notification",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "message",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "status",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "Boolean",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [
+          {
+            "kind": "INTERFACE",
+            "name": "Response",
+            "ofType": null
+          }
+        ],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "PageView",
+        "description": null,
+        "fields": [
+          {
+            "name": "createdAt",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "DateTime",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "id",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "Int",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ip",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "updatedAt",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "DateTime",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "PageViewResponse",
+        "description": null,
+        "fields": [
+          {
+            "name": "data",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "OBJECT",
+                "name": "PageView",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "message",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "status",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "Boolean",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "Project",
+        "description": null,
+        "fields": [
+          {
+            "name": "_count",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "OBJECT",
+              "name": "ProjectCountPayload",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "author",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "OBJECT",
+              "name": "User",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "comments",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "OBJECT",
+                "name": "Comment",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "content",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "JSON",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "createdAt",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "DateTime",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "description",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "files",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "hasvoted",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "Boolean",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "id",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "isProjectOwner",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "Boolean",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "rank",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "Int",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "slug",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "tags",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "OBJECT",
+                "name": "Tag",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "title",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "updatedAt",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "DateTime",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "votes",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "OBJECT",
+                "name": "Vote",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "ProjectCountPayload",
+        "description": null,
+        "fields": [
+          {
+            "name": "comments",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "Int",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "votes",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "Int",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "INPUT_OBJECT",
+        "name": "ProjectInput",
+        "description": null,
+        "fields": null,
+        "inputFields": [
+          {
+            "name": "id",
+            "description": null,
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "vote_limit",
+            "description": null,
+            "type": {
+              "kind": "SCALAR",
+              "name": "Int",
+              "ofType": null
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "vote_offset",
+            "description": null,
+            "type": {
+              "kind": "SCALAR",
+              "name": "Int",
+              "ofType": null
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "ProjectResponse",
+        "description": null,
+        "fields": [
+          {
+            "name": "data",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "OBJECT",
+              "name": "Project",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "message",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "status",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "Boolean",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [
+          {
+            "kind": "INTERFACE",
+            "name": "Response",
+            "ofType": null
+          }
+        ],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "INPUT_OBJECT",
+        "name": "ProjectsInput",
+        "description": null,
+        "fields": null,
+        "inputFields": [
+          {
+            "name": "limit",
+            "description": null,
+            "type": {
+              "kind": "SCALAR",
+              "name": "Int",
+              "ofType": null
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "offset",
+            "description": null,
+            "type": {
+              "kind": "SCALAR",
+              "name": "Int",
+              "ofType": null
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "ProjectsResponse",
+        "description": null,
+        "fields": [
+          {
+            "name": "data",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "LIST",
+                "name": null,
+                "ofType": {
+                  "kind": "NON_NULL",
+                  "name": null,
+                  "ofType": {
+                    "kind": "OBJECT",
+                    "name": "Project",
+                    "ofType": null
+                  }
+                }
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "message",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "status",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "Boolean",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [
+          {
+            "kind": "INTERFACE",
+            "name": "Response",
+            "ofType": null
+          }
+        ],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "ENUM",
+        "name": "PushNotificationType",
+        "description": null,
+        "fields": null,
+        "inputFields": null,
+        "interfaces": null,
+        "enumValues": [
+          {
+            "name": "COMMENT",
+            "description": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "MENTION",
+            "description": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "REPLY",
+            "description": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "UPVOTE",
+            "description": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "Query",
+        "description": null,
+        "fields": [
+          {
+            "name": "comments",
+            "description": null,
+            "args": [
+              {
+                "name": "input",
+                "description": null,
+                "type": {
+                  "kind": "NON_NULL",
+                  "name": null,
+                  "ofType": {
+                    "kind": "INPUT_OBJECT",
+                    "name": "CommentsInput",
+                    "ofType": null
+                  }
+                },
+                "defaultValue": null,
+                "isDeprecated": false,
+                "deprecationReason": null
+              }
+            ],
+            "type": {
+              "kind": "OBJECT",
+              "name": "CommentsResponse",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "me",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "OBJECT",
+              "name": "UserResponse",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "mostActiveUsers",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "OBJECT",
+              "name": "UsersResponse",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "notifications",
+            "description": null,
+            "args": [
+              {
+                "name": "input",
+                "description": null,
+                "type": {
+                  "kind": "NON_NULL",
+                  "name": null,
+                  "ofType": {
+                    "kind": "INPUT_OBJECT",
+                    "name": "NotificationInput",
+                    "ofType": null
+                  }
+                },
+                "defaultValue": null,
+                "isDeprecated": false,
+                "deprecationReason": null
+              }
+            ],
+            "type": {
+              "kind": "OBJECT",
+              "name": "NotificationsResponse",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "pageViews",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "OBJECT",
+              "name": "PageViewResponse",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "project",
+            "description": null,
+            "args": [
+              {
+                "name": "input",
+                "description": null,
+                "type": {
+                  "kind": "NON_NULL",
+                  "name": null,
+                  "ofType": {
+                    "kind": "INPUT_OBJECT",
+                    "name": "ProjectInput",
+                    "ofType": null
+                  }
+                },
+                "defaultValue": null,
+                "isDeprecated": false,
+                "deprecationReason": null
+              }
+            ],
+            "type": {
+              "kind": "OBJECT",
+              "name": "ProjectResponse",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "projects",
+            "description": null,
+            "args": [
+              {
+                "name": "input",
+                "description": null,
+                "type": {
+                  "kind": "NON_NULL",
+                  "name": null,
+                  "ofType": {
+                    "kind": "INPUT_OBJECT",
+                    "name": "ProjectsInput",
+                    "ofType": null
+                  }
+                },
+                "defaultValue": null,
+                "isDeprecated": false,
+                "deprecationReason": null
+              }
+            ],
+            "type": {
+              "kind": "OBJECT",
+              "name": "ProjectsResponse",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "tags",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "OBJECT",
+              "name": "TagsResponse",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "user",
+            "description": null,
+            "args": [
+              {
+                "name": "input",
+                "description": null,
+                "type": {
+                  "kind": "NON_NULL",
+                  "name": null,
+                  "ofType": {
+                    "kind": "INPUT_OBJECT",
+                    "name": "UserInput",
+                    "ofType": null
+                  }
+                },
+                "defaultValue": null,
+                "isDeprecated": false,
+                "deprecationReason": null
+              }
+            ],
+            "type": {
+              "kind": "OBJECT",
+              "name": "UserResponse",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "users",
+            "description": null,
+            "args": [
+              {
+                "name": "input",
+                "description": null,
+                "type": {
+                  "kind": "NON_NULL",
+                  "name": null,
+                  "ofType": {
+                    "kind": "INPUT_OBJECT",
+                    "name": "UsersInput",
+                    "ofType": null
+                  }
+                },
+                "defaultValue": null,
+                "isDeprecated": false,
+                "deprecationReason": null
+              }
+            ],
+            "type": {
+              "kind": "OBJECT",
+              "name": "UsersResponse",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "usersWhoComment",
+            "description": null,
+            "args": [
+              {
+                "name": "input",
+                "description": null,
+                "type": {
+                  "kind": "NON_NULL",
+                  "name": null,
+                  "ofType": {
+                    "kind": "INPUT_OBJECT",
+                    "name": "ProjectInput",
+                    "ofType": null
+                  }
+                },
+                "defaultValue": null,
+                "isDeprecated": false,
+                "deprecationReason": null
+              }
+            ],
+            "type": {
+              "kind": "OBJECT",
+              "name": "UsersResponse",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "ResetPasswordResponse",
+        "description": null,
+        "fields": [
+          {
+            "name": "data",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "OBJECT",
+              "name": "Account",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "message",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "status",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "Boolean",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [
+          {
+            "kind": "INTERFACE",
+            "name": "Response",
+            "ofType": null
+          }
+        ],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "INTERFACE",
+        "name": "Response",
+        "description": null,
+        "fields": [
+          {
+            "name": "message",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "status",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "Boolean",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [],
+        "enumValues": null,
+        "possibleTypes": [
+          {
+            "kind": "OBJECT",
+            "name": "AuthResponse",
+            "ofType": null
+          },
+          {
+            "kind": "OBJECT",
+            "name": "CommentResponse",
+            "ofType": null
+          },
+          {
+            "kind": "OBJECT",
+            "name": "CommentsResponse",
+            "ofType": null
+          },
+          {
+            "kind": "OBJECT",
+            "name": "NotificationResponse",
+            "ofType": null
+          },
+          {
+            "kind": "OBJECT",
+            "name": "NotificationsResponse",
+            "ofType": null
+          },
+          {
+            "kind": "OBJECT",
+            "name": "ProjectResponse",
+            "ofType": null
+          },
+          {
+            "kind": "OBJECT",
+            "name": "ProjectsResponse",
+            "ofType": null
+          },
+          {
+            "kind": "OBJECT",
+            "name": "ResetPasswordResponse",
+            "ofType": null
+          },
+          {
+            "kind": "OBJECT",
+            "name": "SimpleAuthResponse",
+            "ofType": null
+          },
+          {
+            "kind": "OBJECT",
+            "name": "TagsResponse",
+            "ofType": null
+          },
+          {
+            "kind": "OBJECT",
+            "name": "UploadResponse",
+            "ofType": null
+          },
+          {
+            "kind": "OBJECT",
+            "name": "UserResponse",
+            "ofType": null
+          },
+          {
+            "kind": "OBJECT",
+            "name": "UsersResponse",
+            "ofType": null
+          },
+          {
+            "kind": "OBJECT",
+            "name": "VoteResponse",
+            "ofType": null
+          }
+        ]
+      },
+      {
+        "kind": "OBJECT",
+        "name": "SimpleAuthResponse",
+        "description": null,
+        "fields": [
+          {
+            "name": "message",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "status",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "Boolean",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [
+          {
+            "kind": "INTERFACE",
+            "name": "Response",
+            "ofType": null
+          }
+        ],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "SCALAR",
+        "name": "String",
+        "description": "The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text.",
+        "fields": null,
+        "inputFields": null,
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "Subscription",
+        "description": null,
+        "fields": [
+          {
+            "name": "commentCreated",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "OBJECT",
+              "name": "CommentSubscriptionResponse",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "mentionCreated",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "OBJECT",
+              "name": "CommentSubscriptionResponse",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "replyCreated",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "OBJECT",
+              "name": "CommentSubscriptionResponse",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "upvoteCreated",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "OBJECT",
+              "name": "UpvoteSubscriptionResponse",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "Tag",
+        "description": null,
+        "fields": [
+          {
+            "name": "id",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "Int",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "projects",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "OBJECT",
+                "name": "Project",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "value",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "INPUT_OBJECT",
+        "name": "TagInput",
+        "description": null,
+        "fields": null,
+        "inputFields": [
+          {
+            "name": "id",
+            "description": null,
+            "type": {
+              "kind": "SCALAR",
+              "name": "Int",
+              "ofType": null
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "value",
+            "description": null,
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "TagsResponse",
+        "description": null,
+        "fields": [
+          {
+            "name": "data",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "NON_NULL",
+                "name": null,
+                "ofType": {
+                  "kind": "OBJECT",
+                  "name": "Tag",
+                  "ofType": null
+                }
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "message",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "status",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "Boolean",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [
+          {
+            "kind": "INTERFACE",
+            "name": "Response",
+            "ofType": null
+          }
+        ],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "INPUT_OBJECT",
+        "name": "ToggleVoteInput",
+        "description": null,
+        "fields": null,
+        "inputFields": [
+          {
+            "name": "id",
+            "description": null,
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "INPUT_OBJECT",
+        "name": "UpdateCommentInput",
+        "description": null,
+        "fields": null,
+        "inputFields": [
+          {
+            "name": "commentId",
+            "description": null,
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "Int",
+                "ofType": null
+              }
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "message",
+            "description": null,
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "INPUT_OBJECT",
+        "name": "UpdateProfileInput",
+        "description": null,
+        "fields": null,
+        "inputFields": [
+          {
+            "name": "banner",
+            "description": null,
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "bio",
+            "description": null,
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "country",
+            "description": null,
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "file",
+            "description": null,
+            "type": {
+              "kind": "SCALAR",
+              "name": "Upload",
+              "ofType": null
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "firstname",
+            "description": null,
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "id",
+            "description": null,
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "jobTitle",
+            "description": null,
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "lastname",
+            "description": null,
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "showProfession",
+            "description": null,
+            "type": {
+              "kind": "SCALAR",
+              "name": "Boolean",
+              "ofType": null
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "username",
+            "description": null,
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "website",
+            "description": null,
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "INPUT_OBJECT",
+        "name": "UpdateProjectInput",
+        "description": null,
+        "fields": null,
+        "inputFields": [
+          {
+            "name": "content",
+            "description": null,
+            "type": {
+              "kind": "SCALAR",
+              "name": "JSON",
+              "ofType": null
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "description",
+            "description": null,
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "file",
+            "description": null,
+            "type": {
+              "kind": "SCALAR",
+              "name": "Upload",
+              "ofType": null
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "projectId",
+            "description": null,
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "tags",
+            "description": null,
+            "type": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "INPUT_OBJECT",
+                "name": "TagInput",
+                "ofType": null
+              }
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "title",
+            "description": null,
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "SCALAR",
+        "name": "Upload",
+        "description": "The `Upload` scalar type represents a file upload.",
+        "fields": null,
+        "inputFields": null,
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "INPUT_OBJECT",
+        "name": "UploadInput",
+        "description": null,
+        "fields": null,
+        "inputFields": [
+          {
+            "name": "file",
+            "description": null,
+            "type": {
+              "kind": "SCALAR",
+              "name": "Upload",
+              "ofType": null
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "UploadResponse",
+        "description": null,
+        "fields": [
+          {
+            "name": "message",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "status",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "Boolean",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "url",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [
+          {
+            "kind": "INTERFACE",
+            "name": "Response",
+            "ofType": null
+          }
+        ],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "UpvoteSubscriptionResponse",
+        "description": null,
+        "fields": [
+          {
+            "name": "data",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "OBJECT",
+              "name": "Notification",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "message",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "type",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "ENUM",
+              "name": "PushNotificationType",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "User",
+        "description": null,
+        "fields": [
+          {
+            "name": "avatar",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "banner",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "bio",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "country",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "createdAt",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "DateTime",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "email",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "firstname",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "id",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "jobTitle",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "lastname",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "projects",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "OBJECT",
+                "name": "Project",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "showProfession",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "Boolean",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "updatedAt",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "DateTime",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "username",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "verifiedAt",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "DateTime",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "votes",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "OBJECT",
+                "name": "Vote",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "website",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "INPUT_OBJECT",
+        "name": "UserForgotPasswordInput",
+        "description": null,
+        "fields": null,
+        "inputFields": [
+          {
+            "name": "email",
+            "description": null,
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "INPUT_OBJECT",
+        "name": "UserInput",
+        "description": null,
+        "fields": null,
+        "inputFields": [
+          {
+            "name": "username",
+            "description": null,
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "INPUT_OBJECT",
+        "name": "UserLoginInput",
+        "description": null,
+        "fields": null,
+        "inputFields": [
+          {
+            "name": "email",
+            "description": null,
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "password",
+            "description": null,
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "INPUT_OBJECT",
+        "name": "UserRegisterInput",
+        "description": null,
+        "fields": null,
+        "inputFields": [
+          {
+            "name": "email",
+            "description": null,
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "password",
+            "description": null,
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "username",
+            "description": null,
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "INPUT_OBJECT",
+        "name": "UserResetPasswordInput",
+        "description": null,
+        "fields": null,
+        "inputFields": [
+          {
+            "name": "password",
+            "description": null,
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "token",
+            "description": null,
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "UserResponse",
+        "description": null,
+        "fields": [
+          {
+            "name": "data",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "OBJECT",
+              "name": "User",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "message",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "status",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "Boolean",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [
+          {
+            "kind": "INTERFACE",
+            "name": "Response",
+            "ofType": null
+          }
+        ],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "INPUT_OBJECT",
+        "name": "UserVerifyInput",
+        "description": null,
+        "fields": null,
+        "inputFields": [
+          {
+            "name": "token",
+            "description": null,
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "INPUT_OBJECT",
+        "name": "UsersInput",
+        "description": null,
+        "fields": null,
+        "inputFields": [
+          {
+            "name": "limit",
+            "description": null,
+            "type": {
+              "kind": "SCALAR",
+              "name": "Int",
+              "ofType": null
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "offset",
+            "description": null,
+            "type": {
+              "kind": "SCALAR",
+              "name": "Int",
+              "ofType": null
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "UsersResponse",
+        "description": null,
+        "fields": [
+          {
+            "name": "data",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "OBJECT",
+                "name": "User",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "message",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "status",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "Boolean",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [
+          {
+            "kind": "INTERFACE",
+            "name": "Response",
+            "ofType": null
+          }
+        ],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "INPUT_OBJECT",
+        "name": "ViewNotificationInput",
+        "description": null,
+        "fields": null,
+        "inputFields": [
+          {
+            "name": "notificationId",
+            "description": null,
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "Int",
+                "ofType": null
+              }
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "Vote",
+        "description": null,
+        "fields": [
+          {
+            "name": "author",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "OBJECT",
+              "name": "User",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "createdAt",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "DateTime",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "id",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "Int",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "project",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "OBJECT",
+              "name": "Project",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "updatedAt",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "DateTime",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "VoteResponse",
+        "description": null,
+        "fields": [
+          {
+            "name": "data",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "OBJECT",
+              "name": "Vote",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "message",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "status",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "Boolean",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [
+          {
+            "kind": "INTERFACE",
+            "name": "Response",
+            "ofType": null
+          }
+        ],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "__Directive",
+        "description": "A Directive provides a way to describe alternate runtime execution and type validation behavior in a GraphQL document.\n\nIn some cases, you need to provide options to alter GraphQL's execution behavior in ways field arguments will not suffice, such as conditionally including or skipping a field. Directives provide this by describing additional information to the executor.",
+        "fields": [
+          {
+            "name": "name",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "description",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "isRepeatable",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "Boolean",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "locations",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "LIST",
+                "name": null,
+                "ofType": {
+                  "kind": "NON_NULL",
+                  "name": null,
+                  "ofType": {
+                    "kind": "ENUM",
+                    "name": "__DirectiveLocation",
+                    "ofType": null
+                  }
+                }
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "args",
+            "description": null,
+            "args": [
+              {
+                "name": "includeDeprecated",
+                "description": null,
+                "type": {
+                  "kind": "SCALAR",
+                  "name": "Boolean",
+                  "ofType": null
+                },
+                "defaultValue": "false",
+                "isDeprecated": false,
+                "deprecationReason": null
+              }
+            ],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "LIST",
+                "name": null,
+                "ofType": {
+                  "kind": "NON_NULL",
+                  "name": null,
+                  "ofType": {
+                    "kind": "OBJECT",
+                    "name": "__InputValue",
+                    "ofType": null
+                  }
+                }
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "ENUM",
+        "name": "__DirectiveLocation",
+        "description": "A Directive can be adjacent to many parts of the GraphQL language, a __DirectiveLocation describes one such possible adjacencies.",
+        "fields": null,
+        "inputFields": null,
+        "interfaces": null,
+        "enumValues": [
+          {
+            "name": "QUERY",
+            "description": "Location adjacent to a query operation.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "MUTATION",
+            "description": "Location adjacent to a mutation operation.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "SUBSCRIPTION",
+            "description": "Location adjacent to a subscription operation.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "FIELD",
+            "description": "Location adjacent to a field.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "FRAGMENT_DEFINITION",
+            "description": "Location adjacent to a fragment definition.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "FRAGMENT_SPREAD",
+            "description": "Location adjacent to a fragment spread.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "INLINE_FRAGMENT",
+            "description": "Location adjacent to an inline fragment.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "VARIABLE_DEFINITION",
+            "description": "Location adjacent to a variable definition.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "SCHEMA",
+            "description": "Location adjacent to a schema definition.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "SCALAR",
+            "description": "Location adjacent to a scalar definition.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "OBJECT",
+            "description": "Location adjacent to an object type definition.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "FIELD_DEFINITION",
+            "description": "Location adjacent to a field definition.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ARGUMENT_DEFINITION",
+            "description": "Location adjacent to an argument definition.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "INTERFACE",
+            "description": "Location adjacent to an interface definition.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "UNION",
+            "description": "Location adjacent to a union definition.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ENUM",
+            "description": "Location adjacent to an enum definition.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ENUM_VALUE",
+            "description": "Location adjacent to an enum value definition.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "INPUT_OBJECT",
+            "description": "Location adjacent to an input object type definition.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "INPUT_FIELD_DEFINITION",
+            "description": "Location adjacent to an input object field definition.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "__EnumValue",
+        "description": "One possible value for a given Enum. Enum values are unique values, not a placeholder for a string or numeric value. However an Enum value is returned in a JSON response as a string.",
+        "fields": [
+          {
+            "name": "name",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "description",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "isDeprecated",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "Boolean",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "deprecationReason",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "__Field",
+        "description": "Object and Interface types are described by a list of Fields, each of which has a name, potentially a list of arguments, and a return type.",
+        "fields": [
+          {
+            "name": "name",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "description",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "args",
+            "description": null,
+            "args": [
+              {
+                "name": "includeDeprecated",
+                "description": null,
+                "type": {
+                  "kind": "SCALAR",
+                  "name": "Boolean",
+                  "ofType": null
+                },
+                "defaultValue": "false",
+                "isDeprecated": false,
+                "deprecationReason": null
+              }
+            ],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "LIST",
+                "name": null,
+                "ofType": {
+                  "kind": "NON_NULL",
+                  "name": null,
+                  "ofType": {
+                    "kind": "OBJECT",
+                    "name": "__InputValue",
+                    "ofType": null
+                  }
+                }
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "type",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "OBJECT",
+                "name": "__Type",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "isDeprecated",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "Boolean",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "deprecationReason",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "__InputValue",
+        "description": "Arguments provided to Fields or Directives and the input fields of an InputObject are represented as Input Values which describe their type and optionally a default value.",
+        "fields": [
+          {
+            "name": "name",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "description",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "type",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "OBJECT",
+                "name": "__Type",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "defaultValue",
+            "description": "A GraphQL-formatted string representing the default value for this input value.",
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "isDeprecated",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "Boolean",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "deprecationReason",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "__Schema",
+        "description": "A GraphQL Schema defines the capabilities of a GraphQL server. It exposes all available types and directives on the server, as well as the entry points for query, mutation, and subscription operations.",
+        "fields": [
+          {
+            "name": "description",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "types",
+            "description": "A list of all types supported by this server.",
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "LIST",
+                "name": null,
+                "ofType": {
+                  "kind": "NON_NULL",
+                  "name": null,
+                  "ofType": {
+                    "kind": "OBJECT",
+                    "name": "__Type",
+                    "ofType": null
+                  }
+                }
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "queryType",
+            "description": "The type that query operations will be rooted at.",
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "OBJECT",
+                "name": "__Type",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "mutationType",
+            "description": "If this server supports mutation, the type that mutation operations will be rooted at.",
+            "args": [],
+            "type": {
+              "kind": "OBJECT",
+              "name": "__Type",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "subscriptionType",
+            "description": "If this server support subscription, the type that subscription operations will be rooted at.",
+            "args": [],
+            "type": {
+              "kind": "OBJECT",
+              "name": "__Type",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "directives",
+            "description": "A list of all directives supported by this server.",
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "LIST",
+                "name": null,
+                "ofType": {
+                  "kind": "NON_NULL",
+                  "name": null,
+                  "ofType": {
+                    "kind": "OBJECT",
+                    "name": "__Directive",
+                    "ofType": null
+                  }
+                }
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "__Type",
+        "description": "The fundamental unit of any GraphQL Schema is the type. There are many kinds of types in GraphQL as represented by the `__TypeKind` enum.\n\nDepending on the kind of a type, certain fields describe information about that type. Scalar types provide no information beyond a name, description and optional `specifiedByURL`, while Enum types provide their values. Object and Interface types provide the fields they describe. Abstract types, Union and Interface, provide the Object types possible at runtime. List and NonNull types compose other types.",
+        "fields": [
+          {
+            "name": "kind",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "ENUM",
+                "name": "__TypeKind",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "name",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "description",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "specifiedByURL",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "fields",
+            "description": null,
+            "args": [
+              {
+                "name": "includeDeprecated",
+                "description": null,
+                "type": {
+                  "kind": "SCALAR",
+                  "name": "Boolean",
+                  "ofType": null
+                },
+                "defaultValue": "false",
+                "isDeprecated": false,
+                "deprecationReason": null
+              }
+            ],
+            "type": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "NON_NULL",
+                "name": null,
+                "ofType": {
+                  "kind": "OBJECT",
+                  "name": "__Field",
+                  "ofType": null
+                }
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "interfaces",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "NON_NULL",
+                "name": null,
+                "ofType": {
+                  "kind": "OBJECT",
+                  "name": "__Type",
+                  "ofType": null
+                }
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "possibleTypes",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "NON_NULL",
+                "name": null,
+                "ofType": {
+                  "kind": "OBJECT",
+                  "name": "__Type",
+                  "ofType": null
+                }
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "enumValues",
+            "description": null,
+            "args": [
+              {
+                "name": "includeDeprecated",
+                "description": null,
+                "type": {
+                  "kind": "SCALAR",
+                  "name": "Boolean",
+                  "ofType": null
+                },
+                "defaultValue": "false",
+                "isDeprecated": false,
+                "deprecationReason": null
+              }
+            ],
+            "type": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "NON_NULL",
+                "name": null,
+                "ofType": {
+                  "kind": "OBJECT",
+                  "name": "__EnumValue",
+                  "ofType": null
+                }
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "inputFields",
+            "description": null,
+            "args": [
+              {
+                "name": "includeDeprecated",
+                "description": null,
+                "type": {
+                  "kind": "SCALAR",
+                  "name": "Boolean",
+                  "ofType": null
+                },
+                "defaultValue": "false",
+                "isDeprecated": false,
+                "deprecationReason": null
+              }
+            ],
+            "type": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "NON_NULL",
+                "name": null,
+                "ofType": {
+                  "kind": "OBJECT",
+                  "name": "__InputValue",
+                  "ofType": null
+                }
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ofType",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "OBJECT",
+              "name": "__Type",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "ENUM",
+        "name": "__TypeKind",
+        "description": "An enum describing what kind of type a given `__Type` is.",
+        "fields": null,
+        "inputFields": null,
+        "interfaces": null,
+        "enumValues": [
+          {
+            "name": "SCALAR",
+            "description": "Indicates this type is a scalar.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "OBJECT",
+            "description": "Indicates this type is an object. `fields` and `interfaces` are valid fields.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "INTERFACE",
+            "description": "Indicates this type is an interface. `fields`, `interfaces`, and `possibleTypes` are valid fields.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "UNION",
+            "description": "Indicates this type is a union. `possibleTypes` is a valid field.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ENUM",
+            "description": "Indicates this type is an enum. `enumValues` is a valid field.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "INPUT_OBJECT",
+            "description": "Indicates this type is an input object. `inputFields` is a valid field.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "LIST",
+            "description": "Indicates this type is a list. `ofType` is a valid field.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "NON_NULL",
+            "description": "Indicates this type is a non-null. `ofType` is a valid field.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "possibleTypes": null
+      }
+    ],
+    "directives": [
+      {
+        "name": "deprecated",
+        "description": "Marks an element of a GraphQL schema as no longer supported.",
+        "isRepeatable": false,
+        "locations": [
+          "ARGUMENT_DEFINITION",
+          "ENUM_VALUE",
+          "FIELD_DEFINITION",
+          "INPUT_FIELD_DEFINITION"
+        ],
+        "args": [
+          {
+            "name": "reason",
+            "description": "Explains why this element was deprecated, usually also including a suggestion for how to access supported similar data. Formatted using the Markdown syntax, as specified by [CommonMark](https://commonmark.org/).",
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "defaultValue": "\"No longer supported\"",
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ]
+      },
+      {
+        "name": "include",
+        "description": "Directs the executor to include this field or fragment only when the `if` argument is true.",
+        "isRepeatable": false,
+        "locations": [
+          "FIELD",
+          "FRAGMENT_SPREAD",
+          "INLINE_FRAGMENT"
+        ],
+        "args": [
+          {
+            "name": "if",
+            "description": "Included when true.",
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "Boolean",
+                "ofType": null
+              }
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ]
+      },
+      {
+        "name": "skip",
+        "description": "Directs the executor to skip this field or fragment when the `if` argument is true.",
+        "isRepeatable": false,
+        "locations": [
+          "FIELD",
+          "FRAGMENT_SPREAD",
+          "INLINE_FRAGMENT"
+        ],
+        "args": [
+          {
+            "name": "if",
+            "description": "Skipped when true.",
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "Boolean",
+                "ofType": null
+              }
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ]
+      },
+      {
+        "name": "specifiedBy",
+        "description": "Exposes a URL that specifies the behaviour of this scalar.",
+        "isRepeatable": false,
+        "locations": [
+          "SCALAR"
+        ],
+        "args": [
+          {
+            "name": "url",
+            "description": "The URL that specifies the behaviour of this scalar.",
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "defaultValue": null,
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ]
+      }
+    ]
+  }
+}
\ No newline at end of file
diff --git a/graphql/definitions/auth.definition.ts b/graphql/definitions/auth.definition.ts
new file mode 100644
index 0000000000000000000000000000000000000000..bb9c065704ef3d4ba9093f2c6dd5eb2436d49ebf
--- /dev/null
+++ b/graphql/definitions/auth.definition.ts
@@ -0,0 +1,152 @@
+import { gql } from "@apollo/client";
+
+export const meQuery = gql(`query Me {
+  me {
+    data {
+      id
+      username
+      email
+      avatar
+      bio
+      website
+      verifiedAt
+      createdAt
+      updatedAt
+      showProfession
+      projects {
+        id
+        title
+        description
+      }
+      firstname
+      lastname
+      jobTitle
+      country
+    }
+    message
+    status
+  }
+}`);
+
+export const registerMutation =
+  gql(`mutation Register($input: UserRegisterInput!) {
+  register(input: $input) {
+    data {
+      id
+      email
+      username
+      avatar
+      bio
+      website
+      verifiedAt
+      createdAt
+      updatedAt
+    }
+    token
+    message
+    status
+  }
+}`);
+
+export const loginMutation = gql(`mutation Login($input: UserLoginInput!) {
+  login(input: $input) {
+    data {
+      id
+      email
+      username
+      avatar
+      bio
+      website
+      verifiedAt
+      createdAt
+      updatedAt
+    }
+    token
+    message
+    status
+  }
+}`);
+
+export const verifiedUserMutation =
+  gql(`mutation VerifyUser($input: UserVerifyInput!) {
+  verifyUser(input: $input) {
+    message
+    status
+  }
+}`);
+
+export const googleOauthMutation =
+  gql(`mutation Mutation($input: GoogleAuthInput!) {
+  googleOauth(input: $input) {
+    data {
+      id
+      email
+      username
+      avatar
+      bio
+      website
+      verifiedAt
+      createdAt
+      updatedAt
+    }
+    token
+    message
+    status
+  }
+}`);
+
+export const githubOauthMutation =
+  gql(`mutation Mutation($input: GithubAuthInput!) {
+  githubOauth(input: $input) {
+    data {
+      id
+      email
+      username
+      avatar
+      bio
+      website
+      verifiedAt
+      createdAt
+      updatedAt
+    }
+    token
+    message
+    status
+  }
+}`);
+
+export const updateProfileMutation =
+  gql(`mutation UpdateProfile($input: UpdateProfileInput) {
+  updateProfile(input: $input) {
+    data {
+      avatar
+      username
+    }
+    message
+    status
+  }
+}`);
+
+export const resetPasswordMutation =
+  gql(`mutation ResetPassword($input: UserResetPasswordInput!) {
+  resetPassword(input: $input) {
+    status
+    message
+    data {
+      id
+      email
+      token
+      expiredAt
+      createdAt
+      updatedAt
+    }
+  }
+}`);
+
+export const forgotPasswordMutation =
+  gql(`mutation ForgotPassword($input: UserForgotPasswordInput!) {
+  forgotPassword(input: $input) {
+    message
+    status
+  }
+}`);
diff --git a/graphql/definitions/comment.definition.ts b/graphql/definitions/comment.definition.ts
new file mode 100644
index 0000000000000000000000000000000000000000..cb4dd6cd7cab9d0e318dbfd4020202eb37aa2f08
--- /dev/null
+++ b/graphql/definitions/comment.definition.ts
@@ -0,0 +1,97 @@
+import { gql } from "@apollo/client";
+
+export const CommentsQuery = gql(`query Comments($input: CommentsInput!) {
+  comments(input: $input) {
+    data {
+      id
+      message
+      parentId
+      authorId
+      createdAt
+      updatedAt
+      author {
+        id
+        email
+        username
+        avatar
+      }
+    }
+    message
+    status
+  }
+}`);
+
+export const CreateCommentMutation =
+  gql(`mutation CreateComment($input: CreateCommentInput!) {
+  createComment(input: $input) {
+    data {
+      id
+      message
+      parentId
+      authorId
+      createdAt
+      updatedAt
+      author {
+        id
+        email
+        username
+        avatar
+      }
+    }
+    message
+    status
+  }
+}`);
+
+export const UpdateCommentMutation =
+  gql(`mutation UpdateComment($input: UpdateCommentInput!) {
+  updateComment(input: $input) {
+    data {
+      id
+      message
+      parentId
+      authorId
+      createdAt
+      updatedAt
+      author {
+        id
+        email
+        username
+        avatar
+      }
+    }
+    message
+    status
+  }
+}`);
+
+export const DeleteCommentMutation =
+  gql(`mutation DeleteComment($input: DeleteCommentInput!) {
+  deleteComment(input: $input) {
+    data {
+      id
+    }
+    message
+    status
+  }
+}`);
+
+export const CommentCreatedSubscription = gql(`subscription CommentCreated {
+  commentCreated {
+    type
+    message
+    data {
+      id
+      type
+      receiverId
+      projectId
+      content
+      viewed
+      createdAt
+      sender {
+        avatar
+        username
+      }
+    }
+  }
+}`);
diff --git a/graphql/definitions/notification.definition.ts b/graphql/definitions/notification.definition.ts
new file mode 100644
index 0000000000000000000000000000000000000000..c83938564bca73f86407aaaf8c6e2d2ca8efe659
--- /dev/null
+++ b/graphql/definitions/notification.definition.ts
@@ -0,0 +1,31 @@
+import { gql } from "@apollo/client";
+
+export const NotificationQuery =
+  gql(`query Notifications($input: NotificationInput!) {
+  notifications(input: $input) {
+    message
+    status
+    data {
+      id
+      type
+      receiverId
+      projectId
+      projectSlug
+      content
+      viewed
+      createdAt
+      sender {
+        avatar
+        username
+      }
+    }
+  }
+}`);
+
+export const ViewNotificationMutation =
+  gql(`mutation ViewNotification($input: ViewNotificationInput!) {
+  viewNotification(input: $input) {
+    message
+    status
+  }
+}`);
diff --git a/graphql/definitions/pageView.definition.ts b/graphql/definitions/pageView.definition.ts
new file mode 100644
index 0000000000000000000000000000000000000000..bac0a9e48a2ef3a2737c656137b0549e67ec4909
--- /dev/null
+++ b/graphql/definitions/pageView.definition.ts
@@ -0,0 +1,14 @@
+import { gql } from "@apollo/client";
+
+export const PageViewQuery = gql(`query pageViews {
+  pageViews {
+    data {
+      id
+      ip
+      createdAt
+      updatedAt
+    }
+    message
+    status
+  }
+}`);
diff --git a/graphql/definitions/project.definition.ts b/graphql/definitions/project.definition.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6eb57b1b69ece6edcb2838e276219c58fb7dc8b4
--- /dev/null
+++ b/graphql/definitions/project.definition.ts
@@ -0,0 +1,148 @@
+import { gql } from "@apollo/client";
+
+export const ProjectsQuery = gql(`query Projects($input: ProjectsInput!) {
+  projects(input: $input) {
+    data {
+      id
+      createdAt
+      title
+      slug
+      description
+      content
+      updatedAt
+      hasvoted
+      isProjectOwner
+      files
+      tags {
+        id
+        value
+      }
+      _count {
+        votes
+        comments
+      }
+      author {
+        id
+        username
+        avatar
+      }
+      comments {
+        author {
+          id
+          username
+          avatar
+        }
+      }
+    }
+    message
+    status
+  }
+}`);
+
+export const ProjectsIDsQuery = gql(`query Projects($input: ProjectsInput!) {
+  projects(input: $input) {
+    data {
+      id
+    }
+    message
+    status
+  }
+}`);
+
+export const ProjectQuery = gql(`query Project($input: ProjectInput!) {
+  project(input: $input) {
+    message
+    status
+    data {
+      id
+      title
+      slug
+      description
+      content
+      files
+      author {
+        id
+        username
+        avatar
+      }
+      tags {
+        id
+        value
+      }
+      _count {
+        votes
+        comments
+      }
+      createdAt
+      updatedAt
+      hasvoted
+      isProjectOwner
+      votes {
+        author {
+          id
+          username
+          avatar
+        }
+      }
+    }
+  }
+  usersWhoComment(input: $input) {
+    data {
+      id
+      email
+      username
+      avatar
+    }
+    message
+    status
+  }
+}`);
+
+export const HasVotedProjectQuery =
+  gql(`query HasVotedProjectQuery($input: ProjectInput!) {
+  project(input: $input) {
+    data {
+      hasvoted
+      _count {
+        votes
+      }
+    }
+    message
+    status
+  }
+}`);
+
+export const CreateProjectMutation =
+  gql(`mutation CreateProject($input: CreateProjectInput!) {
+  createProject(input: $input) {
+    message
+    status
+    data {
+      id
+      title
+      slug
+      description
+      content
+      files
+    }
+  }
+}`);
+
+export const UpdateProjectMutation =
+  gql(`mutation UpdateProject($input: UpdateProjectInput!) {
+  updateProject(input: $input) {
+    message
+    status
+  }
+}`);
+
+export const DeleteProjectMutation =
+  gql(`mutation DeleteProject($input: DeleteProjectInput!) {
+  deleteProject(input: $input) {
+    data {
+      id
+    }
+    message
+    status
+  }
+}`);
diff --git a/graphql/definitions/tag.definition.ts b/graphql/definitions/tag.definition.ts
new file mode 100644
index 0000000000000000000000000000000000000000..115cab99cd5ec33a9be10f7da273f337edfe5f52
--- /dev/null
+++ b/graphql/definitions/tag.definition.ts
@@ -0,0 +1,12 @@
+import { gql } from "@apollo/client";
+
+export const TagsQuery = gql(`query Tags {
+  tags {
+    data {
+      id
+      value
+    }
+    message
+    status
+  }
+}`);
diff --git a/graphql/definitions/upload.definition.ts b/graphql/definitions/upload.definition.ts
new file mode 100644
index 0000000000000000000000000000000000000000..363291d81dab2eab153ccd89a62e3963ed57d82c
--- /dev/null
+++ b/graphql/definitions/upload.definition.ts
@@ -0,0 +1,10 @@
+import { gql } from "@apollo/client";
+
+export const uploadFileMutation =
+  gql(`mutation UploadFile($input: UploadInput!) {
+  uploadFile(input: $input) {
+    url
+    message
+    status
+  }
+}`);
diff --git a/graphql/definitions/user.definitions.ts b/graphql/definitions/user.definitions.ts
new file mode 100644
index 0000000000000000000000000000000000000000..304d4196e8250d896002887fb6d3e7bfd5b526e2
--- /dev/null
+++ b/graphql/definitions/user.definitions.ts
@@ -0,0 +1,54 @@
+import { gql } from "@apollo/client";
+
+export const UsersIDsQuery = gql(`query UsersIDsQuery($input: UsersInput!) {
+  users(input: $input) {
+    message
+    status
+    data {
+      username
+    }
+  }
+}`);
+
+export const UserQuery = gql(`query User($input: UserInput!) {
+  user(input: $input) {
+    message
+    status
+    data {
+      id
+      email
+      username
+      firstname
+      lastname
+      avatar
+      bio
+      website
+      jobTitle
+      country
+      showProfession
+      points
+      projects {
+        id
+        title
+        slug
+        tags {
+          id
+          value
+        }
+      }
+    }
+  }
+}`);
+
+export const MostActiveUsersQuery = gql(`query MostActiveUsers {
+  mostActiveUsers {
+    status
+    message
+    data {
+      id
+      avatar
+      username
+      bio
+    }
+  }
+}`);
diff --git a/graphql/generated/graphql.d.ts b/graphql/generated/graphql.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ceb2070f23ea6a263abf61e1408d86085b5a9376
--- /dev/null
+++ b/graphql/generated/graphql.d.ts
@@ -0,0 +1,563 @@
+import { gql } from '@apollo/client';
+export type Maybe = T | null;
+export type InputMaybe = Maybe;
+export type Exact = { [K in keyof T]: T[K] };
+export type MakeOptional = Omit & { [SubKey in K]?: Maybe };
+export type MakeMaybe = Omit & { [SubKey in K]: Maybe };
+/** All built-in and custom scalars, mapped to their actual values */
+export type Scalars = {
+  ID: string;
+  String: string;
+  Boolean: boolean;
+  Int: number;
+  Float: number;
+  DateTime: any;
+  JSON: any;
+  Upload: any;
+};
+
+export type Account = {
+  __typename?: 'Account';
+  createdAt: Scalars['DateTime'];
+  email: Scalars['String'];
+  id: Scalars['String'];
+  token: Scalars['String'];
+  updatedAt: Scalars['DateTime'];
+};
+
+export type AuthResponse = Response & {
+  __typename?: 'AuthResponse';
+  data?: Maybe;
+  exp?: Maybe;
+  message?: Maybe;
+  status: Scalars['Boolean'];
+  token?: Maybe;
+};
+
+export type Comment = {
+  __typename?: 'Comment';
+  author?: Maybe;
+  authorId: Scalars['String'];
+  createdAt?: Maybe;
+  id: Scalars['Int'];
+  message?: Maybe;
+  parentId?: Maybe;
+  project?: Maybe;
+  projectId?: Maybe;
+  updatedAt?: Maybe;
+};
+
+export type CommentResponse = Response & {
+  __typename?: 'CommentResponse';
+  data?: Maybe;
+  message?: Maybe;
+  status: Scalars['Boolean'];
+};
+
+export type CommentSubscriptionResponse = {
+  __typename?: 'CommentSubscriptionResponse';
+  data?: Maybe;
+  message?: Maybe;
+  type?: Maybe;
+};
+
+export type CommentsInput = {
+  projectId: Scalars['String'];
+};
+
+export type CommentsResponse = Response & {
+  __typename?: 'CommentsResponse';
+  data?: Maybe>>;
+  message?: Maybe;
+  status: Scalars['Boolean'];
+};
+
+export type CreateCommentInput = {
+  mentions?: InputMaybe>>;
+  message?: InputMaybe;
+  parentId?: InputMaybe;
+  projectId: Scalars['String'];
+};
+
+export type CreatePageViewInput = {
+  ip: Scalars['String'];
+};
+
+export type CreateProjectInput = {
+  content?: InputMaybe;
+  description?: InputMaybe;
+  file?: InputMaybe;
+  tags?: InputMaybe>>;
+  title?: InputMaybe;
+};
+
+export type DeleteCommentInput = {
+  commentId: Scalars['Int'];
+};
+
+export type DeleteProjectInput = {
+  projectId: Scalars['String'];
+};
+
+export type GithubAuthInput = {
+  code?: InputMaybe;
+};
+
+export type GoogleAuthInput = {
+  authuser?: InputMaybe;
+  code?: InputMaybe;
+  prompt?: InputMaybe;
+  scope?: InputMaybe;
+};
+
+export type MentionsInput = {
+  email?: InputMaybe;
+  userId?: InputMaybe;
+};
+
+export type Mutation = {
+  __typename?: 'Mutation';
+  createComment: CommentResponse;
+  createProject: ProjectResponse;
+  deleteComment: CommentResponse;
+  deleteProject: ProjectResponse;
+  forgotPassword: SimpleAuthResponse;
+  githubOauth: AuthResponse;
+  googleOauth: AuthResponse;
+  login: AuthResponse;
+  register: AuthResponse;
+  resetPassword: ResetPasswordResponse;
+  toggleVote: VoteResponse;
+  updateComment: CommentResponse;
+  updateProfile: UserResponse;
+  updateProject: ProjectResponse;
+  uploadFile: UploadResponse;
+  verifyUser: AuthResponse;
+  viewNotification?: Maybe;
+};
+
+
+export type MutationCreateCommentArgs = {
+  input: CreateCommentInput;
+};
+
+
+export type MutationCreateProjectArgs = {
+  input: CreateProjectInput;
+};
+
+
+export type MutationDeleteCommentArgs = {
+  input: DeleteCommentInput;
+};
+
+
+export type MutationDeleteProjectArgs = {
+  input: DeleteProjectInput;
+};
+
+
+export type MutationForgotPasswordArgs = {
+  input: UserForgotPasswordInput;
+};
+
+
+export type MutationGithubOauthArgs = {
+  input: GithubAuthInput;
+};
+
+
+export type MutationGoogleOauthArgs = {
+  input: GoogleAuthInput;
+};
+
+
+export type MutationLoginArgs = {
+  input: UserLoginInput;
+};
+
+
+export type MutationRegisterArgs = {
+  input: UserRegisterInput;
+};
+
+
+export type MutationResetPasswordArgs = {
+  input: UserResetPasswordInput;
+};
+
+
+export type MutationToggleVoteArgs = {
+  input?: InputMaybe;
+};
+
+
+export type MutationUpdateCommentArgs = {
+  input: UpdateCommentInput;
+};
+
+
+export type MutationUpdateProfileArgs = {
+  input?: InputMaybe;
+};
+
+
+export type MutationUpdateProjectArgs = {
+  input: UpdateProjectInput;
+};
+
+
+export type MutationUploadFileArgs = {
+  input: UploadInput;
+};
+
+
+export type MutationVerifyUserArgs = {
+  input: UserVerifyInput;
+};
+
+
+export type MutationViewNotificationArgs = {
+  input: ViewNotificationInput;
+};
+
+export type Notification = {
+  __typename?: 'Notification';
+  content?: Maybe;
+  createdAt?: Maybe;
+  id: Scalars['Int'];
+  projectId?: Maybe;
+  projectSlug?: Maybe;
+  receiverId?: Maybe;
+  sender?: Maybe;
+  senderId?: Maybe;
+  type?: Maybe;
+  updatedAt?: Maybe;
+  viewed?: Maybe;
+};
+
+export type NotificationInput = {
+  limit?: InputMaybe;
+  offset?: InputMaybe;
+  userId?: InputMaybe;
+};
+
+export type NotificationResponse = Response & {
+  __typename?: 'NotificationResponse';
+  data?: Maybe;
+  message?: Maybe;
+  status: Scalars['Boolean'];
+};
+
+export type NotificationsResponse = Response & {
+  __typename?: 'NotificationsResponse';
+  data?: Maybe>>;
+  message?: Maybe;
+  status: Scalars['Boolean'];
+};
+
+export type PageView = {
+  __typename?: 'PageView';
+  createdAt?: Maybe;
+  id: Scalars['Int'];
+  ip: Scalars['String'];
+  updatedAt?: Maybe;
+};
+
+export type PageViewResponse = {
+  __typename?: 'PageViewResponse';
+  data?: Maybe>>;
+  message?: Maybe;
+  status: Scalars['Boolean'];
+};
+
+export type Project = {
+  __typename?: 'Project';
+  _count?: Maybe;
+  author?: Maybe;
+  comments?: Maybe>>;
+  content?: Maybe;
+  createdAt?: Maybe;
+  description?: Maybe;
+  files?: Maybe>>;
+  hasvoted?: Maybe;
+  id: Scalars['String'];
+  isProjectOwner?: Maybe;
+  rank?: Maybe;
+  slug?: Maybe;
+  tags?: Maybe>>;
+  title?: Maybe;
+  updatedAt?: Maybe;
+  votes?: Maybe>>;
+};
+
+export type ProjectCountPayload = {
+  __typename?: 'ProjectCountPayload';
+  comments?: Maybe;
+  votes?: Maybe;
+};
+
+export type ProjectInput = {
+  id: Scalars['String'];
+  vote_limit?: InputMaybe;
+  vote_offset?: InputMaybe;
+};
+
+export type ProjectResponse = Response & {
+  __typename?: 'ProjectResponse';
+  data?: Maybe;
+  message?: Maybe;
+  status: Scalars['Boolean'];
+};
+
+export type ProjectsInput = {
+  limit?: InputMaybe;
+  offset?: InputMaybe;
+};
+
+export type ProjectsResponse = Response & {
+  __typename?: 'ProjectsResponse';
+  data: Array;
+  message?: Maybe;
+  status: Scalars['Boolean'];
+};
+
+export enum PushNotificationType {
+  Comment = 'COMMENT',
+  Mention = 'MENTION',
+  Reply = 'REPLY',
+  Upvote = 'UPVOTE'
+}
+
+export type Query = {
+  __typename?: 'Query';
+  comments?: Maybe;
+  me?: Maybe;
+  mostActiveUsers?: Maybe;
+  notifications?: Maybe;
+  pageViews?: Maybe;
+  project?: Maybe;
+  projects?: Maybe;
+  tags?: Maybe;
+  user?: Maybe;
+  users?: Maybe;
+  usersWhoComment?: Maybe;
+};
+
+
+export type QueryCommentsArgs = {
+  input: CommentsInput;
+};
+
+
+export type QueryNotificationsArgs = {
+  input: NotificationInput;
+};
+
+
+export type QueryProjectArgs = {
+  input: ProjectInput;
+};
+
+
+export type QueryProjectsArgs = {
+  input: ProjectsInput;
+};
+
+
+export type QueryUserArgs = {
+  input: UserInput;
+};
+
+
+export type QueryUsersArgs = {
+  input: UsersInput;
+};
+
+
+export type QueryUsersWhoCommentArgs = {
+  input: ProjectInput;
+};
+
+export type ResetPasswordResponse = Response & {
+  __typename?: 'ResetPasswordResponse';
+  data?: Maybe;
+  message?: Maybe;
+  status: Scalars['Boolean'];
+};
+
+export type Response = {
+  message?: Maybe;
+  status: Scalars['Boolean'];
+};
+
+export type SimpleAuthResponse = Response & {
+  __typename?: 'SimpleAuthResponse';
+  message?: Maybe;
+  status: Scalars['Boolean'];
+};
+
+export type Subscription = {
+  __typename?: 'Subscription';
+  commentCreated?: Maybe;
+  mentionCreated?: Maybe;
+  replyCreated?: Maybe;
+  upvoteCreated?: Maybe;
+};
+
+export type Tag = {
+  __typename?: 'Tag';
+  id: Scalars['Int'];
+  projects?: Maybe>>;
+  value: Scalars['String'];
+};
+
+export type TagInput = {
+  id?: InputMaybe;
+  value: Scalars['String'];
+};
+
+export type TagsResponse = Response & {
+  __typename?: 'TagsResponse';
+  data?: Maybe>;
+  message?: Maybe;
+  status: Scalars['Boolean'];
+};
+
+export type ToggleVoteInput = {
+  id: Scalars['String'];
+};
+
+export type UpdateCommentInput = {
+  commentId: Scalars['Int'];
+  message?: InputMaybe;
+};
+
+export type UpdateProfileInput = {
+  banner?: InputMaybe;
+  bio?: InputMaybe;
+  country?: InputMaybe;
+  file?: InputMaybe;
+  firstname?: InputMaybe;
+  id: Scalars['String'];
+  jobTitle?: InputMaybe;
+  lastname?: InputMaybe;
+  showProfession?: InputMaybe;
+  username?: InputMaybe;
+  website?: InputMaybe;
+};
+
+export type UpdateProjectInput = {
+  content?: InputMaybe;
+  description?: InputMaybe;
+  file?: InputMaybe;
+  projectId: Scalars['String'];
+  tags?: InputMaybe>>;
+  title?: InputMaybe;
+};
+
+export type UploadInput = {
+  file?: InputMaybe;
+};
+
+export type UploadResponse = Response & {
+  __typename?: 'UploadResponse';
+  message?: Maybe;
+  status: Scalars['Boolean'];
+  url?: Maybe;
+};
+
+export type UpvoteSubscriptionResponse = {
+  __typename?: 'UpvoteSubscriptionResponse';
+  data?: Maybe;
+  message?: Maybe;
+  type?: Maybe;
+};
+
+export type User = {
+  __typename?: 'User';
+  avatar?: Maybe;
+  banner?: Maybe;
+  bio?: Maybe;
+  country?: Maybe;
+  createdAt?: Maybe;
+  email: Scalars['String'];
+  firstname?: Maybe;
+  id: Scalars['String'];
+  jobTitle?: Maybe;
+  lastname?: Maybe;
+  projects?: Maybe>>;
+  showProfession?: Maybe;
+  updatedAt?: Maybe;
+  username: Scalars['String'];
+  verifiedAt?: Maybe;
+  votes?: Maybe>>;
+  website?: Maybe;
+};
+
+export type UserForgotPasswordInput = {
+  email: Scalars['String'];
+};
+
+export type UserInput = {
+  username: Scalars['String'];
+};
+
+export type UserLoginInput = {
+  email: Scalars['String'];
+  password: Scalars['String'];
+};
+
+export type UserRegisterInput = {
+  email: Scalars['String'];
+  password: Scalars['String'];
+  username: Scalars['String'];
+};
+
+export type UserResetPasswordInput = {
+  password: Scalars['String'];
+  token: Scalars['String'];
+};
+
+export type UserResponse = Response & {
+  __typename?: 'UserResponse';
+  data?: Maybe;
+  message?: Maybe;
+  status: Scalars['Boolean'];
+};
+
+export type UserVerifyInput = {
+  token: Scalars['String'];
+};
+
+export type UsersInput = {
+  limit?: InputMaybe;
+  offset?: InputMaybe;
+};
+
+export type UsersResponse = Response & {
+  __typename?: 'UsersResponse';
+  data?: Maybe>>;
+  message?: Maybe;
+  status: Scalars['Boolean'];
+};
+
+export type ViewNotificationInput = {
+  notificationId: Scalars['Int'];
+};
+
+export type Vote = {
+  __typename?: 'Vote';
+  author?: Maybe;
+  createdAt?: Maybe;
+  id: Scalars['Int'];
+  project?: Maybe;
+  updatedAt?: Maybe;
+};
+
+export type VoteResponse = Response & {
+  __typename?: 'VoteResponse';
+  data?: Maybe;
+  message?: Maybe;
+  status: Scalars['Boolean'];
+};
diff --git a/hooks/index.ts b/hooks/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..974b7b0cb44ec36819373b2f15268b53f77fd4c1
--- /dev/null
+++ b/hooks/index.ts
@@ -0,0 +1,2 @@
+export * from "./useMonaco";
+export * from "./useTree";
diff --git a/hooks/useMonaco.ts b/hooks/useMonaco.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9806eac6dcf6bc18cdaf7e431f7c6bec9e8543ec
--- /dev/null
+++ b/hooks/useMonaco.ts
@@ -0,0 +1,117 @@
+import { useRef, useState } from "react";
+import { IKeyboardEvent } from "monaco-editor";
+import { useDebounce } from "use-debounce";
+import { OnChange, OnMount } from "@monaco-editor/react";
+import parserHtml from "prettier/parser-html";
+import parserCss from "prettier/parser-postcss";
+import parserBabel from "prettier/parser-babel";
+import prettier from "prettier";
+import { useAppSelector } from "../store/hook";
+import { theme_state } from "../store/features/themeSlice";
+
+export const useMonaco = () => {
+  const { theme } = useAppSelector(theme_state);
+  const codeEditor = useRef();
+
+  const [input, setInput] = useState("");
+  const [code] = useDebounce(input, 1000);
+
+  const onChange: OnChange = (value) => {
+    setInput(value);
+  };
+
+  const onMount: OnMount = async (monacoEditor, monaco) => {
+    codeEditor.current = monacoEditor;
+
+    monaco.editor.defineTheme("myTheme", {
+      base: "vs-dark",
+      inherit: true,
+      rules: [{ background: theme.background, token: "" }],
+      colors: {
+        "editor.background": theme.foreground,
+      },
+    });
+
+    monaco.editor.setTheme("myTheme");
+
+    const { default: traverse } = await import("@babel/traverse");
+    const { parse } = await import("@babel/parser");
+    const { default: MonacoJSXHighlighter } = await import(
+      "monaco-jsx-highlighter"
+    );
+
+    //jsx syntax highlight
+    const babelParse = (code: any) =>
+      parse(code, { sourceType: "module", plugins: ["jsx"] });
+
+    const monacoJSXHighlighter = new MonacoJSXHighlighter(
+      //@ts-ignore
+      monaco,
+      babelParse,
+      traverse,
+      monacoEditor
+    );
+
+    monacoJSXHighlighter.highLightOnDidChangeModelContent(
+      0,
+      () => {},
+      () => {},
+      undefined,
+      () => {}
+    );
+
+    //format code
+    function formatOnSave() {
+      const unformattedCode = codeEditor.current.getModel().getValue();
+      const lang = codeEditor.current.getModel()._languageIdentifier.language;
+
+      let config;
+
+      switch (lang) {
+        case "html":
+          config = { parser: "html", plugin: [parserHtml] };
+          break;
+
+        case "css":
+          config = { parser: "css", plugin: [parserCss] };
+          break;
+
+        case "javascript":
+          config = { parser: "babel", plugin: [parserBabel] };
+          break;
+
+        default:
+          break;
+      }
+
+      const formattedCode = prettier.format(unformattedCode, {
+        parser: config && config.parser,
+        plugins: config && config.plugin,
+        useTabs: false,
+        semi: true,
+      });
+
+      codeEditor.current.setValue(formattedCode);
+    }
+
+    //save command
+    let handleOnKeyDown = codeEditor.current.onKeyDown(
+      (event: IKeyboardEvent) => {
+        if (
+          (window.navigator.platform.match("Mac")
+            ? event.metaKey
+            : event.ctrlKey) &&
+          event.code === "KeyS"
+        ) {
+          event.preventDefault();
+          formatOnSave();
+        }
+      }
+    );
+
+    //cleaning up
+    return () => handleOnKeyDown.dispose();
+  };
+
+  return { onMount, onChange, code };
+};
diff --git a/hooks/useOutsideRef.ts b/hooks/useOutsideRef.ts
new file mode 100644
index 0000000000000000000000000000000000000000..4bfe63fc9075cc538c258d0dec1a909628069a4e
--- /dev/null
+++ b/hooks/useOutsideRef.ts
@@ -0,0 +1,26 @@
+import { useEffect, useState } from "react";
+
+const UseOutsideRef = (ref: any) => {
+  const [isOutsideRef, setIsOutsideRef] = useState(false);
+
+  useEffect(() => {
+    function handleClickOutside(event: any) {
+      if (ref.current && !ref.current.contains(event.target)) {
+        setIsOutsideRef(true);
+
+        setTimeout(() => {
+          setIsOutsideRef(false);
+        }, 200);
+      }
+    }
+
+    document.addEventListener("mousedown", handleClickOutside);
+    return () => {
+      document.removeEventListener("mousedown", handleClickOutside);
+    };
+  }, [ref]);
+
+  return { isOutsideRef };
+};
+
+export default UseOutsideRef;
diff --git a/hooks/useTree.ts b/hooks/useTree.ts
new file mode 100644
index 0000000000000000000000000000000000000000..82a9e0d418086ba998b2c66a79fc9e9945a512a3
--- /dev/null
+++ b/hooks/useTree.ts
@@ -0,0 +1,21 @@
+import { useAppDispatch } from "../store/hook";
+import {
+  set_monaco_input_value,
+  set_editor_value,
+  clear_logs,
+} from "../store/features/editorSlice";
+import { close_modal } from "../store/features/modalSlice";
+import { EditorValueInterface } from "../_types/editorTypes";
+
+export const useTree = () => {
+  const dispatch = useAppDispatch();
+
+  const setTree = (data: EditorValueInterface) => {
+    dispatch(clear_logs());
+    dispatch(set_monaco_input_value(data));
+    dispatch(set_editor_value(data));
+    dispatch(close_modal());
+  };
+
+  return { setTree };
+};
diff --git a/next-env.d.ts b/next-env.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..4f11a03dc6cc37f2b5105c08f2e7b24c603ab2f4
--- /dev/null
+++ b/next-env.d.ts
@@ -0,0 +1,5 @@
+/// 
+        
+           
+       
+    >
+  );
+}
+
+export default MyApp;
+
+MyApp.getInitialProps = async (appContext: AppContext) => {
+  const appProps = await App.getInitialProps(appContext);
+
+  /*
+  try {
+    if (appContext.ctx.req && appContext.ctx.res) {
+      const session = await getIronSession(
+        appContext.ctx.req,
+        appContext.ctx.res,
+        sessionOptions
+      );
+  
+      return {
+        ...appProps,
+        initialUser: session.user,
+      };
+    }
+  } catch (err) {
+    console.warn(err);
+  }
+  */
+
+  return appProps;
+};
diff --git a/pages/api/chat/index.ts b/pages/api/chat/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9f5604e17b478dda95efef88d635dcb2b3c92856
--- /dev/null
+++ b/pages/api/chat/index.ts
@@ -0,0 +1,30 @@
+import { OpenAIStream, StreamingTextResponse } from "ai";
+import { Configuration, OpenAIApi } from "openai-edge";
+
+const config = new Configuration({
+    apiKey: process.env.OPENAI_API_KEY,
+});
+const openai = new OpenAIApi(config);
+
+export const runtime = "edge";
+
+export default async function(req: Request) {
+    let { messages } = await req.json();
+
+    // Prepend the system message if it's not already there
+    if (messages.length === 0 || messages[0].role !== "system") {
+        messages = [{
+            role: "system",
+            content: "You are a helpful AI assistant. Assist the user in writing React code, ensuring that all logic is contained within a single app component file and that the output is rendered to the DOM's root element."
+        }, ...messages];
+    }
+
+    const response = await openai.createChatCompletion({
+        model: 'gpt-4',
+        stream: true,
+        messages
+    })
+
+    const stream = OpenAIStream(response);
+    return new StreamingTextResponse(stream);
+}
diff --git a/pages/api/logout.ts b/pages/api/logout.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e7a6a2701b7c427d9a49d857324bad48d8a78b99
--- /dev/null
+++ b/pages/api/logout.ts
@@ -0,0 +1,10 @@
+import { withSessionApiRoute } from "../../utils/withSession";
+
+export default withSessionApiRoute(async (req, res) => {
+  try {
+    req.session.destroy();
+    res.json({ isLoggedIn: false, code: 200, message: "logout successfully" });
+  } catch (error: any) {
+    res.status(500).json({ message: error.message });
+  }
+});
diff --git a/pages/api/oauth/github.ts b/pages/api/oauth/github.ts
new file mode 100644
index 0000000000000000000000000000000000000000..337d56cb33f67ad5d8533077713a4faa1c121586
--- /dev/null
+++ b/pages/api/oauth/github.ts
@@ -0,0 +1,27 @@
+import { withSessionApiRoute } from "../../../utils/withSession";
+import { createApolloClient } from "../../../utils/client";
+import { githubOauthMutation } from "../../../graphql/definitions/auth.definition";
+
+export default withSessionApiRoute(async (req, res) => {
+  const client = createApolloClient();
+
+  try {
+    const data = await client.mutate({
+      mutation: githubOauthMutation,
+      variables: { input: req.body },
+    });
+
+    if (!data.data.githubOauth.status) {
+      res.json({ isLoggedIn: false, ...data.data.githubOauth });
+      return;
+    }
+
+    const user = { isLoggedIn: true, ...data.data.githubOauth };
+    req.session.user = user;
+
+    await req.session.save();
+    res.json(user);
+  } catch (error: any) {
+    res.status(500).json({ message: error.message });
+  }
+});
diff --git a/pages/api/oauth/google.ts b/pages/api/oauth/google.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6d02e3b5b424d84964dfe9e6a7553fcd56777aaa
--- /dev/null
+++ b/pages/api/oauth/google.ts
@@ -0,0 +1,27 @@
+import { withSessionApiRoute } from "../../../utils/withSession";
+import { createApolloClient } from "../../../utils/client";
+import { googleOauthMutation } from "../../../graphql/definitions/auth.definition";
+
+export default withSessionApiRoute(async (req, res) => {
+  const client = createApolloClient();
+
+  try {
+    const data = await client.mutate({
+      mutation: googleOauthMutation,
+      variables: { input: req.body },
+    });
+
+    if (!data.data.googleOauth.status) {
+      res.json({ isLoggedIn: false, ...data.data.googleOauth });
+      return;
+    }
+
+    const user = { isLoggedIn: true, ...data.data.googleOauth };
+    req.session.user = user;
+
+    await req.session.save();
+    res.json(user);
+  } catch (error: any) {
+    res.status(500).json({ message: error.message });
+  }
+});
diff --git a/pages/api/updateUser.ts b/pages/api/updateUser.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b706f7bd9cbcde7a7f270254792f46a837099f06
--- /dev/null
+++ b/pages/api/updateUser.ts
@@ -0,0 +1,19 @@
+import { withSessionApiRoute } from "../../utils/withSession";
+
+export default withSessionApiRoute(async (req, res) => {
+  const userData = await req.session.user;
+
+  const user = {
+    ...userData,
+    data: {
+      ...userData?.data,
+      ...(req.body.avatar && { avatar: req.body.avatar }),
+      ...(req.body.username && { username: req.body.username }),
+    },
+  };
+
+  // @ts-ignore
+  req.session.user = user;
+  await req.session.save();
+  res.json(user);
+});
diff --git a/pages/index.tsx b/pages/index.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..9ccfe3fa464623f97426f301470ba9633df351de
--- /dev/null
+++ b/pages/index.tsx
@@ -0,0 +1,14 @@
+import React from "react";
+import Playground from "../components/Playground";
+import { Header } from "../components/Header";
+
+const Index = () => {
+  return (
+    <>
+      
+      
+      
+  );
+};
+
+export default Github;
diff --git a/pages/oauth/google.tsx b/pages/oauth/google.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..66f2d4290ace3952cfc635cd53a2e9dda761beee
--- /dev/null
+++ b/pages/oauth/google.tsx
@@ -0,0 +1,26 @@
+import React, { useEffect } from "react";
+import { useRouter } from "next/router";
+import Loader from "../../components/Loader";
+
+const Google = () => {
+  const { query } = useRouter();
+
+  useEffect(() => {
+    if (query.code) {
+      new Promise((resolve) => {
+        window?.opener && window.opener.withOauth(query, "google");
+        resolve("done");
+      }).then(() => {
+        window.close();
+      });
+    }
+  }, [query]);
+
+  return (
+    
+      
+  );
+};
+
+export default Google;
diff --git a/postcss.config.js b/postcss.config.js
new file mode 100644
index 0000000000000000000000000000000000000000..33ad091d26d8a9dc95ebdf616e217d985ec215b8
--- /dev/null
+++ b/postcss.config.js
@@ -0,0 +1,6 @@
+module.exports = {
+  plugins: {
+    tailwindcss: {},
+    autoprefixer: {},
+  },
+}
diff --git a/public/favicon.ico b/public/favicon.ico
new file mode 100644
index 0000000000000000000000000000000000000000..718d6fea4835ec2d246af9800eddb7ffb276240c
Binary files /dev/null and b/public/favicon.ico differ
diff --git a/public/font/GTWalsheimPro-Black.ttf b/public/font/GTWalsheimPro-Black.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..eab3013e499bc13fd1e2dd3ec60042059c3c01ad
Binary files /dev/null and b/public/font/GTWalsheimPro-Black.ttf differ
diff --git a/public/font/GTWalsheimPro-Bold.ttf b/public/font/GTWalsheimPro-Bold.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..07e29e6e14269108c3cbebf9fc8e1c869db139c4
Binary files /dev/null and b/public/font/GTWalsheimPro-Bold.ttf differ
diff --git a/public/font/GTWalsheimPro-Light.ttf b/public/font/GTWalsheimPro-Light.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..c08acad0c00034a4e106215ab88945cac81cff6e
Binary files /dev/null and b/public/font/GTWalsheimPro-Light.ttf differ
diff --git a/public/font/GTWalsheimPro-Medium.ttf b/public/font/GTWalsheimPro-Medium.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..40079244dea939f9379008a830d5f189df97c802
Binary files /dev/null and b/public/font/GTWalsheimPro-Medium.ttf differ
diff --git a/public/font/GTWalsheimPro-Regular.ttf b/public/font/GTWalsheimPro-Regular.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..f5906f2e01d4dae77bb7b2369758dcbf6824e9b3
Binary files /dev/null and b/public/font/GTWalsheimPro-Regular.ttf differ
diff --git a/public/font/GTWalsheimPro-Thin.ttf b/public/font/GTWalsheimPro-Thin.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..ab2a1e2279f2256535a1d2872410721693fd8473
Binary files /dev/null and b/public/font/GTWalsheimPro-Thin.ttf differ
diff --git a/public/font/GTWalsheimPro-UltraLight.ttf b/public/font/GTWalsheimPro-UltraLight.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..98cb4bd4d9155998fe0dc57a360dfaf7cf66cf3d
Binary files /dev/null and b/public/font/GTWalsheimPro-UltraLight.ttf differ
diff --git a/public/font/stylesheet.css b/public/font/stylesheet.css
new file mode 100644
index 0000000000000000000000000000000000000000..44794b24cdd5879dbbbdb64d5201394a24cc52c2
--- /dev/null
+++ b/public/font/stylesheet.css
@@ -0,0 +1,55 @@
+@font-face {
+  font-family: "GT Walsheim Pro";
+  src: local("GT Walsheim Pro Light"), local("GTWalsheimPro-Light"),
+    url("GTWalsheimPro-Light.ttf") format("truetype");
+  font-weight: 300;
+  font-style: normal;
+}
+
+@font-face {
+  font-family: "GT Walsheim Pro";
+  src: local("GT Walsheim Pro Regular"), local("GTWalsheimPro-Regular"),
+    url("GTWalsheimPro-Regular.ttf") format("truetype");
+  font-weight: normal;
+  font-style: normal;
+}
+
+@font-face {
+  font-family: "GT Walsheim Pro";
+  src: local("GT Walsheim Pro Thin"), local("GTWalsheimPro-Thin"),
+    url("GTWalsheimPro-Thin.ttf") format("truetype");
+  font-weight: 100;
+  font-style: normal;
+}
+
+@font-face {
+  font-family: "GT Walsheim Pro";
+  src: local("GT Walsheim Pro Bold"), local("GTWalsheimPro-Bold"),
+    url("GTWalsheimPro-Bold.ttf") format("truetype");
+  font-weight: bold;
+  font-style: normal;
+}
+
+@font-face {
+  font-family: "GT Walsheim Pro";
+  src: local("GT Walsheim Pro Medium"), local("GTWalsheimPro-Medium"),
+    url("GTWalsheimPro-Medium.ttf") format("truetype");
+  font-weight: 500;
+  font-style: normal;
+}
+
+@font-face {
+  font-family: "GT Walsheim Pro Ultra";
+  src: local("GT Walsheim Pro Ultra Light"), local("GTWalsheimPro-UltraLight"),
+    url("GTWalsheimPro-UltraLight.ttf") format("truetype");
+  font-weight: 200;
+  font-style: normal;
+}
+
+@font-face {
+  font-family: "GT Walsheim Pro";
+  src: local("GT Walsheim Pro Black"), local("GTWalsheimPro-Black"),
+    url("GTWalsheimPro-Black.ttf") format("truetype");
+  font-weight: 900;
+  font-style: normal;
+}
diff --git a/public/icons/clear-outlined.svg b/public/icons/clear-outlined.svg
new file mode 100644
index 0000000000000000000000000000000000000000..0a07a03757544736023c525b9f3de8940dd96378
--- /dev/null
+++ b/public/icons/clear-outlined.svg
@@ -0,0 +1 @@
+
+     
\ No newline at end of file
diff --git a/public/icons/reactjs.svg b/public/icons/reactjs.svg
new file mode 100644
index 0000000000000000000000000000000000000000..903b854e7d8927f59460f0b97827d6df4d76ac6e
--- /dev/null
+++ b/public/icons/reactjs.svg
@@ -0,0 +1 @@
+
+  
+    
+   
+  web-assembly-icon 
+  
+    
+      
+         
+     
+   
+ 
diff --git a/public/preview-image.png b/public/preview-image.png
new file mode 100644
index 0000000000000000000000000000000000000000..280df803f2dbaf296a2e274596c2ac741a9beaef
Binary files /dev/null and b/public/preview-image.png differ
diff --git a/public/vercel.svg b/public/vercel.svg
new file mode 100644
index 0000000000000000000000000000000000000000..fbf0e25a651c28931b2fe8afa2947e124eebc74f
--- /dev/null
+++ b/public/vercel.svg
@@ -0,0 +1,4 @@
+
+     
\ No newline at end of file
diff --git a/store/features/authSlice.ts b/store/features/authSlice.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ccb58cff96224a08586b20304f7f80131c6b8686
--- /dev/null
+++ b/store/features/authSlice.ts
@@ -0,0 +1,126 @@
+import { createSlice } from "@reduxjs/toolkit";
+import { RootState } from "../store";
+import axios from "axios";
+import {
+  GoogleAuthInput,
+  GithubAuthInput,
+} from "../../graphql/generated/graphql";
+import { IronSessionData } from "iron-session";
+
+export type OauthProvider = "google" | "github";
+export type OauthInput = GoogleAuthInput | GithubAuthInput;
+
+type InitialStateType = {
+  user: IronSessionData["user"] | null;
+  errors: any;
+  isLoadingLogin: boolean;
+  isLoadingLogout: boolean;
+};
+
+const initialState = {
+  user: {
+    isLoggedIn: false,
+    data: {
+      id: "",
+      email: "",
+      username: "",
+      avatar: undefined,
+      bio: undefined,
+      website: undefined,
+      verifiedAt: undefined,
+      createdAt: undefined,
+      updatedAt: undefined,
+    },
+    token: undefined,
+    status: false,
+  },
+  errors: null,
+  isLoadingLogin: false,
+  isLoadingLogout: false,
+};
+
+export const authSlice = createSlice({
+  name: "auth",
+  initialState: initialState,
+  reducers: {
+    set_initial_user: (state: InitialStateType, { payload }) => {
+      state.user = payload;
+      state.errors = null;
+    },
+    with_oauth: (state: InitialStateType) => {
+      state.isLoadingLogin = true;
+    },
+    with_oauth_success: (state: InitialStateType, { payload }) => {
+      state.isLoadingLogin = false;
+      state.user = payload;
+      state.errors = null;
+    },
+    with_oauth_failure: (state: InitialStateType, { payload }) => {
+      state.isLoadingLogin = false;
+      state.user = null;
+      state.errors = payload;
+    },
+    logout_user: (state: InitialStateType) => {
+      state.isLoadingLogout = true;
+    },
+    logout_user_success: (state: InitialStateType) => {
+      state.isLoadingLogout = false;
+      state.user = null;
+      state.errors = null;
+    },
+    logout_user_failure: (state: InitialStateType, { payload }) => {
+      state.isLoadingLogout = false;
+      state.errors = payload;
+    },
+  },
+});
+
+export const {
+  set_initial_user,
+  with_oauth,
+  with_oauth_success,
+  with_oauth_failure,
+  logout_user,
+  logout_user_success,
+  logout_user_failure,
+} = authSlice.actions;
+
+export const auth_state = (state: RootState) => state.auth;
+
+export default authSlice.reducer;
+
+export function withOauth(input: OauthInput, provider: OauthProvider) {
+  return async (dispatch: any) => {
+    dispatch(with_oauth());
+
+    try {
+      const res = await axios.post(`/api/oauth/${provider}`, input);
+
+      if (res.data.status) {
+        dispatch(with_oauth_success(res.data));
+        return;
+      }
+
+      dispatch(with_oauth_failure(res.data.message));
+      return res.data;
+    } catch (err) {
+      // @ts-ignore
+      dispatch(with_oauth_failure(err.message));
+    }
+  };
+}
+
+export function logout() {
+  return async (dispatch: any) => {
+    dispatch(logout_user());
+
+    try {
+      axios.post("/api/logout").then(() => {
+        dispatch(logout_user_success());
+      });
+    } catch (err) {
+      // @ts-ignore
+      dispatch(logout_user_failure(err.message));
+    }
+  };
+}
diff --git a/store/features/compilerSlice.ts b/store/features/compilerSlice.ts
new file mode 100644
index 0000000000000000000000000000000000000000..dce35e415af542fc502b9970f0dc2ab72f046d3d
--- /dev/null
+++ b/store/features/compilerSlice.ts
@@ -0,0 +1,107 @@
+import { createSlice } from "@reduxjs/toolkit";
+import { RootState } from "../store";
+import * as esbuild from "esbuild-wasm";
+import { unpkgFetchPlugin, unpkgPathPlugin } from "../../esbuild/plugins";
+import { CompilerOutput, CompilerStatus } from "../../_types/compilerTypes";
+
+type InitialStateType = {
+  isInitializing: boolean;
+  esbuildStatus: CompilerStatus;
+  isCompiling: boolean;
+  output: CompilerOutput;
+};
+
+const initialState = {
+  isInitializing: false,
+  esbuildStatus: { isReady: false, error: "" },
+  isCompiling: false,
+  output: { code: "", error: "" },
+};
+
+export const compilerSlice = createSlice({
+  name: "compiler",
+  initialState: initialState,
+  reducers: {
+    init_esbuild: (state: InitialStateType) => {
+      state.isInitializing = true;
+    },
+    init_esbuild_success: (state: InitialStateType) => {
+      state.esbuildStatus.isReady = true;
+      state.esbuildStatus.error = "";
+      state.isInitializing = false;
+    },
+    init_esbuild_failure: (state: InitialStateType, { payload }) => {
+      state.esbuildStatus.isReady = false;
+      state.esbuildStatus.error = payload;
+      state.isInitializing = false;
+    },
+    compiled: (state: InitialStateType) => {
+      state.isCompiling = true;
+    },
+    compiled_success: (state: InitialStateType, { payload }) => {
+      state.output.code = payload;
+      state.output.error = "";
+      state.isCompiling = false;
+    },
+    compiled_failure: (state: InitialStateType, { payload }) => {
+      state.output.code = "";
+      state.output.error = payload;
+      state.isCompiling = false;
+    },
+  },
+});
+
+export const {
+  compiled,
+  compiled_success,
+  compiled_failure,
+  init_esbuild,
+  init_esbuild_success,
+  init_esbuild_failure,
+} = compilerSlice.actions;
+
+export const compiler_state = (state: RootState) => state.compiler;
+
+export default compilerSlice.reducer;
+
+// Asynchronous thunk action
+
+export function initEsbuild() {
+  return async (dispatch: any) => {
+    dispatch(init_esbuild());
+
+    await esbuild
+      .initialize({
+        worker: true,
+        wasmURL: "https://unpkg.com/esbuild-wasm@0.14.42/esbuild.wasm",
+      })
+      .then(() => {
+        dispatch(init_esbuild_success());
+      })
+      .catch((error) => dispatch(init_esbuild_failure(error.message)));
+  };
+}
+
+export function getCompileCode(rawCode: string, entryPoint: string) {
+  return async (dispatch: any) => {
+    dispatch(compiled());
+
+    try {
+      const result = await esbuild.build({
+        entryPoints: [`${entryPoint}`],
+        bundle: true,
+        write: false,
+        minify: true,
+        outdir: "/",
+        plugins: [unpkgPathPlugin(), unpkgFetchPlugin(rawCode, entryPoint)],
+        metafile: true,
+        allowOverwrite: true,
+      });
+
+      dispatch(compiled_success(result.outputFiles[0].text));
+    } catch (error) {
+      // @ts-ignore
+      dispatch(compiled_failure(error.message));
+    }
+  };
+}
diff --git a/store/features/editorSlice.ts b/store/features/editorSlice.ts
new file mode 100644
index 0000000000000000000000000000000000000000..bd5ab4b94060376f477170dfb52e244c281d882e
--- /dev/null
+++ b/store/features/editorSlice.ts
@@ -0,0 +1,65 @@
+import { createSlice, PayloadAction } from "@reduxjs/toolkit";
+import { RootState } from "../store";
+import { EditorValueInterface } from "../../_types/editorTypes";
+import { treeTemplates, monacoOptions } from "../../constants";
+
+type InitialStateType = {
+  editorValue: EditorValueInterface;
+  monacoInputValue: EditorValueInterface;
+  logs: any;
+  isLogTabOpen: boolean;
+  options: any;
+};
+
+const initialState = {
+  editorValue: treeTemplates["_empty"],
+  monacoInputValue: treeTemplates["_empty"],
+  logs: [],
+  isLogTabOpen: false,
+  options: monacoOptions,
+};
+
+export const editorSlice = createSlice({
+  name: "editor",
+  initialState: initialState,
+  reducers: {
+    set_editor_value: (state: InitialStateType, { payload }) => {
+      state.editorValue = payload;
+    },
+    update_editor_code: (state: InitialStateType, { payload }) => {
+      state.editorValue.tabs[payload.type].data = payload.content;
+    },
+    update_logs: (state: InitialStateType, { payload }) => {
+      state.logs = [...state.logs, payload];
+    },
+    clear_logs: (state: InitialStateType) => {
+      state.logs = [];
+    },
+    toggle_logs_tab: (state: InitialStateType) => {
+      state.isLogTabOpen = !state.isLogTabOpen;
+    },
+    set_monaco_input_value: (
+      state: InitialStateType,
+      { payload }: PayloadAction
+    ) => {
+      state.monacoInputValue = payload;
+    },
+    set_options: (state: InitialStateType, { payload }) => {
+      state.options = payload;
+    },
+  },
+});
+
+export const {
+  update_editor_code,
+  update_logs,
+  clear_logs,
+  toggle_logs_tab,
+  set_monaco_input_value,
+  set_editor_value,
+  set_options,
+} = editorSlice.actions;
+
+export const editor_state = (state: RootState) => state.editor;
+
+export default editorSlice.reducer;
diff --git a/store/features/modalSlice.ts b/store/features/modalSlice.ts
new file mode 100644
index 0000000000000000000000000000000000000000..2eec92decb19d25187c8cc70771323553554941c
--- /dev/null
+++ b/store/features/modalSlice.ts
@@ -0,0 +1,40 @@
+import { createSlice, PayloadAction } from "@reduxjs/toolkit";
+import { RootState } from "../store";
+
+export enum ModalEnum {
+  IDLE = "IDLE",
+  AUTH = "AUTH",
+  TEMPLATE = "TEMPLATE",
+  SETTINGS = "SETTINGS",
+}
+
+type InitialStateType = {
+  type: ModalEnum;
+  visible: boolean;
+};
+
+const initialState = {
+  type: ModalEnum.IDLE,
+  visible: false,
+};
+
+export const modalSlice = createSlice({
+  name: "modal",
+  initialState: initialState,
+  reducers: {
+    open_modal: (state: InitialStateType, action: PayloadAction) => {
+      state.type = action.payload;
+      state.visible = true;
+    },
+    close_modal: (state: InitialStateType) => {
+      state.type = ModalEnum.IDLE;
+      state.visible = false;
+    },
+  },
+});
+
+export const { open_modal, close_modal } = modalSlice.actions;
+
+export const modal_state = (state: RootState) => state.modal;
+
+export default modalSlice.reducer;
diff --git a/store/features/themeSlice.ts b/store/features/themeSlice.ts
new file mode 100644
index 0000000000000000000000000000000000000000..2397f46e8d7e9ae14ed17300d0dfbca80c288bd0
--- /dev/null
+++ b/store/features/themeSlice.ts
@@ -0,0 +1,34 @@
+import { createSlice, PayloadAction } from "@reduxjs/toolkit";
+import { RootState } from "../store";
+
+type InitialStateType = {
+  theme: {
+    text: string;
+    background: string;
+    foreground: string;
+    border: string;
+  };
+};
+
+const initialState = {
+  theme: {
+    text: "#ffffff",
+    background: "#171E25",
+    foreground: "#1B252D",
+    border: "#263440",
+  },
+};
+
+export const themeSlice = createSlice({
+  name: "theme",
+  initialState: initialState,
+  reducers: {
+    set_Theme: (state) => {},
+  },
+});
+
+export const { set_Theme } = themeSlice.actions;
+
+export const theme_state = (state: RootState) => state.theme;
+
+export default themeSlice.reducer;
diff --git a/store/hook.ts b/store/hook.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b266933387e5485a670b4ba80feb2207d4c615de
--- /dev/null
+++ b/store/hook.ts
@@ -0,0 +1,6 @@
+import { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux'
+import type { RootState, AppDispatch } from './store'
+
+// Use throughout your app instead of plain `useDispatch` and `useSelector`
+export const useAppDispatch = () => useDispatch()
+export const useAppSelector: TypedUseSelectorHook = useSelector
diff --git a/store/store.ts b/store/store.ts
new file mode 100644
index 0000000000000000000000000000000000000000..04446f16d24f89a8d1b95c59d039ef706088d371
--- /dev/null
+++ b/store/store.ts
@@ -0,0 +1,21 @@
+import { configureStore } from "@reduxjs/toolkit";
+
+import authSlice from "./features/authSlice";
+import editorReducer from "./features/editorSlice";
+import compilerReducer from "./features/compilerSlice";
+import modalReducer from "./features/modalSlice";
+import themeReducer from "./features/themeSlice";
+
+export const store = configureStore({
+  reducer: {
+    auth: authSlice,
+    editor: editorReducer,
+    compiler: compilerReducer,
+    modal: modalReducer,
+    theme: themeReducer,
+  },
+});
+
+export type RootState = ReturnType;
+// Inferred type: {posts: PostsState, comments: CommentsState, users: UsersState}
+export type AppDispatch = typeof store.dispatch;
diff --git a/styles/customlib/_customMonacoEditor.css b/styles/customlib/_customMonacoEditor.css
new file mode 100644
index 0000000000000000000000000000000000000000..4077062ec5a94ab59a777f372800c70372e1ceab
--- /dev/null
+++ b/styles/customlib/_customMonacoEditor.css
@@ -0,0 +1,202 @@
+/* MonacoHighlighter ============================================================================ */
+.editor-wrapper .mtk1 {
+    color: #d4d4d4;
+}
+.editor-wrapper .mtk2 {
+    color: #1e1e1e;
+}
+.editor-wrapper .mtk3 {
+    color: #000080;
+}
+.editor-wrapper .mtk4 {
+    color: #6a9955;
+}
+.editor-wrapper .mtk5 {
+    color: #569cd6;
+}
+.editor-wrapper .mtk6 {
+    color: #b5cea8;
+}
+.editor-wrapper .mtk7 {
+    color: #646695;
+}
+.editor-wrapper .mtk8 {
+    color: #c586c0;
+}
+.editor-wrapper .mtk9 {
+    color: #9cdcfe;
+}
+.editor-wrapper .mtk10 {
+    color: #f44747;
+}
+.editor-wrapper .mtk11 {
+    color: #ce9178;
+}
+.editor-wrapper .mtk12 {
+    color: #6796e6;
+}
+.editor-wrapper .mtk13 {
+    color: #808080;
+}
+.editor-wrapper .mtk14 {
+    color: #d16969;
+}
+.editor-wrapper .mtk15 {
+    color: #dcdcaa;
+}
+.editor-wrapper .mtk16 {
+    color: #4ec9b0;
+}
+.editor-wrapper .mtk17 {
+    color: #c586c0;
+}
+.editor-wrapper .mtk18 {
+    color: #4fc1ff;
+}
+.editor-wrapper .mtk19 {
+    color: #c8c8c8;
+}
+.editor-wrapper .mtk20 {
+    color: #cd9731;
+}
+.editor-wrapper .mtk21 {
+    color: #b267e6;
+}
+.editor-wrapper .mtki {
+    font-style: italic;
+}
+.editor-wrapper .mtkb {
+    font-weight: bold;
+}
+.editor-wrapper .mtku {
+    text-decoration: underline;
+    text-underline-position: under;
+}
+
+.editor-wrapper .mtk100.Identifier.JsxElement.Bracket {
+    color: #0080ff;
+}
+
+.editor-wrapper .mtk1000.Identifier.JsxOpeningElement.Bracket {
+    color: #808080;
+    font-weight: bold;
+}
+
+.editor-wrapper .mtk1001.Identifier.JsxClosingElement.Bracket {
+    color: #808080;
+    font-weight: lighter;
+}
+
+.editor-wrapper .mtk101.Identifier.JsxOpeningElement.Identifier {
+    color: #569cd6;
+}
+
+.editor-wrapper .mtk102.Identifier.JsxClosingElement.Identifier {
+    color: #569cd6;
+    font-weight: lighter;
+}
+
+.editor-wrapper .mtk103.Identifier.JsxAttribute.Identifier {
+    color: #9cdcfe;
+}
+
+.editor-wrapper .mtk104.JsxElement.JsxText {
+    color: darkgoldenrod;
+}
+
+.editor-wrapper .mtk105.glyph.Identifier.JsxElement {
+    background: #61dafb;
+    opacity: 0.25;
+}
+
+.editor-wrapper .mtk12.Identifier.JsxExpression.JsxClosingElement {
+    color: #ec5f67;
+}
+
+.editor-wrapper .mtk12.Identifier.JsxSelfClosingElement {
+    color: #ec5f67;
+}
+.editor-wrapper .mtk12.Identifier.VariableStatement.JsxClosingElement {
+    color: #ec5f67 !important;
+}
+.editor-wrapper .mtk12.VariableStatement.JsxSelfClosingElement.Identifier {
+    color: #ec5f67;
+}
+.editor-wrapper .mtk12.Identifier.JsxAttribute.VariableDeclaration {
+    color: crimson;
+}
+.editor-wrapper .mtk12.JsxExpression.VariableStatement {
+    color: #fac863;
+}
+.editor-wrapper .mtk12.VariableStatement.JsxSelfClosingElement {
+    color: #ede0e0;
+}
+.editor-wrapper .mtk12.VariableStatement.JsxClosingElement {
+    color: #ede0e0;
+}
+.editor-wrapper .JsxText {
+    color: #0c141f;
+}
+
+/* MonacoJSXHighlighter ============================================================================ */
+.JSXElement.JSXIdentifier {
+    color: #e06c75 !important;
+}
+
+.JSXElement.JSXBracket {
+    color: #d4d4d4 !important;
+}
+
+.JSXElement.JSXText {
+    color: #d4d4d4 !important;
+}
+
+.JSXElement.JSXGlyph {
+    background: cyan;
+    opacity: 0.25;
+}
+
+.JSXOpeningFragment.JSXBracket {
+    color: darkorange;
+    font-weight: bold;
+}
+
+.JSXClosingFragment.JSXBracket {
+    color: darkorange;
+    font-weight: bold;
+}
+
+.JSXOpeningElement.JSXBracket {
+    color: darkorange;
+    font-weight: bold;
+}
+
+.JSXOpeningElement.JSXIdentifier {
+    color: #e06c75 !important;
+}
+
+.JSXClosingElement.JSXBracket {
+    color: darkorange;
+    font-weight: lighter;
+}
+
+.JSXClosingElement.JSXIdentifier {
+    color: #e06c75 !important;
+    font-weight: lighter;
+}
+
+.JSXAttribute.JSXIdentifier {
+    color: steelblue;
+}
+
+.JSXExpressionContainer.JSXBracket {
+    color: darkorange;
+}
+
+.JSXSpreadChild.JSXBracket {
+    color: darkorange;
+}
+
+.JSXSpreadAttribute.JSXBracket {
+    color: darkorange;
+}
\ No newline at end of file
diff --git a/styles/customlib/_customTabs.css b/styles/customlib/_customTabs.css
new file mode 100644
index 0000000000000000000000000000000000000000..581a1cb23ed433f194ed184ebe388e8aec4ebf6d
--- /dev/null
+++ b/styles/customlib/_customTabs.css
@@ -0,0 +1,282 @@
+.textarea {
+  width: 100%;
+  min-height: 150px;
+  padding: 1rem;
+  font-size: 1rem;
+  line-height: 1.5;
+  border-radius: .25rem;
+  background-color: #1B252D;
+  -webkit-appearance: none;
+  -moz-appearance: none;
+  appearance: none;
+  resize: none;
+  transition: border-color .15s ease-in-out,box-shadow .15s ease-in-out;
+}
+
+.textarea:focus {
+  outline: 0;
+  box-shadow: 0 0 0 3px rgb(116, 177, 165);
+}
+
+.messages-text {
+  padding: 20px;
+}
+
+/* editor input ====================================*/
+.editor-input-tabs {
+  @apply flex h-full;
+}
+
+.editor-input-tabs .rc-tabs-tab-btn {
+  width: 5rem;
+  display: flex;
+  justify-content: center;
+  font-weight: bold;
+  font-size: 18px;
+  padding-bottom: 2px;
+  @apply text-gray-300;
+}
+
+.editor-input-tabs .rc-tabs-nav-wrap {
+}
+
+.editor-input-tabs .rc-tabs-tab:hover {
+}
+
+.editor-input-tabs .rc-tabs-tab-active {
+}
+
+.editor-input-tabs .margin-view-overlays {
+  margin-top: 10px;
+}
+
+.editor-input-tabs .lines-content.monaco-editor-background {
+  margin-top: 10px;
+}
+
+.editor-input-tabs .rc-tabs-ink-bar {
+  @apply bg-teal-500;
+}
+
+/* default  ====================================*/
+.rc-tabs-dropdown {
+  position: absolute;
+  background: #fefefe;
+  max-height: 200px;
+  overflow: auto;
+}
+.rc-tabs-dropdown-hidden {
+  display: none;
+}
+.rc-tabs-dropdown-menu {
+  margin: 0;
+  padding: 0;
+  list-style: none;
+}
+.rc-tabs-dropdown-menu-item {
+  padding: 4px 8px;
+}
+.rc-tabs-dropdown-menu-item-selected {
+  background: red;
+}
+.rc-tabs-dropdown-menu-item-disabled {
+  opacity: 0.3;
+  cursor: not-allowed;
+}
+.rc-tabs-content {
+  display: flex;
+  width: 100%;
+  height: 100%;
+}
+.rc-tabs-content-holder {
+  flex: auto;
+}
+.rc-tabs-content-animated {
+  transition: margin 0.3s;
+}
+.rc-tabs-tabpane {
+  width: 100%;
+  flex: none;
+}
+.rc-tabs {
+  display: flex;
+}
+.rc-tabs-top,
+.rc-tabs-bottom {
+  flex-direction: column;
+}
+.rc-tabs-top .rc-tabs-ink-bar,
+.rc-tabs-bottom .rc-tabs-ink-bar {
+  height: 3px;
+}
+.rc-tabs-top .rc-tabs-ink-bar {
+  bottom: 0;
+}
+.rc-tabs-bottom .rc-tabs-nav {
+  order: 1;
+}
+.rc-tabs-bottom .rc-tabs-content {
+  order: 0;
+}
+.rc-tabs-bottom .rc-tabs-ink-bar {
+  top: 0;
+}
+.rc-tabs-left.rc-tabs-editable .rc-tabs-tab,
+.rc-tabs-right.rc-tabs-editable .rc-tabs-tab {
+  padding-right: 32px;
+}
+.rc-tabs-left .rc-tabs-nav-wrap,
+.rc-tabs-right .rc-tabs-nav-wrap {
+  flex-direction: column;
+}
+.rc-tabs-left .rc-tabs-ink-bar,
+.rc-tabs-right .rc-tabs-ink-bar {
+  width: 3px;
+}
+.rc-tabs-left .rc-tabs-nav,
+.rc-tabs-right .rc-tabs-nav {
+  flex-direction: column;
+  min-width: 150px;
+}
+@media only screen and (max-width: 500px) {
+  .rc-tabs-left .rc-tabs-nav,
+  .rc-tabs-right .rc-tabs-nav {
+    min-width: 100px;
+  }
+}
+
+.rc-tabs-left .rc-tabs-nav-list,
+.rc-tabs-right .rc-tabs-nav-list {
+  flex-direction: column;
+}
+.rc-tabs-left .rc-tabs-nav-operations,
+.rc-tabs-right .rc-tabs-nav-operations {
+  flex-direction: column;
+}
+.rc-tabs-left .rc-tabs-ink-bar {
+  right: 0;
+}
+.rc-tabs-right .rc-tabs-nav {
+  order: 1;
+}
+.rc-tabs-right .rc-tabs-content {
+  order: 0;
+}
+.rc-tabs-right .rc-tabs-ink-bar {
+  left: 0;
+}
+.rc-tabs-rtl {
+  direction: rtl;
+}
+.rc-tabs-dropdown-rtl {
+  direction: rtl;
+}
+.rc-tabs {
+  font-size: 14px;
+  overflow: hidden;
+}
+.rc-tabs-nav {
+  display: flex;
+  flex: none;
+  position: relative;
+}
+.rc-tabs-nav-measure,
+.rc-tabs-nav-wrap {
+  transform: translate(0);
+  position: relative;
+  flex: auto;
+  white-space: nowrap;
+  overflow: hidden;
+  display: flex;
+}
+.rc-tabs-nav-measure-ping-left::before,
+.rc-tabs-nav-wrap-ping-left::before,
+.rc-tabs-nav-measure-ping-right::after,
+.rc-tabs-nav-wrap-ping-right::after {
+  content: "";
+  position: absolute;
+  top: 0;
+  bottom: 0;
+}
+.rc-tabs-nav-measure-ping-left::before,
+.rc-tabs-nav-wrap-ping-left::before {
+  left: 0;
+}
+.rc-tabs-nav-measure-ping-right::after,
+.rc-tabs-nav-wrap-ping-right::after {
+  right: 0;
+}
+.rc-tabs-nav-measure-ping-top::before,
+.rc-tabs-nav-wrap-ping-top::before,
+.rc-tabs-nav-measure-ping-bottom::after,
+.rc-tabs-nav-wrap-ping-bottom::after {
+  content: "";
+  position: absolute;
+  left: 0;
+  right: 0;
+}
+.rc-tabs-nav-measure-ping-top::before,
+.rc-tabs-nav-wrap-ping-top::before {
+  top: 0;
+}
+.rc-tabs-nav-measure-ping-bottom::after,
+.rc-tabs-nav-wrap-ping-bottom::after {
+  bottom: 0;
+}
+.rc-tabs-nav-list {
+  display: flex;
+  position: relative;
+  transition: transform 0.3s;
+}
+.rc-tabs-nav-operations {
+  display: flex;
+}
+.rc-tabs-nav-operations-hidden {
+  position: absolute;
+  visibility: hidden;
+  pointer-events: none;
+}
+.rc-tabs-nav-more {
+  border: 1px solid blue;
+  background: rgba(255, 0, 0, 0.1);
+}
+.rc-tabs-nav-add {
+  border: 1px solid green;
+  background: rgba(0, 255, 0, 0.1);
+}
+.rc-tabs-tab {
+  border: 0;
+  font-size: 20px;
+  margin: 0;
+  display: flex;
+  outline: none;
+  cursor: pointer;
+  position: relative;
+  font-weight: lighter;
+  align-items: center;
+}
+.rc-tabs-tab-btn,
+.rc-tabs-tab-remove {
+  border: 0;
+  background: transparent;
+}
+.rc-tabs-tab-btn {
+  font-weight: inherit;
+  line-height: 32px;
+}
+.rc-tabs-tab-remove:hover {
+  color: red;
+}
+.rc-tabs-tab-active {
+  font-weight: bolder;
+}
+.rc-tabs-ink-bar {
+  position: absolute;
+  pointer-events: none;
+}
+.rc-tabs-ink-bar-animated {
+  transition: all 0.3s;
+}
+.rc-tabs-extra-content {
+  flex: none;
+}
diff --git a/styles/globals.css b/styles/globals.css
new file mode 100644
index 0000000000000000000000000000000000000000..4b607f3910032e5b89446cdf97f24780552b96d4
--- /dev/null
+++ b/styles/globals.css
@@ -0,0 +1,132 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+html,
+body {
+  padding: 0;
+  margin: 0;
+  font-family: "GT Walsheim Pro", -apple-system, BlinkMacSystemFont, Segoe UI,
+    Roboto, Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue,
+    sans-serif;
+  color: white;
+}
+
+a {
+  color: inherit;
+  text-decoration: none;
+}
+
+* {
+  box-sizing: border-box;
+}
+
+*:focus {
+  outline: none !important;
+}
+
+/* editor settings forms ====================================*/
+
+.editor-sub-settings {
+  @apply flex flex-col my-3 w-full lg:w-2/3;
+}
+
+.editor-sub-settings > .title {
+  @apply text-base;
+}
+
+.editor-sub-settings > .description {
+  @apply text-gray-400 mb-2;
+}
+
+.editor-sub-settings > label {
+  @apply mb-2;
+}
+
+.editor-label {
+  @apply text-xl text-gray-400 mr-4;
+}
+
+.editor-select {
+  @apply text-gray-200 rounded-sm;
+}
+
+.editor-button {
+  @apply flex items-center justify-center px-4 rounded transform active:scale-75 transition-all duration-300;
+}
+
+/* iframe =========================================== */
+.iframe-container {
+  position: relative;
+  width: 100%;
+  height: 100%;
+  flex-grow: 1;
+  display: flex;
+  flex-direction: column;
+  justify-content: flex-end;
+}
+
+.iframe-container iframe {
+  background: #ffffff;
+  position: relative;
+  width: 100%;
+  height: 100%;
+}
+
+.react-draggable-transparent-selection .iframe-container:after {
+  content: "";
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  opacity: 0;
+}
+
+.error-message {
+  position: absolute;
+  top: 0;
+  color: red;
+}
+
+/* spinner =============================== */
+.loader-spinner {
+  border-top-color: #34d399;
+  -webkit-animation: spinner 0.7s linear infinite;
+  animation: spinner 0.7s linear infinite;
+}
+
+@-webkit-keyframes spinner {
+  0% {
+    -webkit-transform: rotate(0deg);
+  }
+  100% {
+    -webkit-transform: rotate(360deg);
+  }
+}
+
+@keyframes spinner {
+  0% {
+    transform: rotate(0deg);
+  }
+  100% {
+    transform: rotate(360deg);
+  }
+}
+
+.glassmorphism {
+  backdrop-filter: blur(10px) saturate(180%);
+  -webkit-backdrop-filter: blur(10px) saturate(180%);
+  background-color: rgba(23, 30, 37, 0.75);
+}
+
+.backdrop {
+  background: rgba(0, 0, 0, 0.25);
+  z-index: 50;
+  position: fixed;
+  top: 0;
+  left: 0;
+  height: 100%;
+  width: 100%;
+  overflow: auto;
+}
diff --git a/styles/iframeLoaderScreen.css b/styles/iframeLoaderScreen.css
new file mode 100644
index 0000000000000000000000000000000000000000..5332cfe3cdceac21ec34b69670ce679fc62b0085
--- /dev/null
+++ b/styles/iframeLoaderScreen.css
@@ -0,0 +1,179 @@
+.boxes {
+  z-index: 1000;
+  --size: 32px;
+  --duration: 800ms;
+  height: calc(var(--size) * 2);
+  width: calc(var(--size) * 3);
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  transform-style: preserve-3d;
+  transform-origin: 50% 50%;
+  margin-top: calc(var(--size) * 1.5 * -1);
+  transform: rotateX(60deg) rotateZ(45deg) rotateY(0deg) translateZ(0px)
+    translate(-50%, -50%);
+}
+
+.boxes .box {
+  width: var(--size);
+  height: var(--size);
+  top: 0;
+  left: 0;
+  position: absolute;
+  transform-style: preserve-3d;
+}
+
+.boxes .box:nth-child(1) {
+  transform: translate(100%, 0);
+  -webkit-animation: box1 var(--duration) linear infinite;
+  animation: box1 var(--duration) linear infinite;
+}
+
+.boxes .box:nth-child(2) {
+  transform: translate(0, 100%);
+  -webkit-animation: box2 var(--duration) linear infinite;
+  animation: box2 var(--duration) linear infinite;
+}
+
+.boxes .box:nth-child(3) {
+  transform: translate(100%, 100%);
+  -webkit-animation: box3 var(--duration) linear infinite;
+  animation: box3 var(--duration) linear infinite;
+}
+
+.boxes .box:nth-child(4) {
+  transform: translate(200%, 0);
+  -webkit-animation: box4 var(--duration) linear infinite;
+  animation: box4 var(--duration) linear infinite;
+}
+
+.boxes .box > div {
+  --background: #5c8df6;
+  --top: auto;
+  --right: auto;
+  --bottom: auto;
+  --left: auto;
+  --translateZ: calc(var(--size) / 2);
+  --rotateY: 0deg;
+  --rotateX: 0deg;
+  position: absolute;
+  width: 100%;
+  height: 100%;
+  background: var(--background);
+  top: var(--top);
+  right: var(--right);
+  bottom: var(--bottom);
+  left: var(--left);
+  transform: rotateY(var(--rotateY)) rotateX(var(--rotateX))
+    translateZ(var(--translateZ));
+}
+
+.boxes .box > div:nth-child(1) {
+  --top: 0;
+  --left: 0;
+}
+
+.boxes .box > div:nth-child(2) {
+  --background: #145af2;
+  --right: 0;
+  --rotateY: 90deg;
+}
+
+.boxes .box > div:nth-child(3) {
+  --background: #447cf5;
+  --rotateX: -90deg;
+}
+
+.boxes .box > div:nth-child(4) {
+  --background: #dbe3f4;
+  --top: 0;
+  --left: 0;
+  --translateZ: calc(var(--size) * 3 * -1);
+}
+
+@-webkit-keyframes box1 {
+  0%,
+  50% {
+    transform: translate(100%, 0);
+  }
+  100% {
+    transform: translate(200%, 0);
+  }
+}
+
+@keyframes box1 {
+  0%,
+  50% {
+    transform: translate(100%, 0);
+  }
+  100% {
+    transform: translate(200%, 0);
+  }
+}
+
+@-webkit-keyframes box2 {
+  0% {
+    transform: translate(0, 100%);
+  }
+  50% {
+    transform: translate(0, 0);
+  }
+  100% {
+    transform: translate(100%, 0);
+  }
+}
+
+@keyframes box2 {
+  0% {
+    transform: translate(0, 100%);
+  }
+  50% {
+    transform: translate(0, 0);
+  }
+  100% {
+    transform: translate(100%, 0);
+  }
+}
+@-webkit-keyframes box3 {
+  0%,
+  50% {
+    transform: translate(100%, 100%);
+  }
+  100% {
+    transform: translate(0, 100%);
+  }
+}
+
+@keyframes box3 {
+  0%,
+  50% {
+    transform: translate(100%, 100%);
+  }
+  100% {
+    transform: translate(0, 100%);
+  }
+}
+
+@-webkit-keyframes box4 {
+  0% {
+    transform: translate(200%, 0);
+  }
+  50% {
+    transform: translate(200%, 100%);
+  }
+  100% {
+    transform: translate(100%, 100%);
+  }
+}
+
+@keyframes box4 {
+  0% {
+    transform: translate(200%, 0);
+  }
+  50% {
+    transform: translate(200%, 100%);
+  }
+  100% {
+    transform: translate(100%, 100%);
+  }
+}
diff --git a/styles/loaders.css b/styles/loaders.css
new file mode 100644
index 0000000000000000000000000000000000000000..d3b482ce4f6912b4f2104eed9b965266377af593
--- /dev/null
+++ b/styles/loaders.css
@@ -0,0 +1,47 @@
+.loader {
+  display: flex;
+  align-items: center;
+  margin-bottom: 1px;
+}
+
+.loader::before,
+.loader::after {
+  content: "";
+  box-sizing: border-box;
+  position: absolute;
+}
+
+.loader.--1::before,
+.loader.--1::after {
+  width: 12px;
+  height: 7px;
+  border-radius: 2px;
+  opacity: 0;
+  animation: loader-1 1.4s cubic-bezier(0.2, 0.32, 0, 0.87) infinite;
+  @apply bg-teal-400;
+}
+
+.loader.--1::after {
+  animation-delay: 0.3s;
+}
+
+@keyframes loader-1 {
+  0%,
+  80%,
+  100% {
+    opacity: 0;
+  }
+
+  33% {
+    opacity: 1;
+  }
+
+  0%,
+  100% {
+    transform: translateX(-4vmin);
+  }
+
+  90% {
+    transform: translateX(4vmin);
+  }
+}
diff --git a/tailwind.config.js b/tailwind.config.js
new file mode 100644
index 0000000000000000000000000000000000000000..ca2d093759e40e2ae0405574cee0c3c2ca5b5eb1
--- /dev/null
+++ b/tailwind.config.js
@@ -0,0 +1,13 @@
+module.exports = {
+  content: [
+    "./pages/**/*.{js,ts,jsx,tsx}",
+    "./components/**/*.{js,ts,jsx,tsx}",
+  ],
+  theme: {
+    extend: {
+      animation: {
+        "pulse-slow": "pulse 3s linear infinite",
+      },
+    },
+  },
+};
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000000000000000000000000000000000000..e6bb8eb4397fcfaaa73202a0efdbae4cd06ea6ec
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,30 @@
+{
+  "compilerOptions": {
+    "target": "es5",
+    "lib": [
+      "dom",
+      "dom.iterable",
+      "esnext"
+    ],
+    "allowJs": true,
+    "skipLibCheck": true,
+    "strict": true,
+    "forceConsistentCasingInFileNames": true,
+    "noEmit": true,
+    "esModuleInterop": true,
+    "module": "esnext",
+    "moduleResolution": "node",
+    "resolveJsonModule": true,
+    "isolatedModules": true,
+    "jsx": "preserve",
+    "incremental": true
+  },
+  "include": [
+    "next-env.d.ts",
+    "**/*.ts",
+    "**/*.tsx"
+  ],
+  "exclude": [
+    "node_modules"
+  ]
+}
diff --git a/utils/client.ts b/utils/client.ts
new file mode 100644
index 0000000000000000000000000000000000000000..928e2b8305f08d3628c086abc569c2512c3ce09c
--- /dev/null
+++ b/utils/client.ts
@@ -0,0 +1,72 @@
+import { ApolloClient, InMemoryCache, ApolloLink, split } from "@apollo/client";
+import { createUploadLink } from "apollo-upload-client";
+import { GraphQLWsLink } from "@apollo/client/link/subscriptions";
+import { createClient } from "graphql-ws";
+import { getMainDefinition } from "@apollo/client/utilities";
+import { offsetLimitPagination } from "./offsetLimitPagination";
+
+const loggerLink = new ApolloLink((operation, forward) => {
+  return forward(operation).map((result) => {
+    console.info("response", result?.data);
+    return result;
+  });
+});
+
+const wsLink =
+  typeof window !== "undefined"
+    ? new GraphQLWsLink(
+        createClient({
+          url: `${process.env.NEXT_PUBLIC_WS_API_URL}`,
+        })
+      )
+    : null;
+
+const httpLink = (token?: string) =>
+  createUploadLink({
+    uri: process.env.NEXT_PUBLIC_API_URL,
+    headers: !token
+      ? { "apollo-require-preflight": true }
+      : {
+          authorization: `Bearer ${token}`,
+          "apollo-require-preflight": true,
+        },
+  });
+
+const splitLink = (token?: string) =>
+  typeof window !== "undefined" && wsLink != null
+    ? split(
+        ({ query }) => {
+          const definition = getMainDefinition(query);
+          return (
+            definition.kind === "OperationDefinition" &&
+            definition.operation === "subscription"
+          );
+        },
+        wsLink, // @ts-ignore
+        httpLink(token)
+      )
+    : httpLink(token);
+
+export const createApolloClient = (token?: string) => {
+  return new ApolloClient({
+    defaultOptions: {
+      query: {
+        errorPolicy: "all",
+      },
+      mutate: {
+        errorPolicy: "all",
+      },
+    },
+    // @ts-ignore
+    link: splitLink(token),
+    cache: new InMemoryCache({
+      typePolicies: {
+        Query: {
+          fields: {
+            projects: offsetLimitPagination(),
+          },
+        },
+      },
+    }),
+  });
+};
diff --git a/utils/createColors.ts b/utils/createColors.ts
new file mode 100644
index 0000000000000000000000000000000000000000..005ad027437a408fe5489cc71a81bc7c46e8f65d
--- /dev/null
+++ b/utils/createColors.ts
@@ -0,0 +1,50 @@
+const alphabet = [
+  "a",
+  "b",
+  "c",
+  "d",
+  "e",
+  "f",
+  "g",
+  "h",
+  "i",
+  "j",
+  "k",
+  "l",
+  "m",
+  "n",
+  "o",
+  "p",
+  "q",
+  "r",
+  "s",
+  "t",
+  "u",
+  "v",
+  "w",
+  "x",
+  "y",
+  "z",
+];
+
+const groupA = alphabet.slice(0, 5);
+const groupB = alphabet.slice(5, 10);
+const groupC = alphabet.slice(10, 15);
+const groupD = alphabet.slice(15, 20);
+const groupE = alphabet.slice(20, alphabet.length);
+
+interface CreateColors {
+  value?: string;
+}
+
+export const createColors = ({ value }: CreateColors): string => {
+  const chart = value?.trim().charAt(0).toLowerCase() ?? "";
+
+  if (groupA.includes(chart)) return "#0ea5e9";
+  if (groupB.includes(chart)) return "#d946ef";
+  if (groupC.includes(chart)) return "#14b8a6";
+  if (groupD.includes(chart)) return "#ec4899";
+  if (groupE.includes(chart)) return "#eab308";
+
+  return "#10b981";
+};
diff --git a/utils/createIframeContent.ts b/utils/createIframeContent.ts
new file mode 100644
index 0000000000000000000000000000000000000000..1bbb2f006f332cbefd7b2e67610d47dec1d8173d
--- /dev/null
+++ b/utils/createIframeContent.ts
@@ -0,0 +1,42 @@
+export const createIframeContent = (css: string, html: string) => {
+  return `
+  
+  
+    Codetree  
+    
+  
+  
+   
+    ${html}
+   
+    
+  
+
+  `;
+};
diff --git a/utils/emitter.ts b/utils/emitter.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d2347a2e74fece431b0f8f920064dc61c761e8cd
--- /dev/null
+++ b/utils/emitter.ts
@@ -0,0 +1,19 @@
+import EventEmitter from "eventemitter3";
+
+const eventEmitter = new EventEmitter();
+
+export enum EventType {
+  profileUpdated = "profileUpdated",
+  resetLocation = "resetLocation",
+}
+
+const Emitter = {
+  on: (event: any, fn: any) => eventEmitter.on(event, fn),
+  once: (event: any, fn: any) => eventEmitter.once(event, fn),
+  off: (event: any, fn: any) => eventEmitter.off(event, fn),
+  emit: (event: any, payload: any) => eventEmitter.emit(event, payload),
+};
+
+Object.freeze(Emitter);
+
+export default Emitter;
diff --git a/utils/getOAuthUrl.ts b/utils/getOAuthUrl.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a22f8f82e091dbfe7bc42717b06b7a24b8183eb2
--- /dev/null
+++ b/utils/getOAuthUrl.ts
@@ -0,0 +1,34 @@
+export function getGoogleOAuthURL() {
+  const rootUrl = "https://accounts.google.com/o/oauth2/v2/auth";
+
+  const options = {
+    redirect_uri: `${process.env.NEXT_PUBLIC_APP_URL}/oauth/google`,
+    client_id: `${process.env.NEXT_PUBLIC_GOOGLE_CLIENT_ID}`,
+    access_type: "offline",
+    response_type: "code",
+    prompt: "consent",
+    scope: [
+      "https://www.googleapis.com/auth/userinfo.profile",
+      "https://www.googleapis.com/auth/userinfo.email",
+    ].join(" "),
+  };
+
+  const qs = new URLSearchParams(options);
+
+  return `${rootUrl}?${qs.toString()}`;
+}
+
+export function getGithubOAuthURL() {
+  const rootUrl = "https://github.com/login/oauth/authorize";
+
+  const options = {
+    client_id: `${process.env.NEXT_PUBLIC_GITHUB_CLIENT_ID}`,
+    redirect_uri: `${process.env.NEXT_PUBLIC_APP_URL}/oauth/github`,
+    path: "/",
+    scope: "user:email",
+  };
+
+  const qs = new URLSearchParams(options);
+
+  return `${rootUrl}?${qs.toString()}`;
+}
diff --git a/utils/nativePopup.ts b/utils/nativePopup.ts
new file mode 100644
index 0000000000000000000000000000000000000000..990317cf1b0c40d57cfd525c3b8c3128d7285c64
--- /dev/null
+++ b/utils/nativePopup.ts
@@ -0,0 +1,29 @@
+interface Popups {
+  pageURL: string;
+  pageTitle: string;
+  popupWinWidth: number;
+  popupWinHeight: number;
+}
+
+export function nativePopup({
+  pageURL,
+  pageTitle,
+  popupWinWidth,
+  popupWinHeight,
+}: Popups) {
+  let left = (screen.width - popupWinWidth) / 2;
+  let top = (screen.height - popupWinHeight) / 4;
+
+  window.open(
+    pageURL,
+    pageTitle,
+    "resizable=yes, width=" +
+      popupWinWidth +
+      ", height=" +
+      popupWinHeight +
+      ", top=" +
+      top +
+      ", left=" +
+      left
+  );
+}
diff --git a/utils/offsetLimitPagination.ts b/utils/offsetLimitPagination.ts
new file mode 100644
index 0000000000000000000000000000000000000000..479df8af458b349754d51b7ab39b1d0472769b3e
--- /dev/null
+++ b/utils/offsetLimitPagination.ts
@@ -0,0 +1,40 @@
+import { FieldPolicy } from "@apollo/client";
+
+type KeyArgs = FieldPolicy["keyArgs"];
+
+interface Response {
+  data: any[];
+  message?: string;
+  status: boolean;
+}
+
+export function offsetLimitPagination(keyArgs: KeyArgs = false): FieldPolicy {
+  return {
+    keyArgs,
+    merge(existing = {} as Response, incoming: Response, { args }) {
+      const merged = existing?.data ? existing?.data?.slice(0) : [];
+
+      if (incoming) {
+        if (args) {
+          // Assume an offset of 0 if args.offset omitted.
+          const { offset = 0 } = args?.input;
+
+          for (let i = 0; i < incoming?.data?.length; ++i) {
+            merged[offset + i] = incoming?.data[i];
+          }
+        } else {
+          // It's unusual (probably a mistake) for a paginated field not
+          // to receive any arguments, so you might prefer to throw an
+          // exception here, instead of recovering by appending incoming
+          // onto the existing array.
+          merged.push.apply(merged, incoming?.data);
+        }
+      }
+
+      return {
+        ...incoming,
+        data: merged,
+      };
+    },
+  };
+}
diff --git a/utils/withSession.ts b/utils/withSession.ts
new file mode 100644
index 0000000000000000000000000000000000000000..7039c246825ce0ab0214c731d4edac30716cbff2
--- /dev/null
+++ b/utils/withSession.ts
@@ -0,0 +1,46 @@
+import { withIronSessionApiRoute, withIronSessionSsr } from "iron-session/next";
+import { GetServerSideProps, NextApiHandler } from "next";
+import { IncomingMessage, ServerResponse } from "http";
+import { NextApiRequestCookies } from "next/dist/server/api-utils";
+
+export const sessionOptions = {
+  password: process.env.SECRET_COOKIE_PASSWORD as string,
+  cookieName: "session",
+  cookieOptions: {
+    secure: process.env.NODE_ENV === "production",
+  },
+};
+
+export function withSessionApiRoute(handler: NextApiHandler) {
+  return withIronSessionApiRoute(handler, sessionOptions);
+}
+
+export function withSessionSsr(handler: GetServerSideProps) {
+  return withIronSessionSsr(handler, sessionOptions);
+}
+
+export const verifySession = (
+  req: IncomingMessage & { cookies: NextApiRequestCookies },
+  res: ServerResponse
+) => {
+  const user = req.session.user;
+
+  if (!user) {
+    res.setHeader("location", "/");
+    res.statusCode = 302;
+    res.end();
+    return { props: {} };
+  }
+
+  return { user };
+};
+
+export const redirect = (
+  location: string,
+  req: IncomingMessage & { cookies: NextApiRequestCookies },
+  res: ServerResponse
+) => {
+  res.setHeader("location", location);
+  res.statusCode = 302;
+  res.end();
+};