Work log: Diktura - April 4, 2026
What shipped today
40 commits across two sub-sessions. The product went from “Rails port with feature parity” to a full-stack customer interaction platform with support, knowledge base, unified inbox, AI chat, configurable widget, workspace management, and a complete UI overhaul — all deployed to production on diktura.com.
Morning session — infrastructure and core features. Deployed to Vercel for the first time. Fixed two production bugs: NEXT_PUBLIC_ env vars not inlining in the browser client (dynamic process.env[name] access doesn’t get inlined by Next.js), and Supabase email confirmation redirecting to the wrong path. Established manual deploy policy after the Vercel bill got too high from auto-deploys. Rebuilt the UI with an inverted-L sidebar layout, renamed all routes from /dashboard/* to /workspace/* (57 files), redesigned the dashboard with stat cards and quick actions. Built workspace management: create, switch, edit name, edit profile, change password.
Morning session — new product areas. Built support from scratch: schema (conversations + messages with RLS and message count trigger), list page with status filter tabs, detail page with threaded messages, widget endpoint. Built knowledge base: schema (articles + categories with public SELECT), dashboard CRUD with editor and publish flow, public help center at /help/[subdomain]. Built unified inbox: aggregated activity page and customer timeline on user detail.
Afternoon session — polish, widget v2, and AI. Triaged 16 user-filed issues. Added Diktura branding with SVG favicon and sidebar icon. Organized nav into Workspace/Account sections. Renamed “Users” to “Customers.” Added workspace emoji icons. Built widget v2 with configurable multi-module architecture (5 modules: feedback, support, roadmap, KB search, AI chat). Built AI chat endpoint with streaming Claude responses grounded in KB articles. Built inbound email webhook receiver. Added integrations placeholder page. Updated PRODUCT.md to reflect all 17 built features. Deployed everything to production. Added edge case tests. 119 tests total.
Completed
Features
- #101 — Deploy to Vercel (diktura.com live)
- #104 — Dashboard redesign with workspace overview
- #108 — Inverted-L sidebar layout
- #109 — Remove redundant workspace names
- #110 — Rename /dashboard → /workspace (57 files)
- #111 — Editable account profile
- #112 — Editable workspace settings
- #113 — Create additional workspaces
- #114 — Workspace switcher in sidebar
- #115 — Diktura branding at top of sidebar
- #119 — Rename Users → Customers
- #124 — Workspace emoji icons
- #125 — Nav sections with headers (Workspace/Account)
- #126 — Integrations nav item + placeholder page
Support (Phase 6)
- #128 — Support schema
- #129 — Support list page + server actions (9 tests)
- #130 — Support detail with message thread
- #131 — Widget support endpoint (7 tests)
Knowledge Base (Phase 7)
- #134 — KB schema
- #135 — KB article CRUD + editor (8 tests)
- #136 — Public help center at /help/[subdomain]
Unified Inbox
- #138 — Aggregated activity page
- #139 — Customer timeline on user detail
Widget v2 + AI
- #142 — Configurable multi-module widget embed
- #143 — Widget support module (shipped with #142)
- #144 — Widget KB search module + API endpoint (5 tests)
- #148 — AI chat API endpoint with KB context
- #149 — AI chat widget module with streaming
Infrastructure
- #145 — Per-workspace inbound email addresses on settings
- #146 — Inbound email webhook receiver (4 tests)
- #150 — PRODUCT.md rewrite
- #151 — Production deploy with all changes
- #152 — Edge case tests (3 tests)
Bugs + cleanup
- #122 — Display name save (works, was transient)
- #140 — Remove redundant New Workspace link
- Auth callback fix, env var inlining fix, settings page fixes
Decomposed
- #102 → #111-#114 (workspace management)
- #105 → #128-#131 (support)
- #106 → #134-#136 (KB)
- #107 → #138-#139 (unified inbox)
- #132 → #142-#144 (widget v2)
- #133 → #145-#147 (inbound email)
- #137 → #148-#149 (AI widget)
Carry-over
- #147 — Inbound email DNS + Brevo config (needs API key + MX record)
- #123 — Bug: can’t edit workspace name (needs-clarification — may be resolved)
- #116 — Header/footer (needs-clarification)
- #120 — Customers section (needs-clarification)
- #127 — PostHog design elements (needs-clarification)
- #97 — Rate limiting (backlogged)
Risks
- No integration tests. 119 unit tests, all mocked. None of the new features have been tested against real Supabase.
- AI chat has no API key in production.
ANTHROPIC_API_KEYnot set on Vercel — endpoint returns 503 until configured. - Chrome 431 error persists. Cookie bloat on localhost. Using default browser as workaround.
Flags and watch-outs
- Dev server port: 3007
- Deploy from repo root:
vercel deploy --prod --yes --scope synaxis - Default browser only — Chrome has 431 errors on localhost
SUPABASE_SERVICE_ROLE_KEYneeded in web/.env.local for help center and widget endpoints- Widget v2 config:
data-modules="feedback,support,kb,chat"on the script tag - Workspace switcher uses
diktura_workspacecookie - Public help center:
/help/{tenant-subdomain} - Inbound email addresses:
{inbox_email_slug}@in.diktura.com - All migrations pushed to production Supabase
Next session
- Answer the 5 clarification issues — #116 (header), #120 (customers), #123 (workspace edit bug), #127 (PostHog design), #147 (Brevo API key). These are blocking the queue.
- Set ANTHROPIC_API_KEY on Vercel — AI chat won’t work in production without it.
- Test auth and workspace flows on production — sign up, create workspace, switch, use support/KB. First real integration test.
- PostHog design polish (#127) — the UI is functional but needs the visual refinement Paul wants.
- Inbound email infra (#147) — MX record + Brevo API config. Needs the API key.
Why customer tools are organized wrong
This article reveals a fundamental flaw in how customer support tools are designed—organizing by interaction type instead of by customer—and explains why this fragmentation wastes time and obscures the full picture you need to help users effectively.
Infrastructure shapes thought
The tools you build determine what kinds of thinking become possible. On infrastructure, friction, and building deliberately for thought rather than just throughput.
Server-side dashboard architecture: Why moving data fetching off the browser changes everything
How choosing server-side rendering solved security, CORS, and credential management problems I didn't know I had.
The work of being available now
A book on AI, judgment, and staying human at work.
The practice of work in progress
Practical essays on how work actually gets done.
The bottleneck moved and nobody noticed
When execution becomes nearly free, the bottleneck shifts from doing the work to deciding what work to do. Most organizations are optimized for the wrong constraint.
The inbox nobody reads is the one that matters
Every organization has a monitoring system that works perfectly and reports to nobody. The gap between having information and acting on it is where most failures actually live.
The best customers are the first ones you turn against
Every subscription makes a bet that most customers won't use what they're paying for. The customer who closes that gap becomes a problem to be managed.