The Ascension update is liveRead the post
Changelog

Everything that shipped, newest first

Every notable change to CRMS, generated straight from the engineering changelog at build time.

In progress

Added

  • Watch the AI summary read your dashboard

    pressing **Generate summary** used to buy a spinner and then a paragraph. The summary has always started by reading twelve things — your pipeline, the deals that have gone quiet, what is overdue, what landed this period — and it did all of it in silence. Now each read says what it found as it lands ("3 deals idle 14+ days"), and the card on your dashboard that shows that figure lights up as it is read. When the reading is done the list folds into one line — *Read 12 signals · 1.4s*, still there if you want to look, next to a gold bolt and the time it took — and the paragraph writes itself in underneath. While it works the card is lit: the same beam the **Ember AI** button in the header wears, plus a soft glow inside the card. While the assistant composes, the card shows the same *Thinking…* indicator the chat panel does. **Stop** now stops it: the request is cancelled, so nothing further is written and nothing further is billed.

  • A tidier dashboard header

    the dashboard opened with a greeting over a contact and deal count, both of which the cards below already say, and the dashboard switcher sat on a row of its own under it. The greeting is gone and the switcher has moved up into that row, restyled to match the time-range control beside it. The cards start two rows higher. Every widget card also carries a hairline border now, so a dashboard reads as cards in dark mode rather than as columns of loose text.

  • Cards you can set up, and a first row that says more

    the dashboard opened with four cards that each held one number and a small chart, which took the whole top row to say four things. Those four numbers now live together in **Workspace vitals**, and the space that frees goes to **Revenue this period**: what you won, how many deals it took, and the days it landed on, drawn as bars against a faint column for every day in the period, so a quiet week reads as a quiet week rather than as a chart that stopped. Two more cards come with it — **Pipeline share**, which shows how much open value is sitting in each stage in that stage's own colour, and **Target progress**, a gauge against a figure you set.

Fixed

  • Charts drew in grey instead of their own colour

    every sparkline and the Revenue won area chart painted a flat grey shape with no line, because they asked for a colour variable the chart library does not publish under that name. They now wear the colour of the card they sit on.

  • Quick actions left a band of empty card under it

    the shortcuts sat in a strip at the top of the card with dead space beneath, and their bottom edges faded out because a scroll effect was being applied to a list that does not scroll. The shortcuts now share the whole card, at any size it is dragged to.

  • Describe the dashboard you want and have it built

    in Customize there is now a **Build with AI** button. Say what your work actually looks like — "I run a small agency, show me what is about to close and what has gone quiet" — and the assistant picks the cards and arranges them. It can only choose from what your workspace has data for, so it cannot propose a card that would open empty, and it shows you the list of cards it chose, with one sentence on why, before anything changes. Nothing is applied until you say so, and you can go back and ask differently. The plain-English summary of what changed is a card again too: put it on the dashboard and press Generate when you want it, rather than paying for a paragraph on every visit.

  • A dashboard you arrange yourself

    the dashboard was the same page for every workspace and every person in it: four numbers along the top, the same three columns underneath, in the same order, permanently. It is now a board of widgets you move. Customize turns the page into a grid you can drag cards around, resize them from a menu, take ones you do not read off it, and add ones you do from a gallery. Nothing is saved by pressing Save — arrangements are kept as you make them. Dashboards are also tabs now, so the workspace keeps a shared one that everybody lands on while you keep your own beside it; if the shared one is nearly right, take your own copy of it and change what you like, and reset back to the workspace version whenever you want. Changing the shared one is an admin's job, because it changes what everyone sees, but arranging your own needs nothing from anyone. Underneath, each card now fetches only its own figures rather than the page computing all of them on every visit, so a slow card keeps the rest of the dashboard waiting no longer.

  • A page for people deciding whether to join the beta

    the public site now has /early-access, which answers the three questions / does not: what joining costs, what you can do on the first day, and what you are going to find missing. It opens with the arithmetic — how many capabilities have shipped, how many have not, and the price — then states the four terms of early access, walks the first ten minutes as five steps that each name the screen to open, and explains the six parts of the product one at a time with a real miniature of each beside it. It ends on the unfinished list, grouped by area, with a link to the reason behind every one. Every number and every capability named on the page is read out of the feature registry rather than typed, so a capability that regresses drops off the page on the next build and the page cannot claim something the product has stopped doing. Nothing new is collected from anyone: the buttons go to the same open sign-up they always did, because there is no waiting list to join.

  • Somewhere to see what the product is doing

    CRMS could answer every question a workspace had about itself and none at all about the product, so there is now a console at /admin for whoever runs it. It shows signups and active workspaces over time, every tenant with its people and records, and which workspace is spending the assistant, with a log search over everything the app has emitted. It belongs to the person running CRMS, not to anyone using it: it is reached by a role held on the account rather than in any workspace, and a customer who finds the address gets a 404 rather than a locked door, because a locked door confirms there is a room. An operator can ban an account or open a customer's screen as them to work out what went wrong, and both are written to the audit trail against the operator, not the customer. The AI figures are token counts and never money — CRMS stores no prices and each workspace brings its own provider key, so the bill is not ours to report.

  • Logs that survive a deploy

    every request and error now becomes one structured event carrying who, where, how long and what happened, and is shipped to a dataset that keeps it. Until now the app wrote its logs to standard output, which meant that after any restart there was nothing left to search — an error reported on Tuesday could not be looked up on Wednesday. Nothing about this is visible from inside a workspace, and no log leaves the server on its way anywhere: the browser never talks to the log service. A deployment with no log service configured still starts and still logs to the console, and says so on the page rather than showing an empty table that looks like calm.

  • How fast the answer came

    when your workspace routes through OpenRouter, the assistant's header now says how long the last answer took to start: a small 1.2s beside the thread controls. Hover it for the rest — the wait before the first word, the time to the finished answer, which company actually served it, and the model that wrote it. That last one is why this shows up for OpenRouter and nowhere else: OpenRouter sends the same model to whichever provider is healthy at the time, so two questions in one conversation can be answered by two different companies at two different speeds, and now you can see which. Nothing is timed in your browser and nothing extra is requested — the numbers come back with the answer itself. Workspaces on a direct key see nothing new.

  • A page about Ember AI

    the public site now has /ember-ai, a page for the assistant itself rather than one row in a feature list. It replays a real turn: pick one of three questions, pick which lab answers it from a row of six, and watch Ember call its tools one at a time, write the answer, and stop to ask before it changes anything — including an approval you can click. The answer is uncovered by a soft edge that travels down it as it is written, so you can see the difference between Ember still writing and Ember done. Under that it sets out what you can ask about — your pipeline, your people, your companies, your day, your workflows and your workspace — with the real number of tools behind each one. The seven model providers sit beside a live picker: choose one of the labs' recommended models and the wall below lights the lab it came from, and one switch says how hard Ember thinks about your question. The last two sections say where else Ember turns up in the product, and what stops it doing more than you can. Nothing on the page is live: the turn is a recording, so it costs nothing, behaves the same every time, and cannot be prompted by a stranger. Reachable from the header, the phone menu and the footer.

  • Sign in with Google

    the Google button on the sign-in and sign-up pages now works. Pick your Google account and you are in; there is no password to set and no extra step. If you already have a CRMS account on that same address, Google signs you into it rather than making you a second one, so nothing you have already done goes missing. You choose which Google account to use every time, which matters if you keep work and personal accounts in the same browser. Signing in asks Google for nothing beyond your name, email and picture — it does not touch your calendar; connecting a calendar is still its own separate step on the Calendar page. Apple is still not available and its button says so.

  • A privacy policy and terms of service

    three new public pages say what Product 5 does with your data: a privacy policy listing exactly what is collected and how long each kind of it is kept, terms of service covering what you can do with the product and what stays yours, and a sub-processor list naming every outside service that can see your workspace — including which ones you can switch off. All three are linked from the footer of every public page, and the sign-up form now says which ones you are agreeing to. Written in plain English, not legalese; not yet reviewed by a lawyer, and the registry says so.

  • Connect your Google Calendar

    connect your Google Calendar from the Calendar page, one account per person; everyone on the team connects their own. Once connected, CRMS checks for new or changed meetings every 15 minutes on its own, and a Sync now button is there for whenever that is too slow to wait for. Google always has the last word: if a meeting changes in Google, that is the version CRMS shows, and a meeting that repeats on a schedule appears here but has to be edited in Google itself.

  • A Calendar page for your meetings

    a new Calendar page shows your synced meetings by month, by week, by day, across a few days at a time, or as a plain list, in your workspace's own time zone. Drag a meeting to move it, drag its edge to make it longer, or drag across empty space to book a new one. A meeting that repeats can be read here but is moved in Google. The page shows what Google Calendar sync brings in, so connect an account first to see anything on it.

  • Book a meeting without leaving CRMS

    create, edit or cancel a meeting right from the Calendar page. It is written straight to your real Google Calendar, not a copy, so it shows up there exactly the way it shows up here.

  • Meetings attach themselves to the right contact

    when a synced meeting has exactly one attendee whose email matches a contact, CRMS attaches the meeting to that contact on its own. Anyone can also link a meeting to a deal or a company by hand from the Calendar page.

  • Your currency, not dollars

    Settings now has a Regional card where an owner picks the currency their deals are in and how numbers and dates should be written. Everything that shows an amount follows it: the dashboard tiles and charts, the deals table and board, deal and company pages, search results and the assistant's replies. Pick English (India) and a pipeline reads ₹12,50,000 rather than ₹1,250,000. New deals start in your workspace's currency instead of USD, and a deal that already carries a different currency keeps it, so one euro deal still reads in euros. Changing the setting re-labels existing values — it does not convert them, and no exchange rate is applied anywhere.

  • Preview a file without downloading it

    an image attachment opens in a dialog and a PDF opens in a new tab, straight from the record it is attached to. Only images and PDFs can be previewed; everything else still downloads, because those are the only types a browser can be trusted to render.

  • Document presets

    write down the documents your business asks for once, on the Regional card, and each one becomes a named entry under "Add field" in the form builder. Adding "PAN card" that way gives you a required field that accepts a PDF or a photo, and the answer arrives labelled pan_card rather than document_3. The list starts empty, so a workspace that never fills it in sees exactly what it saw before.

  • A link you can just send

    a published form's own URL now sits at the top of its Share card with buttons to copy it and to open it. It used to be visible only inside the iframe snippet, which meant retyping it by hand to send someone the form. The link needs no allowlist and works on its own — embedding is still the separate thing below it.

  • Rename a field from its menu

    the field menu in the form builder now offers Rename. Clicking a field's name already did this; nothing said so.

  • A daily allowance for the assistant

    everybody in a workspace now gets 100 assistant messages a day. The allowance is your own: using yours up leaves every colleague's untouched, and it comes back at midnight UTC whether or not you clear your conversation history. Settings → AI assistant shows how many you have left and the time they come back, in your own clock rather than in UTC — and everyone can see their own, including members who cannot touch the model or the key. When it runs out the assistant says so and tells you roughly how long is left, with no Try again button, because pressing one before the allowance returns cannot work. Approving a change the assistant proposed does not cost a second message, and a workspace with no AI key of its own is not charged at all — its replies are the built-in demo and never reach a model.

  • Build a workflow by describing it

    a chat now sits beside the automation canvas. Describe the rule you want in your own words and the steps appear on the canvas one at a time, filled in with your workspace's own tags, teammates and pipeline stages rather than placeholders, then settle onto a tidy grid once the workflow is finished — no need to reach for Tidy up yourself. Nothing about the workflow is saved until you press Save, so a suggestion you dislike costs a reload. Clearing the canvas to start over asks first. If the rule needs an email you have not written yet, it drafts the subject and body and shows you both: the template is only stored once you press Create, and one that uses a merge field CRMS cannot fill in is caught before you are asked, so no customer receives a message that opens "Hi ,".

  • One key for every model, through OpenRouter

    the assistant can now run on OpenRouter as well as on OpenAI, Anthropic, Google, Groq, xAI and DeepSeek directly. One key reaches all of them, so a workspace whose model has run out of free requests for the day can keep working instead of waiting for midnight.

  • The assistant carries the tools it needs, not all 48

    it used to be handed every tool at the start of every message, about 11,000 tokens before it had read your question. Seven now stay to hand — find a record, open a deal, read the scoreboard, list open deals, list tasks, make a task, write a note — and the rest are narrowed to what your conversation is actually about. Most of the benefit is not the money: a model choosing between fifteen tools picks the right one far more reliably than one choosing between forty-eight. On Anthropic models the narrowing happens inside the provider, which can also fetch a tool mid-answer for free. Every other provider gets the shortlist worked out before the answer begins, so nothing changes while the assistant is working and your conversation stays cached. Because that shortlist is fixed before you get an answer, the tools for creating and opening contacts, deals and companies are always on it: a request like "add some demo records" names no record type for the shortlist to match, and without that guarantee the assistant would tell you it cannot create a deal at all. It is also told its list is partial, so when it genuinely lacks a tool it says which action it cannot take and asks you to name the record type, instead of reporting a limit of its own as a limit of CRMS. A model too old for the provider's own search — or one you typed in yourself — is never sent a setting it would reject and gets the shortlist instead, so it keeps the benefit either way.

