121 points niztk 3 days ago 71 comments

Hi HN, I'm Niz. Pulse Local is a budgeting app for Mac (Apple Silicon, beta) that answers questions about your spending with models that run on your machine. Local mode needs no account. The ledger and your questions stay on the machine, and the app sends no analytics or crash logs.

I felt there are not enough consumer apps that run locally with no calls to the outside world that help us manage sensitive corners of our lives. This app in its local variant only downloads a couple of models and occasional updates, it does not send any analytics nor data.

Features-wise, Pulse local is a complete budgeting app that offers an assistant built on top of a fine-tuned model and thousands of rules embedded in the code itself. I'm sharing it for free with options to help me continue experimenting with fine-tuning and expanding along this direction.

How it works: you import a CSV from any bank, in any currency. When you ask a question, a tuned Qwen3 0.6B model reads it into a structured query, and code, not the model, does the money math against the ledger. A 4B checker model double-checks each money answer; when the two readings disagree, the app says it is not sure instead of guessing. That change took wrong answers from about one in five to 5 in 494 questions across our last three tests. The write-up covers how we test, the designs that failed, and the limits of the claim: https://pulseos.finance/pulse-local/writing/agree-or-not-sur...

The tuned weights are on Hugging Face (PulseOS/pulse-local-qwen3-0.6b).

Limitations: the first start downloads about 2.9 GB of models. With the checker on, a money answer takes 12 to 14 seconds (you can turn the checker off). Small models can still misread an open-ended question. The app answers in English. Mac only for now; Windows is next.

The app is free. An optional Connected mode (Sync Pass, $29/year) syncs US banks through Plaid; transactions pass through our server's memory and are not stored.

Feedback welcome, especially on wrong answers and on questions it should handle but does not.

terwint 3 days ago | parent

Very nice project. I think this is is in the step of the right direction for agent-driven assistance.

> How it works: you import a CSV from any bank, in any currency.

I think this is where you're going to lose people. If you're having to pull in data from multiple different sources, each with their own flow for exporting, I think this might be a non-starter for creating good financial habbit.

I recnetly had success integrating my local AI agent with Monarch money via an open source monarch MCP project. It took a bit of (AI) hacking the login stuff, but now I'm able to pull transactions, query patterns, have a daily report generated from hermes, etc. Much more technical that your target audience but possibly offers some inspiration.

niztk 3 days ago | parent

Appreciate the feedback. There's also a connected mode leveraging Plaid where transactions pass through servers memory and never stored. Outside the US, CSV is the only path for now otherwise agree CSV export is a chore for multi-bank users.

cortesoft 3 days ago | parent

You could add support for something like simplefin.org, which provides an API for connecting to many different financial orgs. It is what I have been using for my local setup with Actual budget.

niztk 3 days ago | parent

Thanks, will surely look into this.

unsnap_biceps 3 days ago | parent

Does your financial orgs actually support simplefin or are you using simplefin bridge?

Bridge is actually provided by mx.com, pretty much the same service as Plaid.

elyobo 3 days ago | parent

Actual budget is good. Connectivity in Australia sucks though so I've kludged my own approach (open banking connections to a single local aggregator then puppeteer to sign in and get an access token, then directly calling the aggregators internal APIs with it and pushing the data into a local Actual server using Actual's APIs).

post-it 3 days ago | parent

A lot of banks make it easier to export PDF statements. I wonder if you could try adding the ability to extract transactions from a PDF. I've been working on something more limited (extracting just the account balance) with Qwen3 4B with decent success.

niztk 3 days ago | parent

I've tried with some success but will spend more time on the input layer.

lathiat 3 days ago | parent

There’s similar support from many banks in many countries. But obviously will be a bunch of work to support them all.

It also requires you generally to trust some third party with your data.

Here’s an API one for Australia / New Zealand / USA: https://redbark.com/developers

niztk 3 days ago | parent

Thanks, I was planning to add country integrations outside the US. Appreciate the pointer here.

calyhre 3 days ago | parent

I had great success using enablebanking.com for personal usage. The setup is a bit cumbersome, but works really well

niztk 3 days ago | parent

Thanks, will surely give this a try. So far, I have US today with Canada, UK, AU, NZ and Europe on the roadmap.

i_am_a_squirrel 3 days ago | parent

"if you're having to pull in data from multiple different sources, each with their own flow for exporting"

you say this, but i got ChatGpt to just open chrome logged into two credit cards and a bank app and download everything with a certain criteria (i did this to populate items in a travel split app). So maybe it's not that bad

xyst 3 days ago | parent

You trust anything run through a black box model to remain private? Laughable.

nickthegreek 3 days ago | parent

aren’t they all black box models?

i_am_a_squirrel 3 days ago | parent

