# Project export: Pitcher

This document was generated by HackStack to give an AI agent context about a hackathon project. Sections are labeled with their provenance; content marked as truncated was cut to keep this document small.

## Project metadata

- Hackathon: TreeHacks 2025
- Tagline: Pitch, Ask, EvolveGenerate Real Time Presentations from your code and docs.Ask questions and get instant, source-cited answers.Presentation Evolves dynamically with audience needs.
- Devpost: https://devpost.com/software/pitcher-6v28a3
- GitHub: https://github.com/KevinZWong/Pitcher
- Team: 4 GitHub contributor(s) — Swastik Agrawal (28 commits), KevinZWong (18 commits), Chelsea W. (15 commits), NSP909 (11 commits)

## Devpost submission (written by the team)

### Overview

https://drive.google.com/drive/u/0/folders/1XKlzUc1PADYSHSm9W1Nnx540w5vlVJGt

### Inspiration

We are visual learners. Purely text-based learning leaves us quickly feeling sleepy and disinterested. Textbooks provide as much utility as a rough pillow. Whether through pestering our professors, coworkers, and friends, the only way we can grasp concepts is through interactive learning. Thus, we build a system where given a codebase, documentation, textbook, or novel can produce visual elements as well as talking us through the concepts. Our system can also pause, answer questions, and modify the presentation on the fly giving endless opportunities for long fascinating tangents.

### What it does

Given access to your code base, documentation materials, and a prompt. Pitcher can create a powerpoint presentation that contains relevant images/information from documentation you gave and also custom data visualization charts. Pitcher allows you to showcasing your project in whichever angle you want. Moreover, Pitcher will present to you in its own voice the project that you included. When interrupted verbally Pitcher will stop to answer questions while simultaneously generating more slides to answer your question as well as directly citing information from the codebase/documentation. Key features: generates slides from codebase and documents generates and includes contextual images and data visualizations auto-presents with automatic voiceover Allows user to interrupt and ask questions Generates additional slides for clarification after questions are asked.

### How we built it

To extract the essential information from the input sources (github, google drive) we developed a chunking system that allows us to take full advantage of the context length of LLMs. This chunking system allows us to extract essential statistics and central ideas from multiple documentation files concurrently. We also built tools to extract and analyze images within pdfs as well as summarization tools to understand the functionality of entire code bases. All this information is vectorized into a IRIS database and is stored for later RAG. The summarized input sources are then used to design and build powerpoint presentations. To automate this process we employ MARP, a tool that allows us to create powerpoint presentations with markdown files. The ideas are passed through multiple sets of AI agents. The first set finds the ideal location for text making sure to leave enough space for future images while brainstorming ideas of what visual graphs or photos are best for the situation. Before the next pass this graphics’s information is autonomously retrieved and built by another array of agents based on the framework Mermaid. The presentations are then passed through the build agents that add the images and modify the presentation to be more visually appealing. This presentations are then rendered out and displayed to the user via an iframe. The presentation as well as speaker notes generated during the last round of agentic building are then passed to a reactive Text to speech system which responds to interruptions with relevant information thanks to the RAG system of the entire project.

### Challenges we ran into

One of the challenges we ran into was the sheer scale of the entire project. With multiple sets of agent agents, an immense amount of computational logic needed to extract essential detail and summaries of code bases, RAG system and database management software as well as interactive interfaces needed to provide a solid user experience. This is a huge project. What helped us overcome this challenge was deciding on our project vision early with extremely productive ideation sessions. We also effectively delegated our work with each member taking up a clear piece of the project.

### What's next

We plan to scale this project to service thousands of visual learners. We also plan to improve the capabilities of our agentic system to produce more accurate presentation information as well as give more precise verbal responses.

## README (from the GitHub repository)

# Pitcher

### installation for codegen
```uv venv
source .venv/bin/activate
uv init
uv add codegen
codegen init```
- just dm me if it doesnt work lolz

### iris installation
To setup Iris:
follow these instructions https://github.com/intersystems-community/hackathon-2024/tree/main


## Detected evidence (automated analysis)

Indexed codebase: 144 recognized source files, 925 KB.
- Anthropic (technology) — detected in the code
- CSS (language) — detected in the code
- FastAPI (technology) — detected in the code
- HTML (language) — detected in the code
- JavaScript (language) — detected in the code
- LangChain (technology) — detected in the code
- Next.js (technology) — detected in the code
- OpenAI (technology) — detected in the code
- Python (language) — detected in the code
- React (technology) — detected in the code
- Tailwind CSS (technology) — detected in the code
- TypeScript (language) — detected in the code

## Codebase structure (from repository index)

### Files (120 of 164)