Changed

  • Dashboard cards resize to any shape, and look it

    a card could only be one of five shapes, picked from a menu, so a dashboard was fitted to the sizes rather than to your screen. Now you drag any edge or corner of a card to whatever width and height you want. Point at a card in Customize and a grab strip appears down each side; the corner control reads out the size as you pull, and the grid the card is snapping to is drawn behind the dashboard so you can see where it will land instead of guessing. Arrow keys still move a card from the keyboard, and Shift with the arrow keys now resizes it. Each card stops at its own minimum, so a chart cannot be squeezed down to a column with nothing readable left in it, and the five old shapes are still in the size button as one-click shortcuts.

  • The whole CRM works on a phone now

    every screen was built for a laptop and assumed one: page margins ate a sixth of a small screen, settings rows put a 200px label beside a field and left the field about sixty pixels wide, and a breadcrumb three levels deep pushed the buttons at the top right off the edge. All of that now folds instead of overflowing. Labels sit above their fields on a narrow screen rather than beside them, headers drop their buttons to a second line, the trail at the top shortens to just the page you are on, and lists keep their table and let you swipe it sideways — the two least-used columns on the deals list step out of the way until there is room for them. Long forms opened in a window now scroll to their Save button instead of running off the bottom of a short screen, the calendar opens on the agenda rather than a twelve-pixel-wide month grid, and the command palette sits high enough that the on-screen keyboard no longer covers its results. Nothing moved on a desktop: every change is a rule that only applies below a threshold your laptop never crosses.

  • Buttons you could only find with a mouse

    the rename and delete controls on a saved conversation, and copy, retry and rate under an assistant reply, only appeared when a cursor hovered over them. A touchscreen has no hover, so on a phone or a tablet they were invisible and there was no other way to reach them. They are now shown outright on any device that cannot hover, and still fade in on hover where a real pointer exists. Small controls throughout also got a larger invisible target around them, so hitting a 24-pixel icon with a thumb no longer takes two attempts.

  • Small finishing details across the interface

    the selected item in the left-hand menu no longer thickens its own text, which used to nudge every row beside it by a pixel as you moved between pages. Counts and page numbers that were rendering in proportional figures now use the fixed-width ones the rest of the product uses, so they stop jittering as they change. A handful of animations that were told to transition every property now name the ones that actually move, the two controls that shrank hardest when pressed were brought back in line with everything else, the one focus outline drawn in red is grey again like every other, and the placeholders that ended in three full stops now use a real ellipsis.

  • One dark mode, and it is the one the AI page already had

    dark mode across the whole product now uses the palette built for /ember-ai: a deeper, cooler near-black canvas with cards sitting quietly above it. The old dark theme lifted every card so far off the page that a screen of them read as a stack of separate pages; this reads as one surface with things laid on it. Cards no longer draw an outline in dark either — the fill alone says "card", and a board of twenty stops looking like a wireframe. Lines are kept for the things that *hold* cards, like a pipeline column, where a line is what marks the group. Menus, hover states and pressed controls are now three distinct shades instead of the same grey doing all three jobs. Light mode is untouched and the light/dark switch works exactly as before — /ember-ai stays dark whichever one you pick, because that page is showing you what the assistant is.

  • Card icons match the menu you came from

    the small icon on a card used to be a pale wash of its colour, and drawn as an outline, while the matching row in the left-hand menu was solid and filled. The same subject looked like two different things depending on where you met it. Card icons are now the filled, solid version everywhere: the four figures across the top of the dashboard, its cards, the activity feed, open tasks, quick actions, needs-attention, the calendar connect card, the task list's date headings and the duplicate-review sections. Hues come from one list rather than per screen, so contacts are the same blue on the dashboard, in the menu and on the duplicates page. The task list's headings also read as a ramp now — red overdue through amber today to violet later — so the colour repeats the order instead of adding a second code. Nothing gained an icon it did not already have.

  • Deploys are about three times faster, and no longer migrate the database themselves

    two changes to how CRMS is built. Next.js moved to 16.3, which keeps what it compiled last time and reuses the parts that did not change, so a repeat build now takes about a third of the time a cold one does. And schema migrations no longer run as a step of the build: they run from their own GitHub Actions job on a push to main. That means the machine that builds the site no longer holds the production database password, and a build that fails halfway can no longer leave the database changed to match code that never shipped. Nothing about the running product changes.

  • A landing page that explains the product before it sells it

    the home page has been rebuilt around someone who arrives never having heard of Product 5. It now opens by saying what the product is, says why it exists, and then proves the one claim everything else rests on: pick Agency, SaaS or Real estate and watch the pipeline stages and the deal fields change into what that business would actually set up. Three plain steps follow, showing the order a workspace is built in. The old feature grid is gone; its four screenshots were moved into the sections that now need them, and nothing on the page claims a capability the registry does not mark as shipped.

  • A Thinking switch that works on every model, not only Claude

    the composer's Fast/Thorough button is now called Thinking, and it does what its name says. It used to buy real thinking on Claude and nothing but extra tool steps everywhere else, so it went quietly weaker the moment you switched to Gemini, GPT-5, Grok, DeepSeek or a Groq route. It now asks each of them for reasoning in that provider's own words, and switches it off again to get the quick answer back. The tooltip says which of the two you are getting, because a model with no reasoning at all — GPT-4o, Llama 3.3 — still gets the extra steps and should not be promised more. Nothing is sent to a model whose accepted values we have not checked, so a hand-typed model id behaves exactly as before.

  • A sidebar in sections, and your AI credits in it

    the sidebar is now divided by hairlines into what it actually holds: your workspace, the ways in, the places, the data chores, and you. Every row's icon is a filled tile in the colour of what it stands for, so you find Deals by the purple one rather than by reading five labels. Ember AI is the exception: a plain black tile whose label catches a sweep of the assistant's own colours when the sidebar first paints, and again whenever you point at the row — the same shimmer its greeting wears, because it is the one row here you talk to rather than browse. The rows are shorter and quieter than they were, and search reads "Quick search" and sits in the column with everything else instead of wearing a box of its own. Pinned above your name is a meter of your daily AI messages — how many are left, and twenty-five segments filling up as you spend them — so the limit stops arriving as a surprise; it opens the settings card, which still tells you the hour they come back in your own timezone. Nothing moved: every destination is where it was.

  • You can tell a long answer from a stuck one

    while the assistant is working and has nothing to show yet, the spinning dot is replaced by a small grid with a front of light driving across it. The wording still escalates as the wait does — Thinking, Still thinking, Working through it — and once a turn passes four seconds a running clock appears beside it. Under four seconds nothing extra shows up, because most answers arrive before anyone has started to wonder.

  • A chat list you can scan, and a header that stops taking up the room

    the list of saved chats is now grouped by when you last used each one: today, yesterday, the last week, the last month, older. Each chat is a single line with its age beside the name — 9h, 2d — instead of two lines where "about 9 hours ago" was set as large as the chat it belonged to, so roughly twice as many fit on screen. There is a filter above the list, because the first thing you type is what names a chat and most people start a lot of them the same way. It loads a screenful at a time and shows the shape of the list while it arrives, rather than a spinner. The bar over the conversation lost its message count and its strapline and is now one line high, and the chat on screen can be renamed or deleted from it without going to find its row first. Spacing across the whole page was pulled onto one rhythm, and New chat is now an outlined button the same height as the filter beneath it.

  • The sidebar names each section by colour

    the icon beside every navigation row now sits on a bright tile drawn from a set of five: sky, pink, yellow, salmon and green. Dashboard is sky, contacts salmon, companies pink, deals yellow, tasks green, automations sky, Ember AI pink, import yellow and duplicates salmon. Five colours across nine rows means some repeat, so they are spaced as far apart as the list allows and no two rows of the same colour ever sit near each other. The column now reads by colour as well as by label, so you find Deals without stopping to read five words. Nothing else changed colour — dashboard cards, list rows and badges keep the quieter palette they always had.

  • Filled navigation icons, and seven glyphs that changed shape

    every row in the sidebar and in Settings now draws a solid icon instead of an outline. Only the back arrow stays outlined, because arrows always are. Tabler has no solid twin for seven of the glyphs CRMS used, so contacts became an ID card, companies a briefcase, tasks a checked list, members an org chart, integrations a puzzle piece, the audit log a timeline and the job monitor a radar. An icon means one thing everywhere in CRMS, so each of those changed on every screen rather than only in the navigation, and deals took the board glyph back in the two remaining places that still showed a briefcase. Members is the one real compromise: no solid group-of-people icon exists, so it now shows the shape of a team rather than the people in it.

  • AI Settings, renamed and moved up

    the Settings row that read "Ember AI" is now "AI Settings", and it sits directly under Tags instead of at the bottom of the Workspace group. It is the page you return to while tuning the assistant, where forms, templates and integrations are set up once and left alone. Integrations changed colour as a consequence: with AI Settings gone from between them, it would have matched the Audit log tile sitting right below it.

  • The assistant reads less of what it looked up

    opening a deal, a contact or a company used to put the whole record into the conversation, every column of it, and re-read it on every step of the answer. It now keeps the full record for the card you see and passes itself a shorter version — between a third and a half smaller — with the same names, amounts, dates, owners and counts. Nothing you can see on screen changed.

  • The assistant asks the model far less often

    creating a deal, moving one to a stage, or handing a task to a colleague used to need a lookup call first, purely to turn a name into an id. Those tools now take the name itself and resolve it on the server, which removes one model request from each of the most common changes. Every provider bills per request rather than per message, so on a key with a daily request cap this is the difference between the assistant lasting the afternoon and lasting a handful of messages.

  • The standing prompt and all 48 tool descriptions were rewritten in simplified technical English

    one instruction per sentence, the active voice, and one word for one thing. The instructions are clearer to the model and 6,400 characters shorter, which comes off every request of every conversation.

