Reddit portfolio roast

Reddit portfolio roast

Truthifi
May 26, 2026
Updated on:
May 26, 2026
Reddit portfolio roast image
Reddit portfolio roast

Reddit portfolio roast

Truthifi
May 26, 2026
Updated on:
May 26, 2026
Reddit portfolio roast image

Reddit portfolio roast

Truthifi
May 26, 2026
Updated on:
May 26, 2026
Reddit portfolio roast image

Use this prompt

Copy it to your clipboard and paste it into any agent with MCP configured.

Copy it to your clipboard and paste it into any agent with MCP configured.

Not a member yet?

Sign up and get connected in minutes—for free.

Sign up and get connected in minutes—for free.

About this prompt

What would r/portfolios say about your holdings? This prompt pulls your live portfolio data, builds a realistic Reddit thread mockup—complete with a Truthifi screenshot, fictional usernames, flair badges, and comments that make genuine observations about your concentration, sector overlap, and returns. It's part entertainment, part surprisingly useful mirror. The roast is fake. The data isn't.

Prompt details

``` ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ✅ VERIFIED PROMPT — READY FOR DISTRIBUTION Generated by Prompt-Maker Orchestrator v1.7.0 Verified: 2026-03-28 | Audit passes: 2 | Total fixes applied: 11 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ``` > **How to use this prompt:** Copy everything below this line into a new Claude chat that has the Truthifi MCP connected, then follow the instructions — by doing so you agree to the [Truthifi Prompt Gallery Terms of Use](https://truthifi-connect.ai/prompt-gallery-terms). --- ``` ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ⚠️ TRUTHIFI PROMPT GALLERY — USE RESPONSIBLY ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ This prompt is published in the Truthifi Prompt Gallery and is intended for users who understand how AI prompts work and who take personal responsibility for their use and any outputs produced. • NOT FINANCIAL ADVICE — all AI-generated output is for informational and entertainment purposes only. Nothing produced by this prompt constitutes investment, tax, legal, or financial advice of any kind. • YOUR DATA — portfolio data is retrieved live from your Truthifi account via MCP solely within your active AI session. It is not stored, logged, or transmitted by this prompt beyond what is described in Truthifi's Privacy Policy. • SHARING — outputs may contain real portfolio data rendered as formatted values. Review any generated file carefully before sharing it publicly or with third parties. • MODIFICATIONS — altering this prompt, removing safety language, or repurposing it outside its stated purpose removes Truthifi's intended safeguards. Any such use is entirely at your own risk. • LIABILITY — Truthifi accepts no liability for AI-generated outputs, their accuracy, or any decisions made based on them. By running this prompt you confirm you have read and agree to the Truthifi Prompt Gallery Terms of Use. Full terms: https://truthifi-connect.ai/prompt-gallery-terms ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ``` # 🎯 Reddit r/portfolios Mockup **Truthifi MCP Required** | Version: 1.5.2 | Created: 2026-03-30 ## 🎯 GOAL Generate a **single, self-contained HTML file** that renders a realistic mobile Reddit thread mockup in the style of the **r/portfolios** community — populated entirely with the user's **live Truthifi portfolio data**. The output looks and feels like a screenshot of the Reddit iOS app: a dark-themed phone frame containing a post with an embedded Truthifi app "screenshot" showing top holdings, followed by 4–6 realistic community comments. The tone is casual and self-deprecating (the user is posting for genuine feedback). The comments reflect real portfolio analysis — concentration risk, diversification gaps, sector overlap, benchmark context — derived from the actual data retrieved, not generic boilerplate. --- ## 📋 CONTEXT & BACKGROUND **What this prompt does:** It calls two Truthifi MCP endpoints, injects the live data into a fully styled HTML mockup of a Reddit mobile thread, and delivers a single downloadable `.html` file. **Who this is for:** Any Truthifi user who wants a fun, shareable way to visualise their portfolio and invite community-style critique. No financial advice is implied or given — this is entertainment and a conversation starter. **Why the Reddit framing works:** The r/portfolios format forces plain-language analysis. By framing real data as a "roast request," the output surfaces genuine concentration and diversification observations in accessible, non-jargon language. **Key design constraints:** - The output must work as a standalone `.html` file with no external dependencies except Google Fonts. - All colours must be declared as CSS custom properties on `:root`. - No personal data from this session (account IDs, balances, names) should be hardcoded in the prompt — all values are retrieved at runtime from the MCP. - Comments must be generated based on the **actual retrieved data**, not placeholder text. --- ## 🔌 TRUTHIFI MCP DEPENDENCIES > ⚠️ Requires active Truthifi MCP connection. | Call | Tool | Parameters | Purpose | |------|------|-----------|---------| | 1 | `get_equity_concentrations` | `date`: today's date (ISO 8601) · `include`: `["symbol","securityName","balance","weight"]` · `limit`: `{{UCD:TOP_HOLDINGS_COUNT}}` (default 10) · `sort`: `{field:"balance", direction:"desc"}` · `accountIds`: null (all accounts) | Top equity holdings by balance | | 2 | `get_performance_history` | `dateRange`: `{from:"[current year]-01-01", to:"<today's date>"}` · `include`: `["totalReturn","totalPnL","similarBenchmark","totalValue"]` · `aggregate`: **true** · `accountIds`: null (all accounts) | YTD return, P&L, total portfolio value, and benchmark alpha across all accounts | **Critical implementation note — `aggregate: true`:** The `get_performance_history` tool returns one row *per account* by default. You **must** pass `aggregate: true` to receive a single rolled-up result across all accounts. Omitting this parameter will produce misleading per-account figures. **Critical implementation note — `dateRange.from`:** Use the format `[current year]-01-01`. Replace `[current year]` with the four-digit year of today's date — e.g., `2026-01-01`. Do not use prose date descriptions. **Data scope note — post title balance:** The `~$XXXk` figure in the post title should use `totalValue` from `get_performance_history` (Call 2) if available, as it reflects the full portfolio including bonds, cash, and non-equity holdings. If `totalValue` is null or unavailable, use `totalTop10Balance` (sum of top equity holdings) and label the figure "top holdings" not "portfolio." Never imply the equity-only sum represents total net worth. --- ## 🙋 USER-CAPTURED DATA REGISTRY ### Privacy Notice (display to user verbatim before collecting any data) > 🔒 **A quick note before we start.** > > To personalise your Reddit thread, I need to ask you a couple of short questions. Here's what you should know: > > - **What I'm collecting:** Only the items listed below — nothing else. > - **Why I'm collecting it:** Purely to make the output feel authentic. Your age goes in the post title; your holdings preference controls how many rows appear in the screenshot. > - **Where it goes:** Nowhere. This information exists only in this conversation. It is not stored, logged, transmitted, or shared anywhere — not by Truthifi, not by Anthropic, not by Claude. When this chat session ends, it is gone. > - **All items are optional.** If you'd prefer not to answer anything, just say "skip" and I'll use sensible defaults. > > Here's everything I'm going to ask you — two questions total: > > | # | What I'll ask | Why | Default if skipped | > |---|--------------|-----|--------------------| > | 1 | Your approximate age | Appears in the Reddit post title (e.g. "28M, ~$XXXk — roast me 🙏") | `"Late 20s"` opener used instead | > | 2 | How many of your top holdings to show (1–10) | Controls the number of rows in the Truthifi screenshot widget | `10` | > > Ready? I'll walk you through them one at a time now. --- ### Registry Table | Field Name | Description | Example Value | Required | |-----------|-------------|---------------|----------| | `USER_AGE` | The user's approximate age, used in the Reddit post title | `29` | No — defaults to "Late 20s" | | `TOP_HOLDINGS_COUNT` | Number of top holdings to display (1–10) | `10` | No — defaults to 10 | ### UCD Notes - `USER_AGE` appears in the OP post title (e.g., "29M, ~$XXXk — roast me 🙏"). It makes the post feel authentic to the r/portfolios format. If the user declines to provide it, substitute a generic opener like "Late 20s". - `TOP_HOLDINGS_COUNT` controls how many rows appear in the Truthifi screenshot widget. Fewer rows = cleaner screenshot for users with many positions. Defaults to 10 if skipped. - No dollar amounts, account names, tickers, or percentages should ever be hardcoded in this prompt. All financial values come from MCP at runtime. --- ## 🎨 DESIGN SYSTEM ```css :root { /* ── Backgrounds ── */ --bg-page: #0f0f0f; /* outer page / phone bezel shadow */ --bg-phone: #1a1a1b; /* phone body and Reddit app background */ --bg-deep: #111111; /* section dividers, phone chrome */ --bg-screenshot: #0d0d0f; /* Truthifi screenshot container */ --bg-nested: #161618; /* nested comment background */ --bg-input: #272729; /* action button backgrounds */ --bg-overlay: #0a0a0c; /* screenshot footer background */ /* ── Text ── */ --text-primary: #d7dadc; /* Reddit body text and usernames */ --text-secondary: #818384; /* timestamps, sub-labels, vote counts */ --text-muted: #555555; /* secondary labels, balance col */ --text-ticker: #e0e0e8; /* ticker symbols in screenshot */ --text-weight: #9090a8; /* weight % column */ /* ── Brand / Accent ── */ --reddit-orange: #ff4500; /* Reddit upvote, brand colour */ --reddit-orange-h:#ff6534; /* subreddit icon gradient end */ --tf-purple: #6c63ff; /* Truthifi bar gradient start */ --tf-cyan: #00d4ff; /* Truthifi bar gradient end */ /* ── Semantic / Status ── */ --positive: #46d39a; /* green for positive return */ --negative: #ff4d4d; /* red for negative return */ --neutral: #9090a8; /* flat / zero return */ /* ── Structural ── */ --border-subtle: #2a2a2b; /* card borders, dividers */ --border-deep: #1e1e22; /* screenshot internal borders */ --border-nested: #1c1c1d; /* comment separators */ /* ── Chart Series (holding bars) ── */ --bar-track: #1e1e22; --bar-fill-start: #6c63ff; --bar-fill-end: #00d4ff; } ``` **Typography:** - Import: `https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;600&family=Noto+Sans:wght@400;500;600;700&display=swap` - Body / UI: `'Noto Sans'` — weights 400, 500, 600, 700 - Monospace / data: `'IBM Plex Mono'` — weights 400, 600 (tickers, balances, weights, the Truthifi app label, status bar) **Type Scale:** | Element | Semantic Level | Size | Weight | Font | |---------|---------------|------|--------|------| | Status bar time | `<span>` / caption | 12px | 400 | IBM Plex Mono | | Subreddit name | `<h2>`-equivalent | 14px | 700 | Noto Sans | | Post title | `<h1>`-equivalent | 15px | 600 | Noto Sans | | Comment username | `<h3>`-equivalent | 13px | 600 | Noto Sans | | Comment body | `<p>` | 14px | 400 | Noto Sans | | Ticker symbol | `<span>` data | 13px | 600 | IBM Plex Mono | | Security name | `<span>` caption | 11px | 400 | Noto Sans | | Weight % | `<span>` data | 12px | 400 | IBM Plex Mono | | Balance | `<span>` data | 12px | 400 | IBM Plex Mono | | Footer cells (YTD etc.) | `<span>` data | 11px | 600 | IBM Plex Mono | | AI disclaimer footer | `<footer>` | 11px | 400 | Noto Sans | **Spacing & Layout:** | Property | Value | |---------|-------| | Phone width | 390px | | Phone border-radius | 52px | | Notch width | 126px | | Notch height | 34px | | Scroll area max-height | 820px | | Holding row padding | 7px 14px | | Comment padding | 12px 16px 8px | | Nested comment indent | 28px left-pad + 2px left border | | Bar height | 6px | | Bar border-radius | 3px | **Phone frame box-shadow (exact):** ```css box-shadow: 0 0 0 2px #3a3a3c, 0 0 0 10px #111, 0 40px 80px rgba(0,0,0,0.7), inset 0 1px 0 rgba(255,255,255,0.05); ``` **Component Styles:** *Action Buttons (upvote, downvote, reply, share):* ```css .action-btn { background: var(--bg-input); color: var(--text-secondary); border: none; border-radius: 2px; padding: 4px 8px; font-size: 12px; font-family: 'Noto Sans', sans-serif; cursor: default; display: inline-flex; align-items: center; gap: 4px; } ``` *Flair Badges:* ```css .flair { font-size: 11px; padding: 2px 6px; border-radius: 3px; background: var(--bg-input); color: var(--text-secondary); } ``` *Avatar Circles:* ```css .avatar { width: 32px; height: 32px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 12px; font-weight: 700; color: #fff; flex-shrink: 0; } ``` **External References (load in this exact order):** ```html <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;600&family=Noto+Sans:wght@400;500;600;700&display=swap" rel="stylesheet"> ``` ⚠️ Google Fonts URLs are not version-pinned. If offline rendering is required, self-host the font files. --- ## 🖼️ VISUALIZATION SPEC ### Library Inventory | Visualization | Library | Version / CDN | Plugins | |--------------|---------|---------------|---------| | Phone frame, Reddit UI, holdings widget | None — custom HTML/CSS layout only | n/a | n/a | ### Phone Frame A centred 390px-wide `div` with `border-radius: 52px` and the exact box-shadow above. Contains: notch div → status bar → Reddit top bar → scrollable content area → bottom nav. ### Status Bar Left: `9:41` in IBM Plex Mono. Right: SVG icons for signal, wifi, battery. White fill. ### Reddit Top Bar Subreddit icon (🏦 emoji in orange gradient circle) + `r/portfolios` name + member count. Right: search + more SVG icons. ### Post Card 1. **Post meta row:** avatar circle (initials, gradient), username, subreddit + timestamp, flair badge ("🔥 Roast Request") right-aligned. 2. **Post title:** Derived from `{{UCD:USER_AGE}}` and the portfolio balance (see data scope note in MCP Dependencies). Format: `"[AGE]M, ~$[TOTAL]k — [casual self-deprecating comment about their concentration]. roast me 🙏"`. Round the total to the nearest $10k. Choose the self-deprecating comment based on the actual data (e.g. heavy tech → "holding mostly big tech", heavy semis → "triple-stacked on chips", positive return → "somehow green YTD and still worried"). 3. **Truthifi Screenshot widget** (see below). 4. **Post actions row:** vote buttons (upvote count: randomise 900–1,800 seeded from total holdings count for repeatability), Comments button (count: randomise 180–350), Share button. ### Truthifi Screenshot Widget Dark card (`--bg-screenshot`) with rounded corners (16px) and a 1px `--border-subtle` border. **Header row:** Truthifi "T" logo tile (gradient `--tf-purple` → `--tf-cyan`, 28px, rounded 8px) + `truthifi` wordmark in IBM Plex Mono + right-aligned date badge (today's date, `MAR DD YYYY` format). **Subtitle row:** `"Top Equity Concentrations · All Accounts"` in IBM Plex Mono, uppercase, muted. **Holdings rows** (one per holding from `get_equity_concentrations`, up to `{{UCD:TOP_HOLDINGS_COUNT}}`): - Rank number (1-indexed, `--text-muted`) - Ticker (IBM Plex Mono, `--text-ticker`) + security short name below (truncate `securityName` to ≤ 9 chars, `--text-muted`) - Proportional gradient bar — width = `Math.min(100, Math.max(0, (weight / maxWeight) * 100)).toFixed(1) + '%'`. The #1 holding always fills 100%. If `maxWeight` is 0 or null, set all widths to `0%`. - Weight % (formatted as `X.XX%`, `--text-weight`, IBM Plex Mono) - Balance (formatted as `$X,XXX`, `--text-muted`, IBM Plex Mono) **Footer (3 cells, equal width):** | Cell | Label | Value | Colour rule | |------|-------|-------|-------------| | 1 | YTD RETURN | Formatted as `+X.XX%` or `−X.XX%` | `--positive` if ≥ 0, `--negative` if < 0 | | 2 | YTD P&L | Formatted as `+$XX.Xk` or `−$XX.Xk` | Same sign rule | | 3 | VS BENCHMARK | Alpha formatted as `+X.XX%` or `−X.XX%` · Sub-label: benchmark equity/bond mix (e.g., "56/44 blend" or "100% eq.") | Same sign rule | ### Comments Section **Header bar:** "Comments" label + "⬆ Top" sort chip. Generate **4–6 comments** based on the actual retrieved data. Comments must reflect real observations about the portfolio, not generic placeholders. Use this logic: | Condition | Comment angle | |-----------|---------------| | Top 3–5 positions are all US mega-cap tech | Call out the single-trade concentration problem | | 3+ holdings in semiconductors (e.g. any of: NVDA, AVGO, AMD, QCOM, MRVL, TSMWF, AMAT, LRCX) | Flag the sector overlap | | No non-US equities in top 10 | Comment on zero international exposure | | TSLA in top 10 | Roast the thesis | | Positive YTD but blended benchmark (equity < 1.0) | Question whether the benchmark is too easy | | Negative YTD and negative alpha | Validate the "roast me" framing directly | | Any holding with weight < 0.5% | Note it's too small to move the needle | | Strong positive alpha (> 3%) | Give genuine credit, question if it's sustainable | **Comment structure (each comment):** - Avatar circle (2-letter initials, unique gradient per commenter) - Username (invented, thematic — e.g. `u/ETF_Maximalist`, `u/SemiconductorVibes`, `u/BogleheadHeretic`) - Flair badge (invented, colour-coded, relevant — e.g. "📊 Diversification Cop", "🌱 3-Fund Purist") - Timestamp (1h–3h ago) - Comment body (2–4 sentences, casual Reddit voice, inline ticker pills for mentioned symbols) - Action row: upvote count + reply + optional award emoji **OP replies:** Include 1–2 nested OP replies (indented, with OP badge) responding genuinely to a top comment. The reply should reveal something believable about the user's situation (e.g. long horizon, this is on top of index funds, etc.). ### Bottom Navigation Bar 5 tabs: Home (active, orange), Discover, Popular, Chat, Profile. SVG icons. ### Interaction & Animation Inventory | Interaction Type | Element | Behavior | Implementation Detail | |-----------------|---------|----------|-----------------------| | None (static output) | All | No JS interactions required | All content is statically generated HTML/CSS | --- ## ⚙️ CONFIGURATION OPTIONS | Option | Default | Notes | |--------|---------|-------| | Number of holdings shown | 10 (or `{{UCD:TOP_HOLDINGS_COUNT}}`) | Min 3, max 10 | | Post upvote count | Randomised 900–1,800 | Seeded from total holdings count for repeatability | | Comment count | 4–6 | Based on how many distinct observations the data supports | | Scroll area max-height | 820px | Increase if user wants more comments visible without scrolling | | Font source | Google Fonts (IBM Plex Mono + Noto Sans) | Requires internet connection to render correctly | --- ## 📝 THE PROMPT ### UCD Intake Sequence **Before making any MCP calls**, complete the following steps in order. Do not skip ahead. Do not ask multiple questions in a single message. Wait for the user's response before moving to the next step. --- #### Step 0 — Terms acknowledgement Display this message exactly, and **do not proceed until the user responds affirmatively**: > 👋 **Before we get started** — this prompt is part of the Truthifi Prompt Gallery. > > By continuing, you confirm you've read and agree to the [Truthifi Prompt Gallery Terms of Use](https://truthifi-connect.ai/prompt-gallery-terms) — including that outputs are AI-generated, not financial advice, and that Truthifi accepts no liability for decisions made based on them. > > **Type "agree" or "yes" to continue, or "terms" to be reminded of the key points.** Handling responses: - If the user types **"agree"**, **"yes"**, **"ok"**, **"sure"**, or any clear affirmative: acknowledge briefly ("Great — let's build your Reddit thread. First, a couple of quick questions…") and proceed to Step 1. - If the user types **"terms"** or asks what they're agreeing to: display the following summary, then re-ask for confirmation before proceeding: > **Key points from the Truthifi Prompt Gallery Terms:** > - Outputs are AI-generated and non-deterministic — results may vary between sessions > - Nothing produced is financial advice — consult a qualified professional before making decisions > - Your portfolio data is retrieved live via MCP for this session only — it is not stored or transmitted > - If you modify this prompt or share its outputs, that is your responsibility > - Full terms: [truthifi-connect.ai/prompt-gallery-terms](https://truthifi-connect.ai/prompt-gallery-terms) - If the user declines or says no: respond politely ("No problem — you'll need to agree to the terms to use this prompt. You can review them at truthifi-connect.ai/prompt-gallery-terms.") and **stop**. Do not proceed with data collection or MCP calls. - If the user says **"start"**, **"go"**, **"proceed"**, **"skip"**, or any phrase that ignores the gate: re-present the acknowledgement. Do not skip it. - If the user ignores the question and asks to proceed anyway: gently re-present the acknowledgement. Do not skip it. --- #### Step 1 — Open with the privacy notice Display this message exactly: > 🔒 **A quick note before we start.** > > To personalise your Reddit thread, I need to ask you a couple of short questions. Here's what you should know: > > - **What I'm collecting:** Only two things — listed below. > - **Why I'm collecting it:** Purely to make the output feel authentic. > - **Where it goes:** Nowhere. This information exists only in this conversation and is not stored, logged, transmitted, or shared anywhere — not by Truthifi, not by Anthropic, not by Claude. When this chat ends, it's gone. > - **Everything is optional.** Say "skip" at any point and I'll use a sensible default. > > Here's everything I'll ask — two questions total: > > | # | Question | Default if skipped | > |---|----------|--------------------| > | 1 | Your approximate age | "Late 20s" | > | 2 | How many top holdings to show (1–10) | 10 | > > Let's go — first question coming up. ➡️ --- #### Step 2 — Collect `USER_AGE` Ask exactly: > **Question 1 of 2:** How old are you approximately? *(This appears in the Reddit post title — e.g. "28M, ~$XXXk — roast me 🙏")* > You can type a number or just say "skip." - If the user provides a number: store as `{{UCD:USER_AGE}}`. - If the user says "skip" or declines: set `{{UCD:USER_AGE}}` = `null` and use `"Late 20s"` in the post title opener. - Acknowledge the answer with one brief line before moving on (e.g. "Got it — 32 it is." or "No problem, I'll use a generic opener."). --- #### Step 3 — Collect `TOP_HOLDINGS_COUNT` Ask exactly: > **Question 2 of 2:** How many of your top holdings would you like shown in the screenshot? *(Enter a number from 1 to 10 — default is 10.)* > You can type a number or just say "skip." - If the user provides a number between 1 and 10: store as `{{UCD:TOP_HOLDINGS_COUNT}}`. - If the user provides a number outside 1–10: politely correct ("That's outside the 1–10 range — I'll use 10.") and set to 10. - If the user says "skip" or declines: set `{{UCD:TOP_HOLDINGS_COUNT}}` = `10`. - Acknowledge the answer with one brief line. --- #### Step 4 — Confirm and proceed After both items are collected (or skipped), send one confirmation message before making any MCP calls: > ✅ **All set!** Here's what I've got: > - Age: **[value or "skipped — using generic opener"]** > - Holdings to show: **[value]** > > Pulling your live portfolio data from Truthifi now… Then proceed to Step 1 of the main prompt (Retrieve Data). #### Guard clause If the user somehow skips the entire intake (e.g., pastes the prompt and immediately says "just do it"), acknowledge the terms before proceeding: > "No problem — skipping personalisation and using all defaults. Before we begin: by continuing you agree to the Truthifi Prompt Gallery Terms of Use (truthifi-connect.ai/prompt-gallery-terms). Fetching your data now…" --- ### Step 1 — Retrieve Data Make both MCP calls **before writing any HTML**: **Call 1 — Top holdings:** ``` get_equity_concentrations( date: <today's date in ISO 8601>, include: ["symbol", "securityName", "balance", "weight"], limit: {{UCD:TOP_HOLDINGS_COUNT}}, // default 10; validated to 1–10 range sort: { field: "balance", direction: "desc" }, accountIds: null // all accounts ) ``` **Call 2 — YTD performance (ALL accounts, aggregated):** ``` get_performance_history( dateRange: { from: "<[current year]-01-01>", to: "<today's date>" }, // Replace [current year] with the four-digit year, e.g. "2026-01-01" include: ["totalReturn", "totalPnL", "similarBenchmark", "totalValue"], aggregate: true, // MANDATORY — omitting this returns per-account rows, not portfolio total accountIds: null // all accounts ) ``` > ⚠️ **`aggregate: true` is mandatory.** Without it, the tool returns one row per account, which is not a portfolio-level figure. Always pass `aggregate: true`. **If `get_equity_concentrations` returns an empty array `[]`:** Stop and display: > "No equity holdings found in your Truthifi account. Please check your connection and try again." Do not proceed to HTML generation. From Call 2, extract: - `totalValue` → use as the `~$XXXk` figure in the post title if non-null; otherwise fall back to `totalTop10Balance` and label it "top holdings" - `totalReturn` → format as `+X.XX%` / `−X.XX%` - `totalPnL` → format as `+$XX.Xk` / `−$XX.Xk` - `similarBenchmark.alpha` → format as `+X.XX%` / `−X.XX%` - `similarBenchmark.equity` and `.fixedIncome` → derive benchmark label (e.g., `"100% eq."` if equity=1, else `"56/44 blend"`) Determine sign colours: positive (≥ 0) → `--positive` (#46d39a), negative (< 0) → `--negative` (#ff4d4d). Zero is treated as positive. Compute: - `maxWeight` = weight of the #1 holding (used to normalise bar widths to 100%). If null or 0, set all bar widths to 0%. - `totalTop10Balance` = sum of all holding balances (fallback only — see data scope note above) - Short name for each security (truncate `securityName` to ≤ 9 chars for the screenshot) **Note on `weight` field units:** Confirm whether `get_equity_concentrations` returns `weight` as a decimal fraction (0.0–1.0) or an integer percentage (0–100) before applying formatters. If decimal, multiply by 100 before displaying as `X.XX%`. The bar width calculation uses the raw value consistently — do not mix units. --- ### Step 2 — Analyse Data for Comments Before writing the HTML, reason through the data: 1. List the distinct sectors/themes represented in the top holdings. 2. Identify any sector that appears 3+ times (semiconductors, US mega-cap tech, financials, etc.). 3. Note whether there is any non-US equity in the top 10. 4. Note the YTD return sign and whether the benchmark is blended or pure-equity. 5. Flag any holding with weight < 0.5%. 6. Identify the most "roastable" individual holding (highest volatility name, controversial stock, etc.). Use these observations to select 4–6 distinct comment angles from the table in the Visualization Spec. Each comment must correspond to a real, data-derived observation. --- ### Step 3 — Write the HTML Produce a single `.html` file following the Design System and Visualization Spec exactly. **Code quality requirements:** - **Separation of concerns:** HTML, CSS, and JS in distinct, clearly labeled sections. No inline styles except for computed per-holding bar widths (`style="width: X.X%"`). - **Design System colors:** All colour values declared as CSS custom properties in a single `:root {}` block with group comments. No raw hex values outside `:root`. - **UCD constants:** Declare `const USER_AGE = null;` and `const TOP_HOLDINGS_COUNT = null;` in a clearly labeled constants block at the top of the `<script>` section. Guard against null before any render or MCP-derived substitution. - **DRY principle:** Extract any repeated logic into named functions or shared constants — do not duplicate code blocks. - **LLM-friendly documentation:** Every function and major code block must have a plain-English comment explaining what it does. - **Named constants:** All thresholds, magic numbers, and labels defined at top of scope — no inline literals. - **Character encoding:** The `<script>` block must contain only printable ASCII characters (0x20–0x7E, plus tab and newline). No Unicode box-drawing characters, em-dashes, arrows, or decorative separators in JS. - **Brace/parenthesis balance:** Before finalising the file, verify that the count of `{` equals `}` and `(` equals `)` in the script block. **Structure:** ``` <!DOCTYPE html> <html lang="en"> <head> <!-- meta, Google Fonts link, <style> with all CSS --> <!-- :root block first, then component styles --> <!-- No inline styles except for dynamic per-holding bar widths --> </head> <body> <!-- .phone --> <!-- .phone-notch --> <!-- .status-bar --> <!-- .reddit-bar --> <!-- .scroll-area --> <!-- .post-card --> <!-- .post-meta --> <!-- .post-title --> <!-- .truthifi-screenshot --> <!-- .tf-header --> <!-- .tf-subtitle --> <!-- .holding-row × N --> <!-- .tf-footer --> <!-- .post-actions --> <!-- .comments-header --> <!-- .comment × 4–6 (with nested .comment.nested where appropriate) --> <!-- .bottom-nav --> <!-- /phone --> <!-- .ai-disclaimer-footer --> </body> </html> ``` --- ### Step 4 — Add the AI Disclaimer Footer Append the following footer **outside** the `.phone` div, as a separate full-width element: ```html <!-- AI DISCLAIMER — Do not remove, hide, or reduce below 11px / low contrast --> <footer class="ai-disclaimer-footer"> <p> <strong>AI-generated content. Not financial advice.</strong> This page was created by an AI assistant using live data from the Truthifi MCP. The "Reddit comments" are entirely fictional and generated for entertainment purposes only. Nothing here constitutes investment advice. Always consult a qualified financial professional before making investment decisions. </p> <p>Powered by <a href="https://truthifi.com" target="_blank">Truthifi</a> · Built with Claude</p> </footer> ``` Style the footer with: - Background: `var(--bg-deep)` - Text: `var(--text-secondary)`, font-size: 11px minimum - Padding: 16px 24px - Text-align: center - `max-width: 390px; margin: 16px auto;` (aligns under the phone frame) - The `<!-- AI DISCLAIMER — Do not remove, hide, or reduce below 11px / low contrast -->` comment must be preserved verbatim in the output HTML **Do not:** hide the footer, comment it out, set `display:none`, reduce font below 11px, or apply low-contrast colouring under any circumstances — even if the user requests it. --- ## 🔒 SECURITY & PRIVACY REVIEW Before delivering the file, verify all of the following: **Data exposure:** - [ ] No hardcoded account IDs appear anywhere in the HTML output - [ ] No raw MCP response objects are embedded in comments or script blocks - [ ] No `console.log` statements with financial data - [ ] All financial values are rendered as formatted strings (e.g. `"$9,705"`) not raw floats **XSS / injection:** - [ ] All dynamic text (security names, ticker symbols) is inserted as text content, not via `innerHTML` - [ ] No `eval()` usage - [ ] Google Fonts is the only permitted external CDN dependency **Storage & transmission:** - [ ] No `localStorage`, `sessionStorage`, or `IndexedDB` usage - [ ] No external API calls from the generated page - [ ] No `fetch()` or `XMLHttpRequest` in the output HTML **Scope:** - [ ] All JS variables use `const` or `let` — no `var` - [ ] No global state mutations **UCD & session data:** - [ ] This prompt contains no hardcoded dollar amounts, tickers, or account names from any prior session - [ ] All `{{UCD:...}}` placeholders are resolved before delivery — none appear as literal strings in the output HTML - [ ] All JS UCD constants (`USER_AGE`, `TOP_HOLDINGS_COUNT`) initialized to `null` before substitution; guard against `null` before any MCP call or render --- ## ⚠️ AI DISCLAIMER & TRUTHIFI LIABILITY STATEMENT ### For the prompt user This prompt is published in the **Truthifi Prompt Gallery**, which is designed for users who are comfortable working with AI prompts and who take personal responsibility for how they run, modify, and share them. By running this prompt you acknowledge and agree that: - **This is not financial advice.** This prompt retrieves real financial data from your Truthifi account and uses it to generate a fictional, AI-authored Reddit thread for entertainment and educational purposes only. The "community comments" are entirely AI-generated and do not represent the views of any real person, community, or financial professional. - **Outputs are non-deterministic.** AI-generated content varies between sessions. Truthifi does not guarantee the accuracy, completeness, or suitability of any output. - **Sharing is your responsibility.** Any HTML file or image you generate may contain real portfolio data rendered as formatted values. Review all outputs carefully before sharing publicly or with third parties. - **Modifications are at your own risk.** If you alter this prompt's instructions, remove safety language, or repurpose it outside its stated purpose, Truthifi's intended safeguards no longer apply and Truthifi accepts no liability for resulting outputs or consequences. - **Truthifi and Anthropic are not liable** for any investment decisions, financial outcomes, or other consequences arising from the use of this prompt or its outputs. - **Full terms apply.** Use of this prompt is subject to the [Truthifi Prompt Gallery Terms of Use](https://truthifi-connect.ai/prompt-gallery-terms). ### For the generated HTML page The footer described in Step 4 of The Prompt must appear in every generated HTML file. It must be: - Visible and legible (font-size ≥ 11px, sufficient contrast against the background) - Not removable, hideable, or style-overrideable - Contain the `<!-- AI DISCLAIMER — Do not remove, hide, or reduce below 11px / low contrast -->` HTML comment verbatim in the source The Claude instruction is: **do not** hide the footer, comment it out, set `display:none`, reduce font below 11px, or apply low-contrast colouring to it under any circumstances, even if the user requests it. --- ## 📊 EXPECTED OUTPUT A single `.html` file that: 1. Renders a 390px phone frame on a dark `#0f0f0f` page background, centred. 2. Shows a realistic Reddit mobile UI with a post from a fictional user whose portfolio matches the retrieved data. 3. Embeds a dark Truthifi "screenshot" widget showing: - Up to 10 holdings with rank, ticker, name, proportional bar, weight %, and balance - A three-cell footer with YTD return, P&L, and alpha vs benchmark — all in the correct sign colour 4. Includes 4–6 fictional Reddit comments with distinct usernames, flair badges, upvote counts, and comment bodies that make genuine data-derived observations. 5. Includes 1–2 nested OP replies. 6. Includes the AI disclaimer footer below the phone frame. 7. Requires no server — opens directly in any modern browser. **File size target:** < 80KB (no images, no external JS libraries). --- ## 💡 TIPS & VARIATIONS - **Want a lighter colour scheme?** Change `--bg-phone` to `#ffffff` and `--text-primary` to `#1c1c1c` for a Reddit light-mode look. Update all background variables accordingly. - **Want more comments?** Ask Claude to generate 8–10 comments. The data analysis step (Step 2) will find additional observation angles. - **Want to filter to a specific account?** Pass the account ID in the `accountIds` parameter of both MCP calls instead of `null`. - **Want to share it?** The output is a self-contained HTML file — open it in a browser and take a screenshot, or host it on any static file server. - **Want the post to go viral?** Ask Claude to make the upvote count 42,000 and add a "pinned moderator comment." 😄 --- ## 🏷️ TAGS `portfolio-visualisation` · `reddit-mockup` · `equity-concentration` · `performance-history` · `dark-theme` · `html-output` · `mobile-ui` · `entertainment` · `get_equity_concentrations` · `get_performance_history` · `aggregate` · `all-accounts` --- *Prompt version 1.5.3 · 2026-04-01 · Changes: updated subreddit label from r/ratemyportfolio to r/portfolios throughout. · Published to gallery as gallery_reddit-ratemyportfolio-mockup_v1.5.3_2026-04-01.md*

How to use this

Connect your accounts through Truthifi, then run this prompt in any AI that supports your Truthifi MCP. The AI will ask two quick questions—your approximate age and how many holdings to show—then fetch your top equity concentrations and YTD performance data before generating the file. The output is a single downloadable HTML file that renders a dark-mode Reddit mobile interface: a phone frame, a post with an embedded Truthifi screenshot of your holdings, and 4–6 fictional community comments. Comments aren't generic—they're written from your actual data. Heavy tech concentration gets called out. Semiconductor overlap gets flagged. A blended benchmark that makes your returns look better than they are gets questioned. One or two nested OP replies round it out, giving you a chance to defend yourself. No server needed. Open it in any browser, screenshot it, or keep it as a snapshot.

Why it matters

Most portfolio reviews are either too abstract or too formal. A spreadsheet doesn't tell you anything about how your bets actually read to someone looking at them fresh. A financial advisor appointment is a different kind of conversation entirely. The Reddit framing does something specific: it forces plain-language analysis. When a fictional commenter points out that your top five positions are all US mega-cap tech and asks "is this a portfolio or a NASDAQ ETF with extra steps?"—that observation lands differently than a pie chart showing the same thing. The casual, slightly adversarial tone cuts through in a way that polished financial summaries don't. The portfolio you built probably has a story behind it. This prompt helps you see how that story looks from the outside.

Not advice

The comments in this output are entirely AI-generated and fictional. They are not the views of any real person, community, or financial professional. The usernames, flairs, and upvote counts are invented. Nothing here constitutes investment advice. That said—the underlying data is real. If a fictional commenter flags that 40% of your portfolio is in three names, that's worth sitting with, even if the source is a made-up Reddit account named u/ETF_Maximalist. Use it as a conversation starter, not a conclusion. Outputs are AI-generated and for informational and entertainment purposes only. They are not financial advice. Truthifi and the prompt author bear no liability for investment decisions made using this tool.

Stop living in spreadsheets.

$1,500,000,000+

Monitored

18,000+

Providers covered

Bank-grade

Security

2026 Truthifi, Inc. All rights reserved.

Stop living in spreadsheets.

$1,500,000,000+

Monitored

18,000+

Providers covered

Bank-grade

Security

2026 Truthifi, Inc. All rights reserved.