```
.codegen/codemods/describe/describe.py
.DS_Store
.gitignore
api_server_async.py
api_server.py
drive_extract.py
el_pitcher/output.txt
el_pitcher/pgen.py
el_pitcher/pget.py
el_pitcher/pitch.py
el_pitcher/rag.py
extract_links.py
extract_text_code.py
extract/chunker.py
extract/chunks/combined_chunk_1.txt
extract/chunks/combined_chunk_2.txt
extract/slides.py
extract/summarizer.py
extract/summary/code_summary.txt
extract/summary/text_summary.txt
extract/synethic_data.py
extracted_images/combined_metadata.json
generated_images/img_1.html
generated_images/img_10.html
generated_images/img_2.html
generated_images/img_3.html
generated_images/img_4.html
generated_images/img_5.html
generated_images/img_6.html
generated_images/img_7.html
generated_images/img_8.html
generated_images/img_9.html
graphs/bar.py
graphs/flow.py
graphs/line.py
graphs/pie.py
graphs/process.py
image_gen.py
imagerag.py
imgextract.py
iris.py
marp_slides.py
pitcher/.eslintrc.json
pitcher/.gitignore
pitcher/.prettierrc
pitcher/actions/call.ts
pitcher/api_server.py
pitcher/app/(splash)/about/page.tsx
pitcher/app/(splash)/contact/page.tsx
pitcher/app/(splash)/layout.tsx
pitcher/app/(splash)/page.tsx
pitcher/app/auth/page.tsx
pitcher/app/ConvexClientProvider.tsx
pitcher/app/dashboard/layout.tsx
pitcher/app/dashboard/page.tsx
pitcher/app/dashboard/projects/page.tsx
pitcher/app/dashboard/settings/page.tsx
pitcher/app/globals.css
pitcher/app/layout.tsx
pitcher/app/onboarding/page.tsx
pitcher/components.json
pitcher/components/landing/about/about.tsx
pitcher/components/landing/contact/contact.tsx
pitcher/components/landing/cta.tsx
pitcher/components/landing/faq.tsx
pitcher/components/landing/features.tsx
pitcher/components/landing/hero.tsx
pitcher/components/landing/pricing.tsx
pitcher/components/landing/testminoial.tsx
pitcher/components/nav/app/app-footer.tsx
pitcher/components/nav/app/app-navbar.tsx
pitcher/components/nav/app/app-sidebar.tsx
pitcher/components/nav/home/home-footer.tsx
pitcher/components/nav/home/home-navbar.tsx
pitcher/components/nav/UserMenu.tsx
pitcher/components/ui/accordion.tsx
pitcher/components/ui/alert-dialog.tsx
pitcher/components/ui/alert.tsx
pitcher/components/ui/aspect-ratio.tsx
pitcher/components/ui/avatar.tsx
pitcher/components/ui/badge.tsx
pitcher/components/ui/breadcrumb.tsx
pitcher/components/ui/button.tsx
pitcher/components/ui/calendar.tsx
pitcher/components/ui/card.tsx
pitcher/components/ui/carousel.tsx
pitcher/components/ui/chart.tsx
pitcher/components/ui/checkbox.tsx
pitcher/components/ui/collapsible.tsx
pitcher/components/ui/command.tsx
pitcher/components/ui/context-menu.tsx
pitcher/components/ui/dialog.tsx
pitcher/components/ui/drawer.tsx
pitcher/components/ui/dropdown-menu.tsx
pitcher/components/ui/form.tsx
pitcher/components/ui/hover-card.tsx
pitcher/components/ui/input-otp.tsx
pitcher/components/ui/input.tsx
pitcher/components/ui/label.tsx
pitcher/components/ui/menubar.tsx
pitcher/components/ui/navigation-menu.tsx
pitcher/components/ui/pagination.tsx
pitcher/components/ui/popover.tsx
pitcher/components/ui/progress.tsx
pitcher/components/ui/radio-group.tsx
pitcher/components/ui/resizable.tsx
pitcher/components/ui/scroll-area.tsx
pitcher/components/ui/select.tsx
pitcher/components/ui/separator.tsx
pitcher/components/ui/sheet.tsx
pitcher/components/ui/sidebar.tsx
pitcher/components/ui/skeleton.tsx
pitcher/components/ui/slider.tsx
pitcher/components/ui/sonner.tsx
pitcher/components/ui/switch.tsx
pitcher/components/ui/table.tsx
pitcher/components/ui/tabs.tsx
pitcher/components/ui/textarea.tsx
pitcher/components/ui/toast.tsx
pitcher/components/ui/toaster.tsx
[44 more files omitted for size]
```

### Dependencies

