Expensify is a free, open source finance & accounting project written in TypeScript and released under MIT. It has 5,025 GitHub stars, 4,010 forks and 2,252 open issues, and was last pushed 4 hours ago. On this registry it ranks #10 of 34 tracked projects in Finance & Accounting, with 5 head-to-head comparisons available. It gained 2 stars over the last 6 tracked days.

What is Expensify?

Expensify (New Expensify) is a chat-centered financial collaboration application built in TypeScript and published under the MIT license, aimed at developers and contributors who build and extend expense management workflows across web, iOS, and Android.

What it is

New Expensify is described by its maintainers as a complete re-imagination of financial collaboration, centered around chat. The repository holds a single TypeScript codebase that targets three platforms — web, iOS, and Android — and it lives in the React Native and JavaScript ecosystem, with React Strict Mode guidance and a Left Hand Navigation (LHN) design document included in its contributor guides. The project carries 5,023 stars, 4,011 forks, and 2,252 open issues, with the most recent push recorded on 2026-09-16. It is released under the MIT license, and the hosted application is available at https://new.expensify.com.

The concrete problem it addresses is the older, form-and-spreadsheet model of expense reporting. New Expensify moves that work into a conversational surface, so that financial collaboration happens inside chat rather than through detached submission forms and email threads. In place of the previous generation of the Expensify client, this repository is the rebuilt application itself, and the README frames the work as the next generation of Expensify, inviting feedback and code contributions against the new client.

Key capabilities

  • One TypeScript codebase serving web, iOS, and Android, where each platform is started through npm run , for example npm run web, with per-platform guides in contributingGuides/SETUP_WEB.md, contributingGuides/SETUP_IOS.md, and contributingGuides/SETUP_ANDROID.md.
  • Chat-centered financial collaboration as the core product model of New Expensify, rather than a peripheral messaging add-on.
  • Onyx state management, with debugging enabled through the USE_REDUX_DEVTOOLS environment flag and render tracking through USE_WDYR.
  • API integration against separate endpoints, where EXPENSIFY_URL and SECURE_EXPENSIFY_URL are distinguished, and sign-in is handled at https://www.expensify.com/api/BeginSignIn.
  • Partner authentication constants, EXPENSIFY_PARTNER_NAME and EXPENSIFY_PARTNER_PASSWORD, used by the app when authenticating.
  • Realtime transport through Pusher, configured with PUSHER_APP_KEY.
  • Local tunneling for web testing through ngrok, controlled by NGROK_URL, SECURE_NGROK_URL, and the USE_NGROK flag.
  • AI-assisted device testing through the .claude/skills/agent-device/SKILL.md /agent-device skill for Claude Code, which drives iOS and Android simulators or devices and requires npm install -g agent-device.

Who uses it and how

  • Open-source contributors working from the repository's contribution guides, code of conduct, and contributor license agreement, which govern how changes are accepted.
  • Mobile engineers testing on iOS and Android simulators and emulators, including browser testing inside those simulators.
  • Expensify engineers testing against the API in a local development environment, who the README directs to separate internal instructions.
  • React Native developers who need to reason about strict-mode rendering behavior and left-hand navigation structure, both documented in the contributing guides.
  • Teams that want chat-based expense workflows without running anything themselves, since the hosted application is published at the project homepage.

Getting started

Local development starts with brew install nvm && nvm install, then brew install watchman, then npm install, then a platform command such as npm run web. The node and npm versions are pinned strictly by the engines field in package.json and the .nvmrc file, so npm install fails if the wrong version is used.

How it compares

The facts provided name no comparable tools and no list of paid products that this project replaces, so no direct contrast on licence, hosting, data ownership, or cost can be drawn. On the supplied evidence, New Expensify stands alone in this registry.

When to use it — and when not to

Anyone self-hosting must expect to manage a pinned Node toolchain, Watchman, and the individual web, iOS, and Android build setups, plus credentials for the Expensify API and Pusher, since the README warns external contributors against creating a .env file at all. It is not a fit for teams looking to operate their own expense backend, because the documentation covers local development only and describes no database, storage, SMTP, or production deployment path. The repository is also carrying 2,252 open issues and lists no topics, which signals a large, active, and correspondingly noisy project rather than a small, settled one.

