---
description: >-
  Reminder: Changes here will affect only new apps created with the template. If
  you have already started your app using the template, you will not receive
  these updates in your existing apps.
---

# Changelog

{% hint style="info" %}
If you have already started your app using the template, you will not automatically receive these updates into your existing app. You will need to manually bring them over into your existing apps if you deem them necessary. I have tried to provide enough explanation below to make this simple but please let me know if you need help.
{% endhint %}

### 14th March 2025

*   **Added a custom dropdown with add item functionality**\
    Details on how to set this up are here: [#custom-dropdown](../../template-contents/ui-components#custom-dropdown "mention")\
    \


    <figure><img src="https://542313005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjfaBXbbaooqNBAgLU2sz%2Fuploads%2FEz8iWLpictDbFyeh7GWY%2FScreenshot%202025-03-14%20at%2011.52.26.png?alt=media&#x26;token=2c5cffdf-4066-4d4c-975c-3f0cfcebd017" alt=""><figcaption></figcaption></figure>



### 5th Feb 2025

*   **Added an AI Chatbot reusable**\
    \
    AI Chatbot interfaces are so common these days I figured Bullet Launch needed one! You can use this to create custom chatbots with hidden system prompts. See the docs [here](using-the-chatbot-ui).

    <figure><img src="https://542313005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjfaBXbbaooqNBAgLU2sz%2Fuploads%2FWGwO9WWIPxMhE6Oq3foo%2FXnapper-2025-02-05-11.54.50.png?alt=media&#x26;token=2e978079-df43-414b-996b-da4400e0c600" alt=""><figcaption><p>The chatbot works in light and dark mode</p></figcaption></figure>
* **Made improvements to the signup/login reusable**\
  \
  Added "Only when element is visible" to all workflows on the signup/login element so that if it's on the page but hidden, none of its workflows will run on page load. This makes the app more efficient.

### 9th December 2024

*   **Added Stripe customer portal link to App Settings**\
    \
    There are two buttons on the billing section of the dashboard which let the user cancel their plan or update payment details. If you're using Stripe these buttons just send the user to the Stripe customer portal, but the link was hard coded in the workflow.\
    \
    I changed it so you now add your customer portal link in the App Settings option set and the buttons will direct the users based off that.\


    <figure><img src="https://542313005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjfaBXbbaooqNBAgLU2sz%2Fuploads%2F3oz3cvunjiioasP20SGm%2FScreenshot%202025-01-19%20at%2010.04.40.png?alt=media&#x26;token=b71bbb23-780f-445c-9cf2-2192af9ed2c8" alt=""><figcaption></figcaption></figure>



### 9th December 2024

* **Fixes to responsiveness and width limits & change to how demo mode works**\
  \
  **Problem:** A user pointed out that large amounts of text in some text fields were not truncated correctly in certain table UIs. Also search boxes and titles of UI elements did not have a min width which made them look bad on certain screen sizes.\
  \
  **Solution:** I added some min and max widths and heights on certain elements in all of the table and Kanban UIs to improve these things.\
  \
  **Problem:** Demo mode with a test user was overcomplicated to remove.\
  \
  **Solution**: I made the Example Dashboard work without needing to login, so now demo users are just visiting the page rather than being logged in with a test account. See the READ ME FIRST page for new instructions on how to remove the demo features.\


### 13th November 2024

*   **Added a new Multi-Step Form** **UI**\
    \
    Please see the [video here](https://youtu.be/QAVP8JEWoWg) to understand how it works.\


    <figure><img src="https://542313005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjfaBXbbaooqNBAgLU2sz%2Fuploads%2FKcBtkpnrS0Haj8muLGjj%2FScreenshot%202024-11-13%20at%2017.24.12.png?alt=media&#x26;token=6efc67e2-fdb7-43d3-85bf-bad2b1abe6ab" alt=""><figcaption></figcaption></figure>



### 21st October 2024

*   **Bugfix - Lemon Squeezy webhook**\
    \
    **Problem** - I noticed blank subscriptions were being created in the database every time a webhook came from Lemon Squeezy.\
    \
    **Solution** - In **Step 3** of the **lsupdate** API workflow (in backend workflows) the conditional search which prevents a new subscription being created if it already exists was searching for the wrong thing (it was constraining by `first_subscription_item's ID` but should have been constraining by `first_subscription_item's subscription ID`).\
    \
    For older versions of the template you will need click into the search itself and update that constraint.\


    <figure><img src="https://542313005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjfaBXbbaooqNBAgLU2sz%2Fuploads%2FyRNgJpLN1jvcyzIW01DH%2FScreenshot%202024-10-21%20at%2016.56.42.png?alt=media&#x26;token=769e7e43-5dcb-4c36-8069-e0b5cefb5bf8" alt=""><figcaption><p>1) Find this workflow</p></figcaption></figure>



    <figure><img src="https://542313005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjfaBXbbaooqNBAgLU2sz%2Fuploads%2FQPiIdJUpEatd8D6rTb5w%2FScreenshot%202024-10-21%20at%2017.00.57.png?alt=media&#x26;token=8c58dd0a-1e10-41b3-9935-24d3caf6f4d9" alt=""><figcaption><p>2) Change the constraint on this search (step 3) as shown above</p></figcaption></figure>



### 14th October 2024

* **Fixed potential security issue in privacy rules**\
  **The problem:** Having a rule that says `This thing's entity is current user's entity` does not guard against a situation where the entity field is empty for both the thing and the user, in which case this privacy rule would pass and data could be leaked.\
  **The solution:** Update the rule to say `This thing's entity is current user's entity AND current user's entity is not empty`.

Please watch this [video](https://youtu.be/bx8lZ2wAymw).

{% embed url="https://youtu.be/bx8lZ2wAymw" %}



### 4th August 2024

* **Fixed Kanban 2D UI bug**\
  I noticed that once a column is empty, you could not drag an item onto that column, so I added a dropzone which allows you to drag into an empty column.\

*   **Disabled activity logs and deleted the existing logs**\
    Someone mentioned that the template was coming with over 1500 activity log entries in the database, which is not what I intended! I think every time I tested features it was creating the logs.\
    \
    I have deleted them all AND disabled the activity log feature, which was run off a database trigger. Any user who wishes to use the activity logs feature can simply remove this permanently false conditional in the backend workflows.\
    \
    \


    <figure><img src="https://542313005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjfaBXbbaooqNBAgLU2sz%2Fuploads%2FIh2CLuwgPa66KigecV6Y%2FScreenshot%202024-08-04%20at%2023.06.20.png?alt=media&#x26;token=670056a6-2420-4fca-802e-47e2853959dc" alt=""><figcaption></figcaption></figure>
*   **Fixed a login bug**\
    A user pointed out that if you try to login with an incorrect email, the login fails but the button remains in its "loading" state. I made a small change to fix this. If you want to implement the fix in your own app, you just need to go to the **⚙️ Ftn: Group - Signup/Login** reusable element, select the main login/signup button, and add the text shown in red to the conditional tab.\
    \
    The text is: `[hi]no-icon[/hi]`\


    <figure><img src="https://542313005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjfaBXbbaooqNBAgLU2sz%2Fuploads%2F7k5qLjRx2jJAznjnECSU%2FScreenshot%202024-08-04%20at%2021.25.22.png?alt=media&#x26;token=8d21d001-deef-4655-86c1-671f455d4880" alt=""><figcaption></figcaption></figure>

### 3rd August 2024

*   **Added two drag-and-drop Kanban board UIs**\
    \
    If you want to create a user experience similar to a Trello board, a Kanban board is what you need.\


    <figure><img src="https://542313005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjfaBXbbaooqNBAgLU2sz%2Fuploads%2F0tp1iJ5HE9as0kxqeJRw%2Fkanban.gif?alt=media&#x26;token=522bf6ce-1595-475d-bcc6-c2154699ee5c" alt=""><figcaption><p>This is the Kanban two-dimensional UI</p></figcaption></figure>

    \
    I created two different Kanban UIs, one-dimensional (1D) and two-dimensional (2D).\
    \
    The one-dimensional version is simpler and just allows the moving of items **between** columns but not up and down within the column. The columns will always be sorted in the order you specify, for example if it's sorted by name and you drop an item with a name starting with Z, the item will automatically show at the bottom no matter where you drop it.\
    \
    The two-dimensional version is slightly more complicated because it allows the reordering of items **within** each column as well as moving **between** the columns. This means whatever data type you are displaying must have a numeric field storing the order in which items should be displayed in the list.\
    \
    For example, if your Kanban is showing tasks in different statuses, the tasks should all have an **order** field of type **number** and at the point of task creation you will have to assign a unique number to each task.\
    \
    Any questions - let me know in the Slack! Thanks.

### 4th July 2024

*   **Added Replicate API call for generating music**\
    \
    [Replicate](https://replicate.com) is an excellent service that lets you run all kinds of open source AI models, including your own, via an API. I added in a simple API call to one of the open source models which generates music from a prompt.\
    \
    You will need to add your own Replicate private key in the appropriate place. There are two API calls, one to **create a prediction** and one to **get a prediction**. Creating a prediction starts the model running based on the prompt you give it. You then need to check back periodically to see if your prediction has finished running, this is when you use **get a prediction**.\
    \
    You can replace the model ID with any of the open source Replicate models, but you will also need to update the JSON body so you are sending through the right parameters e.g. if you're creating an image, it won't need a duration.\


    <figure><img src="https://542313005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjfaBXbbaooqNBAgLU2sz%2Fuploads%2FSNe1xDPr7ZDxIIkqgxfE%2FScreenshot%202024-07-10%20at%2013.29.21.png?alt=media&#x26;token=e0203a46-87fc-4591-b87d-aaa552fabbd5" alt=""><figcaption></figcaption></figure>

    In the example I've created, I first run a backend workflow **replicate - generate music** which runs the **Create a prediction** API call. \
    \


    <figure><img src="https://542313005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjfaBXbbaooqNBAgLU2sz%2Fuploads%2Ftmtmj4Q5YOVGN6rgZfps%2FScreenshot%202024-07-10%20at%2013.32.46.png?alt=media&#x26;token=a9628209-84ee-4e79-9987-7a7591e898fc" alt=""><figcaption></figcaption></figure>

    The workflow then schedules another backend workflow **replicate - check prediction** to run in 10 seconds time. This workflow uses the **Get a prediction** API call to check if the AI generation is complete. If not, it schedules itself to run again in 10 seconds time. This will continue until it returns a response from Replicate.\
    \


    <figure><img src="https://542313005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjfaBXbbaooqNBAgLU2sz%2Fuploads%2FH3TQePwi0m9pcqACuruA%2FScreenshot%202024-07-10%20at%2013.33.08.png?alt=media&#x26;token=f9f4e3ab-3fb4-4103-b867-2c5d23e2e3cc" alt=""><figcaption></figcaption></figure>



### 7th June 2024

* **Fixed signup issue where the "require email confirmation" functionality was not working correctly.**\
  \
  I was made aware that switching on "require email confirmation" on specific roles in the OS - User Roles option set was not working correctly. Users who signed up were receiving the confirmation email but somehow their email address was being automatically confirmed without them doing anything. \
  \
  After investigating I discovered this was likely a timing issue with the way the initial signup workflow was running, and I eventually ended up refactoring the entire signup workflow to make it more robust.\
  \
  If you are running into this issue [please watch this video](https://www.loom.com/share/da192c7f04df44668bb85b005dfc50f2?sid=b4efe767-0f95-4c76-acee-7eddc6ed6da0) to see how to update your signup/login workflows. \

* **Simplified the menu option sets by consolidating the OS admin dashboard tabs into the main OS dashboard tabs option set.**\
  \
  This should make it simpler to create multiple dashboards. All the sidebar menus now run off one option set and subtabs run off a second option set. There is a new option set called OS - App Locations which is a list of the menu locations within the app, this is used to decide which tabs to show where.\
  \
  For existing apps I wouldn't recommend trying to bring this change into your app, it's not necessary.

### 3rd May 2024

* **Fixed missing plugin actions (Toast plugin) on accounts + settings reusable**\
  \
  Weirdly a few actions related to Toast (confirmation notifications plugin) had gone missing in the workflows so they were showing this...\
  ![](https://542313005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjfaBXbbaooqNBAgLU2sz%2Fuploads%2FEnJG9CTfATQvsIFbD6Hr%2FScreenshot%202024-05-03%20at%2010.44.52.png?alt=media\&token=ee9a072a-526c-459d-aef0-9130f730911e)\
  I have deleted and replaced these actions with the correct Toast action. If you need to fix an older version, simply delete any missing actions and add in a Toast action (or copy and paste from elsewhere), similar to below.\
  ![](https://542313005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjfaBXbbaooqNBAgLU2sz%2Fuploads%2FSOSQGVg7uqntZAI8lKS9%2FScreenshot%202024-05-03%20at%2010.47.03.png?alt=media\&token=6202badc-c993-4457-a8df-f8e72f5dda51)

### 26th April 2024

* **Fixed a bug on the email confirmation page**\
  \
  The **confirmation** page is where users are sent if their role requires email confirmation but they have not yet confirmed their email by clicking the link in the automated email.\
  \
  I realised there was an error in one of the workflows on the page which was supposed to trigger when they had confirmed their email and either send the user to onboarding or to their homepage.\
  \
  The conditional below should say **is empty** rather than **isn't empty** (this is checking if the user has completed all their onboarding steps).\
  \
  ![](https://542313005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjfaBXbbaooqNBAgLU2sz%2Fuploads%2FKDPbfSgNS7iEglwfvHZr%2FScreenshot%202024-04-26%20at%2009.30.52.png?alt=media\&token=79009b15-64d0-4210-b855-9d483853afc1)\
  \
  I also added another conditional to the trigger for this entire workflow to say that if the current user's role doesn't require email confirmation, do the same page redirect. This is just in case a user accidentally lands on this page when they shouldn't be there.\
  \
  ![](https://542313005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjfaBXbbaooqNBAgLU2sz%2Fuploads%2FmvvcyQMuDPUUEU9T0rb9%2FScreenshot%202024-04-26%20at%2013.00.22.png?alt=media\&token=48360c68-934f-4c6a-8582-41cfc6986758)\


### 11th April 2024

* **Made sure you cannot invite a user without filling out the email and role fields**\
  \
  In the **UI: Section - Account + Billing,** Donnie spotted a bug that allowed you to click the invite button even if you hadn't filled in the email field and role dropdown. I added a conditional on the button to make it not clickable if either were empty.\
  \
  ![](https://542313005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjfaBXbbaooqNBAgLU2sz%2Fuploads%2FOWYb5YCKqSaNPCF50xdk%2FScreenshot%202024-04-11%20at%2015.03.19.png?alt=media\&token=79851fa0-4775-4d4b-bcd1-e733c22043e6)
*   **Fixed a bug which was redirecting logged out users to the email confirmation page**\
    \
    There was a workflow in the 🖼️ **Layout: Dashboard header** reusable which would redirect users to the **confirmation** page if their email address had not been confirmed (i.e. they had not clicked the link in the confirmation email). This was incorrectly redirecting logged out users to the confirmation page. There was also no workflow generally redirecting logged out users away from the dashboard.\
    \
    To fix this I updated the redirect workflow to only occur when the user is logged in, and added another workflow to redirect the user to **auth** if they are logged out.\
    \
    **For older versions of the boilerplate you will need to do the same:**\
    \
    1\) In the Layout: Dashboard Header reusable on you will need to add "and the current user is logged in" to this workflow trigger's conditional. This will prevent it redirecting to that page. \
    \
    2\) You should also add another workflow "When user is logged out" with an action "Go to page... auth", which will then correctly redirect logged out users to the auth page.\


    <figure><img src="https://542313005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjfaBXbbaooqNBAgLU2sz%2Fuploads%2FzTwjjRJalcVV1XwKtKRu%2FScreenshot%202024-04-11%20at%2010.00.46.png?alt=media&#x26;token=9284dd10-77e3-4858-b2ad-ee612c7ee090" alt="" width="375"><figcaption><p>Step 1: Update this workflow</p></figcaption></figure>



    <figure><img src="https://542313005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjfaBXbbaooqNBAgLU2sz%2Fuploads%2FWyxyECxt1aCweplmHGFF%2FScreenshot%202024-04-11%20at%2010.04.34.png?alt=media&#x26;token=a105342c-4a3a-4505-8ab2-f184e1a4a200" alt=""><figcaption><p>Step 2: Add this workflow</p></figcaption></figure>

### 2nd April 2024

*   **Simplified the demo mode to make it less work to remove!**

    \
    Unfortunately to provide a Bubble template it must offer a demo preview mode. Obviously I don't want random people creating things in the database or making changes to test credentials.\
    \
    So there is now one user in the database - test@test.com - and a "demo login" button on the landing page which logs the tester in as test@test.com.\
    \
    There are a load of conditionals on various buttons which make them not clickable if the current user's email is test@test.com.\
    \
    You can remove these conditionals if you want **but the point is you don't need to if you don't want to**, it shouldn't affect your app (unless you have a user with the email test@test.com).\
    \
    See the updated READ ME FIRST for more information.

### 23rd March 2024

* **Moved the right sidebar into the table reusable elements rather than a shared one on the dashboard**\
  \
  In the **Table** reusable elements (Classic rows, Image grid, Coloured grid, Calendar) I have moved the right **sidebar** to be within the reusable element itself. This makes it much less fiddly to customise the sidebar to show the information you need for each table.\
  \
  Previously the right sidebar was hidden on the **dashboard** and triggered with a URL parameter. This added extra complexity but at the time I thought it was the only way to do a full height sidebar. \
  \
  Thanks to some custom CSS it is now within the reusable itself.
