Design of concepts for mobile, desktop and web applications. We do the hard work of thinking through the process, so your users can pretend it's all just pretty pictures.


Specializing in native development for Android, iOS and macOS in Java, Kotlin, Swift, Objective-C, and C++. We focus on readability, maintainability, and clean architecture.


Practical strategies to address the architectural spaghetti that arises from a growing codebase. We can evaluate the state of your project and suggest ways to move forward.

We believe in well-crafted applications that developers can maintain and expand, and whose every line of code ultimately exists to serve the user.

Design is not what it looks like

What software users see and experience should be the amalgamation of the design efforts invested at every level of the development process. The design of the software architecture and network interfaces affect the perception of an application because they are the building blocks of its flows and user interfaces.

Design and development are most effective when they collaborate. Designing a user flow up front informs how the feature fits in the architecture and how it should be implemented by the developers. Conversely, the technical limitations faced by developers inform what is possible for the design of the flows.

Layering functionality helps guide the users, emphasizing what functions are most desirable and providing clear feedback as they progress through the task at hand.


  1. well suited to the task at hand
  2. defining characteristics of software products made by apt apps

It's called writing code for a reason

Writing code is not much different from authoring words. It’s a way to communicate, to the device so it knows how to perform its tasks, but also to current and future developers so they can understand the intent, effectively provide feedback, efficiently make required bug fixes, and eventually expand it as more features are added.

Functional groups within a software solution must have clear API boundaries. One key to success and maintainability is to own those boundaries and carefully reserve the use of third-party technologies as implementation details that can be replaced if need be.

Code exists to solve user problems, and it is most successful when crafted with a minimalist approach. Every line of code you do not write is a line of code you will never have to read, debug or refactor.

Not sure what happened?

Let’s face it, software projects often grow organically with time and resources conspiring to reduce the effectiveness of the codebase over time. Too much code and not enough architecture? Developers need time to read existing code. Lack of consistency? Designers are needed to provide guidelines to fit every new feature within a cohesive user interface.

For long term maintainability and stability, this can be addressed. Whether a clean-up of technical debt is needed or it’s time to take a step back to prepare for future growth, we can look at your codebase and make sound, practical suggestions and recommendations. We can work closely with your developers and designers to gather the necessary understanding and make sure that everyone is on board.








Easy is hard. Make it happen.

With over 20 years of experience in user interface design and software development, we have a strong understanding of all levels of the development process. Our applications have been used in industries such as health, education, transportation, pre-press and desktop publishing. Whether your product is targeting the enterprise or the end user, we bring the attention to detail that ultimately shows through in the big picture.