- pitcher/package.json: @auth/core@^0.37.0, @convex-dev/auth@^0.0.77, @eslint/eslintrc@^3, @faker-js/faker@^9.4.0, @hookform/resolvers@^3.10.0, @radix-ui/react-accordion@^1.2.2, @radix-ui/react-alert-dialog@^1.1.4, @radix-ui/react-aspect-ratio@^1.1.1, @radix-ui/react-avatar@^1.1.2, @radix-ui/react-checkbox@^1.1.3, @radix-ui/react-collapsible@^1.1.2, @radix-ui/react-context-menu@^2.2.4, @radix-ui/react-dialog@^1.1.4, @radix-ui/react-dropdown-menu@^2.1.4, @radix-ui/react-hover-card@^1.1.4, @radix-ui/react-icons@^1.3.2, @radix-ui/react-label@^2.1.1, @radix-ui/react-menubar@^1.1.4, @radix-ui/react-navigation-menu@^1.2.3, @radix-ui/react-popover@^1.1.4, @radix-ui/react-progress@^1.1.1, @radix-ui/react-radio-group@^1.2.2, @radix-ui/react-scroll-area@^1.2.2, @radix-ui/react-select@^2.1.4, @radix-ui/react-separator@^1.1.1, @radix-ui/react-slider@^1.2.2, @radix-ui/react-slot@^1.1.1, @radix-ui/react-switch@^1.1.2, @radix-ui/react-tabs@^1.1.2, @radix-ui/react-toast@^1.2.4, @radix-ui/react-toggle@^1.1.1, @radix-ui/react-toggle-group@^1.1.1, @radix-ui/react-tooltip@^1.1.6, @types/node@^20, @types/react@^19, @types/react-dom@^19, axios@^1.7.9, class-variance-authority@^0.7.1, clsx@^2.1.1, cmdk@^1.0.0, convex@^1.17.4, date-fns@^3.6.0, dotenv@^16.4.5, embla-carousel-react@^8.5.2, eslint@^9, eslint-config-next@15.1.3, input-otp@^1.4.2, lucide-react@^0.469.0, next@15.1.3, next-themes@^0.4.4, npm-run-all@^4.1.5, oslo@^1.2.1, postcss@^8, prettier@3.4.2, react@^19.0.0, react-day-picker@^8.10.1, react-dom@^19.0.0, react-hook-form@^7.54.2, react-resizable-panels@^2.1.7, recharts@^2.15.0, resend@3.2.0, sonner@^1.7.2, tailwind-merge@^2.6.0, tailwindcss@^3.4.1, tailwindcss-animate@^1.0.7, typescript@^5, vaul@^1.1.2, zod@^3.24.1
- requirements.txt: aiohappyeyeballs@==2.4.6, aiohttp@==3.11.12, aiosignal@==1.3.2, annotated-types@==0.7.0, anthropic@==0.23.1, anyio@==4.8.0, argcomplete@==3.5.3, astor@==0.8.1, attrs@==25.1.0, backoff@==2.2.1, black@==25.1.0, certifi@==2025.1.31, cffi@==1.17.1, charset-normalizer@==3.4.1, click@==8.1.8, click-option-group@==0.5.6, codeowners@==0.7.0, cryptography@==44.0.1, dataclasses-json@==0.6.7, datamodel-code-generator@==0.28.1, Deprecated@==1.2.18, dicttoxml@==1.7.16, distro@==1.9.0, dnspython@==2.7.0, docstring_parser@==0.16, dotty-dict@==1.3.1, email_validator@==2.2.0, fastapi@==0.115.8, fastapi-cli@==0.0.7, filelock@==3.17.0, flask[async], frozenlist@==1.5.0, fsspec@==2025.2.0, gdown, genson@==1.3.0, gitdb@==4.0.12, GitPython@==3.1.44, giturlparse@==0.12.0, google-api-python-client, google-auth-httplib2, google-auth-oauthlib, graphviz, greenlet@==3.1.1, grpclib@==0.4.7, h11@==0.14.0, h2@==4.2.0, hatch-vcs@==0.4.0, hatchling@==1.27.0, hpack@==4.1.0, httpcore@==1.0.7, httptools@==0.6.4, httpx@==0.28.1, httpx-sse@==0.4.0, huggingface-hub@==0.28.1, humanize@==4.12.0, hypercorn, hyperframe@==6.1.0, idna@==3.10, importlib_resources@==6.5.2, inflect@==5.6.2, iniconfig@==2.0.0, isort@==6.0.0, Jinja2@==3.1.5, jiter@==0.8.2, jsonpatch@==1.33, jsonpointer@==3.0.0, langchain, langchain-openai, langgraph, lazy-object-proxy@==1.10.0, Levenshtein@==0.26.1, markdown-it-py@==3.0.0, MarkupSafe@==3.0.2, marshmallow@==3.26.1, matplotlib, mcp@==1.2.1, mdurl@==0.1.2, mini-racer@==0.12.4, modal@==0.73.51, multidict@==6.1.0, mypy-extensions@==1.0.0, narwhals@==1.26.0, neo4j@==5.28.1, networkx@==3.4.2, nodeenv@==1.9.1, numpy@==2.2.3, openai, orjson@==3.10.15, packaging@==24.2, pathspec@==0.12.1, platformdirs@==4.3.6, plotly@==6.0.0, pluggy@==1.5.0, propcache@==0.2.1, protobuf@==5.29.3, psutil@==7.0.0, pycparser@==2.22, pydantic@==2.10.6, pydantic_core@==2.27.2, pydantic-settings@==2.7.1, pygit2@==1.17.0, PyGithub@==2.5.0, Pygments@==2.19.1, pyinstrument@==5.0.1, pyjson5@==1.6.8, PyJWT@==2.10.1, PyNaCl@==1.5.0, pyppeteer, pyright@==1.1.394, pytest@==8.3.4, pytest-snapshot@==0.9.0, python-dotenv, python-gitlab@==4.13.0, python-Levenshtein@==0.26.1, python-multipart@==0.0.20, python-pptx, python-semantic-release@==9.19.1, pytz@==2025.1, PyYAML@==6.0.2, RapidFuzz@==3.12.1, regex@==2024.11.6, requests@==2.32.3, requests-toolbelt@==1.0.0, rich@==13.9.4, rich-click@==1.8.5, rich-toolkit@==0.13.2, rustworkx@==0.16.0, sentry-sdk@==2.20.0, setuptools@==75.8.0, setuptools-scm@==8.1.0, shellingham@==1.5.4, sigtools@==4.0.1, smmap@==5.0.2, sniffio@==1.3.1, SQLAlchemy@==2.0.38, sse-starlette@==2.2.1, starlette@==0.45.3, synchronicity@==0.9.11, tabulate@==0.9.0, tenacity@==9.0.0, termcolor@==2.5.0, tiktoken@==0.9.0, tokenizers@==0.21.0, toml@==0.10.2, tomlkit@==0.13.2, tqdm@==4.67.1, tree-sitter@==0.24.0, tree-sitter-javascript@==0.23.1, tree-sitter-python@==0.23.6, tree-sitter-typescript@==0.23.2, trove-classifiers@==2025.1.15.22, typer@==0.15.1, types-certifi@==2021.10.8.3, types-toml@==0.10.8.20240310, typing_extensions@==4.12.2, typing-inspect@==0.9.0, unidiff@==0.7.5, urllib3@==2.3.0, uvicorn@==0.34.0, uvloop@==0.21.0, watchfiles@==1.0.4, websockets@==14.2, wrapt@==1.17.2, xmltodict@==0.14.2, yarl@==1.18.3, zstandard@==0.23.0

