Decoy Space

HomeShimiHouse SittingNotu

Notu - My Life In One App

Do you often berate yourself for wanting to be productive, but not quite having the mental energy for making that first step of getting up off the sofa? Do you fantasise about how great your life could be if you could just actually bring yourself to do the things which you want (and need) to do with your life?

If not, congratulations, you're a freak of nature. For everyone else, let me share my journey from how I started there, to where I am now...using a single app which I use to control my chores, to-do lists, connections, fitness, finances, and meals. (Yeah, I was probably a bit premature in judging anyone else a freak wasn't I?)

The Problem

I remember first noticing my lazy tendencies at university. I was not doing a stressful course (Popular Music, lol), but I think it was the combination of needing to go to classes and write papers on top of all the new responsibilities that living away from home brings like do the shopping, cook and clean which kind of overwhelmed me a little. I fell into a terrible cycle of pissing around on my laptop, often not going to bed until 4am, when my sheer exhaustion finally overpowered my desire to not walk the 4 steps from my desk to my bed. There was this feeling that I couldn't go to bed yet, because I hadn't done enough with the day, but at the same time, was in totally the wrong headspace at that moment actually to actually do anything worthwhile.

I remember some days before getting up in the morning just grabbing my phone and jotting down a bunch of things which, if done, would make today a good feel like I'd achieved something. I'd buy myself some cookies as a reward for when I'd done them all, but the trouble is, as boss of myself, I have very high expectations, but am also very light on disciplinary action when I don't live up to them. After I'd done a couple of the items on my list, I definitely deserved at least a bit of a taste of one of those cookies, right? And while I'm eating that delicious cookie, I might as well sit down and watch a video. What's that? The video lasted longer than the cookie? What's the harm in just having a bit of the 2nd cookie while I finish off the video? You see where this is going. Before I knew it, I'd yet again wasted away the past few hours both watching and eating crap.

I think we all see the problem here, it's clearly the cookies. They're what sidetracked me back down my regular old delinquent path. So, I decided lets not bother with the cookies, lets just get these things done, simply for the sake of getting them done. This actually worked pretty well, I had a bit of streak going with it, but before long, I had a day planned full of things that I wanted to get done, and life would get in the way. Whether it was some piece of coursework that I'd previously forgotten about, a friend coming round unexpectedly to go do something, or even just my mum giving me a call to see how things are going. My carefully laid plans felt like they'd been jeopardised.

I think it's worth reading that last sentence again to let it sink in just how ridiculous that mindset is. I was mad about the people in my life or the course which I was paying money to study getting in the way of me taking steps to get some small odd-jobs done. That's where we're at though, and more often than not, these things would just throw off my entire streak, so I ended up yoyo-ing between doing nothing, and everything.

Out of desperation, I even tried setting myself tasks, and having punishments attached for if I didn't do them. This was my full draconian dictator era with myself. That one lasted about 2 days until the workers rose up and the dictator was no more.

I think I spent probably 5+ years cycling through all kinds of variations of the above approaches to my own productivity. I'd tried drawing weekly schedules for myself. I very briefly tried bullet journalling, but found the indexing was a poor attempt to work around the limitations of paper. I even tried where each task I completed contributed some monetary value towards me saving up for some kind of treat I'd been looking forward to. I reached a point eventually where I just kind of accepted that sometimes I'd be the version of myself that I like, and other days I wouldn't be getting out of bed until 4pm.

The Startings of a Breakthrough

Back in 2020, in a burst of motivation, I'd been doing some work on Shimi in its original form for a little while and was interested in possibly turning it into a business. I went to this business mentoring thing and one of the things that my mentor suggested was that as you're developing the business it's good to have some way of keeping track of the people you've been dealing with, so you can follow up with them, get ideas from them, etc. I took this to mean "build myself a small desktop note-taking app where I can add various tags against each note" which I imaginatively named: Note Tagger. Nothing special, I'm sure that there's loads of these that you can find already, but for some reason I decided I was going to spend just a couple of days building my own. It was super rudimentary, in one panel you could create your own tags, and in another you could add your own notes, to each note adding one or more of the tags. You could then filter notes based on which tags they had.

