Distraction-free DSA practice in your terminal
Project description
grindx
Distraction-free DSA practice in your terminal. Zero network footprint.
Why grindx?
- Zero network calls — everything runs locally, no tracking (optional AI review)
- Terminal-native — practice DSA without leaving your terminal or opening a browser
- Multiple sheets — Striver A2Z (316), Blind 75, NeetCode 150, Grind 75 built-in
- 5 languages — Python, Go, C++, Java, JavaScript — switch on the fly with
Ctrl+L - Progress tracking — solved/in-progress/not-started states, streaks, best times
- Bookmarks & filters — filter by difficulty (Easy/Medium/Hard) or bookmarked problems
Install
pip install grindx
Or with pipx (recommended for CLI tools):
pipx install grindx
Or run from source:
git clone https://github.com/xghostient/grindx.git
cd grindx
python3 -m venv .venv && source .venv/bin/activate
pip install -e .
grindx
Usage
grindx # CLI entry point
python -m grindx # or as a module
Navigation
| Key | Action |
|---|---|
↑ ↓ |
Navigate topics / problems |
← → |
Switch between topic and problem panes |
Enter |
Select topic or open problem |
Esc |
Go back |
q |
Quit |
Filters
| Key | Filter |
|---|---|
a |
All problems |
e |
Easy |
m |
Medium |
h |
Hard |
b |
Bookmarked |
s |
Stats dashboard |
Solve Screen
| Key | Action |
|---|---|
Ctrl+S |
Save code |
Ctrl+D |
Toggle solved |
Ctrl+E |
AI review |
Ctrl+L |
Cycle language (Python → Go → C++ → Java → JS) |
Ctrl+B |
Toggle bookmark |
Ctrl+T |
Pause / resume timer |
Ctrl+R |
Reset timer |
Ctrl+Shift+C |
Copy selection to clipboard |
Ctrl+Shift+V |
Paste from clipboard |
Alt+↑ / Alt+↓ |
Move line up / down |
Alt+Shift+↓ |
Duplicate line |
Esc |
Save & go back |
Features
Split-pane editor — problem description on the left, code editor with syntax highlighting on the right.
Auto-timer — starts when you open a problem, tracks your best solve time.
Three-state tracking — each problem shows as not started (○), in progress (◐), or solved (✓).
Stats dashboard — overall progress, per-difficulty breakdown, per-topic progress bars, current streak, and top 10 best times.
Sheet-agnostic — built-in sheets live inside the package (grindx/sheets/). Format:
{
"Topic Name": ["problem-name-1", "problem-name-2"],
"Another Topic": ["problem-name-3"]
}
Progress safety — automatic backups with corruption recovery. Progress, solutions, and backups are stored in ~/.grindx/ so they persist across installs and upgrades.
AI Review (optional)
Press Ctrl+E on the solve screen to get AI-powered feedback on your solution — correctness, edge cases, complexity analysis, and a pass/fail verdict.
Setup
Set two environment variables:
export GRINDX_AI_PROVIDER=groq # or ollama, anthropic, openai
export GRINDX_AI_MODEL=llama-3.3-70b-versatile # optional, sensible defaults per provider
export GRINDX_AI_KEY=gsk_... # not needed for ollama
export GRINDX_AI_URL=https://custom.api/v1 # optional, auto-detected per provider
Or create ~/.grindx.toml:
[ai]
provider = "groq"
model = "llama-3.3-70b-versatile"
api_key = "gsk_..."
Supported Providers
| Provider | API Key | Default Model | Notes |
|---|---|---|---|
ollama |
No | llama3 | Local, free, no network |
groq |
Yes | llama-3.3-70b-versatile | Fast, free tier available |
anthropic |
Yes | claude-sonnet-4-20250514 | Claude |
openai |
Yes | gpt-4o | GPT |
Any OpenAI-compatible API works — set provider to openai and add base_url.
Built with
- Textual — TUI framework
- tree-sitter — syntax highlighting
License
MIT
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file grindx-0.2.0.tar.gz.
File metadata
- Download URL: grindx-0.2.0.tar.gz
- Upload date:
- Size: 120.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a779d5cad116423303d709a6e89d32a3fafd526d6e2f5527ac14eaeddaf0f3c4
|
|
| MD5 |
d3e66a9a29139bdf4491dc663c9e0f0b
|
|
| BLAKE2b-256 |
179e6c2b593def056635369c93edb062c800664cc55747cd283bc7145a552c65
|
Provenance
The following attestation bundles were made for grindx-0.2.0.tar.gz:
Publisher:
publish.yml on xghostient/grindx
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
grindx-0.2.0.tar.gz -
Subject digest:
a779d5cad116423303d709a6e89d32a3fafd526d6e2f5527ac14eaeddaf0f3c4 - Sigstore transparency entry: 1086839341
- Sigstore integration time:
-
Permalink:
xghostient/grindx@0b8cf75109dfebe2ab15dc2b0eaca521a45294c9 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/xghostient
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@0b8cf75109dfebe2ab15dc2b0eaca521a45294c9 -
Trigger Event:
push
-
Statement type:
File details
Details for the file grindx-0.2.0-py3-none-any.whl.
File metadata
- Download URL: grindx-0.2.0-py3-none-any.whl
- Upload date:
- Size: 137.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
613a8f524dc7a3499ecc422e5908fcf7991a2bf3f31018330a214d87859dc47b
|
|
| MD5 |
756a5b05ae830813580d70a0b5651a5a
|
|
| BLAKE2b-256 |
03fd511418a8b287f0d77c69ceb675b9485238ef9bf546d7ed13c2065f100d51
|
Provenance
The following attestation bundles were made for grindx-0.2.0-py3-none-any.whl:
Publisher:
publish.yml on xghostient/grindx
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
grindx-0.2.0-py3-none-any.whl -
Subject digest:
613a8f524dc7a3499ecc422e5908fcf7991a2bf3f31018330a214d87859dc47b - Sigstore transparency entry: 1086839399
- Sigstore integration time:
-
Permalink:
xghostient/grindx@0b8cf75109dfebe2ab15dc2b0eaca521a45294c9 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/xghostient
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@0b8cf75109dfebe2ab15dc2b0eaca521a45294c9 -
Trigger Event:
push
-
Statement type: