{"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-04-10T20:44:21","modified_gmt":"2026-04-10T20:44:21","slug":"crumb","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/crumb\/","author":16732302,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.1.0","stable_tag":"1.1.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-04-10 20:44:21","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/crumb\/","header_author_uri":"https:\/\/bmlt.app","rating":0,"author_block_rating":0,"active_installs":0,"downloads":48,"num_ratings":0,"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"}},"upgrade_notice":[],"ratings":[],"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"],"block_files":[],"assets_screenshots":[],"screenshots":[],"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":[],"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\" 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>view<\/code> \u2014 Default view when the widget loads: <code>list<\/code> (default) or <code>map<\/code>; 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. 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=\"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.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 meeting finder on any page or post.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/296510","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=296510"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/bmltenabled"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=296510"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=296510"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=296510"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=296510"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=296510"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=296510"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}