From 56889d9fdf200f25f329a93cfc889f0126f27ea7 Mon Sep 17 00:00:00 2001 From: Lloyd Clowes <17643791+lloydclowes@users.noreply.github.com> Date: Wed, 11 Mar 2026 14:24:06 -0700 Subject: [PATCH] Add OpenAI Engineering RSS feed --- README.md | 1 + feed_generators/openai_engineering_blog.py | 110 +++++++++++++++++++++ feeds/feed_openai_engineering.xml | 69 +++++++++++++ makefiles/feeds.mk | 7 ++ 4 files changed, 187 insertions(+) create mode 100644 feed_generators/openai_engineering_blog.py create mode 100644 feeds/feed_openai_engineering.xml diff --git a/README.md b/README.md index c8eddf2998..0653ce24b7 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ | [Anthropic Research](https://www.anthropic.com/research) | [feed_anthropic_research.xml](https://raw.githubusercontent.com/Olshansk/rss-feeds/main/feeds/feed_anthropic_research.xml) | | [Anthropic Frontier Red Team](https://red.anthropic.com/) | [feed_anthropic_red.xml](https://raw.githubusercontent.com/Olshansk/rss-feeds/main/feeds/feed_anthropic_red.xml) | | [Claude Code Changelog](https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md) | [feed_anthropic_changelog_claude_code.xml](https://raw.githubusercontent.com/Olshansk/rss-feeds/main/feeds/feed_anthropic_changelog_claude_code.xml) | +| [OpenAI Engineering](https://openai.com/news/engineering/) | [feed_openai_engineering.xml](https://raw.githubusercontent.com/Olshansk/rss-feeds/main/feeds/feed_openai_engineering.xml) | | [OpenAI Research](https://openai.com/news/research/) | [feed_openai_research.xml](https://raw.githubusercontent.com/Olshansk/rss-feeds/main/feeds/feed_openai_research.xml) | | [Ollama Blog](https://ollama.com/blog) | [feed_ollama.xml](https://raw.githubusercontent.com/Olshansk/rss-feeds/main/feeds/feed_ollama.xml) | | [Paul Graham's Articles](https://www.paulgraham.com/articles.html) | [feed_paulgraham.xml](https://raw.githubusercontent.com/Olshansk/rss-feeds/main/feeds/feed_paulgraham.xml) | diff --git a/feed_generators/openai_engineering_blog.py b/feed_generators/openai_engineering_blog.py new file mode 100644 index 0000000000..25154c5b1d --- /dev/null +++ b/feed_generators/openai_engineering_blog.py @@ -0,0 +1,110 @@ +import logging +from email.utils import parsedate_to_datetime + +import requests +from bs4 import BeautifulSoup +from feedgen.feed import FeedGenerator + +from utils import get_feeds_dir, setup_feed_links, sort_posts_for_feed + +RSS_URL = "https://openai.com/news/rss.xml" +BLOG_URL = "https://openai.com/news/engineering/" +CATEGORY = "Engineering" +FEED_NAME = "openai_engineering" + +logging.basicConfig( + level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s" +) +logger = logging.getLogger(__name__) + + +def fetch_rss_content(url: str = RSS_URL) -> str: + """Fetch the official OpenAI news RSS feed.""" + logger.info("Fetching RSS content from %s", url) + headers = { + "User-Agent": ( + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) " + "AppleWebKit/537.36 (KHTML, like Gecko) " + "Chrome/122.0.0.0 Safari/537.36" + ) + } + response = requests.get(url, headers=headers, timeout=30) + response.raise_for_status() + return response.text + + +def parse_engineering_posts(rss_content: str) -> list[dict]: + """Parse Engineering-tagged items from the official OpenAI RSS feed.""" + soup = BeautifulSoup(rss_content, "xml") + posts = [] + + for item in soup.find_all("item"): + category = item.find("category") + if not category or category.get_text(strip=True) != CATEGORY: + continue + + title = item.find("title") + link = item.find("link") + description = item.find("description") + pub_date = item.find("pubDate") + + if not title or not link: + logger.warning("Skipping item missing title or link") + continue + + parsed_date = None + if pub_date and pub_date.get_text(strip=True): + parsed_date = parsedate_to_datetime(pub_date.get_text(strip=True)) + + posts.append( + { + "title": title.get_text(strip=True), + "link": link.get_text(strip=True), + "description": description.get_text(strip=True) if description else "", + "date": parsed_date, + "category": CATEGORY, + } + ) + + logger.info("Parsed %s engineering posts", len(posts)) + return posts + + +def generate_rss_feed(posts: list[dict]) -> FeedGenerator: + """Generate the RSS feed for OpenAI Engineering posts.""" + fg = FeedGenerator() + fg.title("OpenAI Engineering") + fg.description("Engineering posts from the official OpenAI news feed") + setup_feed_links(fg, blog_url=BLOG_URL, feed_name=FEED_NAME) + fg.language("en") + + for post in sort_posts_for_feed(posts, date_field="date"): + fe = fg.add_entry() + fe.title(post["title"]) + fe.link(href=post["link"]) + fe.description(post["description"]) + + if post["date"] is not None: + fe.published(post["date"]) + fe.updated(post["date"]) + + fe.category(term=post["category"]) + + return fg + + +def main() -> None: + """Generate and save the OpenAI Engineering RSS feed.""" + rss_content = fetch_rss_content() + posts = parse_engineering_posts(rss_content) + + if not posts: + raise RuntimeError("No engineering posts found in the OpenAI RSS feed") + + output_file = get_feeds_dir() / f"feed_{FEED_NAME}.xml" + generate_rss_feed(posts).rss_file(str(output_file), pretty=True) + logger.info("Saved RSS feed to %s", output_file) + + +if __name__ == "__main__": + main() diff --git a/feeds/feed_openai_engineering.xml b/feeds/feed_openai_engineering.xml new file mode 100644 index 0000000000..556fa36ad6 --- /dev/null +++ b/feeds/feed_openai_engineering.xml @@ -0,0 +1,69 @@ + + + + OpenAI Engineering + https://openai.com/news/engineering/ + Engineering posts from the official OpenAI news feed + + http://www.rssboard.org/rss-specification + python-feedgen + en + Wed, 11 Mar 2026 21:14:18 +0000 + + From model to agent: Equipping the Responses API with a computer environment + https://openai.com/index/equip-responses-api-computer-environment + How OpenAI built an agent runtime using the Responses API, shell tool, and hosted containers to run secure, scalable agents with files, tools, and state. + Engineering + Wed, 11 Mar 2026 11:00:00 +0000 + + + Beyond rate limits: scaling access to Codex and Sora + https://openai.com/index/beyond-rate-limits + How OpenAI built a real-time access system combining rate limits, usage tracking, and credits to power continuous access to Sora and Codex. + Engineering + Fri, 13 Feb 2026 09:00:00 +0000 + + + Harness engineering: leveraging Codex in an agent-first world + https://openai.com/index/harness-engineering + By Ryan Lopopolo, Member of the Technical Staff + Engineering + Wed, 11 Feb 2026 09:00:00 +0000 + + + Unlocking the Codex harness: how we built the App Server + https://openai.com/index/unlocking-the-codex-harness + Learn how to embed the Codex agent using the Codex App Server, a bidirectional JSON-RPC API powering streaming progress, tool use, approvals, and diffs. + Engineering + Wed, 04 Feb 2026 13:00:00 +0000 + + + Inside OpenAI’s in-house data agent + https://openai.com/index/inside-our-in-house-data-agent + How OpenAI built an in-house AI data agent that uses GPT-5, Codex, and memory to reason over massive datasets and deliver reliable insights in minutes. + Engineering + Thu, 29 Jan 2026 10:00:00 +0000 + + + Unrolling the Codex agent loop + https://openai.com/index/unrolling-the-codex-agent-loop + A technical deep dive into the Codex agent loop, explaining how Codex CLI orchestrates models, tools, prompts, and performance using the Responses API. + Engineering + Fri, 23 Jan 2026 12:00:00 +0000 + + + Scaling PostgreSQL to power 800 million ChatGPT users + https://openai.com/index/scaling-postgresql + An inside look at how OpenAI scaled PostgreSQL to millions of queries per second using replicas, caching, rate limiting, and workload isolation. + Engineering + Thu, 22 Jan 2026 12:00:00 +0000 + + + How We Used Codex to Ship Sora for Android in 28 Days + https://openai.com/index/shipping-sora-for-android-with-codex + OpenAI shipped Sora for Android in 28 days using Codex. AI-assisted planning, translation, and parallel coding workflows helped a nimble team deliver rapid, reliable development. + Engineering + Fri, 12 Dec 2025 00:00:00 +0000 + + + diff --git a/makefiles/feeds.mk b/makefiles/feeds.mk index 086d388b33..bdc9574f37 100644 --- a/makefiles/feeds.mk +++ b/makefiles/feeds.mk @@ -65,6 +65,13 @@ feeds_openai_research: ## Generate RSS feed for OpenAI Research $(Q)python feed_generators/openai_research_blog.py $(call print_success,OpenAI Research feed generated) +.PHONY: feeds_openai_engineering +feeds_openai_engineering: ## Generate RSS feed for OpenAI Engineering + $(call check_venv) + $(call print_info,Generating OpenAI Engineering feed) + $(Q)python feed_generators/openai_engineering_blog.py + $(call print_success,OpenAI Engineering feed generated) + .PHONY: feeds_ollama feeds_ollama: ## Generate RSS feed for Ollama Blog $(call check_venv)