{"id":24092756,"url":"https://github.com/liarprincess/wroclive-client","last_synced_at":"2026-06-06T21:31:39.249Z","repository":{"id":43332420,"uuid":"299359336","full_name":"LiarPrincess/Wroclive-client","owner":"LiarPrincess","description":"Real-time public transport in Wrocław. With push notifications for all of the “tree is blocking the road, so the replacement bus was dispatched” events.","archived":false,"fork":false,"pushed_at":"2022-03-07T21:16:56.000Z","size":58943,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-01-10T08:40:34.735Z","etag":null,"topics":["ios","mpk","public-transport","swift","wroclaw"],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/LiarPrincess.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},"funding":{"github":"LiarPrincess"}},"created_at":"2020-09-28T15:55:55.000Z","updated_at":"2023-06-11T03:36:55.000Z","dependencies_parsed_at":"2022-09-03T04:51:51.433Z","dependency_job_id":null,"html_url":"https://github.com/LiarPrincess/Wroclive-client","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/LiarPrincess%2FWroclive-client","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LiarPrincess%2FWroclive-client/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LiarPrincess%2FWroclive-client/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LiarPrincess%2FWroclive-client/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/LiarPrincess","download_url":"https://codeload.github.com/LiarPrincess/Wroclive-client/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240995346,"owners_count":19890717,"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":["ios","mpk","public-transport","swift","wroclaw"],"created_at":"2025-01-10T08:37:35.791Z","updated_at":"2026-06-06T21:31:39.187Z","avatar_url":"https://github.com/LiarPrincess.png","language":"Swift","funding_links":["https://github.com/sponsors/LiarPrincess"],"categories":[],"sub_categories":[],"readme":"# Wroclive - Real-time public transport in Wrocław\n\nThis repository contains sources of [Wroclive iOS app](https://www.wroclive.app).\n\n(Psst… server code is also [open-sourced](https://github.com/LiarPrincess/Wroclive-server)!)\n\n## About\n\nMoving around Wrocław has suddenly become much easier!\n\nWroclive allows you to check the current location of public transport vehicles.\nThis will help you decide whether it is worth rushing to a stop or to calmly finish your coffee.\n\nIf you are only interested in specific lines, you can use our filtering functionality. You can also save the most frequently used connections for easier access.\n\nIt will also send you push notifications with all of the sudden and unforeseen changes, like when the tree is blocking tram tracks and the replacement-bus was dispatched.\n\nWith Wroclive you will never miss your bus!\n\n![AppStore screenshots](https://raw.githubusercontent.com/LiarPrincess/Wroclive-client/main/Design/GitHub/appstore_screens.png)\n\n## Source map\n\n- [Design](Design) - graphic assets\n\n  - Icon - as `.svg` and `png`.\n\n  - [Design](Design/Images) - all of the button/toolbar images. Use `.svg` files to edit and then export to pdf ([Boxy SVG](https://boxy-svg.com) is an amazing tool for this).\n\n  - [AppStore images](Design/AppStore%20images) - AppStore screenshots (before and after framing). Requires [fastlane](https://fastlane.tools).\n\n- [Wroclive](Wroclive) - iOS app. This dir contains only `AppDelegate.swift` and application icon, everything else is in `WrocliveFramework`.\n\n- [WrocliveFramework](WrocliveFramework) - most of the Wroclive code. We use separate framework, so that our unit tests execute much faster (because now there is no need to launch the whole app).\n\n  - [Api](WrocliveFramework/Api) - code to interact with [wroclive.app](https://www.wroclive.app) api. DO NOT create new instances, use the one from `Environment`.\n\n  - [Assets](WrocliveFramework/Assets) - translations and images from `Design/Images`. DO NOT use directly! We use [SwiftGen](https://github.com/SwiftGen/SwiftGen) to generate static types (see `Generated` directory).\n\n  - [Coordinators](WrocliveFramework/Coordinators) - app navigation extracted from view controllers. There are a lot of good tutorials about this on the internet.\n\n  - [Environment](WrocliveFramework/Environment) - `Environment` contains wrappers for Apple frameworks, so we can mock them during unit tests (so basically a dependency injection). Most of the time we inject `Environment` in `init` (we do not use global `AppEnvironment` like [kickstarter/ios-oss](https://github.com/kickstarter/ios-oss)).\n\n  - [Extensions](WrocliveFramework/Extensions)\n\n  - [Generated](WrocliveFramework/Generated) - code generated by [SwiftGen](https://github.com/SwiftGen/SwiftGen) from our `Assets`. Use `make gen` to regenerate.\n\n  - [Helpers](WrocliveFramework/Helpers) - code that did not fit anywhere else.\n\n    - [Card panel](WrocliveFramework/Helpers/Card%20panel) - card is a container view controller that pops from the bottom of the screen. Most of our views (for example: lines, bookmarks and settings) are presented in cards.\n\n    - [MapUpdateScheduler.swift](WrocliveFramework/Helpers/MapUpdateScheduler.swift) - every 5 seconds it will dispatch `ApiMiddlewareActions.requestVehicleLocations` to update vehicle loctions on the map.\n\n    - [DispatchStoreUpdatesFromAppleFrameworks.swift](WrocliveFramework/Helpers/DispatchStoreUpdatesFromAppleFrameworks.swift) - will observe Apple frameworks and dispatch actions to update `AppState`. For example: after user granted location authorization it will dispatch `UserLocationAuthorizationAction.set(authorization)` action.\n\n  - [Models](WrocliveFramework/Models) - main data structures (for example: `Line`, `Vehicle`, `Bookmark`).\n\n  - [Redux](WrocliveFramework/Redux) - code connected to [ReSwift](https://github.com/ReSwift/ReSwift). It contains `AppState` struct that describes the state of the whole application. You should also check `Actions` and `Middleware`.\n\n  - [Theme](WrocliveFramework/Theme) - color scheme, fonts and text attributes.\n\n  - [View controllers](WrocliveFramework/View%20controllers) - basically our views. We use `ViewModels` for testability. We also prefer [SnapKit](https://github.com/SnapKit/SnapKit) over storyboards.\n\n    - [Main](WrocliveFramework/View%20controllers/Main) - main view, basically `MapViewController` + toolbar.\n\n    - [Map](WrocliveFramework/View%20controllers/Map) - view controller responsible for map (duh…), nested in `MainViewController`.\n\n    - [Bookmarks card](WrocliveFramework/View%20controllers/Bookmarks%20card) - view controller to manage bookmarks (heart icon on main toolbar)\n\n    - [Search card](WrocliveFramework/View%20controllers/Search%20card) - view controller to select lines and create bookmarks (yes, the name is bad, but it is too much work to change it now).\n\n    - [Settings card](WrocliveFramework/View%20controllers/Settings%20card) - app settings\n\n- [WrocliveTests](WrocliveTests) - unit/snapshot tests\n\n  - [\\_\\_Snapshots\\_\\_](WrocliveTests/__Snapshots__) - snapshots made by [pointfreeco/swift-snapshot-testing](https://github.com/pointfreeco/swift-snapshot-testing).\n\n## Recommended reading order\n\nIf you are new to the app, then following reading order is recommended:\n\n1. [Wroclive/AppDelegate.swift](Wroclive/AppDelegate.swift) - although, you do not need to understand everything\n2. [WrocliveFramework/Models](WrocliveFramework/Models)\n3. [WrocliveFramework/Environment](WrocliveFramework/Environment)\n4. [WrocliveFramework/Redux](WrocliveFramework/Redux)\n5. View controller of your choice ([BookmarksCard](WrocliveFramework/View%20controllers/Bookmarks%20card) is the simplest one)\n\n## Tooling\n\nBefore contributing to Wroclive you may want too read about following tools:\n\n- [ReSwift](https://github.com/ReSwift/ReSwift) - we use it to manage `AppState`, whatever you do in code you will probably have to interact with it!\n- [mxcl/PromiseKit](https://github.com/mxcl/PromiseKit) - async tool of our choice, used mostly for network request (but not only).\n- [pointfreeco/swift-snapshot-testing](https://github.com/pointfreeco/swift-snapshot-testing) - we use it in our unit tests. Check out our [__Snapshots__](WrocliveTests/__Snapshots__) directory!\n- Make - the most important command is `make gen` to generate [SwiftGen](https://github.com/SwiftGen/SwiftGen) files in  (`WrocliveFramework/Generated`)\n- [SwiftGen](https://github.com/SwiftGen/SwiftGen)\n- [SwiftLint](https://github.com/realm/SwiftLint)\n\n## Special thanks\n\nSpecial thanks to the maintainers of the following libraries:\n- [ReSwift](https://github.com/ReSwift/ReSwift) - Unidirectional Data Flow in Swift - Inspired by Redux\n- [SnapKit](https://github.com/SnapKit/SnapKit) - A Swift Autolayout DSL for iOS \u0026 OS X\n- [mxcl/PromiseKit](https://github.com/mxcl/PromiseKit) - Promises for Swift \u0026 ObjC\n- [Alamofire](https://github.com/Alamofire/Alamofire) - Elegant HTTP Networking in Swift\n- [ivanvorobei/SPAlert](https://github.com/IvanVorobei/SPAlert) - Native alert from Apple Music \u0026 Feedback. Contains Done, Heart \u0026 Message and other presets\n- [pointfreeco/swift-snapshot-testing](https://github.com/pointfreeco/swift-snapshot-testing) - Delightful Swift snapshot testing\n- [fastlane](https://fastlane.tools) - App automation done right\n- [SwiftGen](https://github.com/SwiftGen/SwiftGen) - The Swift code generator for your assets, storyboards, Localizable.strings, … — Get rid of all String-based APIs!\n- [realm/SwiftLint](https://github.com/realm/SwiftLint) - A tool to enforce Swift style and conventions\n\n## License\n\nWroclive is licensed under the Mozilla Public License 2.0 license.\nSee [LICENSE](LICENSE) for more information.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fliarprincess%2Fwroclive-client","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fliarprincess%2Fwroclive-client","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fliarprincess%2Fwroclive-client/lists"}