Inspiration
The Crafters Hub is a woodworking and woodturning school in El Shorouk City, Cairo, Egypt — co-founded by Hosam Elshanawany and Mostafa Fahmy. Mostafa is the woodworking master, the cornerstone of the workshop, the person who made the craft culture real. He is currently in a severe coma and unable to teach. The workshop's physical operations are paused.
The knowledge built together over years — in lessons, in conversations, in hours of answering students' WhatsApp questions — lives in The Cabinet's knowledge base: 553 entries, live in PostgreSQL. This project keeps that knowledge alive, growing, and reachable for the students who still need it.
What it does
The Cabinet Agentic Suite is a three-agent system built with Google ADK 2.7.1: The entire system is controlled through a custom-built, React-based Control Panel UI, bringing enterprise-grade agent orchestration to a sleek, user-friendly workshop dashboard.
Agent 1 — Lesson Ingest Agent (Hybrid Cloud): Fetches a YouTube transcript and sends it to our Google Cloud Run microservice. The Cloud Run service uses Gemini 3.6 Flash with a structured output schema to extract the knowledge (technique, tools, safety, steps), and stores the JSON payload directly into a Google Cloud Storage (GCS) bucket. The local agent then reads the GCS bucket, generates a 3072-dim vector with gemini-embedding-2, and stores it in the on-premise PostgreSQL database.
Agent 2 — Research & Answer Agent: Answers woodworking questions from teachers and students. It searches the ingested knowledge base first (pgvector cosine similarity), falls back to pre-approved trusted websites (AAW, Popular Woodworking), then synthesizes using Gemini. Every answer is stored back in the database as a Q&A pair — this is the Knowledge Flywheel. The second time a similar question arrives, it is answered from local storage in milliseconds at zero API cost.
Agent 3 — Finance Sentinel: Scans the school's production finance database (READ ONLY) for unmatched income transactions and matches them to student enrollment records by amount delta. When confidence exceeds 60%, it sends a WhatsApp message to Hosam via Meta's Cloud API: "Reply APPROVE-{id} or REJECT-{id}." It never auto-modifies a single financial record. Human approval is required for every write.
How we built it
- Google Cloud Run — Serverless hosting for the AI extraction backend (FastAPI)
- Google Cloud Storage — Bridge storage between the cloud extraction service and the on-premise database
- Google ADK 2.7.1 —
Agentclass +@tooldecorator +Runner.run_async()for orchestration - Gemini 3.6 Flash — structured knowledge extraction (JSON schema output) + answer synthesis
- gemini-embedding-2 — 3072-dim vectors for semantic similarity search
- PostgreSQL + pgvector — on-premise vector store, zero hosting cost
- YouTube Transcript API 1.2.4 — transcript fetching without a browser or scraping
- Faster-Whisper — local video transcription at $0 (runs on school's Quadro P1000 GPU)
- Meta WhatsApp Cloud API v20.0 — human-in-the-loop approval channel for Finance Sentinel
- React / Vite / TailwindCSS — Frontend Control Panel UI FastAPI / Python 3.13 / psycopg2 — Unified API Backend
The system uses a true Hybrid Cloud architecture: heavy AI workloads run on Google Cloud Run and GCS, while the vector database stays on the school's own on-premise server.
Challenges we ran into
- pgvector index dimension cap: Both
ivfflatandhnswindex types cap at 2000 dimensions in our pgvector version.gemini-embedding-2outputs 3072 dimensions. Solution: drop the index and use sequential cosine scan (fast enough at <10K rows for the demo window; index can be added post-competition after a pgvector upgrade). - youtube-transcript-api vs GCP: We initially tried to fetch YouTube transcripts directly in Cloud Run, but YouTube blocks requests from GCP IP ranges. We re-architected the system to fetch the transcript locally via the Agent, and POST the text directly to the Cloud Run extraction endpoint.
- **Windows console limitations: Python's rich library on a Windows console struggled with emoji encoding and formatting for complex markdown outputs. Solution: We abandoned the CLI entirely and built a unified FastAPI backend serving a gorgeous React web dashboard, proving that agentic tools need proper web UIs to be truly accessible to non-technical workshop staff.
Accomplishments that we're proud of
- Bypassed YouTube's GCP block by implementing a hybrid ingest pipeline (Local Fetch → Cloud Run Extract → GCS Save → Local DB Write).
- First YouTube video ingested end-to-end in 90 seconds.
- First research query after ingestion returned
kb_matchconfidence — answered from OUR database, not Gemini general knowledge, on the very first try. - Finance Sentinel is scanning the school's real production finance table in read-only mode — no mock data.
- Migrating our fragmented python scripts into a unified FastAPI gateway and a polished React Control Panel in under 24 hours.
What we learned
- ADK 2.7.1's
@tooldecorator with typed Python functions produces clean, Gemini-compatible JSON schema with minimal boilerplate. gemini-embedding-2is significantly more capable thantext-embedding-004but emits 3072-dim vectors — any system assuming 768 dimensions will silently corrupt its vector store.- The human-in-the-loop pattern via WhatsApp is more practical for a small school than any dashboard approval UI.
What's next
- Ingest the full Stuart Batty YouTube back-catalogue (~200 videos) to build a comprehensive woodturning knowledge base.
- Add a WhatsApp-facing research endpoint so students can ask questions directly in WhatsApp and get sourced answers.
- Add the Finance Sentinel approval handler (the write side of the loop — currently only the read + alert side is built).
Built With
- adk
- faster-whisper
- gemini-3.6-flash
- gemini-embedding-2
- google-adk
- google-cloud
- google-cloud-run
- google-genai
- meta-whatsapp-cloud-api
- pgvector
- postgresql
- psycopg2
- python
- rich
- youtube-transcript-api
Log in or sign up for Devpost to join the conversation.