Index: src/views/partials/post-card.ejs
===================================================================
--- src/views/partials/post-card.ejs	(revision 0908b8f84e30c989e07b845e66e48d7214cf0135)
+++ src/views/partials/post-card.ejs	(revision 43dbf9c41de8e6cc1512805acbe92a1f05069786)
@@ -12,5 +12,8 @@
 
 const _base      = (typeof siteUrlBase !== 'undefined' && siteUrlBase) ? siteUrlBase : '';
-const _href      = _base + '/' + post.slug;
+const _external  = post.external_url || null;
+const _href      = _external || (_base + '/' + post.slug);
+const _ext       = !!_external;
+const _src       = post.source_name || '';
 const _hasCover  = !!post.cover_image_url;
 const _typeLabel = (post.type && post.type !== 'overig' && post.type !== 'post') ? post.type : '';
@@ -43,6 +46,5 @@
   <% if (_hasCover) { %>
     <a class="post-list-cover" href="<%= _href %>"
-       hx-get="<%= _href %>?partial=1" hx-target="#pcms-main" hx-swap="innerHTML"
-       hx-push-url="<%= _href %>" hx-indicator="#pcms-loading"
+       <% if (_ext) { %>target="_blank" rel="noopener"<% } else { %>hx-get="<%= _href %>?partial=1" hx-target="#pcms-main" hx-swap="innerHTML" hx-push-url="<%= _href %>" hx-indicator="#pcms-loading"<% } %>
        aria-label="<%= post.title || '(zonder titel)' %>" tabindex="-1">
       <img src="<%= post.cover_image_url %>" alt="" loading="lazy" decoding="async">
@@ -54,4 +56,5 @@
       <% if (_isPinned) { %><span class="post-list-pin" aria-label="Vastgepind">★</span><% } %>
       <time datetime="<%= post.published_at || post.created_at %>"><%= _ddmmyyyy(post.published_at || post.created_at) %></time>
+      <% if (_src) { %><span class="post-list-type">&middot; via <%= _src %></span><% } %>
       <% if (_typeLabel) { %>
         <span class="post-list-type">· <%= _typeLabel.charAt(0).toUpperCase() + _typeLabel.slice(1) %></span>
@@ -64,6 +67,5 @@
     <h3 class="post-list-title">
       <a href="<%= _href %>"
-         hx-get="<%= _href %>?partial=1" hx-target="#pcms-main" hx-swap="innerHTML"
-         hx-push-url="<%= _href %>" hx-indicator="#pcms-loading">
+         <% if (_ext) { %>target="_blank" rel="noopener"<% } else { %>hx-get="<%= _href %>?partial=1" hx-target="#pcms-main" hx-swap="innerHTML" hx-push-url="<%= _href %>" hx-indicator="#pcms-loading"<% } %>>
         <%= post.title || '(zonder titel)' %>
       </a>
Index: src/views/partials/post-tile.ejs
===================================================================
--- src/views/partials/post-tile.ejs	(revision 0908b8f84e30c989e07b845e66e48d7214cf0135)
+++ src/views/partials/post-tile.ejs	(revision 43dbf9c41de8e6cc1512805acbe92a1f05069786)
@@ -8,14 +8,12 @@
 const _typeLabel = (post.type && post.type !== 'post') ? post.type : '';
 const _base = (typeof siteUrlBase !== 'undefined' && siteUrlBase) ? siteUrlBase : '';
-const _href = _base + '/' + post.slug;
+const _external = post.external_url || null;
+const _href = _external || (_base + '/' + post.slug);
+const _ext = !!_external;
 %>
 <a class="grid-tile<%= _hasCover ? '' : ' grid-tile-gradient' %><%= _isPinned ? ' is-pinned' : '' %>"
    href="<%= _href %>"
    <% if (_hasCover) { %>style="background-image: url('<%= post.cover_image_url %>'); --tile-hue: <%= _tileHue %>;"<% } else { %>style="--tile-hue: <%= _tileHue %>;"<% } %>
-   hx-get="<%= _href %>?partial=1"
-   hx-target="#pcms-main"
-   hx-swap="innerHTML"
-   hx-push-url="<%= _href %>"
-   hx-indicator="#pcms-loading">
+   <% if (_ext) { %>target="_blank" rel="noopener"<% } else { %>hx-get="<%= _href %>?partial=1" hx-target="#pcms-main" hx-swap="innerHTML" hx-push-url="<%= _href %>" hx-indicator="#pcms-loading"<% } %>>
 
   <% if (_typeLabel) { %>
