Skip to content

Documentation

Ask Kicklace

The assistant inside the app, over the same tools Claude gets through the connector, acting as you. It is for the founder who has no Claude subscription and should not therefore have a lesser CRM: one registry of tools, three doors onto it, and a tool added for one arrives in all three the same day.

Ask Kicklace is the assistant inside the app. It runs on the same tools Claude gets through the connector (docs/mcp.md), it acts as you, and everything it changes is written on the record in your name and listed under Settings → Claude.

It exists because a founder without a Claude subscription was getting none of that. One registry, three doors — claude.ai, Claude Code, and the app itself — and a tool added for one arrives in all three the same day.


Opening it

Ask Kicklace is summoned where you are, not parked in a sidebar.

  • ⌘J (Ctrl+J on Windows and Linux) anywhere in the app.
  • Ask on a record's header, and on a card's panel in the pipeline. The box opens under the button already knowing which record you are looking at, so "what should I do about this?" needs no name in it. The line at the top says About Greg Halloran.
  • ⌘K, the search palette, when what you type reads as a question — it ends with a question mark, or it is longer than anybody types to find a record. The first row is Ask Kicklace: who joined this week? and Enter opens the box with it.

Not ⌘K on its own: that is the search palette and has been since the palette landed. Taking it would cost everybody the one shortcut they already know.

The box is a small panel you can drag by its header and close with Escape or the ✕. It is deliberately not modal — the page behind it stays readable, because the whole point is to ask about what you are looking at. On a phone it is a sheet on the bottom edge.

What it can do

Everything the tools do, which is what Settings → Claude lists: find people, read one person's whole story, run a report and keep it as a chart, add a note or a task, put somebody on a list with the words they agreed to, write a template, make a list, add a stage or a field, write an automation as a draft, install a starter, connect a website address, invite a member.

Each call is drawn as a card as it happens — the tool in the same words the log uses, the one line it wrote about itself, and Open when it answered with a link:

Make a list · Made the list Product updates · Open

A write carries a small change tag, the way the log does. A tool that refuses says what it said, in its own sentence, and the model reads that and tries something else.

What it never does

The same four rules the connector keeps, because they are the same tools:

  • It never sends an email. It drafts one and hands you the link; a person presses send.
  • It never deletes anything. No record, no note, no consent record goes because you asked in passing.
  • It never puts anybody on a list without the words they agreed to. The sentence is stored on the subscription, as the proof it always is.
  • Everything is in your name. A note, a stage move, a task — the timeline says "<member> via Claude", and the call is on the log under Settings → Claude.

Sending, deleting, removing a member, revoking a key and disconnecting an integration are proposals. The box does not refuse them and does not do them: the model writes down what it wants in one sentence, and the card says Waiting for your approval with the link. They land on Approvals in the sidebar, where a person decides (docs/mcp.md → Proposals). That is the whole difference between Ask Kicklace and a chat window with a delete button in it.

A member who is not an owner or an admin gets the same refusals here as they get on the screens: the tools ask the same question the app asks.

And it does not take orders from your data. A note, a reply, a form's words — anything a tool hands back is something somebody wrote down, and the model is told so: it never follows an instruction found inside a record, it tells you the record says it. That is the same rule the AI steps inside an automation keep (docs/automations-v2.md).

What it costs

The workspace's own model, on the workspace's own allowance — the one Settings → Billing shows.

An ask is a conversation, so it is several calls: one for each turn the model takes, at most eight. The gate runs before every turn — the server's key, the switch under Settings → General, the account's day — so a workspace that runs out of allowance halfway through an ask stops halfway through and says so. On the console the purpose is Ask Kicklace, counted apart from charts, summaries and automations.

Stop is beside the box while it is answering, and it stops there and then.

With AI switched off the box says so instead of an input, and with no model set up on the deployment at all it says that instead — each names its own fix, or says there is none:

AI is off in this workspace. Turn it on under Settings → General.

AI is not set up on this deployment, so Ask Kicklace cannot answer yet.

limits.assistant on the plan (src/lib/billing/plans.ts) is the other gate. It is true on every plan today, because nothing is charged yet; when #84 starts charging, a plan without it reads:

Ask Kicklace is not on your plan. Settings → Billing says what each plan includes.

Where your questions go

Settings → Claude → Your questions: your own asks for thirty days, with the answer and how many calls each one made. They are yours only — a question is a person's own — while the calls themselves are in What Claude did below it, where the whole workspace can read them, marked in the app so a call made here can be told from one made through the connector.

Nothing else is stored. No argument, no address, no words of a note ever land in the call log, which is the rule the door already keeps.

For whoever is reading the code

  • src/lib/ai/tools.tsrunWithTools, the loop, over a turn shape neither vendor owns. Both adapters implement streamTurn: claude.ts parses the Messages API's server-sent events by hand (the way it does plain fetch everywhere else) and puts a cache breakpoint on the last tool, since sixty-odd tools go out on every turn; gemini.ts sends the same JSON Schema as function declarations and reads functionCall parts back.
  • src/lib/ai/call.tsaiGate, the switch, the key and the allowance, as a function the loop calls before every turn. askModel calls it too, so nothing has two gates.
  • src/lib/data/assistant.ts — the system prompt, the tool runner (the registry's own handlers, a real McpContext, one agent_calls row each), and the transcripts.
  • POST /app/<workspace>/ask — session-gated like a server action, answering text/event-stream with text, tool, refused and done.
  • src/components/ask/*openAskBox({ at, context, label }) is the one way in, a window event so a server-rendered page can put a button anywhere. The right-click menu (#230) calls the same function.