Showing posts with label UI. Show all posts
Showing posts with label UI. Show all posts

Realworld AI Coding Agent Exercise

Mike's Notes

An open-source version of Virtuoso will be installed in the data centre to explore possibilities. Kingsley Uyi Idehen's articles are all fascinating. I first came across him via the Ontology Forum.

The original post on LinkedIn has more links.

Resources

References

  • Reference

Repository

  • Home > Ajabbi Research > Library >
  • Home > Handbook > 

Last Updated

08/04/2026

Realworld AI Coding Agent Exercise

By: Kingsley Uyi Idehen
LinkedIn: 07/02/2026

Founder & CEO at OpenLink Software | Driving GenAI-Based AI Agents | Harmonising Disparate Data Spaces (Databases, Knowledge Bases/Graphs, and File System Documents).

This post explains how I used Claude Code (Pro level, powered by Opus 4.5) and Mistral Vibe (whenever Claude Code rate limits kicked in) to modernize the aesthetics of our uniquely powerful faceted search and browsing interface for knowledge graph exploration—essentially giving the UI around the core engine a facelift.

At OpenLink Software, we strongly believe that LLM-powered AI Agents are exactly the right tools for tackling this long-standing challenge—provided the RDF-based knowledge graph runs on a platform that isn’t constrained by dataset size. In other words, one that scales naturally in linear fashion—such as our Virtuoso multi-model platform for managing data spaces spanning databases, knowledge bases, filesystems, and APIs.

Situation Analysis

As with many aspects of RDF (Resource Description Framework), challenges in tooling creation often stem from general misunderstandings about the framework itself. RDF-based knowledge graph representation is one such area, and linear visualization is another.

In the case of linear visualization, the goal is to present the description of an entity of interest (the subject) along with its associated attributes—i.e., predicate–object pairings that express attribute names and values.

Compounding the difficulty is the fact that, although faceted search UI/UX patterns have long served as the conceptual foundation, implementing them at the scale typical of RDF-based knowledge graphs remains extremely challenging. This challenge is further amplified by the complexity of delivering such interfaces in HTML leveraging CSS and JavaScript.

Virtuoso's Faceted Search & Browsing System Workings

Fundamentally, this system allows you to perform text search, attribute-name lookup, or entity-identifier–based exploration across one or more knowledge graphs hosted in a Virtuoso instance. It provides a property-sheet–style interface that presents entities (subjects) alongside their associated attributes (relationship predicates) and values (objects).

Thanks to Linked Data principles, hyperlink-based denotation of entities, attributes, and values (optionally) creates a Web of data. This enables the same “click and explore” experience—also known as the follow-your-nose exploration pattern—that users enjoy when interacting with web pages through a browser.

Old System

Here are screenshots depicting the UI/UX for a simple search sequence along the following lines:

  • Text Search Input: Virtuoso.

  • Initial matches presented in a list, sorted by text score and entity rank (think: page rank for data).

  • Add filters by attributes such as "type" (rdf:type) and "name" (schema:name) where the name value is "Virtuoso".

  • Click on item from the result to obtain a description of Virtuoso via the entity description property sheet based page.

New System

Original resource: New Virtuoso Faceted Browser Showcase Screencast

Here's the same demonstration sequence, but experienced via the revamped UI/UX.

  • Text Search Input: Virtuoso.

  • Initial matches presented in a list, sorted by text score and entity rank (think: page rank for data).

  • Add filters by attributes such as "type" (rdf:type) and "name" (schema:name) where the name value is "Virtuoso".

  • Click on item from the result to obtain a description of Virtuoso via the entity description property sheet based page.

Additional Notable Faceted Search & Browsing Features

These include the following:

  1. Handling the fact that lots of attributes (thousands+) could be associated with an entity sources for a massive collection of source knowledge graphs during the filtering stage via a sticky scrollable paging control
  2. Handling the fact that a select entity description can also comprise lots of attributes (thousands+) via a stickly scrollable paging control
  3. Spreadsheet-like table (with resizable, moveable, and sort enabling columns) for handling query results from filtering or when presenting entity descriptions
  4. Ability to export the description of an entity in a variety of formats (JSON-LD, RDF-Turtle, RDF-XML, N-Triples, RDF/JSON, CSV, etc)
  5. Permalinking for sharing interaction state e.g., a filter page or entity description page
  6. Ability to reveal underling SPARQL query that drives filtering
  7. Metadata that provides information on source named graph(s) from which attributes and values have been sourced for an entity description by way of entity (subject) or value (object) role in the source graph triples
  8. Metadata that automatically identifies explicit (via owl:sameAs attribute values) coreferences (via values of attributes that are uniquely identifying i.e., inverse-functional e.g., email addresses or any other attribute with the inverse-functional designation in a loaded ontology)
  9. Settings for enabling or disabling reasoning and inference informed by built-in or custom inference rules

The Refactoring Process

I achieved this very difficult refactoring task, alongside my other daily duties, by prompting Claude Code and Mistral. Claude Code (using the Opus 4.5 model) handled most of the heavy refactoring and planning work through the initial working ports.

I brought Mistral on board once rate limits kicked in, which became an important part of the experiment—namely, determining what’s possible with the Pro edition of Claude Code.

That said, Mistral also impressed me to the point where I see it as the closest rival to Claude Code in the battle for coding agent market dominance. Its CLI aesthetics and assistance mode are top-notch.

Live Demonstration Instances

URIBurner

This is a live Virtuoso instance since 2008 functioning as a Linked Data utility showcase and bridge to the massive Linked Open Data Cloud Knowledge Graph collective.

  1. Text Search: Virtuoso
  2. Entity Types associated with text pattern: Virtuoso
  3. Attribute Filtering on Type, Name, and Value: Virtuoso Universal Server (Row Store & Cluster Server Edition)
  4. Selected Entity Description Page

Conclusion

Software development is evolving before our eyes. True power now comes from pairing capable AI Agents with human expertise—letting judgment guide automation, producing dependable outcomes, and delivering real-world value. The age of AI isn’t just about smarter tools; it’s about amplifying what humans do best.

Why So Many Info Tips Are Bad (and How to Make Them Better)

Mike's Notes

Another excellent article from Kate Kaplan that I can use to configure the CMS Engine (cms).

Resources

References

  • Reference

Repository

  • Home > Ajabbi Research > Library > Subscriptions > The NN/g Newsletter
  • Home > Handbook > 

Last Updated

23/03/2026

Why So Many Info Tips Are Bad (and How to Make Them Better)

By: Kate Kaplan
The NN/g Newsletter: 23/01/2026

Kate Kaplan specializes in applying human-centered design and research practices to enterprise UX challenges. With over 15 years in UX, Kate has extensive experience in both conducting research and helping teams understand and apply user insights to overall business strategy.

Summary:

