List Shifter: Reverse, Rotate, Swap and ITERATE (Loop) Over Bubble Lists | Now Part of Floppy

Hey @keith, running into an issue when upgrading v1.4. It is disabling the existing instances of List Shifter in my app.

Here’s what I’m seeing on the front end. If you look closely you can see it says ‘missing element’ instead of being invisible

And this is what the editor is telling me about those elements.

It was fixed simply enough by ‘replacing’ each instance of the plugin with itself but I thought you would want to know what it was doing.

1 Like

As you discovered, you have to replace them, unfortunately.

This is a side effect of a bug/limitation in the plugin builder which Bubble is aware of, but hasn’t provided a fix for as yet.

(It has to do with how Bubble creates/understands the unique identity of a plugin element.)

That makes strange sense actually, thanks! Have a coffee and cigarettes on me :slight_smile:


Hey, @eli - thanks for the Karma-Ware contribution! I’m currently testing a new version of List Shifter with a few new features, fixes and performance enhancements for large lists.

Will probably publish that this afternoon. (And it shouldn’t require replacing elements on upgrade from the current latest version… but this is hard to guarantee!)

1 Like

Hey @keith, thanks for the plugin!

Found a few bugs: tried iterating over original list in 1.4. Didn’t work. Reverted to 1.3, worked.

For some reason, whenever I try to “make change to list shifter’s current item” on iteration, the iterations only run twice.

Hey @duke.severn: first, yeah, that bug with original list crept back in.

As for the other issue: when you modify db-sourced lists (e.g., by modifying an element IN the list as you are trying to do), that list changes and so LS updates and resets. I hadn’t really designed LS for that particular use case, but I’m releasing a MASSIVE update (like, really ‘uge) to LS shortly and I think there’s a way to give you what you want. Stay tuned…

@duke.severn, well, turns out (I think) I can enable your use case (change a thing and not have List Shifter reset). You’ll have to test in the next version and let me know what you find. But my own tests show it works. This is some really edge shit, so proceed with caution.

There’s always the “right” way to do it – succinctly stated as follows:

  1. You have a list of database-sourced objects you want to Make Changes to.
  2. Search for and store that list somewhere (like a custom state or a second List Shifter - let’s call it List Shifter B)
  3. You know the length of that list (it’s That_List:count).
  4. Use the make numeric list feature of the other list shifter (let’s call it List Shifter A) to make a list of numbers of the correct length.
  5. Now iterate over List Shifter A and use List Shifter A’s values to index your array of Things.)
  6. Now you can do whatever you want to the list of Things without messing up the iteration of List Shifter A.


This is a MAJOR update to List Shifter. Video demos forthcoming, but key features include:

  1. Bug fixes (including fix for ITERATE over “Original List”). Also allows you to process lists of Things directly with certain caveats (forthcoming video(s) will show some of the core limitations of database-related operations in Bubble).

  2. Insanely performant new PROCESS List action: Iterate over Bubble lists WITHOUT needing Bubble workflows. I literally built a simple no-code environment INSIDE of the plugin to let you do cool shit that usually would require code… without coding. It’s pretty slick, but needs some explanation (read the docs for the action and watch forthcoming videos.) PROCESS List turns List Shifter into a client-side data processing powerhouse. Gives point and click access to every core JavaScript operator and function and an insane level of control over processing existing—and constructing—new lists. Even incorporates “Run JavaScript” type functionality—write your own damn expressions, functions, etc. and execute them iteratively with features never before seen in Bubble.

  3. The PROCESS List feature builds on the “make numeric list” feature introduced in 1.4. List Shifter now supports 3 distinct lists: the Original List, the Shifted List, and a new “Processed List” and “Processed Result” output. You can even re-process the Processed List to do extremely complex, multi-step list processing operations.

  4. Changes to internal array-based operations now enable List Shifter to handle lists 10X the size of before. List Shifter will easily handle lists larger than 100,000 items… and up to ONE MILLION items (possibly more) on sufficiently robust hardware.

  5. Several new exposed Events to better control List Shifter’s actions.

  6. Now includes insanely useful DEBUG BUDDY | BENCHMARK plugin (an Action) to easily log debugging messages to the console or to the Bubble Debugger. Additional feature of Debug Buddy allows you to accurately benchmark the time that workflow steps, or entire workflows take so you can tweak your iteration actions for MAXIMUM PERFORMANCE.

Videos with detail use case examples forthcoming!

