HackerReposA FIELD GUIDE TO OPEN SOURCE
ProSponsor the shelf♧ 0
← Back to top all-time
Athenodoros
TopHat
TypeScript2022–2022
Athenodoros / TopHat

TopHat

An in-browser personal finance app

2Distinct people
3Mentions
0Explicit recommenders
133GitHub stars
REPOSITORY AT A GLANCE

What to know before exploring

What it is

An in-browser personal finance app

GitHub

Where it is used

No documented product use has been verified yet.

What people are saying

No recommendation phrase was found in the indexed comments.

No classified warning is attached to this page. Read the discussions before treating silence as approval.

Also in these discussions

No other repository is repeatedly linked in the same discussions.

This week on Hacker News

Nov 7–Nov 14 UTC · Direct repository links and separately labeled related project stories. Indexed through 11/14/2026, 5:04:57 PM UTC.

No direct repository links were found in the indexed HN discussions over the past seven days. Older discussions are available below.

Mentions over time

HN mentions by hour3 dated mentions

Observed mentions: 2022-02-27 01:11:35 UTC to 2022-02-27 04:33:00 UTC.

012022-02-27 01:00:00 UTC to 2022-02-27 02:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 commentsFeb 27, 01:002022-02-27 02:00:00 UTC to 2022-02-27 03:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 commentsFeb 27, 02:002022-02-27 03:00:00 UTC to 2022-02-27 04:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments2022-02-27 04:00:00 UTC to 2022-02-27 05:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 commentsFeb 27, 04:00

Counts come from the repository’s dated source evidence. Index cutoff: 2026-11-02 08:16:59 UTC.

View mention counts and date ranges
UTC ranges include their start and exclude their end. Select a period to filter the source evidence.
PeriodStart (UTC)End (exclusive, UTC)MentionsSubmissionsComments
Feb 27, 01:002022-02-27 01:00:00 UTC2022-02-27 02:00:00 UTC101
Feb 27, 02:002022-02-27 02:00:00 UTC2022-02-27 03:00:00 UTC000
Feb 27, 03:002022-02-27 03:00:00 UTC2022-02-27 04:00:00 UTC101
Feb 27, 04:002022-02-27 04:00:00 UTC2022-02-27 05:00:00 UTC101

What Hacker News says

3 sources
I definitely have a lot of opinions about this :D. The main one is that RTK was fantastic (as are the docs!), and createEntityAdapter was definitely better than the equivalent that I wrote before finding it... A few more specific thoughts though: - createEntityAdapter was great, but one idea for an addition: I dislike having numbers as IDs (Will floating point precision bite me? Will I accidentally treat them as actual numbers? Do I need to cast them back for lookups or equality checks?), but I didn't get around to moving to strings, and preserving the sorting and ID generation with that in mind. Maybe RTK could bundle some utilities for managing this, like sorting functions and/or ascending ID generation to save others from my fate? I'll definitely start with these next time. - I really liked the Slice API in RTK, but I felt like I wante
Read the rest
d to run nested slices quite a lot - breaking up serialisable state (ie. user data) and page state, but then breaking down further into individual data types or pages respectively, so that pages could "own" their own state (and maybe get as far as something like a managed Mixin for a page state, like the recurring transaction table). I spent some time writing a way to compose Slices, but I found that it made things probably more complicated than it needed to be - even if you end up with a load of useAccountsPageState-style duplication which is maintained manually. (I'll admit this was a while ago, so my memory of why I decided against this is a little rusty...). - I hadn't seen useAppDispatch and useAppSelector - I'll definitely swap over my copy of them in https://github.com/Athenodoros/TopHat/blob/main/src/state/sh... ... - I definitely got that the expected pattern is createAsyncThunk (or useDispatch more broadly) rather than my separate functions using TopHatDispatch. I spent some time tooling about with migrating over, but I felt like it was an additional abstraction layer that I didn't really need. I eventually went with a fairly strict flow of "Types -> Storage Logic -> Store Definition -> Actions -> Components" which dealt with the circular imports. I'd be interested in other thoughts behind the best practice though - maybe they're more obvious with other people, or a larger project?
In Show HN: TopHat Finance – free, open, and offline
Looks very nice! I see you're using Redux Toolkit and TypeScript, including some fairly heavy use of `createEntityAdapter`. Any feedback on using RTK? We're always interested in hearing how RTK is working for our users. A couple quick suggestions on the code itself: - I see a lot of custom hooks like `useAccountsPageState` [0], except that they're completely duplicating the `useSelector` signature. I think the right answer here is to start by defining the "pre-typed" `useAppSelector` hook we show in our TS usage docs [1]. Then, make sure your selectors have the correct `RootState` type. Finally, you can rewrite the hook as `const useAccountsPageState = () => useAppSelector(selectPageState)`. - It looks like you're importing `TopHatDispatch` into some other files. That has the risk of causing circular import problems, since it's import
Read the rest
ing from the store itself. You may want to rework functions like `updateSyncedCurrencies` [2] to be a thunk. (In fact, looking at the code, this looks like a very good candidate for RTK's `createAsyncThunk` API.) Also, it looks like this is going to end up dispatching a separate action for every item. It would probably be more efficient to fetch all the items first, then dispatch _one_ action with the combined fetched results. [0] https://github.com/Athenodoros/TopHat/blob/a916386edf/src/st... [1] https://redux.js.org/tutorials/typescript-quick-start#define... [2] https://github.com/Athenodoros/TopHat/blob/a916386edf/src/st...
In Show HN: TopHat Finance – free, open, and offline
Hey HN - long time lurker etc. First off - I know, another personal finance app. However, I found none of the existing options matched what I wanted for myself: * Privacy-first - ideally a local app, and definitely no cloud storage of bank creds for automatic sync. I found this requires a polished statement upload flow, to save time on manual updates. * Good multi-currency support - this is bizarrely rare in the space. * Basic analytics and budgeting - ideally not as rigid as YNAB and friends, but at least something lightweight to tell me where my money is going and how that's changing. So over a few months during Covid, I put together TopHat for my own use: it's a SPA on GitHub Pages with no backend, where all data is stored in browser storage (plus a Dropbox sync option, which I wanted as a backup). It's a pretty standard stack (React,
Read the rest
Redux, TS), and the code is all available on GitHub (https://github.com/Athenodoros/TopHat) - don't judge too harshly, my day job isn't software engineering! That said, I've found it very rewarding to use something which I enjoy and which I've built - not to mention finally "finishing" a project... TopHat can load itself with some demo data, including an example bank statement for upload (check the notification on the top right). Hopefully this is interesting for folks - happy to answer any questions!
In Show HN: TopHat Finance – free, open, and offline

MAKE YOURSELF AT HOME

A few shortcuts

/
Search the collection
?
Open this guide
Esc
Close dialogs and navigation

Your saved repositories and interests stay in this browser.