Features

Streaming chat, extended thinking, the conversation library, image and voice input, exports, usage analytics, and a resilient generation runtime.

This page describes current source at 0870b1e. The published v0.5.0 release predates several interaction and appearance changes described below; platform availability separates implemented behavior from verified platform evidence.

The chat surface

The chat screen is the whole app. It shows:

  • The active provider · model line, so you always know where messages go.
  • An empty-state prompt — "Ask privately." — with quick-start suggestions (Explain code, Improve UI, Summarize text, Debug error).
  • A composer labeled "Message CordyAI", with actions for attaching an image and starting voice input.
  • A setup banner when configuration is incomplete (for example "Add an API key before chatting"), with a direct Go to Settings action.

Streaming chat with live Markdown

Send a message and the reply streams in token by token, rendered as Markdown as it arrives — headings, lists, tables, fenced code blocks, and inline formatting all render live. The composer remains editable while a reply streams. With an empty next draft, its primary button is Stop; with a new draft or staged image, it is Send. Sending then cancels the active request, finishes saving the interrupted turn, and starts the replacement request.

Extended thinking

On models that support it (Anthropic's extended thinking, or reasoning models through an OpenAI-compatible provider), Cordy renders reasoning in a separate Thinking block, visually distinct from the final answer. The model picker offers Off, Balanced, and Deep reasoning levels, only on thinking-capable models.

Conversation library

Every chat is saved locally and listed in the library (each item is marked Stored locally). From here you can:

  • Create a new chat.
  • Resume any past conversation exactly where you left off — including re-attaching to a reply that is still generating.
  • Rename a conversation. Titles are auto-derived from your first message; rename to anything you like.
  • Delete a conversation (with a confirm dialog). Deleting also releases any image attachments it held.
  • Search your history by title, with a live "N of M shown" count and clear empty states.

Opening a conversation uses the provider and model it was created with — so a chat started under one provider keeps showing its own history against its own key, even if you've since switched providers.

Message actions

Long-press or use the action row on a message. Availability depends on the message and whether a reply is generating:

ActionAvailable onNotes
CopyAny user or assistant message with textCopies the message text.
ReportAny assistant message with textDrafts a local report (see below).
RetryThe latest message, if it's a failed assistant replyRe-attempts the same request.
RegenerateThe latest message, if it's a completed or stopped assistant replyDrops that reply and regenerates from history. Hidden while generating.
EditThe most recent user messageRewrite it and regenerate; later assistant turns are discarded. Hidden while generating.
StopWhile a reply is streamingCancels generation and marks the reply "Stopped".

Image input (Android)

Ask about pictures and screenshots:

  • Gallery — attach an image from your photo library.
  • Camera — capture a photo in the moment.
  • Share-in — share an image into Cordy from another app; you land in chat with the image staged.

Staged images preview in the composer ("Image ready · ready to send") and persist in the conversation so you can reopen them later. Image send is gated by model capability: if the selected model can't see images, Cordy blocks the send before any request and shows "Choose a vision-capable model before sending images," with a direct Change model action.

Camera and gallery access are optional and requested only at the moment you use them. If you decline the camera, image picking and share-in remain separate paths. Gallery selection and image send have real-device evidence; camera and share-in manual smoke remained open at v0.5.0 release.

Voice input (Android)

Tap the microphone in the composer to dictate. Cordy asks for a one-time disclosure before invoking the device speech-recognition service, then places the transcript as editable text in the message field. Microphone permission is requested at point of use. Cordy does not persist an audio recording; only text you send enters the conversation. Cancelling leaves the conversation unchanged. The Android path is implemented, but real microphone smoke remained open at v0.5.0 release.

Markdown export

Export any conversation as Markdown through the system share sheet — send it to notes, files, a chat app, or yourself. The export includes the provider and model names and the full message history. If the share sheet isn't available, Cordy copies the Markdown to the clipboard instead.

Usage & cost analytics

Open Settings → Token usage. Cordy records input/output token counts and cost for each completed response and rolls them up:

  • Totals across all runs (input tokens, output tokens, total tokens, cost, run count).
  • Breakdowns per model, per provider, and per day.

Cost is computed from the price captured at completion time, so later price changes don't rewrite history. When a provider doesn't report token usage, Cordy estimates locally and flags those figures with a leading . When no price is known, cost shows .

Report a response

If an assistant reply is unsafe or low quality, Report drafts a Markdown report — provider, model, message ID, and a truncated excerpt of the response, plus guidance on what to include. There is no backend: the sheet states plainly that CordyAI doesn't submit reports anywhere, and gives you Copy and Share so you can route the draft to wherever you collect feedback.

A resilient generation runtime

Generation is owned at the app level, not by a single screen, which makes an in-flight answer durable:

  • Survives navigation. Switch conversation, provider, or model while a reply is streaming and it keeps generating. Reopen the conversation and the screen re-attaches to the same live stream.
  • Recovers after restart. In-progress replies are checkpointed to the database about every 500 ms, so a mid-stream crash or force-quit recovers the partial answer instead of losing it. The network stream itself does not resume.
  • Clean recovery. On the next launch, any stream that was interrupted is cleanly marked Stopped rather than left dangling as "responding" forever — and you can regenerate from there.

Accessibility

Cordy targets WCAG AA contrast, defines Android TalkBack semantics across chat, settings, onboarding, message actions, and destructive flows, and uses touch targets of at least 44dp. A manual TalkBack pass remained open at v0.5.0 release. The current appearance settings include System, Light, and Dark modes plus reduced-motion handling; the repository records no completed iOS accessibility runtime evidence.

Platform availability

FeatureAndroidiOS
Streaming chat, Markdown, reasoningAndroid build/test and device chat evidenceNo repository link/run evidence
Conversation library, message actionsImplemented; core flows exercisedNo repository link/run evidence
Generation controls & usage analyticsImplemented and covered by shared testsNo repository link/run evidence
Markdown export / shareImplemented; export flow exercisedSource-wired to system share sheet; no recorded runtime evidence
Gallery image inputReal-device picker/send evidenceNot wired
Camera / share-inImplemented; manual smoke still openNot wired
Voice inputImplemented; real microphone smoke still openNot wired
Screen-reader passTalkBack semantics implemented; manual pass still openNo VoiceOver evidence

See Privacy & security → platform note for the full honest status.