Rung 1 (M1) — The Toolchain Trio¶
Nav: ← Portfolio README · Rung 2 → · Source: Phase 0
This is the fastest possible public signal that you have re-tooled after two years away from C++. Three tiny command-line utilities — wc, jsonpp, logtail — in one repo, all built with CMake, all with tests, all with a real README. Nothing clever. Nothing production-grade. Just a clean, boring, modern C++ repo that says: “I can set up a project.”
You will be tempted to skip this rung because it feels beneath you. Do not skip it. This rung exists so that when you push Rung 2 in M3, your GitHub already has commits, a real repo, and a shape. Employers who click your GitHub link see “actively writing C++ in 2026” — not an empty profile.
What It Is¶
A single public GitHub repo called cpp-refresh-2026 with three subdirectories, each a self-contained CMake target:
wc/— Word-count clone. Reads stdin or a file. Reports lines, words, bytes. Flags:-l,-w,-c. Handles UTF-8 without breaking (bytes vs. code points documented).jsonpp/— JSON pretty-printer. Reads stdin, emits pretty-printed JSON to stdout. Usesnlohmann/jsonas a dependency (fetched via CMakeFetchContent). Handles the pretty-print indent flag--indent N.logtail/— A tinytail -f-like filter with regex. Reads a file, follows appended lines, prints only lines matching a regex pattern. Flag:--pattern <regex>,--from-start.
Each subdirectory has its own main.cpp, its own tests, and its own binary. One top-level CMakeLists.txt orchestrates all three.
Why It Matters (Employer Signal)¶
One line: “This person can start a C++ project without asking for help.”
That sounds trivial. It is not. A meaningful fraction of C++ candidates cannot produce a public repo with CMake + tests + GitHub Actions CI + a working README on their own. If a hiring manager clicks your GitHub and sees this repo, they immediately conclude: setup friction is not going to slow this person down. That is a real signal. It is not the signal that gets you hired, but it is the signal that gets you past the first click.
Repo Organization Decision: One Repo, Three Subdirs¶
You have two options. Take the first one.
Option A (recommended): one repo, three subdirs. Faster to set up. Single CI pipeline. Single README that shows all three. Easier to iterate. This is your Rung 1.
Option B: three separate repos. More “professional”-looking on GitHub. Higher setup overhead. Splits your commit graph across three places. Do not do this at Rung 1. Save the one-repo-per-artifact pattern for Rungs 2–8.
The reason to bundle: Rung 1 is about velocity of shipping a first thing. Three repos triples the setup cost for zero additional signal.
Acceptance Checklist¶
Do not mark this rung done until every box is checked.
Repo is public on your GitHub, named
cpp-refresh-2026.Root
CMakeLists.txtbuilds all three binaries withcmake -S . -B build && cmake --build build.Requires C++20 (
set(CMAKE_CXX_STANDARD 20)). Compiles clean with-Wall -Wextra -Wpedantic -Werror.Each binary has at least 5 unit tests using Catch2 or GoogleTest (fetched via
FetchContent)..github/workflows/ci.ymlruns build + tests on Ubuntu latest with GCC and Clang.Top-level
README.mdhas the 5 sections listed below..clang-formatfile committed (Google or LLVM style is fine — pick one)..gitignorecoversbuild/,.DS_Store, IDE dirs.Each binary handles
--helpand prints usage.Repo shared on r/cpp_questions with a “just returning after 2 years” framing.
README Structure (5 Sections — Copy This)¶
Your top-level README must have exactly these five sections in this order. This is the minimum quality bar for every rung on this ladder from now on.
What this is — 2-3 sentences. What each of the three binaries does.
How to build — The exact
cmakecommands. Assume the reader has never built C++ before.How to run — One example command per binary, with expected output pasted.
Tests — How to run the test suite (
ctest --test-dir build). CI badge at the top.Notes — A short “why I built this” — explicitly frame as “returning to C++ after 2 years in ML”. This framing is the signal, not the code.
Common Ways This Rung Fails¶
You over-engineer
wcto handle every edge case. Stop. Handle ASCII correctly, document that multi-byte UTF-8 counts bytes not code points, and move on. Perfectionism at Rung 1 costs you Rung 2.You skip CI because “it’s just a small repo.” Then Rung 2 also has no CI, then Rung 5 also has no CI, and by Rung 8 you have never set up a matrix build. Do it now while stakes are low.
You bury the framing in the README. Reviewers on r/cpp_questions calibrate their feedback to your context — lead the Notes section with “returning after 2 years” so you get level-appropriate advice, not RTFM.
You wait to publish until “everything is clean.” Publish rough. Polish after. See the publication cadence rule in README.md.
What Most People Get Wrong¶
They treat Rung 1 as a throwaway warmup and skip the tests, CI, and clang-format. Then when they get to Rung 5 (concurrency) and want to run ThreadSanitizer under CI, they realize they have never set up CI at all, and now they are debugging YAML while trying to reason about lock-free code. Do the boring infra now. The reason Rung 1 is boring is because it is teaching you the infrastructure you will lean on for the next twelve months.
Extension Challenges (Only If M1 Has Slack)¶
These are for the case where you finish the base spec with a week to spare. Do not stretch at the cost of shipping the base.
Add a benchmark target using nanobench that times
wcagainst system/usr/bin/wcon a large file.Add a
--jobs Nflag tologtailthat parallelizes the regex match across N threads (bad idea for real logs, but a nice concurrency warmup).Add a GitHub Actions matrix that also runs on macOS with AppleClang.
Links to Source Phase Files¶
Engineering plan for these three tools:
../01_phase_0_refresh_and_toolchain/— look for the P0 project spec.Toolchain setup (CMake, clang-format, sanitizers):
../11_tools_setup/.If you are behind schedule:
../13_discipline/and../99_pre_mortem/.
Nav: ← Portfolio README · Rung 2 → · Source: Phase 0