↗ Open Main App

Admin Console Dashboard

Shares this browser's localStorage with the Wealth Analyzer app for keys, configuration, research and proposals; plans move between them as saved files. No backend required.

Market Data Provider Status
Recent Activity

User Management

Track the clients registered in this console. The demo has no server and the main app saves plans as files, so plans never appear here on their own: to add a client, load their saved plan file in Profile Manager and press Inject, or use + Add User. Click Build Portfolio on any user to send their plan to the AI Agent (Claude, needs an AI key) and draft a recommendation for advisor review.

All Users
How users get added: this console watches its wa_pending_profile localStorage key, which Profile Manager's Inject fills from a saved plan file (the main app saves plans as files and never writes this key). The profile found there is registered as a user; Capture injected profile does the same on demand. You can also manually add users via the + Add User button.

Portfolio Construction

Builds a portfolio recommendation from the client brief, the research cached from 19 sources (a curated baseline of house views, plus live feeds when the data proxy is set) and the curated fund universe, in one of two ways: the deterministic Research Engine (no AI), or the AI Agent (Claude, needs an AI key).

Firm setting · AI features
Off by default (local mode): documents are read on the device, the Portfolio Builder and this console use their rules engines, and the browser refuses any connection either page tries to open to an AI service. On: the AI Agent here, and Claude for uploads the adviser chooses it for, send data to Anthropic. Current state: …
Client-app feature · Portfolio Builder
Controls whether the Portfolio Builder tab (rules engine; AI only if the firm turns it on) appears in the client-facing Wealth Analyzer app. Switch it off to ship the clean, advisor-only edition. Current state: …
Applies on the client app's next load, or instantly when its browser tab regains focus (same site / shared browser).
① Client Brief
Goals (name | year | amount, one per line)
Notes / mandates
② Research Sources (all 19 enabled by default)
Sources refresh when you open this tab and every 5 minutes. Live items need the data proxy (Market Data tab); without it each source shows only the curated baseline catalogue (as of 2026-07-31). Uncheck any you want to exclude.
③ Build Portfolio: Deterministic Research Engine
The Research Engine scans every cached research item from the ticked sources (up to 19), extracts asset-class signals, theme votes, sector calls, and regional positioning via keyword matching. It then picks funds from the universe based on consensus strength and your constraints. Each position cites the cached research items behind its asset-class call (the curated baseline unless live feeds are configured). No LLM call required. It runs instantly and is fully deterministic + auditable.
③b Build Portfolio: AI Agent
Alternative: send the full client brief + research excerpts to the AI engine for an LLM-augmented recommendation. Use this when you want narrative reasoning beyond signal counts.
How the Research Engine Selects Funds: Full Decision Logic
Every Research Engine pick is traceable: a deterministic 5-stage pipeline with explicit scoring, constraints and rationale. The AI Agent (③b) does not run this pipeline: it is given the same brief, research excerpts and fund list and chooses weights itself. Its output is then only checked (eligible tickers, weights sum to 100, position cap).
STAGE 1: Signal Extraction from Research
For each cached research item (about 60 per source in the curated baseline, up to 150 with live feeds), the engine parses the title + summary against keyword lexicons:
  • Sentiment lexicons: 31 bullish phrases (overweight, bullish, favor, top pick, outperform, attractive, compelling, upside, tailwind, constructive, accumulate…) weighted +1 to +3. 31 bearish phrases (underweight, bearish, avoid, cautious, stretched, headwind, exit, trim…) weighted −1 to −4.
  • Asset class detection: 6 classes scanned for phrases (equity, fixed income, real estate, commodity, cash, alternative). Item sentiment is applied to the class as a signed vote.
  • Sector detection: 11 sectors with specific ticker tags (Tech: NVDA/MSFT/QQQ/XLK; Healthcare: LLY/NOVO/XLV; Financials: JPM/XLF; Energy: XOM/CVX/XLE; etc.).
  • Region detection: 7 regions (US, Europe, Japan, China, India, EM, Developed Intl).
  • Theme detection: 11 themes (AI, decarbonization, GLP-1, defense, reshoring, cybersecurity, demographics, water, crypto, dividend growth, quality factor).
  • Ticker extraction: regex against the full fund universe (979 funds) + 30 common stocks. Each mention recorded with the provider name for conviction scoring.
