perfectdesign.

Software and systems

Web application development

Software that lives in a browser: multiple people, real records, permissions that hold, and nothing to install on anyone's device.

In short

A web application is warranted when the browser has to do work rather than show information: several people acting on the same records, each seeing only what their role allows, with states that move and exceptions that have to be handled. Scoping one means describing actors, records, transitions, permissions and integrations, not listing screens. For work done at desks, counters and on shared tablets, browser delivery usually beats an installed app, because there is nothing to distribute and a fix reaches everyone at the next page load.

Written for an owner or operations lead preparing to scope a browser-based business application · 7 min read

Website, or application?

The test is whether the browser is showing information or doing work. A website presents pages that are the same for everyone who loads them. An application keeps state: it knows who is signed in, what they are allowed to touch, what has happened to a record so far and what may happen to it next. If two people need to see different things, or the same thing at different stages, you are scoping an application.

Most businesses end up with both, joined at a sign-in. The public pages explain a service and invite an enquiry; behind the login, a coordinator works a queue, a manager approves something and a customer checks progress. They share a domain and a look, and little else: different responsibilities, different risks, different acceptance criteria. Scoping them as one thing is where estimates go wrong.

The test that separates a site from an application. If two people must see different things, you are scoping an application. A full text version follows.

The test that separates a site from an application

Primary-source guidance. If two people must see different things, you are scoping an application.

Source: MDN: Client-server overview. Reviewed .

Read the graphic as text
  • Website. Pages that are the same for everyone
  • Application. Knows who is signed in and what they may touch
  • Most businesses. Both, joined at a sign-in and little else
Download this infographic (SVG)

Why browser delivery often wins for internal tools

For work done at desks, counters, on workshop tablets and occasionally on a phone, the browser has advantages that have nothing to do with technology preference. There is nothing to install and nothing for staff to update. A fix reaches everyone at the next page load, with no store review between you and your own team. It runs on whatever hardware the business already has, and access is a link you can revoke.

The case for a mobile app is a different one: notifications people actually receive, camera and location access, an identity that persists on a personal device, or real use without a signal. Those are good reasons and we build for them, under mobile app development. What we would not do is put an internal tool through a store review cycle because an app sounded more substantial.

Three delivery forms, compared on what a business notices
ConsiderationBrowser applicationInstallable browser appNative mobile app
How it reaches peopleA link, on any device with a browserA link, plus an icon on the home screenA store listing the user downloads
Updating itNext page load, for everyoneNext load, once the cached version refreshesA new build, reviewed before release
Device featuresWhat the browser exposesWhat the browser exposes, plus installationThe fullest access to the device
Without a connectionNeeds onePossible for defined screens, if built and tested for itStrongest, when designed for it
Usually suitsStaff tools, portals, dashboardsDaily tools on shared or personal devicesConsumer apps and work on the move

An installable browser application, usually called a progressive web app, is a browser application with extra requirements attached: an icon on the home screen, defined behaviour when the connection drops, sometimes notifications. Treat each as a requirement to decide and test rather than a free upgrade, because each has to be built and verified on the devices your people really use.

Loading is the one that fails. Responsiveness is close to solved on desktop and is not the problem. What a phone struggles to load is. A full text version follows.

Loading is the one that fails

Published statistic. Responsiveness is close to solved on desktop and is not the problem. What a phone struggles to load is.

Source: HTTP Archive: Web Almanac 2025, Performance (CrUX, July 2025). Reviewed .

Read the graphic as text
  • Loading (LCP): 62%. Desktop 74%
  • Response (INP): 77%. Desktop 97%
  • Stability (CLS): 81%. Desktop 72%

Chart scale: Share of mobile websites scoring good on each Core Web Vital, July 2025.

Download this infographic (SVG)

Accounts, records and workflow states

A feature list describes screens. An application is described by who acts, which record they change, what state it moves to, what happens when that move is refused, and how anyone would prove it. Turning the first into the second is most of what scoping means. The table below does it for an illustrative enquiry and service-request workflow; the roles and policies are assumed for teaching, and the real ones are yours to agree.

Illustrative enquiry workflow, scoped for review
Workflow stepAssumed actorProposed system responseExceptionAcceptance evidence to collect
An enquiry is submittedWebsite visitorCreate a reviewable record, acknowledge it and place it in the new queueThe submission is incomplete or fails validationTest valid and invalid submissions, and confirm the record and state each produced
The enquiry is reviewed and assignedOperations coordinatorSet an owner and a due date, and record the state changeIt duplicates another record, or nobody can be assignedTest assignment and duplicate handling, and that the change is visible in the history
A proposed next step is approvedAccount managerRecord the approval, notify the owner and release the next actionApproval is refused, or a connected system is unavailableTest permitted and denied approvals, and the recovery state after a failure

Notice what the last column is not: a result. It is the test somebody will run before release. Alongside it, scope the records themselves, which system owns each field, what happens to invalid input, what a failed integration leaves behind, who is notified, and how a person resolves it by hand when the automation cannot.

