{"id":392259,"date":"2026-10-28T21:59:32","date_gmt":"2026-10-28T21:59:32","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/ghostlabs-serendipity\/"},"modified":"2026-10-28T21:58:57","modified_gmt":"2026-10-28T21:58:57","slug":"ghostlabs-serendipity","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/ghostlabs-serendipity\/","author":23277533,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.1.4","requires":"7.1","requires_php":"8.1","requires_plugins":null,"header_name":"GhostLabs Serendipity","header_author":"GhostLabs","header_description":"Gallery plugin for WordPress.","assets_banners_color":"7b5ea3","last_updated":"2026-10-28 21:58:57","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/theghostlab.io\/serendipity","header_author_uri":"https:\/\/theghostlab.io","rating":0,"author_block_rating":0,"active_installs":0,"downloads":67,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"ghostlabs","date":"2026-10-28 21:58:57","revision":3771745}},"upgrade_notice":{"1.0.0":"<p>First release. A photo gallery block that fills the space you give it with a mosaic, and keeps the layout you choose at each breakpoint. Requires WordPress 7.1 and PHP 8.1.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3771742,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3771742,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3771742,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3771742,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3771742,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":{"ghostlabs\/serendipity":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"ghostlabs\/serendipity","version":"1.0.0","title":"Serendipity Gallery","category":"design","icon":"format-gallery","description":"A generative tiled photo gallery. Each composition partitions the available area into a unique mosaic, saved per breakpoint.","example":{},"supports":{"html":false,"align":["wide","full"]},"attributes":{"id":{"type":"string","default":""},"gap":{"type":"string","default":"1px"},"minHeight":{"type":"string","default":"720px"},"thumbnailSize":{"type":"string","default":"medium"},"rawImages":{"type":"array","default":[]},"hoverStyle":{"type":"string","default":"style-1"},"lightbox":{"type":"string","default":"own"},"layoutData":{"type":"array","default":[]},"mobileStackThumbnails":{"type":"boolean","default":false},"debug":{"type":"boolean","default":false}},"textdomain":"ghostlabs-serendipity","editorScript":"file:.\/index.js","editorStyle":"file:.\/index.css","render":"file:.\/render.php"}},"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3771742,"resolution":"1","location":"assets","locale":"","width":2360,"height":1588},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3771742,"resolution":"2","location":"assets","locale":"","width":2560,"height":1600},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3771742,"resolution":"3","location":"assets","locale":"","width":2560,"height":2376},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3771742,"resolution":"4","location":"assets","locale":"","width":1660,"height":1422}},"screenshots":{"1":"A saved composition, and the same gallery at tablet width.","2":"Not in this plugin: Layout Studio, which Serendipity Deluxe adds \u2014 drag the seams between tiles, or nudge them with the arrow keys.","3":"The block's settings: gap, minimum height and hover style, a layout saved for each screen size, and links that a lightbox plugin you already run can pick up.","4":"The starter patterns in the inserter."}},"plugin_section":[],"plugin_tags":[166583,13413,6823,649,60962],"plugin_category":[],"plugin_contributors":[242362],"plugin_business_model":[],"class_list":["post-392259","plugin","type-plugin","status-publish","hentry","plugin_tags-gallery-block","plugin_tags-masonry-gallery","plugin_tags-mosaic","plugin_tags-photo-gallery","plugin_tags-tiled-gallery","plugin_contributors-ghostlabs","plugin_committers-ghostlabs"],"banners":{"banner":"https:\/\/ps.w.org\/ghostlabs-serendipity\/assets\/banner-772x250.png?rev=3771742","banner_2x":"https:\/\/ps.w.org\/ghostlabs-serendipity\/assets\/banner-1544x500.png?rev=3771742","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/ghostlabs-serendipity\/assets\/icon.svg?rev=3771742","icon":"https:\/\/ps.w.org\/ghostlabs-serendipity\/assets\/icon.svg?rev=3771742","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/ghostlabs-serendipity\/assets\/screenshot-1.png?rev=3771742","caption":"A saved composition, and the same gallery at tablet width."},{"src":"https:\/\/ps.w.org\/ghostlabs-serendipity\/assets\/screenshot-2.png?rev=3771742","caption":"Not in this plugin: Layout Studio, which Serendipity Deluxe adds \u2014 drag the seams between tiles, or nudge them with the arrow keys."},{"src":"https:\/\/ps.w.org\/ghostlabs-serendipity\/assets\/screenshot-3.png?rev=3771742","caption":"The block's settings: gap, minimum height and hover style, a layout saved for each screen size, and links that a lightbox plugin you already run can pick up."},{"src":"https:\/\/ps.w.org\/ghostlabs-serendipity\/assets\/screenshot-4.png?rev=3771742","caption":"The starter patterns in the inserter."}],"raw_content":"<!--section=description-->\n<p>Serendipity composes a mosaic from your photographs \u2014 not a grid with the gaps filled in, but a\npartition of the space where every tile earns its size. Compose one, keep it, and it stays exactly\nas you left it: layouts are saved per breakpoint, so a gallery looks deliberate on a phone as well\nas a desktop.<\/p>\n\n<h4>A masonry-style gallery that fills its space<\/h4>\n\n<p>If you want a gallery that isn't a rigid grid, this is one. Like a masonry gallery, Serendipity\nmixes tiles of different sizes, and the more photographs you give it, the more they vary. Unlike\none, it doesn't run on down the page in uneven columns: it fills the space you give it, cropping\neach photograph to its tile. Choose <strong>Refresh Layout &amp; Save<\/strong> in the block toolbar until you like\nwhat it composes. It saves for the breakpoint you are editing.<\/p>\n\n<p>It is a block, not a custom post type. There is no separate gallery screen to visit, nothing to\nsync, and nothing left behind if you deactivate the plugin \u2014 the gallery lives in the post where\nyou put it.<\/p>\n\n<h4>Bring your own lightbox<\/h4>\n\n<p>Serendipity links each image to its full-size file and groups the gallery, which is what lightbox\nplugins look for. If you already run one, it will pick these galleries up with no configuration.\nIf you would rather it did not, there is a setting for that too: link to the file without grouping,\nlink to the attachment page, or emit no link at all.<\/p>\n\n<h4>What it does<\/h4>\n\n<ul>\n<li>A generative mosaic engine \u2014 compose, refresh, keep the one you like<\/li>\n<li>Saved layouts at all three breakpoints, so nothing reshuffles on a phone<\/li>\n<li>Gap, minimum height, thumbnail and full-size resolution<\/li>\n<li>Stack on mobile, for galleries that read better as a column<\/li>\n<li>Lightbox-agnostic output, or no links at all<\/li>\n<li>One hover style, Fade-Up, with captions<\/li>\n<li>Four starter block patterns<\/li>\n<li>Loads nothing on pages that have no gallery<\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>This plugin does not contact any external service. It sends nothing on page loads, nothing in\nthe background, and nothing on a schedule. Galleries, layouts and settings never leave your\nsite.<\/p>\n\n<p><strong>Links to GhostLabs \u2014 not a service.<\/strong> The plugin links to two GhostLabs sites from wp-admin and\nthe block editor. It never contacts either one: nothing is requested from them, and the plugin\nsends them nothing.<\/p>\n\n<ul>\n<li><strong>https:\/\/theghostlab.io<\/strong> \u2014 GhostLabs' site, including Serendipity Deluxe's product page\n(<code>\/serendipity<\/code>).<\/li>\n<li><strong>https:\/\/enter.theghostlab.io\/account<\/strong> \u2014 your GhostLabs account, where Serendipity Deluxe is\ndownloaded after you buy it. It is linked from <strong>Settings \u2192 Serendipity<\/strong>, under\n<strong>Have a license?<\/strong>, and opens in a new tab.<\/li>\n<\/ul>\n\n<p>Following either link is an ordinary visit to that site in your browser.<\/p>\n\n<p>Terms of service: https:\/\/theghostlab.io\/terms-of-service\nPrivacy policy: https:\/\/theghostlab.io\/privacy-policy<\/p>\n\n<h3>Source code<\/h3>\n\n<p>The complete, unminified source of this plugin \u2014 including the block sources the compiled assets\nare built from \u2014 is published at:<\/p>\n\n<p>https:\/\/github.com\/theghostlab\/wp-ghostlabs-serendipity<\/p>\n\n<p>The repository's committed <code>build\/<\/code> directory is the readable build, and <code>pnpm install\n--frozen-lockfile &amp;&amp; GHOSTLABS_MINIFY=0 pnpm run build<\/code> reproduces it byte for byte. Released\nversions of the plugin ship the same sources built minified, which <code>pnpm install\n--frozen-lockfile &amp;&amp; pnpm run build<\/code> reproduces byte for byte.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install through <strong>Plugins \u2192 Add Plugin<\/strong>, or upload the plugin folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate it through the <strong>Plugins<\/strong> screen.<\/li>\n<li>In a post or page, add the <strong>Serendipity Gallery<\/strong> block and choose <strong>Add Images<\/strong>.<\/li>\n<li>Choose <strong>Refresh Layout &amp; Save<\/strong> in the block toolbar until you like what it composes. It saves\nfor the breakpoint you are editing; switch to <strong>Tablet<\/strong> or <strong>Mobile<\/strong> in the same toolbar to\ncompose those too. A breakpoint you leave unsaved borrows the nearest saved layout.<\/li>\n<li>Optional: start from a pattern instead. The inserter's <strong>Patterns<\/strong> tab has a <strong>Serendipity<\/strong>\ncategory with four starter galleries.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"is%20it%20a%20masonry%20gallery%3F\"><h3>Is it a masonry gallery?<\/h3><\/dt>\n<dd><p>It's the masonry look without the uneven columns. Serendipity breaks the space you give it into a\nmosaic of tiles of different sizes, so it isn't a rigid grid. A classic masonry gallery keeps every\nphotograph whole and lets its columns run on to different lengths; Serendipity crops each\nphotograph to its tile, so the gallery fills its space. If every photograph has to stay uncropped,\nSerendipity is not the gallery you want.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20my%20lightbox%20plugin%3F\"><h3>Does it work with my lightbox plugin?<\/h3><\/dt>\n<dd><p>Very probably. Each image is linked to its full-size file \u2014 not the attachment page, which is what\nsome lightboxes need \u2014 and the gallery is grouped with <code>data-rel<\/code> so a lightbox can page through it\nrather than treating every tile as a lone image.<\/p>\n\n<p>These four were installed and tested against a Serendipity gallery, and all four picked it up with\nno configuration: Firelight (Easy FancyBox), Responsive Lightbox &amp; Gallery, FooBox, and Lightbox\nwith PhotoSwipe.<\/p>\n\n<p>If yours needs something else, the <code>ghostlabs_serendipity_link_attributes<\/code> filter lets you add any\nattribute to the link without touching the plugin.<\/p><\/dd>\n<dt id=\"my%20gallery%20looks%20different%20every%20time%20i%20reload%20the%20editor\"><h3>My gallery looks different every time I reload the editor<\/h3><\/dt>\n<dd><p>Compose a layout and save it. Until a layout is saved for a breakpoint, the mosaic is generated\nfresh each time \u2014 that is the point of the generator. Once saved, it is fixed, and other\nbreakpoints borrow it rather than composing their own.<\/p><\/dd>\n<dt id=\"will%20it%20slow%20my%20site%20down%3F\"><h3>Will it slow my site down?<\/h3><\/dt>\n<dd><p>The gallery's stylesheet and script load only on pages that actually contain a gallery, and the\ncomposition is rendered as CSS by the server, so the layout is correct on the first paint rather\nthan after JavaScript runs.<\/p><\/dd>\n<dt id=\"what%20is%20in%20serendipity%20deluxe%3F\"><h3>What is in Serendipity Deluxe?<\/h3><\/dt>\n<dd><p>Layout Studio \u2014 drag the seams between tiles, reframe a photograph inside its tile, swap two\nphotographs \u2014 plus a built-in carousel lightbox with autoplay, three more hover styles, and a\nlibrary of twelve block patterns. The free plugin is not a trial: nothing here expires, and no\nfeature is withheld that would make a gallery look broken without it.<\/p><\/dd>\n<dt id=\"i%20bought%20serendipity%20deluxe.%20how%20do%20i%20switch%20over%3F\"><h3>I bought Serendipity Deluxe. How do I switch over?<\/h3><\/dt>\n<dd><p>Serendipity Deluxe is a separate plugin. Once you have bought it:<\/p>\n\n<ol>\n<li>Download it from your GhostLabs account. <strong>Settings \u2192 Serendipity<\/strong> links there under\n<strong>Have a license?<\/strong><\/li>\n<li>From the Plugins menu, open the screen for adding a plugin and choose <strong>Upload Plugin<\/strong>.<\/li>\n<li>Activate it, then enter the license key from your receipt email in its settings.<\/li>\n<\/ol>\n\n<p>When Serendipity Deluxe starts, it deactivates this plugin. Every gallery and saved layout stays\nexactly as it is, because every gallery's settings and layout live in the gallery block, which\nboth plugins read. This plugin is left installed but inactive, and you can delete it whenever\nyou like.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First release.<\/li>\n<\/ul>","raw_excerpt":"A masonry-style photo gallery block that fills the space you give it: a mosaic of tiles, each photograph cropped to fit.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/392259","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=392259"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/ghostlabs"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=392259"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=392259"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=392259"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=392259"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=392259"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=392259"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}