Building a Devops Engine

Mike's Notes

Here are some working notes from my current job on Pipi 9.

Resources

References

  • Reference

Repository

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

Last Updated

17/05/2025

Building a Devops Engine

By: Mike Peters
On a Sandy Beach: 22/02/2025

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

Tonight, I started back on the DevOps Engine (dvp) after several years of absence (March 2023, to be exact).

The engine is based on The DevOps Handbook, which was written by Gene Kim, Jez Humble, Patrick Debois, and John Willis and published by IT Revolution.


"A DevOps toolchain is a set or combination of tools that aid in delivering, developing, and managing software applications throughout the systems development life cycle, as coordinated by an organisation that uses DevOps practices.

Generally, DevOps tools fit into one or more activities that support specific DevOps initiatives: Plan, Create, Verify, Package, Release, Configure, Monitor, and Version Control." - Wikipedia.

First, I had to solve many other dependencies to determine what needed to be done on this engine. Then, in December 2024, I could create a reasonable roadmap for Pipi, which has been made public and works.

I'm using the published roadmap as if it were a product of the DevOps Engine, and I'm working backwards to correct the necessary process model.

The key priorities are high quality, fast flow speed and automation.

The data model is designed to maximise flow.

Everything is pinned back to the NameSpace Engine (nsp), and any rendering uses the existing working engines.

There is a constant interdependency between these engines, which maintain each other.

The DevOps Engine deals with flow. Each of the 8 steps will have its own engine, often working with other engines, such as the existing Feature Flag Engine or the Canary Engine.

I am already tweaking the roadmap, replacing "Goal" with "Function" and "OKR" (Objective and Key Results).

The Versioning Engine (ver) will also be impacted, as each engine's version increments with DevOps updates and flows onto Pipi's versioning.

Version logging has been off since Pipi 7 and will be turned on once automation is in place. I don't use version control; I keep dated drawings in ring binders. However, version control will become necessary as complexity increases, especially when teams are established.

Here are some of the initial options for the model in the DevOps Engine.

Options

  • WBS
  • Step
  • Priority
  • Flow Status
  • Started
  • Completed
  • Time Taken
  • Verb
  • Function
  • OKR
  • Scope
  • Task
  • Assigned
  • WIP
  • Batch Size
  • % Resource Busy

WBS

Example: "1.2".

Step

  1. Plan
  2. Code
  3. Build
  4. Test
  5. Release
  6. Deploy
  7. Operate
  8. Monitor

Priority

  • Low
  • Medium
  • High

Flow Status

  • Yet to Start
  • Underway
  • Completed

Started

24/12/2024

Completed

25/12/2024

Time Taken

Example: 6,000 seconds.

Verb

  • Edit
  • Make
  • Render
  • Test

Function

Example: "Workspace".

OKR

Example: "Workspace Upgrade 3".

Scope

  • Name of namespace object.

Task

Example: "Export the Google Sheet to DevOps engine".

Assigned

  • Name of person/team/robot responsible.

WIP

  • Example: 5

Batch Size

  • Example: 1

% Resource Busy

  • Example: 85%

Smashing Meets Future of Design Systems

Mike's Notes

Smashing Magazine held a free online meeting in February 2024 about the future of design systems. Panellist Brad Frost argued for a library of common design components that could be styled differently. This would replace the hodgepodge of hundreds of design systems that use components built differently.

As a result, the top one million web pages have an average of 50 accessibility errors per page.

His article is copied below. The original has more information and links.

I agree with Brad 100%. A Global Design System would be great for Pipi CMS. I will ensure that the Pipi Design System components can be easily swapped.

Resources

References

  • Reference

Repository

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

Last Updated