tapping my credit card to buy things and generate the financial data in the first place was already trusting a bunch of black boxes anyway right?

arm32 3 days ago | parent

Your domain name is younger than 30 days old so my firewall blocks it. :/

loloquwowndueo 3 days ago | parent

So tune your firewall? Sounds like you’re asking OP to fast forward time so his understandably brand new domain passes your weird age hurdle?

arm32 2 days ago | parent

Nah, this is mainly how I filter out AI slop.

nico 3 days ago | parent

Very cool. What does it use the model for? Could you replace it with something lighter, like some classifiers[0]? Or do you need the chat? Besides the chat, what other tasks is the model used for? Thank you!

0: https://jeffyclassify.com/blog/when-llms-fail-at-classificat...

j45 3 days ago | parent

I'm assuming each model might require it's own tweaks to work functionally the same?

Still it could be handy to be able to do that locally, maybe model tweaks could be shared back upstream.

The bridge between deterministic accounting principles to non-deterministic patterns trying to simulate it at will is a pretty big thing to cover.

niztk 3 days ago | parent

Thanks Nico! The model rarely writes answers, it structure the query (what to count, category, period, grouping, comparison etc.) then plain code does the money math. For questions that code doesn't support, we use the model and label those answers.

We also have a checker that reads the query and we only show figures when the two readings agree otherwise the app rather say not sure. We also rely on a small embedder that returns the 8 past nns to serve as examples.

As for classifiers, the reading is partly classification already, with rules and fixed cues checked first.

altmanaltman 3 days ago | parent

I use budgeting apps on a daily basis, and I'll just share my personal feedback: I'm absolutely not downloading ~3 gigs for a budget app. Everything I need to "ask" the app is already available to me in the form of reports, charts, and tables. I don't really have many open-ended questions about my budget because anything important to track is already handled deterministically.

Also yes, it's local but the data you're importing is already with a private organization on the cloud. In that sense, having a local copy of it does not really do anything for me in terms of privacy etc.

As I said, I use budgeting apps daily (one for personal use (self-made), another for business (very old freenium era software that has not failed me in the last 5+ years of self-hosting it)) and I do not see any need for generative AI in that workflow from my pov. YMMV

post-it 3 days ago | parent

> Also yes, it's local but the data you're importing is already with a private organization on the cloud. In that sense, having a local copy of it does not really do anything for me in terms of privacy etc.

I'm not sure what you mean? Surely processing on your computer instead of Anthropic's computer is a significant privacy improvement?

niztk 3 days ago | parent

Thanks for the feedback and describing your budgeting routine and needs. Just to add that the 2.5G checker can be switched off in Settings. The reader is only a small tuned 0.6B model (397 MB).

Chat is optional, the app is a complete and free budgeting app (reports, rules, money flow, forecast etc.). As for privacy, "local" usually means your data not your questions, sure the banks hold the transactions but your questions and analysis shouldn't go to the cloud hence this project.

lathiat 3 days ago | parent

Why not leverage Apple Foundational models?

Downloads will already be on the machine.

https://developer.apple.com/documentation/foundationmodels

niztk 3 days ago | parent

I've tried, they were really bad for this use case.

lathiat 3 days ago | parent

I love the idea of local only apps woth no network comms. I do wish macOS had some way you could enforce that out of the box though. Rather than trust the claims of the developer.

Another app I love that does the same. Queryable which lets you natural language search your photos on device on iOS and predates most of the current AI craze (2022) and also apple adding this themselves to photos: https://queryable.app/

niztk 3 days ago | parent

Indeed, macOS only blocks incoming traffic. For this app and in "local mode", there are only two kinds of requests: one to download the models from HF and an optional version check that sends nothing about the user and can be turned off. A simple test, once you download, try turning off your wifi and use the app.

unsnap_biceps 3 days ago | parent

Little snitch is the best solution for firewalling off applications from the network

vunderba 3 days ago | parent

Lulu is also very good as well!

https://github.com/objective-see/lulu

snehesht 3 days ago | parent

Congrats on launching, I’m working on a similar idea with local models.

niztk 3 days ago | parent

Thanks and good luck!

tantalor 3 days ago | parent

This is the most confusing product page I've ever seen. What is it even trying to tell me?

niztk 3 days ago | parent

Apologies, will try to simplify. In a nutshell: Pulse Local is a free budgeting app where you could import bank transactions and ask about spending with the AI running on your machine so neither the data nor your questions leave (in "local mode").

benhurmarcel 3 days ago | parent

The first thing I look for on that kind of page is a screenshot. Those shouldn't be so far down. Also way before showing your app, you show a massive video of a leaf, that's not what people are looking for.

niztk 3 days ago | parent

fair, screenshots will move up.

