0/12

You're Not
Semiliterate

You've been having conversations with your computer for months.
You just didn't know the grammar yet.

~34 minutes · 12 sections · interactive · progress saved

↓ scroll to begin
01 · anatomy of a command · ~3 min

Every Command Is a Sentence

Verb. Object. Modifiers. That's it. You already parse these instinctively.

Click each part to understand it:

grep -r -i "TODO" ./src
← click any part above Each piece of a command has a role, like words in a sentence.

The Pattern

# Every command follows this shape:
command  --options  arguments

# Real examples you've seen:
ls -la ~/Desktop           # list · long format · this folder
git commit -m "fix bug"    # git · commit · message · "fix bug"
brew install bat            # brew · install · the program "bat"
The Double-Dash Convention
-l is a single-letter flag. --long is the full-word version. They usually do the same thing. -la is two flags smashed together: -l + -a.
02 · finding things · ~3 min

Grep ≠ Glob ≠ Find

This is the confusion that started it all. Three tools, three jobs, one truth table.

grep — search INSIDE files

"Find me every line that contains this text"

grep "function" app.js        # lines with "function" in app.js
grep -r "TODO" ./src          # search recursively in src/
grep -i "error" *.log        # case-insensitive in all .log files

Claude equivalent: Grep tool (uses ripgrep, faster)

glob patterns — match FILENAMES

"Find me files whose names match this pattern"

