Thank you for letting us know! I agree, the behavior of apps definitely changes as they grow in size. What you are reporting does sound consistent with the components entering into a corrupted state and this unfortunately carrying over with the state of the component.
Thank you for sharing the JSON and I will relay this to the bug ticket we have on the issue.
Is there any update here? Iām noticing that the previous work arounds of renaming or increasing the margin to move the components are no longer working for me.
Stacks are basically unusable at this point. Drag-and-drop doesnāt work, cut-and-paste-into drops items in random placements. Cutting and pasting whole stacks seems to reverse the order of child elements and drop all width settings from said elements. If I try to change the container from stack to grid every element just locks in place and I canāt do anything with it. Just wholly unpredictable behavior across the board. Iām forced to rebuild my stacks from scratch any time I need to reorder anything. Is there any update or urgency on this issue?
Please letās get back to discussing this issue. I can confirm the behavior described by @jericsinger. Stack containers are the fundamental elements on which the entire UI is built in typical web frameworks like React, Vue, Angular. They must work correctly in Retool, otherwise itās impossible to build complex, responsive UIs using standard components. It would also be very useful to add the ability to change the order of components in the component tree via drag and drop
@jericsinger could you share with me a JSON export of your app along with a video of drag-and-drop, cut-and-paste not working for you? I can forward this along to our engineers to get some more attention on this ticket.
@MChuduk thank you for the feedback, I had created a ticket for a component tree and I can definitely add your +1 to that ticket as well.
Weāre experiencing the exact same issue, and itās honestly been incredibly frustratingā¦
We reported this to Retool support about 3 months ago (Retool Cloud, Enterprise contract). We opened a ticket ( #00105323), provided the code, and even shared video recording of the broken editor behavior. Since then - no meaningful update.
What makes this even worse: if youāre using source control and make UI changes, after merging and redeploying from source control, components inside Stacks can end up randomly shuffled across that changed app. This is a major blocker for us. It breaks layouts unpredictably and makes safe deployments impossible.
The problem is bigger than just drag-and-drop not working properly in Stack components. If Stacks are unreliable, it becomes almost impossible to build properly responsive UIs in Retool without resorting to custom components. And if everything has to be built as a custom component, it really defeats the purpose of using Retool in the first place.
Weāve been stuck with this for a long time with no resolution. Would really appreciate any kind of a feedback or ideas on a workaround
Hello again @jericsinger Thank you for being so candid, your loyalty means a lot to us, and I completely understand why it feels frustrating to wait on a fix/workaround.
Currently, the layout system overhaul that will fix this issue is on the back burner. It hasn't been forgotten, though, even if our engineering focus is on the new app builder. We do still plan on revisiting the layout engine as part of our maintenance of the classic building experience, but can't give any specific timeline.
In the meantime, are you open to converting your classic apps? The new React-based architecture eliminates most, if not all, of these bugs related to the drag-and-drop layout system. We'd be happy to talk through the process and answer any questions during Office Hours!
Regular Office Hours run every Tuesday and Thursday 2pm EST: great for all Retool questions
AI Office Hours happen every other Thursday at 12pm EST and are focused specifically on AI questions
We built our app on the resources that you guys provided and promoted, including workflows, which I notice arenāt supported in conversion. These are mission-critical apps that underlie our entire corporate workflow. If I need to invest in a complete rebuild on a new platform, please let me know as soon as possible.
My team has spend thousands of hours building them, and moving from a codebase we intimately know and understand to a vibe-coded spaghetti mess is the last thing I want to do. I would pay double or triple for a version of Retool that excised all the nonsense and focused on reliability and performance. We thought we were buying into an enterprise solution, not the latest fad.
If your leadership is committed to killing what brought us onto this platform in the first place, Iād be grateful if theyād just state that clearly and provide an EOL timeline (plus maybe an option to move to self-hosted at a reasonable price). The endlessly changing roadmap is endlessly frustrating, and frankly unworkable for those of us who committed to one platform only to watch it erode from under our feet.
I totally get feeling a sense of instability, @jericsinger, as there is a ton of change coming down the pipe. I feel it too! And while we certainly encourage everyone to try out the new builder, classic apps will realistically continue to be supported for 2+ years. Which includes ongoing work on the layout rework that was previously postponed.
One of our primary focuses during this period is to make the eventual transition for users like you as frictionless as possible. There are currently some definite gaps with app conversion - like triggering workflows from an app, which can only be done via a workaround - but we're working hard to ensure everything that youāve built thus far will have a direct functional analogue, even if itāll look a little different under the hood.
We actively want to understand any misgivings you have about this product direction and, in particular, are interested in hearing more about what brought you to Retool in the first place. That is obviously a perspective that we value and want to preserve - let me know if youāre open to jumping on a call!
One important prerequisite: this only works if you're on source control, with the app set to Protected (i.e. committed to source control). Without that you can't get at the files this relies on.
Whatās the cause? What's actually going on?
The root cause is bug in the Retool editor itself. When you copy-paste a component from one stack into another, the editor carries over all of the copied component's properties to the new location - including its position in the original stack.
So if the component sat at position 0 in its original stack, the editor just copies that setting straight into the target stack. But the target stack almost always already has a component at position 0. Now you've got two components both claiming position 0, and two things happen:
drag-and-drop in the editor stops working entirely
the components get reshuffled randomly every time Retool redeploys the app from source control. Not just conflicting ones, but all in stack supposedly
That second one is what makes it so nasty with source control ā the layout looks fine, then a redeploy quietly scrambles itā¦
The fix:
Open your source control repo and find the app / page / component you're editing.
Locate the relevant *.positions.json file.
Manually re-fill the ordinal property so there are no duplicate positions within the stack.
Push the fix and re-deploy.
After the redeploy everything should be back to normal ā as long as you've resolved every conflict in the UI hierarchy. If even one duplicate ordinal is left anywhere in the tree, the symptoms come back, so it's worth going through the whole stack carefully.
It's not pretty, but it's been a reliable escape hatch for us while waiting on a proper editor-side fix. Hope it saves someone the headacheā¦
And, honestly, I also hope this breakdown finally helps Retool fix the actual issue. Once you look at the examples people have reported here (and we've already attached our full source code to our ticket) the cause is easy to spot, and it should be an easy fix too. It's been months without a meaningful reply, while all the focus seems to go into AI and reshaping Retool into something we never signed up for, instead of fixing the core building experience we're actually paying for
p.s. Iām re-reading this and just realized - this does not have to be copy-paste, additional trigger for the bug can be branch merging(e.g. conflict), etc. ā¦
Appreciate you sharing this insight, @Mladen_Trisic! I'll be sure to pass it on to the team.
One thing to note - it should be possible to apply the same fix even without external source control by exporting the app as Toolscript, modifying the underlying files, and then re-importing them back into Retool.
Can you give some guidance on the workflow for reimporting modified projects into Retool? I built a mini-app to update the positions files using the following code (in case itās useful for others):
var input = _.cloneDeep(Input.value)
var output = {}
var pairs = _.toPairs(input)
var containers = _.groupBy(pairs, arr => arr[1].container)
var ctrNames = _.keys(containers)
for (let i in ctrNames) {
let ctr = ctrNames[i]
let items = containers[ctr]
// Check for stackPosition elements. If some, delete zombies. If all, continue on.
let allStack = _.every(items, item => item[1].hasOwnProperty('stackPosition'))
if (!allStack && items.length > 1) {
items = _.map(items, item => _.omit(item, 'stackPosition'))
console.log('Removed zombie stackPosition fields from ' + ctr)
}
// Check for duplicated stackPosition.object.ordinal
if (allStack && items.length > 0) {
let sorted = _.orderBy(items, item => item[1].stackPosition.object.ordinal, 'asc')
let ordinals = _.map(sorted, item => item[1].stackPosition.object.ordinal)
if (ordinals.length !== _.uniq(ordinals).length) {
// Assign unique ordinals
items = _.map(sorted, (item, k) => {
item[1].stackPosition.object.ordinal = k * 1
return item
})
console.log('Deduped ordinals in ' + ctr)
}
}
// Push items to JSON
for (let j in items) {
let item = items[j]
output[item[0]] = item[1]
}
}
// Set value
Output.setValue(output)
utils.copyToClipboard(output)
utils.showNotification({
title: 'Repairs complete. Output copied to clipboard.',
notificationType: 'success'
})
My attempted workflow here was to:
Export my app as Toolscript;
Unzip it;
Open the folder as a workspace in VS Code;
Update each .position file by copying the file contents from VS Code into the mini-app, running the above JS query, then copying and pasting the output back into VS Code;
Save all files in the workspace
Zip the workspace folder; and
Attempt to re-import the .zip back into Retool
Unfortunately, this doesnāt seem to work. I donāt get any error messages, but also, nothing happens. Can you please let me know what, if anything, I should try to make this work as you laid out, @Darren ?
If this could be made to work reliably, it would save me so much frustration. Thank you sincerely in advance.
UPDATE: I put together a quick video here demoing the entire flow, albeit it with a single manual edit to the underlying positions file. That said, I don't see anything that is obviously wrong with the script that you've shared. I can do some additional testing with a real app, though, if you're open to sharing:
I'm taking a look, @jericsinger! Early signal is that it's an underlying issue with the script itself, as I've confirmed that manual edits to the `stackPosition.object.ordinal` property persist when re-imported into Retool.