Active · May 25, 2026
daeseon.ai
This site. Bilingual blog + private admin dashboard for drafts and distribution.
- Role
- Solo
- Stack
- Next.js 15 · TypeScript · Tailwind · MDX · Vercel
The blog you're on. Built from scratch so the constraints (writing tone, admin features, distribution) are mine, not a template's.
What it does
- Bilingual posts (EN default, KO at
/ko) withtranslationKeycross-linking. - MDX with Format A (multi-register) and Format B (project recap) writing conventions baked into the editor.
- Private admin (
/admin) with password gate, JWT session cookie, post editor that commits to GitHub. - RSS per language, hreflang sitemap, robots-blocked admin routes.
Why
I've been writing in private docs for years and not shipping any of it. This site exists to break that loop.
What's still missing
- Real per-post view analytics (deferred until there's traffic to look at).
- Crosspost wiring — webhook slot exists, target tool is the separate
crosspost-botproject.
Project log
Chronological record of troubleshooting, retros, and updates while building this.
Decisions & milestones
Korean applications get an evidence portfolio, not a longer resume
DecisionJul 18, 2026 · 5 min
Korean submissions split into a fixed 2-page PDF plus /ko/portfolio, a Korean evidence page sharing one showcase component with the English /portfolio. First public deploy of the whole resume system.
Portfolio direction: animated case films instead of a text resume page
DecisionJul 13, 2026 · 2 min
New /portfolio surface renders production case studies as scene-stepped before/after diagram films. Case 01 (ERP↔MES transactional outbox) shipped.
Resume factory: one data file generates the web page and the PDF
DecisionJul 13, 2026 · 1 min
lib/resumeData.ts is now the resume's single source of truth; /resume renders it and a puppeteer script prints the ATS-safe one-page PDF.
Added ds-forge as a project + wired its build logs onto the site
DecisionJul 9, 2026 · 2 min
Added content/projects/{en,ko}/ds-forge.mdx with logSourceRepo=Daeseon-AI-Factory/ds-forge, so ds-forge's 94 public build-log entries aggregate on /projects/ds-forge — the same private-repo-over-token path talkak already uses. Framed generically (the public Lab: N+1 / pool-exhaustion / deadlock against real Postgres+HikariCP, data-structure visualizers, deterministic state→SVG engine), not as company-specific interview prep. Left featured:false and url pointed at /lab.
Architecture deep-dives get a plain-language on-ramp — non-engineers now get the gist in one box
DecisionJun 29, 2026 · 2 min
The seven architecture deep-dives were dense and engineer-only (file:line citations, jargon, no on-ramp). Added a jargon-free 'In plain words' lead box to all eight files (talkak en+ko, Mimi, DocVault, Beside, ScreenBridge, Meta Smart Glass, Ki Clash): what it is in everyday terms, the one clever idea, a concrete analogy. The measured, source-cited technical body is unchanged below — progressive disclosure for two audiences.
Talkak hero: real dashboard screenshot + embedded demo video
DecisionJun 29, 2026 · 1 min
Swapped Talkak's designed banner for a real screenshot of its multi-agent dashboard (agents online, approval queue, per-startup rows) and embedded the product's own demo clip on the project page. Added an optional `video` frontmatter field; ProjectBody plays it (autoplay/muted/loop, poster = image) instead of the still. Home cards stay image-only.
Aligned the blog front door to the resume — featured set, About spine, DocVault active-use hook
DecisionJun 24, 2026 · 2 min
Re-aimed the home page and project hooks at the resume a recruiter reads first. Featured projects now match the resume's three Selected Projects (Talkak, Mimi, DocVault) instead of (Beside, Mimi, Talkak). The home About was rewritten from a generic 'mission-critical systems' blurb to the resume's concrete concurrency/transaction-integrity spine. DocVault now leads with 'in active use by a 40-person team' — its strongest signal, previously absent from the blog.
Project index gets featured hierarchy + card thumbnails — and why GitHub social cards were rejected
DecisionJun 19, 2026 · 3 min
The /projects index read as a list of text blurbs: a placeholder subtitle, uniform cards, no visuals, no hierarchy. Chose a layout-only design-lock exception: sharper intro copy, featured-vs-rest split, and a card component that renders a hero thumbnail plus a live badge. Used only the real product OG images that already exist (Beside, DalkkakAI); GitHub social cards were tried and rejected because they prominently show 0 stars/forks on the flagships, and real product screenshots are login-walled.
'Review needed' becomes an admin toggle — off while recruiters are looking
DecisionJun 11, 2026 · 2 min
Every log entry without a human companion was rendering a 'Review needed' marker and an empty review column — and zero companion files exist, so that was every public entry. Added a site-wide admin toggle (showReviewNeeded in site.json), default off: entries render single-column, main content only.
Architecture deep-dives become a third project surface — dalkkak-ai pilot
DecisionJun 10, 2026 · 3 min
Each project gets a source-verified architecture deep-dive. Chose a dedicated /projects/[slug]/architecture sub-page over making it the project page's main body (which would reverse the June 2 slim-page decision) or posting to the home feed. Piloted on dalkkak-ai, en+ko, with content extracted by a 13-agent analyze-verify workflow over the actual repo.
Per-project README pages: stored + sanitized, not live-fetched
DecisionJun 2, 2026 · 2 min
Each project can now show its full README as its own page (/projects/<slug>/readme), and the README also feeds a richer project intro. Chose store-in-blog + sanitize-on-render over live-fetch from the (private) satellite, so the render is verifiable and dead links are neutralized.
Recruiter cold-entry pass: surface current status, kill dead links, make the log scannable
DecisionJun 2, 2026 · 3 min
A cold recruiter-POV audit of every entry surface drove a content/IA pass — home Now block, post bylines, newest-first + grouped project log, live DalkkakAI link, summary rendering fix — all inside the v1 visual freeze. Visual redesign deferred.
Slim the project page to intro + image + link + timeline
DecisionJun 2, 2026 · 1 min
The project page had grown busy — a multi-section MDX body plus links, stack, and the log. Cut it to a brief intro, an optional hero image, the real links, and the weekly timeline. The long detail now lives only in the Full README page.
Project log gets a weekly engineering-log cadence (A+B, factual rollups)
DecisionJun 2, 2026 · 2 min
A flat 31-entry reverse-chron log read as a wall and didn't feel like a real engineering log. Chose weekly buckets with factual auto-rollups (A) + hand-written snapshot digests pinned on top (B). Rejected LLM auto-narrative and a daily/monthly nesting.
Architecture overview — daseon.ai (this blog) as of 2026-05-31
SnapshotMay 31, 2026 · 3 min
Next.js 15 App Router site that reads MDX from GitHub Raw at runtime so commits go live in ~3-5s without waiting for the Vercel rebuild.
Decision — drop activity heatmap from v1 scope
DecisionMay 31, 2026 · 3 min
Activity heatmap (calendar grid colored by entry kind) was in the v1 plan but dropped after evaluation. Status header carries the bulk of the portfolio signal; heatmap is self-reflection tooling that does not need to be public-surface.
Defer hook over-fire fix to v2 — accept override noise for now
DecisionMay 31, 2026 · 3 min
Hook keyword trigger fires on commits that ARE the kind:decision artifact (recursive case). Two options: accept the per-commit override-trigger overhead, or refine the hook to detect decision-entry diffs. Chose to accept the noise for now to close v1 and learn from real usage before refining.
Project log system v1 spec — Revisions A through D in one batch
DecisionMay 31, 2026 · 6 min
Four spec revisions that take the logging system from a single-tier dual-write convention into a tiered judgment-recording system with a learning-gap kind, framework-cited templates, and CLAUDE.md-enforced option presentation.
Close v1 of the project-log system — safety boundary codified
DecisionMay 31, 2026 · 6 min
v1 of the project-log system is shipped — 11 of 13 criteria fully done (1 dropped: heatmap; 1 user-state-blocked: 2 satellite hook upgrades pending dirty-tree cleanup). Author committed to a stronger safety boundary: the log system must never affect a satellite project's primary work. Codifies the boundaries the system already has and forbids future changes that violate them.
Build log
Week of Jul 13, 20261 entry · 1 Update
Week of Jun 15, 20266 entries · 5 Update · 1 UX retro
Architecture deep-dives for 4 more projects — source-verified, adversarially checked
UpdateJun 20, 2026 · 2 min
Fanned out the architecture deep-dive surface (piloted on talkak) to Mimi, DocVault, Beside, and ScreenBridge. Each was extracted from the actual local repo by an analyze → adversarial-verify → write pipeline; the verify pass cut or corrected a real wrong number on every project before it shipped. Every claim cites real files; every number is measured. EN now; the loader falls back to EN for KO until KO versions are written. ScreenBridge and Meta-Smart-Glass: ScreenBridge done; Meta hit a rate limit mid-run and is the one remaining.
Every project card now has a thumbnail — generated branded cards (next/og)
UpdateJun 20, 2026 · 1 min
Closed the open follow-up from the project-index visual upgrade. Projects without a real product OG image now render a generated branded card (next/og) at a stable /projects/<slug>/card URL, so the index is uniform: featured row is three images, the rest are consistent cards — no empty boxes, no 0-star GitHub cards, no login-walled screenshots. Verified live-equivalent on a clean local build.
Project pages led with text and nothing grabbed — a measured-metrics strip
UX retroJun 20, 2026 · 2 min
Owner's read: per project, nothing grabbed at a glance. A live screenshot confirmed it — the project pages were title, description, buttons, role/stack, then the log timeline, all text, no hero for the four projects without a product OG image. Added a bold mono metrics strip under the description, filled with the verified numbers from each project's architecture deep-dive. The real fix — a product screenshot hero — still needs the owner for the login-walled and native apps.
Repo renamed ddalkkak → talkak; blog re-pointed to the canonical name
UpdateJun 20, 2026 · 1 min
Closed the last open item from the Talkak rename. The GitHub repo was renamed Daeseon-AI-Factory/ddalkkak → talkak (old URLs 301-redirect), so the GitHub pin now reads talkak. The blog re-points logSourceRepo, the architecture naming note, and the README repo link to the new name; logSourceDir stays dalkkak-ai (the log directory inside the repo is unchanged, verified 95 entries), and internal code identifiers (@ddalkkak packages, bundle id, tmux socket, data dir) are left as-is.
Product rename: DalkkakAI → Talkak (brand + live domain only)
UpdateJun 19, 2026 · 1 min
The terminal-deck product is now Talkak, live at talkak.daeseon.ai (ddalkkak.daeseon.ai 307-redirects there). Updated the user-facing name and live URL on the project page, /now, the about page, and the showep12 GitHub profile README. Left the repo name (still ddalkkak), internal code identifiers, the route slug, and dated log history unchanged — renaming those would be false or would break the cross-repo log pull.
Talkak follow-through: slug → /projects/talkak, README rebrand, redirects
UpdateJun 19, 2026 · 1 min
Completed the four follow-ups to the DalkkakAI→Talkak rename. Migrated the route slug dalkkak-ai→talkak (5-file git mv) with an explicit logSourceDir so the satellite log pull doesn't silently empty, added 308 redirects for old links and sub-pages, rebranded the full README mirror (brand + live domain only, internal ids kept), and fixed a stale name on the about page. The GitHub bio + pins could not be changed via API (missing token scope / no pin API) — left for the owner.
Week of May 25, 202624 entries · 3 Update · 8 Troubleshoot · 10 Tech retro · 3 UX retro
Hook v3.1 — auto-suggest decision tier in block message
Tech retroMay 31, 2026 · 1 min
Stop hook now classifies a triggered commit as T1 or T2 and prints the matching template slot list in the block message, so the author doesn't have to remember which template fits this commit.
Install kit v2 — one URL now covers four hard-won satellite-onboarding gotchas
UpdateMay 31, 2026 · 3 min
Folded four post-v1 lessons (slug ≠ repo name, quoted YAML dates, companion-in-portfolio-not-satellite, bilingual logs) plus an explicit Writing voice section into the install post and CLAUDE.md snippet. One URL handoff now suffices — no per-satellite addenda.
Every project log entry detail page hung in production — Next.js dynamic-param collision
TroubleshootMay 31, 2026 · 2 min
All /projects/<slug>/log/<entry> pages were timing out indefinitely (curl: 60s, 0 bytes). The cause turned out to be the prior day's admin companion UI introducing a `[slug]` directory at the same level as the existing `[locale]` directory under app/(admin)/admin/projects/ — a Next.js dynamic-param-name conflict that production build silently emits and runtime then breaks SSR on. Fixed by moving the admin companion routes to app/(admin)/admin/logs/[project]/.
Stop hook v3 — positive triggers override [no-log] for substantive commits
Tech retroMay 31, 2026 · 6 min
Author judgment over routine-ness was unreliable about a third of the time. The hook now runs three positive triggers (LOC > 200, sensitive paths, subject keywords) that block the turn regardless of [no-log] tag. Silent overrides are disabled — false positives must annotate with a real rationale.
Admin UI for log-entry companions
Tech retroMay 30, 2026 · 2 min
Browser-based editor for <slug>.human.mdx companion files so they no longer have to be edited by hand on disk.
Project timelines now accept a side-by-side human commentary per entry
UpdateMay 30, 2026 · 1 min
Every AI-written log entry can now carry an optional <slug>.human.mdx companion. The detail page renders the two side-by-side on desktop (AI on the left, human on the right) and stacks them on mobile. Lets the human author add their voice without editing the AI artifact.
Added a bilingual wiki — the knowledge content type was already there, just unrendered
UpdateMay 28, 2026 · 1 min
Built /wiki v1: a 나무위키-style cross-linked glossary of technical terms, EN+KO, with [[term]] wiki-links. The knowledge content type already existed in the data layer; this was mostly the missing frontend + a small remark plugin.
Admin project CRUD: full editor, featured toggle, GitHub-or-FS storage
Tech retroMay 27, 2026 · 2 min
Added /admin/projects with list, create, edit, delete, and inline featured toggle, backed by a new lib/project-storage.ts that mirrors the post storage split (GitHub commit in prod, local FS in dev).
Client component pulled node:fs into the browser bundle
TroubleshootMay 27, 2026 · 1 min
Vercel build failed with `You may need an additional plugin to handle node: URIs`. LogTimeline.tsx (client) imported lib/logs.ts (server), pulling node:fs into webpack's client bundle.
Cross-repo log aggregation: each repo keeps its own, the portfolio pulls
Tech retroMay 27, 2026 · 3 min
Added `logSourceRepo` to project frontmatter so each project's log timeline can be fetched from its own separate repo. Pull-on-demand with 30s ISR cache, no polling.
Domain typo: daseon.ai vs daeseon.ai
TroubleshootMay 27, 2026 · 1 min
Project was bootstrapped with daseon.ai (one letter short). The real registered domain is daeseon.ai. Found at Vercel domain connection time.
Image upload UX: from a tiny button to a real dropzone
UX retroMay 27, 2026 · 1 min
Admin image upload worked the whole time, but I couldn't reliably find it. Fixed the discoverability instead of the mechanism.
Designing the project-log system (this thing you're reading)
Tech retroMay 27, 2026 · 3 min
Why I added a fourth content type for project logs, dual-wrote to a machine-facing reference and a human-facing timeline, and built explicit anti-hallucination rules.
Stop hook: from reminder to enforcement (blocking + self-terminating sentinel)
Tech retroMay 27, 2026 · 3 min
The original Stop hook nudged with a systemMessage, which Claude could ignore. Upgraded to decision:block + reason with a commit-hash sentinel that terminates the loop once a log entry exists.
First cross-repo pull crashed the build — YAML parsed log dates as Date objects
TroubleshootMay 27, 2026 · 2 min
Adding docvault as the first cross-repo log source surfaced a latent bug: log entries with unquoted ISO dates parsed as Date instances instead of strings, ended up in JSX, and tripped the prerender.
Why I split content into post / note / knowledge / log
Tech retroMay 26, 2026 · 2 min
One bucket for everything fails three different audiences. Four content types with different visibility defaults each.
EROFS on every Vercel publish — production fs is read-only
TroubleshootMay 26, 2026 · 2 min
Admin publish crashed with EROFS. Cause: I wrote to disk first, then committed to GitHub. Production fs is read-only.
Why publish-to-live used to take 60s, and how I got it to 3-5s
Tech retroMay 26, 2026 · 2 min
Production fs is a frozen build snapshot. Reading content through fs.readFile meant 60s of staleness per publish. Moved reads to GitHub Raw.
Hobby photos on a dev portfolio: when they help and when they don't
UX retroMay 26, 2026 · 1 min
I considered a 추억-style photo gallery on /about. Decided against. Kept a small slot for conference/maker/workspace shots only.
Vercel refused to build with next-mdx-remote@5.x (CVE)
TroubleshootMay 26, 2026 · 1 min
First production build was blocked by Vercel's security scanner. Solved with a one-line dep bump.
Sidebar width: 16rem felt empty, 13rem felt cramped, 14rem stuck
UX retroMay 26, 2026 · 2 min
The hub layout (left sticky profile / right content) needed two rounds of width tuning before it stopped looking off.
Live site returned 401 to everyone (Vercel Authentication on by default)
TroubleshootMay 26, 2026 · 1 min
Production URL was unreachable until I disabled Vercel's default deployment protection. No code change.
MDX broke on `$\mathbb{R}^d$` with `R is not defined`
TroubleshootMay 25, 2026 · 1 min
Curly braces in math notation are JSX expressions to MDX. The build crashed on a sample embeddings post.
Stack and storage: Next.js 15 + GitHub commit-as-database
Tech retroMay 25, 2026 · 1 min
Why I picked Next.js 15 + Vercel + GitHub Contents API for storage instead of a database.