Coder Social home page Coder Social logo

mouseless's People

Contributors

arijanj avatar czhang03 avatar jbensmann avatar junaruga avatar thuantanphamfilms avatar tsu-gu avatar vilcans avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

mouseless's Issues

How can we use mouseless with kmonad?

I am already using kmonad, but I want to know if i can use both kmonad and mouseless together.

Using debug mode I can see error "Failed to open /dev/input/by-id/usb-CHESEN_USB_Keyboard-event-kbd: device or resource busy". I guess it is because kmonad is already using it. Any fix for this?

failed to run without root privileges

I have tried to add udev rule:

echo "KERNEL==\"uinput\", GROUP=\"$USER\", MODE:=\"0660\"
KERNEL==\"event*\", GROUP=\"$USER\", NAME=\"input/%k\", MODE=\"660\"" \
| sudo tee /etc/udev/rules.d/99-$USER.rules

and add my username into input group:

sudo usermod -aG input $USER

However mouseless still failed to launch with below message:

ERRO[0000] Failed to init the virtual mouse: could not create relative axis input device: could not open device file
ERRO[0000] Exiting

my system details:

Operating System: Arch Linux
KDE Plasma Version: 5.27.5
KDE Frameworks Version: 5.106.0
Qt Version: 5.15.9
Kernel Version: 6.3.5-arch1-1 (64-bit)
Graphics Platform: X11
Processors: 8 × Intel® Core™ i7-3770 CPU @ 3.40GHz
Memory: 15.5 GiB of RAM
Graphics Processor: Mesa Intel® HD Graphics 4000
Manufacturer: Intel
Product Name: B75A

A setting to type an origial key if another key is not pressed after hold the key?

Thank you for this amazing tool! I really enjoy it.

This issue ticket is just for a question or a suggestion for a new feature. I am experimenting with the following setting.

layers:
- name: base
  bindings:
    ...
    j: tap-hold j ; rightshift ; 300
    ...

When the "j" key is pressed longer than 300 ms, but any other keys are pressed after the "j" key, I want to type "j". Is there a way to do it?

I also tried another setting j: tap-hold-next j ; rightshift ; 300 too. I don't understand the difference in the behaviors tap-hold and tap-hold-next in this case.

Failed to read the config file: failed to parse layer 2 : failed to parse the key '_': neither an integer nor a key alias

When running sudo mouseless -d --config ~/.config/mouseless/config.yaml the output is the following:

DEBU[0000] Using config file: /home/arcus/.config/mouseless/config.yaml
ERRO[0000] Failed to read the config file: failed to parse layer 2 : failed to parse the key '_': neither an integer nor a key alias
ERRO[0000] Exiting

My system is arch very minimal, i may not have a package needed to run the binary.
Yes, the binary is in the path, the config file is correctly written

The last line seems to be the problem ( _: rightalt+_ ) idk why, but by commenting that the program seems to run 'correctly'

Missing uinput / faq

Not an issue, but if you don't have /dev/uinput, do "sudo modprobe uinput" and it does the trick

I thought this would help someone if they didn't have /dev/uinput

Start as sudo when on system start

Is there a way to start mouseless on system start without allowing the current user to read keyboard input?

I think allowing user to read keyboard input seems dangerous, since that enables the possiblity of keyloggers. However I do aware that Windows allow user to read keyboard input without elevated previlages. But it seems more secure to only allow elevated program to read keyboard input.

I understand this is not necessarily related to mouseless, but I was wondering if anyone can help me here. And if we were able to find a simple way, maybe we can add it to the readme so that others can use this setup as well.

Here is what I have tried, apparently most people thinkg systemtcl is the modern way to do this. So I created the following file
/etc/systemd/system/mouseless-daemon.service:

[Unit]
Description=Mouseless

[Service]
ExecStartPre=chmod +x /usr/local/bin/mouseless
ExecStart=/usr/local/bin/mouseless --config /usr/local/share/config/config.yaml

[Install]
WantedBy=multi-user.target

However I keep getting the following error in systemctl status mouseless-daemon.service

× mouseless-daemon.service - Mouseless
     Loaded: loaded (/etc/systemd/system/mouseless-daemon.service; disabled; preset: disabled)
    Drop-In: /usr/lib/systemd/system/service.d
             └─10-timeout-abort.conf
     Active: failed (Result: exit-code) since Thu 2023-05-25 14:13:06 EDT; 17s ago
   Duration: 1ms
    Process: 7699 ExecStartPre=chmod +x /usr/local/bin/mouseless (code=exited, status=0/SUCCESS)
    Process: 7703 ExecStart=/usr/local/bin/mouseless --config /usr/local/share/config/config.yaml (code=exited, status=203/EXEC)
   Main PID: 7703 (code=exited, status=203/EXEC)
        CPU: 3ms

May 25 14:13:06 fedora systemd[1]: Starting mouseless-daemon.service - Mouseless...
May 25 14:13:06 fedora systemd[1]: Started mouseless-daemon.service - Mouseless.
May 25 14:13:06 fedora (ouseless)[7703]: mouseless-daemon.service: Failed to locate executable /usr/local/bin/mouseless: Permission denied
May 25 14:13:06 fedora (ouseless)[7703]: mouseless-daemon.service: Failed at step EXEC spawning /usr/local/bin/mouseless: Permission denied
May 25 14:13:06 fedora systemd[1]: mouseless-daemon.service: Main process exited, code=exited, status=203/EXEC
May 25 14:13:06 fedora systemd[1]: mouseless-daemon.service: Failed with result 'exit-code'.

When running /usr/local/bin/mouseless --config /usr/local/share/config/config.yaml as sudo works perfectly fine.

I was wondering if I can get any help with regard to this.

Binding `\`

Is it possible to bind the \ key? If so what is the text value for it, because \ and backslash don't work.

Map Caplock to Ctrl With ctrl+h, j, k, l` to Move Cursors

Hi, I am very sorry to post a personal setup issue in the issues, but I am at my wit's end here.

Presonally I use caplock as leftctrl, and use capslock+h, j, k, l to move my cursors.

The problem with that setup is that I think of a good setup to do this. Because caplock is performing two different functionality here, the first is toggling the arrows layer, and the second is to act as ctrl.

