npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

practicode

v0.2.0

Published

Offline-first programming language lessons and coding practice in a Rust terminal UI.

Readme

Practicode

CI crates.io npm npm downloads GitHub stars License: MIT

Learn a programming language in 15 focused minutes a day—without leaving your terminal.

Practicode is an offline-first Rust TUI for developers moving between Python, TypeScript, Java, and Rust. It combines short, executable lessons, delayed review, a real local compiler/judge, and optional AI help. No account, streak, or telemetry is required.

Start In One Minute

npm install -g practicode
practicode

The npm launcher downloads the matching prebuilt binary, verifies its SHA-256 checksum, and caches it in your user directory. Rust is not needed for the npm install path.

Then choose Continue today's session and press Enter. Core lessons and progress work locally; network access is only needed for the first binary download, update checks, and AI features you explicitly invoke.

Why Practicode

  • A real daily loop: up to two due reviews, one new core lesson, one prediction, one executable exercise, and one transfer prompt.
  • Trustworthy practice: the curriculum CI compiles or runs 110 exercises against 337 deterministic cases and 54 semantic mutants.
  • Actual language differences: lessons explain runtime versus type checker, ownership versus borrowing, value versus identity, imports versus visibility, and other transfer traps.
  • Mastery that waits: successful core work moves through Practiced, Retained, and Mastered on a 1/3/7-day review schedule.
  • Fully local fundamentals: without invoking optional AI, progress, source code, submissions, lessons, and judging stay on your machine.
  • Responsive terminal UX: side-by-side panes on wide terminals, focused Lesson/Code/Result views on narrow terminals, keyboard and mouse support, dark and light themes.
  • Five-language curriculum and core loop: every lesson and the main learning flow are localized in English, Korean, Japanese, Simplified Chinese, and Spanish.
  • Optional AI, limited authority: Codex or Claude can explain and hint, but only deterministic judge results advance mastery.

The 15-Minute Session

| Step | What you do | What Practicode records | | --- | --- | --- | | Review | Recall the objective of up to two due lessons | Due order; attempts begin when the review exercise is judged | | Language delta | Compare this language with ones you already know | Nothing yet—reading is not mastery | | Predict | Pause and decide what the example or edge case will do | Nothing—this is a deliberate recall step | | Exercise | Edit the starter and run real local cases | Pass/failure kind and attempt count | | Reflect | Read the transfer trap after a passing run | Next 1/3/7-day review |

/progress shows a privacy-safe summary with no paths or submitted code. Labs remain optional; the 12-item core path in each language determines course completion.

Curriculum

| Language | Core path | Optional labs | Total | | --- | ---: | ---: | ---: | | Python 3.12 | 12 | 13 | 25 | | TypeScript 5.9 / Node 22 | 12 | 16 | 28 | | Java 21 | 12 | 16 | 28 | | Rust 2024 | 12 | 17 | 29 |

The courses are designed for experienced developers switching languages, not for memorizing isolated syntax. Every record includes a concept, worked example, common mistakes, self-checks, observable objective, language delta, prediction prompt, exercise, and transfer trap.

Controls

Press / outside the editor to open the command palette. The most useful controls are:

| Key or command | Action | | --- | --- | | F1 | Open contextual help | | F5 or /run | Compile/run and judge the current exercise | | F6 | Cycle Lesson/Code/Result in Learn or Problem/Code in Practice | | /next | Advance the guided step or open the next item | | /lesson | Open the complete lesson reference | | /progress | Show the shareable mastery summary | | /ask <question> | Ask optional AI about the current learning context | | /doctor | Check the installed language runtimes | | /home | Return to the Learn/Practice chooser |

See the command reference for practice mode, aliases, generation, and profile settings.

Language Runtimes

The Practicode binary is prebuilt, but local judging needs the runtime for the language you exercise:

  • Python: Python 3.12
  • TypeScript: Node.js 22 and tsc 5.9.3
  • Java: JDK 21 (javac and java)
  • Rust: stable Rust with the 2024 edition

