Interactive Redis: A Terminal Client for Redis with AutoCompletion and Syntax Highlighting.

Overview

Interactive Redis: A Cli for Redis with AutoCompletion and Syntax Highlighting.

Github Action PyPI version Python version Download stats Chat on telegram Open in Cloud Shell

demo

IRedis is a terminal client for redis with auto-completion and syntax highlighting. IRedis lets you type Redis commands smoothly, and displays results in a user-friendly format.

IRedis is an alternative for redis-cli. In most cases, IRedis behaves exactly the same as redis-cli. Besides, it is safer to use IRedis on production servers than redis-cli: IRedis will prevent accidentally running dangerous commands, like KEYS * (see Redis docs / Latency generated by slow commands).

Features

  • Advanced code completion. If you run command KEYS then run DEL, IRedis will auto-complete your command based on KEYS result.
  • Command validation. IRedis will validate command while you are typing, and highlight errors. E.g. try CLUSTER MEET IP PORT, IRedis will validate IP and PORT for you.
  • Command highlighting, fully based on redis grammar. Any valid command in IRedis shell is a valid redis command.
  • Human-friendly result display.
  • pipeline feature, you can use your favorite shell tools to parse redis' response, like get json | jq ..
  • Support pager for long output.
  • Support connection via URL, iredis --url redis://example.com:6379/1.
  • Store server configuration: iredis -d prod-redis (see dsn for more).
  • peek command to check the key's type then automatically call get/lrange/sscan, etc, depending on types. You don't need to call the type command then type another command to get the value. peek will also display the key's length and memory usage.
  • Ctrl + C to cancel the current typed command, this won't exit IRedis, exactly like bash behaviour. Use Ctrl + D to send a EOF to exit IRedis.
  • Ctrl + R to open reverse-i-search to search through your command history.
  • Auto suggestions. (Like fish shell.)
  • Support --encode=utf-8, to decode Redis' bytes responses.
  • Command hint on bottom, include command syntax, supported redis version, and time complexity.
  • Official docs with built-in HELP command, try HELP SET!
  • Written in pure Python, but IRedis was packaged into a single binary with PyOxidizer, you can use cURL to download and run, it just works, even you don't have a Python interpreter.
  • Hide password for AUTH command.
  • Says "Goodbye!" to you when you exit!
  • For full features, please see: iredis.io

Install

Install via pip:

pip install iredis

pipx is recommended:

pipx install iredis

Or you can download the executable binary with cURL(or wget), untar, then run. It is especially useful when you don't have a python interpreter(E.g. the official Redis docker image which doesn't have Python installed.):

wget  https://github.com/laixintao/iredis/releases/latest/download/iredis.tar.gz \
 && tar -xzf iredis.tar.gz \
 && ./iredis

(Check the release page if you want to download an old version of IRedis.)

Usage

Once you install IRedis, you will know how to use it. Just remember, IRedis supports similar options like redis-cli, like -h for redis-server's host and -p for port.

$ iredis --help

Using DSN

IRedis support storing server configuration in config file. Here is a DSN config:

[alias_dsn]
dev=redis://localhost:6379/4
staging=redis://username:[email protected]:6379/1

Put this in your iredisrc then connect via iredis -d staging or iredis -d dev.

Configuration

IRedis supports config files. Command-line options will always take precedence over config. Configuration resolution from highest to lowest precedence is:

  • Options from command line
  • $PWD/.iredisrc
  • ~/.iredisrc (this path can be changed with iredis --iredisrc $YOUR_PATH)
  • /etc/iredisrc
  • default config in IRedis package.

You can copy the self-explained default config here:

https://raw.githubusercontent.com/laixintao/iredis/master/iredis/data/iredisrc

And then make your own changes.

(If you are using an old versions of IRedis, please use the config file below, and change the version in URL):

https://raw.githubusercontent.com/laixintao/iredis/v1.0.4/iredis/data/iredisrc

Keys

IRedis support unix/readline-style REPL keyboard shortcuts, which means keys like Ctrl + F to forward work.

Also:

  • Ctrl + F (i.e. EOF) to exit; you can also use the exit command.
  • Ctrl + L to clear screen; you can also use the clear command.
  • Ctrl + X Ctrl + E to open an editor to edit command, or V in vi-mode.

Development

Release Strategy

