Analysis

Is your AI-built app ready for real users?

A working demo is a start. Follow one booking journey through account permissions, interrupted requests, and recovery to decide what your first users can trust.

By Adi

Published 9 min read
Conceptual pottery-studio illustration: a booking is marked as saved while a broken return path leaves the visitor's phone waiting; an envelope represents a separate notification.

Share

The demo works. You can sign in, add a record, and watch it appear exactly where you expected. After the effort of getting that far, sharing the link feels like the obvious next step.

Then someone asks a small question: “Can I try it with my own account?”

That changes what you need to know. So far, you have watched the app work for someone who knows how it was built, which buttons to press, and which rough edges to avoid. Another person brings none of that knowledge. They may refresh halfway through, open an old link, or assume that a confirmation means something has actually happened.

Before releasing an AI-built app to real users, seek evidence that its essential journey works, permissions hold, failures offer an honest next step, and someone can detect and repair problems. These are starting checks. The release decision must also cover requirements specific to the data, actions, and people involved.

For a solo builder or small team, this does not require solving every future engineering problem. It requires being clear about what you are asking people to trust today.

Watch someone use it without your help#

Consider a fictional pottery studio with an app for booking workshops.

The first version looks convincing. A visitor chooses a Saturday class, enters their details, and sees a confirmation. The organizer can see the booking. There is a real achievement here: a complete idea has become something another person can use.

Before adding a waitlist, discount codes, or a more impressive homepage, ask someone to make a booking with invented details in a test environment. Give them the goal and watch quietly.

Can they find the class? Is the date unambiguous? Does the form explain an error without losing everything they entered? Can they finish on their phone, or using only a keyboard? After they return to the app, is the booking still there?

Inspect the saved record as well as the screen. A reassuring message is easy to display; the useful question is whether the intended booking exists with the right class and status.

This exercise checks more than whether a button works. It exposes the explanations you have been supplying in your head. If a person needs you beside them to understand whether they have a place, the app still has work to do.

Use a second account, then test what it must not see#

A working sign-in screen can create more confidence than it deserves.

Signing in establishes identity. Authorization determines what that identity may do. OWASP's authorization guidance makes that distinction and recommends checking permissions on each request, including access to individual records.

For the workshop app, create two ordinary test accounts and one organizer account. Use invented names and contact details. Account A should see its own booking. Account B should not gain access to A's details by opening A's booking link. Neither ordinary account should acquire the organizer's powers simply because an administration button has been hidden.

Ask the person reviewing the implementation to check the underlying requests too. A screen can conceal data while the system still sends it to the browser.

These are useful checks, not a complete security assessment. Before accepting private information or exposing sensitive actions, have someone with relevant security experience examine the actual access rules and data flows. Give that reviewer a concrete question: “Show what prevents one attendee from reading or cancelling another attendee's booking.”

AI can help trace those rules and propose tests. Its review is still evidence to examine. GitHub's responsible-use documentation warns that its coding and review agents can miss problems or suggest incorrect changes, and calls for human review and testing. The same checks matter for human-written code; AI assistance does not change what the attendee needs.

You do not have to personally become an expert in every layer. You do need to know where your confidence comes from and when it depends on someone else's expertise.

Illustrative workshop app

Signed in. Allowed in?

In this fictional workshop, account A owns booking 104. An authorized organizer can manage it. Account B can sign in, but must not read the booking. The server checks permission for this record request; hiding an interface control is insufficient.

Open booking 104 as:

Signed-in identity

Account B

Signing in identifies the account. The record still needs an access check.

Server decision

Request not sent

The server checks this account's permission for this booking.

Account A owns the booking. The organizer has explicit permission. Account B has neither.

View complete static diagramAccount A owns booking 104 and the server allows access. Account B tries the same booking, but the server denies access. Permission is checked for each record request.
Identity tells the app who you are. Permission determines whether this request may read this record.

