Back to top
The Toto app on a Set called Job Applications, shown with its mobile and desktop interfaces

Toto

An application — fully developed from back-end, front-end, and UI/UX design — that helps people manage their day-to-day tasks and assess their progress over time.

Team

Individual

Duration

4 weeks

Skills Utilized

Full Stack Programming
UX Design
Interaction Design

A new pursuit.

After finishing my time at d1g1t Inc, I became extremely interested in learning more about how the different components of a fully-functioning, database-backed web application come together.

Therefore, I set out to explore the world of full-stack web development, combining my passion for UX Design and an eagerness to further my skills in web development.

What I made

I developed a todo app, focusing particularly on styling the UI according to different data states, as well as ensuring that all possible interactions were accounted for.

Through my time practicing UX Design, what I have realized is that Interaction Design plays a significant role in the overall flow and experience someone has within a product. After all, with no interaction, there is no experience, right?

Especially when it comes to displaying data, the time it takes to show information to a user is not perfectly reliable; as a designer, it is my responsibility to account for these micro-transitionary moments, and ensure that they are well designed.

Why a todo app?

I wanted to develop an application that had the potential to be of use to me right off the bat. By being back on a job search, I realized that a todo app could help me keep track of my tasks as I looked for my next opportunity.

Additionally, developing the todo app would give me the chance to develop an application of manageable complexity for its minimum viable product, which would allow me to focus on delivering the dynamically-served components of the full-stack application in tandem with pushing the boundaries of the app's UI and experience.

The Toto app on a Set called Job Applications, shown with its mobile and desktop interfaces

Product Inspiration.

Monday.com's task management interface

Monday.com

Having used Monday.com for managing tasks over time before, one of my favorite features was how progress towards completing all tasks is displayed.

A To Do List template on Notion

Notion

Invisibility of UI inputs such as changing page name and adding a new table row, as well as under-the-hood processes like automatically saving user data, were things I wanted to bring into my app.

A To Do List made with the functionality of Apple's Notes app

Apple Notes

Adding new todo/list items is as seamless as adding a new line, and I wanted to bring this flow and experience to the greatest extent possible in my app.

Project Plan.

In order to monitor progress and assess completion, I broke up my efforts into phases.

Phase 1: Implement minimum viable features

I first wanted to have a minimum viable product which would have foundational features such as toggling todo items and adding/removing them. This was done according to the following process:

  • Set up API request routes and database interaction logic (back-end)
  • Translated low- and high-fidelity designs into UI elements in code
  • Styled the UI elements according to the designs

Phase 2: Cyclically develop new features

After the minimum viable product features were rolled out, I created a process through which to develop subsequent features:

  • Carry out a back-end development (either a revision or an addition)
  • Ideate design of the feature in sketches/Figma
  • Implement front-end styling and core structure on front-end (React)
A diagram explaining my project development process, which involved a waterfall-style approach for developing the back-end and front-end, and then an iterative cyclical approach for subsequent additions and revisions

Setting up the API and back-end.

For those who aren't as familiar with tech jargon: think of an API like a waiter at a restaurant. The waiter receives your order and sends that order to the chef. The chef prepares your order and sends it back to you through the waiter. In this interaction, the waiter is the intermediary between you and the chef — and that is the role of an API between a user and the server/database.

For an application to be more than just a UI or front-end and work with a database, a back-end is necessary to develop. Moreover, defining an API allows requests to be made from the user to the database, and the responses resulting from those requests are dealt with by the back-end.

Before front-end code (UI, styling, etc.) was written, I built out what would be needed for the minimum viable functionality of my app.

A restaurant metaphor explaining the role an API plays between a user and a server or database

Translating low-fi designs to hi-fi.

While much of my efforts were focused on the programming itself, as a UX/UI Designer, it is natural for me to consider interface possibilities through low- and high-fidelity designs. Depending on the complexity of features and components of the UI, I took designs to different levels of fidelity before building them out with code.

Low fidelity designs

I used sketches to get a better sense of how the main UIs of the app (i.e todo list, "Add New Todo" component, sets) could look.

This also involved the consideration of different design possibilities. For instance, to help with making a decision regarding how to show a running list of todos, I ran a quick A/B Test through my partner to understand what UI would better suit their needs and information processing.

Low fidelity sketches with annotations
An artistic depiction of a textbox's different states and components, which came from the Toto design system

High fidelity designs

When experimenting with components with a rich set of variants and layout possibilities (i.e text fields), I developed them to a higher fidelity in Figma to physically toy around with their properties.

Styling the UI on the front-end.

After exploring design possibilities, I would use React to first place the elements and components I would need for the UI to be functional. Then, once the core structure of the UI was in place and it could communicate with the database and back-end, I would work on styling the elements to match my designs.

