{"id":18744508,"url":"https://github.com/freshos/arrow","last_synced_at":"2025-04-09T05:10:09.703Z","repository":{"id":33371327,"uuid":"37016212","full_name":"freshOS/Arrow","owner":"freshOS","description":"🏹 Parse JSON with style","archived":false,"fork":false,"pushed_at":"2024-09-24T23:09:35.000Z","size":22276,"stargazers_count":387,"open_issues_count":4,"forks_count":27,"subscribers_count":10,"default_branch":"master","last_synced_at":"2025-04-02T04:03:07.281Z","etag":null,"topics":["arrow","decoding","freshos","ios","json","json-parsing","mapping","micro-framework","objectmapper","simple","swift","swiftyjson","type-inference","unbox"],"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/freshOS.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","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},"funding":{"open_collective":"freshos","github":"s4cha"}},"created_at":"2015-06-07T12:42:50.000Z","updated_at":"2025-03-19T04:41:21.000Z","dependencies_parsed_at":"2024-04-15T09:21:05.054Z","dependency_job_id":"8f9b6a4e-355a-441c-990a-7f7d9e90a5a2","html_url":"https://github.com/freshOS/Arrow","commit_stats":{"total_commits":190,"total_committers":8,"mean_commits":23.75,"dds":0.1473684210526316,"last_synced_commit":"32f1ddfe4160261eb0d0ddd63d52cc49babe7f00"},"previous_names":[],"tags_count":38,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/freshOS%2FArrow","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/freshOS%2FArrow/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/freshOS%2FArrow/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/freshOS%2FArrow/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/freshOS","download_url":"https://codeload.github.com/freshOS/Arrow/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247980837,"owners_count":21027808,"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":["arrow","decoding","freshos","ios","json","json-parsing","mapping","micro-framework","objectmapper","simple","swift","swiftyjson","type-inference","unbox"],"created_at":"2024-11-07T16:15:04.281Z","updated_at":"2025-04-09T05:10:09.659Z","avatar_url":"https://github.com/freshOS.png","language":"Swift","readme":"![Arrow](https://raw.githubusercontent.com/freshOS/Arrow/master/banner.png)\n\n# Arrow\n\n[![Language: Swift 6](https://img.shields.io/badge/language-swift6-f48041.svg?style=flat)](https://developer.apple.com/swift)\n![Platform: iOS 8+](https://img.shields.io/badge/platform-iOS%208%2B-blue.svg?style=flat)\n[![SPM compatible](https://img.shields.io/badge/SPM-compatible-4BC51D.svg?style=flat)](https://swift.org/package-manager)\n[![Build Status](https://app.bitrise.io/app/57b6b1b8959ef398/status.svg?token=WBTcuBRgfLeDB6-A3j7gFA)](https://app.bitrise.io/app/57b6b1b8959ef398)\n[![codebeat badge](https://codebeat.co/badges/f037ac0c-b3d9-4132-9fca-64150a908113)](https://codebeat.co/projects/github-com-freshos-arrow)\n[![License: MIT](http://img.shields.io/badge/license-MIT-lightgrey.svg?style=flat)](https://github.com/freshOS/Arrow/blob/master/LICENSE)\n![Release version](https://img.shields.io/github/release/freshos/Arrow.svg)\n\n[Reason](#reason) - [Example](#example) - [Installation](#installation)\n\n\n```swift\nidentifier \u003c-- json[\"id\"]\nname \u003c-- json[\"name\"]\nstats \u003c-- json[\"stats\"]\n```\n\nBecause parsing JSON in Swift is full of **unecessary if lets, obvious casts and nil-checks**  \n*There must be a better way*\n\n## Try it\n\nArrow is part of [freshOS](https://freshos.github.io/) iOS toolset. Try it in an example App! \u003ca class=\"github-button\" href=\"https://github.com/freshOS/StarterProject/archive/master.zip\" data-icon=\"octicon-cloud-download\" data-style=\"mega\" aria-label=\"Download freshOS/StarterProject on GitHub\"\u003eDownload Starter Project\u003c/a\u003e\n\n## How\nBy using a simple arrow operator that takes care of the boilerplate code for us.  \nJson mapping code becomes **concise** and **maintainable** ❤️\n\n\n## Why use Arrow\n- [x] Infers types\n- [x] Leaves your models clean\n- [x] Handles custom \u0026 nested models\n- [x] Dot and array syntax\n- [x] Pure Swift, Simple \u0026 Lightweight\n\n## Example\n\n### Swift Model\n```swift\nstruct Profile {\n    var identifier = 0\n    var name = \"\"\n    var link:NSURL?\n    var weekday:WeekDay = .Monday\n    var stats = Stats()\n    var phoneNumbers = [PhoneNumber]()\n}\n```\n### JSON File\n```json\n{\n    \"id\": 15678,\n    \"name\": \"John Doe\",\n    \"link\": \"https://apple.com/steve\",\n    \"weekdayInt\" : 3,\n    \"stats\": {\n        \"numberOfFriends\": 163,\n        \"numberOfFans\": 10987\n    },\n    \"phoneNumbers\": [{\n                     \"label\": \"house\",\n                     \"number\": \"9809876545\"\n                     }, {\n                     \"label\": \"cell\",\n                     \"number\": \"0908070656\"\n                     }, {\n                     \"label\": \"work\",\n                     \"number\": \"0916570656\"\n    }]\n}\n```\n\n### Before (Chaos)\n```swift\nvar profile = Profile()\n\n// Int\nif let id = json[\"id\"] as? Int {\n    profile.identifier = id\n}  \n// String\nif let name = json[\"name\"] as? String {\n    profile.name = name\n}\n// NSURL\nif let link = json[\"link\"] as? String, url = NSURL(string:link)  {\n    profile.link = link\n}\n// Enum\nif let weekdayInt = json[\"weekdayInt\"] as? Int, weekday = WeekDay(rawValue:weekdayInt) {\n    profile.weekday = weekday\n}\n// Custom nested object\nif let statsJson = json[\"stats\"] as? AnyObject {\n    if let numberOfFans = statsJson[\"numberOfFans\"] as? Int {\n        profile.stats.numberOfFans = numberOfFans\n    }\n    if let numberOfFriends = statsJson[\"numberOfFriends\"] as? Int {\n        profile.stats.numberOfFriends = numberOfFriends\n    }\n}\n// Array of custom nested object\nif let pns = json[\"phoneNumbers\"] as? [AnyObject] {\n    for pn in pns {\n        phoneNumbers.append(PhoneNumber(json: pn))\n    }\n}\n```\n\n### After  🎉🎉🎉\n```swift\nextension Profile:ArrowParsable {\n    mutating func deserialize(_ json: JSON) {\n        identifier \u003c-- json[\"id\"]\n        link \u003c-- json[\"link\"]\n        name \u003c-- json[\"name\"]\n        weekday \u003c-- json[\"weekdayInt\"]\n        stats \u003c- json[\"stats\"]\n        phoneNumbers \u003c-- json[\"phoneNumbers\"]\n    }\n}\n```\n\n### Usage\n```swift\nlet profile = Profile()\nprofile.deserialize(json)\n```\n\n## Installation\nThe Swift Package Manager (SPM) is now the official way to install `Arrow`. The other package managers are now deprecated as of `5.1.2` and won't be supported in future versions.\n\n#### Swift Package Manager\n\n`Xcode` \u003e `File` \u003e `Swift Packages` \u003e `Add Package Dependency...` \u003e `Paste` `https://github.com/freshOS/Arrow`\n\n#### Carthage - Deprecated\n```\ngithub \"freshOS/Arrow\"\n```\n#### CocoaPods - Deprecated\n```\ntarget 'MyApp'\npod 'Arrow'\nuse_frameworks!\n```\n\n## How Does That Work\n\nNotice earlier we typed :\n\n```swift\nstats \u003c-- json[\"stats\"]\n```\nThat's because we created and extension \"Stats+Arrow.swift\" enabling us to use the Arrow Operator\n\n```swift\n//  Stats+Arrow.swift\n\nimport Foundation\n\nextension Stats:ArrowParsable {\n    mutating func deserialize(json: JSON) {\n        numberOfFriends \u003c-- json[\"numberOfFriends\"]\n        numberOfFans \u003c-- json[\"numberOfFans\"]\n    }\n}\n```\n\n## Flexible you said\n\n- DO I have to use the \u003c-- for my sub models\n- Nope, you could write it like so if you wanted :\n\n```swift\nstats.numberOfFriends \u003c-- json[\"stats.numberOfFriends\"]\nstats.numberOfFans \u003c-- json[\"stats.numberOfFans\"]\n```\n\n## Date Parsing\n\n### Globally\n\n```swift\n// Configure Global Date Parsing with one of those\nArrow.setDateFormat(\"yyyy-MM-dd'T'HH:mm:ssZZZZZ\")\nArrow.setUseTimeIntervalSinceReferenceDate(true)\nArrow.setDateFormatter(aDateFormatter)\n\n// Then later dates can be parsed form custom date format or timestamps automatically 🎉\nlet json:JSON = JSON([\"date\": \"2013-06-07T16:38:40+02:00\", \"timestamp\": 392308720])\ndate1 \u003c-- json[\"date\"]\ndate2 \u003c-- json[\"timestamp\"]\n```\n\n### On a per-key basis\n```swift\ncreatedAt \u003c-- json[\"created_at\"]?.dateFormat(\"yyyy-MM-dd'T'HH:mm:ssZZZZZ\")\ncreatedAt \u003c-- json[\"created_at\"]?.dateFormatter(aCustomDateFormatter)\n```\nJust provide it on a case per case basis ! 🎉\n\n## Accessing JSON values\n\n### Nested values\n\n```swift\nvalue \u003c-- json[\"nested.nested.nested.nestedValue\"]\n```\n\n### Object at index\n```swift\nvalue \u003c-- json[12]\n```\n\n### Combine both\n```swift\nvalue \u003c-- json[1]?[\"someKey\"]?[2]?[\"something.other\"]\n```\n\n### Looping on Array\n```swift\nif let collection = json.collection {\n    for jsonEntry in collection {\n        //Do something\n    }\n}\n```\n\n## Swift Version\n\n- Swift 2 -\u003e version [**2.0.3**](https://github.com/freshOS/Arrow/releases/tag/2.0.3)\n- Swift 3 -\u003e version [**3.0.5**](https://github.com/freshOS/Arrow/releases/tag/3.0.5)\n- Swift 4 -\u003e version [**4.0.0**](https://github.com/freshOS/Arrow/releases/tag/4.0.0)\n- Swift 4.1 -\u003e version [**4.1.0**](https://github.com/freshOS/Arrow/releases/tag/4.1.0)\n- Swift 4.2 -\u003e version [**4.2.0**](https://github.com/freshOS/Arrow/releases/tag/4.2.0)\n- Swift 5.0 -\u003e version [**5.0.0**](https://github.com/freshOS/Arrow/releases/tag/5.0.0)\n- Swift 5.1 -\u003e version [**5.1.0**](https://github.com/freshOS/Arrow/releases/tag/5.1.0)\n- Swift 5.1.3 -\u003e version [**5.1.1**](https://github.com/freshOS/Arrow/releases/tag/5.1.1)\n- Swift 5.3 -\u003e version [**6.0.0**](https://github.com/freshOS/Arrow/releases/tag/6.0.0)\n\n## Acknowledgements\nThis wouldn't exist without [YannickDot](https://github.com/YannickDot), [Damien-nd](https://github.com/damien-nd) and [maxkonovalov](https://github.com/maxkonovalov)\n\n### Backers\nLike the project? Offer coffee or support us with a monthly donation and help us continue our activities :)\n\n\u003ca href=\"https://opencollective.com/freshos/backer/0/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/backer/0/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/backer/1/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/backer/1/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/backer/2/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/backer/2/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/backer/3/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/backer/3/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/backer/4/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/backer/4/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/backer/5/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/backer/5/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/backer/6/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/backer/6/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/backer/7/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/backer/7/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/backer/8/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/backer/8/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/backer/9/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/backer/9/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/backer/10/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/backer/10/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/backer/11/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/backer/11/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/backer/12/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/backer/12/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/backer/13/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/backer/13/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/backer/14/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/backer/14/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/backer/15/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/backer/15/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/backer/16/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/backer/16/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/backer/17/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/backer/17/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/backer/18/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/backer/18/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/backer/19/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/backer/19/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/backer/20/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/backer/20/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/backer/21/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/backer/21/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/backer/22/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/backer/22/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/backer/23/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/backer/23/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/backer/24/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/backer/24/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/backer/25/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/backer/25/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/backer/26/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/backer/26/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/backer/27/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/backer/27/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/backer/28/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/backer/28/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/backer/29/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/backer/29/avatar.svg\"\u003e\u003c/a\u003e\n\n### Sponsors\nBecome a sponsor and get your logo on our README on Github with a link to your site :)\n\n\u003ca href=\"https://opencollective.com/freshos/sponsor/0/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/sponsor/0/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/sponsor/1/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/sponsor/1/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/sponsor/2/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/sponsor/2/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/sponsor/3/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/sponsor/3/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/sponsor/4/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/sponsor/4/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/sponsor/5/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/sponsor/5/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/sponsor/6/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/sponsor/6/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/sponsor/7/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/sponsor/7/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/sponsor/8/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/sponsor/8/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/sponsor/9/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/sponsor/9/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/sponsor/10/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/sponsor/10/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/sponsor/11/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/sponsor/11/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/sponsor/12/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/sponsor/12/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/sponsor/13/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/sponsor/13/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/sponsor/14/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/sponsor/14/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/sponsor/15/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/sponsor/15/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/sponsor/16/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/sponsor/16/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/sponsor/17/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/sponsor/17/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/sponsor/18/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/sponsor/18/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/sponsor/19/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/sponsor/19/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/sponsor/20/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/sponsor/20/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/sponsor/21/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/sponsor/21/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/sponsor/22/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/sponsor/22/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/sponsor/23/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/sponsor/23/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/sponsor/24/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/sponsor/24/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/sponsor/25/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/sponsor/25/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/sponsor/26/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/sponsor/26/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/sponsor/27/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/sponsor/27/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/sponsor/28/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/sponsor/28/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/freshos/sponsor/29/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/freshos/sponsor/29/avatar.svg\"\u003e\u003c/a\u003e\n","funding_links":["https://opencollective.com/freshos","https://github.com/sponsors/s4cha","https://opencollective.com/freshos/backer/0/website","https://opencollective.com/freshos/backer/1/website","https://opencollective.com/freshos/backer/2/website","https://opencollective.com/freshos/backer/3/website","https://opencollective.com/freshos/backer/4/website","https://opencollective.com/freshos/backer/5/website","https://opencollective.com/freshos/backer/6/website","https://opencollective.com/freshos/backer/7/website","https://opencollective.com/freshos/backer/8/website","https://opencollective.com/freshos/backer/9/website","https://opencollective.com/freshos/backer/10/website","https://opencollective.com/freshos/backer/11/website","https://opencollective.com/freshos/backer/12/website","https://opencollective.com/freshos/backer/13/website","https://opencollective.com/freshos/backer/14/website","https://opencollective.com/freshos/backer/15/website","https://opencollective.com/freshos/backer/16/website","https://opencollective.com/freshos/backer/17/website","https://opencollective.com/freshos/backer/18/website","https://opencollective.com/freshos/backer/19/website","https://opencollective.com/freshos/backer/20/website","https://opencollective.com/freshos/backer/21/website","https://opencollective.com/freshos/backer/22/website","https://opencollective.com/freshos/backer/23/website","https://opencollective.com/freshos/backer/24/website","https://opencollective.com/freshos/backer/25/website","https://opencollective.com/freshos/backer/26/website","https://opencollective.com/freshos/backer/27/website","https://opencollective.com/freshos/backer/28/website","https://opencollective.com/freshos/backer/29/website"],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffreshos%2Farrow","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffreshos%2Farrow","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffreshos%2Farrow/lists"}