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.
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.
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).
- 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.
- 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
| Risk Profile | Equity | Fixed Inc | Real Estate | Commodity | Cash | Alts |
|---|---|---|---|---|---|---|
| Very Conservative | 20% | 60% | 5% | 5% | 10% | 0% |
| Conservative | 30% | 55% | 5% | 3% | 5% | 2% |
| Mod. Conservative | 40% | 45% | 5% | 3% | 3% | 4% |
| Moderate | 55% | 30% | 7% | 3% | 0% | 5% |
| Mod. Aggressive | 65% | 20% | 7% | 3% | 0% | 5% |
| Aggressive | 75% | 10% | 8% | 2% | 0% | 5% |
| Very Aggressive | 85% | 5% | 5% | 0% | 0% | 5% |
allocation[class] = baseline[class] + tilt
- Filter candidates by class: only funds where
fund.cls === targetClass - 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 withesg: trueflag - If
liquidity = high→ keep only ETFs, money-market funds and exchange-traded commodity vehicles (unless that would leave the sleeve empty)
- 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) - 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%
- Equal weight within the sleeve: each pick gets the sleeve weight / N
- Renormalize: all weights scaled to sum to 100%
- 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)
- 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
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"
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.
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.
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.
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.
Monte Carlo Stress Test
Parameter sweep: vary one input while holding others constant, plot p10/p50/p90 across the sweep range.
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).
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.
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.
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.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).
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.
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.
| Provider | Key | Status | Health | Action |
|---|
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.
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 key | Direction | Description |
|---|---|---|
wa_app_version | shared | Current app version stamp |
wa_pending_profile | admin only | Profile injected by Profile Manager, read by User Management and the Portfolio Agent brief (the main app does not read it) |
wa_pending_proposal | admin → main | Recommendation exported from the Portfolio Agent tab (Research Engine or AI Agent; the payload's engine field says which) |
wa_ai_key | shared | AI assistant key |
fhKey, avKey, wa_polygon_key, etc. | shared | Market data provider API keys |
wa_research_config | admin → main | Provider feed URLs, enabled state, cached items (the client app's Portfolio Builder reads the cache) |
wa_admin_constants | admin only | Edited RISK_PROFILES, REGIONS, LOAN_DEFAULTS |
wa_admin_logs | admin only | Action 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