{"id":15288690,"url":"https://github.com/artemkalinovsky/Kite","last_synced_at":"2025-10-07T03:30:43.690Z","repository":{"id":63904837,"uuid":"231627864","full_name":"artemkalinovsky/Kite","owner":"artemkalinovsky","description":"A Swift 6 networking library with async/await, JSON/XML deserialization 🚀, and OAuth2 integration 🔐, supporting iOS/macOS/tvOS/watchOS/visionOS/DriverKit!","archived":false,"fork":false,"pushed_at":"2025-04-03T18:46:57.000Z","size":179,"stargazers_count":43,"open_issues_count":4,"forks_count":3,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-08-28T08:36:30.926Z","etag":null,"topics":["alamofire","api","api-rest","apimanager","combine","jsonparser","networklayer","networklibrary","swif6","swift","swift-framework","swiftui","xmlparser"],"latest_commit_sha":null,"homepage":"","language":"Swift","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/artemkalinovsky.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,"zenodo":null}},"created_at":"2020-01-03T16:47:53.000Z","updated_at":"2025-07-30T07:24:39.000Z","dependencies_parsed_at":"2025-03-11T14:23:45.823Z","dependency_job_id":"89fe2baf-5aa8-4476-9892-79802b7c27fe","html_url":"https://github.com/artemkalinovsky/Kite","commit_stats":{"total_commits":95,"total_committers":1,"mean_commits":95.0,"dds":0.0,"last_synced_commit":"2624e7efb3af76a483c1c547c59978087f35cedf"},"previous_names":["artemkalinovsky/kite","artemkalinovsky/legatus"],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/artemkalinovsky/Kite","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/artemkalinovsky%2FKite","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/artemkalinovsky%2FKite/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/artemkalinovsky%2FKite/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/artemkalinovsky%2FKite/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/artemkalinovsky","download_url":"https://codeload.github.com/artemkalinovsky/Kite/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/artemkalinovsky%2FKite/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278350986,"owners_count":25972676,"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","status":"online","status_checked_at":"2025-10-04T02:00:05.491Z","response_time":63,"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":["alamofire","api","api-rest","apimanager","combine","jsonparser","networklayer","networklibrary","swif6","swift","swift-framework","swiftui","xmlparser"],"created_at":"2024-09-30T15:52:06.183Z","updated_at":"2025-10-07T03:30:43.683Z","avatar_url":"https://github.com/artemkalinovsky.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"![swift workflow](https://github.com/artemkalinovsky/Kite/actions/workflows/swift.yml/badge.svg)\n[![Swift 6](https://img.shields.io/badge/Swift-6.0-orange.svg)](https://swift.org)\n[![macOS](https://img.shields.io/badge/macOS-12%2B-blue.svg)](https://developer.apple.com/macos/)\n[![iOS](https://img.shields.io/badge/iOS-15%2B-blue.svg)](https://developer.apple.com/ios/)\n[![tvOS](https://img.shields.io/badge/tvOS-15%2B-blue.svg)](https://developer.apple.com/tvos/)\n[![watchOS](https://img.shields.io/badge/watchOS-8%2B-blue.svg)](https://developer.apple.com/watchos/)\n[![driverKit](https://img.shields.io/badge/driverKit-19%2B-blue.svg)](https://developer.apple.com/driverkit/)\n[![visionOS](https://img.shields.io/badge/visionOS-1%2B-blue.svg)](https://developer.apple.com/visionos/)\n\n\u003cimg src=\"https://github.com/user-attachments/assets/67d7a28c-e45b-4abd-bdf4-86b329c439b5\" width=\"20%\" /\u003e\n\n\n# Kite \n\nKite is named after the kite bird, known for its lightness, speed, and agile flight. This Swift Package aims to embody those qualities—offering a lightweight, fast, and flexible networking layer that soars across Apple platforms.\n\n### Features:\n\n* ***Swift Concurrency (async/await)***: Easily manage asynchronous networking operations.\n* Lightweight API Client: A simple APIClient class lets you execute requests that conform to HTTPRequestProtocol or DeserializeableRequest.\n* JSON \u0026 XML Deserialization: Built-in JSONDeserializer and XMLDeserializer types for decoding server responses.\n\n## Project Status\n\nThis project is considered production-ready. Contributions—whether pull requests, questions, or suggestions—are always welcome! 😃\n\n## Installation 📦 \n\n* #### Swift Package Manager\n\nYou can use Xcode SPM GUI: *File -\u003e Swift Packages -\u003e Add Package Dependency -\u003e Pick \"Up to Next Major Version 3.0.0\"*.\n\nOr add the following to your `Package.swift` file:\n\n``` swift\n.package(url: \"https://github.com/artemkalinovsky/Kite.git\", from: \"3.0.0\")\n\n```\n\nThen specify \"Kite\" as a dependency of the target in which you wish to use Kite.\n\nHere's an example `Package.swift`:\n\n``` swift\n// swift-tools-version:6.0\nimport PackageDescription\n\nlet package = Package(\n    name: \"MyPackage\",\n    products: [\n        .library(\n            name: \"MyPackage\",\n            targets: [\"MyPackage\"]),\n    ],\n    dependencies: [\n        .package(url: \"https://github.com/artemkalinovsky/Kite.git\", from: \"3.0.0\")\n    ],\n    targets: [\n        .target(\n            name: \"MyPackage\",\n            dependencies: [\"Kite\"])\n    ]\n)\n```\n## Usage 🧑‍💻\n\nLet's suppose we want to fetch a list of users from JSON and the response looks like this:\n\n``` json\n{ \n   \"results\":[ \n      { \n         \"name\":{ \n            \"first\":\"brad\",\n            \"last\":\"gibson\"\n         },\n         \"email\":\"brad.gibson@example.com\"\n      }\n   ]\n}\n```\n\n* #### Setup\n\n1. Create `APIClient` :\n\n``` swift\n    let apiClient = APIClient()\n```\n\n2. Create the Response Model:\n\n``` swift\nstruct User: Decodable {\n    struct Name: Decodable {\n        let first: String\n        let last: String\n    }\n    \n    let name: Name\n    let email: String\n}\n```\n\n3. Create a Request with Endpoint Path and Desired Response Deserializer:\n\n``` swift\nimport Foundation\nimport Kite\n\nstruct FetchRandomUsersRequest: DeserializeableRequestProtocol {\n    var baseURL: URL { URL(string: \"https://randomuser.me\")! }\n    var path: String {\"api\"}\n\n    var deserializer: ResponseDataDeserializer\u003c[User]\u003e {\n        JSONDeserializer\u003cUser\u003e.collectionDeserializer(keyPath: \"results\")\n    }\n}\n```\n\n* #### Perform the Request\n\n``` swift\nTask {\n    let (users, urlResponse) = try await apiClient.execute(request: FetchRandomUsersRequest())\n}\n```\n\nVoilà!🧑‍🎨\n\n## Apps using Kite\n\n- [PinPlace](https://apps.apple.com/ua/app/pinplace/id1571349149)\n\n## Credits 👏\n\n* @0111b for [JSONDecoder-Keypath](https://github.com/0111b/JSONDecoder-Keypath)\n* @drmohundro for [SWXMLHash](https://github.com/drmohundro/SWXMLHash)\n\n## License 📄\n\nKite is released under an MIT license. See [LICENCE](https://github.com/artemkalinovsky/Kite/blob/master/LICENSE) for more information.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fartemkalinovsky%2FKite","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fartemkalinovsky%2FKite","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fartemkalinovsky%2FKite/lists"}