{"id":13471574,"url":"https://github.com/thehowl/claws","last_synced_at":"2025-12-24T11:11:36.997Z","repository":{"id":39821839,"uuid":"95054584","full_name":"thehowl/claws","owner":"thehowl","description":"Awesome WebSocket CLient - an interactive command line client for testing websocket servers","archived":false,"fork":false,"pushed_at":"2023-01-29T23:14:29.000Z","size":1821,"stargazers_count":300,"open_issues_count":7,"forks_count":18,"subscribers_count":11,"default_branch":"master","last_synced_at":"2024-10-30T02:59:46.493Z","etag":null,"topics":["cli","command-line-app","debugging","gocui","websocket","websocket-client","websockets"],"latest_commit_sha":null,"homepage":"","language":"Go","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/thehowl.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-06-21T23:20:18.000Z","updated_at":"2024-10-22T07:35:26.000Z","dependencies_parsed_at":"2023-02-16T01:45:53.880Z","dependency_job_id":null,"html_url":"https://github.com/thehowl/claws","commit_stats":null,"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/thehowl/claws","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thehowl%2Fclaws","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thehowl%2Fclaws/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thehowl%2Fclaws/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thehowl%2Fclaws/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/thehowl","download_url":"https://codeload.github.com/thehowl/claws/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thehowl%2Fclaws/sbom","scorecard":{"id":878753,"data":{"date":"2025-08-11","repo":{"name":"github.com/thehowl/claws","commit":"19acc1886288584e66d54dfbfc89e565e245e249"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.8,"checks":[{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: topLevel 'contents' permission set to 'write': .github/workflows/go.yml:10","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/go.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/thehowl/claws/go.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/go.yml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/thehowl/claws/go.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/go.yml:33: update your workflow using https://app.stepsecurity.io/secureworkflow/thehowl/claws/go.yml/master?enable=pin","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Code-Review","score":0,"reason":"Found 1/22 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact 0.4.1 not signed: https://api.github.com/repos/thehowl/claws/releases/71477512","Warn: release artifact 0.3.2 not signed: https://api.github.com/repos/thehowl/claws/releases/15742467","Warn: release artifact 0.3.0 not signed: https://api.github.com/repos/thehowl/claws/releases/9929642","Warn: release artifact 0.2.1 not signed: https://api.github.com/repos/thehowl/claws/releases/7490037","Warn: release artifact 0.2.0 not signed: https://api.github.com/repos/thehowl/claws/releases/6829494","Warn: release artifact 0.4.1 does not have provenance: https://api.github.com/repos/thehowl/claws/releases/71477512","Warn: release artifact 0.3.2 does not have provenance: https://api.github.com/repos/thehowl/claws/releases/15742467","Warn: release artifact 0.3.0 does not have provenance: https://api.github.com/repos/thehowl/claws/releases/9929642","Warn: release artifact 0.2.1 does not have provenance: https://api.github.com/repos/thehowl/claws/releases/7490037","Warn: release artifact 0.2.0 does not have provenance: https://api.github.com/repos/thehowl/claws/releases/6829494"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 9 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":6,"reason":"4 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GO-2021-0089 / GHSA-rmh2-65xw-9m6q","Warn: Project is vulnerable to: GO-2021-0057 / GHSA-8vrw-m3j9-j27c","Warn: Project is vulnerable to: GO-2020-0019 / GHSA-3xh2-74w9-5vxm","Warn: Project is vulnerable to: GO-2022-0493 / GHSA-p782-xgp4-8hr8"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-24T07:09:39.782Z","repository_id":39821839,"created_at":"2025-08-24T07:09:39.782Z","updated_at":"2025-08-24T07:09:39.782Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28001442,"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","status":"online","status_checked_at":"2025-12-24T02:00:07.193Z","response_time":83,"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":["cli","command-line-app","debugging","gocui","websocket","websocket-client","websockets"],"created_at":"2024-07-31T16:00:46.826Z","updated_at":"2025-12-24T11:11:36.975Z","avatar_url":"https://github.com/thehowl.png","language":"Go","funding_links":[],"categories":["Go","Command-Line Interface (CLI) Tools"],"sub_categories":["Protocols and APIs"],"readme":"\u003cp align=\"center\"\u003e\n\u003cimg src=\"https://random.zxq.co/claws.gif\" alt=\"claws demonstration\"\u003e\n\u003c/p\u003e\n\u003ch5 align=\"center\"\u003ean Awesome WebSocket CLient\u003c/h5\u003e\n\u003ch1 align=\"center\"\u003eClaws \u003ca href=\"https://travis-ci.org/thehowl/claws\"\u003e\u003cimg src=\"https://travis-ci.org/thehowl/claws.svg?branch=master\"\u003e\u003c/a\u003e\u003c/h1\u003e\n\nClaws is an interactive command line client to interface with WebSockets. It\nallows you to clearly identify the messages you send and those you receive,\nscroll through your history and send commands in a shell-like fashion,\nformat JSON messages, add timestamps and perform pre-formatting on messages\nyou send and receive.\n\n## Getting started\n\nYou can grab the latest release binary from the [releases page](https://github.com/thehowl/claws/releases). Simply download it, extract it, and run it in a command line.\n\nIf you have Go set up, it is easy as running the following command and making sure that `$GOPATH/bin` (or `$GOBIN`) is in your PATH.\nGenerally, this should be pretty stable, but keep in mind that it builds on master, so it may break at any point.\n\n```\ngo install -v howl.moe/claws@latest\n```\n\n## Usage\n\n[A 4-minute video tutorial is available to explain the basics of the\ninterface](https://youtu.be/yIhEcA0Z794)\n\n```\nclaws [wsURL]\n```\n\nwsURL is an optional websocket URL to connect to once the UI has been initialised.\n\nThe interface has some similar concepts to vim, but it should come off as more\nintuitive (and it's also easier to quit - as Ctrl-c quits the program as you\nwould expect!).\n\nOnce the UI has been initialised, you will be by default in \"insert mode\":\ngreen box with nothing in it. This means you are composing a message to send\nto the server through the websocket. By pressing `Esc`, followed by a letter,\nyou can do a variety of actions explained in the following table.\n\nLetter   | Meaning\n---------|----------------------------------------------------\n`i`      | Go to insert mode (also works by pressing the Ins key).\n`c`      | Create a new WebSocket connection. Will prompt for an URL. If nothing is passed, previous WebSocket URL will be used.\n`q`      | Close current WebSocket connection.\n\nExtra keybindings using Ctrl are Ctrl-C, which quits the program, and Ctrl-L,\nwhich clears the buffer (like the `clear` command in your command line)\n\nIf you want to scroll through the logs, while in Esc mode press the arrow keys,\nPgUp/PgDown, Home/End. Keep in mind that pressing any of these will disable autoscroll, so new elements from the log won't be shown unless you scroll down.\n\nWhen you're typing text into the field, you can browse through the history of previous text, even in previous sessions, in a bash-like fashion using the up and down keys.\n\n### Advanced usage\n\nThere are also more actions you can activate using ESC + key, that are generally not used on a day-to-day basis.\n\nLetter   | Meaning\n---------|----------------------------------------------------\n`t`      | Toggle timestamps before messages in console.\n`j`      | Toggle auto-detection of JSON in server messages and automatic tab indentation.\n`h`      | View help/welcome screen with quick commands.\n`R`      | Go into replace/overtype mode (can also be done by pressing Insert a couple of times).\n`p`      | Set ping interval in seconds.  Will prompt for an interval. If nothing is passed, pings will be disabled.\n\n## Configuration\n\nClaws stores its configuration file in `~/.config/claws.json`. You are welcome\nto hack it and change values to how you see fit. Here's a list of the values.\nNote that the path to the file is the same also on Windows.\n\n* **Info:** this field is used to redirect readers to this documentation file.\n* **JSONFormatting:** either true or false, depending on whether JSON formatting\n  is enabled.\n* **Timestamp:** a timestamp with which all messages to the console should be prefixed.\n  The defaults can be toggled using the `t` key in esc mode, although you can also use your own prefix,\n  following [Go's system of formatting dates](https://golang.org/pkg/time/#Time.Format).\n  The default values are an empty string `\"\"` or `\"=\u003e 2006-01-02 15:04:05 \"`.[^1]\n* **LastWebsocketURL:** URL of the last websocket you connected to. Used when connecting using the `c` key without specifying an URL.\n* **LastActions:** 50 most recent messages you sent to the console, used for seeking through history using up and down.\n* **PingSeconds:** Interval for sending websocket ping messages to the peer.  Disabled if \u003c= 0.\n\n### Pipe\n\nPiping allows you to log the messages you send and the messages you receive, or do any kind of pre-processing before they are sent or before they are shown on the console.\n\nPipes are specified by the `Pipe` configuration variable. It defaults to null - to set it, create an array containing in the first place a command and then the arguments for it. This should be a command available in your `$PATH` or an absolute path.\n\nFor UNIX system, this means you can do logging effectively using `tee`. The most basic form of logging may look like this:\n\n```json\n\"Pipe\": {\n\t\"In\": [\"tee\", \"-a\", \"received_messages.log\"],\n\t\"Out\": [\"tee\", \"-a\", \"sent_messages.log\"]\n}\n```\n\nThis will append to the given log files the received and sent messages. But it doesn't have to stop there! You can really create any script that may do any pre-processing you want to the messages you receive and those you send. If you intend to write a non-trivial script, here are things that might come useful to know:\n\n* Any non-zero exit code will show an error on the console.\n* The program should be pretty fast to run, as the message can't be shown until the processing has finished.\n* There are some environment variables which provide information on the connection:\n  * **`CLAWS_PIPE_TYPE`:** The type of pipe; either `in` or `out`.\n  * **`CLAWS_SESSION`:** UNIX timestamp in microseconds of when the session was started.\n  * **`CLAWS_CONNECTION`:** UNIX timestamp in microseconds of when the connection was started.\n  * **`CLAWS_WS_URL`:** WebSocket URL we're connected to.\n\nThe sky is the limit here, so you can really do anything you can think of. Here are some examples (feel free to add more with a PR!):\n\n* [New score notifier](https://gist.github.com/thehowl/97c77114859c64c67d357adf604229f4), using the [Ripple API](http://docs.ripple.moe/docs/api/websocket) (bash).\n\n## Contributing\n\nClaws is mostly feature-complete, though we have something that might interest you on our [issue list](https://github.com/thehowl/claws/issues). If, instead, you're interested in reporting a bug or asking for a new feature, you can create a new [issue](https://github.com/thehowl/claws/issues/new). There are no real contribution guidelines, but try to write some good Go code and use `go fmt` :).\n\n[^1]: The Timestamp is formatted also according to the type of message being\n  sent. Namely, the `=\u003e` in the default format is kept intact when sending\n  messages to the server, while it is replaced with `\u003c=` when receiving\n  messages. Equivalent values are `==` for debug-level logging, and \"!!\" for\n  errors reporting. Each of these is also signaled by the colour of the message.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthehowl%2Fclaws","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthehowl%2Fclaws","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthehowl%2Fclaws/lists"}