I have tried to use capslock: multi toggle-layer arrows; leftctrl, but this means if I press capslock+j it would send ctrl+down instead of down.

Is there any fix to let capslock+h, j, k, l to move my cursors and for everything else use caplock as leftctrl?

Tank you SO much!

Not an issue. Just wanted to say thanks! I've been addicted to trackpoints for many years now and all other keyboards are worthless to me. I've tried qmk-compatible keyboards but they are really tedious to configure. mouseless fixes these problems and I can now start playing with new keyboards :D!

ESC going to layer initian, even when I removed the key-combo from config file

Hi. I would like to make the escape key work as usual, while not exiting the mouse layer, but ESC is always going back to the initial layer whenever I press it.
This is my config file:

# the keyboard devices it reads from, if no devices are specified, it reads from all
devices:
  - "/dev/input/by-id/usb-LITEON_Technology_USB_Keyboard-event-kbd"
# - "/dev/input/by-id/SOME_KEYBOARD_REPLACE_ME-event-kbd"

# this is executed when mouseless starts, e.g. useful for setting the keyboard layout
# startCommand: "setxkbmap de"

# the default speed for mouse movement and scrolling
baseMouseSpeed: 750.0
baseScrollSpeed: 20.0

# the time it takes to accelerate to baseMouseSpeed (in ms), 0 to reach top speed immediately
mouseAccelerationTime: 200.0
# the shape of the acceleration curve, 1.0 is linear, higher values have more time at low speeds
mouseAccelerationCurve: 2.0
# speed of the mouse when it starts moving
startMouseSpeed: 0.0
# same for deceleration
mouseDecelerationTime: 300.0
mouseDecelerationCurve: 3.0

# the rest of the config defines the layers with their bindings
layers:
# the first layer is active at start
- name: initial
  bindings:
    # when tab is held and another key pressed, activate mouse layer
    # tab: tap-hold-next tab ; toggle-layer mouse ; 500
    numlock: tap-hold-next numlock ; toggle-layer mouse ; 500
    # when a is held for 300ms, activate mouse layer
    #a: tap-hold a ; toggle-layer mouse ; 300
    ## right alt key toggles arrows layer
    # rightalt: toggle-layer arrows
    ## switch escape with capslock
    # esc: capslock
    # capslock: esc
# a layer for mouse movement
- name: mouse
  # when true, keys that are not mapped keep their original meaning
  passThrough: true
  bindings:
    # quit mouse layer
    # q: layer initial
    
    z: layer initial
    # keep the mouse layer active
    space: layer mouse
    r: reload-config
    # l: move  1  0
    # j: move -1  0
    # k: move  0  1
    # i: move  0 -1
    d: move  1  0
    a: move -1  0
    s: move  0  1
    w: move  0 -1
    # p: scroll up
    # n: scroll down
    leftbrace: scroll up
    apostrophe: scroll down
    rightshift: speed 4.0
    # leftalt: speed 4.0
    # e: speed 0.3
    # w: speed 0.1
    rightctrl: speed 0.3
    compose: speed 0.1
    # capslock: speed 0.1
    # f: button left
    # d: button middle
    # s: button right
    semicolon: button left
    p: button middle
    rightbrace: button right
    # move to the top left corner
    k0: "exec xdotool mousemove 0 0"
# # another layer for arrows and some other keys
# - name: arrows
#   passThrough: false
#   bindings:
#     e: up
#     s: left
#     d: down
#     f: right
#     q: esc
#     w: backspace
#     r: delete
#     v: enter
#     # _ is the wildcard key, which matches any key that is not mapped
#     _: rightalt+_

Can't run without sudo command even with udev rule added

Hey, thanks for the cool program! I'm having troubles making mouseless run without sudo privileges. I ran the command on the readme, rebooted, and when trying to run mouseless it gave me this error.

ERRO[0000] Failed to init the virtual mouse: could not create relative axis input device: could not open device file

Then I tried to manually add the rules, this is the file. 99-seafoam.rules (user is seafoam)
KERNEL=="input", GROUP="seafoam", MODE:="0660" KERNEL=="event*", GROUP="seafoam", NAME="input/%k", MODE="660"
after rebooting, it kept giving me the same error as before. am I missing something?

Add LICENSE

This is a very trivial request. The reason is because I am packaging this for Nix and generally I need to reference a license to it.

Question regarding: mapping to Numpad Keys

I am trying to modify the config file so, I can use the numpad keys but, I don't know its names.

When I tried to use numbers like: 4, 6, 8, ...
It used the numbers row, not the numpad.

And I tried KP_num like:
KP_4
KP_2
But didn't work.

How can I find keys name of the numpd ?

Thanks in advance.
The tool is great!.

Fail to install mouseless

Hello,

Thanks for the repo. I was before using xmouseless, but with the upgrade of ubuntu to the 22.04 version, I had to rebuilt xmouseless but it did not worked anymore, so I am trying to make mouseless work.

I am quite a novice, and I am trying to figure out how to make mouseless working. I have found my keyboard in "/dev/input/by-path/platform-i8042-serio-0-event-kbd so that I replace this on the third line of the config.yaml file given in the configuration (only the third line has changed) :

devices:
# change this to a keyboard device
- "/dev/input/by-path/platform-i8042-serio-0-event-kbd"
# this is executed when mouseless starts
# startCommand: ""
# the default speed for mouse movement
baseMouseSpeed: 750.0
# the default speed for scrolling
baseScrollSpeed: 20.0
layers:
# the first layer is active at start
- name: initial
  bindings:
    # when tab is held and another key pressed, activate mouse layer
    tab: tap-hold-next tab ; toggle-layer mouse ; 500
    # when a is held for 300ms, activate mouse layer
    a: tap-hold a ; toggle-layer mouse ; 300
    # right alt key toggles arrows layer
    rightalt: toggle-layer arrows
    # switch escape with capslock
    esc: capslock
    capslock: esc
