When I sat down to write this article documenting my year-long journey of making Prvctice, my DIY operating system, a thought came over me: why did this project take so long? Fourteen months. I've been making apps for almost two decades, and this project took me almost fourteen months. Shouldn't I have some idea by now if anyone will ever see this or play with it? What will people say? As much as we want to try to make development be an exact science, software is social.

At the beginning of this project, I viewed software purely as a tool. That's probably what piqued my interest in its development in the first place, I've always been interested in the tool makers as much as the interpreters. The first iteration of Prvctice was for my own research. I was working on a book and buried in an avalanche of random notes and scattered bookmarks. I applied my own research methods and took some initial bets that largely define project to this day.

I knew that hallucinations of any kind would not be acceptable. The amount of time to check the app's work would make my life impossible so I knew building something to generate content or ideas was off the table. ChatGPT 4o had just come out and the emergence of tools, particularly web search, opened a lot of possibilities for me. I didn't have to worry as much about hallucinations, I could find verified sources. The model just had to be the connective tissue.

Call it a Hunch

The first obstacle to overcome was tuning the model to be kind of a snob. Not because I admire that trait, but because I've been an artist and researcher for twenty years, I don't need recommendations from a top 100 list off of Reddit. I didn't have capabilities or money to train a model, I didn't own a library of pdfs I could feed it, but I thought "maybe" the models had already seen the books I was interested in… Call it a hunch.

I created a set of instructions that served as a system of taste for the model. I made a list of influential artists and theorists and assigned different groups to different sections. These were not assigned as recommendations but as unique knowledge graphs. The result was that when I asked Prvctice to recommend some movies I wasn't getting answers from a general POV. Soon, it was surfacing so many films I had never heard of. For a moment, I thought the revolution was here.

I had control over my work in a way I hadn't in years, and held a sense of pride in figuring out my own solution. While the sense of accomplishment was real I learned that it's no fun to make something and keep it to yourself. Is a tool any good if no one else wants to use it?

I set out to make an open source project that could be easy to setup, but open enough to allow people to inject their own ideas. Prvctice for me was a research tool, for others it could be whatever they wanted. At the time, chat apps felt like they were in competition to make the most generic experience possible, (something I do not feel as of today), so I made it my mission to cram as many opinions that could fit and start a conversation.

This goal felt impossible almost immediately. The models were improving seemingly by the week, the bar for great software design was racing at a breakneck pace. Every time I felt like I had accomplished my goal I'd see a hundred projects that made my app feel quaint. This was the low point of the process. It felt like everything I was saying was boring and dull compared to so many futuristic projects out there. A creative dysmorphia set in. I needed to go try other things for a while.

Failing Upward

Early on I noticed the failing upward effects of AI on a product. Abandoned features that didn't quite work before would magically click without touching the code. While I was taking a break the models could use tools better, their memory expanded, and the introduction of agents completely transformed what I thought was possible.

Overnight I had somehow become the bottleneck to progress; every challenge I gave them was accomplished in minutes. The models could reason so I didn't have to feed a long and complex set of rules anymore. I could explain my concept directly and the model could embrace it with depth and understanding. I could try things I would never bother to attempt because of time constraints. I was going to bed one night and saw a video of someone testing out this hand tracking demo and I immediately got out of bed and opened my laptop. In less than ten minutes Claude Code had helped me implement it in the app. This is the pace things started moving. It felt like you could just speak things into existence.

I got into a groove building Prvctice again. Thanks to Claude Code and projects like the GSD plugin my workflow is now something like this: In the morning I start by writing a short brief. Then Claude and I discuss and plan out each phase of the project for about an hour. These are deep question and research sessions that help document and instruct every action and direction of the work. After our discussion I'll leave and go on about my day while Claude finishes the project. When I come back we go through a long review process where I have Claude explain all their work to me and then walk through a manual verification checklist for each phase. I used to immediately jump back into the code but these models can get so much work done at once I feel as if I need to take the time to fully absorb the changes before I proceed. Before I go to bed I setup another project and let it run while I'm sleeping. When I get up I review the work and start the next milestone.

