Asagiri 朝霧

webapp/ · Next.js 16 · shadcn/ui · captured 2026-05-16

Five views over the day's ideas.

The webapp is a local-first dashboard for the engine's output. Same morning mist palette as everything else — near-monochrome, single muted teal accent, Light and Dark modes from one variable set. All screenshots below are full-page captures of the running dev server on Karasuma; the engine hadn't produced today's ideas at capture time, so most counts read zero and the layouts show their empty states.

Ritual

The entry view. A guided morning flow: read yesterday's reviewed ideas, rate today's fresh batch, schedule the next review checkpoints. When the engine hasn't run yet, the page is honest about it instead of showing a skeleton — "No research data yet for today, run the engine."

Asagiri ritual view in empty state. Top nav has Asagiri brand on the left with subtitle 'mist raven thinking', center pills for Ritual, Dashboard, Kanban, Territory, Settings, right side shows a flame icon with 0 day streak and a light/dark theme toggle. Centered on a near-black background: 'Asagiri' heading and the message 'No research data yet for today (2026-05-16). Run the research engine to generate today's startup ideas.' Bottom-left corner shows the Next.js dev indicator.
Ritual — empty state when the engine has not run yet today.

Dashboard

Aggregate view over every idea ever produced. Four KPI cards at the top (Ideas Researched, Day Streak, Domains Covered out of 15, Avg Score), a bar chart of ideas by domain, then a filterable+sortable table of every idea with date, title, domain, feasibility/novelty scores, status, rating. The status pills are a controlled vocabulary — New, Interested, Researching, Passed, Executing — shared with the Kanban view.

Dashboard page. Heading 'Dashboard — Overview of all researched startup ideas'. Four KPI cards in a row: Ideas Researched 0 with a bulb icon, Day Streak 0 with a flame icon, /15 Domains 0 with a globe icon, Avg Score 0.0 with an upward trend icon. Below: 'Ideas by Domain — No domain data available yet.' Then an 'All Ideas' section with a search input, Domain filter, Status filter pills (All/New/Interested/Researching/Passed/Executing), and a From/To date range. Empty data table with columns Date, Title, Domain, Feasibility, Novelty, Status, Rating, all sortable. Below the headers: 'No ideas match the current filters.'
Dashboard — KPIs, domain chart, full-history filter table.

Kanban

Triage board for moving ideas through the funnel. Inbox at the top (collapsible), then four parallel columns: Interested, Researching, Executing, Passed. Drag-and-drop between columns updates the idea's status in the JSON store. The same vocabulary as the Dashboard's status column — the views stay in sync because they read the same file.

Opportunity Kanban page. Above the columns, a collapsible 'INBOX — 0 UNSORTED' row. Below: four equal-width column cards labelled INTERESTED, RESEARCHING, EXECUTING, PASSED, each with a 0 count in the top-right and otherwise empty. The same top nav and theme controls as other views.
Kanban — Inbox + four funnel columns. Drag to move state.

Territory

Coverage map across the 15 domains the engine cycles through. Grid view shows each domain as a card with idea count; Table view sorts by ideas, feasibility, novelty, or alphabetically. A domain is "uncharted" until it has produced its first idea — useful for spotting blind spots in the rotation.

Territory Map page. Heading 'TERRITORY MAP — 0 ideas across 0 explored / 15 total domains'. Right side has a Grid/Table view toggle (Grid is highlighted). Sort-by row with Ideas (active), Feasibility, Novelty, A-Z options. Below the heading 'UNCHARTED (15)': pill chips listing the fifteen domains in two rows — AI/ML, Developer Tools, Gaming, FinTech, Health Tech, Education, Creator Economy, Hardware/IoT, Sustainability, then B2B SaaS, Consumer Apps, Marketplace, Logistics, Legal Tech, Real Estate Tech.
Territory — domain coverage view. Grid or Table. Reveals rotation gaps.

Settings

Key management. Each provider has its own row with a redacted preview of the saved value. Keys are written to engine/.env on the local machine and never leave it.

Refactor follow-up. This screenshot still shows the legacy slot list (Gemini / Anthropic / Perplexity). The engine's new agent-chain path doesn't use these keys — it uses CLI agents through your subscription plus BRAVE_API_KEY as optional search fallback. The Settings UI hasn't caught up yet; that's open work on the webapp side, not in the engine refactor.
Settings page. Heading 'SETTINGS — Manage your API keys. Keys are stored locally and never sent to external servers.' A panel titled 'API KEYS' with three rows: Google Gemini (GEMINI_API_KEY (Alza…)) with an Add button; Anthropic Claude (ANTHROPIC_API_KEY (sk-ant-…)) with an Add button; Perplexity (PERPLEXITY_API_KEY (pplx-…)) with an Add button. Below the panel: 'Keys are saved to the local .env file. They are never transmitted over the network and are only used by the research engine running on your machine.'
Settings — local-only key management. Note: still references the legacy SDK providers.

Design notes

Three deliberate choices visible across all five pages:

  1. Honest empty states. Pages that depend on engine output say so directly ("No research data yet for today, run the engine") instead of rendering ghost cards. The empty state is the truthful state until the cron runs.
  2. One accent, one mood. Muted teal (oklch(0.55 0.10 185) dark, oklch(0.48 0.10 185) light) is the only chromatic colour in the system. No gradients, no glassmorphism, no purple. The interface should feel like a terminal with manners.
  3. Same vocabulary everywhere. Status names (New, Interested, Researching, Executing, Passed) are identical across Dashboard's filter pills, Kanban's columns, and the JSON store. One controlled vocabulary, surfaced three ways.

Stack

Webapp stack components
LayerChoiceReason
FrameworkNext.js 16 (App Router, Turbopack)Fast dev loop; file-based routing fits the small page count.
UI primitivesshadcn/uiCopy-paste components, full source ownership, accessible defaults.
StylingTailwind v4 + custom tokensOKLCH-based palette, dark mode via a single class flip.
DataFile reads against engine's JSON outputNo DB; the JSON files are the source of truth.
ChartsRechartsAccessible by default, fits the small-data use case.
Buildpnpm + TurbopackWorkspace-friendly with the widget submodule.