Information tips can clarify complex UIs, but they should not hide essential information, trigger redundant information, or disrupt the current workflow.

Information tips — those helpful little messages triggered by tapping or hovering over a question mark (?) or info (i) icon — can help users make faster decisions and increase the understandability of UI elements. But in practice, they’re often overused, misapplied, or bloated with unnecessary content. When info tips hide essential instructions or bury users in redundant explanations, they create confusion rather than clarity.

In This Article:

  • What Is an Info Tip?
  • Representing Info Tips in User Interfaces
  • The Problem with Info Tips
  • Pitfalls of Bad Info Tips
  • Pitfall #2: Hiding Critical, Task-Assistive Information
  • Pitfall #3: Interrupting the Task Flow

What Is an Info Tip?

An information (info) tip is a brief, contextual message designed to offer supplemental information about a specific interface element or step in a workflow.

It’s typically activated by hovering over or clicking on a small icon — often a lowercase i or a question mark — and is attached to a specific element within the interface (e.g., a text field, icon, button, label).

✅ An example of a useful info tip from the Ease Employment Benefits Portal: Clicking on the ? icon reveals a concise explanation about why specific data is collected and how it’s used.

Info tips can be revealed through two primary patterns:

  • Tooltips, which appear on mouse- or keyboard-hover gestures within desktop sites
  • Popup tips, which are similar to tooltips, but are triggered by clicking or tapping an element’s associated icon

Both types serve the same core purpose: providing extra context to those who need additional clarification or guidance without overwhelming the interface with text.

Representing Info Tips in User Interfaces

The i Icon: General Information

The encircled lowercase i icon is broadly understood to indicate optional, helpful information.

In our icon-related research, participants interpreted the i icon primarily as representing an option for “more information” and expected it to reveal supplemental information such as:

  • Definitions
  • Additional details or brief explanations
  • Promotional terms

This makes the i icon a good fit for general information or nice-to-know guidance, but not urgent or error-related content. It is a solid choice for representing info tips that support user understanding without interrupting flow.

The ? Icon: Help and Support

The encircled question-mark icon (?) is also used frequently to trigger info tips. In our research, it was more strongly associated with help and support than with general supplemental information.

People expected this icon to lead to:

  • FAQs
  • Customer-support contact information
  • Help content or tutorials

However, when placed directly next to a specific interface element (such as the form field label in the example above) the ? icon is also an effective trigger for contextual help about a specific element. The key is proximity: When the icon is close to what it refers to, users interpret the help as local and relevant, rather than global or generic.

The Problem with Info Tips

Unfortunately, info tips are often abused as band aids in the interface, used to:

  • Cram in explanations that should’ve been designed into the UI
  • Hide critical instructions in the name of a “clean” interface
  • Offload poor labeling or UX copywriting onto the user

Info tips are not a catch-all solution for decluttering the interface by sweeping essential content into a hidden layer. Nor should they be used to bury large amounts of information that disrupt users’ flow when revealed — what we call the “jump scare” scenario, where a user expects a quick tip but gets an entire modal or screen takeover instead.

But info tips aren’t inherently bad. When well-implemented, they offer concise, helpful, and contextual information that improves usability without cluttering the interface.

Well-crafted info tips can:

  • Clarify jargon or technical terms
  • Explain why specific data is requested
  • Guide users to locate needed information
  • Reassure users about data usage

However, a good rule of thumb is to assume that most users will never see the info tip. Those who do have extra motivation for seeking them out are confused, stuck, or need clarification or reassurance. That’s why info tips should deliver clear, in-the-moment guidance that directly supports the user's immediate task.

Pitfalls of Bad Info Tips

Info-tip misuse generally falls into three categories:

  • Wasting users’ time: Displaying obvious, redundant, or irrelevant information
  • Hiding critical information: Burying essential guidance or constraints most users will need upfront
  • Interrupting the task flow: Using intrusive patterns such as modals or overlays that take users away from the task at hand

Pitfall #1: Wasting Users’ Time

Every info-tip interaction — even just that one small click or hover — incurs a small but real interaction cost. Redundant or obvious tips waste users’ time and undermine trust.

Don’t use info tips for:

  1. Marketing fluff
  2. Restating visible content or instructions
  3. Reexplaining the obvious

Info-tip icons like the i or ? signal to users that something might be unclear or needs elaboration. When they instead reveal generic marketing fluff, users can feel misled and frustrated.

❌ Doodle.com: The info tip displays marketing information (The quickest way for two people to meet) to further sell the Schedule 1:1s feature.

Info tips also waste time when they restate what’s already perfectly clear in the interface. These tips give the illusion that additional explanation exists, but deliver only repetition.

❌ State.gov: Clicking the i icon next to the City of Birth form field triggers the message: Enter the city of your birth. These tips simply repeat what's already on the screen, making users feel like there's more to learn when there isn’t.

❌ In this example, a ? icon next to Paper Type appears promising. Users might expect guidance on how to choose between options like Satin, Gloss, or Uncoated. Instead, it produces an obvious, unhelpful message: Choose your preferred paper type from the options below.

Pitfall #2: Hiding Critical, Task-Assistive Information

Info tips should not be used to bury essential instructions, constraints, or legal disclaimers. Doing so turns important guidance into a game of hide-and-seek and could even be a deceptive pattern in some cases.

Avoid putting in info tips:

  • Constraints or rules
  • Form-field limitations (e.g., character limits)
  • Legal agreements or disclaimers
  • Complex instructions or explanations

Complex instructions that help users make decisions should be visible, not hidden in a tip. People need to reference these explanations while completing tasks, not break their flow or current view to search for guidance.

❌ U.S. Find a Grave Index: These complex explanations for proceeding with a simple task are too overwhelming for an info tip. If a task truly requires this much upfront guidance, the information should be integrated directly into the interface, where it’s always visible and easy to reference.

Instead of hiding complex instructions in an info tip, it’s more effective to display key information at the primary level of the interface. When users must weigh multiple options or make nuanced choices, surfacing that guidance upfront enables quick comparison without disrupting task flow.

✅ Microsoft Test and Learn: The design provides clear, inline explanations for the various output types (Result Grid, Trend Chart, and Category Impact) without requiring multiple clicks or hovers to reveal. This approach helps users compare outputs and quickly make an informed decision without having to hunt down hidden descriptions.

Additionally, any constraints, rules, or limitations for inputs should be displayed on the primary level.

❌ USPS.com: The form field hides character constraints within an info tip. This information should be displayed on the primary level. If the form fails due to unseen constraints, users are left frustrated and rework is required.

Pitfall #3: Interrupting the Task Flow

People expect clicking an information icon to reveal brief, helpful messages that they can reference in the context of their current workflow — not modal windows or full-page takeovers of walls of text.

Don’t surprise users with:

  • Overly complex, verbose content
  • Modals or overlays that block their task
  • New pages that take them away from the workflow

