Run ~/.local/bin/cpp-tree --version. If that succeeds, add ~/.local/bin to your
PATH as described in the README. If you chose --bin-dir, use that directory.
Run type -a cpp-tree to find old aliases, functions, or copies that take priority.
This is intentional. Inspect the reported path. If it is your old standalone tracker, close it and rename it as described in the README. A pip/pipx install should be removed with that package manager before switching install methods. Do not force replacement of an executable you do not recognize.
Check python3 --version and python3 -c 'import curses, fcntl'. Use Python 3.10+
with those standard-library modules. A minimal/custom Python build may omit
curses. On Windows, run the app inside WSL; a native Windows Python install will
not supply the required Unix terminal/locking behavior.
Compare cpp-tree --state-path with the path used by your old script. A different
XDG_STATE_HOME, a different user account, or a missing custom --state argument
selects a different profile. The app does not automatically discover other saves.
Do not overwrite either profile while investigating.
Close the other instance using that profile, or use a different --state path.
Check that the directory is writable. An empty .lock file is normal and deleting
it while an instance is open can undermine locking; do not use deletion as a fix.
A crashed process releases its OS lock automatically.
The app leaves unreadable progress untouched. Close all instances first. These commands locate your default active profile, preserve the current file, and restore its previous-save backup with overwrite prompts:
state_path=$(cpp-tree --state-path)
cp -i -- "$state_path" "$state_path.before-restore"
cp -i -- "$state_path.bak" "$state_path"
cpp-tree --summaryFor a custom profile, include the same --state /path/to/progress.json in the
first and last commands. Check that the backup exists and contains the data you
want before copying. A .bak file contains only the preceding save; it is not a
history of all your changes.
Try cpp-tree --color 256 for a terminal that mishandles truecolor, or
cpp-tree --color truecolor if your terminal supports RGB but detection misses it.
For broken Unicode borders, use --ascii. A monospace font and a UTF-8 locale work
best. Emoji, double-width glyphs, and complex text shaping are not fully supported
by this one-character-per-cell renderer.
The minimum is 72 columns × 22 rows. Increase the window size or reduce terminal font size. Controls other than quit pause while the terminal is too small. At 118 columns the app can show the detail sidebar.
The app uses open on macOS, then xdg-open or gio on other systems, with Python's
webbrowser launcher as a fallback. Check your default browser. A headless or SSH
session may not have a desktop opener. In search, use Ctrl-O; ordinary o is
part of your search text. Live LearnCpp URLs may change; report a broken link.
Select the stream.txt next to the active profile. Start the interactive app to
create it; --demo, --summary, and --state-path do not write it. A pinned quest
continues to show until you pin a different lesson. Keep separate profiles in
separate directories to avoid sharing one stream file.
It hides note contents and controls, and prevents editing notes until stream view
is turned off. Progress, lesson titles, the existence of attached notes, and some
status messages remain visible. It does not hide other windows, protect local
files, or prevent someone from pressing s to leave stream view.