IRedis is built and released by GitHub Actions. Whenever a tag is pushed to the master branch, a new release is built and uploaded to pypi.org, it's very convenient.

Thus, we release as often as possible, so that users can always enjoy the new features and bugfixes quickly. Any bugfix or new feature will get at least a patch release, whereas big features will get a minor release.

Setup Environment

IRedis favors poetry as package management tool. To setup a develop environment on your computer:

First, install poetry (you can do it in a python's virtualenv):

pip install poetry

Then run (which is similar to pip install -e .):

poetry install

Be careful running testcases locally, it may flush you db!!!

Development Logs

This is a command-line tool, so we don't write logs to stdout.

You can tail -f ~/.iredis.log to see logs, the log is pretty clear, you can see what actually happens from log files.

Catch Up with Latest Redis-doc

IRedis use a git submodule to track current-up-to-date redis-doc version. To catch up with latest:

  1. Git pull in redis-doc
  2. Copy doc files to /data: cp -r redis-doc/commands* iredis/data
  3. Prettier markdownprettier --prose-wrap always iredis/data/commands/*.md --write
  4. Check the diff, update IRedis' code if needed.

Related Projects

If you like iredis, you may also like other cli tools by dbcli:

  • pgcli - Postgres Client with Auto-completion and Syntax Highlighting
  • mycli - MySQL/MariaDB/Percona Client with Auto-completion and Syntax Highlighting
  • litecli - SQLite Client with Auto-completion and Syntax Highlighting
  • mssql-cli - Microsoft SQL Server Client with Auto-completion and Syntax Highlighting
  • athenacli - AWS Athena Client with Auto-completion and Syntax Highlighting
  • vcli - VerticaDB client
  • iredis - Client for Redis with AutoCompletion and Syntax Highlighting

IRedis is build on the top of prompt_toolkit, a Python library (by Jonathan Slenders) for building rich commandline applications.

Comments
  • Add an option to change default cli prompt

    Add an option to change default cli prompt

    See the discussion here:

    http://redisdoc.com/transaction/exec.html#comment-4588712198

    https://stackoverflow.com/questions/52690515/change-redis-command-prompt-text/52691005

    opened by laixintao 12
  • rprompt for redis exec

    rprompt for redis exec

    Then the user will know he is in a transection.

    • [x] Display transaction state with rprompt;
    • [ ] Render EXEC response with original command, not just command result.
    • [x] Set transaction back to False on proper time. (see here)
    • [x] All command needs to render QUEUE in transation state.
    • [ ] testcases...
    • [ ] bugfix: abort transaction on Exception.
    opened by laixintao 10
  • feat: add support for configuring TLS verification policy

    feat: add support for configuring TLS verification policy

    Hi! Thanks for this very nice piece of software. First of all, I would like to compliment you for the high quality python code in this repo. It is refreshing to read it.

    I am opening this PR to add support for explicit configuration of the ssl_cert_reqs parameter, in case the connection schema is rediss. I took the liberty to also update the README with an updated iredis --help.

    To pass values to the underlying SSLConnection object, the user has now two choices:

    • specify the value of ssl_cert_reqs as a query parameter in the url specified via --url
    • specify such value using the --verify-ssl option

    Both check that the value be among none, optional or required, and the former takes precedence over the latter (same behavior as the db parameter).

    This should tackle issue 403.

    opened by torrefatto 8
  • Support stream.

    Support stream.

    todo:

    • [ ] special render for stream, nested list is hard to read.
    • [x] id completer.

    doc:

    • https://redis.io/topics/streams-intro
    • https://redis.io/commands/xread

    close #249 related #246

    close-now-check-later 
    opened by laixintao 8
  • TypeError occurs when answering yes/no question

    TypeError occurs when answering yes/no question

    iredis  1.4.3 (Python 3.6.8)
    redis-server  3.2.8
    Home:   https://iredis.io
    Issues: https://iredis.io/issues
    (IP) > keys *
    KEYS will hang redis server, use SCAN instead.
    Do you want to proceed? (y/n): n
    a bytes-like object is required, not 'FormattedText'
    Traceback (most recent call last):
      File "/root/.local/pipx/venvs/iredis/lib/python3.6/site-packages/iredis/entry.py", line 177, in repl
        write_result(answer)
      File "/root/.local/pipx/venvs/iredis/lib/python3.6/site-packages/iredis/entry.py", line 88, in write_result
        sys.stdout.buffer.write(text)
    TypeError: a bytes-like object is required, not 'FormattedText'
    (error) a bytes-like object is required, not 'FormattedText'
    
    opened by frostming 7
  • (WIP) Enable pyoxidizer builds

    (WIP) Enable pyoxidizer builds

    This is a work-in-progress PR to use PyOxidizer to compile iredis into a single binary. Issue: https://github.com/laixintao/iredis/issues/218 Work-in-progress because:

    1. PyOxidizer does not set the __file__ attribute in modules: https://pyoxidizer.readthedocs.io/en/latest/packaging_pitfalls.html#reliance-on-file, which is needed here: https://github.com/laixintao/iredis/blob/v1.0.0/iredis/init.py#L8
    2. We must determine where to upload the binary

    Motivation Users who run redis inside containers (which rarely come with python interpreters) may want to use iredis for live-debugging. Those users could simply use curl to download the binary version of iredis

    opened by mac-chaffee 7
  • Compile grammer regex too slow.

    Compile grammer regex too slow.

    DEBUG [grammar compile time] 0.6472580432891846
    DEBUG [timer] Grammer created: 9.5367431640625e-07 from start.
     INFO iredis start, host=127.0.0.1, port=6379, db=0.
    DEBUG Using selector: KqueueSelector
    DEBUG [timer] First REPL: 0.04548501968383789 from start.
    DEBUG REPL waiting for command...
    

    Takes 0.64secnds to compile when startup, painful slow.

    help wanted 
    opened by laixintao 7
  • TypeError: Connection.__init__() got an unexpected keyword argument 'client_name'

    TypeError: Connection.__init__() got an unexpected keyword argument 'client_name'

    iredis version: 1.12.0 OS: Linux version 5.19.4-arch1-1 ([email protected]) (gcc (GCC) 12.2.0, GNU ld (GNU Binutils) 2.39.0) #1 SMP PREEMPT_DYNAMIC Thu, 25 Aug 2022 17:31:12 +0000

    iredis --url 'redis://my_ip:6379/2'
    Traceback (most recent call last):
      File "/usr/bin/iredis", line 33, in <module>
        sys.exit(load_entry_point('iredis==1.12.0', 'console_scripts', 'iredis')())
      File "/usr/lib/python3.10/site-packages/iredis/entry.py", line 426, in main
        client = create_client(ctx.params)
      File "/usr/lib/python3.10/site-packages/iredis/entry.py", line 384, in create_client
        return Client(
      File "/usr/lib/python3.10/site-packages/iredis/client.py", line 77, in __init__
        self.build_connection()
      File "/usr/lib/python3.10/site-packages/iredis/client.py", line 103, in build_connection
        self.connection = self.create_connection(
      File "/usr/lib/python3.10/site-packages/iredis/client.py", line 156, in create_connection
        return connection_class(**connection_kwargs)
    TypeError: Connection.__init__() got an unexpected keyword argument 'client_name'                                                                  /0.2s
    
    opened by Karmenzind 5
  • Create Conda recipe

    Create Conda recipe

    Hello @laixintao,

    Not really an issue, but I have created a Conda recipe for this CLI. See: https://github.com/conda-forge/staged-recipes/pull/19991.

    Do you give your permission to be marked as a maintainer for this recipe?

    opened by aymericbeaumet 5
  • bugfix: --url option is not working

    bugfix: --url option is not working

    Thanks for the great product! I've been using it every day lately!

    I've found a bug that doesn't work when you specify DSN using --url option. In order to use SSL/TLS communication I need to use rediss:// , so not working dsn is a serious problem for me.

    Currently, it ignores --url option and connects to the default redis location as shown below

    $ iredis --version
    iredis, version 1.6.2
    
    # redis is working at 127.0.0.1: 6379 and my.redis.local:16379
    $ iredis -h 127.0.0.1 -p 6379 -n 0
    iredis 1.6.2 (Python 3.7.5)
    redis-server 5.0.8
    Home: https://iredis.io
    Issues: https://iredis.io/issues
    127.0.0.1:6379[0]>
    Goodbye!
    
    $ iredis -h my.redis.local -p 16379 -n 0
    iredis 1.6.2 (Python 3.7.5)
    redis-server 5.0.7
    Home: https://iredis.io
    Issues: https://iredis.io/issues
    my.redis.local:16379[0]>
    Goodbye!
    
    # --url option is ignored and connected to the default redis location
    $ iredis --url 'redis://my.redis.local:16379/0'
    iredis 1.6.2 (Python 3.7.5)
    redis-server 5.0.8
    Home: https://iredis.io
    Issues: https://iredis.io/issues
    127.0.0.1:6379>    # <------- CONNECTED TO 127.0.0.1:6379
    Goodbye!
    

    Fixed an unintentional overwriting of the client variable created by the --url option.

    This fix caused the test to fail due to side effects from the environment variables IREDIS_URL. The updating os.environ affects all tests in pytest.Use pytest's monkeypatch.setenv so that the environment value is updated only by the scope of the function. https://docs.pytest.org/en/latest/monkeypatch.html#monkeypatching-environment-variables

    The test that specified the unix socket in dns was also failing. At least the socket path in GithubActions didn't seem to be /tmp/redis/redis.sock and it was failing the test. It's hard to pinpoint the path in various environments, so I changed this test to skip if unix socket is not found.

    Thank you!

    opened by otms61 5
  • "ERROR 'NoneType' object is not iterable" on failed transaction

    When a transaction fails, iredis doesn't properly handle the result of the EXEC command (null reply)

    localhost:6379> watch foo
    OK
    localhost:6379> multi
    OK
    localhost:6379> get bar                                          <transaction>
    QUEUED
    localhost:6379> exec                                             <transaction>
    (error) ERROR 'NoneType' object is not iterable
    

    Contents of the log:

     INFO [Command] exec
     INFO [Prepare command] Redis: exec, Shell: None
     INFO [Split command] command: exec, args: []
    DEBUG [After hook] Command is exec, unset transaction.
     INFO [Redis-Server] Response: None
     INFO [render] Find callback render_list, for command: exec
    ERROR 'NoneType' object is not iterable
    Traceback (most recent call last):
      File "/home/brian/.local/pipx/venvs/iredis/lib/python3.6/site-packages/iredis/client.py", line 304, in send_command
        yield self.render_response(redis_resp, command_name)
      File "/home/brian/.local/pipx/venvs/iredis/lib/python3.6/site-packages/iredis/client.py", line 199, in render_response
        rendered = callback(response)
      File "/home/brian/.local/pipx/venvs/iredis/lib/python3.6/site-packages/iredis/renders.py", line 125, in render_list
        for item in text:
    TypeError: 'NoneType' object is not iterable
     INFO Print result prompt_toolkit.formatted_text.base.FormattedText: FormattedText([('class:type', '(error) '), ('class:error', "ERROR 'NoneType' object is not iterable")])
    

    environment details:

    • iredis version 1.6.2
    • python 3.6.9
    • ubuntu 18.04
    • redis version 4.0.9
    opened by brianmaissy 5
  • support tls

    support tls

    redis tls: https://redis.io/docs/manual/security/encryption/

    try to keep the same args with redis-cli:

    ./src/redis-cli --tls \
        --cert ./tests/tls/redis.crt \
        --key ./tests/tls/redis.key \
        --cacert ./tests/tls/ca.crt
    
    • [ ] add test case for https://github.com/laixintao/iredis/pull/442
    • [ ] setup tests service in github action
    • [ ] test tls connection
    • [ ] test dsn tls connection
    opened by laixintao 0
  • xread with a stream returning nil instead throws ERROR

    xread with a stream returning nil instead throws ERROR

    It is very easy to reproduce:

    127.0.0.1:6379> xread STREAMS mystream $
    (error) ERROR 'NoneType' object is not iterable
    

    In redis-cli, I get (nil) returned

    opened by hodapp512 1
  • I hope you can upgrade the iredis dependency click version to 8

    I hope you can upgrade the iredis dependency click version to 8

    But when I tried to install iredis, I found a conflict between flask and the version of click on which iredis depends

    pip install iredis

    error info 👇

    ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
    flask 2.1.2 requires click>=8.0, but you have click 7.1.2 which is incompatible.
    

    flask version info 👇

    ─➤  pip show flask    
    Name: Flask
    Version: 2.1.2
    Summary: A simple framework for building complex web applications.
    Home-page: https://palletsprojects.com/p/flask
    Author: Armin Ronacher
    Author-email: [email protected]
    License: BSD-3-Clause
    Location: /Users/ponponon/.local/share/virtualenvs/ideaboom-B0dr_aXc/lib/python3.10/site-packages
    Requires: click, itsdangerous, Jinja2, Werkzeug
    Required-by: 
    
    opened by ponponon 4
  • Test fails on i586

    Test fails on i586

    I'm packaging iredis on openSUSE and I see test failures on i586 while x64_86, aarch64 and ppc64 work fine:

    [   90s] =================================== FAILURES ===================================
    [   90s] ___________________________ test_peek_set_fetch_part ___________________________
    [   90s] 
    [   90s] iredis_client = <iredis.client.Client object at 0xf605ea60>
    [   90s] clean_redis = Redis<ConnectionPool<Connection<host=localhost,port=6379,db=15>>>
    [   90s] 
    [   90s]     def test_peek_set_fetch_part(iredis_client, clean_redis):
    [   90s]         clean_redis.sadd("myset", *[f"hello-{index}" for index in range(40)])
    [   90s]         peek_result = list(iredis_client.do_peek("myset"))
    [   90s]     
    [   90s]         assert peek_result[0][0] == ("class:dockey", "key: ")
    [   90s] >       assert peek_result[0][1][1].startswith("set (hashtable)  mem: 2")
    [   90s] E       AssertionError: assert False
    [   90s] E        +  where False = <built-in method startswith of str object at 0xf60d5920>('set (hashtable)  mem: 2')
    [   90s] E        +    where <built-in method startswith of str object at 0xf60d5920> = 'set (hashtable)  mem: 1748 bytes, ttl: -1'.startswith
    [   90s] 
    [   90s] tests/unittests/test_client.py:331: AssertionError
    [   90s] _______________________________ test_peek_stream _______________________________
    [   90s] 
    [   90s] iredis_client = <iredis.client.Client object at 0xf60bf430>
    [   90s] clean_redis = Redis<ConnectionPool<Connection<host=localhost,port=6379,db=15>>>
    [   90s] 
    [   90s]     def test_peek_stream(iredis_client, clean_redis):
    [   90s]         clean_redis.xadd("mystream", {"foo": "bar", "hello": "world"})
    [   90s]         peek_result = list(iredis_client.do_peek("mystream"))
    [   90s]     
    [   90s]         assert peek_result[0][0] == ("class:dockey", "key: ")
    [   90s] >       assert re.match(
    [   90s]             r"stream \((stream|unknown)\)  mem: 6\d\d bytes, ttl: -1", peek_result[0][1][1]
    [   90s]         )
    [   90s] E       AssertionError: assert None
    [   90s] E        +  where None = <function match at 0xf77ef4a8>('stream \\((stream|unknown)\\)  mem: 6\\d\\d bytes, ttl: -1', 'stream (stream)  mem: 387 bytes, ttl: -1')
    [   90s] E        +    where <function match at 0xf77ef4a8> = re.match
    [   90s] 
    [   90s] tests/unittests/test_client.py:403: AssertionError
    [   90s] ______________ test_timestamp_completer_humanize_time_completion _______________
    [   90s] 
    [   90s] fake_now = <MagicMock name='now' id='4129102000'>
    [   90s] 
    [   90s]     @patch("iredis.completers.pendulum.now")
    [   90s]     def test_timestamp_completer_humanize_time_completion(fake_now):
    [   90s]         fake_now.return_value = pendulum.from_timestamp(1578487013)
    [   90s]         c = TimestampCompleter()
    [   90s]     
    [   90s]         fake_document = MagicMock()
    [   90s]         fake_document.text = fake_document.text_before_cursor = "30"
    [   90s]         completions = list(c.get_completions(fake_document, None))
    [   90s]     
    [   90s]         assert completions == [
    [   90s]             Completion(
    [   90s]                 text="1575895013000",
    [   90s]                 start_position=-2,
    [   90s]                 display=FormattedText([("", "1575895013000")]),
    [   90s]                 display_meta="30 days ago (2019-12-09 12:36:53)",
    [   90s]             ),
    [   90s]             Completion(
    [   90s]                 text="1578379013000",
    [   90s]                 start_position=-2,
    [   90s]                 display=FormattedText([("", "1578379013000")]),
    [   90s]                 display_meta="30 hours ago (2020-01-07 06:36:53)",
    [   90s]             ),
    [   90s]             Completion(
    [   90s]                 text="1578485213000",
    [   90s]                 start_position=-2,
    [   90s]                 display=FormattedText([("", "1578485213000")]),
    [   90s]                 display_meta="30 minutes ago (2020-01-08 12:06:53)",
    [   90s]             ),
    [   90s]             Completion(
    [   90s]                 text="1578486983000",
    [   90s]                 start_position=-2,
    [   90s]                 display=FormattedText([("", "1578486983000")]),
    [   90s]                 display_meta="30 seconds ago (2020-01-08 12:36:23)",
    [   90s]             ),
    [   90s]         ]
    [   90s]     
    [   90s]         # No plural
    [   90s]         fake_document.text = fake_document.text_before_cursor = "1"
    [   90s]         completions = list(c.get_completions(fake_document, None))
    [   90s]     
    [   90s] >       assert completions == [
    [   90s]             Completion(
    [   90s]                 text="1546951013000",
    [   90s]                 start_position=-1,
    [   90s]                 display=FormattedText([("", "1546951013000")]),
    [   90s]                 display_meta="1 year ago (2019-01-08 12:36:53)",
    [   90s]             ),
    [   90s]             Completion(
    [   90s]                 text="1575808613000",
    [   90s]                 start_position=-1,
    [   90s]                 display=FormattedText([("", "1575808613000")]),
    [   90s]                 display_meta="1 month ago (2019-12-08 12:36:53)",
    [   90s]             ),
    [   90s]             Completion(
    [   90s]                 text="1578400613000",
    [   90s]                 start_position=-1,
    [   90s]                 display=FormattedText([("", "1578400613000")]),
    [   90s]                 display_meta="1 day ago (2020-01-07 12:36:53)",
    [   90s]             ),
    [   90s]             Completion(
    [   90s]                 text="1578483413000",
    [   90s]                 start_position=-1,
    [   90s]                 display=FormattedText([("", "1578483413000")]),
    [   90s]                 display_meta="1 hour ago (2020-01-08 11:36:53)",
    [   90s]             ),
    [   90s]             Completion(
    [   90s]                 text="1578486953000",
    [   90s]                 start_position=-1,
    [   90s]                 display=FormattedText([("", "1578486953000")]),
    [   90s]                 display_meta="1 minute ago (2020-01-08 12:35:53)",
    [   90s]             ),
    [   90s]             Completion(
    [   90s]                 text="1578487012000",
    [   90s]                 start_position=-1,
    [   90s]                 display=FormattedText([("", "1578487012000")]),
    [   90s]                 display_meta="1 second ago (2020-01-08 12:36:52)",
    [   90s]             ),
    [   90s]         ]
    [   90s] E       AssertionError: assert [Completion(t...000')])), ...] == [Completion(t...87012000')]))]
    [   90s] E         Left contains one more item: Completion(text='1643072400000', start_position=-1, display=FormattedText([('', '1643072400000')]))
    [   90s] E         Full diff:
    [   90s] E           [
    [   90s] E            Completion(text='1546951013000', start_position=-1, display=FormattedText([('', '1546951013000')])),
    [   90s] E            Completion(text='1575808613000', start_position=-1, display=FormattedText([('', '1575808613000')])),
    [   90s] E            Completion(text='1578400613000', start_position=-1, display=FormattedText([('', '1578400613000')])),
    [   90s] E            Completion(text='1578483413000', start_position=-1, display=FormattedText([('', '1578483413000')])),...
    [   90s] E         
    [   90s] E         ...Full output truncated (5 lines hidden), use '-vv' to show
    [   90s] 
    [   90s] tests/unittests/test_completers.py:223: AssertionError
    

    Do you know what might cause this?

    opened by sebix 7
Releases(v1.13.0)
Owner
I love system administration as much as I love programming.
A simple CLI tool for getting region-specific status of Logz.io components.

About A simple CLI tool for checking the current status of Logz.io components per region. Built With Python 3 The following packeges (see requirements

Yotam Bernaz 1 Dec 11, 2021
Unconventional ways to save an Image

Unexpected Image Saves Unconventional ways to save an image 😄 Have you ever been bored by the same old .png, .jpg, .jpeg, .gif and all other image ex

Eric Mendes 15 Nov 06, 2022
A simple command line tool for changing the icons of folders or files on MacOS.

Mac OS File Icon Changer Description A small and simple script to quickly change large amounts or a few files and folders icons to easily customize th

Eroxl 3 Jan 02, 2023
iTerm2 Shell integration for Xonsh shell.

iTerm2 Shell Integration iTerm2 Shell integration for Xonsh shell. Installation To install use pip: xpip install xontrib-iterm2 # or: xpip install -U

Noorhteen Raja NJ 6 Dec 29, 2022
A Python-based Wordle solver and CLI player

Wordle A Python-based Wordle solver and CLI player This was created using Python 3.9.7. SPOILER ALERT: the data directory contains spoilers for upcomi

Will Fitzgerald 1 Jul 24, 2022
A communist shell written in Python

kash A communist shell written in Python It doesn't support escapes, quotes, comment lines, |, &&, , or similar yet. If you need help, get it from

Çınar Yılmaz 1 Dec 10, 2021
Official AIdea command line tool

AIdea CLI Official AIdea command line tool for https://aidea-web.tw. Installation Make sure you have installed both Python 3 and pip package manager.

AIdea 5 Dec 15, 2021
電通大のCLIツールです

uecli 電通大のCLIツールです。コマンドラインからシラバス検索、成績参照、図書館の貸出リストなどを見ることができます インストール pip install uecli 使い方 シラバスを検索 uecli syllabus search -s 'コンピュータサイエンス' シラバスを取得し、Mar

UEC World Dominators 2 Oct 31, 2021
A Reverse Shell Python Packages

A Reverse Shell Python Packages

1 Nov 03, 2021
Ideas on how to quickly learn to build command-line tools

CLI-Bootcamp Ideas on how to quickly learn to build command-line tools Part 1-Bash Week1: Using Linux Lesson 1: Using Linux Shell Lab Lesson 2: How sh

Noah Gift 10 Apr 18, 2022
Turdshovel is an interactive CLI tool that allows users to dump objects from .NET memory dumps

Turdshovel Description Turdshovel is an interactive CLI tool that allows users to dump objects from .NET memory dumps without having to fully understa

Leron Gray 41 Jul 27, 2022
A cli tool , which shows you all the next possible words you can guess from in the game of Wordle.

wordle-helper A cli tool , which shows you all the next possible words you can guess from the Game Wordle. This repo has the code discussed in the You

1 Jan 17, 2022
OneDriveExplorer - A command line and GUI based application for reconstructing the folder structure of OneDrive from the UserCid.dat file

OneDriveExplorer - A command line and GUI based application for reconstructing the folder structure of OneDrive from the UserCid.dat file

Brian Maloney 100 Dec 13, 2022
Chat with Rem in Terminal!

Chat with Rem in Terminal!

bariscodefx 1 Dec 19, 2021
pypinfo is a simple CLI to access PyPI download statistics via Google's BigQuery.

pypinfo: View PyPI download statistics with ease. pypinfo is a simple CLI to access PyPI download statistics via Google's BigQuery. Installation pypin

Ofek Lev 351 Dec 26, 2022
A very simple OpenContest command line client written in Python

OpenContest Client A very simple OpenContest command line client written in Python. The only dependency is the requests library. Tested with Linux onl

Ladue Computer Science 1 May 25, 2022
A dec-bin converter uses 2's complement.

2's Complement Dec-Bin Converter A dec-bin converter uses 2's complement. Visit my Medium Post. What is 2's complement? Two's complement is the most c

C.H Jacky 9 Mar 01, 2022
dsub is a command-line tool that makes it easy to submit and run batch scripts in the cloud.

Open-source command-line tool to run batch computing tasks and workflows on backend services such as Google Cloud.

Data Biosphere 233 Jan 01, 2023
Dynamically Generate GitHub Stats as like Terminal Interface

GitHub Stats Terminal Style Dynamically Generate GitHub Stats as like Terminal Interface Usage Create a New Repository using this Template or click he

YOGESHWARAN R 63 Jan 03, 2023
🌈 Generate color palettes based on Neovim colorschemes.

Iris Iris is a Neovim plugin that generates a normalized color palette based on your colorscheme. It is named for the goddess Iris of Greek mythology,

N. G. Scheurich 45 Jul 28, 2022