Releases: furic/richfolio
v1.5.0 — International Currency Support
What's New
International Currency Support
- Portfolio now supports non-USD tickers (LSE, Frankfurt, and other exchanges) — configure
defaultCurrencyinconfig.jsonand holdings are automatically converted - FX rates fetched live from Yahoo Finance (
GBPUSD=Xconvention) in a single batch per run — no extra API key needed - Sub-unit fix for exchanges quoting in fractional units: GBp/GBX (LSE pence → GBP), ILA (TASE agorot), ZAc (JSE cents) automatically divided by 100
- All prices, limit orders, dividends, suggested buy values, and portfolio stats displayed in your default currency
- Multi-currency caveat shown in emails and Telegram when the portfolio spans currencies
totalPortfolioValueUSDdeprecated in favour oftotalPortfolioValue+defaultCurrencyin config
Ticker Name Tooltips
- Company full names shown as hover tooltips on ticker symbols in all emails (daily, intraday, weekly, refresh)
- Names sourced from Yahoo Finance
longNamefield
CI & Code Quality
- GitHub Actions CI now runs on all pull requests — catches type errors and formatting drift before merge
- Prettier formatting enforced across
src/andtest/ - Unit tests (63 tests via
node:test, zero dependencies) coveringformatMoney,applyFxRate, andSUB_UNIT_FIX npm test— unit tests;npm run smoke— live API smoke tests (manual)
Bug Fixes & Improvements
- Two-stage AI analysis (Observe → Decide) improves STRONG BUY consistency by separating data parsing from decision-making
- Earnings calendar guard: hard HOLD if earnings ≤3 days, cap at BUY if ≤7 days
- Guard pipeline (
guards.ts) programmatically enforces STRONG BUY criteria as a post-AI safety net - ATR (Average True Range), Stochastic %K/%D, and OBV trend added to technical indicators
- News sentiment scoring: each headline rated bullish/bearish/neutral + impact with overall per-ticker sentiment fed to AI
- Reasoning persistence: 7-day rolling history of AI conviction trends shown to Gemini each run
- Fixed STRONG BUY over-strictness and bond ETF confidence constant
Full Changelog: v1.4.0...v1.5.0
v1.4.0 — Macro Indicators & Smarter STRONG BUY
What's New
Macro Environment Context
- AI now receives real-time macro indicators (VIX, 10Y Treasury yield, S&P 500, Oil/WTI, USD/DXY) from Yahoo Finance — no extra API key needed
- Gemini writes macro-aware risk assessments instead of generic boilerplate (e.g. "elevated VIX + high yields suggest caution")
- Fed to both daily analysis and detailed STRONG BUY analysis prompts
Smarter STRONG BUY Criteria
- Price below 200-day MA added as a price-level signal — ETFs (which lack P/E data) now have a viable path to STRONG BUY without requiring near-52w-low
- Entry signals now require at least 1 price-level signal (P/E below avg, 52w position <30%, or below 200MA) — momentum signals alone no longer sufficient
- Golden cross correctly ignored when price is below 200MA (lagging artifact, not bullish)
Bond ETF Framework
- Two-tier framework: short-duration (BSV, SHY, etc.) hard-capped at BUY ≤65%; long-duration (TLT, BND, etc.) eligible for STRONG BUY at rate cycle peaks
- RSI/MACD/momentum explicitly excluded as buy signals for all bond ETFs
Bug Fixes
- Fixed 52-week position misinterpretation in detailed analysis — Gemini no longer confuses "% of annual range" with "% of 52w high"
- Fixed golden cross framing in detailed analysis when price is below both MAs
- Three-layer news filtering (financial phrases → language filter → Gemini relevance) reduces false positive headlines
Technical Indicators
- MACD (12/26/9) with bullish/bearish crossover detection
- Bollinger Bands with %B, bandwidth, and squeeze detection
- Explicit conflict resolution hierarchy (MACD for trending, Bollinger for range-bound)
- Bottom-fishing model: stricter threshold for stocks/ETFs (3+ indicators) vs crypto (2+)
Other
- Intraday alerts refocused on STRONG BUY signals only
- Baseline updated after intraday alert to prevent duplicate notifications
- Auto-generated news search terms from Yahoo Finance company names
- Docs rewritten as GitHub-first for non-technical users
Full Changelog: v1.3.0...v1.4.0
v1.3.0 — Refresh Analysis & Smarter Intraday Alerts
What's New
Refresh Analysis Mode
Re-analyze a single ticker with the latest price (including after-hours/pre-market) to get an updated limit order and analysis URL.
npm run refresh -- SMHAlso available via GitHub Actions: Run workflow → mode: refresh → ticker: SMH
- Uses Yahoo Finance
postMarketPrice/preMarketPrice(zero extra API calls) - Sends email + Telegram with updated analysis URL
- Useful when you see a STRONG BUY alert after market close and the price has moved
Smarter Intraday Alerts
Intraday alerts now focus exclusively on STRONG BUY signals:
- Upgraded to STRONG BUY — any action → STRONG BUY
- Downgraded from STRONG BUY — STRONG BUY → any other action
- Confidence changed ≥10 — while staying at STRONG BUY
Other Changes
- Fix: TradingView chart now renders correctly on the analysis page
- Fix: Detailed analysis uses Gemini Flash instead of Pro (avoids quota issues)
- Docs: Added "Who Should Use This" section to README
- Docs: Gemini free-tier quota gotcha and model swap guide
- UI: Repo icon and Google Gemini badge
Full Changelog: v1.2.0...v1.3.0
v1.2.0 — STRONG BUY Analysis Page
What's New
STRONG BUY Analysis Page
STRONG BUY tickers now include a "More Details" link in emails and Telegram messages. Clicking it opens a dedicated analysis page on GitHub Pages featuring:
- Interactive TradingView chart — 6-month candlestick with SMA50, SMA200, and RSI overlays
- Detailed buy thesis — 3-4 paragraph analysis generated by Gemini 2.5 Pro
- Risk analysis — specific risk factors to watch
- Key metrics grid — price, P/E, 52-week position, RSI, moving averages, momentum
- Fundamentals — ROE, debt/equity, margins, growth, analyst target
- Action summary — suggested investment amount, limit order price with reasoning
All data is compressed and embedded in the URL hash — no server-side logic needed. The page works offline once loaded.
Other Changes
- Fix intraday baseline — use age check instead of date string comparison
- CONFIG_JSON moved from Actions Secret to Variable for easier editing
- RECIPIENT_EMAIL moved from Actions Secret to Variable
- Cleaned up duplicate
setup.md(content already split across doc pages) - Updated screenshots, mockups, and documentation
New Files
src/detailedAnalysis.ts— Gemini 2.5 Pro call for detailed buy thesis + risk analysissrc/analysisUrl.ts— zlib compression + base64url encoding into URL hashdocs/analysis/index.html— Static analysis page (decodes URL hash client-side)
Full Changelog: v1.1.0...v1.2.0
v1.1.0 — Value Investing & Crypto Bottom-Fishing
What's New in v1.1.0
Two new AI analytical frameworks embedded into the Gemini prompt — zero additional API calls, stays within free tier. Inspired by @xingpt's AI agent skills article on BlockTempo.
New Features
- Value Investing Framework — AI rates individual stocks A–D based on five fundamental criteria: ROE > 15%, debt/equity < 50%, FCF/operating CF > 80%, positive earnings growth, and price below analyst target. Displayed as colored badges in email and Telegram
- Crypto Bottom-Fishing Model — AI detects BTC/ETH accumulation zones using four indicators: RSI < 30, volume contraction > 20%, price below 200-day MA, and death cross. 2+ triggers a bottom signal, 3+ strongly considers STRONG BUY with DCA recommendation
How It Works
Both features are prompt-only enhancements — structured analytical frameworks injected into the single Gemini call:
- Fundamental data (ROE, debt/equity, FCF, margins, growth, analyst targets) comes from Yahoo Finance's
financialDatamodule, added to the existingquoteSummarycall — zero extra API overhead - Volume change (7-day avg vs prior 30-day avg) computed from existing chart data for selling exhaustion detection
- Value ratings adjust AI confidence: A boosts ~10 points, D reduces ~10 points
- Bottom signals shown in daily email, intraday alerts, and Telegram messages
Screenshots
| Daily Brief | Intraday Alert | Weekly Rebalance |
|---|---|---|
![]() |
![]() |
![]() |
Files Changed
| File | Change |
|---|---|
src/fetchPrices.ts |
Added financialData module + 9 new QuoteData fields |
src/fetchTechnicals.ts |
Added volumeChange7d computation |
src/aiAnalysis.ts |
Extended schema, prompt with 2 frameworks |
src/email.ts |
Value rating badges + bottom signal rendering |
src/telegram.ts |
Value rating + bottom signal inline |
src/intradayCompare.ts |
Propagated new fields |
src/intradayEmail.ts |
Rendered new fields in alerts |
Upgrading
No config changes needed. Just pull the latest code — the new features activate automatically when Gemini is configured. Existing config.json and .env files work as-is.
Full Changelog: v1.0.0...v1.1.0
v1.0.0 — Technical Momentum & Limit Orders
What's New
Richfolio v1.0.0 — a zero-maintenance portfolio monitoring system with AI-powered buy signals, delivered daily via email and Telegram.
Features
- AI Buy Recommendations — Gemini 2.5 Flash analyzes valuation, allocation gaps, news sentiment, technicals, and risk
- Technical Momentum Signals — SMA50, SMA200, RSI(14), golden/death cross, momentum classification for every ticker
- Limit Order Prices — AI-suggested limit prices based on nearby support (moving averages, recent lows, round numbers)
- Allocation Gap Analysis — current vs target %, with suggested buy amounts
- Dynamic P/E Signals — trailing P/E compared against historical averages from Yahoo Finance
- ETF Overlap Detection — reduces buy priority when you hold overlapping stocks
- 52-Week Range Signals — highlights tickers near their 52w low or high
- News Digest — top headlines per ticker from NewsAPI
- Portfolio Health — weighted beta, estimated annual dividend income
- Intraday Alerts — periodic checks that alert only when buy signals strengthen vs morning brief
- Weekly Rebalancing Report — drift analysis with BUY/TRIM/OK actions
- Dual Delivery — dark-themed HTML email + condensed Telegram message
Stack
All free-tier services — $0/month to run:
| Component | Service |
|---|---|
| Prices & Fundamentals | Yahoo Finance (yahoo-finance2) |
| News | NewsAPI.org (100 req/day) |
| AI Analysis | Google Gemini 2.5 Flash (250 req/day) |
| Resend.com (3,000/month) | |
| Telegram | Telegram Bot API |
| Scheduler | GitHub Actions (cron) |
Getting Started
- Fork this repo
- Add secrets (
CONFIG_JSON,RESEND_API_KEY,RECIPIENT_EMAIL) - Run manually or wait for the daily cron (8am AEST)
See the full documentation for setup details.



