{"id":17540142,"url":"https://github.com/kiliankoe/clispinner","last_synced_at":"2025-09-02T13:38:55.329Z","repository":{"id":63914580,"uuid":"99019610","full_name":"kiliankoe/CLISpinner","owner":"kiliankoe","description":"Swifty Terminal Spinner","archived":false,"fork":false,"pushed_at":"2021-01-24T21:46:43.000Z","size":70,"stargazers_count":219,"open_issues_count":3,"forks_count":14,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-04-16T02:56:54.094Z","etag":null,"topics":["cli","loading-animations","spinner"],"latest_commit_sha":null,"homepage":null,"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/kiliankoe.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}},"created_at":"2017-08-01T16:03:33.000Z","updated_at":"2025-03-10T14:47:18.000Z","dependencies_parsed_at":"2023-01-14T13:30:44.222Z","dependency_job_id":null,"html_url":"https://github.com/kiliankoe/CLISpinner","commit_stats":null,"previous_names":[],"tags_count":11,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kiliankoe%2FCLISpinner","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kiliankoe%2FCLISpinner/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kiliankoe%2FCLISpinner/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kiliankoe%2FCLISpinner/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kiliankoe","download_url":"https://codeload.github.com/kiliankoe/CLISpinner/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252907767,"owners_count":21823272,"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":["cli","loading-animations","spinner"],"created_at":"2024-10-20T22:08:31.350Z","updated_at":"2025-05-07T15:40:48.085Z","avatar_url":"https://github.com/kiliankoe.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"# CLISpinner\n\n[![Travis](https://img.shields.io/travis/kiliankoe/CLISpinner.svg?style=flat-square)](https://travis-ci.org/kiliankoe/CLISpinner/)\n\n\u003e 60+ spinners for use in the terminal\n\n![](https://github.com/sindresorhus/cli-spinners/raw/master/screenshot.gif)\n\nShamelessly ripped off from [sindresorhus/cli-spinners](https://github.com/sindresorhus/cli-spinners).\n\n\n\n## Install\n\n```swift\n.package(url: \"https://github.com/kiliankoe/CLISpinner\", from: \"see latest release\")\n```\n\n\n\n## Usage\n\nJust want to display a simple spinner for two seconds? \n\n```swift\nlet s = Spinner(pattern: .dots)\ns.start()\nsleep(2)\ns.stop()\n```\n\nWant some changing text and patterns?\n\n```swift\nlet s = Spinner(pattern: .dots, text: \"Foobar...\", color: .lightCyan)\ns.start()\nsleep(2)\ns.succeed(text: \"Barfoo\")\n// will change the displayed text to '✔ Barfoo'\n```\n\nMade your own custom pattern?\n\n```swift\nlet pattern = try Pattern.load(from: \"/path/to/your/pattern.json\")\nlet s = spinner(pattern: pattern)\ns.start()\nsleep(2)\ns.stop()\n```\n\nWant all the patterns from [sindresorhus/cli-spinners](https://github.com/sindresorhus/cli-spinners/blob/master/spinners.json)?\n\n```swift\nlet patterns = try Patterns(from: \"/path/to/spinners.json\")\nlet s = spinner(pattern: patterns[\"christmas\"]!)\ns.start()\nsleep(2)\ns.stop()\n```\n\n\n\nThat's basically it 👌\n\n\n\n## Creating your own Pattern\n\nThe `Pattern` type can read in patterns from a JSON file using the following format:\n\n```json\n{\n    \"frames\": [\n        \"1\",\n        \"2\",\n        \"3\",\n        \"4\",\n        \"5\"\n    ],\n    \"speed\": 0.08\n}\n```\n\nTo keep multiple patterns in a single file:\n\n```json\n{\n    \"pattern-name1\": {\n        \"frames\": [\n            \"\u003c(**\u003c)\",\n            \"\u003c(**)\u003e\",\n            \"(\u003e**)\u003e\"\n        ],\n        \"speed\": 0.01\n    },\n    \"pattern-name2\": {\n        \"frames\": [\n            \"1\",\n            \"2\",\n            \"3\",\n            \"2\"\n        ],\n        \"speed\": 0.12\n    }\n}\n```\n\n\n## Caveat\n\nTo look *nice* the spinner hides the user's cursor as long as it's running and displays it again when stopped. The issue with this is that the cursor will still be hidden if the user interrupts the process (by sending a SIGINT through \u003ckbd\u003ectrl\u003c/kbd\u003e+\u003ckbd\u003ec\u003c/kbd\u003e for example). The best way to handle this is by setting up a signal handler in your code and calling `spinner.unhideCursor()` on exiting. This library purposefully does not do that for you so as not to interfere with any possible signal handlers you might already have set up.\n\nSee [IBM-Swift/BlueSignals](https://github.com/IBM-Swift/BlueSignals) for a clean and safe way of handling signals. The appropriate signal handler for your project could look something like this.\n\n```swift\nimport Signals\n\nlet spinner = Spinner(pattern: .dots)\n// ...\n\nSignals.trap(signal: .int) { _ in\n    spinner.unhideCursor()\n    exit(0)\n}\n```\n\n\n\n## Used by\n\n- [kiliankoe/apodidae](https://github.com/kiliankoe/apodidae) - CLI to search for Swift packages\n- [Swift-Watch/Watcher](https://github.com/Swift-Watch/Watcher) - file watcher and test runner for Swift projects\n- Your project? 😊\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkiliankoe%2Fclispinner","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkiliankoe%2Fclispinner","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkiliankoe%2Fclispinner/lists"}