These stages used to feel like a drag, but this is where all the breakthroughs have happened so far. Having the model teach me what it did allows me to also to poke holes in their process which has created far stronger patterns and better code. This workflow's biggest benefit has been allowing my brain to rest. Having the ability to walk away from the computer allows me to avoid burn out and be far more critical of the work instead of trying to push through to the finish line.

After a month of blowing through every idea in my head I realized that I just had a lot of cool but random stuff. The first thing I tackled was optimizing the tools. Prvctice was still an app focused on chat, search, and note taking, all of which used various tools for every request. I built a recursive learning system that kept track of tool usage and ranked them based on user preferences. For example, if you use Prvctice more to search for books than film, over time the library search tools will be prioritized over youtube search when you ask for a recommendation.

I then had to confront the UX of it all. I had made so many different ways to interact with Prvctice: gestures, voice, video games, notes, chat, media, etc. I needed a more elegant solution instead of having to hardwire in every interaction for every method. I came up with an intent coordinator that abstracts the interaction layer allowing for easier plug-and-play interaction methods. Every element in the app can be given an id and a list of ways it can interact with other elements. This makes it easier to quickly hook up things such as game and midi controllers, greatly improving accessibility.

Finally now I had a clear vision: a customizable application that allows you to interact however you want, and a recursive learning system that adapts to your workflow. I got to the end of the project and said to myself, "So what is it? A tricked out chat app? Is that all this amounted to?" I had survived the journey and still had no clue if I was adding of note to the conversation. I whispered to myself, "hello darkness my old friend…"

Built with the SDK

In the Eye of the Beholder

I was caught up in the trap of trying to define purpose. The constant cycle of "What should software be?" was not helping my focus. I had let discussion deviate from the process. This wasn't some misguided auteur fantasy in search of the perfect statement. Like in everything else, the role of author is not to make statements it's to be a medium between idea and audience. The purpose of this project was to not tell people what it should be but to allow people to make it what they want. And the idea of Prvctice as an operating system was born.

Using Prvctice is a new creative experience me. All the system apps were made using the built-in app SDK. I made a couple hundred prototypes using internal tools, if I liked one I would pull it out and work on it myself, testing and adding features and styles. Thanks to the recursive learning system Prvctice also makes apps based on how you use them. If you like playing synths a lot, Prvctice might make you a drum machine. The study timer and calendar apps are ones that Prvctice made on their own.

Recognizing the model agents in the creation of this moment is important I think. I hope that humans make something cool with this project, but in reality I know that my main audience will most likely be LLMs. That's why documenting and mapping out each part of the project started to feel like designing a new version of the app altogether. I still spent a great deal of time explaining my concepts, dreams and aspirations in those markdown files. The only difference between the app and the documentation to me is in the eye of the beholder. Sharing the app feels like sharing one of my artworks with friends. Sharing the code feels like sharing one my stories with the model.

Soon you'll be able to connect more of your accounts, more of the apps will help each other. The skills system will be better at identifying how to reduce five actions into one. I've been talking to other artists about having them design their own tools, musicians donate custom sound libraries, etc. I think I ended up with a pretty fun canvas to express my ideas. As good as that feels, the real fun starts when others make Prvctice their own.

I spent so many years trying to define what an app was I guess it's only natural that it would lead me to make an app that can produce its own. That feels like a nice place to put a bow on this. It's strange, there's always a feeling finality to a project launch even though it's the start of a new beginning. Anything that is new today is a product of years of sacrificing ones time, effort, money, and dreams. It would mean much more to me if I was able to help someone get their idea off the ground than to recoup my losses. My hope for the future is that dreams don't have to require sacrifice. I hope that software can play a role in reducing one's burdens. I pray that Tech commits to that future.

-Tim Moore
Thank you - Tim Moore '26 Thank you - Tim Moore '26