AI Engineer NYC 2026 Online Talks

Please… Enough with the Sloppy, One-Shot SaaS Replacements — Mahmoud Abdelwahab, Railway

Read the talk

Please… Enough with the Sloppy, One-Shot SaaS Replacements

Mahmoud Abdelwahab’s internal marketing app at Railway shows how much work begins after a feature runs: preserving edits, making actions reversible, sharing useful views, reusing good patterns and testing the experience against running infrastructure.

From a talk by Mahmoud Abdelwahab

At a glance

Ideas worth remembering

  • A structured codebase and explicit reference pages give agents existing patterns to reuse across features.

  • Specify product behavior alongside functionality: non-blocking autosave, unsaved-change protection and optimistic updates with rollback.

  • Delayed deletion creates an undo window; archiving supports reversible removal from everyday views.

  • Package recurring preferences as skills, then verify the feature end to end against running infrastructure.

A working replacement still has to earn daily use

Sending an email or publishing a post is only part of replacing a marketing tool. The replacement also has to feel good when someone opens it every day. Mahmoud Abdelwahab opens with that gap: agents can produce working software in one shot, while the software people want to use depends on care that a feature request may never specify.

At Railway, his replacement is an all-in-one internal marketing app. It manages website content, the changelog and blog; sends email; posts across social platforms; and manages website media. A small CRM tracks external creators. Task tracking, launch planning and a calendar coordinate what goes out and when. Comments and real-time editing support the people doing that work together. Agents built the app, and Railway runs it with automatic deployments.

Recorded from an outdoor bench in Edinburgh in October 2026—a “ten out of ten bench”—this is a set of opinions earned while building that tool. Abdelwahab explicitly leaves room for those opinions to change as agents improve. The useful question is immediate: what must you ask for to turn a functioning internal app into a consistent, polished place to work?

0:004:03
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

0:00 · section reference included

Give the agent patterns worth repeating

“Tech stacks don’t matter” needs a qualification. An agent may be able to work in many languages and frameworks, but the structure of the codebase still affects what it produces. Solid abstractions give a new feature an existing way to fetch data, organize code and present behavior. Without those patterns, each feature gives the agent another opportunity to invent a different solution to the same problem.

Abdelwahab’s preferences are TanStack libraries for web development and Payload for content-related work. The reason for choosing a CMS is practical: being able to build one from scratch does not make that the best use of effort. Established abstractions provide a starting point the agent can reuse. His broader recommendation is a properly structured codebase, rather than a claim that these particular libraries are mandatory.

The same distinction appears in the product. A server-rendered page with a submitted form can send an email or publish content. It satisfies the basic operation. Recreating a favorite SaaS product exposes the smaller decisions that make repeated use pleasant, and Abdelwahab finds that agents often leave those decisions out unless they are requested explicitly.

2:302:59
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

2:30 · section reference included

Save progress without interrupting the writer

A document editor makes the first missing behavior obvious. Requiring a Save click puts responsibility for preserving progress on the writer. Autosave moves that work into the background, but it also needs an interaction requirement: saving must be non-blocking. The writer should keep typing while the app saves, rather than waiting for each operation to finish.

A second layer guards against closing the browser tab while changes remain unsaved. These mechanisms address different moments: background saving preserves progress during work, while the close guard intervenes when the user tries to leave before saving finishes. They reduce opportunities to lose edits; the talk does not establish a guarantee against every browser, network or storage failure.

Real-time collaboration extends the editor to concurrent edits. In Abdelwahab’s experience, the agent could add it after a discussion and review of how it would work. His joke about “seven hundred million tokens later” preserves some of the effort behind that success. The recording does not explain a conflict-resolution algorithm or synchronization protocol, so the transferable lesson here is to specify collaborative behavior explicitly, rather than to copy an implementation.

4:335:03
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

4:33 · section reference included

Make suitable actions feel immediate—and recover from failure

Optimistic updates change when the interface acknowledges an action. Instead of showing a loading spinner until the operation completes, the app immediately displays the expected success state and synchronizes the change in the background. If synchronization fails, it rolls the interface back and tells the user the operation did not work. The fast path and the recovery path belong to the same feature.

That makes an action feel faster without claiming that the underlying operation finishes faster. It also requires judgment. Some actions should retain a loading state until success is confirmed. Abdelwahab recommends asking the agent to plan where optimistic updates make sense, rather than applying them indiscriminately. Knowing to request the behavior is part of building the product.

