◉RORK LABJP
●GPT-6.1 SOL — Added to Rork's model menu (09-29) with Low, Medium and High effort; included on Pro and Max●SONNET 5.5 — Claude Sonnet 5.5 is selectable: strong at UI design and faster than Sonnet 5 (09-28)●SONNET 4.5 — Retires on the Claude API on 11/30, 27 days left. If your app calls it, check the migration target●SDK 58 — Moves to React Native 0.88. R8 is now on by default in Android release builds, and iOS prebuild generates a SceneDelegate●OBSERVE — EAS Observe now records native crashes too (SDK 57.0.21 or later, 10/07)●NEW — My App Open Ad Only Showed When the App…●GPT-6.1 SOL — Added to Rork's model menu (09-29) with Low, Medium and High effort; included on Pro and Max●SONNET 5.5 — Claude Sonnet 5.5 is selectable: strong at UI design and faster than Sonnet 5 (09-28)●SONNET 4.5 — Retires on the Claude API on 11/30, 27 days left. If your app calls it, check the migration target●SDK 58 — Moves to React Native 0.88. R8 is now on by default in Android release builds, and iOS prebuild generates a SceneDelegate●OBSERVE — EAS Observe now records native crashes too (SDK 57.0.21 or later, 10/07)●NEW — My App Open Ad Only Showed When the App…
Articles/Getting Started
◈ Getting Started/2026-06-13Intermediate

Designing Empty States Properly in Your Rork App — First Run, After Deletion, and Network Errors in One Component

When you build an app from a prompt in Rork, only the data-filled screens tend to look polished. Here is how to build the first-run, post-deletion, and network-error empty states into one reusable component, with retry logic, screen-reader support, and effectiveness measurement.

Rork611UX Design9No-Code15App Development34Onboarding9

✦ Premium Article

Have you ever installed your freshly built Rork app, opened it for the first time, and felt a little lost staring at a blank list with not a single row in it? Apps generated from a description prompt come out remarkably clean when there is data to show. The screens for when there is nothing yet, though, barely get any attention unless you ask for them explicitly.

These "nothing here" screens are called empty states. They are easy to overlook, yet every user passes through them the moment they open your app for the first time. Leave them blank and people quietly assume something is broken, then drift away. As an indie developer, I have shipped a number of apps to the App Store and Google Play, and the single change that reduced first-day churn the most was, surprisingly, taking the time to polish these empty screens.

This article goes past simply "dropping in some text." We will support the first-run, post-deletion, and network-error states from one reusable component, then build in retry logic, screen-reader support, and effectiveness measurement. Rather than leaving everything to Rork, we will look at exactly where to edit the generated code to change the quality.

An empty screen is not just one thing

If you treat empty states as "the screen when there is no data," you will design them wrong. The same blankness covers three very different situations, and each one calls for a different message.

The first is the first-run empty state: the app has just been installed and the user has registered nothing yet. What they want to know here is simply, "What do I do next?"

The second is the post-deletion empty state: every task is done, or every saved item has been cleared. This feels nothing like the first run. The user already knows how things work, so instructions are unnecessary. A small sense of accomplishment, or a gentle nudge toward the next step, fits much better.

The third is the network-error empty state: there is data, but a failed fetch makes the screen look empty. If you show "Nothing here yet" in this case, the user will think their data is gone. The right message is something like, "We couldn't load this. Please try again," paired with a way to retry.

Just separating these three changes the feel of your empty screens completely. And in code, it pays off to handle these three plus a "loading" case in one place, rather than scattering the same branch across every screen.

How to prompt Rork for empty states

Rork generally won't build what you don't describe. The flip side is that if you ask for empty states directly, it will produce them. Adding a line like this when generating works well:

For the list screen, create a first-run empty state for when there are zero items.
Center a soft illustration or icon, a "No ◯◯ yet" heading, a one-line note,
and an "Add your first ◯◯" button.
Use different headings and copy for the post-deletion and network-error cases,
and implement all of them as a single reusable component.

The key is to insist that the empty state include a button driving the next action, and to make it explicit that you want the three states bundled into one component. An empty state is not just a notice; it is the entry point that guides the user to their first interaction. Even if your app is already generated, you can tell Rork in chat, "The screen when there are zero tasks feels bare — please add first-run, post-deletion, and error variants bundled into one component," and it will add just that screen.

✦

Thank you for reading this far.

Continue Reading

What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.

WHAT YOU'LL LEARN
✦A reusable single-component design that switches between first-run, post-deletion, and error states, with a prompt you can hand straight to Rork
✦Exponential-backoff retry for network errors, plus a loading skeleton that stops the empty state from flickering
✦How to make empty states screen-reader friendly, and how to measure which empty state users drop off at so you can improve the copy
Secure payment via Stripe · Cancel anytime
✦

Unlock This Article

Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.

or
Unlock all articles with Membership →
Share

Thank You for Reading

Rork Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • ✦Copy-paste ready implementation code
  • ✦New advanced guides published daily
  • ✦$5/mo or $10 for lifetime access
View Membership →

Related Articles

◈ Getting Started2026-10-29
When a list is empty and no error shows, open Rork's Logs panel before asking for a fix
A Rork preview shows an empty list but no red error. Before repeating the same fix request, have the app print its values to the Logs panel and split the cause into three places.
◈ Getting Started2026-10-29
Three One-Line Additions to Your First Budget-App Prompt: Integer Yen, Local-Date Months, Normalized Input
Adding one line each about how money is stored, where a month begins, and how input is cleaned can prevent month-end totals from drifting in a household-budget app. Behavior checked on Node 22, with a small function you can reuse.
◈ Getting Started2026-10-28
Before You Change Plans, Check That Your Re-Cloned Code Can Be Rebuilt Without Rork
Exporting Rork code to GitHub doesn't guarantee you can rebuild it elsewhere. A Python script that checks lock files, app identifiers, images, import targets and env-var names in a fresh clone, plus an honest note on what was and wasn't tested.