13k ARR for Obsidian Sync

13k ARR from an app that implements syncing for Obsidian!

This service allows users to swiftly capture ideas and notes on various platforms, including web, mobile, and browser extensions, with features to highlight text, share links, and paste images or files. It is built to seamlessly integrate with Obsidian MD software, employing a dedicated plugin for syncing and processing notes, thus enhancing the overall note-taking experience for users who require an efficient and organized system for managing their digital information.

I use obsidian for all my notes and sure syncing between devices is a pain but I’ve got dropbox for desktop at least. Not sure how they do iOS syncing but getting 13k ARR seems a bit mad for this. Maybe they got in early before the native Obsidian syncing and had some good marketing to get people onboard.

I wouldn’t hold much hope in that app being worth the 50k asking price long term though as surely the native Obsidian sync would be a huge competitor like the way Apple takes out a lot of third party apps with native features. And in this case I would prefer that to be the case, just so Obsidian can go on being a great app. Maybe their syncing takes away from development of the main app by the small dev team there but I like the way the app is and with extensions you can rely on the community to build features that you might want.

Either way, shows you can make a fair bit by developing obvious and not

Read Full Post...
May 2, 2024 · 2 min

Discovery of France (book)

I picked up this book and started to read it without really expecting myself to get far. I started it on a whim where it got recommended through some random blog post I came across that I cannot even remember now where that was. I downloaded the kindle preview and started the first chapter. Soon thereafter I found myself enjoying it enough that I just kept on going and kept reading. Usually these kinds of books I find myself having to push through but this I just didn’t really have to at all. Maybe just the way it was written was easy enough for me to understand and read that it was just easy to keep going. Even then, its not a normal book for me to read. Its not like anything else what I’ve read recently or further in the past apart from one book, The History of Thailand which I picked up before an upcoming trip there. Against that, here I just did not have any reason to read it.

I did wonder about this book and what I don’t know is if these characteristics are unique to France or if they are mirrored in many other nations. For sure England industrialised before France but I don’t know were the closed off nature of the French people unique to it. Many people barely left the area they were born in and the dialects of each place meant they practically had a unique language per small region (pays) but was this just a uniquely French thing

Read Full Post...
May 1, 2024 · 11 min

How big things get done (book)

We take for a given that big projects will go over budget and over time. The core idea of this book is that does not need to be the case. The main reasons given for projects not going according to plan are: bad plans in the first place, making changes as they go along and bad estimations on how long the plans will take to implement. Most of these can be overcome by proper planning.

The core premise is make sure you plan out properly beforehand. Consider the scope of the project and why you want this to be done. If you properly consider the “why” then you won’t want to change it half way through, avoiding one of the largest cause of delays to large projects. The example project for this sort of thing is a kitchen renovation project gone wrong. The owners ended up spending millions on what they planned to be a kitchen renovation but turned into a full home remodel. The main reason was when a complication, such as rotten floorboards, came up they increased the scope instead of trying to find ways for reducing the scope or keeping the roadblock to a minimum

Bad estimations also often derail projects as it gives people a false sense of security in knowing how long the project might take and cost. Oftentimes the estimate is deliberately lowballed to make it more palatable for whoever is paying for the project. The big idea for estimating is to use reference estimation. Instead of thinking of your project as

Read Full Post...
May 1, 2024 · 2 min

Snowball (book)

I read this ages ago as a teenager and I didn’t like it as much as other people seemed to. It just portrayed this ultra capitalist guy playing the game so much better than everyone else he amassed an insane amount of wealth. And all for what because I don’t know. I’m not against capitalism just I think maybe that wealth could be put to good use rather than just shares of Apple. Start companies and take some bets rather than hoarding it at the top of the market.

But anyway the part that stuck with me was when he had taken over a struggling newspaper. I don’t have a memory for these sort of details but he bought out the company and put in money so it could turn around. If you know anything about Buffett you know how much he loved newspapers as they were the original monopoly. If you had the best distribution in a city then everyone would buy that paper and advertisers would then follow. You’d end up with the entire market as who wants the second best paper. Anyway in this case the workers were not really happy at the beginning and I remember some sort of strikes but in the end the company was turned around and he made some fantastical amount of money. All great and all that. But then it came time for him to collect his chips and take his winnings. He kept the paper around but profits went to him so he could invest elsewhere. I

Read Full Post...
May 1, 2024 · 3 min

Green Transition Should Be Years Not Decades

Sounds a bit like an excuse making process to me but according to JP Morgan via the Financial Times today, the green transition away from fossil fuels to renewable energy is going to take decades or generations so we shouldn’t get our hopes up. They cite things like the way places like Scotland set ambitious goals to reduce emissions by 75% by 2030 but have already given up. So according to them we should just let the natural process take its place and not worry too much about this being done anytime soon.

But I disagree. We could make this transition last a lot shorter than that. I think the is down to countries not really wanting to make this transition in the first place. It sounds like they’re just making excuses as to why its all been so slow in the first place. Most renewables take capital to start but are much cheaper in the long run so they payoff is there, it just takes a while for them to come around. So if we could see the full price of keeping coal power plants or diesel cars around we’d see how the full price isn’t that much at all but rather would offer much better returns. Especially to society at large the payoff longer term is much more than monetary terms alone. You’ve the large obvious things like EVs and renewable energy, but there’s also other things like improved cycling infrastructure that have whole other benefits that aren’t easily measured in a price tag