Fixed

  • A collapsed sidebar no longer springs back open

    collapsing the left-hand menu was remembered only for as long as you kept clicking around. The preference was being written down correctly on every toggle and then never read back, so any full page load — a refresh, a link from an email, opening the app in the morning — returned the menu to its full width and you collapsed it again. It is now read before the page is drawn, so the first thing you see is the width you left it at, with no flicker of the wrong one first. The operator console does the same.

  • Two buttons that shared the same tap target

    the rename and delete controls on a saved assistant conversation sit directly against each other, and the invisible area that catches a thumb had been widened past the edge of each, so a band down the middle belonged to both. Which one you got was luck, and one of them deletes. The catch area now only grows upward and downward, where there is no neighbour to collide with, so each button answers for its own width and nothing else.

  • The box you type into had no edge in dark mode

    the composer sits in a shallow tray, and the tray is what separates it from the conversation above. Both of the tray's own colours were mixed against a light background: its outline computed to a line nobody could see on a dark screen, and its fill came out *lighter* than the composer inside it, so the frame read as the raised thing and the input as a hole cut into it. Both are now mixed against whichever way round the theme is, so the conversation, the tray and the input step apart in the same order in either. The tray's corners were also rounded three pixels wider than they should have been for the card they wrap, which showed up as a gap that opened at the corners and nowhere else.

  • Ember could not use your custom fields

    five separate faults sat between the assistant and the fields your workspace defines, and together they made a shipped feature unreachable from chat. A workspace that marked any contact or company field required could not have Ember add a contact or a company at all: the tools it was given had nowhere to put the value, so every attempt was refused for missing it. Asking Ember to set a custom field on many records at once failed the whole batch, because nothing told it how to name the field. Reading a record showed the raw storage key rather than the field's name, and showed nothing whatsoever when the field was empty, so Ember could not see that a field existed until somebody had already filled it in. One tool description pointed at a tool that does not exist. And on every provider except Anthropic, the tool that lists your field definitions was often not offered at all on the turn that needed it, even though Ember's own instructions tell it to read them before writing — so it either guessed or told you the field was not there. Ember now takes custom field values when it creates a contact or a company, names each field and its type when it reads a record and says plainly which are empty, knows how to write one across many records, and is always given the tool that lists your field definitions. Defining, renaming or deleting a field is still done by an admin in Settings, not by asking Ember.

  • The model picker and the Fast/Thorough button were invisible on an env-configured install

    both controls were drawn only when the workspace had saved its own API key in Settings. An install running on a key in the environment instead had a fully working assistant with neither control on screen: no way to change model per message, and no way to ask for a more thorough answer. The composer now reflects whichever provider the next message will really go to. A workspace with its own saved key gets the picker as before. A workspace running on the deployment's key gets the Fast/Thorough button and no picker — that model is one setting for the whole deployment, chosen by whoever pays for the key, so it is neither yours to change nor named on screen. Both controls disappear only when nothing at all is configured, which is the one state where there is genuinely nothing to pick.

  • Thinking stayed on for one message, then switched itself off

    turning it on lasted exactly one question: the next one went back to a quick answer without saying so, and the same went for the model you had picked. The composer is wrapped in the glow that runs around it while the assistant writes, and that wrapper is built differently while writing than while idle — enough that the browser threw the composer away and built a new one twice per message, taking everything in it. Your model, your Thinking switch and any unsent draft now live above the glow and stay put until you change them. That last one was the quiet part: a follow-up typed while an answer was still arriving vanished the moment the answer finished, along with any records you had attached to it. Starter chips and an edited message follow the switch too; they used to always ask for the quick answer no matter what it said.

  • "The model provider is temporarily unavailable", not "[object Object]"

    when the company hosting your model went down part-way through an answer, the assistant showed the words [object Object] under a card titled "Something went wrong", which told you nothing and read as a fault in CRMS. A failure that arrives after the answer has started speaks a different language to one that arrives before it, and only the second was understood. Both are now read the same way: the card names the outage, repeats what the provider actually said, and says to wait a moment and send the message again or pick a different model. The Try again button stays, because unlike a spent daily quota this one can succeed.

  • File uploads would have been blocked on the first real deployment

    files are sent from your browser straight to the storage bucket, but the app's security policy only ever allowed connections back to the app itself, so every upload would have been refused by the browser before it left the page. Nobody had hit it because no machine has storage credentials configured, which is also the only state in which the upload button is hidden. The policy now names the bucket, for uploads and for previewing an image, and nothing else.

  • The assistant's answers are kept, not just your questions

    reopening an earlier conversation showed only one side of it: every question was there and every answer was gone. Each answer was saved over the one before it, in whichever conversation had been written to first, so a thread you came back to read as a list of questions with nothing between them. Only answers that had paused for your approval survived. Every answer is now stored beside the question that prompted it, and a reopened thread replays in full. Threads from before this fix stay as they are — the answers they lost were never written down.

  • Approving a change the assistant proposed now actually applies it

    pressing Approve on a new deal, a stage move or any other proposed change could leave the change unmade. The assistant carried on as though it had run, then often said it was not sure the deal had been created. It had not been. Approve now does what it says.

  • Asking something else while an approval is waiting no longer breaks the conversation

    a proposed change sits on screen until you answer it, but nothing stopped you typing a new question instead. Doing so ended every following message in that conversation with "Something went wrong", permanently, and the only way out was to start a new chat. A question asked in place of an answer is now taken as a decision to skip the change: the assistant is told the change did not happen, and the conversation carries on.

  • The context gauge works for every OpenRouter model, not six of them

    one OpenRouter key reaches around four hundred models, and the gauge only knew the handful someone had written down by hand. Every other one showed "Context window unknown for this model" and no percentage. It now asks OpenRouter for the model's own context length, caching the answer, so a model added yesterday works today. If that lookup is slow or unreachable the gauge falls back to showing counts without a percentage, exactly as before — it never delays or fails an answer.

  • Opening a workflow no longer destroys your recovery copy

    the canvas keeps unsaved work in your browser and offers it back on your next visit. That copy was being deleted the moment the editor opened, before you could accept it, while the bar still said it was there. It survived one page-view: click away, come back, and it was gone. It now stays until you restore it, discard it, or save.

  • Closing the tab straight after an edit no longer loses it

    the browser copy was written half a second after you stopped typing, and closing the tab before then wrote nothing at all. It is now written on the way out too, whether you close the tab or navigate away.

  • Saving over a dropped connection now says so

    if the network failed mid-save, the button sat on "Saving…" forever and nothing told you the work had not landed. It now says the server could not be reached, points out that your changes are still in the browser, and lets you try again.

  • Two people can no longer overwrite each other silently

    a workflow is saved whole, so the second person to press Save used to erase the first person's steps with no warning at all. A save against a workflow that has moved on is now refused, and names what happened.

  • A rename is now kept with the rest of your unsaved work

    the browser copy held the steps but not the name, while the label said your changes were kept. Renaming a workflow and closing the tab lost the name.

  • A workflow the server rejects now points at the step

    a step with a missing setting produced a message naming the kind of step, with nothing highlighted, which on a large workflow meant opening each one in turn. The offending step is now marked on the canvas.

  • A rate limit no longer makes itself worse

    the assistant used to retry a refused request twice before giving up. Each retry was itself counted against the quota that had just refused it, and the waits were too short to help, so one rate limit quietly cost three requests and about thirty seconds of dead air. It now stops at the first refusal and says which limit was reached and when it clears — and when the limit is a daily one, it no longer offers a Try again button that cannot succeed.

  • Assistant write-tool tests were not running

    seven integration tests covering contact and deal writes were failing on a caching call that only works inside a Next request, so the behaviour they assert had been unguarded.

