Application architecture
Domain models, service boundaries, and state handling defined before the interface multiplies the assumptions.
Teams need browser-based products that remain usable, secure, and maintainable as workflows and integrations grow.
Build responsive SaaS products, customer portals, and internal web applications as coherent systems—not isolated screens.
Overview
Web applications become difficult when the interface and the services behind it evolve on separate assumptions. State ends up duplicated, permissions become inconsistent, and each new workflow adds another special case.
We design the domain, the service boundaries, and the interface together, so a new workflow extends the existing model instead of working around it.
What this includes
A customer portal, an internal tool, and a SaaS product draw on these differently; scope follows the users and the rules between them.
Domain models, service boundaries, and state handling defined before the interface multiplies the assumptions.
Component-driven interfaces with consistent form handling, validation, empty states, and error behaviour.
Authentication and authorization designed once and applied consistently across routes, actions, and data.
Automated tests, environment separation, and reviewable increments so releases stay routine.
What you receive
An engagement can start with a new application, a critical workflow, or the stabilization of an existing web product.
Why it matters
Workflows share a domain model instead of each screen inventing its own.
Boundaries and tests keep the cost of the tenth feature close to the cost of the second.
Dense operational interfaces stay navigable with keyboard, assistive technology, and small screens.
Logging and error handling are designed so production behaviour can be explained.
How an application engagement runs
Establish the entities, the roles that act on them, and the rules that separate what each role may do.
Decide the service boundaries, data model, and state handling before interface work fixes them in place.
Build in reviewable slices that each run end to end rather than assembling layers separately.
Test the application as each role experiences it, including the permissions that must fail closed.
Establish environments, release process, and the runbook the team needs to operate it.
What we hold ourselves to
These are the commitments that decide whether change stays affordable once the first release is behind you.
Modules own their data and expose intent, so a change in one area does not ripple unpredictably.
Access rules are enforced server-side and default to refusal rather than to permission.
Coverage is placed where breakage actually occurs rather than spread evenly for a percentage.
Session, cache, and background work are designed explicitly instead of accumulating by accident.
Deployments are repeatable and can be rolled back, so shipping is an ordinary event.
Relevant technology
An interface layer, dependable services behind it, and the verification that lets you release without ceremony.
Relevant evidence
Evidence is labeled by type and publication status.
Scope boundaries
The line between a site, an application, a product and an installed app decides how this is built, so it is drawn explicitly.
A website publishes information to everyone who visits. An application holds records and permissions on a signed-in user’s behalf, which changes the data model, the testing, and the security work entirely.
Building one application for one organization is different from turning it into a product several organizations subscribe to; tenancy, entitlements and self-service onboarding are that second engagement.
A responsive application already works on a phone browser. An installed app is only worth its store review and release cycle when device capability or offline use genuinely requires it.
Where the requirement is a known shape — roles, records, approvals and reporting — the portal engagement starts from that pattern instead of designing it from scratch.
Questions
Application questions usually concern roles and permissions, integration with existing systems, and who operates it after launch.
Yes. The appropriate boundary depends on the existing platform, integrations, team ownership, and product requirements.
Accessibility is treated as an engineering requirement and validated according to the product context and agreed acceptance criteria.
Yes. That usually starts with a short orientation over the code, data model, and deployment path, so the first change is made with the same understanding as the tenth rather than by guesswork.
Authorization is defined once against the domain model and enforced on the server for every route, action, and record, rather than being expressed by hiding controls in the interface.
Development and testing run against synthetic or anonymized data by default. Where realistic data is genuinely required, access is agreed explicitly and limited to what the work needs.
Start a conversation
Describe the workflow, the users who depend on it, and the systems it has to work with.