This is called a flow. The backend tells the frontend what to ask, and the frontend just renders the components. This allows X to change the signup process (e.g., adding a "Prompt for Newsletter signup") without pushing a new version of their iPhone app or website. They just change the Flow definition on the server. Why the weird URL? Security and Bots You might ask: "Why can't I just curl https://twitter.com/i/flow/signup and create 1,000 accounts?"
By analyzing the flow/signup traffic, researchers have historically found experiments running on subsets of users. 50% of users might see a 2-step flow; 50% might see a 5-step flow. The URL stays the same ( /i/flow/signup ), but the JSON payload changes. If you open your Developer Tools (F12) and watch the Network tab while signing up for X, look for requests to https://twitter.com/i/api/1.1/onboarding/task.json . https twitter com i flow signup
When you first land on the page, a JavaScript file runs, generates a cryptographic nonce (number used once), and starts a session. The flow endpoint checks for that token in every request. If you try to jump from Step 1 to Step 4, the Flow engine throws a 400 Bad Request because you have violated the state machine. This is called a flow
Since I cannot browse live links, this post is based on the common technical function of the /i/flow/signup endpoint (the API backend for Twitter’s (X’s) multi-step signup process). Behind the Curtain: Deconstructing the https://twitter.com/i/flow/signup Engine If you have ever created a new account on X (formerly Twitter), you have interacted with one of the most sophisticated pieces of front-end architecture on the social web—without even knowing it. You clicked "Sign up," entered your name, and magically, the screen shifted, asked for your birthday, then your phone number, then your interests. They just change the Flow definition on the server
Have you ever tried to skip giving X your phone number, only to have the "Next" button greyed out? That is the Flow engine responding to a conditional rule: IF (email_provided AND NOT phone_provided) THEN (show_phone_screen = true) .