{"id":23326175,"url":"https://github.com/8go/matrix-commander-rs","last_synced_at":"2025-08-22T20:31:33.451Z","repository":{"id":61232615,"uuid":"548262385","full_name":"8go/matrix-commander-rs","owner":"8go","description":"simple but convenient CLI-based Matrix client app for sending and receiving (in Rust)","archived":false,"fork":false,"pushed_at":"2024-01-14T00:42:32.000Z","size":919,"stargazers_count":61,"open_issues_count":11,"forks_count":2,"subscribers_count":2,"default_branch":"main","last_synced_at":"2024-03-14T14:43:20.462Z","etag":null,"topics":["chat","cli","client","command-line-tool","im","matrix","matrix-rust-sdk","messaging","receive","ruma","rust","rust-lang","send","tool"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/8go.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}},"created_at":"2022-10-09T07:56:51.000Z","updated_at":"2024-05-02T16:54:38.817Z","dependencies_parsed_at":"2024-05-02T16:54:01.335Z","dependency_job_id":"97dc246f-af2a-49cc-a53f-65254e68ccff","html_url":"https://github.com/8go/matrix-commander-rs","commit_stats":{"total_commits":74,"total_committers":3,"mean_commits":"24.666666666666668","dds":0.5135135135135135,"last_synced_commit":"d6c91217a9be1e8a64dfff68e98148e33dfc2d21"},"previous_names":[],"tags_count":40,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/8go%2Fmatrix-commander-rs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/8go%2Fmatrix-commander-rs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/8go%2Fmatrix-commander-rs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/8go%2Fmatrix-commander-rs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/8go","download_url":"https://codeload.github.com/8go/matrix-commander-rs/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":230496993,"owners_count":18235413,"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":["chat","cli","client","command-line-tool","im","matrix","matrix-rust-sdk","messaging","receive","ruma","rust","rust-lang","send","tool"],"created_at":"2024-12-20T19:14:43.740Z","updated_at":"2024-12-20T19:14:44.285Z","avatar_url":"https://github.com/8go.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![crates.io - Version](\nhttps://img.shields.io/crates/v/matrix-commander\n)](https://crates.io/crates/matrix-commander)\n[![crates.io - Downloads](\nhttps://img.shields.io/crates/d/matrix-commander\n)](https://crates.io/crates/matrix-commander)\n\n\u003cp\u003e\n\u003cimg\nsrc=\"https://raw.githubusercontent.com/8go/matrix-commander-rs/master/logos/matrix-commander-rs.svg\"\nalt=\"MC logo\" height=\"150\"\u003e\n\n# matrix-commander-rs\nsimple but convenient CLI-based Matrix client app for sending, receiving, and much more\n\n# Help create this Rust program\n\nThis Rust project is currently bare essentials. \nA more feature-rich Python package `matrix-commander`\nexists. See [matrix-commander](https://github.com/8go/matrix-commander/).\nThe vision is to have a compatible program in Rust.\nThis project depends on you. The project will only advance if you provide\nsome code. Have a look at the repo\n[matrix-commander-rs](https://github.com/8go/matrix-commander-rs/).\nPlease help! :pray: Please contribute code to enhance this\n[matrix-commander](https://crates.io/crates/matrix-commander) crate.\nSafe!\n\n:heart: :clap: :pray:\n\n# What works so far\n\n- Login with password\n- Login with access token (restore login)\n- Encryption\n- Manual and Emoji verification\n- Sending one or multiple text message to one or multiple rooms\n- Sending one or multiple text message to one or multiple rooms\n- Listening for new and incoming messages on one or multiple rooms\n- Getting and printing old messages\n- Listing devices\n- Creating, leaving and forgetting rooms\n- Kicking, banning, etc. on rooms\n- Getting, setting and removing user avatar\n- Getting room info\n- Logout and removal of device\n- Things like argument parsing, logging, output in JSON format, etc.\n- Creating a brand new client, sending a message and destroying the client\n  all in a single command. This send-and-forget command is:\n  `matrix-commander-rs --login password --user-login @john:some.homeserver.org\n  --password secret --device matrix-commander-rs --room-default\n  \\!someRoomId:some.homeserver.org --message Hello --logout me`.\n\n# What you can do\n\n- Give a :star: on Github. The more stars on Github, the more people will\n  see the project. Do it now, thanks. :clap:\n- Talk about it to your friends, post it in chatrooms, Hacker News, etc.\n  This will give exposure and help find people willing to provide code,\n  contributions, and PRs.\n- Write code yourself. :rocket: Features that you might want to code: \n  - implement `login` via SSO\n  - add --proxy (see Python documentation)\n  - add --nossl (see Python documentation)\n  - add --event (see Python documentation and JSON config file in Pythom repo)\n  - add --download-media (see Python documentation)\n  - add other features found in the Python version to the Rust version\n  - ...\n\n# Contributors :clap:\n- These are the first contributors: https://github.com/sasa-tomic, https://github.com/jknedlik, https://github.com/dwattttt, \n- Who will be next?\n- _Add your name here._\n\n# Usage\n\n```\nWelcome to \"matrix-commander-rs\", a Matrix CLI client. ─── On the first run use\n--login to log in, to authenticate. On the second run we suggest to use\n--verify to get verified. Manual verification is built-in and can be used to\nverify devices and users. Or combine both --login and --verify in the first\nrun. On further runs \"matrix-commander-rs\" implements a simple Matrix CLI\nclient that can send messages or files, listen to messages, operate on rooms,\netc.  ───  ─── This project is currently only a vision. The Python package\n\"matrix-commander\" exists. The vision is to have a compatible program in Rust.\nI cannot do it myself, but I can coordinate and merge your pull requests. Have\na look at the repo \"https://github.com/8go/matrix-commander-rs/\". Please help!\nPlease contribute code to make this vision a reality, and to one day have a\nfeature-rich \"matrix-commander-rs\" crate. Safe!\n\nUsage: matrix-commander-rs [OPTIONS]\n\nOptions:\n      --contribute\n          Please contribute\n\n  -v, --version [\u003cCHECK\u003e]\n          Print version number or check if a newer version exists on crates.io.\n          Details:: If used without an argument such as '--version' it will\n          print the version number. If 'check' is added ('--version check')\n          then the program connects to https://crates.io and gets the version\n          number of latest stable release. There is no \"calling home\" on every\n          run, only a \"check crates.io\" upon request. Your privacy is\n          protected. New release is neither downloaded, nor installed. It just\n          informs you\n\n          Possible values:\n          - check: Check if there is a newer version available\n\n      --usage\n          Prints a very short help summary. Details:: See also --help, --manual\n          and --readme\n\n  -h, --help\n          Prints short help displaying about one line per argument. Details::\n          See also --usage, --manual and --readme\n\n      --manual\n          Prints long help. Details:: This is like a man page. See also\n          --usage, --help and --readme\n\n      --readme\n          Prints README.md file, the documenation in Markdown. Details:: The\n          README.md file will be downloaded from Github. It is a Markdown file\n          and it is best viewed with a Markdown viewer. See also --usage,\n          --help and --manual\n\n  -d, --debug...\n          Overwrite the default log level. Details:: If not used, then the\n          default log level set with environment variable 'RUST_LOG' will be\n          used. If used, log level will be set to 'DEBUG' and debugging\n          information will be printed. '-d' is a shortcut for '--log-level\n          DEBUG'. If used once as in '-d' it will set and/or overwrite\n          --log-level to '--log-level debug'. If used twice as in '-d -d' it\n          will set and/or overwrite --log-level to '--log-level debug debug'.\n          And third or futher occurance of '-d' will be ignored. See also\n          '--log-level'. '-d' takes precedence over '--log-level'.\n          Additionally, have a look also at the option '--verbose'\n\n      --log-level \u003cLOG_LEVEL\u003e...\n          Set the log level by overwriting the default log level. Details:: If\n          not used, then the default log level set with environment variable\n          'RUST_LOG' will be used. If used with one value specified this value\n          is assigned to the log level of matrix-commander-rs. If used with two\n          values specified the first value is assigned to the log level of\n          matrix-commander-rs. The second value is asigned to the lower level\n          modules. More than two values should not be specified. --debug\n          overwrites -log-level. See also '--debug' and '--verbose'.\n          Alternatively you can use the RUST_LOG environment variable. An\n          example use of RUST_LOG is to use neither --log-level nor --debug,\n          and to set RUST_LOG=\"error,matrix_commander_rs=debug\" which turns off\n          debugging on all lower level modules and turns debugging on only for\n          matrix-commander-rs\n\n          Possible values:\n          - none:  None: not set, default\n          - error: Error: Indicates to print only errors\n          - warn:  Warn: Indicates to print warnings and errors\n          - info:  Info: Indicates to to print info, warn and errors\n          - debug: Debug: Indicates to to print debug and the rest\n          - trace: Trace: Indicates to to print everything\n\n      --verbose...\n          Set the verbosity level. Details:: If not used, then verbosity will\n          be set to low. If used once, verbosity will be high. If used more\n          than once, verbosity will be very high. Verbosity only affects the\n          debug information. So, if '--debug' is not used then '--verbose' will\n          be ignored\n\n      --plain \u003cPLAIN\u003e\n          Disable encryption for a specific action. Details:: By default\n          encryption is turned on for all private rooms and DMs and turned off\n          for all public rooms. E.g. Created DM or private room will have\n          encryption enabled by default. To explicitly turn encryption off for\n          a specific action use --plain. Currently --plain is supported by\n          --room-create and --room-dm-create. See also --room-enable-encryption\n          which sort of does the opposite for rooms. See also --visibility\n          which allows setting the visibility of the room\n          \n          [possible values: true, false]\n\n  -c, --credentials \u003cPATH_TO_FILE\u003e\n          Specify path to a file containing credentials. Details:: At login\n          (--login), information about homeserver, user, room id, etc. will be\n          written to a credentials file. By default, this file is\n          \"credentials.json\". On further runs the credentials file is read to\n          permit logging into the correct Matrix account and sending messages\n          to the preconfigured room. If this option is provided, the provided\n          path to a file will be used as credentials file instead of the\n          default one. E.g. ~/.local/share/matrix-commander-rs/credentials.json\n          \n          [default:\n          /home/user/.local/share/matrix-commander-rs/credentials.json]\n\n  -s, --store \u003cPATH_TO_DIRECTORY\u003e\n          Specify a path to a directory to be used as \"store\" for encrypted\n          messaging. Details:: Since encryption is always enabled, a store is\n          always needed. If this option is provided, the provided directory\n          name will be used as persistent storage directory instead of the\n          default one. Preferably, for multiple executions of this program use\n          the same store for the same device. The store directory can be shared\n          between multiple different devices and users\n          \n          [default: /home/user/.local/share/matrix-commander-rs/store/]\n\n      --login \u003cLOGIN_METHOD\u003e\n          Login to and authenticate with the Matrix homeserver. Details:: This\n          requires exactly one argument, the login method. Currently two\n          choices are offered: 'password' and 'SSO'. Provide one of these\n          methods. If you have chosen 'password', you will authenticate through\n          your account password. You can optionally provide these additional\n          arguments: --homeserver to specify the Matrix homeserver,\n          --user-login to specify the log in user id, --password to specify the\n          password, --device to specify a device name, --room-default to\n          specify a default room for sending/listening. If you have chosen\n          'SSO', you will authenticate through Single Sign-On. A web-browser\n          will be started and you authenticate on the webpage. You can\n          optionally provide these additional arguments: --homeserver to\n          specify the Matrix homeserver, --user-login to specify the log in\n          user id, --device to specify a device name, --room-default to specify\n          a default room for sending/listening. See all the extra arguments for\n          further explanations. ----- SSO (Single Sign-On) starts a web browser\n          and connects the user to a web page on the server for login. SSO will\n          only work if the server supports it and if there is access to a\n          browser. So, don't use SSO on headless homeservers where there is no\n          browser installed or accessible\n          \n          [default: none]\n\n          Possible values:\n          - none:         None: no login specified, don't login\n          - password:     Password: login with password\n          - access-token: AccessToken: login with access-token\n          - sso:          SSO: login with SSO, single-sign on\n\n      --verify \u003cVERIFICATION_METHOD\u003e\n          Perform account verification. Details:: By default, no verification\n          is performed. Verification is currently offered via Manual-Device,\n          Manual-User, Emoji and Emoji-Req. Do verification in this order: 1)\n          bottstrap first with -bootstrap, 2) perform both manual\n          verifications, and 3) perform emoji verification. --verify emoji has\n          been tested against Element in Firefox browser and against Element\n          app on Android phone. Both has been working successfully in Sept\n          2024. In Element web page it was important NOT to click the device in\n          the device list, but to click the underscored link \"Verify\" just\n          above the device list. In the Element on cell phone case, accept the\n          emojis first on the cell phone. Manual verification is simpler but\n          does less. Try: '--bootstrap --password mypassword --verify\n          manual-device' or '--bootstrap --password mypassword --verify\n          manual-user'. Manual only verfies devices or users one-directionally.\n          See\n          https://docs.rs/matrix-sdk/0.7/matrix_sdk/encryption/identities/struct.Device.html#method.verify\n          and\n          https://docs.rs/matrix-sdk/0.7/matrix_sdk/encryption/identities/struct.UserIdentity.html#method.verify\n          for more info on Manual verification. manual-device can only verify\n          its own devices, not other users' devices. manual-user can trust\n          other users. So, with manual-user also use the --user option to\n          specify one or multiple users. With manual-user first trust yourself,\n          by setting --user to yourself, or omitting -user in which case it\n          will default to itself. One should first do 'manual-device' and\n          'manual-user' verification and then 'emoji' or 'emoji-req'\n          verification. Both 'emoji' as well as 'emoji-req' perform emoji\n          verification. With 'emoji' we send a request to some other client to\n          request verification from their device. With 'emoji-req' we wait for\n          some other client to request verification from us. If verification is\n          desired, run this program in the foreground (not as a service) and\n          without a pipe. While verification is optional it is highly\n          recommended, and it is recommended to be done right after (or\n          together with) the --login action. Verification is always\n          interactive, i.e. it required keyboard input. Verification questions\n          will be printed on stdout and the user has to respond via the\n          keyboard to accept or reject verification. Once verification is\n          complete, the program may be run as a service. Different Matrix\n          clients (like Element app on cell phone, Element website in browser,\n          other clients) have the \"Verification\" button hidden in different\n          menus or GUI elements. Sometimes it is labelled \"Not trusted\",\n          sometimes \"Verify\" or \"Verify by emoji\", sometimes \"Verify With Other\n          Device\". Verification is best done as follows: Run\n          'matrix-commander-rs --verify emoji ...' and have the program waiting\n          for inputs and for invitations. Find the appropriate \"verify\" button\n          on your other client, click it, and thereby publish a \"verification\n          invitation\". Once received by \"matrix-commander-rs\" it will print the\n          emojis in the terminal. At this point both your client as well as\n          \"matrix-commander-rs\" in the terminal show a set of emoji icons and\n          names. Compare them visually. Confirm on both sides (Yes, They Match,\n          Got it), finally click OK. You should see a green shield and also see\n          that the matrix-commander-rs device is now green and verified. In the\n          terminal you should see a text message indicating success. It has\n          been tested with Element app on cell phone and Element webpage in\n          browser. Verification is done one device at a time. 'emoji-req' is\n          similar. You must specify a user with --user and a device with\n          --device to specify to which device you want to send the verification\n          request. On the other device you get a pop up and you must accept the\n          verification request. 'emoji-req' currently seems to have problems,\n          while it does work with Element web page in browser, 'emoji-req' does\n          not seem to work with Element phone app\n          \n          [default: none]\n\n          Possible values:\n          - none:          None: option not used, no verification done\n          - manual-device: ManualDevice: manual device verification See also:\n            https://docs.rs/matrix-sdk/0.7/matrix_sdk/encryption/identities/struct.Device.html#method.verify\n          - manual-user:   ManualUser: manual user verification See also:\n            https://docs.rs/matrix-sdk/0.7/matrix_sdk/encryption/identities/struct.UserIdentity.html#method.verify\n          - emoji:         Emoji: verify via emojis as the recipient\n          - emoji-req:     Emoji: verify via emojis as the initiator\n\n      --bootstrap\n          Details:: By default, no bootstrapping is performed. Bootstrapping is\n          useful for verification. --bootstrap creates cross signing keys. If\n          you have trouble verifying with --verify manual-device or --verify\n          manual-user, use --bootstrap before. Use --password to provide\n          password. If --password is not given it will read password from\n          command line (stdin). See also\n          https://docs.rs/matrix-sdk/0.7.1/matrix_sdk/encryption/struct.CrossSigningStatus.html#fields\n\n      --logout \u003cDEVICE\u003e\n          Logout this or all devices from the Matrix homeserver. Details:: This\n          requires exactly one argument. Two choices are offered: 'me' and\n          'all'. Provide one of these choices. If you choose 'me', only the one\n          device \"matrix-commander-rs\" is currently using will be logged out.\n          If you choose 'all', all devices of the user used by\n          \"matrix-commander-rs\" will be logged out. Using '--logout all' is\n          equivalent to '--delete-device \"*\" --logout \"me\"' and requires a\n          password (see --delete-device). --logout not only logs the user out\n          from the homeserver thereby invalidates the access token, it also\n          removes both the 'credentials' file as well as the 'store' directory.\n          After a --logout, one must perform a new --login to use\n          \"matrix-commander-rs\" again. You can perfectly use\n          \"matrix-commander-rs\" without ever logging out. --logout is a cleanup\n          if you have decided not to use this (or all) device(s) ever again\n          \n          [default: none]\n\n          Possible values:\n          - none: None: Log out nowhere, don't do anything, default\n          - me:   Me: Log out from the currently used device\n          - all:  All: Log out from all devices of the user\n\n      --homeserver \u003cHOMESERVER\u003e\n          Specify a homeserver for use by certain actions. Details:: It is an\n          optional argument. By default --homeserver is ignored and not used.\n          It is used by '--login' action. If not provided for --login the user\n          will be queried via keyboard\n\n      --user-login \u003cUSER_LOGIN\u003e\n          Optional argument to specify the user for --login. Details:: This\n          gives the otion to specify the user id for login. For '--login sso'\n          the --user-login is not needed as user id can be obtained from server\n          via SSO. For '--login password', if not provided it will be queried\n          via keyboard. A full user id like '@john:example.com', a partial user\n          name like '@john', and a short user name like 'john' can be given.\n          --user-login is only used by --login and ignored by all other actions\n\n      --password \u003cPASSWORD\u003e\n          Specify a password for use by certain actions. Details:: It is an\n          optional argument. By default --password is ignored and not used. It\n          is used by '--login password' and '--delete-device' and --bootstrap\n          actions. If not provided for --login, --delete-device or --bootstrap\n          the user will be queried for the password via keyboard interactively\n\n      --device \u003cDEVICE\u003e\n          Specify a device name, for use by certain actions. Details:: It is an\n          optional argument. By default --device is ignored and not used. It is\n          used by '--login' action. If not provided for --login the user will\n          be queried via keyboard. If you want the default value specify ''.\n          Multiple devices (with different device id) may have the same device\n          name. In short, the same device name can be assigned to multiple\n          different devices if desired Don't confuse this option with\n          '--devices'\n\n      --room-default \u003cROOM_DEFAULT\u003e\n          Optionally specify a room as the default room for future actions.\n          Details:: If not specified for --login, it will be queried via the\n          keyboard. --login stores the specified room as default room in your\n          credentials file. This option is only used in combination with\n          --login. A default room is needed. Specify a valid room either with\n          --room-default or provide it via keyboard\n\n      --devices\n          Print the list of devices. Details:: All device of this account will\n          be printed, one device per line. Don't confuse this option with\n          --device\n\n      --timeout \u003cTIMEOUT\u003e\n          Set the timeout of the calls to the Matrix server. Details:: By\n          default they are set to 60 seconds. Specify the timeout in seconds.\n          Use 0 for infinite timeout\n          \n          [default: 60]\n\n  -m, --message [\u003cMESSAGE\u003e...]\n          Send one or more messages. Details:: Message data must not be binary\n          data, it must be text. Input piped via stdin can additionally be\n          specified with the special character '-'. If you want to feed a text\n          message into the program via a pipe, via stdin, then specify the\n          special character '-'. If your message is literally a single letter\n          '-' then use an escaped '\\-' or a quoted \"\\-\". Depending on your\n          shell, '-' might need to be escaped. If this is the case for your\n          shell, use the escaped '\\-' instead of '-' and '\\\\-' instead of '\\-'.\n          However, depending on which shell you are using and if you are\n          quoting with double quotes or with single quotes, you may have to add\n          backslashes to achieve the proper escape sequences. If you want to\n          read the message from the keyboard use '-' and do not pipe anything\n          into stdin, then a message will be requested and read from the\n          keyboard. Keyboard input is limited to one line. The stdin indicator\n          '-' may appear in any position, i.e. -m 'start' '-' 'end' will send 3\n          messages out of which the second one is read from stdin. The stdin\n          indicator '-' may appear only once overall in all arguments. '-'\n          reads everything that is in the pipe in one swoop and sends a single\n          message. Similar to '-', another shortcut character is '_'. The\n          special character '_' is used for streaming data via a pipe on stdin.\n          With '_' the stdin pipe is read line-by-line and each line is treated\n          as a separate message and sent right away. The program waits for pipe\n          input until the pipe is closed. E.g. Imagine a tool that generates\n          output sporadically 24x7. It can be piped, i.e. streamed, into\n          matrix- commander, and matrix-commander stays active, sending all\n          input instantly. If you want to send the literal letter '_' then\n          escape it and send '\\_'. '_' can be used only once. And either '-' or\n          '_' can be used\n\n      --markdown\n          Specify the message format as MarkDown. Details:: There are 3 message\n          formats for '--message'. Plain text, MarkDown, and Code. By default,\n          if no command line options are specified, 'plain text' will be used.\n          Use '--markdown' or '--code' to set the format to MarkDown or Code\n          respectively. '--markdown' allows sending of text formatted in\n          MarkDown language. '--code' allows sending of text as a Code block\n\n      --code\n          Specify the message format as Code. Details:: There are 3 message\n          formats for '--message'. Plain text, MarkDown, and Code. By default,\n          if no command line options are specified, 'plain text' will be used.\n          Use '--markdown' or '--code' to set the format to MarkDown or Code\n          respectively. '--markdown' allows sending of text formatted in\n          MarkDown language. '--code' allows sending of text as a Code block\n\n      --html\n          Send message as format \"HTML\" Details:: If not specified, message\n          will be sent as format \"TEXT\". E.g. that allows some text to be bold,\n          etc. Only a subset of HTML tags are accepted by Matrix\n\n  -r, --room [\u003cROOM\u003e...]\n          Optionally specify one or multiple rooms. Details:: Specify rooms via\n          room ids or room aliases. '--room' is used by various options like\n          '--message', '--file', some variants of '--listen',\n          '--delete-device', etc. The default room is provided in the\n          credentials file (specified at --login with --room-default). If a\n          room (or multiple ones) is (or are) provided in the --room arguments,\n          then it (or they) will be used instead of the one from the\n          credentials file. The user must have access to the specified room in\n          order to send messages there or listen on the room. Messages cannot\n          be sent to arbitrary rooms. When specifying the room id some shells\n          require the exclamation mark to be escaped with a backslash. Not all\n          listen operations allow setting a room. Read more under the --listen\n          options and similar. Most actions also support room aliases or local\n          canonical short aliases instead of room ids. Using a room id is\n          always faster than using a room alias\n\n  -f, --file [\u003cFILE\u003e...]\n          Send one or multiple files (e.g. PDF, DOC, MP4). Details:: First\n          files are sent, then text messages are sent. If you want to feed a\n          file into \"matrix-commander-rs\" via a pipe, via stdin, then specify\n          the special character '-' as stdin indicator. See description of\n          '--message' to see how the stdin indicator '-' is handled. If you\n          pipe a file into stdin, you can optionally use '--file-name' to\n          attach a label and indirectly a MIME type to the piped data. E.g. if\n          you pipe in a PNG file, you might want to specify additionally\n          '--file-name image.png'. As such, the label 'image' will be given to\n          the data and the MIME type 'png' will be attached to it. Furthermore,\n          '-' can only be used once\n\n      --notice\n          Specify the message type as Notice. Details:: There are 3 message\n          types for '--message'. Text, Notice, and Emote. By default, if no\n          command line options are specified, 'Text' will be used. Use\n          '--notice' or '--emote' to set the type to Notice or Emote\n          respectively. '--notice' allows sending of text as a notice.\n          '--emote' allows sending of text as an emote\n\n      --emote\n          Specify the message type as Emote. Details:: There are 3 message\n          types for '--message'. Text, Notice, and Emote. By default, if no\n          command line options are specified, 'Text' will be used. Use\n          '--notice' or '--emote' to set the type to Notice or Emote\n          respectively. '--notice' allows sending of text as a notice.\n          '--emote' allows sending of text as an emote\n\n      --sync \u003cSYNC_TYPE\u003e\n          Select synchronization choice. Details:: This option decides on\n          whether the program synchronizes the state with the server before a\n          'send' action. Currently two choices are offered: 'full' and 'off'.\n          Provide one of these choices. The default is 'full'. If you want to\n          use the default, then there is no need to use this option. If you\n          have chosen 'full', the full state, all state events will be\n          synchronized between this program and the server before a 'send'. If\n          you have chosen 'off', synchronization will be skipped entirely\n          before the 'send' which will improve performance\n          \n          [default: full]\n\n          Possible values:\n          - off:  Turns syncing off for sending operations to improve\n            performance\n          - full: full: the default value\n\n  -l, --listen \u003cLISTEN_TYPE\u003e\n          Listen to messages. Details:: The '--listen' option takes one\n          argument. There are several choices: 'never', 'once', 'forever',\n          'tail', and 'all'. By default, --listen is set to 'never'. So, by\n          default no listening will be done. Set it to 'forever' to listen for\n          and print incoming messages to stdout. '--listen forever' will listen\n          to all messages on all rooms forever. To stop listening 'forever',\n          use Control-C on the keyboard or send a signal to the process or\n          service. '--listen once' will get all the messages from all rooms\n          that are currently queued up. So, with 'once' the program will start,\n          print waiting messages (if any) and then stop. The timeout for 'once'\n          is set to 10 seconds. So, be patient, it might take up to that amount\n          of time. 'tail' reads and prints the last N messages from the\n          specified rooms, then quits. The number N can be set with the\n          '--tail' option. With 'tail' some messages read might be old, i.e.\n          already read before, some might be new, i.e. never read before. It\n          prints the messages and then the program stops. Messages are sorted,\n          last-first. Look at '--tail' as that option is related to '--listen\n          tail'. The option 'all' gets all messages available, old and new.\n          Unlike 'once' and 'forever' that listen in ALL rooms, 'tail' and\n          'all' listen only to the room specified in the credentials file or\n          the --room options\n          \n          [default: never]\n\n          Possible values:\n          - never:   Never: Indicates to not listen, default\n          - once:    Once: Indicates to listen once in *all* rooms and then\n            continue\n          - forever: Forever: Indicates to listen forever in *all* rooms, until\n            process is killed manually. This is the only option that remains in\n            the event loop\n          - tail:    Tail: Indicates to get the last N messages from the\n            specified romm(s) and then continue\n          - all:     All: Indicates to get *all* the messages from from the\n            specified romm(s) and then continue\n\n      --tail \u003cTAIL\u003e\n          Get the last messages. Details:: The '--tail' option reads and prints\n          up to the last N messages from the specified rooms, then quits. It\n          takes one argument, an integer, which we call N here. If there are\n          fewer than N messages in a room, it reads and prints up to N\n          messages. It gets the last N messages in reverse order. It print the\n          newest message first, and the oldest message last. If '--listen-self'\n          is not set it will print less than N messages in many cases because N\n          messages are obtained, but some of them are discarded by default if\n          they are from the user itself. Look at '--listen' as this option is\n          related to '--tail'\n          \n          [default: 0]\n\n  -y, --listen-self\n          Get your own messages. Details:: If set and listening, then program\n          will listen to and print also the messages sent by its own user. By\n          default messages from oneself are not printed\n\n      --whoami\n          Print your user name. Details:: Print the user id used by\n          \"matrix-commander-rs\" (itself). One can get this information also by\n          looking at the credentials file\n\n  -o, --output \u003cOUTPUT_FORMAT\u003e\n          Specify the output format. Details:: This option decides on how the\n          output is presented. Currently offered choices are: 'text', 'json',\n          'json-max', and 'json-spec'. Provide one of these choices. The\n          default is 'text'. If you want to use the default, then there is no\n          need to use this option. If you have chosen 'text', the output will\n          be formatted with the intention to be consumed by humans, i.e.\n          readable text. If you have chosen 'json', the output will be\n          formatted as JSON. The content of the JSON object matches the data\n          provided by the matrix-nio SDK. In some occassions the output is\n          enhanced by having a few extra data items added for convenience. In\n          most cases the output will be processed by other programs rather than\n          read by humans. Option 'json-max' is practically the same as 'json',\n          but yet another additional field is added. The data item\n          'transport_response' which gives information on how the data was\n          obtained and transported is also being added. For '--listen' a few\n          more fields are added. In most cases the output will be processed by\n          other programs rather than read by humans. Option 'json-spec' only\n          prints information that adheres 1-to-1 to the Matrix Specification.\n          Currently only the events on '--listen' and '--tail' provide data\n          exactly as in the Matrix Specification. If no data is available that\n          corresponds exactly with the Matrix Specification, no data will be\n          printed. In short, currently '--json-spec' only provides outputs for\n          '--listen' and '--tail'\n          \n          [default: text]\n\n          Possible values:\n          - text:      Text: Indicates to print human readable text, default\n          - json:      Json: Indicates to print output in Json format\n          - json-max:  Json Max: Indicates to to print the maximum anount of\n            output in Json format\n          - json-spec: Json Spec: Indicates to to print output in Json format,\n            but only data that is according to Matrix Specifications\n\n      --file-name [\u003cFILE_NAME\u003e...]\n          Specify one or multiple file names for some actions. Details:: This\n          is an optional argument. Use this option in combination with options\n          like '--file'. to specify one or multiple file names. Ignored if used\n          by itself without an appropriate corresponding action\n\n      --get-room-info [\u003cROOM\u003e...]\n          Get room information. Details:: Get the room information such as room\n          display name, room alias, room creator, etc. for one or multiple\n          specified rooms. The included room 'display name' is also referred to\n          as 'room name' or incorrectly even as room title. If one or more\n          rooms are given, the room information of these rooms will be fetched.\n          If no room is specified, nothing will be done. If you want the room\n          information for the pre-configured default room specify the shortcut\n          '-'. Rooms can be given via room id (e.g.\n          '\\!SomeRoomId:matrix.example.com'), canonical (full) room alias (e.g.\n          '#SomeRoomAlias:matrix.example.com'), or short alias (e.g.\n          'SomeRoomAlias' or '#SomeRoomAlias'). As response room id, room\n          display name, room canonical alias, room topic, room creator, and\n          room encryption are printed. One line per room will be printed. Since\n          either room id or room alias are accepted as input and both room id\n          and room alias are given as output, one can hence use this option to\n          map from room id to room alias as well as vice versa from room alias\n          to room id. Do not confuse this option with the options\n          '--get-display-name' and '--set-display-name', which get/set the user\n          display name, not the room display name. The argument\n          '--room-resolve-alias' can also be used to go the other direction,\n          i.e. to find the room id given a room alias\n\n      --room-create [\u003cLOCAL_ALIAS\u003e...]\n          Create one or multiple rooms. Details:: One or multiple room aliases\n          can be specified. For each alias specified a room will be created.\n          For each created room one line with room id, alias, name and topic\n          will be printed to stdout. If you are not interested in an alias,\n          provide an empty string like ''. The alias provided must be in\n          canocial local form, i.e. if you want a final full alias like\n          '#SomeRoomAlias:matrix.example.com' you must provide the string\n          'SomeRoomAlias'. The user must be permitted to create rooms. Combine\n          --room-create with --name and --topic to add names and topics to the\n          room(s) to be created. If the output is in JSON format, then the\n          values that are not set and hence have default values are not shown\n          in the JSON output. E.g. if no topic is given, then there will be no\n          topic field in the JSON output. Room aliases have to be unique\n\n      --visibility \u003cVISIBILITY\u003e\n          Set the visibility of the newly created room. Details:: Default room\n          visibility is 'private'. To create a public room, use '--room-create\n          \u003croom-name\u003e --visibility public'. To create a private room, use\n          '--room-create \u003croom-name\u003e --visibility private'\n          \n          [default: private]\n\n      --room-dm-create [\u003cUSER\u003e...]\n          Create one or multiple direct messaging (DM) rooms for given users.\n          Details:: One or multiple users can be specified. For each user\n          specified a DM room will be created. For each created DM room one\n          line with room id, alias, name and topic will be printed to stdout.\n          The given user(s) will receive an invitation to join the newly\n          created room. The user must be permitted to create rooms. Combine\n          --room-dm-create with --alias, --name and --topic to add aliases,\n          names and topics to the room(s) to be created. Room aliases in\n          --alias have to be unique\n\n      --room-leave [\u003cROOM\u003e...]\n          Leave this room or these rooms. Details:: One or multiple room\n          aliases can be specified. The room (or multiple ones) provided in the\n          arguments will be left. You can run both commands '--room-leave' and\n          '--room-forget' at the same time\n\n      --room-forget [\u003cROOM\u003e...]\n          Forget one or multiple rooms. Details:: After leaving a room you\n          should (most likely) forget the room. Forgetting a room removes the\n          users' room history. One or multiple room aliases can be specified.\n          The room (or multiple ones) provided in the arguments will be\n          forgotten. If all users forget a room, the room can eventually be\n          deleted on the server. You must leave a room first, before you can\n          forget it You can run both commands '--room-leave' and\n          '--room-forget' at the same time\n\n      --room-invite [\u003cROOM\u003e...]\n          Invite one ore more users to join one or more rooms. Details::\n          Specify the user(s) as arguments to --user. Specify the rooms as\n          arguments to this option, i.e. as arguments to --room-invite. The\n          user must have permissions to invite users. Use the shortcut '-' to\n          specify the pre-configured default room of 'matrix-commander-rs' as\n          room\n\n      --room-join [\u003cROOM\u003e...]\n          Join one or multiple rooms. Details:: One or multiple room aliases\n          can be specified. The room (or multiple ones) provided in the\n          arguments will be joined. The user must have permissions to join\n          these rooms. Use the shortcut '-' to specify the pre-configured\n          default room of 'matrix-commander-rs' as room. Note, no --user on\n          this feature as the user is always the user of 'matrix-commander-rs'\n\n      --room-ban [\u003cROOM\u003e...]\n          Ban one ore more users from one or more rooms. Details:: Specify the\n          user(s) as arguments to --user. Specify the rooms as arguments to\n          this option, i.e. as arguments to --room-ban. The user must have\n          permissions to ban users. Use the shortcut '-' to specify the\n          pre-configured default room of 'matrix-commander-rs' as room\n\n      --room-unban [\u003cROOM\u003e...]\n          Unban one ore more users from one or more rooms. Details:: Specify\n          the user(s) as arguments to --user. Specify the rooms as arguments to\n          this option, i.e. as arguments to --room-unban. The user must have\n          permissions to unban users. Use the shortcut '-' to specify the\n          pre-configured default room of 'matrix-commander-rs' as room. Note,\n          this is currently not implemented in the matrix-sdk API. This feature\n          will currently return an error\n\n      --room-kick [\u003cROOM\u003e...]\n          Kick one ore more users from one or more rooms. Details:: Specify the\n          user(s) as arguments to --user. Specify the rooms as arguments to\n          this option, i.e. as arguments to --room-kick. The user must have\n          permissions to kick users. Use the shortcut '-' to specify the\n          pre-configured default room of 'matrix-commander-rs' as room\n\n      --room-resolve-alias [\u003cALIAS\u003e...]\n          Resolves room aliases to room ids. Details:: Resolves a room alias to\n          the corresponding room id, or multiple room aliases to their\n          corresponding room ids. Provide one or multiple room aliases. A room\n          alias looks like this: '#someRoomAlias:matrix.example.org'. Short\n          aliases like 'someRoomAlias' or '#someRoomAlias' are also accepted.\n          In case of a short alias, it will be automatically prefixed with '#'\n          and the homeserver from the default room of matrix-commander-rs (as\n          found in credentials file) will be automatically appended. Resolving\n          an alias that does not exist results in an error. For each room alias\n          one line will be printed to stdout with the result. It also prints\n          the list of servers that know about the alias(es). The argument\n          '--get-room-info' can be used to go the other direction, i.e. to find\n          the room aliases given a room id\n\n      --room-enable-encryption [\u003cROOM\u003e...]\n          Enable encryption for one or multiple rooms. Details:: Provide one or\n          more room ids. For each room given encryption will be enabled. You\n          must be member of the room in order to be able to enable encryption.\n          Use shortcut '-' to enable encryption in the pre-configured default\n          room. Enabling an already enabled room will do nothing and cause no\n          error\n\n      --alias [\u003cALIAS\u003e...]\n          Provide one or more aliases. Details:: --alias is currently used in\n          combination with --room-dm-create. It is ignored otherwise. Canonical\n          short alias look like 'SomeRoomAlias'. Short aliases look like\n          '#SomeRoomAlias'. And full aliases look like\n          '#SomeRoomAlias:matrix.example.com'. If you are not interested in an\n          alias, provide an empty string like ''. Remember that aliases must be\n          unique. For --room-dm-create you must provide canonical short\n          alias(es)\n\n      --name [\u003cNAME\u003e...]\n          Specify one or multiple names. Details:: This option is only\n          meaningful in combination with option --room-create. This option\n          --name specifies the names to be used with the command --room-create\n\n      --topic [\u003cTOPIC\u003e...]\n          Specify one or multiple topics. Details:: This option is only\n          meaningful in combination with option --room-create. This option\n          --topic specifies the topics to be used with the command\n          --room-create\n\n      --rooms\n          Print the list of past and current rooms. Details:: All rooms that\n          you are currently a member of (joined rooms), that you had been a\n          member of in the past (left rooms), and rooms that you have been\n          invited to (invited rooms) will be printed, one room per line. See\n          also '--invited-rooms', '--joined-rooms', and '--left-rooms'\n\n      --invited-rooms\n          Print the list of invited rooms. Details:: All rooms that you are\n          currently invited to will be printed, one room per line\n\n      --joined-rooms\n          Print the list of joined rooms. Details:: All rooms that you are\n          currently a member of will be printed, one room per line\n\n      --left-rooms\n          Print the list of left rooms. Details:: All rooms that you have left\n          in the past will be printed, one room per line\n\n      --room-get-visibility [\u003cROOM\u003e...]\n          Get the visibility of one or more rooms. Details:: Provide one or\n          more room ids as arguments. If the shortcut '-' is used, then the\n          default room of 'matrix-commander-rs' (as found in credentials file)\n          will be used. The shortcut '*' represents all the rooms of the user\n          of 'matrix-commander-rs'. For each room the visibility will be\n          printed. Currently, this is either the string 'private' or 'public'.\n          As response one line per room will be printed\n\n      --room-get-state [\u003cROOM\u003e...]\n          Get the state of one or more rooms. Details:: Provide one or more\n          room ids as arguments. If the shortcut '-' is used, then the default\n          room of 'matrix-commander-rs' (as found in credentials file) will be\n          used. The shortcut '*' represents all the rooms of the user of\n          'matrix-commander-rs'. For each room part of the state will be\n          printed. The state is a long list of events. As response one line per\n          room will be printed to stdout. The line can be very long as the list\n          of events can be very large. To get output into a human readable form\n          pipe output through sed and jq or use the JSON output\n\n      --joined-members [\u003cROOM\u003e...]\n          Print the list of joined members for one or multiple rooms. Details::\n          If you want to print the joined members of all rooms that you are\n          member of, then use the special shortcut character '*'. If you want\n          the members of the pre-configured default room, use shortcut '-'\n\n      --delete-device [\u003cDEVICE\u003e...]\n          Delete one or multiple devices. Details:: By default devices\n          belonging to itself, i.e. belonging to \"matrix-commander-rs\", will be\n          deleted. If you want to delete the one device currently used for the\n          connection, i.e. the device used by \"matrix-commander-rs\", then\n          instead of the full device id you can just specify the shortcut 'me'\n          such as '--delete-device me --password mypassword'. If you want to\n          delete all devices of yourself, i.e. all devices owned by the user\n          that \"matrix-commander-rs\" is using you can specify that with the\n          shortcut '*'. Most shells require you to escape it or to quote it,\n          ie. use '--delete-device \"*\" --password mypassword'. Removing your\n          own device (e.g. 'me') or all devices (e.g. '*') will require you to\n          manually remove your credentials file and store directory and to\n          login anew in order to create a new device. If you are using\n          '--delete-device me --password mypassword' consider using '--logout\n          me' instead which is simpler (no password) and also automatically\n          performs the removal of credentials and store. (See --logout.) If the\n          devices belong to a different user, use the --user argument to\n          specify the user, i.e. owner. Only exactly one user can be specified\n          with the optional --user argument. Device deletion requires the user\n          password. It must be specified with the --password argument. If the\n          server uses only HTTP (and not HTTPS), then the password can be\n          visible to attackers. Hence, if the server does not support HTTPS\n          this operation is discouraged. If no --password is specified via the\n          command line, the password is read from keyboard interactively\n\n  -u, --user [\u003cUSER\u003e...]\n          Specify one or multiple users. Details:: This option is meaningful in\n          combination with a) room actions like --room-invite, --room-ban,\n          --room-unban, etc. and d) actions like --delete-device. In case of a)\n          this option --user specifies the users to be used with room commands\n          (like invite, ban, For d) this gives the option to delete the device\n          of a different user. If --user is not set, it will default to itself,\n          i.e. the user of the \"matrix-commander-rs\" account\n\n      --get-avatar \u003cFILE\u003e\n          Get your own avatar. Details:: Get the avatar of itself, i.e. the\n          'matrix-commander-rs' user account. Spefify a file optionally with\n          path to store the image. E.g. --get-avatar \"./avatar.png\"\n\n      --set-avatar \u003cFILE\u003e\n          Set your own avatar. Details:: Set, i.e. upload, an image to be used\n          as avatar for 'matrix-commander-rs' user account. Spefify a file\n          optionally with path with the image. If the MIME type of the image\n          cannot be determined, it will assume 'PNG' as default. E.g.\n          --set-avatar \"./avatar.jpg\". It returns a line with the MRX URI of\n          the new avatar\n\n      --get-avatar-url\n          Get your own avatar URL. Details:: Get the MXC URI of the avatar of\n          itself, i.e. the 'matrix-commander-rs' user account\n\n      --set-avatar-url \u003cMAX_URI\u003e\n          Set your own avatar URL. Details:: Set the avatar MXC URI of the URL\n          to be used as avatar for the 'matrix-commander-rs' user account.\n          Spefify a MXC URI. E.g. --set-avatar-url\n          \"mxc://matrix.server.org/SomeStrangeStringOfYourMxcUri\"\n\n      --unset-avatar-url\n          Remove your own avatar URL. Details:: Remove the avatar MXC URI to be\n          used as avatar for the 'matrix-commander-rs' user account. In other\n          words, remove the avatar of the 'matrix-commander-rs' user\n\n      --get-display-name\n          Get your own display name. Details:: Get the display name of itself,\n          i.e. of the 'matrix-commander-rs' user account\n\n      --set-display-name \u003cNAME\u003e\n          Set your own display name. Details:: Set the display name of the\n          'matrix-commander-rs' user account. Spefify a name\n\n      --get-profile\n          Get your own profile. Details:: Get the profile of itself, i.e. of\n          the 'matrix-commander-rs' user account. This is getting both display\n          name and avatar MXC URI in a call\n\n      --media-upload [\u003cFILE\u003e...]\n          Upload one or multiple files (e.g. PDF, DOC, MP4) to the homeserver\n          content repository. Details:: If you want to feed a file for upload\n          into \"matrix-commander-rs\" via a pipe, via stdin, then specify the\n          special character '-' as stdin indicator. See description of\n          '--message' to see how the stdin indicator '-' is handled. Use --mime\n          to optionally specify the MIME type of the file. If you give N\n          arguments to --media-upload, you can give N arguments to --mime. See\n          --mime. If you pipe a file into stdin, the MIME type cannot be\n          guessed. It is hence more recommended that you specify a MIME type\n          via '--mime' when using '-'. Furthermore, '-' can only be used once.\n          Upon being stored in the homeserver's content repository, the data is\n          assigned a Matrix MXC URI. For each file uploaded successfully, a\n          single line with the MXC URI will be printed. The uploaded data will\n          not by encrypted. If you want to upload encrypted data, encrypt the\n          file before uploading it\n\n      --media-download [\u003cMXC_URI\u003e...]\n          Download one or multiple files from the homeserver content\n          repository. Details:: You must provide one or multiple Matrix URIs\n          (MXCs) which are strings like this\n          'mxc://example.com/SomeStrangeUriKey'. Alternatively, you can just\n          provide the MXC id, i.e. the part after the last slash. If found they\n          will be downloaded, decrypted, and stored in local files. If file\n          names are specified with --file-name the downloads will be saved with\n          these file names. If --file-name is not specified, then the file name\n          'mxc-\u003cmxc-id\u003e' will be used. If a file name in --file-name contains\n          the placeholder __mxc_id__, it will be replaced with the mxc-id. If a\n          file name is specified as empty string '' in --file-name, then also\n          the name 'mxc-\u003cmxc-id\u003e' will be used. Be careful, existing files will\n          be overwritten. Do not confuse --media-download with\n          --download-media. See --download-media\n\n      --mime [\u003cMIME_TYPE\u003e...]\n          Specify the Mime type of certain input files. Details:: Specify '' if\n          the Mime type should be guessed based on the filename. If input is\n          from stdin (i.e. '-' and piped into 'matrix-commander-rs') then Mime\n          type cannot be guessed. If not specified, and no filename available\n          for guessing it will default to 'application/octet-stream'. Some\n          example mime types are: 'image/jpeg', 'image/png', 'image/gif',\n          'text/plain', and 'application/pdf'. For a full list see\n          'https://docs.rs/mime/latest/mime/#constants'\n\n      --media-delete [\u003cMXC_URI\u003e...]\n          Delete one or multiple objects (e.g. files) from the content\n          repository. Details:: You must provide one or multiple Matrix URIs\n          (MXC) which are strings like this\n          'mxc://example.com/SomeStrangeUriKey'. Alternatively, you can just\n          provide the MXC id, i.e. the part after the last slash. If found they\n          will be deleted from the server database. In order to delete objects\n          one must have server admin permissions. Having only room admin\n          permissions is not sufficient and it will fail. Read\n          https://matrix-org.github.io/synapse/latest/usage/administration/admin_api/\n          for learning how to set server admin permissions on the server.\n          Thumbnails will currently not be deleted. Deleting something that\n          does not exist will be ignored and will not cause an error\n\n      --media-mxc-to-http [\u003cMXC_URI\u003e...]\n          Convert URIs to HTTP URLs. Details:: Convert one or more matrix\n          content URIs to the corresponding HTTP URLs. The MXC URIs to provide\n          look something like this 'mxc://example.com/SomeStrangeUriKey'.\n          Alternatively, you can just provide the MXC id, i.e. the part after\n          the last slash. The syntax of the provided MXC URIs will be verified.\n          The existance of content for the XMC URI will not be checked\n\n      --get-masterkey\n          Get your own master key. Details:: Get the master key of itself, i.e.\n          of the 'matrix-commander-rs' user account. Keep this key private and\n          safe\n\nPS: Also have a look at scripts/matrix-commander-rs-tui.\n\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F8go%2Fmatrix-commander-rs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2F8go%2Fmatrix-commander-rs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F8go%2Fmatrix-commander-rs/lists"}