Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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) |
Expand Down
110 changes: 110 additions & 0 deletions feed_generators/openai_engineering_blog.py
Original file line number Diff line number Diff line change
@@ -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()
69 changes: 69 additions & 0 deletions feeds/feed_openai_engineering.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
<?xml version='1.0' encoding='UTF-8'?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
<channel>
<title>OpenAI Engineering</title>
<link>https://openai.com/news/engineering/</link>
<description>Engineering posts from the official OpenAI news feed</description>
<atom:link href="https://raw.githubusercontent.com/Olshansk/rss-feeds/main/feeds/feed_openai_engineering.xml" rel="self"/>
<docs>http://www.rssboard.org/rss-specification</docs>
<generator>python-feedgen</generator>
<language>en</language>
<lastBuildDate>Wed, 11 Mar 2026 21:14:18 +0000</lastBuildDate>
<item>
<title>From model to agent: Equipping the Responses API with a computer environment</title>
<link>https://openai.com/index/equip-responses-api-computer-environment</link>
<description>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.</description>
<category>Engineering</category>
<pubDate>Wed, 11 Mar 2026 11:00:00 +0000</pubDate>
</item>
<item>
<title>Beyond rate limits: scaling access to Codex and Sora</title>
<link>https://openai.com/index/beyond-rate-limits</link>
<description>How OpenAI built a real-time access system combining rate limits, usage tracking, and credits to power continuous access to Sora and Codex.</description>
<category>Engineering</category>
<pubDate>Fri, 13 Feb 2026 09:00:00 +0000</pubDate>
</item>
<item>
<title>Harness engineering: leveraging Codex in an agent-first world</title>
<link>https://openai.com/index/harness-engineering</link>
<description>By Ryan Lopopolo, Member of the Technical Staff</description>
<category>Engineering</category>
<pubDate>Wed, 11 Feb 2026 09:00:00 +0000</pubDate>
</item>
<item>
<title>Unlocking the Codex harness: how we built the App Server</title>
<link>https://openai.com/index/unlocking-the-codex-harness</link>
<description>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.</description>
<category>Engineering</category>
<pubDate>Wed, 04 Feb 2026 13:00:00 +0000</pubDate>
</item>
<item>
<title>Inside OpenAI’s in-house data agent</title>
<link>https://openai.com/index/inside-our-in-house-data-agent</link>
<description>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.</description>
<category>Engineering</category>
<pubDate>Thu, 29 Jan 2026 10:00:00 +0000</pubDate>
</item>
<item>
<title>Unrolling the Codex agent loop</title>
<link>https://openai.com/index/unrolling-the-codex-agent-loop</link>
<description>A technical deep dive into the Codex agent loop, explaining how Codex CLI orchestrates models, tools, prompts, and performance using the Responses API.</description>
<category>Engineering</category>
<pubDate>Fri, 23 Jan 2026 12:00:00 +0000</pubDate>
</item>
<item>
<title>Scaling PostgreSQL to power 800 million ChatGPT users</title>
<link>https://openai.com/index/scaling-postgresql</link>
<description>An inside look at how OpenAI scaled PostgreSQL to millions of queries per second using replicas, caching, rate limiting, and workload isolation.</description>
<category>Engineering</category>
<pubDate>Thu, 22 Jan 2026 12:00:00 +0000</pubDate>
</item>
<item>
<title>How We Used Codex to Ship Sora for Android in 28 Days</title>
<link>https://openai.com/index/shipping-sora-for-android-with-codex</link>
<description>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.</description>
<category>Engineering</category>
<pubDate>Fri, 12 Dec 2025 00:00:00 +0000</pubDate>
</item>
</channel>
</rss>
7 changes: 7 additions & 0 deletions makefiles/feeds.mk
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down