9 ms·
I have a lot of experience with this having developed a personal finance app that is local-first: https://actualbudget.com/ https://actualbudget.com/ Having al
by jlongster 6y ago
I have a lot of experience with this having developed a personal finance app that is local-first: https://actualbudget.com/ https://actualbudget.com/
Having all of the data local is a superpower. It changes how you build the app, and you just never have to worry about the network. Everything is fast _by default_. It's great.
The app uses CRDTs to sync and it's unlocked a lot of powerful stuff like a robust undo system. We also offer end-to-end encryption.
On the negative side, over time I've stepped back a little from being truly local-first. The mobile app used to connect to the desktop by pointing the phone's camera at a QR code on desktop, and it would literally sync peer-to-peer. Maintaining that was nightmare and users had endless networking problems. Our network infrastructure unfortunately is not built for truly peer-to-peer apps. Maybe ipv6 will help, I don't know. My app now has a "centralized" server but it's really just a backup that gives some convenience - the app is still totally local but syncs through a single server. You can work on it for weeks offline and then sync up. In the future when p2p is ready, I'll be ready for it.
- cw 6y agoI cannot imagine my life without Actual. Bookkeeping is such a joy with this tool. I've used Acutal for more than a year to manage the budget for two companies and my personal finances. Highly highly recommend.
- jlongster 6y agoWow, that's really great to hear! There's so much more I'm excited to build into it, so it will only get better. Something I'm most excited about is custom reports. Having all your data local is going to make those super powerful.
- phkahler 6y agoWho mentioned Actual? Is this a pair of advertising comments?
- MrZander 6y agoThis looks great, do you have a newsletter? I'd love to know when you implement bank syncing. That's the only thing keeping me from signing up right now.
- jlongster 6y agoThanks! Sort of do but unfortunately you can only subscribe to it right now by subscribing to a trial. If you email help@actualbudget.com I'll subscribe your email manually.
- wry_discontent 6y agoI've seen some ways you can hack this functionality together with email alerts for any > $0 transaction. Does Actual expose any api stuff?
- jlongster 6y agoyep! https://actualbudget.com/docs/developers/using-the-API/ https://actualbudget.com/docs/developers/using-the-API/
- Larrikin 6y agoThis looks great and similar to YNAB. Do you feel you offer anything over YNAB vs just being local first.
- jlongster 6y agoRight now, the differences are all in the details (income categories, no weird credit card handling, etc), and there are many of them. But instead I'll focus on what is to come soon: * A custom rules engine (to be released in a few weeks). You'll be able to write a list of conditions for matching transactions, and a list of actions to apply when matched. The system will automatically encode what it learns as rules (apply category X to payee Y) so you can see what it's doing and adjust. * Multiple budget types. Zero-based budgeting is cool, but Actual is just a tool for you. If you want, you can use a simple report based that just shows income vs expense. You choose the type you want adapt it to your lifestyle. * Custom reports. This is really where having all your data local is incredible. You'll be able to write queries into your data, process it, and render any kind of visualization.
- boarnoah 6y ago> You'll be able to write queries into your data, process it, and render any kind of visualization. Now that sounds very cool. Out of curiosity, do you have any plans to handle things that cannot be local first (for example with YNAB I like the Plaid Integration to pull transactions data out of banking). Something like that for your application would need to clear through your own API right?
- jlongster 6y agoYep, bank syncing is going to launch by the end of the year. It's tough. I've wrestled with this for over a year. Bank syncing has to come from my server, which means by doing so you are giving us access to your transactions. No banking provider has any way for clients to contact them directly. I think this is possible with the right encryption, but nobody is working on it. I've given this feedback to Plaid but they don't care. The majority of people need the convenience of syncing though. So I plan to launch it, and it'll go through my server, and I plan to communicate clearly the privacy that you are giving up by doing so.
- avrionov 6y agoThe app looks great. What technologies did you use to develop it?
- ignoramous 6y agoThe app's UI is consistent across all platforms. Such delightful colours and design. What an impressive execution! GP, I'm curious about the frontend stack as well.
- jlongster 6y ago@avrionov @ignoramous Thank you! The frontend for desktop/browser React, and Electron is used to create standalone apps. I don't love Electron, and if you don't want it a browser version is available too: https://app.actualbudget.com/ https://app.actualbudget.com/ The mobile app uses React Native and has a custom UI just for mobile, but it shares styles and a few small components with web. I don't believe that you can build one UI that works well on both desktop and mobile. All platforms share the backend code which runs in a separate process/thread. On mobile, I use https://github.com/JaneaSystems/nodejs-mobile https://github.com/JaneaSystems/nodejs-mobile to run the JS backend locally. That's mostly it. No UI frameworks are used. I love UI/UX design so I built it from the ground up to be as usable and performant as possible.
- matheusmoreira 6y ago> Maintaining that was nightmare and users had endless networking problems. Our network infrastructure unfortunately is not built for truly peer-to-peer apps What causes these problems? NAT?
- jlongster 6y agoYep, that and public routers blocking types of protocols. There was a phase where I switched to using mDNS (https://en.wikipedia.org/wiki/Multicast_DNS https://en.wikipedia.org/wiki/Multicast_DNS) so you didn't need a QR code, which discovers other devices. Turns out most public wifis (coffee shops) flat out block it.
- bitz-please 6y agoWhat protocol were you using before that? Had you looked at using webrtc?
- sebmellen 6y agoWebRTC is a horribly fantastic mess of complexity which is very hard to work with without using a third-party provider like https://simplewebrtc.com https://simplewebrtc.com. Your head will be swimming with acronyms like ICE, TURN, STUN, etc. before you even understand the basic signalling mechanisms.
- ignoramous 6y agoFun! https://tailscale.com/blog/how-nat-traversal-works/ https://tailscale.com/blog/how-nat-traversal-works/ For JavaScript, see: https://github.com/feross/simple-peer https://github.com/feross/simple-peer
- sebmellen 6y agoFeross makes really great libraries. WebTorrent, which is basically an extension of simple-peer is fantastic. See https://webtorrent.io https://webtorrent.io.
- jacobwilliamroy 6y agoMaybe you don't need to use the QR code to establish a connection? Instead you could just use the QR code to transmit whatever data the phone might need from the computer. If it's just a finance app, surely the data would be small enough to fit into a qr code, maybe show a series of codes if the data is really big?
- jlongster 6y agoFun idea! Just looked it up, 3kb is the max data in a QR code, and data _definitely_ gets bigger than that. If you import 100 transactions it'll probably be bigger than that. Also the syncing mechanism requires a two-way connection: they will communicate changes back and forth until they are synced up.
- clarkmoody 6y agoDid you consider spinning up a Tor hidden service on the desktop app and sending the onion address and credentials via QR to the mobile app?
- aidenn0 6y agoI have 15 years of my personal budget in a double-entry system; is the import API sufficient that I could import that data?
- oriel 6y agoI'm curious whats your definition of "ready". I'm doing a similar quasi-local-first project with p2p. Ive been toying with libp2p[1], which underpins a number of distributed storage solutions, and originated from ipfs. > [1]: https://libp2p.io https://libp2p.io