diff --git a/app/Entities/Models/Page.php b/app/Entities/Models/Page.php
index 93fb21893..6e521b2b8 100644
--- a/app/Entities/Models/Page.php
+++ b/app/Entities/Models/Page.php
@@ -138,4 +138,23 @@ class Page extends BookChild
         $refreshed->html = (new PageContent($refreshed))->render();
         return $refreshed;
     }
+
+    /**
+     * Returns URL to a cover image for the page.
+     */
+    public function getCoverImage()
+    {
+        //$default = $this->book->getBookCover();
+        $default = url('/logo.png');
+
+        $firstImage = (new PageContent($this))->fetchFirstImage();
+
+        try {
+            $cover = $firstImage ? $firstImage : $default;
+        } catch (\Exception $err) {
+            $cover = $default;
+        }
+        return $cover;
+    }
+    
 }
diff --git a/app/Entities/Tools/PageContent.php b/app/Entities/Tools/PageContent.php
index 381ef172b..d178dc040 100644
--- a/app/Entities/Tools/PageContent.php
+++ b/app/Entities/Tools/PageContent.php
@@ -367,4 +367,18 @@ class PageContent
         $doc->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'));
         return $doc;
     }
+
+    /**
+     * Retrieve first image in page content and return the source URL.
+     */
+    public function fetchFirstImage()
+    {
+        $htmlContent = $this->page->html;
+
+        $dom = new \DomDocument();
+        $dom->loadHTML($htmlContent);
+        $images = $dom->getElementsByTagName('img');
+
+        return $images->length > 0 ? $images[0]->getAttribute('src') : null;
+    }
 }
diff --git a/resources/views/base.blade.php b/resources/views/base.blade.php
index 0734466be..dc665a888 100644
--- a/resources/views/base.blade.php
+++ b/resources/views/base.blade.php
@@ -11,6 +11,12 @@
     <meta name="base-url" content="{{ url('/') }}">
     <meta charset="utf-8">
 
+    <!-- Social Cards Meta -->
+    <meta property="og:title" content="{{ isset($pageTitle) ? $pageTitle . ' | ' : '' }}{{ setting('app-name') }}">
+    <meta property="og:url" content="{{ url()->current() }}">
+    @stack('social-meta')
+    
+
     <!-- Styles and Fonts -->
     <link rel="stylesheet" href="{{ versioned_asset('dist/styles.css') }}">
     <link rel="stylesheet" media="print" href="{{ versioned_asset('dist/print-styles.css') }}">
diff --git a/resources/views/books/show.blade.php b/resources/views/books/show.blade.php
index b850127ff..69a945cbe 100644
--- a/resources/views/books/show.blade.php
+++ b/resources/views/books/show.blade.php
@@ -6,6 +6,11 @@
     option:entity-search:entity-type="book"
 @stop
 
+@push('social-meta')
+    <meta property="og:description" content="{{ Str::limit($book->description, 100, '...') }}">
+    <meta property="og:image" content="{{ $book->getBookCover() }}">
+@endpush
+
 @section('body')
 
     <div class="mb-s">
diff --git a/resources/views/chapters/show.blade.php b/resources/views/chapters/show.blade.php
index 803536e9f..a70f0f9f2 100644
--- a/resources/views/chapters/show.blade.php
+++ b/resources/views/chapters/show.blade.php
@@ -6,6 +6,11 @@
     option:entity-search:entity-type="chapter"
 @stop
 
+@push('social-meta')
+    <meta property="og:description" content="{{ Str::limit($chapter->description, 100) }}">
+    <meta property="og:image" content="{{ $chapter->book->getBookCover() }}">
+@endpush
+
 @section('body')
 
     <div class="mb-m print-hidden">
diff --git a/resources/views/pages/show.blade.php b/resources/views/pages/show.blade.php
index 6e84c44a8..398c8a853 100644
--- a/resources/views/pages/show.blade.php
+++ b/resources/views/pages/show.blade.php
@@ -1,5 +1,10 @@
 @extends('tri-layout')
 
+@push('social-meta')
+    <meta property="og:description" content="{{ Str::limit($page->text, 100, '...') }}">
+    <meta property="og:image" content="{{ $page->getCoverImage() }}">
+@endpush
+
 @section('body')
 
     <div class="mb-m print-hidden">
diff --git a/resources/views/shelves/show.blade.php b/resources/views/shelves/show.blade.php
index 431fa54cc..1205e8320 100644
--- a/resources/views/shelves/show.blade.php
+++ b/resources/views/shelves/show.blade.php
@@ -1,5 +1,10 @@
 @extends('tri-layout')
 
+@push('social-meta')
+    <meta property="og:description" content="{{ Str::limit($shelf->description, 100) }}">
+    <meta property="og:image" content="{{ $shelf->getBookCover() }}">
+@endpush
+
 @section('body')
 
     <div class="mb-s">