A local-first personal finance system

Overview

Note from maintainer: don't expect responses or PR merges until May 16th. 🏖️

I (@jlongster) am currently away on vacation and not checking this. I am currently the only maintainer of Actual (person able to merge PRs, etc). I'd like to fix this soon and if you are interested in helping, please help manage issues & PRs and I will bring on consistent contributors as maintainers.

Please help by making it as clear as possible what changes are being made. When I get back this will greatly help triage the work.

When I get back, I will work on guides and structure to help anyone get involved, particularly explaining how the code works.


This is the source code for Actual, a local-first personal finance tool. It is 100% free and open-source.

If you are only interested in running the latest version, you don't need this repo. You can get the latest version through npm.

More docs are available in the docs folder.

If you are interested in contributing, or want to know how development works, see CONTRIBUTING.md

Join the discord!

Installation

The easy way: using a server (recommended)

The easiest way to get Actual running is to use the actual-server project. That is the server for syncing changes across devices, and it comes with the latest version of Actual. The server will provide both the web project and a server for syncing.

git clone https://github.com/actualbudget/actual-server.git
cd actual-server
yarn install
yarn start

Navigate to https://localhost:5006 in your browser and you will see Actual.

You should deploy the server somewhere so you can access your data from anywhere. See instructions on the actual-server repo.

Without a server

This will give you a fully local web app without a server. This npm package is the packages/desktop-client package in this repo built for production:

yarn add @actual-app/web

Now you need to serve the files in node_modules/@actual-app/web/build. One way to do it:

cd node_modules/@actual-app/web/build
npx http-server .

Navigate to http://localhost:8080 and you should see Actual.

Building

If you want to build the latest version, see releasing.md. It provides instructions for building this code into the same artifacts that come from npm.

Run locally

Both the electron and web app can started with a single command. When running in development, it will store data in a data directory in the root of the actual directory.

First, make sure to run yarn install to install all dependencies.

In the root of the project:

yarn start            # Run the electron app
yarn start:browser    # Run the web app

Code structure

The app is split up into a few packages:

  • loot-core - The core application that runs on any platform
  • loot-design - The generic design components that make up the UI
  • desktop-client - The desktop UI
  • desktop-electron - The desktop app
  • mobile - The mobile app

More docs are available in the docs folder.