I was using this pretty happily for a little while, when I then had the thought that maybe something like this could be good for keeping thoughts organised on my homelife too. So I simply added a second database which would be for all my personal stuff. After a while, I decided that each day I wanted my personal app to greet me in the morning with the same set of morning routine tasks that I want to get done in order to start the day right. So this meant building a plugin architecture to my note taker. Then, I'd been finding that I wanted to get better at tracking my water-intake and also improving my productivity at work (I did NOT feel like a great employee in this period) through tracking how many pomodoros of work I'd done each day. For this, I added my metadata tables, MetaDef which held definitions of what kinds of metadata could be added, and then NoteMetaData & TagMetaData tables, for actually storing the metadata. In the end, my database schema looked like this:

Note Tagger Schema

I'm honestly kind of surprised I even managed to find the project for this thing, but it's still sitting on my computer. Sadly all the data for it has gone, so I quickly fired it up and after remembering how to navigate the horrendously unintuitive interface, added some demo data to give an idea of just how shabby this thing looked.

Note Tagger Screen

The Breakthrough Continues

Despite how rudimentary my Note Tagger was, I did notice it actually helping me in staying more consistent in my productivity. Quite often, if I thought of something, I wouldn't have the energy to do it in the moment, so I'd write a little note for myself to help me remember to do it later. Having this together with a basic list of daily routines for myself actually worked surprisingly well. The routines provided a basic outline of what I should be doing each day, and then into the gaps in the middle I'd slot stuff which I'd told myself I wanted to get done. Things were going great!

However, it wasn't too long before I started noticing some cracks and areas where things could be improved. These included:

  • Each tag could only have one other tag as parent, with my shimi organising this started becoming annoying because, for example, person X is someone who has been helping me a lot with testing stuff, but is also someone who could be a great knowledge resource in some particular area I was keen on exploring. I'd been trying to keep my contacts organised by the type of relationship I had with them, and this was clearly not supporting that well.
  • Note Tagger was built in WPF, which I was honestly sick of. It's such an overly verbose and (in my opinion) clumsy technology for designing UIs. I'd started playing around with some of the Javascript UI frameworks of the time. Vue in particular had lured me in and I was looking forward to getting my teeth sunk into it with Electron to make my new desktop app.
  • The layout was very static. Tags on top-left, Metadata definitions bottom left, and notes take up the rest of the space.
  • As the information I stored became more complex, just being able to store metadata against notes or tags was increasingly feeling limited. If I'm adding a tag to a note, that results in a NoteTag record. That intersection of note and tag is generally inferring something about the state of the information in that note, why couldn't I store data at that intersection?
  • Searching was pretty limited and not very friendly. This honestly could have been improved within the application, but I was already sold on doing a rewrite.

These were the improvements I had in mind for the next version of my note tagger, and after a few late nights, I had something which broadly met my needs. The schema had just a few changes in it:

Notat Schema

The most visible differences are that there are a couple of more tables, and that 'MetaDef' has been changed to 'Attr'. With this second change, the 3 main pillars of the system were now Notes, Tags & Attrs, or Notat for short, the name of the new version.

After the initial build was done, I continued doing bits of work here and there on this newer version and very quickly it totally outstripped the original version. It had its own basic query language built into it, so you could now do searches like "#Task AND #Shimi AND text LIKE '%UI%', which would be converted into regular SQL to find the notes that you were looking for. Like the previous one, it supported functional extensibility through the support of plugin scripts, these could not only add new functionality on startup and when fetching/saving notes, they could also change the overall layout of the application, allowing me to add multiple tabs. Notes could have their own custom defined actions so I could define that different screens which were designed for showing me notes that met different criteria, and would have their own context-specific actions available to me when I right-clicked on notes within them.

