Task-led, not table-led
A screen per database table is the default that makes tools tedious. Screens follow the jobs people actually finish.
Most internal tools are organised around the database rather than the work, so a single task spans four screens and the person doing it holds the workflow in their head. This starts from the task the team repeats daily and builds the screen that completes it.
A screen per database table is the default that makes tools tedious. Screens follow the jobs people actually finish.
Loading, empty, and error states are where most internal tools fall apart, because they were discovered in production rather than designed.
Hiding a button is a UI convenience, not access control. Role rules live where the data is served, and the interface reflects them.
Whatever the team uses now (a spreadsheet, a legacy admin, or a mix), and specifically the task they repeat most. What people ask for and what they do differ, and only one of those is worth building.
One screen should finish one job. If a task spans four views, that is the thing being fixed, not a layout to be reproduced faster.
Loading, empty, partial failure, error, no permission, and far too much data. Deciding these up front is what separates a tool that survives real use from a demo.
Tables, filters, forms, and dialogs as documented, reusable components. The tenth screen should cost a fraction of the first, and it only does if the patterns are set deliberately.
Against production-scale data, not twenty seed rows. Most dashboards that feel fast in review fall over the first time someone filters a year of records.
Fazal Fitness, a gym in Karachi, manages members, fees, attendance, and coaching for its Quaidabad and Shah Faisal Colony branches in software I built alongside its website. People sign in with an email or mobile number, and a branch manager resets passwords.
Every dashboard demo shows the happy path with clean seed data. Real use is mostly the other six states, and whether they were designed or improvised is what decides how the tool feels after a month.
Skeletons matching the shape of the content that will arrive, not a centred spinner that makes the whole layout jump when data lands.
The screen a user sees on their first day, before any records exist. Usually the most neglected state in the product, and the one that decides whether they understand what to do next.
One widget failed while the rest loaded. That section says so and offers a retry, rather than the whole page collapsing into an error.
What went wrong, whether retrying will help, and who to tell if it will not. Not a stack trace, and not a shrug.
A user without access sees that the thing exists and who to ask, rather than a 404 that makes them think it is broken and file a ticket.
The table with 40,000 rows. Virtualised rendering, server-side filtering, and pagination that keeps working when the dataset outgrows what anyone tested against.
Almost always the same thing: it was designed around the data model rather than the job. One screen per database table means a user finishing a single task has to visit four of them, remember values in between, and hold the workflow in their head. The fix is not more charts. It is deciding which task the team does forty times a day and building the screen that finishes it.
By watching what people actually do, not by asking what they want to see. Those give different answers. Requested dashboards fill up with vanity totals nobody acts on; observed workflows show you the three things someone checks before deciding anything. The main screen should answer 'what needs me right now', and everything else earns its place behind that.
Buy, if a product covers the workflow and you can adapt to how it works. Building is worth it when the workflow is the business: the sequence, the rules, or the terminology are specific enough that adapting to generic software would cost more than the licence saves. I will say so if what you are describing is a Notion database or an Airtable view, because a bespoke build for that is a bad use of your money.
Handled by a dedicated provider, such as Clerk, Auth0, or whatever your stack already uses, rather than hand-rolled. Role-based visibility is designed alongside the screens rather than bolted on, because a permission model added late tends to hide buttons in the UI while leaving the underlying endpoint open to anyone who knows the URL.
Usually yes, and it is normally the right call. A dashboard that reads your existing system means one source of truth and no sync to keep correct. Where the existing API is slow or awkward, a thin layer in front of it is cheaper than changing the system of record. What I avoid is copying your data into a second database that immediately starts drifting.
Four to ten weeks for a first useful release, depending on how many workflows it covers and how accessible the data is. The variable is rarely the interface. It is how long it takes to get credentials, understand the existing schema, and get a straight answer about the business rules that only live in one person's head.
You get the repo, the deployment, and documented component patterns, so a different developer can extend it without reverse-engineering your conventions. Internal tools live for years and get handed between people; one that only its original author can safely change is a liability.
A couple of sentences is enough to start. I reply within one business day.