Anjin
I've started working on a project I've spent a lot of time thinking about the last year or so: a goal-oriented "exercise" manager. I'm calling it Anjin, a nod to the navigator character in Shogun, which I've been watching recently. (Fun fact: The first episode is called "Anjin", which can translate to "Pilot"). I'm also using it as a testing bed for some ideas I've had about how to structure projects and code, so it's a bit of a playground as well.
I'm building Anjin to solve a problem I've had for a long time: I have a lot of goals and projects that I want to work on, but I have a hard time breaking them down into actionable steps. I either get lost in the weeds of planning or get overwhelmed by the sheer number of things I could be doing. I'm hoping that Anjin can help me focus on the next step I can take to move towards a goal, without getting bogged down in the details.
The Idea
Anjin defines a few core concepts: Goals, Exercises, and Resources. A Goal is a high-level objective that you want to achieve. An Exercise is a specific action that you can take to move towards that goal. A Resource is a piece of information that could help you complete an exercise. The user adds goals, creates exercises, and pulls in resources to help them complete those exercises.
Goals
Goals are objectives that the user sets for themselves. They can be anything from "Get in shape" to "Learn to play the guitar". Goals can be short or long-term and the user decides when they're complete. I want to make sure these goals are always visible, since they provide context for why the user is doing the exercises.
Exercises
Exercises are specific actions that the user can complete to move towards a goal. For a goal like "Learn to play the guitar", an exercise could be "Practice the G major chord for 15 minutes" and include some instructions for what progressions to practice. They can be marked as complete, which moves them out of the inbox. Later on, I'd like to explore the idea of using completed exercises as a way of looking back at progress made, kinda like an automatically generated journal. When working on an exercise, the user might need to pull in some reference material, a tutorial, or an article covering a relevant concept. This is where resources come in.
Resources
Resources are there to provide context and help while the user is working on an exercise. Right now, I'm just supporting "articles" with a title, description, and content, but there's a lot of room for expansion here, by adding links, images, videos, files, etc. While the user works on an exercise, the right half of the screen is dedicated to resource management. The user should be able to quickly find and pull the resources they might need, as well as adding new ones on the fly. Resources don't live in any sort of hierarchy, but can be attached to multiple exercises.
I'm avoiding calling this a goal or project tracker, since that direction tends to send me down rabbit holes, but the basic idea is similar. At its core, Anjin is a tool to define goals and take steps towards them. It's meant to answer the question "What can I do RIGHT NOW to move towards a goal?". That means that there's very little planning ahead involved, and the focus is on how to take a single step forward.
Current Progress
I've been working on this for a few days now and have a basic interface set up for adding goals, exercises, and resources. I'm using my own starter app from last week as a base, which has been a huge help in getting set up. Most of my time on the interface side has been spent on the Inbox view, where the user can:
- Browse current exercises
- Add a new new exercise
- Select an exercise
- Add a new resource for the exercise
- View resources attached to the exercise
- Mark the exercise as complete
The Inbox, showing an article generated by an LLM
The only ways to add resources right now are manually via a form or by prompting an LLM to generate an article on a topic. There's lots of room for expansion here and the interface is set up to support many different types of resources.
I spent a bit of time setting up some basic data fetching/management so I can set up interfaces fairly quickly by hooking the data up. This should make it easier to try out different UI/UX ideas and see what works best.
The other screens, like the view of a particular goal and the list of all resources are there, but in a very basic half-baked state. Since the inbox is the most interactive view, I figured it would be the best place to put my focus. Other views will be more about displaying information, so they can be a bit more static.
Next Steps
Anjin is the first project in this series that I'm going to roll over into next week. It's in a barely-usable state at the moment so my goal for the next week is to finish the core views and deploy it, so I can use the hosted version instead of my local one. That means I need to:
- Improve resource management for an exercise (searching, adding, removing)
- Make the goal and resource views more usable
- Allow adding at least notes to an exercise, so there's a record of what was done
There's a lot of additional features that could be added like:
- Supporting different resource types
- Adding attachments/outputs to exercises, or specifying certain attached resources as exercise outputs
- Automatically generating exercises for a goal
- Building pipelines to automatically generate or attach resources to exercises
- Using vector embeddings to find relevant resources for an exercise based on resource descriptions
- Viewing goal progress over time and supporting things like streaks
It also struck me that the workflow of Anjin is similar to the ways that LLMs are being used to tackle larger tasks, in that they need to gather enough context before they can generate a useful response. It might be interesting to explore how a similar interface could be used for delegating tasks to an LLM, where the user pulls in relevant resources and the LLM generates a response. Ultimately, the system might automatically collect relevant resources (or request them) and the user would be in a more managerial role.
For now though, I want to keep it simple and work on getting a small-but-functional vertical slice finished. The main threat to any project like this is feature creep, so I want to keep the scope small and achievable. Anjin is also very much a personal and person-oriented project, so I'm going to keep the focus there.
Wrapping Up
Anjin wasn't the only thing I worked on this week. I continued to learn more about iOS development and spun up an app that authenticates with Plaid for fetching bank account data. I also built out a few patterns in Anjin for data management. I think they could be applied for any Next.js app that's meant to support other clients, like mobile apps. Like I mentioned earlier, Anjin is serving as a testing bed for some of these ideas, so I can bring that knowledge to future projects.
I'm building Anjin for myself but, if I build it right, it might be useful for others as well. I'm excited to see where it goes and how it evolves over time. Hopefully, by next week, I'll be able to use Anjin to help build Anjin, which is a fun meta loop to get into.
See you next week!