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

I had to stop and take a break to re-evaluate my beliefs the moment the devil possessed you.



I’d blame Loom for this, @jonl, but it’s more likely an issue with Chrome and/or the audio interface I’m using. Seems like sometimes when I pause, it causes my audio interface to switch from 44.1kHz to 48kHz. And of course, this happens without me being able to tell. Kind of annoying… But funny here.

Anyway, I hope this gets you going with Iteration with List Shifter! Let me know if you run into any other problems!


Next time you can start the video:

Hey hey it’s Keith from hellz :joy:


I would assume List Shifter Pro will be a plugin we can get in the Marketplace?

Oh, ha! I’m so used to writing “Calendar Grid Pro” that I just compulsively added Pro here…

These features are in “List Shifter Karma-Ware” plug-in that’s freely downloadable. It doesn’t enforce a subscription, but – if you use it and find value in it – there’s a contributions page at:

… where you can pay what you want, or pick from several options. :slight_smile:


Hey Keith, thank you for the tutorials! They’re quite useful, especially when used in conjunction with other client side plugins. The feature I’m more interested in is the iteration, but all of them seem interesting now that I went through the tutorials.

That said, I still can’t make iteration work without using “shifted list” on the field List to iterate over, it says “list is empty”. Can it be used with the “original list” option?
I think so, else you would not add the option. Then, how? And yes, “shifted list” works as expected, I change nothing when using the “original list” option.

My setup is this one:
Editor -
Run mode -

All it does is increment the number by one. Just a simple learning page.

On another thought, this plugin is quite promethean… I mean, the gods here forbade us from client side looping and you just brought it back. I think you’ll end up alive and unchained because your implementation is clean, tidier (over a well defined list, instead of just linking two client side workflows) and non official, which makes it not a Bubble team’s problem.

Anyway, any chance for us to get an “iteration finished” event? :smiley:
So we can freeze ourselves in a never ending loop by triggering the same “begin iteration” again. Just kidding, I promise I’ll use it in a good way :slight_smile:


Hey, @vini_brito. It’s possible you’ve discovered a bug with List Shifter. Original List should work as an iteration source, but maybe I’ve made a boo boo. In the meantime, just use a List Shifter without any modifications and select Shifted List as the source. That’s the same thing.

However, I am using List Shifter in production with my Calendar Grid Pro plugin (well, my private version which is where I test new features) with no issues. (Though note that I use Shifted List always as the iteration source.) You can see a sample here — check out my new GRUPZ Booking Widget… it rocks out loud:

When you select some dates in the booking widget, the calculation that happens is CG Pro iteration (to get the rate quote), followed by List Shifter iteration (to calculate fees). Works a treat.

On your other questions: Yes, I do see a use for an “Iteration Complete” event and I’ll add that in a future update. I added that to CG Pro (private version) as it turns out that’s fairly useful.

Best regards,

1 Like

Great! Thank you for taking the time to respond to that :slight_smile:

Yes, it totally works no problem whatsoever by just using the default, great in its glory.

And again thank you for the plugin!

1 Like

And BTW, I’ll take a look at List Shifter later today. Adding iteration complete event is easy and if iterate over original list is bugged, that’s a simple fix as well.

I spent the weekend doing MASSIVE updates to my site (which generated a ton of new features for Calendar Grid Pro).

1 Like

So, there is already an iteration complete event. Update to the latest version, eh?

However, there is a bug in the iterate action when using original list. I’ll fix it.

1 Like

OK, List Shifter version 1.3.0 is now available. This version fixes the bug that kept iteration over the Original List from working properly.

Please upgrade!

(Aside: Stupidest bug ever – I was simply setting the name of the list variable incorrectly when “Original List” was selected as the list source. Apparently, I had not tested that option! D’oh! Apologies, my peeps.)

Shout out to @vini_brito for reporting that it never worked correctly!


High five! :raised_hand:
Thank you for it! All is fine now.

This makes life much easier with client side plugins.


This plugin :raised_hands: :raised_hands: :raised_hands:

1 Like

New version coming shortly, too. Added a feature to just make a list of numbers (with start at and increment values), so you can use it purely as an iterator or just to make a list of numbers if you so desire/need.

1 Like

Just published List Shifter version 1.4. This adds an option to construct a numeric list rather than having to use the “Original List” field. This is useful for those who want to use List Shifter purely as an iterator.

Additionally, there’s a new GET INDEX Action that allows you to find the position of an item in the lists. You can optionally set the selected item to that item in one fell swoop.

Useful stuff!