Make the app explain an uncertain outcome#

Now change one condition. The booking reaches the server, but the response never reaches the visitor's phone.

The visitor sees a spinner. They wait, tap again, then refresh. From their side, these are reasonable attempts to finish. From the system's side, they may be several requests to make a booking.

This is why “show an error if something fails” is an incomplete requirement. The app may know that it lost a connection without knowing whether the booking succeeded.

AWS's guidance on safe retries describes this problem: a missing response can leave a caller uncertain whether an operation happened, while repeating the request can create an unwanted extra effect. One established approach is idempotency: arranging for a repeated attempt at the same operation to avoid producing that extra effect.

For the studio, the product decision is understandable without the terminology. One booking attempt should not become two bookings because the phone lost its connection. The visitor also needs a way to find the outcome, such as checking their bookings or using a reference that the support person can look up.

The implementation needs careful review: it must distinguish another attempt at the same booking from a genuinely new booking. Disabling the button while it spins is a useful interface detail, but it cannot settle what happened on the server.

There is another handoff to check. A booking might be saved even though its confirmation email fails. In that case, the person has a place and the notification needs attention. Recreating the booking to get another email would solve the wrong problem.

A useful failure message gives the reader a safe next action. “We couldn't confirm the result. Check your bookings before trying again” is more honest than declaring that nothing happened when the system does not know. The exact wording must match a status-checking path that actually works.

Illustrative workshop app

The booking exists. The reply disappears.

The fictional visitor sends one request. The server saves booking 104, but the reply is lost. The phone cannot confirm the outcome. A status lookup finds the original booking: one record still exists. Confirmation-email delivery remains unconfirmed and needs separate attention.

Ready to book

Visitor's phone

Ready

This is what the visitor knows, not the full server state.

Server record

0 bookings

Nothing has been saved yet.

Confirmation email

Not queued

There is no saved booking to notify the visitor about.

The visitor starts one booking attempt.

View complete static diagramThe visitor's phone is still waiting because the reply was lost, while the server already holds saved booking 104. Check the saved result before repeating the booking.
A lost response does not prove a failed booking. A status check reads the existing result; it does not create another booking.

Ask for evidence that could disagree with the AI#

Suppose the agent reports that every test passed. Keep that result. Then ask what those tests were capable of finding.

A test can check that submitting the form produces a confirmation. If the same mistaken assumption shaped both the implementation and the test, both may agree while the visitor's problem remains unresolved. A passing check means more when someone has challenged its expected outcome.

For the workshop app, a focused release rehearsal could cover:

  • An ordinary booking: follow it from the visitor's screen to the saved record and organizer's view.
  • Another person's record: verify that an ordinary account cannot read or cancel it through either the interface or a direct request.
  • An interrupted response: establish what was saved, what another attempt does, and how the visitor discovers the result.
  • A failed notification: check that the booking remains correct and the organizer can identify the delivery problem.

Write the expected results before the agent implements the change. Ask a reviewer who did not make the implementation decisions to challenge them. For important boundaries, that reviewer needs relevant expertise; merely switching to another model does not establish correctness.

Run these exercises in an authorized test environment with invented data and controlled failures. Record which version was checked and any material differences from the intended live setup. A test using a pretend email service tells you something different from a successful delivery through the configured provider.

There will be other requirements for a real booking service, including capacity, cancellations, accessibility, and abuse controls. This rehearsal is a starting point for one journey, not a certificate that the whole app is safe to launch.

Rehearse the morning after a bad update#

Imagine a later update puts some bookings in the wrong class. The team restores the previous application version. The screen works again.

What happens to the bookings already changed?

Restoring application code does not, by itself, reverse changes in a separate database or recall an email already delivered. Recovery must account for those effects. AWS's rollback-safety guidance (PDF) also describes the compatibility problem: earlier software must still be able to work with state written by a newer version if rollback is to succeed.