### Recent commits (newest first)

- final push
- plz work
- minor change
- fixed thread error
- fixed minor issue
- Merge branch 'main' of github.com:KevinZWong/Pitcher
- data ingestion done
- Merge branch 'main' of https://github.com/KevinZWong/Pitcher
- pitcher works
- merge
- flask_server done
- Merge branch 'main' of github.com:KevinZWong/Pitcher
- prompt engineering
- change presentation status letter
- merged
- fix frontend
- use 127 intead of localhost
- fix backend thing
- Merge branch 'main' of github.com:KevinZWong/Pitcher
- revert

## Key source files (fetched from GitHub, selected and truncated for size)

### presentation.md

```markdown
---
marp: true
theme: default
paginate: true
size: 16:9
---

<style>
  section {
    padding: 20px;
    font-size: 18px;
    line-height: 1.6;
  }
  h1 {
    color: #4A90E2;
    text-align: center;
  }
  ul {
    margin: 20px 0;
  }
</style>

# Sales Pitch for JournalAI

- AI-driven journaling platform  
- Enhances mental health through features like sentiment analysis, mood tracking, and personalized music recommendations  
- Target market: individuals, mental health professionals, music enthusiasts  

![w:800 h:400](extracted_images/metrics_user_growth/metrics_user_growth_metadata.json)  

---

# Market Opportunity

- Mental health app market projected to reach $4.2 billion by 2027  
- 30% of the population engages in journaling  

![w:800 h:400](extracted_images/market_analysis_market_size/market_analysis_market_size_metadata.json)  

---

# Key Features

- User authentication  
- AI summarization of journal entries  
- Visual mood tracker  
- Personalized music recommendations  

![w:800 h:400](extracted_images/solution_feature_breakdown/solution_feature_breakdown_metadata.json)  

---

# Technical Architecture

- Frontend: React.js or Vue.js  
- Backend: Node.js with Express.js  
- Database: MongoDB  
- NLP processing for sentiment analysis  

![w:800 h:400](extracted_images/solution_implementation_plan/solution_implementation_plan_metadata.json)  

---

# User Growth Strategy

- Aim for 10,000 users in Year 1  
- Target 100,000 users by Year 3  
- Monthly organic traffic increase of 20%  

![w:800 h:400](extracted_images/metrics_user_growth/metrics_user_growth_metadata.json)  

---

# Revenue Model

- Freemium subscription tiers from $9.99 to $19.99/month  
- Affiliate marketing and corporate wellness programs  

![w:800 h:400](extracted_images/metrics_revenue_streams/metrics_revenue_streams_metadata.json)  

---

# Financial Projections

- Initial capital requirement: $1.5 million  
- Expected revenue: $28 million by Year 3  
- Customer acquisition cost: $30  
- Customer lifetime value: $240  

![w:800 h:400](extracted_images/metrics_market_penetration/metrics_market_penetration_metadata.json)  

---

# Challenges and Solutions

- Data privacy concerns  
- Competition in the market  
- Unique features and robust security measures  

![w:800 h:400](extracted_images/metrics_operational_efficiency/metrics_operational_efficiency_metadata.json)  

---

# Conclusion

- JournalAI aims to revolutionize the journaling experience through AI  
- Join us in this journey to enhance mental well-being  

![w:800 h:400](extracted_images/solution_scalability/solution_scalability_metadata.json)  

---

# Q&A Session

- Open the floor for questions  
- Engage with potential investors and users  

![w:800 h:400](extracted_images/solution_security_privacy/solution_security_privacy_metadata.json)  

---
```

