Kubuntu + CCO Setup Guide
Wipe Windows, install Linux, set up Claude Code + Obsidian from scratch
Complete walkthrough for wiping a Windows laptop and setting up Kubuntu 24.04 LTS with the Claude Code + Obsidian template. Written for people who have never touched Linux.
By the end of this guide you’ll have:
- Kubuntu โ a Linux desktop (KDE Plasma). Looks and feels like Windows but faster, no ads, no telemetry.
- Brave โ web browser. Chrome-compatible but blocks ads and trackers by default.
- Obsidian โ note-taking app that stores everything as plain text files on your disk.
- Claude Code โ AI assistant in the terminal that reads and writes your Obsidian notes directly. This is the core of the CCO system.
- 1Password โ password manager.
- Automated updates so you never think about maintenance.
Time estimate: 3โ4 hours. Budget an extra hour for surprises.
OS: Kubuntu 24.04 LTS (long-term support โ security updates until April 2029).
What You’ll Need
Before starting, have these ready:
- A Claude Pro or Max subscription ($20+ USD/month) from claude.ai โ Claude Code requires this
- A USB drive (8GB+) โ it will be wiped
- WiFi password written down (you won’t have a browser during the install)
- Your 1Password email and master password (or you’ll create an account during setup)
- A second device (phone/tablet) to read these instructions on while the laptop is being set up
Phase 0: Create the USB Installer
Do this on any working computer before touching the target laptop.
Download Kubuntu
- Go to kubuntu.org/getkubuntu/
- Download Kubuntu 24.04 LTS (the .iso file, ~4GB)
Create Bootable USB
On Windows:
- Download Rufus from rufus.ie
- Run Rufus
- Select your USB drive (double-check โ it will be wiped)
- Click “SELECT” and choose the .iso file
- Leave all other settings as default
- Click “START”
- If asked about “ISO mode” vs “DD mode”, choose ISO mode
- Wait ~5 minutes
On Mac:
- Download balenaEtcher from etcher.balena.io
- Select the .iso โ select the USB โ Flash
Phase 1: Install Kubuntu
This permanently erases everything on the laptop. Back up anything you care about first.
Boot from USB
- Plug the USB into the laptop
- Restart the laptop
- As it boots, repeatedly press the boot menu key:
- Lenovo: F12
- Dell: F12
- HP: F9 or Esc
- ASUS: F8 or Esc
- Acer: F12
- Toshiba: F12 or F2
- If unsure, try F2 or F12 โ or search “[your laptop brand] boot from USB”
- Select the USB drive from the menu
- If the USB doesn’t appear:
- Restart and enter BIOS/UEFI setup (usually F2 or Del)
- Find “Secure Boot” and Disable it
- Find “Boot Order” and move USB to the top
- Save and exit
Run the Installer
- Select “Install Kubuntu” (not “Try”)
- Language: English
- Keyboard: your preference
- Connect to WiFi when prompted
- Select “Normal installation” (includes LibreOffice, media player, etc.)
- Check “Download updates while installing”
- Check “Install third-party software for graphics and Wi-Fi”
- Partitioning: “Erase disk and install Kubuntu”
- Encryption (recommended): Check “Encrypt the new Kubuntu installation for security”
- Choose a strong passphrase โ 3+ random words (e.g. “correct horse battery”)
- Write this down and store it safely. If you forget it, your data is permanently gone. No recovery, by design.
- You’ll type this passphrase every time you turn on the laptop, before the login screen
- Set timezone to your location
- Create your user account:
- Your name: whatever you like
- Computer name: anything (e.g.
my-laptop) - Username: lowercase, no spaces (e.g.
alex) - Password: something you’ll remember
- Wait ~15โ20 minutes
- Click “Restart Now” when prompted
- Remove the USB when told to
First Boot
- If you set up encryption, enter your encryption passphrase
- Log in with your password
- Click through any setup wizard
- Connect to WiFi (click the network icon in the system tray, bottom-right)
- Open a terminal: click the application launcher (bottom-left, or press the Windows/Super key) and type “Konsole”, then press Enter
- Run this command to update everything:
sudo apt update && sudo apt full-upgrade -y
It will ask for your password. Nothing appears on screen as you type โ that’s normal Linux behaviour. Just type it and press Enter.
- If you see
linux-imagein the list of updates, reboot. This means a new Linux kernel was installed โ the kernel loads into memory at boot, so the update won’t take effect until you restart:
sudo reboot
Phase 2: Set Up the Software Stack
Open Konsole again. You’ll be copy-pasting commands from here.
Tip: To paste into Konsole, use Ctrl+Shift+V (not Ctrl+V).
Remove Snap
Snap is Ubuntu’s built-in app packaging. It’s slow, auto-updates aggressively, and duplicates functionality. We replace it with Flatpak.
# Remove all snap packages (retries as dependencies resolve)
for attempt in $(seq 1 10); do
snap list 2>/dev/null | tail -n +2 | awk '{print $1}' | \
xargs -I {} sudo snap remove --purge {} 2>/dev/null
snap list 2>/dev/null | grep -v "^Name" | grep -q . || break
done
# Remove snapd itself and prevent it from coming back
sudo apt remove --purge snapd -y
sudo apt-mark hold snapd
# Clean up leftover files
rm -rf ~/snap
sudo rm -rf /var/snap /var/lib/snapd
Install Core Packages
sudo apt install -y git curl wget build-essential htop neovim \
flatpak plasma-discover-backend-flatpak pipx
# Add Flathub (the main Flatpak app repository)
flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
Reboot now โ the Flatpak integration with KDE Discover needs a fresh session:
sudo reboot
Install Apps
Open Konsole again after reboot:
# Brave browser
flatpak install -y flathub com.brave.Browser
# Firefox (backup browser)
flatpak install -y flathub org.mozilla.firefox
# Obsidian (note-taking)
flatpak install -y flathub md.obsidian.Obsidian
# 1Password โ NOT on Flathub, uses its own repository
flatpak install -y https://downloads.1password.com/linux/flatpak/1Password.flatpakref
Each will ask you to confirm โ just press Enter or type Y.
Set up 1Password: Open 1Password from the application launcher (press the Super/Windows key and type “1Password”). Sign in with your 1Password account (or create one at 1password.com). Then in Brave, install the 1Password browser extension from the Chrome Web Store โ this lets you autofill passwords on websites. Store your encryption passphrase from Phase 1 here so you have a backup.
Install Node.js and Claude Code
Claude Code needs Node.js (a JavaScript runtime).
# Install Node.js 22.x LTS
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt install -y nodejs
# Verify
node --version # Should show v22.x.x
Important: Do NOT use sudo for the next commands. We set up a user-owned directory so Claude Code can auto-update itself without permission errors:
# Configure npm to use a user-owned global directory
mkdir -p ~/.npm-global
npm config set prefix '~/.npm-global'
echo 'export PATH=~/.npm-global/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
# Install Claude Code
npm install -g @anthropic-ai/claude-code
# Verify
claude --version
Why not
sudo npm install -g? It puts files in/usr/lib/node_modules/owned by root. Claude Code’s auto-updater runs as your user and can’t write there, so every launch throwsEACCES: permission denied. The~/.npm-globalprefix avoids this entirely.
Phase 3: Claude Code + Obsidian Setup
This is the actual system. ~/Files becomes both your Obsidian vault and Claude Code’s workspace.
Clone the Template
git clone https://github.com/OpenCairn/OpenCairn.git ~/Files
cd ~/Files
git remote rename origin template
chmod +x .claude/scripts/*.sh
This creates the NIPARAS folder structure in ~/Files:
~/Files/
โโโ 01 Now/ โ What you're working on right now
โโโ 02 Inbox/ โ Unsorted captures (also where browser downloads go)
โโโ 03 Projects/ โ Things with an end state ("Plan trip to Japan")
โโโ 04 Areas/ โ Ongoing life domains (Health, Finances, Career...)
โโโ 05 Resources/ โ Reference material
โโโ 06 Archive/ โ Completed/inactive stuff
โโโ 07 System/ โ Configuration and context files
โโโ CLAUDE.md โ The file that tells Claude who you are
Verify the slash commands are in place:
ls ~/Files/.claude/commands/
# Should show: park.md, pickup.md, morning.md, goodnight.md, etc.
Configure Environment
The template’s scripts need a VAULT_PATH variable so they know where your vault lives. Add it along with a convenience alias:
cat >> ~/.bashrc << 'BASHEOF'
# CCO: vault path (required by template scripts)
export VAULT_PATH="$HOME/Files"
# CCO: launch Claude Code from vault root
alias cc='cd ~/Files && claude'
BASHEOF
source ~/.bashrc
Now you can type cc from anywhere to launch Claude Code in your vault.
Remap XDG Directories
By default, Linux puts downloads in ~/Downloads. We redirect them into the NIPARAS folders:
# Create target directories (some may not exist yet)
mkdir -p ~/Files/"05 Resources/Pictures" ~/Files/"05 Resources/Videos" ~/Files/"05 Resources/Music"
mkdir -p ~/Files/"05 Resources/Templates" ~/Files/"05 Resources/Public"
cat > ~/.config/user-dirs.dirs << 'EOF'
XDG_DOWNLOAD_DIR="$HOME/Files/02 Inbox"
XDG_DOCUMENTS_DIR="$HOME/Files/04 Areas"
XDG_PICTURES_DIR="$HOME/Files/05 Resources/Pictures"
XDG_VIDEOS_DIR="$HOME/Files/05 Resources/Videos"
XDG_MUSIC_DIR="$HOME/Files/05 Resources/Music"
XDG_DESKTOP_DIR="$HOME/Desktop"
XDG_TEMPLATES_DIR="$HOME/Files/05 Resources/Templates"
XDG_PUBLICSHARE_DIR="$HOME/Files/05 Resources/Public"
EOF
xdg-user-dirs-update
# Remove the now-unused default directories (only removes if empty)
rmdir ~/Documents ~/Downloads ~/Music ~/Pictures ~/Public ~/Templates ~/Videos 2>/dev/null
First Claude Code Session
cd ~/Files
claude
Follow the authentication prompts โ it will open a browser window for you to sign in to your Anthropic account.
Once you’re in (you’ll see a > prompt), type:
Help me customise my CLAUDE.md with my personal context โ who I am, what I do, how I like to work.
Claude will interview you and fill in the template. This is how it learns about you across sessions.
When you’re done, type /park to save your session state, then /exit to quit.
Set Up Obsidian
- Open Obsidian (find it in the application launcher)
- Click “Open folder as vault”
- Navigate to
/home/yourusername/Filesand select it - You should see the NIPARAS folders (01 Now, 02 Inbox, etc.) in the sidebar
Linux home directories: Every user has a home directory at
/home/theirusernameโ equivalent toC:\Users\yourusernameon Windows. The shorthand~(tilde) always means your home directory, so~/Files=/home/yourusername/Files. You’ll see~used throughout this guide and in Linux documentation generally.
Configure Dolphin Sidebar
Replace the default Dolphin sidebar entries with the NIPARAS folders:
# Close Dolphin first if it's open, then write the sidebar config
cat > ~/.local/share/user-places.xbel << EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xbel>
<xbel xmlns:bookmark="http://www.freedesktop.org/standards/desktop-bookmarks"
xmlns:kdepriv="http://www.kde.org/kdepriv"
xmlns:mime="http://www.freedesktop.org/standards/shared-mime-info">
<info>
<metadata owner="http://www.kde.org">
<kde_places_version>4</kde_places_version>
</metadata>
</info>
<bookmark href="file://$HOME">
<title>Home</title>
<info>
<metadata owner="http://freedesktop.org">
<bookmark:icon name="user-home"/>
</metadata>
</info>
</bookmark>
<separator/>
<bookmark href="file://$HOME/Files/01%20Now">
<title>01 Now</title>
<info>
<metadata owner="http://freedesktop.org">
<bookmark:icon name="folder-red"/>
</metadata>
</info>
</bookmark>
<bookmark href="file://$HOME/Files/02%20Inbox">
<title>02 Inbox</title>
<info>
<metadata owner="http://freedesktop.org">
<bookmark:icon name="folder-download"/>
</metadata>
</info>
</bookmark>
<bookmark href="file://$HOME/Files/03%20Projects">
<title>03 Projects</title>
<info>
<metadata owner="http://freedesktop.org">
<bookmark:icon name="folder-activities"/>
</metadata>
</info>
</bookmark>
<bookmark href="file://$HOME/Files/04%20Areas">
<title>04 Areas</title>
<info>
<metadata owner="http://freedesktop.org">
<bookmark:icon name="folder-favorites"/>
</metadata>
</info>
</bookmark>
<bookmark href="file://$HOME/Files/05%20Resources">
<title>05 Resources</title>
<info>
<metadata owner="http://freedesktop.org">
<bookmark:icon name="folder-documents"/>
</metadata>
</info>
</bookmark>
<bookmark href="file://$HOME/Files/06%20Archive">
<title>06 Archive</title>
<info>
<metadata owner="http://freedesktop.org">
<bookmark:icon name="folder-tar"/>
</metadata>
</info>
</bookmark>
<bookmark href="file://$HOME/Files/07%20System">
<title>07 System</title>
<info>
<metadata owner="http://freedesktop.org">
<bookmark:icon name="folder-system"/>
</metadata>
</info>
</bookmark>
<separator/>
<bookmark href="trash:/">
<title>Trash</title>
<info>
<metadata owner="http://freedesktop.org">
<bookmark:icon name="user-trash"/>
</metadata>
</info>
</bookmark>
</xbel>
EOF
Open Dolphin to verify the sidebar shows the NIPARAS folders.
Phase 4: Backup Setup
Option A: Obsidian Sync (Recommended for Phone Access)
Cost: $4 USD/month. Syncs your notes to your phone automatically.
In Obsidian: Settings (gear icon) โ Core plugins โ Sync โ Enable
Settings โ Sync โ Subscribe
Create a remote vault, set an encryption password (store this in 1Password)
Critical โ set up exclusions. In Sync settings, add these to “Excluded folders”:
.git.claude
Wait for initial sync to complete
On your phone: install Obsidian โ connect to the same remote vault
Option B: No Sync
If the laptop is your only device, the disk encryption from Phase 1 is your main protection. You can always add backup later โ just ask Claude Code: “Help me set up restic backup to Backblaze B2.” See Automated Backups for the full guide.
Phase 5: Auto-Maintenance
These timers run daily in the background so you never think about updates.
Flatpak Auto-Updates
mkdir -p ~/.config/systemd/user
cat > ~/.config/systemd/user/flatpak-update.service << 'EOF'
[Unit]
Description=Update Flatpak apps
[Service]
Type=oneshot
ExecStart=/usr/bin/flatpak update -y --noninteractive
EOF
cat > ~/.config/systemd/user/flatpak-update.timer << 'EOF'
[Unit]
Description=Daily Flatpak update
[Timer]
OnCalendar=*-*-* 20:00:00
Persistent=true
[Install]
WantedBy=timers.target
EOF
systemctl --user daemon-reload
systemctl --user enable --now flatpak-update.timer
System Package Auto-Updates
sudo tee /etc/systemd/system/apt-full-upgrade.service << 'EOF'
[Unit]
Description=APT full upgrade
[Service]
Type=oneshot
ExecStart=/usr/bin/apt update
ExecStart=/usr/bin/apt full-upgrade -y
EOF
sudo tee /etc/systemd/system/apt-full-upgrade.timer << 'EOF'
[Unit]
Description=Daily APT upgrade
[Timer]
OnCalendar=*-*-* 20:00:00
Persistent=true
[Install]
WantedBy=timers.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now apt-full-upgrade.timer
Auto-Empty Trash
Deletes files in your trash older than 10 days:
pipx ensurepath
export PATH="$PATH:$HOME/.local/bin"
pipx install autotrash
autotrash --install -d 10
Phase 6: Verify Everything
Reboot one final time:
sudo reboot
Then check:
- Encryption passphrase works (if enabled)
- WiFi reconnects automatically
- Shutdown completes in under 30 seconds (if it hangs for 5+ minutes, see Hardware Notes)
- Brave opens and can browse
- Obsidian opens and shows your vault
- Claude Code starts โ type
ccin terminal - 1Password opens and you can log in
- Slash commands work โ try
/parkin Claude Code - Obsidian Sync shows changes on phone (if set up)
Daily Usage
The Core Loop
| When | What | Command |
|---|---|---|
| Start a session | See what’s active, pick up where you left off | /pickup |
| End a session | Save what you did, capture open loops | /park |
| Start of day | Surface priorities, build a plan | /morning |
| End of day | Inventory loops, queue tomorrow | /goodnight |
Quick Examples
Ask Claude anything with your full context loaded:
> I'm thinking about switching careers. What do I know about my goals?
> Help me plan a weekend trip to [destination]
> Draft a reply to [person] about [topic]
Manage your notes:
> /start-project Plan a Trip to Japan
> /inbox-processor
> /thinking-partner
Tips
ccfrom any terminal launches Claude Code in your vault- Claude reads your
CLAUDE.mdevery session โ keep it updated as your life changes /parkat the end of every session means you never lose context- Run
/updateoccasionally to pull the latest template improvements - See Claude Code Tips for more
If Something Goes Wrong
- Ask Claude Code. Type
cc, then describe the problem. It can troubleshoot most Linux issues directly. - WiFi won’t connect after install: Connect your phone via USB cable and enable “USB tethering” in your phone’s settings. Then ask Claude Code to troubleshoot WiFi.
- Forgot encryption passphrase: Data is unrecoverable. This is by design. Keep the passphrase in 1Password on your phone.
- Shutdown hangs for minutes: See Hardware Notes below.
Hardware Notes
After installation, check your WiFi chipset:
lspci | grep -i network
If you see MediaTek MT7925, the Bluetooth module causes a ~5 minute hang on shutdown. Fix:
echo -e "# Disable MT7925 Bluetooth to fix shutdown hang\nblacklist btmtk\nblacklist btusb" \
| sudo tee /etc/modprobe.d/disable-mt7925-bt.conf
sudo update-initramfs -u
This disables Bluetooth. If you need Bluetooth, you’ll have to live with slow shutdowns or use a USB Bluetooth adapter.
Optional: WezTerm Terminal
A GPU-accelerated terminal with better fonts and tab management than Konsole. Skip this if Konsole works fine for you.
# Add WezTerm repository
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://apt.fury.io/wez/gpg.key | sudo gpg --yes --dearmor -o /etc/apt/keyrings/wezterm-fury.gpg
echo 'deb [signed-by=/etc/apt/keyrings/wezterm-fury.gpg] https://apt.fury.io/wez/ * *' \
| sudo tee /etc/apt/sources.list.d/wezterm.list
# Install WezTerm and fonts
sudo apt update && sudo apt install -y wezterm fonts-jetbrains-mono fonts-noto
# Configure
mkdir -p ~/.config/wezterm
cat > ~/.config/wezterm/wezterm.lua << 'EOF'
local wezterm = require 'wezterm'
local config = {}
config.color_scheme = 'Catppuccin Mocha'
config.font = wezterm.font 'JetBrains Mono'
config.font_size = 12.0
config.scrollback_lines = 10000
config.enable_scroll_bar = false
config.keys = {
{ key = 't', mods = 'CTRL', action = wezterm.action.SpawnTab 'CurrentPaneDomain' },
{ key = 'w', mods = 'CTRL', action = wezterm.action.CloseCurrentTab { confirm = true } },
}
for i = 1, 9 do
table.insert(config.keys, { key = tostring(i), mods = 'CTRL', action = wezterm.action.ActivateTab(i - 1) })
end
return config
EOF
If the apt repository gives a 401 error, download the .deb directly from the WezTerm releases page.
Set as default terminal: System Settings โ Applications โ Default Applications โ Terminal emulator โ WezTerm
See the full WezTerm setup guide for more configuration options.
What’s Next
- Read the CCO introduction to understand the design philosophy
- Read Park and Pickup to understand how session continuity works
- Browse Claude Code Tips for workflow patterns and keyboard shortcuts