Read Full Post...
April 19, 2024 · 2 min

Software Quality

This is some findings from some google research into quality of software. They developed a theory of software quality which involved four types of quality which influence each other. The first two, process and code, are what developers usually think first about software quality. They focus on the health of the codebase and the engineering systems around it. The second two, system and product, are higher level metrics focused in on by executives and product managers.

To make use of this research and improve the software quality of a system, first decide what kind of quality you want to improve

Process Quality

These are the processes around development. So things like planning, testing and code reviews. Metrics focusing on these processes are good predictors of overall software quality.

Code Quality

Maintainability. How easy is it to make changes to the code. That is the main aspect of code quality. So here focus on ease of understanding the code and making sure that one change doesn’t require lots of other small changes.

This affects system and product quality the most as if it’s easy to make changes then you can fix defects much more easily.

System Quality

This involves the reliability, performance and defect rates of the system. It’s difficult to know if these are improving as the only way for an executive to measure it is to see how many outages the system has. If there hasn’t been many then it’s hard to know if there is a bigger or smaller risk of outages. For this reason, code quality metrics are

Read Full Post...
January 11, 2024 · 2 min

Go chi router jwtauth

I’ve been using the golang chi router in one of my projects recently and for the most part it’s been great. I’ve just a simple router with a few routes so I’ve not pushed it to any advanced use cases but it seems simple enough and extensible enough it should get a long way there.

The latest project I’ve needed to do was add Authentication using JWT to two routes. This seemed simple and straightforward as they provide a default JWT middleware implementation called github.com/go-chi/jwtauth. It’s simple and straightforward so easy to get going and I was able to get it working accepting a single token relatively easily.

However as I said above, I needed to accept multiple tokens. Maybe the library could be modified in some way to accept multiple tokens but it doesn’t make it easy and to me did not look possible for the work it would require. This is especially unfortunate as there is a thing in JSON Web land called JSON Web Key Sets which allow you to accept multiple tokens. There is a PR to accept JWK Sets but this has had no activity lately so it’s not clear if it’ll happen any time soon: https://github.com/go-chi/jwtauth/pull/71

Instead in the end I created my own middleware to read a JWK Set using the same underlying library as jwtauth: github.com/lestrrat-go/jwx. As I said above, chi makes it easy to create middleware and the lestrrat-go library makes it easy to accept JWT Sets.

This can be done in a two step process. The first is to parse

Read Full Post...
January 11, 2024 · 2 min

Phones

I broke my phone a few days ago and it’s in getting repaired. However I can say that the days I’ve been without my phone have been great. I haven’t had to do anything with it and I’ve been just not looking at the screen all day. Sure there’s been trouble especially when I got logged out of work stuff that required 2fa but for the vast majority it’s much better than having a phone. Even just when first waking up or on lunch I don’t need to be looking at a phone the whole time there.

I tried looking up to see if I could make a feature phone work but I don’t think so. Really the only things I need a phone for are mostly the apps on it so buying one of those probably wouldn’t work at all. There’s also other “dumb” phones that try fill this niche like lite phone but those are very expensive for what it is.

In the end however I need to improve how I use my phone and control when I use it. Make sure I’m using it as a tool rather than reaching for it day to day when I get bored or uncomfortable. The same for simple times like eating lunch or whatever, instead of carrying it around all day just don’t bother bringing it and embrace the boredom a bit. Just do nothing instead.

January 11, 2024 · 2 min

Rotating JWK

JSON Web Keys are what is used to generate and verify JSON Web Tokens. Here I will explain how best to rotate JWKs.

If you’re coming from zero like me and building something that uses JWT to verify a request is what it should be then the first thing you’ll do is use a JWK to verify a JWT. Using the github.com/lestrrat-go/jwx library in go it can be done like this:

parsedKey, err := jwk.ParseKey(key)
parsedToken, err := jwt.ParseString(token, jwt.WithKey(jwa.HS256, parsedKey))

However now any time you change the key you’re going to run into problems where it will be a hard break. So now the old token will stop working straight away and the new token will be accepted without any overlap period between. This is a problem for APIs as now you’re going to have a whole load of failed requests before you can get the new token to each of them. Sure this may be okay if you think you can roll it out quickly enough or you can add some extra code to the clients but this extra complexity is not really what we want.

Instead it’s better to use JSON Web Key Sets (JWK Sets) which are arrays of JWKs like the example below. You can see we have two keys with different key (k) and key ID (kid) values to differentiate them. Any keys in the set will be accepted so now when you are rolling a token, you can just update the set to have both the new and old JWKs. Once you’re finished updating

Read Full Post...
January 11, 2024 · 2 min

Exponential Backoff and Jitter

If retries aren’t randomly distributed over the retry window, a small perturbation (e.g., a network blip) can cause retry ripples to schedule at the same time, which can then amplify themselves

Using exponential backoff is great because if you keep retrying over and over without limits you’re eventually going to break something. Exponential backoff increases this retry period exponentially until you eventually give up. Jitter takes this one step further by adding a random difference between the retries so that if all requests fail at once, they are not all retried together after a short blip. Without jitter you may cause a ripple where all requests are retried at once causing further issues. for example a network being down for 1 second will cause all requests to pile up and be retried at once, then again and again, snowballing until a simple network error causes a wider server outage

https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/ https://sre.google/sre-book/addressing-cascading-failures/

January 5, 2024 · 1 min