<feed xmlns='http://www.w3.org/2005/Atom'>
<title>prism.git, branch feature/valuation-redesign</title>
<subtitle>Webapp for stock analysis</subtitle>
<id>https://git.tylerhoang.xyz/prism.git/atom?h=feature%2Fvaluation-redesign</id>
<link rel='self' href='https://git.tylerhoang.xyz/prism.git/atom?h=feature%2Fvaluation-redesign'/>
<link rel='alternate' type='text/html' href='https://git.tylerhoang.xyz/prism.git/'/>
<updated>2026-05-17T09:08:26Z</updated>
<entry>
<title>Fix valuation review: dead code, wrong peer bands, height scaling</title>
<updated>2026-05-17T09:08:26Z</updated>
<author>
<name>Tyler</name>
<email>tyler@tylerhoang.xyz</email>
</author>
<published>2026-05-17T09:08:26Z</published>
<link rel='alternate' type='text/html' href='https://git.tylerhoang.xyz/prism.git/commit/?id=85160a558b2d37965ee2b8799fdd177ec986eadd'/>
<id>urn:sha1:85160a558b2d37965ee2b8799fdd177ec986eadd</id>
<content type='text'>
- Remove dead _build_dcf_canvas_html (~525 lines, superseded by
  _build_dcf_canvas_only_html)
- Remove unused ev_ebit assignment
- Fix FCF yield KPI strip and mini row using dividendYieldTTM as peer
  band proxy (pass None — no equivalent peer field for FCF yield)
- Expand st.spinner in _render_historical_ratios to cover get_peers()
  and get_ratios_for_tickers() calls
- Collapse _render_all_multiples / _render_multiples_model indirection
  into a single function
- Replace Comps fixed 2600px height with max(1900, 1500 + n_peers*80),
  saving 400-700px whitespace for typical 5-8 peer sets

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Fix Historical Ratios blank render and Earnings History height cutoff</title>
<updated>2026-05-17T08:55:53Z</updated>
<author>
<name>Tyler</name>
<email>tyler@tylerhoang.xyz</email>
</author>
<published>2026-05-17T08:55:53Z</published>
<link rel='alternate' type='text/html' href='https://git.tylerhoang.xyz/prism.git/commit/?id=636086c5332b8aab5c1cc322bef1f3bb446a5add'/>
<id>urn:sha1:636086c5332b8aab5c1cc322bef1f3bb446a5add</id>
<content type='text'>
Missing semicolon after pts.forEach() prevented ASI, causing a JS syntax
error that silently killed all chart and matrix rendering. Also bumped
Earnings History iframe height to stop the table from being clipped.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Redesign Valuation tab: Key Ratios, Models, Historical, Comps, Multiples</title>
<updated>2026-05-17T08:33:17Z</updated>
<author>
<name>Tyler</name>
<email>tyler@tylerhoang.xyz</email>
</author>
<published>2026-05-17T08:33:17Z</published>
<link rel='alternate' type='text/html' href='https://git.tylerhoang.xyz/prism.git/commit/?id=bb55d8be4a080e16227290333f667a5b39fa6575'/>
<id>urn:sha1:bb55d8be4a080e16227290333f667a5b39fa6575</id>
<content type='text'>
- Key Ratios: 6-KPI snapshot strip with sparklines, 5-category ratio grid
  (Valuation, Profitability, Growth, Health, Cash Returns) via components.html()
- Models (DCF): two-column layout — st.slider() rail + prominent verdict chip,
  EV→equity bridge, per-share reconciliation, cross-check grid as HTML canvas
- Historical Ratios: SVG line chart (subject vs sector median) + clickable
  heatmap matrix that updates the chart via client-side JS
- Comps: 4 percentile rank bars + sortable peer table, all via components.html()
- Multiples: math-flow columns (EV/EBITDA, EV/Revenue, P/Book) with sensitivity
  strip and DCF cross-check; HTML range sliders drive JS computation

All redesigned tabs: scrolling=False, string-concat HTML (no f-strings),
XSS-safe (escape_html on all user-supplied strings injected into HTML/JS).

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Fix 5D x-axis labels and weekend/closed fallback for intraday default</title>
<updated>2026-05-17T07:10:42Z</updated>
<author>
<name>Tyler</name>
<email>tyler@tylerhoang.xyz</email>
</author>
<published>2026-05-17T07:10:42Z</published>
<link rel='alternate' type='text/html' href='https://git.tylerhoang.xyz/prism.git/commit/?id=654b76c34d93f8d31b199afb84edb2742b26444a'/>
<id>urn:sha1:654b76c34d93f8d31b199afb84edb2742b26444a</id>
<content type='text'>
- 5D period now uses '%a %H:%M' tick format so each day is labelled (Mon 09:30)
  instead of bare times that repeat across five days
- default_period resolves to '1mo' when 1D series is empty (market closed,
  weekend, holiday) so the chart isn't blank on first load
