100%, I'm following a similar approach to you with yet another notes app solely for my own use.
Have you written more about your personal project anywhere?
One thing I only realised once I started building my own tools, is that you become - from day one - an unmatched world-class expert in using that tool. This seems obvious and inconsequential on the face of it, but how many pieces of software do you use where you can say with 100% certainty that you know every single thing about it?
Every feature, every shortcut, how it all works internally...
It's only when you use something self-crafted that you realise what this actually means. If it's a tool that you use for work or productivity - you can become exceptionally productive with it due to this from-day-one "total mastery".
This compounds if you iterate. Using the tool daily and feeding back in little fixes and optimisations as you go. The tool grows with you and molds to your use of it over time.
It's obvious that the tool is going to be well suited to your needs if you built it - but it was less obvious to me ahead of time what benefits the side effect of "total mastery" would also bring.
For me, my notes app is now used as my personal knowledge base, project management tool, todo list, daily planning tool and for journalling. Because I built it, I'm extremely effective at using it - and it's lean and fast - only with the features that I know I need.
In addition to being a very fulfilling project - it has created a degree of leverage and efficiency that I didn't expect!
My conclusion is that we should all experiment more with creating our own tools.
No, I've had plans to create a blog to write about it or make a YouTube video, but haven't come to it yet.
> One thing I only realised once I started building my own tools, is that you become - from day one - an unmatched world-class expert in using that tool
This is something that I've also realized - a lot of times when we interact with software we kinda just fly by its UI to accomplish a goal, not paying much attention to its secondary features, options, quirks, etc - But when you write your own software, you have a map of everything in your head, and you don't have to guess what exactly a button does, how it does it or where you need to go to do that.
Absolutely! It's quite a unique experience. When I started out it felt like I might just be wasting time and reinventing the wheel but in retrospect it was absolutely a good time investment!
I have a convenience tool I made for myself, but shared with my coworkers. I deeply regret sharing it because nobody knows how to use it effectively
Like with the spreadsheets I did to manage stuff. If I don’t use it at least weekly it quickly becomes less and less useful.
But also they mostly served their purpose and it is time to use new one. Not everything has to be used forever.
Hey same!
What inspired you? Anything you would be willing to share about it?
For me, I used a different notes app which I liked, and wanted to learn a new language/framework so I wrote a new backend for mine, and it just kinda spiraled.
The next thing I wanna do is add a CalDav interface so I can store events in it, and interact with them constantly with everything else I do.
More recently Obsidian inspired me in terms of showing me what a non-enshittified, open/portable format note-taking experience could be like. And the beauty of simple Markdown notes!
Through the Obsidian community I discovered the concepts of Zettelkasten / Second Brain etc. and was further convinced of the usefulness of regular note taking and storing/synthesising of reference knowledge.
But I found Obsidian slightly mismatched with my requirements. Primarily because there was certain functionality I needed which can only be achieved with plugins, but I didn't consider their plugin security model to be sufficient enough for storing my most confidential data - even with everything being local files. (That and the lack of open source was enough to make me nervous).
My app is written in pure Javascript, heavy use of web components, running in Electron. No Node.js (apart from what Electron is precompiled with) - so no third-party dependencies as part of my code, and Electron is heavily locked down. I have a lightweight build step using Esbuild (a single rust binary).
Being 100% native JS - no frameworks - and quite lightweight, the app is indistinguishable from a native macOS app in terms of responsiveness! Knowing that may not always be the case, I'm also eyeing up Tauri as a potential alternative GUI "wrapper".
As a .NET developer by day I would have liked to have built it in MAUI but found that to be quite lacking for my purposes.
I've started to write a blog article about it with some screenshots - I"ll eventually get around to publishing it!!
How about you? What did you write your backend in and did that escalate into the front-end too?
The CalDav idea is very interesting... you've got me thinking about that.
What kind of functionality were you looking for? I've found that once I controlled my notes, the amount of things I wanted to dump into it kept growing.
> How about you? What did you write your backend in and did that escalate into the front-end too?
I started using TiddlyWiki, and really like their approach to content (small notes, composable content, the "river" of notes as you click through links). You can add metadata (KV style) to the notes, which you can use in the markdown, which is quite powerful. The tool is meant to be "in browser" and you're supposed to save the whole HTML source when you make an edit. For me, I wanted a traditional CRUD interface to a server. They support that, but the developer isn't really focusing on it. So I wrote my own because I had a few weeks and wanted to play more with Golang.
My only gripe, and the reason I'm considering writing a new front end (which will be a big learning activity for me), is that TW doesn't support 'lazy loading'. very well, so if you have a massive amount of notes, it gets a little wonky. I discovered the issues with this when on plane WiFi and getting issues with overwriting instead of editing notes.
But once I had a CRUD API for my notes... I started going crazy. I can import photos, and link to them (pretty basic) but I can also push emails, calendar events, etc. I set up a browser plugin that lets me automatically take notes on any webpage, and adds tags/metadata to the note. The limit is now the front-end which is where I'll probably spend 2024...
I also had the idea of integrating with HomeAssistant, so the device's history was viewable in a 'note' about the device (dynamically generated from a template instead of static text from DB). Possibly with camera events as their own entry... Lots of things are possible once you control where the data comes from.
Ever so often I think about trying again, which I might in fact do if Keep ever becomes paid or stops working well or anything like that, or battery-free Bluetooth gets cheap and common and I decide to integrate inventory tracking features.
> Ever so often I think about trying again,
I think if you enjoy the process and the result is useful to you, then it's definitely worth trying again!
I don't know about you, but I always learn a hell of a lot through my personal projects too. They've almost always been a good investment of time for me.
Especially getting things to both sync across devices and load instantly on Android is definitely not trivial.
Would you be willing to describe how it works / record a video of how you use it? But maybe that goes against your last sentence:
> My exclusive, differential, unique characteristic against the world, my joker card.
?
I guess the idea is that you integrated all the apps with each other, such that you can create an event from a text message, forward an email to a Signal contact, this kind of things?
I quickly write scripts to automate things I do several times, but I didn't go as far as integrating all my scripts into a single one. Having things decoupled reduces the maintenance burden, such that I'm not sure I'd want to go that way either.
I'll definitely do it in the near future and post it here on HN.
> My exclusive, differential, unique characteristic against the world, my joker card.
In the sense that, if one day money becomes short, I could extract a few SAAS out of it and make some money or even sell it.
> I guess the idea is that you integrated all the apps with each other, such that you can create an event from a text message, forward an email to a Signal contact, this kind of things?
Yes, the main app has standalone apps, where each app integrates with each other whenever possible, like listing contacts in the email app, and one of the apps is "Flow", where you can create IFTTTs between apps.
Looking forward to your post on HN!
People are impressed when looking at it. A handful of them asked for the config. Don't think any one ever got used to it.
It's already shown on the screenshot, but I'll get a better one soon.
1. Go to the Microsoft/Google developer console with your work account and create an "internal app" for personal use 2. Generate a set of oauth2 creds under the app 3. Use a program like mbsync or offlineimap to sync your mail down to a maildir. Iirc mbsync was more reliable but required a shim script to convert oauth2 creds to an api token. 4. Point your email client to the mail-dir.
I had this set up when I used gmail at work, but AIUI outlook should work roughly the same.
There's a ton of blog posts out there of people setting this up, unfortunately too many variations to have "one true" guide, so sorta have to pull from several places.
- Password manager - Finances - Contacts - Account (Backup, Restore, private keys, etc) - Authenticator (OTP, TOTP) - Email - Photos - Movies (2 parts, one is an IMDB like manager and the other is a Netflix homepage look alike for viewing content) - Flashcards - Link tracker
And I have the following apps in the development pipeline:
- Calendar - Drive - Notes - URL Shortener - RSS Reader - Tasks - Books - Musics & Podcasts - Timelines
It started just as an MySQL database that I used to track my expenses and budget, later I started also storing passwords in it, quickly I realized that I needed a user interface, then I slapped a bootstrap theme on it (this was back when Angular 1 was all the rage), then it went through many iterations as across the years and the current one started back in 2020, it uses VueJS 3 and used to use ant design, but I had to create my own UI library to accommodate the sheer complexity of the custom UI needed. It runs on a raspberry pi with docker.
:)
Once you got away from social apps, it was clearly feature creep. That was my indicator for when there was probably a better alternative app for accomplishing the app’s original purpose, but it was often too late to switch due to the network effect.
“Any application that can be written in JavaScript, will eventually be written in JavaScript.”
Here's a stab (pun intended) at one for LLMs:
"Any application that can be written by an LLM, will eventually be written by an LLM."
[[[foo(x) for x in y] for y in bar_vec if baz(y)] for bar_vec in bar_mat if bar_vec != []]I mean, it's not the clearest thing to read but labeling it horrible seems to be a judgement call that's unwarranted. And as software developers, we should create an environment that's less hostile to people who write things in ways we wouldn't.
And honestly, that set of list comprehensions has a bit of a lispy functional vibe, which could quite frankly be applauded in certain contexts.
for bar_vec in bar_mat:
if bar_vec != []:
for y in bar_vec:
if baz(y):
for x in y:
foo(x)
Seeing it written out here, the example looks nice. In real code with more complexity, it takes longer for me to write it, and it usually takes up a lot more space than this. It bugs me how much space it takes up for something that is one idea in my head (Foo all the baz things in bar_vec).But if there is anyone coming after me, I would write it in this style for their sake, because this style is easier to change.
[foo(x) for x in nonempty(bar_mat)]
Mostly this is because I live in fear of ruff's complexity warning, C901.Also, another way to write this (which results in a flattened list) is:
[foo(x) for bar_vec in bar_mat for y in bar_vec if baz(y) for x in y]I've never been particularly interested in "software for one person" but I've shared lots of working but not great code(years old from before type annotations that hasn't been touched much since, written a hurry, etc), and faced some embarrassment.
If I was actually attached to specific details of the style, like "Yeah it crashes on some JSON input, but I don't care, it's only meant to handle stuff from this other thing I made" I might not really like sharing it as much.
git remote add origin …
git pushMy greatest regret these days is how often it feels like I lack the time to do such projects -- but that of course is a cop out on my end! The hard part is only getting started and being consistent; you don't need to do that much on a week to week basis to get to somewhere really meaningful after a few years.
I do occasionally make scripts like you mention, they're super fun, handy, and almost impossible to share unless someone else has the same niche knowledge and requirements.
The code is a mess so I haven't shared, but it is something that makes me more productive every day.
There's a beauty to engineering something having yourself as the target user, and no one else. I'm 100% convinced this project single-handedly keep my mental wellbeing in check, and it provides me with a constant source of hopefulness and happiness to the future - that no company/salary could ever offer me. My exclusive, differential, unique characteristic against the world, my joker card.