IMPORTANT NOTE: Upgrading to 1.5 or higher from previous versions (1.4 and lower) will require you to replace your existing List Shifter elements with the new version. You will see “missing element” where your “old” List Shifters are. Simply double-click the element in edit mode and “Replace” it with List Shifter. TRUST ME: It’s worth the effort.

Plugin page here:

Reminder: List Shifter is Karma-Ware. It’s “free” to use in any project – and can be loaded even in “free” Bubble apps – but if you find it useful, you should contribute to future development by visiting

Arguably the most powerful and just plain useful plugin ever built for Bubble.

MORE TO COME… including video explanations of how — and how not — to use List Shifter for certain types of applications.


Awesome! Can’t wait to try it.

1 Like

Yeah, this fixes the two things you mentioned, @duke.severn. First, when ITERATE or PROCESS is happening, the plugin’s “Update” routine is essentially disabled, meaning that you can operate on the Thing currently being iterated on without causing the plugin to reset.

Additionally, ITERATE and PROCESS work on Original List, Shifted List or Processed List. (Sorry again that stupid bug with Original List crept back in in 1.4…)

PLEASE NOTE: While it would be awesome if we could actually perform workflow steps like Create a New Thing, Modify a Thing, etc. inside of iterating workflows, Bubble still kind of disallows it. i’ll explain in future videos, but certain Bubble db-related operations DO NOT TELL THE TRUTH with respect to their completion. That is, you can have a When Iterate workflow that contains “Make Changes to a Thing”… and that workflow will “complete” in a few tens of milliseconds. HOWEVER, the modified Thing IS NOT YET STORED IN THE DATABASE. It is instead held locally (the Bubble client will perceive it as updated) even though it has not ACTUALLY been permanently modified.

This leads to a situation where you can (quite easily) potentially rack up hundreds – or even thousands – of pending database operations that nobody ain’t never gonna wait around for to complete.

List Shifter is intended for client-side operations (“doing stuff in the browser”). Lists that you construct or modify can then be sent to the database, but not as individual items. They can/should be sent to the database as lists that are attached to a list-type field ON some existing Thing.

For very small lists, this may not be a problem. By very small I mean on the order of tens or perhaps up to 100 items (though that’s pushing it). This is the same restriction enforced by operations like “Clone List of Things” and “Modify List of Things”, basically.


List Shifter version 1.6 is now available. This version adds some new Constants that can be used in the PROCESS List Action and improves handling of what I call “deferred updates”.

(When ITERATING or PROCESSING a list, List Shifter’s update routine is suspended, so that it can’t accidentally be reset. Upon completion of the iteration or process action, if an update was detected, we force LS to update now that it’s safe to do so.)

1 Like

Here’s an intro video to the new PROCESS LIST feature (starting with a refresher on the ITERATE action).

PROCESS List allows for extremely fast client-side (in the browser) computations and transformations — without code.

Check it out:

(Also shows List Shifter’s pal Debug Buddy and how to use it for benchmarking.)


Great detail and interesting tool!

PS - I sped the video up, more console tricks ;), but even then I couldn’t watch the whole thing. Maybe one day I will have the time to watch your videos!

1 Like

PPS at 16 min, I like how you navigated to the Design page just to open the console. Caught myself doing that many times

1 Like

How are you speeding up vid on vimeo?

Hmm… I never realized it didn’t have speed options. (It doesn’t in the app, but I kinda thought it had that on desktop… if not perhaps I’ll put copies of my vids on YouTube…)

Anyway, you can download and then increase speed in your desktop player-of-choice, if that option isn’t available in Vimeo desktop.

Once on the Vimeo page, open the console, type the following, then hit enter and in the resulting popup type in your speed (1.5, 2, etc)

javascript: var v = document.querySelector(‘video’); var t = prompt(‘Set the playback rate’); v.playbackRate = parseFloat(t)


That’s hilarious!

And, since apparently Vimeo doesn’t embed properly in Discourse anymore (WTF is up with THAT?), here’s a YouTube link:


@keith My live app just randomly required a refresh even though I haven’t pushed anything live for over a month. Now all the data I have dependent on the list shifter plugin is not displaying in the RG and this is showing again where my List Shifter elements are placed.


I haven’t upgraded my plugin since 1.4.0 was released.

Typically I would just redeploy and fix it but I’m in the middle of a huge update and it’s going to break a lot of things if I push live at the moment.

Any ideas?

Worst case I will work through the night and patch the update to a place it is deployable but I’d rather not do that if it’s something that can be fixed.