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 files — reference/systemctl-cheatsheet.md (referenced in morning
journal but not yet created), efforts/vuexy-nextjs-frontend.md.
- Investigate LiteLLM
/v1/responsesendpoint 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 upwith volume mounts - Vuexy: run Phase 1 audit with Claude Code — paste prompt from conversation
- Discord hook: check transcript jsonl — is
typefield “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.jsonandsettings.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