🌌 MeowPad — Project Story

💡 Inspiration

In the era of AI-assisted software development ("vibecoding"), developers can prompt AI tools to write complex code in seconds. However, this creates a dangerous knowledge gap: developers ship features without digesting the underlying algorithms, design patterns, or framework mechanics. When faced with technical interviews, code reviews, or architectural discussions, they often struggle to explain their own codebase.

We built MeowPad to bridge this gap. Our vision was to create an autonomous knowledge engine that connects a developer's personal Obsidian Markdown notes directly with their local codebases, turning surface-level code generation into deep, interview-ready engineering mastery.


🛠️ How We Built It

MeowPad is built on a 3-tier architecture powered by three specialized AI agents, an asynchronous FastAPI core, a Next.js workspace UI, and an embedded ChromaDB vector store.

1. Agent 1: SmartGapDetector (AST & Import Analysis)

Agent 1 inspects local repositories using Python's native ast module (ast.parse) for Python files and regex parsing for JavaScript/TypeScript imports. It compares extracted codebase dependencies against existing note embeddings in ChromaDB to pinpoint unmapped technical debt and missing documentation.

2. Agent 2: CodebaseCrawler & ContentSynthesizer (Code-Aware RAG)

When a developer chooses to fill a knowledge gap, Agent 2 extracts live function signatures, decorators, and implementation snippets from the codebase. It feeds this context into LiteLLM and streams structured Markdown documentation back to the editor token-by-token using Server-Sent Events (SSE).

3. Agent 3: ActiveRecallJudge (Socratic Quiz & Execution Sandbox)

Agent 3 generates active recall quizzes based on note contents. When developers submit solutions, it executes their code inside an isolated subprocess (subprocess.run) with strict timeout boundaries.

4. Vector Math & RAG Search

Note similarity in ChromaDB is calculated using the cosine similarity metric.

We map ChromaDB vector distance values into intuitive user-facing percentage scores using our similarity normalization formula.


🚩 Challenges We Faced

Handling Function Submissions Without Standard Output

When users submit pure function definitions (e.g., def predict_next_number(seq): ...) without print() statements, standard execution returns an empty stdout.

We solved this by developing an AST-based Smart Function Driver Harness that inspects top-level callables in sys.stdin and dynamically invokes them with test arguments.

Server Host Package Limitations

If a user submits code utilizing third-party libraries (e.g., sklearn, pandas, torch) that are not pre-installed in the execution runtime, standard subprocesses fail with ModuleNotFoundError.

We implemented a Non-Blocking Missing Package Fallback using regex error capturing. When detected, our LLM judge evaluates the user's code conceptually based on logic, syntax, and data flow, marking it as conceptually verified so users are never penalized for server host limitations.

Multi-Panel IDE Workspaces

Designing a fluid IDE workspace in Next.js required integrating:

  • Dockview multi-tab layouts
  • Dynamic force-directed node graphs
  • Live RAG sidebars
  • Global Cmd + K command palettes

while maintaining 100% local-first privacy via the W3C File System Access API.


🎓 What We Learned

  • Deep AST Manipulation: Traversing abstract syntax trees (ast.NodeVisitor) in Python to map code dependencies.
  • Streaming Architecture: Building robust, non-blocking HTTP event pipelines with FastAPI and sse-starlette.
  • Local-First Privacy: Leveraging browser File System Access APIs to query local repositories without uploading raw source code to external servers.

📄 One Page Executive Summary

You can check out our One Page Executive Summary.

Built With

Share this project:

Updates

Submission history