Not a proper answer, but a workaround i use is to have the startup form as just a dummy (just shows “Please wait …”). Then in the on_show I either load form2 or form3 depending on the url parameters.
The long-term plan is to be able to specify a “startup Module” instead of a “startup form”, and have that module explicitly open_form() the correct form.
(Tech note: The reason that open_form() within __init__() doesn’t do what you expect is that Anvil creates the startup form before it opens it. If you call open_form() in the startup form’s constructor, the new form will open - but as soon as __init__ returns, it will be replaced by the original startup form you’re constructing. The show event, by contrast, occurs after the form is opened, so open_form() works as you’d expect.)