feedback
(18)- Cheap models for sub-agents
Fan-out sub-agents to cheaper models by default
- Write concise simple English
Prefer short plain English in prose and commits
- Disambiguate which product/repo
When the user jumps between products, confirm target repo before large edits
- Docs-Driven Development (index)
Tiny router files + versioned kb brain; reflexive read/write
- KB is the shared brain
Versioned, grep-able notes beat rules stuck only in prompts
- Read MEMORY.md on entry
Before non-trivial work, read the index and relevant notes
- Keep router files tiny
CLAUDE.md/AGENTS.md = short stable rules + pointers, not architecture dumps
- Write memory as you work
Persist durable public facts during work, not only at session end
- Fail loud; don't hide skips
Never claim done if tests/steps were skipped silently
- Logic change → update related tests
Co-update tests in the same change; never wait for CI
- Keep main CI green, fast, and performant
After merges and new features, verify main CI is green; do not add slow tests or extra hot-path queries
- Never auto-merge release-please PRs
Leave release-please and changeset version PRs for human merge
- pstack verification is infra
Agents must close the loop themselves with a project-local verify skill, a CLI lever, a Feature Map, and cloud agents — not worktrees
- KB stores public generic facts only
No secrets, hosts, internal project names, or adhoc session dumps
- Semantic commits
Use conventional semantic commit messages
- Prefer simple code
Minimum code that solves the problem; no speculative abstraction
- Surgical changes only
Touch only what the request requires; no drive-by refactors
- Working style (index)
Index of agent collaboration preferences
project
(43)- duyet/agentstate
State and coordination layer for AI agent fleets (public OSS)
- AnyRouter
Universal multi-provider LLM API gateway at anyrouter.dev
- One AnyRouter listing id per model
Catalog id is owner/model; host SKUs (date, vision-exp, fast, casing) are upstream names or aliases
- AnyRouter CLI is a native Rust binary
Public install is curl | bash; binary is anyr; pin models with anyr claude --model owner/model
- AnyRouter OpenAI-compatible API
OpenAI-shaped clients; text and embeddings only — image/video generation is gone
- AnyRouter OS
Browser OS workshop — repo duyet/anyrouter-os; file bugs on duyet/anyrouter with [os] prefix
- AnyRouter playground MCP
Playground new chats enable AnyRouter MCP at the documented HTTP endpoint
- AnyRouter public UI chrome
Viewport tokens, 44px targets, semantic dark, compact playground row
- Unlist broken AnyRouter models
Disable or unlist a broken model from /models and the catalog; do not delete history
- duyet/anyworker
Open alternative to Claude Cowork-style agents — local agent + marketing site
- AnyWorker local agent + GUI
Product path: Python agent server plus React GUI; web is separate marketing app
- duyet/charts
Public Helm charts repository
- chmonitor recommends, never auto-DDL
AI/ops advisor suggests CH changes but does not apply DDL automatically
- chmonitor CLI local named connections
chm add/ls/use/rm save local ClickHouse HTTP and postgres:// connections; secrets stay in the credentials helper
- chmonitor hide sidebar pages in place
Hover Hide next to pin hides a sidebar leaf; restore in Settings → Workspace → Navigation
- chmonitor paid licenses are self-hosted host-count
Paid chmonitor is honor-system host-count licenses (yearly/lifetime), not hosted SaaS seats
- chmonitor menu engine filter
Absent engines on a menu item means ClickHouse family; Postgres hosts must not see those items
- chmonitor Tools sidebar group
Dashboard Tools group holds SQL Console, Data Explorer, Explain, Advisor, Chart Builder, Schema Compare, Settings Diff
- chmonitor TTL & Partitions inventory
System TTL page lists table inventory plus part-health charts; never select system.tables.ttl
- chmonitor verify skill
Project-local .cursor/skills/verify-chmonitor drives the Rust CLI; default doctor is identity-only
- chmonitor
Open-source ClickHouse operational advisor — monitoring + AI recommendations
- codex-claude-plugins verify skill
Project-local .cursor/skills/verify-marketplace; CLI lever on catalogs/manifests, not a hosted UI
- duyetbot persona
Manager agent for the public product fleet — assigns work, keeps kb current
- duyet/homelab
Public personal homelab repo — configs and experiments (no private topology in kb)
- duyet/kb shared brain
Public shared-brain repo — atomic notes, MEMORY.md index, OKF layout
- KB site front-end
kb.duyet.net renders the shared-brain notes; apps/kb/kb mounts ~/kb
- LLM Timeline
Public SSG timeline of LLM models at llm-timeline.duyet.net
- duyet/monorepo
Public Bun+Turborepo for personal duyet.net web apps including news and the kb site
- news.duyet.net
Personal news feed + public digest; homepage AI;DR thumbs; news-tab own 0.1.x release line
- oma Console Analytics dashboard
Console /analytics charts cross-agent estimated spend, token mix by kind, and declared multiagent delegation from existing usage APIs
- oma Console daily summary for scheduled agent runs
Agent detail Daily summary tab rolls up schedule firings over 1/7/30 UTC days from agent_schedule_runs
- OMA Console HITL approvals and notice bell
Console posts user.tool_confirmation from ApprovalCard; session cards + notice bell for mobile-compact HITL
- oma Console Agent Monitor tab
Console AgentDetail health strip plus Monitor tab is the live agent.status heartbeat feed
- OMA Console session Inject overlay
Operators inject prompts, MCP, tools, and vault credentials into a live session without mutating the agent
- oma home session and home runtime
Agent has one durable home inbox plus paired long-lived home runtime; ephemeral sandboxes stay separate
- OMA output_file is opt-in declared deliverables
output_file is gated like browser tools; marks keep-this files as agent.output_declared for Console Artifacts
- oma session create persists env_secret to the secret store
POST /v1/sessions writes env_secret and inline github tokens via sessionSecrets.put; unwired store fails 500; DELETE cascades
- oma internal secret uses timing-safe compare
checkInternalSecret and trusted-proxy share timingSafeEqualStr from @duyet/oma-auth/timing-safe-equal
- oma-vault OMA_TENANT fails closed across tenants
Unset/empty/* stay wildcard for single-operator; multi-tenant credentials refuse start and same-host matches stay tenant-scoped
- oma verify skill
Project-local .cursor/skills/verify-oma with control-oma.mjs CLI lever and Feature Map for web + Console
- Open Managed Agents (OMA)
OSS self-hostable Managed Agents API — CF Workers/DO or Docker
- templatebot pay-to-install Sale listings
Sale templates require checkout before install; delivery is email plus secret unlock URL; owners see 5% platform fee plus processor estimate and net
- templatebot verify skill
Project-local .cursor/skills/verify-templatebot drives the Vite marketplace over CDP; Feature Map includes 30-per-page D1 browse, browse card coat blend, unlisted /data analytics, PostHog funnel, marquee, pay-to-install, MCP publish, live X embeds, multi-bot collect progress/skip/claim + master-detail publish, viewport presets
reference
(12)- AI SDK UIMessage shape
UIMessage is id+role+parts; unknown part types render as null
- Cloudflare acquired Astro (2026)
Jan 2026: Astro team joined Cloudflare; Flue agent framework context
- Blog themes
Recurring public blog themes on blog.duyet.net
- Notable public GitHub repos
Catalog of notable public duyet/* and related OSS repos
- Cloudflare Access fails OPEN when the app is missing — clients keep sending headers nobody checks
A service-token-protected origin becomes publicly reachable if the Access application is absent; clients still send CF-Access-Client-* headers, so nothing errors and it looks healthy
- An unquoted shell metacharacter in a .env file silently drops every later variable
bash `source` aborts at the offending line, so variables defined after it are empty at point of use with no error — dotenv loaders parse the same file fine, which hides it
- Moving a CF zone between accounts copies DNS but not Worker routes — Error 1000
Cloudflare inter-account zone/registrar transfer carries DNS records but drops Worker routes and Custom Domains, so every proxied hostname 403s with Error 1000 until routes are recreated
- github.com/duyet
Public GitHub org/user for open-source work
- blog.duyet.net
Personal digital garden blog
- homelab.duyet.net
Public homelab overview site on the personal domain
- kb.duyet.net
Public rendered face of this shared-brain repo
- Web presence (index)
Index of public sites and llms.txt sources
tech
(71)- Lessons — chmonitor on homelab k3s
Homelab chmonitor vs public dash; image ghcr.io/chmonitor/chmonitor; no CH readonly profile; dedicated SELECT user; proxy auth via forwardAuth
- Agent-loop uses cheap workers
PR fix/review fan-out should not all run on the most expensive model
- Agent-loop PR cycle
Periodic cycle triages open PRs and dispatches fix/review work
- AgentState five primitives
States, leases, claims, capability tokens, conversations — fleet coordination API
- AgentState is not an agent framework
Coordination/state API for fleets — bring your own agent loop
- AI agent stack map
Map of common agent frameworks and what they are for
- Convert history DTO → UIMessage
Keep API neutral; translate tool-call DTOs to AI SDK parts per client
- AI SDK native tool parts
Persist or convert to dynamic-tool / tool-name parts for history reload
- CLI report assemble from repo root
Resolve --assemble/--report/--out from the repo root; do not cd into the crate first
- AI Gateway is transparent on model ids
Cloudflare AI Gateway does not validate model names; upstream does
- Cloudflare Worker cron triggers cap at five per account
Cron triggers are capped at 5 per Cloudflare account, not per Worker
- Cloudflare Email Sending is transactional, not marketing bulk
Cloudflare Email Sending is for transactional mail; bulk/marketing campaigns belong on a dedicated ESP
- Cloudflare Pages deploy habit
Semantic commit → push → deploy changed app; avoid parallel deploys that share env files
- Updating a Worker resets in-flight Cloudflare Workflows
Deploying a Worker that hosts a running Workflow resets the Durable Object and fails the instance
- Codebase maintenance loop
Measure → fix top issue → verify → commit → deploy → log
- Host cron lives in-repo behind an install script
Reproducible host jobs are committed crontab snippets plus an idempotent installer, not hand-edited crontab
- D1 INSERT RETURNING is not a write API via .first()
Cloudflare D1 INSERT/UPDATE RETURNING + .first() returns empty results; persist with .run() or batch()
- Daily coding-agent manager leaves worktrees open for review
Overnight issue-fanout should persist worktrees and a dated summary folder instead of tearing down panes
- Debian 13 apt ships Node 20
Debian 13 (trixie) nodejs is 20.x; Wrangler 4 and many CLIs need Node >=22. Install official 22 LTS to /usr/local and dpkg-divert /usr/bin/node.
- Daily digest keys must use the audience timezone
A UTC-dated snapshot can miss the local calendar day so the daily digest looks up null and never sends
- Disk swap is not extra RAM
A huge disk swapfile delays OOM and can hang a headless box; prefer small zram plus kill/evict
- Durable Object alarms are not Worker cron triggers
DO alarm() can schedule work without consuming the account-wide Worker cron cap
- Filesystem-first durable agents
Eve authors an agent as agent/ files — instructions, tools, connections
- Eve durable runtime is Vercel or Nitro
Eve sessions need Vercel Workflow or a self-hosted Nitro Node server
- Flat design: hairline borders
Prefer hairline borders over heavy shadows for public site UI
- Semantic design tokens
Use semantic tokens (bg-card, foreground) not ad-hoc color utilities
- Flue: register providers in initializer
Custom gateways must register from agent init with ctx.env; module load has empty env
- forwardAuth must preserve status
Error pages middleware can rewrite 302 challenges into 401/500 and break OAuth
- GitHub CLI tokens need a git host alias
A gh vault token keyed to api.github.com does not match github.com git remotes unless lookup aliases those hosts
- Morning Herdr issue-desk cron
Daily cron starts a Grok manager on main; children get isolated git worktrees; dated run folder stays on disk for review
- Hermes custom_providers
Register custom OpenAI-compatible providers by name, base_url, model
- Dashboard auth gate precedence
Insecure/loopback allowlists can bypass OAuth if ordered wrong
- Hermes steer mode
While busy, new user messages can adjust the current task instead of being ignored
- Autonomous improvement loop
One issue per cycle with full verify before next
- createContext breaks RSC importers
Libraries that call createContext at module scope force client boundaries
- BYOK sibling before disabling backend
Disabling a platform backend can silently kill BYOK that injected through it
- Quota errors may arrive as HTTP 400
Reseller budget errors buried in 400 should failover like 402/429
- Atomic notes
One fact per file; split when a note needs 'and'
- Note frontmatter standard
Required top-level fields for every concept note
- npx looks up a scoped package's last path segment as the executable
npx @scope/name runs a bin named `name`. Multiple bins without that name fail with "not found" / could not determine executable.
- Build-time OG images
Generate OG cards at build from one registry shared by generator and route head
- OG meta must be prerendered
Social crawlers need Open Graph tags in static HTML, not only client head
- OKF-style knowledge bundle
Nested markdown + frontmatter bundle with index.md and log.md
- OMA env-fallback Claude uses anyrouter/free on AnyRouter
Bare claude-* rewrites to anthropic/claude-*; AnyRouter env-fallback sonnet sends anyrouter/free on both OpenAI and Anthropic wire paths (not dotted BYOK 4.6)
- CF two-segment package mounts need invokePackage
Cloudflare Hono wrappers for /v1/<group>/<name>/* must dispatch via invokePackage, not nested fetch on c.req.path
- Credentials never enter the sandbox
Managed-agent platforms should inject secrets via outbound proxy, not into the sandbox FS
- One codebase OSS + SaaS
Ship self-host and cloud from one tree behind a fail-closed mode flag
- Pin GitHub Actions
Pin actions to version or commit SHA; moving major tags can be force-pushed
- Prompt cache is byte-sensitive
Any prefix byte change can bust LLM prompt cache
- Qdrant HNSW config at create
Many collection params apply at create; retrofit via update_collection
- Qdrant: high-dim full scan timeouts
Large float32 collections without HNSW/quantization can time out
- RAG citation guards
URL-shaped citations can be real yet irrelevant — require passage support
- RAG metadata key drift
Inconsistent metadata keys break filters between ingest and query
- RAG: TOC docs pollute retrieval
Table-of-contents pages rank well but answer poorly — filter or downweight
- release-please basics
Standing release PR + CHANGELOG; merge tags and publishes
- Squash PR title is the release commit
Under squash-merge, PR title becomes the commit release-please reads
- Pre-1.0 feat may only bump patch
With bump-patch-for-minor-pre-major, feat in 0.x needs breaking marker for minor
- When Rust WASM is worth it
WASM usually wins only when the TS path is >~1ms hot work
- shadcn/ui base components
shadcn + CVA + slot pattern as default React component base
- Single-source env config
One committed non-secret env file feeds client build and server runtime
- Stale route chunks after deploy
Missing lazy chunks throw reading 'component'; add reload guard + prerender shells
- TanStack Start SSG
Prerender Vite/TanStack apps to static HTML for crawlers and edge hosts
- Tmux pane status labels
Map pane-current-command to short icons for agent vs editor vs idle
- Two-phase Trivy scan
Report job always succeeds; separate fail-on-severity job gates the build
- Chart unit suffix ≠ scale
Display unit labels must not silently convert values; pair with explicit multiplier
- WASM prerender CI trap
Missing wasm build step makes prerender succeed empty or fail late
- Workers Cache enable flag
Enable per-worker cache with cache.enabled; only public Cache-Control is stored
- Cache HIT skips Worker CPU
On HIT the Worker does not run — no CPU billing for that request
- Cache-Control stale-while-revalidate
SWR serves stale instantly while background refresh runs
- Cache-Tag purge
Tag responses for targeted purge instead of purge-everything
- Workflows schedules need a paid Workers plan
Workflow binding schedules avoid Worker cron slots but wrangler deploy fails on Free because schedules are paid-only
user
(22)- Active project portfolio (index)
Index of products and repos Duyet actively builds across
- Claude Code daily driver
Claude Code is the stated daily coding-agent driver
- AI stance (index)
How public AI practice is structured — agents over hand-writing
- Coding tools are disposable
Treat specific AI coding tools as replaceable; field moves fast
- Vibe-codes production
Public stance: agents write most production code; Markdown tops Wakatime
- Data: ClickHouse
ClickHouse as primary analytics engine in public work
- Data: Spark & Airflow
Public experience with Apache Spark and Airflow
- Focus: ClickHouse
Deep public expertise and writing on ClickHouse
- Focus: data engineering
Public focus on large-scale data platforms and DE tooling
- Focus: LLM agents
Public work on coding agents, agent SDKs, RAG, agent memory
- GitHub handle @duyet
Public handle @duyet on GitHub and personal sites
- Runs a personal homelab
Duyet runs a personal homelab for self-host experiments and ops practice
- Infra: Cloudflare
Cloudflare Workers/Pages as primary public deploy target
- Infra: Kubernetes
Kubernetes used in public infra writing and Helm charts
- Language: Python
Python used for data eng, agents, and glue code
- Language: Rust
Rust is a primary public language (data tooling, WASM, CLI)
- Language: SQL
SQL is daily language for analytics and ClickHouse work
- Language: TypeScript
TypeScript/JavaScript for web apps and Workers
- Local dev preferences
Public local tooling: macOS, bun, uv, neovim, Obsidian
- Multi-project builder
Expect concurrent work across several public products in one session
- Duyet Le profile
Public identity: Duyet Le (@duyet), senior data engineer
- Public tech stack (index)
Index of public languages, data, infra, and AI tools