project readme (upstream, from github) — read inline
New Expensify Icon

New Expensify

Table of Contents
Additional Reading

Local development

These instructions should get you set up ready to work on New Expensify 🙌

Getting Started

  1. Install nvm then node & npm: brew install nvm && nvm install
  2. Install watchman: brew install watchman
  3. Install dependencies: npm install
  4. Run the specific platform with the following command: npm run , e.g. npm run web

You can use any IDE or code editing tool for developing on any platform. Use your favorite!

Recommended node setup

In order to have more consistent builds, we use a strict node and npm version as defined in the package.json engines field and .nvmrc file. npm install will fail if you do not use the version defined, so it is recommended to install node via nvm for easy node version management. Automatic node version switching can be installed for zsh or bash using nvm.

Platform-Specific Setup

For detailed setup instructions for each platform, see the following guides:

Optional AI-assisted mobile testing: If you use Claude Code, the /agent-device skill drives iOS and Android simulators or devices for interactive testing, debugging, and performance profiling. Requires npm install -g agent-device.

General Troubleshooting

  1. If you are having issues with Getting Started, please reference React Native's Documentation
  2. If you are running into CORS errors like (in the browser dev console)
    Access to fetch at 'https://www.expensify.com/api/BeginSignIn' from origin 'http://localhost:8080' has been blocked by CORS policy
    
    You probably have a misconfigured .env file - remove it (rm .env) and try again.

Note: Expensify engineers that will be testing with the API in your local dev environment please refer to these additional instructions.

Environment variables

Creating an .env file is not necessary. We advise external contributors against it. It can lead to errors when variables referenced here get updated since your local .env file is ignored.

  • NEW_EXPENSIFY_URL - The root URL used for the website
  • SECURE_EXPENSIFY_URL - The URL used to hit the Expensify secure API
  • EXPENSIFY_URL - The URL used to hit the Expensify API
  • EXPENSIFY_PARTNER_NAME - Constant used for the app when authenticating.
  • EXPENSIFY_PARTNER_PASSWORD - Another constant used for the app when authenticating. (This is OK to be public)
  • PUSHER_APP_KEY - Key used to authenticate with Pusher.com
  • SECURE_NGROK_URL - Secure URL used for ngrok when testing
  • NGROK_URL - URL used for ngrok when testing
  • USE_NGROK - Flag to turn ngrok testing on or off
  • USE_WDYR - Flag to turn Why Did You Render testing on or off
  • USE_REDUX_DEVTOOLS - Flag to enable Redux DevTools for Onyx state debugging
  • USE_WEB_PROXY⚠️- Used in web development, it starts a server along the local development server to proxy requests to the backend. External contributors should set this to true otherwise they'll have CORS errors. If you don't want to start the proxy server set this explicitly to false
  • CAPTURE_METRICS (optional) - Set this to true to capture performance metrics and see them in Flipper see PERFORMANCE.md for more information
  • ONYX_METRICS (optional) - Set this to true to capture even more performance metrics and see them in Flipper see React-Native-Onyx#benchmarks for more information

If your changes to .env aren't having an effect, try rm -rf .rock, then re-run npm run ios or npm run android


Running the tests

Unit tests

Unit tests are valuable when you want to test one component. They should be short, fast, and ideally only test one thing. Often times in order to write a unit test, you may need to mock data, a component, or library. We use the library Jest to help run our Unit tests.

  • To run the Jest unit tests: npm run test
  • To run the Bun testsserver/ plus the .github/ and scripts/ tooling tests: npm run test:bun — see tests/tooling/README.md
  • UI tests guidelines can be found here

Performance tests

We use Reassure for monitoring performance regression. More detailed information can be found here:

CodeCov

CodeCov is the service we use to measure and track code coverage. You can find out more about it here


Frequently asked questions

Is Expensify free to use?

Expensify is open source under the MIT licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does Expensify do?

Simplify expense management for businesses of all sizes

What is Expensify written in?

Expensify is primarily written in TypeScript. Its source is publicly available at https://github.com/Expensify/App, and it has 5,025 GitHub stars.