When possible, ensure that info tips are displayed inline or adjacent to the relevant element. Obscuring the current step or view of the interface makes it harder for users to connect the guidance with the task at hand.

❌ CapitalOne mobile site: Clicking the i icon next to About payment options replaces the current view with several explanations of the different amount options. While the information is useful, the pattern disconnects users from the content they need to reference while comparing options.

Modals and full-page overlays are jarring when used for info tips. Keeping the guidance adjacent to the element it supports allows users to maintain context and better understand the relevance of the information.

❌ GSA.gov (1 of 2): Users are likely to expect that clicking the i icon next to First & Last Day of Travel will reveal a brief definition of the term as defined in the travel policy.

❌ GSA.gov (2 of 2): Instead, clicking the icon triggers a darkened overlay that obscures the workflow and a surprising modal dialog at the top of the page.

Even more disruptive is launching an entirely new page from what appears to be a simple info-tip icon. This approach not only obscures the context but also forces users to abandon their task.

❌ Nextdoor.com (1 of 2): The site displays a ? icon next to the Sign-in code field label. Users are likely to expect that clicking the icon will display a brief description of what a signin code is or where to find it.

❌ Nextdoor.com (2 of 2): Instead, clicking the ? icon next to the Sign-in code field launches a new page containing a full explanation of two-step verification. The information about where to find the signin code is buried within the verbose content.

Conclusion: Use Info Tips Wisely

Info tips can enhance clarity when they offer just-in-time, supplemental guidance within the context of the current workflow.

Do:

  • Use info tips for supplemental content
  • Keep them short, contextual, and easy to dismiss
  • Represent them with familiar icons (i or ?)
  • Assume users who activate them need quick, in-the-moment guidance

Don’t:

  • Hide essential or frequently needed information
  • Use info tips as a crutch for poor labeling or dense layouts
  • Trigger popups or overlays that hijack the user’s focus or flow

When thoughtfully implemented, info tips reduce confusion and increase user confidence. But they should always serve the user’s goals, not the designer's desire to declutter at all costs.

Design in code, get praise

Mike's Notes

Using this method for the upcoming workspace testing. Design is done in Pipi, not Figma. IMO, Figma is over-hyped.

Resources

References

  • Reference

Repository

  • Home > Ajabbi Research > Library > Subscriptions > Adam Silver
  • Home > Handbook > 

Last Updated

12/03/2026

Design in code, get praise

By: Adam Silver
Adam Silver: 19/01/2026

Adam Silver is an interaction designer with over 15 years experience working on the web for a range of companies including Tesco, BBC, Just Eat, Financial Times, the Department for Work and Pensions and others.

He’s particularly interested in inclusive design and design systems and writes about this on his blog and popular design publications such as A List Apart. This isn’t his first book either: he previously wrote Maintainable CSS, a book about crafting maintainable UIs with CSS.

This week I demoed some flows I’d been redesigning to a room full of product managers and stakeholders.

The programme I’m on is huge. We’re redesigning a highly complex, enterprise-grade, case-working system.

There are many feature teams, each with their own product manager. I’ve been on the programme for 6 months now but it’s so big I’ve not met many of them.

The meeting was meant to present the before/after of the redesigns to show what it looks like to just use the simple and accessible patterns from the GOV.UK Design System and a few of my own, encouraging other feature teams to reuse them.

It did that.

But it also did something else, something I didn’t really expect:

Toward the end of the meeting, the conversation veered off.

There were comments and questions about the tool I'd used to create and demo the designs:

“I love the way this demos new concepts.”

“The prototype really helps you to understand the user journey”

“It’s been so helpful for our developers to show them how something actually works”

Most designers use Figma, but I had created an HTML prototype using the GOV.UK Prototype Kit.

Don’t get me wrong, Figma has its place but at the end of the day:

Figma can only produce pictures of software.

Not actual software.

Actual software is alive.

  • It moves
  • It adapts
  • It errors
  • It loads
  • It responds

Figma might be useful to design in.

But it’s not good to design “out”.

By that I mean:

When you present your designs with Figma, you’re not interacting with the product you’re designing.

You’re interacting with the software you used to design.

As a result:

  1. It’s slow and jarring. Your audience has to watch you stop, scroll, pan and zoom around Figma between each step.
  2. It may not do your design justice. Your audience is focused on you navigating Figma rather than experiencing your design.
  3. It may hide problems. You’ll probably jump between screens and miss important details - realistic data, micro interactions, transitions, loading states, error states and edge cases.

Designing in code and demoing in the browser forces you - or at least encourages you - to confront these things.

For my demo, instead of just sharing screens:

  1. I opened the browser and typed in the URL
  2. I signed into the case-working system
  3. I landed on the overview page which showed me my priority tasks
  4. I made the screen smaller to show two instances of the app side by side
  5. I clicked “Cases” in the primary menu to go to the case list
  6. I searched, filtered and sorted the list to find a particular case
  7. I filled out a complex multi-step form flow with conditional logic

In other words, I went through the entire end-to-end journey and interacted with the prototype just like real users would.

This allowed my audience of product managers to free up their mental energy and instead focus on understanding the design intention and potential gaps.

That’s 100x harder to do with Figma.

After the meeting, I received a lot of positive feedback which is great because I love praise.

One product manager actually suggested I help train some of the other designers on the programme who are less familiar with the Prototype Kit.

But she also pointed out that it would probably take up too much of my time.

Luckily, I’ve been preparing for this moment for 2 years. I told her:

I have a course that teaches designers how to use the GOV.UK Prototype Kit to unlock the many benefits of prototyping in code.

If you’d like to learn how to use the Prototype Kit and unlock those benefits — including a little unexpected praise when you present at your next show and tell:

​https://prototypekitcourse.com​

Cheers,

Adam

SIL KeyMan

Mike's Notes

Recently, I received an email from SIL KeyMan requesting donations to support their excellent, free, open-source, multilingual keyboards. They had lost a major donor whose circumstances had changed. This article is about what followed on from that message.

Where I stand

"Every child has the right to be educated in the language of their people and of their birth. This (issue) is dedicated to those working tirelessly to record, strengthen or revive human languages." - The i18n Issue, Ajabbi Research.

Resources

References

  • Reference

Repository

  • Home > Ajabbi Research > Library > Subscriptions > KeyMan Newsletter
  • Home > Handbook > 

Last Updated

30/03/2026

SIL KeyMan

By: Mike Peters
On a Sandy Beach: 07/03/2026

Mike is the inventor and architect of Pipi and the founder of Ajabbi.

Background

I had long planned to use KeyMan with Pipi to enable people to use their choice of written language.

Tibetan Keyboard

After receiving an email from SIL Keyman requesting donations, I sent a message offering future donations from the yet-to-be-established Ajabbi Foundation. Ajabbi is a community-driven bootstrapping pre-revenue startup that solves some very big, expensive problems with Pipi. With no investors needed, the surplus income will go to a future foundation to support open-source, books, user groups, conferences, science, etc.

