{"id":25138416,"url":"https://github.com/foscomputerservices/fosutilities","last_synced_at":"2026-04-16T04:01:25.123Z","repository":{"id":152622654,"uuid":"625560881","full_name":"foscomputerservices/FOSUtilities","owner":"foscomputerservices","description":"Swift libraries for supporting the Model-View-ViewModel pattern on macOS, iOS, Windows and Linux","archived":false,"fork":false,"pushed_at":"2026-04-14T20:38:57.000Z","size":1615,"stargazers_count":2,"open_issues_count":10,"forks_count":2,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-04-14T22:24:52.230Z","etag":null,"topics":["ios","ios-swift","linux","macos","macos-swift","mvvm","mvvm-architecture","mvvm-framework","vapor-4","vapor-swift","windows"],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/foscomputerservices.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2023-04-09T13:51:35.000Z","updated_at":"2026-04-14T20:39:01.000Z","dependencies_parsed_at":"2025-08-22T19:14:01.303Z","dependency_job_id":"c2b24f48-f793-4469-affa-51cb17c0b863","html_url":"https://github.com/foscomputerservices/FOSUtilities","commit_stats":null,"previous_names":[],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/foscomputerservices/FOSUtilities","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/foscomputerservices%2FFOSUtilities","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/foscomputerservices%2FFOSUtilities/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/foscomputerservices%2FFOSUtilities/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/foscomputerservices%2FFOSUtilities/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/foscomputerservices","download_url":"https://codeload.github.com/foscomputerservices/FOSUtilities/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/foscomputerservices%2FFOSUtilities/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31870516,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-15T15:24:51.572Z","status":"online","status_checked_at":"2026-04-16T02:00:06.042Z","response_time":69,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["ios","ios-swift","linux","macos","macos-swift","mvvm","mvvm-architecture","mvvm-framework","vapor-4","vapor-swift","windows"],"created_at":"2025-02-08T17:16:10.594Z","updated_at":"2026-04-16T04:01:24.978Z","avatar_url":"https://github.com/foscomputerservices.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"# FOSUtilities\n\n![Run unit tests](https://github.com/foscomputerservices/FOSUtilities/actions/workflows/ci.yml/badge.svg) ![Swift Package Manager](https://img.shields.io/badge/spm-compatible-brightgreen.svg?style=flat) [![](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Ffoscomputerservices%2FFOSUtilities%2Fbadge%3Ftype%3Dswift-versions)](https://swiftpackageindex.com/foscomputerservices/FOSUtilities) [![](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Ffoscomputerservices%2FFOSUtilities%2Fbadge%3Ftype%3Dplatforms)](https://swiftpackageindex.com/foscomputerservices/FOSUtilities)\n\nThere are multiple libraries provided by the FOSUtilities package:  FOSFoundation, FOSMVVM, FOSTesting, FOSTestingUI, FOSMVVMVapor, FOSTestingVapor.\n\n## Documentation\n\nFor guides, articles, and API documentation see the \n[library's documentation on the Web][docs] or in Xcode.\n\n[docs]: https://swiftpackageindex.com/foscomputerservices/FOSUtilities/documentation/fosfoundation\n\n## FOSFoundation\n\nFOSFoundation is a library of protocols, patterns, types and routines that I have found generally useful in my projects.  Support areas include:\n\n- Extensions to **URL** for one-line REST-Style requests\n- Extensions to **JSONEncoder** and **JSONDecoder** for single-statement encoding/decoding of **Codables**\n    - Along with standardized support for handling various **Date** and **DateTime** styles\n        - [ISO 8601](https://w.wiki/8G7)\n        - JSON\n- Extensions to **Collection** for throttling execution of requests when servers restrict the number of requests per any time period\n- Extensions on **String** such as:\n    - [CamelCase](https://w.wiki/4GVz) / [snake_case](https://w.wiki/6MmH) conversion\n    - Hexadecimal String to/from **UInt64**, **Int64**, **UInt**, and **Int**\n    - Cleaning and standardizing user-provided input\n    - Generating random and unique **String**s\n    - Swift Range support\n    - **String** obfuscation/revealing (e.g., [ROT 13/ROT 47](https://w.wiki/8$LR))\n\nFor guides, articles, and API documentation see the \n[library's documentation on the Web][docs] or in Xcode.\n\n## FOSMVVM\n\nFOSMVVM is a library that implements the [Model-View-ViewModel](https://w.wiki/4T5B) pattern for binding SwiftUI projects\nto [Vapor](https://docs.vapor.codes) web services.\n\nFor guides, articles, and API documentation see the \n[library's documentation on the Web][docs] or in Xcode.\n\n- [Getting Started with FOS MVVM](https://swiftpackageindex.com/foscomputerservices/FOSUtilities/documentation/fosmvvm)\n\n### Quick Glance\n\nHere is an example of setting up a new [Model-View-ViewModel](https://w.wiki/4T5B)-based client application\n\n#### View Model\n\n```swift\n@ViewModel\npublic struct LandingPageViewModel: RequestableViewModel {\n    public typealias Request = LandingPageRequest\n\n    @LocalizedString public var pageTitle\n\n    public var vmId = ViewModelId()\n\n    public init() {}\n\n    public static func stub() -\u003e Self { .init() }\n}\n```\n\n#### View\n\n```swift\nstruct LandingPageView: ViewModelView {\n    let viewModel: LandingPageViewModel\n\n    var body: some View {\n        VStack {\n            Text(viewModel.pageTitle)\n                .font(.headline)\n                .padding(.bottom, 30)\n        }\n        .padding()\n    }\n}\n```\n\n#### Client Application Main\n\n```swift\n@main\nstruct MyApp: App {\n    var body: some Scene {\n        WindowGroup {\n            LandingPageView.bind()\n        }\n        .environment(\n             MVVMEnvironment(\n                 currentVersion: .currentApplicationVersion,\n                 appBundle: Bundle.main,\n                 deploymentURLs: [\n                    .production, .init(serverBaseURL: URL(string: \"http://api.mywebserver.com\")!),\n                    .staging, .init(serverBaseURL: URL(string: \"http://staging-api.mywebserver.com\")!),\n                    .debug, .init(serverBaseURL: URL(string: \"http://localhost:8080\")!)\n                 ]\n            )\n        )\n    }\n}\n```\n\n#### Vapor Server Application\n\n```swift\npublic func configure(_ app: Application) async throws {\n    // uncomment to serve files from /Public folder\n    // app.middleware.use(FileMiddleware(publicDirectory: app.directory.publicDirectory))\n    // register routes\n    try routes(app)\n\n    try app.initYamlLocalization(\n        bundle: Bundle.module,\n        resourceDirectoryName: \"Resources\"\n    )\n}\n\nfunc routes(_ app: Application) throws {\n    app.routesregister(viewModel: LandingPageViewModel.self)\n}\n```\n\n## Claude Code Integration\n\nThis repository includes [Claude Code](https://claude.ai/code) skills for generating FOSMVVM architecture components. These skills help automate the creation of ViewModels, Fields protocols, DataModels, ServerRequests, and Leaf Views following FOSMVVM patterns.\n\n### Available Skills\n\n| Skill | Purpose |\n|-------|---------|\n| `fosmvvm-viewmodel-generator` | Generate ViewModels for UI screens and components |\n| `fosmvvm-fields-generator` | Generate Form Specifications with validation and localization |\n| `fosmvvm-serverrequest-generator` | Generate ServerRequest types for client-server communication |\n| `fosmvvm-fluent-datamodel-generator` | Generate Fluent DataModels for server-side persistence |\n| `fosmvvm-leaf-view-generator` | Generate Leaf templates for WebApps |\n| `fosmvvm-swiftui-view-generator` | Generate SwiftUI views that render ViewModels |\n| `fosmvvm-react-view-generator` | Generate React components that render ViewModels |\n| `fosmvvm-serverrequest-test-generator` | Generate ServerRequest tests using VaporTesting |\n| `fosmvvm-viewmodel-test-generator` | Generate ViewModel tests with multi-locale verification |\n| `fosmvvm-ui-tests-generator` | Generate UI tests for ViewModelViews |\n| `fosmvvm-swiftui-app-setup` | Set up the main App struct for SwiftUI applications |\n| `skill-generator` | Generate new Claude Code skills |\n\n### Installation\n\nTo use these skills in your FOSMVVM projects, add this repository as a Claude Code plugin marketplace.\n\n**Option 1: Interactive**\n```bash\n/plugin marketplace add foscomputerservices/FOSUtilities\n/plugin install fosmvvm-generators@fosmvvm-tools\n```\n\n**Option 2: Project Configuration**\n\nAdd to your project's `.claude/settings.json`:\n```json\n{\n  \"enabledPlugins\": {\n    \"fosmvvm-generators@fosmvvm-tools\": true\n  },\n  \"extraKnownMarketplaces\": {\n    \"fosmvvm-tools\": {\n      \"source\": {\n        \"source\": \"github\",\n        \"repo\": \"foscomputerservices/FOSUtilities\"\n      }\n    }\n  }\n}\n```\n\n### Architecture Documentation\n\nFor detailed FOSMVVM architecture concepts, see [FOSMVVMArchitecture.md](.claude/docs/FOSMVVMArchitecture.md).\n\n## OpenClaw Integration\n\nThe FOSMVVM skills are also available for [OpenClaw](https://openclaw.ai) agents via [ClawHub](https://clawhub.com).\n\n### Install from ClawHub\n\n```bash\nclawhub install fosmvvm-viewmodel-generator\nclawhub install fosmvvm-fields-generator\nclawhub install fosmvvm-serverrequest-generator\nclawhub install fosmvvm-fluent-datamodel-generator\nclawhub install fosmvvm-leaf-view-generator\nclawhub install fosmvvm-swiftui-view-generator\nclawhub install fosmvvm-react-view-generator\nclawhub install fosmvvm-serverrequest-test-generator\nclawhub install fosmvvm-viewmodel-test-generator\nclawhub install fosmvvm-ui-tests-generator\nclawhub install fosmvvm-swiftui-app-setup\n```\n\n### Install from Repository\n\nAlternatively, point OpenClaw at this repository's skills directory. Add to `~/.openclaw/openclaw.json`:\n\n```json\n{\n  \"skills\": {\n    \"load\": {\n      \"extraDirs\": [\"/path/to/FOSUtilities/.claude/skills\"]\n    }\n  }\n}\n```\n\nOr symlink individual skills into your OpenClaw workspace:\n\n```bash\nln -s /path/to/FOSUtilities/.claude/skills/fosmvvm-viewmodel-generator ~/.openclaw/workspace/skills/\n```\n\n## FOSTesting\n\nFOSTestingUtilities is a package of testing patterns, types and routines that I have found generally useful in my projects.\n\nFor guides, articles, and API documentation see the \n[library's documentation on the Web][docs] or in Xcode.\n\n- [Getting Started with FOS Testing](https://swiftpackageindex.com/foscomputerservices/FOSUtilities/documentation/fostesting)\n\n## Swift Package Manager\n\nFOSUtilities supports the [Swift Package Manager](https://www.swift.org/package-manager/).  To include FOSUtilities in your project add the following to your Package.swift file:\n\n```swift\n.package(url: \"git@github.com:foscomputerservices/FOSUtilities.git\", branch: \"main\"),\n```\n\nTo use one of the libraries, add one or more entry in the dependencies list of a target in your Package.swift file:\n\n```swift\n.target(\n    name: \"MyTarget\",\n    dependencies: [\n        .product(name: \"FOSFoundation\", package: \"FOSUtilities\"),\n        .product(name: \"FOSMVVM\", package: \"FOSUtilities\")\n        // ...\n    ]\n),\n.testTarget(\n    name: \"MyTests\",\n    dependencies: [\n        .byName(name: \"MyTarget\"),\n        .byName(name: \"FOSFoundation\"),\n        .byName(name: \"FOSMVVM\"),\n        .byName(name: \"FOSTesting\"),\n        .product(name: \"Testing\", package: \"swift-testing\")\n    ]\n)\n```\n\n## Contributing\n\nAll contributions are welcome!  Please see [CONTRIBUTING.md](https://github.com/foscomputerservices/FOSUtilities/blob/main/CONTRIBUTING.md) for more details.\n\n## Maintainers\n\nThis project is maintained by [David Hunt](https://www.linkedin.com/in/davidhun/) owner of [FOS Computer Services, LLC](https://www.linkedin.com/company/fos-computer-services).\n\n## License\n\nFOSUtilities is under the Apache License.  See the [LICENSE](https://github.com/foscomputerservices/FOSUtilities/blob/main/LICENSE) file for more information.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffoscomputerservices%2Ffosutilities","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffoscomputerservices%2Ffosutilities","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffoscomputerservices%2Ffosutilities/lists"}