Premium platform for structured business growth, mindset development, and AI-enabled execution.
This repository is a small monorepo:
- Frontend: Next.js (App Router) + TypeScript + TailwindCSS
- Backend: Node.js + Express (TypeScript)
Notes
- The project is currently an MVP with demo data and a lead capture flow.
- Authentication and database persistence are planned (see Roadmap).
- Overview
- Architecture
- Tech Stack
- Repository Structure
- Quick Start
- Environment Variables
- Scripts
- Backend API
- Deployment
- Lint and Build
- Development Notes
- Roadmap
- Contributing
The oksia web app includes:
- A marketing website (Hebrew, RTL)
- A dashboard demo (UI only)
- An Apply (lead capture) flow
The Apply form uses a Next.js Server Action (server-side) that forwards the payload to the separate Express backend.
flowchart LR
U["User Browser"] -->|"Submit Apply Form"| N["Next.js Server Action<br/>app/(marketing)/apply/page.tsx"]
N -->|"POST /leads/apply"| B["Express Backend<br/>backend/src/index.ts"]
B -->|"201 OK"| N
N -->|"redirect /apply/thanks"| U
- Next.js (App Router)
- React
- TypeScript
- TailwindCSS
- ESLint
- Node.js
- Express
- TypeScript
- tsx (dev runner)
.
├─ app/ # Next.js App Router routes (marketing/auth/dashboard)
├─ components/ # Reusable UI components
├─ lib/ # Shared helpers + demo data
├─ public/ # Static assets
├─ scripts/ # Dev scripts (e.g. dev:all)
├─ backend/ # Separate Express backend (TypeScript)
│ ├─ src/
│ ├─ package.json
│ └─ tsconfig.json
├─ package.json # Frontend scripts + dev:all
└─ eslint.config.mjs
- Node.js 20+ (Node 22 works)
- npm
Frontend (root):
npm installBackend:
cd backend
npm installOption A: run both with one command (recommended)
npm run dev:allOption B: run separately in two terminals
Terminal 1 (frontend):
npm run devTerminal 2 (backend):
cd backend
npm run devFrontend runs on:
http://localhost:3000
Backend runs on:
http://localhost:4000
This repo includes example files:
.env.example(frontend/root)backend/.env.example(backend)
Copy them to your local env files as needed.
-
BACKEND_URL- URL for the external backend used by Server Actions.
- Default (if not set):
http://localhost:4000
-
NEXT_PUBLIC_BACKEND_URL- Optional alternative to
BACKEND_URL. - Use only if you explicitly want the backend URL accessible to client-side code.
- Optional alternative to
-
NEXT_PUBLIC_CALENDLY_URL- Used on the Apply page.
- If missing, a mailto fallback is used.
-
NEXT_PUBLIC_WHATSAPP_URL- WhatsApp link used on the Apply page.
- If missing, a default
wa.melink is used.
Backend environment variables are read from the process environment.
PORT- Server port.
- Default:
4000
npm run dev: Start Next.js dev servernpm run dev:all: Start both frontend and backend together (runsscripts/dev-all.mjs, which spawnsnpm run devin the root and inbackend/)npm run lint: Run ESLintnpm run build: Production buildnpm run start: Start production Next server
npm run dev: Start Express server in watch mode (tsx watch)npm run build: Build TypeScript tobackend/distnpm run start: Run production server frombackend/dist
Base URL (local): http://localhost:4000
GET /health
Response:
{ "ok": true }POST /leads/apply
Request body (JSON):
{
"fullName": "...",
"phone": "...",
"email": "...",
"businessName": "...",
"goal": "...",
"challenge": "...",
"track": "..."
}Current behavior:
- Logs the payload to the backend console
- Returns
201 { ok: true }
Recommended setup:
-
Frontend: deploy to Vercel
- Set
BACKEND_URLto your backend public URL - Set any
NEXT_PUBLIC_*variables you use in the UI
- Set
-
Backend: deploy to a Node-friendly platform (Render / Railway / Fly.io / VPS)
- Set
PORT(or use the platform default) - Ensure your service is reachable from the Vercel frontend
- Set
Notes:
- Today the backend has no database; it only logs leads.
- When adding a DB, prefer a managed database and keep credentials in backend-only environment variables.
Run lint:
npm run lintBuild frontend:
npm run buildNotes:
- The root ESLint and TypeScript configuration ignores
backend/**. - Backend has its own TypeScript config under
backend/tsconfig.json.
- RTL / Hebrew UI: The app is configured for Hebrew and RTL at the root layout.
- No secrets in Git: Do not commit
.env*files. - Server Actions: The Apply form submission is server-side, then forwarded to the backend.
- Backend is separate: Treat
backend/like a standalone service with its own install/build. - Shared code: shared helpers live under
lib/. If you add shared types later, keep them inlib/types(or a dedicated package). - Monorepo tooling (optional): if this grows, consider adopting
npm workspacesso you can install/run packages from the root with a single command.
High-level planned work:
- Authentication (credentials, Google, Magic Link)
- Database persistence (users, tasks, sessions, files, courses)
- AI Center integration (secured API calls and audit-friendly workflows)
- Admin tools for lead management
If you plan to collaborate via GitHub:
- Create a feature branch per change
- Keep PRs small and focused
- Prefer TypeScript and strict typing
- Run
npm run lintbefore opening a PR
Oren Peretz
LinkedIn: https://www.linkedin.com/in/oren-peretz
Email: info@oksia.ai