They replied via a developer in Australia who contacted me.

I then spent some time reading their blog, learning about their 30-year effort, watching a seminar, and looking at their GitHub repository. They are very humble and very impressive.

Thinking more about it, they need more developers in their team working on this important project for humanity.

Future long-term sponsorship priorities of open-source

  1. Support Ortus in providing free CommandBoxBoxLang, etc., and outsource all related remote development to them.
  2. Support SIL KeyMan to provide free KeyMan access and ensure they can meet demand, scale, and focus on supporting KeyMan rather than raising funds. Everyone has the right to use their own language.

Memberships

Another option could be for Ajabbi Research to join Unicode as a paid member and contribute.

Pipi Keyboard Engine (kyb)

A new Pipi engine will be created to handle keyboards.

Pipi 10 (2027-)

The Pipi 10 roadmap includes support for multiple languages and scripts across all workspace User Interface (UI) components. The hundreds of agent engines, their internal databases and namespaces already support this.

One of the primary tools will be to embed a language-specific keyboard using KeyMan Engine for Web in the HTML of the workspace UI for individual users. This will be available to all users using a simple profile form.

Code Example


<script src='https://s.keyman.com/kmw/engine/18.0.246/keymanweb.js'></script>
<script src='https://s.keyman.com/kmw/engine/18.0.246/kmwuitoggle.js'></script>
<script>
  (function() {
    keyman.init({attachType:'auto'});
    keyman.addKeyboards('@en'); // Loads default English keyboard from Keyman Cloud (CDN)
    keyman.addKeyboards('@th'); // Loads default Thai keyboard from Keyman Cloud (CDN)
  })();
</script>

KeyMan currently supports 1550 keyboards and 2650 languages. It uses CLDR/LDML to configure the keyboards. This is wonderful news and will make it very easy to integrate with Pipi 10.

There is a great Cloud Services API which will assist automation.

Translation

The keyboards will assist volunteers in entering user input to translate the Pipi User Interface into many languages, much like OpenOffice and Wikipedia/MediaWiki.

Codes

Since Pipi 6 (2017-2019), standard codes have been used internally to make internationalisation possible for potentially every language.

ISO 639-3

ISO 639 gives comprehensive provisions for the identification and assignment of language identifiers to individual languages, and for the creation of new language code elements or for the modification of existing ones (Terms of Reference of the ISO639/MA). - ISO 639-3

*** 

It defines three-letter codes for identifying languages. The standard was published by the International Organisation for Standardisation (ISO) on 1 February 2007. As of 2023, this edition of the standard has been officially withdrawn and replaced by ISO 639:2023.

ISO 639-3 extends the ISO 639-2 alpha-3 codes with an aim to cover all known natural languages. The extended language coverage was based primarily on the language codes used in the Ethnologue (volumes 10–14) published by SIL International, which is now the registration authority for ISO 639-3.[2] It provides an enumeration of languages as complete as possible, including living and extinct, ancient and constructed, major and minor, written and unwritten. However, it does not include reconstructed languages such as Proto-Indo-European.

ISO 639-3 is intended for use as metadata codes in a wide range of applications. It is widely used in computer and information systems, such as the Internet, in which many languages need to be supported. In archives and other information storage, it is used in cataloging systems, indicating what language a resource is in or about. The codes are also frequently used in the linguistic literature and elsewhere to compensate for the fact that language names may be obscure or ambiguous. Wikipedia