Who can see and do what

Proving who somebody is and deciding what they may do are two different problems, and the second is the one left until the interface is built. Map it first: the roles, the records each role may reach, the actions it may take on them, and what happens when someone attempts something they should not.

  • Start from refusal and grant deliberately. Each role gets only the access its work needs.
  • Check on the server, on every request. Hiding a button is presentation, not permission.
  • Decide what a refusal looks like. A clear message, a recorded attempt, and no hint of what exists.
  • Scope visibility as well as action. Lists, exports, notifications and search results all reveal records.
  • Test the negative paths. Permissions are proved by a refused action, not a successful one.
Where a permission is actually enforced. A hidden button is presentation, so a permission is proved by the request that gets refused. A full text version follows.

Where a permission is actually enforced

Primary-source guidance. A hidden button is presentation, so a permission is proved by the request that gets refused.

Source: OWASP: Authorization cheat sheet. Reviewed .

Read the graphic as text
  • Signed in. We know who is asking
  • Allowed. Checked on the server, on every request
  • Scoped. Only the records that role may reach
  • Refused. A clear message that reveals nothing
  • Recorded. The attempt is kept, permitted or not
Download this infographic (SVG)

Integrations and permissions are prerequisites

An integration is not scope until somebody has checked it. Before treating one as feasible, name the system, the record owner on each side, the direction each field moves, what triggers the exchange, what happens when it fails and who watches it afterwards. Feasibility comes down to the interfaces actually available, the access your business can grant, the quality of the data and the third-party terms. Where customer records and operational workflow must stay in step, CRM and system integrations goes further.

What to bring

You do not need a specification. Bring the current situation, the change you want, the people affected, the systems in use, one real workflow with its exception, and your constraints. Label what you do not know as something to investigate rather than guessing: an honest unknown is easier to scope than a confident assumption.

A simple worksheet helps more than a long document. One page per workflow: the users and what each may do, the records and who owns each field, the states and the moves between them, the integrations, the constraints that are not negotiable, the acceptance questions and the open risks. Used as a conversation aid rather than a contract, it keeps a scoping meeting on the decisions instead of the wish list.

Delivery options, and where this page stops

Four questions settle the delivery choice: whether an existing product already handles the core process, where you genuinely need to differ from it, which integrations and permissions are required, and who owns change after launch. That wider decision belongs to custom software development. This page prepares the narrower one, whether the work belongs in a browser and what would have to be true for it to succeed there.

The recurring parts have their own pages: accounts and portals for sign-in and role-specific views, admin dashboards for the screens your team works in daily, and booking and scheduling where availability and capacity are involved.

Some decisions stay open on purpose at this stage: how the application is structured internally, how the data is modelled, the mechanics of each interface, and whether any part of it eventually warrants a mobile platform of its own. Those are settled in scoping with the evidence in front of us, not decided on a service page.

Malaysians still arrive on a desktop. This counts page views on the sites StatCounter measures, not people or devices. Read as a design instruction it says the same thing either way: in Malaysia the desktop view is not the afterthought. A full text version follows.

Malaysians still arrive on a desktop

Published statistic. This counts page views on the sites StatCounter measures, not people or devices. Read as a design instruction it says the same thing either way: in Malaysia the desktop view is not the afterthought.

Source: StatCounter GlobalStats: desktop, mobile and tablet share, Malaysia, August 2026. Reviewed .

Read the graphic as text

Page views

  • Desktop: 64.13%. Malaysia runs against the worldwide pattern, where desktop and mobile are level at about 49% each
  • Mobile: 34.88%. Still the first touch for search, social and messaging links
  • Tablet: 0.99%. Rarely worth a layout of its own
Download this infographic (SVG)

Validation, ownership and life after launch

Acceptance is agreed before the build rather than argued after it. Every row of the scope carries its expected response, its exception and the evidence to collect, across four categories: the normal path, a denied action, a failed integration and a handoff between people. Run those on a release candidate and the release conversation is about evidence instead of opinion.

Ownership is unambiguous. You own the source code in your own repository, the domain, the service accounts in your name and the data in the system, with no lock-in if you move provider. Care for a system with a real backend starts from RM 250 a month, confirmed against what was launched, and support requests are normally answered in under one working day, which is how we work rather than a contractual guarantee. When you are ready, tell us about the workflow and we will say what needs investigating first.

What you get

What is actually delivered

01

A scope you can review

Actors, records, workflow states, permissions, integrations and the acceptance evidence for each, written down before a price is fixed.

02

A prototype you can click

The main journey working on a live link, staff side included, so the rules are judged from something real rather than a document.

03

The application itself

Built in React by preference, with the workflow states, records and role-specific views agreed in scoping, and other languages where a project calls for them.

04

Permissions that hold

Roles and rules enforced where requests are handled, with refusals designed rather than improvised, and the negative paths tested.

05

Responsive across real devices

Laid out for the laptop, the counter tablet and the phone, with dense tables and multi-step forms recomposed rather than squeezed.