seemaze 3 days ago | parent

Makes me want to play around with the nemotron finance[0] fine tune released a while back..

[0]https://fastino.ai/blog/fastino-nemotron-3-5-lightning-finan...

yieldcrv 3 days ago | parent

long landing pages are a sign of AI psychosis

you only need 2 sections. an above the fold area and something below the fold. simple.

thanks for making this. “its private” is not a selling point, whats other differentiators does it have? really the AI analysis and potential agentic aspect right?

you could point out that it doesnt use data centers or harm the environment without explaining how or what that means upfront

niztk 3 days ago | parent

All fair points, will simplify the page.

kccqzy 3 days ago | parent

Please don’t. This is really a matter of personal preferences. I like long informative landing pages that as I scroll, give me more and more reasons to try the software.

Compare the omp landing page a few months ago versus now: https://web.archive.org/web/20260624030333/https://omp.sh/ versus https://web.archive.org/web/20261007154534/https://omp.sh/ The former does a compelling job telling me why I should try it by listing its advantages. By the time I got to hashline I became convinced. The latter landing page has a single sentence that’s generic and vague. I would not have tried omp at all if its landing page looked like what it is today.

niztk 3 days ago | parent

fair, will likely tweak the top but keep some details.

yieldcrv 3 days ago | parent

A/B tests solve this. data driven results from multiple flows delivered to subsets of users

the layouts with the most aligned engagement wins rollout to all users

coding isnt the hard part of a product launch

robotresearcher 3 days ago | parent

Feedback: manually categorizing transactions is a common and tedious task. Your 'for review' transaction list shows the category, but it's not editable. To review and fix the category, you must:

- read the category

- click on the '...' button at the end of the line (not near the thing you want to correct, and not my first guess for settings the category)

- this creates a popup

- mouse into the popup and click on the dropdown for setting the category.

Just have the category label in the list clickable, to show the category dropdown.

It saves one click, two mouse movements, and having to figure out that '...' is the action you need to fix a category.

niztk 3 days ago | parent

Thanks much! Will ship a fix soon.

robotresearcher 3 days ago | parent

Great! Good luck to you with the launch. The main idea of on-device models is a very good one.

niztk 3 days ago | parent

Thanks a lot! Will keep iterating.

kailovel 3 days ago | parent

This makes me skeptical. This is a key action - 1. Import, 2. Categorise ... - and it seemed like it received little thought from the developer. It's not a bug to fix mate, it's a core user flow that's very unthoughtful.

niztk 3 days ago | parent

Fair, I'll ship a few improvements and continue iterating with users.

zyk_computer 3 days ago | parent

I'm curious why you built a full budgeting app instead of adding a local AI chat to an existing open source app like Actual Budget.

niztk 3 days ago | parent

Thanks. Well, accuracy depends on the code that owns the ledger, which does all the math against the app data model. I also added checks that compare a couple of readings of the question through the same calculation layer. Since there are also many other moving parts coupled with the ledger (categories, rules, transfers, refunds), it just felt better to own the whole stack.

herf 3 days ago | parent

Plaid is the main risk - if they were hacked, that's way worse than a log of my AI queries. What's exciting with LLMs is the possibility to do classification much better.

niztk 3 days ago | parent

Plaid is only used in "Connected Mode" which is optional. Local mode never touches Plaid, it's all CSV for now but will work on PDF parsing next.

codebje 3 days ago | parent

I gave it a go and imported a transaction CSV from my bank - National Australia Bank. 150 row CSV. The Description import column was assigned to the Merchant Name CSV column (the Merchant import column was also assigned to this CSV column) and as a result 25 rows were going to be ignored. Here's the CSV header row:

    Date,Amount,Account Number,,Transaction Type,Transaction Details,Balance,Category,Merchant Name,Processed On
Hand-picking the Description column to be assigned to the details column sorted it out; not sure how you're auto-selecting column mappings but maybe 'details' should be recognised as closer to 'description' than 'merchant name' is.

niztk 3 days ago | parent

Thanks for giving it a spin. Will fix the mapping.

haisin5555 3 days ago | parent

You have a free budgeting app for Mac? Can you have as an app so I can download it in my iPhone? Can Pulse Local connect to my bank app and automatically records my spendings?

Also am curious about your reasoning behind usage of Qwen3.0 model as well!

niztk 3 days ago | parent

Hi, only a Mac app today, working on a Windows app next. As for bank connections, yes this was requested and I added a "Connected Mode" ($29 a year Sync Pass) which syncs US banks via Plaid otherwise you can import a CSV which also works with any bank and any currency. As for Qwen3, 0.6B is small enough to run fast on most laptops, showed good evals and easily tunable. In my tests, the tuned 0.6B model scored about level with gpt-4.1-mini on a dataset of 77 real budgeting questions and outperformed a stock 8B model as well.