As the capability of this thing continued to grow, so did my usage of it. I began integrating other areas of my life into it. Soon I had something which would auto-generate workouts for me, something where I could specify news outlets, youtubers etc. that I was interested in, and it would go fetch me content from them with my own filtering rules applied. I had the important people in my life set up with their birthdays and other important events, which it would then automatically remind me in advance to plan stuff for them. I ended up having a separate notat for managing meals, where I could store a bunch of recipes in it, allowing me to easily plan meals and have a shopping list auto-generated for me. I had another separate notat set up for managing my finances, where I could grab CSV extracts from my online banking, import them in and have it help me categorise and track my income vs outgoings.

I still actually have all of the data from this thing, but annoyingly when I tried to actually run it on my life organiser data, everything would crash, and I didn't have the time or patience to do a full investigation what was going on. Even trying to do a fresh install of my npm dependencies was resulting in a big list of errors. Luckily though, I did manage to get things working with the meal planner data that I had set up for it, so you can see roughly how far along things had come along from the Note Tagger...

Notat Food Screen

Third Time's the Charm

It's worth remembering that with all these aspects of my life integrated into this application, it was still a desktop application. This was fine during COVID when no-one had anywhere to go each day anyway, but as things started returning to normal, I increasingly found that the desktop aspect of my life organiser was becoming increasingly irritating. As a workaround I began building small html pages which the application could export to my dropbox folder as a way for me to quickly and easily be able to access them on my phone. This was particularly helpful for using the fitness workouts or shopping lists that the application had generated for me.

The fact that I did have all of these different parts of my life together in one place was one of the biggest draws of this project for me. I dislike how we typically have a calendar app, then a note taking app, a to-do list somewhere else, a separate journal, plus a contacts list, and various others all scattered around. Especially as our lives are rarely so neatly bordered like that. Our calendars should be linked to our contacts, since we're doing events with other people (presumably). Same for our journals, most of the times that I actually have something to write it's because I've been out doing stuff with people. The days that I stay home are nice, but they're rarely eventful experiences. If I want to write down my thoughts somewhere, it's usually influenced by the things that I've either been doing or been meaning to do...why not have them related to each other? Having everything stored as just a combination of notes, tags and attributes sometimes made things a slightly cumbersome from a UI perspective, but in my view it was well worth it for this magic connectivity that it afforded me.

However, the flip side of this connectivity is that it became increasingly difficult to keep things organised. I was starting to write increasingly convoluted queries for certain screens to get exactly the notes that I actually wanted, without the various others that were also fairly similarly tagged. This was the challenge that I'd started running into. I needed a way to have my notes all in the same system, so they could be potentially linkable to each other, but still have some way of keeping them separate if needed. It felt like a hard problem to get right, and one which actually took a fair amount of tinkering with to get properly right.

Another issue which I'd had is that for the most part, I kept this secret sauce of my life a fairly closely guarded secret. As personal projects go, this felt fairly up there on the autistic spectrum. But I have several friends that I showed it to, and was honestly kind of surprised when each of them said that they needed something like this in their lives. I don't have any intention of selling this thing, but I'd like to be able to share it with others. A key barrier to that was that behind the scenes I had loads of custom code which was getting it to do all my various automations, without that code it would honestly be a pretty unimpressive tool. I needed to find a way to bring some of that customisation out into the front-end. I eventually came to realise that the key thing holding me back here was the use of the Attr tables for holding my metadata. They could support simple data like text, numbers, dates & booleans...I didn't want them supporting more complex data structures because I didn't want to be free-handing JSON through the UI. What I came to realise though was that really the only reason I was adding attributes to my notes was so that some kind of system interaction or automation could happen with them. In the previous iteration I'd added support for data to be stored against notetags, what if I went further with that idea and each tag could say that each notetag linked to it has some kind of well structured data stored against it, which the tag knows how to supply a UI for interacting with? So for example, if you add the Scheduled tag to a note, the NoteTag that's linking the Scheduled tag to your note automatically gets set up with a data object containing information like when this thing is, how long it's going to last, is an exact time known, etc. That way the data I store could be as complex as I like behind the scenes and I get a lot more control providing a pleasing UI in the front. I wish I could say I had this revelation before starting development of my third version...it was in fact depressingly late on, but I realised instantly just how important it would be in solving my problems that I instantly had to commit to doing countless rewrites necessary to get them in there. It has since been an absolute gamechanger for this app.