For a small pilot, the recovery plan can be short, but it should answer real questions. How will the organizer notice incorrect bookings? Can new bookings be paused? Who identifies affected records, decides which class each person belongs in, and contacts them? How will a correction avoid damaging valid bookings made later?

A backup may help, but restoring an old snapshot can also remove legitimate work done since that snapshot. Have the recovery approach reviewed and rehearsed on test data. Do not discover its consequences during an incident.

Useful monitoring follows the user journey. An available homepage tells you little about whether bookings are being saved or confirmation messages are getting through. Record enough operational evidence to investigate those steps without copying private form contents or credentials into logs. Route actionable failures to a person who is actually available to respond.

For the builder, this changes the meaning of “done.” The release includes the way somebody will operate it after the coding session ends.

Illustrative workshop app

Undo the code. Then check the consequences.

In this fictional example, a faulty version 2 update moves a Saturday booking to Sunday. Rolling back to version 1 leaves the saved booking on Sunday. A separate, targeted repair restores Saturday. The attendee still needs a correction message; repairing the record does not contact them.

Application code

Version 1

The code version and the booking record are separate state.

Saved booking

Saturday · correct class

This record changes only when an action writes to it.

The starting record is correct. Apply the fictional faulty update to see what recovery must address.

View complete static diagramThe application returns from version 2 to version 1, but a booking incorrectly moved to Class B stays in Class B. Repairing affected records needs a separate recovery plan.
Code and saved data have separate histories. Restoring an earlier version does not, by itself, repair records already changed.

Reduce what the first release is allowed to do#

There is a reasonable objection here: if a small project needs all this attention, when does anyone get to launch?

The answer often lies in reducing the first release's scope.

If automatic booking confirmation is not yet dependable, the studio could begin with a request form that clearly says a place is pending organizer approval. That changes the service being offered. It is only a useful compromise if requests are stored privately, one person owns the approval queue, attendees know when to expect an answer, and the studio caps demand at what it can handle.

Manual review also has failure modes. An unmonitored inbox simply moves the uncertainty to another place. The smaller release needs evidence too.

Likewise, inviting a few people can limit the number affected by a defect, but it does not make a known access-control problem acceptable. Google SRE's canary-release guidance supports limiting exposure and watching the result as part of release management. The useful principle for a small team is to expand only when the evidence supports the next step.

A private prototype with invented data, an invitation-only pilot, and a public service taking bookings are different commitments. Name which one you are making. When a critical question has no answer, change the scope, obtain the missing review, or delay that capability.

Choose the main thing a visitor must be able to accomplish. In a test environment, have another person attempt it without coaching, using an ordinary account. Then interrupt one handoff and inspect both the saved result and what the person is told.

Keep a short record of the version tested, the observed outcome, the unanswered questions, and who owns the next decision. If the work exposes a missing requirement, use the AI coding specification guide to give the agent a bounded change with clear acceptance evidence.

The pottery studio does not need a remarkable technology stack to run its first pilot. It needs the attendee and the organizer to agree about whether a place is booked, and a practical way to resolve the situation when they do not.

That is a useful place to spend the next hour of development.

Sources#

Sources checked on 19 September 2026. The workshop and its failure scenarios are illustrative; they are not measured product results.

Further viewing#

JavaScript Mastery, AI Can Build Your App. It Can't Engineer It. (9 Skills), discusses engineering workflows for AI-assisted development. Its workflow discussion is useful context; the video also promotes the creator's course. Adi has no commercial relationship with JavaScript Mastery.

Reader briefing

Keep the useful part of the internet close

The Adithhya Brief will turn worthwhile ideas into a concise note with a practical next step.

Share what would help

This opens a feedback email; it does not subscribe you. No recurring marketing is sent today. Do not include sensitive personal information.

Found an error or have better evidence? Send a correction. Material updates are reviewed and reflected transparently.

Continue reading

Related signals