{"id":47880440,"url":"https://github.com/getditto/dittoswifttools","last_synced_at":"2026-06-03T19:00:16.055Z","repository":{"id":65595245,"uuid":"523156629","full_name":"getditto/DittoSwiftTools","owner":"getditto","description":"Diagnostic and Debugging Tools for DittoSwift","archived":false,"fork":false,"pushed_at":"2026-05-15T02:27:39.000Z","size":6230,"stargazers_count":9,"open_issues_count":20,"forks_count":4,"subscribers_count":26,"default_branch":"main","last_synced_at":"2026-05-15T04:33:20.651Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":false,"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/getditto.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":".github/CODEOWNERS","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":"2022-08-10T01:09:01.000Z","updated_at":"2026-04-28T17:37:30.000Z","dependencies_parsed_at":"2024-04-01T22:31:22.360Z","dependency_job_id":"6e8a3086-9776-4271-9ca7-b7aa3bade444","html_url":"https://github.com/getditto/DittoSwiftTools","commit_stats":null,"previous_names":[],"tags_count":55,"template":false,"template_full_name":null,"purl":"pkg:github/getditto/DittoSwiftTools","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/getditto%2FDittoSwiftTools","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/getditto%2FDittoSwiftTools/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/getditto%2FDittoSwiftTools/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/getditto%2FDittoSwiftTools/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/getditto","download_url":"https://codeload.github.com/getditto/DittoSwiftTools/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/getditto%2FDittoSwiftTools/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33876333,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-03T02:00:06.370Z","response_time":59,"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":[],"created_at":"2026-04-04T01:44:38.222Z","updated_at":"2026-06-03T19:00:16.027Z","avatar_url":"https://github.com/getditto.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":" # DittoSwiftTools\n\nDittoSwiftTools are diagnostic tools for Ditto. You can view connected peers in a graphic viewer and\nin a list view, export Ditto data directory and debug logs (locally or to Ditto Portal), browse collections/documents, and see\nDitto's disk usage.\n\nFor support, please contact Ditto Support (\u003csupport@ditto.com\u003e).\n\n## Installation\n\nThe recommended approach to use DittoSwiftTools in your project is using the Swift Package Manager.  \n\n1. With your project open in Xcode go to File -\u003e Add Packages, then search using  \"github.com/getditto/DittoSwiftTools\" to find the DittoSwiftTools package.  \n\n \u003cimg src=\"/Img/addPackage.png\" alt=\"Add Package Image\"\u003e  \n\n2. Select \"Add Package\"\n3. Select which DittoSwiftTools products you would like, then select \"Add Package\"\n\n\n## Usage\n\nThere are several targets in this package:\n- DittoAllToolsMenu\n- DittoPresenceViewer  \n- DittoPeersList  \n- DittoDiskUsage  \n- DittoDataBrowser \n- DittoExportLogs  \n- DittoExportData    \n- DittoPermissionsHealth\n- DittoHeartbeat\n\n### All Tools Menu\nThis tool provides an easy way to integrate all of our tools together in a single handy SwiftUI menu by passing in your `Ditto` instance. We typically recommend this tool for integration, unless you need limited specific tools for your app.\n\n\u003cimg src=\"/Img/AllToolsMenu.jpg\" alt=\"All Tools Menu\"\u003e\n\nYou can use this view in SwiftUI or UIKit\n\n**SwiftUI**\n\nSimply pass your `Ditto` instance in, e.g.:\n\n```swift\nAllToolsMenu(ditto: ditto)\n```\n\n**UIKit**\n\nWrap the AllToolsMenu in a UIHostingController, e.g.:\n\n```swift\nlet vc = UIHostingController(rootView: AllToolsMenu(ditto: ditto))\nnavigationController?.pushViewController(vc, animated: true)\n```\n  \n\n### Presence Viewer\nThe Presence Viewer displays a mesh graph that allows you to see all connected peers within the mesh \nand the transport each peer is using to make a connection.  \n\n \u003cimg src=\"/Img/presenceViewer.png\" alt=\"Presence Viewer Image\" width=\"300\"\u003e  \n\nFirst, make sure the \"DittoPresenceViewer\" is added to your Target. Then, use \n`import DittoPresenceViewer` to import the Presence Viewer.  \n\nYou can use the Presence Viewer in SiwftUI or UIKit\n\n**SwiftUI**  \n\nUse `PresenceView(ditto: Ditto)` and pass in your Ditto instance to display the mesh graph.  \n\n```swift\nimport DittoPresenceViewer\n\nstruct PresenceViewer: View{\n\n    var body: some View {\n        PresenceView(ditto: DittoManager.shared.ditto)\n    }\n}\n```\n\n**UIKit**  \n\nCall [present](https://developer.apple.com/documentation/uikit/uiviewcontroller/1621380-present) \nand pass `DittoPresenceView(ditto: DittoManager.shared.ditto).viewController` as a parameter. \nSet `animated` to `true`.  \n\n```swift\nfunc tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {\n    present(DittoPresenceView(ditto: DittoManager.shared.ditto).viewController, animated: true) {\n        if let selected = tableView.indexPathForSelectedRow {\n            tableView.deselectRow(at: selected, animated: true)\n        }\n    }\n}\n```\n\n### Peers List\nPeers List displays local and connected remote peers within the mesh in a list view, and the transport \neach peer is using to make a connection.\n\n \u003cimg src=\"/Img/peersList.png\" alt=\"Peers List Image\" width=\"300\"\u003e  \n\nYou can use the Peers List in SiwftUI or UIKit\n\n**SwiftUI**  \n\nUse `PeersListView(ditto: Ditto)`, passing in your Ditto instance to display the peers list.  \n\n```swift\nimport DittoSwift\n\nstruct PeersListViewer: View {\n\n   var body: some View {\n       PeersListView(ditto: DittoManager.shared.ditto)\n   }\n}\n```\n\n**UIKit**  \n\nPass `PeersListView(ditto: Ditto)` to a [UIHostingController](https://sarunw.com/posts/swiftui-in-uikit/) \nwhich will return a view controller you can use to present.  \n\n```swift\nlet vc = UIHostingController(rootView: PeersListView(ditto: DittoManager.shared.ditto))\n\npresent(vc, animated: true)\n```\n\n### Disk Usage  \nDisk Usage allows you to see Ditto's file space usage. In addition to viewing it you can also export the shown data.\n\n \u003cimg src=\"/Img/diskUsage.png\" alt=\"Disk Usage Image\" width=\"300\"\u003e  \n\nFirst, make sure the \"DittoDiskUsage\" is added to your Target. Then, use `import DittoDiskUsage` \nto import the Disk Usage.  \n\n**SwiftUI**  \n\nUse `DittoDiskUsageView(ditto: Ditto)` and pass in your Ditto instance.  \n\n```swift\nimport DittoDiskUsage\n\nstruct DiskUsageViewer: View {\n    var body: some View {\n        DittoDiskUsageView(ditto: DittoManager.shared.ditto)\n    }\n}\n```  \n\n**UIKit**  \n\nPass `DittoDiskUsageView(ditto: Ditto)` to a [UIHostingController](https://sarunw.com/posts/swiftui-in-uikit/) \nwhich will return a view controller you can use to present.  \n\n```swift\nlet vc = UIHostingController(rootView: DittoDiskUsageView(ditto: DittoManager.shared.ditto))\n\npresent(vc, animated: true)\n```\n\n### Data Browser\nThe Ditto Data Browser allows you to view all your collections, documents within each collection and \nthe properties/values of a document. With the Data Browser, you can observe any changes that are made \nto your collections and documents in real time.  \n\n \u003cimg src=\"/Img/collections.png\" alt=\"Collections Image\" width=\"300\"\u003e  \n\n \u003cimg src=\"/Img/document.png\" alt=\"Document Image\" width=\"300\"\u003e  \n \n**Standalone App**  \nIf you are using the Data Browser as a standalone app, there is a button, `Start Subscriptions`, \nyou must press in order to start syncing data. If you are embedding the Data Browser into another \napplication then you do not need to press `Start Subscriptions`, as you should already have your \nsubscriptions running.  \n\nFirst, make sure the \"DittoDataBrowser\" is added to your Target. Then, use `import DittoDataBrowser` \nto import the Data Browser.  \n\n**SwiftUI**  \n\nUse `DataBrowser(ditto: Ditto)` and pass in your Ditto instance to display the Data Browser.  \n\n```swift\nimport DittoDataBrowser\n\nstruct DataBrowserView: View {\n    var body: some View {\n       DataBrowser(ditto: DittoManager.shared.ditto)\n    }\n}\n```  \n\n**UIKit**  \n\nPass `DataBrowser(ditto: Ditto)` to a [UIHostingController](https://sarunw.com/posts/swiftui-in-uikit/) \nwhich will return a view controller you can use to present.   \n\n```swift\nlet vc = UIHostingController(rootView: DataBrowser(ditto: DittoManager.shared.ditto))\n\npresent(vc, animated: true)\n```  \n\n### Logging and Export Logs\n#### Logging Level  \n\nThe LoggingDetailsView allows you to choose the Ditto logging level at runtime and toggle whether logging is enabled. Changes made through the LoggingDetailsView are automatically persisted using UserDefaults, ensuring the selected log level and enabled status are restored when the app restarts.\n\n \u003cimg src=\"/Img/loggingLevel.png\" alt=\"Logging Level Image\" width=\"300\"\u003e  \n\n\n#### SwiftUI\n\nTo integrate the LoggingDetailsView into your app, simply pass your Ditto instance to the view. The picker will display the available log levels, and the toggle will allow enabling or disabling logging.\n\n```swift\nimport DittoExportLogs\nimport DittoSwift\nimport SwiftUI\n\nstruct LoggingDetailsViewer: View {\n    var body: some View {\n        LoggingDetailsView(ditto: \u003cditto instance\u003e)\n    }\n}\n```\n\nYou can embed the LoggingDetailsView into your app’s navigation hierarchy or display it as a modal view. For example:\n\n```swift\nNavigationView {\n    VStack {\n        LoggingDetailsView()\n    }\n    .navigationTitle(\"Logging Settings\")\n}\n```\n\nOr present it as a sheet:\n\n```swift\n.sheet(isPresented: $isPresented) {\n    LoggingDetailsView()\n}\n```\n        \n#### Export Logs to Device\nAllows you to export a file of the logs from your applcation as a zip file.  \n\n \u003cimg src=\"/Img/exportLogs.png\" alt=\"Export Logs Image\" width=\"300\"\u003e  \n\nFirst, make sure the \"DittoExportLogs\" is added to your Target. Then, use `import DittoExportLogs` \nto import the Export Logs.\n\n**SwiftUI**  \n\nUse `ExportLogs()` to export the logs. It is recommended to call `ExportLogs` from within a [sheet](https://developer.apple.com/documentation/swiftui/view/sheet(ispresented:ondismiss:content:)).  \n\n```swift\n.sheet(isPresented: $isPresented) {\n    ExportLogs()\n}\n```  \n\n**UIKit**  \n\nPass `ExportLogs()` to a [UIHostingController](https://sarunw.com/posts/swiftui-in-uikit/) \nwhich will return a view controller you can use to present.  \n\n```swift\nlet vc = UIHostingController(rootView: ExportLogs())\n\npresent(vc, animated: true)\n```\n\n#### Export Logs to Portal\n\n \u003cimg src=\"/Img/addLogsToPortal.png\" alt=\"Export Logs Image\" width=\"300\"\u003e  \n\nExport Logs to Portal allows you to request that logs from your application be uploaded to the Ditto Portal associated with your app ID. This is useful for remote diagnostics and support.\n\nWhen you trigger an export to Portal, the tool updates a special Ditto collection that signals the Ditto cloud service to collect logs from your device. The logs will be available in the Ditto Portal for your app.\n\n\u003e **Note:** For this feature to work, `DQL_STRICT_MODE` must be set to `false`. For more information about DQL strict mode, see the [DQL Strict Mode documentation](https://docs.ditto.live/dql/strict-mode).\n\nFirst, make sure the \"DittoExportLogs\" is added to your Target. Then, use `import DittoExportLogs` to import the Export Logs to Portal functionality.\n\n**Programmatic API**\n\nYou can also trigger log upload programmatically from anywhere in your app using the public API:\n\n```swift\nimport DittoExportLogs\nimport DittoSwift\n\nTask {\n    do {\n        try await LogUploader.uploadLogsToPortal(ditto: ditto)\n        print(\"Log upload requested successfully\")\n    } catch {\n        print(\"Failed to request log upload: \\(error)\")\n    }\n}\n```\n\n**SwiftUI**\n\nUse `ExportLogsToPortalView(ditto:onDismiss:)` to request log upload. Pass your Ditto instance and a dismiss callback. It is recommended to present this from within a [sheet](https://developer.apple.com/documentation/swiftui/view/sheet(ispresented:ondismiss:content:)).\n\n```swift\nimport DittoExportLogs\nimport DittoSwift\n\n.sheet(isPresented: $showExportToPortal) {\n    ExportLogsToPortalView(ditto: ditto) {\n        showExportToPortal = false\n    }\n}\n```\n\n**UIKit**\n\nPass `ExportLogsToPortalView(ditto:onDismiss:)` to a [UIHostingController](https://sarunw.com/posts/swiftui-in-uikit/) which will return a view controller you can use to present.\n\n```swift\nlet vc = UIHostingController(\n    rootView: ExportLogsToPortalView(ditto: ditto) {\n        // Dismiss logic\n        self.dismiss(animated: true)\n    }\n)\n\npresent(vc, animated: true)\n```\n\n\n### Export Data Directory\n\nExportData allows you to export the Ditto store directory as a zip file.\n\n\u003cimg src=\"/Img/exportData.png\" alt=\"Export Data\" width=\"300\"\u003e\n\n**SwiftUI**\n\nUse `ExportData(ditto: ditto)` to get `UIActivityViewController` and call it within a  [sheet](https://developer.apple.com/documentation/swiftui/view/sheet(ispresented:ondismiss:content:)).\n\n```swift\n.sheet(isPresented: $isPresented) {\n    ExportData(ditto: ditto)\n}\n```  \n\n**UIKit**\n\nPass `UIActivityViewController` (return value of `ExportData(ditto: ditto)`) to [UIHostingController](https://sarunw.com/posts/swiftui-in-uikit/) \nwhich will return a view controller you can use to present.\n\n```swift\nlet vc = UIHostingController(rootView: ExportData(ditto: ditto))\n\npresent(vc, animated: true)\n```\n\n### Presence Degradation Reporter\n\nTracks the status of your mesh, allowing to define the minimum of required peers that needs to be connected. Provides a callback function that will allow you to monitor the status of the mesh.\n\n\u003cimg width=\"248\" alt=\"Screenshot 2024-02-20 at 5 14 18 PM\" src=\"https://github.com/getditto/DittoSwiftTools/assets/60948031/9cf81503-4557-4480-a843-1236314c926b\"\u003e\n\nYou can use the Presence Degradation Reporter in SiwftUI or UIKit\n\ndata provided in callback\n```swift\nsettings: Settings\nstruct Settings {\n    let expectedPeers: Int\n    let reportApiEnabled: Bool\n    let hasSeenExpectedPeers: Bool\n    let sessionStartedAt: String\n}\n```\n\n**SwiftUI**  \n\nUse `PresenceDegradationView(ditto: DittoManager.shared.ditto!) { expectedPeers, remotePeers, settings in //handle data}`, passing in your Ditto instance to display the peers list.  \n\n```swift\nimport DittoPresenceDegradation\n\nstruct PresenceDegradationViewer: View {\n    \n    var body: some View {\n        PresenceDegradationView(ditto: \u003cdiito\u003e) { expectedPeers, remotePeers, settings in\n            //handle data\n        }\n    }\n}\n```\n\n**UIKit**  \n\nPass `PresenceDegradationView(ditto: \u003cditto\u003e)` to a [UIHostingController](https://sarunw.com/posts/swiftui-in-uikit/) \nwhich will return a view controller you can use to present.  \n\n```swift\nlet vc = UIHostingController(rootView: PresenceDegradationView(ditto: \u003cdiito\u003e))\n\npresent(vc, animated: true)\n```\n\n### Permissions Health\n\nPermissions Health allows you to see the status of ditto's required services and permissions.\n\nExample: Wi-Fi, Bluetooth, Missing Permissions.\n\n\u003cimg width=\"371\" alt=\"Screenshot 2024-02-28 at 12 47 28 PM\" src=\"https://github.com/getditto/DittoSwiftTools/assets/60948031/1059ff07-d2f6-463c-8185-ce9fa206edea\"\u003e\n\n**SwiftUI**\n\n```swift\nimport DittoPermissionsHealth\n\nstruct PermissionsHealthViewer: View {\n    var body: some View {\n        PermissionsHealth()\n    }\n}\n```\n\n**UIKit**\n\nPass `UIActivityViewController` (return value of `PermissionsHealth()`) to [UIHostingController](https://sarunw.com/posts/swiftui-in-uikit/) \nwhich will return a view controller you can use to present.\n\n```swift\nlet vc = UIHostingController(rootView: PermissionsHealth())\n\npresent(vc, animated: true)\n```\n\n### Heartbeat\n\nThe Ditto Heartbeat tool allows you to monitor, locally or remotely, the peers in your mesh. It allows you to regularly report data and health of the device.\n\n**Configure Heartbeat**\n\nThese are the values you need to provide to the Heartbeat:\n1. `id` - Unique value that identifies the device.\n2. `secondsInterval` - The frequency at which the Heartbeat will scrape the data.\n3. `metadata` (optional) - Any metadata you want to attach to this heartbeat.\n4. `healthMetricsProviders` (optional) - Any `HealthMetricProvider`s you want to use with this heartbeat. These can be from DittoSwiftTools e.g. `BluetoothManager` from `DittoPermissionsHealth` or custom tools.\n5. `publishToDittoCollection` a flag to determine whether to publish the heartbeat data as a Ditto collection. Defaults to `true`.\n\nThere is a `DittoHeartbeatConfig` struct you can use to construct your configuration.\n\n```swift\n// Provided with the Heartbeat tool\npublic struct DittoHeartbeatConfig {\n    public var id: String\n    public var secondsInterval: Int\n    public var metadata: [String: Any]?\n    public var healthMetricProviders: [HealthMetricProvider]\n    public var publishToDittoCollection: Bool\n\n    public init(id: String,\n                secondsInterval: Int,\n                metadata: [String : Any]? = nil,\n                healthMetricProviders: [HealthMetricProvider] = [],\n                publishToDittoCollection: Bool = true) {\n        self.id = id\n        self.secondsInterval = secondsInterval\n        self.metadata = metadata\n        self.healthMetricProviders = healthMetricProviders\n        self.publishToDittoCollection = publishToDittoCollection\n    }\n}\n```\n\nThis tool generates a `DittoHeartbeatInfo` object with the given data:\n```swift\npublic struct DittoHeartbeatInfo: Identifiable {\n    public var id: String\n    public var schema: String\n    public var secondsInterval: Int\n    public var lastUpdated: String\n    public var sdk: String\n    public var presenceSnapshotDirectlyConnectedPeersCount: Int { presenceSnapshotDirectlyConnectedPeers.count }\n    public var presenceSnapshotDirectlyConnectedPeers: [DittoPeerConnection]\n    public var metadata: [String: Any]\n    public var healthMetrics: [String: HealthMetric]\n}\n\npublic struct DittoPeerConnection {\n    public var deviceName: String\n    public var sdk: String\n    public var isConnectedToDittoCloud: Bool\n    public var bluetooth: Int\n    public var p2pWifi: Int\n    public var lan: Int\n    public var peerKey: String\n}\n\n// See DittoHealthMetrics\npublic struct HealthMetric {\n    public var isHealthy: Bool\n    public var details: [String: String]\n}\n```\n\nYou can either use the provided UI from this tool or you can read the `DittoHeartbeatInfo` data and create your own UI/use the data as you please.\n\n**Use provided UI:**\n\n**SwiftUI**  \n\nUse `HeartbeatView(ditto: dittoModel.ditto!, config: heartbeatConfig)`, passing in your Ditto instance and your DittoHeartbeatConfig object.  \n\n```swift\nimport DittoHeartbeat\n\nstruct HeartbeatViewer: View {\n    var body: some View {\n        HeartbeatView(ditto: \u003cditto\u003e, config: \u003cheartbeatConfig\u003e)\n    }\n}\n```\n\n**UIKit**  \n\nPass `HeartbeatView(ditto: \u003cditto\u003e, config: \u003cheartbeatConfig\u003e)` to a [UIHostingController](https://sarunw.com/posts/swiftui-in-uikit/) \nwhich will return a view controller you can use to present.  \n\n```swift\nlet vc = UIHostingController(rootView: HeartbeatView(ditto: \u003cditto\u003e, config: \u003cheartbeatConfig\u003e))\n```\n\n**Read data only:**\n\nCreate a `HeartbeatVM(ditto: \u003cditto\u003e` object and then call `startHeartbeat(config: DittoHeartbeatConfig, callback: @escaping HeartbeatCallback)`. You can access the data in the callback of `startHeartbeat`\n```swift\nvar heartBeatVm = HeartbeatVM(ditto: DittoManager.shared.ditto!)\nheartBeatVm.startHeartbeat(config: DittoHeartbeatConfig(secondsInterval: Int, metadata: metadata: [String:Any]? )) { heartbeatInfo in\n        //use data\n} \n```\n\n## Ditto Tools Example App\nThe [Ditto Tools Example App](https://github.com/getditto/DittoSwiftTools/tree/main/DittoToolsApp) \nincluded in this repo allows you to try the DittoSwiftTools package in a standalone app. Open \nDittoToolsApp.xcodeproj in Xcode and build to a simulator or device.   \n\n\u003cdiv align=\"center\"\u003e\n    \u003cfigure\u003e\n        \u003cimg src=\"Img/app_menu.png\" width=\"300px\" alt=\"Ditto Tools app displaying the list of available tools.\"\u003e\n        \u003cfigcaption\u003eDitto Tools app displaying the list of available tools.\u003c/figcaption\u003e\n    \u003c/figure\u003e\n \u003c/div\u003e\n\nIn the `CONFIGURATION` section of the tools list, click Change Identity to configure and start, or \nrestart, the Ditto session. Select `Online Playground`, `Offline Playground`, or `Online \nWith Authentication` in the Identity picker. Then add the appropriate `App ID` and other values \nfrom your Ditto portal app and click `Restart Ditto`.  \n\n\u003cdiv align=\"center\"\u003e\n    \u003cfigure\u003e\n        \u003cimg src=\"Img/app_config.png\" width=\"300px\" alt=\"Ditto Tools app showing the configuration details.\"\u003e\n        \u003cfigcaption\u003eDitto Tools app showing the configuration details.\u003c/figcaption\u003e\n    \u003c/figure\u003e\n \u003c/div\u003e\n\nThis will initialize the Ditto instance and enable you to try the different features.   \n\n\n## Troubleshooting\n\n\n### Could not resolve package dependencies for `Swift tools`  \n\n```\nxcodebuild: error: Could not resolve package dependencies:\n  package at 'http://github.com/getditto/DittoSwiftTools' @ 0ae82dcc1031d25ce5f6f20735b666312ecb2e53 is using Swift tools version 5.6.0 but the installed version is 5.5.0 in http://github.com/getditto/DittoSwiftTools  \n```\n\nSolution: Update to the latest version of XCode to get new Swift versions.\n\n## Contact\n\nSend us an email at support@ditto.com.\n\n## License (MIT)\nCopyright © 2023 DittoLive\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n``\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgetditto%2Fdittoswifttools","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgetditto%2Fdittoswifttools","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgetditto%2Fdittoswifttools/lists"}