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:
| Action | Available on | Notes |
|---|---|---|
| Copy | Any user or assistant message with text | Copies the message text. |
| Report | Any assistant message with text | Drafts a local report (see below). |
| Retry | The latest message, if it's a failed assistant reply | Re-attempts the same request. |
| Regenerate | The latest message, if it's a completed or stopped assistant reply | Drops that reply and regenerates from history. Hidden while generating. |
| Edit | The most recent user message | Rewrite it and regenerate; later assistant turns are discarded. Hidden while generating. |
| Stop | While a reply is streaming | Cancels 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
| Feature | Android | iOS |
|---|---|---|
| Streaming chat, Markdown, reasoning | Android build/test and device chat evidence | No repository link/run evidence |
| Conversation library, message actions | Implemented; core flows exercised | No repository link/run evidence |
| Generation controls & usage analytics | Implemented and covered by shared tests | No repository link/run evidence |
| Markdown export / share | Implemented; export flow exercised | Source-wired to system share sheet; no recorded runtime evidence |
| Gallery image input | Real-device picker/send evidence | Not wired |
| Camera / share-in | Implemented; manual smoke still open | Not wired |
| Voice input | Implemented; real microphone smoke still open | Not wired |
| Screen-reader pass | TalkBack semantics implemented; manual pass still open | No VoiceOver evidence |
See Privacy & security → platform note for the full honest status.