### pitcher/knowledge.md

```markdown
### This is the project overview; provides a high-level overview of the project.

Currently a boilerplate template; change all the components to fit the user needs.

Landing Page /
- Navigation bar
    - Boilerplate
- Hero Section
    - Boilerplate
- Features Section
    - Boilerplate
- Pricing Section
    - Boilerplate
- Testimonials Section
    - Boilerplate
- FAQ Section
    - Boilerplate
- Final Call to action
    - Boilerpalte
- Footer Section
    - Boilerplate

About Page (/about)
- Navigation
- Very basic mission statement
- Footer

Contact Page (/contact)
- Navigation
- Default contact information (email, location, phone)
- Footer

Authentication Page (/auth)
- Default email OTP login and sign up

Onboarding Page (/onboarding)
- Onboarding flow. Default just asks for name

Dashboard Page (/dashboard)
- Default content
- Requires onboarding completed
- User profile 

Settings Page (/dashboard/settings)
- Allows the user to update their user information


```

### requirements.txt

```
aiohappyeyeballs==2.4.6
aiohttp==3.11.12
aiosignal==1.3.2
annotated-types==0.7.0
anthropic==0.23.1
anyio==4.8.0
argcomplete==3.5.3
astor==0.8.1
attrs==25.1.0
backoff==2.2.1
black==25.1.0
certifi==2025.1.31
cffi==1.17.1
charset-normalizer==3.4.1
click==8.1.8
click-option-group==0.5.6
codeowners==0.7.0
cryptography==44.0.1
dataclasses-json==0.6.7
datamodel-code-generator==0.28.1
Deprecated==1.2.18
dicttoxml==1.7.16
distro==1.9.0
dnspython==2.7.0
docstring_parser==0.16
dotty-dict==1.3.1
email_validator==2.2.0
fastapi==0.115.8
fastapi-cli==0.0.7
filelock==3.17.0
frozenlist==1.5.0
fsspec==2025.2.0
genson==1.3.0
gitdb==4.0.12
GitPython==3.1.44
giturlparse==0.12.0
greenlet==3.1.1
grpclib==0.4.7
h11==0.14.0
h2==4.2.0
hatch-vcs==0.4.0
hatchling==1.27.0
hpack==4.1.0
httpcore==1.0.7
httptools==0.6.4
httpx==0.28.1
httpx-sse==0.4.0
huggingface-hub==0.28.1
humanize==4.12.0
hyperframe==6.1.0
idna==3.10
importlib_resources==6.5.2
inflect==5.6.2
iniconfig==2.0.0
isort==6.0.0
Jinja2==3.1.5
jiter==0.8.2
jsonpatch==1.33
jsonpointer==3.0.0
langchain
langchain-openai
langgraph
openai
lazy-object-proxy==1.10.0
Levenshtein==0.26.1
markdown-it-py==3.0.0
MarkupSafe==3.0.2
marshmallow==3.26.1
mcp==1.2.1
mdurl==0.1.2
mini-racer==0.12.4
modal==0.73.51
multidict==6.1.0
mypy-extensions==1.0.0
narwhals==1.26.0
neo4j==5.28.1
networkx==3.4.2
nodeenv==1.9.1
numpy==2.2.3
orjson==3.10.15
packaging==24.2
pathspec==0.12.1
platformdirs==4.3.6
plotly==6.0.0
pluggy==1.5.0
propcache==0.2.1
protobuf==5.29.3
psutil==7.0.0
pycparser==2.22
pydantic==2.10.6
pydantic-settings==2.7.1
pydantic_core==2.27.2
pygit2==1.17.0
PyGithub==2.5.0
Pygments==2.19.1
pyinstrument==5.0.1
pyjson5==1.6.8
PyJWT==2.10.1
PyNaCl==1.5.0
pyright==1.1.394
pytest==8.3.4
pytest-snapshot==0.9.0
python-dotenv
python-gitlab==4.13.0
python-Levenshtein==0.26.1
python-multipart==0.0.20
python-semantic-release==9.19.1
pytz==2025.1
PyYAML==6.0.2
RapidFuzz==3.12.1
regex==2024.11.6
requests==2.32.3
requests-toolbelt==1.0.0
rich==13.9.4
rich-click==1.8.5
rich-toolkit==0.13.2
rustworkx==0.16.0
sentry-sdk==2.20.0
setuptools==75.8.0
setuptools-scm==8.1.0
shellingham==1.5.4
sigtools==4.0.1
smmap==5.0.2
sniffio==1.3.1
SQLAlchemy==2.0.38
sse-starlette==2.2.1
starlette==0.45.3
synchronicity==0.9.11
tabulate==0.9.0
tenacity==9.0.0
termcolor==2.5.0
tiktoken==0.9.0
tokenizers==0.21.0
toml==0.10.2
tomlkit==0.13.2
tqdm==4.67.1
tree-sitter==0.24.0
tree-sitter-javascript==0.23.1
tree-sitter-python==0.23.6
tree-sitter-typescript==0.23.2
trove-classifiers==2025.1.15.22
typer==0.15.1
types-certifi==2021.10.8.3
types-toml==0.10.8.20240310
typing-inspect==0.9.0
typing_extensions==4.12.2
unidiff==0.7.5
urllib3==2.3.0
uvicorn==0.34.0
uvloop==0.21.0
watchfiles==1.0.4
websockets==14.2
wrapt==1.17.2
xmltodict==0.14.2
yarl==1.18.3
zstandard==0.23.0
python-pptx
pyppeteer
google-api-python-client 
google-auth-httplib2 
google-auth-oauthlib
matplotlib
graphviz
gdown
flask[async]
hypercorn
```

