{"id":13694534,"url":"https://github.com/maxhumber/BreadBuddy","last_synced_at":"2025-05-03T04:30:38.431Z","repository":{"id":41813905,"uuid":"477761375","full_name":"maxhumber/BreadBuddy","owner":"maxhumber","description":"Recipe scheduler for iOS","archived":false,"fork":false,"pushed_at":"2024-01-31T18:00:02.000Z","size":16035,"stargazers_count":149,"open_issues_count":1,"forks_count":7,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-04-07T03:27:13.366Z","etag":null,"topics":["cadi","ios","ios-app","mvvm","swift","swiftui","swiftui-example"],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-2-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/maxhumber.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","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},"funding":{"github":"maxhumber","patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"lfx_crowdfunding":null,"custom":null}},"created_at":"2022-04-04T15:28:40.000Z","updated_at":"2025-01-24T05:40:28.000Z","dependencies_parsed_at":"2024-04-12T23:45:24.240Z","dependency_job_id":"8a674403-9ae7-4a92-90ff-9deda0b681a5","html_url":"https://github.com/maxhumber/BreadBuddy","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxhumber%2FBreadBuddy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxhumber%2FBreadBuddy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxhumber%2FBreadBuddy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxhumber%2FBreadBuddy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/maxhumber","download_url":"https://codeload.github.com/maxhumber/BreadBuddy/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252144275,"owners_count":21701379,"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":["cadi","ios","ios-app","mvvm","swift","swiftui","swiftui-example"],"created_at":"2024-08-02T17:01:34.289Z","updated_at":"2025-05-03T04:30:33.421Z","avatar_url":"https://github.com/maxhumber.png","language":"Swift","readme":"\u003ch3\u003e\n  \u003cimg src=\"https://raw.githubusercontent.com/maxhumber/BreadBuddy/master/Marketing/Logos/BreadBuddy.png\" height=\"24px\" alt=\"BreadBuddy Logo\"\u003e\n  BreadBuddy\n\u003c/h3\u003e\n\nBreadBuddy is a recipe scheduler for iOS. I use it to schedule my overnight pizza dough, and my partner uses it to schedule her awesomely complicated (but incredibly yummy) sourdough baguettes!\n\n### Screenshots\n\n\u003ch3\u003e\n  \u003cimg src=\"https://raw.githubusercontent.com/maxhumber/BreadBuddy/master/Marketing/Screenshots/screenshot_13pm_1.png\" height=\"300px\" alt=\"BreadBuddy1\"\u003e\n  \u003cimg src=\"https://raw.githubusercontent.com/maxhumber/BreadBuddy/master/Marketing/Screenshots/screenshot_13pm_2.png\" height=\"300px\" alt=\"BreadBuddy2\"\u003e\n  \u003cimg src=\"https://raw.githubusercontent.com/maxhumber/BreadBuddy/master/Marketing/Screenshots/screenshot_13pm_3.png\" height=\"300px\" alt=\"BreadBuddy3\"\u003e\n  \u003cimg src=\"https://raw.githubusercontent.com/maxhumber/BreadBuddy/master/Marketing/Screenshots/screenshot_13pm_4.png\" height=\"300px\" alt=\"BreadBuddy4\"\u003e\n\u003c/h3\u003e\n\n### Download\n\n[![BreadBuddy Download Link](https://raw.githubusercontent.com/maxhumber/BreadBuddy/master/Marketing/Logos/AppStore.svg)](https://apps.apple.com/app/id1620912870)\n\n### Open Source\n\nBreadBuddy is the reference I wish I had when I was first learning how to build apps with Swift/SwiftUI. It was therefore built to be open source.\n\n### Code Philosophy\n\nThe source code for BreadBuddy is meant to be read, tested, and replaced. The app is influenced by—but not beholden to—Clean Code, [SOLID](https://en.wikipedia.org/wiki/SOLID), and TDD. \n\n### ⛳️ CADI\n\nBreadBuddy is built with SwiftUI and [MVVM](https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93viewmodel). And is organized with CADI, an acronym that stands for **C**ore, **A**pp, **D**ata, **I**nterface. Pronounced like, and inspired by, \"[Caddie](https://en.wikipedia.org/wiki/Caddie)\", the system compliments MVVM through the use of folders, local packages, and protocols to make feature iteration, code replacement, and refactoring a relative breeze...\n\n- [**Core/**](https://github.com/maxhumber/BreadBuddy/tree/master/BreadBuddy/Core)*\n  - Models (the **M** in **M**VVM)\n    - Core data representations\n  - Services (domain logic)\n    - Made as thin as possible\n  - Type extensions\n  - Critical unit tests\n- [**App/**](https://github.com/maxhumber/BreadBuddy/tree/master/BreadBuddy/App)\n  - @main entry point\n  - Configuration files\n  - Asset catalogues\n  - Environment/plist variables\n- [**Data/**](https://github.com/maxhumber/BreadBuddy/tree/master/BreadBuddy/Data)\n  - Database \n    - UserDefaults, CoreData, [GRDB.swift](https://github.com/groue/GRDB.swift), or similar\n  - Stores\n    - With protocols to allow for future data layer substitutions\n- [**Interface/**](https://github.com/maxhumber/BreadBuddy/tree/master/BreadBuddy/Interface)\n  - Views (the **V** in M**V**VM)\n    - Organized by Screen\n    - Co-located/nested ViewModels (the **VM** in MV**VM**)\n  - Fonts\n  - Colors\n  - Sugar*\n    - Custom and reusable UI components\n\n​\t*Core and Sugar are local packages firewall-ed from the rest of the app\n\n### Notable Files\n\n- [`RecipeService.swift`](https://github.com/maxhumber/BreadBuddy/blob/master/BreadBuddy/Core/Sources/Core/Recipe/Service/RecipeService.swift) - core engine of the app (really not that complicated)\n- [`RecipeServiceTests.swift`](https://github.com/maxhumber/BreadBuddy/blob/master/BreadBuddy/Core/Tests/CoreTests/RecipeServiceTests.swift) - XCTestCase for the core engine\n- [`Data/Database`](https://github.com/maxhumber/BreadBuddy/tree/master/BreadBuddy/Data/Database) - files for the GRDB/SQLite data persistence layer\n- [`RecipeStore.swift`](https://github.com/maxhumber/BreadBuddy/blob/master/BreadBuddy/Data/Stores/Recipe/RecipeStore.swift) - replaceable bridge intended to span ViewModel and data persistence layer\n- [`AlertInput`](https://github.com/maxhumber/BreadBuddy/tree/master/BreadBuddy/Interface/Sugar/Sources/Sugar/AlertInput) - files that wrap a UIKit input alert for usage in SwiftUI\n","funding_links":["https://github.com/sponsors/maxhumber"],"categories":["Misc"],"sub_categories":["SwiftUI"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaxhumber%2FBreadBuddy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmaxhumber%2FBreadBuddy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaxhumber%2FBreadBuddy/lists"}