06

Integrations, checked before committed

Connections to systems whose interfaces, access and terms are confirmed, with failure, retry and reconciliation behaviour defined.

07

Acceptance evidence

The normal path, a denied action, a failed integration and a handoff, exercised on a release candidate before it goes live.

08

Handover and care

Code in your repository, accounts in your name, and ongoing care quoted with the project rather than added afterwards.

How it runs

Describe the work, then build the screens

Applications are not lists of pages. Scope the actors, records and refusals first and the interface becomes a consequence rather than a guess.

  1. 01

    Establish the boundary

    Which parts are public pages and which are authenticated work, because they carry different risks and different acceptance criteria.

  2. 02

    Map actors, records and states

    Who acts, what record changes, which state it moves to, what a refusal looks like, and what evidence would prove each one.

  3. 03

    Settle permissions and integrations

    Roles and their allowed actions, then the systems, field owners, directions and failure behaviour for every connection treated as scope.

  4. 04

    Prototype the journey

    The main path on a live link, including the staff view, so the workflow is agreed while changing it is still cheap.

  5. 05

    Build and test the negatives

    The approved scope built, with denied actions, interrupted integrations and exception paths exercised deliberately, not discovered in use.

  6. 06

    Release and hand over

    Acceptance evidence collected on a release candidate, then code, data and accounts handed to you with care agreed.

Proof

Work you can click through

Both are concept prototypes we built ourselves, not client work, and neither implies an outcome for a client of that name. VITALE is a direct-sales back office where distributor and operator roles work on the same records in a browser. Dwellfound is a property marketplace with five connected workspaces on one data spine, so a change in one is visible in the others.

Concept prototypes are labelled as prototypes everywhere they appear. They demonstrate what we can build, not work delivered for that named client. More client work is going live and will be added as it does.

How we work

The parts people ask about before they commit

How we build

React first, other languages when a project needs them

We build in React by preference, on both web and mobile, and we work in other languages when a project genuinely calls for it.

Timeline

Project dependent, and often quicker than expected

Timelines are project dependent. A focused build can go live in about a week, while a larger platform takes longer once scope is agreed.

Ongoing care

Quoted with the project, not bolted on

For a more complex website or a system with a real backend, ongoing care starts from RM 250 a month, with the plan confirmed against what was actually launched. Care is quoted with the project, not bolted on afterwards.

Getting hold of us

Normally under one working day

We normally respond to a support request in under one working day, and we work to solve problems as fast as we can. That is how we normally work rather than a contractual guarantee, and responding is not the same as resolving. If your operation needs a formal response or resolution commitment, we can write one into your scope.

Ownership

Everything belongs to your business

You own everything we build for you: the code, the content, the domain, the hosting account and every third-party account opened for the project. There is no lock-in. If you move to another provider, everything goes with you and we help with the handover.

  • Source code, handed over in your own repository
  • Domain and DNS, registered to your business
  • Hosting and every service account, in your name
  • Analytics, search and ad accounts, with us as a manager you can remove
  • All content, media and data in the system

Questions

Asked about web apps

Straight answers to what people ask before they commit. Anything else, message us.

How do we know whether we need a web application or just a website?

Ask whether the browser has to do work. If every visitor sees the same pages and the outcome is an enquiry, that is a website. If people sign in, act on shared records, see different things depending on their role, or move something through stages, that is an application. Many businesses need both, joined at a login, and they are worth scoping separately.

What does a web application cost?

Website packages are published openly on the pricing page, but an application is quoted against its agreed scope. The number moves with how many roles exist, how many workflow states and exceptions have to be handled, how many systems must stay in step, and how strict the acceptance evidence needs to be. A scoped conversation reaches a real figure faster than a form.

How long does it take?

Timelines are project dependent. A focused build can go live in about a week, while a larger platform takes longer once scope is agreed. What usually moves a date is not development speed but how quickly decisions, access and test data arrive from the business side.

Can we see a web application you have built?

Yes. VITALE and Dwellfound are concept prototypes we built ourselves, and both run in the browser with several roles working on the same records, so you can click through the journeys rather than read about them. They demonstrate what we build; they are not work delivered for a client of either name.

Will it work on phones and tablets?

Yes, and that is a design decision rather than a checkbox. Dense tables, multi-step forms and approval screens are recomposed for small screens instead of being shrunk, and we check the layouts that your team will actually use on the devices they will use them on.

Can it work offline?

Partly, and only if it is scoped that way. Defined screens can be made to work with a poor or absent connection, which also means deciding what happens to work done offline when the connection returns, and testing that on real devices. It is a requirement with a cost, not a setting to switch on later.

Can it connect to the systems we already use?

Often, and how far depends on what those systems expose. We check the available interfaces, the access you can grant, the quality of the data and the third-party terms before treating a connection as scope, and we say what the alternative costs when nothing suitable is available.

Where to go next

Tell us what you need built

We will show you the closest thing we have already built, then scope the real version against your requirements.