May 12, 2026

What I worked on today

Heavy day of developer tooling. Three separate threads running in parallel: connecting Claude Code to local LLMs, building out a CI/CD pipeline, and continuing to fix the Discord notification hook for Claude Code.


Sessions

🤖 AI & LLM Tooling

LiteLLM + Claude Code — Got /v1/messages (Anthropic format) working through LiteLLM proxy with qwen3_8b and DeepSeek models. Key fix: need model aliases in config.yaml matching what Claude Code actually requests (claude-sonnet-4-20250514, etc.), plus enable_anthropic_pass_through: true. Still hitting cold-start timeouts (5s+ first token). → efforts/litellm-local-llm

Codex CLI — Explored as an alternative to Claude Code. Cheaper (~4x fewer tokens) but weaker for complex multi-file work. Can route through LiteLLM too. → reference/litellm-claude-code-setup

MCP server — Quick guide on building a FastMCP server in Python. → reference/mcp-server-fastmcp

⚙️ DevOps & Infrastructure

CI/CD (Django + Next.js) — Full pipeline designed: GitHub Actions, self-hosted runner on local server, Docker Compose multi-container deploy, blue-green for zero-downtime. → reference/cicd-django-nextjs

Tailscale — Still broken. ISP in Thailand blocking 192.200.0.0/24 (TLS handshake timeout to controlplane.tailscale.com). Alpine Docker setup is ready, just needs a working network path. → efforts/tailscale-docker-alpine

Ubuntu systemctl — Quick: sudo systemctl disable --now <service> to stop auto-start. → reference/systemctl-cheatsheet

🔧 Claude Code Discord Hook

Multiple sessions on this. Got it working, then fixed duration calculation bug (hook JSON has no start_time — must use transcript timestamps). New bug: duration spans full session history instead of just the last message. Still open. → efforts/pkm-daily-summary / reference/claude-code-discord-hook

📋 Productivity

Daily summary automation — Decided to use Cowork (this system) for automated end-of-day chat summarization. No code, no API key. This journal entry is the output. → efforts/pkm-daily-summary

Vuexy — Quick research: has Next.js 15 version (App Router + MUI v5 + Tailwind).


Open threads

  • Fix Discord hook: measure duration from last user message to now, not full transcript
  • Add model aliases in LiteLLM config for all Claude model names
  • Keep LLM warm before launching Claude Code (ping every 20s)
  • Test Tailscale on mobile hotspot to confirm ISP blocking
  • Regenerate Discord webhook URL (was exposed in chat)

Mood / reflection

Lots of config debugging today — LiteLLM, Tailscale, Docker. Progress on all fronts but nothing fully closed. The PKM daily summary workflow is the meta-win: this note was auto-generated from today’s Claude.ai conversations.


5 PM run — check-in (2026-05-12)

Second automated run of the day. 10 conversations checked — no new topics since the morning run. One conversation not captured in the first pass:

Auto-generating daily chat summaries (8:06–8:41 AM) — The meta-conversation where the decision to use Cowork was made. Explored n8n + Claude API, Python + cron + Gmail, Superpower for Claude browser extension, and Playwright automation before landing on Cowork as the simplest zero-code path. The scheduled task prompt was drafted in this conversation. → efforts/pkm-daily-summary


Evening run — check-in (2026-05-12)

Third automated run of the day (end-of-day). 10 conversations reviewed. New details surfaced compared to earlier passes:

LiteLLM + DeepSeek debugging — Specific issue: Claude Code configured to use deepseek-r1-distill-qwen-32B via LiteLLM, with correct settings.json fields (ANTHROPIC_BASE_URL, ANTHROPIC_AUTH_TOKEN, API_TIMEOUT_MS=3000000, CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=TRUE). curl to LiteLLM works but Claude Code still timeouts with “Retrying in 0s · attempt 1/10”. Root cause: likely the Responses API vs Chat Completions gap — LiteLLM must support /v1/responses endpoint for Claude Code, not just /v1/messages. Investigation ongoing. → efforts/litellm-local-llm

