A free AI news briefing agent that runs on GitHub Actions, no server A free AI news briefing agent that runs entirely on GitHub Actions has been released, requiring no server and using two free API keys from Groq and Tavily. The tool, available at github.com/tballochi/daily-briefing, autonomously researches user-selected topics, writes summaries from real search results, and emails a daily digest, with a dry-run mode that sends nothing and stores nothing. Wake up to an AI-written news briefing in your inbox every morning, on the topics you choose, written from real freshly-searched articles.100% free, no server, runs entirely on GitHub Actions. A real briefing. Every headline, summary and link in it was chosen and written by the agent. It's 8am. Your coffee is still too hot to drink, so you open your inbox, and the only thing worth reading is already there. Three stories that actually matter to you, four sentences each, every source linked and dated. Nothing you were sent yesterday. No feed, no notifications, no twenty tabs you'll never get back to. While you were asleep, an agent searched the web on your topics, threw out the filler, read what was left and wrote it up. By the time your coffee is drinkable, you're caught up, and you close the tab and get on with your day. You need two free API keys . No Gmail, no deploy, no account anywhere else. git clone https://github.com/tballochi/daily-briefing.git cd daily-briefing pip install -r requirements.txt python main.py --setup asks for your keys and checks each one works python main.py --dry-run builds a real briefing, sends nothing Both keys are free: Groq https://console.groq.com/keys and Tavily https://app.tavily.com . Prefer not to use the wizard? Put them in a .env file yourself as GROQ API KEY= and TAVILY API KEY= . --dry-run researches the news, writes the briefing, prints it to your terminal and saves the rendered email to data/preview.html . It sends nothing and stores nothing , so you can see exactly what you'd be getting before setting up delivery. Then edit config.yaml to your own topics and run it again. Every morning, an autonomous agent: Researches. Runs live web searches across your topics, judges the results, and skips anything it already sent you on a previous day. Writes. Summarises the chosen stories from their real source text. No hallucinated facts, no fabricated links: every URL comes from a real search result. Delivers. Emails you a newspaper-style digest, at the time you choose. It's a tool-using agent, not a fixed script: it decides what to search, judges what's worth keeping, and searches again if the results are thin. In the email: your N top stories, each with a factual summary, source and publication date · a word of the day · a quote of the day. Optionally, one slot is reserved for a focus theme you never want to miss. One readable file, no code, no secrets: title: Daily Briefing shown in the email subject + header num articles: 3 how many stories per morning topics: what the agent researches free text - AI & LLMs GPT, Claude, agents, MCP - automation & no-code n8n, Zapier, Make - dev tools & open source focus: OPTIONAL: a story that's ALWAYS included label: shipping / maritime / logistics priority query: CMA CGM searched first; preferred when there's fresh news keywords: cma cgm, shipping, maritime, container, freight model: openai/gpt-oss-120b the Groq model the agent thinks with model fallbacks: tried in order if the one above is retired - openai/gpt-oss-20b - qwen/qwen3.8-27b Topics are free text, so point it at finance, climate, football, your industry, whatever you want to wake up informed about. Don't want a guaranteed story? Delete the focus: block. No config.yaml at all? Sensible defaults keep it running. Nothing stays on. No server, no container, no cron on your laptop. 1. Click Use this template to get your own copy or fork it . Then clone it and run: python main.py --setup The wizard asks for each key, verifies it against the real API before saving , so a wrong Gmail App Password fails here instead of silently at 8am tomorrow. It clears the inherited de-duplication history, offers to upload your secrets with the gh CLI, and prints your pinger URL with your repo already filled in. 2. Add 5 Settings → Secrets and variables → Actions secrets the wizard can do this for you if you have the gh CLI : | Secret | Where to get it | |---|---| GROQ API KEY | | TAVILY API KEY app.tavily.com https://app.tavily.com , free, 1000 searches/month GMAIL ADDRESS GMAIL APP PASSWORD 16-char App Password https://myaccount.google.com/apppasswords needs 2FA . Not your Gmail password RECIPIENT EMAIL 3. Test it now: Actions → Daily Briefing → Run workflow , tick force . 4. Make it punctual by adding a free external pinger 5 minutes, one time : Why, and how to set up the free cron pinger GitHub's own schedule: cron is unreliable on low-activity repos: it drops most triggers and can fire hours late, so "before 10am" isn't guaranteed by it alone. The fix, still 100% free, is a tiny external cron that calls GitHub at a fixed time. GitHub's own cron stays on as a best-effort backup. a Create a GitHub token at new fine-grained token https://github.com/settings/personal-access-tokens/new - Repository access: Only select repositories → this repo - Permissions → Actions: Read and write - Copy the github pat ... value b Create a free job on cron-job.org , daily at ~08:00 in your timezone: Method : POST URL : https://api.github.com/repos/