6:036:32
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

6:03 · section reference included

Separate removing an item from destroying it

A request to delete records often produces a Delete button, perhaps a confirmation dialog, and then deletion. Undo changes the experience. Clicking Delete immediately removes the record from the interface, while a short window lets the user change their mind. If they choose Undo, the record returns. If they do nothing, the app performs the deletion after the window expires.

When does deletion actually happen? The branch below separates the immediate visual response from the delayed operation. Both outcomes begin with the item disappearing, but only the expired undo window leads to deletion. This is a specific timing decision: the implementation described delays the operation, so Undo can restore the item before that operation occurs.

Archiving handles a different intent: someone wants an item out of the interface or search results without losing the ability to bring it back later. Archive and Unarchive give that intent its own operations. A short undo window helps with an immediate change of mind; archiving provides a reversible way to keep a record out of everyday view.

Immediate removal, delayed deletion

Click DeleteThe user asks to remove a record.
Hide item; offer UndoRemove the item from the UI and allow a short time to change course.
Restore itemUndo brings the item back.
Perform deletionRun the delayed operation when the user leaves the action unchanged.
The undo window branches into restoration or deletion. Hiding the item is immediate; deleting the record waits.
Read the diagram as text
  • Click Delete. The user asks to remove a record.
  • Hide item; offer Undo. Remove the item from the UI and allow a short time to change course.
  • Restore item. Undo brings the item back.
  • Perform deletion. Run the delayed operation when the user leaves the action unchanged.
  • Click Delete → Hide item; offer Undo: Immediate UI response.
  • Hide item; offer Undo → Restore item: User chooses Undo.
  • Hide item; offer Undo → Perform deletion: Window expires without Undo.
7:027:32
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

7:02 · section reference included

Make a useful view easy to share and continue

Lists acquire useful context through filters, sort order and other conditions. Keeping that state in the URL lets someone share the configured view with a teammate. The recipient can open the intended selection directly, rather than reconstructing the sender’s filtering and sorting choices. The URL carries the view’s settings.

Infinite scroll removes another repeated interaction. As the user scrolls, the app loads more records instead of requiring another Load More or Next Page click. At the end, it indicates that there is no more data. This is Abdelwahab’s preference for a tool used every day: remove the small navigation task that otherwise repeats throughout the work.

8:339:03
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

8:33 · section reference included

Reuse an existing page, then package recurring preferences

Once a page works well, it can become a concrete reference for the next feature. Ask the agent to follow its UI, data fetching and overall structure. Two areas that both list, create, update and delete records should offer a consistent experience. A reference page gives the agent a local example of what that means, extending the earlier idea of reusable code patterns into reusable product decisions.

References improve consistency in Abdelwahab’s experience, but they do not ensure compliance: sometimes the agent ignores the named page. Recurring opinions can also be packaged as agent skills, so the agent has guidance to apply across features. Reference pages supply examples; skills carry reusable instructions.

His internal tooling draws on three kinds of guidance:

  • UI and written feedback. One skill covers interface quality, typography, layouts and better error messages.
  • Motion. Another set of design engineering skills guides animations and related interaction details.
  • Deployment. Railway agent skills help the agent work with and deploy the infrastructure running the tool: buckets, databases, the application and the real-time server.
9:3310:03
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

9:33 · section reference included

The final check is using the running feature

A passing build and passing tests can still accompany a broken experience. That is why verification is the final—and, for Abdelwahab, most important—step. The agent needs to try the feature, observe what fails and fix it. Computer use made that form of verification substantially more useful in his workflow because the agent could exercise the application rather than stop at an implementation report.

The instruction includes the environment: run the infrastructure and verify the feature end to end. This asks the agent to test the feature in operation, where its pieces must work together. It is the practical check on all the earlier requests: the desired interaction has to survive actual use, not merely exist somewhere in the code.

The destination is an internal tool that works consistently and feels good enough to reach for. Abdelwahab closes by inviting builders to become their company’s “SaaS layer.” In this account, that role includes choosing the small behaviors, carrying them across the app and checking the running result—the work that turns generated features into something colleagues want to use.

11:3312:03
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

11:33 · section reference included

Resources

Transcript download
Read the transcript and explore slides

Loading transcript and slides…