### pitcher/package.json

```
{
  "name": "base",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "dev": "npm-run-all --parallel dev:frontend dev:backend",
    "dev:frontend": "next dev --turbopack",
    "dev:backend": "convex dev",
    "build": "next build",
    "start": "next start",
    "lint": "next lint"
  },
  "dependencies": {
    "@auth/core": "^0.37.0",
    "@convex-dev/auth": "^0.0.77",
    "@hookform/resolvers": "^3.10.0",
    "@radix-ui/react-accordion": "^1.2.2",
    "@radix-ui/react-alert-dialog": "^1.1.4",
    "@radix-ui/react-aspect-ratio": "^1.1.1",
    "@radix-ui/react-avatar": "^1.1.2",
    "@radix-ui/react-checkbox": "^1.1.3",
    "@radix-ui/react-collapsible": "^1.1.2",
    "@radix-ui/react-context-menu": "^2.2.4",
    "@radix-ui/react-dialog": "^1.1.4",
    "@radix-ui/react-dropdown-menu": "^2.1.4",
    "@radix-ui/react-hover-card": "^1.1.4",
    "@radix-ui/react-icons": "^1.3.2",
    "@radix-ui/react-label": "^2.1.1",
    "@radix-ui/react-menubar": "^1.1.4",
    "@radix-ui/react-navigation-menu": "^1.2.3",
    "@radix-ui/react-popover": "^1.1.4",
    "@radix-ui/react-progress": "^1.1.1",
    "@radix-ui/react-radio-group": "^1.2.2",
    "@radix-ui/react-scroll-area": "^1.2.2",
    "@radix-ui/react-select": "^2.1.4",
    "@radix-ui/react-separator": "^1.1.1",
    "@radix-ui/react-slider": "^1.2.2",
    "@radix-ui/react-slot": "^1.1.1",
    "@radix-ui/react-switch": "^1.1.2",
    "@radix-ui/react-tabs": "^1.1.2",
    "@radix-ui/react-toast": "^1.2.4",
    "@radix-ui/react-toggle": "^1.1.1",
    "@radix-ui/react-toggle-group": "^1.1.1",
    "@radix-ui/react-tooltip": "^1.1.6",
    "axios": "^1.7.9",
    "class-variance-authority": "^0.7.1",
    "@faker-js/faker": "^9.4.0",
    "clsx": "^2.1.1",
    "cmdk": "^1.0.0",
    "convex": "^1.17.4",
    "date-fns": "^3.6.0",
    "embla-carousel-react": "^8.5.2",
    "input-otp": "^1.4.2",
    "lucide-react": "^0.469.0",
    "next": "15.1.3",
    "next-themes": "^0.4.4",
    "oslo": "^1.2.1",
    "react": "^19.0.0",
    "react-day-picker": "^8.10.1",
    "react-dom": "^19.0.0",
    "react-hook-form": "^7.54.2",
    "react-resizable-panels": "^2.1.7",
    "recharts": "^2.15.0",
    "resend": "3.2.0",
    "sonner": "^1.7.2",
    "tailwind-merge": "^2.6.0",
    "tailwindcss-animate": "^1.0.7",
    "vaul": "^1.1.2",
    "zod": "^3.24.1"
  },
  "devDependencies": {
    "@eslint/eslintrc": "^3",
    "@types/node": "^20",
    "@types/react": "^19",
    "@types/react-dom": "^19",
    "dotenv": "^16.4.5",
    "eslint": "^9",
    "eslint-config-next": "15.1.3",
    "npm-run-all": "^4.1.5",
    "postcss": "^8",
    "prettier": "3.4.2",
    "tailwindcss": "^3.4.1",
    "typescript": "^5"
  }
}

```

