Skip to main content
Web application development

Web applications your team can live inside all day

A web application is software that happens to run in a browser. It has accounts, permissions, rules, history and reports, and the people using it will spend hours in it every working day. We build these on Python and Django, and we design them for speed of use rather than for a screenshot.

The difference between a website and a web application

A website presents information. A web application does work. That distinction sounds academic until you are pricing one, at which point it becomes the single most important thing to establish. A website can be finished. An application is a piece of business machinery that will keep changing for as long as the business does, and it needs to be built with that in mind from the first day.

The applications we are asked for usually start with the same story. A process is currently held together by a spreadsheet that several people edit, an email chain, a shared folder and somebody memory. It worked when the company was smaller. Now records go missing, two people make conflicting changes, nobody can answer simple questions about volume or status, and the person who understands the whole thing is on holiday.

Replacing that with software means far more than putting the spreadsheet online. It means deciding who is allowed to see and change what, what must be recorded when something changes, which rules are enforced by the system and which remain human judgement, what happens when two people act at once, and how the information you need for decisions gets summarised without somebody spending Friday afternoon building a report by hand.

We handle all of that as part of the specification stage, before any code is written. The document that comes out of it describes every screen, every role, every rule and every report in plain language, and it becomes both your approval point and our definition of finished.

Accounts, roles and permissions

Almost every application we build has several kinds of user, and the differences between them matter enormously. A supervisor can approve. An operator can record but not delete. A finance user can see costs that others cannot. An external partner can see only their own records. Getting this wrong is not a cosmetic problem, because showing one customer another customer information can cost more than the entire project.

Our permission checks are enforced on the server, not merely hidden in the interface. Hiding a button does not stop somebody who knows the address of the page behind it, and we have taken over more than one system where that was the only protection in place. We also record who changed what and when, because the first question after any dispute is always who did this, and an application that cannot answer it creates arguments instead of settling them.

Designing for the person who uses it constantly

The buyer of a business application and the daily user are usually different people, and their priorities conflict. The buyer wants a dashboard that looks impressive in a board meeting. The user wants to complete the same task two hundred times a day without their wrist hurting. We design for the user, because their experience decides whether the data going into the system is accurate, and inaccurate data makes the dashboard worthless anyway.

In practice that means the most frequent task gets the fewest clicks. Fields that can be filled automatically are filled automatically. The keyboard works without reaching for the mouse. Errors are caught as they happen rather than after a long form is submitted. Lists remember the filter you were using. Nothing here is glamorous, and all of it is the difference between software that gets adopted and software that gets circumvented.

Reporting that answers real questions

Reporting is where many applications quietly fail. Data goes in reliably for a year, then management asks a question the system cannot answer because nobody thought about it during design. Fixing that later can mean restructuring tables and reprocessing history, which is expensive.

We ask about the questions early. What will you want to know weekly? What does the board ask for annually? What would you check if something looked wrong? Which numbers must reconcile with your accounts? Those answers shape the data model so that reports are simply a matter of querying properly rather than reconstructing information that was never captured.

Where reports are heavy, they are generated by background workers rather than made to run while somebody stares at a loading screen, and the result is delivered as a download or an email when it is ready. That single pattern keeps large applications feeling fast no matter how much data accumulates.

Built to survive the third year

Applications rarely fail on launch day. They fail in the third year, when the table has ten times more rows than anyone anticipated, when a new requirement does not fit the original shape of the data, or when the framework version reaches the end of its support and upgrading turns out to be a rebuild.

We plan for those moments deliberately. Indexes are chosen from the queries the system will actually run. Fields likely to need history are given history from the start. Anything that might later belong to more than one parent is modelled that way immediately. Dependencies are pinned so deployments are repeatable, and framework upgrades are scheduled as small pieces of work well before support ends. None of this is visible in a demonstration, and all of it decides what year three costs you.

Typical modules we build

  • User accounts with role based permissions
  • Job, case or record tracking with history
  • Approval and review workflows
  • Scheduling and calendar management
  • Document upload and controlled access
  • Notifications by email, message and in app
  • Search and filtering across large datasets
  • Reports, exports and scheduled summaries
  • Audit trails covering who changed what
  • Integrations with the systems you already use

Built with

PythonDjangoDRF MySQLRedisCelery BootstrapNGINXLinux
Applications we build

The systems companies ask us for most

Every one of these started life as a spreadsheet that stopped coping.

Job and workflow tracking

Work arrives, gets assigned, moves through stages, gets completed and gets invoiced. The system enforces the sequence, records the history, shows management where things are stuck and stops anything falling between two people.

Customer and member portals

A secure area where clients or members log in to see their own information, submit requests, download documents and track progress. These typically pay for themselves by removing a large volume of routine telephone calls.

Booking and scheduling systems

Availability, resources, staff, rooms, equipment and the awkward rules that come with them. Preventing double bookings correctly is harder than it looks and it is where generic products usually fail.

Inventory and asset systems

What you have, where it is, who has it, what condition it is in and when it needs attention. Includes movement history, stock levels, alerts and reconciliation against physical counts.

Application and approval systems

Forms submitted by staff, customers or the public, then routed through review stages with comments, decisions and notifications. Common in education, membership organisations and regulated environments.

Management dashboards

Consolidated views drawing from the operational data your systems already hold, showing the handful of numbers that actually drive decisions rather than every metric that happens to be available.

Web application questions

Often, yes, and we will say so. If an established product covers most of your needs at a fraction of the cost, that is usually the right choice and we would rather help you configure it properly. Building makes sense when your process is genuinely unusual, when existing products force expensive workarounds, or when the software is part of what makes your business competitive.

Almost always. Migration is its own small project, because real spreadsheets contain duplicates, inconsistent spellings, dates in three formats and notes written in the wrong column. We run the import repeatedly against copies, report what could not be matched and agree how to handle it before anything touches the live system.

Far more than most businesses need, provided the architecture is right. Our own platform handles more than a million page views a month on ordinary infrastructure. What limits an application is rarely raw traffic, it is usually a handful of inefficient queries and the absence of caching, both of which are design decisions rather than hardware problems.

Yes. Applications are built responsively so the common tasks work properly on a phone. Where a large part of the work genuinely happens away from a desk, especially with poor signal or a need for the camera, we will discuss whether a native mobile application would serve those users better than a browser.

Changes are expected and the system is built to accommodate them. Most clients keep a monthly arrangement covering maintenance plus an allowance of development time, which means small improvements happen continuously rather than accumulating into an expensive project every few years.

Describe the spreadsheet you want to retire

Tell us what it holds, who edits it and what goes wrong. That is usually enough for us to outline a realistic scope and a staged cost.