diff --git a/src/.env.example b/src/.env.example
new file mode 100644
index 0000000..7a550fe
--- /dev/null
+++ b/src/.env.example
@@ -0,0 +1,9 @@
+# GEMINI_API_KEY: Required for Gemini AI API calls.
+# AI Studio automatically injects this at runtime from user secrets.
+# Users configure this via the Secrets panel in the AI Studio UI.
+GEMINI_API_KEY="MY_GEMINI_API_KEY"
+
+# APP_URL: The URL where this applet is hosted.
+# AI Studio automatically injects this at runtime with the Cloud Run service URL.
+# Used for self-referential links, OAuth callbacks, and API endpoints.
+APP_URL="MY_APP_URL"
diff --git a/src/.gitignore b/src/.gitignore
new file mode 100644
index 0000000..5a86d2a
--- /dev/null
+++ b/src/.gitignore
@@ -0,0 +1,8 @@
+node_modules/
+build/
+dist/
+coverage/
+.DS_Store
+*.log
+.env*
+!.env.example
diff --git a/src/README.md b/src/README.md
new file mode 100644
index 0000000..f1aa5e9
--- /dev/null
+++ b/src/README.md
@@ -0,0 +1,20 @@
+
+
+
+
+# Run and deploy your AI Studio app
+
+This contains everything you need to run your app locally.
+
+View your app in AI Studio: https://ai.studio/apps/3ee1668e-a64b-4275-bbd0-23ae0f558de6
+
+## Run Locally
+
+**Prerequisites:** Node.js
+
+
+1. Install dependencies:
+ `npm install`
+2. Set the `GEMINI_API_KEY` in [.env.local](.env.local) to your Gemini API key
+3. Run the app:
+ `npm run dev`
diff --git a/src/index.html b/src/index.html
new file mode 100644
index 0000000..be2fbb7
--- /dev/null
+++ b/src/index.html
@@ -0,0 +1,16 @@
+
+
+
+
+
+ Mealno - Cloud Kitchen
+
+
+
+
+
+
+
+
+
+
diff --git a/src/metadata.json b/src/metadata.json
new file mode 100644
index 0000000..80ee3e0
--- /dev/null
+++ b/src/metadata.json
@@ -0,0 +1,6 @@
+{
+ "name": "Mealno",
+ "description": "Gen-Z cloud kitchen landing page for students with dark-tech-appetizing aesthetic.",
+ "requestFramePermissions": [],
+ "majorCapabilities": ["MAJOR_CAPABILITY_SERVER_SIDE_GEMINI_API"]
+}
diff --git a/src/package.json b/src/package.json
new file mode 100644
index 0000000..44745ed
--- /dev/null
+++ b/src/package.json
@@ -0,0 +1,35 @@
+{
+ "name": "react-example",
+ "private": true,
+ "version": "0.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite --port=3000 --host=0.0.0.0",
+ "build": "vite build",
+ "preview": "vite preview",
+ "clean": "rm -rf dist server.js",
+ "lint": "tsc --noEmit"
+ },
+ "dependencies": {
+ "@google/genai": "^2.4.0",
+ "@tailwindcss/vite": "^4.1.14",
+ "@vitejs/plugin-react": "^5.0.4",
+ "lucide-react": "^0.546.0",
+ "react": "^19.0.1",
+ "react-dom": "^19.0.1",
+ "vite": "^6.2.3",
+ "express": "^4.21.2",
+ "dotenv": "^17.2.3",
+ "motion": "^12.23.24"
+ },
+ "devDependencies": {
+ "@types/node": "^22.14.0",
+ "autoprefixer": "^10.4.21",
+ "esbuild": "^0.25.0",
+ "tailwindcss": "^4.1.14",
+ "tsx": "^4.21.0",
+ "typescript": "~5.8.2",
+ "vite": "^6.2.3",
+ "@types/express": "^4.17.21"
+ }
+}
diff --git a/src/tsconfig.json b/src/tsconfig.json
new file mode 100644
index 0000000..d88f175
--- /dev/null
+++ b/src/tsconfig.json
@@ -0,0 +1,26 @@
+{
+ "compilerOptions": {
+ "target": "ES2022",
+ "experimentalDecorators": true,
+ "useDefineForClassFields": false,
+ "module": "ESNext",
+ "lib": [
+ "ES2022",
+ "DOM",
+ "DOM.Iterable"
+ ],
+ "skipLibCheck": true,
+ "moduleResolution": "bundler",
+ "isolatedModules": true,
+ "moduleDetection": "force",
+ "allowJs": true,
+ "jsx": "react-jsx",
+ "paths": {
+ "@/*": [
+ "./*"
+ ]
+ },
+ "allowImportingTsExtensions": true,
+ "noEmit": true
+ }
+}
diff --git a/src/vite.config.ts b/src/vite.config.ts
new file mode 100644
index 0000000..fc23e76
--- /dev/null
+++ b/src/vite.config.ts
@@ -0,0 +1,22 @@
+import tailwindcss from '@tailwindcss/vite';
+import react from '@vitejs/plugin-react';
+import path from 'path';
+import {defineConfig} from 'vite';
+
+export default defineConfig(() => {
+ return {
+ plugins: [react(), tailwindcss()],
+ resolve: {
+ alias: {
+ '@': path.resolve(__dirname, '.'),
+ },
+ },
+ server: {
+ // HMR is disabled in AI Studio via DISABLE_HMR env var.
+ // Do not modifyâfile watching is disabled to prevent flickering during agent edits.
+ hmr: process.env.DISABLE_HMR !== 'true',
+ // Disable file watching when DISABLE_HMR is true to save CPU during agent edits.
+ watch: process.env.DISABLE_HMR === 'true' ? null : {},
+ },
+ };
+});