As a reminder, if you dig List Shifter and get value from it, remember that it is Karma Ware… You can keep your Karma clear by contributing here:


I’ve been wondering lately if one could construct a page that acts as a pseudo-API of sorts to host and perform perform these iterative actions via the page and then scrape the results. This would allow for server-side processing on data that is simply not possible right now now without using an insufferably slow recursive API workflow.

The issue I’ve found, is that the bubble page rendering technique seems to resist scraping by even the most robust scraping tools–at least in a default configuration.

Given how this tool is progressing towards a ‘pure’ data processor, I’m wondering if anyone has given this serious thought?

Hey @jon2, these are interesting thoughts.

What you’re getting at is a concept that’s more generally called FaaS (functions as a service). I’d dissuade you from trying to make FaaS things in Bubble. That’s just not what it’s for. (You’d be better off spending your time learning JavaScript – which is actually a joy to work with – and just doing the iterative things you need in your Bubble page (via a plugin or via the Run JavaScript and/or Expression plugins from Toolbox).

The above being said: I have thought about building a little “sequencer” interface into List Shifter (or something like it) to get around the problems inherent in calling Bubble workflows in order to iterate.

This is a very deep problem and so I’m going to apologize for not posting a very deep answer. However, you can do the following test in the latest version of List Shifter:

  1. create a 100,000 (one hundred thousand) length numeric list with list shifter.
  2. Create an iteration workflow. JUST do that. Do not put any actions in it.
  3. Fire that off with “Begin Iterate”

Even though there are NO ACTIONS in that workflow, you’ll see that the blue bar of death appears. (Why?)

There’s simply an appreciable amount of time that transpires between iterations. This is fine for 0-100 iterations, but it starts to become annoying for orders of magnitude greater than that. (And, really annoyance sets in at about iteration 40.)

What is Bubble doing? We don’t (cannot) know, unfortunately. We do know that it’s bothering to draw the wait state bar, but that’s about it. (Why does it bother? We do not know.)

So I have thought about giving you a “sequencer” of steps to execute on each iteration (bypassing the sending of an Event back up into Bubble).

But then, I’m essentially bypassing Bubble and writing my own no code platform, with its own API (programming interface). So, I’m not sure that I care, if you get my drift.


And here was I hoping I could use the plugin to iterate my over my over 100k list :woozy_face: and make an api call in each step.
I tried it yesterday and it actually froze the browser.
I knew it was a bad idea but just wanted to push it to its limit to see.

But for a small list of about 10 to 20 the iterator really works amazingly.

I guess bubble didn’t implement this know people might want to run it on huge lists.

1 Like

I have a basic working knowledge of JS. The issue I’m encountering is querying the bubble Db server-side during an API workflow. Running more complex iterative queries on the db requires launching a recursive workflow. For example, right now on my page I use a repeating group setup as a calendar to calculate my projected inventory on hand for the next month.
This works fine and is fast (<5 seconds) to load the repeating group. The repeating group is able to take my dynamic query (which is somewhat complex given my specific db architecture) and loops through it quickly for all visible days. I can visually scan through and see what the inventory is for each day.

The problem
There is simply no built-in equivalent method I’ve found to do the above server side without having to launch a separate workflow for each day to calculate the inventory. (365 workflows per year). My end-goal is to run my inventory counting query on a schedule (say twice a day) and to setup email alerts when a low inventory number is found on a given day. On the page, this takes seconds and can be done in a standard bubble dynamic expressing. Doing it as a recursive workflow takes 10 minutes and uses nearly all of my server capacity during that time.

I’m wondering if there is a way to get the computational power of a page repeating group while server side without having to launch 365 API workflows and the large overhead that requires.

HEY @seanhoots: Funny you should mention this as I was thinking about doing a video on this. There is a client-dependent limit to how many items List Shifter can deal with.

This limit is orders of magnitude larger than for repeating groups (which of course can create many many DOM elements and hence can get very heavy on the client). RGs are OK to about 100 items, but can become very performance limiting at this level.

Depending on the client, LS can handle about 100,000 item lists before the browser falls over. On my very well specced development machine (with 32 Gigs RAM) Windows Chrome will handle up to 100,000 items and can operate on them without issue.

Again, one’s mileage will vary, depending on client-side (browser) resources…

In the case of List Shifter, what happens is that the call stack limit can get exceeded. And (while I’ve not played around with this deeply yet) this may be because I coded List Shifter entirely with array type operations rather than literal loops. I avoid loops in favor of more modern iterable expressions…

But it turns out that some of these place undue restrictions on the client.

Working on some enhancements that may make List Shifter essentially unlimited in terms of what it can do…