{"id":20652962,"url":"https://github.com/unosd/unocash","last_synced_at":"2025-04-18T21:39:42.375Z","repository":{"id":54396446,"uuid":"204349972","full_name":"UnoSD/UnoCash","owner":"UnoSD","description":"Personal finance, expenses tracking, splitting, receipt photos automatic recognition","archived":false,"fork":false,"pushed_at":"2021-03-06T01:25:59.000Z","size":1891,"stargazers_count":6,"open_issues_count":0,"forks_count":2,"subscribers_count":3,"default_branch":"master","last_synced_at":"2023-03-21T21:19:41.751Z","etag":null,"topics":["azure","azure-blob","azure-functions","azure-storage","blazor","blazor-client","csharp","pulumi","pulumi-azure","wasm","webassembly"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/UnoSD.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}},"created_at":"2019-08-25T21:07:56.000Z","updated_at":"2023-02-28T19:08:05.000Z","dependencies_parsed_at":"2022-08-13T14:20:54.448Z","dependency_job_id":null,"html_url":"https://github.com/UnoSD/UnoCash","commit_stats":null,"previous_names":[],"tags_count":null,"template":null,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/UnoSD%2FUnoCash","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/UnoSD%2FUnoCash/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/UnoSD%2FUnoCash/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/UnoSD%2FUnoCash/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/UnoSD","download_url":"https://codeload.github.com/UnoSD/UnoCash/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":224950853,"owners_count":17397385,"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":["azure","azure-blob","azure-functions","azure-storage","blazor","blazor-client","csharp","pulumi","pulumi-azure","wasm","webassembly"],"created_at":"2024-11-16T17:39:46.408Z","updated_at":"2024-11-16T17:39:46.977Z","avatar_url":"https://github.com/UnoSD.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# UnoCash\n\n#### UnoSD/UnoCash is just for C# end-to-end demo purposes\n#### UnoSD/UnoCash.Fable is F# end-to-end under active development\n\nThis tool is an attempt to consolidate and improve several other tools I use for personal finance:\n\n* A desktop application I use to store transactions and get reports with graphs\n* A bill splitting SaaS tool called Splitwise which works with a web app or mobile app to share and keep track of shared expenses both in groups in between individuals\n* A tool to automatically recognise receipts from pictures and populate a transaction (this is not something I use, but I do manually at the moment)\n* Potentially, using mobile payment methods to feed directly data into UnoCash without using receipts at all (when you're not paying cash)\n\n# Architecture\n\n![Outdated infrastructure diagram](https://github.com/UnoSD/UnoCash/raw/master/Architecture.png)\n\n# Technologies\n\nI am using the latest modern (and cool) technologies available; several are in preview, but, for now, this is not something I mean to publish as a stable production system; by the time (and if) is completed it they will likely be GA.\n\nIt is also something I will probably use in my tech talks as a prototype of a modern serverless SaaS application.\n\nThe project uses:\n\n* Blazor client side to create a SPA in WebAssembly and to have full end-to-end .NET, it also allows sharing of libraries between front end and back end making my life easier and it's awsome compared to text-searching JavaScript and getting version conflicts between DTOs updated on either end (Now most of the front end work is in Fable + Elmish)\n* Azure Functions as a serverless microservice back end, deployed in a consumption plan so extremely cheap\n* Azure Storage blobs to host the static website in Blazor so no need for any compute for the front end\n* Azure Tables for storage, because it's way cheaper than Cosmos DB and it is behind the same SDK API so it can be easily migrated\n* Azure Form Recognizer to analyse receipt photos and extract data (still in private preview, I had to request access to Microsoft)\n* Azure API Management on a consumption plan to manage calls from the front end to back end, adding security and quotas\n* Azure AD for authentication\n* Pulumi for deployments (using my Pulumi.FSharp.Azure DSL library for idiomatic F# feel) (and ARM and Azure CLI for missing features in Pulumi)\n\nIt will use soon-ish:\n\n* Azure AD B2C for identity\n* Not that soon: Azure Front Door for WAF, CDN and global load balancing\n* Not that soon: AKS to host analytics services\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Funosd%2Funocash","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Funosd%2Funocash","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Funosd%2Funocash/lists"}