mirror of
https://github.com/Manoj-HV30/keystats.git
synced 2026-05-16 19:35:23 +00:00
Added readme.md
This commit is contained in:
@@ -0,0 +1,103 @@
|
|||||||
|
# keystats
|
||||||
|
|
||||||
|
> per-key keystroke counter that stores lifetime stats in SQLite and renders a live terminal heatmap with FTXUI
|
||||||
|
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Architecture
|
||||||
|
|
||||||
|
keystats is split into two binaries that communicate through a shared SQLite database:
|
||||||
|
```
|
||||||
|
keyboard input
|
||||||
|
└── /dev/input/eventX (Linux evdev)
|
||||||
|
└── keystroke (daemon)
|
||||||
|
└── ~/.keystroke_counts.db (SQLite)
|
||||||
|
└── keystroke-stats (viewer)
|
||||||
|
└── terminal heatmap (FTXUI)
|
||||||
|
```
|
||||||
|
|
||||||
|
**Daemon (`keystroke`)** runs silently as a systemd user service. It reads raw keyboard events directly from `/dev/input/` using Linux's evdev interface — the same layer the kernel uses to handle input devices. Every keydown event increments that key's count in memory and flushes it to a local SQLite database. No key sequences are ever stored — only counts.
|
||||||
|
|
||||||
|
**Viewer (`keystroke-stats`)** is a separate binary you run manually. It reads the SQLite database, renders a live color-coded keyboard heatmap using FTXUI, and refreshes every 200ms. Press `q` to quit.
|
||||||
|
|
||||||
|
The two binaries never talk to each other directly — SQLite is the only shared state between them.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Dependencies
|
||||||
|
|
||||||
|
**Arch**
|
||||||
|
```bash
|
||||||
|
sudo pacman -S gcc cmake sqlite
|
||||||
|
```
|
||||||
|
|
||||||
|
**Ubuntu / Debian**
|
||||||
|
```bash
|
||||||
|
sudo apt install g++ cmake libsqlite3-dev
|
||||||
|
```
|
||||||
|
|
||||||
|
**Fedora**
|
||||||
|
```bash
|
||||||
|
sudo dnf install gcc cmake sqlite-devel
|
||||||
|
```
|
||||||
|
|
||||||
|
> FTXUI is fetched automatically by CMake during build using FetchContent() — no manual installation needed.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Install
|
||||||
|
```bash
|
||||||
|
git clone https://github.com/Manoj-HV30/keystats
|
||||||
|
cd keystats
|
||||||
|
make
|
||||||
|
sudo make install
|
||||||
|
```
|
||||||
|
|
||||||
|
Then enable and start the daemon:
|
||||||
|
```bash
|
||||||
|
systemctl --user enable keystats
|
||||||
|
systemctl --user start keystats
|
||||||
|
```
|
||||||
|
|
||||||
|
> You will need to log out and back in after install for input group permissions to take effect.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
```bash
|
||||||
|
keystroke-stats
|
||||||
|
```
|
||||||
|
|
||||||
|
Press `q` to quit.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Data
|
||||||
|
|
||||||
|
Your keystroke database is stored at `~/.keystroke_counts.db` locally. It never leaves your machine. Also only key counts are stored — not sequences, not context, not timing.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Uninstall
|
||||||
|
```bash
|
||||||
|
sudo make uninstall
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## References
|
||||||
|
|
||||||
|
- [Linux Input Subsystem](https://www.kernel.org/doc/html/latest/input/input.html)
|
||||||
|
- [SQLite C API](https://www.sqlite.org/cintro.html)
|
||||||
|
- [SQLite Tutorial](https://www.sqlitetutorial.net)
|
||||||
|
- [FTXUI](https://github.com/ArthurSonzogni/FTXUI)
|
||||||
|
- [systemd.service](https://www.freedesktop.org/software/systemd/man/systemd.service.html)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
MIT
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 1.8 MiB |
@@ -181,7 +181,7 @@ Element renderStats(const std::vector<KeyStat>& stats, const std::vector<KeyStat
|
|||||||
});
|
});
|
||||||
|
|
||||||
return vbox({
|
return vbox({
|
||||||
text(" Keystroke Counter ") | bold | color(Color::Green) | hcenter,
|
text(" Keystats ") | bold | color(Color::Green) | hcenter,
|
||||||
separator(),
|
separator(),
|
||||||
vbox(rows) | hcenter,
|
vbox(rows) | hcenter,
|
||||||
legend | hcenter,
|
legend | hcenter,
|
||||||
|
|||||||
Reference in New Issue
Block a user