Inspiration
Most investing apps show you what you own: a list of tickers, prices and a pie chart by sector. They rarely show what you actually depend on. A portfolio of Apple, NVIDIA and AMD looks diversified, until you notice all three rely on the same chipmaker, TSMC. The same blind spot runs across asset classes: your bond fund may lend to the same companies your stocks depend on, and your rental property may sit in the same metro as your REIT's data centers. We wanted an asset manager that finds these hidden overlaps and backs every one with a source you can check.
What it does
Portfolio X-Ray lets you record everything you hold (stocks, credit funds and real estate) and shows where they quietly depend on the same things.
- Portfolio: your total value, today's move and the split by market.
- X-Ray: what your money relies on (suppliers, countries, themes like AI & data centers, and regions), ranked by how many of your dollars depend on each. For example: AI & data centers: \$77,000 in stocks + \$26,360 in real estate. It also shows who pays each stock: Cirrus Logic gets 91% of its revenue from Apple, which you may also own.
- What Changed: this week's news that reaches what you own, directly, through a supplier, through a fund's loans, or through FEMA disasters in your property's county.
- Connection Map: one holding at a time. What it's connected to, and which of your holdings news about a company would reach.
- Research: look up any stock, bond fund, ETF, REIT or ZIP code and see how it would fit with what you hold. It never tells you what to buy.
- Story Mode: why a stock moved, explained with cited evidence.
Every link comes from a source: a quote from an SEC filing, a line in a fund's holdings report, or public housing and disaster data.
How we built it
- Knowledge graph: we pulled each company's annual report from SEC EDGAR and used Gemini to extract suppliers, customers, competitors and countries, each with a word-for-word quote that we verify against the filing. The result (74 companies, 194 relationships) lives in Neo4j AuraDB, is exported for the app, and is loaded into Snowflake.
- Credit funds: bond funds and ETFs are read from their SEC Form N-PORT (every holding; 17,409 for Vanguard Total Bond), and private credit funds from their BDC 10-K schedules of investments. Borrowers are matched to the graph by exact name.
- Real estate: REITs are read from their 10-K's Schedule III (every property's value and location), properties are looked up by ZIP code with Zillow home values and rents, and disaster risk comes from OpenFEMA. Everything maps onto one shared set of metro areas.
- Exposure in dollars: for a dependency $d$, a stock $s$ with value $v_s$ counts in full, a fund $f$ counts your share of its loans to each company $c$ that relies on $d$, and a REIT $r$ counts its share $p_{r,d}$ of properties there: $$E_d = \sum_{s \to d} v_s \;+\; \sum_{f}\, v_f !!\sum_{c\,\to\,d}! w_{f,c} \;+\; \sum_{r} v_r\, p_{r,d}$$
- Stack: a FastAPI backend, a React + TypeScript (Vite) frontend, Gemini for reading filings and news, Finnhub for news, Yahoo Finance for prices, and Snowflake for storage and analysis (key-pair auth, dedicated app role).
Challenges we ran into
- Filings leave key names out. Apple's 10-K names no suppliers, and TSMC's names no customers. We added a few clearly marked manual links, each with its reason.
- AI that invents citations. Gemini only sees evidence we gathered first, by id, and any citation that doesn't match is dropped. When nothing explains a move, it says so.
- Every filer tags data differently. "CA" can mean California or Canada; REITs write locations as "Northern Virginia", "Dallas Texas" or "Raleigh Nc". We built parsers that handle these styles and refuse to guess: "London" is never matched to London, Kentucky.
- Fuzzy matching gives false links. Loose name matching tied "United" to United Airlines, so we match borrowers by exact name only.
- Numbers that look wrong but aren't. A leveraged bond fund's holdings add up to 151% of its assets, and a tiny look-through slice made nearly everything look "shared". We labeled the first and required a real share before counting the second.
- Free-tier limits and demo safety. Finnhub caps each request at about 250 articles, so we fetch news per price-move date, which cut unexplained moves from 108 to 7. Everything the demo shows is precomputed so it never waits on a live API.
Accomplishments that we're proud of
- Three asset classes in one view. A single X-Ray connects stocks, credit funds and real estate through the same companies, themes and regions.
- Every claim is traceable. It goes back to a filing quote or a public dataset, with nothing estimated or invented.
- It works for real assets, not just our demo. It reads any SEC-filing company, fund, ETF, BDC or REIT, and any US ZIP code.
- It surfaces findings you won't see elsewhere. For example, your bond fund lends to 6 of your 7 stocks, or your rental and your REIT's data centers are in the same metro.
What we learned
- Public data is richer than we expected. SEC filings, fund holdings reports and government data already say a lot about concentration risk, once you can read them at scale.
- Provenance has to be designed in from the start. The citation rules shaped every feature.
- Finance concepts had to be modeled carefully. Look-through exposure, customer concentration, leverage and the difference between value and share all mattered.
- Integrating a team's branches is its own skill. We learned to use clean merges and to verify each step.
What's next for Portfolio X-Ray
- Accounts and synced portfolios, plus values that move with prices and gain since purchase.
- Insurance (annuities and cash-value life policies), read through insurers' investment schedules.
- A fully connected graph: funds, themes and regions as graph nodes, so you could ask questions like "What do I own that depends on TSMC?"
- A wider company list and scheduled data refreshes, and hosting on Vercel with a compact home-value table.
Built With
- claude
- codex
- fastapi
- gemini
- git
- github
- javascript
- neo4j
- pandas
- pytest
- python
- react
- snowflake
- sql
- typescript
- uvicorn
- vscode


Log in or sign up for Devpost to join the conversation.