diff --git a/feed_posts/schema/feed_queries.py b/feed_posts/schema/feed_queries.py
index 0851919422b3fa1fcd59a483634ccd96a4ae7bdb..cb56b78d47bc089b2a101383fd5f329618f5759a 100644
--- a/feed_posts/schema/feed_queries.py
+++ b/feed_posts/schema/feed_queries.py
@@ -8,6 +8,7 @@ from django.db import models
 from django.db.models import Count, OuterRef, Subquery
 from django.db.models.functions import Coalesce
 from django.utils import timezone
+from django.core.cache import cache
 
 from comments.models import Comment
 from feed_posts.enums import VisibilityLevel
@@ -50,6 +51,12 @@ class Query:
     ) -> Paged[FeedItem]:
         user = info.context.request.user
 
+        # Generate cache key based on user and pagination
+        cache_key = f"feed:{user.id if user.is_authenticated else 'anon'}:o{offset}:l{limit}"
+        cached_feed = cache.get(cache_key)
+        if cached_feed:
+            return cached_feed
+
         feed_post_content_type = ContentType.objects.get_for_model(FeedPostModel)
         space_post_content_type = ContentType.objects.get_for_model(PostModel)
 
@@ -110,7 +117,11 @@ class Query:
 
             posts = sorted_posts + list(space_posts)
             feed_items = [map_to_feed_item(post) for post in posts]
-            return paginate_posts(feed_items, offset, limit)
+            result = paginate_posts(feed_items, offset, limit)
+
+            # Cache anonymous results for 10 minutes
+            cache.set(cache_key, result, 600)
+            return result
 
         # Authenticated users
 
@@ -190,5 +201,8 @@ class Query:
 
         posts = list(all_posts.keys())
         feed_items = [map_to_feed_item(post) for post in posts]
+        result = paginate_posts(feed_items, offset, limit)
 
-        return paginate_posts(feed_items, offset, limit)
+        # Cache authenticated user results for 2 minutes
+        cache.set(cache_key, result, 120)
+        return result
diff --git a/openbook_insights/schema/queries.py b/openbook_insights/schema/queries.py
index f2f43d19a942189971967d09aa290da153732875..25d763dd09b1d649c6430e96c429b8cfb23a8bd1 100644
--- a/openbook_insights/schema/queries.py
+++ b/openbook_insights/schema/queries.py
@@ -1,6 +1,7 @@
 import uuid
-from datetime import datetime
+from datetime import datetime, timedelta
 from typing import Optional
+from django.utils import timezone
 
 import strawberry
 import strawberry_django
@@ -16,6 +17,7 @@ from openbook_insights.models import Insight as InsightModel
 from openbook_insights.schema.types import Insight
 from openbook_insights.schema.types.discussion import Discussion
 from openbook_insights.schema.types.insight import InsightPreview
+from django.core.cache import cache
 
 
 @strawberry.type
@@ -58,6 +60,12 @@ class Query:
     def feed_insights(self, info, offset: int = 0, limit: int = 10) -> Paged[InsightPreview]:
         current_user = info.context.request.user
 
+        # Generate cache key based on pagination
+        cache_key = f"feed_insights:o{offset}:l{limit}"
+        cached_insights = cache.get(cache_key)
+        if cached_insights:
+            return cached_insights
+
         base_queryset = InsightModel.objects.filter(
             Q(creator__isnull=True) | UserModel.is_visible_ignore_blocked_query("creator"),
             date_published__lte=datetime.now(),
@@ -73,6 +81,15 @@ class Query:
             limit,
         )
 
+        # Calculate seconds until next 10am
+        now = timezone.now()
+        next_10am = now.replace(hour=10, minute=0, second=0, microsecond=0)
+        if now.hour >= 10:
+            next_10am += timedelta(days=1)
+        cache_ttl = int((next_10am - now).total_seconds())
+
+        # Cache until next 10am
+        cache.set(cache_key, paged_insights, cache_ttl)
         return paged_insights
 
     @strawberry_django.field()