{"id":22003654,"url":"https://github.com/zs1l3nt/web-monetary","last_synced_at":"2026-04-09T13:54:43.897Z","repository":{"id":62911829,"uuid":"558395682","full_name":"zS1L3NT/web-monetary","owner":"zS1L3NT","description":"Monetary is a finance tracker built on the microservices architecture that allows you to record all of your finances manually","archived":false,"fork":false,"pushed_at":"2023-02-07T09:00:38.000Z","size":882,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-01-28T12:44:29.668Z","etag":null,"topics":["chakraui","cypress","docker","githubactions","laravel","php","phpunit","postgresql","react","typescript"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zS1L3NT.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":"2022-10-27T13:17:44.000Z","updated_at":"2024-01-11T16:24:13.000Z","dependencies_parsed_at":"2023-02-18T15:02:23.440Z","dependency_job_id":null,"html_url":"https://github.com/zS1L3NT/web-monetary","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/zS1L3NT%2Fweb-monetary","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zS1L3NT%2Fweb-monetary/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zS1L3NT%2Fweb-monetary/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zS1L3NT%2Fweb-monetary/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zS1L3NT","download_url":"https://codeload.github.com/zS1L3NT/web-monetary/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245061377,"owners_count":20554563,"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":["chakraui","cypress","docker","githubactions","laravel","php","phpunit","postgresql","react","typescript"],"created_at":"2024-11-30T00:10:22.284Z","updated_at":"2025-12-30T19:27:42.125Z","avatar_url":"https://github.com/zS1L3NT.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Monetary\r\n\r\n![License](https://img.shields.io/github/license/zS1L3NT/web-monetary?style=for-the-badge) ![Languages](https://img.shields.io/github/languages/count/zS1L3NT/web-monetary?style=for-the-badge) ![Top Language](https://img.shields.io/github/languages/top/zS1L3NT/web-monetary?style=for-the-badge) ![Commit Activity](https://img.shields.io/github/commit-activity/y/zS1L3NT/web-monetary?style=for-the-badge) ![Last commit](https://img.shields.io/github/last-commit/zS1L3NT/web-monetary?style=for-the-badge)\r\n\r\nMonetary is an expense tracking website that allows you to take control of your finances yourself. This is a rebuild of an app that I personally use everyday to track my finances, Wallet.\r\n\r\nMonetary is build using the microservices architecture and is split into 7 microservices. The backend has been tested with PHPUnit and the frontend has been tested with Cypress. Github Action will automatically test the application and make sure the tests pass before deploying them to the server, see the [Actions](http://github.com/zS1L3NT/web-monetary/actions) tab\r\n\r\nView the video demonstration of the website, pipelines and testing [here](https://youtu.be/dPQL6_mx2CA)\r\n\r\n## Motivation\r\n\r\nI needed a deliverable for my CADV (Cloud Application Development) and DevOps (Development Operations) submissions. I decided to clone Wallet because it was a big project and I was looking for a challenge.\r\n\r\n## Subrepositories\r\n\r\n### [`web-laravel-monetary-account`](web-laravel-monetary-account)\r\n\r\nThe Account microservice which handles accounts (bank, cash, etc)\r\n\r\n### [`web-laravel-monetary-authentication`](web-laravel-monetary-authentication)\r\n\r\nThe Authentication microservice which handles user authentication and data (login, logout, etc)\r\n\r\n### [`web-laravel-monetary-budget`](web-laravel-monetary-budget)\r\n\r\nThe Budget microservice which handles budgets (monthly, weekly, etc)\r\n\r\n### [`web-laravel-monetary-category`](web-laravel-monetary-category)\r\n\r\nThe Category microservice which handles categories (food, bills, etc)\r\n\r\n### [`web-laravel-monetary-debt`](web-laravel-monetary-debt)\r\n\r\nThe Debt microservice which handles debts (loans, etc)\r\n\r\n### [`web-laravel-monetary-recurrence`](web-laravel-monetary-recurrence)\r\n\r\nThe Recurrence microservice which handles recurrences (spotify subscription, dicord nitro subscription, etc)\r\n\r\n### [`web-laravel-monetary-transaction`](web-laravel-monetary-transaction)\r\n\r\nThe Transaction microservice which handles transactions (purchases, etc)\r\n\r\n### [`web-react-monetary`](web-react-monetary)\r\n\r\nThe React frontend of the application\r\n\r\n## Features\r\n\r\n-   Authentication\r\n    -   Login with email and password\r\n    -   Register with email and password\r\n    -   Reset password with email\r\n    -   Update user email and password\r\n-   Account\r\n    -   Create Accounts\r\n    -   View \u0026 Sort Accounts\r\n    -   Update Accounts\r\n    -   Delete Accounts\r\n-   Budget\r\n    -   Create Budgets\r\n    -   View Budgets and their Transactions\r\n    -   Update Budgets\r\n    -   Delete Budgets\r\n-   Category\r\n    -   Create Categories\r\n    -   View Categories\r\n    -   Update Categories\r\n    -   Delete Categories\r\n-   Debt\r\n    -   Create Debts\r\n    -   View Debts and their Transactions\r\n    -   Update Debts\r\n    -   Delete Debts\r\n-   Recurrence\r\n    -   Create Recurrences\r\n    -   View Recurrences and their Transactions\r\n    -   Update Recurrences\r\n    -   Delete Recurrences\r\n-   Transaction\r\n    -   Create Transactions\r\n    -   View Transactions\r\n    -   Update Transactions\r\n    -   Delete Transactions\r\n\r\n## Usage\r\n\r\n### Locally\r\n\r\nCopy the .env.example file to .env then fill in the file with the correct project credentials.\r\n\r\n```bash\r\n$ docker compose up -d --build\r\n```\r\n\r\nYou also need to have a local installation of NGINX, then set the configuration to that in [`nginx.dev.conf`](nginx.dev.conf)\r\n\r\n### Deployment\r\n\r\nSince deployment can be different for everyone in terms what OS you're deploying to, I will give a general overview of how I deploy the application. You also need a PostgreSQL database hosted somewhere on the internet or locally. I will also assume that you have a fork of this repository so that you can use Github actions to deploy the application automatically.\r\n\r\nWith this current configuration, all the Github Actions workflows will deploy to one server. If you want you can change that to deploy to multiple servers to follow the microserviecs architecture properly.\r\n\r\n#### Setting up the server\r\n\r\nThe server will need to have `docker` and `nginx` installed. The nginx configuration of the server will need to be set to that in [`nginx.prod.conf`](nginx.prod.conf). It will also need to be open to SSH connections so that Github Actions can deploy the application.\r\n\r\n#### Setting up the Github Actions\r\n\r\nIn your Github project settings, go to **Environments** and add a new environment called `production` and set all the environment variables in [`.env.example`](.env.example) to the correct values. Also under **Secrets and variables** and **Actions**, add all the secrets in [`.secrets.example`](.secrets.example) except `GITHUB_TOKEN` to the repository.\r\n\r\n## Credits\r\n\r\nI had difficulties installing PHP on MacOS, [this](https://gist.github.com/giorgiofellipe/6282df335fd310de4108) tutorial really helped me fix that\r\n\r\n## Tests\r\n\r\n### Backend\r\n\r\nVSCode Extensions do quite a good job in detecting PHPUnit tests, but if you want to run them manually, you can run the following command in each directory\r\n\r\n```bash\r\nvendor/bin/phpunit tests\r\n```\r\n\r\nJust make sure the environment variables are detected by the script\r\n\r\n### Frontend\r\n\r\n```bash\r\npnpx cypress open\r\n```\r\n\r\nThen use the Cypress UI to run each test individually\r\n\r\n## Built with\r\n\r\n-   React\r\n    -   TypeScript\r\n        -   [![@types/luxon](https://img.shields.io/badge/%40types%2Fluxon-%5E3.1.0-red?style=flat-square)](https://npmjs.com/package/@types/luxon/v/3.1.0)\r\n        -   [![@types/react](https://img.shields.io/badge/%40types%2Freact-%5E18.0.26-red?style=flat-square)](https://npmjs.com/package/@types/react/v/18.0.26)\r\n        -   [![@types/react-dom](https://img.shields.io/badge/%40types%2Freact--dom-%5E18.0.10-red?style=flat-square)](https://npmjs.com/package/@types/react-dom/v/18.0.10)\r\n        -   [![typescript](https://img.shields.io/badge/typescript-%5E4.9.4-red?style=flat-square)](https://npmjs.com/package/typescript/v/4.9.4)\r\n    -   Chakra UI\r\n        -   [![@chakra-ui/icons](https://img.shields.io/badge/%40chakra--ui%2Ficons-%5E2.0.14-red?style=flat-square)](https://npmjs.com/package/@chakra-ui/icons/v/2.0.14)\r\n        -   [![@chakra-ui/react](https://img.shields.io/badge/%40chakra--ui%2Freact-%5E2.4.4-red?style=flat-square)](https://npmjs.com/package/@chakra-ui/react/v/2.4.4)\r\n        -   [![@chakra-ui/styled-system](https://img.shields.io/badge/%40chakra--ui%2Fstyled--system-%5E2.5.0-red?style=flat-square)](https://npmjs.com/package/@chakra-ui/styled-system/v/2.5.0)\r\n        -   [![@chakra-ui/system](https://img.shields.io/badge/%40chakra--ui%2Fsystem-%5E2.3.5-red?style=flat-square)](https://npmjs.com/package/@chakra-ui/system/v/2.3.5)\r\n        -   [![@emotion/react](https://img.shields.io/badge/%40emotion%2Freact-%5E11.10.5-red?style=flat-square)](https://npmjs.com/package/@emotion/react/v/11.10.5)\r\n        -   [![@emotion/styled](https://img.shields.io/badge/%40emotion%2Fstyled-%5E11.10.5-red?style=flat-square)](https://npmjs.com/package/@emotion/styled/v/11.10.5)\r\n        -   [![framer-motion](https://img.shields.io/badge/framer--motion-%5E8.0.2-red?style=flat-square)](https://npmjs.com/package/framer-motion/v/8.0.2)\r\n    -   React\r\n        -   [![@babel/core](https://img.shields.io/badge/%40babel%2Fcore-%5E7.20.7-red?style=flat-square)](https://npmjs.com/package/@babel/core/v/7.20.7)\r\n        -   [![react](https://img.shields.io/badge/react-%5E18.2.0-red?style=flat-square)](https://npmjs.com/package/react/v/18.2.0)\r\n        -   [![react-dom](https://img.shields.io/badge/react--dom-%5E18.2.0-red?style=flat-square)](https://npmjs.com/package/react-dom/v/18.2.0)\r\n        -   [![react-router-dom](https://img.shields.io/badge/react--router--dom-%5E6.6.1-red?style=flat-square)](https://npmjs.com/package/react-router-dom/v/6.6.1)\r\n    -   Redux\r\n        -   [![@reduxjs/toolkit](https://img.shields.io/badge/%40reduxjs%2Ftoolkit-%5E1.9.1-red?style=flat-square)](https://npmjs.com/package/@reduxjs/toolkit/v/1.9.1)\r\n        -   [![immer](https://img.shields.io/badge/immer-%5E9.0.16-red?style=flat-square)](https://npmjs.com/package/immer/v/9.0.16)\r\n        -   [![react-redux](https://img.shields.io/badge/react--redux-%5E8.0.5-red?style=flat-square)](https://npmjs.com/package/react-redux/v/8.0.5)\r\n        -   [![use-immer](https://img.shields.io/badge/use--immer-%5E0.8.1-red?style=flat-square)](https://npmjs.com/package/use-immer/v/0.8.1)\r\n    -   Vite\r\n        -   [![@vitejs/plugin-react](https://img.shields.io/badge/%40vitejs%2Fplugin--react-%5E3.0.0-red?style=flat-square)](https://npmjs.com/package/@vitejs/plugin-react/v/3.0.0)\r\n        -   [![vite](https://img.shields.io/badge/vite-%5E4.0.3-red?style=flat-square)](https://npmjs.com/package/vite/v/4.0.3)\r\n    -   Miscellaneous\r\n        -   [![axios](https://img.shields.io/badge/axios-%5E1.2.1-red?style=flat-square)](https://npmjs.com/package/axios/v/1.2.1)\r\n        -   [![chart.js](https://img.shields.io/badge/chart.js-%5E4.1.1-red?style=flat-square)](https://npmjs.com/package/chart.js/v/4.1.1)\r\n        -   [![cypress](https://img.shields.io/badge/cypress-%5E12.4.0-red?style=flat-square)](https://npmjs.com/package/cypress/v/12.4.0)\r\n        -   [![formik](https://img.shields.io/badge/formik-%5E2.2.9-red?style=flat-square)](https://npmjs.com/package/formik/v/2.2.9)\r\n        -   [![luxon](https://img.shields.io/badge/luxon-%5E3.1.1-red?style=flat-square)](https://npmjs.com/package/luxon/v/3.1.1)\r\n        -   [![react-chartjs-2](https://img.shields.io/badge/react--chartjs--2-%5E5.1.0-red?style=flat-square)](https://npmjs.com/package/react-chartjs-2/v/5.1.0)\r\n        -   [![react-colorful](https://img.shields.io/badge/react--colorful-%5E5.6.1-red?style=flat-square)](https://npmjs.com/package/react-colorful/v/5.6.1)\r\n        -   [![react-icons](https://img.shields.io/badge/react--icons-%5E4.7.1-red?style=flat-square)](https://npmjs.com/package/react-icons/v/4.7.1)\r\n        -   [![react-select](https://img.shields.io/badge/react--select-%5E5.7.0-red?style=flat-square)](https://npmjs.com/package/react-select/v/5.7.0)\r\n        -   [![zod](https://img.shields.io/badge/zod-%5E3.20.2-red?style=flat-square)](https://npmjs.com/package/zod/v/3.20.2)\r\n-   Laravel\r\n    -   Authentication\r\n        -   [![tymon/jwt-auth](https://img.shields.io/badge/tymon%2Fjwt--auth-*-red?style=flat-square)](https://packagist.org/packages/tymon/jwt-auth)\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzs1l3nt%2Fweb-monetary","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzs1l3nt%2Fweb-monetary","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzs1l3nt%2Fweb-monetary/lists"}