dsjakupov 3 days ago | parent

Ive got a similar story but with slightly harsher constraints. I also want to build private AI app but for the phone. As you know they have very little RAM per app and I needed to somehow circumvent it. So I picked qwen2.5-0.5B as it was good for the purpose of answering people and keeping the dialog and no overkill + whisper model to add stt feature (437 MB for both). I think that if your app does only one job, you can use smaller model and fine tune it a bit

niztk 3 days ago | parent

Agree, a small tuned model, in my case a 0.6B Qwen, beat a bigger general model: stock 8B Qwen.

LewisOrton 3 days ago | parent

after a “not sure,” how often does reprhasing get a correct answer on the next try/do users give up? retries could make a simple lookup surprisingly slow?

niztk 3 days ago | parent

Great question and in all honesty, real users just started downloading the app today so I don't have any idea yet on how often a rephrased question succeeded. That being said, a retry costs about 12 to 14 seconds with the checker against 1/10th of a second without so it doubles the wait. What I've tested was that with the checker, even though fewer questions get an answer (about 47% right against 60% without), wrong answers fell to 5 in a sample of 494 questions (compared to 100 wrong without the check). Conversations are hit the most from the moment it answers "not sure" so nothing to build on for the next question. I've also given users the option to switch off the checker for speed. I still have many ideas to try and hopefully I keep improving trade-offs.

fionaswarovskij 3 days ago | parent

curious what ppl actually come back for after the first few days. do they keep asking questions about their spending? feels like a lot of the useful stuff would be things they wouldn't think to ask about

niztk 3 days ago | parent

In all honesty, I don't know what would bring people back since I just launched but a few things the app does unprompted: patterns it finds in spending (insights), money and cash flow, forecast, as for the chat there are always a few suggested questions so you don't always need to know what to ask. But agree, it would be great to hear what returning users actually do.

splittydev 3 days ago | parent

I don't know if this is vibe-coded or something, but it works very badly.

I tried to change the currency from USD to EUR. The filter dialogue didn't work, clicking it only focused the text field for a few milliseconds and I couldn't get a single character typed.

Then I closed the settings, and the whole app froze until I had to force-quit it. Uninstalled already, not a good first impression at all.

niztk 3 days ago | parent

Thanks and this is surely a bug. Investigating now. If you are willing to retry later as soon as I ship a fix, please email me niz@pulseos.finance

niztk 3 days ago | parent

Thanks again for the report. I did see that the app refreshed its window many times during the first model download and each refresh stole focus from the search field, that's why typing did not work.

The fix is ready and shipping it soon (version 0.4.1)

As for the freeze, I honestly couldn't reproduce it but I suspect it's due to the above symptoms and the fix will likely remove it. Happy to let you know if you email me so that you can retry once the new version is shipped.

kailovel 3 days ago | parent

Found the review screen very hard to use. You can't bulk change categories, you have to awkwardly double click into each one.

And two thirds of my transactions went in that pile. Brutal.

Uninstalled.

niztk 3 days ago | parent

Appreciate the honest feedback.

edarchis 3 days ago | parent

> How it works: you import a CSV from any bank, in any currency. I dropped the CSV from my bank and only got 2 fields. I fixed the CSV and suddenly the IBAN BE12 3456 7890 123 became BE12 in Pulse

First operation I did was switch it to Belgium. "type to search" Didn't work. Saving after manually setting it was a really long beach ball.

Can't say I'm impressed. It had potential but didn't seem to develop it.

niztk 3 days ago | parent

Thanks for the feedback. Aware of the search field bug, already fixed in 0.4.1 which is shipping soon. Fixing European CSVs and cut IBAN now. Investigating the country-save hang. If you’re keen to retry, email me niz@pulseos.finance and will let you know.

niztk 3 days ago | parent

Big thanks to everyone who downloaded and tried the app, and to those who chipped in even though they could have downloaded it for free (I was very surprised to see so many supporting the effort). I just shipped 0.4.1, which targets feedback from splittydev, edarchis about typing issues, codebje about AU banks and CSV formats, edarchis (Belgium) about European CSVs and IBAN cuts, edarchis and splittydev about memory pressure while the checker model is being loaded, robotresearcher and kailovel about categorization (still a work in progress), altmanaltman and a few others about the heavy checker (off by default now for Macs with 16 GB of RAM or less), and many other pieces of feedback.

0.4.1 is live, and the app will automatically find the update at launch or within 6 hours, download it in the background, and show “Restart to apply” when ready. You can also download it again from pulseos.finance. I'm dedicated to working on this app full-time, so please use the feedback section in the app to share features, bugs, etc., or email me at niz@pulseos.finance.