System and Environment
Technical documentation of the host system and Claude Code setup.
Host System
| Property | Value |
|---|---|
| OS | Ubuntu 20.04.4 LTS (Focal Fossa) |
| Kernel | Linux 5.4.0-132-generic x86_64 |
| Hostname | vps-da425822 |
| Virtualization | KVM (VPS) |
| CPU | Intel Core (Haswell) - 1 core @ 2394 MHz |
| Memory | ~2 GB total |
| Disk | 39 GB |
User Environment
| Property | Value |
|---|---|
| User | ubuntu (UID 1000) |
| Shell | Zsh with Oh-My-Zsh (robbyrussell theme) |
| Editor | NeoVim (nvim) |
| Home | /home/ubuntu |
| Working Directory | /home/ubuntu/claude-workspace |
Claude Code Setup
| Component | Details |
|---|---|
| Claude Config | ~/.claude.json |
| Claude Directory | ~/.claude/ |
| Model | Claude Opus 4.5 (claude-opus-4-5-20251101) |
| Entrypoint | SDK CLI |
| Environment Flag | CLAUDECODE=1 |
MCP Servers:
- Obsidian (
stdio):npx @mauricio.wolff/mcp-obsidian@latest /home/ubuntu/claude-workspace - Google Calendar (
stdio): calendar-mcp — read/create calendar events - Google Tasks (
stdio): tasks-mcp — task management
Authentication: Claude Code authenticates via OAuth through claude.ai (not API key). Uses the Claude Max subscription for inference.
- Credentials stored in
~/.claude/.credentials.json - Login via
claude login(OAuth flow in browser) - No
ANTHROPIC_API_KEYneeded when using Max subscription
Claude Directory Structure:
~/.claude/
├── .credentials.json # OAuth tokens (claude.ai auth)
├── cache/ # Cached data
├── debug/ # Debug information
├── downloads/ # Downloaded files
├── history.jsonl # Session history
├── plans/ # Plan files
├── plugins/ # Marketplace plugins
├── projects/ # Project metadata
├── session-env/ # Session environment
├── shell-snapshots/ # Shell snapshots
├── todos/ # Todo management
└── stats-cache.json # Statistics
Development Tools
| Tool | Version | Location |
|---|---|---|
| Node.js | v20.20.0 | via NVM (~/.nvm) |
| npm | 10.8.2 | via NVM |
| Python | 3.8.10 | /usr/bin/python3 |
| Go | 1.21.6 | /usr/local/go |
| Ruby | system | /usr/bin/ruby |
| Git | 2.25.1 | system |
| Docker | installed | /usr/bin/docker |
| Podman | installed | containerized services |
PATH includes:
~/.nvm/versions/node/v20.20.0/bin~/go/bin/usr/local/go/bin~/.local/bin~/.fzf/bin
Running Services
| Service | Description |
|---|---|
| Takopi | Telegram bot interface for Claude |
| Claude CLI | Active session (~258 MB) |
| MCP Obsidian | Obsidian vault integration (~70 MB) |
| Webhook Server | /usr/bin/webhook -hooks ~/hooks.json |
| Powerline Daemon | Terminal prompt enhancement |
| Redis | Podman container (port 6379, password-protected) |
| Memezis | Application container |
| Memezis-bot | Bot service container |
Takopi
Telegram bot that provides Claude interface.
Source code: /home/ubuntu/takopi (editable install from GitHub)
Scripts:
~/start-takopi.sh— start with auto-restart loop~/stop-takopi.sh— stop bot and restart loop
Files:
~/.takopi/takopi.pid— PID file~/takopi.log— log file~/.takopi/takopi.toml— configuration
Development Setup
Takopi is installed in editable mode, so changes to /home/ubuntu/takopi take effect after restart:
# Edit source code
nvim ~/takopi/src/takopi/telegram/client_api.py
# Restart to apply changes
~/stop-takopi.sh && ~/start-takopi.sh &To update from upstream:
cd ~/takopi && git pull && ~/stop-takopi.sh && ~/start-takopi.sh &Custom Scripts
/home/ubuntu/bin/send-photo — Send photos to Telegram chat
# Single photo
send-photo /path/to/image.jpg "Caption text"
# Multiple photos (album)
send-photo photo1.jpg photo2.jpg --caption "Album caption"Uses Takopi’s bot token and sends to the configured chat.
Takopi Plugins
Location: /home/ubuntu/takopi-plugins/
Commands:
/publish— publish Quartz notes to web/restart— restart Takopi bot/health— bot health status
Files:
takopi_plugins/backend.py— publish commandtakopi_plugins/restart.py— restart commandtakopi_plugins/health.py— health commandpyproject.toml— package config
Installation:
uv tool install --force --reinstall ~/takopi --with ~/takopi-pluginsWhat /publish does:
- Analyzes changes (compares workspace with published content)
- Runs Claude agent to organize vault (update knowledge-index, fix links)
- Runs linting & formatting (up to 3 attempts):
ensure_frontmatter.py— adds/updatescreated,updated,titlemdformat— formats markdown consistentlymarkdownlint-cli2— validates markdown- If errors found → Claude agent fixes them → retry
- Syncs
/home/ubuntu/claude-workspace/→/home/ubuntu/quartz/content/ - Runs
npx quartz syncto push to GitHub - Waits for Cloudflare Pages deployment (checks API every 5s, timeout 120s)
- Returns URL + deployment status
See Vault Linting Setup for linting configuration details.
Key implementation details:
- Uses
RenderedMessagewithextra={"parse_mode": "Markdown"}for formatted output - Takopi’s
CommandResultdoes NOT support parse_mode — must usectx.executor.send()withRenderedMessagedirectly - Cloudflare API credentials:
CF_TOKEN,CF_ACCOUNT_ID,CF_PROJECT_NAME
Workspace Structure
/home/ubuntu/claude-workspace/
├── .claude/ # Local Claude config
├── .git/ # Git repository
├── .obsidian/ # Obsidian vault config
├── tech/ # Technical documentation (English)
├── profiles/ # User profiles
├── recipes/ # Food and recipes
├── ideas/ # Ideas and inspiration
├── incoming/ # Incoming files
├── CLAUDE.md # Main instructions
├── README.md # Project README
└── ... # Notes and documents
See also: Knowledge Index | Claude Instructions | Deployment Guide