diff --git a/backend/package.json b/backend/package.json
new file mode 100644
index 0000000..c581433
--- /dev/null
+++ b/backend/package.json
@@ -0,0 +1,27 @@
+{
+ "name": "ca-grow-ops-backend",
+ "version": "1.0.0",
+ "main": "dist/server.js",
+ "scripts": {
+ "build": "tsc",
+ "start": "node dist/server.js",
+ "dev": "ts-node-dev src/server.ts",
+ "test": "jest",
+ "lint": "eslint src/**/*.ts"
+ },
+ "dependencies": {
+ "@prisma/client": "^5.7.0",
+ "fastify": "^4.25.0",
+ "fastify-plugin": "^4.5.0",
+ "fastify-jwt": "^4.2.0",
+ "dotenv": "^16.3.1"
+ },
+ "devDependencies": {
+ "typescript": "^5.3.3",
+ "@types/node": "^20.10.0",
+ "prisma": "^5.7.0",
+ "ts-node-dev": "^2.0.0",
+ "jest": "^29.7.0",
+ "eslint": "^8.56.0"
+ }
+}
diff --git a/backend/prisma/schema.prisma b/backend/prisma/schema.prisma
new file mode 100644
index 0000000..066ca29
--- /dev/null
+++ b/backend/prisma/schema.prisma
@@ -0,0 +1,18 @@
+generator client {
+ provider = "prisma-client-js"
+}
+
+datasource db {
+ provider = "postgresql"
+ url = env("DATABASE_URL")
+}
+
+model User {
+ id String @id @default(uuid())
+ email String @unique
+ name String?
+ password String
+ role String @default("USER")
+ createdAt DateTime @default(now())
+ updatedAt DateTime @updatedAt
+}
diff --git a/backend/src/server.ts b/backend/src/server.ts
new file mode 100644
index 0000000..debd4db
--- /dev/null
+++ b/backend/src/server.ts
@@ -0,0 +1,24 @@
+import Fastify from 'fastify';
+
+const server = Fastify({
+ logger: true
+});
+
+server.get('/healthz', async (request, reply) => {
+ return { status: 'ok', timestamp: new Date().toISOString() };
+});
+
+server.get('/', async (request, reply) => {
+ return { message: 'CA Grow Ops Manager API' };
+});
+
+const start = async () => {
+ try {
+ await server.listen({ port: 3000, host: '0.0.0.0' });
+ } catch (err) {
+ server.log.error(err);
+ process.exit(1);
+ }
+};
+
+start();
diff --git a/backend/tsconfig.json b/backend/tsconfig.json
new file mode 100644
index 0000000..4b33033
--- /dev/null
+++ b/backend/tsconfig.json
@@ -0,0 +1,22 @@
+{
+ "compilerOptions": {
+ "target": "ES2020",
+ "module": "commonjs",
+ "lib": [
+ "ES2020"
+ ],
+ "outDir": "./dist",
+ "rootDir": "./src",
+ "strict": true,
+ "esModuleInterop": true,
+ "skipLibCheck": true,
+ "forceConsistentCasingInFileNames": true
+ },
+ "include": [
+ "src/**/*"
+ ],
+ "exclude": [
+ "node_modules",
+ "**/*.test.ts"
+ ]
+}
\ No newline at end of file
diff --git a/frontend/index.html b/frontend/index.html
new file mode 100644
index 0000000..8fde53e
--- /dev/null
+++ b/frontend/index.html
@@ -0,0 +1,12 @@
+
+
+
+
+
+ CA Grow Ops Manager
+
+
+
+
+
+
diff --git a/frontend/package.json b/frontend/package.json
new file mode 100644
index 0000000..c6b7751
--- /dev/null
+++ b/frontend/package.json
@@ -0,0 +1,30 @@
+{
+ "name": "ca-grow-ops-frontend",
+ "private": true,
+ "version": "0.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "tsc && vite build",
+ "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
+ "preview": "vite preview",
+ "test": "vitest"
+ },
+ "dependencies": {
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0"
+ },
+ "devDependencies": {
+ "@types/react": "^18.2.43",
+ "@types/react-dom": "^18.2.17",
+ "@typescript-eslint/eslint-plugin": "^6.14.0",
+ "@typescript-eslint/parser": "^6.14.0",
+ "@vitejs/plugin-react": "^4.2.1",
+ "eslint": "^8.55.0",
+ "eslint-plugin-react-hooks": "^4.6.0",
+ "eslint-plugin-react-refresh": "^0.4.5",
+ "typescript": "^5.2.2",
+ "vite": "^5.0.8",
+ "vitest": "^1.0.0"
+ }
+}
\ No newline at end of file
diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx
new file mode 100644
index 0000000..a6acc8b
--- /dev/null
+++ b/frontend/src/App.tsx
@@ -0,0 +1,13 @@
+import React from 'react'
+
+function App() {
+ return (
+
+
CA Grow Ops Manager
+
Status: Online
+
Domain: 777wolfpack.runfoo.run
+
+ )
+}
+
+export default App
diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx
new file mode 100644
index 0000000..35eb33f
--- /dev/null
+++ b/frontend/src/main.tsx
@@ -0,0 +1,9 @@
+import React from 'react'
+import ReactDOM from 'react-dom/client'
+import App from './App.tsx'
+
+ReactDOM.createRoot(document.getElementById('root')!).render(
+
+
+ ,
+)
diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json
new file mode 100644
index 0000000..50b948d
--- /dev/null
+++ b/frontend/tsconfig.json
@@ -0,0 +1,31 @@
+{
+ "compilerOptions": {
+ "target": "ES2020",
+ "useDefineForClassFields": true,
+ "lib": [
+ "ES2020",
+ "DOM",
+ "DOM.Iterable"
+ ],
+ "module": "ESNext",
+ "skipLibCheck": true,
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "noEmit": true,
+ "jsx": "react-jsx",
+ "strict": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "noFallthroughCasesInSwitch": true
+ },
+ "include": [
+ "src"
+ ],
+ "references": [
+ {
+ "path": "./tsconfig.node.json"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/frontend/tsconfig.node.json b/frontend/tsconfig.node.json
new file mode 100644
index 0000000..b85dd47
--- /dev/null
+++ b/frontend/tsconfig.node.json
@@ -0,0 +1,12 @@
+{
+ "compilerOptions": {
+ "composite": true,
+ "skipLibCheck": true,
+ "module": "ESNext",
+ "moduleResolution": "bundler",
+ "allowSyntheticDefaultImports": true
+ },
+ "include": [
+ "vite.config.ts"
+ ]
+}
\ No newline at end of file
diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts
new file mode 100644
index 0000000..d7b4ea6
--- /dev/null
+++ b/frontend/vite.config.ts
@@ -0,0 +1,11 @@
+import { defineConfig } from 'vite'
+import react from '@vitejs/plugin-react'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [react()],
+ server: {
+ host: '0.0.0.0',
+ port: 80,
+ }
+})