practicode
Personal coding practice, right in your terminal.
practicode is a small Rust TUI for stdin/stdout practice: problem on the left, code on the right, judge loop in the same terminal.
Start
Prerequisites
- Node.js 18+ for npm installation.
- Rust and Cargo. The npm package builds the Rust binary during install, and also on first run if needed.
- A runtime for the language you practice in: Python, Node.js for TypeScript, JDK for Java, or Rust.
npm
Cargo
Local checkout
Daily Loop
The code editor starts focused.
write code
Esc, then /
choose /run
choose /next when it passes
Typing / outside the editor opens the command palette. Use up/down to move, Enter to run or complete the selected command, and Esc to cancel.
Submissions are saved as you type under submissions/<problem-id>/solution.<ext>.
Commands
| Command | Action |
|---|---|
/run |
Judge the current submission |
/code |
Return to the code editor |
/next |
Open the next local problem, or ask AI to create one |
/next easy string problem |
Ask AI for a custom next problem |
/back |
Go back through problem history |
/problems |
Browse problems with up/down or j/k, open with Enter |
/open 2 |
Open by number, id, or slug |
/answer |
Show the reference answer |
/hint |
Ask the selected AI for a concise hint |
/hint explain my bug |
Ask the selected AI about the current problem and submission |
/profile |
Show your current practice profile |
/difficulty auto |
Set difficulty preference: auto, easy, medium, hard |
/topics arrays, strings |
Set preferred topics for future problems |
/avoid dp, graph |
Set topics to avoid in future problems |
/provider codex |
Set AI provider and show local CLI/daemon status |
/model auto |
Use the provider default model for /hint and AI-backed /next |
/language python |
Set code language: python, ts, java, rust |
/ui en |
Set UI language: en, ko, ja, zh, es |
/theme dark |
Set theme: dark or light |
/update |
Show update instructions when a newer version is available |
/exit |
Quit |
Older command names such as /prev, /list, /giveup, and /lang still work as aliases.
The default UI language is English. Switch it any time with /ui ko, /ui ja, /ui zh, or /ui es.
Your practice profile is saved in .practicode/problem-state.json. It keeps UI language, code language, theme, preferred difficulty, preferred topics, and topics to avoid. auto difficulty follows gradual progression; a fixed difficulty asks local selection and AI generation to prefer that level.
AI Problems
/next <request> passes your request into the selected AI problem generator.
/next a slightly harder string problem
/next hashmap practice, easy
/next sorting problem, no graph yet
Codex is the default provider:
/provider codex
/model auto
Claude Code is also supported:
/provider claude
/model sonnet
Generated problems and submissions stay local:
| Path | Purpose |
|---|---|
.practicode/problem_bank.json |
Local/custom/generated problems |
.practicode/problem_notes.md |
Optional personal problem-generation notes |
.practicode/problem-state.json |
Current problem, history, settings |
problems/ |
Generated problem markdown/index files |
submissions/ |
Your answer files |
Those paths are ignored by git, so your practice history stays yours.
Update
The app checks for newer npm releases in the background and shows /update in the status line when one is available. Disable that check with PRACTICODE_NO_UPDATE_CHECK=1.
Safety
/run executes your local submission as a normal process. practicode runs it from .practicode/build/<problem-id>/run, but this is not an OS sandbox. Only run code you trust.
Contributing
External contributions use the fork and pull request flow in docs/CONTRIBUTING.md.
Maintainer-only review and release notes live in docs/MAINTAINING.md.
Code layout and extension boundaries live in docs/ARCHITECTURE.md.
License
practicode is MIT licensed. Third-party dependency license notes are in THIRD_PARTY_LICENSES.md.