For the high-fidelity designs, I played with Figma's new Dev Mode to get exact CSS attributes and values, helping me implement the UI exactly how it was designed.

Figma's Dev Mode toggle switch

Going into Phase 2.

The completion of Phase 1 left me with a minimum viable product of my todo app, which allowed me to

Of course, I would seize opportunities to improve what I had built when they came along. For every new feature of the app, I went through the following process to nail down the work to be done:

A Set user interface element, a profile picture, and photo selection buttons, which are features in the Toto app

Following the process of Phase 2 development, I implemented additional functionality to the app, including

  • Sets, which allow a user to classify todo items
  • A running list of all todo items, allowing a user to monitor completion across Sets
  • The ability to add, remove, and modify Profile pictures

Todo, Toh-doh... Toto!

As I was developing the app, I would sillily refer to it as Toh-doh in passing to my partner. I soon saw this as an opportunity to add a playful and cute branding image to my productivity app.

Derived from the checkmark which demarcates completed tasks, I devised a logo to ground my project as a standalone application.

Animation of the Toto logo, showing how the form of the dog was derived from a checkmark

On top of this, I created a style guide to help keep the look, feel, and branding of my app consistent.

Toto style guide, showing the font sizes and colors used

The final product.

The Sets interface of the Toto app
The single-Set interface of the Todo app

View a Set's Todos

Clicking on a Set allows you to see the list of todo items assigned to it.

You can change its status or task text, as well as add/remove any item you wish.

Survey all your Todos

In addition to viewing the todo items that belong to a single Set, you can view a running list of all your todo items across Sets.

This gives you the highest-level perspective of overall task completion.

The Sets interface of the Toto app, which allows the user to see all todo items across Sets
Profile page of the Toto app

Make your Profile your own

Adding your personal touch is easy with the ability to adjust the Profile picture that is shown throughout the app.

The small details matter.

Skeleton loaders

Research by Neilsen Norman Group tells us that among other benefits, skeleton loaders — which take the place of content area until it is ready to be shown — help reduce perceived loading times.

Animation of the skeleton loader appearance on the Toto app

"Invisible" inputs

To reduce clunkiness for what is a form-heavy UI, inputs are styled to maintain the suggestion of interactivity while being less distracting.

Animation of the invisible inputs of the Toto app, showing how their styles change when the user interacts with them

Accessibility in mind

Inputs styled to maintain visibility and brand consistency at all levels and methods of interaction.

Animation showing the accessibility affordances of the Toto app

Disabled states when loading content

To prevent errors from popping up on slower networks, the intermediate states between interactions are limited but styled to make this less overt.

Animation of how input disabled states are visually shown on the Toto app

Advanced component dynamism

Inspired particularly by ChatGPT's main textbox, I sought to replicate all details of its implementation and expand my knowledge of what is possible with inputs.

Animation of the expanding functionality of textboxes in the Toto app

Functionality at every size.

From mobile to desktop, the visual and functional experience of Toto is optimized.

The Toto app on a Set called Job Applications, shown with its mobile and desktop interfaces

Publishing the website.

Status:

Active

The site is hosted on Render here. Feel free to create an account (just remember the email and password 🤗) and you can use the app for yourself!

If you notice any bugs or would like to suggest improvements, please contact me!

Reflection.

This project taught me so much about the foundational procedures that go into a database-backed web service. From using tokens to authenticate users, to facilitating database requests and serving their responses, to lots of work with React to handle all the visual states, I learned the processes and technologies for developing a MERN-stack application.

Lessons learned

Quality Assurance is critical

It is known in the developer community that much of one's time goes into debugging — ironing out the problems that result from erroneous code — rather than the code itself. I certainly found this to be the case; however, it is also critical for design to meet development, and assess the aesthetics of the final product as well. Having witnessed this at my previous company, and now being able to empathize with the process of quality assuring features, I know how to better validate the end product of development.

Understanding of web processes = more detailed designs

As I have mentioned a couple times before, there are lots of micro details and moments which need to be accounted for when dealing with database-backed web services. From loading animations, to limiting user interaction and preventing improper behavior, to showing different content depending on a user's data, a designer should be aware of how these states should be aesthetically shown, and when in the interaction flow they may be required.

Next steps

Toto is far from over!

Improving the mobile display

Fitting the content — especially for web apps which can size down to mobile devices — is always something to be wary of. I'd love to explore the ways in which the UI design can better support viewing content on these smaller screens.

Implementing more robust authentication

Who doesn't like being more secure online? I am intrigued by the potential integration of services such as Auth0 into my app, which allow users to login with providers like Google and Facebook.