Examples

  • Eng (English
  • Fra (French)

ISO_3166-1_alpha-3

ISO 3166-1 alpha-3 codes are three-letter country codes defined in ISO 3166-1, part of the ISO 3166 standard published by the International Organization for Standardization (ISO), to represent countries, dependent territories, and special areas of geographical interest. They allow a better visual association between the codes and the country names than the two-letter alpha-2 codes (the third set of codes is numeric and hence offers no visual association). They were first included as part of the ISO 3166 standard in its first edition in 1974. - Wikipedia

 Examples

  • ABW  (Aruba)
  • AFG  (Afghanistan)
  • AGO  (Angola)

Unicode

Unicode (also known as The Unicode Standard and TUS) is a character encoding standard maintained by the Unicode Consortium designed to support the use of text in all of the world's writing systems that can be digitized. Version 17.0[A] defines 159,801 characters and 172 scripts used in various ordinary, literary, academic and technical contexts. - Wikipedia

Examples

  • Latn (Latin)
  • Lina (Linear B)
  • Hebr (Hebrew)

CLDR/LDML

The Common Locale Data Repository (CLDR) is a project of the Unicode Consortium to provide locale data in XML format for use in computer applications. CLDR contains locale-specific information that an operating system will typically provide to applications. CLDR is written in the Locale Data Markup Language (LDML). - Wikipedia

Example

 <?xml version="1.0" encoding="UTF-8" ?>
<ldml>
  
    <version number="1.1">ldml version 1.1</version>
    <generation date="2024-03-06"/>
    <language type="en"/>
    <territory type="US"/>
  
  <!-- other locale data sections follow -->
</ldml>

Localisation (L10N)

Language localisation (or language localisation) is the process of adapting a product's translation to a specific country or region. It is the second phase of a larger process of product translation and cultural adaptation (for specific countries, regions, cultures or groups) to account for differences in distinct markets, a process known as internationalisation and localisation. - Wikipedia

***

Pipi internally automatically stores and uses 3-letter language codes, 4-letter Unicode and 3-letter country codes to define Locales. Other code formats are also stored to enable interoperability. Many languages can be written in several scripts.

Examples

  • eng-Latn-NZD (New Zealand English)
  • eng-Latn-USA (United States English)

Customers can configure the options for their own websites.

Examples

  • en-NZ
  • en-uk

How Intel Gave Stephen Hawking a Voice

Mike's Notes

I hope that Pipi CMS can provide an AAC (picture language) interface as one of its accessibility options.

…we have a moral duty to remove the barriers to participation, and to invest sufficient funding and expertise to unlock the vast potential of people with disabilities. - Stephen Hawking

Resources

References

  • Reference

Repository

  • Home > Ajabbi Research > Library > Subject > Accessibility
  • Home > Handbook > 

Last Updated

05/02/2026

How Intel Gave Stephen Hawking a Voice

By: João Medeiros
Wired: 13/01/2015

João Medeiros is Features Director for Wired magazine. He was born in Portugal, and came to the UK at eighteen. He has a PhD in theoretical physics at Imperial College. He has written widely for publications including The Economist, GQ and Nature.

Stephen Hawking first met Gordon Moore, the cofounder of Intel, at a conference in 1997. Moore noticed that Hawking’s computer, which he used to communicate, had an AMD processor and asked him if he preferred instead a “real computer” with an Intel micro-processor. Intel has been providing Hawking with customized PCs and technical support since then, replacing his computer every two years.

Stephen Hawking

Wired January 2015, Relates to special feature on Stephen Hawking, Hawking sits in his personalised special electric wheelchair, text in foreground from him screenMarco Grob/WIRED UK

Interview

There is a 17-minute interview behind the paywall.


Other Notes

The "Equalizer" is a 1980s computer program developed by Words Plus CEO Walter Woltosz to help his mother-in-law, who had ALS. It enabled Professor Stephen Hawking to communicate by selecting letters, words, and phrases on an Apple II computer via a hand switch, later upgraded to a cheek-switch sensor. 

Key Details of the Equalizer:

  • Purpose: Developed to assist patients with ALS who lost the ability to speak and write.
  • Usage: Hawking utilized this software, later integrated onto his wheelchair, to produce up to 15 words per minute.
  • Operation: The user interface allowed for selecting words from a database or spelling them out, which were then converted to speech using a Speech Plus CallText 5010 synthesizer.
  • Development: Walter Woltosz co-founded Words Plus in 1981 and created the software to provide a voice for those with communication disabilities. 

Stephen Hawking and the Technology that allowed him to continue his research18/03/2018

Stephen Hawking, who sought to explain the origins of the universe, the mysteries of black holes and the prospect of time travel, died today aged 76. Hawkings body was ravaged by the wasting motor neurone disease (ALS) he developed age 21 and spent most of his life confined to his wheelchair.

Hawking’s incredible mind probed the very limits of human understanding both in the vastness of space and in the sub-molecular world of quantum theory, which he claimed could predict what happens at the beginning and end of time.

In his 2013 memoir “My Brief History” he explained how at first he “felt it was very unfair” and often questioned “why should this happen to me.” With time and technology, he went from concern that his life was over and his potential never realised to now, 50 years later, feeling quietly satisfied with his life and achievements.

How Intel gave Hawking his voice.

In 1986, aged 44, Hawking lost his voice to save his life after an attack of pneumonia. For a while, he used a spelling card to communicate, patiently indicating letters and forming words by raising his eyebrows. Although this gave Hawkings the ability to communicate the process was slow. From then on, he spoke through a computer synthesiser on the arm of his wheelchair.

A chance encounter with Gordon Moore, the co-founder of Intel, at a conference in 1997 led to a relationship that would see Intel providing Hawking with customised PCs and technical support, replacing his computer every 2 years.

Martin King, a physicist who had been working with Hawking on a new communication system, contacted a California-based company called Words Plus, whose computer program Equalizer allowed the user to select words and commands on a computer using a hand clicker. Words Plus CEO Walter Woltosz had created a earlier version of the speech equalizer to her help his mother-in-law who also suffered from ALS.

Equalizer first ran on an Apple II computer linked to a speech synthesizer made by a company called Speech Plus. This system was then adapted by David Mason, the engineer husband of one of Hawking’s nurses, to a portable system that could be mounted on one of the arms of a wheelchair. With this new system, Hawking was able to communicate at a rate of 15 words per minute.

However, the nerve that allowed him to move his thumbs kept degrading. By 2008, Hawking’s hand was too weak to use the clicker. His graduate assistant at the time then devised a switching device called the “cheek switch.” Attached to his glasses, it could detect, via a low infrared beam, when Hawking tensed his cheek muscle. Since then, Hawking has achieved the feat of writing emails, browsing the internet, writing books and speaking using only one muscle. Although this system worked it was still slow… enter SwiftKey. With SwiftKey integrated, the system could learn from Hawking and predict the characters and words he planned to type next based on historical patterns, with this data funnelled through to his speech synthesiser. SwiftKey has also tapped Hawking’s historical works to help it more accurately predict his next words in this bespoke version of the software.

The technology that enabled Stephen Hawking to speak.

As you might expect, it is not just one piece of equipment that is involved here. Many technologies combined to allow Hawking to communicate.

  • Lenovo Yoga 260 provided by Lenovo and Intel, Intel® Core™ i7-6600U CPU
  • 512GB Solid-State Drive
  • Windows 10
  • ACAT interface software provided by Intel

Speech Synthesisers (3 copies):

  • Manufacturer – Speech Plus (Incorporated 1988, Mountain View, CA)
  • Model – CallText 5010
  • Speaker and amplifier provided by Sound Research
  • Permobil F3 wheelchair provided by Permobil

It is undoubtedly the incredible technology that enabled Hawking to speak again that gave him the hope and drive to continue with his work. Hawking was an Ambassador of Science and showed us what determination looks like.

What happened to Stephen Hawking?

Stephen Hawking died on March 14, 2018, aged 76. In itself, an incredible achievement, but Stephen did much more than simply survive for 76 years. His life was an inspiration to so many people. Interestingly, he didn’t believe in God or the afterlife. He called heaven “a fairy story.”

In his final, posthumous book “Brief Answers to the Big Questions.” he wrote “there is no God”. and “no one directs the universe.” He had disputed the existence of God for many years before his death.

he wrote, “The question is: Is the way the universe began chosen by God for reasons we can’t understand, or was it determined by a law of science? I believe the second,”

Hawking believed that “spontaneous creation” was the reason for existence, writing “it is not necessary to invoke God to light the blue touch paper and set the universe going.”

He will be remembered for many years.

21 Frontend System Design Concepts for Software Engineers

Mike's Notes

An excellent list of frontend system options.

Pipi generates a static frontend as a thin wrapper.

Resources

References

  • Reference

Repository

  • Home > Ajabbi Research > Library > Subscriptions > System Design
  • Home > Handbook > 

Last Updated

28/12/2025

21 Frontend System Design Concepts for Software Engineers

By: Neo Kim & Shefali Jangid
System Design: 11/11/2025

Neo: I Teach You System Design

Shefali: I write about CSS, JavaScript, web dev resources, and solo projects.

If you’re coming from the backend, you probably think the frontend is just “HTML, CSS, maybe some JavaScript.” But honestly? Modern frontend engineering has grown into something much closer to backend system design.

Just like your APIs need to be fast, scalable, and reliable, frontend apps also have to handle millions of users, load content quickly, and stay observable and secure.

This newsletter is a quick introduction to frontend system design.

We’ll take concepts you already know from the backend, like caching, deployment pipelines, observability, and security, and see how they apply in the browser.

By the end, you’ll see that the frontend isn’t just about buttons and forms. It’s about building systems that run right in the user’s browser.

Onward.

I want to introduce Shefali Jangid as a guest author.

She’s a web developer, technical writer, and content creator with a love for frontend architecture and building things that scale.

Check out her work and socials:

  • Shefali.dev
  • GitHub
  • Twitter

You’ll often find her writing about web development, sharing UI tips, and building tools that make developers’ lives easier.

Rendering & Delivery Models

One of the first things to understand is how webpages reach your users.

The way you build and load them affects how fast, reliable, and smooth your site feels. You can pre-build pages, render them on the server, build them in the browser, or mix these approaches.

Building web pages works much like a server handles API responses. The trade-offs change depending on when and where the HTML gets generated.

Let’s start with pre-built pages and move to fully dynamic ones. We’ll see how each affects speed, scalability, and content freshness.

1 Static Site Generation (SSG)

Before SSG, websites worked in two fundamental ways. The server either built the page for every request, or the browser built it on the client side. That means:

  • Every request needed work to generate the page.
  • Pages could get slow if many people visit at once.
  • Caching was tricky, so scaling was hard.

SSG solves this by pre-building the HTML when you deploy your site. The system can fetch data during the build process, even for pages with dynamic content, which means all content is baked into static HTML files before any user visits them.

During the build process, the framework executes data-fetching code, queries your database, and generates complete HTML files for each route. The framework then uploads them to your CDN or hosting provider.

When users request a page, they receive a fully formed HTML document immediately, without waiting for server-side processing or client-side data fetching.

This makes SSG super fast for users because there’s no rendering delay. The trade-off is that if your content changes, you’ll need to rebuild and redeploy to update the static files, which is why SSG works best for content that doesn’t change frequently.

It’s like preparing API responses in advance; the hard work is done before anyone asks.

Why it matters:

  • Pages load super fast.
  • Easy to handle millions of users.
  • SEO is better because pages get fully rendered from the start.

Use case:

Documentation sites, marketing landing pages, or personal blogs where content updates happen through deployments, not user actions.

2 Incremental Static Regeneration (ISR)

Static Site Generation (SSG) is fast, but what if your content changes frequently? Rebuilding the whole site every time would be a pain.

That’s where Incremental Static Regeneration (ISR) comes in.

Pages are still pre-built, but they can update automatically without a full redeploy.

You just set a revalidation time; after that period, the next visitor triggers a background rebuild of that specific page on the server, not a full deployment. The old version loads instantly, so users don’t wait. After regeneration, the new version replaces the cached one. This occurs per page, not site-wide, allowing you to set different revalidation intervals for individual pages.

It’s like cached API responses with an expiry timer; users might glimpse an older version until it’s refreshed, but the update happens quietly behind the scenes.

Why it matters:

  • Just as fast as SSG, but the content stays fresh.
  • Perfect for dynamic websites like blogs or e-commerce sites.
  • Works with CDNs, so updates happen without downtime.

Use case:

E-commerce product pages where most content (e.g., descriptions or images) is static, but some parts, like prices or stock info, update occasionally.

ISR keeps the page fresh without full redeploys, while real-time data, such as live prices, can come from APIs.

3 Server-Side Rendering (SSR)

Server-Side Rendering (SSR) works the other way around: the server builds the page for each request. It fetches the data, generates the HTML, and sends it to the user.

Unlike Static Site Generation (SSG), which is great for mostly static pages, SSR is useful when content needs to stay fresh or personalised. For example, dashboards, user profiles, or live feeds. Because the system generates pages in real time, they always display the latest data instead of relying on pre-built files.

Think of it like a regular API endpoint; everything gets computed on demand.

Why it matters:

  • Keeps content fresh and easy to personalise.
  • Perfect for pages that need real-time data or personalised content.
Note: Under heavy traffic, SSR can slow down because it builds each page on demand, but caching can help balance load and speed.

Use case:

Social media feeds, admin dashboards, or user-specific pages where content varies by session.

4 Client-Side Rendering (CSR)

CSR means the browser does most of the work instead of the server. The server sends only a basic HTML page and some JavaScript. The browser then loads the data and builds the page on the fly.

This approach is useful when you need rich interactivity, real-time updates, or pages that change often based on user actions - things that static or server-rendered pages can’t handle easily.

Think of it like sending raw JSON and letting the client put it together.

Note: The first page load can be slower because the browser needs to download and run JavaScript before showing the content. Since pages get built in the browser, search engines might not see them immediately, so you might need extra setup like pre-rendering or server-side rendering for better SEO.

Why it matters:

  • Reduces pressure on the server.
  • Makes the app more interactive and responsive.
  • Works best for apps people use for a long time, like dashboards or editors.

Use case:

Complex apps like Figma, Notion, or Google Docs, where the app is highly interactive and users stay on the page for extended sessions.

5 Hybrid Rendering

Sometimes, one approach just isn’t enough.

Different parts of your app might have different needs. For example, some pages stay mostly the same, while others need fresh or personalised data. That’s where hybrid rendering comes in.

It mixes different strategies:

  • Server-side rendering (SSR) for pages that need live or personalised content,
  • Static site generation (SSG) for pages that rarely change,
  • And client-side rendering (CSR) for sections with lots of interactivity.

Think of it like combining pre-computed API responses with on-demand endpoints - all in the same system.

Why it matters:

  • You get the best of everything: speed, fresh content, and interactivity.
  • Allows you to choose the right approach for each page or component.
  • Reduces overloading the server while keeping content dynamic where needed.

Use case:

Large-scale apps like e-commerce platforms often combine different rendering strategies:

  • The homepage and category pages use static generation for speed.
  • Product pages use incremental static regeneration to keep content fresh.
  • User account pages use server-side rendering for personalised data.
  • The shopping cart uses client-side rendering for real-time updates without page reloads.

6 Content Delivery Networks (CDNs) & Edge Delivery

No matter which rendering method you choose, serving content efficiently is super important. CDNs keep copies of your static files on servers worldwide. This lets users download them from a nearby location instead of your main server.

This is especially useful for global audiences. For example, when someone in India visits a site hosted in the US, the CDN delivers the content from a local server, making it load much faster.

Edge rendering takes this idea a step further. Instead of just serving static files, it can actually run code or build pages at the edge, closer to the user, which reduces latency even more.

Think of it like having caches and compute nodes near your users, so requests go to a nearby server instead of your main database.

Why it matters:

  • Faster load times everywhere.
  • Easy to scale to millions of users.
  • Works perfectly with SSG, ISR, SSR, or hybrid setups.

Use case:

Any globally distributed application. Media sites like The New York Times use CDNs to serve articles instantly worldwide.

Performance & Optimisation

Now that you understand how your pages get rendered, the next obvious question is, “How quickly do they actually load?”

Even the most beautiful app can be frustrating if it takes too long to open or lags while being used. In frontend system design, speed really matters.

Let’s dive in!

7 Web Performance Metrics

To really understand your app’s speed, there are a few key metrics you should watch closely:

  • TTFB (Time to First Byte): The time it takes for your browser to get the first piece of data back from the server or CDN after making a request.
  • FCP (First Contentful Paint): The moment when something first appears on the screen, like text, an image, or a button, so the user knows the page is loading.
  • LCP (Largest Contentful Paint): The time it takes for the main part of the page, like a large image or headline, to fully appear on the screen.
  • CLS (Cumulative Layout Shift): It measures how much the page layout jumps around while loading, like when text or buttons suddenly shift because images or ads are still loading.

These are basically the frontend versions of response time, throughput, and latency in backend systems. It’s important to keep a close eye on them; users can notice even minor delays of a few hundred milliseconds.

Why it matters:

  • You can spot slow pages before users even notice.
  • Improves engagement and reduces bounce rates.
  • Helps guide your optimisations for a smoother experience.

Use case:

E-commerce sites must optimise for LCP (product images) and CLS (avoid layout shifts during checkout). News sites focus on FCP to show headlines quickly.

8 Lazy Loading

Of course, fast pages aren’t just about metrics; they’re also about smart resource management.

Not everything on a page needs to load immediately. Lazy loading means loading heavy assets, like images, videos, or big components, only when they’re actually needed.

This works by using techniques like the Intersection Observer API or conditional imports, which tell the browser to fetch those resources only when they come into view or are triggered by user interaction.

It’s like fetching extra data from an API only when the user asks for it.

Why it matters:

  • Cuts down the initial load time.
  • Makes the pages feel faster and smoother.
  • Saves bandwidth for users who don’t need everything immediately.

Use case:

Image-heavy sites like Pinterest or Instagram use lazy loading extensively; images below the fold don’t load until you scroll.

9 Service Workers & Caching

Once you’ve optimised loading, you can make your app faster and more reliable using service workers and caching.

Service workers are background scripts that run in a separate thread from your main web page. They can intercept network requests and cache important files or data, helping your app load faster and even work offline.

Think of them as a smart middle layer between the browser and the network; if something is already cached, it’s served instantly instead of being fetched again.

Why it matters:

  • Speeds up repeat visits.
  • Reduces the load on servers.
  • Keeps apps usable even with poor or no internet connection.

Use case:

Progressive Web Apps like Twitter Lite or Starbucks PWA, which cache core UI and recent content, so users can browse even on unstable mobile networks.

Data & State Management

Once your UI loads quickly, the next step is to think about the data behind it.

In real apps, this data (also called state) can come from different places:

  • Some live inside a single component (a reusable piece of the UI, like a button),
  • Some are shared across the app,
  • And others come from APIs.

How you manage this state can make or break your app’s speed, reliability, and scalability.

10 State Management (Local, Global, Server Cache)

  • Local state: data that lives inside a single component, used for things like toggles, forms, or small interactions. It’s simple to manage and doesn’t add much complexity.
  • Global state: data that’s shared across multiple components or pages, like user info or theme settings. Tools like Redux, Zustand, or React Context help manage it.
  • Server cache: stores frequently used API data on the client so the app doesn’t have to fetch it again and again, making it faster and reducing server load.

Think of it like database caching: by deciding where data should live, you can make your app more responsive, reliable, and easier to scale.

Why it matters:

  • Keeps your app responsive.
  • Reduces unnecessary API calls.
  • Makes scaling smoother as your app grows.

Use case:

Local state for a modal’s open/closed status. Global state for theme preference (dark mode) that affects every component. Server-side cache for user profile data displayed by multiple components.

11 API Caching with Expiration

Caching doesn’t stop at the component level. You can store API responses in memory, IndexedDB (a browser database for larger data), or localStorage (for smaller key-value data), and set expiration rules to make sure data stays fresh.

It’s like having a Redis cache server, but right in the browser instead of on your server.

Why it matters:

  • Keeps data up-to-date for users.
  • Reduces repeated server requests.
  • Makes your app feel faster.

Use case:

A news app might cache articles for a few minutes so users can read offline, while comments refresh more often to stay up to date. Similarly, a SaaS dashboard could cache chart data while the user is on the page, then refresh it when they come back later.

12 GraphQL vs REST (Reducing Over/Under-Fetching)

How you fetch data also affects performance.

  • REST: Can sometimes send too much data or not enough, making your app fetch extra information or require additional requests.
  • GraphQL: A query language for APIs that lets the client ask for exactly the data it needs, avoiding extra or missing information. This avoids over-fetching or under-fetching data and helps reduce unnecessary requests.

It’s like how you optimise database queries on the backend to make them faster and use less bandwidth, but this happens on the frontend.

GraphQL sits between the client and the server as one endpoint. The client asks for exactly the data it needs, and the server’s GraphQL layer collects that data from databases or other APIs, then sends back a clean, organised response.

This way, you make one flexible request instead of several REST calls, making it faster and more data-efficient.

Why it matters:

  • Saves bandwidth, especially on mobile networks.
  • Reduces unnecessary requests.
  • Simplifies client-side data handling.

Use case:

GraphQL works best for complex apps that need data from many places at once, like GitHub. One GraphQL query can get a pull request, comments, and author info in a single request instead of several REST calls. While REST is simpler and great for apps with stable data, like blogs or public APIs that rely on caching.

13 Pagination Strategies (Cursor vs Offset)

Loading large lists or tables all at once can be heavy. Pagination helps break the data into manageable chunks.

  • Offset pagination: Uses page numbers or record counts (like ?page=2 or ?offset=20) to fetch data. It’s simple and works well for lists that don’t change often. But the list order shifts if new items are added or old ones are removed. This can make the same offset return different items, leading to duplicates or missing entries.
  • Cursor pagination: Uses a pointer to mark where the last item ended, so the next request starts right after it. It’s more reliable for live or frequently updated data (social feeds or chat messages) because it keeps track of the exact position in the dataset. That means even if new items are added or removed while you’re scrolling, you won’t see duplicates or miss entries.

Why it matters:

  • Handles large datasets efficiently.
  • Prevents slowdowns and performance bottlenecks.
  • Keeps dynamic lists reliable and consistent.

Use case:

  • Offset pagination: best for data tables with stable data and clear page numbers, such as admin panels or product catalogs.
  • Cursor pagination: ideal for infinite scroll feeds like social media timelines, notification lists, or any real-time list where items are frequently added or removed.

14 Real-Time Data & Networking (WebSockets, SSE, Polling)

Finally, some apps need live updates, like chat apps, dashboards, or notifications. How you handle real-time data matters.

  • WebSockets: Let the client and server send messages to each other in real time, both ways, without constantly asking for updates.
  • Server-Sent Events (SSE): The server can push updates to the client in real time, but communication only goes one way, from server to client.
  • Polling: The client regularly asks the server for updates. It’s simple to set up, but it can put more load on the server.

It’s like building event-driven systems on the backend, but here it happens in the browser.

Why it matters:

  • Supports live dashboards, chat, and notifications.
  • Improves interactivity and user engagement.
  • Allows you to choose the right strategy for your app’s needs.

Use case:

  • WebSockets: chat apps (Slack), multiplayer games, collaborative editing (Google Docs).
  • SSE: live notifications, stock tickers, server logs streaming to a dashboard.
  • Polling: simple use cases like checking for new emails or status updates.

Architecture & Scalability

As your app grows, managing complexity becomes just as important as writing features. Frontend architecture isn’t just about code; it’s about building systems that are maintainable, scalable, and predictable.

15 Micro Frontends

When multiple teams work on the same app, things can get messy fast.

Micro frontends let each team build and deploy their part of the app separately. For example, one team handles the dashboard while another builds the settings page. Technically, the app is divided into smaller frontend projects that are combined at runtime to work as one seamless app.

A module federation feature (for example, in tools like Webpack) lets these separate projects share code (like components or utilities) directly in the browser, without rebuilding or duplicating code across projects.

Why it matters:

  • Teams can develop features faster and in parallel.
  • Reduces duplicated code across bundles.
  • Supports independent deployment cycles, so updates don’t block each other.

Use case:

Large enterprises with multiple teams working on different product areas. For example, big companies like Zalando, IKEA, DAZN, and Spotify use micro-frontends so each team can build and release their part of the app on their own.

16 Component-Based Architecture & Design Systems

Components are the building blocks of your app. A design system ensures these components stay consistent and reusable across teams and projects.

It’s like having reusable backend modules or libraries, but for your UI.

Why it matters:

  • Makes the UI predictable and easier to maintain.
  • Encourages code reuse across pages and projects.
  • Helps teams scale efficiently without creating chaos.

Use case:

  • Used by companies with many products or teams to keep design consistent, like Shopify’s Polaris or IBM’s Carbon, which are open-source design systems containing ready-to-use UI components, styles, and guidelines.
  • Even small startups benefit: a shared set of 10–20 components (like buttons and modals) helps teams build faster and keep the UI consistent.

17 Build & Deployment Pipelines (CI/CD for Frontend)

Frontend apps also benefit from CI/CD (Continuous Integration and Continuous Deployment) pipelines, just like backend services. These pipelines automatically handle steps like building the app, running tests, and deploying updates.

In simple terms, every time you push code, CI/CD tools check that nothing breaks and then safely release the latest version, making deployments faster, more reliable, and less manual.

Why it matters:

  • Minimises human errors during deployment.
  • Enables fast, reliable releases.
  • Makes scaling and frequent updates much smoother.

Use case:

Works for any app with regular updates, from small teams auto-deploying to Vercel to big companies like Netflix releasing thousands of times a day. It keeps updates fast, safe, and reliable.

User Experience & Reliability

Your users don’t care about your architectures or caching strategies; they just want the app to be fast, reliable, and easy to use.

18 Accessibility (a11y) & Mobile-First Design

Accessibility and mobile-first design aren’t just design principles; they’re system-level considerations. Accessibility ensures your app’s UI and code structure work for everyone, including people using assistive technologies.

Mobile-first design forces you to build efficient layouts, load lighter assets, and prioritize key features, all of which influence performance, scalability, and overall frontend architecture.

Why it matters:

  • Reaches more users.
  • Makes your app easier and more pleasant to use.
  • Ensures a consistent experience across devices.

Use case:

Government sites (accessibility is legally required in many countries), e-commerce, and content platforms. Mobile-first is essential for apps in developing markets where mobile is the main or only device.

19 Progressive Web Apps (PWAs) & Offline-First

Progressive Web Apps (PWAs) are web apps that behave like native apps. They can work offline, send notifications, and even be installed on a device.

They use a few key technologies:

  • Service workers run in the background to cache important files like HTML, CSS, and API responses.
  • A web app manifest defines how the app looks and behaves when installed.
  • And HTTPS keeps everything secure.

Together, these make the app fast, reliable, and installable.

Why it matters:

  • Users can access your app anywhere.
  • Reduces load on servers.
  • Improves reliability and user trust.

Use case:

Apps where offline access is valuable: Twitter Lite, Starbucks PWA, field service apps, and news apps.

20 Security Basics (XSS, CSRF, CSP, Authentication)

Speed means nothing without security. Frontend isn’t just about the UI; it’s also the first line of defence for your app.

  • XSS (Cross-Site Scripting): Stop attackers from injecting malicious scripts into your app.
  • CSRF (Cross-Site Request Forgery): Protect your forms and actions that change data from being triggered by attackers without the user’s consent.
  • CSP (Content Security Policy): A rule set that helps prevent malicious scripts from running in your app.
  • Authentication: Make sure user tokens and sessions are stored and handled securely in the browser.

Why it matters:

  • Protects your users and their data.
  • Prevents common attacks before they reach the backend.
  • Builds trust and helps with compliance.

Use case:

Any app handling sensitive data. Financial apps need strict CSP and token handling. Social platforms must prevent XSS to avoid account takeovers. E-commerce sites need CSRF protection on checkout to prevent unauthorised purchases.

21 Observability & Error Monitoring (Client-Side)

Even if everything works well, things can still break in production. That’s why observability is important.

Frontend errors are just like 500 errors in your backend; they happen. Monitoring tools like Sentry or LogRocket help you track:

  • JS exceptions: errors that happen in your JavaScript code while the app is running.
  • Performance bottlenecks: parts of your app that slow it down or make it lag.
  • User interactions leading to errors: actions by users that trigger bugs or crashes in your app.

These tools add a small script to your app. When something breaks, it collects information like the error message, what the user was doing, and browser details. Then it sends that data to the tool’s server, where you can see and fix the issue from your dashboard.

Why it matters:

  • Detects and resolves issues faster.
  • Keeps your app stable and performant.
  • Improves the overall user experience and trust.

Use case:

Used in production apps with real users. SaaS teams track errors right after deployment, e-commerce sites watch checkout issues, and session replay tools help support teams see what confused users without extra bug reports.

Conclusion

Frontend system design is basically backend system design, just happening in the user’s browser.

Every choice you make, like rendering method, caching strategy, state management, architecture, and security, affects speed, scalability, and reliability.

So next time you’re building a frontend, ask yourself:

  • Where should computation happen? On the server, in the client’s browser, or at the edge?
  • When does the data need to be up-to-date? Prebuilt, cached, or real-time?
  • How can we keep the app fast and reliable? Lazy loading, smart caching, or micro frontends?
  • How do we scale this? Can the architecture handle 10x traffic? 100x?
  • How do we maintain this? Will new developers understand the architecture? Can teams work independently?

Think of your frontend as a distributed system. Treat it that way, and your users will get an app that’s fast, smooth, and seamless, exactly what they expect.

👋 I’d like to thank Shefali for writing this newsletter!

Plus, don’t forget to check out her work and socials:

  • Shefali.dev
  • GitHub
  • Twitter

You’ll often find her writing about web development, sharing UI tips, and building tools that make developers’ lives easier.