2026.08.10

Added

  • CRMS now deletes things

    until now nothing was ever removed permanently: a deleted contact was hidden, an archived workspace kept every row, and an account could not be closed at all. Each kind of data now has a stated lifetime and a daily check that cleans it up — deleted records go thirty days after you delete them, notifications after ninety, assistant conversations after six months, and the content of sent emails and old form submissions is blanked while the record that they happened survives. The audit trail is kept longest of all, seven years, because it is the thing that proves what happened. Deleting a workspace now means it is hidden at once, restorable by an owner for thirty days, and then erased along with everything in it. You can delete your own account from settings, confirmed by email; work you created stays with the workspace under "Deleted user", and if you were the only owner of a workspace with other people in it, we ask you to hand it over first rather than stranding them. People you email can unsubscribe in one click, and that choice is respected before anything is sent. Admins can see every window, and when each was last applied, at Settings → Data retention.

2026.08.09

Added

  • The assistant can reach the rest of the CRM

    it previously knew about deals and, barely, contacts. It now works across the whole record set. It can search companies and tasks by name alongside deals and contacts; open a contact or a company and see the people, deals, open tasks, activity, tags and custom fields hanging off it; list your tasks, the overdue ones and the unassigned ones; and read the dashboard scoreboard for a period — counts, open pipeline value, won and lost, the funnel by stage, the biggest deals and the most stalled — so "how did we do this month" is one answer rather than a guess assembled from records. Admins can also ask it who changed what, out of the audit log. On the writing side it can now edit a contact or a company, mark a deal won, lost or reopened (which the stage alone never did — a deal parked in a "Closed Won" column was still counting as open pipeline), complete a task, retitle or reschedule one, hand it to a colleague, tag any record by name, and delete or restore a company or a task. Tasks it creates can carry a priority and an assignee, and no longer have to hang off a deal or a contact — "remind me to renew the SSL cert" is a task like any other. Everything with a consequence still asks first, and every write still runs with your own permissions and lands in the audit trail.

  • A blog on the public site

    the marketing site now has /blogs, with the first post at /blogs/ascension-update: a five-minute note on the Ascension release, organised into the eight areas it covers, with the thirty-five capabilities each one shipped listed underneath the argument for why they shipped together. The article carries a sticky section rail that tracks what you are reading; the IntersectionObserver behind it was lifted out of /features into a shared useActiveSection hook rather than copied. The announcement bar above the header now names the current release — with an animated gradient on the release name, the one sanctioned exception to the no-gradients rule, themed through --announce-gradient-* because that bar inverts between light and dark. It links to the post instead of pointing at the changelog, and Blog is reachable from the header nav, the phone drawer and the footer. Post content is a typed module rather than MDX — one post does not justify a compiler and a plugin chain.

  • A features section on the public site

    the marketing site now has a /features page listing every shipped capability, grouped under six plain-English names (Records, Pipeline, Tasks and activity, Data model, Automations and AI, Workspace and trust), plus a page per group at /features/<group>. Every entry is generated from content/registry.ts, so the site cannot claim a capability the codebase does not have, and the counts fall on their own if something regresses. The page also publishes what is *not* finished: a "Building now" block naming each in-progress capability and the exact thing blocking it. Nothing on the site mentions file attachments, outbound email or Discord, because none of the three has shipped.

