Firefly III: A free and open-source finance manager
firefly-iii.org
firefly-iii.org
For example, take a trip to Walmart where you purchased things that cross like 3 or 4 categories. With a system relying on importing data from your bank, a couple days after the transaction posts you'll have this generic assignment to Walmart, and you must then try and remember how to split it (eg between Groceries, Clothes, Technology etc). Instead, I have my transaction manually sorted in my YNAB app before I've even left the store.
I'm still waiting for the next step in these apps, where I connect my account to Walmart/Amazon/Target/etc and it can do item/category breakdowns automatically based on the actual line items in the order.
Otherwise, I am with you. I use a much simpler system without categories but I manually enter every dollar I spend right when I spend it.
Amazon order confirmation emails used to list the products. Now they don't. Some other company might use that information, so the user can't have it.
edit Amazon does provide an Orders API that at a glance seems like it would work for this case, but there's probably some underlying restrictions I am unaware of. https://docs.developer.amazonservices.com/en_US/orders-2013-...
The original idea was to make it hard (or at least with some friction) to create transactions. This also excluded any way of importing data. That way you feel your transactions twice. Once when you spend the money, and twice when you have to enter it.
Making you finances tangible is a very good way of spending less money. Importing all your shit just gives GIGO but with nicer graphics.
https://docs.firefly-iii.org/firefly-iii/about-firefly-iii/w...
I will admit that I caved under pressure and built the Firefly III Data Importer:
For my partner and me, I keep an OpenOffice spreadsheet were I enter all expenses, so we know who owes whom how much. Also, I scan all my receipts and they are automatically renamed and moved based on patterns (paperless-ng).
I agree to your argument, seeing all your expenses in this way helps keeping a connection to how much is spend. I yet need to combine my two systems with firefly.
Do you scan (presumably photo with phone?) and then autodetermine the cost and maybe even some sub-category breakouts?
Once the transaction data is available, it is trivial to auto categorize it and create dashboards. I’ve blogged about my own process/tools for that here [2]
* Run the data-importer as a separate container. Takes maybe 20 minutes to configure correctly if you already know docker and docker-compose.
* Download the transactions as CSVs from each of my 5 or so credit card and bank accounts that get regular use.
* Upload them through the data-importer. It lets you configure and save settings for each CSV format. I took five minutes to set that up the first time I imported CSVs and just keeping using the same settings.
I upload all of my transactions once a month and it takes about an hour to download them, import them, and categorize all of them (I also have a bunch of rules to auto-categorize, but there are inevitably a dozen or so bespoke transactions).
I've found that any of the solutions built on top of syncing backends like Plaid inevitably have issues: duplicates, missing txs, debit/credit mixed up. I even built my own custom Plaid-to-Firefly syncer at one point and found the data quality was very mixed, even when all my accounts are at major US banks. The data-importer takes some more up-front work, but it's more secure, way more predictable, and generally a solved problem.
Sure “everyone does it”, but most banks have disclaimers in their terms of service that if you lose money because your password was compromised through password sharing they aren’t liable for that loss.
I instead built a series of playwright scripts to automate signing into my bank accounts and downloading the CV, then importing (to lunch money, but I might take a look at this later as an option).
https://www.bloomberg.com/professional/blog/europes-new-api-...
There's no reason (beyond the general dysfunction of our legislature) that the US couldn't pass a similar law. Failing to do so is holding back out banking industry and making us all dramatically less secure.
We desperately need to mandate banks provide this kind of access. It's absolutely ludicrous that I don't have a way to give various services READ-ONLY access to my bank account information. It seems intolerable to me that I would have to give WRITE access to Plaid for them to enable someone to categorize my transactions.
The two issues I have had:
1. Have to reauthorize bank connection, but that's Plaid's issue I guess.
2. Payee names are all over the place because it's often the merchant name. I used to try and fix these and only have a single page payee for each entity, but gave up.
I have two banks and one CC that use an OAuth type system now.
> We regret to inform you that temporarily Salt Edge does not provide its services on the USA market.
in theory interactive brokers could link in my accounts but since I'm based in Switzerland this doesn't work. Sad. :)
I switched from a decade old spreadsheet to YNAB. Then it went subscription and online only. It relied on the Adobe Air runtime which stopped working in macOS several years ago (32-bit only).
I haven’t looked at firefly yet, but I really want something that allows me to forecast expenses, and realize them as they occur and automatically adjust forecasts accordingly.
It's on GitHub: https://github.com/banesto/YNAB4-64bit/blob/main/install
I could've sworn several years ago it was perfectly possible to use your sign-in credentials, then immediately change them, because it basically needed an authorization token, but then worked fine.
Now it doesn't. I work for a company with a Plaid integration and if the bank so much as requires any kind of 2FA, you just can't use it at all anymore.
If Plaid is every compromised in a way that leads to a loss of your funds in your account (probably unlikely), your bank likely has no legal requirement to make you whole for that, if you shared your password with Plaid.
I just don’t think you should share your bank password with any external entity.
I suppose something like Firefly could create a module (or even sell one) that is preconfigured, and updated, with the best method for each bank - download csv, api, scrape, etc. In fact, they could charge for that service and fund development.
Do people just give up on granularity, or how does it work?
YNAB offers the ability to split transactions over different categories so categorizing an Amazon purchase is trivial.
In the case of physical receipts you can enter them before they are synced from your credit card and YNAB does a great job matching uncleared transactions back with the cleared ones.
Paypal purchases always have the merchant attached to them, so you should be able to differentiate them regardless of the budgeting app you use.
(Personally, rather than fetch, I save OFX or QFX files from each US financial institution periodically. So that I can import them now into GnuCash, and also potentially import them into some other tool maybe decades into the future.)
I've been using (and manual-entering transactions in) Firefly-III for over 2 years. It's a good, old piece of software, but isn't scalable to our "high-frequency / busy / real-time" banking needs.
I've experimented with hacks like reading from bank transaction mails, using Tasker (Android) to read transaction SMSs, but alas the setup is cumbersome and not reliable.
The problem here is ultimately on the platform your app runs on, not the app itself. If web servers are hard to spin up, so too are web apps.
Having Docker and other "enthusiast" methods of running software makes it less accessible. Having a web-stack as the goto method of writing software doesn't make sense if it limits the audience that would gain value from it.
I say this as someone who professionally maintains a web application that comes with a Windows installer, macOS traditional installation and a Linux RPM. All with desktop icons and it being pretty invisible to the user that it is a web application aside from the HTML-looking UI style.
The software is for personal finance, it isn't for a niche that makes the install/access method particuarly sane. If it were software for managing a cluster of X-thing or something ... maybe.
I'm curious; how do you implement this (I assume you do not use Electron)?
Wouldn't a PWA (installed PWA) make the web app integrate the way you say with desktop icons, separate window, drag & drop etc?
The binary is built for those OS and installed via installers idiomatic for those systems.
It defaults to use a local sqlite backend but could use any rdbms. Simple really.
Slapping a web server into a local desktop install and calling it good basically removes the vast majority of benefits of it being a web app.
But you can also launch it with "--serve" options to access it through a web browser and expose it on a network, with sqlite local disk database.
You can also launch with "--db=postgresql://postgres@dbhost:5432/postgres?sslmode=disable" to run it against a postgresdb.
A bit of work on the "how it runs" aspects can give great flexibility and usability for single-user cases.
Edit: not a shill, just happy. :) The killer feature for me is the event-driven budgeting: you load in your expenses and note when they occur, and MoneyWell figures out how much to allocate to the corresponding envelope automatically. So nice. Anyone else know of another PF system that does that?
Started building my own so I'm interested to see what he says.
The dashboard is a bit configurable, ok, so I can cut things I do not want but a default with just balance/all translations scrollable, the latest visible/stock option with mean price paid and actual value, optional widgets for other financial means (raw materials and their value, currencies etc) would be far nicer than a big load of graphs...
Ease to add transactions is not much a thing since at least personally all must come from external sources like bank exports in ofx/qif/sv etc with manually just tagging, description etc and a merging feature for upcoming transactions when the date is due to merge them with the actual new entry from the bank, so better import/export (i.e. woob integration for banks who do not offer exporting) would be very nice.
Generally graphs are nice but data in tabular form + operations on such tables are much more useful, especially if can be done with a programming language like "hey, that's the table, now you can generate new ones with some query language and lisp/python/ as you wish, just add a "programmed entry" and you get input in sv form for code, SQL-alike for query DSL, output view as a table for sv data or graph or raw at your option.
Surely the last paragraph might not appeal end users, but a user who self-host likely use/can use/dream such features...
We have a one click installer for kubernetes over at https://kubesail.com/template/erulabs/firefly-iii if anyone is interested in self hosting this!
Anyway, I gave Firefly III a try and now I'm very happy that I did. I think those extra features that seemed too complicated at first are proving to be pretty useful.
Also, what I was struggeling with (and not only in Firefly, but all budgeting apps) was the sometimes significant delay between the purchase and the bank transaction. In addition there is the issue with split transactions from imported transactions. Basically manual data entry is too much work and automated data entry is too faulty. I roughly sketched a process in my head which could solve that.
It basically disinguishes between manually added information and bank information. Both is stored and then combined to one transaction. This closes the gap between the bank domain and the "user domain".
1. Let the importer bring in all the bank transactions with the date, the transaction is executed. Display on the right.
2. On the left there are manually entered transactions, possibly with split transactions.
3. Now you make matches.
4. If there is no manual entry, you can add some information like splitting the transaction, add a date you did the purchase, etc. by clicking on the bank transaction.
5. All the above could be automated by rules. Like making matches, giving it a pretty name, assigning a category, etc.
6. Last step: Manually sign off all the matches. If a time period has only signed off transactions it gets a "true" designation otherwise a "preliminary".
Happy to hear about your thoughts on that!
Sure, but that doesn't make it any less of a double-entry bookkeeping system.
> Now I can either create the furniture store as both source and destination account or delete the first entry. Both is equally bad in my opinion.
The first is correct bookkeeping. The second is bad.
Regarding the process you suggest, each step in your workflow is a massive undertaking to build. And it serves exactly one (1) user for whom the workflow fits: you.
It's how I started Firefly III: solving my own problem. So I guess you know what to do ;)
> Sure, but that doesn't make it any less of a double-entry bookkeeping system.
Maybe let me formulate it a bit more diplomatic: It is not what I would expect from a double-entry bookkeeping system. Personally I find one account for each person more intuitive. There may be reasons for not doing this but they are not clear to me yet.
> Regarding the process you suggest, each step in your workflow is a massive undertaking to build. And it serves exactly one (1) user for whom the workflow fits: you.
> It's how I started Firefly III: solving my own problem. So I guess you know what to do ;)
I know that implementing this process is not walk in the park. Please don't see it as a request for you to implement that particular feature because I need it. But for me this would solve an issue I had with all of the personal finance tools. Therefor I wrote down my thoughts, maybe they resonate with someone and it results in a fruitful discussion. Or maybe someone had similar thoughts...
The use of expense and revenue accounts is standard, but I find it surprising that you can't enter a negative amount for a payment. There isn't even a "return" transaction type with a similar effect. That's how I would handle returns in my own accounting software (HLedger): Original payment, $100 from checking (asset) to merchant (expense). Return, $-100 from checking to merchant, with a comment identifying the original transaction. It doesn't make sense to have separate "Furniture Store" expense and "Furniture Store Return" income accounts—that does not provide accurate income & expense reporting. Logically, after the return you have no expense or income related to that purchase.
Of course HLedger, being much less opinionated, doesn't actually care about "source" and "destination" accounts—that's a matter of how you interpret them. IMHO it's far easier to just think of the accounting system as a single directed graph where nodes are accounts and edges are transactions. A "negative" edge is just a transfer in the opposite direction.
This does mean that the income/revenue accounts have negative balances, which can be counter-intuitive, but it makes sense once you learn to think of the income account balances as reflecting changes in the source of money (i.e., $-100 in an "employer" income account means your employer has $100 less because they it to paid your asset account) rather than the amount of income you've received. Likewise, a positive balance in an expense account means that the recipient of that money has more because of your payment, not that you do. Assets and liabilities are your accounts and sum to your net worth; the equity accounts, which I would define to including income and expense accounts, belong to your counterparties, and are relative rather than absolute since they only reflect the transactions which are relevant to you.
> Also, what I was struggeling with (and not only in Firefly, but all budgeting apps) was the sometimes significant delay between the purchase and the bank transaction.
HLedger addresses this by tracking two separate dates for each transaction, with options to choose which one to use for a given report. This can cause some issues with balance assertions which lie between the two dates, though, so I just use a priority system—the date my bank shows is always "right" even if the transaction occurred some days prior. It would be nice to be able to set a date for each account, which would probably fix the balance assertion issue, but then you could have transactions which didn't balance (sum to zero) for certain intervals. (Perhaps this is acceptable as long as the transaction eventually balances?) HLedger, like most other accounting software, also tracks flags for pending and cleared transaction which can be used in reports and queries.
I have been tracking and exporting backups of my finances using Firefly since 2020. I am young, my finances are nothing fancy, they are mostly credit card purchases, my salary, and my rent.
I love the flexibility of personally serving this on a dedicated server. Similar to the other commenter it consumes a lot of my time too. I tried to automate by writing small custom shortcuts in Apple Shortcuts for repeated things like posting a grocery purchase. Firefly has a comprehensive API, I have widgets on my homescreen showing my credit card balances at all times etc.
I like knowing how much I spend on grocery each month, how much I spent clothing last year vs this year, the effect of having a Costco membership. It is fun and I am sure in the next 10 years it will be so much more interesting looking at data from early years.
I am salaried with weekly payout, and so I have a weekly chart for where my money goes on payday (bills/loans/cards/savings), an amortization schedule for each account that allows me to see how extra payments will affect the payoff and interest, and a brainstorming sheet for planning future large purchases (cars, maybe a bigger house one day). I can do pretty much anything with this that I could with Firefly III or a paid solution, but (for me at least) this is less hassle and my data stays between me and Apple's iCloud server; I trust them enough with that basic data to not bother with maintaining and securing a VPS just to balance my budget.
I feel that it muddles storage logic with business logic. If it's an error-detecting raid1 storage system, can't we just use raid1 storage configurations separately from the application?
It also prevents you (from an architectural perspective) to pull money out of thin air. If you create an account with 1000 on it from the start, there has to be a source for that money. That account is hidden and invisible, but will have a balance of -1000. It may look like nothing, but it helps to keep things in check.
"General-ledger accounting" (for lack of a better term) is superior in terms of having a single source of truth, but not very practical for manual accounting since all the transactions are mixed together. The introduction of computers changed all that by making it easy to generate targeted reports from the general ledger.
Open banking data APIs sounds like an easy win for regulators, but probably the Intuit lobby would oppose that.
I was in your position about 3 years ago, and have no regrets going down this path.
Downloading all of the necessary files by hand only takes a couple minutes with a decent password manager. You’ll spend more time (re-)categorizing and running interesting reports, and IME the ledger apps have the best experience in this dimension, although YNAB isn’t bad.
I’ve written asking about it but nothing. It’s pretty annoying because Apple Card is supposed to offer privacy, then they turn around and make the first transaction integration with mint. Wth.
If you need something point and click, or, need a high "wife-acceptance factor," firefly-iii is not a bad choice.
After coming from hledger, I did try firefly, but, stuck with hlegder due to how amazingly powerful it is with nothing but a text input.
Wife acceptance factor tho haha.. we will be fine as long as we never show the beautiful UIs from the YNABs & Fireflys.
We are able to add txns from this UI but I have never used it.
For finance, you need simple and obvious recovery and this just doesn't have it.
I've always used the approach of allocating spending before it's spent. I've not attempted expense tracking. Has anyone got experience with it, and an opinion to share?
> (click on the icons for more information)
then you almost certainly have an unintuitive design and know it, but instead of fixing it you just doubled down on it.
Comically the message worked and I tapped on them.
I forgive these kinds of design mistakes in OSS projects because I’d rather have stuff that works than beautiful sites.
Of course, I appreciate nice design too.
At my previous job, Symphony[0] chat was set up to launch at startup for all employees. I remember when the icons I call "Pyramid of Infinite Fun" and "Drone Strike" showed up in Symphony. There was no mouseover alt-text for the icons, and the Pyramid of Infinite Fun was right next to the icons for bold, italic, etc. text. So, people naturally clicked on the new icon a few times to see what it did, but it seemed to do nothing. The thing was, it caused a musical ding (like striking a musical triangle) for everyone else in the current Symphony room (channel), without any visual or auditory feedback for the person clicking the icon. So, being in Asia at the time, we heard waves of ringing noises from all over the trading floor when the London office got in. (Deployment of new versions was usually midnight NYC, so mid-day in Tokyo, Hong Kong, and Singapore, so the deployment for us was more gradual as people responded to notifications to restart Symphony to pick up the new version.) The sound was closer to a triangle than a bell, but I suspect the driver for using a triangle instead of the traditional bell icon was just to be perceived as making progress.
"Drone strike" was just the screen shot icon. However, it looked like a targeting reticle and showed up the same day as the Pyramid of Infinite Fun, so I was somewhat hesitant to try it out.
It outputs an error log.
Whoops! An error occurred. Unfortunately, this error was not recoverable :(. Firefly III broke. The error is:
Could not save preference: SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column 'data' at row 1 (SQL: update `preferences` set `data` = [{"ip":"00.000.00.00","time":"2022-05-30 20:02:06","notified":false},{"ip":"00.000.00.00","time":"2022-05-30 20:02:10","notified":false},{"ip":"00.000.00.00","time":"2022-05-30 20:02:15","notified":false},{"ip":"00.000.00.00","time":"2022-05-30 20:02:16","notified":false}, ...
My IP was in the list.
Let's just say it is hard to trust a piece of software with my financial data after this.
(I changed all the IP addresses for 00.000.00.00 to preserve some anonymity.)
Definitely don't upload your real financial data to the shared hosted demo. I definitely wouldn't trust the demo with real data.
... but for the actual app, you run it locally on a server you control. You can add whatever form of auth in front of it, whether that's nginx basic auth, or requiring a client certificate, or so on. The app's designed with that in mind, with the user being a trusted person, so of course it's fine for it to dump sqlstate for you to debug.
Since this is AGPL free software, and self hosted, it's about as trustworthy as can be for putting data into it, and if you don't trust it yet, you can read the code and gain such trust.