{"id":24618157,"url":"https://github.com/daniel-hauser/moneyman","last_synced_at":"2026-04-06T09:10:04.116Z","repository":{"id":36985119,"uuid":"416602465","full_name":"daniel-hauser/moneyman","owner":"daniel-hauser","description":"Automatically save transactions from all major Israeli banks and credit card companies, using GitHub actions (or a self hosted docker image)","archived":false,"fork":false,"pushed_at":"2025-03-29T05:59:53.000Z","size":1263,"stargazers_count":66,"open_issues_count":4,"forks_count":44,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-03-31T04:07:14.625Z","etag":null,"topics":["finance","scraping","telegram"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/daniel-hauser.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-10-13T05:33:45.000Z","updated_at":"2025-03-29T05:59:56.000Z","dependencies_parsed_at":"2023-02-16T13:50:18.170Z","dependency_job_id":"c668c9e6-fc9d-492f-8aee-63068337f0e8","html_url":"https://github.com/daniel-hauser/moneyman","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/daniel-hauser%2Fmoneyman","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/daniel-hauser%2Fmoneyman/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/daniel-hauser%2Fmoneyman/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/daniel-hauser%2Fmoneyman/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/daniel-hauser","download_url":"https://codeload.github.com/daniel-hauser/moneyman/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247595335,"owners_count":20963943,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["finance","scraping","telegram"],"created_at":"2025-01-24T23:51:05.415Z","updated_at":"2026-04-06T09:10:04.103Z","avatar_url":"https://github.com/daniel-hauser.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# moneyman\n\nAutomatically save transactions from all major Israeli banks and credit card companies, using GitHub Actions (or a self-hosted Docker image).\n\nPowered by [israeli-bank-scrapers](https://github.com/eshaham/israeli-bank-scrapers).\n\n## Why?\n\nHaving all your data in one place lets you view all of your expenses in a beautiful dashboard like [Looker Studio](https://lookerstudio.google.com), [Azure Data Explorer dashboards](https://docs.microsoft.com/en-us/azure/data-explorer/azure-data-explorer-dashboards), [Microsoft Power BI](https://powerbi.microsoft.com/) and [YNAB](https://www.ynab.com/).\n\n## Important notes\n\nThis app requires some technical skills. If you prefer a GUI app you can use [Caspion](https://github.com/brafdlog/caspion) instead.\n\n\u003e [!WARNING]\n\u003e The current implementation assumes that you run the code on secure and trusted computers. Storing all your financial data and passwords in one place is risky — especially with more than read-only access.\n\u003e\n\u003e By using moneyman, you acknowledge that you are taking full responsibility for the code quality and will use it only after you review the code and validate that it's secure.\n\u003e\n\u003e **Please use a proper secret management solution to store and pass credentials.**\n\n## How to run\n\n### Cloud (GitHub Actions)\n\nMoneyman can be configured to periodically run automatically, using the [`scrape`](./.github/workflows/scrape.yml) GitHub workflow.\n\nBy default, this workflow will run twice daily at 10:05 and 22:05 UTC (12:05 and 00:05 or 13:05 and 01:05 in Israel time, depending on DST).\n\nSince logs are public for public repos, most logs are off by default and the progress and error messages will be sent via Telegram.\n\n#### Setup\n\n1. Fork the [moneyman](https://github.com/daniel-hauser/moneyman) repo to your account\n2. Add the `MONEYMAN_CONFIG` to the [actions secrets](../../settings/secrets/actions) of the forked repo\n   - Use [`config.example.jsonc`](./config.example.jsonc) as a starting point and add configurations for your selected storage\n   - For better logging, add the [Telegram configuration](./docs/telegram-notifications.md) so moneyman can send private logs and errors\n3. Build and upload the Docker image using the \"Run workflow\" button in [workflows/build.yml](../../actions/workflows/build.yml)\n4. Wait for the [scrape workflow](../../actions/workflows/scrape.yml) to be triggered by GitHub\n\n### Locally\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eFrom code\u003c/b\u003e\u003c/summary\u003e\n\n1. Clone this repo\n2. Run `npm install`\n3. Run `npm run build`\n4. Provide your configuration via `MONEYMAN_CONFIG` (inline JSON) or point `MONEYMAN_CONFIG_PATH` to a JSON/JSONC file\n5. Run `npm start`\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eFrom Docker\u003c/b\u003e\u003c/summary\u003e\n\n1. Provide configuration via `MONEYMAN_CONFIG` (inline JSON) or mount a config file (recommended below)\n2. `docker run --rm -e MONEYMAN_CONFIG=\"$(cat config.json)\" ghcr.io/daniel-hauser/moneyman:latest`\n\n#### Using a configuration file (recommended)\n\nInstead of passing the configuration as an environment variable, you can mount a configuration file:\n\n```bash\ndocker run --rm \\\n  -v /path/to/config:/config \\\n  -e MONEYMAN_CONFIG_PATH=/config/config.json \\\n  ghcr.io/daniel-hauser/moneyman:latest\n```\n\nOr use Docker secrets:\n\n```bash\ndocker run --rm \\\n  --secret config.json \\\n  -e MONEYMAN_CONFIG_PATH=/run/secrets/config.json \\\n  ghcr.io/daniel-hauser/moneyman:latest\n```\n\n#### Logging\n\nBy default, the Docker image is configured with `MONEYMAN_UNSAFE_STDOUT=false` to prevent sensitive data from appearing in Docker logs. When enabled, the logs are redirected to `/tmp/moneyman.log` and sent to the Telegram chat automatically (if configured).\n\nLogs sent to `logToPublicLog` bypass the redirection and will appear in the Docker logs.\n\n\u003c/details\u003e\n\n### Debug\n\nMoneyman uses the [debug](https://www.npmjs.com/package/debug) package for debug messages under the `moneyman:` namespace.\n\nTo enable debug output, set the `DEBUG` environment variable to `moneyman:*`.\n\n## Settings\n\n### Accounts\n\nMoneyman uses a JSON configuration for all settings. You can provide configuration in two ways:\n\n1. **`MONEYMAN_CONFIG` environment variable**: The JSON configuration as a string\n2. **`MONEYMAN_CONFIG_PATH` environment variable**: Path to a JSON or JSONC configuration file\n\nThe configuration file approach is recommended for Docker/Kubernetes environments and supports JSON with Comments (JSONC) for better readability.\n\n\u003e [!TIP]\n\u003e See [`config.example.jsonc`](./config.example.jsonc) for a complete example configuration file with comments.\n\n#### Accounts Configuration\n\nA JSON array of accounts following [this](https://github.com/eshaham/israeli-bank-scrapers#specific-definitions-per-scraper) schema with an additional `companyId` field set to a [companyType](https://github.com/eshaham/israeli-bank-scrapers/blob/master/src/definitions.ts#L5:L23) value.\n\n```typescript\naccounts: Array\u003c{\n  companyId: string;\n  password: string;\n  /**\n   * And any other fields required by the specific scraper\n   */\n}\u003e;\n```\n\n#### Other configurations\n\n| env variable name        | default               | description                                                                                           |\n| ------------------------ | --------------------- | ----------------------------------------------------------------------------------------------------- |\n| `TZ`                     | `'Asia/Jerusalem'`    | A timezone for the process - used for the formatting of the timestamp                                 |\n| `MONEYMAN_CONFIG`        |                       | The JSON configuration for the process                                                                |\n| `MONEYMAN_CONFIG_PATH`   |                       | Path to a JSON/JSONC configuration file (used if `MONEYMAN_CONFIG` is not set)                        |\n| `SEND_NEW_CONFIG_TO_TG`  | `\"false\"`             | Set to `\"true\"` to send the current configuration as `config.txt` via Telegram for debugging purposes |\n| `MONEYMAN_UNSAFE_STDOUT` | `\"false\"`             | Set to `\"true\"` to allow sensitive data to be printed to stdout instead of a log file                 |\n| `MONEYMAN_LOG_FILE_PATH` | `\"/tmp/moneyman.log\"` | The file path where logs are stored when `MONEYMAN_UNSAFE_STDOUT` is set to `\"false\"`                 |\n\n```typescript\noptions: {\n  scraping: {\n    /**\n     * A comma separated list of providers to take from `accounts`. if empty, all accounts will be used\n     * @default all accounts\n     */\n    accountsToScrape?: string[];\n    /**\n     * The amount of days back to scrape\n     * @default 10\n     */\n    daysBack?: number;\n    /**\n     * The amount of months that will be scrapped in the future, starting from the day calculated using `daysBack`\n     * @default 1\n     */\n    futureMonths?: number;\n    /**\n     * The hash type to use for the transaction hash. Can be `moneyman` or empty. The default will be changed to `moneyman` in the upcoming versions\n     * @default \"\"\n     */\n    transactionHashType?: \"\" | \"moneyman\";\n    /**\n     * If set to `'true'`, enables the `additionalTransactionInformation` option in the underlying scraper, which may provide more detailed transaction data for some providers.\n     * @default false\n     */\n    additionalTransactionInfo?: boolean;\n    /**\n     * A comma separated list of deprecations to hide\n     * @default []\n     */\n    hiddenDeprecations?: string[];\n    /**\n     * An ExecutablePath for the scraper. if undefined defaults to system.\n     */\n    puppeteerExecutablePath?: string;\n    /**\n     * The maximum number of parallel scrapers to run\n     * @default 1\n     */\n    maxParallelScrapers?: number;\n    /**\n     * Enable tracking of all domains accessed during scraping\n     * @default false\n     */\n    domainTracking?: boolean;\n  },\n  logging: {\n    /**\n     * The URL to get IP information from\n     * @default \"https://ipinfo.io/json\"\n     */\n    getIpInfoUrl?: string;\n  };\n};\n```\n\n### Domain Security\n\nMoneyman supports domain tracking and firewall rules to control which domains each scraper can access. See [Domain Security](./docs/domain-security.md) for setup instructions.\n\n### Get notified in Telegram\n\nWe use Telegram to send you the update status, including support for OTP 2FA with OneZero accounts. See [Telegram Notifications](./docs/telegram-notifications.md) for setup instructions.\n\n### Destinations\n\n| Destination                                          | Description                                            |\n| ---------------------------------------------------- | ------------------------------------------------------ |\n| [Telegram](./docs/telegram.md)                       | Send transactions as a JSON file to your Telegram chat |\n| [Google Sheets](./docs/google-sheets.md)             | Export transactions to a Google Sheets spreadsheet     |\n| [Azure Data Explorer](./docs/azure-data-explorer.md) | Export transactions to an Azure Data Explorer cluster  |\n| [YNAB](./docs/ynab.md)                               | Export transactions to YNAB (YouNeedABudget)           |\n| [Buxfer](./docs/buxfer.md)                           | Export transactions to Buxfer                          |\n| [Actual Budget](./docs/actual-budget.md)             | Export transactions to Actual Budget                   |\n| [PostgreSQL](./docs/postgresql.md)                   | Persist transactions in a PostgreSQL database          |\n| [Web Post](./docs/web-post.md)                       | Export transactions as a POST request to a web address |\n| [JSON files](./docs/json.md)                         | Export transactions to local JSON files                |\n| [Excel on OneDrive](./docs/excel-onedrive.md)        | Export transactions to Excel on OneDrive (WIP)         |\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdaniel-hauser%2Fmoneyman","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdaniel-hauser%2Fmoneyman","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdaniel-hauser%2Fmoneyman/lists"}