Vuexy Next.js frontend project — User wants to use Vuexy Next.js 15 (App Router + MUI v5 + Tailwind) as the base template for their app frontend, with Claude Code doing the customisation. Conversation started but cut off before specifics. New effort opened. → efforts/vuexy-nextjs-frontend

Created missing filesreference/systemctl-cheatsheet.md (referenced in morning journal but not yet created), efforts/vuexy-nextjs-frontend.md.

  • Investigate LiteLLM /v1/responses endpoint support for Claude Code compatibility
  • Define app requirements for Vuexy customisation (pick up that conversation)

End-of-day run (2026-05-12 — 17:00 Bangkok)

6 conversations today. New afternoon content captured in this pass:

🐳 Docker Dev Environment (CI/CD conversation — afternoon)

Deep dive into dev vs prod Docker Compose and the “coding on host” mental model. Key clarity: in dev, you edit files normally on your laptop in VS Code — volume mounts make the container see them instantly. Docker is just the runtime, not where you write code. Claude Code can drive all Docker commands (exec, migrate, logs) from the host while you focus on writing code. → reference/cicd-django-nextjs

🏗 Vuexy SaaS Frontend — Plan solidified (afternoon)

Worked through a 4-phase Claude Code plan to transform Vuexy Next.js into a custom SaaS app: (1) Audit & Map, (2) Branding/Theme, (3) Clean Demo Content, (4) SaaS Foundation Pages. Also made the monorepo decision: frontend/ + backend/ (Django Ninja) + docker-compose.yml in one repo, SQLite for dev / Postgres for prod. Good CLAUDE.md primer drafted for the project root. → efforts/vuexy-nextjs-frontend

🔔 Discord Hook — Still unresolved (1 AM Bangkok)

Latest attempt: measuring duration from last "type": "user" message to now. New issue: notification never fires at all. Suspected cause: the transcript type field may be "human" not "user". Needs one more debug pass with the raw jsonl file. → reference/claude-code-discord-hook

Open threads added

  • Dev Docker: test docker compose -f docker-compose.dev.yml up with volume mounts
  • Vuexy: run Phase 1 audit with Claude Code — paste prompt from conversation
  • Discord hook: check transcript jsonl — is type field “human” or “user”?
  • LiteLLM cold-start: implement 20s keepalive ping before launching claude

Final run — 2026-05-12 (end of day)

12 conversations reviewed. New material captured in this pass:

🔑 Claude Code — Auth Switching (NEW today)

Learned how to switch Claude Code between API key mode and OAuth login mode cleanly. Key: ANTHROPIC_API_KEY in settings.json env block always wins over the logged-in session. To use login mode, comment it out. Created shell aliases cc-proxy / cc-login to swap config files in one command. → reference/claude-code-auth-switching

📚 PKM — PARA + ACE + MOC deep dive (NEW today)

Long exploration of personal knowledge management systems: PARA (Projects/Areas/Resources/ Archives by Tiago Forte), Second Brain (CODE framework), MOCs (Maps of Content by Nick Milo), and the ACE (Atlas/Calendar/Efforts) hybrid. Also explored: where meeting notes go, the + inbox folder for fleeting notes, and how AI-maintained PKM compares to human-curated systems. This conversation happened in the “My AI Notebook” project context. → reference/pkm-para-ace-moc

📋 Vuexy — Codebase Documentation Strategy (UPDATE)

Major update to the Vuexy plan: comprehensive prompt for Claude Code to produce 12 documentation files in a claude-docs/ folder, including SKILL.md as the core context anchor. The SKILL.md becomes a permanent reference that Claude loads before every build task, ensuring it uses Vuexy’s patterns rather than generic code. → efforts/vuexy-nextjs-frontend

Open tasks added

  • Claude Code auth: create ~/.claude/settings.proxy.json and settings.login.json — test alias switching
  • Vuexy: run Claude Code with Phase 1 docs prompt (produce 12 claude-docs/ files)
  • PKM: decide on final folder structure — ACE+PARA or pure ACE hybrid
  • PKM: create inbox + folder for fleeting notes capture