Search the Forum for the term “Publish” or “Published”. You’ll see that you can “freeze” the app (as seen by users) while still working on improvements, step by step.
This leverages Anvil’s use of the Git version control system. Each app has its own independent repository of files, with a history of prior versions. You can mark any version as “Published”, and that’s what end-users will see. (Only one version can be Published at a time.) Meanwhile, you can continue to improve the code, creating new Development versions step by step.
As I understand it, this use of Git applies only to the app’s code, user interface, permissions, and services. Changes to your database structure (tables and columns) and content (rows) take place immediately, and are visible to all versions of the app, including the Published version.
Thus, if you need to make backwards-incompatible changes to database structure, then you’ll need to make them in a clone of the original app. As a distinct app, the clone can have its own, distinct set of tables, columns, and rows.
After you’ve done this a few times, you may discover a stable set of subroutines and/or data, things that absolutely don’t (or shouldn’t) change from one app to the next. You may then want to make a “library” out of them, usable from all the apps. This gives you a single point of maintenance for these routines.
Again, this applies only to code and user interface. Library code does not inherit the library app’s tables, permissions, or services. Those must be provided by whatever app uses the library.