DEV Community

Cover image for Building a Portfolio while you Chat: My TamboHack Project
Fudail Zafar
Fudail Zafar

Posted on

Building a Portfolio while you Chat: My TamboHack Project

I’m thrilled to share my project for TamboHack: ChatPortfolio (aka Cursor for Portfolio) — a smart, minimalitistic AI Portfolio built with Tambo AI, Next.js & TypeScript.

Before you read any further, check out the demo:

(Link to the code: fudailzafar/tambo-hack)

You can see the live demo here: tambohack.vercel.app

🛠 What it Does?

ChatPortfolio translates your English into a shareable Portfolio — which you can customize it. Ask it stuff like:

  • “Change my name to Steve Jobs.”
  • “Enable Dark Mode.”
  • “Change my skills to a full stack dev role and update my font to Times New Roman.”

It understands your query, dynamically pulling from multiple components & updates your portfolio!

Step 1: Create Your Tambo App (Yay!)

Start off building this by creating a new Tambo App (The Best AI Orchestration tool out there)

npx tambo create-app my-personal-portfolio
cd my-personal-portfolio
npx tambo init
Enter fullscreen mode Exit fullscreen mode

Once you're done with the initial setup, you can delete a couple files.

rm src/components/ui/card-data.tsx src/services/population-stats.ts
rm src/app/interactables/settings-panel.tsx
Enter fullscreen mode Exit fullscreen mode

Step 2: Add the initial data and UI components

Add the below portfolio-interactable.tsx in the same place where you've deleted the settings-panel.tsx.

import { useState } from "react";
import { withInteractable } from "@tambo-ai/react";
import { z } from "zod";
import Portfolio from "./portfolio";
import { DATA as initialData } from "@/data/resume";

// Define schema for portfolio data (simplified for demo)
const portfolioSchema = z.object({
  name: z.string(),
  description: z.string(),
  summary: z.string(),
  skills: z.array(z.string()),
  projects: z.array(
// ... 
Enter fullscreen mode Exit fullscreen mode

There are a couple of other components which have to added for the custom UI. You can find them here --> fudailzafar/tambo-hack

Step 3: Add Magic UI components for making beautiful UI!

Using the following code, add Magic UI components so that you can implement beautiful UI.

npx shadcn@latest add "https://magicui.design/r/blur-fade"
npx shadcn@latest add "https://magicui.design/r/dock"
npx shadcn@latest add "https://magicui.design/r/blur-fade-text"
Enter fullscreen mode Exit fullscreen mode

Step 4: Main Portfolio component

Add the following code for your main portfolio component:

import { Separator } from "@/components/ui/separator";
import { ModeToggle } from "@/components/mode-toggle";
import { HomeIcon } from "lucide-react";
import { useEffect } from "react";
import { useTheme } from "next-themes";

const BLUR_FADE_DELAY = 0.04;

export default function Portfolio({ data }: { data?: any }) {
  const safeData = data ?? defaultData;
  const { theme, setTheme } = useTheme();

  // Sync theme from props
  useEffect(() => {
    if (safeData.theme && safeData.theme !== theme) {
      setTheme(safeData.theme);
    }
  }, [safeData.theme, theme, setTheme]);

  // Portfolio-only font and color styles
  const portfolioFont = safeData.font ? { fontFamily: safeData.font } : {};
  const portfolioColor = safeData.color ? { color: safeData.color } : {};
  const portfolioTextStyle = { ...portfolioFont, ...portfolioColor };

  return (
// ...
Enter fullscreen mode Exit fullscreen mode

Step 5: Integrate your components into Tambo!

The last thing is to integrate your portfolio components into Tambo. Add the following lines of code in your src\app\interactables\components\portfolio-interactable.tsx

Embed the following code in the end of your component, or just copy from the repo: fudailzafar/tambo-hack

const InteractablePortfolio = withInteractable(PortfolioInteractableBase, {
  componentName: "Portfolio",
  description: "Portfolio interactable with AI chatbox",
  propsSchema: portfolioSchema,
});

export function PortfolioInteractable() {
  const [portfolioData, setPortfolioData] = useState(initialData);

  // Handler for AI updates
  const handlePropsUpdate = (newProps: any) => {
    setPortfolioData((prev: any) => ({ ...prev, ...newProps }));
    console.log("Portfolio updated from Tambo:", newProps);
  };

  return (
    <InteractablePortfolio
      {...portfolioData}
      onPropsUpdate={handlePropsUpdate}
    />
  );
}
Enter fullscreen mode Exit fullscreen mode

Then visit localhost:3000 to see it live locally.

The End

And yes, that's it, if the app doesn't work after this step-by-step guide, I'm sorry, my coding skills aren't the same as my writing skills. You can clone the repo using the following commands:

git clone https://github.com/fudailzafar/tambo-hack.git
Enter fullscreen mode Exit fullscreen mode

And change your .env.local files to Tambo API.

Thank you for reading! If you have feedback, ideas, or want to contribute, let me know! 😊

Top comments (0)