π Live Demo: https://fabricprompts.com/ - Prompt Explorer with GIAC Filtering
π Award: Best Use of AI Features within Microsoft Fabric, 2025 FabCon Global Hackathon (Microsoft's winners announcement)
A React-based frontend for exploring and managing Power BI and Fabric prompts with advanced filtering capabilities for Guy in a Cube content.
- Watch the video:
- Briefing notes:
Executive_Briefing.md
If youβre running locally via npm run dev, the video is served from Viteβs public directory and available at the Local dev URL above.
- π§ Guy in a Cube Filter: 38 expert prompts generated from GIAC videos
- π€ Custom Filter: 72 workforce prompts for specialized use cases
- π Combined Filtering: Source + search + pillar filtering
- π Real-time Statistics: Live counts and breakdowns
- Blue GIAC Badges: Identify Guy in a Cube prompts with cube icons
- Gray Custom Badges: Mark custom workforce prompts with user icons
- YouTube Integration: Direct links to source videos for GIAC prompts
- Interactive Counts: Filter buttons show real-time prompt counts
- π Catalogue: 110 total prompts with advanced filtering
- πΌ Workforce: 72 workforce prompts in dedicated section
- π Workflow: 113 DAG nodes with interactive visualization
- β Help: Comprehensive documentation and guides
- Node.js 18+
- npm or yarn
# 1. Install dependencies
npm install
# 2. Start development server
npm run dev
# 3. Open browser
# http://localhost:5173/# Build optimized bundle
npm run build
# Preview production build
npm run preview- CI workflow:
.github/workflows/azure-deploy.yml - Uses GitHub OIDC via
azure/login@v2(no publish profile). - Required repo secrets:
AZURE_CLIENT_ID,AZURE_TENANT_ID,AZURE_SUBSCRIPTION_ID. - Required repo variables:
AZURE_WEBAPP_NAME,AZURE_RESOURCE_GROUP. - Builds frontend from
src/and deploys a self-containedrelease.zipto Linux App Service. - Run-from-package enabled; a tiny Node server serves SPA with
/healthand/versionendpoints. - Docs URL (Help): controlled by repo variable
VITE_HELP_CENTER_URL(fallback toVITE_HELP_URL).
- Overview & Getting Started: see sections below and
src/README-REACT.md - Executive Briefing: see links in the "Executive Briefing" section above
- Azure Deployment:
docs/DEPLOYMENT_AZURE.md - Validation & Checks:
docs/VALIDATION.md - Upstream Content Pipeline (GIAC/Workforce):
docs/UPSTREAM_PIPELINE.md
src/
βββ prompt-catalog.json # 110 prompts (38 GIAC + 72 Custom)
βββ workforce_prompts.json # 72 workforce prompts (dedicated section)
βββ dag.json # 113 workflow nodes + 45 edges
{
"id": "giac-5i8yzn8odao",
"name": "Power BI Assistant: STOP Using Measures in Power BI Until You See This!",
"provenance": "giac",
"category": "dax-modeling",
"tags": ["dax", "measures", "guy-in-a-cube"],
"links": {
"youtube": "https://www.youtube.com/watch?v=5I8yzn8oDAo"
},
"system": "You are a Power BI expert assistant specializing in DAX..."
}{
"nodes": [
{
"id": "workflow-giac-dax-optimization",
"label": "DAX Optimization Workflow",
"group": "giac",
"pillars": ["dax", "performance"]
}
],
"edges": [
{
"from": "workflow-1",
"to": "workflow-2"
}
]
}[Catalogue] [Workforce] [Workflow] [Help]
β β β β
110 prompts 72 prompts 113 nodes Docs
GIAC filter Full table DAG graph Guides
Search: [_______________]
Source: [All (110)] [π§ Guy in a Cube (38)] [π€ Custom (72)]
Pillars: [All Pillars] [DAX] [Fabric] [Power Query] [Governance] [Performance]
Results: Showing 38 of 110 prompts β’ Filtered by Guy in a Cube
π§ GIAC Power BI Assistant: DAX Optimization Techniques
dax-modeling π₯ YouTube
Expert guidance on DAX optimization based on Guy in a Cube content
π€ Custom Accessibility and UX Reviewer
deployment-governance
Audit Power BI reports for accessibility compliance
src/
βββ components/
β βββ layout/ # Header, Footer, navigation
β βββ sections/ # Main page sections
β β βββ CatalogueSection.tsx
β β βββ WorkforceSection.tsx
β β βββ DagSection.tsx
β βββ tables/ # Data tables and modals
β β βββ PromptTable.tsx
β β βββ PromptDetailsModal.tsx
β βββ ui/ # Reusable UI components
β β βββ Hero.tsx
β β βββ SectionCard.tsx
β β βββ PillarBadge.tsx
β βββ graph/ # DAG visualization
β βββ WorkflowGraph.tsx
βββ hooks/
β βββ useData.ts # Data loading and management
β βββ useChatbase.ts # Chatbot integration
βββ services/ # API and data services
βββ utils/ # Utility functions
βββ types.ts # TypeScript interfaces
βββ constants.ts # App constants
βββ App.tsx # Main application component
PromptTable.tsx
- Main filtering logic for GIAC vs Custom prompts
- Visual indicators and badges
- Search and pillar filtering integration
- Real-time count updates
Hero.tsx
- Statistics display with GIAC/Custom breakdown
- Dynamic counts based on current data
- Visual hierarchy for key metrics
DagSection.tsx
- Interactive workflow visualization
- Node clicking for prompt details
- GIAC workflow integration
// Source filtering implementation
const sourceMatch = !activeSource ||
(activeSource === 'giac' && p.provenance === 'giac') ||
(activeSource === 'custom' && p.provenance !== 'giac');
// Combined with search and pillar filters
const filteredPrompts = prompts.filter(p => {
return searchMatch && pillarMatch && sourceMatch;
});- Total Prompts: 110 (38 GIAC + 72 Custom)
- Categories: DAX Modeling (26), Fabric Architecture (8), Power Query (10), etc.
- GIAC Coverage: DAX (15), Fabric (8), General (7), Power Query (5), Visualization (2), Performance (1)
- Workflow Nodes: 113 (72 catalog + 41 GIAC workflows)
- Schema Compliance: 100% of prompts follow defined schema
- YouTube Integration: All GIAC prompts have source video links
- Traceability: Full audit trail from prompts to source content
- Test Coverage: Comprehensive test suite with quality gates
- GIAC Prompts: Generated from
scripts/generate_giac_prompts.py - Workforce Prompts: Curated custom prompts for specialized workflows
- DAG Workflows: Interactive process visualization with GIAC integration
- YouTube: Direct video links for GIAC prompts
- Chatbase: Embedded chatbot for user assistance
- CI/CD: Automated testing and deployment
- Find GIAC DAX Prompts: Click "Guy in a Cube" β Select "DAX" pillar
- Search Custom Prompts: Click "Custom" β Search "governance"
- Browse All Content: Click "All" β Use search or pillar filters
- View YouTube Video: Click YouTube icon on GIAC prompts
- Read Documentation: Click prompt name for detailed modal
- Explore Workflows: Navigate to Workflow section for DAG visualization
- Update Data: Regenerate prompts with GIAC generation scripts
- Test Changes: Run comprehensive test suite
- Verify UI: Check filtering and visual indicators
- Deploy: Build and deploy with CI/CD pipeline
- Main README:
../README.md- Complete project overview - GIAC Generation:
../docs/GIAC_PROMPT_GENERATION.md- Prompt generation guide - Frontend Features:
../FRONTEND_GIAC_FILTERING.md- Filtering capabilities - Test Suite:
../tests/README.md- Testing framework
The frontend is designed to work with static hosting or integrated with the Python backend:
# Static deployment
npm run build
# Deploy dist/ folder to your hosting service
# Integrated deployment
# Copy built assets to backend static folder
# Configure backend to serve frontend routes- β One-click filtering between GIAC and custom prompts
- β Visual indicators clearly distinguish prompt sources
- β YouTube integration provides direct access to expert content
- β Real-time statistics show current filter status
- β Comprehensive coverage of all prompt types and workflows
- β 110 total prompts with full metadata
- β 38 GIAC prompts with YouTube traceability
- β 113 workflow nodes with interactive visualization
- β 100% schema compliance across all content
- β Responsive design works on all devices
The frontend provides a comprehensive, user-friendly interface for exploring both expert Guy in a Cube content and custom workforce prompts with advanced filtering and visualization capabilities.
- Azure Web App via GitHub Actions (
.github/workflows/azure-deploy.yml) - Builds under
src/using Node 20 and deployssrc/dist
Configure the following GitHub secrets for OIDC-based Azure login:
AZURE_CLIENT_IDAZURE_TENANT_IDAZURE_SUBSCRIPTION_IDAZURE_WEBAPP_NAME(target app service)
- Configure
.envusing.env.example(setAZURE_AI_SEARCH_*and Azure OpenAI keys; setAZURE_OPENAI_EMBED_MODEL). - Create/update your Azure Search index to match
todo/specs/user-guide-automation/003-implement-hybrid-search/hybridsearch_fabricagent_aisearch_index.json. - Dry run (no upserts):
make ingest.dryrun(prints counts by folder/ext) - Ingest repo files to Azure Search:
make ingest - Run a hybrid query from CLI:
make query q="your query" k=10 opts="--semantic --filter kind=md,tag=spec" - Local API server exposes
/api/search/hybrid(POST search, GET suggestions):make serve
Environment (set in .env)
- Search:
AZURE_AI_SEARCH_ENDPOINT,AZURE_AI_SEARCH_API_KEY,AZURE_AI_SEARCH_INDEX_NAME, optionalAZURE_SEARCH_SEMANTIC_CONFIG - Embeddings:
AZURE_OPENAI_ENDPOINT,AZURE_OPENAI_API_KEY(orAZURE_OPENAI_KEY),AZURE_OPENAI_EMBED_MODEL(e.g.,text-embedding-3-small)
Ingest controls
- Limit scope:
INGEST_ONLY=knowledge make ingest(only index knowledge/) - Limit batch size for first run:
INGEST_ONLY=knowledge INGEST_MAX_DOCS=64 make ingest - Caching: per-chunk SHA cache in
.reports/hybrid_ingest_cache.jsonavoids reβembedding unchanged chunks
Sample CLI queries:
make query q="Rewrite this DirectQuery prompt for performance" k=8 opts="--semantic"make query q="DAX: monthly distinct customers with filter context notes" k=8make query q="Incremental refresh parameters guidance for Fabric" k=8 opts="--semantic"make query q="Prompt style guide for Fabric Agent" k=8
Index provisioning:
- Create or update the index from a local schema JSON:
make index.create schema="todo/specs/user-guide-automation/003-implement-hybrid-search/hybridsearch_fabricagent_aisearch_index.json"- Optionally override embedded azureOpenAIParameters from env: prefix with
OVERRIDE_AZURE_OPENAI=1- Example:
OVERRIDE_AZURE_OPENAI=1 AZURE_OPENAI_ENDPOINT=... AZURE_OPENAI_EMBED_MODEL=text-embedding-3-small AZURE_OPENAI_API_KEY=... make index.create
- Example:
Convert Search response β upsert payload
- Build an upsert payload from a prior Search response:
make convert.payload in=embeddings/embeddings_fabricagent.json out=embeddings/upsert_payload.json action=mergeOrUpload
- Directly POST to your index (uses
AZURE_AI_SEARCH_*env):make convert.post in=embeddings/embeddings_fabricagent.json action=mergeOrUpload index=fabricagent
Implementation notes
- IDs: use
sha1(file_path)-chunk_indexto satisfy Azure key constraints; originalfile_pathis stored separately - Chunking: prompts ~500 tokens (100 overlap), transcripts ~300 (50 overlap), never split code fences; MD frontβmatter is excluded from embeddings
- Tags: lowercase, deβduplicated; include topβlevel folder and role (
prompt|guide|transcript|spec)