Embeddable AI chat widgets for e-commerce businesses. Each tenant gets their own customized AI assistant with product knowledge, semantic search, RAG (Retrieval-Augmented Generation), and fully branded chat interface.
| Component | Technology | Port | Status |
|---|---|---|---|
| Admin Dashboard | React + Vite + TypeScript + Tailwind + shadcn/ui | 3000 | โ |
| Backend API | ASP.NET Core 9.0 + Entity Framework Core | 5078 | โ |
| RAG Service | Python 3.11 + FastAPI + Sentence Transformers | 8000 | โ |
| Database | PostgreSQL 15+ | 5432 | โ |
admin@example.comAdmin123!# Clone repository
git clone <your-repo-url>
cd feattie
# Start PostgreSQL with Docker (or use existing instance)
docker run --name feattie-postgres \
-e POSTGRES_USER=postgres \
-e POSTGRES_PASSWORD=postgres \
-e POSTGRES_DB=feattie \
-p 5432:5432 \
-d postgres:15
cd authentication/SecureAuth.Api
# Restore dependencies
dotnet restore
# Update appsettings.json with your OpenAI API key
# Edit: authentication/SecureAuth.Api/appsettings.json
# Set: "OpenAI": { "ApiKey": "sk-your-key-here" }
# Run migrations
dotnet ef database update
# Start API server
dotnet run
โ Backend running at: http://localhost:5078
# From project root
python3 -m venv .venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
# Install dependencies
pip install -r requirements.txt
# Start RAG server
export PYTHONPATH=$PWD # On Windows: set PYTHONPATH=%CD%
python -m uvicorn src.api.tenant_server:app --host 0.0.0.0 --port 8000 --reload
โ RAG Service running at: http://localhost:8000
cd admin-dashboard
# Install dependencies
npm install
# Create .env file (if not exists)
echo "VITE_API_URL=http://localhost:5078" > .env
# Start development server
npm run dev
โ Admin Dashboard running at: http://localhost:3000
๐ Done! Your AI chat widget is ready to embed on your e-commerce site.
Navigate to Tenant Management
Click "Create New Tenant"
Click "Create Tenant"
Note: First sync may take a few minutes depending on product count.
Prerequisites: Products must be synced first
Note: Embeddings enable semantic search. Without them, chat won't work properly.
Click "Edit Settings" on your tenant
Appearance Tab:
Behavior Tab:
Live Preview:
Click "Save Settings"
</body> tag in your website:<!-- Feattie Chat Widget -->
<script>
window.FeattieChat = {
tenantId: 1,
tenantSlug: 'your-store',
apiUrl: 'http://localhost:5078',
customization: {
primaryColor: '#6366f1',
secondaryColor: '#8b5cf6',
position: 'bottom-right',
chatTitle: 'Chat with us',
welcomeMessage: 'Hello! How can I help you today?',
autoOpen: false,
autoOpenDelay: 5,
showTypingIndicator: true
}
};
</script>
<script src="http://localhost:5078/widget/widget.js"></script>
File: authentication/SecureAuth.Api/appsettings.json
{
"ConnectionStrings": {
"Default": "Host=localhost;Port=5432;Database=feattie;Username=postgres;Password=postgres"
},
"Jwt": {
"Secret": "your-super-secret-jwt-key-minimum-32-characters-required-for-production",
"Issuer": "SecureAuth.Api",
"Audience": "SecureAuth.Client",
"ExpiryMinutes": 60
},
"Cors": {
"AllowedOrigins": ["http://localhost:5173", "http://localhost:3000"]
},
"PythonRAG": {
"BaseUrl": "http://localhost:8000"
},
"OpenAI": {
"ApiKey": "sk-your-openai-api-key-here"
}
}
File: admin-dashboard/.env
VITE_API_URL=http://localhost:5078
File: .env (project root)
OPENAI_API_KEY=sk-your-openai-api-key-here
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Customer Website โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ Embedded Chat Widget (JavaScript) โ โ
โ โ - Loads tenant config via API โ โ
โ โ - Renders chat interface โ โ
โ โ - Sends messages to chat endpoint โ โ
โ โโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ HTTP/HTTPS
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ .NET Core API (Port 5078) โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ Public Endpoints (No Authentication): โ โ
โ โ - GET /api/widget/config/{slug} โ โ
โ โ - POST /api/chat/{tenantId} โ โ
โ โ - GET /api/chat/{tenantId}/history/{sessionId} โ โ
โ โ - GET /widget/widget.js โ โ
โ โ โ โ
โ โ Authenticated Endpoints: โ โ
โ โ - POST /api/auth/login โ โ
โ โ - GET /api/tenant โ โ
โ โ - POST /api/tenant โ โ
โ โ - GET /api/tenants/{id}/settings โ โ
โ โ - PUT /api/tenants/{id}/settings โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ
โ โ HTTP
โผ โผ
โโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ PostgreSQL DB โ โ Python RAG Service (Port 8000) โ
โ (Port 5432) โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ โ โ - Sentence Transformers โ โ
โ - Users โ โ โ - OpenAI GPT-4o-mini โ โ
โ - Tenants โ โ โ - Embedding generation โ โ
โ - TenantSettings โ โ โ - Semantic search โ โ
โ - Products โ โ โ - RAG pipeline โ โ
โ - ChatSessions โ โ โ - Context injection โ โ
โ - ChatMessages โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ - Contexts โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ - RAGConfigurations โ
โโโโโโโโโโโโโโโโโโโโโโโโ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Admin Dashboard (React + Vite - Port 3000) โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ Pages: โ โ
โ โ - Dashboard (system stats) โ โ
โ โ - Tenant Management (CRUD) โ โ
โ โ - User Management (assign to tenants) โ โ
โ โ - Widget Settings (customization + live preview) โ โ
โ โ - Chat Test (test AI chat) โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
| Method | Endpoint | Description | Body |
|---|---|---|---|
| GET | /api/widget/config/{tenantSlug} | Get widget configuration | - |
| POST | /api/chat/{tenantId} | Send chat message | { query, sessionId?, topK? } |
| GET | /api/chat/{tenantId}/history/{sessionId} | Get chat history | - |
| GET | /widget/widget.js | Widget JavaScript file | - |
| Method | Endpoint | Description | Body |
|---|---|---|---|
| POST | /api/auth/login | Login | { email, password } |
| POST | /api/auth/register | Register new user | { email, password, firstName?, lastName? } |
| POST | /api/auth/logout | Logout | - |
| GET | /api/auth/me | Get current user info | - |
| GET | /api/auth/me/tenants | Get user's assigned tenants | - |
| Method | Endpoint | Description | Body |
|---|---|---|---|
| GET | /api/tenant | List all tenants | Query: isActive?, page?, pageSize? |
| GET | /api/tenant/{id} | Get tenant by ID | - |
| GET | /api/tenant/by-slug/{slug} | Get tenant by slug | - |
| POST | /api/tenant | Create new tenant | { Name, Slug, ShopifyStoreUrl, ShopifyAccessToken?, MaxProducts? } |
| PUT | /api/tenant/{id} | Update tenant | { Name?, ShopifyStoreUrl?, IsActive?, MaxProducts? } |
| DELETE | /api/tenant/{id} | Delete tenant (soft delete) | Query: permanent? |
| GET | /api/tenant/{id}/stats | Get tenant statistics | - |
| Method | Endpoint | Description | Body |
|---|---|---|---|
| GET | /api/auth/admin/users | List all users | Query: search?, page?, pageSize? |
| GET | /api/auth/admin/users/{userId}/tenants | Get user's tenants | - |
| POST | /api/auth/admin/users/{userId}/tenants/{tenantId} | Assign user to tenant | { role? } |
| DELETE | /api/auth/admin/users/{userId}/tenants/{tenantId} | Remove user from tenant | - |
| Method | Endpoint | Description | Body |
|---|---|---|---|
| GET | /api/tenants/{id}/settings | Get tenant settings | - |
| PUT | /api/tenants/{id}/settings | Update tenant settings | { brandColorPrimary?, brandColorSecondary?, widgetPosition?, chatTitle?, welcomeMessage?, autoOpen?, autoOpenDelaySeconds?, showTypingIndicator? } |
| GET | /api/tenants/{id}/settings/embed-code | Get embed code (Admin) | - |
| Method | Endpoint | Description | Body |
|---|---|---|---|
| GET | /api/tenants/{id}/products | List products | Query: hasEmbedding?, page?, pageSize? |
| POST | /api/tenants/{id}/products/sync | Sync products from Shopify | { forceResync? } |
| POST | /api/tenants/{id}/products/generate-embeddings | Generate embeddings | { forceRegenerate? } |
| GET | /api/tenants/{id}/products/stats | Get product statistics | - |
| Method | Endpoint | Description | Body |
|---|---|---|---|
| GET | /api/tenants/{id}/rag-config | Get RAG configuration | - |
| PUT | /api/tenants/{id}/rag-config | Update RAG configuration | { embeddingModel?, llmModel?, systemPrompt?, temperature?, ... } |
feattie/
โโโ authentication/SecureAuth.Api/ # .NET Core Backend API
โ โโโ Controllers/
โ โ โโโ AuthController.cs # Authentication & user management
โ โ โโโ TenantController.cs # Tenant CRUD operations
โ โ โโโ TenantSettingsController.cs # Widget settings
โ โ โโโ ChatController.cs # Chat API
โ โ โโโ ProductController.cs # Product sync & embeddings
โ โ โโโ RAGConfigurationController.cs # RAG settings
โ โโโ Models/
โ โ โโโ User.cs # User model
โ โ โโโ Tenant.cs # Tenant model
โ โ โโโ TenantUser.cs # User-Tenant junction
โ โ โโโ TenantSettings.cs # Widget settings
โ โ โโโ Product.cs # Product model
โ โ โโโ ChatSession.cs # Chat session
โ โ โโโ ChatMessage.cs # Chat message
โ โ โโโ RAGConfiguration.cs # RAG config
โ โ โโโ Context.cs # Custom context
โ โโโ Services/
โ โ โโโ ShopifyService.cs # Shopify integration
โ โ โโโ PythonRAGService.cs # Python RAG client
โ โ โโโ ProductService.cs # Product operations
โ โโโ Data/
โ โ โโโ AppDbContext.cs # Entity Framework DbContext
โ โโโ DTOs/ # Data Transfer Objects
โ โโโ Migrations/ # EF Core migrations
โ โโโ wwwroot/widget/
โ โ โโโ widget.js # Embeddable widget script
โ โโโ Program.cs # Application entry point
โ โโโ appsettings.json # Configuration
โ โโโ appsettings.Development.json # Dev configuration
โ
โโโ admin-dashboard/ # React Admin Dashboard
โ โโโ app/ # Next.js App Router
โ โ โโโ page.tsx # Dashboard home
โ โ โโโ tenants/
โ โ โ โโโ page.tsx # Tenant management
โ โ โโโ users/
โ โ โ โโโ page.tsx # User management
โ โ โโโ tenant-settings/
โ โ โ โโโ page.tsx # Widget settings
โ โ โโโ chat/
โ โ โ โโโ page.tsx # Chat test
โ โ โโโ auth/
โ โ โโโ login/
โ โ โโโ page.tsx # Login page
โ โโโ components/
โ โ โโโ ui/ # shadcn/ui components
โ โ โโโ AdminLayout.tsx # Layout with sidebar
โ โโโ contexts/
โ โ โโโ AuthContext.tsx # Authentication context
โ โโโ lib/
โ โ โโโ api.ts # API client (axios)
โ โ โโโ utils.ts # Utility functions
โ โโโ hooks/
โ โ โโโ use-toast.tsx # Toast notifications
โ โโโ package.json
โ โโโ vite.config.ts
โ โโโ tailwind.config.js
โ โโโ .env # Environment variables
โ
โโโ src/ # Python RAG Service
โ โโโ api/
โ โ โโโ tenant_server.py # FastAPI server
โ โโโ embeddings/
โ โ โโโ local_embeddings.py # Sentence Transformers
โ โ โโโ openai_embeddings.py # OpenAI embeddings
โ โโโ models/
โ โ โโโ tenant_models.py # Pydantic models
โ โโโ services/
โ โโโ llm_service.py # OpenAI LLM integration
โ โโโ rag_service.py # RAG pipeline
โ
โโโ scripts/
โ โโโ shop_pull.py # Shopify product scraper
โ โโโ add-admin.sh # Add admin user script
โ
โโโ requirements.txt # Python dependencies
โโโ package.json # Project metadata
โโโ .env # Environment variables
โโโ .env.example # Example env file
โโโ README.md # This file
โโโ QUICK_START.md # Quick start guide
โโโ OPENAI_SETUP.md # OpenAI setup guide
# Kill processes on specific ports
lsof -ti:5078 | xargs kill -9 # .NET API
lsof -ti:8000 | xargs kill -9 # Python RAG
lsof -ti:5173 | xargs kill -9 # Admin Dashboard
lsof -ti:5432 | xargs kill -9 # PostgreSQL
# Or kill all at once
lsof -ti:5078,8000,5173 | xargs kill -9
Check PostgreSQL is running:
pg_isready -h localhost -p 5432
Check connection string in appsettings.json:
"ConnectionStrings": {
"Default": "Host=localhost;Port=5432;Database=feattie;Username=postgres;Password=postgres"
}
Ensure database exists:
psql -U postgres
CREATE DATABASE feattie;
\q
Run migrations:
cd authentication/SecureAuth.Api
dotnet ef database update
# Activate virtual environment
source .venv/bin/activate # macOS/Linux
.venv\Scripts\activate # Windows
# Set PYTHONPATH
export PYTHONPATH=$PWD # macOS/Linux
set PYTHONPATH=%CD% # Windows
# Reinstall dependencies
pip install -r requirements.txt --upgrade
cd authentication/SecureAuth.Api
# Drop and recreate database (WARNING: deletes all data)
dotnet ef database drop --force
dotnet ef database update
# Or create new migration
dotnet ef migrations add YourMigrationName
dotnet ef database update
Checklist:
appsettings.jsonappsettings.jsonUpdate appsettings.json:
"Cors": {
"AllowedOrigins": [
"http://localhost:5173",
"http://localhost:3000",
"https://your-production-domain.com"
]
}
IsActive = trueAllowedOrigins in CORS to actual domainASPNETCORE_ENVIRONMENT=Production# .NET API
ASPNETCORE_ENVIRONMENT=Production
ConnectionStrings__Default="Host=prod-db.example.com;Port=5432;Database=feattie;Username=app_user;Password=secure_password"
Jwt__Secret="production-secret-key-at-least-32-characters-long-and-random"
Jwt__ExpiryMinutes=60
OpenAI__ApiKey="sk-prod-openai-api-key"
Cors__AllowedOrigins__0="https://admin.yourdomain.com"
PythonRAG__BaseUrl="https://rag.yourdomain.com"
# Python RAG
OPENAI_API_KEY="sk-prod-openai-api-key"
PYTHONPATH=/app
# Admin Dashboard (build time)
VITE_API_URL=https://api.yourdomain.com
OpenAI API Key
text-embedding-3-small) & Chat (gpt-4o-mini)Shopify Access Token (per tenant, optional)
read_products# Dockerfile for .NET API
FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS base
WORKDIR /app
EXPOSE 5078
FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build
WORKDIR /src
COPY ["authentication/SecureAuth.Api/SecureAuth.Api.csproj", "authentication/SecureAuth.Api/"]
RUN dotnet restore "authentication/SecureAuth.Api/SecureAuth.Api.csproj"
COPY . .
WORKDIR "/src/authentication/SecureAuth.Api"
RUN dotnet build "SecureAuth.Api.csproj" -c Release -o /app/build
RUN dotnet publish "SecureAuth.Api.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=build /app/publish .
ENTRYPOINT ["dotnet", "SecureAuth.Api.dll"]
# docker-compose.yml
version: '3.8'
services:
postgres:
image: postgres:15
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_DB: feattie
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
api:
build:
context: .
dockerfile: Dockerfile.api
ports:
- "5078:5078"
environment:
- ConnectionStrings__Default=Host=postgres;Database=feattie;Username=postgres;Password=${DB_PASSWORD}
- Jwt__Secret=${JWT_SECRET}
- OpenAI__ApiKey=${OPENAI_API_KEY}
depends_on:
- postgres
rag:
build:
context: .
dockerfile: Dockerfile.rag
ports:
- "8000:8000"
environment:
- OPENAI_API_KEY=${OPENAI_API_KEY}
- PYTHONPATH=/app
depends_on:
- postgres
admin:
build:
context: ./admin-dashboard
dockerfile: Dockerfile
ports:
- "5173:80"
environment:
- VITE_API_URL=http://api:5078
volumes:
postgres_data:
| Password | Role | Tenants Assigned | |
|---|---|---|---|
| admin@example.com | Admin123! | Admin | All |
| admin@test.com | Test123! | Admin | All |
| john@test.com | Test123! | User | None (assign manually) |
| jane@test.com | Test123! | User | None (assign manually) |
git checkout -b feature/amazing-feature)git commit -m 'Add amazing feature')git push origin feature/amazing-feature)MIT License - see LICENSE file for details
For questions, issues, or feature requests:
QUICK_START.md and OPENAI_SETUP.mdBuilt with โค๏ธ for modern e-commerce businesses
Powered by: .NET 9.0 | React 18 | OpenAI | PostgreSQL | Python 3.11
Embeddable AI chat widgets for e-commerce businesses. Each tenant gets their own customized AI assistant with product knowledge, semantic search, RAG (Retrieval-Augmented Generation), and fully branded chat interface.
| Component | Technology | Port | Status |
|---|---|---|---|
| Admin Dashboard | React + Vite + TypeScript + Tailwind + shadcn/ui | 3000 | โ |
| Backend API | ASP.NET Core 9.0 + Entity Framework Core | 5078 | โ |
| RAG Service | Python 3.11 + FastAPI + Sentence Transformers | 8000 | โ |
| Database | PostgreSQL 15+ | 5432 | โ |
admin@example.comAdmin123!# Clone repository
git clone <your-repo-url>
cd feattie
# Start PostgreSQL with Docker (or use existing instance)
docker run --name feattie-postgres \
-e POSTGRES_USER=postgres \
-e POSTGRES_PASSWORD=postgres \
-e POSTGRES_DB=feattie \
-p 5432:5432 \
-d postgres:15
cd authentication/SecureAuth.Api
# Restore dependencies
dotnet restore
# Update appsettings.json with your OpenAI API key
# Edit: authentication/SecureAuth.Api/appsettings.json
# Set: "OpenAI": { "ApiKey": "sk-your-key-here" }
# Run migrations
dotnet ef database update
# Start API server
dotnet run
โ Backend running at: http://localhost:5078
# From project root
python3 -m venv .venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
# Install dependencies
pip install -r requirements.txt
# Start RAG server
export PYTHONPATH=$PWD # On Windows: set PYTHONPATH=%CD%
python -m uvicorn src.api.tenant_server:app --host 0.0.0.0 --port 8000 --reload
โ RAG Service running at: http://localhost:8000
cd admin-dashboard
# Install dependencies
npm install
# Create .env file (if not exists)
echo "VITE_API_URL=http://localhost:5078" > .env
# Start development server
npm run dev
โ Admin Dashboard running at: http://localhost:3000
๐ Done! Your AI chat widget is ready to embed on your e-commerce site.
Navigate to Tenant Management
Click "Create New Tenant"
Click "Create Tenant"
Note: First sync may take a few minutes depending on product count.
Prerequisites: Products must be synced first
Note: Embeddings enable semantic search. Without them, chat won't work properly.
Click "Edit Settings" on your tenant
Appearance Tab:
Behavior Tab:
Live Preview:
Click "Save Settings"
</body> tag in your website:<!-- Feattie Chat Widget -->
<script>
window.FeattieChat = {
tenantId: 1,
tenantSlug: 'your-store',
apiUrl: 'http://localhost:5078',
customization: {
primaryColor: '#6366f1',
secondaryColor: '#8b5cf6',
position: 'bottom-right',
chatTitle: 'Chat with us',
welcomeMessage: 'Hello! How can I help you today?',
autoOpen: false,
autoOpenDelay: 5,
showTypingIndicator: true
}
};
</script>
<script src="http://localhost:5078/widget/widget.js"></script>
File: authentication/SecureAuth.Api/appsettings.json
{
"ConnectionStrings": {
"Default": "Host=localhost;Port=5432;Database=feattie;Username=postgres;Password=postgres"
},
"Jwt": {
"Secret": "your-super-secret-jwt-key-minimum-32-characters-required-for-production",
"Issuer": "SecureAuth.Api",
"Audience": "SecureAuth.Client",
"ExpiryMinutes": 60
},
"Cors": {
"AllowedOrigins": ["http://localhost:5173", "http://localhost:3000"]
},
"PythonRAG": {
"BaseUrl": "http://localhost:8000"
},
"OpenAI": {
"ApiKey": "sk-your-openai-api-key-here"
}
}
File: admin-dashboard/.env
VITE_API_URL=http://localhost:5078
File: .env (project root)
OPENAI_API_KEY=sk-your-openai-api-key-here
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Customer Website โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ Embedded Chat Widget (JavaScript) โ โ
โ โ - Loads tenant config via API โ โ
โ โ - Renders chat interface โ โ
โ โ - Sends messages to chat endpoint โ โ
โ โโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ HTTP/HTTPS
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ .NET Core API (Port 5078) โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ Public Endpoints (No Authentication): โ โ
โ โ - GET /api/widget/config/{slug} โ โ
โ โ - POST /api/chat/{tenantId} โ โ
โ โ - GET /api/chat/{tenantId}/history/{sessionId} โ โ
โ โ - GET /widget/widget.js โ โ
โ โ โ โ
โ โ Authenticated Endpoints: โ โ
โ โ - POST /api/auth/login โ โ
โ โ - GET /api/tenant โ โ
โ โ - POST /api/tenant โ โ
โ โ - GET /api/tenants/{id}/settings โ โ
โ โ - PUT /api/tenants/{id}/settings โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ
โ โ HTTP
โผ โผ
โโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ PostgreSQL DB โ โ Python RAG Service (Port 8000) โ
โ (Port 5432) โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ โ โ - Sentence Transformers โ โ
โ - Users โ โ โ - OpenAI GPT-4o-mini โ โ
โ - Tenants โ โ โ - Embedding generation โ โ
โ - TenantSettings โ โ โ - Semantic search โ โ
โ - Products โ โ โ - RAG pipeline โ โ
โ - ChatSessions โ โ โ - Context injection โ โ
โ - ChatMessages โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ - Contexts โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ - RAGConfigurations โ
โโโโโโโโโโโโโโโโโโโโโโโโ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Admin Dashboard (React + Vite - Port 3000) โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ Pages: โ โ
โ โ - Dashboard (system stats) โ โ
โ โ - Tenant Management (CRUD) โ โ
โ โ - User Management (assign to tenants) โ โ
โ โ - Widget Settings (customization + live preview) โ โ
โ โ - Chat Test (test AI chat) โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
| Method | Endpoint | Description | Body |
|---|---|---|---|
| GET | /api/widget/config/{tenantSlug} | Get widget configuration | - |
| POST | /api/chat/{tenantId} | Send chat message | { query, sessionId?, topK? } |
| GET | /api/chat/{tenantId}/history/{sessionId} | Get chat history | - |
| GET | /widget/widget.js | Widget JavaScript file | - |
| Method | Endpoint | Description | Body |
|---|---|---|---|
| POST | /api/auth/login | Login | { email, password } |
| POST | /api/auth/register | Register new user | { email, password, firstName?, lastName? } |
| POST | /api/auth/logout | Logout | - |
| GET | /api/auth/me | Get current user info | - |
| GET | /api/auth/me/tenants | Get user's assigned tenants | - |
| Method | Endpoint | Description | Body |
|---|---|---|---|
| GET | /api/tenant | List all tenants | Query: isActive?, page?, pageSize? |
| GET | /api/tenant/{id} | Get tenant by ID | - |
| GET | /api/tenant/by-slug/{slug} | Get tenant by slug | - |
| POST | /api/tenant | Create new tenant | { Name, Slug, ShopifyStoreUrl, ShopifyAccessToken?, MaxProducts? } |
| PUT | /api/tenant/{id} | Update tenant | { Name?, ShopifyStoreUrl?, IsActive?, MaxProducts? } |
| DELETE | /api/tenant/{id} | Delete tenant (soft delete) | Query: permanent? |
| GET | /api/tenant/{id}/stats | Get tenant statistics | - |
| Method | Endpoint | Description | Body |
|---|---|---|---|
| GET | /api/auth/admin/users | List all users | Query: search?, page?, pageSize? |
| GET | /api/auth/admin/users/{userId}/tenants | Get user's tenants | - |
| POST | /api/auth/admin/users/{userId}/tenants/{tenantId} | Assign user to tenant | { role? } |
| DELETE | /api/auth/admin/users/{userId}/tenants/{tenantId} | Remove user from tenant | - |
| Method | Endpoint | Description | Body |
|---|---|---|---|
| GET | /api/tenants/{id}/settings | Get tenant settings | - |
| PUT | /api/tenants/{id}/settings | Update tenant settings | { brandColorPrimary?, brandColorSecondary?, widgetPosition?, chatTitle?, welcomeMessage?, autoOpen?, autoOpenDelaySeconds?, showTypingIndicator? } |
| GET | /api/tenants/{id}/settings/embed-code | Get embed code (Admin) | - |
| Method | Endpoint | Description | Body |
|---|---|---|---|
| GET | /api/tenants/{id}/products | List products | Query: hasEmbedding?, page?, pageSize? |
| POST | /api/tenants/{id}/products/sync | Sync products from Shopify | { forceResync? } |
| POST | /api/tenants/{id}/products/generate-embeddings | Generate embeddings | { forceRegenerate? } |
| GET | /api/tenants/{id}/products/stats | Get product statistics | - |
| Method | Endpoint | Description | Body |
|---|---|---|---|
| GET | /api/tenants/{id}/rag-config | Get RAG configuration | - |
| PUT | /api/tenants/{id}/rag-config | Update RAG configuration | { embeddingModel?, llmModel?, systemPrompt?, temperature?, ... } |
feattie/
โโโ authentication/SecureAuth.Api/ # .NET Core Backend API
โ โโโ Controllers/
โ โ โโโ AuthController.cs # Authentication & user management
โ โ โโโ TenantController.cs # Tenant CRUD operations
โ โ โโโ TenantSettingsController.cs # Widget settings
โ โ โโโ ChatController.cs # Chat API
โ โ โโโ ProductController.cs # Product sync & embeddings
โ โ โโโ RAGConfigurationController.cs # RAG settings
โ โโโ Models/
โ โ โโโ User.cs # User model
โ โ โโโ Tenant.cs # Tenant model
โ โ โโโ TenantUser.cs # User-Tenant junction
โ โ โโโ TenantSettings.cs # Widget settings
โ โ โโโ Product.cs # Product model
โ โ โโโ ChatSession.cs # Chat session
โ โ โโโ ChatMessage.cs # Chat message
โ โ โโโ RAGConfiguration.cs # RAG config
โ โ โโโ Context.cs # Custom context
โ โโโ Services/
โ โ โโโ ShopifyService.cs # Shopify integration
โ โ โโโ PythonRAGService.cs # Python RAG client
โ โ โโโ ProductService.cs # Product operations
โ โโโ Data/
โ โ โโโ AppDbContext.cs # Entity Framework DbContext
โ โโโ DTOs/ # Data Transfer Objects
โ โโโ Migrations/ # EF Core migrations
โ โโโ wwwroot/widget/
โ โ โโโ widget.js # Embeddable widget script
โ โโโ Program.cs # Application entry point
โ โโโ appsettings.json # Configuration
โ โโโ appsettings.Development.json # Dev configuration
โ
โโโ admin-dashboard/ # React Admin Dashboard
โ โโโ app/ # Next.js App Router
โ โ โโโ page.tsx # Dashboard home
โ โ โโโ tenants/
โ โ โ โโโ page.tsx # Tenant management
โ โ โโโ users/
โ โ โ โโโ page.tsx # User management
โ โ โโโ tenant-settings/
โ โ โ โโโ page.tsx # Widget settings
โ โ โโโ chat/
โ โ โ โโโ page.tsx # Chat test
โ โ โโโ auth/
โ โ โโโ login/
โ โ โโโ page.tsx # Login page
โ โโโ components/
โ โ โโโ ui/ # shadcn/ui components
โ โ โโโ AdminLayout.tsx # Layout with sidebar
โ โโโ contexts/
โ โ โโโ AuthContext.tsx # Authentication context
โ โโโ lib/
โ โ โโโ api.ts # API client (axios)
โ โ โโโ utils.ts # Utility functions
โ โโโ hooks/
โ โ โโโ use-toast.tsx # Toast notifications
โ โโโ package.json
โ โโโ vite.config.ts
โ โโโ tailwind.config.js
โ โโโ .env # Environment variables
โ
โโโ src/ # Python RAG Service
โ โโโ api/
โ โ โโโ tenant_server.py # FastAPI server
โ โโโ embeddings/
โ โ โโโ local_embeddings.py # Sentence Transformers
โ โ โโโ openai_embeddings.py # OpenAI embeddings
โ โโโ models/
โ โ โโโ tenant_models.py # Pydantic models
โ โโโ services/
โ โโโ llm_service.py # OpenAI LLM integration
โ โโโ rag_service.py # RAG pipeline
โ
โโโ scripts/
โ โโโ shop_pull.py # Shopify product scraper
โ โโโ add-admin.sh # Add admin user script
โ
โโโ requirements.txt # Python dependencies
โโโ package.json # Project metadata
โโโ .env # Environment variables
โโโ .env.example # Example env file
โโโ README.md # This file
โโโ QUICK_START.md # Quick start guide
โโโ OPENAI_SETUP.md # OpenAI setup guide
# Kill processes on specific ports
lsof -ti:5078 | xargs kill -9 # .NET API
lsof -ti:8000 | xargs kill -9 # Python RAG
lsof -ti:5173 | xargs kill -9 # Admin Dashboard
lsof -ti:5432 | xargs kill -9 # PostgreSQL
# Or kill all at once
lsof -ti:5078,8000,5173 | xargs kill -9
Check PostgreSQL is running:
pg_isready -h localhost -p 5432
Check connection string in appsettings.json:
"ConnectionStrings": {
"Default": "Host=localhost;Port=5432;Database=feattie;Username=postgres;Password=postgres"
}
Ensure database exists:
psql -U postgres
CREATE DATABASE feattie;
\q
Run migrations:
cd authentication/SecureAuth.Api
dotnet ef database update
# Activate virtual environment
source .venv/bin/activate # macOS/Linux
.venv\Scripts\activate # Windows
# Set PYTHONPATH
export PYTHONPATH=$PWD # macOS/Linux
set PYTHONPATH=%CD% # Windows
# Reinstall dependencies
pip install -r requirements.txt --upgrade
cd authentication/SecureAuth.Api
# Drop and recreate database (WARNING: deletes all data)
dotnet ef database drop --force
dotnet ef database update
# Or create new migration
dotnet ef migrations add YourMigrationName
dotnet ef database update
Checklist:
appsettings.jsonappsettings.jsonUpdate appsettings.json:
"Cors": {
"AllowedOrigins": [
"http://localhost:5173",
"http://localhost:3000",
"https://your-production-domain.com"
]
}
IsActive = trueAllowedOrigins in CORS to actual domainASPNETCORE_ENVIRONMENT=Production# .NET API
ASPNETCORE_ENVIRONMENT=Production
ConnectionStrings__Default="Host=prod-db.example.com;Port=5432;Database=feattie;Username=app_user;Password=secure_password"
Jwt__Secret="production-secret-key-at-least-32-characters-long-and-random"
Jwt__ExpiryMinutes=60
OpenAI__ApiKey="sk-prod-openai-api-key"
Cors__AllowedOrigins__0="https://admin.yourdomain.com"
PythonRAG__BaseUrl="https://rag.yourdomain.com"
# Python RAG
OPENAI_API_KEY="sk-prod-openai-api-key"
PYTHONPATH=/app
# Admin Dashboard (build time)
VITE_API_URL=https://api.yourdomain.com
OpenAI API Key
text-embedding-3-small) & Chat (gpt-4o-mini)Shopify Access Token (per tenant, optional)
read_products# Dockerfile for .NET API
FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS base
WORKDIR /app
EXPOSE 5078
FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build
WORKDIR /src
COPY ["authentication/SecureAuth.Api/SecureAuth.Api.csproj", "authentication/SecureAuth.Api/"]
RUN dotnet restore "authentication/SecureAuth.Api/SecureAuth.Api.csproj"
COPY . .
WORKDIR "/src/authentication/SecureAuth.Api"
RUN dotnet build "SecureAuth.Api.csproj" -c Release -o /app/build
RUN dotnet publish "SecureAuth.Api.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=build /app/publish .
ENTRYPOINT ["dotnet", "SecureAuth.Api.dll"]
# docker-compose.yml
version: '3.8'
services:
postgres:
image: postgres:15
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_DB: feattie
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
api:
build:
context: .
dockerfile: Dockerfile.api
ports:
- "5078:5078"
environment:
- ConnectionStrings__Default=Host=postgres;Database=feattie;Username=postgres;Password=${DB_PASSWORD}
- Jwt__Secret=${JWT_SECRET}
- OpenAI__ApiKey=${OPENAI_API_KEY}
depends_on:
- postgres
rag:
build:
context: .
dockerfile: Dockerfile.rag
ports:
- "8000:8000"
environment:
- OPENAI_API_KEY=${OPENAI_API_KEY}
- PYTHONPATH=/app
depends_on:
- postgres
admin:
build:
context: ./admin-dashboard
dockerfile: Dockerfile
ports:
- "5173:80"
environment:
- VITE_API_URL=http://api:5078
volumes:
postgres_data:
| Password | Role | Tenants Assigned | |
|---|---|---|---|
| admin@example.com | Admin123! | Admin | All |
| admin@test.com | Test123! | Admin | All |
| john@test.com | Test123! | User | None (assign manually) |
| jane@test.com | Test123! | User | None (assign manually) |
git checkout -b feature/amazing-feature)git commit -m 'Add amazing feature')git push origin feature/amazing-feature)MIT License - see LICENSE file for details
For questions, issues, or feature requests:
QUICK_START.md and OPENAI_SETUP.mdBuilt with โค๏ธ for modern e-commerce businesses
Powered by: .NET 9.0 | React 18 | OpenAI | PostgreSQL | Python 3.11