← Back to projects

Portfolio Fit

An investing assistant that explains your own portfolio back to you with narrated, generated visuals. Built with a team in 36 hours, it won the Blackstone Challenge at ShellHacks 2026.

Result
1st Place
Timeline
36 hours
Event
ShellHacks
Type
Generative UI · Fintech

Overview.

Blackstone's challenge asked for an app that helps people understand their finances and investments. Portfolio Fit answers in plain language, with visuals generated for the exact question and a voice that walks you through them. You can interrupt it mid-explanation, and it picks up where it left off. I built the personalized explainer and the recommendation system.

1st

Place, Blackstone Challenge

0+

Hackers at ShellHacks

0+

Teams Competing

0h

To Build It

The Challenge

Reimagining the investor experience.

Investors juggle fragmented data across platforms, and most tools show numbers without explaining them. Blackstone's challenge was to build something that helps people understand their finances better, in a way a first-time investor can follow.

  • Show real holdings, allocations and performance in one place
  • Explain a portfolio in plain language, not a wall of text
  • Suggest investments that fit what the user already owns
  • Never invent a number the data can't back up

The Portfolio Explainer

Like a video made for you, in real time.

Ask a question such as "how's my portfolio allocated?" or "is AMD returning well for me?" and the system builds the answer on the spot: charts and cards drawn from your holdings, narrated by a voice. None of it is pre-generated. Each question produces its own interface.

A classification model reads the sentiment and intent of the message and picks the visual that best explains it. Skeleton UI holds the place while the narration starts, so the response feels immediate.

Live interrupt

If a term loses you, such as "what is a point?", you can interrupt mid-explanation. The system explains the term, then lets you expand into another visual or resume the walkthrough exactly where you left off, with no restart.

Recommendations

Diversification as the definition of "good."

Ask "what do you recommend as an investment for me?" and the system reads the user's holdings and looks for what's missing. In the demo, a portfolio heavy in US technology stocks gets an international technology stock suggested, along with its projected yield and the effect on the portfolio's expected return.

The team also built an evidence-based composition layer that validates portfolio data before it is shown, so the chat refuses to guess when the data isn't there instead of fabricating figures.

Finding Investments That Fit

Pick an interest, get ranked matches.

Portfolio Fit recommendations screen: ranked investment cards such as ASML and Ericsson, each with a portfolio fit score and reasons

Beyond the chat, a dedicated screen lets users choose an interest, like Technology, and see ranked picks. Each card carries a fit score against the user's current holdings, five-year average return, and plain-language reasons, such as adding international exposure to a U.S.-heavy portfolio with low overlap.

Where the fit score comes from

The score isn't a language model's opinion. JEV is asked a fixed list of typed questions about the user's portfolio, 19 per request, and for each one it returns a probability for every answer option we wrote. It never names a ticker and never writes free text. From there, three steps turn those answers into the cards you see.

1 · Classify

Score questions such as "how much new money should go into each asset class?" and choice questions such as "which sector should a new pick be in?" produce a plan. Code turns the answers into recommendation slots across assets like stocks, rental homes and bonds.

Slide: the classify step, where JEV answers score and choice questions as probabilities and code turns them into 12 recommendation slots

2 · Filter

Code narrows the pool of about 500 candidate assets to 20 using those answers, and JEV's confidence sets the order. The surest answer is applied first and strictly. An unsure one goes last, where the filter can widen it or skip it instead of forcing a weak guess.

Slide: confidence sets the filter order, with U.S. geography at 81% applied first and medium risk at 47% applied last

3 · Score and rank

JEV rates each remaining candidate on a five-step expected-return scale, and code turns that into the fit score. Yield comes from its return-band probabilities. The best scorers fill each category's slots, and a second pass checks every reason on the card with a yes or no.

Slide: JEV rates a candidate, then code computes the fit score as 3 divided by 4 times 100, and a projected yield of 7.3 percent a year

The split is deliberate: the model makes judgment calls, and code computes every number on screen. If the model service fails, each stage falls back to rules.

Slides from the team's pitch. Figures in the diagrams are illustrative.

How It's Built

Speed first, since we had 36 hours.

Next.js and TypeScript on both the front and back end. GPT-4.1 was chosen for the voice path because response speed mattered most. ElevenLabs provides the narration. We couldn't train a model in 36 hours, so intent and sentiment classification runs on JEV, a zero-shot classifier that had just been released.

Stack & Tools

TypeScript Next.js & React GPT-4.1 ElevenLabs JEV Vercel

Additional Photos

The team at ShellHacks.

Next projectDash Academy
View Project →

Let's Talk

Pick a message, leave your email, and I'll reach out.

Message
+ Add your name (optional)