Skip to main content

Terminal spaced repetition for coding problems and reference solutions

Project description

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

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

recode_cli-0.1.0.tar.gz (188.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

recode_cli-0.1.0-py3-none-any.whl (381.3 kB view details)

Uploaded Python 3

File details

Details for the file recode_cli-0.1.0.tar.gz.

File metadata

  • Download URL: recode_cli-0.1.0.tar.gz
  • Upload date:
  • Size: 188.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for recode_cli-0.1.0.tar.gz
Algorithm Hash digest
SHA256 ca8c16f23bfc0cd7a29b0cb19d860988d2786fc1d2815f09ab962024e68004c9
MD5 8e9920d65b0dc801ff0ded1b02634aa4
BLAKE2b-256 d5ce3f76d940693caeed92c121128ad761507d2d3ead1f534750c0a9930b838b

See more details on using hashes here.

Provenance

The following attestation bundles were made for recode_cli-0.1.0.tar.gz:

Publisher: publish-pypi.yml on ever-oli/recode

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file recode_cli-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: recode_cli-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 381.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for recode_cli-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 03a4b08f16f3f138bfea79d9042411d1bbcd0c12e17a1c332b0245d9d6e9d5be
MD5 0fc208770aed0e3aabca9160f374640c
BLAKE2b-256 1e3f0a636b8fa7f934d07d86d672b8092b74cc2ed1514d33528e41672aa70139

See more details on using hashes here.

Provenance

The following attestation bundles were made for recode_cli-0.1.0-py3-none-any.whl:

Publisher: publish-pypi.yml on ever-oli/recode

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page