diff --git a/README.md b/README.md index 3e83f77..6e21236 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,10 @@ Voidpin allows sending copy/paste commands across the wire. It is specifically i Voidpin sends clipboard content to a local service, that then puts content in a local clipboard. It can also go the other way, but the primary intent is remote -> local. +## Demo + +#[demo](assets/demo.gif) + ## Usage ```bash diff --git a/assets/demo.cast b/assets/demo.cast new file mode 100644 index 0000000..e42fc32 --- /dev/null +++ b/assets/demo.cast @@ -0,0 +1,175 @@ +{"version": 2, "width": 130, "height": 40, "timestamp": 1736839984, "env": {"SHELL": "/bin/zsh", "TERM": "xterm-256color"}} +[0.479638, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] +[0.586074, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\r\n\u001b[38;2;255;153;102mvoidpin\u001b[0m \u001b[90mHEAD\u001b[1;32m(153edb1)\u001b[0m \u001b[38;2;255;153;102m \u001b[0mis \u001b[1;38;5;208m📦 v0.0.1\u001b[0m \u001b[1;31mrs \u001b[0mwith \u001b[1;34m🐃 v1.49.0 \u001b[0m\r\n\u001b[38;2;255;153;102m❯\u001b[0m \u001b[K"] +[0.587071, "o", "\u001b[6 q"] +[0.587964, "o", "\u001b[6 q"] +[0.588147, "o", "\u001b[?2004h"] +[3.167878, "o", "v"] +[3.191237, "o", "\b\u001b[1m\u001b[31mv\u001b[0m\u001b[39m"] +[3.232572, "o", "\b\u001b[1m\u001b[31mv\u001b[0m\u001b[39m\u001b[90moidpin listen\u001b[39m\u001b[13D"] +[3.300942, "o", "\b\u001b[1m\u001b[31mv\u001b[1m\u001b[31mo\u001b[0m\u001b[39m"] +[3.430551, "o", "\b\b\u001b[1m\u001b[31mv\u001b[1m\u001b[31mo\u001b[1m\u001b[31mi\u001b[0m\u001b[39m"] +[3.544553, "o", "\b\u001b[1m\u001b[31mi\u001b[1m\u001b[31md\u001b[0m\u001b[39m"] +[3.689365, "o", "\b\u001b[1m\u001b[31md\u001b[1m\u001b[31mp\u001b[0m\u001b[39m"] +[3.797695, "o", "\b\u001b[1m\u001b[31mp\u001b[1m\u001b[31mi\u001b[0m\u001b[39m"] +[3.97905, "o", "\b\u001b[1m\u001b[31mi\u001b[1m\u001b[31mn\u001b[0m\u001b[39m"] +[3.980916, "o", "\b\b\b\b\b\b\b\u001b[0m\u001b[32mv\u001b[0m\u001b[32mo\u001b[0m\u001b[32mi\u001b[0m\u001b[32md\u001b[0m\u001b[32mp\u001b[0m\u001b[32mi\u001b[0m\u001b[32mn\u001b[39m"] +[4.066146, "o", "\b\u001b[32mn\u001b[32m \u001b[39m"] +[4.068196, "o", "\b\b\u001b[32mn\u001b[39m\u001b[39m "] +[4.336382, "o", "\u001b[39mr\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \b\b\b\b\b"] +[4.342211, "o", "\b\u001b[4mr\u001b[24m"] +[4.422896, "o", "\b\u001b[4mr\u001b[4me\u001b[24m"] +[4.452272, "o", "\b\u001b[4me\u001b[4mm\u001b[24m"] +[4.45517, "o", "\b\b\b\u001b[24mr\u001b[24me\u001b[24mm"] +[4.583628, "o", "o"] +[4.666593, "o", "t"] +[4.759127, "o", "e"] +[4.900598, "o", " "] +[5.746797, "o", "&"] +[6.624085, "o", "\b \b"] +[6.74323, "o", "\b"] +[6.896869, "o", "\b \b"] +[7.033699, "o", "\b \b"] +[7.174094, "o", "\b \b"] +[7.309328, "o", "\b \b"] +[7.313831, "o", "\b\b\u001b[4mr\u001b[4me\u001b[24m"] +[7.443394, "o", "\b\b\u001b[4mr\u001b[24m\u001b[24m \b"] +[7.573529, "o", "\b\u001b[24m \b"] +[7.600586, "o", "\u001b[90mlisten\u001b[39m\b\b\b\b\b\b"] +[7.789065, "o", "\u001b[39ml"] +[7.957613, "o", "\u001b[39mi"] +[8.041393, "o", "\u001b[39ms"] +[8.137227, "o", "\u001b[39mt"] +[8.196626, "o", "\u001b[39me"] +[8.263729, "o", "\u001b[39mn"] +[8.401872, "o", " "] +[8.5879, "o", "&"] +[8.95472, "o", "\u001b[?1l\u001b>"] +[8.954912, "o", "\u001b[?2004l"] +[8.960125, "o", "\u001b[0 q"] +[8.960423, "o", "\r\r\n"] +[8.986315, "o", "[1] 36816\r\n"] +[8.98642, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] +[8.995202, "o", "\u001b[2m2025-01-14T07:33:13.136349Z\u001b[0m \u001b[32m INFO\u001b[0m \u001b[2mvoidpin\u001b[0m\u001b[2m:\u001b[0m starting listener \u001b[3mgrpc\u001b[0m\u001b[2m=\u001b[0m\"0.0.0.0:7900\"\r\n"] +[9.060819, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\r\n\u001b[38;2;255;153;102mvoidpin\u001b[0m \u001b[90mHEAD\u001b[1;32m(153edb1)\u001b[0m \u001b[38;2;255;153;102m \u001b[0mis \u001b[1;38;5;208m📦 v0.0.1\u001b[0m \u001b[1;31mrs \u001b[0mwith \u001b[1;34m🐃 v1.49.0 \u001b[0m\r\n\u001b[1;34m✦\u001b[0m \u001b[38;2;255;153;102m❯\u001b[0m \u001b[K"] +[9.061906, "o", "\u001b[6 q"] +[9.062876, "o", "\u001b[6 q"] +[9.063056, "o", "\u001b[?2004h"] +[10.265829, "o", "s"] +[10.272815, "o", "\b\u001b[1m\u001b[31ms\u001b[0m\u001b[39m"] +[10.34456, "o", "\b\u001b[1m\u001b[31ms\u001b[0m\u001b[39m\u001b[90msh nef_remote\u001b[39m\u001b[13D"] +[10.409989, "o", "\b\u001b[1m\u001b[31ms\u001b[1m\u001b[31ms\u001b[0m\u001b[39m"] +[10.531573, "o", "\b\b\u001b[1m\u001b[31ms\u001b[1m\u001b[31ms\u001b[1m\u001b[31mh\u001b[0m\u001b[39m"] +[10.534938, "o", "\b\b\b\u001b[0m\u001b[32ms\u001b[0m\u001b[32ms\u001b[0m\u001b[32mh\u001b[39m"] +[10.650848, "o", "\b\u001b[32mh\u001b[32m \u001b[39m"] +[10.654699, "o", "\b\b\u001b[32mh\u001b[39m\u001b[39m "] +[12.060573, "o", "\u001b[39mn"] +[12.153753, "o", "\u001b[39me"] +[12.238632, "o", "\u001b[39mf"] +[12.536018, "o", "\u001b[39m_"] +[12.700909, "o", "\u001b[39mr"] +[12.776911, "o", "\u001b[39me"] +[12.839538, "o", "\u001b[39mm"] +[12.97043, "o", "\u001b[39mo"] +[13.030559, "o", "\u001b[39mt"] +[13.111063, "o", "\u001b[39me"] +[13.319003, "o", "\u001b[?1l\u001b>"] +[13.319486, "o", "\u001b[?2004l"] +[13.325988, "o", "\u001b[0 q"] +[13.326164, "o", "\r\r\n"] +[14.748903, "o", "Last login: Tue Jan 14 08:27:03 2025 from 10.0.9.20\r\r\n"] +[14.80584, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] +[14.840843, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\r\n\u001b[1;33mkjuulh\u001b[0m in \u001b[1;2;32m🌐 nefarious\u001b[0m in \u001b[38;2;255;153;102m~\u001b[0m on \u001b[1;33m☁️ (eu-west-1) \u001b[0m\r\n\u001b[38;2;255;153;102m❯\u001b[0m \u001b[K\u001b[6 q\u001b[6 q\u001b[?2004h"] +[15.45051, "o", "e"] +[15.456172, "o", "\b\u001b[1m\u001b[31me\u001b[0m\u001b[39m"] +[15.461708, "o", "\b\u001b[1m\u001b[31me\u001b[0m\u001b[39m\u001b[90mcho \"mystuff\" | voidpin remote copy\u001b[39m\u001b[35D"] +[15.623151, "o", "\b\u001b[1m\u001b[31me\u001b[1m\u001b[31mx\u001b[0m\u001b[39m\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[34D"] +[15.644024, "o", "\u001b[90mport VOIDPIN_REMOTE=http://10.0.9.20:7900\u001b[39m\u001b[41D"] +[15.743819, "o", "\b\b\u001b[1m\u001b[31me\u001b[1m\u001b[31mx\u001b[1m\u001b[31mp\u001b[0m\u001b[39m"] +[15.908543, "o", "\b\u001b[1m\u001b[31mp\u001b[1m\u001b[31mo\u001b[0m\u001b[39m"] +[16.003031, "o", "\b\u001b[1m\u001b[31mo\u001b[1m\u001b[31mr\u001b[0m\u001b[39m"] +[16.265633, "o", "\b\u001b[1m\u001b[31mr\u001b[1m\u001b[31mt\u001b[0m\u001b[39m\b\b\b\b\b\b\u001b[0m\u001b[33me\u001b[0m\u001b[33mx\u001b[0m\u001b[33mp\u001b[0m\u001b[33mo\u001b[0m\u001b[33mr\u001b[0m\u001b[33mt\u001b[39m"] +[16.276286, "o", "\b\u001b[33mt\u001b[33m \u001b[39m\b\b\u001b[33mt\u001b[39m\u001b[39m "] +[17.117006, "o", "\u001b[39mV"] +[17.118576, "o", "\b\u001b[4mV\u001b[24m"] +[17.334112, "o", "\b\u001b[4mV\u001b[39m\u001b[4mO\u001b[24m\b\b\u001b[24mV\u001b[24mO"] +[17.363757, "o", "\u001b[39mI"] +[17.604581, "o", "\u001b[39mD"] +[17.931075, "o", "\u001b[39mP\u001b[39mI\u001b[39mN\u001b[39m_\u001b[39mR\u001b[39mE\u001b[39mM\u001b[39mO\u001b[39mT\u001b[39mE\u001b[39m=\u001b[39mh\u001b[39mt\u001b[39mt\u001b[39mp\u001b[39m:\u001b[39m/\u001b[39m/\u001b[39m1\u001b[39m0\u001b[39m.\u001b[39m0\u001b[39m.\u001b[39m9\u001b[39m.\u001b[39m2\u001b[39m0\u001b[39m:\u001b[39m7\u001b[39m9\u001b[39m0\u001b[39m0"] +[18.721578, "o", "\u001b[0 q\u001b[?2004l\r\r\n"] +[18.729848, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] +[18.745102, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\r\n\u001b[1;33mkjuulh\u001b[0m in \u001b[1;2;32m🌐 nefarious\u001b[0m in \u001b[38;2;255;153;102m~\u001b[0m on \u001b[1;33m☁️ (eu-west-1) \u001b[0m\r\n\u001b[38;2;255;153;102m❯\u001b[0m \u001b[K\u001b[6 q\u001b[6 q\u001b[?2004h"] +[19.768372, "o", "v\b\u001b[4mv\u001b[24m"] +[19.787679, "o", "\b\u001b[4mv\u001b[24m\u001b[90mirtualenv venv\u001b[39m\u001b[14D"] +[19.948701, "o", "\b\u001b[4mv\u001b[39m\u001b[4mo\u001b[24m\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[13D"] +[19.950166, "o", "\b\b\u001b[24m\u001b[1m\u001b[31mv\u001b[24m\u001b[1m\u001b[31mo\u001b[0m\u001b[39m"] +[19.998976, "o", "\b\b\u001b[1m\u001b[31mv\u001b[1m\u001b[31mo\u001b[1m\u001b[31mi\u001b[0m\u001b[39m"] +[20.399333, "o", "\b\b\b\u001b[1m\u001b[31mv\u001b[1m\u001b[31mo\u001b[0m\u001b[39m\u001b[0m\u001b[39m \b"] +[20.536472, "o", "\b\b\u001b[1m\u001b[31mv\u001b[0m\u001b[39m\u001b[0m\u001b[39m \b\b\u001b[0m\u001b[39m\u001b[4mv\u001b[24m"] +[20.54648, "o", "\b\u001b[4mv\u001b[24m\u001b[90mirtualenv venv\u001b[39m\u001b[14D"] +[20.659047, "o", "\b\u001b[24m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[15D"] +[21.004154, "o", "e\b\u001b[1m\u001b[31me\u001b[0m\u001b[39m"] +[21.010045, "o", "\b\u001b[1m\u001b[31me\u001b[0m\u001b[39m\u001b[90mxport VOIDPIN_REMOTE=http://10.0.9.20:7900\u001b[39m\u001b[42D"] +[21.21325, "o", "\b\u001b[1m\u001b[31me\u001b[1m\u001b[31mc\u001b[0m\u001b[39m\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[41D"] +[21.222033, "o", "\u001b[90mho \"mystuff\" | voidpin remote copy\u001b[39m\u001b[34D"] +[21.294992, "o", "\b\b\u001b[1m\u001b[31me\u001b[1m\u001b[31mc\u001b[1m\u001b[31mh\u001b[0m\u001b[39m"] +[21.419667, "o", "\b\u001b[1m\u001b[31mh\u001b[1m\u001b[31mo\u001b[0m\u001b[39m"] +[21.42291, "o", "\b\b\b\b\u001b[0m\u001b[32me\u001b[0m\u001b[32mc\u001b[0m\u001b[32mh\u001b[0m\u001b[32mo\u001b[39m"] +[21.505433, "o", "\b\u001b[32mo\u001b[32m \u001b[39m\b\b\u001b[32mo\u001b[39m\u001b[39m "] +[21.988846, "o", "\u001b[39m\"\u001b[39mm\u001b[39my\u001b[39ms\u001b[39mt\u001b[39mu\u001b[39mf\u001b[39mf\u001b[39m\"\u001b[39m \u001b[39m|\u001b[39m \u001b[39mv\u001b[39mo\u001b[39mi\u001b[39md\u001b[39mp\u001b[39mi\u001b[39mn\u001b[39m \u001b[39mr\u001b[39me\u001b[39mm\u001b[39mo\u001b[39mt\u001b[39me\u001b[39m \u001b[39mc\u001b[39mo\u001b[39mp\u001b[39my"] +[21.993557, "o", "\u001b[31D\u001b[33m\"\u001b[33mm\u001b[33my\u001b[33ms\u001b[33mt\u001b[33mu\u001b[33mf\u001b[33mf\u001b[33m\"\u001b[39m\u001b[3C\u001b[32mv\u001b[32mo\u001b[32mi\u001b[32md\u001b[32mp\u001b[32mi\u001b[32mn\u001b[39m\u001b[12C"] +[23.489379, "o", "\u001b[0 q"] +[23.490939, "o", "\u001b[?2004l\r\r\n"] +[23.569732, "o", "\u001b[2m2025-01-14T07:33:20.444640Z\u001b[0m \u001b[32m INFO\u001b[0m \u001b[2mvoidpin::remote_copy\u001b[0m\u001b[2m:\u001b[0m sending copy request\r\n"] +[23.595738, "o", "\u001b[2m2025-01-14T07:33:27.736730Z\u001b[0m \u001b[32m INFO\u001b[0m \u001b[2mvoidpin::copy\u001b[0m\u001b[2m:\u001b[0m copy process ended with status: ExitStatus(unix_wait_status(0))\n"] +[23.677319, "o", "\u001b[2m2025-01-14T07:33:20.549068Z\u001b[0m \u001b[32m INFO\u001b[0m \u001b[2mvoidpin::remote_copy\u001b[0m\u001b[2m:\u001b[0m sent copy request\r\n"] +[23.677877, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] +[23.682634, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\r\n\u001b[1;33mkjuulh\u001b[0m in \u001b[1;2;32m🌐 nefarious\u001b[0m in \u001b[38;2;255;153;102m~\u001b[0m on \u001b[1;33m☁️ (eu-west-1) \u001b[0m\r\n\u001b[38;2;255;153;102m❯\u001b[0m \u001b[K"] +[23.684943, "o", "\u001b[6 q\u001b[6 q"] +[23.685144, "o", "\u001b[?2004h"] +[26.039094, "o", "e\b\u001b[1m\u001b[31me\u001b[0m\u001b[39m"] +[26.058901, "o", "\b\u001b[1m\u001b[31me\u001b[0m\u001b[39m\u001b[90mcho \"mystuff\" | voidpin remote copy\u001b[39m\u001b[35D"] +[26.200566, "o", "\b\u001b[1m\u001b[31me\u001b[1m\u001b[31mx\u001b[0m\u001b[39m\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[34D"] +[26.224342, "o", "\b\b\u001b[1m\u001b[31me\u001b[1m\u001b[31mx\u001b[1m\u001b[31mi\u001b[0m\u001b[39m"] +[26.236469, "o", "\u001b[90mt\u001b[39m\b"] +[26.338963, "o", "\b\u001b[1m\u001b[31mi\u001b[1m\u001b[31mt\u001b[0m\u001b[39m"] +[26.347595, "o", "\b\b\b\b\u001b[0m\u001b[32me\u001b[0m\u001b[32mx\u001b[0m\u001b[32mi\u001b[0m\u001b[32mt\u001b[39m"] +[27.917748, "o", "\u001b[0 q\u001b[?2004l\r\r\n"] +[27.92436, "o", "Connection to 10.0.9.18 closed.\r\r\n"] +[27.927279, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] +[28.005869, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\r\n\u001b[38;2;255;153;102mvoidpin\u001b[0m \u001b[90mHEAD\u001b[1;32m(153edb1)\u001b[0m \u001b[38;2;255;153;102m \u001b[0mis \u001b[1;38;5;208m📦 v0.0.1\u001b[0m \u001b[1;31mrs \u001b[0mwith \u001b[1;34m🐃 v1.49.0 \u001b[0m\u001b[33m14s\u001b[0m \r\n\u001b[1;34m✦\u001b[0m \u001b[38;2;255;153;102m❯\u001b[0m \u001b[K"] +[28.006941, "o", "\u001b[6 q"] +[28.007819, "o", "\u001b[6 q"] +[28.007998, "o", "\u001b[?2004h"] +[29.624611, "o", "p"] +[29.632533, "o", "\b\u001b[1m\u001b[31mp\u001b[0m\u001b[39m"] +[29.674006, "o", "\b\u001b[1m\u001b[31mp\u001b[0m\u001b[39m\u001b[90msql -h localhost -p 5432 -U postgres -d service\u001b[39m\u001b[47D"] +[29.861312, "o", "\b\u001b[1m\u001b[31mp\u001b[1m\u001b[31mb\u001b[0m\u001b[39m\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[46D"] +[29.896875, "o", "\u001b[90mcopy\u001b[39m\b\b\b\b"] +[30.455748, "o", "\b\b\u001b[1m\u001b[31mp\u001b[1m\u001b[31mb\u001b[1m\u001b[31mp\u001b[0m\u001b[39m\u001b[39m \u001b[39m \u001b[39m \b\b\b"] +[30.492269, "o", "\u001b[90maste\u001b[39m\b\b\b\b"] +[30.511887, "o", "\b\u001b[1m\u001b[31mp\u001b[1m\u001b[31ma\u001b[0m\u001b[39m"] +[30.640428, "o", "\b\u001b[1m\u001b[31ma\u001b[1m\u001b[31ms\u001b[0m\u001b[39m"] +[30.900008, "o", "\b\u001b[1m\u001b[31ms\u001b[1m\u001b[31mt\u001b[0m\u001b[39m"] +[31.00196, "o", "\b\u001b[1m\u001b[31mt\u001b[1m\u001b[31me\u001b[0m\u001b[39m"] +[31.004152, "o", "\b\b\b\b\b\b\b\u001b[0m\u001b[32mp\u001b[0m\u001b[32mb\u001b[0m\u001b[32mp\u001b[0m\u001b[32ma\u001b[0m\u001b[32ms\u001b[0m\u001b[32mt\u001b[0m\u001b[32me\u001b[39m"] +[31.436893, "o", "\u001b[?1l\u001b>"] +[31.437147, "o", "\u001b[?2004l"] +[31.440483, "o", "\u001b[0 q"] +[31.440758, "o", "\r\r\n"] +[31.506519, "o", "mystuff\r\n"] +[31.507028, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] +[31.578124, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\r\n\u001b[38;2;255;153;102mvoidpin\u001b[0m \u001b[90mHEAD\u001b[1;32m(153edb1)\u001b[0m \u001b[38;2;255;153;102m \u001b[0mis \u001b[1;38;5;208m📦 v0.0.1\u001b[0m \u001b[1;31mrs \u001b[0mwith \u001b[1;34m🐃 v1.49.0 \u001b[0m\r\n\u001b[1;34m✦\u001b[0m \u001b[38;2;255;153;102m❯\u001b[0m \u001b[K"] +[31.579154, "o", "\u001b[6 q"] +[31.580021, "o", "\u001b[6 q"] +[31.580178, "o", "\u001b[?2004h"] +[33.751349, "o", "\u001b[?2004l\r\r\n"] +[33.75158, "o", "zsh: you have running jobs.\r\n"] +[33.751697, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] +[33.839059, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\r\n\u001b[38;2;255;153;102mvoidpin\u001b[0m \u001b[90mHEAD\u001b[1;32m(153edb1)\u001b[0m \u001b[38;2;255;153;102m \u001b[0mis \u001b[1;38;5;208m📦 v0.0.1\u001b[0m \u001b[1;31mrs \u001b[0mwith \u001b[1;34m🐃 v1.49.0 \u001b[0m\r\n\u001b[1;34m✦\u001b[0m \u001b[38;2;255;153;102m❯\u001b[0m \u001b[K"] +[33.840399, "o", "\u001b[6 q"] +[33.841412, "o", "\u001b[6 q"] +[33.84158, "o", "\u001b[?2004h"] +[39.131276, "o", "\u001b[?2004l\r\r\n"] +[39.13278, "o", "zsh: warning: 1 jobs SIGHUPed\r\n"] +[39.13415, "o", "[1] + hangup voidpin listen\r\n"] diff --git a/assets/demo.gif b/assets/demo.gif new file mode 100644 index 0000000..b68ddd3 Binary files /dev/null and b/assets/demo.gif differ