Flow Ai Chat logo

Flow Ai Chat

Community
jpoindexter
flow-ai-chat

Use when designing, building, or reviewing any AI chat, assistant, copilot, or agent interface — composer, streaming responses, tool-use display, citations, regenerate/edit, or AI empty states. Also fires when users report the AI feeling frozen or opaque about what it's doing or can see, or when wiring confirmations before an agent takes consequential actions.

Overview

Publisherjpoindexter
Repositoryux-flow-skills
Skill nameflow-ai-chat
Stars
5
Forks
0
Bundled files
Instructions only
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by jpoindexter on GitHub. Read the source before you install it.

Installation

Install the Flow Ai Chat AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/jpoindexter/ux-flow-skills/tree/main/skills/flow-ai-chat
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/jpoindexter/ux-flow-skills.git /tmp/ux-flow-skills
mkdir -p .claude/skills
cp -r /tmp/ux-flow-skills/skills/flow-ai-chat .claude/skills/flow-ai-chat
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Flow Ai Chat in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Flow Ai Chat on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Flow Ai Chat is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

AI & Chat Interface Flows

Overview

An AI interface's core job is managing uncertainty: latency you can't predict, output you can't guarantee, and actions the user must stay in control of. Streaming, visible working state, and human-in-the-loop gates are the load-bearing patterns — not decoration.

When to Use

  • Chat/assistant surfaces, copilots embedded in tools, agent dashboards, AI generation panels
  • Adding tool use, citations, multi-step agent runs, or consequential actions to an AI feature
  • NOT for: classic autocomplete/typeahead — that's an input pattern, not a conversation
  • NOT for: one-shot ML features with instant deterministic results (spam filter, image tagger) — no chat chrome needed

