We built Linear(https://linear.app) to be offline first from the beginning. It’s kind of hard to do later.
It’s architected in a way that client syncs the data, all the actions happen locally and then delta packets are synced back to the server. This also makes the app really fast because the client doesn’t have to wait for the network to complete the action.