# a layer for mouse movement
- name: mouse
  # when true, keys that are not mapped keep their original meaning
  passThrough: true
  bindings:
    # quit mouse layer
    q: layer initial
    # keep the mouse layer active
    space: layer mouse
    r: reload-config
    l: move  1  0
    j: move -1  0
    k: move  0  1
    i: move  0 -1
    p: scroll up
    n: scroll down
    leftalt: speed 4.0
    e: speed 0.3
    capslock: speed 0.1
    f: button left
    d: button middle
    s: button right
    # move to the top left corner
    k0: "exec xdotool mousemove 0 0"
# another layer for arrows and some other keys
- name: arrows
  passThrough: true
  bindings:
    e: up
    s: left
    d: down
    f: right
    q: esc
    w: backspace
    r: delete
    v: enter

It is located in ~/.config/mouseless.

Since sudo mouseless --config ~/.config/mouseless/config.yaml is returning mouseless: command not found, I am guessing I have to install mouseless before, so that I ran ./mouseless when I am on the dist directory downloaded previsouly, but it is giving me the following error:

ERRO[0000] Failed to init the virtual mouse: could not create relative axis input device: could not open device file
Can anyone help me ?

Thanks for your help.

Pointer moves in fixed directions and with fixed set of speed

Following are the problems that i have faced using this software:

  • the pointer moves in only 8 fixed directions, if i had my target very close to me and somewhere between these 8 possible directions, there's no way for my pointer to reach there without juggling around a few times.
  • speed of the pointer is fixed i.e. can only take some discrete values and cannot be changed gradually, no matter how hard i try pressing the "e" key to slow it down as it approaches the target, i fail to press it at the right moment so that i may land exactly on my target, making it a bit finicky to use

I just love this software and the concept behind it but was facing these issues lately, i wanted it to be a complete replacement to my mouse. I understand that some of the issues cannot be mitigated easily because of how this software is designed, i just wanted to make sure if i am using it right or not. Was this able to replace your mouse in your setup?

I am using the default config [tried changing it as well but didn't help much]

Mouseless making my keys slower

i have set my keyboard to register key taps faster (xset r rate 250 35), but when i run mouseless, it gets reverted back to the default slower speed. Is there any way to fix this? Thanks :)

Possible to use XF86Back or something similar

I have setup some control for going foward/back in my browser, but often use different browsers means that it only works on one and not both.

Getting "Back" or "XF86Back" would solve that. I have tried both and also "button back" but none of then are recognised by mouseless.

Question regarding mouse layer activation

I am new to mouseless and am using the default config in the readme file. When I am holding down the tab key for example and press the mouse layer keys the mouse moves as expected.

However, if I hold a, for example, and try to use those same keys the mouse layer never "toggles" on.

My question is what would the syntax be for me to bind a key, for example "capslock", so when I press that key it turns the mouse layer on and if I press it again "toggles" it off? If there is a another key that is a simpler example then capslock no worries just curious.

Thanks in advance as holding down tab isn't the easiest with some key presses :) .

Unexpected acceleration on diagonal movement

When moving the mouse pointer diagonally, e.g. with speed 1 to the right and 1 upwards, the total speed is not sqrt(2) as expected, but somewhat higher, so that the speed to the right is actually also higher than 1. At least this is the case for relatively slow speeds.

The cause is that mouseless is producing the same events as a physical mouse, and the speed of the pointer usually is not linear to the speed of a mouse, one can see in this diagram how they are related (the different curves show different settings):
https://wayland.freedesktop.org/libinput/doc/latest/pointer-acceleration.html#ptraccel-linear

It is generally possible to make this relation linear by configuration, but unclear whether it can be done independently of the display server (e.g. Xorg or Wayland), which would be preferable.

Key-combo not working?

Perhaps I have misunderstood something about the key-combo syntax, but I had thought that i could activate a layer holding down multiple keys like this:

- name: initial
  bindings:
    leftmeta+leftalt: tap-hold-next leftmeta+leftalt; toggle-layer mouse ; 300

But I can't get that working. (Both leftmeta and leftalt work fine seperately)

config.yaml file not found

I have the config.yaml file in the right place saved. But I am still getting this error.

mouseless.service - mouseless
Loaded: loaded (/etc/systemd/system/mouseless.service; enabled; preset: enabled)
Active: failed (Result: exit-code) since Sun 2023-12-31 10:01:45 +06; 14s ago
Duration: 3ms
Process: 7412 ExecStart=/usr/local/bin/mouseless --config ~/.config/mouseless/config.yaml (code=exited, status=1/FAILURE)
Main PID: 7412 (code=exited, status=1/FAILURE)
CPU: 4ms

Dec 31 10:01:45 smabari-A520MH-3-0 systemd[1]: Started mouseless.service - mouseless.
Dec 31 10:01:45 smabari-A520MH-3-0 mouseless[7412]: time="2023-12-31T10:01:45+06:00" level=error msg="Failed to read the config file: open ~/.config/museless/config.yaml: no such file or directory"
Dec 31 10:01:45 smabari-A520MH-3-0 mouseless[7412]: time="2023-12-31T10:01:45+06:00" level=error msg=Exiting
Dec 31 10:01:45 smabari-A520MH-3-0 systemd[1]: mouseless.service: Main process exited, code=exited, status=1/FAILURE
Dec 31 10:01:45 smabari-A520MH-3-0 systemd[1]: mouseless.service: Failed with result 'exit-code'.
Screenshot from 2023-12-31 10-08-48

Enabling two keyboard at the same time

Hello,

Thanks for mouseless, it is great.

I am getting a new split keyboard and as a result, my OS see 2 differents keyboard for the split keyboard. Do you know if I can change something in the config.yaml file so that it takes both keyboards ? Something like

devices: 
- PATH/TO/KEYBOARD1
- PATH/TO/KEYBOARD2

Thanks :)

Mouse acceleration

The mouse cursor currently moves at a constant speed. The speed may be too slow for moving the cursor longer distances, and too fast to get the precision you need. It's possible to modify the speed if you bind the speed function to a modifier key, but that is not always so convenient to use.

I propose modifying the cursor's speed over time, so it accelerates in the direction you are pressing (a bit like Super Mario and other user-controlled objects in games).

I have a working implementation of this in a branch.
I'm going to play around with it for a while to feel if it can be improved. I'm considering retardation as well, so the cursor doesn't stop immediately when you release the key.

Can't run mouseless: "Device or resource busy"

