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 (linux@archlinux) (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.
null
Postgres CLI with autocompletion and syntax highlighting

A REPL for Postgres This is a postgres client that does auto-completion and syntax highlighting. Home Page: http://pgcli.com MySQL Equivalent: http://

dbcli 10.8k Jan 2, 2023
CLI for SQLite Databases with auto-completion and syntax highlighting

litecli Docs A command-line client for SQLite databases that has auto-completion and syntax highlighting. Installation If you already know how to inst

dbcli 1.8k Dec 31, 2022
AthenaCLI is a CLI tool for AWS Athena service that can do auto-completion and syntax highlighting.

Introduction AthenaCLI is a command line interface (CLI) for the Athena service that can do auto-completion and syntax highlighting, and is a proud me

dbcli 192 Jan 7, 2023
🦎 A NeoVim plugin for highlighting visual selections like in a normal document editor!

?? HighStr.nvim A NeoVim plugin for highlighting visual selections like in a normal document editor! Demo TL;DR HighStr.nvim is a NeoVim plugin writte

Pocco81 222 Jan 3, 2023
Gamestonk Terminal is an awesome stock and crypto market terminal

Gamestonk Terminal is an awesome stock and crypto market terminal. A FOSS alternative to Bloomberg Terminal.

Gamestonk Terminal 18.6k Jan 3, 2023
Objexplore is an interactive Python object explorer for the terminal.

Objexplore is an interactive Python object explorer for the terminal. Use it while debugging, or exploring a new library, or whatever! 9D1FAC73-B2A5-4

kylepollina 249 Dec 23, 2022
An interactive aquarium for your terminal.

sipedon An interactive aquarium for your terminal, written using pytermgui. The project got its name from the Common Watersnake, also known as Nerodia

null 17 Nov 7, 2022
A terminal client for connecting to hack.chat servers

A terminal client for connecting to hack.chat servers.

V9 2 Sep 21, 2022
TerminalGV is a very simple client to display stats about your SNCF TGV/TER train in your terminal.

TerminalGV So I got bored in the train, TerminalGV is a very simple client to display stats about your SNCF TGV/TER train in your terminal. The "on-tr

Samuel 8 Dec 15, 2022
Ssl-tool - A simple interactive CLI wrapper around openssl to make creation and installation of self-signed certs easy

What's this? A simple interactive CLI wrapper around openssl to make self-signin

Aniket Teredesai 9 May 17, 2022
Random scripts and other bits for interacting with the SpaceX Starlink user terminal hardware

starlink-grpc-tools This repository has a handful of tools for interacting with the gRPC service implemented on the Starlink user terminal (AKA "the d

null 270 Dec 29, 2022
Rich is a Python library for rich text and beautiful formatting in the terminal.

The Rich API makes it easy to add color and style to terminal output. Rich can also render pretty tables, progress bars, markdown, syntax highlighted source code, tracebacks, and more — out of the box.

Will McGugan 41.4k Jan 3, 2023
Lets you view, edit and execute Jupyter Notebooks in the terminal.

Lets you view, edit and execute Jupyter Notebooks in the terminal.

David Brochart 684 Dec 28, 2022
Module for converting 2D Python lists to fancy ASCII tables. Table2Ascii lets you display pretty tables in the terminal and on Discord.

table2ascii Module for converting 2D Python lists to a fancy ASCII/Unicode tables table2ascii ?? Installation ??‍?? Usage Convert lists to ASCII table

Jonah Lawrence 40 Jan 3, 2023
A terminal UI dashboard to monitor requests for code review across Github and Gitlab repositories.

A terminal UI dashboard to monitor requests for code review across Github and Gitlab repositories.

Kyle Harrison 150 Dec 14, 2022
CLabel is a terminal-based cluster labeling tool that allows you to explore text data interactively and label clusters based on reviewing that data.

CLabel is a terminal-based cluster labeling tool that allows you to explore text data interactively and label clusters based on reviewing that

Peter Baumgartner 29 Aug 9, 2022
This CLI give the possibility to do a queries in Star Wars API and returns a JSON in a terminal.

Star Wars CLI (swcli) This CLI give the possibility to do a queries in Star Wars API and returns a JSON in a terminal. Install $ pip install swcli Qu

Pery Lemke 5 Nov 5, 2021
WA Terminal is a CLI application that allows us to login and send message with WhatsApp with a single command.

WA Terminal is a CLI application that allows us to login and send message with WhatsApp with a single command.

Aziz Fikri 15 Apr 15, 2022
A terminal spreadsheet multitool for discovering and arranging data

VisiData v2.6.1 A terminal interface for exploring and arranging tabular data. VisiData supports tsv, csv, sqlite, json, xlsx (Excel), hdf5, and many

Saul Pwanson 6.2k Jan 4, 2023