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

  1. Go to kubuntu.org/getkubuntu/
  2. Download Kubuntu 24.04 LTS (the .iso file, ~4GB)

Create Bootable USB

On Windows:

  1. Download Rufus from rufus.ie
  2. Run Rufus
  3. Select your USB drive (double-check โ€” it will be wiped)
  4. Click “SELECT” and choose the .iso file
  5. Leave all other settings as default
  6. Click “START”
  7. If asked about “ISO mode” vs “DD mode”, choose ISO mode
  8. Wait ~5 minutes

On Mac:

  1. Download balenaEtcher from etcher.balena.io
  2. 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

  1. Plug the USB into the laptop
  2. Restart the laptop
  3. 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”
  4. Select the USB drive from the menu
  5. 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

  1. Select “Install Kubuntu” (not “Try”)
  2. Language: English
  3. Keyboard: your preference
  4. Connect to WiFi when prompted
  5. Select “Normal installation” (includes LibreOffice, media player, etc.)
  6. Check “Download updates while installing”
  7. Check “Install third-party software for graphics and Wi-Fi”
  8. Partitioning: “Erase disk and install Kubuntu”
  9. 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
  10. Set timezone to your location
  11. 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
  12. Wait ~15โ€“20 minutes
  13. Click “Restart Now” when prompted
  14. Remove the USB when told to

First Boot

  1. If you set up encryption, enter your encryption passphrase
  2. Log in with your password
  3. Click through any setup wizard
  4. Connect to WiFi (click the network icon in the system tray, bottom-right)
  5. Open a terminal: click the application launcher (bottom-left, or press the Windows/Super key) and type “Konsole”, then press Enter
  6. 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.

  1. If you see linux-image in 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 throws EACCES: permission denied. The ~/.npm-global prefix 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

  1. Open Obsidian (find it in the application launcher)
  2. Click “Open folder as vault”
  3. Navigate to /home/yourusername/Files and select it
  4. 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 to C:\Users\yourusername on 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

Cost: $4 USD/month. Syncs your notes to your phone automatically.

  1. In Obsidian: Settings (gear icon) โ†’ Core plugins โ†’ Sync โ†’ Enable

  2. Settings โ†’ Sync โ†’ Subscribe

  3. Create a remote vault, set an encryption password (store this in 1Password)

  4. Critical โ€” set up exclusions. In Sync settings, add these to “Excluded folders”:

    • .git
    • .claude
  5. Wait for initial sync to complete

  6. 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 cc in terminal
  • 1Password opens and you can log in
  • Slash commands work โ€” try /park in Claude Code
  • Obsidian Sync shows changes on phone (if set up)

Daily Usage

The Core Loop

WhenWhatCommand
Start a sessionSee what’s active, pick up where you left off/pickup
End a sessionSave what you did, capture open loops/park
Start of daySurface priorities, build a plan/morning
End of dayInventory 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

  • cc from any terminal launches Claude Code in your vault
  • Claude reads your CLAUDE.md every session โ€” keep it updated as your life changes
  • /park at the end of every session means you never lose context
  • Run /update occasionally to pull the latest template improvements
  • See Claude Code Tips for more

If Something Goes Wrong

  1. Ask Claude Code. Type cc, then describe the problem. It can troubleshoot most Linux issues directly.
  2. 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.
  3. Forgot encryption passphrase: Data is unrecoverable. This is by design. Keep the passphrase in 1Password on your phone.
  4. 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