{"id":47516119,"url":"https://github.com/dhth/ting","last_synced_at":"2026-04-01T07:00:41.316Z","repository":{"id":306121627,"uuid":"1025080542","full_name":"dhth/ting","owner":"dhth","description":"audio feedback on the command line","archived":false,"fork":false,"pushed_at":"2026-03-08T13:44:57.000Z","size":206,"stargazers_count":9,"open_issues_count":5,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-08T17:33:59.448Z","etag":null,"topics":["audio","notifications"],"latest_commit_sha":null,"homepage":"https://tools.dhruvs.space/ting/","language":"Rust","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/dhth.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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-07-23T17:31:34.000Z","updated_at":"2026-03-08T13:44:59.000Z","dependencies_parsed_at":"2026-03-08T15:48:39.596Z","dependency_job_id":null,"html_url":"https://github.com/dhth/ting","commit_stats":null,"previous_names":["dhth/ting"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/dhth/ting","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dhth%2Fting","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dhth%2Fting/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dhth%2Fting/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dhth%2Fting/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dhth","download_url":"https://codeload.github.com/dhth/ting/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dhth%2Fting/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31269176,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-01T06:57:45.811Z","status":"ssl_error","status_checked_at":"2026-04-01T06:57:42.389Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["audio","notifications"],"created_at":"2026-03-27T13:00:30.246Z","updated_at":"2026-04-01T07:00:41.310Z","avatar_url":"https://github.com/dhth.png","language":"Rust","funding_links":[],"categories":["\u003ca name=\"funny\"\u003e\u003c/a\u003eFunny tools"],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003ch1 align=\"center\"\u003eting\u003c/h1\u003e\n  \u003cp align=\"center\"\u003e\n    \u003ca href=\"https://github.com/dhth/ting/actions/workflows/main.yml\"\u003e\u003cimg alt=\"Build status\" src=\"https://img.shields.io/github/actions/workflow/status/dhth/ting/main.yml?style=flat-square\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://crates.io/crates/ting\"\u003e\u003cimg alt=\"crates.io\" src=\"https://img.shields.io/crates/v/ting?style=flat-square\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/dhth/ting/releases/latest\"\u003e\u003cimg alt=\"Latest Release\" src=\"https://img.shields.io/github/release/dhth/ting.svg?style=flat-square\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/dhth/ting/releases\"\u003e\u003cimg alt=\"Commits Since Latest Release\" src=\"https://img.shields.io/github/commits-since/dhth/ting/latest?style=flat-square\"\u003e\u003c/a\u003e\n  \u003c/p\u003e\n\u003c/p\u003e\n\n`ting` provides audio feedback on the command line.\n\n```text\ncargo test; ting p $?\n──────────  ─────────\n     ▲          ▲\n     │          │\n     │          └────── plays audio feedback based on exit code 🔔\n     │\n     └───────────────── command being monitored\n```\n\n💾 Installation\n---\n\n**homebrew**:\n\n```sh\nbrew install dhth/tap/ting\n```\n\n**cargo**:\n\n```bash\ncargo install ting\n```\n\nOr get a binary directly from a [release][1]. Read more about verifying the\nauthenticity of released artifacts [here](#-verifying-release-artifacts).\n\n⚡️ Usage\n---\n\nThe command you will use most often is `p` (short for \"play\").\n\n```bash\nting p -h\n```\n\n```text\nPlay sound for an input\n\nUsage: ting p [OPTIONS] \u003cINPUT\u003e\n\nArguments:\n  \u003cINPUT\u003e  Exit code (0, 1, etc.) or cue name (configured via ting's config)\n\nOptions:\n  -C, --config-path \u003cPATH\u003e  Path to the config file (overrides ting's default config path)\n      --no-match-exit-code  Don't exit ting with the same code as the input\n      --debug               Output debug information without doing anything\n  -h, --help                Print help\n```\n\nYou can make invoking ting easier by creating an alias as follows.\n\n```bash\nalias t='ting p $?'\ncargo check; t\ncargo check; t \u0026\u0026 cargo clippy; t \u0026\u0026 cargo test; t\n```\n\n\u003e [!NOTE]\n\u003e By default, `ting p \u003cCODE\u003e` exits with the code provided to it. Use\n\u003e `--no-match-exit-code` if you don't want this behaviour.\n\n🔈 Custom Sounds\n---\n\n`ting` allows users to bring their own sounds for playback. These are configured\nvia `ting`'s config.\n\nRun `ting config sample` to see a sample config.\n\n```bash\nting config sample\n```\n\n```toml\n# place the following config in \"\u003cYOUR_CONFIG_DIRECTORY\u003e/ting/ting.toml\":\n\n[exit_codes]\n# optional; sound to play for exit code 0\n# if not set, ting will use built-in sound\nsuccess = \"~/sounds/success.wav\"\n# optional; sound to play for exit code other than 0\n# if not set, ting will use built-in sound\nerror = \"~/sounds/error.wav\"\n\n# these need to be set only if you want to use custom cues as follows\n# `ting p build-success`\n# otherwise these are not needed\n[cues]\nbuild-success = \"~/sounds/custom/build-success.wav\"\nbuild-fail = \"~/sounds/custom/build-fail.wav\"\n```\n\nAs shown in the sample config, you can customize sounds for success and error\nexit codes.\n\nBesides exit code feedback, `ting` can also play sounds based on custom cues.\nConfigure these as shown above, and then invoke `ting` as follows.\n\n```bash\nting p build-success\n```\n\n\u003e [!NOTE]\n\u003e `ting` supports MP3 and WAV files only.\n\n\u003e [!TIP]\n\u003e Keep custom sound files short (under 2 seconds). `ting` plays the entire file\n\u003e and will block your workflow until it finishes.\n\n🎛️ Config\n---\n\nYou can have `ting` print out a sample config. This command will also print\n`ting`'s default config location on your OS.\n\n```bash\nting config sample\n```\n\nAfter you set up a config, you can have `ting` validate it.\n\n```bash\nting config validate\n```\n\n```text\nFound 3 validation errors:\n  1. file associated with exit_codes.success does not exist: '/Users/user/sounds/absent.mp3'\n  2. file associated with cues.one does not exist: '/Users/user/sounds/wrong-extension.m3p'\n  3. path associated with cues.two is not a file: '/Users/user/sounds/a-directory'\n```\n\n🔐 Verifying release artifacts\n---\n\nIn case you get the `ting` binary directly from a [release][1], you may want to\nverify its authenticity. Checksums are applied to all released artifacts, and\nthe resulting checksum file is attested using [Github Attestations][2].\n\nSteps to verify (replace `A.B.C` in the commands below with the version you\nwant):\n\n1. Download the sha256 checksum file for your platform from the release:\n\n   ```shell\n   curl -sSLO https://github.com/dhth/ting/releases/download/vA.B.C/ting-x86_64-unknown-linux-gnu.tar.xz.sha256\n   ```\n\n2. Verify the integrity of the checksum file using [gh][3].\n\n   ```shell\n   gh attestation verify ting-x86_64-unknown-linux-gnu.tar.xz.sha256 --repo dhth/ting\n   ```\n\n3. Download the compressed archive you want, and validate its checksum:\n\n   ```shell\n   curl -sSLO https://github.com/dhth/ting/releases/download/vA.B.C/ting-x86_64-unknown-linux-gnu.tar.xz\n   sha256sum --ignore-missing -c ting-x86_64-unknown-linux-gnu.tar.xz.sha256\n   ```\n\n3. If checksum validation goes through, uncompress the archive:\n\n   ```shell\n   tar -xzf ting-x86_64-unknown-linux-gnu.tar.xz\n   cd ting-x86_64-unknown-linux-gnu\n   ./ting -h\n   # profit!\n   ```\n\n[1]: https://github.com/dhth/ting/releases\n[2]: https://github.blog/news-insights/product-news/introducing-artifact-attestations-now-in-public-beta/\n[3]: https://github.com/cli/cli\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdhth%2Fting","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdhth%2Fting","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdhth%2Fting/lists"}