{"id":25188313,"url":"https://github.com/aloussase/s32efv","last_synced_at":"2025-04-04T09:42:55.063Z","repository":{"id":275775642,"uuid":"927155732","full_name":"aloussase/S32EFV","owner":"aloussase","description":"🤑  Get awesome insights about your expenses following the 50/30/20 scheme","archived":false,"fork":false,"pushed_at":"2025-02-11T18:32:12.000Z","size":207,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-11T19:22:01.030Z","etag":null,"topics":["cabal","expenses","haskell","money"],"latest_commit_sha":null,"homepage":"","language":"Haskell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/aloussase.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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":"2025-02-04T13:54:46.000Z","updated_at":"2025-02-11T18:32:15.000Z","dependencies_parsed_at":"2025-02-11T19:21:56.198Z","dependency_job_id":null,"html_url":"https://github.com/aloussase/S32EFV","commit_stats":null,"previous_names":["aloussase/s32efv"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aloussase%2FS32EFV","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aloussase%2FS32EFV/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aloussase%2FS32EFV/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aloussase%2FS32EFV/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/aloussase","download_url":"https://codeload.github.com/aloussase/S32EFV/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247157083,"owners_count":20893203,"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":["cabal","expenses","haskell","money"],"created_at":"2025-02-09T20:19:32.050Z","updated_at":"2025-04-04T09:42:55.053Z","avatar_url":"https://github.com/aloussase.png","language":"Haskell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 💸 50/30/20 Expenses Framework Visualizer\n\n![Example Dashboard](./assets/demo.png)\n\nThe 50/30/20 framework for managing for expenses basically means setting 20% of you income aside as savings,\n30% for things that you want (_wants_) and 50% for things that you need (_needs_). You can read more about it\non the internet.\n\nThis project consists of an HTTP API to upload your account balance, classify expenses into needs and wants,\nstore them to a local Postgres database, and use that data to feed a Grafana dashboard so you can get\nwonderful insights into your expenses 🤩.\n\n## 📄 Expenses file format\n\nThe file format that the application uses is the one that can be obtained by downloading your account balance from\nyour bank website. It must be a TXT file.\n\nI don't know if all banks follow the same format. I have tested using Banco Guayaquil. If you want support for\nanother format, feel free to open an issue about it :).\n\n**Currently supported formats**\n\n- Banco Guayaquil\n- Banco Bolivariano\n\n\u003e [!IMPORTANT]\n\u003e Please, make sure your input file is UTF-8 encoded. Some banks export in a different file format.\n\n## 🔍 How are expenses classified?\n\nExpenses classification is a very subjective topic, since what is considered a need for me may be a want for you.\nClassification is performed by matching movement records against strings that fall into either category.\n\nYou are encouraged to modify the Haskell source code in the `lib` directory to make the classifier work for you.\nSpecifically, there are two lists, `wants` and `needs` that you can modify to suit your particular case.\n\n## 💻 Run locally\n\nFirst, make sure you have Docker 🐳 and docker compose 🐙 installed on your system.\nThen, go through the following steps.\n\n1. Clone this repository (or your fork)\n\n```\ngit clone https://github.com/aloussase/S32EFV\ncd S32EFV\n```\n\n2. Spin up the containers with docker compose\n\n\u003e [!NOTE]\n\u003e You will likely need to modify the environment variables in the compose file to suite your specific bank.\n\n```\n# If you have standalone docker compose\ndocker-compose up -d\n\n# If you are using the compose plugin\ndocker compose up -d\n```\n\n3. Go to the Grafana dashboard @ http://localhost:3000\n4. Enter the admin credentials (admin, admin)\n5. Set your new password 🔑 (only important if you want to expose your dashboard publicly)\n6. Open the Expenses Dashboard, you'll see there's no data\n7. Hit the API to upload your expenses file and seed the database\n\n```\n# Using HTTPie, you can also use cURL or Postman\nhttp -f POST :3001/api/expenses file@./expenses.txt\n```\n\n8. Refresh the dashboard\n9. Some panels depend on a `montly_income` variable that is used to calculate percentages,\n   to configure this variable go to your dashboard settings and set it to the correct\n   value for you\n\n## 🐘 Connecting to the database directly\n\nIf you need to connect to the database for some reason, run the following command\n\n```\ndocker-compose exec db psql -U S32EFV\n```\n\n## 🫰 Contributing\n\nFeel free to contribute in any of these ways:\n\n- New panels with insightful data\n- Improvements to API functionality\n- Bug fixing\n- Dashboard improvements\n- Support for different file formats\n- etc\n\n## 👮 License\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faloussase%2Fs32efv","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faloussase%2Fs32efv","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faloussase%2Fs32efv/lists"}