Skip to main content

Recode

A terminal-based spaced repetition tool for practicing any code from memory. Write implementations, compare against reference solutions with a side-by-side diff, get AI hints when stuck, and let the SM-2 algorithm schedule your reviews.

Menu screen


Features

  • Spaced repetition — SM-2 algorithm schedules reviews so you spend time on what you actually need to practice
  • Side-by-side diff — your attempt vs. the reference solution, line by line
  • AI hints — Socratic nudges that guide you without just giving away the answer
  • AI suggest fix — targeted bullet-point suggestions when you want more direct feedback
  • OpenCode chat modal — conversational help in-context while you study a problem
  • Agent-like chat tools — presets (/nudge, /test-me), TODO capture, diff split view, and /health
  • 158 themes — full terminal.sexy palette, switchable live from the command palette
  • Extensible — add any problem by dropping a .py, .jl, or .R file into your writable problems_dir

Screenshots

Problem list Diff view
Problem list with SM-2 schedule Side-by-side diff
Rating modal AI hint
SM-2 rating (Again / Hard / Good / Easy) AI Socratic hint

AI suggest fix AI suggest fix — targeted bullet-point suggestions


Requirements

  • Python 3.10+
  • uv (recommended), pipx, or pip
  • A Gemini or OpenRouter API key
  • OpenCode CLI on your PATH for in-app chat (auto-started by Recode)

Install

Homebrew

brew tap ever-oli/homebrew-tap
brew install ever-oli/homebrew-tap/recode

PyPI

uv tool install recode-cli
# or
pipx install recode-cli

Local dev

git clone https://github.com/ever-oli/recode.git
cd recode
uv sync
uv run python -m recode

Configuration

Recode reads environment variables from your shell, a local .env, or ~/.config/recode/.env. Use recode --paths to print the exact runtime directories for your machine.

On first run, Recode seeds its bundled problem set into your writable problems_dir so generated and imported problems live beside the defaults instead of inside the installed package.

Example .env:

# Option A — Google Gemini
GEMINI_API_KEY=your_gemini_api_key_here
AI_PROVIDER=gemini

# Option B — OpenRouter
OPENROUTER_API_KEY=your_openrouter_api_key_here
AI_PROVIDER=openrouter

# Optional: override the editor (default: hx)
EDITOR=nvim

# Optional: override runtime locations
# PROBLEMS_DIR=/path/to/your/problems
# DB_PATH=/path/to/recode.db

# Optional: OpenCode server URL for in-app chat modal
# OPENCODE_SERVER_URL=http://127.0.0.1:4096

# Optional: disable automatic `opencode serve` on first chat request
# OPENCODE_AUTOSTART=0

Run

Once installed:

recode

Useful non-interactive commands:

recode --version
recode --paths
recode --doctor

Chat modal behavior (OpenCode)

By default, pressing c in a problem will auto-start a local OpenCode server if it is not already running. The chat modal shows a live status line (connected, auto-started OpenCode, or offline). In chat, type /health to print OpenCode connection diagnostics. Use /help for chat commands and /clear to clear chat history in the modal. Chat also supports /hint, /fix, /todo ..., preset prompts, and /split (or Ctrl+D) to show diff + chat side by side.

If you prefer running it yourself (or disabled auto-start), start it manually:

opencode serve --port 4096

Usage

Key Action
Enter Open the selected problem
/ Focus search
c Change collection on the main menu
g Generate problems from an arXiv paper
i Import from Exercism or LeetCode
r Refresh the problem list
q / Ctrl+C Quit

Inside a problem:

Key Action
e Open the editor
s Submit and review
h Ask for a hint
f Ask for a suggested fix
c Open the in-problem chat modal
x Explain the solution or gap
q Return to the menu

Workflow

  1. Select a problem from the list and press Enter
  2. Press e to open your editor and write the implementation from memory
  3. Save and close the editor
  4. Recode shows a side-by-side diff of your attempt vs. the reference
  5. Use Hint or Suggest Fix if you need AI assistance
  6. Rate your recall (Again / Hard / Good / Easy)
  7. SM-2 schedules the next review automatically

Adding Problems

Problems are plain .py, .jl, or .R files. Drop them into the writable problems_dir from recode --paths and they will appear in the list on the next refresh (r). TensorPoly ships as a bundled collection and is copied into your writable problems directory on first run. The built-in importer currently supports Exercism Python and free LeetCode problems.

A problem file contains two things:

# The reference solution Recode compares against
SOLUTION = """
import numpy as np

def sigmoid(x):
    return 1 / (1 + np.exp(-x))
""".strip()

# The prompt shown in the problem list
DESCRIPTION = "Implement the sigmoid function using NumPy."

36 curated ML problems are included covering ResNet, Transformers, GANs, U-Net, ViT, and more.


License

MIT

Metadata

Release files for recode-cli 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for recode-cli 0.1.0
File Size Uploaded
recode_cli-0.1.0.tar.gz 188.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for recode-cli 0.1.0
File Interpreter ABI Platform
recode_cli-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 569.3 kB

Release files / recode_cli-0.1.0.tar.gz

Download URL recode_cli-0.1.0.tar.gz
Size 188.0 kB
Tags Source
SHA-256 checksum
How to use checksums
ca8c16f23bfc0cd7a29b0cb19d860988d2786fc1d2815f09ab962024e68004c9
BLAKE2b-256 checksum
How to use checksums
d5ce3f76d940693caeed92c121128ad761507d2d3ead1f534750c0a9930b838b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Apr 1, 2026.

Transparency log

Release files / recode_cli-0.1.0-py3-none-any.whl

Download URL recode_cli-0.1.0-py3-none-any.whl
Size 381.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
03a4b08f16f3f138bfea79d9042411d1bbcd0c12e17a1c332b0245d9d6e9d5be
BLAKE2b-256 checksum
How to use checksums
1e3f0a636b8fa7f934d07d86d672b8092b74cc2ed1514d33528e41672aa70139
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Apr 1, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page