Yet another gripe that I'd begun having was that I'd begun wanting to link one note to another, whereas under the current model notes could only link to tags. Say for example that I'm working on some project and want to record my thoughts for new ideas related to it as they come up. I could create a new tag which I link my project note to, and then make sure that all of my independent thoughts also use that tag, but that doesn't represent the actual order of things that these thoughts are part of the larger whole that is the overall project. The solution for this problem seemed like one which should have been staring me in the face the entire time....Notes don't just link to Tags, Notes ARE Tags. Every time you're creating a note, you have the option for specifying a tag name, if you do, then it automatically results in the creation of a tag record which shares the same ID as the note, this way other notes can reference that tag, which will in turn also be referencing the note.

The final change which I wanted to make was a relatively small one in terms of overall functionality of the application, but has been a cool nice-to-have is support for a note's text to have little components integrated into it. This came about because I wanted to be able to make notes which could also serve as checklists, where as I'm editing the note I could add some text, then a list of numerous different items, then if I wanted, some more text. Once I'd saved my changes, whenever I viewed the note it would then display little checkboxes next to each of the items which I could tick and have it automatically save the change.

Overall, there were a LOT of changes going into the 3rd version of this, and so you'd expect the structure of this thing to be starting to get fairly complex, right? Surprisingly not, if anything, the data structure had actually now actually become significantly more simple...

Notu Schema

With the dropping of the Attr tables, notat no longer made much sense as a name, though in a way it is still notat v2. As such, I named it 'notu' (as in "note-to-self" ;) ).

The biggest change here, aside from the removal of the Attr tables, is the addition of the Space table. This was my effort to tackle the problem I mentioned above around trying to manage how separated notes stayed from each other. The basic idea is that each note is saved within a particular space, when you're searching for notes, you can either search within a particular space, or across all spaces. Each space would be designed to solve a particular type of problem, so for example I have a Tasks space for managing my achievements, a Calendar space for managing my events, a People space for keeping track of the people in my life, I also have various others, plus a Common space. While the other spaces are all theoretically optional, the Common space must always get installed and contains many useful, general purpose tags such as Finished, Cancelled, Pinned, Scheduled, Disabled, Thought, Info, etc... By default each space would save notes within itself, so for example you create a new task note, it's going to live within the tasks space, and the tasks UI is only going to search for task notes from within the Tasks space. However, several of the spaces have a button which allows you to toggle the value of the useCommonSpace field. If this is set to true for the Tasks space for example, then all task notes will instead be saved within the Common space. If you do the same for the Calendar space, then suddenly you can have notes which represent both a task and an event.

Another fairly sizeable change that happened with this version was the ditching of Vue in favour of React. The reason for this (other than me being more familiar with React now) was that if I wanted it to be supportable as a mobile app then React Native has a much better name for itself than any Vue options. However, currently the app is existing as a WebApp which I set up using Next, I wish I could tell you the reasoning behind this. I think I liked the idea that I could easily access it from either phone or laptop after all these years of using it on just laptop, but as I've begun actually using it, its become increasingly clear that the laptop support just isn't really needed, while the need for internet connection just becomes kind of annoying every time I'm riding on the underground and want to write some quick notes to myself. As such, the current focus for me is getting the app switched over from web to app frontend (big piece of work!), and PostgresQL to SQLite backend (very small piece of work, has mostly all been already done).

And That's All...For Now

So that's pretty much where I'm at so far. This page definitely needs some more screenshots of the actual application in its various stages. I think I've done at best a half job of selling the idea of this thing so far. Ultimately though, this is something where if people want to use it then I'll happily let them have it at no cost, if they don't though, then that's no bother to me. This thing has been INCREDIBLY helpful for keeping myself organised and on top of things. After years of trial and error I finally managed to find an organisation system that clicks with how my brain works. If it clicks with anyone else's too then that would obviously be great.

Hopefully more updates to come on this page soon.