{"id":296510,"date":"2026-04-10T12:37:31","date_gmt":"2026-04-10T12:37:31","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/bmlt-client\/"},"modified":"2026-05-06T00:23:40","modified_gmt":"2026-05-06T00:23:40","slug":"crumb","status":"publish","type":"plugin","link":"https:\/\/en-za.wordpress.org\/plugins\/crumb\/","author":16732302,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"1.2.0","stable_tag":"1.2.0","tested":"7.0","requires":"6.0","requires_php":"8.1","requires_plugins":null,"header_name":"Crumb","header_author":"bmltenabled","header_description":"Embeds the Crumb meeting finder widget on any page or post using a shortcode.","assets_banners_color":"4f8bc2","last_updated":"2026-05-06 00:23:40","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/crumb\/","header_author_uri":"https:\/\/bmlt.app","rating":5,"author_block_rating":0,"active_installs":0,"downloads":185,"num_ratings":2,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.2":{"tag":"1.0.2","author":"bmltenabled","date":"2026-04-10 12:38:48"},"1.0.3":{"tag":"1.0.3","author":"bmltenabled","date":"2026-04-10 15:01:34"},"1.1.0":{"tag":"1.1.0","author":"bmltenabled","date":"2026-04-10 20:44:21"},"1.1.1":{"tag":"1.1.1","author":"bmltenabled","date":"2026-04-11 16:12:55"},"1.2.0":{"tag":"1.2.0","author":"bmltenabled","date":"2026-05-06 00:23:40"}},"upgrade_notice":{"1.2.0":"<p>Adds format ID filtering. No breaking changes, safe to update.<\/p>","1.1.1":"<p>Adds &quot;both&quot; as a valid view option. No breaking changes, safe to update.<\/p>"},"ratings":{"1":0,"2":0,"3":0,"4":0,"5":2},"assets_icons":{"icon-256x256.png":{"filename":"icon-256x256.png","revision":3503632,"resolution":"256x256","location":"assets","locale":""}},"assets_banners":{"banner-772x250.png":{"filename":"banner-772x250.png","revision":3503632,"resolution":"772x250","location":"assets","locale":""}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.2","1.0.3","1.1.0","1.1.1","1.2.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3506496,"resolution":"1","location":"assets","locale":""},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3506496,"resolution":"2","location":"assets","locale":""}},"screenshots":{"1":"List view \u2014 meeting results with day, time, location, and address. Click any meeting name to see full details.","2":"Map view \u2014 meeting locations plotted on an interactive map with the same search and filter controls."},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[13380,13382,341,347,13381],"plugin_category":[],"plugin_contributors":[174945,154957],"plugin_business_model":[],"class_list":["post-296510","plugin","type-plugin","status-publish","hentry","plugin_tags-bmlt","plugin_tags-meeting-finder","plugin_tags-meetings","plugin_tags-na","plugin_tags-narcotics-anonymous","plugin_contributors-bmltenabled","plugin_contributors-pjaudiomv","plugin_committers-bmltenabled","plugin_committers-pjaudiomv"],"banners":{"banner":"https:\/\/ps.w.org\/crumb\/assets\/banner-772x250.png?rev=3503632","banner_2x":false,"banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/crumb\/assets\/icon-256x256.png?rev=3503632","icon_2x":"https:\/\/ps.w.org\/crumb\/assets\/icon-256x256.png?rev=3503632","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/crumb\/assets\/screenshot-1.png?rev=3506496","caption":"List view \u2014 meeting results with day, time, location, and address. Click any meeting name to see full details."},{"src":"https:\/\/ps.w.org\/crumb\/assets\/screenshot-2.png?rev=3506496","caption":"Map view \u2014 meeting locations plotted on an interactive map with the same search and filter controls."}],"raw_content":"<!--section=description-->\n<p>Crumb is a lightweight WordPress plugin that embeds the <a href=\"https:\/\/crumb.bmlt.app\/\">Crumb Widget<\/a> meeting finder on any page or post using a simple shortcode.<\/p>\n\n<p>Features:<\/p>\n\n<ul>\n<li>List and map views with real-time search and filters<\/li>\n<li>Meeting detail with directions and virtual meeting join link<\/li>\n<li>Multi-language support<\/li>\n<li>Shareable per-meeting URLs<\/li>\n<\/ul>\n\n<h4>Usage<\/h4>\n\n<p>Add the shortcode to any page or post:<\/p>\n\n<pre><code>[crumb]\n<\/code><\/pre>\n\n<p>Override settings per page:<\/p>\n\n<pre><code>[crumb server=\"https:\/\/your-server\/main_server\" service_body=\"42\" format_ids=\"17,54\" view=\"map\" geolocation=\"true\"]\n<\/code><\/pre>\n\n<p>Shortcode attributes:<\/p>\n\n<ul>\n<li><code>server<\/code> \u2014 BMLT server URL (overrides the value set in Settings \u2192 Crumb)<\/li>\n<li><code>service_body<\/code> \u2014 Service body ID or comma-separated list; leave empty to show all meetings<\/li>\n<li><code>format_ids<\/code> \u2014 Format ID or comma-separated list of BMLT format IDs to lock the widget to; leave empty to show all formats<\/li>\n<li><code>view<\/code> \u2014 Default view when the widget loads: <code>list<\/code> (default), <code>map<\/code>, or <code>both<\/code> (map above list with no toggle); can also be overridden at runtime via the <code>?view=<\/code> query parameter<\/li>\n<li><code>geolocation<\/code> \u2014 Enable or disable geolocation for this page: <code>true<\/code> or <code>false<\/code><\/li>\n<\/ul>\n\n<h4>Documentation<\/h4>\n\n<p>Full documentation at <a href=\"https:\/\/crumb.bmlt.app\/\">crumb.bmlt.app<\/a>.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin relies on two external services. Both are part of the BMLT (Basic Meeting List Toolkit) ecosystem \u2014 free, open-source tools built for Narcotics Anonymous service bodies (https:\/\/bmlt.app).<\/p>\n\n<p><strong>1. Crumb Widget CDN<\/strong><\/p>\n\n<p>The widget JavaScript is loaded from a CDN operated by the BMLT project.<\/p>\n\n<ul>\n<li>Service: cdn.aws.bmlt.app \u2014 delivers the Crumb Widget JavaScript file<\/li>\n<li>Purpose: Provides the JavaScript component that renders the meeting list interface<\/li>\n<li>Data sent: Standard HTTP request headers (IP address, browser user-agent, referring URL). No personal or meeting-search data is sent to the CDN.<\/li>\n<li>When: The script is loaded once per page load on any page that contains the [crumb] shortcode<\/li>\n<li>Privacy policy: https:\/\/crumb.bmlt.app\/privacy.html<\/li>\n<li>Terms of use \/ License: https:\/\/github.com\/bmlt-enabled\/crumb-widget\/blob\/main\/LICENSE<\/li>\n<\/ul>\n\n<p><strong>2. BMLT Server (meeting data)<\/strong><\/p>\n\n<p>The widget fetches meeting data from a BMLT server whose URL you configure in Settings \u2192 Crumb. This server is typically operated by a regional NA service body and is not a service operated by the Crumb project.<\/p>\n\n<ul>\n<li>Service: Your configured BMLT server (e.g. https:\/\/your-region.bmlt.app\/main_server\/)<\/li>\n<li>Purpose: Retrieve NA meeting listings (names, times, locations, formats) to display in the widget<\/li>\n<li>Data sent: Search query parameters (filters, keyword, selected formats). If geolocation is enabled and the user consents via a browser prompt, the user's geographic coordinates are also sent to this server.<\/li>\n<li>When: On each search or filter action within the widget<\/li>\n<li>Privacy policy: Determined by the operator of your configured BMLT server. Learn more at https:\/\/bmlt.app.<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin files to <code>\/wp-content\/plugins\/crumb\/<\/code>.<\/li>\n<li>Activate the plugin through the Plugins screen in WordPress.<\/li>\n<li>Go to <strong>Settings \u2192 Crumb<\/strong> and enter your BMLT Server URL.<\/li>\n<li>Add <code>[crumb]<\/code> to any page or post.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"where%20do%20i%20find%20my%20server%20url%3F\"><h3>Where do I find my server URL?<\/h3><\/dt>\n<dd><p>It is the URL to your BMLT server, typically ending in <code>\/main_server<\/code>. Contact your service body's regional tech team if you are unsure.<\/p><\/dd>\n<dt id=\"can%20i%20show%20only%20meetings%20from%20a%20specific%20service%20body%3F\"><h3>Can I show only meetings from a specific service body?<\/h3><\/dt>\n<dd><p>Yes. Enter the service body ID (or a comma-separated list of IDs) in the Service Body IDs field, or use the <code>service_body<\/code> shortcode attribute. Child service bodies are always included automatically.<\/p><\/dd>\n<dt id=\"can%20i%20set%20the%20widget%20to%20open%20in%20map%20view%20by%20default%3F\"><h3>Can I set the widget to open in map view by default?<\/h3><\/dt>\n<dd><p>Yes. Choose <strong>Map<\/strong> from the Default View dropdown in <strong>Settings \u2192 Crumb<\/strong>, or use <code>view=\"map\"<\/code> in the shortcode. You can also choose <strong>Both<\/strong> to display the map above the meeting list simultaneously with no list\/map toggle. Visitors can also switch views at runtime via the <code>?view=<\/code> query parameter.<\/p><\/dd>\n<dt id=\"can%20i%20get%20clean%20urls%20without%20the%20%23%20in%20them%3F\"><h3>Can I get clean URLs without the # in them?<\/h3><\/dt>\n<dd><p>Yes. Enter the page slug (e.g. <code>meetings<\/code>) in the <strong>Base Path for Pretty URLs<\/strong> setting under <strong>Settings \u2192 Crumb<\/strong>. After saving, go to <strong>Settings \u2192 Permalinks<\/strong> and click <strong>Save Changes<\/strong> to update rewrite rules. Meeting detail URLs will then look like <code>\/meetings\/monday-night-meeting-42<\/code> instead of <code>\/#\/monday-night-meeting-42<\/code>.<\/p><\/dd>\n<dt id=\"can%20i%20deep-link%20to%20a%20specific%20view%3F\"><h3>Can I deep-link to a specific view?<\/h3><\/dt>\n<dd><p>Yes. Append <code>?view=list<\/code> or <code>?view=map<\/code> to any page URL that contains the <code>[crumb]<\/code> shortcode to open the widget in that view. This works regardless of the default view set in Settings \u2192 Crumb, making it easy to link directly to the map view from a button or menu item.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20page%20builders%3F\"><h3>Does it work with page builders?<\/h3><\/dt>\n<dd><p>The shortcode works in any context that processes WordPress shortcodes. If your page builder does not render shortcodes automatically, use its dedicated shortcode block.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Added <strong>Format IDs<\/strong> setting and <code>format_ids<\/code> shortcode attribute to lock the widget to specific BMLT formats (single ID or comma-separated list).<\/li>\n<\/ul>\n\n<h4>1.1.1<\/h4>\n\n<ul>\n<li>Added <code>both<\/code> as a valid <code>view<\/code> option \u2014 displays the map above the meeting list with no list\/map toggle.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Added <strong>Base Path for Pretty URLs<\/strong> setting \u2014 enables clean meeting detail URLs (e.g. <code>\/meetings\/monday-night-meeting-42<\/code>) using WordPress rewrite rules. Leave empty to keep default hash-based routing.<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Added Widget Configuration setting (JSON) for CrumbWidgetConfig options (language, geolocation, darkMode, columns, map tiles, etc.).<\/li>\n<li>Added <code>geolocation<\/code> shortcode attribute to enable or disable geolocation per page.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Updated readme to document external services (CDN and BMLT server) with privacy policy links.<\/li>\n<li>Fixed late-escaping of inline CSS output per WordPress coding standards.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Added <code>view<\/code> shortcode attribute and admin setting to set the default widget view (<code>list<\/code> or <code>map<\/code>).<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Embeds the Crumb Widget NA meeting finder on any page or post via a simple shortcode.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/en-za.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/296510","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/en-za.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/en-za.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/en-za.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=296510"}],"author":[{"embeddable":true,"href":"https:\/\/en-za.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/bmltenabled"}],"wp:attachment":[{"href":"https:\/\/en-za.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=296510"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/en-za.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=296510"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/en-za.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=296510"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/en-za.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=296510"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/en-za.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=296510"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/en-za.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=296510"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}