Comments
  • Implement localization for schedule descriptions

    Implement localization for schedule descriptions

    cc @manuelcanepa — let me know if all of this makes sense for Spanish too :)

    One thing I’m not super confident about is general.ordinal, but I’m not sure what the best approach for that is. (The Intl API doesn’t offer ordinal formatting for some reason)

    opened by j-f1 12
  • Adding docker-compose file

    Adding docker-compose file

    Adds a very basic docker-compose file using Kovah's docker image of the server. Persists data via the volume mounting on $DOCKERDIR/actual/data:/data.

    User should define $DOCKERDIR or set it to a relative path on the docker server.

    opened by cuken 10
  • [Bug]: Import from YNAB4 not working in release 22.10.25

    [Bug]: Import from YNAB4 not working in release 22.10.25

    Verified issue does not already exist?

    I have searched and found no existing issue

    What happened?

    When trying to import from YNAB 4, the importer goes to a blank white screen. There's no error message and no message in the browser's console.

    image

    What error did you receive?

    Blank screen

    Where are you hosting Actual?

    Docker

    What browsers are you seeing the problem on?

    Chrome, Microsoft Edge

    Operating System

    Windows 11

    bug needs-testing importers 
    opened by yoyotogblo 8
  • Request to duplicate transactions

    Request to duplicate transactions

    I searched and didn't find this, but forgive me if I missed it. It would be really handy if we could select a transaction and duplicate it so we could just change the date and be on our way. I'm thinking of transactions I have that have multiple splits and I repeat monthly. A big time saver.

    needs triage 
    opened by triplejranch 8
  • currency-formatter -> Intl.NumberFormat

    currency-formatter -> Intl.NumberFormat

    Closes #90

    Deps Changes

    1. The babel transform to CommonJS for Jest (as I understand it) was failing. Seemed to be due to shifting deps versions, and bumping @babel/plugin-transform-modules-commonjs addressed it.
    2. And of course, removed currency-formatter

    Locale Change

    Switch to en-ZA as our example locale for space-comma. (za-ZA does not exist. Might have been a typo for zu-ZA, but that is a comma-dot locale, to use Actual notation.)

    Open Questions

    Is this the best way to fix to 2 decimal places?

    • Usually, the currency param to NumberFormat would dictate the minimumFractionDigits/maximumFractionDigits values, but we're avoiding setting a specific currency (along with the currency symbol that brings).
    • As far as I understand, nearly every currency worldwide (though not 100% of them) uses 2 fractional digits. I'd argue it's safe to fix to 2 at least for our purposes, but open to being convinced otherwise.

    Show 'n' Tell

    Before (currency-formatter) --> After (Intl.NumberFormat as configured in this PR) currency-formatter Int NumberFormat

    opened by trevdor 8
  • RFC: Sunset Client Side Encryption

    RFC: Sunset Client Side Encryption

    Introduction

    This is a request for comment (RFC) on if client-side encryption should be sunset in Actual OSS.

    Actual clients support syncing between many instances using a centralized server (sync server). As clients make modifications, the changes to their internal state are set to the sync server to be received and applied by other individual client instances.

    Further, under Actual (in the before times), the client supported encrypting all data locally before the data was sent to the sync server, as documented here (end-to-end-encryption).

    Effectively, client side encryption allows for a zero-trust model for the syncing server. The end-user could assume both the data was encrypted on disk in a format that even the operator of the server would not be able to access.

    Terminology

    When I refer to the sync server, I refer to a hypothetical server that only handles syncing of encrypted data between clients. The OSS server is functionally different from the previous implementation.

    When I refer to a client, I refer to the full-fat clients in the model of the before times Actual e.g. the Mobile client and the Electron Desktop client. The OSS server blurs the lines.

    Proposal

    In Actual OSS, servers are hosted and maintained by the same individuals using the Actual OSS client. These individuals may employ full-disk encryption or other security measures if they believe such protections are warranted. Since there is no longer a third-party operator who may have access to the Actual data, the zero-trust model is less useful.

    Client-side encryption should be considered for removal from Actual OSS.

    Pro Removal

    • The original security concerns are moved to individuals, allowing them to choose their threat model.
    • Not only is this client-encryption less useful, the encryption introduces additional complexities:
      • Additional error checking is required.
      • Additional API surface area needs to be maintain.
      • Multiple logic flows (encrypted and unencrypted) would need to be tested and maintained.
      • The server is unable to modify the Actual data without the involvement from a client. This may make largely desired features, such as automatic bank import, more difficult.
      • etc.
    • Encryption is currently not supported by the OSS server per this comment: https://github.com/actualbudget/actual-server/blob/44d045f546ceb2440f2a681bc5821bbb8eefb80f/app-sync.js#L126-L135 Additional work will be required to support client-side encryption.

    Against Removal

    • Some individuals may not have the technical ability to secure a server effectively (e.g. full disk encryption is only useful with physically protected, physical hardware, which may be out of scope for many). Services like https://fly.io/ should be considered as the lowest common denominator that should still support a secure encryption model.
    • Client side encryption is a features that is best added at the beginning of development. The code largely already exists and should be maintained.
    • If a community maintained cloud service is every considered again (similar to https://www.home-assistant.io/cloud/), client-side encryption would be largely desirable.

    Commentary

    • I personally found this client-side encryption feature a major factor in ultimately selecting Actual for personal use. I still believe client-side encryption is a killer feature.
    • I personally run full-disk encryption on my own infrastructure, and while I support the inclusion of any time of client-side encryption (and would actively use it), the developer side of me likes the idea of being able to modify Actual data from the server without a client (aka a developer API). I would want to prioritize features like Plaid fetching or stock value tracking over client-side encryption - as I personally can secure the Actual data in a way that is acceptable.
    opened by Silvenga 8
  • [Bug]: Pressing return/enter when the checkbox is focused does nothing

    [Bug]: Pressing return/enter when the checkbox is focused does nothing

    Verified issue does not already exist?

    I have searched and found no existing issue

    What happened?

    Pressing return/enter when focused on the payment/deposit columns of a new transaction will cause the transaction to be added/saved. However, this will not happen for the “cleared” checkbox.

    What error did you receive?

    No response

    Where are you hosting Actual?

    Locally via Yarn

    What browsers are you seeing the problem on?

    Chrome, Safari

    Operating System

    Other

    bug good first issue 
    opened by j-f1 7
  • "Your data is still out of sync"

    If I import a YNAB4 budget from zip file in Firefox 99.0.1 on Windows 19043, I get the error

    Your data is out of sync
    There was a problem syncing your data. We can try to repair your sync state to fix it. [Learn more](https://actualbudget.com/docs/overview/syncing-across-devices/#debugging-sync-issues)
    

    image

    If I click Repair I get the error

    Your data is still out of sync
    We were unable to repair your sync state, sorry! You need to reset your sync state. [Learn more](https://actualbudget.com/docs/overview/syncing-across-devices/#debugging-sync-issues)
    

    image

    If I click Reset sync and refresh the page, the first dialog is shown again. After I refreshed the page, my budget was lost and a previously deleted budget has taken its place.

    firefox 
    opened by slater1 7
  • Reconcile & Account Balance When Income In Future

    Reconcile & Account Balance When Income In Future

    When an income item is in the register with a date in the future reconciling the account includes this income even though the date has not yet passed.

    The account balance also shows that the income value that was entered in the register is in the account balance - should it not be included in the register and added to the balance and available for reconcile once the date of the transaction is true?

    needs triage 
    opened by rich-howell 6
  • a11y: update cleared state display for clarity

    a11y: update cleared state display for clarity

    Create new CircleEmpty svg and set uncleared state to use new icon.

    Add 'cursor: pointer' to the cleared field to aid in action awareness.

    See discussion https://github.com/actualbudget/actual/discussions/271 for initial thoughts around the problem and the solution.

    Uncleared transactions have a hollow circle. Cleared transactions maintain the existing filled background checkmark. cleared field now gains a pointer on hover to show interactivity option

    See image of this solution. image

    Mobile application is unchanged. Given the direction seems to be deprecating the mobile app, I assumed I could skip changing there. Please let me know if I should update it anyway, or if there are any other issues!

    enhancement fixed user-interface 
    opened by rickdoesdev 6
  • Enforce a sort order for imports

    Enforce a sort order for imports

    I personally find the imports quite hard to manage (particularly in desktop-client) as we have a jumble of external imports, imports from other workspaces in the monorepo and local imports all mixed together. This means it's quite hard to see what what's going on and what exactly the open file depends on. Now that Actual is OSS, there's more cooks in the kitchen so it will likely deteriorate further.

    To fix this I've added a plugin to the linter which enforces that imports are sorted consistently and will automatically fix deviations from this.

    Specifically, we now sort imports as:

    1. React related packages
    2. External packages
    3. Monorepo packages
    4. Local imports

    Each group is separated with a newline and within each group the imports are sorted alphabetically.

    opened by TomAFrench 6
  • test: re-enable skipped unit tests

    test: re-enable skipped unit tests

    Re-enabling and fixing skipped unit tests.

    Before:

    ➤ YN0000: [loot-core]: Test Suites: 4 skipped, 32 passed, 32 of 36 total
    ➤ YN0000: [loot-core]: Tests:       33 skipped, 210 passed, 243 total
    ➤ YN0000: [loot-core]: Snapshots:   40 passed, 40 total
    ➤ YN0000: [loot-core]: Time:        131.646 s
    

    After:

    ➤ YN0000: [loot-core]: Test Suites: 1 skipped, 35 passed, 35 of 36 total
    ➤ YN0000: [loot-core]: Tests:       2 skipped, 241 passed, 243 total
    ➤ YN0000: [loot-core]: Snapshots:   69 passed, 69 total
    ➤ YN0000: [loot-core]: Time:        145.029 s
    
    opened by MatissJanis 3
  • [Bug]: Date filtering by month triggers crash

    [Bug]: Date filtering by month triggers crash

    Verified issue does not already exist?

    I have searched and found no existing issue

    What happened?

    See below video. In accounts: Filter > Date > Change Date to Month > RangeError

    Additionally, we should be consistent in the date format used for filtering Date, Month and Year and converting between them should pick a sane value based on the previous selection. Currently Date: yyyy/mm/dd Month: mm/yyyy Year:

    Ideally Date: yyyy/mm/dd Month: yyyy/mm Year: yyyy

    https://user-images.githubusercontent.com/10577752/209000486-d58d8652-0b6b-43c9-a60a-7151f1957610.mp4

    What error did you receive?

    RangeError: Invalid time value format node_modules/date-fns/esm/format/index.js:363

    360 | var originalDate = toDate(dirtyDate); 361 | 362 | if (!isValid(originalDate)) {

    363 | throw new RangeError('Invalid time value'); | ^ 364 | } // Convert the date in system timezone to the same date in UTC+00:00 timezone. 365 | // This ensures that when UTC functions will be implemented, locales will be compatible with them. 366 | // See an issue about UTC functions: https://github.com/date-fns/date-fns/issues/376

    Where are you hosting Actual?

    Locally via Yarn

    What browsers are you seeing the problem on?

    Firefox

    Operating System

    Windows 10

    bug needs triage 
    opened by biohzrddd 2
  • Clarifying import/export process in the Settings menu

    Clarifying import/export process in the Settings menu

    Importing a file wasn't obvious after already starting a test budget. This PR adds Import to the Settings > File menu, includes a brief explanation of the process, and copies the "Sign out" button. Explanation added for Export as well.

    opened by biohzrddd 4
  • [Bug]: Imported YNAB4 budget loses scheduled transactions

    [Bug]: Imported YNAB4 budget loses scheduled transactions

    Verified issue does not already exist?

    I have searched and found no existing issue

    What happened?

    When importing a YNAB4 budget with scheduled transactions (some accounts with them and some without) that haven't been added to the register, none of the scheduling transfers (in Actual, going to Schedules shows "No schedules").

    What error did you receive?

    None

    Where are you hosting Actual?

    Locally via Yarn

    What browsers are you seeing the problem on?

    Firefox

    Operating System

    Windows 10

    bug needs triage 
    opened by biohzrddd 4
Owner
null
Finance-Tracker - A basic finance-tracker application built using Next.js, React Hooks and Context API

Next.js + Tailwind CSS Example This example shows how to use Tailwind CSS (v3.0) with Next.js. It follows the steps outlined in the official Tailwind

Osemwengie Benjamin 1 Jan 2, 2022
Macarena finance is a simple UI for Yearn Finance, made to be forked!

Macarena Finance Macarena finance is a simple UI for Yearn Finance, made to be forked! Running your own instance of Yearn makes you eligible to earn f

yearn 17 Oct 1, 2022
The Frontend of Escobar's Inventory Management System, Employee Management System, Ordering System, and Income & Expense System

Usage Create an App # with npx $ npx create-nextron-app my-app --example with-javascript # with yarn $ yarn create nextron-app my-app --example with-

Viver Bungag 4 Jan 2, 2023
A personal semantic search engine capable of surfacing relevant bookmarks, journal entries, notes, blogs, contacts, and more, built on an efficient document embedding algorithm and Monocle's personal search index.

Revery ?? Revery is a semantic search engine that operates on my Monocle search index. While Revery lets me search through the same database of tens o

Linus Lee 215 Dec 30, 2022
Landing Page for Villagers.finance Play To Earn WEB3 Game, NFT Based.

create-svelte Everything you need to build a Svelte project, powered by create-svelte. Creating a project If you're seeing this, you've probably alrea

Ahmed DEMIAI 9 Sep 15, 2022
🍯 An open source interface for the Honey Finance protocol

This is a Next.js project bootstrapped with create-next-app. Getting Started First, run the development server: npm run dev # or yarn dev Open http://

Honey Labs 33 Dec 17, 2022
Decentralized Finance platform (frontend)

Getting Started with Create React App This project was bootstrapped with Create React App. Available Scripts In the project directory, you can run: ya

DJS Tech Group-Dev 2 Mar 28, 2022
A high-resolution local database that uses precise algorithms to easily record data in local files within a project with persistent JSON and YAML support designed to be easy to set up and use

About A high-resolution local database that uses precise algorithms to easily record data in local files within a project with persistent JSON and YML

Shuruhatik 5 Dec 28, 2022
Use Matrix as a backend for local-first applications with the Matrix-CRDT Yjs provider.

Matrix CRDT Matrix-CRDT enables you to use Matrix as a backend for distributed, real-time collaborative web applications that sync automatically. The

Yousef 604 Jan 7, 2023
⚡ the first open-source redis client made with care and acessibility-first 🚀

⚡ Redis UI The first open-source project to create an awesome and accessible UI for Redis as a native desktop application. ✨ ?? ?? How to develop loca

Nicolas Lopes Aquino 14 Dec 5, 2022
A personal school project to model the behaviour of the human immune system as a network graph with interactive visualisation.

An educational tool designed to help users understand the immune system. Made using Processing 5 for Java Script

Oscar Bullen 2 Jun 18, 2022
The LMS (Life Management System) is a free tool for personal knowledge management and goal management based on Obsidian.md.

README Documentation | 中文帮助 The LMS (Life Management System) is a tool for personal knowledge management and goal management based on Obsidian.md. It

null 27 Dec 21, 2022
Browse local files using the non-standard Web Browser File System Access API

Browse local files using the non-standard Web Browser File System Access API

Jeremy Tuloup 16 Oct 26, 2022
[Experimental] Browse local files using the non-standard File System Access API

jupyterlab-filesystem-access Browse local files using the non-standard Web Browser File System Access API. ⚠️ This extension is compatible with Chromi

Jeremy Tuloup 0 Apr 14, 2022
[Experimental] Browse local files using the non-standard File System Access API

jupyterlab-filesystem-access Browse local files using the non-standard Web Browser File System Access API. ⚠️ This extension is compatible with Chromi

JupyterLab Unofficial Extensions & Tools 12 Apr 15, 2022
A utility-first universal design system - powered by Tailwind CSS

tailwindcss-react-native tailwindcss-react-native uses Tailwind CSS as universal design system for all React Native platforms. It lets you share code

Mark Lawlor 1.5k Jan 4, 2023
Arabic-first task management system

Labeeb An Arabic-first, open-source Tasks Management System created for Damascus University's third year project, Faculty of Information Technology. F

Yaman Qassas 8 Dec 30, 2022
Denail of service system for the Dentistimo system. Used to improve the tolerance and testing fail safe functionality.

Distributed Systems - Dos Testing DoS (Denail of Service) System for Testing and Practical demonstration of systems capability to handle a basic DDoS

null 28 Nov 8, 2022