The Proven Flow

  1. Empty state teaches by example. First screen: a brief capability statement + 3–6 clickable prompt suggestions spanning distinct use cases (ChatGPT, Claude, and Perplexity all converged here). Suggestions are real, specific prompts ("Summarize this PDF's key risks"), not categories ("✍️ Writing"). The composer is already focused. Never ship an empty text box with only "Ask me anything" — blank-page paralysis produces weak first prompts and weak first impressions.
  2. User sends; the message appears instantly. The user message renders optimistically, the composer clears, the view anchors to the new exchange. Multi-line input via Shift+Enter; Enter sends (web/desktop convention). On mobile, the send button sends and return key makes a newline.
  3. The response streams token-by-token. Target under ~1 second to first visible activity — show a lightweight shimmer/typing indicator until the first token. Render Markdown progressively: headings, lists, and code blocks format as they arrive, not in a raw-text pass that reflows at the end. Blocking on the complete response is the single worst AI-UX mistake; streaming is the interaction, converting a 20-second wait into 20 seconds of reading.
  4. A stop button replaces send during generation. Same position, swapped icon (ChatGPT/Claude convention). Stopping keeps the partial output in the thread and returns control immediately. Never force the user to wait out a generation they can already see is wrong.
  5. Tool use and agent steps render as visible working state. Each step is a compact live status line ("Searching the web…", "Reading main.ts", "Running tests…") that resolves into a collapsible completed entry with a one-line result summary. Steps are collapsed by default, expandable to full input/output detail (Cursor's agent steps, Claude's tool-use blocks, v0's build steps). For long runs, show step counts or progress so visible silence never exceeds a few seconds.
  6. Consequential actions gate on the human. Before the agent sends an email, deletes files, spends money, or pushes code: show exactly what will happen — the draft, the diff, the literal command — with Approve / Edit / Reject. Approval is per-action or narrowly scoped ("allow file reads this session"), never a blanket "always allow everything" default. Cursor's command approval and agent-framework HITL checkpoints prove the pattern; one unapproved destructive action ends trust permanently.
  7. The response tail carries recovery affordances. After each assistant message: copy, regenerate, feedback. Regenerate versions the response with a pager ("2/3" — ChatGPT) rather than silently discarding the previous attempt. Edit on the user's message forks the conversation from that point — make the fork explicit so users understand what happened to the downstream messages.
  8. Errors and refusals stay in the conversation. Failed generation → inline error bubble with Retry; partial output preserved. Refusal → one-line reason + what the AI can do instead — never a dead-end lecture. Rate limit → what the limit is, when it resets, and what tier removes it. Context-window exhaustion → offer to summarize-and-continue or start a linked new chat, don't just degrade silently.

Layout & Structure

Composer

  • Pinned to the bottom, full conversation width, auto-growing to ~8–10 lines then scrolling internally.
  • Attachment/context controls on the left or inside the field; send/stop on the right.
  • Keep the composer usable while a response streams — queue the next message or allow interjection per your product model; a dead composer during generation feels broken.
  • Attached context renders as removable chips above or inside the composer, not as invisible state.
  • Power features that pay for themselves: drag-and-drop + paste for attachments, @-mentions for context objects (files, docs, people), /-commands for actions, up-arrow to recall/edit the last sent message.
  • If input length is limited, show remaining capacity as the user approaches it — never reject a long prompt only after send.

When chat is the wrong shape

  • Structured input with known fields (an address, a config, a booking) → render a form (see flow-forms), optionally AI-prefilled, not twenty conversational turns.
  • Single-field transformation (rewrite this sentence, summarize this cell) → inline affordance at the content, not a detour to a chat panel.
  • Chat is for open-ended, iterative, multi-step work. Forcing it everywhere trades one good interface for a slower universal one.

Message column

  • Single scrolling column, message text capped at ~65–75ch on desktop for readability; the column centers in wide viewports.
  • User vs assistant messages distinguished by one consistent system — alignment, background, or avatar; pick one, don't stack all three.
  • Assistant output is rich: Markdown, tables, code blocks with language label + copy button. User messages stay plain.
  • Auto-scroll follows the stream only while the user is at the bottom. The moment they scroll up to read, stop following and show a "jump to latest" pill. Yanking the viewport mid-read is a top complaint in every shipped chat product.
  • Timestamps on hover/tap, not inline noise. Day dividers for long histories.

Context indicators — show what the AI can see

  • Attached files, the active document, selected code, screen/page visibility, and connected tools all render as visible, removable chips (Cursor's @-context chips; Claude's attachment chips).
  • If the AI can see the user's screen, selection, or current page, say so explicitly in the UI. Silent context is a privacy failure; invisible missing context ("why doesn't it know about my file?") is a capability failure. Both erode trust in opposite directions.
  • If long-term memory exists across sessions, make it inspectable and editable — a visible list of remembered facts, each deletable.

Tool-step and agent-run blocks

  • Running: icon + verb + object one-liner ("Searching: EU AI Act fines"). Done: chevron-expandable summary. Failed: inline error state within the step, with its own retry — a failed step must not silently vanish.
  • Nest sub-steps one level maximum; deeper nesting is unreadable in a chat column.
  • Streaming code renders into a code block with language label and copy button from the first fence. File edits show a diff view, not a wall of replacement code (Cursor, v0).
  • Agent runs that modify files create a restorable checkpoint before applying; expose "restore to before this run" alongside the run summary (Cursor).
  • Runs >30 seconds need a persistent progress surface that survives navigating away, plus a completion notification path.

Citations

  • Inline numbered markers at the claim, resolving to a source list with favicon + title + domain (Perplexity's pattern). Hover/tap previews the source.
  • Citations must come from real retrieval. If the answer wasn't grounded, don't dress it in source chrome — fake citation UI is manufactured credibility and a legal risk.
  • Date-sensitive or low-confidence answers carry "as of" markers or hedges; never style a guess with the same confident chrome as a grounded answer.

Latency budgets

  • <1s: first visible activity (shimmer counts).
  • <3s: first token, or explicit progress replaces it ("Searching 12 sources…").
  • >10s of one step: show sub-progress or interim findings.
  • >30s total: persistent/backgroundable progress + notify on completion.

History

  • Conversation list with auto-generated titles (editable), delete, and search. New-chat is always one click. Deleting a conversation follows flow-errors destructive rules (undo, not confirm).
  • Pin/star for conversations users return to; recency ordering otherwise.
  • Sharing/exporting a conversation produces a readable transcript and strips private context (attachments, memory) unless explicitly included — state what's included before the link exists.
  • Cold start is where latency budgets die: the first message of a session should still hit <1s to visible activity — prewarm, or mask with instant optimistic UI.

Mobile specifics

  • Composer stays pinned above the software keyboard; the conversation resizes, it doesn't hide behind the keyboard.
  • Return key inserts a newline; only the send button sends — mobile users compose multi-line messages constantly.
  • Message actions (copy, regenerate, feedback) move from hover to long-press or an inline overflow menu — hover doesn't exist.
  • Voice input is a first-class composer affordance on mobile, not buried in settings.
  • Streaming must not fight the on-screen keyboard: opening the keyboard keeps the latest message visible.

Tone and persona

  • An assistant should be deferential without being fawning. Josh Clark's framing: deferential is not flirty, not fawning, not feminine-by-default — don't dress an agent in a submissive or performative persona to make deference legible. State the boundary or the uncertainty plainly instead of apologizing around it.
  • Treat the assistant as there to empower the user's judgment, not just assist (Clark) — the tone should read as capability handed to the user, not a service performing helpfulness at them. This is why "Whoops, my bad! 😅" (below) fails: it performs personality where the user needed a plain cause and a retry.
  • Output is a signal, not a fact (Clark, citing Bender et al.'s "stochastic parrots" framing): a fluent response is not the same as a correct one, and the UI's job is to keep that distinction visible rather than let confident phrasing borrow authority the model didn't earn. This is the same instinct behind hedges and "as of" markers above — extend it to word choice, not just chrome.

Feedback & quality signals

  • Thumbs up/down on assistant messages, with an optional one-tap reason on the downvote ("inaccurate", "didn't follow instructions"). Never a mandatory free-text form — friction kills the signal.
  • Show which model/version answered when users can choose models; silent model switches break users' calibration of what to trust.
  • "Report" is separate from thumbs-down and routes to safety review.

Accessibility

  • Streamed responses announce via a single aria-live="polite" region updated in sentence/paragraph chunks — per-token announcements make screen readers unusable. Announce "response complete" at the end.
  • Stop, regenerate, copy, and step-expanders are real buttons, keyboard-reachable, with state (aria-expanded on collapsibles).
  • Enter/Shift+Enter behavior is documented in the composer's accessible description.
  • Shimmer/typing indicators respect prefers-reduced-motion with a static "Generating…" alternative.
  • User vs assistant messages distinguished by more than tint — alignment, labels, or headings a screen reader can navigate by.

Quick Reference

SituationPattern
First-run / empty threadCapability line + 3–6 concrete clickable prompts, composer focused
Waiting for first tokenShimmer/typing indicator, <1s to appear
Response in progressProgressive Markdown render + stop button in the send slot
AI is using toolsLive status lines → collapsible completed steps
Agent wants to act on the worldPreview exact action + Approve/Edit/Reject, scoped approval
Bad responseRegenerate with version pager on assistant msg
Wrong question askedEdit user message → explicit fork
Grounded answerInline numbered citations → source cards
Ungrounded answerNo citation chrome; hedge/"as of" markers
Generation failedInline error + retry, partial output kept
RefusalOne-line reason + viable alternative, in-conversation
User scrolls up mid-streamStop auto-scroll; show jump-to-latest pill
Files/selection/tools in contextVisible removable chips; never silent context
Run >30sPersistent progress, survives navigation, notifies on done
Context window fullSummarize-and-continue or linked new chat
Known-fields inputForm (AI-prefilled), not conversational turns
Mobile message actionsLong-press / overflow menu, not hover
Multiple models availableVisible model label per response
Rating a responseOne-tap thumbs + optional reason; never mandatory text
Sharing a conversationReadable transcript; private context stripped unless opted in
Screen-reader user mid-streamChunked polite live-region + "response complete" announcement
Deleting a conversationUndo toast, not a confirm dialog (see flow-errors)
First message of a sessionSame <1s activity budget — prewarm or mask cold start

Anti-Patterns

Anti-patternWhy it breaksFix
Spinner until the full response is ready10–30s of dead air; feels brokenStream tokens, render progressively
No stop control during generationUser trapped watching a wrong answer completeStop swaps into the send button
Raw text streamed, reformatted at the endJarring double-render and reflowProgressive rich rendering from first token
Silent tool use ("Thinking…" for 40s)Reads as a hang; hides failuresNamed visible steps with live status
Agent executes destructive actions unpromptedTrust destroyed on the first bad actionHITL preview + approve gate for consequential actions
"Always allow all" as the approval defaultOne click removes every future safety gatePer-action or narrowly scoped approvals
Auto-scroll fights the reading userViewport yanked mid-readFollow only at bottom; jump-to-latest pill
Empty state = blank boxBlank-page paralysis, weak first promptsConcrete example prompts as buttons
Dead composer during generationProduct feels lockedQueue or interject; keep input alive
Fake citation chrome on ungrounded outputManufactured credibility; legal riskCitations only from real retrieval
Regenerate silently deletes the old answerUsers compare versions; the loss is feltVersion pager (1/2, 2/3)
Edit-message fork left unexplainedUser can't find their old threadLabel the fork; show branch state
Refusal as boilerplate lectureNo path forwardState the boundary + an alternative
Hidden context (AI sees screen silently)Privacy anxiety + "why doesn't it know X"Context chips + explicit visibility notice
Confident styling on hallucinated specificsWrong answers inherit the UI's authorityHedges, grounding labels, "as of" dates
Prompt suggestions vanish forever after first useNew users' only scaffolding disappearsKeep examples reachable (new-chat screen, help menu)
"Whoops, my bad! 😅" on real failuresPersonality filler where users need factsPlain cause + retry; save charm for low stakes
Length limit discovered only on send-rejectLong prompt written, then bouncedShow remaining capacity as the limit approaches
Unsearchable, untitled historyPast work is unfindable, so it's redoneAuto-titles + search + pinning
Silent model downgrade under loadUsers misattribute quality drop to themselvesLabel the model per response; announce switches

Proven by: ChatGPT (streaming, stop, regenerate versions, prompt suggestions), Claude (tool-use blocks, context chips, artifacts), Perplexity (citations, source cards), Cursor (agent steps, diff previews, command approval), v0 (generation progress, streamed code/preview), Josh Clark's Sentient Design (tone/persona framing — deferential vs. fawning, signals not facts).

Frequently asked questions

What does the Flow Ai Chat AI skill do?

Use when designing, building, or reviewing any AI chat, assistant, copilot, or agent interface — composer, streaming responses, tool-use display, citations, regenerate/edit, or AI empty states. Also fires when users report the AI feeling frozen or opaque about what it's doing or can see, or when wiring confirmations before an agent takes consequential actions.

Why use Flow Ai Chat on TypingMind?

Because you install it once and use it with any model. Flow Ai Chat is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Flow Ai Chat in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/jpoindexter/ux-flow-skills/tree/main/skills/flow-ai-chat. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Flow Ai Chat?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Flow Ai Chat?

As many as you like. As long as a model supports skills, you can use Flow Ai Chat with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Flow Ai Chat AI skill free?

Yes. It is published on GitHub by jpoindexter under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