diff --git a/README.md b/README.md index c234e4e..d892e47 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -# V1 at Michigan - +# V1 at Michigan + This is the code repository for the website. Serverless frontend built with Next.js + Tailwind CSS. Hosted on Netlify. ## Tech Stack @@ -15,33 +15,104 @@ This is the code repository for the website. Serverless frontend built with Next - **Package Manager**: pnpm ## How to work on this Project - -1. First clone the repository: `https://github.com/V1Michigan/website-v2.git`. -2. Make sure you enter the repository through terminal `cd /website-v2`. -3. Install dependencies: `pnpm install`. **We DO NOT use npm for this.** -4. Begin Devving: `pnpm dev` or `pnpm run dev`, whatever pleases you. This will allow you to access a dev version of the site @ `localhost:3000` that will update automatically as you save files. -5. Create a new branch for your NEW feature: `git checkout -b [FEATURE_NAME]`. If you want to go to an existing feature: `git checkout [FEATURE_NAME]`. -6. Ask another team member for the latest `.env` file. -7. When you finish a part of your feature and wish to push the changes to the remote repository: -8. `git add [changed_files]` (replace `changed_files` with the actual file names you changed) -9. `git commit -m "meaningful commit message goes here"` -10. `git push --set-upstream origin [FEATURE_NAME]` (the next time you push to this branch you can just say `git push`). - -## Linting and Code Quality - -We use ESLint + Prettier to lint our code and enforce consistent style. To make this process smoother, we've set up: - -1. **Pre-commit hooks**: Automatically lint and format your code when you commit changes. This uses Husky and lint-staged to ensure code quality without disrupting your workflow. - -2. **Non-blocking CI**: Our GitHub Actions workflow checks for linting issues but won't block builds due to formatting problems. - -For manual linting: - -- Use `pnpm lint` to check for linting/style errors -- Use `pnpm lint --fix` to automatically fix (some) linting issues - -We recommend using an [ESLint plugin for your editor](https://eslint.org/docs/user-guide/integrations) to lint and format your code as you write it. - -- VSCode: [extension](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint), [tutorial](https://www.digitalocean.com/community/tutorials/linting-and-formatting-with-eslint-in-vs-code) - -See the [CONTRIBUTING.md](./CONTRIBUTING.md) file for more detailed information about code standards and workflow. + +1. First clone the repository: `https://github.com/V1Michigan/website-v2.git`. +2. Make sure you enter the repository through terminal `cd /website-v2`. +3. Install dependencies: `pnpm install`. **We DO NOT use npm for this.** +4. Begin Devving: `pnpm dev` or `pnpm run dev`, whatever pleases you. This will allow you to access a dev version of the site @ `localhost:3000` that will update automatically as you save files. +5. Create a new branch for your NEW feature: `git checkout -b [FEATURE_NAME]`. If you want to go to an existing feature: `git checkout [FEATURE_NAME]`. +6. Ask another team member for the latest `.env` file. +7. When you finish a part of your feature and wish to push the changes to the remote repository: +8. `git add [changed_files]` (replace `changed_files` with the actual file names you changed) +9. `git commit -m "meaningful commit message goes here"` +10. `git push --set-upstream origin [FEATURE_NAME]` (the next time you push to this branch you can just say `git push`). + +## Linting and Code Quality + +We use ESLint + Prettier to lint our code and enforce consistent style. To make this process smoother, we've set up: + +1. **Pre-commit hooks**: Automatically lint and format your code when you commit changes. This uses Husky and lint-staged to ensure code quality without disrupting your workflow. + +2. **Non-blocking CI**: Our GitHub Actions workflow checks for linting issues but won't block builds due to formatting problems. + +For manual linting: + +- Use `pnpm lint` to check for linting/style errors +- Use `pnpm lint --fix` to automatically fix (some) linting issues + +We recommend using an [ESLint plugin for your editor](https://eslint.org/docs/user-guide/integrations) to lint and format your code as you write it. + +- VSCode: [extension](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint), [tutorial](https://www.digitalocean.com/community/tutorials/linting-and-formatting-with-eslint-in-vs-code) + +## Project Data Structure + +Projects are stored in [Notion](https://notion.so) and built into static JSON data at build time. + +### Data Flow + +``` +Notion DataSource → build script → projects-data.json → API → Components +``` + +1. **Data Source**: Project information is stored as a Notion DataSource (configured via `NOTION_DATA_SOURCE_ID`) +2. **Build Process**: The build script fetches data from Notion, downloads images, and generates static JSON +3. **Serving**: An API route serves the pre-built JSON data +4. **Consumption**: Components use React Query to fetch and display project data + +### Building Project Data + +To build or update project data: + +```bash +# Build only project data (for development/testing) +pnpm build:projects + +# Build project data as part of full production build +pnpm build +``` + +### Deployment Notes + +⚠️ **Important**: The projects page uses static JSON data that is built at deploy time. Any changes made to the Notion database will **not appear on the live site** until the Platform Team triggers a redeploy of the Netlify website. + +To edit projects in the Notion database, visit: +**[V1 Projects Notion Database](https://www.notion.so/v1team/30082307c07d80e3a38bd1f180684f93?v=30082307c07d8076bea6000c63bc3738&source=copy_link)** + +### Required Environment Variables + +These must be set in your `.env.local` file: +- `NOTION_API_KEY` - Your Notion integration API key +- `NOTION_DATA_SOURCE_ID` - The ID of the Notion DataSource containing project information + +### Key Files + +- `scripts/build-projects-data.ts` - Build script that fetches from Notion and generates JSON +- `lib/notion.ts` - Data transformation, filtering, and sorting logic +- `public/projects-data.json` - Generated project data (do not edit manually) +- `app/api/projects/route.ts` - API route serving project data +- `hooks/useProjects.ts` - React hook for fetching projects +- `types/project.ts` - TypeScript interfaces for Project type +- `app/projects/` - Project directory page and components + +### Asset Management + +The build process automatically downloads and optimizes: +- **Company logos**: Stored in `public/projects/[company-name].jpg` +- **Founder profile pictures**: Stored in `public/founders/[company-name]/[founder-name].jpg` + +All images are resized to 256x256px and converted to JPEG format using Sharp. + +### Data Features + +Projects can be filtered by: +- **Funding sources**: VC firms, accelerators (e.g., Y Combinator, Techstars) +- **Cohorts**: Product Studio cohorts by semester +- **Categories**: Industry tags (e.g., AI/ML, Developer Tools, B2B) +- **Search**: By company name or project title + +Projects are sorted by: +1. Funding status (funded projects first) +2. Investor prestige score +3. Cohort order (newest first) + +See the [CONTRIBUTING.md](./CONTRIBUTING.md) file for more detailed information about code standards and workflow. diff --git a/app/.DS_Store b/app/.DS_Store deleted file mode 100644 index 94bce4b..0000000 Binary files a/app/.DS_Store and /dev/null differ diff --git a/app/api/projects/route.ts b/app/api/projects/route.ts new file mode 100644 index 0000000..5a917d6 --- /dev/null +++ b/app/api/projects/route.ts @@ -0,0 +1,41 @@ +import { NextResponse, NextRequest } from "next/server" +import type { Project } from "@/types/project" +import { filterProjects } from "@/lib/notion" + +export async function GET(_request: NextRequest) { + try { + const response = await fetch(`${_request.nextUrl.origin}/projects-data.json`) + if (!response.ok) { + throw new Error("Failed to fetch projects data") + } + + const data = await response.json() + const allProjects = data.projects as Project[] + const cachedFilterOptions = data.filterOptions + + return NextResponse.json({ + projects: allProjects, + filterOptions: cachedFilterOptions, + totalProjects: allProjects.length, + filteredCount: allProjects.length + }, { + headers: { + 'Cache-Control': 'public, s-maxage=60, stale-while-revalidate=300' + } + }) + } catch (error) { + console.error("Error in projects API:", { + message: error instanceof Error ? error.message : String(error), + stack: error instanceof Error ? error.stack : undefined, + name: error instanceof Error ? error.name : typeof error + }) + + return NextResponse.json({ + error: "Failed to process projects data", + message: error instanceof Error ? error.message : String(error), + type: error instanceof Error ? error.name : typeof error, + }, { + status: 500 + }) + } +} diff --git a/app/project-directory/[id]/page.tsx b/app/project-directory/[id]/page.tsx deleted file mode 100644 index 7b5d91f..0000000 --- a/app/project-directory/[id]/page.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { notFound } from "next/navigation" - -export default function ProjectDetailPage() { - notFound() -} diff --git a/app/project-directory/page.tsx b/app/project-directory/page.tsx deleted file mode 100644 index ab83b8a..0000000 --- a/app/project-directory/page.tsx +++ /dev/null @@ -1,49 +0,0 @@ -"use client" - -import { useState } from "react" -import Header from "@/components/header" -import Footer from "@/components/footer" -import type { Project } from "@/types/project" - -export default function ProjectDirectoryPage() { - const [selectedProject, setSelectedProject] = useState(null) - const [isModalOpen, setIsModalOpen] = useState(false) - - const openProjectModal = (project: Project) => { - setSelectedProject(project) - setIsModalOpen(true) - } - - const closeProjectModal = () => { - setIsModalOpen(false) - } - - return ( -
-
- -
-

Project Directory

- - {/* Search Bar */} -
-
- -
- -
- - {/* Project Grid */} -
- -
-
- -
-
- ) -} diff --git a/app/projects/components/FilterPanel.tsx b/app/projects/components/FilterPanel.tsx new file mode 100644 index 0000000..811cf86 --- /dev/null +++ b/app/projects/components/FilterPanel.tsx @@ -0,0 +1,107 @@ +import { memo } from "react" + +interface FilterPanelProps { + filters: { + searchQuery: string + fundingSources: string[] + cohorts: string[] + categories: string[] + } + filterOptions: { + fundingSources: string[] + cohorts: string[] + categories: string[] + } + onSearchChange: (_query: string) => void + onToggleFunding: (_source: string) => void + onToggleCohort: (_cohort: string) => void + onToggleCategory: (_category: string) => void + isLoading?: boolean + showSearch?: boolean +} + +function FilterPanel({ + filters, + filterOptions, + onSearchChange, + onToggleFunding, + onToggleCohort, + onToggleCategory, + isLoading = false, + showSearch = true, +}: FilterPanelProps) { + return ( +
+ {/* Funding Sources */} +
+

Funding

+
+ {filterOptions.fundingSources.map((source) => ( + + ))} +
+
+ + {/* Product Studio Cohorts */} +
+

Cohorts

+
+ {filterOptions.cohorts.map((cohort) => { + const displayName = cohort.replace(" Product Studio Cohort", "") + return ( + + ) + })} +
+
+ + {/* Categories */} +
+

Categories

+
+ {filterOptions.categories.map((category) => ( + + ))} +
+
+
+ ) +} + +export default memo(FilterPanel) diff --git a/app/projects/components/ProjectCard.tsx b/app/projects/components/ProjectCard.tsx new file mode 100644 index 0000000..53c7f9f --- /dev/null +++ b/app/projects/components/ProjectCard.tsx @@ -0,0 +1,193 @@ +import Image from "next/image" +import type { Project, Investor } from "@/types/project" + +interface ProjectCardProps { + project: Project + onClick: () => void +} + +// Investor badge colors +const investorBadgeColors: Record = { + "Y Combinator": "bg-orange-500 text-white", + "Techstars": "bg-blue-500 text-white", + "Z Fellows": "bg-purple-500 text-white", + "Sequoia Capital": "bg-red-500 text-white", + "General Catalyst": "bg-green-500 text-white", + "SignalFire": "bg-cyan-500 text-white", + "Contrary Capital": "bg-indigo-500 text-white", + "Pioneer Fund": "bg-yellow-500 text-white", + "Agent Fund": "bg-rose-500 text-white", + "Moxxie Ventures": "bg-pink-500 text-white", + "Streamlined Ventures": "bg-lime-500 text-white", + "Lobster Capital": "bg-sky-500 text-white", + "Gold House Ventures": "bg-amber-500 text-white", + "GC Venture Fellows": "bg-emerald-500 text-white", + "Paul Graham": "bg-violet-500 text-white", + "Stephen Wolfram": "bg-fuchsia-500 text-white", + "Paul Copplestone": "bg-rose-400 text-white", + "Karim Atiyeh": "bg-orange-400 text-white", + "UMich Center for Entrepreneurship": "bg-blue-700 text-white", + "Zell Lurie Institute": "bg-blue-800 text-white", +} + +// Get badge color for investor +const getInvestorBadgeColor = (name: string): string => { + for (const [key, color] of Object.entries(investorBadgeColors)) { + if (name.includes(key)) return color + } + return "bg-gray-500 text-white" +} + +// Cohort badge colors +const cohortColors = { + "Winter 2026 Product Studio Cohort": "bg-emerald-500 text-white", + "Fall 2025 Product Studio Cohort": "bg-purple-500 text-white", + "Winter 2025 Product Studio Cohort": "bg-indigo-500 text-white", + "Winter 2024 Product Studio Cohort": "bg-sky-500 text-white", + "Fall 2024 Product Studio Cohort": "bg-amber-600 text-white", + "Spring 2025 Product Studio Cohort": "bg-pink-500 text-white", +} + +// Get cohort display name (remove "Product Studio Cohort" suffix) +const getCohortDisplayName = (cohortName: string) => { + return cohortName.replace(" Product Studio Cohort", "") +} + +export default function ProjectCard({ project, onClick }: ProjectCardProps) { + const hasCohort = project.sectionType === "cohort" + const primaryInvestor = project.investors?.[0] || null + const cohortBadgeColor = cohortColors[project.sectionName as keyof typeof cohortColors] || "bg-gray-500 text-white" + + return ( +
+
+ {/* Company Logo/Image */} +
+ {project.companyName} +
+ + {/* Project Info */} +
+

+ {project.companyName} +

+

+ {project.title} +

+

+ {project.description} +

+ + {/* Badges */} +
+ {primaryInvestor && ( + + {primaryInvestor.name} + + )} + {hasCohort && ( + + {getCohortDisplayName(project.sectionName)} + + )} +
+ + {/* Category Tags */} + {project.categories.length > 0 && ( +
+ {project.categories.slice(0, 3).map((category) => ( + + {category} + + ))} + {project.categories.length > 3 && ( + + +{project.categories.length - 3} + + )} +
+ )} + + {/* Investors Preview */} + {project.investors && project.investors.length > 0 && ( +
+
+ Investors: +
+ {project.investors.slice(0, 3).map((investor) => ( + investor.website ? ( + + {investor.name} + + + + + ) : ( + + {investor.name} + + ) + ))} + {project.investors.length > 3 && ( + + +{project.investors.length - 3} + + )} +
+
+
+ )} + + {/* Founders Preview */} + {project.founders.length > 0 && ( +
+
+ {project.founders.slice(0, 2).map((founder) => ( +
+ {founder.imageSrc && ( + {founder.name} + )} +
+ ))} +
+ + {project.founders.length === 1 + ? project.founders[0].name + : `${project.founders[0].name} +${project.founders.length - 1}` + } + +
+ )} +
+
+
+ ) +} \ No newline at end of file diff --git a/app/projects/components/ProjectDirectoryLayout.tsx b/app/projects/components/ProjectDirectoryLayout.tsx new file mode 100644 index 0000000..6fc6fd6 --- /dev/null +++ b/app/projects/components/ProjectDirectoryLayout.tsx @@ -0,0 +1,227 @@ +import { useState, useMemo } from "react" +import FilterPanel from "./FilterPanel" +import ProjectList from "./ProjectList" +import { Button } from "@/components/ui/button" +import { Filter } from "lucide-react" +import type { Project } from "@/types/project" + +interface ProjectDirectoryLayoutProps { + projects: Project[] + filters: { + searchQuery: string + fundingSources: string[] + cohorts: string[] + categories: string[] + } + filterOptions: { + fundingSources: string[] + cohorts: string[] + categories: string[] + } + onSearchChange: (_query: string) => void + onToggleFunding: (_source: string) => void + onToggleCohort: (_cohort: string) => void + onToggleCategory: (_category: string) => void + onProjectClick: (_project: Project) => void + onClearFilters: () => void + isLoading?: boolean +} + +export default function ProjectDirectoryLayout({ + projects, + filters, + filterOptions, + onSearchChange, + onToggleFunding, + onToggleCohort, + onToggleCategory, + onProjectClick, + onClearFilters, + isLoading = false, +}: ProjectDirectoryLayoutProps) { + const [isMobileFilterOpen, setIsMobileFilterOpen] = useState(false) + + const hasActiveFilters = useMemo( + () => + filters.searchQuery !== "" || + filters.fundingSources.length > 0 || + filters.cohorts.length > 0 || + filters.categories.length > 0, + [filters.searchQuery, filters.fundingSources.length, filters.cohorts.length, filters.categories.length] + ) + + return ( + <> + {/* Desktop Layout */} +
+ {/* Filter Panel - Left Side */} +
+
+
+
+ +
+
+ +
+
+
+
+ + {/* Project List - Right Side */} +
+
+
+ onSearchChange(e.target.value)} + className="w-full rounded-md border border-gray-300 px-3 py-2 text-sm focus:border-blue-500 focus:outline-none focus:ring-1 focus:ring-blue-500" + /> +
+
+ +
+

+ Projects ({projects.length}) +

+
+ {isLoading ? ( +
+
+
+ ) : ( + + )} +
+
+ + {/* Mobile/Tablet Layout */} +
+
+
+ onSearchChange(e.target.value)} + className="w-full rounded-lg border border-gray-300 px-3 py-2 text-sm focus:border-blue-500 focus:outline-none focus:ring-1 focus:ring-blue-500" + /> +
+ +
+ {/* Mobile Filter Button */} + + {/* Project Count */} +
+

+ Projects ({projects.length}) +