STAGE 2: Cross-Provider Consensus Aggregation
Net votes summed across all 19 providers. For each signal (e.g. "overweight Equity"), the engine tracks:
  • Total net votes: sum of all signed sentiments across all items mentioning this signal
  • Provider count: number of sources that mention the signal, and how many of them lean the net direction (the figure the rationale cites)
  • Top 8 supporting research items: kept for citation in the position's rationale
  • Ticker mentions: every cached item that names a fund's ticker is counted, with the provider; in Stage 4 a named fund gets +2 plus 0.3 per mention
Example: If BofA, JPM, Morgan Stanley, Goldman, BlackRock, and Pictet all express "overweight equities" with weight 3 each → Equity gets +18 net votes from 6 providers
STAGE 3: Strategic Asset Allocation (Risk Baseline + Research Tilt)
Starts with a risk-profile baseline, then tilts based on research consensus:
Risk ProfileEquityFixed IncReal EstateCommodityCashAlts
Very Conservative20%60%5%5%10%0%
Conservative30%55%5%3%5%2%
Mod. Conservative40%45%5%3%3%4%
Moderate55%30%7%3%0%5%
Mod. Aggressive65%20%7%3%0%5%
Aggressive75%10%8%2%0%5%
Very Aggressive85%5%5%0%0%5%
Research tilt: each asset class can be shifted ±8 percentage points from baseline based on net votes. Formula:
tilt = max(-8, min(+8, netVotes / 4))
allocation[class] = baseline[class] + tilt
So +24 net votes adds 6 points to a class and −16 removes 4, before the whole allocation is rescaled to sum to exactly 100%, which shrinks the shifts when most classes tilt the same way.
STAGE 4: Fund Selection from Universe
For each asset class with allocation ≥ 2%, the engine picks specific funds:
  1. Filter candidates by class: only funds where fund.cls === targetClass
  2. Apply hard constraints:
    • Domicile: only funds eligible for the client's country (e.g. US-listed funds for US and Canadian residents, UCITS funds for EU and UK residents, Swiss and UCITS funds for Swiss residents)
    • If ESG = strict → keep only funds with esg: true flag
    • If liquidity = high → keep only ETFs, money-market funds and exchange-traded commodity vehicles (unless that would leave the sleeve empty)
  3. Score each candidate (the formula in pickFundsForClass):
    score = (1 − ER) ← cost (ER in %, capped at 1)
         + 1.8 × min(2, max(0, 1.5 × Sharpe))
         + clamp(5y return / 10, −1, +2)
         + 0.6 × min(1.5, log10(AUM in $B) / 2)
         + 0.4 × min(1, log10(holdings) / 4)
         − 0.8 × max(0, (|maxDD| − 25) / 50)
           (each quality figure is the fund's curated value; where none is on file, the median of the curated values in that sleeve, so a missing figure neither helps nor hurts)
         + 2 + 0.3 × mentions if the fund's ticker is named in the cached research
         + research alignment: region (×0.8), sector (×0.6) and theme (×0.5) stance, summed and clamped to ±2
         + currency: cash sleeve +3 client currency, +1 same currency bloc, −2 otherwise; other sleeves +0.5 client currency, −3 a share class hedged to another currency, +0.15 same bloc
         − 0.3 if the sponsor is already used for another position
         + 0.5 for an ETF when tax sensitivity is high
         − 0.3 to 0.5 risk-fit penalty when the fund's own volatility on file does not suit the risk profile (σ > 10% very conservative, σ > 14% conservative, σ < 8% aggressive or very aggressive)
  4. Sort by score and pick top N funds (never two share classes of the same fund) where:
    • N = 1 if class weight < 12%
    • N = 2 if class weight between 12% and 25%
    • N = 3 if class weight ≥ 25%
  5. Equal weight within the sleeve: each pick gets the sleeve weight / N
  6. Renormalize: all weights scaled to sum to 100%
  7. Apply max-position cap: if user set maxPosition = 20%, no single position exceeds 20%; the excess goes to positions with headroom (if the cap cannot be met with the positions chosen, it is not applied and the risks list says so)
STAGE 5: Rationale Generation (per position)
Every fund pick gets a multi-part rationale:
  • Consensus citation: "N/19 providers overweight [class] (+X net votes)"
  • Specific ticker mentions: if applicable, "VTI explicitly mentioned by BlackRock, Vanguard + 2 more"
  • Cost rationale: "Low expense ratio (0.03%)"
  • Constraint match: "ETF wrapper preferred for high tax sensitivity" or "ESG-flagged matches preference"
  • Top 3 research citations: bulleted list of the actual research items that drove the asset-class consensus, each tagged with the providing institution
WORKED EXAMPLE: Moderate Profile, Sample Walkthrough (illustrative)
Illustrative only: the research counts are invented, and the fund scores below use an older, simplified formula (cost + ticker mentions − sponsor repeat). They do not reproduce the full Stage 4 score, so a real run can rank funds differently.
Brief: risk = moderate · NW = $500k · ESG = none · tax = medium · liquidity = medium · max pos = 20%
Research scanned: 1,420 items across 19 providers

Signals extracted:
• Equity: +28 net votes from 14 providers (overweight consensus)
• Fixed Income: +8 net votes from 11 providers
• Real Estate: −2 net votes (mixed views)
• Cash: −12 net votes (underweight)
• Top theme: AI (19/19 providers, 67 votes)
• Ticker mentions: VTI 4x, IVV 6x, AGG 5x, QQQ 8x

Allocation (Moderate baseline tilted by research):
• Equity: 55% baseline + 7% tilt (28/4) = 62%
• Fixed Income: 30% + 2% = 32%
• Real Estate: 7% − 0.5% = 6.5% (but rounds down, stays at 7%)
• Cash: 0% − 3% (floor at 0) = 0%
• Normalized to 100%

Fund picks for Equity (62% → 3 funds):
• IVV 20%: score = 0.97 + 2 + 1.8 (mentions) − 0 = 4.77 → highest
• QQQ 20%: score = 0.80 + 2 + 2.4 (8 mentions) − 0.2 (BlackRock used) = 5.00 → highest
• VXUS 22%: score = 0.93 + 0 − 0.2 = 0.73 (no mention, but good for diversification)

Rationale for IVV:
14/19 providers overweight Equity (+28 net votes) ·
IVV explicitly mentioned by BlackRock, BofA, JPM + 3 more ·
Low expense ratio (0.03%)
Citations:
• [BofA] "Equities: Overweight quality large caps; mid-single-digit S&P returns"
• [BlackRock] "iShares Top Picks: IVV, AGG, IEMG"
• [JPM] "Guide to the Markets: 60/40 6-8% expected next decade"
Determinism guarantee: the Research Engine is fully deterministic. Same brief + same cached research → always same output. Run it twice in a row and verify identical fund picks via the Engine Stress Test tab → "Robustness Checks" → "Determinism" test. The only thing that changes the output is (a) you change the brief, (b) new research arrives in the cache, or (c) you modify the fund universe / risk-baseline / scoring constants directly in the code.
How the AI agent differs: the AI version receives the same client brief, the first 20 cached research items from each ticked source and the same eligible fund list, but uses an LLM to reason narratively over the inputs. It may suggest weights that deviate from the deterministic baseline (e.g. tactical overweights based on theme strength), and can produce richer prose rationale. Both produce the same JSON shape and feed the same Export-to-Proposal button, and the export records which one built it. Pick deterministic for auditability, AI for narrative reasoning.
Curated Fund Universe

Research Library

19 sources: each firm's own RSS feed where it publishes one and Google News headlines about the firm (both need the data proxy), plus a curated baseline of house-view themes (as of 2026-07-31) that is always included. The Research Engine and the AI Agent build from whatever is cached here.

Sources (re-checked every 5 minutes; live only with the data proxy)
Ingest a monthly issue (paste or upload an issue you have access to · click to expand)
Latest Items

Research Engine Stress Test

Daily sensitivity & robustness testing for the deterministic Research Engine. Sweep across risk profiles, net worth levels, ESG settings, and research provider counts, then verify the engine reacts coherently to every input change. Daily benchmark snapshots track engine drift over time.

Daily Benchmark Snapshot
Records today's engine output for a standard benchmark client (Moderate risk · $500k NW · $150k income · 15+ year horizon · Medium tax sensitivity · No ESG preference). Run daily to track how engine recommendations drift as the cached research changes (only with live feeds, or when the curated baseline is updated).
Sensitivity Sweeps
Run the engine 3-7 times with one parameter varied. See how allocation shifts in response. Useful for finding edge cases or verifying expected behavior.
Robustness Checks
Verify the engine produces sensible output across edge cases. Each check runs the engine once and grades the result green/amber/red.
A/B Comparison
Run the engine twice with two different briefs side-by-side. Useful for showing clients how their portfolio changes between scenarios.
Scenario A
Scenario B

Calculation Test Bench

Run the console's own copies of the core formulas (present and future value, annuities, mortgage payments, RMDs, bracket tax, a basic Monte Carlo) with custom inputs, or run their automated checks. The main app's full engine is not tested here.

Automated Test Suite
Manual Function Test

Constants Editor

Edit and export a copy of the main app's financial constants. Edits stay in this console and do not change the main app; export them as JSON for a deployment.

Risk Profiles (μ / σ)
Inflation Regions (50-yr CPI avg)
Loan Defaults

Monte Carlo Stress Test

Parameter sweep: vary one input while holding others constant, plot p10/p50/p90 across the sweep range.

Results

Profile Manager

Load any wealth-profile.json saved from the main app, inspect it, edit fields, and inject it into this console's client list and Portfolio Agent brief (the main app itself loads plan files through Settings, Load profile).

Client Intake Questionnaire

The blank 4-page client questionnaire (household, income, expenses, assets, goals, retirement, risk, tax, disclosure). Download it to send to a client, or print and have them fill it in, then upload the completed form in the main app (Upload Document reads it on the device) or type it in.

Profile JSON
No profile loaded.

Market Data Console

Test live quote retrieval from free, keyless sources (verified 2026-09-25). Working directly from the browser: CoinGecko and Coinbase (crypto), Frankfurter/ECB and Open ER API (FX). Yahoo Finance (equities/ETFs) and ticker/ISIN lookups via OpenFIGI send no CORS headers, so they need the data proxy below. The public corsproxy.io fallback no longer accepts anonymous requests. Stooq was retired upstream and CryptoCompare now requires a key, so both were removed.

Your free Cloudflare Worker (wa-price-proxy.worker.js). Optional: it replaces the built-in proxy that the demo uses when this field is empty, for Yahoo prices, ticker/ISIN lookups (OpenFIGI) and Research Library feeds, which block direct browser calls (corsproxy.io no longer accepts anonymous requests). The client app and the tests below share it (per browser). Prices are cached, so a last-known value still shows if a fetch fails.
Result
Enter a ticker and click Fetch Quote.

Tax Database

Browse income tax for all 39 supported countries: national/federal brackets + representative regional/state/municipal tax, synced live from the client app. US ZIP auto-detection is wired into the main app (below).

ZIP Lookup
Browse

Tax Data Accuracy

Tracks the income-tax dataset the client app actually uses: coverage, the official source authority per country, tax year, automated sanity checks, and your manual verification status. The dataset syncs live from the main app via shared browser storage.

Coverage & verification

API Keys & Endpoints

All credentials stored in browser localStorage and shared with the main app. The AI key is tested only when you press Test, and only while AI features are on: each test is a small billed request to Anthropic.

Firm setting · AI features
Off by default (local mode): documents are read on the device, the Portfolio Builder and this console use their rules engines, and the browser refuses any connection either page tries to open to an AI service. On: the AI Agent here, and Claude for uploads the adviser chooses it for, send data to Anthropic. Current state: …
Enter a ticker (VOO, AAPL), ISIN/UCIT number (IE00B3RBWM25), exchange symbol (VUSA.L, IWDA.AS), or fund name to search in the main app's Add Investment box. Data fills automatically from Yahoo Finance & OpenFIGI (no key needed; both go through the data proxy, built in unless you set your own on the Market Data tab). This tab holds the AI key, tested only when you press Test. Market-data keys are entered in the client app (Settings, Provider API keys).
Keys (the AI key is tested only when you press Test)
ProviderKeyStatusHealthAction
Equity quote APIs (free tier): finnhub · alphavantage · twelvedata · FMP · tiingo · polygon · intrinio · Nasdaq Data Link · EOD HD · marketstack · stockdata · finazon
Account-based: tradier · alpaca · RapidAPI Yahoo
News: NewsAPI · marketaux · benzinga
Crypto: CoinMarketCap · messari
FX: Open Exchange Rates · CurrencyAPI.com · CurrencyLayer
Macro + AI: FRED · AI Assistant

No key needed (verified 2026-09-25): CoinGecko · Coinbase Spot · Frankfurter (ECB) · Open ER API · Treasury.gov. Yahoo Finance needs no key; it works through the data proxy (built in, or your own on the Market Data tab).
No longer usable from the browser: Stooq (CSV endpoint retired) · CryptoCompare (now key-required) · ExchangeRate.host (now key-required) · SEC EDGAR filings (data.sec.gov blocks browser requests; ticker→CIK lookup still works)

System Logs

Action log kept in this browser (last 200 entries, can be cleared), browser environment, and full localStorage inspector.

Action Log
Browser / Environment
localStorage Inspector

Documentation

How the admin connects to the main Wealth Analyzer app and how to use each tab.

How the admin connects to the main app

Both admin.html and wealth-analyzer.html are static files sharing the same browser origin and therefore the same localStorage. The admin reads + writes specific keys that the main app reads on load:

localStorage keyDirectionDescription
wa_app_versionsharedCurrent app version stamp
wa_pending_profileadmin onlyProfile injected by Profile Manager, read by User Management and the Portfolio Agent brief (the main app does not read it)
wa_pending_proposaladmin → mainRecommendation exported from the Portfolio Agent tab (Research Engine or AI Agent; the payload's engine field says which)
wa_ai_keysharedAI assistant key
fhKey, avKey, wa_polygon_key, etc.sharedMarket data provider API keys
wa_research_configadmin → mainProvider feed URLs, enabled state, cached items (the client app's Portfolio Builder reads the cache)
wa_admin_constantsadmin onlyEdited RISK_PROFILES, REGIONS, LOAN_DEFAULTS
wa_admin_logsadmin onlyAction log (last 200 entries, clearable)

Tab guide

  • Dashboard: KPI grid + provider status + recent activity
  • Portfolio Agent: deterministic Research Engine, or the AI Agent (Claude, needs a key), over the cached research
  • Research Library: Configure RSS feeds for each institutional source
  • Calc Test Bench: Check the console's copies of the core formulas
  • Constants Editor: Edit and export copies of RISK_PROFILES, REGIONS, LOAN_DEFAULTS (the main app keeps its own)
  • Monte Carlo Stress: Parameter sweep with p10/p50/p90 chart
  • Profile Manager: Load, edit, inject user profiles
  • Market Data: Test the 5 free market-data sources live
  • Tax Database: the client app's 39 countries, plus a US ZIP → state lookup
  • API Keys: Central credential management
  • System Logs: Action log + diagnostics