Changed

  • The assistant knows what day it is, and who it is talking to

    it was told never to invent a due date but was never told today's date, so "remind me to follow up next Friday" had nothing to count from. It now gets the date in your own timezone on every turn, and resolves relative dates against it. It also knows your name and which member you are, so "assign it to me" no longer comes back asking which person you meant. Both ride with the turn rather than in the standing instructions, so the cached prompt prefix — and the response times that depend on it — are unaffected.

  • The assistant no longer offers members tools it would refuse them

    every request carried all 39 tools regardless of role, including the audit reads and the delete/restore pairs that are admin-only. A member is now offered the 29 they can actually use. Nothing changes about what anyone is permitted to do: the permission check inside each action was, and remains, the thing that decides. What changes is that a turn no longer spends part of its budget earning a refusal.

  • The first token arrives sooner

    the three lookups that precede every answer (saving your question, reading the workspace's provider key, resolving any pinned records) ran one after another. They now run together, which is up to two round trips less waiting before the assistant starts typing.

  • A stuck turn now ends

    a provider connection that never closed, or a lookup that wedged, previously ran until the platform killed it, spending the workspace's own API quota on an answer nobody would receive. Turns are now capped.

  • Claude Opus 5 in the model picker

    the catalogue stopped at Opus 4.8, which was also mislabelled as the most capable Anthropic option. Opus 5 was reachable only by typing its id into "Custom model…", and the token gauge could not show a percentage for it.

  • The public site says who builds it

    the footer's brand block now carries a "Built by" credit with the Solithix Labs mark, linking to solithix.com. It reads as a credit at rest and only takes on link styling on hover or keyboard focus. Blog is also a top-level link in the header nav, next to Prompts and Changelog, rather than only an entry in the Resources menu.

  • The public site header is sticky, and has a Product menu

    the top bar now follows the page as you scroll, so "Get started" is reachable at any depth rather than only at the very top; the hairline beneath it appears only once there is content behind it. The nav gained a Product menu covering the six feature groups and a Resources menu, and on a phone the links open in a drawer instead of disappearing entirely, which is what they did before.

  • The landing page covers what the product actually does

    it previously described four surfaces and eight areas, leaving companies, tasks, saved views, forms, CSV import, search, notifications and automations unmentioned. It now adds sections for the automation canvas, duplicate detection and merge, and the assistant's tool-grounded answers, along with an FAQ and a map of all six feature groups. Copy per section is capped at one sentence.

  • CRMS can run without a background worker

    a deployment can now be configured to run no worker process at all, which suits a demo or a small self-hosted install on a database that sleeps when nobody is using it. Automations, CSV import, notifications, outbound email and Discord posts switch off together and say so plainly on their own pages, instead of accepting work that would never happen. Contacts, companies, deals, activities, tasks, custom fields, saved views, the dashboard, hosted forms and the full audit trail all behave exactly as before, and bulk actions still run on up to 100 records at a time; above that they now ask you to narrow the selection rather than starting a run that would never finish.

  • Try a workflow against one record before switching it on

    pick a contact, company, deal or task and see exactly which path that record would take through the saved workflow: which conditions it passes, which branch it goes down, where it would stop, and what each step would do, with merge fields filled in from that record so a task title reads "Follow up with Ada Lovelace" rather than showing the raw field name. Nothing is carried out — no task is created, nothing is sent, and nothing is added to the workflow's run history. It says plainly what it did not check: a trigger's own conditions test the event that fires it, not the record you picked, so the preview assumes the trigger fired and starts from there.

  • Workflows can wait

    a workflow can now include a wait step, so "when a deal is won, wait three days, then open a follow-up task" is one rule rather than something you remember to do by hand. A waiting run says when it will carry on and can be cancelled outright. Three things it deliberately does: it finishes the workflow as it stood when the run started, so editing a rule never changes what an already-running copy of it goes on to do; it checks on waking that the rule is still switched on, the workspace is still live and the record still exists, saying which of those stopped it rather than reporting an error; and it allows one wait per workflow of at most 30 days, refusing a second one when you save rather than quietly running only the first.

  • A "Continue only if…" step, and a run history that says when a rule declined

    a workflow can now carry a condition that simply stops the run when a record does not match, instead of a two-way split with one path left dangling. More usefully, a run that correctly did nothing no longer looks identical to a run that did everything: the run history marks it as filtered and says a condition stopped it, which is the answer to "is this rule doing anything?" that previously meant opening a run and reading it step by step. Filtered is never shown as a failure, and stays distinct from skipped — one is the rule deciding, the other is a safety guard overriding it.

  • A trigger can now carry its own conditions

    "when a deal is closed" can be narrowed to won or lost, "when a deal changes stage" to a specific stage it moved out of or into, and "when a contact is updated" to only the fields you care about. Each of these used to need a separate condition step hanging off the trigger just to ask the question again, so the most common shape in the product cost two nodes instead of one. Workflows saved before this keep firing exactly as they did — a trigger with nothing narrowed still means every event of its kind.

  • Task titles and notification messages can use merge fields

    a task can be opened titled "Follow up with Ada Lovelace" rather than "Follow up", filled in from the record that set the workflow running. Typing {{ offers the fields available on that workflow and inserts the one you pick, so they are something you find rather than something you have to already know. Fields are only offered where they actually work: the same menu does not appear on an email's "to" address, which is sent as written.

  • The automation step palette is grouped, searchable and readable

    the palette used to be one flat run of nineteen triggers whose descriptions every one of them read "Starts the workflow, alongside any others.", above nine actions whose descriptions were written as full sentences and then cut off mid-word. Steps are now grouped by the record they act on — Contacts, Deals, Tasks, Companies, Activity — each with a short line saying what actually makes it fire, a search box over the whole list, and the four rarely-wanted merge events tucked behind "Show advanced". The steps you reached for most recently sit at the top.

  • A workflow step says whether it is ready to run

    an action on the canvas now shows at a glance whether it is configured, still needs something picked, or cannot run in this workflow at all. "Send an email" and "Post to Discord" previously read "Not configured" however carefully they had been filled in; both now say what they will actually do, and a step added in a future release cannot silently fall back to that same wrong label.

  • Automations moved out of Settings into the main sidebar

    building and watching a workflow is work, not a preference you set once, so Automations now sits alongside Contacts, Deals and Tasks instead of being buried three levels into Settings. Old links and bookmarks to the Settings location still open the right page.

  • The automations list says what each workflow has actually done

    every row used to read "No runs yet" whether or not it had ever run. A row now shows how many times the workflow has run and when it last ran, says so plainly when the last run failed, and links straight to that workflow's run history. A switched-off workflow is visibly dimmed rather than looking identical to a running one.

  • Integrations is now a browsable grid of apps

    each app shows its own logo, a line on what connecting it gets you, and its category, with everything already connected through it listed underneath. Connecting opens a dialog that first says where to find the credential in the other app.

  • Discord shows its real logo

    on the integrations grid, and on the "Post to Discord" step wherever it appears on the automation canvas.

Fixed

  • The assistant no longer breaks permanently after you switch workspace

    every message came back "Something went wrong", on every question, and stayed that way through reloads. The browser remembers which chat thread you were last in, but remembered only one for the whole machine: switch workspace, or let a colleague sign in on the same computer, and it kept sending the previous account's thread. The server correctly refused to write into a thread that was not yours — and then took the whole answer down with it, because nothing distinguished "cannot save this" from "cannot answer this". The thread is now remembered per workspace and per account, so switching back reopens the right conversation, and a chat that cannot be saved for any reason still answers instead of failing. Errors that happen before the assistant starts speaking now say what went wrong, rather than arriving as a blank "Something went wrong".

  • The assistant panel opens as a side panel again

    it opened at the full width of the window, hiding the page you opened it next to. It now opens at about a third of the window, and can still be dragged to any width, including full — whatever width you leave it at is what it reopens at.

  • Verifying your email address now actually takes effect

    clicking the link in the verification email worked, but the app could not see it for up to five minutes afterwards: it read your verified status from the session cookie rather than from the account itself, so the "verify your email" banner stayed up and inviting a teammate was still refused, on an address that had just been confirmed. Your name, email address and verified status now come from the account on every request, so a verification, an address change or a rename shows up on the very next page. The confirmation screen also tells the truth: it used to say "Email verified" to anyone who opened /verify-email for any reason — including people whose link had silently done nothing — and now reports what is actually the case, offering a new link when the address still is not verified. And because the reminder banner could be dismissed for good, taking the only "resend" button in the app with it, Settings → Profile now carries a permanent one under your email address that cannot be dismissed.

  • Every page failed to load

    a single mistyped style rule was enough to stop the whole application's stylesheet from being built, so every screen showed an error instead of the app. The rule was rewritten and the pattern that caused it removed everywhere it appeared.

  • Adding a step to a workflow crashed instead of opening the step picker

    "Add step" on the automation canvas threw an error and the picker never appeared, so no step could be added to any workflow.

  • The workflow step list can be scrolled

    the list of triggers, conditions and actions down the left of the editor was taller than the screen with no way to reach the bottom of it, hiding several actions entirely.

  • A workflow step opens by double-clicking it

    a step's settings could only be reached through a small icon in its corner, which nothing indicated was there. Steps now open the way they look like they should, and the icon still works.

  • A workflow branch no longer has to lead somewhere on both sides

    "if the deal is over a certain value, tag it, and otherwise do nothing" was impossible to save: both the Yes and the No path had to lead to a further step, so people had to invent a step that did nothing. Either path may now simply stop.

  • Saved views are usable again on the contacts, companies and deals lists

    the bar holding the view picker and the Save view button crashed instead of rendering, so on those three lists no view could be chosen, saved, renamed, shared or deleted. Only that bar was affected; the lists themselves and every saved view survived intact.

  • "Select all matching" now means what the list is actually showing

    on a contacts, companies or deals list narrowed by a field filter, "Select all N matching" and Export CSV quietly ignored that filter and acted on every record in the workspace instead. The list said 300; a delete would have taken all 5,000. Both now operate on exactly the rows you are looking at, and where a combination of search and filter cannot be expressed exactly, the select-all prompt and the export are withheld rather than acting on a wider set.

  • Deleting companies in bulk no longer leaves their people pointing at nothing

    deleting one company already detached its contacts, deals and tasks so they survive on their own. Deleting several at once did not, so those records kept a link to a company that no longer existed. Both paths now behave identically.

  • A search for `%` or `_` finds those characters, not everything

    typing a per-cent sign or an underscore into a contacts, companies, deals or tag search box matched every record in the workspace. It now matches records that actually contain that character — which also means the count beside "Select all N matching" is right.

  • An interrupted import can be picked up again

    a momentary storage or network problem part-way through an import used to mark the whole thing failed and unrepeatable, with some contacts already brought in and no way to finish. Transient problems are now retried automatically, and an import that stopped part-way can be resumed from the exact row it reached — no duplicates, no starting over. An import can no longer be recorded as finished twice.

  • Duplicate company detection describes what it actually does

    the Duplicates page never surfaced two companies sharing a domain, because CRMS refuses to save the second one in the first place. The description said otherwise; it now says companies are surfaced by name similarity.

  • Changing one field on a record no longer erases its custom fields

    editing a contact, company or deal without touching its custom fields used to blank every one of them, quietly and successfully. Custom values are now only changed when you actually change them, and clearing a single field is its own explicit action.

  • A deleted task can be brought back

    deleted tasks now appear in the recently deleted list alongside contacts, companies and deals, so an admin can restore one. Restoring was already permitted; nothing showed you the task to restore.

Added

  • Connect Discord and post to it from an automation, once a real webhook is confirmed

    a new Settings → Integrations page lets an admin connect a Discord channel by pasting its incoming webhook URL. The URL is encrypted before it is stored, and connecting posts a real test message first, so a mistyped webhook is caught there and then rather than by an automation silently failing at three in the morning. A connected workspace gains a "Post to Discord" step for its workflows, whose message can quote details from whatever record set the workflow off. **Not usable yet:** every test so far has run against a stand-in for Discord rather than Discord itself, so the connector stays marked as still being built until a real Discord channel has actually received a message.

  • Reusable email templates, with sending not live yet

    Settings → Email templates lets an admin or owner create, edit and delete templates with merge fields for a contact's name and email, a deal's title, or a company's name, filled in from the real record when a message goes out. An automation can now send one of these templates as its own action, choosing the record's own contact or a fixed address, and a "Send email" button on the contact and deal detail pages does the same thing for a person composing one-off — pick a template, review it, send. The sent (or failed) email shows up as a note on the record's timeline, naming the recipient. Nothing can actually be delivered without an admin setting RESEND_API_KEY — the templates page says so rather than letting a library look ready to use, and both the automation action and the "Send email" button render disabled naming the same variable.

  • A dry-run count before turning an automation on

    the canvas editor now shows "N records match right now" beside the enable toggle, checked on demand against the workflow's saved conditions, so flipping a rule on is never a guess at how many records it will touch.

  • Every CSV export is recorded

    exporting contacts, companies or deals now writes an entry to the workspace's audit trail naming who exported what, which columns, and whether a filter was applied. Filter values are deliberately left out: a filter value can be someone's email address. Downloading a whole customer list is worth a record; there was none.

  • A prompt library for the assistant

    /prompts collects seventeen copy-and-paste prompts in three sets: an empty workspace, a workspace with deals on the board, and a set that tries to break the guardrails. Each card names the tools it exercises, what a correct answer looks like, and the specific sign that something is wrong.

  • The assistant can create a deal

    "start a deal for Northwind at 48,000" now opens a deal on the board. It uses the pipeline's first stage unless you say otherwise, can attach a contact and an owner, and shows you the title, stage and value for approval first.

  • DeepSeek as a provider

    an admin can point the assistant at DeepSeek with their own key, alongside OpenAI, Anthropic, Google, Groq and xAI. Two models, V4 Flash and V4 Pro, both with a one-million token context window.

  • Gemini 2.5 back in the model picker

    Pro, Flash and Flash-Lite are selectable again, marked "Legacy". Google shuts all three down on 16 October 2026 and already refuses them on newer projects, so they are a choice for workspaces whose key still has access, not a recommendation.

  • A public changelog

    release notes live at /changelogs, generated from this file at build time so the site and this file cannot disagree. Entries are grouped by release and by kind, with internal registry slugs left out.

  • A landing page that shows the product

    the marketing page walks through the deal board, contacts, custom fields and the activity timeline, each illustrated with a working miniature built from the app's own components, so the previews follow the theme and cannot go stale. Below sits a summary of what the product covers, with each area's feature count read from the registry, then a note on how tenancy, roles and the audit trail are enforced.

Changed

  • One workflow can now start from several events

    "when a contact is created **or** when a contact is updated → do X" used to need two separate rules kept in step by hand, because a workflow was allowed exactly one trigger. A workflow can now carry as many triggers as it needs, all feeding the same conditions and actions, and one event runs those actions once no matter how many of the triggers it matches. Every trigger on a workflow must be about the same kind of record — mixing a contact trigger with a deal trigger is refused when you save, with a sentence saying which one disagrees, because a condition can only be checked against one kind of record and the alternative is a rule that fails half-way through a run at three in the morning.

  • The assistant conversation has been rebuilt

    a turn that looked up three things used to stack three bordered panels the same visual weight as the answer itself, which buried the answer. Those are now one rail: a line of dots naming each step as it happens ("Reading the pipeline", "12 open deals"), open while the assistant works and collapsed to a single summary the moment it finishes. Any step can be opened to see the records behind it, and results now render as cards for stages, people and tasks, not only deals and contacts.

  • Approvals show what you are giving up, not only what you are getting

    a request to move a deal used to read "Stage: Proposal". Where the assistant has already looked at the record, it now reads "Discovery → Proposal", with the old value struck through; a turn proposing several changes offers a single Approve all. Deletions are styled as deletions rather than sharing the ordinary confirm button.

  • Long answers open as a document

    a drafted email or a long summary can be lifted out of the scrollback into its own pane, docked beside the conversation when there is room and laid over it when there is not, with copy and download. Finished replies also carry copy and retry, revealed on hover.

  • The assistant panel can be resized, and both surfaces are the same screen

    the slide-over's left edge is now a drag handle that carries momentum and resists past its limits, and remembers its width. Drag it wide enough and the document pane docks beside the conversation instead of covering it. The panel and the full page used to be two copies of the same header that had drifted apart; they are now one component and differ only in what wraps them.

  • A new empty state

    the four starters are the same four the composer menu offers rather than a second copy that could drift, they carry their icons, and the two that need a record now fill the composer and open the record picker instead of spending a turn discovering they have to ask.

  • The sidebar is shorter, and settings has its own home

    the sidebar listed seventeen destinations, ten of them administration you open perhaps once a month, sitting at exactly the same weight as the contacts and deals you open all day. It now lists the six places you work, two data tools under their own heading, and a single Settings entry. Settings opens into its own section with its own menu, grouped into what belongs to you, what belongs to the workspace, and what only an operator needs — every settings page keeps the address it already had. The audit log and the job monitor no longer appear for members, who could only ever reach a "not found" page from them. The page name in the top bar, which said "Dashboard" everywhere in the app regardless of where you were, now says where you actually are. Creating a company is offered in the sidebar's New menu, which previously listed only contacts and deals while the ⌘K palette offered all three.

  • The assistant has a way in

    the full-page assistant existed but nothing in the app linked to it, so it was reachable only by typing its address. It now has its own place in the sidebar, alongside the slide-over panel that was already there.

  • The Forms pages respond the moment you act on them

    deleting a form, resuming one that was paused, and marking a submission as "not spam" all used to leave the page unchanged until the whole list had been re-read. Each now takes effect on the press. Marking something as not spam moves it out of Spam and into the main list at the same time, instead of the two lists briefly disagreeing.

  • The Forms pages are laid out like the rest of the app

    whole rows are clickable and highlight under the pointer rather than just the form's name, New form sits beside the page title, and the form's name shows that it can be edited before you click into it. A form that is on, off, or paused now reads as three distinct states rather than two near-identical grey labels, and a submission that failed is marked more seriously than one caught as spam — the two were the wrong way round. Both pages now show a loading placeholder shaped like the finished page.

  • The Duplicates page clears a merge the moment you confirm it

    merging two records used to leave the queue looking untouched while the workspace was scanned for duplicates all over again, which is the slowest thing this page does. The merged record now leaves the list on the press, and a group of three stays on the page until every duplicate in it is resolved, rather than disappearing after the first merge. The button that performs the merge is now red like every other irreversible action, and says when it is working.

  • The Duplicates page is laid out like the rest of the app

    Contacts and Companies each get a proper heading with an icon and a count, every group is a card whose header leads with how likely the match is and how many records are involved, and whole rows are clickable rather than just the name. The page now says how many groups are waiting, shows a loading placeholder shaped like the finished page instead of nothing at all — this is the slowest page in the app to load — and a workspace with no duplicates gets one short message instead of two large empty panels.

  • The tasks page answers the moment you touch it

    switching between My tasks, All, Overdue and Unassigned used to leave the highlight on the old tab until the server replied, and ticking a task off left the box empty for the same wait. Both now respond on the press and correct themselves if the change does not go through — and a completion that fails now says so instead of silently doing nothing. Ticking a task also strikes its title through as it happens. The same immediate tick applies wherever tasks are listed, including the Tasks panel on a contact, deal or company.

  • The tasks page is laid out like the rest of the app

    each due-date group is now a titled white card with its own icon and count, overdue and completed groups are colour- marked, whole rows are clickable rather than just the task title, and rows highlight under the pointer. The loading placeholder matches the finished layout, so the page no longer rearranges itself as the tasks arrive.

  • Signing in twice is no longer possible

    sign-in, sign-up and forgot-password now take you into the app if you are already signed in. Invite links still land on the invitation. The assistant, its API and the create-workspace screen are covered by the same guard, and an unauthenticated API call gets a 401 rather than a redirect.

  • The app opens in light mode for anyone who has not chosen a theme. Dark and System are still in the theme menu, and an existing choice is remembered.

  • Section icons on the marketing page are coloured, one colour per subject the whole way down — deals violet, contacts blue, history green. Colour never carries meaning on its own: every icon keeps its own glyph and a written label.

  • The footer now carries the site's actual map — Product, Design system and Account columns, a short description under the logo, and a live "early access beta" line linking to this changelog. It used to repeat the header's two links.

  • The landing page and the changelog share one layout, so their announcement bar, header and footer cannot drift apart.

  • The design system moved from /showcase to /design-systems and wears the site's own header and footer, replacing a private top bar with a second logo, navigation and theme toggle.

  • The design-system page shows the real Product 5 logo. It had been documenting a red arc mark that shipped nowhere, while the product used the orange crown tile everywhere; the arc is retired.

  • Red is no longer decoration. The design-system page painted its section numbers, rules and bullets in the danger red; the identity is one brand orange on warm neutral, and red now appears only where something is actually dangerous.

  • The design-system page documents the whole system, not just the component list: which type token belongs on which heading, the canvas-and-card surfaces, the icon tiles and their subject colours, the motion budget as live specimens, and the page patterns. It also named the wrong typeface (Geist, where the product uses Inter) and claimed thirty type styles where the scale ships twenty-two.

  • The changelog page is built from the system's own parts — the shared heading rhythm and a tinted icon tile per kind of change.

  • The pipeline miniature drops to two stage columns on a phone. At three, deal names truncated to "Vertex Indu…" and the values wrapped.

  • The announcement bar now says Product 5 is live in early access beta and links to the changelog, instead of pointing at the design-system showcase.

  • The "Docs" link in the marketing header and footer is now "Changelog". It pointed at /docs, which has never existed and returned a 404.

Removed

  • The assistant section has been taken off the landing page. Its four claims described a feature that is still being built.

Fixed

  • The design-system page opened scrolled to the bottom. The command-menu example was rendered inline, and that component selects its first entry on mount and scrolls it into view — near the foot of a long page, that dragged the document down on every visit. It now opens from a button, the way the app uses it.

  • Questions about stalled deals

    asking what is at risk in the pipeline, or for the detail of one deal, failed with what looked like a provider outage. The dates were handed to the model in a form it could not accept; they are now sent as plain timestamps.

Added

  • Rate an assistant reply

    a thumbs up or down sits under every assistant message now, with an optional note on a thumbs down. A rating is private to whoever left it — not even an admin can see it, and it never reaches the audit trail — and reopening the thread later restores exactly what was rated.

  • Edit an earlier message and resend it

    getting a bad answer used to mean living with it or starting a new conversation. Editing a message now deletes every turn that came after it and resends from there, in the database as well as on screen. One thing does not come back: a record pinned to the original turn with @-mention is not reattached to the edited one, so it needs pinning again if the assistant still needs to see it.

  • Summarize a deal, contact or company

    a Summarize button on all three detail pages asks the assistant to write a few sentences on where the record stands — status, tags, custom fields, open tasks, recent activity — ending with what to do next. It is not cached: leaving the page and coming back, or clicking Regenerate, asks again from whatever the record looks like right now.

  • Turn pasted meeting notes into a note and tasks

    paste free text onto a deal, contact or company's timeline and the assistant proposes a cleaned-up note plus a list of candidate tasks, each with a title and, where the text actually implies one, a due date or an assignee. Nothing is written until the proposal is reviewed and confirmed; accepting it runs through the same note and task actions a person filling them in by hand would use.

  • A written summary of the dashboard, on request

    a Generate summary button turns the current period's KPIs into a short paragraph instead of leaving you to read the cards yourself. It is not cached: every click, including Regenerate, writes a fresh paragraph from whatever the metrics say at that moment.

  • Search with AI when a literal search finds nothing

    the command palette offers this only once a normal search for the typed term has come up completely empty. It first retries with a looser, token-based match, and only if that also finds nothing does it ask the assistant to rewrite the query into better keywords and search again with those — it narrows or rephrases what you typed, it does not invent an answer.

  • Describe a filter instead of building one

    a box on the contacts, deals and companies lists takes a plain-English filter like "deals over $10k closing this month" and shows the parsed filter for review before anything is applied — nothing on screen changes until you confirm it. The tasks list does not have this yet; it still only offers its fixed tabs.

  • Draft an email with AI

    a "Draft with AI" button in the email composer suggests a subject and body for the record you are emailing. It only suggests: nothing is queued or sent until you review the draft and choose Send yourself.

Changed

  • The assistant can also see duplicates, automation history, saved views and forms

    four more read tools joined the roster: the same likely-duplicate contacts and companies the Duplicates page surfaces; which automation run created a task or record, found by checking the parent deal, contact or company it fired from (a task itself carries no reference back to the run that made it, so that parent is what has to be asked about); the workspace's saved views; and its hosted forms alongside their submissions.

  • The assistant can act on many records at once, and merge duplicates

    bulkUpdateRecords applies one change to up to 100 contacts, companies, deals or tasks in a single approval: assign an owner, add or remove tags, set a native field, move a deal's stage, or delete, through the same engine and permission checks the list pages' own bulk actions use. mergeDuplicateRecords merges two duplicate contacts or two duplicate companies through the identical merge-and-undo path the Duplicates page already offers, restricted to admins and owners the same way that page is. Both still ask for approval before doing anything, but that approval card is not yet as informative as it is for every other write tool — it names the action rather than showing which records or which values are about to change.

  • Claude Opus 5's context gauge works

    Opus 5 is now a real catalogue entry with its 1M-token context window on record, so the token monitor can show a percentage for it the way it does for every other Anthropic model, instead of only being reachable through "Custom model…" with no gauge at all.

  • Long threads cost less to keep going

    sending the next turn used to resend every earlier turn's tool call results in full. Turns beyond the most recent ten now keep their own text but drop their tool results on the way to the model, and the model never sees more than the most recent 60 messages of a thread. Neither changes what you can scroll back through — only what gets re-sent to answer the next question.

  • Composing an email no longer requires a saved template

    the composer offered only a template picker; it now also takes an ad-hoc subject and body typed directly, validated and queued exactly like a template send. Sending itself is still blocked on every deployment this has shipped from — no RESEND_API_KEY is configured, so the queue step is refused before anything is written, same as before — but composing and drafting no longer are.

  • The import wizard can suggest a column mapping

    a Suggest mapping button asks the assistant to match the CSV's headers to the entity's fields, including custom fields, and pre-fills only the columns you had not already mapped yourself. Nothing is applied on the strength of the suggestion alone: a hallucinated or duplicate target is dropped before it reaches the screen, and the dry run and commit steps validate the mapping again regardless of where it came from.

2026.08.07

Added

  • CSV import now covers companies

    every client arrives with a company spreadsheet, and until now the importer only understood people. Choose Contacts or Companies at the start of the wizard and map columns to a company's name, domain, industry, size, phone, website, address and custom fields, with the owner matched by email address or name. A domain that already exists updates that company rather than failing; the same domain twice in one file is held for review, naming the row it clashes with. The preview, the per-row report, the automatic retry on a transient problem and resuming an import that stopped part-way all work exactly as they do for contacts.

  • The import wizard now follows the import to the end

    committing an import used to leave you on a screen that never changed, with no way to tell whether it had finished except reloading the page. It now shows the created, updated, held and failed counts as they climb, and opens the report itself the moment the import is done.

  • Assistant conversations are saved

    a refresh, a navigation away, or closing the panel used to destroy the whole chat. Conversations are now kept: you come back to the one you were in, and a history list reopens any earlier one to continue, rename or delete. A reopened conversation is the real thing, not a transcript — the steps the assistant took, the record cards it returned and any document it opened are all still there. A conversation is private to the person who had it; nobody else in the workspace can open it, administrators included.

  • A merge can be undone

    merging two contacts or two companies was the one thing in CRMS that could not be taken back. Every merge now records what it changed, so an admin can reverse it from the toast that confirms it, or later from a new "Recently merged" list on the Duplicates page: the kept record returns to the values it had, the other comes back to life, and every deal, note, task, file and tag the merge moved goes back with it — including the tags that were dropped because both records carried them. A merge can be undone once, and only while it still stands; if the world has moved on since, the undo says so instead of reversing half of it. Anything you re-linked by hand after the merge stays where you put it.

  • Tasks can be edited and deleted

    a task's title, notes, priority, due date, status and assignee could only be set when it was created; afterwards the only things you could change were the checkbox and the assignee dropdown. One edit dialog now covers all of it, from the Tasks hub, the Tasks panel on a contact, deal or company, and the task's own page. Deleting a task is offered in the same three places, restricted to admins and owners, and the confirmation toast carries an Undo.

Changed

  • The merge dialog no longer warns that a merge is permanent

    it isn't any more, so it now says you can undo it straight afterwards.

  • The assistant sees what a deal needs, not just what happened to it

    asking about a deal returned its recent timeline entries and nothing else, so the assistant was blind to the follow-ups actually outstanding on it. It now reads the deal's open tasks and its tags alongside the timeline, and shows each open task as its own card.

Fixed

  • The Tasks hub stopped showing tasks after the hundredth

    a workspace with more than a hundred tasks in a view simply never saw the rest, with nothing on screen to say so. The hub now pages fifty at a time, and the count on each view was and remains the true total.

  • The kanban deal sheet shows a deal's tags

    opening a deal from the pipeline board showed every field except its tags, even though the deal's own page showed them. They are now there, and can be added, removed or created inline exactly as on the deal page.

  • Sorting deals by stage or time-in-stage can be saved as a view

    both sorts worked on the table but were silently dropped by "Save view", so reopening the view lost them. They are now captured and reproduced like every other column's sort.

  • Tasks on a contact, deal or company load without scanning the whole workspace

    the Tasks panel on a record had no index behind it, so every contact, deal and company page was reading past every other task in the workspace to find the handful belonging to that record.

2026.08.04

Added

  • Six ready-made workflows to start from

    "New automation" now opens a picker instead of an empty canvas: welcome a new lead, follow up on a new contact, celebrate a won deal, flag a high-value deal, nudge when a deal changes stage, or assign and chase a new contact. Picking one lays the whole workflow out for you, already connected, and the same picker greets you on the automations page when you have none. What a template cannot know is your workspace — two of the six leave a tag or an owner blank for you to choose, and say so — and nothing is saved until you press Save, so a template is a starting point you can change freely rather than a rule that quietly starts running.

  • A filter builder on the contacts, companies and deals lists

    a "Filter" button beside the search box opens a field-and-operator picker covering every text, number, date, tag and custom-field condition the filter grammar supports: contains/starts with, the usual comparisons, is empty/is not empty, is any of/none of, has any/all/no tags, and "within the last N days" for dates. Conditions combine with either "all" or "any", the button shows how many are active, and Clear all removes them in one step. Applying writes the filter into the page's own URL, so a filtered list is a link you can share, and it flows through the exact same path "Select all N matching" and Export CSV already use — the count beside select-all and what a bulk delete or export actually touches can never disagree with what the filter says. The deals list omits its own pipeline as a filterable field, since the pipeline tab already narrows that. The free-text search box is unchanged and keeps working alongside it.

  • Build an automation on a canvas

    Settings → Automations now has a node-graph editor: drag a trigger, condition or action off the palette (or reach it with ⌘K), drag between nodes to connect them, and tidy the layout in one click. A workflow starts from any of 17 events — a contact, deal, activity or task being created; a contact or deal being updated, deleted or restored; a task being assigned or completed; a contact or company merging; a deal changing stage or closing; or a form lead being assigned — narrows itself with a Yes/No branch built from the same field-and-operator picker the contact, company and deal lists already use, and carries out one of eight actions: create a task, assign an owner, add or remove a tag, set a field, move a deal to another stage, send an in-app notification, or send a templated email. Every run is recorded as a success, a failure or a skip, with a per-step log on its own Runs page that tells apart a step that actually failed from one on the branch the run never took, and a skipped run explains itself — the loop breaker or the workspace's 500-runs-an-hour cap doing its job, not an error. Edits are saved to that browser as you go and offered back if you leave without saving.

2026.08.02

Added

  • Background jobs

    CRMS can now run work in the background, outside the request that starts it, instead of everything having to finish while a page waits. Failures retry automatically, and a job that keeps failing is caught and held rather than silently lost.

  • Domain events

    CRMS now has the internal announcement channel that lets one change set off work elsewhere in the product, built so an announcement can only exist if the change that caused it was actually saved, and so an announcement that cannot be delivered takes the change down with it rather than going missing. Creating, assigning and completing a task are the first changes that use it — each announces only a task id and a status, never a title or any other free-text field, so nothing personal ever reaches a log line through this channel. The Tasks page below is the first thing built on top of it.

  • Job monitor

    admins and owners get a read-only Job monitor screen showing how many background jobs are queued, running, or have failed after retrying, along with the error message from each of their own workspace's failures. It shows counts and error text only, never a job's actual data, another workspace's failures, or the page for members.

  • Companies

    a new object: /companies lists the accounts your contacts and deals work for, and each one's own page rolls up its contacts, deals, files and activity in one place.

  • Add and edit a company

    create one from the company list or inline while editing a contact, with a domain, industry, size, phone, website and your workspace's own custom fields. Two companies in the same workspace can't share a domain.

  • Delete and restore a company

    removing a company keeps its contacts, deals and tasks; it only unlinks them, restricted to admins and owners and reversible from the delete toast's Undo.

  • Contacts now link to a real company

    the free-text company field on a contact is gone. Pick an existing company from the contact form or create one on the spot, so "Acme", "Acme Inc" and "acme" can't end up as three unrelated companies again.

  • Contacts remember how they arrived

    every contact now records whether it was added by hand, imported, submitted through a form, created by the assistant, or referred in, set once and never changed afterward. Every contact today is "added by hand," since none of those other paths exist yet — the record is being kept from now on so they can report on it accurately once they do.

  • A dedicated home for tasks

    the new Tasks page lists every follow-up in your workspace under My tasks, All, Overdue and Unassigned, grouped by due date (Overdue, Today, Tomorrow, This week, Later) so nothing late is easy to miss.

  • Create a task from anywhere

    add one from the Tasks page, or right from a contact, deal or company's own Tasks list, with a due date, a priority and someone to own it.

  • Hand a task to someone else

    reassign it, or send it back to Unassigned, from a dropdown wherever it appears. No need to open it first.

  • Check a task off

    one click, wherever it shows up: the Tasks page, a contact, deal or company's Tasks list, or the activity timeline, which now shows tasks and notes together in one feed.

  • Tasks that don't need a home

    create a follow-up that isn't tied to any contact, deal or company. That was impossible before; every task had to be logged against someone or something.

  • Tag your contacts, companies and deals

    a "+" on the detail page opens a picker that searches your workspace's tags, lets you create a new one on the spot, and toggles which ones are attached. Each tag shows up as a small coloured pill on the record.

  • Manage tags

    a new Settings → Tags screen for admins and owners: create a tag, rename it, give it one of eight colours, or delete it — the delete confirmation shows how many records it is currently applied to, since a tag can't be brought back afterwards.

  • Merge duplicate tags

    admins and owners can fold one tag into another. Everything tagged with the one being removed keeps its tagging, now under the tag it was merged into. The confirmation names both tags and exactly how many taggings are about to move, since this can't be undone.

  • Attach a file to a record

    contacts, companies, deals and tasks can each hold file attachments now: PDFs, images, Office documents, CSVs and text files up to 10 MB, checked against their real contents so a renamed file can't sneak past the type it claims to be. This needs an admin to turn on file storage first; until then, the Files panel says so instead of showing a broken upload button.

  • Download an attachment

    open a file's real bytes from wherever it's attached, through a link that expires in a minute and is minted fresh on every click. Like uploading, this waits on an admin turning file storage on.

  • Remove an attachment

    admins and owners can remove a file from a record. Unlike most deletions in CRMS, this one can't be undone. Also waits on file storage being turned on.

  • Save a view

    save how you've filtered and sorted your contacts, companies or deals list under a name, so you can get back to it in one click instead of rebuilding it every time.

  • Richer list filtering, underneath

    contacts, companies, deals and tasks now support filtering by tags, date ranges and your workspace's own custom fields, not just plain text search. There's no filter-builder screen to reach it from yet, so this only shows up today through saved views and shared links — a builder is coming.

  • Share a saved view with your workspace

    a view you save is private by default. Share it so the whole workspace sees it, and you or an admin can rename or remove it afterward.

  • Import contacts from a CSV

    upload a spreadsheet, match its columns to your fields, and bring hundreds or thousands of contacts in at once, with a report showing exactly what was created, updated, or needs a second look. Companies can't be imported yet — contacts only, for now.

  • Preview an import before it runs

    see exactly what a CSV import will do — how many contacts will be created, updated, or flagged as possible duplicates — before anything is actually written.

  • Export a filtered list to CSV

    download your current contacts, companies or deals list, filtered and sorted the way you're viewing it, as a CSV file.

  • Search everything from one place

    press ⌘K (or Ctrl+K) anywhere to search contacts, companies, deals and tasks at once, jump straight to a result, or run a quick action.

  • Act on many records at once

    select some or every record matching your current filter on contacts, companies, deals or tasks, and reassign, tag, or delete them all together. Under 100 at a time happens immediately with a result for each one; more than that runs in the background.

  • Find duplicate contacts and companies

    a new Duplicates page flags likely duplicate contacts and companies, matched by email, phone, domain, or a similar name at the same company, so you can review them before they pile up.

  • Merge duplicates

    combine two duplicate contacts or companies into one from the Duplicates page. Everything attached to the one you remove — its deals, tasks, files, notes and tags — moves onto the one you keep. This can't be undone.

  • A table view for deals

    switch the deals page between the board and a sortable table with stage, value, owner, company, close date and time-in-stage, for pipelines too large to scan as a board. Filter, select many at once, and export it, same as the board.

  • Capture leads with a form

    build a form under Settings → Forms from any mix of your contact fields, publish it, and it's live at its own hosted page. Every submission becomes a contact — matched to an existing one by email without overwriting anything you already know, matched or created as a company by the submitter's email address, and optionally opened as a deal.

  • Attach a file to a form

    add a document or image field with its own accepted types and size limit; a visitor's upload goes straight to storage and is checked against its real bytes before the submission is accepted. Needs an admin to turn on file storage first, same as attachments elsewhere in CRMS.

  • Route a new lead to the right person

    assign every submission from a form to one person, or round-robin it across a list so submissions arriving at the same moment are still shared out fairly.

  • Spam doesn't get in for free

    a hidden trap field and a minimum fill time quietly quarantine likely bots instead of turning them into contacts. Review or recover any of them from a form's own Spam tab, and a form that gets flooded pauses itself until an admin turns it back on.

  • Put a form on your own site

    copy the iframe snippet from a form's Embed card and drop it into your marketing page. You list which sites are allowed to show it, and only those can: an origin you haven't listed is refused, and a form with an empty list stays link-only. Nothing is opened up by default.

  • Know the moment something needs you

    a bell in the header now tells you when a task is assigned to you, a form routes you a lead, or a deal you own changes stage, with an unread count and a panel of your most recent notifications, each linking straight to the record it's about.

  • Choose how you hear about it

    a new Settings → Notifications page lets you turn each notification type on or off separately for in-app and email. The daily digest email defaults to on only for a task being assigned to you; the other two types start in-app only until you opt them into email.

  • One email a day, never one per event

    anything you've opted into email arrives in a single daily digest instead of a message for every individual notification, so turning several types on doesn't turn into a flood of mail.

Changed

  • The activity timeline now shows tasks too

    a contact, deal or company's timeline is one feed again: notes and tasks together, newest first, instead of tasks living somewhere else. A task there shows who it's assigned to and can be checked off on the spot.

  • Adding a task from the note box on a timeline or the deal sheet is retired — use the new "New task" button instead, which can set a due date, a priority and an assignee, none of which the old box could do.

  • Request interception moved from src/middleware.ts to src/proxy.ts — Next 16's Node-runtime replacement for middleware. Nothing about the sign-in guards or rate limits changed; the move is what lets a hosted form page look up its own allowed origins from the database while the response is being built, which the old Edge runtime could not do.

2026.08.0

Changed

  • Deleting a deal can now be undone

    a deleted deal is hidden, not destroyed. It leaves the board, stops counting toward pipeline totals, disappears from search and from what the assistant can see, and can no longer be edited or dragged back — but the record survives. The confirmation toast offers an **Undo**.

Added

  • More than one pipeline

    admins can create, rename, delete and switch pipelines from the deals board. Every workspace used to be locked to the single "Sales" board it was created with. The default pipeline cannot be deleted, and neither can one that still holds deals.

  • Browse the audit trail

    admins and owners get an Audit log screen showing who changed what and when, filterable by action. Every change has been recorded since the beginning; until now nothing could show it to you. Members do not see the page, since it reveals other people's activity.

  • Archiving a workspace is no longer permanent

    an owner can restore an archived workspace. Archiving already promised the data was preserved; until now nothing could restore it. Archived workspaces are hidden from the switcher, so the restore lives where you land after archiving your last one.

  • Assign a contact to someone

    the contact form has an Owner picker and the list shows the owner's name, where the column used to print a raw internal id. People removed from the workspace are not offered.

  • Delete a contact

    admins and owners get a Delete button on the contact page. It removes the contact from your list and from search but leaves their deals alone, and the confirmation toast offers an **Undo**.

  • Restore a deleted contact

    deleted contacts could previously never be brought back; admins and owners can now restore one, audited alongside the deletion.

  • Restore a deleted deal

    admins and owners can put a deleted deal back on the board, audited alongside the deletion.

  • The assistant can delete a contact or a deal — and undo it

    "remove the duplicate Ada Lovelace record" now works, and so does "that was a mistake, put it back". Every deletion and restore waits for your approval; saying "don't ask me to confirm" does not change that. They run through the same admin-only, audited action a person would use, so a member asking is refused. The assistant can also tell you what has been deleted recently — the only way to find a deleted record, since they are hidden from search by design.

  • Filter and sort the contact list by a custom field

    the list reads filterKey/filterValue and sortKey/sortDir from the URL, so a link can open it already narrowed to one custom-field value, or sorted by it. The filtering and sorting already worked; nothing passed them from the page. A filter missing its value, or a direction that is not asc or desc, is ignored rather than quietly changing what you see.

2026.07.4

Added

  • Token monitor

    the composer shows what the assistant is spending: a gauge for how full the context window is, and a hover breakdown of input, output, cached and reasoning tokens. It appears once the first reply lands and stays hidden in demo mode. Models with no published context window — currently Grok 4.5 and 4.3 — show counts without a percentage rather than an invented one.

Changed

  • Assistant replies carry their token usage as message metadata, taken from the SDK's cumulative totalUsage, so a multi-step tool-calling turn is counted whole rather than by its final step.

  • The environment-configured assistant defaults to Google (gemini-2.5-flash) when ASSISTANT_PROVIDER is unset, so a GOOGLE_GENERATIVE_AI_API_KEY alone is enough for real answers. An install with no keys stays in demo mode, and an unrecognised ASSISTANT_PROVIDER falls back to demo mode rather than quietly using Google's key.

  • API key status and removal

    the assistant settings screen states whether a key is set, showing its last four digits and the date it was saved, and offers a confirmed "Remove key" that returns the workspace to demo mode. Previously the only signal was a placeholder that vanished on focus, and a key could be replaced but never cleared.

Fixed

  • The default Anthropic model was claude-3-5-haiku-latest, an undocumented alias whose only snapshot was retired on 2026-02-19 — so ASSISTANT_PROVIDER=anthropic without an explicit model failed every request. It is now claude-haiku-4-5-20251001, and a test pins each provider's default to a current catalogue model so a stale default fails the build, not runtime.

2026.07.3

Added

  • Assistant write actions

    the assistant can now act, not just answer. It saves notes, creates follow-up tasks and adds contacts on its own, and asks before changing a deal's value, stage or owner.

  • Remove an activity

    a delete control on each note and task in the timeline and the deal sheet, limited to its author or an admin, with a confirmation step. It is a soft delete, so history is preserved. Editing a note or task's text still has no UI.

Changed

  • Node 22 is now the minimum supported version, declared in package.json engines (required by the AI SDK).

Fixed

  • createDealCore and updateDealCore loaded custom-field definitions from the caller's session rather than from the workspace context passed to them. Harmless today, but it broke the explicit-context contract every non-request caller depends on.

2026.07.2

Added

  • Assistant chat

    ask questions about your workspace from a slide-over panel or a full page, and watch the reply stream in.

  • Bring-your-own-key provider settings

    choose a provider and model and store your own API key, encrypted at rest and never shown again.

  • @-mention records as context

    pin specific deals and contacts to a message so the assistant answers from those records.

  • Inline result cards

    deals and contacts returned by the assistant render as compact cards in the transcript.

  • Per-message model and mode

    pick any catalogue model for your provider and switch between fast and thorough answers.

  • Composer quick actions

    start from four canned prompts instead of a blank box.

  • Scripted demo fallback

    the assistant is demonstrable before any provider key is configured.

  • Inline error surfacing and retry

    a failed request explains itself and offers a retry instead of failing silently.

Changed

  • Replaced Phosphor icons with Tabler across every component.

  • Domain logic now takes an explicit workspace context rather than deriving it implicitly.

2026.07.1

Added

  • Invite a teammate

    invite someone by email as an admin or member, once your own address is verified.

  • Accept an invitation

    join a workspace from an emailed link and land in it immediately.

  • Wrong-account recovery

    an invite opened while signed in as the wrong person names the right address and offers one-click switching.

  • Resend and cancel invitations

    manage outstanding invitations from the Members page.

  • Team member management

    see who is in the workspace, change roles, remove people, and reinstate them later.

  • Transfer ownership

    hand a workspace to another member in one atomic step.

  • Email verification

    confirm your address from a link, with a resend banner in the app.

  • Forgot and reset password

    recover an account by email without revealing whether the address exists.

  • Change password and email

    update credentials from Settings, with confirmation sent to the old address.

  • Edit display name

    change how your name appears to teammates.

  • Transactional email

    invitations and account mail are delivered through one templated sender.

  • Stage colours

    give pipeline stages a colour from a fixed palette.

Fixed

  • Change-email requests from unverified sessions are refused, closing a session-hijack hole.

  • Post-authentication redirects are validated, closing an open redirect.

  • Email-verification states are reported honestly instead of optimistically.

Security

  • Cross-tenant entity references are validated in every mutation.

  • Removed members lose access on their next request rather than when their session expires.

  • The identity provider's built-in /organization/* HTTP endpoints are refused, since they cannot see deactivated memberships.

  • Email addresses are scrubbed from provider error logs.

  • Production email misconfiguration fails loudly instead of dropping mail.

2026.07.0

Added

  • Contacts

    keep a searchable record of the people you work with.

  • Deals and the kanban board

    track opportunities through stages by dragging them across a board.

  • Pipelines and stages

    shape the board to match how you actually sell.

  • Custom fields

    add your own fields to contacts and deals without waiting for a release.

  • Activities

    log notes and tasks against any contact or deal.

  • Dashboard

    see pipeline value, momentum and what needs attention on one page.

  • Workspaces

    run separate workspaces and switch between them.

  • Accounts

    email-and-password authentication.

  • Audit trail

    every workspace mutation is recorded immutably.

Security

  • Role-based access control across owner, admin and member, enforced server-side.

  • Per-workspace data isolation derived from the server session only.

  • Session-gated routes, auth rate limiting and hardened security headers.