Install only what you plan to study, then run /doctor inside Practicode.

brew install [email protected] node@22
npm install -g [email protected]
brew install --cask temurin@21
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
winget install -e --id Python.Python.3.12
winget install -e --id OpenJS.NodeJS.LTS
npm install -g [email protected]
winget install -e --id EclipseAdoptium.Temurin.21.JDK
winget install -e --id Rustlang.Rustup

Restart the terminal after installation.

Use your distribution packages or the vendors' repositories for Python 3.12, Node 22, and JDK 21, then install the pinned TypeScript checker and Rust:

npm install -g [email protected]
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

Official installers: Python, Node.js, Temurin, and Rust.

Verify the toolchain:

python3 --version
node --version
tsc --version
javac -version
rustc --version

Docker Sandbox

To get all four supported language toolchains and keep submissions out of normal host processes:

practicode --docker

The npm launcher builds a local image with Python 3.12, Node 22, TypeScript 5.9.3, JDK 21, and stable Rust. It runs without network access, drops Linux capabilities, uses a read-only root filesystem, limits CPU/memory/processes, mounts the current workspace read-only, and gives the container write access only to the Practicode data directory.

Docker is shared-kernel isolation, not a guarantee against every container escape. Check the image with:

practicode --docker --smoke

Other Install Paths

cargo install practicode
practicode
git clone https://github.com/baba9811/practicode.git
cd practicode
cargo run --

Prebuilt npm binaries support macOS Intel/Apple Silicon, Linux x64/arm64, and Windows x64. On another target, use Cargo or Docker.

Binary Cache And Offline Use

Every native npm launch revalidates the cached binary against its stored SHA-256 checksum. A failed or partial download is removed before execution.

| Platform | Default cache root | | --- | --- | | macOS | ~/Library/Caches/practicode/ | | Linux | $XDG_CACHE_HOME/practicode/ or ~/.cache/practicode/ | | Windows | %LOCALAPPDATA%\practicode\ |

Set PRACTICODE_CACHE_DIR to choose another cache. Once a version has been verified, it can launch offline from that version-and-platform-specific cache.

Update npm installs with:

npm update -g practicode

Practicode checks npm for newer versions in the background. Disable that check with PRACTICODE_NO_UPDATE_CHECK=1.

Local Data And Privacy

User data lives under ~/.practicode by default (%USERPROFILE%\.practicode on Windows):

| Path | Purpose | | --- | --- | | problem-state.json | Settings, history, and learning mastery | | problem_bank.json | Local, custom, and generated problems | | problem_notes.md | Optional generation preferences | | problems/ | Generated problem statements and indexes | | submissions/ | Your source files |

Set PRACTICODE_HOME=/another/path to relocate all user data.

/run executes local source as a normal child process unless Docker mode is active. When invoked, /ask and /hint send the current problem or lesson, submission code, latest result, and your question to the selected provider CLI. AI-backed /next and /generate run that CLI from PRACTICODE_HOME; they may read the local state, bank, notes, problem index, and submissions and may create or update generated problem files under the CLI's configured workspace-write/acceptEdits permissions. Custom ai_next_command programs inherit the access you give them. Review your provider and custom-command settings before enabling AI. Environment variables are scrubbed before judging, and hidden expected values are not printed in failure logs. See SECURITY.md.

Practice Mode

The second home option keeps classic stdin/stdout coding-test work beside the guided curriculum. It includes a local problem bank, gradual difficulty, exact-output judging, problem history, and optional AI generation. Learn mode and Practice mode share the editor and judge but keep their progress rules separate.

Contributing

The fastest contributions are a precise lesson correction, a reproducible terminal bug, or a focused accessibility improvement.

Run the full local gate with make test. Changed lesson content additionally requires executable cases, a refreshed content hash, and an independent agent review recorded in the lesson review manifest; a human reviewer is not required.

License

Practicode is MIT licensed. Third-party dependency notices are in THIRD_PARTY_LICENSES.md.