### pitcher/app/layout.tsx

```typescript
import type { Metadata } from "next";
import { ThemeProvider } from "next-themes";
import { Geist, Geist_Mono } from "next/font/google";
import "./globals.css";
import { ConvexAuthNextjsServerProvider } from "@convex-dev/auth/nextjs/server";
import { ConvexClientProvider } from "./ConvexClientProvider";
import { Toaster } from "@/components/ui/toaster";

const geistSans = Geist({
  variable: "--font-geist-sans",
  subsets: ["latin"],
});

const geistMono = Geist_Mono({
  variable: "--font-geist-mono",
  subsets: ["latin"],
});

// TODO: Change this to the actual project name
export const metadata: Metadata = {
  title: "Base Project",
  description: "Base template",
  icons: {
    icon: "/favicon.png",
  },
};

export default function RootLayout({
  children,
}: Readonly<{
  children: React.ReactNode;
}>) {
  return (
    <ConvexAuthNextjsServerProvider>
      {/* `suppressHydrationWarning` only affects the html tag,
      // and is needed by `ThemeProvider` which sets the theme
      // class attribute on it */}
      <html lang="en" suppressHydrationWarning>
        <body
          className={`${geistSans.variable} ${geistMono.variable} antialiased`}
        >
          <ConvexClientProvider>
            <ThemeProvider attribute="class">
              {children}
              <Toaster />
            </ThemeProvider>
          </ConvexClientProvider> 
        </body>
      </html>
    </ConvexAuthNextjsServerProvider>
  );
}

```

### pitcher/app/(splash)/layout.tsx

```typescript
import HomeNavbar from "@/components/nav/home/home-navbar";
import HomeFooter from "@/components/nav/home/home-footer";
import { ReactNode } from "react";

export default function SplashPageLayout({
  children,
}: {
  children: ReactNode;
}) {
  return (
    <div>
      <HomeNavbar />
      <main>{children}</main>
      <HomeFooter />
    </div>
  );
}

```

### pitcher/app/(splash)/page.tsx

```typescript
"use client"

import Hero1 from "@/components/landing/hero";
import Feature17 from "@/components/landing/features";
import Pricing2 from "@/components/landing/pricing";
import Testimonial10 from "@/components/landing/testminoial";
import CTA10 from "@/components/landing/cta";

export default function Index() {
  return (
    <div>
      <Hero1 />
      <Feature17 />
      <Pricing2 />
      <Testimonial10 />
      <CTA10 />
    </div>
  );
}
```

### pitcher/app/dashboard/layout.tsx

```typescript
'use client';
import { Navbar } from "@/components/nav/app/app-navbar";
import { Sidebar } from "@/components/nav/app/app-sidebar";
import { Authenticated, Unauthenticated } from "convex/react";
import { redirect, usePathname } from "next/navigation";
import { ReactNode } from "react";
import { Footer } from "@/components/nav/app/app-footer";
import { useUser } from "@/hooks/use-user";

export default function SplashPageLayout({
  children,
}: {
  children: ReactNode;
}) {
  const user = useUser();
  const pathname = usePathname(); // Add this hook

  if (user && !user.hasCompletedOnboarding) {
    return redirect('/onboarding');
  }

  return (
      <div className="min-h-screen bg-background flex flex-col w-full">
        <Navbar path={pathname} />
        <div className="flex-1 flex w-full">
          <Sidebar />
          <main className="flex-1 p-4 ml-12 w-full">
            {children}
          </main>
        </div>
        <Footer />
      </div>
  );
}

```

### pitcher/app/onboarding/page.tsx

