Enterprise-grade technical interview question bank curation system with multi-model AI taxonomy classification, semantic duplicate detection, split & merge workflows, real-time analytics, and automated Supabase database hosting.
- Multi-Model AI Classification Cascade: Integrates Google Gemini (
gemini-3.8-flash→gemini-3.6-flash→gemini-3.1-flash-lite) with a 4-tier resilience cascade and local panelist heuristic fallbacks so the ingestion parser never blocks. - Alphabetized Taxonomy: 36 canonical technical domains arranged in strict alphabetical order across all selectors, review filters, and database triggers.
- Deep Duplicate Detection: Multi-tier deduplication engine combining exact normalization, Levenshtein distance, Jaccard token similarity, and technical keyword stemming.
- Interactive Review & Curation: Inline cell editing, compound question splitting, multi-question merging, bulk status changes, and confidence score badges.
- Direct Supabase Integration: One-click and automated database synchronization to a hosted PostgreSQL
public.questionstable via Supabase SDK. - Multi-Format Export Suite: Export verified question banks as Microsoft Excel (
.xlsx), standard CSV, structured JSON payload, or complete PostgreSQL migration scripts (.sql). - Zero-Stub Database Integrity: The application UI strictly reflects live database content—if the database is cleared, the workspace is clean.
| Layer | Technology |
|---|---|
| Frontend Framework | React 19 + TypeScript (SPA) |
| Styling & Icons | Tailwind CSS + Lucide React |
| Bundler & Dev Server | Vite 6 |
| Backend API Server | Node.js Express + TypeScript (tsx dev runtime, esbuild production bundle) |
| Database | PostgreSQL hosted on Supabase (with GIN indexes, RLS, & triggers) |
| AI Taxonomy Engine | @google/genai (Gemini 3.8 Flash, Gemini 3.6 Flash, Gemini 3.1 Flash Lite) |
| Spreadsheet Engine | xlsx (SheetJS) |
├── .env.example # Environment variables template
├── .gitignore # Git ignore rules for node_modules, build, secrets
├── index.html # HTML entry point with metadata tags
├── metadata.json # Application platform manifest
├── package.json # Project dependencies and build scripts
├── server.ts # Express full-stack API server & Vite middleware
├── tsconfig.json # TypeScript compiler configuration
├── vite.config.ts # Vite configuration with Tailwind CSS plugin
├── supabase/
│ └── schema.sql # Supabase PostgreSQL schema, indexes, RLS & triggers
└── src/
├── main.tsx # React application entry point
├── App.tsx # Main layout, view routing & global state
├── types.ts # TypeScript interfaces, enums, & alphabetized taxonomy
├── components/
│ ├── Navbar.tsx # Navigation header with mode switching
│ ├── IngestionParser.tsx # Raw transcript input & AI panelist parser
│ ├── ReviewTable.tsx # Curated questions review queue with inline edit
│ ├── QuestionBrowser.tsx # Bank catalog with card/table views & filters
│ ├── DashboardAnalytics.tsx # Domain coverage & taxonomy statistics
│ ├── ExportSupabaseView.tsx # Export hub & Supabase sync center
│ ├── SupabaseSetupModal.tsx # 1-Click interactive SQL setup dialog
│ ├── EditQuestionModal.tsx # Single-question comprehensive editor
│ ├── QuestionDetailModal.tsx # Question detail & rationale modal
│ ├── MergeSplitModal.tsx # Compound question split & merge tool
│ └── CustomEnumSelect.tsx # Dynamic enum dropdown with custom input
└── utils/
├── analyzer.ts # Heuristic rule-based panelist analyzer
└── exportUtils.ts # Excel, CSV, and JSON export utilities
Before running the application, make sure you have:
- Node.js: Version 18.0.0 or higher (Node 20+ recommended).
- npm (comes with Node) or pnpm / yarn / bun.
- Supabase Account: A free project at supabase.com.
- Google Gemini API Key: Obtain a key from Google AI Studio.
git clone https://github.com/<YOUR_USERNAME>/devops-question-bank.git
cd devops-question-banknpm installCreate a .env file in the root directory:
cp .env.example .envEdit .env with your actual credentials:
# Gemini API Key for AI question analysis & taxonomy classification
GEMINI_API_KEY="your-gemini-api-key"
# Supabase Project Credentials
SUPABASE_URL="https://your-project-id.supabase.co"
SUPABASE_KEY="your-supabase-service-role-or-anon-key"npm run devOpen http://localhost:3000 in your browser.
Host your production question bank on Supabase PostgreSQL in less than 2 minutes:
- Go to https://supabase.com/dashboard.
- Click New Project, choose an organization, set a project name (e.g.
devops-bank), and set a strong database password. - Select the region closest to your users.
- In your Supabase project dashboard, click the SQL Editor icon in the left sidebar.
- Click New Query.
- Open the file
supabase/schema.sqlin this repo, copy its contents, paste them into the SQL editor, and click Run. - The following table, indexes, and policies will be created:
public.questionstable with UUID primary key.- GIN indexes for array searching on
tagsandsearch_keywords. - Full-text search index on question text and explanations.
- Automatic
updated_attrigger function. - Row Level Security (RLS) policies allowing public read, insert, update, and delete.
- In the Supabase dashboard, click the gear icon (Project Settings) → API.
- Copy the Project URL → paste as
SUPABASE_URLin.env. - Copy the service_role key (recommended for server-side operations) or anon public key → paste as
SUPABASE_KEYin.env.
- Launch the app and navigate to the Export & Supabase tab.
- The badge in the header will display Connected to Supabase with the live row count.
- When questions are marked as Review Completed in the Review Queue, they automatically synchronize to your live Supabase database!
Follow these steps to publish this repository to your GitHub account:
- Go to https://github.com/new.
- Name the repository (e.g.
devops-question-bank). - Set visibility to Public or Private.
- Do not check "Initialize with README",
.gitignore, or license (we already have them configured). - Click Create repository.
Run the following commands in your project root directory:
# Initialize git repository
git init
# Stage all files
git add .
# Commit files
git commit -m "feat: complete DevOps interview question bank management system with AI & Supabase sync"
# Rename branch to main
git branch -M main
# Link to your remote GitHub repository
git remote add origin https://github.com/<YOUR_GITHUB_USERNAME>/<YOUR_REPO_NAME>.git
# Push code to GitHub
git push -u origin mainThe application includes a self-contained production bundle script:
# Production build
npm run build
# Start production server (listens on port 3000)
npm start- Sign in to Render.com or Railway.app.
- Create a new Web Service connected to your GitHub repository.
- Configure the service settings:
- Environment:
Node - Build Command:
npm run build - Start Command:
npm start
- Environment:
- In the Environment Variables tab, add:
GEMINI_API_KEY: Your Google Gemini API keySUPABASE_URL: Your Supabase Project URLSUPABASE_KEY: Your Supabase API KeyNODE_ENV:production
- Click Deploy.
Create a Dockerfile in the root directory:
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM node:20-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production
COPY package*.json ./
RUN npm ci --omit=dev
COPY --from=builder /app/dist ./dist
EXPOSE 3000
CMD ["npm", "start"]Build and run with Docker:
docker build -t devops-question-bank .
docker run -p 3000:3000 -e GEMINI_API_KEY="your-key" -e SUPABASE_URL="your-url" -e SUPABASE_KEY="your-key" devops-question-bank| Column | PostgreSQL Data Type | Description |
|---|---|---|
id |
UUID PRIMARY KEY |
RFC4122 unique identifier (gen_random_uuid()) |
question |
TEXT NOT NULL |
Full text of the interview question |
primary_topic |
VARCHAR(100) NOT NULL |
Dominant technical domain (from 36 canonical topics) |
cross_topics |
TEXT[] DEFAULT '{}' |
Secondary interrelated technical domains |
difficulty |
VARCHAR(50) NOT NULL |
Beginner, Intermediate, Advanced, or Expert |
question_type |
VARCHAR(50) NOT NULL |
Theory, Scenario, Troubleshooting, Architecture, Incident, etc. |
experience_level |
VARCHAR(50) NOT NULL |
0-2 Years, 2-4 Years, 4-7 Years, 8+ Years |
interview_round |
VARCHAR(50) NOT NULL |
Screening, L1, L2, Managerial |
tags |
TEXT[] DEFAULT '{}' |
Sub-topic keywords (e.g. pod-lifecycle, ingress, helm-chart) |
search_keywords |
TEXT[] DEFAULT '{}' |
Normalized search tokens for elastic query matching |
confidence_score |
INTEGER DEFAULT 90 |
AI classifier confidence rating (0 to 100) |
duplicate_group |
VARCHAR(50) |
Cluster ID linking semantically identical questions |
explanation |
TEXT |
Panelist rationale, answer guidance, or architectural notes |
status |
VARCHAR(50) DEFAULT 'Approved' |
Approved, Pending Review, or Archived |
created_at |
TIMESTAMPTZ DEFAULT NOW() |
Creation timestamp |
updated_at |
TIMESTAMPTZ DEFAULT NOW() |
Last update timestamp (managed by Postgres trigger) |
The primary technical topics are maintained in strict alphabetical order:
- Ansible
- Architecture
- Automation
- AWS
- Azure
- CI/CD
- CloudWatch
- Containerd
- Database
- DevSecOps
- DNS
- Docker
- GCP
- Git
- GitHub
- Grafana
- Helm
- IAM
- Jenkins
- Kubernetes
- Linux
- Monitoring
- Networking
- Observability
- OCI
- OpenShift
- Others
- Platform Engineering
- Podman
- Prometheus
- Python
- Security
- Shell Scripting
- SRE
- Storage
- Terraform
| Method | Endpoint | Description |
|---|---|---|
GET |
/api/health |
Server health check and Gemini API key status |
POST |
/api/analyze |
AI panelist question parsing with 4-tier model cascade |
GET |
/api/supabase/status |
Checks Supabase credentials, connectivity & table presence |
GET |
/api/supabase/questions |
Fetches live questions directly from public.questions table |
POST |
/api/supabase/upload |
Upserts structured question records into Supabase |
POST |
/api/supabase/update |
Updates a specific question by ID in Supabase |
POST |
/api/supabase/delete |
Deletes one or more questions by ID from Supabase |
POST |
/api/supabase-sql |
Generates a complete PostgreSQL DDL and seed INSERT script |
npm run dev- Starts backend Express server with Vite middleware in development mode.npm run build- Compiles the frontend Vite SPA and bundlesserver.tsinto a CommonJS production bundle (dist/server.cjs).npm start- Launches the compiled standalone Node.js production server.npm run lint- Type-checks the TypeScript codebase (tsc --noEmit).npm run clean- Cleans build output directories.
MIT License. Feel free to use, modify, and distribute for personal, educational, or enterprise interview question bank management.