{"id":45781381,"url":"https://github.com/furic/richfolio","last_synced_at":"2026-03-09T10:04:32.490Z","repository":{"id":340368888,"uuid":"1165710127","full_name":"furic/richfolio","owner":"furic","description":"A zero-maintenance morning email digest for your investment portfolio. Set your target allocations once — get daily buy signals, P/E analysis, allocation gaps, and AI-summarised news via GitHub Actions. Free to run. Fork and configure in minutes.","archived":false,"fork":false,"pushed_at":"2026-03-05T11:45:33.000Z","size":3232,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-05T15:37:45.345Z","etag":null,"topics":["buy-signals","cron","email-digest","etf","gemini-ai","github-actions","investing","morning-brief","personal-finance","portfolio","rebalancing","resend","stocks","typescript","wealth-management","yahoo-finance"],"latest_commit_sha":null,"homepage":"https://furic.github.io/richfolio/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/furic.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-02-24T13:11:54.000Z","updated_at":"2026-03-05T11:45:36.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/furic/richfolio","commit_stats":null,"previous_names":["furic/richfolio"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/furic/richfolio","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/furic%2Frichfolio","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/furic%2Frichfolio/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/furic%2Frichfolio/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/furic%2Frichfolio/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/furic","download_url":"https://codeload.github.com/furic/richfolio/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/furic%2Frichfolio/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30291003,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-09T02:57:19.223Z","status":"ssl_error","status_checked_at":"2026-03-09T02:56:26.373Z","response_time":61,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["buy-signals","cron","email-digest","etf","gemini-ai","github-actions","investing","morning-brief","personal-finance","portfolio","rebalancing","resend","stocks","typescript","wealth-management","yahoo-finance"],"created_at":"2026-02-26T11:04:01.531Z","updated_at":"2026-03-09T10:04:32.485Z","avatar_url":"https://github.com/furic.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/icon.png\" alt=\"Richfolio\" width=\"120\"\u003e\n\u003c/p\u003e\n\n# Richfolio\n\n[![Portfolio Monitor](https://github.com/furic/richfolio/actions/workflows/portfolio-monitor.yml/badge.svg)](https://github.com/furic/richfolio/actions/workflows/portfolio-monitor.yml)\n[![Docs](https://github.com/furic/richfolio/actions/workflows/docs.yml/badge.svg)](https://furic.github.io/richfolio/)\n[![Node.js](https://img.shields.io/badge/Node.js-22%2B-339933?logo=node.js\u0026logoColor=white)](https://nodejs.org/)\n[![TypeScript](https://img.shields.io/badge/TypeScript-strict-3178C6?logo=typescript\u0026logoColor=white)](https://www.typescriptlang.org/)\n[![Gemini](https://img.shields.io/badge/Google_Gemini-2.5_Flash-4285F4?logo=google\u0026logoColor=white)](https://ai.google.dev/)\n[![npm](https://img.shields.io/npm/v/richfolio?logo=npm\u0026logoColor=white)](https://www.npmjs.com/package/richfolio)\n[![License: ISC](https://img.shields.io/badge/License-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n[![Cost](https://img.shields.io/badge/Cost-%240%2Fmonth-2ecc71)](https://furic.github.io/richfolio/features)\n\nA zero-maintenance portfolio monitoring system. Set your target allocations once, get daily briefings with allocation gaps, AI-powered buy signals, and relevant news — delivered via email and Telegram, automatically via GitHub Actions.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/screenshots/morning-debrief.png\" alt=\"Daily Brief\" width=\"260\"\u003e\n  \u0026nbsp;\u0026nbsp;\n  \u003cimg src=\"docs/screenshots/intraday-alert.png\" alt=\"Intraday Alert\" width=\"260\"\u003e\n  \u0026nbsp;\u0026nbsp;\n  \u003cimg src=\"docs/screenshots/weekly-rebalance.png\" alt=\"Weekly Rebalance\" width=\"260\"\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/screenshots/strong-buy-analysis.png\" alt=\"STRONG BUY Analysis Page\" width=\"500\"\u003e\n\u003c/p\u003e\n\n## Who Should Use This\n\nRichfolio **does not pick stocks for you**. You should already have your own research and investment thesis — your own portfolio of stocks, ETFs, or crypto that you believe in.\n\nWhat Richfolio does is **monitor your portfolio daily** and help you decide **when** to buy. It tracks prices, technicals, news sentiment, and allocation gaps, then uses AI to surface the best timing opportunities across your holdings.\n\n- **You bring the portfolio** — set your target allocations once in a simple JSON config\n- **Richfolio brings the signals** — buy recommendations, limit order prices, and detailed analysis\n- **You make the final call** — every purchase decision is yours; the tool only suggests\n\n**No coding skill required.** Fork the repo, spend ~10 minutes registering free API accounts (Resend, NewsAPI, Gemini), paste your keys into GitHub Settings, and you're done. Everything runs automatically via GitHub Actions at $0/month.\n\n## Features\n\n- **AI Buy Recommendations** — Gemini-powered analysis considering valuation, allocation gap, news sentiment, technicals, and risk (with gap-based fallback). STRONG BUY tickers get a **\"More Details\"** link to a dedicated analysis page with interactive chart, buy thesis, risk analysis, and full metrics\n- **Value Investing Framework** — AI rates individual stocks A–D based on ROE, debt/equity, FCF, earnings growth, and analyst targets (data from Yahoo Finance, zero extra API calls)\n- **Bottom-Fishing Model** — AI detects oversold/accumulation zones for all tickers using RSI, volume contraction, 200MA position, and death cross signals\n- **Technical Momentum Signals** — SMA50, SMA200, RSI(14), golden/death cross, and momentum classification (bullish/bearish/neutral) for each ticker\n- **Limit Order Prices** — AI-suggested limit order prices based on nearby support levels (moving averages, recent lows, round numbers)\n- **Allocation Gap Analysis** — current vs target %, flagged by priority with suggested buy amounts\n- **Dynamic P/E Signals** — trailing P/E compared against historical averages fetched from Yahoo Finance (no manual benchmarks needed)\n- **ETF Overlap Detection** — reduces buy priority for ETFs where you already hold overlapping stocks (e.g., holding AAPL reduces VOO's priority)\n- **52-Week Range Signals** — highlights tickers near their 52-week low (opportunity) or high (caution)\n- **News Digest** — top headlines per ticker from NewsAPI\n- **Portfolio Health** — weighted beta, estimated annual dividend income\n- **Intraday Alerts** — periodic checks that alert only when buy signals strengthen vs the morning brief (configurable thresholds)\n- **Weekly Rebalancing Report** — focused drift analysis with BUY/TRIM/OK actions\n- **Dual Delivery** — dark-themed HTML email via Resend + condensed Telegram message\n\n## Quick Start\n\n1. **Fork** this repo on GitHub\n2. **Add config** — go to Settings → Secrets and variables → Actions:\n   - **Variables** tab: `CONFIG_JSON` (portfolio config) + `RECIPIENT_EMAIL` (your email)\n   - **Secrets** tab: `RESEND_API_KEY` — for email delivery\n   - Optionally: `NEWS_API_KEY`, `GEMINI_API_KEY`, `TELEGRAM_BOT_TOKEN`, `TELEGRAM_CHAT_ID`\n3. **Run** — trigger manually from Actions → Portfolio Monitor → Run workflow, or wait for the daily cron (8am AEST)\n\nThat's it — no local setup required. See the [full setup guide](https://furic.github.io/richfolio/getting-started) for detailed instructions on each API key.\n\n\u003cdetails\u003e\n\u003csummary\u003eLocal development\u003c/summary\u003e\n\n```bash\ngit clone https://github.com/furic/richfolio.git\ncd richfolio\nnpm install\ncp config.example.json config.json\ncp .env.example .env\n```\n\nEdit `config.json` and `.env`, then:\n\n```bash\nnpm run dev       # Daily brief (email + Telegram)\nnpm run intraday  # Intraday alert check (compares vs morning)\nnpm run weekly    # Weekly rebalancing report\nnpm run refresh -- SMH  # Re-analyze single ticker with after-hours price\n```\n\n\u003c/details\u003e\n\n## Stack\n\n| Component | Service | Cost |\n|-----------|---------|------|\n| Runtime | Node.js + TypeScript (tsx) | Free |\n| Prices \u0026 Fundamentals | Yahoo Finance (yahoo-finance2) | Free |\n| News | NewsAPI.org | Free (100 req/day) |\n| AI Analysis | Google Gemini 2.5 Flash | Free (250 req/day) |\n| Email | Resend.com | Free (3,000/month) |\n| Telegram | Telegram Bot API | Free |\n| Scheduler | GitHub Actions | Free (cron) |\n\n## Project Structure\n\n```\nrichfolio/\n├── src/\n│   ├── config.ts          # Typed loader for config.json + .env\n│   ├── index.ts           # Entry point (daily/intraday/weekly mode)\n│   ├── fetchPrices.ts     # Yahoo Finance: price, P/E, 52w, beta, dividends, ETF holdings, fundamentals\n│   ├── fetchTechnicals.ts # Yahoo Finance chart: SMA50, SMA200, RSI, momentum, volume change\n│   ├── fetchNews.ts       # NewsAPI: headlines per ticker\n│   ├── analyze.ts         # Allocation gaps, P/E signals, overlap discounts\n│   ├── aiAnalysis.ts      # Gemini AI: buy recs, limit prices, value ratings, bottom signals\n│   ├── detailedAnalysis.ts# Gemini 2.5 Flash: detailed buy thesis + risk analysis for STRONG BUY\n│   ├── analysisUrl.ts     # Compress analysis data into URL hash for GitHub Pages\n│   ├── email.ts           # Daily HTML email template + Resend\n│   ├── intradayEmail.ts   # Intraday alert email template\n│   ├── intradayCompare.ts # Compare current vs morning baseline\n│   ├── state.ts           # Morning baseline persistence\n│   ├── weeklyEmail.ts     # Weekly rebalancing email template\n│   └── telegram.ts        # Telegram bot delivery (daily/intraday/weekly)\n├── docs/\n│   ├── analysis/          # Static analysis page (decodes URL hash, renders with TradingView)\n│   └── *.md               # GitHub Pages documentation site\n├── .github/workflows/\n│   └── portfolio-monitor.yml  # Daily + intraday + weekly cron jobs\n├── config.example.json    # Template portfolio config\n├── .env.example           # Template environment variables\n├── package.json\n└── tsconfig.json\n```\n\n## How It Works\n\n```\nconfig.json + .env\n  → fetchPrices (Yahoo Finance: prices, P/E, 52w range, beta, dividends, ETF holdings, fundamentals)\n  → fetchTechnicals (Yahoo Finance chart: SMA50, SMA200, RSI, momentum, volume change)\n  → fetchNews (NewsAPI: top headlines per ticker)\n  → analyze (allocation gaps, P/E signals, overlap discounts, portfolio metrics)\n  → aiAnalyze (Gemini: buy recs + confidence + limit prices + value ratings + bottom signals)\n  → email + telegram (deliver daily brief with value ratings, bottom signals, technicals)\n```\n\nWeekly mode (`--weekly`) skips news and AI, producing a focused rebalancing report.\n\nIntraday mode (`--intraday`) re-fetches prices, technicals, and AI (skipping news), compares against the morning baseline, and alerts only for STRONG BUY-related changes: upgrades to STRONG BUY, downgrades from STRONG BUY, or confidence shifts ≥10 while at STRONG BUY.\n\nRefresh mode (`--refresh TICKER`) re-analyzes a single ticker using the latest available price (including after-hours/pre-market from Yahoo Finance). Outputs updated analysis to terminal and sends email + Telegram with a new analysis URL. Useful when you see an alert after market close and want an updated limit order based on after-hours price movement.\n\n## Updating Your Portfolio\n\nEdit `config.json` and push (or update the `CONFIG_JSON` GitHub Actions variable). The next run will reflect the changes.\n\n## References\n\nSee [docs/references.md](docs/references.md) for repos and resources referenced during design and build.\n\n## License\n\nISC\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffuric%2Frichfolio","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffuric%2Frichfolio","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffuric%2Frichfolio/lists"}