Hi! First of all, thanks for your new program! I've been using (and proselytizing about) xmouseless for a while now, and am very happy with it. :)

At the same time, I've been wanting to switch to Wayland on KDE — since you announced on xmouless's issue list that you'd make a replacement that runs on Wayland, I've been enthusiastically waiting for it.

However, I wasn't able to run it.
Apparently, my system blocks the device from being used:

ls /dev/input/by-id/*kbd* ; ls /dev/input/by-path/*kbd* gives me:

/dev/input/by-id/usb-413c_Dell_KB216_Wired_Keyboard-event-kbd
/dev/input/by-path/pci-0000:0a:00.3-usb-0:4:1.0-event-kbd

which is linked/mapped to event3 (i.e. /dev/input/event3)

Either sudo lsof /dev/input/by-id/usb-413c_Dell_KB216_Wired_Keyboard-event-kbd or sudo lsof /dev/input/event3 gives me something like:

COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
systemd     1 root  105u   CHR  13,67      0t0  611 /dev/input/by-id/../event3
systemd-l 531 root   18u   CHR  13,67      0t0  611 /dev/input/by-id/../event3
systemd-l 531 root   28u   CHR  13,67      0t0  611 /dev/input/by-id/../event3
kwin_wayl 863  aug   32u   CHR  13,67      0t0  611 /dev/input/by-id/../event3

(the truncated commands should be kwin_wayland and systemd-logind, I think)
If I had to guess — but I don't really know about any of this — kwin_wayland would be the "culprit"?
EDIT: got the same problem on X11. So I've edited the issue title to not include "Wayland".

sudo lsof /dev/input/by-id/usb-413c_Dell_KB216_Wired_Keyboard-event-kbd
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
systemd-l  531 root   18u   CHR  13,67      0t0  611 /dev/input/by-id/../event3
Xorg      5695 root   36u   CHR  13,67      0t0  611 /dev/input/by-id/../event3

Here's the full output of mouseless with the --debug flag:

sudo mouseless --debug --config ~/.config/mouseless/config.yaml
[sudo] password for aug: 
DEBU[0000] Available keyboard devices:                  
DEBU[0000] /dev/input/by-path/pci-0000:0a:00.3-usb-0:4:1.0-event-kbd Dell KB216 Wired Keyboard usb-0000:0a:00.3-4/input0 
DEBU[0000] /dev/input/by-id/usb-413c_Dell_KB216_Wired_Keyboard-event-kbd Dell KB216 Wired Keyboard usb-0000:0a:00.3-4/input0 
DEBU[0000] Using config file: /home/aug/.config/mouseless/config.yaml 
DEBU[0000] config: {Devices:[/dev/input/by-id/usb-413c_Dell_KB216_Wired_Keyboard-event-kbd] StartCommand:setxkbmap en BaseMouseSpeed:750 BaseScrollSpeed:20 Layers:[0xc0000be2e0 0xc0000be3a0 0xc0000be5a0]} 
DEBU[0000] Switching to initial layer initial           
DEBU[0000] Executing start command: setxkbmap en        
DEBU[0000] opening the keyboard device /dev/input/by-path/pci-0000:0a:00.3-usb-0:4:1.0-event-kbd 
DEBU[0000] InputDevice /dev/input/by-path/pci-0000:0a:00.3-usb-0:4:1.0-event-kbd (fd 12)
  name Dell KB216 Wired Keyboard
  phys usb-0000:0a:00.3-4/input0
  bus 0x0003, vendor 0x413c, product 0x2113, version 0x0111
  events EV_SYN 0, EV_KEY 1, EV_MSC 4, EV_LED 17 
DEBU[0000] Device name: Dell KB216 Wired Keyboard       
DEBU[0000] Evdev protocol version: 65537                
DEBU[0000] Device info: bus 0x0003, vendor 0x413c, product 0x2113, version 0x0111 
DEBU[0000] opening the keyboard device /dev/input/by-id/usb-413c_Dell_KB216_Wired_Keyboard-event-kbd 
DEBU[0000] Failed to open /dev/input/by-id/usb-413c_Dell_KB216_Wired_Keyboard-event-kbd: device or resource busy 
ERRO[0000] Execution of start command failed: exit status 5 

My ~/.config/mouseless/config.yaml is the same as https://github.com/jbensmann/mouseless#configuration , except for the device line, of course:

line 1 devices:
line 2 # change this to a keyboard device
line 3 - "/dev/input/by-id/usb-413c_Dell_KB216_Wired_Keyboard-event-kbd"
line 4 # - "/dev/input/event3"
line 5 # - "/dev/input/by-path/pci-0000:0a:00.3-usb-0:4:1.0-event-kbd"
line 6 # this is executed when mouseless starts
line 7 startCommand: "setxkbmap en"

I tried switching between lines 3, 4 and 5 just in case, but the debug output is always the same:

DEBU[0000] Failed to open /dev/input/by-id/usb-413c_Dell_KB216_Wired_Keyboard-event-kbd: device or resource busy 
ERRO[0000] Execution of start command failed: exit status 5 

Finally, I also tried running without root privileges, but the debug message is the same as with sudo. My user is aug, so the file is /etc/udev/rules.d/99-aug.rules, with only this as content:

KERNEL=="uinput", GROUP="aug", MODE:="0660"    
KERNEL=="event*", GROUP="aug", NAME="input/%k", MODE="660"  

Please let me know if this is useful information, or the right place to send it.
Thanks!

I need vim functionality to save the position

I want to have a mode for remembering the cursor position (preferably three: horizontal, vertical and both) and a mode for restoring the position. Like the standard " m " and " ' " in vim. Your application turned out to be convenient for everyday use, but it took a relatively long time to aim the cursor at small panels or timeline videos.

I have 4*4 keys to teleport the cursor, as in keynav/keynavish/warpd, but this is too universal a solution. I would like to record positions on the fly without a hardcode.

Thanks, mouseless works stably and it is much better than keynav/keynavish/warpd/xmouseless. What an irony, I tried mouseless the last of such programs.

Three commands sequentially?

I was pleased that there is a meta action "multi", but I could not cover more than two actions (even by embedding one operator into another).

Thank you for getting rid of the mouse!

Toggle-layer from toggled layer?

See line 57. I noticed that "toggle-layer can only work if not already enabled. Being on a layer enabled with the "toggle-layer", we cannot use this function until we return to the previous layer.

config.txt

devices:
- "/dev/input/by-id/usb-Usb_KeyBoard_Usb_KeyBoard-event-kbd"
# this is executed when mouseless starts
# startCommand: ""
baseMouseSpeed: 375.0
baseScrollSpeed: 20.0

layers:
# I activate the mouse layer by pressing alt+,. Perhaps it would be easier to immediately map "alt+comma: ..." if there was an opportunity. However, i liked to use "intermediate" layers.
- name: initial
  passThrough: true
  bindings:
    leftalt: toggle-layer alt
    rightalt: toggle-layer alt
    leftmeta: multi leftmeta; toggle-layer meta
    rightmeta: multi rightmeta; toggle-layer meta
    leftctrl: multi leftctrl; toggle-layer block
    rightctrl: multi rightctrl; toggle-layer block
    leftshift: multi leftshift; toggle-layer block
    rightshift: multi rightshift; toggle-layer block

# This layer is used to block combinations when an "undesirable" modifier is pressed. I don't know whether it is worth using such an invention:
- name: block
  passThrough: true

# It may be used as a "block" layer, so I'll probably remove it:
- name: meta
  passThrough: true

# It will be used if it is possible to return after releasing the meta key:
- name: altmeta
  passThrough: true

- name: alt
  passThrough: false
  bindings:
    j: layer aim
    comma: layer mouse
    e: down
    w: up
    q: right
    r: left
    apostrophe: enter
    k: leftalt+k
    slash: multi leftalt; slash
    i: esc
    m: leftalt+m
    t: rightalt+t
    y: leftalt+y
    u: multi leftalt+u; layer active
    h: leftalt+h
    l: leftalt+l
    semicolon: leftalt+semicolon
    o: leftalt+o
    
    # !!!!!!! It is not possible to switch to the meta layer because the "alt" layer was called using "toggle-layer", not "layer". :(
    leftmeta: toggle-layer meta

- name: mouse
  passThrough: false
  bindings:
    leftalt: toggle-layer mouse-alt
    rightalt: toggle-layer mouse-alt
    m: layer save-mark
    apostrophe: layer goto-mark
    s: layer initial
    j: move -1  0
    k: move  0  1
    l: move  0 -1
    semicolon: move  1 0
    w: scroll up
    e: scroll down
    z: speed 4.0
    a: speed 0.20
    capslock: speed 0.1
    leftshift: speed 0.1
    f: button left
    d: button right
    r: button middle
    c: exec xdotool mousemove 480  270
    v: exec xdotool mousemove 1440 270
    x: exec xdotool mousemove 480  810
    z: exec xdotool mousemove 1440 810

- name: mouse-alt
  passThrough: false
  bindings:
    j: layer aim

- name: aim
  bindings:
    f:         multi layer mouse; exec xdotool mousemove 239  135
    d:         multi layer mouse; exec xdotool mousemove 719  135
    s:         multi layer mouse; exec xdotool mousemove 1199 135
    a:         multi layer mouse; exec xdotool mousemove 1679 135

    v:         multi layer mouse; exec xdotool mousemove 239  405
    c:         multi layer mouse; exec xdotool mousemove 719  405
    x:         multi layer mouse; exec xdotool mousemove 1199 405
    z:         multi layer mouse; exec xdotool mousemove 1679 405

    j:         multi layer mouse; exec xdotool mousemove 239  675
    k:         multi layer mouse; exec xdotool mousemove 719  675
    l:         multi layer mouse; exec xdotool mousemove 1199 675
    semicolon: multi layer mouse; exec xdotool mousemove 1679 675

    m:         multi layer mouse; exec xdotool mousemove 239  945
    comma:     multi layer mouse; exec xdotool mousemove 719  945
    dot:       multi layer mouse; exec xdotool mousemove 1199 945
    slash:     multi layer mouse; exec xdotool mousemove 1679 945

- name: advanced-mouse
  passThrough: true

- name: save-mark
  passThrough: false
  bindings:
    q:          multi exec /home/danil/.config/mouseless/save-mark.sh q; layer mouse
    w:          multi exec /home/danil/.config/mouseless/save-mark.sh w; layer mouse
    e:          multi exec /home/danil/.config/mouseless/save-mark.sh e; layer mouse
    r:          multi exec /home/danil/.config/mouseless/save-mark.sh r; layer mouse
    t:          multi exec /home/danil/.config/mouseless/save-mark.sh t; layer mouse
    y:          multi exec /home/danil/.config/mouseless/save-mark.sh y; layer mouse
    u:          multi exec /home/danil/.config/mouseless/save-mark.sh u; layer mouse
    i:          multi exec /home/danil/.config/mouseless/save-mark.sh i; layer mouse
    o:          multi exec /home/danil/.config/mouseless/save-mark.sh o; layer mouse
    p:          multi exec /home/danil/.config/mouseless/save-mark.sh p; layer mouse
    leftbrace:  multi exec /home/danil/.config/mouseless/save-mark.sh leftbrace; layer mouse
    rightbrace: multi exec /home/danil/.config/mouseless/save-mark.sh rightbrace; layer mouse
    a:          multi exec /home/danil/.config/mouseless/save-mark.sh a; layer mouse
    s:          multi exec /home/danil/.config/mouseless/save-mark.sh s; layer mouse
    d:          multi exec /home/danil/.config/mouseless/save-mark.sh d; layer mouse
    f:          multi exec /home/danil/.config/mouseless/save-mark.sh f; layer mouse
    g:          multi exec /home/danil/.config/mouseless/save-mark.sh g; layer mouse
    h:          multi exec /home/danil/.config/mouseless/save-mark.sh h; layer mouse
    j:          multi exec /home/danil/.config/mouseless/save-mark.sh j; layer mouse
    k:          multi exec /home/danil/.config/mouseless/save-mark.sh k; layer mouse
    l:          multi exec /home/danil/.config/mouseless/save-mark.sh l; layer mouse
    semicolon:  multi exec /home/danil/.config/mouseless/save-mark.sh semicolon; layer mouse
    apostrophe: multi exec /home/danil/.config/mouseless/save-mark.sh apostrophe; layer mouse
    backslash:  multi exec /home/danil/.config/mouseless/save-mark.sh backslash; layer mouse
    z:          multi exec /home/danil/.config/mouseless/save-mark.sh z; layer mouse; layer mouse
    x:          multi exec /home/danil/.config/mouseless/save-mark.sh x; layer mouse; layer mouse
    c:          multi exec /home/danil/.config/mouseless/save-mark.sh c; layer mouse; layer mouse
    v:          multi exec /home/danil/.config/mouseless/save-mark.sh v; layer mouse; layer mouse
    b:          multi exec /home/danil/.config/mouseless/save-mark.sh b; layer mouse; layer mouse
    n:          multi exec /home/danil/.config/mouseless/save-mark.sh n; layer mouse; layer mouse
    m:          multi exec /home/danil/.config/mouseless/save-mark.sh m; layer mouse; layer mouse
    comma:      multi exec /home/danil/.config/mouseless/save-mark.sh comma; layer mouse
    dot:        multi exec /home/danil/.config/mouseless/save-mark.sh dot; layer mouse
    slash:      multi exec /home/danil/.config/mouseless/save-mark.sh slash; layer mouse
    k1:         multi exec /home/danil/.config/mouseless/save-mark.sh k1; layer mouse
    k2:         multi exec /home/danil/.config/mouseless/save-mark.sh k2; layer mouse
    k3:         multi exec /home/danil/.config/mouseless/save-mark.sh k3; layer mouse
    k4:         multi exec /home/danil/.config/mouseless/save-mark.sh k4; layer mouse
    k5:         multi exec /home/danil/.config/mouseless/save-mark.sh k5; layer mouse
    k6:         multi exec /home/danil/.config/mouseless/save-mark.sh k6; layer mouse
    k7:         multi exec /home/danil/.config/mouseless/save-mark.sh k7; layer mouse
    k8:         multi exec /home/danil/.config/mouseless/save-mark.sh k8; layer mouse
    k9:         multi exec /home/danil/.config/mouseless/save-mark.sh k9; layer mouse
    k0:         multi exec /home/danil/.config/mouseless/save-mark.sh k0; layer mouse

    leftshift: toggle-layer shift-save-mark
    rightshift: toggle-layer shift-save-mark

- name: shift-save-mark
  bindings:
    q:          multi exec /home/danil/.config/mouseless/save-mark.sh Q; layer mouse
    w:          multi exec /home/danil/.config/mouseless/save-mark.sh W; layer mouse
    e:          multi exec /home/danil/.config/mouseless/save-mark.sh E; layer mouse
    r:          multi exec /home/danil/.config/mouseless/save-mark.sh R; layer mouse
    t:          multi exec /home/danil/.config/mouseless/save-mark.sh T; layer mouse
    y:          multi exec /home/danil/.config/mouseless/save-mark.sh Y; layer mouse
    u:          multi exec /home/danil/.config/mouseless/save-mark.sh U; layer mouse
    i:          multi exec /home/danil/.config/mouseless/save-mark.sh I; layer mouse
    o:          multi exec /home/danil/.config/mouseless/save-mark.sh O; layer mouse
    p:          multi exec /home/danil/.config/mouseless/save-mark.sh P; layer mouse
    leftbrace:  multi exec /home/danil/.config/mouseless/save-mark.sh leftcurlybrace; layer mouse
    rightbrace: multi exec /home/danil/.config/mouseless/save-mark.sh rightcurlybrace; layer mouse
    a:          multi exec /home/danil/.config/mouseless/save-mark.sh A; layer mouse
    s:          multi exec /home/danil/.config/mouseless/save-mark.sh S; layer mouse
    d:          multi exec /home/danil/.config/mouseless/save-mark.sh D; layer mouse
    f:          multi exec /home/danil/.config/mouseless/save-mark.sh F; layer mouse
    g:          multi exec /home/danil/.config/mouseless/save-mark.sh G; layer mouse
    h:          multi exec /home/danil/.config/mouseless/save-mark.sh H; layer mouse
    j:          multi exec /home/danil/.config/mouseless/save-mark.sh J; layer mouse
    k:          multi exec /home/danil/.config/mouseless/save-mark.sh K; layer mouse
    l:          multi exec /home/danil/.config/mouseless/save-mark.sh L; layer mouse
    semicolon:  multi exec /home/danil/.config/mouseless/save-mark.sh colon; layer mouse
    apostrophe: multi exec /home/danil/.config/mouseless/save-mark.sh doublequotes; layer mouse
    backslash:  multi exec /home/danil/.config/mouseless/save-mark.sh pipe; layer mouse
    z:          multi exec /home/danil/.config/mouseless/save-mark.sh Z; layer mouse; layer mouse
    x:          multi exec /home/danil/.config/mouseless/save-mark.sh X; layer mouse; layer mouse
    c:          multi exec /home/danil/.config/mouseless/save-mark.sh C; layer mouse; layer mouse
    v:          multi exec /home/danil/.config/mouseless/save-mark.sh V; layer mouse; layer mouse
    b:          multi exec /home/danil/.config/mouseless/save-mark.sh B; layer mouse; layer mouse
    n:          multi exec /home/danil/.config/mouseless/save-mark.sh N; layer mouse; layer mouse
    m:          multi exec /home/danil/.config/mouseless/save-mark.sh M; layer mouse; layer mouse
    comma:      multi exec /home/danil/.config/mouseless/save-mark.sh lessthan; layer mouse
    dot:        multi exec /home/danil/.config/mouseless/save-mark.sh greaterthan; layer mouse
    slash:      multi exec /home/danil/.config/mouseless/save-mark.sh questionmark; layer mouse
    k1:         multi exec /home/danil/.config/mouseless/save-mark.sh shift-k1; layer mouse
    k2:         multi exec /home/danil/.config/mouseless/save-mark.sh shift-k2; layer mouse
    k3:         multi exec /home/danil/.config/mouseless/save-mark.sh shift-k3; layer mouse
    k4:         multi exec /home/danil/.config/mouseless/save-mark.sh shift-k4; layer mouse
    k5:         multi exec /home/danil/.config/mouseless/save-mark.sh shift-k5; layer mouse
    k6:         multi exec /home/danil/.config/mouseless/save-mark.sh shift-k6; layer mouse
    k7:         multi exec /home/danil/.config/mouseless/save-mark.sh shift-k7; layer mouse
    k8:         multi exec /home/danil/.config/mouseless/save-mark.sh shift-k8; layer mouse
    k9:         multi exec /home/danil/.config/mouseless/save-mark.sh shift-k9; layer mouse
    k0:         multi exec /home/danil/.config/mouseless/save-mark.sh shift-k0; layer mouse

#---

- name: goto-mark
  passThrough: false
  bindings:
    q:          multi exec /home/danil/.config/mouseless/goto-mark.sh q; layer mouse
    w:          multi exec /home/danil/.config/mouseless/goto-mark.sh w; layer mouse
    e:          multi exec /home/danil/.config/mouseless/goto-mark.sh e; layer mouse
    r:          multi exec /home/danil/.config/mouseless/goto-mark.sh r; layer mouse
    t:          multi exec /home/danil/.config/mouseless/goto-mark.sh t; layer mouse
    y:          multi exec /home/danil/.config/mouseless/goto-mark.sh y; layer mouse
    u:          multi exec /home/danil/.config/mouseless/goto-mark.sh u; layer mouse
    i:          multi exec /home/danil/.config/mouseless/goto-mark.sh i; layer mouse
    o:          multi exec /home/danil/.config/mouseless/goto-mark.sh o; layer mouse
    p:          multi exec /home/danil/.config/mouseless/goto-mark.sh p; layer mouse
    leftbrace:  multi exec /home/danil/.config/mouseless/goto-mark.sh leftbrace; layer mouse
    rightbrace: multi exec /home/danil/.config/mouseless/goto-mark.sh rightbrace; layer mouse
    a:          multi exec /home/danil/.config/mouseless/goto-mark.sh a; layer mouse
    s:          multi exec /home/danil/.config/mouseless/goto-mark.sh s; layer mouse
    d:          multi exec /home/danil/.config/mouseless/goto-mark.sh d; layer mouse
    f:          multi exec /home/danil/.config/mouseless/goto-mark.sh f; layer mouse
    g:          multi exec /home/danil/.config/mouseless/goto-mark.sh g; layer mouse
    h:          multi exec /home/danil/.config/mouseless/goto-mark.sh h; layer mouse
    j:          multi exec /home/danil/.config/mouseless/goto-mark.sh j; layer mouse
    k:          multi exec /home/danil/.config/mouseless/goto-mark.sh k; layer mouse
    l:          multi exec /home/danil/.config/mouseless/goto-mark.sh l; layer mouse
    semicolon:  multi exec /home/danil/.config/mouseless/goto-mark.sh semicolon; layer mouse
    apostrophe: multi exec /home/danil/.config/mouseless/goto-mark.sh apostrophe; layer mouse
    backslash:  multi exec /home/danil/.config/mouseless/goto-mark.sh backslash; layer mouse
    z:          multi exec /home/danil/.config/mouseless/goto-mark.sh z; layer mouse; layer mouse
    x:          multi exec /home/danil/.config/mouseless/goto-mark.sh x; layer mouse; layer mouse
    c:          multi exec /home/danil/.config/mouseless/goto-mark.sh c; layer mouse; layer mouse
    v:          multi exec /home/danil/.config/mouseless/goto-mark.sh v; layer mouse; layer mouse
    b:          multi exec /home/danil/.config/mouseless/goto-mark.sh b; layer mouse; layer mouse
    n:          multi exec /home/danil/.config/mouseless/goto-mark.sh n; layer mouse; layer mouse
    m:          multi exec /home/danil/.config/mouseless/goto-mark.sh m; layer mouse; layer mouse
    comma:      multi exec /home/danil/.config/mouseless/goto-mark.sh comma; layer mouse
    dot:        multi exec /home/danil/.config/mouseless/goto-mark.sh dot; layer mouse
    slash:      multi exec /home/danil/.config/mouseless/goto-mark.sh slash; layer mouse
    k1:         multi exec /home/danil/.config/mouseless/goto-mark.sh k1; layer mouse
    k2:         multi exec /home/danil/.config/mouseless/goto-mark.sh k2; layer mouse
    k3:         multi exec /home/danil/.config/mouseless/goto-mark.sh k3; layer mouse
    k4:         multi exec /home/danil/.config/mouseless/goto-mark.sh k4; layer mouse
    k5:         multi exec /home/danil/.config/mouseless/goto-mark.sh k5; layer mouse
    k6:         multi exec /home/danil/.config/mouseless/goto-mark.sh k6; layer mouse
    k7:         multi exec /home/danil/.config/mouseless/goto-mark.sh k7; layer mouse
    k8:         multi exec /home/danil/.config/mouseless/goto-mark.sh k8; layer mouse
    k9:         multi exec /home/danil/.config/mouseless/goto-mark.sh k9; layer mouse
    k0:         multi exec /home/danil/.config/mouseless/goto-mark.sh k0; layer mouse

    leftshift: toggle-layer shift-goto-mark
    rightshift: toggle-layer shift-goto-mark

- name: shift-goto-mark
  passThrough: false
  bindings:
    q:          multi exec /home/danil/.config/mouseless/goto-mark.sh Q; layer mouse
    w:          multi exec /home/danil/.config/mouseless/goto-mark.sh W; layer mouse
    e:          multi exec /home/danil/.config/mouseless/goto-mark.sh E; layer mouse
    r:          multi exec /home/danil/.config/mouseless/goto-mark.sh R; layer mouse
    t:          multi exec /home/danil/.config/mouseless/goto-mark.sh T; layer mouse
    y:          multi exec /home/danil/.config/mouseless/goto-mark.sh Y; layer mouse
    u:          multi exec /home/danil/.config/mouseless/goto-mark.sh U; layer mouse
    i:          multi exec /home/danil/.config/mouseless/goto-mark.sh I; layer mouse
    o:          multi exec /home/danil/.config/mouseless/goto-mark.sh O; layer mouse
    p:          multi exec /home/danil/.config/mouseless/goto-mark.sh P; layer mouse
    leftbrace:  multi exec /home/danil/.config/mouseless/goto-mark.sh leftcurlybrace; layer mouse
    rightbrace: multi exec /home/danil/.config/mouseless/goto-mark.sh rightcurlybrace; layer mouse
    a:          multi exec /home/danil/.config/mouseless/goto-mark.sh A; layer mouse
    s:          multi exec /home/danil/.config/mouseless/goto-mark.sh S; layer mouse
    d:          multi exec /home/danil/.config/mouseless/goto-mark.sh D; layer mouse
    f:          multi exec /home/danil/.config/mouseless/goto-mark.sh F; layer mouse
    g:          multi exec /home/danil/.config/mouseless/goto-mark.sh G; layer mouse
    h:          multi exec /home/danil/.config/mouseless/goto-mark.sh H; layer mouse
    j:          multi exec /home/danil/.config/mouseless/goto-mark.sh J; layer mouse
    k:          multi exec /home/danil/.config/mouseless/goto-mark.sh K; layer mouse
    l:          multi exec /home/danil/.config/mouseless/goto-mark.sh L; layer mouse
    semicolon:  multi exec /home/danil/.config/mouseless/goto-mark.sh colon; layer mouse
    apostrophe: multi exec /home/danil/.config/mouseless/goto-mark.sh doublequotes; layer mouse
    backslash:  multi exec /home/danil/.config/mouseless/goto-mark.sh pipe; layer mouse
    z:          multi exec /home/danil/.config/mouseless/goto-mark.sh Z; layer mouse; layer mouse
    x:          multi exec /home/danil/.config/mouseless/goto-mark.sh X; layer mouse; layer mouse
    c:          multi exec /home/danil/.config/mouseless/goto-mark.sh C; layer mouse; layer mouse
    v:          multi exec /home/danil/.config/mouseless/goto-mark.sh V; layer mouse; layer mouse
    b:          multi exec /home/danil/.config/mouseless/goto-mark.sh B; layer mouse; layer mouse
    n:          multi exec /home/danil/.config/mouseless/goto-mark.sh N; layer mouse; layer mouse
    m:          multi exec /home/danil/.config/mouseless/goto-mark.sh M; layer mouse; layer mouse
    comma:      multi exec /home/danil/.config/mouseless/goto-mark.sh lessthan; layer mouse
    dot:        multi exec /home/danil/.config/mouseless/goto-mark.sh greaterthan; layer mouse
    slash:      multi exec /home/danil/.config/mouseless/goto-mark.sh questionmark; layer mouse
    k1:         multi exec /home/danil/.config/mouseless/goto-mark.sh shift-k1; layer mouse
    k2:         multi exec /home/danil/.config/mouseless/goto-mark.sh shift-k2; layer mouse
    k3:         multi exec /home/danil/.config/mouseless/goto-mark.sh shift-k3; layer mouse
    k4:         multi exec /home/danil/.config/mouseless/goto-mark.sh shift-k4; layer mouse
    k5:         multi exec /home/danil/.config/mouseless/goto-mark.sh shift-k5; layer mouse
    k6:         multi exec /home/danil/.config/mouseless/goto-mark.sh shift-k6; layer mouse
    k7:         multi exec /home/danil/.config/mouseless/goto-mark.sh shift-k7; layer mouse
    k8:         multi exec /home/danil/.config/mouseless/goto-mark.sh shift-k8; layer mouse
    k9:         multi exec /home/danil/.config/mouseless/goto-mark.sh shift-k9; layer mouse
    k0:         multi exec /home/danil/.config/mouseless/goto-mark.sh shift-k0; layer mouse

I liked that thanks to mouseless, alt is no longer sent to other programs. Such a side effect. But I use shortcuts in i3wm, so in some cases i still have to send alt (for example, in line 47 I launch the browser). When i3wm notises a known shortcut, it doesn't skip alt either, so everything is fine, and libre office calc doesn't bother me with focusing on the menu anymore. :)

Unfortunately, there are shortcuts of the type "meta+alt+a", which cannot be bound in mouseless yet. I want to be able to move from the alt and meta layers to the altmeta layer, after which I could release one of the keys and end up in one of the layers. After releasing the next key, we would turn on the initial layer (and not always standard named "initial").

The key release event would partially solve the problem, but it probably does not fit into the mouseless concept. An exit event from a layer enabled by "toggle-layer" would also partially solve the problem. However, I would like to entrust the layer management to mouseless.

Using numbers needs to be +1

I use the the config below and wanted to use 1-4 for navigating tabs in my browser. However, I wanted 1 to be back, but mouseless needs to be configured with 2 before the command is bound to 1. Therefore, the command bound to 5 is on 4 and 3 on 2. So, all the keys are +1.

# the default speed for mouse movement and scrolling
baseMouseSpeed: 750.0
baseScrollSpeed: 20.0

# the time it takes to accelerate to baseMouseSpeed (in ms), 0 to reach top speed immediately
mouseAccelerationTime: 200.0

# the shape of the acceleration curve, 1.0 is linear, higher values have more time at low speeds
mouseAccelerationCurve: 2.0

# speed of the mouse when it starts moving
startMouseSpeed: 0.0

# same for deceleration
mouseDecelerationTime: 300.0
mouseDecelerationCurve: 3.0

layers:
- name: initial
  bindings:
    leftalt: toggle-layer mouse

- name: mouse
  passThrough: false
  bindings:
    g: reload-config
    leftshift: button left
    capslock: button middle
    tab: button right
    d: move  1  0
    a: move -1  0
    s: move  0  1
    w: move  0 -1
    r: scroll up
    f: scroll down

# Qutebrowser   
    q: leftshift+h
    e: leftshift+l
    2: leftshift+k
    3: d
    4: u
    5: leftshift+j

Version not incremented

Running mouseless -v on the latest release's binary gets me 0.1.0. I'm not sure if this is just that that command wasn't updated properly or if the binary hasn't been updated?

Work With All Keyboard

Currently mouseless want you to specify which keyboard it can work with using the config file (the first item in sample config). Is it possible to make it work with all keyboard regardless of its id/path?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.