ls *.js                      # all .js files here
ls **/*.test.ts               # all .test.ts files, any depth
src/{components,hooks}/*.tsx  # .tsx in either folder

Claude equivalent: Glob tool (file pattern matching)

find — search by FILE PROPERTIES

"Find me files that match these conditions (size, date, type, name...)"

find . -name "*.pdf"         # all PDFs below here
find . -size +100M           # files bigger than 100MB
find . -mtime -7             # modified in last 7 days

Your upgrade: fd (simpler syntax, faster, respects .gitignore)

The Mental Model
grep = magnifying glass on content
glob = filter on names
find/fd = detective checking properties
03 · reading things · ~2 min

Five Ways to Look at a File

Because sometimes you need the whole book. Sometimes just the last page.

Command What it does When to use
cat Dumps entire file to screen Short files, piping content
head First N lines (default 10) Peek at structure, CSV headers
tail Last N lines Log files, recent entries
less Scrollable viewer (q to quit) Big files, browsing
wc Count lines/words/bytes How big is this thing?
cat config.json              # show it all
head -20 data.csv            # first 20 lines
tail -f server.log           # follow (live stream new lines)
wc -l *.py                   # count lines in all Python files
Your upgrade: bat
bat replaces cat with syntax highlighting, line numbers, and git integration. Same thing, prettier. You already have it installed.
Claude's Read tool
When Claude reads files, it uses a dedicated Read tool with line numbers and offset/limit. It's cat -n with superpowers — can read images, PDFs, notebooks too.
04 · pipes · ~4 min

The Killer Feature of Unix

One symbol that turns simple commands into a production line. The | connects the output of one command to the input of the next.

Pick a pipeline:
← select a pipeline to see it flow

Redirection: Pipes' Cousin

# > writes output to a file (overwrites)
echo "hello" > greeting.txt

# >> appends to a file
echo "world" >> greeting.txt

# < feeds a file as input
sort < names.txt

# 2> redirects errors only
find / -name "*.conf" 2> /dev/null   # hide permission errors
The Philosophy
Each command does one thing. Pipes compose them. grep finds, sort sorts, wc counts, head trims. Together they're a data pipeline. This is why Unix won.
05 · the filesystem · ~3 min

Everything Is a Path

Your computer is a tree. Every file has an address. Two kinds of address exist.

# Absolute path — starts from root (/), works everywhere
/Users/manossom/Documents/Manos/Υποθέσεις/

# Relative path — starts from where you ARE right now
./Υποθέσεις/ΣΩΜΑΡΑΚΗΣ_ΝΙΚΟΛΑΟΣ/          # ./ = current dir
../Desktop/                                # ../ = go up one level

Special Paths You Use Daily

SymbolMeansExample
~ Your home directory ~/Desktop/Users/manossom/Desktop
. Current directory ./script.sh → run script here
.. Parent directory cd .. → go up one level
/ Root of everything /usr/local/bin → where Homebrew lives
- Previous directory cd - → toggle back
Your upgrade: zoxide
You have zoxide installed. Instead of typing full paths:
z Υποθέσεις jumps to the most-used directory matching that name.
It learns from your cd habits. Frecency-based (frequency + recency).
06 · permissions · ~3 min

Who Can Do What

Every file has a lock with three slots. Click each character to decode it.

-rwxr-xr--
← click any character
# Three groups, three permissions each:
# [user/owner]  [group]  [others]
# r=read  w=write  x=execute  -=no

chmod 755 script.sh   # rwxr-xr-x (you: all, others: read+execute)
chmod 644 readme.md   # rw-r--r-- (you: read+write, others: read)
chmod +x script.sh   # add execute permission
The Practical Bit
You'll mostly encounter this when a script won't run: permission denied. Fix: chmod +x script.sh. The numeric system (755, 644) is worth knowing, not memorizing.
07 · your shell · ~3 min

zsh Is Your Operating Environment

The shell is the program that reads your commands. zsh is your dialect. It has settings, shortcuts, and a startup sequence.

Startup Files (in order)

# When you open a terminal, zsh reads these files in order:
~/.zshenv      # always runs first (environment variables)
~/.zprofile    # login shells only
~/.zshrc       # interactive shells (THIS IS YOUR MAIN CONFIG)
~/.zlogin      # after .zshrc, rarely used

Environment Variables

Named values that programs can read. Like global settings.

# See a variable
echo $HOME               # → /Users/manossom
echo $PATH               # → where your shell looks for programs

# Set one (current session only)
export MY_VAR="hello"

# Set permanently (add to ~/.zshrc)
export EDITOR="code"    # default editor for git, etc.

Aliases — Your Shortcuts

# In ~/.zshrc:
alias ll="eza -la --icons"          # pretty ls
alias gs="git status"               # less typing
alias brewup="brew update && brew upgrade"

# See all your aliases
alias                                 # lists everything
$PATH Demystified
$PATH is a list of directories separated by :. When you type bat, your shell checks each directory in PATH until it finds a program called bat. That's why brew install works — Homebrew puts programs in a PATH directory.

which bat → shows you exactly where it found the program.
08 · processes · ~2 min

Programs Running Right Now

Every command spawns a process. Processes have IDs, can be paused, resumed, or killed.

# See what's running
ps aux                    # all processes, detailed
ps aux | grep claude    # find a specific one

# Run in background
python3 server.py &     # & = run in background
jobs                       # list background jobs
fg %1                     # bring job 1 to foreground

# Ctrl+Z = pause current process
# bg = resume it in background

# Stop a process
kill 12345                # ask process 12345 to stop (SIGTERM)
kill -9 12345             # force-kill (SIGKILL) — last resort
pkill -f claude-monitor  # kill by name pattern
Your upgrade: btop
You have btop — a beautiful process monitor. Like Activity Monitor but in the terminal. Shows CPU, memory, disks, network. Press q to quit, k to kill a process, f to filter.
The 8GB Constraint
On your Air M1, memory is precious. Two Claude Code sessions is the safe max. pkill -f claude-monitor if things get tight. btop shows you who's eating RAM.
09 · git · ~4 min

Git: The Operations

Not the theory. Not the graph model. Just: what you actually do and why.

The flow of every git change:

working directory
You edit files. Git sees they're different from the last snapshot.
Your desk — papers scattered, work in progress.
git add .
Stage changes — tell git "these changes are ready for the next snapshot."
Putting papers in an envelope: "these are the ones I'm sending."
git commit -m "message"
Take the snapshot. Permanent record with a message.
Sealing the envelope with a label. It's in the archive now.
git push
Send your commits to a remote (GitHub). Others can now see them.
Mailing the envelope to the central office.
git pull
Fetch changes from remote + merge them into your code.
Checking your mailbox for envelopes from others.

The Commands You Actually Need

# Check state
git status                 # what's changed?
git diff                   # show the actual changes
git log --oneline -10    # last 10 commits, compact

# Save work
git add .                  # stage everything
git commit -m "msg"      # snapshot
git push                   # upload

# Branches
git branch                 # list branches
git checkout -b new-feat  # create + switch to new branch
git switch main           # switch to main (modern way)

# Undo
git stash                  # hide changes temporarily
git stash pop             # bring them back
git restore file.js       # discard changes to one file
Danger Zone
git reset --hard = delete uncommitted work. No undo.
git push --force = overwrite remote history. Can destroy others' work.
Claude will ask before doing either. You should too.
10 · your toolchain · ~3 min

The Modern CLI Stack

You already have these installed. Here's what each one replaces and why it's better.

🦎
eza
ls with colors, icons, git status, tree view
replaces: ls
🦇
bat
cat with syntax highlighting, line numbers, paging
replaces: cat, less
🔍
fd
find but simpler, faster, colorful, respects .gitignore
replaces: find
📂
zoxide
cd that learns your habits. Type partial names.
replaces: cd
🔭
fzf
Fuzzy finder. Search anything interactively.
enhances: everything
📊
btop
Beautiful process/system monitor. CPU, RAM, disk, net.
replaces: top, Activity Monitor
atuin
Shell history with search, sync, stats. Never lose a command.
replaces: Ctrl+R, history
starship
Prompt that shows git branch, errors, language versions.
replaces: default PS1 prompt

Cheat Sheet

# Instead of ls
eza -la --icons --git     # everything, beautifully
eza --tree -L2             # tree view, 2 levels deep

# Instead of find
fd "\.pdf$"                  # all PDFs (regex, not glob)
fd "config" -e json        # files named *config*.json

# Fuzzy everything
fzf                           # fuzzy-find files
cat file | fzf             # fuzzy-find within file content
Ctrl+R                        # atuin: fuzzy search history

# Smart cd
z Υποθ                       # jumps to Υποθέσεις (learned)
z dev                        # jumps to Development
11 · what does this do? · ~3 min

Final Quiz

Read the command. Pick what it does. No man pages needed — you know this now.

bonus · match game

Match the Tool to the Job

Click a command on the left, then its description on the right.

colophon

Built as an ISLA — Interactive Single-file Learning App

One file. Zero dependencies. Dark mode. Progress saved.
Made with Claude Code for a lawyer who called himself semiliterate.
He wasn't.

12 sections
4 interactions
50+ commands covered
↑ back to top