17/05/2025

    A Global Design System

    By: Brad Frost
    bradfrost.com: 09/012024

    TL;DR: This is a call to action to create a Global Design System that provides the world’s web designers & developers a library of common UI components. A Global Design System would improve the quality and accessibility of the world’s web experiences, save the world’s web designers and developers millions of hours, and make better use of our collective human potential.

    Sounds pretty good, right? In this article, I’ll talk about our collective design system journey, the rationale for creating a Global Design System, some thoughts on how to make a Global Design System actually happen, and discuss how a Global Design System would impact the world’s web designers and developers. Let’s dig in!

    Our design systems journey

    Once upon a time, people had to design, construct, and maintain a bespoke user interface for each and every web digital product. This was manageable when an organization’s digital landscape looked something like this:

    But as we all know, the digital landscape has exploded into a cacophony of websites, web apps, native mobile applications, and other software applications we can collectively call “digital products.” It’s not unusual for an organization’s digital product landscape to look something like this:

    Designing, building, and maintaining a bespoke user interface for each individual digital product is expensive, inefficient, and fraught. And so a chorus of voices rings out across organizations the world over: “Let’s stop reinventing the wheel! Let’s save designers and developers time and agony! Let’s promote consistency and cohesion! Let’s ship higher-quality users interfaces!” This is the rallying cry for what we have come to know as design systems.

    Over the past ~10-15 years, concepts around modular UIs have matured, technologies have been born, and tools have evolved to create a library of common user interface components that power an organization’s portfolio of digital products.

    With a design system in place, product teams can wield the design system’s buttons, form controls, accordions, and other common UI components in order to increase speed, improve UI quality, and free teams up to work on more worthwhile tasks. This approach has proven to be very effective, and now design systems have become a best practice employed by digital organizations of all shapes and sizes around the world. Hooray design systems!

    Our duplicative present

    And we all live happily ever after, right? Well, not so fast. Organization-wide design systems have eased the individual burden of designing/building (and redesigning/rebuilding ad nauseam) common solutions over and over again. But an ironic pattern emerges: every organization ends up building solutions that overlap substantially with what every other organization is building. Our efforts to reduce duplicative work at the individual level are resulting in duplicative work at the inter-organization level.

    An illustration demonstrating a large collection of org-specific design systems and digital products served by each design system.

    This phenomenon is understandable: organizations are trying to bring order where they have influence. (We see this within organizations as well, where several production teams under the same roof build their own systems because they don’t have influence beyond their group to build an org-wide system.) But the result is the same: now we have a meta design system problem.

    Right now, vast numbers of human beings are devoting their time and energy to designing, building, documenting, and maintaining the exact same set of common components. Accordions that open when a user clicks them. Accordions that — you guessed it — close when a user clicks them again. Datepickers that…pick dates. Tabs that switch panels when selected. Form fields that associate labels with their respective inputs. Alerts that communicate success, error, warning, and information status. Dialogs and tooltips and drawers oh my! By and large, these components are unexceptional commodities that assume the same general shape and behavior regardless of whether the design system serves a non-profit, a federal agency, a bank, a publication, an e-commerce site, a Fortune 500 enterprise, a dog salon, a startup, SaaS company, you get the picture.

    These basic UI components are tricky to get right. Looking across the World Wide Web, 0 of the top 100 websites use valid HTML, and our collective accessibility game is abysmal. The WebAIM Million project crawls the top million websites and reliably delivers a depressing annual report about the state of website accessibility:

    "Across the top one million home pages, 49,991,225 distinct accessibility errors were detected—an average of 50.0 errors per page." - WebAIM Million

    While these issues can’t solely be attributed to the constant reinvention of common UI components, they certainly contribute to the problem! Historically our approach to this important issue has been to shout louder at developers to construct things with accessibility as a primary consideration, but that strategy doesn’t appear to be working.

    All of this duplicative work yields experiences that still suffer serious quality deficiencies, and there are even more wrinkles to consider. Each design system is isolated and disconnected, which means each organization is left to its own devices to ensure the library keeps up with the web’s ever-evolving best practices. Updating components to adopt new HTML elements, attributes, and techniques has so far been a manual process that is delicate and error-prone. And it’s a two-way street: there’s not a clear path for the broader web to benefit from excellent solutions and ideas that were born in org-specific systems.

    So what are we to do? Let’s return to our wise design systems rallying cry: “Let’s stop reinventing the wheel! Let’s save designers and developers time and agony! Let’s promote consistency and cohesion! Let’s ship higher-quality users interfaces!”

    Only now let’s redirect that rallying cry outside of any individual organizations’ walls and apply it to the world at large.

    A proposal for a Global Design System

    "When the design system is boring, it frees designers and developers to do the new stuff, to solve new problems. The design system carries the burden of the boring, so that designers and developers don’t have to." - Josh Clark

    There is a massive opportunity to save the world’s designers and developers millions upon millions of hours, freeing up time and human potential to work on far more pressing problems than making an accordion open and close.

    There’s a massive opportunity to dramatically improve the accessibility, semantics, and overall quality of the world’s web experiences.

    There’s a massive opportunity to harness the collective brain power of the world’s best and brightest.

    There’s a massive opportunity for the web community to demonstrate to a volatile world what true worldwide collaboration and cooperation looks like.

    I think there’s a massive opportunity to create a Global Design System.

    An illustration showing a global design system bubble on the left with an arrow pointing right to a collection of smaller bubbles representing organization-specific design systems

    A Global Design System would centralize common UI components, reduce so much of this unnecessary duplication, integrate with any web-based tech stack, and create a connected vehicle for delivering front-end best practices to the world’s web experiences.

    What exactly would a Global Design System look like? We’ll get to that, but first let’s talk about how it differs from a few things that already exist.

    A layer on top of HTML

    You might be asking, “So you’re saying we just need to add a bunch of new elements to the HTML spec?” To which my answer is “Maybe!” But also “Maybe not!”

    HTML is amazing, and provides the elemental pieces we need to make websites and apps work. I think about HTML elements and attributes as the most elemental, low-level IKEA furniture parts:

    A picture of small Ikea components: dow rods, brackets, and screws

    Historically, that’s all developers have had to work with. We’d rummage around the pile and pick out the things we need to create our products. As we’ve already discussed, there’s a lot of room for error in this process; it’s a bit like drawing the rest of the owl.

    Thanks to the tireless work of browser folks and standards bodies, I think that by and large we have most HTML elements and primitives in place to make most common web user interfaces. What we need now are more prefabricated UI components that abstract away much of the close-to-the-metal HTML and give developers composed, ready-to-use modules to drop into their projects.

    We don’t necessarily need more HTML elements; we need more sturdy pre-fabricated components that developers can drop in with confidence.

    Many — or even most! — web developers shouldn’t need to understand many close-to-the-metal HTML concepts in order to make web applications function. What would it mean to centralize the markup of dozens of common components and provide those as plug-and-play solutions to back-of-the-front-end developers?

    A Global Design System can also serve as an incubator or test kitchen for new HTML elements or properties. We see this with recipes in the layered design system ecosystems we encounter; great ideas born in product-specific layers can eventually be absorbed by the lower-level system. The HTML standards process is necessarily slow, deliberate, and comprehensive, so a Global Design System layer on top of HTML can pragmatically help developers get things done now while also creating a path to future inclusion in the HTML spec if applicable.

    Why don’t we just use [third-party library]?

    For many years, we’ve heard “Why doesn’t everyone just use [Material Design | Bootstrap | Tailwind UI | Foundation by Zurb | etc]?” After all, these tools are already constructed, tested, documented, open sourced, and put through their paces by some of the world’s largest organizations.

    This instinct makes a ton of sense! Great artists steal, and there’s a real pragmatism in reaching for existing, sturdy work. However, adopting someone else’s design system surfaces two important issues:

    1. These solutions were (understandably!) created with a specific organization’s specific goals & considerations in mind. The architecture, conventions, and priorities of these libraries are tuned to the organization it serves; they don’t take into account the sheer breadth of the world’s UI use cases.
    2. They nearly always come with a specific default aesthetic. If you adopt Material Design, for example, your products will look like Google’s products. These libraries can be configurable, which is great, but themeabilitiy has limits and often results in many teams fighting the default look-and-feel to achieve custom results. In our experience, this is where folks end up creating a big mess.

    Projects like Headless UI and react-aria provide primitive UI components and functionality without a default look and feel. This is what we’re shooting for! We want the common structure and functionality that third-party components provide, but we often want to bring our own styles to the party. However, many of these libraries are tied to a specific technology, namely React, which limits their reach.

    So while existing libraries are great, they come with a default look and feel that have limits to their customizability. And while headless UI libraries capture the right spirit, they’re tethered to specific libraries or frameworks. What we need is a library of aesthetic-and-technology-agnostic UI components that provides sturdy semantics and functionality while also providing a ton of aesthetic flexibility.

    Making a Global Design System happen

    Here’s where the rubber meets the road. What does this look like? How would all of this go down? Who would be involved? Where would this live? When should this happen?

    The answers to these questions require a lot of conversation, collaboration, and coordination amongst a diverse, yet-to-be-determined set of stakeholders. I don’t pretend to know exactly how to turn this idea into a reality, and I’d very much welcome ideas and conversation about how to make it happen! With that caveat, I’d like to share a few ideas that could be helpful.

    What would a Global Design system be?

    A Global Design System would be a common library containing common UI components currently found in most design systems (Shout out to the brilliant Open UI project for this epic matrix!). In order to be successful, these components would need to be:

    • Vehicles for accessibility and other front-end best practices, creating a single source of truth for common UI components.
    • Easily themeable in order to match any brand or design language.
    • Intuitive to use, providing users with a cohesive & consistent API language, sensible structure, and grokkable syntax.
    • Interoperable to be able to power any website or app.
    • Be internationalized in order to account for the sheer diversity of languages, writing modes, et al. found throughout the world.
    • Be composable and extensible so users can modify or extend the system without having to hack things to pieces.

    Given the above principles, I think it would make sense for the Global Design System to be a library of Web Components. Web Components are part of the web platform and are interoperable (in theory at least) with any web-based tech stack. Setting aside current weirdness with Web Components (that’s a post for another day), they seem like a sensible technology choice for an initiative like this.

    Web Components for a Global Design System could look something along the lines of these examples:

    <w3c-text-field 

      label="Email Address" 

      type="email" 

      required>

    </w3c-text-field>


    <w3c-alert variant="error">

       <w3c-icon name="stop" slot="icon"></w3c-icon>

       Your credit card is expired. Please update your information.

    </w3c-alert>


    <w3c-button-group>

      <w3c-button variant="primary">Log In</w3c-button>

      <w3c-button>Cancel</w3c-button>

    </w3c-button-group>

    For all you literal people out there, take all of this with a grain of salt. I’m not proposing this exact syntax or structure; take this as a “for instance” gesture sketch.

    A Global Design System would exist as a standalone library of components that consumers would pull into their projects, style to match their brand/visual language, and integrate into their application’s business logic. Not only would this be far more efficient than having to design, build, test, deploy, and integrate bespoke components from scratch, a Global Design System would give teams added confidence that the components are sturdy and reliable.

    Of course it would also make sense to create a corollary UI library in Figma and other design tools that share the same API, structure, conventions, and default appearance as the Global Design System code library. And of course there would need to be solid reference documentation for this library, which would take the burden away from each and every design system team on the planet to define and describe what a freaking button is. And while we’re at it, it likely makes sense to consider native mobile and desktop operating systems as well; while these environments differ in important ways, there are also many shared conventions that a Global Design System can help define or inform.

    What wouldn’t a Global Design System be?

    I think there are a few special callouts for what a global design system wouldn’t be. A Global Design System wouldn’t:

    • Provide a particular aesthetic – Think of this as a vanilla base containing only browser-default styles. People can create their own custom themes or use styles contained in Tailwind, Open Props, Bootstrap, Material, et al. In our experience working with scores of different design systems, common components have a shared general semantics and behavior, but are styled dramatically different. Think Global Design System + CSS Zen Garden.
    • Be a comprehensive solution for all UI needs – It’s impossible to account for every use case on the planet. Think pragmatism and the 80/20 rule here. If the Global Design System could provide solutions for the majority of use cases for a given component, that would be a huge win! But what if you have a need to make a custom SVG starburst button that does a backflip when you click on it? That’s fine! We still have the ability to make our own special pieces of UI the old-fashioned way. This is also why a layer on top of HTML might be a better approach than extending HTML itself; HTML has to account for all use cases, where a Web Component library can limit itself to the most common use cases. It would be critical for the library itself to be quite conservative and focus on extremely common use cases or else it would buckle under its own weight and endless requests from the peanut gallery. Governance would be key!

    Who

    I tend to define a design system as the official story of how an organization builds user interfaces. A design system needs to be tuned for the specific digital product landscape that exists at an organization in order for it to be successful. But the organization we’re talking about here is this:

    This is the target organization for a global design systen.

    Because of the global nature of this effort, it couldn’t be owned by a specific corporation. With that said, it seems like it would make sense for huge tech companies to sponsor and fund an effort like this!

    From my perspective, an organization like the W3C would be the best home for something like this. Their mission is pretty hand-in-glove with this whole idea:

    The World Wide Web Consortium (W3C) develops standards and guidelines to help everyone build a web based on the principles of accessibility, internationalization, privacy and security.

    It’s also worth mentioning the amazing Open UI project, which has been doing a lot of the hard legwork on rounding up common UI components across many popular design systems. And I have no doubt there are many other organizations, projects, and people from the design system community who would love to participate in an effort like this.

    Where

    A Global Design System would need to consist of a set of assets that include:

    • A code repository containing the source code for the Web Components
    • Any necessary code packages (npm, yarn, composer) to deliver the Web Components to any environment. (Note: reliance on JS, packages, etc is something to address in order to create components that can be easily used by any web environment. This post by Lea Verou captures how the modern landscape creates barriers for people to create/use Web Components)
    • A design library in popular design tools like Figma and Sketch.
    • A reference website to provide documentation and information about the project.

    Where exactly those things would live is determinant on a whole slew of factors, so we can leave it here for now.

    How

    As mentioned before, I have no idea how exactly this would all go down. I’d figure it would require a lot of conversation, alignment, and coordination before anything tangible could happen. Here’s my hand-wavy stab at a process from my naive outsider perspective:

    • Have conversations with any interested party, including: standards bodies, relevant existing groups, design system teams, individual designers & developers, etc to get some momentum going.
    • Probably create a working group or similar to start moving forward in a more formal way.
    • Do research to better understand what common UI components and variants should exist in a Global Design System. Have conversations with and learn from popular design system teams and popular UI library maintainers. Talk to product designers and web developers to better learn what their pain points are and learn what they’d like to see in a Global Design System. Involve experts in accessibility, semantics, internationalization, and other relevant specialists to ensure a Global Design System embodies best practices. Sync with Open UI to see how this overlaps with their existing work. Study existing design systems. Conduct an interface inventory across the web to capture a cross-section of in-the-wild use cases.
    • Lay out a plan of attack to build a Global Design System library. Define what exactly it is, align on technology choices, establish architecture, align on naming conventions, etc. Establish a roadmap for creating and delivering the Global Design System components. Figure out who’s doing what, and so on.
    • Design and build – This is the easy part 😂. Design, build, document common UI components according to the architectural conventions. Test alpha/beta releases with guinea pigs.
    • Release – Make the Global Design System components available to use; get everyone in the web community to evangelize, and get prominent design systems and projects to adopt the new library.
    • Iterate – Add new components and variants to the library according to the roadmap. Get feedback, etc.
    • Govern – A core group would of course need to govern the design system on an ongoing basis to address issues, field requests, protect the system’s integrity, and so on. This would obviously be a tough gig considering the global nature of the project, but I’d imagine it would be fulfilling in the same ways that working on big globe-spanning projects are.

      Something like that. Again, my perspective is naive so take all of this with a grain of salt. For now, let’s at least get the conversation part started!

      When

      I’ve had the opportunity to speak about this topic at several conferences, and I’ve thoroughly enjoyed the subsequent discussion about the prospects of a Global Design System. The number of “I’ve been saying this for years!” and “you have my sword!” responses leads me to believe there’s a strong appetite for a Global Design System. People are hungry for this to happen, the technologies are now largely in place, and the whole industry has a far better understanding of component-driven design and development. I think the time for a Global Design System is now.

      What would this mean for the world’s web designers and developers?

      I think that a Global Design System has the potential to transform how web designers and developers do their jobs.

      When I talk about design systems, I often talk about respect and human potential. Every design system team having to build their own common components isn’t a respectful use of their time and potential. Lord knows there are some wicked problems to solve, so let’s free our hands and brains up to work on those problems instead!

      If a Global Design System existed, what would design system teams do? While I understand anxiety around being replaced (hey, we hear this about design systems from product designers & developers all the time), there’s still plenty of work to do. I find this tremendously exciting: design system teams would be freed up to focus on more interesting aspects of creating great digital products than simply component construction.

      Plenty of the current work would remain:

      • Crafting a design language – The design system team would continue to be responsible for the applying the brand’s application to digital product as a thoughtful design language.
      • Documenting guidelines for specific use and context of components within the organization would still need to

      But there would also be a huge opportunity to free teams up to focus on bigger-picture issues. In our work at Big Medium, we help our clients with the human, process, product-level, and organization-level aspects of design systems. This is the stuff that truly makes or breaks a design system effort, but too often gets lost in the ground-level work of component production. With a Global Design System in place, teams could:

      • Architect and orchestrate a thoughtful design system ecosystem that helps the organization ship better products faster, realizing the value of a design system.
      • Collaborate with production teams to create and curate high-value product-specific design patterns, on top of the common UI.
      • Create smart components that are wired up and ready to integrate into product codebases.
      • Build new automation tools (hello, AI!) to scaffold designs, code, and tests quickly.
      • Use the design system to bust barriers between disciplines, especially between design and development. A Global Design System can help these world’s get closer together, but
      • Help consuming teams make great UX and development decisions with common and org-specific components.
      • Capture, curate, and celebrate the organization’s standards, best practices, and innovations.

      Freed from much of the mechanical production work, design system teams can spend more time on the stuff that is truly unique to the organization. There’s still a ton of work to do, and that remaining work makes better use of our human intellect.

      What’s next?

      That’s a damn good question! How to transition from “A Global Design System seems like a good idea” into “let’s do this!” is a big question mark. So I’ll pose the question to you: what’s next? What do you think about the idea of having a Global Design System? Good idea? Bad idea? What would you like to see in a Global Design System? How do you envision it all going down?

      I believe in the web. There have been many weird twists and turns over the years, but the idealistic embers of the World Wide Web are still burning. I want the web to thrive, and I want people working to build the web to thrive and realize their potential as human beings. I bet you feel the same way. So let’s make a Global Design System happen together!

      What if

      Mike's Notes

      This is a note to self; there are some questions I need to answer.

      I'm doing some helpful free "start-up" training at NZTE, CreativeHQ, Startup Aotearoa, etc., which involves thinking about some hard questions and putting words onto several canvases. The people are all excellent, making me do a lot of thinking.

      Pipi is not a simple app. It uses a novel architecture to help solve enormous, complex, and challenging problems.

      How do I explain to anyone interested in what Pipi provides?

      Resources

      References

      • Reference

      Repository

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

      Last Updated

      17/05/2025

      What if

      By: Mike Peters
      On a Sandy Beach: 20/02/2025

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

      • A complete enterprise SaaS system took 24 hours to automatically deploy for a customer.
      • Built out of reusable modules that automatically sync with no limit on the number of modules.
      • New modules can be simply and quickly created using no code.
      • It can start small and cheaply with minimal risk with one module, then add more as needed.
      • No sales engineers.
      • All self-service.
      • Fully configurable by their DevOps team using no code.
      • The enterprise SaaS was 100% open-source.
      • Its underlying industry model was constantly improved by the users of all deployments.
      • Industry Ontology and standards-based.
      • Customer data stays with the customer and is invisible to the platform.
      • Any human language or writing script can be used.
      • Community-provided translation and localisation
      • Its code base was completely obfuscated (all UUID).
      • Each deployment had a unique code obfuscation.
      • Only the UI, API and stored data use actual words.
      • The platform is a closed-source black box with all parameters visible.
      • A unique enterprise SaaS system was fully delivered on time and on budget.
      • Costs are cut by an order of magnitude.
      • Long-term low-cost of ownership.
      • It can scale simply.
      • Able to make use of existing tools like Kubernetes, Docker, etc.
      • Designed to run on most Cloud providers, giving users options and data sovereignty.
      • Encourages an open ecosystem without moats, including 3rd party support, training, plugins, etc.
      • Had a fully-synced closed-source visible digital twin for experiments and system learning.
      • It can be integrated via API without restrictions.
      • It didn't need a super-computer with thousands of cores.
      • The whole thing is owned by a public good foundation, so there are no investors, corporate highjacking or enshittification risks.
      • Public open handbook.

      Open questions

      • What kind of problems does Pipi solve?
      • Why do these problems exist?
      • Why solving these problems is essential?
      • Would it be beneficial to society?
      • What's wrong with the existing alternatives?
      • Would people use it?
      • Would enough people pay to use it to make it viable?
      • Would it reduce the waste of software failure?
      • What kind of Foundation would be needed?
      • How would the developer community be supported?
      • How would R&D be supported?

      Free Geometry Books, Problems and More

      Mike's Notes

      I discovered this fascinating website dedicated to Olympiad geometry problems. It includes geometry articles, books, magazines, shortlists for juniors and seniors, and problem collections with solutions from national, regional, and international mathematical Olympiads.

      The books are in PDF format.

      The geometry problems all have a worked solution on AoPS (Art of Problem Solving).

      Resources

      References

      • Reference

      Repository

      • Home > Ajabbi Research > Library > Subjects > Mathematics
      • Home > Handbook > 

      Last Updated

      17/05/2025

      Article

      By: Mike Peters
      On a Sandy Beach: 20/04/2025

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

      OOUX

      Mike's Notes

      Object-oriented UX (OOUX) involves "Identifying objects, their characteristics, and relationships in an experience. This can help simplify designs and make systems easier to use by aligning with people's mental models" (Credit: Sophia Prater).

      I recently discovered OOUX and these resources. I have already been working roughly this way without realising it had a name (OOUX).

      The examples in the OOUX documentation include some details I should also use.

      Pipi 9 uses model-driven user interfaces. I should change the model diagram to explicitly include OOUX and label it as such.

      The current render chain is DDD > Wfl > AUI > CUI > FUI > LUI > PUI

      Resources

      References

      • Reference

      Repository

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

      Last Updated

      17/05/2025

      OOUX Talks

      By: Sophia Prater
      YouTube: Playlist

      OOUX: A Foundation for Interaction Design

      By: Sophia Prater
      A List Apart: April 19, 2016

      There’s a four-year story behind my current design process, something I introduced last year on A List Apart—“Object-Oriented UX.” The approach advocates designing objects before actions. Now it’s time to get into the deeper benefits of OOUX and the smooth transition it can set up while shifting from object-based system design to interaction design.

      "The “metaphor,” once found, is a perfectly definite thing: a collection of objects, actions on objects, and relationships between objects." - Dave Collins, Designing Object-Oriented User Interfaces (1995)

      Imagine you’re designing a social network that helps chefs trade recipes requiring exotic ingredients. With good ol’ fashioned research, you develop a solid persona (Pierre, the innovator-chef, working in a gourmet restaurant) and you confirm the space in the market. You understand the industry and the project goals. Now it’s time to put marker to whiteboard.

      Where would you start designing?

      Would you start by sketching out an engaging onboarding process for chefs? We do need chefs to make this thing successful—no chefs, no network! So maybe we start by making sure their first interaction is amazing.

      Or maybe you start with one of the most frequent activities: how a chef posts a new recipe. And that could easily lead you to sketching the browsing experience—how will other chefs find new recipes?

      Three or four years ago, I’d start by storyboarding a critical user path. I’d start with the doing.

      Pre-OOUX, my initial design-thinking would look something like this. I’d figure out the interaction design while figuring out what a recipe actually should be.

      I imagine many other user experience designers begin the same way, by designing how someone would use the thing. One interaction flow leads to the design of another interaction flow. Soon, you have a web of flows. Iterate on those flows, add some persistent navigation, and voilà!—you have a product design.

      But there is a problem with this action-first approach. We are designing our actions without a clear picture of what is being acted on. It’s like the sentence, “Sally kicked.” We’ve got our subject (the user) and we’ve got our verb (the action). But where’s the object? Sally kicked what? The ball? Her brother? A brain-hungry zombie?

      When we jump right into actions, we run the risk of designing a product with a fuzzy reflection of the user’s mental model. By clearly defining the objects in our users’ real-world problem domain, we can create more tangible and relatable user experiences.

      These days, a lot happens before I begin sketching user flows (in this article, I use “user flow” and “interaction flow” interchangeably). I first define my user, asking, “Who’s Sally?” Next, I figure out her mental model, meaning all the things (objects) that the problem is made of, all the things she sees as part of the solution, and how they relate to one another. Finally, I design the interactions. Once I understand that Sally is a ninja armed with only a broomstick, and that she is faced with a team of zombies, I can better design the actions she’ll take.

      In retrospect, I feel like I was doing my job backwards for the first two-thirds of my career, putting interaction flows before building an object-oriented framework. Now, I would figure out the system of chefs, recipes, and ingredients before worrying about the chef onboarding process or how exactly a chef posts a recipe. How do the objects relate to one another? What content elements comprise each object? Which objects make up my MVP and which objects can I fold in later? Finally, what actions does a user take on each object?

      That’s what Object Oriented UX is all about—thinking in terms of objects before actions. In my previous article, we learned how to define objects and design a framework based on those objects. This time, we’re exploring how to smoothly transition from big-picture OOUX to interaction design by using a very simple tool: the CTA Inventory.

      What’s a CTA Inventory, and why is it important?

      Calls to action (CTAs) are the main entry points to interaction flows. If an interaction flow is a conversation between the system and the user, the CTA is a user’s opening line to start that conversation. Once you have an object framework, you can add possible CTAs to your objects, basically putting a stake in the ground that says, “Interaction design might go here.” These stakes in the ground—the CTAs—can be captured using a CTA Inventory.


      A CTA Inventory is a bridge from big-picture OOUX to detailed interaction design.

      A CTA Inventory is just a fancy list of potential CTAs organized around your objects. Since most (all?) interactions involve creating, manipulating, or finding an object, we create this inventory by thinking about what a user wants to do in our system—specifically, what a user wants to do to objects in our system.

      Creating a CTA Inventory does two things. First, it helps us shift gears between the holistic nature of system design to the more compartmentalized work of interaction design. Second, it helps us:

      1. think about interactions creatively;
      2. validate those interactions;
      3. and ultimately write project estimates with greater accuracy.

      Let’s explore these three benefits a little more before creating our own CTA Inventory.

      Creative constraints improve brainstorming

      Simply understanding your objects will help you determine the things that a user might do with them. We know that Sally wants to destroy zombies—but it’s only after we’ve figured out that these are the fast, smart, light-averting zombies that we can be prepared to design exactly how she’ll do it.

      When we think about interactions in the context of an object, we give ourselves a structure for brainstorming. When we apply the constraints of the object framework, we’re likely to be more creative—and more likely to cover all of our bases. Brainstorm your actions object by object so that innovative features are less likely to fall through the cracks.

      For example, let’s think about the object “ingredient” in our Chef Network app. What are all the things that Pierre might want to do to an ingredient?

      • Mark the ingredient as a favorite.
      • Claim he’s an expert on the ingredient.
      • Add the ingredient to a shopping list.
      • Check availability of the ingredient at local stores.
      • Follow the ingredient to see new recipes that are posted using this ingredient.
      • Add a tip for using this ingredient.

      By using the object framework, I might uncover functionality I wouldn’t otherwise have considered if my brainstorming was too broad and unconstrained; structure gives creative thinking more support than amorphous product goals and squishy user objectives.

      Validate actions early

      Good news. You can user-test your system of objects and the actions a user might take on them before spending long hours on interaction design. Create a prototype that simply lets users navigate from one object to another, exploring the framework (which is a significant user goal in itself). Through observation and interviews, see if your system resonates with their mental model. Do you have the right objects and do their relationships make sense? And are the right “buttons” on those objects?

      Armed with a simple prototype of your interconnected objects and their associated CTAs, you now have a platform to discuss functionality with users—without all the hard work of prototyping the actual interactions. In a nutshell: talk to your users about the button before designing what happens when they click it.

      Interaction design can be some of the most difficult, time-consuming, devil-in-the-details design work. I personally don’t want to sweat through designing a mechanism for following chefs, managing alerts from followed chefs, and determining how the dreaded unfollow will work…if it turns out users would rather follow ingredients.

      Estimate with interaction design in mind

      As we’ve established, interaction design is a time- and resources-devouring monster. We have to design a conversation between the system and the user—an unpredictable user who requires us to think about error prevention, error handling, edge cases, animated transitions, and delicate microinteractions. Basically, all the details that ensure they don’t feel dumb or think that the system is dumb.

      The amount and complexity of interaction design your product requires will critically impact your timeline, budget, and even staffing requirements, perhaps more than any other design factor. Armed with a CTA Inventory, you can feel confident knowing you have solid insight into the interaction design that will be handled by your team. You can forecast the coming storm and better prepare for it.

      So, do you love this idea of better brainstorming, early validation, and estimating with better accuracy? Awesome! Let’s look at how to create your amazing CTA Inventory. First, we will discuss the low-fidelity initial pass (which is great to do collaboratively with your team). Next, we will set up a more formal and robust spreadsheet version.

      CTA Inventory: low-fidelity

      If you haven’t read my primer on object mapping, now would be a great time to go and catch up! I walk you through my methodology for:

      • extracting objects from product goals;
      • defining object elements (like core content, metadata, and nested objects);
      • and prioritizing elements.

      The walk-through in the previous article results in an object map similar to this:


      An object map before layering on a CTA Inventory.

      I’ve used outlined blue stickies to represent objects; yellow stickies to represent core content; pink stickies to indicate metadata; and additional blue stickies to represent nested objects.

      A low-fidelity CTA Inventory is quite literally an extension of the object mapping exercise; once you’ve prioritized your elements, switch gears and begin thinking about the CTAs that will associate with each object. I use green stickies for my CTAs (green for go!) and stack them on top of their object.


      An object map with a quick, low-fidelity CTA Inventory tacked on. Potential CTAs are on green stickies placed next to each object.

      This initial CTA brainstorming is great to do while workshopping with a cross-functional team. Get everyone’s ideas on how a user might act on the objects. You might end up with dozens of potential CTAs! In essence, you and your team will have a conversation about the features of the product, but within the helpful framework of objects and their CTAs. Essentially, you are taking that big, hairy process of determining features, then disguising it as a simple, fun, and collaborative activity: “All we’re doing is brainstorming what buttons need to go on our objects! That’s all! It’s easy!”

      Each object might need roughly 10–15 minutes, so block out an hour or two to discuss CTAs if your system has three to five objects. You’ll be surprised at the wealth of ideas that emerge! You and your team will gain clarity about what your product should actually do, not to mention where you disagree (which is valuable in its own right).

      In our chef example, something pretty interesting happened while the team was hashing out ideas. During the CTA conversation about “ingredient,” we thought that perhaps it would be useful if chefs could suggest a substitute ingredient (see circled green sticky below). “Fresh out of achiote paste? Try saffron instead!” But with that in mind, those “suggested substitute ingredients” need to become part of the ingredient object. So, we updated the object map to reflect that (circled blue sticky).


      Although I always begin with my objects and their composition, CTA brainstorming tends to loop me back around to rethinking my objects. As always, be prepared to iterate!

      CTA Inventory: high-fidelity

      CTAs can get complicated; how and when they display might be conditional on permissions, user types, or states of your object. Even in our simple example above, some CTAs will only be available to certain users.

      For example, if I’m a chef on an instance of one of my own recipe objects, I will see “edit” and “delete” CTAs, but I might not be able to “favorite” my own recipe. Conversely, if I’m on another chef’s recipe, I won’t be able to edit or delete it, but I will definitely want the option to “favorite” it.

      In the next iteration of our CTA Inventory, we move into a format that allows us to capture more complexities and conditions. After a first pass of collaborative, analogue brainstorming about CTAs, you might want to get down to business with a more formal, digitized CTA Inventory.


      A detailed CTA Inventory for our chef network example. Dig in deeper on the actual Google Sheet.

      Using a Google spreadsheet, I create a matrix (see above) that lets me capture thoughts about each object-derived CTA and the inevitable interaction flows for each one:

      • Why do we even have this CTA? What’s the purpose, and what user or business goal does it ladder up to?
      • Who will trigger this CTA? A certain persona or user type? Someone with a special permission or role?
      • Where will the CTAs live? Where are the obvious places a user will trigger this interaction flow? And are there other creative places we should consider putting it, based on user needs?
      • How much complexity is inherent in the interaction flow triggered by this CTA? This can help us estimate level of effort.
      • What is the priority of this interaction flow? Is this critical to launch, slated for a later phase, or a concept that needs to be researched and validated?
      • What questions and discussion points does this CTA raise?

      Before you start designing the interactions associated with each of your CTAs, get comfortable with the answers to these questions. Build an object-oriented prototype and validate the mental model with users. Talk to them and make sure that you’ve included the right doorways to interaction. Then you will be perfectly positioned to start sketching and prototyping what happens when a user opens one of those doors.

      A solid foundation for designing functionality

      You’ve collaboratively mapped out an elegant object-oriented design system and you’ve created a thorough CTA Inventory. You built a rough, clickable prototype of your system. With real users, you validated that the system is a breeze to navigate. Users pivot gracefully from object to object and the CTAs on those objects make sense for their needs. Life is good.

      But OOUX and a CTA Inventory will not help you design the interactions themselves. You still have to do that hard work! Now, though, as you begin sketching out interaction flows, you can feel confident that the functionality you are designing is rooted in solid ground. Because your CTA Inventory is a prioritized, team-endorsed, IxD to-do list, you’ll be more proactive and organized than ever.

      Most important, users getting things done within your system will feel as if they are manipulating tangible things. Interacting will feel less abstract, less fuzzy. As users create, favorite, add, remove, edit, move, and save, they will know what they’re doing—and what they’re doing it to. When you leverage an object-based CTA Inventory, your product designs and your design process will become more elegant, more streamlined, and more user-friendly.

      About the Author

      Sophia V. Prater is founder and lead UX designer of Rewired and the chief evangelist of Object-Oriented UX. Sophia teaches her OOUX methodologies at conferences, within companies, and through her OOUX Certification Program. She is the host of the OOUX Happy Hour meetup and the OOUX Podcast.

      Sophia has brought the complexity-untangling magic of OOUX to companies such as Facebook, Mastercard, Macy’s, Credit Karma, Hubspot, Intercom, Delta Airlines, CNN, and many more.

      Markov Blankets

      Mike's Notes

      Pipi uses Markov chains, which can form a Markov Blanket. Blankets can be aggregated and nested. The Royal Society paper "The Markov Blankets of Life: autonomy, Active Inference and the Free Energy Principle" is excellent.

      A Markov blanket statistically defines a system's boundaries (e.g., a cell or a multicellular organism). It is a statistical partitioning of a system into internal and external states, and the blanket itself consists of the states that separate the two.

      Resources

      References

      • Reference

      Repository

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

      Last Updated

      12/10/2025

      A Markov Chain Theory of Self Organization

      By: Jacob Calvert, Georgia Tech University 

      YouTube: 14/11/2024


      Fundamentals of statistical mechanics explain that systems in thermal equilibrium spend more time in states with greater order because these states have lesser energy. This explanation is remarkable, and powerful, because energy is a "local" property of states. Nonequilibrium systems, like living systems, can also exhibit order, but there is no property analogous to energy that generally explains why states with greater order tend to emerge. However, recent experiments suggest that a local property called rattling predicts which states are favored, at least for a broad class of nonequilibrium systems. In this seminar, I will present a simple theory of rattling that explains when and why it works, and I will demonstrate its application to systems across scientific domains. Surprisingly, the core idea of rattling is so general as to apply to equilibrium and nonequilibrium systems alike. (Joint work with Dana Randall.)

      Markov Blanket

      "In statistics and machine learning, when one wants to infer a random variable with a set of variables, usually a subset is enough, and other variables are useless. Such a subset that contains all the useful information is called a Markov blanket. If a Markov blanket is minimal, meaning that it cannot drop any variable without losing information, it is called a Markov boundary. Identifying a Markov blanket or a Markov boundary helps to extract useful features. The terms of Markov blanket and Markov boundary were coined by Judea Pearl in 1988. A Markov blanket can be constituted by a set of Markov chains." - Wikipedia.