31f030fdeac4a887f368a2662c23bdff5d536e10
Rate fetching is optional and fails soft: any network or parse error leaves cached rates untouched and shows a message, never throwing into render. A cleared or non-positive FX rate input now calls the new removeFxRate action instead of storing 0, since toBase() silently converts a stored 0 to a 0-value conversion while an absent row correctly throws MissingRateError. Posts are archived, never deleted. Import downloads a backup of the current data before replacing it and requires confirmation showing before/after counts. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
budget2.0
New version of budget page, vibecoded.
Languages
TypeScript
98.3%
CSS
1.4%
HTML
0.2%