diff --git a/opentech/public/news/models.py b/opentech/public/news/models.py
index b3871fdf19795700ec206b4780fa66ca74e29367..4edcd2663b57bb3e8261b874e21b65cb91293d2d 100644
--- a/opentech/public/news/models.py
+++ b/opentech/public/news/models.py
@@ -123,6 +123,9 @@ class NewsPage(BasePage):
         else:
             return self.first_published_at
 
+    def get_absolute_url(self):
+        return self.full_url
+
 
 class NewsIndex(BasePage):
     subpage_types = ['NewsPage']
diff --git a/opentech/public/news/views.py b/opentech/public/news/views.py
new file mode 100644
index 0000000000000000000000000000000000000000..20ca9e0e3daf9277ef025af062c431e5792fb6ea
--- /dev/null
+++ b/opentech/public/news/views.py
@@ -0,0 +1,46 @@
+from django.contrib.syndication.views import Feed
+
+from opentech.public.news.models import NewsPage, NewsType
+
+
+class NewsFeed(Feed):
+    link = "https://www.opentech.fund/news/"
+    title = "OTF – News, updates, and announcements"
+    description = "News, updates, and announcements from The Open Technology Fund"
+
+    def items(self):
+        return NewsPage.objects.live().order_by('-first_published_at')[:20]
+
+    def item_title(self, item):
+        return item.title
+
+    def item_description(self, item):
+        return item.body
+
+    def item_pubdate(self, item):
+        return item.display_date
+
+
+class NewsTypesFeed(Feed):
+    link = "https://www.opentech.fund/news/"
+
+    def get_object(self, request, type):
+        return NewsType.objects.get(id=type)
+
+    def title(self, type):
+        return f"OTF – News of type {type}"
+
+    def description(self, type):
+        return f"News, updates, and announcements of type {type} from The Open Technology Fund"
+
+    def items(self, type):
+        return NewsPage.objects.live().filter(news_types__news_type=type).order_by('-first_published_at')[:20]
+
+    def item_title(self, item):
+        return item.title
+
+    def item_description(self, item):
+        return item.body
+
+    def item_pubdate(self, item):
+        return item.display_date
diff --git a/opentech/public/urls.py b/opentech/public/urls.py
index 40b2bb96aa3f0b5df11dc0c953999759bd8b36d5..81eedaf1465eeed641d08d6c80641fe014665942 100644
--- a/opentech/public/urls.py
+++ b/opentech/public/urls.py
@@ -1,10 +1,13 @@
 from django.urls import include, path
 
+from .news import views as news_views
 from .search import views as search_views
 from .mailchimp import urls as newsletter_urls
 
 
 urlpatterns = [
     path('search/', search_views.search, name='search'),
+    path('news/feed/', news_views.NewsFeed(), name='news_feed'),
+    path('news/<int:type>/feed/', news_views.NewsTypesFeed(), name='news_types_feed'),
     path('newsletter/', include(newsletter_urls))
 ]