+
+ + {/* Loading state */} + {isLoading ? ( +
+
+
+ ) : ( + + )} + + {/* Mobile Filter Modal */} + {isMobileFilterOpen && ( +
+ {/* Backdrop */} +
setIsMobileFilterOpen(false)} + /> + + {/* Filter Panel Slide-up */} +
+ {/* Header */} +
+

Filters

+ +
+ + {/* Filter Content */} +
+ +
+ + {/* Footer */} +
+ + +
+
+
+ )} +
+ + ) +} diff --git a/app/projects/components/ProjectList.tsx b/app/projects/components/ProjectList.tsx new file mode 100644 index 0000000..1ca10e7 --- /dev/null +++ b/app/projects/components/ProjectList.tsx @@ -0,0 +1,37 @@ +import { memo } from "react" +import ProjectCard from "./ProjectCard" +import type { Project } from "@/types/project" + +interface ProjectListProps { + projects: Project[] + onProjectClick: (_project: Project) => void +} + +function ProjectList({ projects, onProjectClick }: ProjectListProps) { + if (projects.length === 0) { + return ( +
+
+

No projects found

+

+ Try adjusting your filters or search terms +

+
+
+ ) + } + + return ( +
+ {projects.map((project) => ( + onProjectClick(project)} + /> + ))} +
+ ) +} + +export default memo(ProjectList) diff --git a/app/project-directory/loading.tsx b/app/projects/loading.tsx similarity index 100% rename from app/project-directory/loading.tsx rename to app/projects/loading.tsx diff --git a/app/projects/page.tsx b/app/projects/page.tsx new file mode 100644 index 0000000..94ac630 --- /dev/null +++ b/app/projects/page.tsx @@ -0,0 +1,216 @@ +"use client"; + +import { useEffect, useState, useMemo, useCallback } from "react" +import { useSearchParams, useRouter } from "next/navigation" +import Header from "@/components/header" +import Footer from "@/components/footer" +import ProjectModal from "@/components/project-modal" +import ProjectDirectoryLayout from "./components/ProjectDirectoryLayout" +import type { Project } from "@/types/project" +import { useProjects } from "@/hooks/useProjects" + +export default function ProjectDirectoryPage() { + const searchParams = useSearchParams() + const router = useRouter() + const [selectedProject, setSelectedProject] = useState(null) + const [isModalOpen, setIsModalOpen] = useState(false) + + const urlSearchQuery = searchParams?.get("search") || "" + const [localSearchQuery, setLocalSearchQuery] = useState(urlSearchQuery) + + useEffect(() => { + setLocalSearchQuery(urlSearchQuery) + }, [urlSearchQuery]) + + const [localFilters, setLocalFilters] = useState({ + searchQuery: urlSearchQuery, + fundingSources: searchParams?.getAll("funding") || [], + cohorts: searchParams?.getAll("cohort") || [], + categories: searchParams?.getAll("category") || [], + }) + + const [isRefetching, setIsRefetching] = useState(false) + const [cachedFilterOptions, setCachedFilterOptions] = useState({ + fundingSources: [] as string[], + cohorts: [] as string[], + categories: [] as string[], + }) + + useEffect(() => { + setLocalFilters({ + searchQuery: urlSearchQuery, + fundingSources: searchParams?.getAll("funding") || [], + cohorts: searchParams?.getAll("cohort") || [], + categories: searchParams?.getAll("category") || [], + }) + }, [urlSearchQuery, searchParams]) + + const { projects, filterOptions, isLoading, error } = useProjects(localFilters) + + useEffect(() => { + if (filterOptions.fundingSources.length > 0 || filterOptions.cohorts.length > 0 || filterOptions.categories.length > 0) { + setCachedFilterOptions(filterOptions) + } + }, [filterOptions]) + + const debouncedUpdateURL = useMemo(() => { + let timeoutId: ReturnType + return (value: string) => { + clearTimeout(timeoutId) + timeoutId = setTimeout(() => { + const params = new URLSearchParams(searchParams?.toString() || "") + if (value.trim()) { + params.set("search", value.trim()) + } else { + params.delete("search") + } + router.replace(`?${params.toString()}`, { scroll: false }) + }, 300) + } + }, [searchParams, router]) + + const setSearchQuery = useCallback((query: string) => { + setLocalSearchQuery(query) + setLocalFilters(prev => ({ ...prev, searchQuery: query })) + debouncedUpdateURL(query) + }, [debouncedUpdateURL]) + + useEffect(() => { + if (isLoading && !isRefetching) { + setIsRefetching(true) + } else if (!isLoading && isRefetching) { + setIsRefetching(false) + } + }, [isLoading, isRefetching]) + + const isFilterLoading = isRefetching || isLoading + + const updateFilters = useCallback((updates: { + fundingSources?: string[] + cohorts?: string[] + categories?: string[] + }) => { + const params = new URLSearchParams(searchParams?.toString() || "") + + if (updates.fundingSources !== undefined) { + params.delete("funding") + updates.fundingSources.forEach(f => params.append("funding", f)) + } + + if (updates.cohorts !== undefined) { + params.delete("cohort") + updates.cohorts.forEach(c => params.append("cohort", c)) + } + + if (updates.categories !== undefined) { + params.delete("category") + updates.categories.forEach(c => params.append("category", c)) + } + + router.push(`?${params.toString()}`, { scroll: false }) + }, [searchParams, router]) + + const toggleFundingSource = useCallback((source: string) => { + setIsRefetching(true) + const current = localFilters.fundingSources + const updated = current.includes(source) + ? current.filter((s: string) => s !== source) + : [...current, source] + setLocalFilters(prev => ({ ...prev, fundingSources: updated })) + updateFilters({ fundingSources: updated }) + }, [localFilters.fundingSources, updateFilters]) + + const toggleCohort = useCallback((cohort: string) => { + setIsRefetching(true) + const current = localFilters.cohorts + const updated = current.includes(cohort) + ? current.filter((c: string) => c !== cohort) + : [...current, cohort] + setLocalFilters(prev => ({ ...prev, cohorts: updated })) + updateFilters({ cohorts: updated }) + }, [localFilters.cohorts, updateFilters]) + + const toggleCategory = useCallback((category: string) => { + setIsRefetching(true) + const current = localFilters.categories + const updated = current.includes(category) + ? current.filter((c: string) => c !== category) + : [...current, category] + setLocalFilters(prev => ({ ...prev, categories: updated })) + updateFilters({ categories: updated }) + }, [localFilters.categories, updateFilters]) + + const openProjectModal = useCallback((project: Project) => { + setSelectedProject(project) + setIsModalOpen(true) + }, []) + + const closeProjectModal = useCallback(() => { + setIsModalOpen(false) + setTimeout(() => setSelectedProject(null), 200) + }, []) + + const clearAllFilters = useCallback(() => { + setIsRefetching(true) + setLocalSearchQuery("") + setLocalFilters({ + searchQuery: "", + fundingSources: [], + cohorts: [], + categories: [], + }) + router.push("/projects", { scroll: false }) + }, [router]) + + return ( +
+
+ +
+ {/* Header */} +
+

Projects

+

+ A curated showcase of innovative startups and products built by founders and teams from V1 ecosystem. +

+
+ + {error ? ( +
+
+

Error

+

{error.message}

+ +
+
+ ) : ( + /* Main Layout */ + + )} +
+ + + +
+
+ ) +} diff --git a/app/store/layout.tsx b/app/store/layout.tsx index c6c7f13..cb8df98 100644 --- a/app/store/layout.tsx +++ b/app/store/layout.tsx @@ -1,3 +1,4 @@ +import React from "react" import { CartProvider } from "@/components/store/cart-provider"; import { CartSheet } from "@/components/store/cart-sheet"; diff --git a/components/founder-card.tsx b/components/founder-card.tsx index 8a1703c..79f42bd 100644 --- a/components/founder-card.tsx +++ b/components/founder-card.tsx @@ -5,20 +5,28 @@ interface FounderCardProps { name: string role: string imageSrc: string + contactUrl?: string } -export default function FounderCard({ name, role, imageSrc }: FounderCardProps) { +export default function FounderCard({ name, role, imageSrc, contactUrl }: FounderCardProps) { return (
- {name} + {name}

{name}

{role}

- + {contactUrl && ( + + Connect + + )}
) diff --git a/components/project-modal.tsx b/components/project-modal.tsx index 617fab0..ba4a33d 100644 --- a/components/project-modal.tsx +++ b/components/project-modal.tsx @@ -66,14 +66,16 @@ export default function ProjectModal({ project, isOpen, onClose }: ProjectModalP

{project.companyName}

- - Company website - + {project.companyWebsite && ( + + Company website + + )}
{project.categories.map((category, index) => ( @@ -89,14 +91,16 @@ export default function ProjectModal({ project, isOpen, onClose }: ProjectModalP

{project.overview}

-
-

Founders

-
- {project.founders.map((founder) => ( - - ))} -
-
+ {project.founders.length > 0 && ( +
+

Founders

+
+ {project.founders.map((founder) => ( + + ))} +
+
+ )}
) diff --git a/components/project-section.tsx b/components/project-section.tsx new file mode 100644 index 0000000..37838c7 --- /dev/null +++ b/components/project-section.tsx @@ -0,0 +1,43 @@ +"use client" + +import { forwardRef } from "react" +import React from "react" +import ProjectCard from "./project-card" +import type { Project } from "@/types/project" + +interface ProjectSectionProps { + name: string + projects: Project[] + onProjectClick: (project: Project) => void +} + +const ProjectSection = forwardRef>( + ({ name, projects, onProjectClick, ...props }, ref) => { + return ( +
+
+
+

{name}

+
+
+ +
+ {projects.map((project) => ( + onProjectClick(project)} + /> + ))} +
+
+ ) + } +) + +ProjectSection.displayName = "ProjectSection" + +export default ProjectSection diff --git a/components/section-nav.tsx b/components/section-nav.tsx new file mode 100644 index 0000000..18a00fe --- /dev/null +++ b/components/section-nav.tsx @@ -0,0 +1,96 @@ +"use client" + +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" + +interface SectionNavProps { + sections: Array<{ + name: string + count: number + type: "funding" | "cohort" + }> + activeSection: string | null + filterSection: string | null + onFilterChange: (section: string | null) => void + onScrollToSection: (section: string) => void +} + +export default function SectionNav({ + sections, + activeSection, + filterSection, + onFilterChange, + onScrollToSection, +}: SectionNavProps) { + // Group sections by type + const fundingSections = sections.filter(s => s.type === 'funding') + const cohortSections = sections.filter(s => s.type === 'cohort') + + // Create shorter display names for cohorts + const getDisplayName = (sectionName: string, type: string) => { + if (type === 'cohort') { + // Convert "Winter 2026 Product Studio Cohort" to "W26 Cohort" + const match = sectionName.match(/(\w+)\s+(\d{4})\s+Product Studio Cohort/) + if (match) { + const [_, season, year] = match + const seasonShort = season === 'Winter' ? 'W' : season === 'Fall' ? 'F' : season + const yearShort = year.slice(-2) // Get last 2 digits + return `${seasonShort}${yearShort} Cohort` + } + } + return sectionName + } + + const handleValueChange = (value: string) => { + if (value === "all") { + onFilterChange(null) + window.scrollTo({ top: 0, behavior: "smooth" }) + } else { + onFilterChange(value) + } + } + + return ( +
+
+
+ +
+
+
+ ) +} \ No newline at end of file diff --git a/data/projects.ts b/data/projects.ts index 1250dcd..ac8e86b 100644 --- a/data/projects.ts +++ b/data/projects.ts @@ -3,314 +3,1585 @@ import type { Project } from "@/types/project" export const projects: Project[] = [ { id: "project-1", - title: "Lorem Ipsum Title", - description: - "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", + title: "AgentMail", + description: "Email Inboxes for AI Agents", imageSrc: "/placeholder.svg?height=200&width=300", - companyName: "LOREM SOME COMPANY", - companyWebsite: "https://example.com", - categories: ["Category 1", "Category 2", "Category 3"], - overview: - "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + companyName: "AgentMail", + companyWebsite: "https://agentmail.to", + categories: ["Developer Tools", "API", "Email"], + overview: "AgentMail is the email inbox API for AI agents. It gives agents their own email inboxes, like Gmail does for humans. Unlike other email APIs, AgentMail provides fully-managed, persistent inboxes that handle parsing, threading, labeling, searching, and replying so agents get the same email experience as humans.", founders: [ { id: "founder-1", - name: "John Doe", - role: "SWE", - imageSrc: "/placeholder.svg?height=150&width=150", + name: "Haakam Aujla", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", }, { id: "founder-2", - name: "John Doe", - role: "SWE", - imageSrc: "/placeholder.svg?height=150&width=150", + name: "Michael Kim", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", }, { id: "founder-3", - name: "John Doe", - role: "SWE", - imageSrc: "/placeholder.svg?height=150&width=150", + name: "Adi Singh", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", }, + ], + investors: [ { - id: "founder-4", - name: "John Doe", - role: "SWE", - imageSrc: "/placeholder.svg?height=150&width=150", + id: "investor-1", + name: "Y Combinator", + type: "accelerator", + website: "https://www.ycombinator.com" + }, + { + id: "investor-2", + name: "General Catalyst", + type: "vc", + website: "https://www.generalcatalyst.com" }, + { + id: "investor-3", + name: "Agent Fund", + type: "vc" + }, + { + id: "investor-4", + name: "Pioneer Fund", + type: "vc", + website: "https://www.pioneer.vc" + }, + { + id: "investor-5", + name: "Paul Graham", + type: "angel" + }, + { + id: "investor-6", + name: "Paul Copplestone", + type: "angel" + }, + { + id: "investor-7", + name: "Karim Atiyeh", + type: "angel" + } ], + fundingAmount: 500000, + fundingStage: "pre-seed", + sectionType: "funding", + sectionName: "Y Combinator", + sectionOrder: 1, }, { id: "project-2", - title: "Lorem Ipsum Title", - description: - "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", + title: "Embedder", + description: "Cursor for Firmware", imageSrc: "/placeholder.svg?height=200&width=300", - companyName: "LOREM SOME COMPANY", - companyWebsite: "https://example.com", - categories: ["Category 1", "Category 3"], - overview: - "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + companyName: "Embedder", + companyWebsite: "https://www.embedder.com", + categories: ["Artificial Intelligence", "Developer Tools", "Hardware"], + overview: "Embedder is a coding agent that can write, test, and debug firmware on both physical and simulated hardware. Supporting 20+ MCU/SoC platforms, it accelerates embedded systems development across semiconductors, automotive, medical devices, aerospace, IoT, and consumer electronics.", founders: [ + { + id: "founder-4", + name: "Ethan Gibbs", + role: "CEO", + imageSrc: "/founder_placeholder_pfp.jpg", + }, { id: "founder-5", - name: "John Doe", - role: "SWE", - imageSrc: "/placeholder.svg?height=150&width=150", + name: "Bob Wei", + role: "CTO", + imageSrc: "/founder_placeholder_pfp.jpg", }, + ], + investors: [ { - id: "founder-6", - name: "John Doe", - role: "SWE", - imageSrc: "/placeholder.svg?height=150&width=150", + id: "investor-8", + name: "Y Combinator", + type: "accelerator", + website: "https://www.ycombinator.com" }, + { + id: "investor-9", + name: "Z Fellows", + type: "accelerator" + } ], + fundingAmount: 50000, + fundingStage: "seed", + sectionType: "funding", + sectionName: "Y Combinator", + sectionOrder: 1, }, { id: "project-3", - title: "Lorem Ipsum Title", - description: - "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", + title: "Orange Slice", + description: "Agentic sales enrichment spreadsheet", imageSrc: "/placeholder.svg?height=200&width=300", - companyName: "LOREM SOME COMPANY", - companyWebsite: "https://example.com", - categories: ["Category 2"], - overview: - "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + companyName: "Orange Slice", + companyWebsite: "https://orangeslice.ai", + categories: ["B2B", "SaaS", "Sales", "Sales Enablement"], + overview: "Orange Slice is a spreadsheet where every column is TypeScript—and AI writes it for you. Describe what you want in chat ('find the CEO's LinkedIn and get their email'), and we generate the code, create the columns, and run it across thousands of rows. Our fully-typed SDK has 100+ enrichments built in: LinkedIn, contact info, company data, web scraping, AI research.", founders: [ + { + id: "founder-6", + name: "Vihaar Nandigala", + role: "CEO", + imageSrc: "/founder_placeholder_pfp.jpg", + }, { id: "founder-7", - name: "John Doe", - role: "SWE", - imageSrc: "/placeholder.svg?height=150&width=150", + name: "Kishan Sripada", + role: "CTO", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + ], + investors: [ + { + id: "investor-10", + name: "Y Combinator", + type: "accelerator", + website: "https://www.ycombinator.com" }, + { + id: "investor-11", + name: "Lobster Capital", + type: "vc" + }, + { + id: "investor-12", + name: "Moxxie Ventures", + type: "vc" + }, + { + id: "investor-13", + name: "Transpose Platform Management", + type: "vc" + }, + { + id: "investor-14", + name: "Paul Graham", + type: "angel" + } + ], + fundingStage: "seed", + sectionType: "funding", + sectionName: "Y Combinator", + sectionOrder: 1, + }, + { + id: "project-4", + title: "Skope", + description: "Build a more profitable law firm with AI", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Skope", + companyWebsite: "https://useskope.com", + categories: ["B2B", "Legal", "AI"], + overview: "Skope builds AI for core legal workflows. We will save your law firm time and help you make more money, with AI. Unlike general-purpose AI, Skope is purpose-built for legal work. We offer specialized features like document redlining and knowledge base search that other tools do not offer, as well as improved security for your data.", + founders: [ { id: "founder-8", - name: "John Doe", - role: "SWE", - imageSrc: "/placeholder.svg?height=150&width=150", + name: "Ben Smith", + role: "CEO", + imageSrc: "/founder_placeholder_pfp.jpg", }, { id: "founder-9", - name: "John Doe", - role: "SWE", - imageSrc: "/placeholder.svg?height=150&width=150", + name: "Connor Park", + role: "CTO", + imageSrc: "/founder_placeholder_pfp.jpg", }, ], + investors: [ + { + id: "investor-15", + name: "Y Combinator", + type: "accelerator", + website: "https://www.ycombinator.com" + } + ], + fundingStage: "seed", + sectionType: "funding", + sectionName: "Y Combinator", + sectionOrder: 1, }, + { - id: "project-4", - title: "Lorem Ipsum Title", - description: - "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", + id: "project-7", + title: "GreenRoute", + description: "Sustainable logistics and delivery optimization", imageSrc: "/placeholder.svg?height=200&width=300", - companyName: "LOREM SOME COMPANY", - companyWebsite: "https://example.com", - categories: ["Category 1"], - overview: - "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + companyName: "GreenRoute Logistics", + companyWebsite: "https://greenroute.io", + categories: ["Logistics", "Sustainability", "B2B"], + overview: "GreenRoute helps delivery companies reduce their carbon footprint through intelligent route optimization. Our AI algorithms consider traffic, weather, and environmental factors to minimize emissions.", founders: [ { - id: "founder-10", - name: "John Doe", - role: "SWE", - imageSrc: "/placeholder.svg?height=150&width=150", + id: "founder-13", + name: "Michael Brown", + role: "CEO", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + { + id: "founder-14", + name: "Anna Green", + role: "COO", + imageSrc: "/founder_placeholder_pfp.jpg", }, ], + sectionType: "cohort", + sectionName: "Winter 2026 Product Studio Cohort", + sectionOrder: 23, }, { - id: "project-5", - title: "Lorem Ipsum Title", - description: - "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", + id: "project-8", + title: "FinanceHub", + description: "Personal finance tracking for college students", imageSrc: "/placeholder.svg?height=200&width=300", - companyName: "LOREM SOME COMPANY", - companyWebsite: "https://example.com", - categories: ["Category 2", "Category 3"], - overview: - "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + companyName: "FinanceHub Inc.", + companyWebsite: "https://financehub.com", + categories: ["FinTech", "Consumer", "B2C"], + overview: "FinanceHub helps college students manage their finances with features tailored to student life. Track expenses, budget for tuition, and learn financial literacy in an easy-to-use app.", founders: [ { - id: "founder-11", - name: "John Doe", - role: "SWE", - imageSrc: "/placeholder.svg?height=150&width=150", + id: "founder-15", + name: "Rachel Torres", + role: "CEO", + imageSrc: "/founder_placeholder_pfp.jpg", }, { - id: "founder-12", - name: "John Doe", - role: "SWE", - imageSrc: "/placeholder.svg?height=150&width=150", + id: "founder-16", + name: "James Wilson", + role: "CTO", + imageSrc: "/founder_placeholder_pfp.jpg", }, ], + sectionType: "cohort", + sectionName: "Winter 2026 Product Studio Cohort", + sectionOrder: 23, }, { - id: "project-6", - title: "Lorem Ipsum Title", - description: - "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", + id: "project-9", + title: "EventSpace", + description: "Campus event discovery and ticketing platform", imageSrc: "/placeholder.svg?height=200&width=300", - companyName: "LOREM SOME COMPANY", - companyWebsite: "https://example.com", - categories: ["Category 1", "Category 2"], - overview: - "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + companyName: "EventSpace Inc.", + companyWebsite: "https://eventspace.com", + categories: ["Events", "Social", "B2C"], + overview: "EventSpace makes it easy to discover and attend campus events. Students can find events, buy tickets, and coordinate with friends. Event organizers get tools to manage and promote their events.", founders: [ { - id: "founder-13", - name: "John Doe", - role: "SWE", - imageSrc: "/placeholder.svg?height=150&width=150", + id: "founder-17", + name: "Kevin Patel", + role: "CEO", + imageSrc: "/founder_placeholder_pfp.jpg", }, + ], + sectionType: "cohort", + sectionName: "Winter 2026 Product Studio Cohort", + sectionOrder: 23, + }, + { + id: "project-10", + title: "StudyBuddy", + description: "AI-powered study partner and flashcard generator", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "StudyBuddy AI", + companyWebsite: "https://studybuddy.ai", + categories: ["EdTech", "AI/ML", "B2C"], + overview: "StudyBuddy uses AI to generate flashcards from your notes, quiz you on key concepts, and track your learning progress. It's like having a personalized tutor available 24/7.", + founders: [ { - id: "founder-14", - name: "John Doe", - role: "SWE", - imageSrc: "/placeholder.svg?height=150&width=150", + id: "founder-18", + name: "Nina Williams", + role: "CEO", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + { + id: "founder-19", + name: "Tom Anderson", + role: "CTO", + imageSrc: "/founder_placeholder_pfp.jpg", }, ], + sectionType: "cohort", + sectionName: "Fall 2025 Product Studio Cohort", + sectionOrder: 22, }, { - id: "project-7", - title: "Lorem Ipsum Title", - description: - "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", + id: "project-11", + title: "MentorMatch", + description: "Platform connecting students with industry mentors", imageSrc: "/placeholder.svg?height=200&width=300", - companyName: "LOREM SOME COMPANY", - companyWebsite: "https://example.com", - categories: ["Category 3"], - overview: - "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + companyName: "MentorMatch Inc.", + companyWebsite: "https://mentormatch.com", + categories: ["Career", "Networking", "B2B"], + overview: "MentorMatch connects students with industry professionals for mentorship. Students can search for mentors in their field, schedule sessions, and build lasting professional relationships.", founders: [ { - id: "founder-15", - name: "John Doe", - role: "SWE", - imageSrc: "/placeholder.svg?height=150&width=150", + id: "founder-25", + name: "Sofia Martinez", + role: "CEO", + imageSrc: "/founder_placeholder_pfp.jpg", }, { - id: "founder-16", - name: "John Doe", - role: "SWE", - imageSrc: "/placeholder.svg?height=150&width=150", + id: "founder-26", + name: "Daniel Kim", + role: "COO", + imageSrc: "/founder_placeholder_pfp.jpg", }, ], + sectionType: "cohort", + sectionName: "Winter 2025 Product Studio Cohort", + sectionOrder: 21, }, { - id: "project-8", - title: "Lorem Ipsum Title", - description: - "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", + id: "project-12", + title: "GreenRoute", + description: "Sustainable logistics and delivery optimization", imageSrc: "/placeholder.svg?height=200&width=300", - companyName: "LOREM SOME COMPANY", - companyWebsite: "https://example.com", - categories: ["Category 1", "Category 3"], - overview: - "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + companyName: "GreenRoute Logistics", + companyWebsite: "https://greenroute.io", + categories: ["Logistics", "Sustainability", "B2B"], + overview: "GreenRoute helps delivery companies reduce their carbon footprint through intelligent route optimization. Our AI algorithms consider traffic, weather, and environmental factors to minimize emissions.", founders: [ { - id: "founder-17", - name: "John Doe", - role: "SWE", - imageSrc: "/placeholder.svg?height=150&width=150", + id: "founder-27", + name: "Michael Brown", + role: "CEO", + imageSrc: "/founder_placeholder_pfp.jpg", }, { - id: "founder-18", - name: "John Doe", - role: "SWE", - imageSrc: "/placeholder.svg?height=150&width=150", + id: "founder-28", + name: "Anna Green", + role: "COO", + imageSrc: "/founder_placeholder_pfp.jpg", }, ], + sectionType: "cohort", + sectionName: "Winter 2025 Product Studio Cohort", + sectionOrder: 21, }, { - id: "project-9", - title: "Lorem Ipsum Title", - description: - "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", + id: "project-13", + title: "Lost and Found Plus", + description: "An easy-to-use system that tracks tools and materials that are being used in communal spaces", imageSrc: "/placeholder.svg?height=200&width=300", - companyName: "LOREM SOME COMPANY", - companyWebsite: "https://example.com", - categories: ["Category 2"], - overview: - "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + companyName: "Lost and Found Plus", + companyWebsite: "", + categories: ["Productivity", "B2B"], + overview: "An easy-to-use system that tracks tools and materials that are being used in communal spaces. Helps organizations manage shared resources efficiently and reduce loss of valuable items.", founders: [ { - id: "founder-19", - name: "John Doe", - role: "SWE", - imageSrc: "/placeholder.svg?height=150&width=150", + id: "founder-25", + name: "Anuhea Tao", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", }, ], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, }, { - id: "project-10", - title: "Lorem Ipsum Title", - description: - "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", + id: "project-14", + title: "Hair Haven", + description: "Our mission is to provide barbers with an individualized, interactive platform to help customers get the most optimal haircut.", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Hair Haven", + companyWebsite: "", + categories: ["B2B", "Beauty", "SaaS"], + overview: "Our mission is to provide barbers with an individualized, interactive platform to help customers get the most optimal haircut. Uses AI and personalization to recommend the perfect haircut based on face shape, hair type, and personal style.", + founders: [], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-15", + title: "Parrot", + description: "Advanced communication and collaboration platform", imageSrc: "/placeholder.svg?height=200&width=300", - companyName: "LOREM SOME COMPANY", - companyWebsite: "https://example.com", - categories: ["Category 1"], - overview: - "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + companyName: "Parrot", + companyWebsite: "", + categories: ["Communication", "B2B"], + overview: "Advanced communication and collaboration platform designed to enhance team productivity and information sharing in modern workplaces.", + founders: [], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-16", + title: "Quotr", + description: "Conversational AI platform that automates estimates and information gathering", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Quotr", + companyWebsite: "", + categories: ["AI/ML", "B2B", "Automation"], + overview: "Quotr is a conversational AI platform that automates away the manual calling for estimates, quotes, and general information from places all around you. All you do is put in your request, and we make the calls and get the information back to you.", founders: [ { - id: "founder-20", - name: "John Doe", - role: "SWE", - imageSrc: "/placeholder.svg?height=150&width=150", + id: "founder-26", + name: "Soham Salunke", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + { + id: "founder-27", + name: "Divya Ponda", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", }, { - id: "founder-21", - name: "John Doe", - role: "SWE", - imageSrc: "/placeholder.svg?height=150&width=150", + id: "founder-28", + name: "Roshni Koduri", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", }, ], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, }, { - id: "project-11", - title: "Lorem Ipsum Title", - description: - "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", + id: "project-17", + title: "Manu.AI", + description: "Easy access to any manual you could ever need", imageSrc: "/placeholder.svg?height=200&width=300", - companyName: "LOREM SOME COMPANY", - companyWebsite: "https://example.com", - categories: ["Category 3"], - overview: - "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + companyName: "Manu.AI", + companyWebsite: "", + categories: ["AI/ML", "Productivity", "B2B"], + overview: "Easy access to any manual you could ever need. AI-powered platform that provides instant access to user manuals, documentation, and guides for any product or device.", founders: [ { - id: "founder-22", - name: "John Doe", - role: "SWE", - imageSrc: "/placeholder.svg?height=150&width=150", + id: "founder-29", + name: "Leo Liu", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + { + id: "founder-30", + name: "Johnathan Mo", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", }, ], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, }, { - id: "project-12", - title: "Lorem Ipsum Title", - description: - "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", + id: "project-18", + title: "Closet Swap", + description: "Digital platform for borrowing and lending clothes affordably", imageSrc: "/placeholder.svg?height=200&width=300", - companyName: "LOREM SOME COMPANY", - companyWebsite: "https://example.com", - categories: ["Category 1", "Category 2"], - overview: - "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + companyName: "Closet Swap", + companyWebsite: "https://closet-swap.vercel.app/", + categories: ["Fashion", "B2C", "Sustainability"], + overview: "A digital platform for users to borrow and lend clothes affordably, quickly, and reliably. Reduces fashion waste while giving people access to a wider variety of clothing.", founders: [ { - id: "founder-23", - name: "John Doe", - role: "SWE", - imageSrc: "/placeholder.svg?height=150&width=150", + id: "founder-31", + name: "Meghna Reddy", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + { + id: "founder-32", + name: "Shriya Kankatala", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", }, { - id: "founder-24", - name: "John Doe", - role: "SWE", - imageSrc: "/placeholder.svg?height=150&width=150", + id: "founder-33", + name: "Diya Mahaveer", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + { + id: "founder-34", + name: "Hana Ahmed", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + ], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-19", + title: "DAWG", + description: "Elevating sport program performance through technology", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "DAWG", + companyWebsite: "", + categories: ["Sports", "B2B", "Analytics"], + overview: "Elevating sport program performance through technology. Data-driven platform that helps athletic programs optimize training, performance, and team management.", + founders: [ + { + id: "founder-35", + name: "Priya Gutta", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", }, ], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-20", + title: "Learn Bubble", + description: "Popping the bubble of higher education through accessible STEM literacy", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Learn Bubble", + companyWebsite: "", + categories: ["EdTech", "STEM", "B2C"], + overview: "Popping the bubble of higher education through accessible STEM literacy. Making complex STEM concepts accessible to everyone through interactive learning experiences.", + founders: [ + { + id: "founder-36", + name: "Rafee Mirza", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + ], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-21", + title: "MeetingBrew", + description: "A group event scheduler", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "MeetingBrew", + companyWebsite: "https://www.meetingbrew.com/", + categories: ["Productivity", "B2B", "Scheduling"], + overview: "A group event scheduler that makes coordinating meetings and events effortless. Uses smart algorithms to find optimal times that work for everyone.", + founders: [ + { + id: "founder-37", + name: "Cooper Saye", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + { + id: "founder-38", + name: "Brian Travis", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + ], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-22", + title: "CodeTrace", + description: "AI-powered semantic search for seamless onboarding and smarter codebase navigation", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "CodeTrace", + companyWebsite: "https://www.codetrace.ai/", + categories: ["Developer Tools", "AI/ML", "B2B"], + overview: "AI-powered semantic search for seamless onboarding and smarter codebase navigation. Helps developers understand and navigate large codebases more efficiently.", + founders: [ + { + id: "founder-39", + name: "David Mazur", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + ], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-23", + title: "Doublet", + description: "Word transformation puzzle game", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Doublet", + companyWebsite: "https://doublet-waitlist.vercel.app/", + categories: ["Gaming", "B2C", "Education"], + overview: "Word transformation puzzle game that challenges players to transform one word into another through a series of steps. Educational and entertaining word game.", + founders: [ + { + id: "founder-40", + name: "Adviti Mishra", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + { + id: "founder-41", + name: "Isha Kalwani", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + ], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-24", + title: "Batch", + description: "Shared rides to DTW from $9", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Batch", + companyWebsite: "https://www.batchme.app/", + categories: ["Transportation", "B2C", "Sharing Economy"], + overview: "Ubers to DTW from $9. Batch your ride with verified U-M students. Affordable shared transportation solution for university students traveling to the airport.", + founders: [ + { + id: "founder-42", + name: "Sanjit Vijay", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + { + id: "founder-43", + name: "Aryan Shah", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + ], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-25", + title: "Find Blue", + description: "The go-to space for students at the University of Michigan to launch ideas and build ventures", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Find Blue", + companyWebsite: "https://f-bweb.vercel.app/", + categories: ["Community", "B2C", "Entrepreneurship"], + overview: "The go-to space for students at the University of Michigan to launch ideas and build ventures. Community platform for student entrepreneurs and innovators.", + founders: [ + { + id: "founder-44", + name: "Owen Lennon", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + { + id: "founder-45", + name: "Rakesh Varma Kottapalli", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + ], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-26", + title: "Parley", + description: "Gamify productivity by betting on your friend's tasks", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Parley", + companyWebsite: "", + categories: ["Productivity", "B2C", "Gamification"], + overview: "Gamify productivity by betting on your friend's tasks. Social accountability platform that turns task completion into friendly competitions and bets.", + founders: [ + { + id: "founder-46", + name: "Toan Bui", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + { + id: "founder-47", + name: "Sriram MK", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + { + id: "founder-48", + name: "Aditi Locula", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + ], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-27", + title: "Courtline", + description: "Organizing recreational sports & pickup games at UMich", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Courtline", + companyWebsite: "https://mqueue-six.vercel.app/", + categories: ["Sports", "B2C", "Community"], + overview: "Organizing recreational sports & pickup games at UMich! Platform for coordinating and joining casual sports activities and pickup games on campus.", + founders: [ + { + id: "founder-49", + name: "Amy Liu", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + { + id: "founder-50", + name: "Joshua Lee", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + ], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-28", + title: "RepConnect", + description: "App for constituents to know about local politicians", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "RepConnect", + companyWebsite: "", + categories: ["Civic Tech", "B2C", "Government"], + overview: "Ex-pollster building an app for constituents to know about local politicians 🗳️. Platform that helps citizens stay informed about their local representatives and political activities.", + founders: [ + { + id: "founder-51", + name: "Arhan Kaul", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + ], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-29", + title: "Museaic", + description: "An AI tool to automate arranging music", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Museaic", + companyWebsite: "", + categories: ["Music", "AI/ML", "B2B"], + overview: "An AI tool to automate arranging music 🎶. AI-powered platform that helps musicians and producers arrange and compose music more efficiently.", + founders: [ + { + id: "founder-52", + name: "Casey Feng", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + ], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-30", + title: "QuickSync", + description: "Helping contractors bill faster", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "QuickSync", + companyWebsite: "https://pitch.com/v/f24-demo-day-zxnxqi/50a580be-6497-435e-9e3d-4516bcde4860", + categories: ["Construction", "B2B", "Productivity"], + overview: "Helping contractors bill faster. Streamlined billing and invoicing platform designed specifically for construction contractors.", + founders: [ + { + id: "founder-53", + name: "Phoenix Sheppard", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + ], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-31", + title: "Infralens", + description: "All-In-One 3D Imaging Access for Contractors", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Infralens", + companyWebsite: "https://pitch.com/v/f24-demo-day-zxnxqi/aa63d81b-fd08-4e46-9f50-6f5d4d1cbf7c", + categories: ["Construction", "B2B", "3D Imaging"], + overview: "All-In-One 3D Imaging Access for Contractors. Platform that provides contractors with easy access to 3D imaging tools and data for construction projects.", + founders: [], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-32", + title: "Nudge", + description: "Helping you keep track of your must-visit travel spots", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Nudge", + companyWebsite: "", + categories: ["Travel", "B2C", "Productivity"], + overview: "Helping you keep track of your must-visit travel spots ✈️. Personal travel planning platform that helps users organize and remember places they want to visit.", + founders: [ + { + id: "founder-54", + name: "Riya Saha", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + { + id: "founder-55", + name: "Pari Gulati", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + { + id: "founder-56", + name: "Kritika Singh", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + ], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-33", + title: "Cyberwright", + description: "The first cybersecurity developer tool", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Cyberwright", + companyWebsite: "https://devpost.com/software/cyberwright", + categories: ["Security", "Developer Tools", "B2B"], + overview: "The first cybersecurity developer tool, allowing programmers to identify bugs and fix bugs before production. AI-powered security tool that helps developers find and fix security vulnerabilities in code.", + founders: [ + { + id: "founder-57", + name: "Jacob Chen", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + ], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-34", + title: "Ghost Kitchen Finder", + description: "Chrome extension that flags ghost kitchens on delivery apps", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Ghost Kitchen Finder", + companyWebsite: "", + categories: ["Browser Extension", "B2C", "Food"], + overview: "Chrome extension that flags ghost kitchens on delivery apps. Helps consumers identify and avoid ordering from virtual kitchens on food delivery platforms.", + founders: [], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-35", + title: "Tour.video", + description: "Interactive virtual tours for apartments", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Tour.video", + companyWebsite: "https://tour.video/", + categories: ["Real Estate", "B2B", "Virtual Tours"], + overview: "Interactive, virtual tours that get your apartment more leases", + founders: [ + { + id: "founder-58", + name: "Kishan Sripada", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + ], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-36", + title: "MeetYourClass", + description: "Student social networking for universities", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "MeetYourClass", + companyWebsite: "https://meetyourclassinc.com/", + categories: ["Social", "B2B", "Education"], + overview: "MeetYourClass is a student-facing social networking system that helps university enrollment and student life departments better understand and reach their prospective student body.", + founders: [ + { + id: "founder-75", + name: "Jonah Liss", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + { + id: "founder-76", + name: "Blake Mischley", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + { + id: "founder-77", + name: "Kaleb Schmottlach", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + { + id: "founder-78", + name: "Jon Millar", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + ], + investors: [ + { + id: "investor-26", + name: "Techstars Detroit Powered by J.P. Morgan", + type: "accelerator", + website: "https://www.techstars.com" + }, + { + id: "investor-27", + name: "Zell Lurie Institute", + type: "university-fund", + website: "https://zli.umich.edu" + } + ], + fundingAmount: 120000, + fundingStage: "seed", + sectionType: "funding", + sectionName: "Techstars", + sectionOrder: 6, + }, + { + id: "project-37", + title: "AccoAI", + description: "AI-powered admin task automation for practices", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "AccoAI", + companyWebsite: "https://www.accoai.com/", + categories: ["AI/ML", "B2B", "Productivity"], + overview: "AccoAI automates admin tasks and unifies your practice, helping save time and grow billables.", + founders: [ + { + id: "founder-59", + name: "Lance Fuchia", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + ], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-38", + title: "Hyperfan", + description: "Platform for creators to connect with fans", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Hyperfan", + companyWebsite: "https://www.hyperfan.com/", + categories: ["Social", "B2C", "Entertainment"], + overview: "Helping creators connect with their fans", + founders: [ + { + id: "founder-60", + name: "Areeb Khan", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + ], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-39", + title: "fomo", + description: "College event discovery platform", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "fomo", + companyWebsite: "", + categories: ["Events", "B2C", "Social"], + overview: "A platform to create, manage, and discover college events.", + founders: [], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-40", + title: "Shade", + description: "AI-powered media storage for creative teams", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Shade", + companyWebsite: "https://shade.inc/", + categories: ["AI/ML", "B2B", "Storage"], + overview: "Shade is a seed stage startup backed by General Catalyst, Contrary, SignalFire, and Bling building the future of file storage. AI-powered media storage solution that enables creative teams to instantly sync files from anywhere.", + founders: [ + { + id: "founder-61", + name: "Brandon Fan", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + { + id: "founder-62", + name: "Bright Xu", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + { + id: "founder-63", + name: "Edison Chiu", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + { + id: "founder-64", + name: "Gurish Sharma", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + ], + investors: [ + { + id: "investor-16", + name: "General Catalyst", + type: "vc", + website: "https://www.generalcatalyst.com" + }, + { + id: "investor-17", + name: "Contrary Capital", + type: "vc", + website: "https://www.contrary.com" + }, + { + id: "investor-18", + name: "SignalFire", + type: "vc", + website: "https://www.signalfire.com" + }, + { + id: "investor-19", + name: "Bling", + type: "vc" + }, + { + id: "investor-20", + name: "GC Venture Fellows", + type: "vc" + }, + { + id: "investor-21", + name: "Gold House Ventures", + type: "vc" + }, + { + id: "investor-22", + name: "Z Fellows", + type: "accelerator" + } + ], + fundingStage: "seed", + sectionType: "funding", + sectionName: "General Catalyst", + sectionOrder: 4, + }, + { + id: "project-41", + title: "codefy.AI", + description: "Coding widget toolbox for developers", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "codefy.AI", + companyWebsite: "https://www.codefy.ai/", + categories: ["Developer Tools", "AI/ML", "Productivity"], + overview: "codefy.ai is your own toolbox of useful coding widgets to help you speed up your workflow. Write, explain, debug, compare, and translate code with 15+ helpful, customized tools.", + founders: [ + { + id: "founder-65", + name: "Cooper Saye", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + { + id: "founder-66", + name: "Brian Travis", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + ], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-42", + title: "wstwatch", + description: "Food waste tracking for dining halls", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "wstwatch", + companyWebsite: "", + categories: ["Sustainability", "B2B", "Food"], + overview: "wstwatch - CV food waste tracking for dining halls", + founders: [], + sectionType: "cohort", + sectionName: "Spring 2025 Product Studio Cohort", + sectionOrder: 21, + }, + { + id: "project-43", + title: "frnds of frnds", + description: "Dating app based on mutual friends", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "frnds of frnds", + companyWebsite: "https://www.frndsoffrnds.com/", + categories: ["Social", "B2C", "Dating"], + overview: "LinkedIn meets Hinge: Frnds of Frnds is a dating app where your pool is mutual friends", + founders: [], + sectionType: "cohort", + sectionName: "Spring 2025 Product Studio Cohort", + sectionOrder: 21, + }, + { + id: "project-44", + title: "Squad", + description: "Campus discovery platform", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Squad", + companyWebsite: "https://getsquad.app/", + categories: ["Community", "B2C", "Education"], + overview: "Squad is where campus comes together. Discover the best food, study spots, and more—all curated by students like you.", + founders: [], + sectionType: "cohort", + sectionName: "Spring 2025 Product Studio Cohort", + sectionOrder: 21, + }, + { + id: "project-45", + title: "Claris", + description: "Unified research workflow platform", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Claris", + companyWebsite: "https://claris-two.vercel.app/", + categories: ["Research", "B2B", "Productivity"], + overview: "Claris is a unified web platform that streamlines research workflows and save time across labs in any discipline.", + founders: [], + sectionType: "cohort", + sectionName: "Spring 2025 Product Studio Cohort", + sectionOrder: 21, + }, + { + id: "project-46", + title: "MBooking", + description: "Campus study space booking platform", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "MBooking", + companyWebsite: "https://mbooking.me", + categories: ["Productivity", "B2C", "Education"], + overview: "Find and book the perfect study space on campus without the hassle. Automated, simple, and built for students.", + founders: [], + sectionType: "cohort", + sectionName: "Spring 2025 Product Studio Cohort", + sectionOrder: 21, + }, + { + id: "project-47", + title: "Embedder.dev", + description: "AI tools for embedded systems engineers", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Embedder.dev", + companyWebsite: "embedder.dev", + categories: ["Developer Tools", "AI/ML", "Hardware"], + overview: "AI-native tools for embedded systems engineers", + founders: [], + sectionType: "cohort", + sectionName: "Spring 2025 Product Studio Cohort", + sectionOrder: 21, + }, + { + id: "project-48", + title: "Dezu", + description: "AI tax accountant for high net worth clients", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Dezu", + companyWebsite: "https://dezu.ai/", + categories: ["AI/ML", "B2B", "Finance"], + overview: "Dezu is an AI tax accountan that automates the preparation of complex tax returns for high net worth clients.", + founders: [], + sectionType: "cohort", + sectionName: "Spring 2025 Product Studio Cohort", + sectionOrder: 21, + }, + { + id: "project-49", + title: "AgroQR", + description: "Environmental insights using QR sensors and drones", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "AgroQR", + companyWebsite: "https://www.useagroqr.com/", + categories: ["Agriculture", "B2B", "Sustainability"], + overview: "AgroQR delivers hyperlocal environmental insights using passive QR sensors and autonomous drones.", + founders: [], + investors: [ + { + id: "investor-31", + name: "UMich Center for Entrepreneurship", + type: "university-fund", + website: "https://cfe.umich.edu" + } + ], + fundingAmount: 5000, + fundingStage: "university", + sectionType: "cohort", + sectionName: "Spring 2025 Product Studio Cohort", + sectionOrder: 21, + }, + { + id: "project-50", + title: "Fathom", + description: "AI-powered runtime debugger", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Fathom", + companyWebsite: "", + categories: ["Developer Tools", "AI/ML", "Debugging"], + overview: "Fathom is an AI-powered debugger that seeks bugs during the runtime of programs while having access to its running context, memory, and stack trace.", + founders: [], + sectionType: "cohort", + sectionName: "Spring 2025 Product Studio Cohort", + sectionOrder: 21, + }, + { + id: "project-51", + title: "Form", + description: "Dance error detection using computer vision", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Form", + companyWebsite: "", + categories: ["AI/ML", "B2C", "Education"], + overview: "A computer vision model that maps data points to various body parts to dance videos and detects errors between a \"choreographer\" host video and a \"student\" client video.", + founders: [], + sectionType: "cohort", + sectionName: "Spring 2025 Product Studio Cohort", + sectionOrder: 21, + }, + { + id: "project-52", + title: "TagIt", + description: "Automated metadata tagging for sports photography", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "TagIt", + companyWebsite: "", + categories: ["AI/ML", "B2B", "Sports"], + overview: "TagIt automates metadata tagging in sports photography", + founders: [], + sectionType: "cohort", + sectionName: "Spring 2025 Product Studio Cohort", + sectionOrder: 21, + }, + { + id: "project-53", + title: "TwinMind", + description: "AI sidekick for productivity", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "TwinMind", + companyWebsite: "https://twinmind.com/", + categories: ["AI/ML", "B2C", "Productivity"], + overview: "Your AI Sidekick Understands What You See and Hear to Boost Your Productivity", + founders: [], + investors: [ + { + id: "investor-23", + name: "Streamlined Ventures", + type: "vc" + }, + { + id: "investor-24", + name: "Sequoia Capital", + type: "vc", + website: "https://www.sequoiacap.com" + }, + { + id: "investor-25", + name: "Stephen Wolfram", + type: "angel" + } + ], + fundingAmount: 5700000, + fundingStage: "seed", + valuation: 60000000, + sectionType: "funding", + sectionName: "Sequoia Capital", + sectionOrder: 3, + }, + { + id: "project-54", + title: "Altrix", + description: "Nursing station automation", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Altrix", + companyWebsite: "https://www.altrix.tech/", + categories: ["Healthcare", "B2B", "AI/ML"], + overview: "Your Nursing Station On Auto-Pilot. Save nurses 3 hours a day on administrative tasks.", + founders: [ + { + id: "founder-67", + name: "Hector Benitez Ventura", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + ], + investors: [ + { + id: "investor-28", + name: "Techstars Health AI Baltimore", + type: "accelerator", + website: "https://www.techstars.com" + }, + { + id: "investor-29", + name: "Armajaro Holdings", + type: "vc" + }, + { + id: "investor-30", + name: "Heliconia Capital", + type: "vc" + } + ], + fundingAmount: 300000, + fundingStage: "seed", + sectionType: "funding", + sectionName: "Techstars", + sectionOrder: 5, + }, + { + id: "project-55", + title: "RushLink", + description: "Live event experience for college campuses", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "RushLink", + companyWebsite: "https://download.therushlink.com", + categories: ["Events", "B2C", "Social"], + overview: "Bringing the Rush of Live Events to College Campuses", + founders: [], + sectionType: "cohort", + sectionName: "Spring 2025 Product Studio Cohort", + sectionOrder: 21, + }, + { + id: "project-56", + title: "EarlyBird", + description: "Gen-Z marketing platform for new businesses", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "EarlyBird", + companyWebsite: "https://earlybirddrop.com", + categories: ["Marketing", "B2B", "SaaS"], + overview: "Gen-Z marketing platform for newly opened businesses", + founders: [], + sectionType: "cohort", + sectionName: "Spring 2025 Product Studio Cohort", + sectionOrder: 21, + }, + { + id: "project-57", + title: "Nexxus Labs", + description: "Vehicle data network for urban mobility", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Nexxus Labs", + companyWebsite: "https://www.nexxuslabs.org/", + categories: ["Transportation", "B2B", "Data"], + overview: "Building a vehicle data network for the future of urban mobility", + founders: [ + { + id: "founder-68", + name: "Leo Gao", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + ], + sectionType: "cohort", + sectionName: "Spring 2025 Product Studio Cohort", + sectionOrder: 21, + }, + { + id: "project-58", + title: "Oreen", + description: "Diagramming tool for ChatGPT", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Oreen", + companyWebsite: "https://oreen.dev", + categories: ["AI/ML", "B2C", "Productivity"], + overview: "The world's best diagramming tool for ChatGPT", + founders: [ + { + id: "founder-69", + name: "Benjamin Antonow", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + ], + sectionType: "cohort", + sectionName: "Spring 2025 Product Studio Cohort", + sectionOrder: 21, + }, + { + id: "project-59", + title: "Scholarly", + description: "Context for research papers", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Scholarly", + companyWebsite: "", + categories: ["EdTech", "B2C", "Research"], + overview: "Scholarly provides fast, concise context for research papers. Scholarly reduces friction for people of any background trying to break into a field.", + founders: [], + sectionType: "cohort", + sectionName: "Spring 2025 Product Studio Cohort", + sectionOrder: 21, + }, + { + id: "project-60", + title: "Roots", + description: "Private social media for families", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Roots", + companyWebsite: "rootsapp.org", + categories: ["Social", "B2C", "Privacy"], + overview: "Roots is a private social media made specially for your family. In a world dominated by big tech selling your information, roots creates a privacy focused platform.", + founders: [], + sectionType: "cohort", + sectionName: "Spring 2025 Product Studio Cohort", + sectionOrder: 21, + }, + { + id: "project-61", + title: "Temp8", + description: "Dance choreography app", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Temp8", + companyWebsite: "https://www.youtube.com/watch?v=TLt6yX44u1Q&t=1s", + categories: ["Education", "B2C", "Dance"], + overview: "An app that simplifies dance by breaking down choreography into 8-counts", + founders: [ + { + id: "founder-70", + name: "Maya Malik", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + { + id: "founder-71", + name: "Jeffery Hao Wu", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + ], + sectionType: "cohort", + sectionName: "Spring 2025 Product Studio Cohort", + sectionOrder: 21, + }, + { + id: "project-62", + title: "Milieu", + description: "Skincare platform with science", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Milieu", + companyWebsite: "https://milieubio.com", + categories: ["Healthcare", "B2C", "Beauty"], + overview: "Dedicated to revolutionizing skincare through cutting-edge science and personalized solutions.", + founders: [ + { + id: "founder-72", + name: "Dev Kunjadia", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + ], + sectionType: "cohort", + sectionName: "Spring 2025 Product Studio Cohort", + sectionOrder: 21, + }, + { + id: "project-63", + title: "0xKnowledge", + description: "Knowledge base management with AI", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "0xKnowledge", + companyWebsite: "https://0xknowledge.io/", + categories: ["AI/ML", "B2B", "Knowledge Management"], + overview: "0xKnowledge brings cutting edge technology to your fingertips through a knowledge base management system (KBMS) that is automatically maintained, and integrated with powerful AI tools", + founders: [ + { + id: "founder-73", + name: "Joshua Sum", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + { + id: "founder-74", + name: "Ammar Ateya", + role: "Founder", + imageSrc: "/founder_placeholder_pfp.jpg", + }, + ], + sectionType: "cohort", + sectionName: "Spring 2025 Product Studio Cohort", + sectionOrder: 21, + }, + { + id: "project-64", + title: "Collage", + description: "AI academic advising platform", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Collage", + companyWebsite: "https://mycollage.us", + categories: ["EdTech", "AI/ML", "B2C"], + overview: "AI-powered academic advising and social scheduling platform for college students", + founders: [], + sectionType: "cohort", + sectionName: "Spring 2025 Product Studio Cohort", + sectionOrder: 21, }, ] diff --git a/data/projects.ts.bak b/data/projects.ts.bak new file mode 100644 index 0000000..4ef9452 --- /dev/null +++ b/data/projects.ts.bak @@ -0,0 +1,1587 @@ +import type { Project } from "@/types/project" + +export const projects: Project[] = [ + { + id: "project-1", + title: "AgentMail", + description: "Email Inboxes for AI Agents", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "AgentMail", + companyWebsite: "https://agentmail.to", + categories: ["Developer Tools", "API", "Email"], + overview: "AgentMail is the email inbox API for AI agents. It gives agents their own email inboxes, like Gmail does for humans. Unlike other email APIs, AgentMail provides fully-managed, persistent inboxes that handle parsing, threading, labeling, searching, and replying so agents get the same email experience as humans.", + founders: [ + { + id: "founder-1", + name: "Haakam Aujla", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + { + id: "founder-2", + name: "Michael Kim", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + { + id: "founder-3", + name: "Adi Singh", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + ], + investors: [ + { + id: "investor-1", + name: "Y Combinator", + type: "accelerator", + website: "https://www.ycombinator.com" + }, + { + id: "investor-2", + name: "General Catalyst", + type: "vc", + website: "https://www.generalcatalyst.com" + }, + { + id: "investor-3", + name: "Agent Fund", + type: "vc" + }, + { + id: "investor-4", + name: "Pioneer Fund", + type: "vc", + website: "https://www.pioneer.vc" + }, + { + id: "investor-5", + name: "Paul Graham", + type: "angel" + }, + { + id: "investor-6", + name: "Paul Copplestone", + type: "angel" + }, + { + id: "investor-7", + name: "Karim Atiyeh", + type: "angel" + } + ], + fundingAmount: 500000, + fundingStage: "pre-seed", + sectionType: "funding", + sectionName: "Y Combinator", + sectionOrder: 1, + }, + { + id: "project-2", + title: "Embedder", + description: "Cursor for Firmware", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Embedder", + companyWebsite: "https://www.embedder.com", + categories: ["Artificial Intelligence", "Developer Tools", "Hardware"], + overview: "Embedder is a coding agent that can write, test, and debug firmware on both physical and simulated hardware. Supporting 20+ MCU/SoC platforms, it accelerates embedded systems development across semiconductors, automotive, medical devices, aerospace, IoT, and consumer electronics.", + founders: [ + { + id: "founder-4", + name: "Ethan Gibbs", + role: "CEO", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + { + id: "founder-5", + name: "Bob Wei", + role: "CTO", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + ], + investors: [ + { + id: "investor-8", + name: "Y Combinator", + type: "accelerator", + website: "https://www.ycombinator.com" + }, + { + id: "investor-9", + name: "Z Fellows", + type: "accelerator" + } + ], + fundingAmount: 50000, + fundingStage: "seed", + sectionType: "funding", + sectionName: "Y Combinator", + sectionOrder: 1, + }, + { + id: "project-3", + title: "Orange Slice", + description: "Agentic sales enrichment spreadsheet", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Orange Slice", + companyWebsite: "https://orangeslice.ai", + categories: ["B2B", "SaaS", "Sales", "Sales Enablement"], + overview: "Orange Slice is a spreadsheet where every column is TypeScript—and AI writes it for you. Describe what you want in chat ('find the CEO's LinkedIn and get their email'), and we generate the code, create the columns, and run it across thousands of rows. Our fully-typed SDK has 100+ enrichments built in: LinkedIn, contact info, company data, web scraping, AI research.", + founders: [ + { + id: "founder-6", + name: "Vihaar Nandigala", + role: "CEO", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + { + id: "founder-7", + name: "Kishan Sripada", + role: "CTO", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + ], + investors: [ + { + id: "investor-10", + name: "Y Combinator", + type: "accelerator", + website: "https://www.ycombinator.com" + }, + { + id: "investor-11", + name: "Lobster Capital", + type: "vc" + }, + { + id: "investor-12", + name: "Moxxie Ventures", + type: "vc" + }, + { + id: "investor-13", + name: "Transpose Platform Management", + type: "vc" + }, + { + id: "investor-14", + name: "Paul Graham", + type: "angel" + } + ], + fundingStage: "seed", + sectionType: "funding", + sectionName: "Y Combinator", + sectionOrder: 1, + }, + { + id: "project-4", + title: "Skope", + description: "Build a more profitable law firm with AI", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Skope", + companyWebsite: "https://useskope.com", + categories: ["B2B", "Legal", "AI"], + overview: "Skope builds AI for core legal workflows. We will save your law firm time and help you make more money, with AI. Unlike general-purpose AI, Skope is purpose-built for legal work. We offer specialized features like document redlining and knowledge base search that other tools do not offer, as well as improved security for your data.", + founders: [ + { + id: "founder-8", + name: "Ben Smith", + role: "CEO", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + { + id: "founder-9", + name: "Connor Park", + role: "CTO", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + ], + investors: [ + { + id: "investor-15", + name: "Y Combinator", + type: "accelerator", + website: "https://www.ycombinator.com" + } + ], + fundingStage: "seed", + sectionType: "funding", + sectionName: "Y Combinator", + sectionOrder: 1, + }, + + { + id: "project-7", + title: "GreenRoute", + description: "Sustainable logistics and delivery optimization", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "GreenRoute Logistics", + companyWebsite: "https://greenroute.io", + categories: ["Logistics", "Sustainability", "B2B"], + overview: "GreenRoute helps delivery companies reduce their carbon footprint through intelligent route optimization. Our AI algorithms consider traffic, weather, and environmental factors to minimize emissions.", + founders: [ + { + id: "founder-13", + name: "Michael Brown", + role: "CEO", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + { + id: "founder-14", + name: "Anna Green", + role: "COO", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + ], + sectionType: "cohort", + sectionName: "Winter 2026 Product Studio Cohort", + sectionOrder: 23, + }, + { + id: "project-8", + title: "FinanceHub", + description: "Personal finance tracking for college students", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "FinanceHub Inc.", + companyWebsite: "https://financehub.com", + categories: ["FinTech", "Consumer", "B2C"], + overview: "FinanceHub helps college students manage their finances with features tailored to student life. Track expenses, budget for tuition, and learn financial literacy in an easy-to-use app.", + founders: [ + { + id: "founder-15", + name: "Rachel Torres", + role: "CEO", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + { + id: "founder-16", + name: "James Wilson", + role: "CTO", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + ], + sectionType: "cohort", + sectionName: "Winter 2026 Product Studio Cohort", + sectionOrder: 23, + }, + { + id: "project-9", + title: "EventSpace", + description: "Campus event discovery and ticketing platform", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "EventSpace Inc.", + companyWebsite: "https://eventspace.com", + categories: ["Events", "Social", "B2C"], + overview: "EventSpace makes it easy to discover and attend campus events. Students can find events, buy tickets, and coordinate with friends. Event organizers get tools to manage and promote their events.", + founders: [ + { + id: "founder-17", + name: "Kevin Patel", + role: "CEO", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + ], + sectionType: "cohort", + sectionName: "Winter 2026 Product Studio Cohort", + sectionOrder: 23, + }, + { + id: "project-10", + title: "StudyBuddy", + description: "AI-powered study partner and flashcard generator", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "StudyBuddy AI", + companyWebsite: "https://studybuddy.ai", + categories: ["EdTech", "AI/ML", "B2C"], + overview: "StudyBuddy uses AI to generate flashcards from your notes, quiz you on key concepts, and track your learning progress. It's like having a personalized tutor available 24/7.", + founders: [ + { + id: "founder-18", + name: "Nina Williams", + role: "CEO", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + { + id: "founder-19", + name: "Tom Anderson", + role: "CTO", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + ], + sectionType: "cohort", + sectionName: "Fall 2025 Product Studio Cohort", + sectionOrder: 22, + }, + { + id: "project-11", + title: "MentorMatch", + description: "Platform connecting students with industry mentors", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "MentorMatch Inc.", + companyWebsite: "https://mentormatch.com", + categories: ["Career", "Networking", "B2B"], + overview: "MentorMatch connects students with industry professionals for mentorship. Students can search for mentors in their field, schedule sessions, and build lasting professional relationships.", + founders: [ + { + id: "founder-25", + name: "Sofia Martinez", + role: "CEO", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + { + id: "founder-26", + name: "Daniel Kim", + role: "COO", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + ], + sectionType: "cohort", + sectionName: "Winter 2025 Product Studio Cohort", + sectionOrder: 21, + }, + { + id: "project-12", + title: "GreenRoute", + description: "Sustainable logistics and delivery optimization", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "GreenRoute Logistics", + companyWebsite: "https://greenroute.io", + categories: ["Logistics", "Sustainability", "B2B"], + overview: "GreenRoute helps delivery companies reduce their carbon footprint through intelligent route optimization. Our AI algorithms consider traffic, weather, and environmental factors to minimize emissions.", + founders: [ + { + id: "founder-27", + name: "Michael Brown", + role: "CEO", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + { + id: "founder-28", + name: "Anna Green", + role: "COO", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + ], + sectionType: "cohort", + sectionName: "Winter 2025 Product Studio Cohort", + sectionOrder: 21, + }, + { + id: "project-13", + title: "Lost and Found Plus", + description: "An easy-to-use system that tracks tools and materials that are being used in communal spaces", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Lost and Found Plus", + companyWebsite: "", + categories: ["Productivity", "B2B"], + overview: "An easy-to-use system that tracks tools and materials that are being used in communal spaces. Helps organizations manage shared resources efficiently and reduce loss of valuable items.", + founders: [ + { + id: "founder-25", + name: "Anuhea Tao", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + ], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-14", + title: "Hair Haven", + description: "Our mission is to provide barbers with an individualized, interactive platform to help customers get the most optimal haircut.", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Hair Haven", + companyWebsite: "", + categories: ["B2B", "Beauty", "SaaS"], + overview: "Our mission is to provide barbers with an individualized, interactive platform to help customers get the most optimal haircut. Uses AI and personalization to recommend the perfect haircut based on face shape, hair type, and personal style.", + founders: [], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-15", + title: "Parrot", + description: "Advanced communication and collaboration platform", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Parrot", + companyWebsite: "", + categories: ["Communication", "B2B"], + overview: "Advanced communication and collaboration platform designed to enhance team productivity and information sharing in modern workplaces.", + founders: [], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-16", + title: "Quotr", + description: "Conversational AI platform that automates estimates and information gathering", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Quotr", + companyWebsite: "", + categories: ["AI/ML", "B2B", "Automation"], + overview: "Quotr is a conversational AI platform that automates away the manual calling for estimates, quotes, and general information from places all around you. All you do is put in your request, and we make the calls and get the information back to you.", + founders: [ + { + id: "founder-26", + name: "Soham Salunke", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + { + id: "founder-27", + name: "Divya Ponda", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + { + id: "founder-28", + name: "Roshni Koduri", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + ], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-17", + title: "Manu.AI", + description: "Easy access to any manual you could ever need", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Manu.AI", + companyWebsite: "", + categories: ["AI/ML", "Productivity", "B2B"], + overview: "Easy access to any manual you could ever need. AI-powered platform that provides instant access to user manuals, documentation, and guides for any product or device.", + founders: [ + { + id: "founder-29", + name: "Leo Liu", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + { + id: "founder-30", + name: "Johnathan Mo", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + ], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-18", + title: "Closet Swap", + description: "Digital platform for borrowing and lending clothes affordably", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Closet Swap", + companyWebsite: "https://closet-swap.vercel.app/", + categories: ["Fashion", "B2C", "Sustainability"], + overview: "A digital platform for users to borrow and lend clothes affordably, quickly, and reliably. Reduces fashion waste while giving people access to a wider variety of clothing.", + founders: [ + { + id: "founder-31", + name: "Meghna Reddy", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + { + id: "founder-32", + name: "Shriya Kankatala", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + { + id: "founder-33", + name: "Diya Mahaveer", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + { + id: "founder-34", + name: "Hana Ahmed", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + ], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-19", + title: "DAWG", + description: "Elevating sport program performance through technology", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "DAWG", + companyWebsite: "", + categories: ["Sports", "B2B", "Analytics"], + overview: "Elevating sport program performance through technology. Data-driven platform that helps athletic programs optimize training, performance, and team management.", + founders: [ + { + id: "founder-35", + name: "Priya Gutta", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + ], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-20", + title: "Learn Bubble", + description: "Popping the bubble of higher education through accessible STEM literacy", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Learn Bubble", + companyWebsite: "", + categories: ["EdTech", "STEM", "B2C"], + overview: "Popping the bubble of higher education through accessible STEM literacy. Making complex STEM concepts accessible to everyone through interactive learning experiences.", + founders: [ + { + id: "founder-36", + name: "Rafee Mirza", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + ], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-21", + title: "MeetingBrew", + description: "A group event scheduler", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "MeetingBrew", + companyWebsite: "https://www.meetingbrew.com/", + categories: ["Productivity", "B2B", "Scheduling"], + overview: "A group event scheduler that makes coordinating meetings and events effortless. Uses smart algorithms to find optimal times that work for everyone.", + founders: [ + { + id: "founder-37", + name: "Cooper Saye", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + { + id: "founder-38", + name: "Brian Travis", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + ], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-22", + title: "CodeTrace", + description: "AI-powered semantic search for seamless onboarding and smarter codebase navigation", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "CodeTrace", + companyWebsite: "https://www.codetrace.ai/", + categories: ["Developer Tools", "AI/ML", "B2B"], + overview: "AI-powered semantic search for seamless onboarding and smarter codebase navigation. Helps developers understand and navigate large codebases more efficiently.", + founders: [ + { + id: "founder-39", + name: "David Mazur", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + ], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-23", + title: "Doublet", + description: "Word transformation puzzle game", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Doublet", + companyWebsite: "https://doublet-waitlist.vercel.app/", + categories: ["Gaming", "B2C", "Education"], + overview: "Word transformation puzzle game that challenges players to transform one word into another through a series of steps. Educational and entertaining word game.", + founders: [ + { + id: "founder-40", + name: "Adviti Mishra", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + { + id: "founder-41", + name: "Isha Kalwani", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + ], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-24", + title: "Batch", + description: "Shared rides to DTW from $9", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Batch", + companyWebsite: "https://www.batchme.app/", + categories: ["Transportation", "B2C", "Sharing Economy"], + overview: "Ubers to DTW from $9. Batch your ride with verified U-M students. Affordable shared transportation solution for university students traveling to the airport.", + founders: [ + { + id: "founder-42", + name: "Sanjit Vijay", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + { + id: "founder-43", + name: "Aryan Shah", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + ], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-25", + title: "Find Blue", + description: "The go-to space for students at the University of Michigan to launch ideas and build ventures", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Find Blue", + companyWebsite: "https://f-bweb.vercel.app/", + categories: ["Community", "B2C", "Entrepreneurship"], + overview: "The go-to space for students at the University of Michigan to launch ideas and build ventures. Community platform for student entrepreneurs and innovators.", + founders: [ + { + id: "founder-44", + name: "Owen Lennon", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + { + id: "founder-45", + name: "Rakesh Varma Kottapalli", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + ], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-26", + title: "Parley", + description: "Gamify productivity by betting on your friend's tasks", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Parley", + companyWebsite: "", + categories: ["Productivity", "B2C", "Gamification"], + overview: "Gamify productivity by betting on your friend's tasks. Social accountability platform that turns task completion into friendly competitions and bets.", + founders: [ + { + id: "founder-46", + name: "Toan Bui", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + { + id: "founder-47", + name: "Sriram MK", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + { + id: "founder-48", + name: "Aditi Locula", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + ], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-27", + title: "Courtline", + description: "Organizing recreational sports & pickup games at UMich", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Courtline", + companyWebsite: "https://mqueue-six.vercel.app/", + categories: ["Sports", "B2C", "Community"], + overview: "Organizing recreational sports & pickup games at UMich! Platform for coordinating and joining casual sports activities and pickup games on campus.", + founders: [ + { + id: "founder-49", + name: "Amy Liu", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + { + id: "founder-50", + name: "Joshua Lee", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + ], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-28", + title: "RepConnect", + description: "App for constituents to know about local politicians", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "RepConnect", + companyWebsite: "", + categories: ["Civic Tech", "B2C", "Government"], + overview: "Ex-pollster building an app for constituents to know about local politicians 🗳️. Platform that helps citizens stay informed about their local representatives and political activities.", + founders: [ + { + id: "founder-51", + name: "Arhan Kaul", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + ], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-29", + title: "Museaic", + description: "An AI tool to automate arranging music", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Museaic", + companyWebsite: "", + categories: ["Music", "AI/ML", "B2B"], + overview: "An AI tool to automate arranging music 🎶. AI-powered platform that helps musicians and producers arrange and compose music more efficiently.", + founders: [ + { + id: "founder-52", + name: "Casey Feng", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + ], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-30", + title: "QuickSync", + description: "Helping contractors bill faster", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "QuickSync", + companyWebsite: "https://pitch.com/v/f24-demo-day-zxnxqi/50a580be-6497-435e-9e3d-4516bcde4860", + categories: ["Construction", "B2B", "Productivity"], + overview: "Helping contractors bill faster. Streamlined billing and invoicing platform designed specifically for construction contractors.", + founders: [ + { + id: "founder-53", + name: "Phoenix Sheppard", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + ], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-31", + title: "Infralens", + description: "All-In-One 3D Imaging Access for Contractors", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Infralens", + companyWebsite: "https://pitch.com/v/f24-demo-day-zxnxqi/aa63d81b-fd08-4e46-9f50-6f5d4d1cbf7c", + categories: ["Construction", "B2B", "3D Imaging"], + overview: "All-In-One 3D Imaging Access for Contractors. Platform that provides contractors with easy access to 3D imaging tools and data for construction projects.", + founders: [], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-32", + title: "Nudge", + description: "Helping you keep track of your must-visit travel spots", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Nudge", + companyWebsite: "", + categories: ["Travel", "B2C", "Productivity"], + overview: "Helping you keep track of your must-visit travel spots ✈️. Personal travel planning platform that helps users organize and remember places they want to visit.", + founders: [ + { + id: "founder-54", + name: "Riya Saha", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + { + id: "founder-55", + name: "Pari Gulati", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + { + id: "founder-56", + name: "Kritika Singh", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + ], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-33", + title: "Cyberwright", + description: "The first cybersecurity developer tool", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Cyberwright", + companyWebsite: "https://devpost.com/software/cyberwright", + categories: ["Security", "Developer Tools", "B2B"], + overview: "The first cybersecurity developer tool, allowing programmers to identify bugs and fix bugs before production. AI-powered security tool that helps developers find and fix security vulnerabilities in code.", + founders: [ + { + id: "founder-57", + name: "Jacob Chen", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + ], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-34", + title: "Ghost Kitchen Finder", + description: "Chrome extension that flags ghost kitchens on delivery apps", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Ghost Kitchen Finder", + companyWebsite: "", + categories: ["Browser Extension", "B2C", "Food"], + overview: "Chrome extension that flags ghost kitchens on delivery apps. Helps consumers identify and avoid ordering from virtual kitchens on food delivery platforms.", + founders: [], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-35", + title: "Tour.video", + description: "Interactive virtual tours for apartments", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Tour.video", + companyWebsite: "https://tour.video/", + categories: ["Real Estate", "B2B", "Virtual Tours"], + overview: "Interactive, virtual tours that get your apartment more leases", + founders: [ + { + id: "founder-58", + name: "Kishan Sripada", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + ], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-36", + title: "MeetYourClass", + description: "Student social networking for universities", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "MeetYourClass", + companyWebsite: "https://meetyourclassinc.com/", + categories: ["Social", "B2B", "Education"], + overview: "MeetYourClass is a student-facing social networking system that helps university enrollment and student life departments better understand and reach their prospective student body.", + founders: [ + { + id: "founder-75", + name: "Jonah Liss", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + { + id: "founder-76", + name: "Blake Mischley", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + { + id: "founder-77", + name: "Kaleb Schmottlach", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + { + id: "founder-78", + name: "Jon Millar", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + ], + investors: [ + { + id: "investor-26", + name: "Techstars Detroit Powered by J.P. Morgan", + type: "accelerator", + website: "https://www.techstars.com" + }, + { + id: "investor-27", + name: "Zell Lurie Institute", + type: "university-fund", + website: "https://zli.umich.edu" + } + ], + fundingAmount: 120000, + fundingStage: "seed", + sectionType: "funding", + sectionName: "Techstars", + sectionOrder: 6, + }, + { + id: "project-37", + title: "AccoAI", + description: "AI-powered admin task automation for practices", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "AccoAI", + companyWebsite: "https://www.accoai.com/", + categories: ["AI/ML", "B2B", "Productivity"], + overview: "AccoAI automates admin tasks and unifies your practice, helping save time and grow billables.", + founders: [ + { + id: "founder-59", + name: "Lance Fuchia", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + ], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-38", + title: "Hyperfan", + description: "Platform for creators to connect with fans", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Hyperfan", + companyWebsite: "https://www.hyperfan.com/", + categories: ["Social", "B2C", "Entertainment"], + overview: "Helping creators connect with their fans", + founders: [ + { + id: "founder-60", + name: "Areeb Khan", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + ], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-39", + title: "fomo", + description: "College event discovery platform", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "fomo", + companyWebsite: "", + categories: ["Events", "B2C", "Social"], + overview: "A platform to create, manage, and discover college events.", + founders: [], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-40", + title: "Shade", + description: "AI-powered media storage for creative teams", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Shade", + companyWebsite: "https://shade.inc/", + categories: ["AI/ML", "B2B", "Storage"], + overview: "Shade is a seed stage startup backed by General Catalyst, Contrary, SignalFire, and Bling building the future of file storage. AI-powered media storage solution that enables creative teams to instantly sync files from anywhere.", + founders: [ + { + id: "founder-61", + name: "Brandon Fan", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + { + id: "founder-62", + name: "Bright Xu", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + { + id: "founder-63", + name: "Edison Chiu", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + { + id: "founder-64", + name: "Gurish Sharma", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + ], + investors: [ + { + id: "investor-16", + name: "General Catalyst", + type: "vc", + website: "https://www.generalcatalyst.com" + }, + { + id: "investor-17", + name: "Contrary Capital", + type: "vc", + website: "https://www.contrary.com" + }, + { + id: "investor-18", + name: "SignalFire", + type: "vc", + website: "https://www.signalfire.com" + }, + { + id: "investor-19", + name: "Bling", + type: "vc" + }, + { + id: "investor-20", + name: "GC Venture Fellows", + type: "vc" + }, + { + id: "investor-21", + name: "Gold House Ventures", + type: "vc" + }, + { + id: "investor-22", + name: "Z Fellows", + type: "accelerator" + } + ], + fundingStage: "seed", + sectionType: "funding", + sectionName: "General Catalyst", + sectionOrder: 4, + }, + { + id: "project-41", + title: "codefy.AI", + description: "Coding widget toolbox for developers", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "codefy.AI", + companyWebsite: "https://www.codefy.ai/", + categories: ["Developer Tools", "AI/ML", "Productivity"], + overview: "codefy.ai is your own toolbox of useful coding widgets to help you speed up your workflow. Write, explain, debug, compare, and translate code with 15+ helpful, customized tools.", + founders: [ + { + id: "founder-65", + name: "Cooper Saye", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + { + id: "founder-66", + name: "Brian Travis", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + ], + fundingStage: "university", + sectionType: "cohort", + sectionName: "Fall 2024 Product Studio Cohort", + sectionOrder: 20, + }, + { + id: "project-42", + title: "wstwatch", + description: "Food waste tracking for dining halls", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "wstwatch", + companyWebsite: "", + categories: ["Sustainability", "B2B", "Food"], + overview: "wstwatch - CV food waste tracking for dining halls", + founders: [], + sectionType: "cohort", + sectionName: "Spring 2025 Product Studio Cohort", + sectionOrder: 21, + }, + { + id: "project-43", + title: "frnds of frnds", + description: "Dating app based on mutual friends", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "frnds of frnds", + companyWebsite: "https://www.frndsoffrnds.com/", + categories: ["Social", "B2C", "Dating"], + overview: "LinkedIn meets Hinge: Frnds of Frnds is a dating app where your pool is mutual friends", + founders: [], + sectionType: "cohort", + sectionName: "Spring 2025 Product Studio Cohort", + sectionOrder: 21, + }, + { + id: "project-44", + title: "Squad", + description: "Campus discovery platform", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Squad", + companyWebsite: "https://getsquad.app/", + categories: ["Community", "B2C", "Education"], + overview: "Squad is where campus comes together. Discover the best food, study spots, and more—all curated by students like you.", + founders: [], + sectionType: "cohort", + sectionName: "Spring 2025 Product Studio Cohort", + sectionOrder: 21, + }, + { + id: "project-45", + title: "Claris", + description: "Unified research workflow platform", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Claris", + companyWebsite: "https://claris-two.vercel.app/", + categories: ["Research", "B2B", "Productivity"], + overview: "Claris is a unified web platform that streamlines research workflows and save time across labs in any discipline.", + founders: [], + sectionType: "cohort", + sectionName: "Spring 2025 Product Studio Cohort", + sectionOrder: 21, + }, + { + id: "project-46", + title: "MBooking", + description: "Campus study space booking platform", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "MBooking", + companyWebsite: "https://mbooking.me", + categories: ["Productivity", "B2C", "Education"], + overview: "Find and book the perfect study space on campus without the hassle. Automated, simple, and built for students.", + founders: [], + sectionType: "cohort", + sectionName: "Spring 2025 Product Studio Cohort", + sectionOrder: 21, + }, + { + id: "project-47", + title: "Embedder.dev", + description: "AI tools for embedded systems engineers", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Embedder.dev", + companyWebsite: "embedder.dev", + categories: ["Developer Tools", "AI/ML", "Hardware"], + overview: "AI-native tools for embedded systems engineers", + founders: [], + sectionType: "cohort", + sectionName: "Spring 2025 Product Studio Cohort", + sectionOrder: 21, + }, + { + id: "project-48", + title: "Dezu", + description: "AI tax accountant for high net worth clients", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Dezu", + companyWebsite: "https://dezu.ai/", + categories: ["AI/ML", "B2B", "Finance"], + overview: "Dezu is an AI tax accountan that automates the preparation of complex tax returns for high net worth clients.", + founders: [], + sectionType: "cohort", + sectionName: "Spring 2025 Product Studio Cohort", + sectionOrder: 21, + }, + { + id: "project-49", + title: "AgroQR", + description: "Environmental insights using QR sensors and drones", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "AgroQR", + companyWebsite: "https://www.useagroqr.com/", + categories: ["Agriculture", "B2B", "Sustainability"], + overview: "AgroQR delivers hyperlocal environmental insights using passive QR sensors and autonomous drones.", + founders: [], + investors: [ + { + id: "investor-31", + name: "UMich Center for Entrepreneurship", + type: "university-fund", + website: "https://cfe.umich.edu" + } + ], + fundingAmount: 5000, + fundingStage: "university", + sectionType: "cohort", + sectionName: "Spring 2025 Product Studio Cohort", + sectionOrder: 21, + }, + { + id: "project-50", + title: "Fathom", + description: "AI-powered runtime debugger", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Fathom", + companyWebsite: "", + categories: ["Developer Tools", "AI/ML", "Debugging"], + overview: "Fathom is an AI-powered debugger that seeks bugs during the runtime of programs while having access to its running context, memory, and stack trace.", + founders: [], + sectionType: "cohort", + sectionName: "Spring 2025 Product Studio Cohort", + sectionOrder: 21, + }, + { + id: "project-51", + title: "Form", + description: "Dance error detection using computer vision", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Form", + companyWebsite: "", + categories: ["AI/ML", "B2C", "Education"], + overview: "A computer vision model that maps data points to various body parts to dance videos and detects errors between a \"choreographer\" host video and a \"student\" client video.", + founders: [], + sectionType: "cohort", + sectionName: "Spring 2025 Product Studio Cohort", + sectionOrder: 21, + }, + { + id: "project-52", + title: "TagIt", + description: "Automated metadata tagging for sports photography", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "TagIt", + companyWebsite: "", + categories: ["AI/ML", "B2B", "Sports"], + overview: "TagIt automates metadata tagging in sports photography", + founders: [], + sectionType: "cohort", + sectionName: "Spring 2025 Product Studio Cohort", + sectionOrder: 21, + }, + { + id: "project-53", + title: "TwinMind", + description: "AI sidekick for productivity", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "TwinMind", + companyWebsite: "https://twinmind.com/", + categories: ["AI/ML", "B2C", "Productivity"], + overview: "Your AI Sidekick Understands What You See and Hear to Boost Your Productivity", + founders: [], + investors: [ + { + id: "investor-23", + name: "Streamlined Ventures", + type: "vc" + }, + { + id: "investor-24", + name: "Sequoia Capital", + type: "vc", + website: "https://www.sequoiacap.com" + }, + { + id: "investor-25", + name: "Stephen Wolfram", + type: "angel" + } + ], + fundingAmount: 5700000, + fundingStage: "seed", + valuation: 60000000, + sectionType: "funding", + sectionName: "Sequoia Capital", + sectionOrder: 3, + }, + { + id: "project-54", + title: "Altrix", + description: "Nursing station automation", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Altrix", + companyWebsite: "https://www.altrix.tech/", + categories: ["Healthcare", "B2B", "AI/ML"], + overview: "Your Nursing Station On Auto-Pilot. Save nurses 3 hours a day on administrative tasks.", + founders: [ + { + id: "founder-67", + name: "Hector Benitez Ventura", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + ], + investors: [ + { + id: "investor-28", + name: "Techstars Health AI Baltimore", + type: "accelerator", + website: "https://www.techstars.com" + }, + { + id: "investor-29", + name: "Armajaro Holdings", + type: "vc" + }, + { + id: "investor-30", + name: "Heliconia Capital", + type: "vc" + } + ], + fundingAmount: 300000, + fundingStage: "seed", + sectionType: "funding", + sectionName: "Techstars", + sectionOrder: 5, + }, + { + id: "project-55", + title: "RushLink", + description: "Live event experience for college campuses", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "RushLink", + companyWebsite: "https://download.therushlink.com", + categories: ["Events", "B2C", "Social"], + overview: "Bringing the Rush of Live Events to College Campuses", + founders: [], + sectionType: "cohort", + sectionName: "Spring 2025 Product Studio Cohort", + sectionOrder: 21, + }, + { + id: "project-56", + title: "EarlyBird", + description: "Gen-Z marketing platform for new businesses", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "EarlyBird", + companyWebsite: "https://earlybirddrop.com", + categories: ["Marketing", "B2B", "SaaS"], + overview: "Gen-Z marketing platform for newly opened businesses", + founders: [], + sectionType: "cohort", + sectionName: "Spring 2025 Product Studio Cohort", + sectionOrder: 21, + }, + { + id: "project-57", + title: "Nexxus Labs", + description: "Vehicle data network for urban mobility", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Nexxus Labs", + companyWebsite: "https://www.nexxuslabs.org/", + categories: ["Transportation", "B2B", "Data"], + overview: "Building a vehicle data network for the future of urban mobility", + founders: [ + { + id: "founder-68", + name: "Leo Gao", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + ], + sectionType: "cohort", + sectionName: "Spring 2025 Product Studio Cohort", + sectionOrder: 21, + }, + { + id: "project-58", + title: "Oreen", + description: "Diagramming tool for ChatGPT", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Oreen", + companyWebsite: "https://oreen.dev", + categories: ["AI/ML", "B2C", "Productivity"], + overview: "The world's best diagramming tool for ChatGPT", + founders: [ + { + id: "founder-69", + name: "Benjamin Antonow", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + ], + sectionType: "cohort", + sectionName: "Spring 2025 Product Studio Cohort", + sectionOrder: 21, + }, + { + id: "project-59", + title: "Scholarly", + description: "Context for research papers", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Scholarly", + companyWebsite: "", + categories: ["EdTech", "B2C", "Research"], + overview: "Scholarly provides fast, concise context for research papers. Scholarly reduces friction for people of any background trying to break into a field.", + founders: [], + sectionType: "cohort", + sectionName: "Spring 2025 Product Studio Cohort", + sectionOrder: 21, + }, + { + id: "project-60", + title: "Roots", + description: "Private social media for families", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Roots", + companyWebsite: "rootsapp.org", + categories: ["Social", "B2C", "Privacy"], + overview: "Roots is a private social media made specially for your family. In a world dominated by big tech selling your information, roots creates a privacy focused platform.", + founders: [], + sectionType: "cohort", + sectionName: "Spring 2025 Product Studio Cohort", + sectionOrder: 21, + }, + { + id: "project-61", + title: "Temp8", + description: "Dance choreography app", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Temp8", + companyWebsite: "https://www.youtube.com/watch?v=TLt6yX44u1Q&t=1s", + categories: ["Education", "B2C", "Dance"], + overview: "An app that simplifies dance by breaking down choreography into 8-counts", + founders: [ + { + id: "founder-70", + name: "Maya Malik", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + { + id: "founder-71", + name: "Jeffery Hao Wu", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + ], + sectionType: "cohort", + sectionName: "Spring 2025 Product Studio Cohort", + sectionOrder: 21, + }, + { + id: "project-62", + title: "Milieu", + description: "Skincare platform with science", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Milieu", + companyWebsite: "https://milieubio.com", + categories: ["Healthcare", "B2C", "Beauty"], + overview: "Dedicated to revolutionizing skincare through cutting-edge science and personalized solutions.", + founders: [ + { + id: "founder-72", + name: "Dev Kunjadia", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + ], + sectionType: "cohort", + sectionName: "Spring 2025 Product Studio Cohort", + sectionOrder: 21, + }, + { + id: "project-63", + title: "0xKnowledge", + description: "Knowledge base management with AI", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "0xKnowledge", + companyWebsite: "https://0xknowledge.io/", + categories: ["AI/ML", "B2B", "Knowledge Management"], + overview: "0xKnowledge brings cutting edge technology to your fingertips through a knowledge base management system (KBMS) that is automatically maintained, and integrated with powerful AI tools", + founders: [ + { + id: "founder-73", + name: "Joshua Sum", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + { + id: "founder-74", + name: "Ammar Ateya", + role: "Founder", + imageSrc: "/placeholder.svg?height=150&width=150", + }, + ], + sectionType: "cohort", + sectionName: "Spring 2025 Product Studio Cohort", + sectionOrder: 21, + }, + { + id: "project-64", + title: "Collage", + description: "AI academic advising platform", + imageSrc: "/placeholder.svg?height=200&width=300", + companyName: "Collage", + companyWebsite: "https://mycollage.us", + categories: ["EdTech", "AI/ML", "B2C"], + overview: "AI-powered academic advising and social scheduling platform for college students", + founders: [], + sectionType: "cohort", + sectionName: "Spring 2025 Product Studio Cohort", + sectionOrder: 21, + }, +] diff --git a/hooks/useProjects.ts b/hooks/useProjects.ts new file mode 100644 index 0000000..512395e --- /dev/null +++ b/hooks/useProjects.ts @@ -0,0 +1,66 @@ +"use client"; + +import { useQuery } from "@tanstack/react-query"; +import { useMemo } from "react"; +import type { Project } from "@/types/project"; +import { filterProjects } from "@/lib/notion"; + +interface ProjectsResponse { + projects: Project[]; + filterOptions: { + fundingSources: string[]; + cohorts: string[]; + categories: string[]; + }; + totalProjects: number; + filteredCount: number; +} + +interface ProjectsQueryParams { + searchQuery: string; + fundingSources: string[]; + cohorts: string[]; + categories: string[]; +} + +async function fetchProjects(): Promise { + const response = await fetch(`/api/projects`); + + if (!response.ok) { + throw new Error("Failed to fetch projects"); + } + + return response.json(); +} + +export function useProjects(params: ProjectsQueryParams) { + const { + data, + isPending: isLoading, + error, + } = useQuery({ + queryKey: ["projects"], + queryFn: fetchProjects, + staleTime: 5 * 60 * 1000, + retry: 3, + }); + + const filteredProjects = useMemo(() => { + return filterProjects(data?.projects || [], params); + }, [data, params]); + + const filteredCount = useMemo(() => filteredProjects.length, [filteredProjects]); + + return { + projects: filteredProjects, + filterOptions: data?.filterOptions || { + fundingSources: [], + cohorts: [], + categories: [], + }, + totalProjects: data?.projects?.length || 0, + filteredCount, + isLoading, + error: error as Error | null, + }; +} diff --git a/lib/notion.ts b/lib/notion.ts new file mode 100644 index 0000000..cc87e41 --- /dev/null +++ b/lib/notion.ts @@ -0,0 +1,345 @@ +import type { Project, Investor } from "@/types/project" + +export type PrestigeTier = "prestige" | "top" | "high" | "standard" + +const INVESTOR_TIERS: Record = { + "Sequoia Capital": "top", + "General Catalyst": "top", + "Y Combinator": "prestige", + "Techstars": "top", + "SignalFire": "high", + "Contrary Capital": "high", + "Pioneer Fund": "high", + "Agent Fund": "high", + "Moxxie Ventures": "high", + "Streamlined Ventures": "high", + "Lobster Capital": "high", + "Gold House Ventures": "high", + "GC Venture Fellows": "high", + "Z Fellows": "high", + "Bling": "standard", + "Heliconia Capital": "standard", + "Armajaro Holdings": "standard", + "Transpose Platform Management": "standard", + "UMich Center for Entrepreneurship": "standard", + "Zell Lurie Institute": "standard", + "Paul Graham": "high", + "Stephen Wolfram": "high", + "Paul Copplestone": "high", + "Karim Atiyeh": "high", +} + +const TIER_SCORES: Record = { + prestige: 150, + top: 100, + high: 50, + standard: 10, +} + +export function getInvestorTier(investorName: string): PrestigeTier { + const baseName = investorName.includes("Techstars") ? "Techstars" : investorName + return INVESTOR_TIERS[baseName] || "standard" +} + +export function getInvestorPrestigeScore(investorName: string, investorType: string): number { + const tier = getInvestorTier(investorName) + const score = TIER_SCORES[tier] + + if (investorType === "angel" && tier === "standard") { + return score + 5 + } + + return score +} + +export function sortInvestorsByPrestige(investors: Investor[]): Investor[] { + return [...investors].sort((a, b) => { + const scoreA = getInvestorPrestigeScore(a.name, a.type) + const scoreB = getInvestorPrestigeScore(b.name, b.type) + + if (scoreA !== scoreB) { + return scoreB - scoreA + } + + return a.name.localeCompare(b.name) + }) +} + +export function getProjectPrestigeScore(project: Project): number { + if (!project.investors || project.investors.length === 0) { + return 0 + } + + const maxScore = Math.max( + ...project.investors.map(inv => getInvestorPrestigeScore(inv.name, inv.type)) + ) + + const countBonus = Math.min(project.investors.length - 1, 3) * 5 + + return maxScore + countBonus +} + +export function extractTitleInfo(titleProp: any): { name: string; link: string | null } { + const titleText = titleProp.title?.[0]?.text + if (!titleText) { + return { name: "", link: null } + } + return { + name: titleText.content || "", + link: titleText.link?.url || null + } +} + +export function extractPlainText(richTextProp: any): string { + return richTextProp.rich_text?.[0]?.plain_text || "" +} + +export function extractMultiSelect(multiSelectProp: any): string[] { + return multiSelectProp.multi_select?.map((item: any) => item.name) || [] +} + +export function parseInvestorName(investorString: string): { name: string; type: string } { + const match = investorString.match(/^(.+?)\s*\((.+)\)$/) + if (match) { + return { name: match[1].trim(), type: match[2].trim() } + } + return { name: investorString, type: "unknown" } +} + +export function parseCohortName(cohortName: string): string { + return cohortName.replace(" Product Studio", "") +} + +export function getCohortOrder(cohortName: string): number { + const match = cohortName.match(/(Winter|Fall)\s+(\d{4})/i) + if (!match) return 0 + + const season = match[1] + const year = parseInt(match[2]) + + const seasonPriority: Record = { + "Winter": 2, + "Fall": 1 + } + + return year * 10 + seasonPriority[season] +} + +export function sortProjects(projects: Project[]): Project[] { + return [...projects].sort((a, b) => { + if (a.sectionType !== b.sectionType) { + return a.sectionType === "funding" ? -1 : 1 + } + + if (a.sectionType === "funding" && b.sectionType === "funding") { + const prestigeA = getProjectPrestigeScore(a) + const prestigeB = getProjectPrestigeScore(b) + + if (prestigeA !== prestigeB) { + return prestigeB - prestigeA + } + + return a.companyName.localeCompare(b.companyName) + } + + return b.sectionOrder - a.sectionOrder + }) +} + +export function extractFilterOptions(projects: Project[]) { + const fundingSources = new Set() + const cohorts = new Set() + const categories = new Set() + + projects.forEach(project => { + if (project.sectionType === "funding" && project.sectionName) { + const topInvestor = project.investors?.[0] + if (topInvestor && + (topInvestor.type === "vc" || topInvestor.type === "accelerator")) { + fundingSources.add(project.sectionName) + } + } else if (project.sectionType === "cohort") { + cohorts.add(project.sectionName) + } + project.categories.forEach(cat => categories.add(cat)) + }) + + const sortedFundingSources = Array.from(fundingSources).sort((a, b) => { + if (a === "Y Combinator") return -1 + if (b === "Y Combinator") return 1 + return a.localeCompare(b) + }) + + return { + fundingSources: sortedFundingSources, + cohorts: Array.from(cohorts).sort((a, b) => getCohortOrder(b) - getCohortOrder(a)), + categories: Array.from(categories).sort(), + } +} + +export function filterProjects(projects: Project[], filters: { + searchQuery?: string + fundingSources?: string[] + cohorts?: string[] + categories?: string[] +}) { + return projects.filter((project) => { + const searchQuery = filters.searchQuery?.toLowerCase() || "" + const matchesSearch = + searchQuery === "" || + project.title.toLowerCase().includes(searchQuery) || + project.companyName.toLowerCase().includes(searchQuery) + + const matchesFunding = + !filters.fundingSources?.length || + (project.sectionType === "funding" && filters.fundingSources.includes(project.sectionName)) + + const matchesCohort = + !filters.cohorts?.length || + (project.sectionType === "cohort" && filters.cohorts.includes(project.sectionName)) + + const matchesCategory = + !filters.categories?.length || + project.categories.some((category) => filters.categories!.includes(category)) + + return matchesSearch && matchesFunding && matchesCohort && matchesCategory + }) +} + +export function sanitizeProjectName(name: string): string { + return name.replace(/[^a-zA-Z0-9\s.-]/g, '').replace(/\s+/g, '-').toLowerCase() +} + +export function getExtension(url: string): string { + const match = url.match(/\.([a-zA-Z0-9]+)(?:\?|$)/) + return match ? match[1].toLowerCase() : '' +} + +export function convertToJpgIfNeeded(filename: string): string { + const ext = getExtension(filename) + return (ext !== 'jpg' && ext !== 'jpeg') ? filename.replace(/\.[^.]+$/, '.jpg') : filename +} + +export function extractLogoUrl(page: any): string | null { + const logoFiles = page.properties?.logo?.files + if (!logoFiles || logoFiles.length === 0) { + return null + } + + const logoFile = logoFiles[0] + if (logoFile.type !== 'file' || !logoFile.file?.url) { + return null + } + + return logoFile.file.url +} + +export function generatePlaceholderImage(_companyName: string, size: string = "64x64"): string { + return `/founder_placeholder_pfp.jpg` +} + +export function extractPfpUrls(page: any): string[] { + const pfpFiles = page.properties?.pfps?.files + if (!pfpFiles || pfpFiles.length === 0) { + return [] + } + + const urls: string[] = [] + pfpFiles.forEach((file: any) => { + if (file.type === 'file' && file.file?.url) { + urls.push(file.file.url) + } + }) + return urls +} + +export function sanitizeFounderName(name: string): string { + return name.replace(/[^a-zA-Z0-9\s.-]/g, '').replace(/\s+/g, '-').toLowerCase() +} + +export function generateFounderImagePath(companyName: string, founderName: string): string { + const sanitizedCompany = sanitizeProjectName(companyName) + const sanitizedFounder = sanitizeFounderName(founderName) + return `/founders/${sanitizedCompany}/${sanitizedFounder}.jpg` +} + +export function sanitizeUrl(url: string | null, field: string): string | null { + if (!url) return null + + const trimmed = url.trim() + if (!trimmed) return null + + if (trimmed.startsWith('http://') || trimmed.startsWith('https://')) { + return trimmed + } + + if (!trimmed.includes('.') || trimmed.startsWith('.')) { + console.warn(`⚠️ Invalid URL format for ${field}: "${url}" - missing valid domain structure`) + return null + } + + console.log(`🔧 Sanitizing URL for ${field}: "${url}" → "https://${trimmed}"`) + return `https://${trimmed}` +} + +export function transformNotionPageToProject(page: any): Project { + const { id, properties } = page + const nameInfo = extractTitleInfo(properties.name) + + if (!nameInfo.name) { + throw new Error(`Project has no name - skipping`) + } + + const hasInvestors = properties.investors?.multi_select?.length > 0 + const foundersList = properties.founders?.multi_select || [] + const contactsList = properties.contacts?.multi_select || [] + + const rawInvestors = hasInvestors ? properties.investors.multi_select?.map((inv: any) => ({ + id: inv.id, + name: parseInvestorName(inv.name).name, + type: parseInvestorName(inv.name).type, + website: sanitizeUrl(null, `website of ${inv.name}`), + })) : undefined + + const sortedInvestors = rawInvestors ? sortInvestorsByPrestige(rawInvestors) : undefined + + const logoUrl = extractLogoUrl(page) + + if (!logoUrl) { + throw new Error(`Project "${nameInfo.name}" has no logo - failing build`) + } + + const extension = getExtension(logoUrl) + const sanitizedName = sanitizeProjectName(nameInfo.name) + const logoFilename = `${sanitizedName}.${extension}` + const convertedFilename = convertToJpgIfNeeded(logoFilename) + const logoPath = `/projects/${convertedFilename}` + + const pfpUrls = extractPfpUrls(page) + + return { + id, + title: nameInfo.name, + description: extractPlainText(properties.description), + overview: extractPlainText(properties.overview), + imageSrc: logoPath, + companyName: nameInfo.name, + companyWebsite: sanitizeUrl(properties.website?.url || nameInfo.link || null, `companyWebsite of "${nameInfo.name}"`), + categories: extractMultiSelect(properties.categories), + founders: foundersList.map((f: any, index: number) => ({ + id: f.id, + name: f.name, + role: "Founder", + imageSrc: pfpUrls[index] + ? generateFounderImagePath(nameInfo.name, f.name) + : `/founder_placeholder_pfp.jpg`, + contactUrl: sanitizeUrl(contactsList[index]?.name || null, `contactUrl of "${f.name}" in "${nameInfo.name}"`), + })) || [], + investors: sortedInvestors, + sectionType: hasInvestors ? "funding" : "cohort", + sectionName: hasInvestors + ? sortedInvestors?.[0]?.name || "" + : properties.cohort?.select?.name || "", + sectionOrder: getCohortOrder(properties.cohort?.select?.name || ""), + } +} diff --git a/next.config.mjs b/next.config.mjs index eb96ecc..94c857a 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -24,6 +24,10 @@ const nextConfig = { protocol: 'https', hostname: 'xxlvdpgngmcvkzcsatuz.supabase.co', }, + { + protocol: 'https', + hostname: 'placehold.co', + }, ], }, experimental: { @@ -31,6 +35,11 @@ const nextConfig = { parallelServerBuildTraces: true, parallelServerCompiles: true, }, + webpack: (config) => { + config.resolve.extensions.push('.json') + return config + }, + turbopack: {}, } if (userConfig) { diff --git a/package.json b/package.json index 59d2241..6276ff2 100644 --- a/package.json +++ b/package.json @@ -4,12 +4,14 @@ "private": true, "scripts": { "dev": "next dev", - "build": "next build", + "build": "dotenv -e .env.local -- tsx scripts/build-projects-data.ts && next build", + "build:projects": "dotenv -e .env.local -- tsx scripts/build-projects-data.ts", "start": "next start", "lint": "eslint . --ext .js,.jsx,.ts,.tsx" }, "dependencies": { "@hookform/resolvers": "^3.9.1", + "@notionhq/client": "^5.9.0", "@posthog/nextjs": "^0.0.2", "@radix-ui/react-accordion": "^1.2.2", "@radix-ui/react-alert-dialog": "^1.1.4", @@ -63,6 +65,7 @@ "react-resizable-panels": "^2.1.7", "recharts": "2.15.0", "resend": "^6.9.2", + "sharp": "^0.34.5", "sonner": "^1.7.1", "stripe": "^20.1.0", "supabase": "^2.34.3", @@ -81,11 +84,14 @@ "@types/react-dom": "^19", "@typescript-eslint/eslint-plugin": "^8.53.0", "@typescript-eslint/parser": "^8.53.0", + "dotenv-cli": "^11.0.0", "eslint": "^9.39.2", "eslint-config-next": "^16.1.3", "globals": "^17.0.0", "postcss": "^8", "tailwindcss": "^3.4.17", + "tsx": "^4.21.0", "typescript": "^5" - } -} \ No newline at end of file + }, + "packageManager": "pnpm@10.28.2+sha512.41872f037ad22f7348e3b1debbaf7e867cfd448f2726d9cf74c08f19507c31d2c8e7a11525b983febc2df640b5438dee6023ebb1f84ed43cc2d654d2bc326264" +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 54974df..f5fc7da 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,6 +11,9 @@ importers: '@hookform/resolvers': specifier: ^3.9.1 version: 3.10.0(react-hook-form@7.60.0(react@19.2.3)) + '@notionhq/client': + specifier: ^5.9.0 + version: 5.9.0 '@posthog/nextjs': specifier: ^0.0.2 version: 0.0.2(next@16.1.0(@babel/core@7.28.6)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)) @@ -170,6 +173,9 @@ importers: resend: specifier: ^6.9.2 version: 6.9.2 + sharp: + specifier: ^0.34.5 + version: 0.34.5 sonner: specifier: ^1.7.1 version: 1.7.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3) @@ -219,6 +225,9 @@ importers: '@typescript-eslint/parser': specifier: ^8.53.0 version: 8.53.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.8.3) + dotenv-cli: + specifier: ^11.0.0 + version: 11.0.0 eslint: specifier: ^9.39.2 version: 9.39.2(jiti@1.21.7) @@ -234,6 +243,9 @@ importers: tailwindcss: specifier: ^3.4.17 version: 3.4.17 + tsx: + specifier: ^4.21.0 + version: 4.21.0 typescript: specifier: ^5 version: 5.8.3 @@ -327,6 +339,162 @@ packages: '@emnapi/wasi-threads@1.1.0': resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + '@esbuild/aix-ppc64@0.27.3': + resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.27.3': + resolution: {integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.27.3': + resolution: {integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.27.3': + resolution: {integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.27.3': + resolution: {integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.27.3': + resolution: {integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.27.3': + resolution: {integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.27.3': + resolution: {integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.27.3': + resolution: {integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.27.3': + resolution: {integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.27.3': + resolution: {integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.27.3': + resolution: {integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.27.3': + resolution: {integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.27.3': + resolution: {integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.27.3': + resolution: {integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.27.3': + resolution: {integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.27.3': + resolution: {integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.27.3': + resolution: {integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.27.3': + resolution: {integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.27.3': + resolution: {integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.3': + resolution: {integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.27.3': + resolution: {integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.27.3': + resolution: {integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.27.3': + resolution: {integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.27.3': + resolution: {integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.27.3': + resolution: {integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.9.1': resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -431,89 +599,105 @@ packages: resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-arm@1.2.4': resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-ppc64@1.2.4': resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} cpu: [ppc64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-riscv64@1.2.4': resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} cpu: [riscv64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-s390x@1.2.4': resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-x64@1.2.4': resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linuxmusl-arm64@1.2.4': resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.2.4': resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-linux-arm64@0.34.5': resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-linux-arm@0.34.5': resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-linux-ppc64@0.34.5': resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ppc64] os: [linux] + libc: [glibc] '@img/sharp-linux-riscv64@0.34.5': resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [riscv64] os: [linux] + libc: [glibc] '@img/sharp-linux-s390x@0.34.5': resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-linux-x64@0.34.5': resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-linuxmusl-arm64@0.34.5': resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-linuxmusl-x64@0.34.5': resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-wasm32@0.34.5': resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} @@ -604,24 +788,28 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@next/swc-linux-arm64-musl@16.1.0': resolution: {integrity: sha512-TojQnDRoX7wJWXEEwdfuJtakMDW64Q7NrxQPviUnfYJvAx5/5wcGE+1vZzQ9F17m+SdpFeeXuOr6v3jbyusYMQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@next/swc-linux-x64-gnu@16.1.0': resolution: {integrity: sha512-quhNFVySW4QwXiZkZ34SbfzNBm27vLrxZ2HwTfFFO1BBP0OY1+pI0nbyewKeq1FriqU+LZrob/cm26lwsiAi8Q==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@next/swc-linux-x64-musl@16.1.0': resolution: {integrity: sha512-6JW0z2FZUK5iOVhUIWqE4RblAhUj1EwhZ/MwteGb//SpFTOHydnhbp3868gxalwea+mbOLWO6xgxj9wA9wNvNw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@next/swc-win32-arm64-msvc@16.1.0': resolution: {integrity: sha512-+DK/akkAvvXn5RdYN84IOmLkSy87SCmpofJPdB8vbLmf01BzntPBSYXnMvnEEv/Vcf3HYJwt24QZ/s6sWAwOMQ==} @@ -651,6 +839,10 @@ packages: resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} engines: {node: '>=12.4.0'} + '@notionhq/client@5.9.0': + resolution: {integrity: sha512-TvAVMfwtVv61hsPrRfB9ehgzSjX6DaAi1ZRAnpg8xFjzaXhzhEfbO0PhBRm3ecSv1azDuO2kBuyQHh2/z7G4YQ==} + engines: {node: '>=18'} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -1552,41 +1744,49 @@ packages: resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} cpu: [arm64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-arm64-musl@1.11.1': resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} cpu: [arm64] os: [linux] + libc: [musl] '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} cpu: [ppc64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} cpu: [riscv64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} cpu: [riscv64] os: [linux] + libc: [musl] '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} cpu: [s390x] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-x64-gnu@1.11.1': resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} cpu: [x64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-x64-musl@1.11.1': resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} cpu: [x64] os: [linux] + libc: [musl] '@unrs/resolver-binding-wasm32-wasi@1.11.1': resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} @@ -2056,6 +2256,22 @@ packages: domutils@3.2.2: resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + dotenv-cli@11.0.0: + resolution: {integrity: sha512-r5pA8idbk7GFWuHEU7trSTflWcdBpQEK+Aw17UrSHjS6CReuhrrPcyC3zcQBPQvhArRHnBo/h6eLH1fkCvNlww==} + hasBin: true + + dotenv-expand@12.0.3: + resolution: {integrity: sha512-uc47g4b+4k/M/SeaW1y4OApx+mtLWl92l5LMPP0GNXctZqELk+YGgOPIIC5elYmUH4OuoK3JLhuRUYegeySiFA==} + engines: {node: '>=12'} + + dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + engines: {node: '>=12'} + + dotenv@17.2.4: + resolution: {integrity: sha512-mudtfb4zRB4bVvdj0xRo+e6duH1csJRM8IukBqfTRvHotn9+LBXB8ynAidP9zHqoRC/fsllXgk4kCKlR21fIhw==} + engines: {node: '>=12'} + draco3d@1.5.7: resolution: {integrity: sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==} @@ -2131,6 +2347,11 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} + esbuild@0.27.3: + resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -3541,6 +3762,11 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsx@4.21.0: + resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} + engines: {node: '>=18.0.0'} + hasBin: true + tunnel-rat@0.1.2: resolution: {integrity: sha512-lR5VHmkPhzdhrM092lI2nACsLO4QubF0/yoOhzX7c+wIpbN1GjHNzCc91QlpxBi+cnx8vVJ+Ur6vL5cEoQPFpQ==} @@ -3900,6 +4126,84 @@ snapshots: tslib: 2.8.1 optional: true + '@esbuild/aix-ppc64@0.27.3': + optional: true + + '@esbuild/android-arm64@0.27.3': + optional: true + + '@esbuild/android-arm@0.27.3': + optional: true + + '@esbuild/android-x64@0.27.3': + optional: true + + '@esbuild/darwin-arm64@0.27.3': + optional: true + + '@esbuild/darwin-x64@0.27.3': + optional: true + + '@esbuild/freebsd-arm64@0.27.3': + optional: true + + '@esbuild/freebsd-x64@0.27.3': + optional: true + + '@esbuild/linux-arm64@0.27.3': + optional: true + + '@esbuild/linux-arm@0.27.3': + optional: true + + '@esbuild/linux-ia32@0.27.3': + optional: true + + '@esbuild/linux-loong64@0.27.3': + optional: true + + '@esbuild/linux-mips64el@0.27.3': + optional: true + + '@esbuild/linux-ppc64@0.27.3': + optional: true + + '@esbuild/linux-riscv64@0.27.3': + optional: true + + '@esbuild/linux-s390x@0.27.3': + optional: true + + '@esbuild/linux-x64@0.27.3': + optional: true + + '@esbuild/netbsd-arm64@0.27.3': + optional: true + + '@esbuild/netbsd-x64@0.27.3': + optional: true + + '@esbuild/openbsd-arm64@0.27.3': + optional: true + + '@esbuild/openbsd-x64@0.27.3': + optional: true + + '@esbuild/openharmony-arm64@0.27.3': + optional: true + + '@esbuild/sunos-x64@0.27.3': + optional: true + + '@esbuild/win32-arm64@0.27.3': + optional: true + + '@esbuild/win32-ia32@0.27.3': + optional: true + + '@esbuild/win32-x64@0.27.3': + optional: true + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.2(jiti@1.21.7))': dependencies: eslint: 9.39.2(jiti@1.21.7) @@ -3978,8 +4282,7 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} - '@img/colour@1.0.0': - optional: true + '@img/colour@1.0.0': {} '@img/sharp-darwin-arm64@0.34.5': optionalDependencies: @@ -4171,6 +4474,8 @@ snapshots: '@nolyfill/is-core-module@1.0.39': {} + '@notionhq/client@5.9.0': {} + '@pkgjs/parseargs@0.11.0': optional: true @@ -5687,6 +5992,21 @@ snapshots: domelementtype: 2.3.0 domhandler: 5.0.3 + dotenv-cli@11.0.0: + dependencies: + cross-spawn: 7.0.6 + dotenv: 17.2.4 + dotenv-expand: 12.0.3 + minimist: 1.2.8 + + dotenv-expand@12.0.3: + dependencies: + dotenv: 16.6.1 + + dotenv@16.6.1: {} + + dotenv@17.2.4: {} + draco3d@1.5.7: {} dunder-proto@1.0.1: @@ -5824,6 +6144,35 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 + esbuild@0.27.3: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.3 + '@esbuild/android-arm': 0.27.3 + '@esbuild/android-arm64': 0.27.3 + '@esbuild/android-x64': 0.27.3 + '@esbuild/darwin-arm64': 0.27.3 + '@esbuild/darwin-x64': 0.27.3 + '@esbuild/freebsd-arm64': 0.27.3 + '@esbuild/freebsd-x64': 0.27.3 + '@esbuild/linux-arm': 0.27.3 + '@esbuild/linux-arm64': 0.27.3 + '@esbuild/linux-ia32': 0.27.3 + '@esbuild/linux-loong64': 0.27.3 + '@esbuild/linux-mips64el': 0.27.3 + '@esbuild/linux-ppc64': 0.27.3 + '@esbuild/linux-riscv64': 0.27.3 + '@esbuild/linux-s390x': 0.27.3 + '@esbuild/linux-x64': 0.27.3 + '@esbuild/netbsd-arm64': 0.27.3 + '@esbuild/netbsd-x64': 0.27.3 + '@esbuild/openbsd-arm64': 0.27.3 + '@esbuild/openbsd-x64': 0.27.3 + '@esbuild/openharmony-arm64': 0.27.3 + '@esbuild/sunos-x64': 0.27.3 + '@esbuild/win32-arm64': 0.27.3 + '@esbuild/win32-ia32': 0.27.3 + '@esbuild/win32-x64': 0.27.3 + escalade@3.2.0: {} escape-string-regexp@4.0.0: {} @@ -7075,7 +7424,6 @@ snapshots: '@img/sharp-win32-arm64': 0.34.5 '@img/sharp-win32-ia32': 0.34.5 '@img/sharp-win32-x64': 0.34.5 - optional: true shebang-command@2.0.0: dependencies: @@ -7368,6 +7716,13 @@ snapshots: tslib@2.8.1: {} + tsx@4.21.0: + dependencies: + esbuild: 0.27.3 + get-tsconfig: 4.13.0 + optionalDependencies: + fsevents: 2.3.3 + tunnel-rat@0.1.2(@types/react@19.2.2)(react@19.2.3): dependencies: zustand: 4.5.7(@types/react@19.2.2)(react@19.2.3) diff --git a/public/founder_placeholder_pfp.jpg b/public/founder_placeholder_pfp.jpg new file mode 100644 index 0000000..1582001 Binary files /dev/null and b/public/founder_placeholder_pfp.jpg differ diff --git a/public/founders/0xknowledge/ammar-ateya.jpg b/public/founders/0xknowledge/ammar-ateya.jpg new file mode 100644 index 0000000..1aad96a Binary files /dev/null and b/public/founders/0xknowledge/ammar-ateya.jpg differ diff --git a/public/founders/0xknowledge/joshua-sum.jpg b/public/founders/0xknowledge/joshua-sum.jpg new file mode 100644 index 0000000..297a5bd Binary files /dev/null and b/public/founders/0xknowledge/joshua-sum.jpg differ diff --git a/public/founders/accoai/lance-fuchia.jpg b/public/founders/accoai/lance-fuchia.jpg new file mode 100644 index 0000000..367d140 Binary files /dev/null and b/public/founders/accoai/lance-fuchia.jpg differ diff --git a/public/founders/agentmail/adi-singh.jpg b/public/founders/agentmail/adi-singh.jpg new file mode 100644 index 0000000..c65f5ca Binary files /dev/null and b/public/founders/agentmail/adi-singh.jpg differ diff --git a/public/founders/agentmail/haakam-aujla.jpg b/public/founders/agentmail/haakam-aujla.jpg new file mode 100644 index 0000000..0dd2794 Binary files /dev/null and b/public/founders/agentmail/haakam-aujla.jpg differ diff --git a/public/founders/agentmail/michael-hyun-kim.jpg b/public/founders/agentmail/michael-hyun-kim.jpg new file mode 100644 index 0000000..b7c61ae Binary files /dev/null and b/public/founders/agentmail/michael-hyun-kim.jpg differ diff --git a/public/founders/batch/aryan-shah.jpg b/public/founders/batch/aryan-shah.jpg new file mode 100644 index 0000000..23530dd Binary files /dev/null and b/public/founders/batch/aryan-shah.jpg differ diff --git a/public/founders/batch/sanjit-vijay.jpg b/public/founders/batch/sanjit-vijay.jpg new file mode 100644 index 0000000..258f5ea Binary files /dev/null and b/public/founders/batch/sanjit-vijay.jpg differ diff --git a/public/founders/closet-swap/diya-mahaveer.jpg b/public/founders/closet-swap/diya-mahaveer.jpg new file mode 100644 index 0000000..cb2cb27 Binary files /dev/null and b/public/founders/closet-swap/diya-mahaveer.jpg differ diff --git a/public/founders/closet-swap/hana-ahmed.jpg b/public/founders/closet-swap/hana-ahmed.jpg new file mode 100644 index 0000000..41a849f Binary files /dev/null and b/public/founders/closet-swap/hana-ahmed.jpg differ diff --git a/public/founders/closet-swap/meghna-reddy.jpg b/public/founders/closet-swap/meghna-reddy.jpg new file mode 100644 index 0000000..ed4194c Binary files /dev/null and b/public/founders/closet-swap/meghna-reddy.jpg differ diff --git a/public/founders/closet-swap/shriya-kankatala.jpg b/public/founders/closet-swap/shriya-kankatala.jpg new file mode 100644 index 0000000..73a5f7e Binary files /dev/null and b/public/founders/closet-swap/shriya-kankatala.jpg differ diff --git a/public/founders/codefy.ai/brian-z-travis.jpg b/public/founders/codefy.ai/brian-z-travis.jpg new file mode 100644 index 0000000..d795df5 Binary files /dev/null and b/public/founders/codefy.ai/brian-z-travis.jpg differ diff --git a/public/founders/codefy.ai/cooper-saye.jpg b/public/founders/codefy.ai/cooper-saye.jpg new file mode 100644 index 0000000..050f093 Binary files /dev/null and b/public/founders/codefy.ai/cooper-saye.jpg differ diff --git a/public/founders/codetrace/david-mazur.jpg b/public/founders/codetrace/david-mazur.jpg new file mode 100644 index 0000000..fed3f93 Binary files /dev/null and b/public/founders/codetrace/david-mazur.jpg differ diff --git a/public/founders/courtline/amy-liu.jpg b/public/founders/courtline/amy-liu.jpg new file mode 100644 index 0000000..e34e381 Binary files /dev/null and b/public/founders/courtline/amy-liu.jpg differ diff --git a/public/founders/courtline/joshua-lee.jpg b/public/founders/courtline/joshua-lee.jpg new file mode 100644 index 0000000..4e1ec3e Binary files /dev/null and b/public/founders/courtline/joshua-lee.jpg differ diff --git a/public/founders/cyberwright/jacob-chen.jpg b/public/founders/cyberwright/jacob-chen.jpg new file mode 100644 index 0000000..d9c7833 Binary files /dev/null and b/public/founders/cyberwright/jacob-chen.jpg differ diff --git a/public/founders/dezu/luke-zhu.jpg b/public/founders/dezu/luke-zhu.jpg new file mode 100644 index 0000000..92f8e22 Binary files /dev/null and b/public/founders/dezu/luke-zhu.jpg differ diff --git a/public/founders/dezu/riya-dev.jpg b/public/founders/dezu/riya-dev.jpg new file mode 100644 index 0000000..1c024d0 Binary files /dev/null and b/public/founders/dezu/riya-dev.jpg differ diff --git a/public/founders/embedder/bob-wei.jpg b/public/founders/embedder/bob-wei.jpg new file mode 100644 index 0000000..b1046b0 Binary files /dev/null and b/public/founders/embedder/bob-wei.jpg differ diff --git a/public/founders/embedder/ethan-gibbs.jpg b/public/founders/embedder/ethan-gibbs.jpg new file mode 100644 index 0000000..1d54e26 Binary files /dev/null and b/public/founders/embedder/ethan-gibbs.jpg differ diff --git a/public/founders/find-blue/owen-lennon.jpg b/public/founders/find-blue/owen-lennon.jpg new file mode 100644 index 0000000..59cd9a8 Binary files /dev/null and b/public/founders/find-blue/owen-lennon.jpg differ diff --git a/public/founders/ghost-kitchen-finder/alexis-gu.jpg b/public/founders/ghost-kitchen-finder/alexis-gu.jpg new file mode 100644 index 0000000..f3a3af2 Binary files /dev/null and b/public/founders/ghost-kitchen-finder/alexis-gu.jpg differ diff --git a/public/founders/hair-haven/om-joshi.jpg b/public/founders/hair-haven/om-joshi.jpg new file mode 100644 index 0000000..74d736b Binary files /dev/null and b/public/founders/hair-haven/om-joshi.jpg differ diff --git a/public/founders/infralens/diego-paredes.jpg b/public/founders/infralens/diego-paredes.jpg new file mode 100644 index 0000000..386bb5a Binary files /dev/null and b/public/founders/infralens/diego-paredes.jpg differ diff --git a/public/founders/manu.ai/jonathan-mo.jpg b/public/founders/manu.ai/jonathan-mo.jpg new file mode 100644 index 0000000..b50472e Binary files /dev/null and b/public/founders/manu.ai/jonathan-mo.jpg differ diff --git a/public/founders/manu.ai/leo-liu.jpg b/public/founders/manu.ai/leo-liu.jpg new file mode 100644 index 0000000..256ff85 Binary files /dev/null and b/public/founders/manu.ai/leo-liu.jpg differ diff --git a/public/founders/meetingbrew/brian-z-travis.jpg b/public/founders/meetingbrew/brian-z-travis.jpg new file mode 100644 index 0000000..d795df5 Binary files /dev/null and b/public/founders/meetingbrew/brian-z-travis.jpg differ diff --git a/public/founders/meetingbrew/cooper-saye.jpg b/public/founders/meetingbrew/cooper-saye.jpg new file mode 100644 index 0000000..050f093 Binary files /dev/null and b/public/founders/meetingbrew/cooper-saye.jpg differ diff --git a/public/founders/meetyourclass/blake-mischley.jpg b/public/founders/meetyourclass/blake-mischley.jpg new file mode 100644 index 0000000..e0623ca Binary files /dev/null and b/public/founders/meetyourclass/blake-mischley.jpg differ diff --git a/public/founders/meetyourclass/jon-millar.jpg b/public/founders/meetyourclass/jon-millar.jpg new file mode 100644 index 0000000..c4e7762 Binary files /dev/null and b/public/founders/meetyourclass/jon-millar.jpg differ diff --git a/public/founders/meetyourclass/jonah-liss.jpg b/public/founders/meetyourclass/jonah-liss.jpg new file mode 100644 index 0000000..e988179 Binary files /dev/null and b/public/founders/meetyourclass/jonah-liss.jpg differ diff --git a/public/founders/meetyourclass/kaleb-schmottlach.jpg b/public/founders/meetyourclass/kaleb-schmottlach.jpg new file mode 100644 index 0000000..f1c881a Binary files /dev/null and b/public/founders/meetyourclass/kaleb-schmottlach.jpg differ diff --git a/public/founders/milieu/nathan-shatz.jpg b/public/founders/milieu/nathan-shatz.jpg new file mode 100644 index 0000000..1a2e1f5 Binary files /dev/null and b/public/founders/milieu/nathan-shatz.jpg differ diff --git a/public/founders/milieu/ronil-chaudhary.jpg b/public/founders/milieu/ronil-chaudhary.jpg new file mode 100644 index 0000000..bc4f289 Binary files /dev/null and b/public/founders/milieu/ronil-chaudhary.jpg differ diff --git a/public/founders/museaic/casey-feng.jpg b/public/founders/museaic/casey-feng.jpg new file mode 100644 index 0000000..f54153d Binary files /dev/null and b/public/founders/museaic/casey-feng.jpg differ diff --git a/public/founders/nexxus-labs/leo-gao.jpg b/public/founders/nexxus-labs/leo-gao.jpg new file mode 100644 index 0000000..2f50b8e Binary files /dev/null and b/public/founders/nexxus-labs/leo-gao.jpg differ diff --git a/public/founders/nudge/kritika-singh.jpg b/public/founders/nudge/kritika-singh.jpg new file mode 100644 index 0000000..508f91e Binary files /dev/null and b/public/founders/nudge/kritika-singh.jpg differ diff --git a/public/founders/nudge/pari-gulati.jpg b/public/founders/nudge/pari-gulati.jpg new file mode 100644 index 0000000..c14bae1 Binary files /dev/null and b/public/founders/nudge/pari-gulati.jpg differ diff --git a/public/founders/nudge/riya-saha.jpg b/public/founders/nudge/riya-saha.jpg new file mode 100644 index 0000000..f6c6ed5 Binary files /dev/null and b/public/founders/nudge/riya-saha.jpg differ diff --git a/public/founders/orange-slice/kishan-sripada.jpg b/public/founders/orange-slice/kishan-sripada.jpg new file mode 100644 index 0000000..29dcca2 Binary files /dev/null and b/public/founders/orange-slice/kishan-sripada.jpg differ diff --git a/public/founders/orange-slice/vihaar-nandigala.jpg b/public/founders/orange-slice/vihaar-nandigala.jpg new file mode 100644 index 0000000..fd5c738 Binary files /dev/null and b/public/founders/orange-slice/vihaar-nandigala.jpg differ diff --git a/public/founders/oreen/ben-antonow.jpg b/public/founders/oreen/ben-antonow.jpg new file mode 100644 index 0000000..0d90d4c Binary files /dev/null and b/public/founders/oreen/ben-antonow.jpg differ diff --git a/public/founders/parley/sriram-mk.jpg b/public/founders/parley/sriram-mk.jpg new file mode 100644 index 0000000..491ad6b Binary files /dev/null and b/public/founders/parley/sriram-mk.jpg differ diff --git a/public/founders/parley/toan-bui.jpg b/public/founders/parley/toan-bui.jpg new file mode 100644 index 0000000..e25672f Binary files /dev/null and b/public/founders/parley/toan-bui.jpg differ diff --git a/public/founders/quicksync/phoenix-sheppard.jpg b/public/founders/quicksync/phoenix-sheppard.jpg new file mode 100644 index 0000000..98d96bc Binary files /dev/null and b/public/founders/quicksync/phoenix-sheppard.jpg differ diff --git a/public/founders/quotr/divya-ponda.jpg b/public/founders/quotr/divya-ponda.jpg new file mode 100644 index 0000000..aa095dc Binary files /dev/null and b/public/founders/quotr/divya-ponda.jpg differ diff --git a/public/founders/quotr/roshni-koduri.jpg b/public/founders/quotr/roshni-koduri.jpg new file mode 100644 index 0000000..3a327c9 Binary files /dev/null and b/public/founders/quotr/roshni-koduri.jpg differ diff --git a/public/founders/quotr/soham-salunke.jpg b/public/founders/quotr/soham-salunke.jpg new file mode 100644 index 0000000..967c05b Binary files /dev/null and b/public/founders/quotr/soham-salunke.jpg differ diff --git a/public/founders/repconnect/arhan-kaul.jpg b/public/founders/repconnect/arhan-kaul.jpg new file mode 100644 index 0000000..36002b1 Binary files /dev/null and b/public/founders/repconnect/arhan-kaul.jpg differ diff --git a/public/founders/rushlink/gavin-schwartz.jpg b/public/founders/rushlink/gavin-schwartz.jpg new file mode 100644 index 0000000..e610aea Binary files /dev/null and b/public/founders/rushlink/gavin-schwartz.jpg differ diff --git a/public/founders/rushlink/zachary-joelson.jpg b/public/founders/rushlink/zachary-joelson.jpg new file mode 100644 index 0000000..1b73e42 Binary files /dev/null and b/public/founders/rushlink/zachary-joelson.jpg differ diff --git a/public/founders/shade/brandon-fan.jpg b/public/founders/shade/brandon-fan.jpg new file mode 100644 index 0000000..0a4f63d Binary files /dev/null and b/public/founders/shade/brandon-fan.jpg differ diff --git a/public/founders/shade/bright-xu.jpg b/public/founders/shade/bright-xu.jpg new file mode 100644 index 0000000..f114cb2 Binary files /dev/null and b/public/founders/shade/bright-xu.jpg differ diff --git a/public/founders/shade/edison-chiu.jpg b/public/founders/shade/edison-chiu.jpg new file mode 100644 index 0000000..7d615f8 Binary files /dev/null and b/public/founders/shade/edison-chiu.jpg differ diff --git a/public/founders/shade/gurish-sharma.jpg b/public/founders/shade/gurish-sharma.jpg new file mode 100644 index 0000000..71f4cb5 Binary files /dev/null and b/public/founders/shade/gurish-sharma.jpg differ diff --git a/public/founders/skope/ben-smith.jpg b/public/founders/skope/ben-smith.jpg new file mode 100644 index 0000000..00f9805 Binary files /dev/null and b/public/founders/skope/ben-smith.jpg differ diff --git a/public/founders/skope/connor-park.jpg b/public/founders/skope/connor-park.jpg new file mode 100644 index 0000000..c3885ca Binary files /dev/null and b/public/founders/skope/connor-park.jpg differ diff --git a/public/founders/temp8/jeffery-wu.jpg b/public/founders/temp8/jeffery-wu.jpg new file mode 100644 index 0000000..b52daaa Binary files /dev/null and b/public/founders/temp8/jeffery-wu.jpg differ diff --git a/public/founders/temp8/maya-malik.jpg b/public/founders/temp8/maya-malik.jpg new file mode 100644 index 0000000..d7e896a Binary files /dev/null and b/public/founders/temp8/maya-malik.jpg differ diff --git a/public/founders/tour.video/kishan-sripada.jpg b/public/founders/tour.video/kishan-sripada.jpg new file mode 100644 index 0000000..29dcca2 Binary files /dev/null and b/public/founders/tour.video/kishan-sripada.jpg differ diff --git a/public/projects-data.json b/public/projects-data.json new file mode 100644 index 0000000..2f8487a --- /dev/null +++ b/public/projects-data.json @@ -0,0 +1,1614 @@ +{ + "timestamp": "2026-02-19T20:36:20.500Z", + "projects": [ + { + "id": "30082307-c07d-811a-984b-f34ec0487dc0", + "title": "AgentMail", + "description": "Email Inboxes for AI Agents", + "overview": "AgentMail is the email inbox API for AI agents. It gives agents their own email inboxes, like Gmail does for humans. Unlike other email APIs, AgentMail provides fully-managed, persistent inboxes that handle parsing, threading, labeling, searching, and replying so agents get the same email experience as humans.", + "imageSrc": "/projects/agentmail.jpg", + "companyName": "AgentMail", + "companyWebsite": "https://agentmail.to", + "categories": [ + "AI/ML", + "B2B", + "Developer Tools" + ], + "founders": [ + { + "id": "OLYE", + "name": "Michael Hyun Kim", + "role": "Founder", + "imageSrc": "/founders/agentmail/michael-hyun-kim.jpg", + "contactUrl": "https://www.linkedin.com/in/haaaujla" + }, + { + "id": "ceca65bc-8199-40f8-ad3c-02a229924717", + "name": "Adi Singh", + "role": "Founder", + "imageSrc": "/founders/agentmail/adi-singh.jpg", + "contactUrl": "https://www.linkedin.com/in/michaelhyunkim" + }, + { + "id": "cf916633-c730-49dc-a750-ad4a4a9e402a", + "name": "Haakam Aujla", + "role": "Founder", + "imageSrc": "/founders/agentmail/haakam-aujla.jpg", + "contactUrl": "https://www.linkedin.com/in/adivirsingh13" + } + ], + "investors": [ + { + "id": "Y;gc", + "name": "Y Combinator", + "type": "accelerator", + "website": null + }, + { + "id": "u\\HC", + "name": "General Catalyst", + "type": "vc", + "website": null + }, + { + "id": "avlv", + "name": "Agent Fund", + "type": "vc", + "website": null + }, + { + "id": "ZDXM", + "name": "Karim Atiyeh", + "type": "angel", + "website": null + }, + { + "id": "aHGk", + "name": "Paul Copplestone", + "type": "angel", + "website": null + }, + { + "id": "ZcdQ", + "name": "Paul Graham", + "type": "angel", + "website": null + }, + { + "id": "zyg[", + "name": "Pioneer Fund", + "type": "vc", + "website": null + } + ], + "sectionType": "funding", + "sectionName": "Y Combinator", + "sectionOrder": 20252 + }, + { + "id": "30082307-c07d-810e-80bb-cc5bc6fb8b87", + "title": "Orange Slice", + "description": "Agentic sales enrichment spreadsheet", + "overview": "Orange Slice is a spreadsheet where every column is TypeScript—and AI writes it for you. Describe what you want in chat ('find the CEO's LinkedIn and get their email'), and we generate the code, create the columns, and run it across thousands of rows. Our fully-typed SDK has 100+ enrichments built in: LinkedIn, contact info, company data, web scraping, AI research.", + "imageSrc": "/projects/orange-slice.jpg", + "companyName": "Orange Slice", + "companyWebsite": "https://orangeslice.ai", + "categories": [ + "AI/ML", + "B2B", + "Sales" + ], + "founders": [ + { + "id": "HyeX", + "name": "Vihaar Nandigala", + "role": "Founder", + "imageSrc": "/founders/orange-slice/vihaar-nandigala.jpg", + "contactUrl": "https://www.linkedin.com/in/vihaarnandigala" + }, + { + "id": "s|PY", + "name": "Kishan Sripada", + "role": "Founder", + "imageSrc": "/founders/orange-slice/kishan-sripada.jpg", + "contactUrl": "https://www.linkedin.com/in/kishansripada" + } + ], + "investors": [ + { + "id": "Y;gc", + "name": "Y Combinator", + "type": "accelerator", + "website": null + }, + { + "id": "gzoU", + "name": "Lobster Capital", + "type": "vc", + "website": null + }, + { + "id": "|I_C", + "name": "Moxxie Ventures", + "type": "vc", + "website": null + }, + { + "id": "ZcdQ", + "name": "Paul Graham", + "type": "angel", + "website": null + }, + { + "id": "_scK", + "name": "Transpose Platform Management", + "type": "vc", + "website": null + } + ], + "sectionType": "funding", + "sectionName": "Y Combinator", + "sectionOrder": 20252 + }, + { + "id": "30082307-c07d-8171-ac2f-c360d74e6195", + "title": "Embedder", + "description": "Cursor for Firmware", + "overview": "Embedder is a coding agent that can write, test, and debug firmware on both physical and simulated hardware. Supporting 20+ MCU/SoC platforms, it accelerates embedded systems development across semiconductors, automotive, medical devices, aerospace, IoT, and consumer electronics.", + "imageSrc": "/projects/embedder.jpg", + "companyName": "Embedder", + "companyWebsite": "https://www.embedder.com", + "categories": [ + "AI/ML", + "Developer Tools", + "B2B" + ], + "founders": [ + { + "id": "e5bfd314-1726-4b6b-a989-9008a080c385", + "name": "Ethan Gibbs", + "role": "Founder", + "imageSrc": "/founders/embedder/ethan-gibbs.jpg", + "contactUrl": "https://www.linkedin.com/in/etgibbs" + }, + { + "id": "6b4e5107-9832-4b4d-883d-aca6cecd1211", + "name": "Bob Wei", + "role": "Founder", + "imageSrc": "/founders/embedder/bob-wei.jpg", + "contactUrl": "https://www.linkedin.com/in/jiachew/" + } + ], + "investors": [ + { + "id": "Y;gc", + "name": "Y Combinator", + "type": "accelerator", + "website": null + }, + { + "id": "bogq", + "name": "Z Fellows", + "type": "accelerator", + "website": null + } + ], + "sectionType": "funding", + "sectionName": "Y Combinator", + "sectionOrder": 20252 + }, + { + "id": "30082307-c07d-8123-9560-df1eacbaea39", + "title": "Skope", + "description": "Build a more profitable law firm with AI", + "overview": "Skope builds AI for core legal workflows. We will save your law firm time and help you make more money, with AI. Unlike general-purpose AI, Skope is purpose-built for legal work. We offer specialized features like document redlining and knowledge base search that other tools do not offer, as well as improved security for your data.", + "imageSrc": "/projects/skope.jpg", + "companyName": "Skope", + "companyWebsite": "https://useskope.com", + "categories": [ + "AI/ML", + "LegalTech", + "B2B" + ], + "founders": [ + { + "id": "|Q`H", + "name": "Ben Smith", + "role": "Founder", + "imageSrc": "/founders/skope/ben-smith.jpg", + "contactUrl": "https://www.linkedin.com/in/ben-smith-b15b12293" + }, + { + "id": "iJ~}", + "name": "Connor Park", + "role": "Founder", + "imageSrc": "/founders/skope/connor-park.jpg", + "contactUrl": "https://www.linkedin.com/in/connor-park24" + } + ], + "investors": [ + { + "id": "Y;gc", + "name": "Y Combinator", + "type": "accelerator", + "website": null + } + ], + "sectionType": "funding", + "sectionName": "Y Combinator", + "sectionOrder": 20252 + }, + { + "id": "30082307-c07d-810c-8576-e2e7b09c76b4", + "title": "Shade", + "description": "AI-powered media storage for creative teams", + "overview": "Shade is a seed stage startup backed by General Catalyst, Contrary, SignalFire, and Bling building the future of file storage. AI-powered media storage solution that enables creative teams to instantly sync files from anywhere.", + "imageSrc": "/projects/shade.jpg", + "companyName": "Shade", + "companyWebsite": "https://shade.inc", + "categories": [ + "AI/ML", + "Productivity", + "B2B" + ], + "founders": [ + { + "id": "ag^k", + "name": "Brandon Fan", + "role": "Founder", + "imageSrc": "/founders/shade/brandon-fan.jpg", + "contactUrl": "https://www.linkedin.com/in/brandonfan1256" + }, + { + "id": "VWzM", + "name": "Bright Xu", + "role": "Founder", + "imageSrc": "/founders/shade/bright-xu.jpg", + "contactUrl": "https://www.linkedin.com/in/brightxu" + }, + { + "id": "oLq}", + "name": "Edison Chiu", + "role": "Founder", + "imageSrc": "/founders/shade/edison-chiu.jpg", + "contactUrl": "https://www.linkedin.com/in/edison-chiu" + }, + { + "id": "c``E", + "name": "Gurish Sharma", + "role": "Founder", + "imageSrc": "/founders/shade/gurish-sharma.jpg", + "contactUrl": "https://www.linkedin.com/in/gurish-sharma-" + } + ], + "investors": [ + { + "id": "u\\HC", + "name": "General Catalyst", + "type": "vc", + "website": null + }, + { + "id": "wct=", + "name": "Contrary Capital", + "type": "vc", + "website": null + }, + { + "id": "~@", + "name": "Jeffery Wu", + "role": "Founder", + "imageSrc": "/founders/temp8/jeffery-wu.jpg", + "contactUrl": "https://www.linkedin.com/in/wujeffery/" + } + ], + "sectionType": "cohort", + "sectionName": "Winter 2024 Product Studio Cohort", + "sectionOrder": 20242 + }, + { + "id": "30082307-c07d-8114-af8b-d7603a5822bc", + "title": "Doublet", + "description": "Word transformation puzzle game", + "overview": "Word transformation puzzle game that challenges players to transform one word into another through a series of steps. Educational and entertaining word game.", + "imageSrc": "/projects/doublet.jpg", + "companyName": "Doublet", + "companyWebsite": "https://doublet-waitlist.vercel.app/", + "categories": [ + "Gaming", + "EdTech" + ], + "founders": [ + { + "id": "Tr`K", + "name": "Jaymeson Kondrat", + "role": "Founder", + "imageSrc": "/founder_placeholder_pfp.jpg", + "contactUrl": null + } + ], + "sectionType": "cohort", + "sectionName": "Winter 2024 Product Studio Cohort", + "sectionOrder": 20242 + }, + { + "id": "30082307-c07d-812b-b076-f960e2e06af1", + "title": "Nudge", + "description": "Helping you keep track of your must-visit travel spots", + "overview": "Helping you keep track of your must-visit travel spots ✈️. Personal travel planning platform that helps users organize and remember places they want to visit.", + "imageSrc": "/projects/nudge.jpg", + "companyName": "Nudge", + "companyWebsite": null, + "categories": [ + "Travel", + "Consumer", + "B2C" + ], + "founders": [ + { + "id": "e6c21113-ef01-4f3d-b6b1-ea2ffd755719", + "name": "Riya Saha", + "role": "Founder", + "imageSrc": "/founders/nudge/riya-saha.jpg", + "contactUrl": "https://www.linkedin.com/in/riya-saha-/" + }, + { + "id": "95a358bd-ece5-4056-9414-04af8ba6c786", + "name": "Pari Gulati", + "role": "Founder", + "imageSrc": "/founders/nudge/pari-gulati.jpg", + "contactUrl": "https://www.linkedin.com/in/pari-gulati/" + }, + { + "id": "c0ba1449-7aef-4cad-b1da-520f878ca1a9", + "name": "Kritika Singh", + "role": "Founder", + "imageSrc": "/founders/nudge/kritika-singh.jpg", + "contactUrl": "https://www.linkedin.com/in/kritika-singhh/" + } + ], + "sectionType": "cohort", + "sectionName": "Winter 2024 Product Studio Cohort", + "sectionOrder": 20242 + }, + { + "id": "30082307-c07d-8143-87b3-e5d6fb09356a", + "title": "RushLink", + "description": "Live event experience for college campuses", + "overview": "Bringing the Rush of Live Events to College Campuses", + "imageSrc": "/projects/rushlink.jpg", + "companyName": "RushLink", + "companyWebsite": "https://therushlink.com/", + "categories": [ + "Events", + "Social", + "B2C" + ], + "founders": [ + { + "id": "bi { + const tempPath = join(tmpdir(), `temp-logo-${Date.now()}`) + + return new Promise((resolve, reject) => { + const fileStream = createWriteStream(tempPath) + + https.get(url, (response) => { + if (response.statusCode !== 200) { + fileStream.destroy() + reject(new Error(`Failed to download logo: ${response.statusCode}`)) + return + } + + response.pipe(fileStream) + fileStream.on('finish', async () => { + fileStream.close() + try { + await sharp(tempPath) + .resize(256, 256, { fit: 'inside', withoutEnlargement: true }) + .jpeg({ quality: 90 }) + .toFile(outputPath) + unlinkSync(tempPath) + resolve() + } catch (error) { + unlinkSync(tempPath) + reject(error) + } + }) + fileStream.on('error', (err: Error) => { + fileStream.destroy() + reject(err) + }) + }).on('error', (err: Error) => { + fileStream.destroy() + reject(err) + }) + }) +} + +function extractPfpUrls(page: any): string[] { + const pfpFiles = page.properties?.pfps?.files + if (!pfpFiles || pfpFiles.length === 0) { + return [] + } + + const urls: string[] = [] + pfpFiles.forEach((file: any) => { + if (file.type === 'file' && file.file?.url) { + urls.push(file.file.url) + } + }) + return urls +} + +async function downloadFounderProfile(pfpUrl: string, outputPath: string): Promise { + const tempPath = join(tmpdir(), `temp-founder-${Date.now()}`) + + return new Promise((resolve, reject) => { + const fileStream = createWriteStream(tempPath) + + https.get(pfpUrl, (response) => { + if (response.statusCode !== 200) { + fileStream.destroy() + reject(new Error(`Failed to download founder profile: ${response.statusCode}`)) + return + } + + response.pipe(fileStream) + fileStream.on('finish', async () => { + fileStream.close() + try { + await sharp(tempPath) + .resize(256, 256, { fit: 'inside', withoutEnlargement: true }) + .jpeg({ quality: 90 }) + .toFile(outputPath) + unlinkSync(tempPath) + resolve() + } catch (error) { + unlinkSync(tempPath) + reject(error) + } + }) + fileStream.on('error', (err: Error) => { + fileStream.destroy() + reject(err) + }) + }).on('error', (err: Error) => { + fileStream.destroy() + reject(err) + }) + }) +} + +function getProjectFoundersPath(project: any): string { + const name = project.properties?.name?.title?.[0]?.text?.content || "" + const sanitizedName = sanitizeProjectName(name) + return join(__dirname, `../public/founders/${sanitizedName}`) +} + +async function buildProjectsData() { + console.log("🚀 Starting projects data build...") + + if (!process.env.NOTION_API_KEY) { + console.error("❌ NOTION_API_KEY not found in environment variables") + process.exit(1) + } + + if (!process.env.NOTION_DATA_SOURCE_ID) { + console.error("❌ NOTION_DATA_SOURCE_ID not found in environment variables") + process.exit(1) + } + + try { + console.log("📥 Fetching data from Notion...") + const response = await notion.dataSources.query({ + data_source_id: process.env.NOTION_DATA_SOURCE_ID!, + }) + + const pages = response.results || [] + console.log(`✅ Fetched ${pages.length} pages from Notion`) + + console.log("🔄 Creating URL map...") + const logoUrlMap: Record = {} + pages.forEach((page: any) => { + const logoUrl = extractLogoUrl(page) + if (logoUrl) { + logoUrlMap[page.id] = logoUrl + } + }) + + console.log("🔄 Transforming pages to projects...") + const transformedProjects: any[] = [] + const skippedPages: any[] = [] + + for (const page of pages) { + try { + const project = transformNotionPageToProject(page) + transformedProjects.push(project) + } catch (error) { + const errorMessage = (error as Error).message + if (errorMessage.includes('no name')) { + skippedPages.push(page) + console.log(`⏭️ Skipping page with no name`) + } else { + throw error + } + } + } + + const allProjects = transformedProjects + console.log(`✅ Transformed ${allProjects.length} projects (skipped ${skippedPages.length} invalid pages)`) + + console.log("📊 Sorting projects...") + const sortedProjects = sortProjects(allProjects) + + console.log("🏷️ Extracting filter options...") + const filterOptions = extractFilterOptions(sortedProjects) + + const projectsDir = join(__dirname, "../public/projects") + if (!existsSync(projectsDir)) { + mkdirSync(projectsDir, { recursive: true }) + console.log(`📁 Created directory: ${projectsDir}`) + } + + console.log("📥 Downloading logos...") + let downloadedCount = 0 + let failedCount = 0 + + for (const project of allProjects) { + const logoPath = join(__dirname, `../public${project.imageSrc}`) + const notionUrl = logoUrlMap[project.id] + + if (!project.imageSrc.startsWith('/projects/')) { + console.error(`❌ Project "${project.title}" has no logo - failing build`) + process.exit(1) + } + + if (!notionUrl) { + console.error(`⚠️ Failed to download logo for "${project.title}": No Notion URL found`) + failedCount++ + continue + } + + try { + await downloadLogo(notionUrl, logoPath) + downloadedCount++ + const progress = Math.floor((downloadedCount / allProjects.length) * 100) + process.stdout.write(`\r📥 Downloading logos... [${'█'.repeat(Math.floor(progress / 2.5))}${'░'.repeat(40 - Math.floor(progress / 2.5))}] ${progress}% (${downloadedCount}/${allProjects.length})`) + } catch (error) { + failedCount++ + console.error(`⚠️ Failed to download logo for "${project.title}": ${(error as Error).message}`) + } + } + + console.log(`\n✅ Downloaded ${downloadedCount} logos to ${projectsDir}/`) + if (failedCount > 0) { + console.log(`⚠️ Failed to download ${failedCount} logos`) + } + + console.log("🔄 Extracting founder profile picture URLs...") + const pfpUrlMap: Record = {} + pages.forEach((page: any) => { + pfpUrlMap[page.id] = extractPfpUrls(page) + }) + + const foundersDir = join(__dirname, "../public/founders") + if (!existsSync(foundersDir)) { + mkdirSync(foundersDir, { recursive: true }) + console.log(`📁 Created directory: ${foundersDir}`) + } + + console.log("📥 Downloading founder profile pictures...") + let downloadedFounders = 0 + let skippedFounders = 0 + let failedFounders = 0 + let totalFounders = 0 + + allProjects.forEach(project => { + totalFounders += project.founders.length + }) + + let founderProgress = 0 + + for (const project of allProjects) { + const projectFoundersPath = getProjectFoundersPath({ + properties: { + name: { + title: [{ text: { content: project.companyName } }] + } + } + }) + const pfpUrls = pfpUrlMap[project.id] || [] + + if (!existsSync(projectFoundersPath)) { + mkdirSync(projectFoundersPath, { recursive: true }) + } + + for (const [index, founder] of project.founders.entries()) { + const pfpUrl = pfpUrls[index] + + if (!pfpUrl || founder.imageSrc.includes('founder_placeholder_pfp.jpg')) { + skippedFounders++ + founderProgress++ + continue + } + + const outputPath = join(__dirname, `../public${founder.imageSrc}`) + + if (existsSync(outputPath)) { + skippedFounders++ + founderProgress++ + continue + } + + try { + await downloadFounderProfile(pfpUrl, outputPath) + downloadedFounders++ + founderProgress++ + const progress = Math.floor((founderProgress / totalFounders) * 100) + process.stdout.write(`\r📥 Downloading founders... [${'█'.repeat(Math.floor(progress / 2.5))}${'░'.repeat(40 - Math.floor(progress / 2.5))}] ${progress}% (${founderProgress}/${totalFounders})`) + } catch (error) { + failedFounders++ + console.error(`\n⚠️ Failed to download founder profile for "${founder.name}" in "${project.title}": ${(error as Error).message}`) + } + } + } + + console.log(`\n✅ Downloaded ${downloadedFounders} founder profiles to ${foundersDir}/`) + console.log(`⏭️ Skipped ${skippedFounders} existing or placeholder profiles`) + if (failedFounders > 0) { + console.log(`⚠️ Failed to download ${failedFounders} founder profiles`) + } + + if (failedFounders > 0) { + console.error("❌ Build failed: Some founder profile pictures could not be downloaded") + process.exit(1) + } + + const outputPath = join(__dirname, "../public/projects-data.json") + const outputData = { + timestamp: new Date().toISOString(), + projects: sortedProjects, + filterOptions, + totalProjects: allProjects.length, + } + + console.log("💾 Writing data to JSON file...") + writeFileSync(outputPath, JSON.stringify(outputData, null, 2)) + + console.log(`✅ Successfully wrote data to ${outputPath}`) + console.log(` - Total projects: ${allProjects.length}`) + console.log(` - Funding sources: ${filterOptions.fundingSources.length}`) + console.log(` - Cohorts: ${filterOptions.cohorts.length}`) + console.log(` - Categories: ${filterOptions.categories.length}`) + console.log(` - Timestamp: ${outputData.timestamp}`) + } catch (error) { + console.error("❌ Error building projects data:", error) + process.exit(1) + } +} + +buildProjectsData() diff --git a/types/notion.ts b/types/notion.ts new file mode 100644 index 0000000..db5b210 --- /dev/null +++ b/types/notion.ts @@ -0,0 +1,88 @@ +export interface NotionPage { + object: "page" + id: string + created_time: string + last_edited_time: string + created_by: { + object: "user" + id: string + } + last_edited_by: { + object: "user" + id: string + } + cover: string | null + icon: string | null + parent: { + type: "data_source_id" + data_source_id: string + database_id: string + } + archived: boolean + in_trash: boolean + is_locked: boolean + properties: { + Name: NotionTitle + description: NotionRichText + overview: NotionRichText + website: NotionUrl + categories: NotionMultiSelect + founders: NotionMultiSelect + investors: NotionMultiSelect + cohort: NotionSelect + contacts: NotionMultiSelect + } +} + +export interface NotionTitle { + id: "title" + type: "title" + title: { + type: "text" + text: { + content: string + link?: { + url: string + } + annotations: Record + } + } +} + +export interface NotionRichText { + id: string + type: "rich_text" + rich_text: { + type: "text" + text: { + content: string + annotations: Record + } + } +} + +export interface NotionUrl { + id: "url" + type: "url" + url: string | null +} + +export interface NotionMultiSelect { + id: "multi_select" + type: "multi_select" + multi_select: { + id: string + name: string + color: string + } +} + +export interface NotionSelect { + id: "select" + type: "select" + select: { + id: string + name: string + color: string + } +} diff --git a/types/project.ts b/types/project.ts index d20dba6..6289953 100644 --- a/types/project.ts +++ b/types/project.ts @@ -1,18 +1,34 @@ +export type SectionType = "funding" | "cohort" + +export type InvestmentStage = "pre-seed" | "seed" | "series-a" | "accelerator" | "university" | "bootstrapped" + export interface Founder { id: string name: string - role: string + role: "Founder" imageSrc: string + contactUrl?: string +} + +export interface Investor { + id: string + name: string + type: "vc" | "accelerator" | "angel" | "university-fund" | "corporate" + website: string | null } export interface Project { id: string title: string description: string + overview: string imageSrc: string companyName: string - companyWebsite: string + companyWebsite: string | null categories: string[] - overview: string founders: Founder[] + investors?: Investor[] + sectionType: "funding" | "cohort" + sectionName: string + sectionOrder: number }