```typescript
'use client'

import { useState } from "react"
import { useRouter } from "next/navigation"
import { useMutation } from "convex/react"
import { api } from "@/convex/_generated/api"
import { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter } from "@/components/ui/card"
import { Input } from "@/components/ui/input"
import { Button } from "@/components/ui/button"
import { Loader2, User } from "lucide-react"
import { useUser } from "@/hooks/use-user"
import { redirect } from "next/navigation";


export default function Onboarding() {
  const [isLoading, setIsLoading] = useState(false)
  const router = useRouter()
  const user = useUser()
  const updateUser = useMutation(api.users.update)

  if (user && user.hasCompletedOnboarding) {
    redirect('/dashboard')
  }

  return (
    <div className="flex min-h-screen items-center justify-center">
      <Card className="w-full max-w-md">
        <CardHeader>
          <CardTitle>Welcome!</CardTitle>
          <CardDescription>Let's get to know you better</CardDescription>
        </CardHeader>
        <form
          onSubmit={async (event) => {
            event.preventDefault()
            setIsLoading(true)
            try {
              const formData = new FormData(event.currentTarget)
              await updateUser({
                name: formData.get("name") as string,
                email: user?.email, // Preserve existing email if any
                hasCompletedOnboarding: true
              })
              router.push("/dashboard")
            } finally {
              setIsLoading(false)
            }
          }}
        >
          <CardContent>
            <div className="relative">
              <User className="absolute left-3 top-3 h-4 w-4 text-muted-foreground" />
              <Input 
                name="name" 
                placeholder="Your name" 
                className="pl-9"
                disabled={isLoading}
                required
              />
            </div>
          </CardContent>
          <CardFooter>
            <Button 
              type="submit" 
              className="w-full"
              disabled={isLoading}
            >
              {isLoading ? (
                <>
                  <Loader2 className="mr-2 h-4 w-4 animate-spin" />
                  Saving...
                </>
              ) : (
                "Continue to dashboard"
              )}
            </Button>
          </CardFooter>
        </form>
      </Card>
    </div>
  )
}

```

### pitcher/app/dashboard/page.tsx

```typescript
"use client"

import { useUser } from "@/hooks/use-user";
import { Card, CardContent, CardFooter, CardHeader, CardTitle } from "@/components/ui/card";
import { Button } from "@/components/ui/button";
import { Plus, GitBranch, Clock, Presentation } from "lucide-react";
import Link from "next/link";

interface ProjectCard {
  id: string;
  title: string;
  description: string;
  lastModified: string;
  slides: number;
}

// Mock data - replace with actual data fetching
const mockProjects: ProjectCard[] = [
  {
    id: "1",
    title: "E-Commerce Platform",
    description: "React and Node.js based marketplace solution",
    lastModified: "2 hours ago",
    slides: 12
  },
  {
    id: "2",
    title: "Mobile Banking App",
    description: "Flutter-based financial services application",
    lastModified: "Yesterday",
    slides: 8
  },
  {
    id: "3",
    title: "AI Chat Assistant",
    description: "Python-based conversational AI system",
    lastModified: "3 days ago",
    slides: 15
  }
];

export default function Dashboard() {
  const user = useUser()

  return (
    <div className="h-full w-full">
      <div className="flex justify-between items-center mb-8">
        <div>
          <h2 className="text-2xl font-semibold mb-1">Welcome</h2>
          <p className="text-sm text-muted-foreground">
            Create and manage your project presentations
          </p>
        </div>
        <Button>
          <Plus className="mr-2 h-4 w-4" /> New Project
        </Button>
      </div>

      <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
        {/* Project Cards */}
        {mockProjects.map((project) => (
          <Link href={`/dashboard/projects/${project.id}`} key={project.id} className="h-[320px]">
            <Card className="hover:shadow-md transition-all cursor-pointer hover:border-primary/50 h-full flex flex-col">
              <CardHeader>
                <CardTitle className="flex justify-between items-start">
                  <span>{project.title}</span>
                  <GitBranch className="h-5 w-5 text-muted-foreground" />
                </CardTitle>
                <p className="text-sm text-muted-foreground">{project.description}</p>
              </CardHeader>
              
              {/* Slide Preview */}
              <CardContent className="flex-1">
                <div className="w-full h-32 bg-muted/30 rounded-md flex items-center justify-center">
                  <Presentation className="h-8 w-8 text-muted-foreground/50" />
                </div>
              </CardContent>

              <CardFooter className="flex justify-between text-sm text-muted-foreground">
                <div className="flex items-center gap-2">
                  <Presentation className="h-4 w-4" />
                  <span>{project.slides} slides</span>
                </div>
                <div className="flex items-center gap-2">
                  <Clock className="h-4 w-4" />
                  <span>{project.lastModified}</span>
                </div>
              </CardFooter>
            </Card>
          </Link>
        ))}
      </div>
    </div>
  );
}

```

[130 more indexed source files omitted to keep this export small. The full file list is in the Codebase structure section above.]