- JS activePeriod reads from OVERVIEW_META.default_period at boot instead of
  hardcoded '1d', and bootOverview syncs the active button to match

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Add 1D and 5D intraday periods to overview chart</title>
<updated>2026-05-17T07:06:36Z</updated>
<author>
<name>Tyler</name>
<email>tyler@tylerhoang.xyz</email>
</author>
<published>2026-05-17T07:06:36Z</published>
<link rel='alternate' type='text/html' href='https://git.tylerhoang.xyz/prism.git/commit/?id=2b229cff5f99a00b6cc984f4c1c3c41de7f1e04c'/>
<id>urn:sha1:2b229cff5f99a00b6cc984f4c1c3c41de7f1e04c</id>
<content type='text'>
Adds get_intraday_history() to data_service.py (5m/30m bars, ttl=60s)
and wires it into the overview chart with HH:MM x-axis formatting,
market-hours filtering, intraday-only primary fetch, hidden comparison
buttons, and 1D as the default period on load.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Fix render_top_movers kwarg incompatibility with st.fragment</title>
<updated>2026-05-16T08:56:51Z</updated>
<author>
<name>Tyler</name>
<email>tyler@tylerhoang.xyz</email>
</author>
<published>2026-05-16T08:56:51Z</published>
<link rel='alternate' type='text/html' href='https://git.tylerhoang.xyz/prism.git/commit/?id=5424b83d8173435632dd59f4072d37ac68d33593'/>
<id>urn:sha1:5424b83d8173435632dd59f4072d37ac68d33593</id>
<content type='text'>
Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Sidebar chrome: vertical nav, live clock, brand v1.2, drop snapshot</title>
<updated>2026-05-16T08:52:32Z</updated>
<author>
<name>Tyler</name>
<email>tyler@tylerhoang.xyz</email>
</author>
<published>2026-05-16T08:52:32Z</published>
<link rel='alternate' type='text/html' href='https://git.tylerhoang.xyz/prism.git/commit/?id=8e35de0d435fec5ac552783130ef04aee33159f4'/>
<id>urn:sha1:8e35de0d435fec5ac552783130ef04aee33159f4</id>
<content type='text'>
Replace horizontal st.tabs() with session-state-driven vertical nav
buttons in the sidebar (Workspace section). Remove company snapshot
entirely — ticker info is covered by the persistent TickerHeader.
Add NYSE live clock between brand and search. Update brand sub-label
to "v 1.2".

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Rewrite watchlist as custom HTML component with proper styling</title>
<updated>2026-05-16T08:40:02Z</updated>
<author>
<name>Tyler</name>
<email>tyler@tylerhoang.xyz</email>
</author>
<published>2026-05-16T08:40:02Z</published>
<link rel='alternate' type='text/html' href='https://git.tylerhoang.xyz/prism.git/commit/?id=bbceb4c6798d43f4b32e73f38fc4907e00733244'/>
<id>urn:sha1:bbceb4c6798d43f4b32e73f38fc4907e00733244</id>
<content type='text'>
Replaces st.button rows with a components.html iframe that renders sym·price·Δ%
in a 3-column grid with hairline dividers, monospace fonts, and colored change
percentages. Adds hidden text_input click receiver so row clicks update
session state. Fixes toggle button to show toast when watchlist cap is hit and
removes now-redundant psm-watch-toggle CSS.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Add session-scoped personal watchlist to sidebar</title>
<updated>2026-05-16T08:30:34Z</updated>
<author>
<name>Tyler</name>
<email>tyler@tylerhoang.xyz</email>
</author>
<published>2026-05-16T08:30:34Z</published>
<link rel='alternate' type='text/html' href='https://git.tylerhoang.xyz/prism.git/commit/?id=b321614ef1aabf3ce001fea471e45bebc35ccb86'/>
<id>urn:sha1:b321614ef1aabf3ce001fea471e45bebc35ccb86</id>
<content type='text'>
Adds a save/remove toggle below the company snapshot, a watchlist section
(capped at 10 tickers) that renders sym · price · Δ% rows above Top Movers,
and an empty-state placeholder. Clicking a watchlist row loads that ticker.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Add TickerHeader + KPI strip above tab strip</title>
<updated>2026-05-16T08:06:05Z</updated>
<author>
<name>Tyler</name>
<email>tyler@tylerhoang.xyz</email>
</author>
<published>2026-05-16T08:06:05Z</published>
<link rel='alternate' type='text/html' href='https://git.tylerhoang.xyz/prism.git/commit/?id=658ed53544243a5efe08a6440a1297d521357f2c'/>
<id>urn:sha1:658ed53544243a5efe08a6440a1297d521357f2c</id>
<content type='text'>
Injects a persistent header band between the market bar and st.tabs():
sector tag, italic symbol, company name, 52W range rail with price pin,
price, and Δ/% change chip; below that a 6-cell KPI strip (Market Cap,
P/E, EPS, Div Yield, Beta, Short % Float). All data from cached service
calls — free hits. Graceful "—" fallbacks for missing fields.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
</feed>
