Back to Third Career

What's changed

A running record of what got built, fixed, or quietly retired. Newest first.

Oct 2026

17 releases
v2.4.1

We moved in

Third Career has its own front door. The platform now lives at app.thirdcareer.co.uk instead of a borrowed Vercel address, and the beta's emails now come from no-reply@thirdcareer.co.uk rather than from the developer's own domain. Sign-in emails follow shortly. Graeme set up the records, which is the digital equivalent of putting your name on the letterbox. The old address still works, so nobody's existing links break, and the beta's QR code now points at the new one.

  • The platform lives at app.thirdcareer.co.uk
  • Beta emails come from no-reply@thirdcareer.co.uk
  • Sign-in links and emails point at the new address
  • The beta QR code points at app.thirdcareer.co.uk/beta
  • Links to the old address keep working
v2.4.0

Backstage gets a tidy

The admin pages caught up with the rest. Each list now has a search box and a row of filters, a few counts at the top, and proper tables that scroll sideways on a small screen instead of squashing six columns into a phone. Taking someone off the allowlist asks you to confirm first; it used to happen on one click. The feedback list can be searched and filtered by status, and the weekly summary sits on its own panel. A few error messages were rewritten to say what happened and what to do, rather than just 'Failed'. And the dots that show someone is typing now pulse gently instead of bouncing.

  • Search and filters above every admin list
  • Counts at the top of the allowlist and first reads
  • Real tables that scroll on narrow screens instead of truncating
  • Removing someone from the allowlist asks you to confirm
  • Feedback can be searched and filtered by status
  • Clearer error messages on the admin pages
  • The typing dots in a conversation pulse rather than bounce
v2.3.0

Matches you can open with a keyboard

A pass over matches, the full reasoning behind a match, posting a role and Connect. Each role in your matches now has a proper button for seeing how it was worked out, so it opens from the keyboard as well as the mouse. A 'Closest fit first' button has gone: your matches were already in order of fit, so pressing it changed nothing. When you disagree with a reading, the form now says which part you are disagreeing with, and it sits on its own panel because it is the one thing to do on that page. Employers posting a role see how the rest of it goes before they paste anything, and pick who is describing the role from a row of choices. Connect suggests people more quietly and asks you to mentor at the end of the page rather than in the middle of it.

  • A real button opens each match's reasoning, from the keyboard too
  • The 'Closest fit first' button is gone; matches were already in that order
  • The form for disagreeing with a reading names the part you are disagreeing with
  • Posting a role shows the four steps that follow, beside the form
  • Who is describing a role is a row of choices rather than a list of radio buttons
  • Connect asks you to mentor at the foot of the page, not in the middle
  • Quotes and notes sit in soft panels instead of behind an orange rule
v2.2.0

One home, one map

Your transition page and your Experience Map had grown into two copies of the same thing: both showed the eight areas, both let you confirm them, and both called themselves your Experience Map. Now each has one job. Your transition opens on the one next thing to do, then shows where each of the eight areas stands in a line apiece, and what you have built so far. Reading an area, checking it and changing it all happen on the Experience Map, which puts the ones worth a second look first and lets you start a short conversation about any area straight from it. Conversations look more like a conversation, too: the questions are set larger in the brand's heading type, your replies sit in dark bubbles, and the areas you have covered are named under the progress bar rather than shown as unlabelled dashes.

  • Your transition leads with the next step, then the standing of each area in one line
  • Your Success Formula and Life Fit Plan show where they stand beside the map
  • The Experience Map puts the areas worth a second look first, outlined, and the rest without boxes
  • Any area can start a short follow-up conversation from the map
  • Each area on the map says in a line what it covers
  • Questions in a conversation are larger and set in the brand's heading type
  • The progress bar in a conversation names the areas covered and still to come
v2.1.0

The front door gets dressed

The pages you see before signing in now look like the brand guidelines rather than a dark app with the lights off. The home page leads with the brand's headline and ribbon, the four stops of the journey are threaded together on one line, and the three ways in are a short list rather than three boxes. The sixty-second start shows how far along you are and, beside the form, says plainly what happens to your CV. Your first read opens on a dark panel with what we found, ends on one clear invitation, and puts the other ways onward underneath as plain links. The terms have a contents list you can jump around, and this page folds older months away so you are not scrolling through a hundred and fifty releases to find the latest.

  • A new home page in the brand's own layout, with the ribbon and a clearer first button
  • A step bar on the sixty-second start, and what happens to your CV shown beside the form
  • The first read opens on what we found and ends on one invitation, not four
  • The beta page puts what it involves beside the sign-up form
  • The terms have a contents list, and every section can be linked to
  • This changelog is grouped by month, with older months folded away
  • The footer is shorter on phones
v2.0.0

Lights on: the site goes cream

Third Career's brand, by GEL Studios, leads with cream and keeps dark teal for the moments that matter. The site had it the other way round: every page, form and table on dark teal, which is hard on the eyes over a long conversation and made every screen look like the last. Now the working pages are cream, dark teal is saved for the big moments (signing in, the next step on each page), and the brand's ribbon makes its first appearance. Underneath, the journey sidebar shows the journey as a line you move along, each part of the site has its own navigation, and a few places that had picked up several names now have one.

  • Cream pages, dark text, and dark teal kept for the next step on each page and for signing in
  • The logo now shows on every background, and on the sign-in page it takes you home
  • Your journey sidebar is a line you move along: done, under way, and where you are now
  • The home page for candidates is 'Your transition' everywhere, and 'Matches' means the same thing on every screen
  • Employers see their own tabs, and a new 'Your roles' page lists every role they have started
  • Mentors see their own tabs, and finishing the mentor conversation no longer drops you on a candidate page
  • Admin pages share a sidebar, so you can move between them without typing addresses
  • Every conversation opens with a title saying who you are talking to and what it is for
  • A saved Life Fit Plan opens at its terms, where you can change them, instead of restarting the conversation
  • Form labels are in plain sentence case rather than small capitals
v1.61.0

The beta gets a front door and an ending

From the 8 October catch-up. People finishing the beta were left on a thank-you with nowhere to go, so they did what anyone would and wandered off into the rest of the platform. Now the beta is a closed loop: the conversation, your Experience Map, the survey, and a proper ending that shows what you made, the roles your first read pointed to, and what happens next, with a copy sent to your inbox. There is also a new page for registering interest, with a QR code for the newsletter, and a way to pass the beta on to a friend. Registering sends the link to the first read; the fifteen-minute conversation still comes by invitation, so a popular share button cannot quietly run up the bill.

  • A registration page at /beta, with a QR code, that emails you the link to start
  • Beta testers stay inside the beta: conversation, map, survey and ending, and nothing that bounces them back
  • An ending page after the survey, with your map in brief and the roles your first read found
  • One email after the survey with a copy of that summary
  • A share button that sends friends to the registration page, not past the invitation
  • The terms say what registering keeps and which emails it sends
v1.60.0

Survey after the map, and a first read in sections

Two changes from Nigel. His survey document puts the longer survey after you have seen what Third Career made of you, but the link sat on the conversation's finish screen, a step before your Experience Map appeared. It has moved to the foot of the Experience Map, and once you have answered it, it thanks you and lets you look over your answers instead of asking again. Finishing the survey now takes you back to the map. Nigel also said the first read was hard to scan because it ran together as one long flow, so each part of it now sits in its own bordered panel with its heading at the top.

  • The survey about the conversation is offered at the foot of your Experience Map, not before it
  • Once answered, that invitation says thank you and lets you look over your answers
  • Finishing the survey takes you back to your Experience Map
  • Each section of the first read sits in its own panel, so the page reads as separate parts
v1.59.1

Nigel's three things

Nigel finished the long survey and used its last box to tell us three things, which is exactly what that box is for. Spoken replies sent themselves after a flat five seconds, however long you had talked, so there was barely time to read what had been written down; the wait now grows with the length of what you said, up to twenty seconds. The link to the survey on the conversation's finish screen just said 'Tell us how that felt', which could have meant anything; it now says it is a short survey and roughly how long it takes. And finishing the survey left you looking at a thank-you with nowhere to go, so it now offers your Experience Map.

  • A spoken reply waits longer before sending when you have said more, from five up to twenty seconds
  • The survey link at the end of the conversation says what it is and how long it takes
  • Finishing the survey offers a way on to your Experience Map
v1.59.0

Why this one

Each role in your results now says, under its headline, which parts of the fit line up most: the work itself, how much say you would have, the team, what the organisation stands for, and so on. It is read straight from the same numbers that produced the match, so it always agrees with the full reasoning underneath, and nothing writes it up in fancier words. If nothing stands out, it stays quiet rather than naming the least bad part.

  • A 'Lines up most on' line on each role, naming up to two parts of the fit
  • Worked out by code from the stored reading, not by a model
  • Left out when nothing clears the bar, so it never flatters a middling match
v1.58.0

Got feedback? Now it goes somewhere

The 'Got feedback?' link in the footer used to open an email. It now opens a short form, which anyone can use, signed in or not, because the people with the strongest views on the first read have no account yet. What you send reaches the team, and if you are signed in the page shows what you have sent with where it stands: received, planned or done. That last part is the point. Feedback nobody ever answers is worse than none, so the team now has a page where each item gets a status, and a button that asks Claude to read the last week and suggest what to change.

  • The footer link opens a feedback form instead of an email
  • Open to signed-out visitors too, with a cap on how much can arrive in an hour
  • Signed in, you see your own feedback and its status
  • A team page to set each item to received, planned or done
  • A button on that page that asks Claude for themes and suggested changes from the last seven days
  • Nothing Claude reads changes a score or the order of anything
v1.57.2

Saying it is a test, up front

The email that invites someone into the pilot now says plainly what it is: a test, open only to people we know, with what you share used to improve the product and nothing else. It also says that when the test ends we delete your first read, your conversation, your map and your survey answers, that we keep anonymised results with no names, and that you can ask for your own data to go sooner by writing to us. Nothing about the app changed. The email just stopped assuming you would work that out for yourself.

  • The invitation email says this is a test and who it is open to
  • It says what is deleted when the test ends, that anonymised results are kept, and how to ask for your own data to go sooner
v1.57.1

The number buttons that threw the page

Nigel found it within minutes: tapping a number on the two rating questions in the first survey shoved the whole screen upward, leaving the header gone and a blank space below, and the only way back was to edit the address. The answer had saved fine; it was the page that went wandering. Each rating button holds a hidden radio, and that radio had nowhere to live, so it stayed pinned to the document while the page scrolled inside it. When a click gave it focus, the browser scrolled the whole page to find it. It now lives inside its button, and a test keeps it there.

  • Tapping a number on a rating question no longer moves the page
  • A test holds each rating button's hidden radio inside the button
v1.57.0

Two surveys, no outsiders

The pilot surveys now live inside Third Career. There is a short one after the first read: five questions, about a minute, shown before you decide whether to carry on. And a longer one after the fifteen-minute conversation: ten questions, about two. Each answer saves as you give it, so stopping halfway still counts, and scales only label the two ends, because the numbers in between are the point. Nothing leaves the site: no outside survey company, no code in a link, and your answers hang off the run or conversation they are about, not your name. The questions are Nigel's, word for word.

  • A five-question survey on the first read result, above the invitation to carry on
  • A ten-question survey after the Discover conversation, linked from its finish screen
  • Answers save one at a time, with a progress line, and can be changed any time
  • Scales label only their two ends; the optional last question of each survey is free text
  • An admin-only page with counts and a CSV download that traces every answer to its question
  • The old external survey link and its setting are gone
v1.56.0

Go on, tell us why

If you tap 'Not for me' on a role, a small panel now asks what put you off: the kind of work, the hours, the pay, the organisation, where it's done, or the level. Pick as many as fit, add a few words of your own if you like, or skip it entirely. Your words stay between you and the team. Claude reads them for the reasons they give, and only those fixed reasons, never your note, go into the anonymous record we learn from. There is also a 'Got feedback?' link in the footer of every page, for everything else.

  • 'Not for me' opens an optional panel: pick reasons, add a note, or skip
  • Your note is kept with you; only a fixed list of reasons is saved anonymously
  • Claude reads a note into that same list, and a failed read never loses your note
  • Changing your answer away from 'Not for me' clears the reasons
  • A 'Got feedback?' link in the footer of every page
v1.55.0

Tell us how it landed

Every role in your results now has three quick taps underneath it: not for me, interested, or love this. It takes a second and it is the fastest way to tell us whether we got it right. Your taps stay with you, and you can change your mind whenever you like. Separately, and without your name on it, each tap is saved next to how the matching read that role, so over time we can see where people and the maths disagree and fix the maths. A tap never moves a score, and it does not reorder your list. That part is coming once there is enough to learn from.

  • Three taps under every ranked role: not for me, interested, love this
  • Your answer is shown back each time you visit, and can be changed
  • Each answer is also saved anonymously beside the matching's own reading of that role
  • Scores and ordering are unchanged; nothing learns from the taps yet beyond recording them
v1.54.1

Saying the quiet part out loud

The matching has always been done by software, and the terms page never quite said so. It does now. There is a new section in plain words: what goes into a match, what is kept out of it (age above all), which of your limits can rule a role out, who sees the result (you, and nobody else), and what to do if you think a match is wrong. Nothing about the matching itself changed. The page just stopped being shy about it.

  • The terms and privacy page has a new section, 'How matching works'
  • It says matching is automated, what it uses and what it never sees
  • It explains that a limit you set can rule a role out, and where to see why
  • It says plainly that only you see your ranking, and how to ask for a person to look at a match

Sep 2026

33 releases
v1.54.0

Owning the roadmap is not owning your Tuesday

The flexibility score had a mix-up at its heart. It was reading how much say someone has over how the work gets done, and treating it as how much say they have over when. So a job that promised 'you'll own the roadmap' looked wonderfully flexible to someone juggling three part-time roles, even if it wanted them in the office four fixed days a week. Those are now two separate readings, and flexibility uses the diary one. Separately, the five parts of job design used to share one quote and one confidence, so a description that never mentioned feedback still got a feedback number, and could then be told feedback was its weak spot. Each part is now read on its own, left blank when the description is silent, and the summary is an average of what was actually read rather than a product that one guess could sink.

  • A new reading, control over when the work happens, kept apart from control over how it's done
  • The flexibility part of a match uses the new reading, not job design autonomy
  • Each of the five job design factors has its own quote and confidence, and can be left blank
  • The job design summary averages the factors that were read instead of multiplying them
  • The lowest factor is only named when it was actually read from the description
  • Each factor, and control over when, can be set on its own on the review screen
  • A role needs control over when set before it can be published
  • A one-off script fills in control over when on existing roles from their stored descriptions
v1.53.0

Who's talking, and what's in it for them

Korn had been assuming it was always chatting to the boss. Mostly it isn't: most roles will come through recruiters, who are describing a manager they've met a few times and a team they've never sat with. So the new-role form now asks who's describing the role, and when it's a recruiter or someone in HR, Korn asks what they've seen or been told, the reader gives the answers a little less weight, and the review screen says whose account it is. Separately, the reader now picks out what the role gives the person doing it (learning, a network, recognition, security), kept well apart from what the organisation says it stands for. A charity can stand for social impact while the seat on offer mostly gives you a network and a nice title, and those are different things to want. For now it's recorded and shown, not scored.

  • The new-role form asks whether you're the manager, in HR or talent, or recruiting on the organisation's behalf
  • Second-hand accounts carry lower confidence, and the review screen says whose account the conversation was
  • Korn asks recruiters and HR what they've seen or been told, and 'I don't know' counts as an answer
  • A new field records what the role gives the person, in the same words candidates use for what they want
  • What the role offers is shown and editable on the review screen, and does not affect matching yet
v1.52.0

Korn asks about the manager, not the job

Nigel went through the recruiter research brief line by line, and this is the first batch of what he approved. Korn's first question used to ask whether someone picks their own method, which the job description had already answered. It now asks what happened the last time someone did it differently, which no description can answer. The team question stops asking whether people work as one and asks what they did when someone was struggling, because a warm fractional role and a frightened tight-knit team had been scoring the wrong way round. Every question now has fixed wording, one follow-up of a sensible kind, and permission to hear 'that's never come up' without digging for an invented example. On the legal side, who is on the team no longer reaches any score, so 'we're a young team' does nothing, and the reader points out phrases like 'recent graduate' or '15+ years' with a short, sourced note the client is free to ignore.

  • Korn's four questions have fixed wording, starting with what happened when someone did it their own way
  • The team reading measures whether people look out for each other, not how much they depend on each other
  • A manager who names the dull part and explains why it matters is no longer scored as dressing it up
  • Board, advisory and fractional roles get asked about the chair or CEO rather than a team
  • 'That's never come up' is accepted, and the conversation can finish; the value is set on the review screen
  • Hypothetical 'we would always…' answers count for less than what actually happened
  • Anything said about who is on the team is kept out of every number
  • Age-coded, length-of-service, health and trait wording in a description is flagged with a sourced note, never scored
  • 'Young' and 'dynamic' no longer count as values the organisation holds
  • Each climate reading records which version of the questions produced it
  • The bias check now covers every protected characteristic, not just age
v1.51.1

The invitation that led back to the door

A designer was invited into the pilot, clicked the link in her email, and arrived at the sign-in page. She asked for a sign-in link, clicked that, and arrived at the sign-in page again. Two things were going on. Invitations carried the sign-in in a part of the web address that browsers never send to a server, so the server saw an empty visit and showed the front door. And ordinary sign-in links only worked in the same browser that asked for them, which is not always the browser an email app opens. Both failed without a word, so the natural response was to ask for another link, and another. Links now carry a one-time code the server checks itself, which works in any browser; invitations already sitting in inboxes are picked up and finished properly; and a link that genuinely cannot work now says so, with a way to get a fresh one.

  • Sign-in and invitation links are verified on the server, so they work whichever browser opens them
  • Invitations sent before this release now sign the person in instead of returning them to sign-in
  • A used or expired link shows a clear message instead of a silent return to the sign-in page
  • Email templates updated to the new link format (they take effect once pasted into Supabase)
v1.51.0

Small print you can actually read

A first look at the new role form ended with a squint. The lines explaining each field were fourteen pixels high and faded to sixty percent, the job description box was set in typewriter type, and the labels were the smallest thing on the page. Every one of those passed the contrast check, which is the trouble: a typeface with short lowercase letters, made small and then made faint, turns into grey scratches on a dark screen, and this product is built for people who have earned the right not to lean in. The same faded-and-small combination turned up in nearly fifty places, from the footer to the Start flow, so it is now one shared style at sixteen pixels in the proper muted colour, and the design check fails the build if the old combination comes back. Making that check stick turned up a quieter problem of its own: a stray apostrophe could blind it to an entire file, and three files had been going partly unchecked.

  • Helper, status and footer text is 16px in the muted colour, instead of 14px faded out
  • Form labels are 16px and slightly heavier
  • The job description box uses the normal typeface instead of monospace
  • The sign-in intro, terms date, and error and status lines move up to 16px
  • The design check fails the build on 14px text that is also faded
  • The design check reads every className directly, so an apostrophe elsewhere in a file can no longer hide it
v1.50.0

A hundred and fifty roles, none of them borrowed

The system is about to go from eighteen roles to well over a hundred, all written for testing: interim directors, hospice board seats, a fintech that won't name a salary, a housing association whose teams barely speak to each other. Before any of them went live, a check turned up something worth stopping for. The first batch had been written with real employers' names in them — actual NHS trusts, universities and councils — attached to jobs those organisations never advertised. So every organisation name came out, street addresses went back to the town, and each role now shows its employer as a description: 'A hospice', 'An NHS trust'. Where the edit left twelve roles all called Non-Executive Director, each got its sector added so no two look alike. The loader now refuses to run if two roles share a title, rather than quietly dropping one.

  • Test roles show a descriptive employer, such as 'A housing association', never a name
  • Internal test labels are hidden from candidate-facing pages
  • Duplicate role titles are refused at load time instead of silently skipped
  • The corpus loader can run a small trial first, and loads four organisations at a time
v1.49.2

The small print, with the blanks filled in

The terms and privacy page went live last week as a draft, and a draft is exactly what it looked like: in two places it still said, in square brackets, that a fact was waiting to be confirmed. Anyone reading carefully before ticking the box on the first screen would have found a company with no number and a contact address with a note beside it. Both are settled now — the company, its number and its registered office as they appear at Companies House, and the address to write to about your data. The one thing still on its way is the registration with the Information Commissioner's Office, and until it arrives the page says nothing about it rather than promising something that is not there yet.

  • The terms page names 3rd Career Ltd, its company number and registered office
  • The data contact address is confirmed as privacy@thirdcareer.co.uk
  • Placeholder text removed from the live legal page
v1.49.1

The last ten seconds of the sixty

A test run this morning got all the way through the questions and then fell over on the very last button. The document had been read, the answers were in, and the page that pulls it all together ran out of time — because the part that writes the roads you might not have walked down is careful, takes about twenty-five seconds, and had been given one minute to do it in twice if the first try went wrong. It now has room to finish, and a firm limit on how long it is allowed to try; if it cannot manage, the page arrives without that section rather than with an apology. Two smaller things came out of the same run. The very first thing the journey saves, after a few quiet days, can be slow, and when it was, the anonymous count of that run went missing without a word — it now tries again, in a way that cannot count anyone twice. And the result page said it had read three answers when there had been six.

  • The first read's final step no longer times out when the directions take a second attempt
  • Each attempt at the directions is capped, and the page falls back to roles alone rather than an error
  • The anonymous run record retries once if the database is slow to wake, without ever double-counting
  • The result page no longer undercounts the questions you answered
v1.49.0

A hundred and fifty roles that were never real

Nothing changes on screen. Behind it, the team gained a way to fill the system with test roles without borrowing anyone else's: a command writes job descriptions from briefs — a housing association looking for an interim director, a fintech that says 'competitive' instead of a number, a hospice with a genuinely close team, a law firm where decisions arrive as instructions — and then pushes every one through exactly the path a real client's paste takes. That last part is the point. A role that dodges the salary stays a draft, because the reader and the database say so, and that is the corpus doing its job. Two notes for later also landed: where the recruiter-side research goes when it exists, and what actually happens to the product if the model provider has a bad day (short version: matching does not depend on a live model, and every path that does already fails to a sentence rather than a crash).

  • A generated, deliberately varied corpus of job descriptions, loaded through the Role Reader rather than around it
  • A placeholder and a written plan for the recruiter knowledge bank
  • A written position on model failover, path by path
v1.48.0

A real salary, a real location, and the option to stay anonymous

Three changes on the employer side, all from the same conversation. First, a role no longer publishes without a stated salary — and 'competitive' is not one. The reader has always treated that word as an absence rather than a figure; now the database refuses to publish until a figure exists, and it never fills one in for you. The same goes for location, unless the role is fully remote and there is no location to state. Second, an organisation can keep its name off the candidate-facing screens: the role publishes, the matching still knows who it is for, and candidates see 'a private employer' until the client decides otherwise. Third, the first screen asks for the organisation's website. Nothing from it is shown to anyone; it gives the short conversation afterwards somewhere to start — a site that talks about small self-directed teams earns a sharper question about how a decision reaches one — and later it is what a tailored cover letter is written against.

  • Publishing a role requires a stated salary and, unless the role is remote, a location — never a default filled in on your behalf
  • An organisation can withhold its name from candidates while the role stays fully matchable
  • The organisation's website is captured on the first screen and read for context in the conversation that follows
  • A job description can be uploaded as a file, with the same website and privacy options as a paste
v1.47.0

Hand over the file, not the text

The candidate side has taken a CV as a file since the sixty-second journey shipped. The employer side, until now, took a job description only as pasted text — which is fine for a rough draft and a nuisance for the PDF that HR already signed off. So the first screen for a role now takes a PDF or a Word document as well, and reads it the same way it reads a paste: what the description says, what it leaves out, and then the short conversation about the two things no description says. A PDF is turned into plain text first, once, so that every reading is still traceable to a sentence you can find — the whole point of that screen — and from there nothing downstream knows it was ever a file. The reader that handles the file is the same one the candidate journey uses; it was already right about the size limit and the Word extraction, so it was reused rather than written twice.

  • A job description can be uploaded as a PDF or Word document, as well as pasted
  • Uploaded PDFs are transcribed to text so every reading still traces back to the words it came from
  • Same reveal, same conversation, same review afterwards — the file is only a different front door
v1.46.0

Worth a look? And a shorter road to the conversation

Under each of the three roles the first read puts in front of you there are now two small buttons: yes, or not for me. It is the cheapest question the sixty seconds can ask and the most useful answer it can collect — across a hundred people it says which roles land, without anyone having to type a word. Your answers stay with your result, and the team sees them with the names removed. The other change is to what happens when you take the fifteen minutes. If you are invited, the button is there; if you are not, the page says so plainly instead of sending you to a sign-in that would go nowhere. And when the invitation link lands you, it lands you in the conversation itself rather than on a dashboard of things you have not done yet — and quietly connects the account to the first read you did, so the team can see that the sixty seconds led somewhere.

  • Yes / Not for me under each surfaced role, kept with your result and counted on the team's review page
  • The fifteen-minute step shows a button when you are invited and an honest sentence when you are not
  • A first sign-in lands in Discover; a return visit lands on the dashboard
  • Signing in claims the first read this browser did, so the two halves of the journey are one record
v1.45.0

The box you tick now has something behind it

The consent box on the first screen has been there since the sixty-second journey shipped, and it has always said what it meant. What it did not have was anywhere to point: there was no page setting out what is collected, why, how long it is kept, and how to have it removed. There is now, written from what the code actually does rather than from a template — that a PDF is never kept, that pasted text goes after thirty days, that the anonymous record cannot be joined back to you. It is a draft for the team to finish, and it says so in the places only they can settle. Alongside it, a small thing the team asked for: at the end of the first read and at the end of the fifteen-minute conversation, a link to a short survey about how it felt. The link appears only where a survey has been set up, and it carries where you came from, so answers from the two ends of the product do not get blended into one number.

  • A terms and privacy page, linked from the consent box on the first screen and from the footer of every page
  • A feedback link at the end of the first read and at the end of the Discover conversation, shown only once a survey exists
  • The survey link records which of the two journeys it came from
v1.44.1

A clean slate on demand

Nothing visible changes here. Behind the scenes, the team gained a way to wipe a round of testing in one go — every practice conversation, every Experience Map built on somebody's own CV for the fifth time, every sixty-second run the three of us did to check a wording change. Before this the choice was one person at a time from their own profile page, or a hand-written session against the live database. The new command counts what it would delete and stops, unless it is told to go ahead and given the name of the database it is pointing at. Accounts, invitations, the starter roles and the seed mentors stay put, so a reset is a fresh start rather than a rebuild.

  • A pilot reset command for the team, dry run by default
  • Deleting requires naming the database in the command, so a copied line aimed at the wrong place refuses
  • What it clears is checked in the test suite against the per-person reset, so the two cannot drift apart
v1.44.0

Two promises the code was not keeping

Both came out of going back over the codebase before the link gets forwarded beyond the team. First: the upload page has said since day one that the text of your CV is kept for thirty days and then deleted. The date was written down on every row and nothing ever read it back, so the text stayed. A daily job now clears it; your result page still works, because it is built from the reading and your answers rather than from the document. Second: the two team pages — the invite list, and the list of everyone who has taken the sixty-second journey — checked only that you were signed in. Every invited tester therefore had the same view as the team, including the power to add and remove invitations. Both now require a flag that nothing in the app can set. If you are not on the team the pages do not exist, and the routes behind them say no.

  • CV text really is deleted after thirty days, by a scheduled job that runs every night
  • The invite list and the first-read review page are visible to the team only; everyone else gets a 404
  • Being on the team is a separate flag from being a candidate, client or mentor, so nobody has to give up their own journey to administer the pilot
v1.43.0

What sixty seconds told us, in one block

Andy's suggestion after his own run: before the roles and the directions, say what we actually learnt. The first read now opens with a snapshot in three parts. 'You appear to be someone who' — four to six short observations, written from the document and the answers, at least one of them from an answer rather than the CV because the answers are the only thing the CV did not already say. 'What comes through strongest' — the capabilities the reader found, strongest first, as plain words. And 'The shapes of work this points at' — the kinds of role that surfaced and the moves the directions named. Two of the three lists are derived line by line from things already read, so the block cannot drift into horoscope; the observations are hedged by construction, since the sentence starts 'appear to be' and nothing in it is allowed to be a verdict. Also fixed: the third question said 'and given only two', which was a private shorthand for 'if you could only have one of these' and read as nonsense to anyone who had not written it.

  • A snapshot at the top of the first read: observations, strongest capabilities, and the shapes of work the result points at
  • Observations are written on the same call as the directions, so nothing is slower
  • The third fixed question now says what it means: if the next thing could only have one of these, which would it be
v1.42.2

The invite-only message stops being a way to look people up

Earlier today the sign-in page gained an honest 'this is invite-only' message for people who had done the first read but were not yet on the list. The way it was built was wrong, and was flagged as wrong when it shipped: it worked by checking whatever email was typed into the box, which meant anyone could type in a named person's address and learn whether they had signed up here — for a product whose users are quietly exploring a career change, that is precisely the thing the sign-in page had always been careful not to reveal. The message is still there. It now comes from a check that takes no input at all: it reads the same cookie the sixty-second journey set, and answers only about the person holding it. Type any email into the form and the reply is exactly as uniform as it was before today. Nothing was deferred to 'before launch'; it is fixed.

  • The invite-only message is shown on arrival to a browser that has done a first read and is not yet invited, with the email filled in
  • The check behind it can only describe the person asking; it takes no email and cannot be used to look anyone up
  • The sign-in form itself is back to giving the same response whatever address is typed in
v1.42.0

Finishing a first read no longer lets you in

The previous release added the wrong door. Finishing the sixty-second journey started adding people to the allowlist and emailing them an invitation automatically, which was never the plan — the pilot is still closed, and completing a public journey on your own CV should not be the thing that decides who gets into the fifteen-minute conversation. That is a person's call now. A new page, reachable only if you know the address, lists everyone who has taken the first read and how far they got, with a button to invite one of them by hand; nothing happens to anybody's email until somebody presses it. And because a genuine visitor could reach 'take the fifteen minutes', enter their email, and be told 'check your inbox' for a link that was never coming, the sign-in page now says plainly that this is invite-only for the moment, rather than pretending to have sent something it has not.

  • Finishing a first read is recorded but no longer sends an invitation on its own
  • A new review page lists everyone who has taken the first read, with a one-press invite
  • The sign-in page tells an uninvited email that the pilot is closed for now, instead of claiming to have sent a link
v1.41.0

The PIN is gone, and finishing a first read earns an invitation

The shared PIN was there to stop a leaked link exposing the site. It has been doing that job alongside an allowlist that does it better — nothing personal is reachable without a session, and only an invited email can start one — while getting in the way of anyone arriving from the public sixty-second journey. So it is gone. The front door, the sixty-second journey and the roles it lists are public; everything else asks you to sign in. And finishing a first read now does what the button always promised: your email joins the invite list and an invitation goes out, with a link that creates your account and opens the fifteen-minute conversation. One thing to know while the pilot runs: until the sending domain is switched over, invitations come from Supabase's shared sender and tend to land in spam. That is a settings change, not a code one, and it is on the list.

  • The shared PIN is removed; the allowlist is the only gate
  • The home page, the sixty-second journey and the open-roles list are public
  • Finishing a first read adds you to the invite list and sends an invitation to the fifteen-minute conversation
  • Signing in lands on your candidate home rather than the public front door
v1.40.1

The PIN screen stops sticking on 'Checking'

Andy finished a first read, clicked through to the fifteen-minute conversation, entered the PIN, and the screen sat on 'Checking…' with the PIN accepted and nowhere to go. Two things were wrong. After a correct PIN the page fired a navigation to the home page and a refresh of itself at the same time, and the two raced; and the home page then bounced on to sign-in anyway, because that is where a person without an account belongs. The PIN screen now remembers where you were heading, and goes there with a proper page load that carries the new cookie and cannot race itself.

  • The PIN screen sends you on to where you were going, rather than to the home page and then somewhere else
  • A correct PIN no longer leaves the screen on 'Checking…'
v1.40.0

A scale stops having a right answer

Nigel's feedback on one of his questions: 'took on theirs' sat at 1 and 'kept my own' at 10, which is not a measurement, it is a spectrum with a winner at the top — and the winner happened to be the one about having your own standards, which is about as far from the tone this product wants as a control can get. The reader had two kinds of answer and no rule for choosing between them. It now has three, and the rule. A scale is for how much of one thing, and neither end is the right answer. A choice between two stances is a choice, with each named. And when both, neither, or 'it changed' is a genuine answer, there is a third named option — 'Took on theirs', 'Managed both', 'Kept my own' — rather than a midpoint on a line. The reader is also told that if one option is plainly what a sensible person would say, the question is wrong and to write another.

  • Choices can offer three named options where 'both' or 'neither' is a real answer
  • Scales are reserved for questions of amount, never a spectrum between two stances
  • The reader is told no option is ever the good one
v1.39.2

Stopped failing good readings for being a sentence too long

The detailed logging from the last release found the real fault within the hour, and it was ours. Every failed read of the day — Graeme's, both of Nigel's — was a perfectly good reply from the reader being thrown out by our own checks for running a few dozen characters over a length limit: a summary of 420 characters against a cap of 400, a question of 260 against 240. Each rejection cost a whole attempt of about thirty seconds, and two rejections was a failed read and a person told their document did not come back. A length limit on prose is a style preference, and a style preference is not worth thirty seconds of somebody's minute. The limits are now only there to refuse the absurd; the screen wraps a long question perfectly well.

  • Readings are no longer rejected for a summary or a question that runs slightly long
  • The same applies to the directions written for the first read
v1.39.1

The reader stops running out of room

An hour after uploads started being logged, the log had already explained three failures that looked like bad luck: Graeme's, and two of Nigel's on the same Word file that then read fine on his third go. Each attempt took about forty-five seconds and came back in a shape that could not be parsed — which is what a reply looks like when it is cut off before it finishes. The reading has grown since the ceiling was set: ten capabilities, a summary, two phrases about the most recent role, and up to four questions with six parts each. The ceiling is doubled. The reason a reply stopped is now logged on every failure, so the next one explains itself. And the estimates behind the 'working on it' screen were fitted from three short test pastes and under-called every real CV of the day; they are re-fitted from the day's actual reads, and the screen waits at least two and a half minutes before offering to go on without the document, because that is how long the reader's own two attempts can take.

  • The reader's reply ceiling doubled, so a full reading of a long CV is not cut off
  • The reason a read failed is logged every time
  • Read-time estimates re-fitted from real documents, and the wait before giving up raised to match
v1.39.0

Failed uploads are counted, and the 10 MB promise was a lie

Graeme said his PDF failed twice, and when Andy asked whether we were logging uploads and failures the honest answer was: not usefully. A read that fell over left a line in the server logs; an upload the browser refused, or one the hosting platform refused before our code ever ran, left nothing at all. The likeliest cause is now written down. The platform will not accept a request over 4.5 MB and says so with a bare error before any of our code runs — while the upload screen promised 10 MB. A PDF with a photograph in it sits right in that gap, and the person saw 'that did not go through' with no idea why. The cap now says 4 MB, because that is the truth, and the too-large message suggests the two things that actually work. Every upload is logged with its kind, size and extension — never its filename — and every attempt is counted on the anonymous row along with the reason for any failure, whether it happened in the browser, at the platform, or in our reader. The insights page shows the tally.

  • Every upload attempt is logged and counted, with a controlled reason for each failure
  • Failures the browser or the platform catch before our code runs are reported and counted too
  • The size cap is stated honestly as 4 MB, and a too-large file gets a message that says what to do
  • A new 'Uploads that did not work' section on the insights page
v1.38.0

It reads the bottom of the page too

Until now the reader treated a CV as a list of jobs and skipped the rest — the interests, the volunteering, the choir, the committee, the boat restored over ten winters. Those are often the truest thing on the page: they show how somebody likes to make, lead, teach or belong with no job title in the way, and they are where the directions you might not have considered actually come from. The reader now reads them, and may spend one question there when they show a pattern that connects to work. One question, not more, so this stays a first read rather than a personality quiz. And because a hobbies section is also where a CV says most about things that are none of our business — a choir is often a church choir, a sport can reveal a disability, a committee can reveal a party — faith and politics join health, family and money on the list of things the reader never asks about or infers, including anything a pastime merely hints at.

  • The reader takes in interests, volunteering and personal statements, and may ask one question about a pattern they show
  • The directions can build on that material as well as on the roles
  • Faith and politics are off limits alongside health, family and money, including anything an interest only implies
v1.37.0

The questions look further back, and one box fewer

Andy's verdict on his own first read was that it liked it but it leaned hard on his most recent role. Half of that is right: the three questions everyone gets are about the role you are leaving on purpose, because that is what frames whatever comes next. The questions written from the document were drifting there too, because the most recent role has the most detail on the page — and the surprises never live there. They live in the two years teaching alongside the day job, the trustee seat, the business run at weekends, the move between sectors. The reader now spends at most one document question on the most recent role and the rest on the earlier and sideways parts of a career. Separately, the upload step asked you to tick a box if your PDF came from LinkedIn. All it did was fill in a statistic nobody had looked at, at the one moment the journey wants no decisions at all. The box is gone; the reader recognises a LinkedIn export from its layout and records it itself.

  • At most one document question about the most recent role; the rest go to earlier roles, side work and unusual turns
  • The 'this came from LinkedIn' checkbox is removed — the reader notices a LinkedIn export on its own
v1.36.0

A long CV no longer gets cut off mid-read

Andy uploaded his own Word CV and was told it did not come back from the reader. Word was never the problem. The read runs in the background after the upload is accepted, and that background work shares a sixty-second limit with the upload itself; an eleven-thousand-character document with one retry crossed it, and the whole thing was terminated with nothing saved. The document route now has five minutes. Two things came with the diagnosis. The 'working on it' messages ran on a fixed clock, so 'Nearly there' arrived long before a long document was anywhere near done — they are now paced by an estimate from the document's length, with a percentage alongside, labelled 'about' because it is one. And when a read does fail, there is a button to try a different document rather than only a button to carry on without one; the same button sits at the bottom of the first read, for anyone who wants to see what a fuller CV or the LinkedIn version does differently.

  • The document read gets five minutes rather than sixty seconds, so a long CV finishes
  • Working messages are paced by an estimate from the document's length, with a percentage
  • 'Try a different document' when a read fails, and 'Upload another document' on the first read
  • Uploading a second document clears the questions and answers from the first
  • Every read is logged with its length and how long it took, so the estimate can be re-fitted
v1.35.0

You can see it thinking

Two waits in the sixty-second journey — reading your document before the questions, and assembling the first read after them — each take somewhere between ten and thirty seconds, and both showed nothing while they ran: a greyed-out button, then a new page. Andy's note was that you could not tell it was working, and he was right. Both now show a short run of messages, a few seconds each, with a pulse underneath — 'Reading it properly, not skimming', 'Looking past the obvious next step', 'Writing down the reasons, not just the names'. They are not a progress bar and do not pretend to be; each is loosely true of what is happening at the time, and the last one stays put rather than looping. If you have asked your device for reduced motion, the pulse stops and the messages simply change.

  • A working state with rotating messages while your document is read
  • The same while the first read is assembled, replacing the questions rather than sitting under them
  • Honours reduced-motion settings
v1.34.0

Every question knows who it is talking to

Andy went through it with his real CV and got three generic questions and nothing from the document. Two things had gone wrong. The first three questions were deliberately general so they could go up while the document was still being read — which made them read like a form, and was the wrong trade. And the screen gave up waiting after thirty seconds, which a long Word document beats, so the questions actually written from his CV never appeared. The order is reversed now: the intro reads the document first — typically ten to twenty seconds, with the button lighting up when it is done — and then every question, including the first, names the role it is asking about. 'Thinking about the most recent work you did' has become 'Thinking about your most recent role as Managing Director at Halcyon Foods'; the second names how long that role ran; the third links the choice it asks for back to that role. If the reader genuinely fails, you are told so and offered the general questions rather than left holding a screen.

  • The intro waits for the document to be read before the first question, so all of them are personal
  • The first three questions name your most recent role and how long it ran
  • The wait is allowed up to seventy-five seconds before the general questions are offered instead
  • The question counter always shows the total, because the total is known before you start
v1.33.0

About thirty seconds, not five taps

The sixty-second journey asked exactly five questions: three everyone gets and two written from your document. Andy's point was that the number is the wrong thing to fix. A CV with one long stretch and nothing else leaves two things worth asking; one with an unusual turn, a second career on the side and a board seat leaves four — and hard-coding two meant padding the first or dropping the best question on the second. The reader now writes as many as your document genuinely earns, between two and four, so a run is five to seven questions. The promise on the intro is the time, about thirty seconds, and nobody who takes forty over a good question has done anything wrong. While your document is still being read the counter shows the question number without a total, because a guessed total that then changes is worse than none.

  • Two to four questions from your document, decided by what it leaves open, rather than always two
  • The intro promises about thirty seconds rather than a count
  • The question counter shows a total only once the document has been read
v1.32.2

A deleted run stops haunting the next one

If a sixty-second run is erased — on request, or after the thirty days — the browser still remembers it for a while, and landing on the upload or questions step with that memory sent you to a page for a run that no longer existed. An upload there was accepted and silently lost. Every step now checks the run is real and sends you back to the start if it is not, where giving your details begins a fresh one.

  • The upload and questions steps go back to the start if the run behind them has been deleted
  • An upload against a deleted run is refused rather than accepted and lost
v1.32.1

The questions start sounding like they read your CV

Andy went through the sixty-second journey the morning after it went live and came back with three things. The heading was sitting above every single question, so five questions read as five copies of one page; there is a short intro now, with a start button and an honest 'about thirty seconds', and then each question gets the screen to itself. The questions felt generic — and the first three were, by design, because they go up while your document is still being read. Now the moment the read lands they are re-worded around what it saw, so 'the most recent work you did' becomes 'running Halcyon Foods'. And the two questions written from your document are now chosen the way the longer conversation chooses its ground: against the eight areas Third Career reads a person in, going after whichever your CV leaves most open, and naming something specific from it so the question could not be asked of anyone else. Which area each question went after is recorded, so a hundred runs from now the insights page can show where a CV says least. Also: the sample employers no longer carry their internal 'starter role' label on public pages.

  • A short intro before the questions, with a start button, instead of the heading repeating above every one
  • The three fixed questions are re-worded around your actual work as soon as the document has been read
  • The two document questions are chosen against the eight areas the deeper conversation covers, aimed at what a CV leaves unsaid
  • Every document question names something specific from your document
  • The insights page shows which areas the reader goes after most
  • Sample employers lose the '(starter role)' suffix on the public pages
v1.32.0

Sixty seconds before we ask for fifteen minutes

Until now the front door opened onto the deep end. A new visitor arrived and was handed a fifteen-minute conversation about their working life, before anyone had shown them why it was worth having. There is a shorter thing in front of it now: your name, a CV or a LinkedIn profile saved as a PDF, three quick questions, and a first read of what your experience opens up — a few of the roles actually in the system, and two or three directions you might not have listed yourself, each with the reason it came up. It is public, so it works without a code or a sign-in, and it is honest about being a first pass rather than a match: nothing in it knows what you earn, how many hours you want, or where you live. That gap is the point, and finding it interesting is the invitation to the longer conversation. There is also a plain list of every open role for anyone who only came to look at jobs. Behind it, a new insights page shows what the answers are adding up to across everyone, drawn from rows that carry no name, no email and no words from anybody's CV.

  • A new sixty-second journey at /start: your details, a document, three questions, a first read
  • Reads PDFs and Word documents, or text pasted straight in; LinkedIn's Save to PDF works as-is
  • The document is read in the background while you answer, so the wait sits behind the questions rather than in front of them
  • The result names real roles with the reason each one surfaced, alongside directions that are labelled as suggestions rather than listings
  • It never shows a score and never calls itself a match, because three questions cannot produce one
  • Answers that lean towards change surface roles built on your experience rather than repeats of it
  • A plain, unranked list of every open role for anyone who just wants to browse
  • A new insights page showing how far people get and what they are answering, with the sample size on every panel and no chart drawn until there is enough behind it
  • No date of birth asked for, anywhere. Your CV is kept for 30 days and then deleted; what we learned from it stays, with your name off it

Aug 2026

85 releases
v1.31.0

Finishing a conversation now sticks

Reported from the pilot: end a conversation with 'Finish for now', go and look at something else, come back — and it was open again, reply box waiting underneath the goodbye you had just been given. The ending only ever existed in the browser tab it happened in; nothing was written down, so returning to the page rebuilt a conversation that had never been closed. It is recorded against the conversation now, along with which of you ended it, so coming back finds it exactly as you left it — 'Paused there' if you stopped, 'that's enough to build on' if the conversation ran its course. All three conversations had the same fault, so all three are fixed. Adding something else afterwards still works, and still says paused rather than claiming a fuller picture than you gave it.

  • 'Finish for now' is remembered when you leave the page and come back
  • The wording keeps track of who ended it, so a conversation you left early is not announced as complete
  • Same fix applied to the Life Fit and mentor conversations, which forgot in exactly the same way
v1.30.2

Your own account stops being a question mark

The circle in the top right shows your initials. For the moment before the app has looked them up — and permanently, if you have not given a name — it was showing a question mark. Signed in, on your own account, on every page load. It is a person icon now while it is looking, and stays one if there is no name to show.

  • The circle in the top right no longer flashes a question mark before your initials load
v1.30.1

The menu heading stopped breaking in half

Caused by the last release and spotted on the live site straight after. Making the small tracked labels consistent across the app made them slightly wider, and in the left-hand menu that was just enough to stop 'Where you are' and 'Step 7 of 7' fitting on the same line — so both broke across two lines mid-phrase. They now stay whole, with the count dropping underneath when there is not room beside it.

  • The left-hand menu heading and its step count no longer break mid-phrase
v1.30.0

The last screens, and one habit the app had everywhere

The remaining screens — the home page, your record, your Success Formula, the Life Fit Plan, the interests questionnaire, the reasoning behind a match, your details, signing in — now look like the rest. Doing them turned up one habit the app had picked up in a dozen places: a thing set smaller or lighter than its own explanation. The question at the top of a section, quieter than the sentence describing it. A heading, lighter than the items underneath it. On the reasoning behind a match, each factor's name was larger but lighter than the two lines explaining it, so the explanation read as the more important of the two. None of these look wrong in isolation; all of them make a page harder to scan than it needs to be. Alongside that, the page titles across the app had drifted into two camps, roughly half at a size that announced the page and half at one that did not. They all announce it now.

  • Home page, your record, Success Formula, Life Fit Plan, interests, the reasoning behind a match, your details and the sign-in screen all brought into line
  • A heading is no longer set lighter or smaller than the things underneath it — a dozen places had that backwards
  • Page titles are one size across the app rather than two
  • Every remaining hand-written style folded into the shared system, so there is now nothing left in the app writing its own colours, sizes or fonts
v1.29.2

A button that cannot be pressed yet looks like one

The orange buttons throughout the app go a muddy brown while there is nothing to press them for — an empty form, a save already in flight. It read as a colour someone had chosen rather than as a control waiting for you. A fortnight ago this got fixed on the reply box in the conversation and nowhere else, which left the app doing two different things with the same button, so this is really a fix for a half-finished fix. Twelve of them, now all the same: a button with nothing to do goes quiet rather than muddy. Their hover colour is now the same everywhere too — six were using a slightly different orange from the other six.

  • Twelve buttons show a proper inactive state instead of a muddy orange
  • One hover colour across all of them, rather than two that were nearly the same
v1.29.1

The question was quieter than its own footnote

Spotted on the mentor sign-up right after the last release went out. Each part of that form asks you something — what matters to you at work, which moves you have made yourself — and underneath the question sits a sentence explaining it, and under that the options. The question was set smaller and fainter than both. It was even quieter than the little group headings inside its own answer list, so the thing you were being asked read as a footnote to its own explanation. Five of these on that form. They are section headings now, which is what they always were.

  • Each question on the mentor sign-up is set as a heading rather than as the smallest thing in its own group
v1.29.0

Two thirds of every client and mentor page could not be reached

This started as the last stretch of the design work — bringing the client role screens and the mentor sign-up into line with everything else — and turned up something considerably worse than a design problem on the way. The pages a client uses to read a role back and publish it, and the form a mentor fills in to offer their time, had no way to scroll. Not awkward scrolling: none. Measured on the role reading, the page was 2381 pixels of content inside a 787 pixel window with the overflow hidden and nothing anywhere in the page able to scroll — so roughly two thirds of it, including the button that publishes the role, was unreachable by mouse, wheel or keyboard. The candidate side had a scrolling region because its layout supplied one; the client and mentor sides had no layout at all, so they never got one. They do now, from one definition shared by all three, because 'two of the three had it' is precisely how this happened.

  • Client and mentor pages scroll — every part of them is now reachable
  • The scrolling region comes from one shared definition, so a new section of the app cannot quietly miss out on it
  • Role reading, role review and mentor sign-up brought into line with the rest: bigger titles, labels that read as labels, content that is quiet until you are on it
  • The panel at the foot of a role review — published, ready to publish, or still short of it — is now clearly the thing to act on
  • A section's own introduction no longer renders smaller than the text it introduces
v1.28.1

Every bar in the app was only telling you half of it

Yesterday's release fixed the bar on your matches, where the unfilled part was invisible so a weak match looked much like a strong one. It turned out there were four of these, not one: the eight dashes above the Discover conversation, the breakdown bars inside a match, the progress bar on the interests questionnaire, and the bars on a role's reading. All four had the same fault for the same reason, and one of them was worse than invisible — an area you had not talked about yet and an area you had covered thoroughly were drawn in colours two-thirds of people would struggle to tell apart. They are all drawn the same way now, from one definition rather than four copies, because four copies is how they drifted apart in the first place.

  • The eight dashes above the Discover conversation show empty, half and full as fill levels you can actually see
  • The breakdown bars inside a match, the interests progress bar and a role's readings all fixed the same way
  • One definition behind all of them, so the next bar added to the app starts correct
  • The tests that guarded the half-full dash now check the fill level rather than the name of a CSS class — two of the three would have passed with a dash stuck permanently full
v1.28.0

Matches and Connect catch up with the rest

The same treatment the conversation and your Experience Map have already had, applied to the last two screens. Role names are what you scan a list of roles for, so they carry the weight now; the verdict and its bar sit together on the right as one thing rather than as two competing headings; and the 'read against' box that was sitting beside the page title, looking like something you were meant to act on, is a quiet readout instead. Connect gets the same, and the block at the foot of it — the one asking whether you have been through this yourself — is now clearly the thing to act on, which matters more than usual while there are no mentors on the platform to introduce you to. One genuine fault found along the way: the bar showing how well a role lines up had a track so close in colour to the card behind it that you could not see the unfilled part, which is half of what a bar is for. Every role looked like a strong match.

  • Role names carry the weight in the list, rather than competing with the verdict beside them
  • The verdict and its bar read as one thing, on the right, where the reasoning link already was
  • The bar's unfilled portion is visible — its track measured 1.7:1 against the card, so a 40 percent match looked much like a 90 percent one
  • 'Read against' is a readout beside the title rather than a panel competing with it
  • Screens with nothing to do on them yet say so against a rule, rather than in a box that looks clickable
  • Role and mentor cards are quiet until you are on them
  • On Connect, the block asking whether you have been through this yourself is now the clear thing to act on
v1.27.0

Your Experience Map stops shouting all eight things at once

Three places the app was saying the same thing twice, and then the Experience Map itself. Every card on your matches printed its verdict — 'Lines up on most of what matters' — as a subtitle under the role name and again as a heading a few centimetres to the right. The map headed itself 'Where you are, Step 7 of 7' immediately beside a sidebar saying 'Where you are, Step 7 of 7'. And with all eight areas settled, all eight cards wore an identical 'Clear picture' badge, directly below a panel that already said 'Clear picture — 8 areas'. Badges now mark the exceptions instead: a settled area gets a tick you can skip past, and the ones actually worth another look keep the words, so glancing at the grid finds them rather than bouncing off a row of identical chips. The rest of the map is the same treatment the conversation got last week — the four phases read as navigation rather than as four more cards, the panel telling you where you stand is the one thing lifted off the page, and the summary beside it is a readout rather than another box.

  • Matches: each card said its verdict twice, a few centimetres apart. Now once, against the bar it describes
  • The map no longer heads itself with the same label and step count the menu beside it is already showing
  • Settled areas carry a tick; only the ones worth another look carry words — the full wording is still read out by screen readers either way
  • The four phases are navigation now, not four cards competing with the eight below them
  • The panel telling you where you stand is the one raised object on the page
  • Two buttons that wrapped onto separate lines at different widths now stack as a matched pair — and sit side by side when the panel is genuinely wide enough, rather than when the window is
v1.26.1

Two things yesterday's release broke

Both mine, both from the same release, and the first one was bad. Removing the hardcoded screen height from thirteen screens was right — it was a guess at how tall the header and footer are, and it stopped being true the moment the header started growing with your text size. But the replacement only works if the container above it is arranged a particular way, and on the candidate screens it was not. So the conversation stopped fitting the screen: the transcript grew to the full length of everything ever said in it, and the reply box ended up about three screens below the bottom of the window. It had been checked before release, but in a test page that sat in a different part of the layout than the real screen does — which is to say it proved nothing. The second: signed in, the top-right corner said 'Sign in' for a moment on every page load, because the app treated 'we have not checked yet' and 'not signed in' as the same thing.

  • The conversation fits the screen again, with the reply box where you can reach it
  • The transcript scrolls inside itself rather than making the whole page scroll
  • The nine reading screens can no longer be squashed shorter than what is on them
  • Signed in, the top-right corner no longer flashes 'Sign in' before showing your initials
v1.26.0

The conversation looks like a conversation

The last three releases made the app legible. This one is about whether it looks like anything. Measured on the Discover screen, the entire product was running on three text sizes, two weights and no depth at all — so the only way anything could be made to stand out was to draw a box around it, which is why nine unrelated things on your Experience Map all arrived as the same card. The conversation had it worst. The screen this whole product is built around — not a CV, a conversation — was a bordered grey panel using 46 percent of the width available to it, with a scrollbar brighter than anything in it, and no sign anywhere that you are talking to someone called Dr Stone. It now reads as a transcript: his questions set as prose with his name against them, your replies as the thing that stands out, and the reply box as the one object lifted off the page. There is a proper set of text sizes and weights underneath it, and shadows that were defined at the start and never once used.

  • The conversation uses the width it has — it was using 46 percent of it
  • Dr Stone's name appears against what he says, which it never has anywhere on screen
  • His questions are set as prose rather than boxed, so a screen of them reads as talking rather than as a stack of panels
  • Your own replies are what stands out now, which is what you need when scanning back
  • The reply box is lifted off the page instead of sitting flush with everything else
  • The transcript fades at the bottom edge rather than cutting off mid-sentence
  • The scrollbar stops being the brightest thing on the screen
  • A real set of text sizes and weights, and the three depth levels that have been defined since the beginning and never used
  • Thirteen screens were each computing their own height from a guess at how tall the header and footer are — a guess that broke the moment the header started growing with your text size
v1.25.2

The voice stops rushing you

Voice mode has been reading every reply back 25 percent faster than the model intended, and had been for two releases — each one nudged the speed up to make the app feel quicker to answer. The trouble is that the same code politely asks the voice to sound warm and unhurried and to leave natural pauses at the commas, and then plays the result at a clip that flattens exactly those pauses. On the opening question it was buying 1.7 seconds: ten seconds of speech delivered in eight. For an app whose first question is about the life someone wants rather than the job they have, being read to in a hurry is the wrong feeling to open with, and 1.7 seconds is a poor price for it. The pace is back to normal. If the wait before a reply starts is the real complaint, the honest fix for that is streaming the audio as it is generated, which is a separate piece of work and is on the list.

  • Spoken replies play at the voice's natural pace — the 1.25x playback is gone
  • The opening question takes its full ten seconds again instead of being compressed into eight
  • The pauses the voice was directed to leave at commas and full stops now survive playback
  • Reverses the speed increases from v1.3.1 and v1.4.0, which treated pacing as a fix for waiting
  • Confirmed the round trip end to end against the live service: spoken out, transcribed back, word for word
v1.25.1

The rules now enforce themselves

The last three releases fixed a set of problems that all had the same shape: each one looked completely fine in the code, and only showed up when you measured it. A colour written out by hand looks identical to one read from the palette until someone changes the palette. A border at 2:1 looks like a border. Twelve-pixel text looks small rather than wrong. So rather than trust that nobody re-introduces them, the test suite now checks. Write a raw colour code, drop text below 14px, use a border or a text colour that falls under its contrast minimum, or remove a focus outline without putting one back, and the build fails and tells you which line and why. It is the same approach already used for controlling language in the app's writing, pointed at the visual side.

  • Raw colour codes in a class name fail the build — the palette is the only source
  • Text below 14px fails the build
  • Borders and text colours below their contrast minimum fail the build, with the ratio explained
  • Removing a focus outline without replacing it fails the build
  • The check knows the difference between a class name and a sentence, so these release notes do not trip it
  • 12 tests covering the rules themselves, plus a sweep of every screen in the app
v1.25.0

It bends when you make the text bigger

If you turn your browser's text size up — which, for this audience, plenty of people will have done years ago and forgotten about — the app used not to notice. The bar across the top was pinned at 72 pixels whatever size the words in it were, so they grew and it did not. Worse, the logo grew too, and at double size it was 357 pixels wide inside a 375-pixel phone screen, which pushed the entire page sideways. The bar now grows with the text and wraps when it has to, the logo stays the size a logo should be, and at every text size from normal to double there is nothing hanging off the right-hand edge. Separately, and overdue: there is now a 'Skip to content' link as the first thing you reach with the Tab key. Every screen has a header, and the candidate screens have a sidebar and a journey list as well — about a dozen links to tab past before reaching anything, on every page, every time. And the PIN screen was four boxes that a screen reader announced as four unnamed text fields, with the words 'Incorrect PIN' appearing on screen and being said to nobody.

  • The top bar grows with your chosen text size instead of staying 72 pixels and cropping
  • At double text size on a phone the page no longer scrolls sideways — the logo was 357px wide in a 375px screen
  • 'Skip to content' as the first stop for the Tab key, on every page
  • The PIN boxes announce themselves as 'PIN digit 2 of 4' rather than as four unnamed fields, and 'Incorrect PIN' is now actually announced
  • The PIN boxes show a focus ring like every other control, instead of a two-pixel change of border colour
  • Signed out, the top-right corner offered a '?' avatar with a Sign out menu behind it. It says Sign in
  • The footer clears the home indicator on an iPhone, and wraps rather than cropping when the tagline needs two lines
  • Page margins on a phone cut from 32px to 20px — they were taking 17 percent of the screen width
  • The name-and-location form had the one input in the app with no focus ring
v1.24.0

You can see the edges now

The app is built for people with thirty years of working life behind them, which is also the group most likely to have reading glasses on the desk — and it was shipping 12px text and borders you could not see. The borders were the worse half. Every card edge, every input outline, every divider was drawn in the brand's dark green on the dark teal background, which measures 2:1 against it. The accessible minimum for the edge of a control is 3:1. On the PIN screen this meant four boxes you had to guess at. They are now drawn in a lighter teal that clears the minimum against all four background shades the app uses. Alongside that, the smallest text in the app went from 12px to 14px, nothing that is meant to be read is below 16px any more, and the changelog you are reading was 92 characters to a line — half again as long as the eye comfortably tracks. Line spacing went from 1.4 to 1.5 for the same reason.

  • Card edges, input outlines and dividers are visible — 96 of them were at 2:1, below the 3:1 accessible minimum
  • Every low-contrast border variant raised to one that passes on all four background shades, not just the darkest
  • 12px text is gone from the app — 45 instances, mostly the small uppercase labels, now 14px
  • Reading text is 16px and lines are capped at roughly 75 characters, down from 92 here and 108 in these bullets
  • Body line spacing 1.4 to 1.5, and headings no longer set solid, so three-line titles stop colliding
  • Faint text raised above the readable minimum: cream at 50 percent and teal at 60 and 70 percent all failed
  • Anyone who has asked their system to reduce motion now gets that everywhere, rather than in the five places that remembered to ask
v1.23.2

Nothing changed, which was the whole point

Housekeeping with nothing to show for it, deliberately. The app has a set of named colours — the dark teal, the cream, the orange — defined in one place so that changing one changes it everywhere. Roughly half the screens ignored that and wrote the colour codes out by hand instead: 190 of them, across sixteen files. It looked identical and behaved identically, right up until you wanted to change a colour, at which point you would fix it in one place and it would keep being wrong in the other. Everything now reads from the one definition. This release should be invisible; the next one is the reason it had to happen first.

  • 190 hand-written colour codes across sixteen screens now read from the single set of named colours
  • The conversation, your matches, the role reader and the mentor sign-up were the worst of it
  • No visual change anywhere — verified by the full test suite and a screen-by-screen comparison
v1.23.1

Finishing something now looks like finishing something

Two from Andy, one of them a fault introduced by yesterday's change. Answering all thirty interest statements left the menu still showing Interests untouched — the menu is drawn on the server when the page loads, and nothing told it anything had happened since. Underneath that was the worse half: the app decided you had finished the questionnaire by checking whether a saved row existed at all, which was true while it only saved once at the end, and became nonsense the moment it started saving after every answer. Left alone it would have flipped Interests to 'Done' after a single statement of thirty. It now counts the answers, so the menu says 'under way' partway through and 'done' when it is actually done. Separately, Connect was listed as Connect with Connect indented underneath it, both going to the same place.

  • Interests shows as done when you finish it, and as under way while you are partway through
  • Completing the run updates the menu straight away instead of waiting for the next page load
  • Connect is one line in the menu, not the same word twice pointing at the same page
  • A test now fails if answering one statement of thirty is ever treated as finishing
v1.23.0

The questionnaire learns to talk

The interests page was thirty statements stacked in a list — the one screen in a product built on 'a conversation, not a form' that was unmistakably a form, and it opened with a wall. It asks one at a time now, in the same shape as the conversations either side of it, and saves as you go so closing the tab halfway through costs nothing. What has NOT changed is how it is scored. Your answers are still five explicit choices on the same scale, still added up by the same arithmetic, because the whole reason this is a questionnaire rather than a chat is that the same answers have to give the same result every time — and interest scores feed mentor matching, where a number that drifts does not merely weaken a suggestion, it can rule out a good one. The statements are also shuffled so you never get five of a kind in a row; being asked five practical things back to back makes the pattern obvious, and an obvious pattern gets answered from a decision about yourself rather than from the statement in front of you. Separately: the left-hand menu grew a scrollbar and hid its own last item, which is a menu telling you it has nothing more in it. It fits the screen now.

  • One statement at a time, with Dr Stone's framing up front: how much you'd enjoy it, not whether you're any good at it
  • Answers save as you give them, and the run picks up where you left off
  • Press 1 to 5 on the keyboard, or have the statement read aloud
  • Statements interleaved across the six interest types instead of five of a kind in a row
  • Scoring untouched — same items, same scale, same arithmetic, same reproducible result
  • The left-hand menu fits on screen instead of scrolling, and no longer lists the same three destinations twice
  • 'Your record' is visible in the menu without scrolling to find it
v1.22.0

A thread through the whole thing

Last version made sure no screen leaves you stranded when there is nothing to do on it. This one is about the opposite problem, which turned out to be worse: the screens you reach by getting something right. You would confirm the eight terms that decide which roles you are ever shown — hours, income, where you live, what you would rather not do again — and the entire acknowledgement was the word 'Saved'. Finish your Experience Map and the page simply stopped at the last card. Meanwhile the sidebar had a phase called Design that was not a link, because with three things underneath it nobody had picked which one it should open; 'Your profile' in the top bar and 'Transition' in the sidebar both went to the same name-and-address form under different names, while the Experience Map itself was linked from neither; and on a phone there was no navigation at all, so the Success Formula and the Life Fit Plan were reachable only by typing the address. Now there is one journey — seven steps, four phases — and everything reads from it: the sidebar, the strip at the top of your map, the card at the foot of every screen telling you what follows and why.

  • Every screen you finish now hands you the next thing, with a sentence on why it follows — the Experience Map, the Success Formula, the Life Fit Plan, the interests questionnaire and your matches all used to end on a full stop
  • Design is a phase you can click into, and each of its three steps has its own entry
  • Navigation on a phone: a bar showing where you are, opening the same journey the sidebar shows — below a laptop screen there was none
  • Your name and where you are based is now the first step rather than a form hidden in the account menu, which is why the conversation kept greeting people as a stranger
  • 'Your profile' meant two different screens with the same title. The map is 'Your Experience Map', the form is 'Your details'
  • Your record — what people who have worked with you have said — was linked from nowhere in the app. It is in the sidebar now
  • Confirming an area of your map moves the count in the sidebar. It never did: the sidebar was checking for a word the app does not write, at a threshold the rest of the app does not use
  • 'Offer to mentor' on the Connect screen led to a page that does not exist
  • The interests questionnaire always sent you to Connect when you finished, because Connect was the only screen that ever mentioned it. It now goes wherever you actually are in the journey
v1.21.0

No more full stops

A sweep of every screen you can land on with nothing to do, looking for the ones that explain your situation and then leave you there. There were six. The Experience Map before you have said anything, the Success Formula before the map fills in, Connect before there is anyone to connect you to — each one told you what was happening, several told you which screen to go to next, and not one of them gave you the door. The Experience Map empty state was the worst of it, because it is where the end of a conversation now sends you, and the map takes about a minute to catch up after you stop talking. Arriving to 'nothing to review yet' with no explanation reads as though the whole conversation went nowhere.

  • Experience Map, when empty, says the map lags behind the conversation by a minute and offers a way into one
  • Success Formula and Connect now link to Discover instead of naming it and leaving you to find it
  • Connect, with no mentors on the platform yet, says plainly that there is nothing for you to do about it and points at your matches
  • Publishing a role offers to read another one, instead of ending on a full stop
  • The matches screen's 'Your Experience Map' button goes to the Experience Map — it went to the dashboard
  • A test now fails if any of these states loses its way onward again
v1.20.0

Nobody gets hung up on

Last version gave you a way to stop the conversation whenever you liked. It worked, and it was cold: you said you were done, and the software's answer was to put a card over the transcript and collapse the reply box. Twenty minutes of talking about your working life, closed like a window. Now tapping it asks Dr Stone to close properly — he reflects back what he actually heard, thanks you for the time, and signs off. The reflection is sized to the conversation, so finishing after four turns gets a short and honest goodbye rather than a speech about the full picture you did not paint. He is also told, in as many words, not to try to talk you into staying.

  • 'Finish for now' now asks the assistant to close warmly instead of ending the conversation over its head
  • The goodbye reflects back what was actually said, proportional to how far the conversation got
  • The assistant is told not to ask another question and not to claim the picture is complete when it is not — leaving early costs nothing
  • Works the same in Discover, Life Fit and the mentor conversation, and is read aloud in Speak mode
  • A closing turn that hits a bad connection retries as a closing turn, rather than quietly becoming an ordinary one
v1.19.0

The conversation knows how to say goodbye

The first person to walk the pilot properly found three things, and all three were the same thing wearing different hats: the app knew more than it was letting on. The Discover conversation had a lovely closing card with a way onward, which almost never appeared, because the assistant's own goodbye was being thrown away on the way in — so unless you talked for eighteen turns you got silence and an open reply box. The Experience Map, the thing the whole conversation exists to build, was tucked behind the profile link where nobody found it. And the microphone gave you two seconds of quiet before deciding you were done, which is not a pause, it is a thought.

  • The assistant's closing message now actually ends the conversation — Discover, Life Fit and mentor all dropped it before, leaving the card to a turn-count backstop
  • 'Finish for now' — a quiet way out from your first reply onwards, with its own wording so nothing claims to be complete when it is not
  • The way onward goes to your Experience Map and says so, instead of naming the map and landing on the dashboard
  • Voice input waits four seconds before deciding you have stopped, up from two — a pause to find the right word is no longer the end of your answer
  • Progress dashes now show half-filled for areas explored but not yet settled, so they agree with what the Experience Map says about the same area
v1.18.0

The guest list has a page now

Adding someone to the allowlist used to mean asking a developer to type SQL. Now there is a proper admin page where you can see who is on the list, add someone new with a role, and remove them — all through the same dark teal UI as everything else. The API validates emails and catches duplicates, and the whole thing is protected behind the existing PIN gate and Supabase auth, so nobody is wandering in uninvited.

  • Admin page for managing the allowlist: view emails, roles, who invited them, and remove entries
  • Add-someone form with email input, role dropdown (candidate/client/mentor), and Enter-to-submit
  • API validates email format, catches duplicates with a clear message instead of a database error
  • Protected behind PIN gate and Supabase auth — not linked from anywhere in the app
v1.17.1

The bars said nothing, so they went

Every area card had a meter bar that looked the same regardless of how well-understood the area was, because the extraction model caps its own confidence around the same level for everything. A bar that never moves is not a bar — it is furniture. Gone now, replaced with a plain-language hint on the areas that would actually benefit from more conversation, so the nudge lands where it matters instead of everywhere equally.

  • Removed the meter bars from all eight area cards on the profile page
  • Weaker areas now show a hint suggesting more conversation would sharpen the reading
  • The 'how the picture reads' panel mentions how many areas would sharpen, rather than just 'everything is clear'
  • Area cards no longer stretch to match their grid neighbour when one expands — each sizes to its own content
v1.17.0

The inside pages grew up

Profile, Matches, and Connect were functional but looked like three different apps built by three different people on three different Tuesdays. They now share a layout: a left sidebar tracks where you are in the journey, every page has the same eyebrow-heading-intro pattern, cards expand in place instead of bouncing you to another screen, and the design tokens are the actual design tokens rather than hex codes pasted from memory. The header navigation is live across all four tabs, and the whole thing scrolls properly instead of fighting itself.

  • Candidate layout with persistent left sidebar showing journey phases, artifacts, and reassurance text
  • Profile page redesigned: readiness panel, 'how the picture reads' summary bar, click-to-expand area cards with evidence quotes
  • Matches page redesigned: 'read against' panel, filter chips, expandable role cards with component breakdowns and strongest/weakest sections
  • Connect page redesigned: richer mentor cards with badge verdicts, why/domains sections, introduction buttons, and 'been through this yourself?' CTA
  • Header navigation fully active across Profile, Discover, Matches, Connect with initials avatar and settled-count display
  • Overflow architecture reworked: root layout is overflow-hidden, each page manages its own scroll
v1.16.0

It knows your name now

A conversation that says 'you' for twenty minutes while you tell it about your life felt like talking to a form. Your profile now has a place for your name and where you are based, and every conversation — Discover, Life Fit, mentor — uses your first name naturally rather than never at all. The header tells you who you are logged in as, and there is a proper profile page to fill in and change these things. Location is there for a reason: the Binary Reality Gate kills a match when the geography does not work, and it cannot do that without knowing where you are.

  • Profile fields: first name, surname, town/city, and country, stored on the profiles table
  • Profile editing page at /candidate/profile with the identity form
  • Header shows 'Logged in as: [Name]' when a first name is set
  • All three conversation personas (Dr Stone, Tony) use the candidate's first name when available
  • Migration 0016 adds the columns; column privileges grant update to authenticated only
v1.15.0

A front door that looks like the place

The home page was a centred box with three cards, which is roughly what every SaaS landing page looks like. This one now looks like this product: the hero says what it is and the journey card shows how it works, the three ways in are taller and tell you more, and there is a closing line at the bottom that lands differently from a subtitle. The header is a proper navigation bar now, with tabs that light up when you are on that page, and disabled ones for the parts that are not open yet. The footer sits inline instead of floating.

  • Redesigned home page: hero section with journey card, expanded role cards with eyebrows, closing statement
  • Horizontal navigation bar replaces the burger menu — tabs for Your profile, Discover, Matches (disabled), Connect (disabled)
  • Footer is now an inline bar at the bottom of the viewport, not a floating overlay
  • Full-viewport app shell: header and footer stay fixed, content scrolls between them
  • Design system tokens expanded with surface-card, tint fills, border variants, radii, elevation, motion
v1.14.1

Dr Stone stops re-reading the same page

Every reply in a conversation was sending Dr Stone the whole rulebook and the entire transcript again from the top, and the passes that build your profile did it twice more on every turn. All that text is now cached between turns, so the parts that never change get read once instead of sixty times. Nothing about the conversations changes — same questions, same understanding, same care over what gets written down. It just costs a fraction of what it did, which is what lets us open this up to rather more than three people.

  • Prompts and transcripts are cached between turns across all four conversations
  • One shared module owns where the cache breakpoints go, so the eight places that call Claude cannot drift apart
  • No change to what any conversation asks, understands, or records
v1.14.0

Tony takes the mentor conversations

Three conversations, three people. Dr Stone helps you work out what you want, Korn reads a role, and offering to mentor someone now means talking to Tony. They are separate because they are genuinely different conversations — a single voice doing all three ends up being no one in particular. Underneath, all three work the same way and now have a test proving it: each knows when to stop asking, each lets you add something after it has finished, and each hands you to a screen where you check what was understood before any of it counts.

  • The mentor conversation is Tony, and introduces itself once at the start
  • A test asserts every conversation declares when to stop, offers a way back in, and has its own confirmation screen
v1.13.2

Dr Stone knows its own name

Dr Stone has been called that on screen since last year, but the name only ever existed as a label — ask it who it was and it had no idea. It does now, across all three conversations it runs. It still won't introduce itself unprompted: the screen already says who you are talking to, and saying it again reads as a script rather than a person.

  • Dr Stone is named in the Discover, Life Fit and mentor prompts, not just in the interface
  • Neither assistant introduces itself unless asked
v1.13.1

Meet Korn, and a conversation that knows it's over

The side of Third Career that reads a role has had no name since it was built — it just said 'Thinking…' at you. It's Korn now, and it introduces itself once at the start rather than every time. Separately: when a conversation had genuinely finished, the reply box sat there open underneath, inviting you to keep talking to something that had already said goodbye. Finishing now leads with the way onward, and the reply box is one click away if you do have something to add — because occasionally you will, and every reading is re-read from the whole conversation, so more can only sharpen it.

  • The role-reading assistant is called Korn
  • A finished conversation leads with the next step and tucks the reply box behind 'Add something else'
  • Adding more after the end is still possible, just no longer the default
v1.13.0

Roles that are both part-time and properly paid

The first real run against a real set of terms returned one role out of sixteen, and that one was a board seat that scored close to zero. The arithmetic was right and the filtering was right — the problem was the roles themselves. Fifteen of them, spread across hours and pay and geography, and not one sat in the place this whole product exists for: a small number of hours, at a serious rate, somewhere that actually lets you get on with it. Three roles now fill that space. They are deliberately different from each other, so the ranking has something to say rather than three near-identical good fits, and the difference between them comes out mostly in how well what you bring lines up with what the work asks for.

  • Three seed roles added in the low-hours, well-paid, autonomy-supportive space that had none
  • A ranked shortlist now appears for a realistic set of terms instead of a single poor match
v1.12.2

Coming back is quieter

Opening a conversation you had already had, with Speak switched on, started reading to you again and opened the microphone for a question nobody had just asked. Reading it aloud on arrival makes sense for a conversation that has not started; for one you are returning to, you came back to read what you said, not to be talked at. It now stays quiet, and 'Play that again' is there if you do want it.

  • Speak mode only reads the opening aloud on a conversation that has not started yet
  • Returning to an existing conversation no longer opens the microphone unprompted
v1.12.1

Called what it is

The menu said Home, which described where the page sits in the app rather than what you would go there for. It says My profile.

  • Menu item renamed from Home to My profile
v1.12.0

One home instead of two

There were two pages fighting over the same job. A dashboard of four large cards that told you nothing about yourself — every word on it was a heading, a status or a link — and a profile page that held all the actual substance. Both answered 'am I ready to be matched yet' in different words, which is exactly how two pages start disagreeing. They are one page now. The journey sits at the top as a compact row of four steps you can still reach in any order, and underneath it is everything that is actually known about you. The menu has one destination instead of two, and the old profile address still works if you had it open.

  • The dashboard and profile pages are now a single home
  • The four phases became a compact strip rather than a page of cards
  • Every phase is still reachable in any order, and the cost of working ahead is still stated rather than enforced
  • The menu now has one home rather than two views of the same question
  • The old profile address redirects rather than 404s
v1.11.1

It ends when it's finished, not when it's allowed to

The card saying a conversation was done kept appearing over a reply that was still asking you something — and there was a worse problem hiding behind it. Ending the moment enough had been covered meant every conversation ended at exactly that point: the minimum stopped being a floor and became the destination, so whatever more you had to say went uncollected because a counter had reached eight. Now the amount covered only decides when the conversation is allowed to draw to a close. It decides when it actually does, and the card follows it. If it wants to keep going because there is more worth getting, it does. Also: your results page now works out your matches when you arrive, rather than showing an empty page and asking you to press a button for something that had never been calculated.

  • A conversation ends when it says so, not when a threshold is met
  • The completion card can no longer appear over a question
  • Conversations are free to run past the minimum when there is more worth getting
  • A backstop still ends a conversation whose own goodbye never arrives
  • Results are calculated on first arrival instead of behind a button
v1.11.0

Mentors get a conversation too

Offering to mentor someone meant ticking boxes for what you had been through and dragging sliders to rate how much room you leave people. Nobody describes themselves well in the abstract, and most of us are kinder about others than about ourselves — so it asks about a person instead. Who have you helped through a change like this, and what did they actually need from you? What did you do when they wanted to try something you thought was a mistake? Your profile gets built from the answers, and you check it before it goes anywhere. One thing it deliberately does not guess at: the questions about your interests. Those stay a proper set of questions, because a conversation deciding you sound like a certain sort of person, and then using that to decide who you get paired with, is not something we are willing to do.

  • The mentor profile is now a conversation, at the same address as before
  • It asks about people you have helped rather than asking you to rate yourself
  • A review screen shows what was understood, holds the interests questions, and is where you publish
  • Interest scores are never inferred from the conversation
  • Anything the conversation did not genuinely establish is left blank rather than guessed — a mentor credited with a move they have not made gets paired with someone they cannot help
v1.10.1

The end of the conversation now has an end

The Life Fit conversation would say its goodbyes and then leave you sitting there: no card, no way onward, just a finished conversation at the bottom of the screen. It closed because it had enough to work with, while the screen was still waiting for the very last detail to arrive — a detail that was never coming. Both sides now use the same rule for when a conversation is over, so the card appears on the turn it says goodbye. And if you had that conversation but never got to check the numbers, your dashboard no longer claims you have not started: it says the details are waiting to be checked, and takes you straight to them.

  • The completion card appears when the conversation closes, not only when every last detail is settled
  • Both conversations now declare one wrap-up rule that the screen and the assistant share
  • The dashboard distinguishes a Life Fit conversation you have had from one you have not
  • An unconfirmed plan takes you to the confirmation screen rather than back into the conversation
v1.10.0

Your Life Fit Plan is a conversation now

The Life Fit Plan was the last part of the journey that asked you to fill in a form — checkboxes, sliders and number boxes for the hours you want, what the work has to earn, where, and what you are ruling out. It is a conversation now, in typing or Speak, that asks what a good week actually looks like and works the practical details out from there. When it has the picture, it shows you the numbers it landed on before any of them do anything. That last step matters more than it looks: these are the terms every role gets held against, and a misheard figure would quietly remove real options with nothing on screen to show for it. Nothing counts until you have read it back and saved it. The form itself is still there, as the screen where you check the numbers and where you go later when one of them changes.

  • Life Fit is now a conversation rather than a form
  • It probes further when an answer is too vague to build a week around
  • A confirmation screen shows the numbers before they filter anything
  • Anything the conversation did not genuinely establish is left blank rather than guessed
  • Matching, the dashboard and the results page all wait for your confirmation, not just for the conversation
v1.9.3

The mic picks up where the question leaves off

In Speak mode the very first question was read aloud and then everything went quiet, leaving you to find and tap the microphone — even though every reply after that hands straight over to it. It now hands over on the first question too. And if you land on a page already in Speak mode, because that is what this device chose last time, it opens the question aloud rather than sitting silent; browsers sometimes refuse to play audio nobody asked for, and when that happens it now waits quietly for your first tap instead of reporting a fault. Separately, on the results page the two things standing between you and a match looked like buttons and did nothing. They are now links to the thing each one names.

  • The microphone opens after the first question in Speak mode, as it does after every other reply
  • A page opened in Speak mode reads its first question aloud
  • Blocked autoplay waits for your first tap instead of showing an error
  • 'Your Experience Map' and 'Your Life Fit Plan' on the results page are now real links
v1.9.2

It asks first, and it remembers how you like to answer

Going back to talk more about one area opened with a greeting and then waited, which left you to start the conversation yourself — awkward in typing and genuinely odd in Speak mode, where you get read a hello and then sit in silence working out what to say. Each area now has its own opening question, so the follow-up begins the way the first conversation does. And whichever way you choose to answer is now remembered on this device: pick Speak once and every conversation opens in Speak, including the very first paint, with no flicker while it catches up. Tapping 'let me edit that' to fix one transcription does not count as changing your mind.

  • Follow-up conversations open with a real question about the area you came back for
  • Type or Speak is remembered per device and applied before the page first renders
  • Correcting a single transcription no longer quietly opts you out of Speak mode
v1.9.1

It stops listening when it stops asking

At the end of a spoken conversation the microphone opened one more time, listened to the silence of someone reading the goodbye, and then apologised for the recording coming through empty. The reason was that two parts of the screen were working out separately whether the conversation had ended, and only one of them knew about the way a Discover conversation finishes. There is now a single answer to that question, and the completion card, the microphone and the reply box all read it — so the card appears exactly when the conversation ends, and nothing opens the mic after the last thing has been said.

  • Microphone no longer re-opens after the closing message
  • Completion card appears when the conversation actually finishes, not before
  • One shared rule decides when a conversation is over, so the parts cannot drift apart
v1.9.0

Ten more roles, and a follow-up that lasts longer than one reply

There are now fifteen roles to be matched against rather than five, spread deliberately wider: hours from four a week to full time, two roles outside London that need you on site, one with weekends and on-call, two you could not stack alongside anything else, and pay from unpaid to six figures. A shortlist that is nearly the whole list proves nothing, so these exist to be ranked and rejected as much as recommended. Also fixed: going back to talk more about an area could end after a single reply, because the profile page and the conversation were using two different bars for what counts as settled. They now use the same one, and a follow-up keeps going until the area actually clears it — or until it has run a reasonable course, since some things are genuinely hard to read from a conversation.

  • Ten more seed roles, spanning hours, geography, work patterns, pay and how autonomy-supportive the employer is
  • New test asserts every seed role uses the controlled capability and value vocabularies — an invented id scores against nothing and would silently drag a match down
  • Follow-up conversations judge completion on the same bar the profile page uses
  • A follow-up closes after a reasonable number of turns rather than pressing on indefinitely
v1.8.6

Nothing learned gets lost

Going back to talk more about one area starts a fresh, short conversation — which is what makes it feel focused rather than making you scroll past everything you already said. But the reading of your profile was being rebuilt from only that short conversation, so three turns about one thing were being asked to account for all eight areas. It held together because the previous reading was handed over as a reference, which is a lot of weight to put on it being copied across faithfully. Now the profile is always read from every conversation you have ever had here, while the chat itself still only shows the one you are in. Separately, the quotes under each area were piling up — one had thirty-nine, mostly the same few sentences repeated by each pass. They are now kept once each, most recent first.

  • Profile extraction reads every Discover conversation, not just the current session
  • Follow-up conversations still show only their own turns on screen
  • Supporting quotes are de-duplicated and capped at six per area
  • Re-running extraction over an unchanged conversation now leaves the profile untouched
v1.8.5

Words arrive with the voice

In Speak mode the reply used to appear on screen a second or two before it started being read aloud — just long enough to read the whole thing yourself and then sit through hearing it. The text now appears as the voice begins, so the two arrive together. The thinking indicator stays up until then rather than disappearing into a silent blank, and if the audio ever fails the words still appear, because a reply that cannot be spoken is not a reply you should lose.

  • Voice mode reveals each reply as playback starts, not before
  • Thinking indicator stays until the reply appears
  • The reply is still shown if speech fails, errors, or you navigate away
v1.8.4

Headings the size they asked to be

Every heading in the app has been rendering far larger than the code asked for. A stylesheet rule setting display sizes for h1 to h4 sat outside Tailwind's layers, and in Tailwind 4 an unlayered rule beats a layered one — so every text-base and text-lg written on a heading was silently ignored. A profile card title asking for 18px was rendering at 28px, which is a good part of why that page ran on forever. The rule is now a default that a component can override, so the big display headings on pages that want them are untouched, and UI headings are finally the size they say they are. Also fixed: a follow-up conversation would announce that your areas were filled in and then carry on asking about them, because the banner was reading your progress and the assistant was not.

  • Global heading sizes moved into the base layer so size utilities work again
  • Follow-up conversations close when their areas are answered, instead of contradicting the banner on screen
  • A follow-up covering several areas now narrows to whichever are still outstanding
v1.8.3

Let me finish my sentence

The conversation had a habit of declaring itself finished mid-question. Once enough areas were covered, the 'your Experience Map is ready' card appeared and took the reply box away with it — so the assistant would ask you something and leave you no way to answer. Reaching ready is meant to be an invitation to move on when you feel like it, not the end of the conversation, so the card is now a slim banner that sits above a reply box that stays exactly where it was. Carry on talking as long as you like; every pass re-reads the whole conversation, so more only ever sharpens the picture.

  • Completion no longer removes the composer — the conversation stays open
  • Completion card slimmed to a banner so it announces itself without taking the screen
  • Same fix applied to the role conversation on the client side
v1.8.2

Three things that were quietly wrong

Tapping 'Talk about this some more' opened a page that congratulated you on finishing a conversation you had not had — because it was checking whether your whole profile was complete rather than whether that one area was. It now opens where it should, on a real conversation about the thing you tapped. Separately, leaving a conversation mid-reply meant the voice carried on reading to you over whatever page you moved to, and then opened the microphone to ask the next question, with nothing on screen to stop it. It now stops when you leave. And the reading of how well each area came through had drifted: the extraction was told to be humble and had no sense of what a well-evidenced answer looks like, so everything landed on the same middling score and every area read as 'a little thin' no matter how much you had said. It now has a proper scale, with the top of it reserved for exactly what it sounds like.

  • Focused follow-up conversations judge completion on their own areas, not the whole map
  • A follow-up always allows at least one exchange, so a stale link cannot dead-end on the completion card
  • Voice playback and auto-recording stop when you navigate away mid-reply
  • Extraction confidence has explicit calibration anchors, so a well-evidenced area can read as one
v1.8.1

Shorter, and better for it

The profile page said everything it needed to and then kept going. Eight areas, each fully expanded, each ending in a bullet list of your own quotes played back at you — accurate, and far too long to actually read. Now the areas that need something from you open on arrival and the ones already settled stay tucked away, so the page opens on what is actually outstanding. Your exact words are still there, one tap away under each area, with a count so you know what is behind it. And the written reflection on each area has grown from a line into two or three real sentences, because it is now carrying the card on its own rather than sitting on top of a wall of quotes.

  • Areas that block matching open by default; settled ones stay collapsed
  • Verbatim quotes moved behind a 'What you said' toggle, with a count
  • Per-area summaries are now two to three sentences, and stand on their own
  • Dropped the heading above each summary — the text is the point, not the label
v1.8.0

So that's what you heard

Finishing a conversation and being told nothing about what came of it is a strange way to end twenty minutes of talking about your working life. There is now a profile page that says it out loud: all eight areas, what each one means, how well it came through, and a written reflection of what was understood about you — with the quote you actually said sitting underneath it. Where an area is thin, it says so, and offers either a one-tap confirmation or a short follow-up conversation about just that thing. Underneath, a fix to something more serious: one confidence number had quietly been doing three jobs at once, and the last attempt to unstick the conversation had the side effect of letting matching run on readings nobody had ever checked. That number is now three, each doing one job, and the strictest of them guards the matching engine where it belongs.

  • New profile page at /candidate/profile — eight areas with titles, descriptions, strength, and a written summary of what was understood
  • One threshold became three: probing (0.6), coverage (0.4) and trust (0.7), so a conversation can finish without the scoring engine losing its guardrail
  • Matching now requires every area to be either strongly evidenced or confirmed by you — no more scoring on unreviewed guesses
  • Conversations wrap up gracefully after a long run rather than circling, and say what they would like to pick up another time
  • Follow-up conversations can be scoped to just the areas that are still thin, instead of starting from the top
  • Every area now carries a plain-English summary written during extraction, alongside the quotes it was drawn from
  • Burger menu in the header: My profile, Dashboard, Sign out
  • Start again — wipe your conversations, profile, formula, plan and matches and begin from a blank page (pilot only)
v1.7.1

The bar that never moved

After a full 17-turn Discover conversation the progress bar sat stubbornly at 0/8 and the completion card never appeared. Turns out the extraction model was being honest — maybe too honest — and capping its confidence scores around 0.5, while the threshold that counted a field as 'covered' was set at 0.7. The conversation worked, the data was there, but the gate was just too high for the model's own self-assessment to clear. Lowered the threshold so realistic confidence scores actually count, and the flow can finish.

  • Lowered CONFIRMATION_CONFIDENCE_THRESHOLD from 0.7 to 0.5 so extraction confidences can actually reach it
  • Progress bar now reflects what the model genuinely knows instead of waiting for a confidence score that never comes
  • Conversations that cover all eight areas will now trigger the completion card and Experience Map transition
v1.7.0

Just keep talking

Voice mode now feels like a real conversation. When the AI finishes speaking, the microphone goes live automatically — no need to tap between each exchange. You speak, it listens, it responds, it reads its reply aloud, and then it is your turn again. The progress bar also shows from the very first message (0/8) so you always know the journey is being tracked, and the whole layout breathes a bit more with tighter, less cramped spacing.

  • Mic auto-starts after the AI finishes speaking — continuous conversation flow
  • Progress bar visible from 0/8 instead of hidden until the first extraction
  • Tighter layout spacing in voice mode — less cramped, more room for messages
  • Status line only renders when active instead of reserving empty space
v1.6.1

Server says no (to functions)

The v1.6.0 deploy broke both the Discover and Role Reader pages with a server error. Next.js quite rightly refused to serialise JavaScript functions across the server-to-client boundary — the new ChatFlowConfig was passing buildBody and parseResponse as props from a Server Component to a Client Component, and you cannot send a function over that wire. Fixed by passing a plain data descriptor instead and resolving the config on the client side.

  • Replaced function-bearing config prop with a serialisable FlowDescriptor
  • Client component now resolves the full config internally via resolveConfig()
  • Both Discover and Role Reader pages working again
v1.6.0

One conversation to rule them all

The role creation chat was living in its own world — text-only, no voice mode, no retry on errors, and the messages just floated off the bottom of the page while the Discover chat had scrolling, voice, progress tracking, and all the polish from the last three releases. Now every chat in the app shares the same component. The role conversation gets voice mode (speak your answers, hear questions read back), the same fixed-height scrolling viewport, error retry, and the mode toggle. Same conversation, same quality, whether you are exploring what you want or describing the role you are hiring for.

  • Role conversation now uses the shared Conversation component with full feature parity
  • Voice mode available in role creation — mic button, silence detection, auto-send, TTS playback
  • Fixed-height scrolling viewport replaces the old float-off-the-page layout
  • Error retry button appears on failed sends instead of a static error message
  • Chat/Voice mode toggle with the same look and behaviour as Discover
  • Deleted the separate RoleReaderConversation component — one component serves both flows
  • Chat flow configuration system makes adding new conversation types straightforward
v1.5.0

Now it actually goes somewhere

The Discover conversation used to chat warmly, learn plenty, and then... sit there. No sense of progress, no indication of what had been covered, and no next step when it was done. The conversation now knows what it still needs to find out and gently steers toward the gaps without feeling like a checklist. A progress bar shows how many of the eight areas have been explored, filling in as the conversation deepens. When everything is covered, the AI wraps up naturally and a completion card appears with a clear path to review your Experience Map. Oh, and navigating away and coming back no longer wipes the entire conversation — it picks up where you left off.

  • Progress bar shows 0–8 areas explored, updating after each exchange
  • The AI now knows which areas still have gaps and steers the conversation toward them
  • When all areas are covered, the AI wraps up and a completion card appears
  • Completion card links to the Experience Map review and dashboard
  • Conversation persists across page navigation — back/forward no longer loses messages
  • Returning to Discover resumes the most recent session instead of starting fresh
v1.4.0

Just talk — it knows when you're done

Voice mode used to feel like typing with a microphone bolted on. The text box sat right there beside the mic button, you had to tap twice to record and stop, and the only sign anything was happening was a tiny "Listening..." label. Now when you switch to Speak, the text box vanishes and a large mic button takes centre stage. Tap it, talk, and when you pause for a couple of seconds it picks up on the silence and sends your words automatically. Pulsing rings radiate from the mic while you speak — they breathe with your voice — and afterwards your transcription sits in a review banner with a countdown, so you can still fix it or start over before it goes. The voice reading replies back is also a touch faster, because it was.

  • Voice mode hides the textarea and send button — the mic is the entire composer
  • Silence detection via Web Audio API auto-stops recording after ~2 seconds of quiet
  • Pulsing concentric rings animate from the mic button while recording, volume-reactive
  • Transcribed text shows in a compact review banner with countdown, not the textarea
  • "Let me edit that" switches to chat mode with the text pre-filled for correction
  • TTS reply speed bumped from 1.1x to 1.25x
  • Manual tap-to-stop still works as an escape hatch
  • Safari and older iPad support via AudioContext fallbacks
v1.3.2

Reading you in two halves, twice as comfortably

Every time you send a message in Discover, your conversation is read in the background to update your Experience Map. That reading asks Claude to fill in eight structured fields — capabilities, competence, how you think about your own standards, what you value, the move you are making, what drives you, how you relate to autonomy, and what you need from a role. It was doing all eight in one go, and the system that enforces the answer shape has a hard ceiling at nine. One more field and the whole thing would have broken. So the reading is now split into two halves that run side by side: who you are (four fields) and how you move through the world (four fields). Both read the full conversation, both answer independently, and the results are merged afterwards. The same fix the job description reader already uses — proven there, applied here. Nothing changes about what you see or how it feels. Your map fills in the same way, from the same conversation, with the same evidence. It just has room to grow now.

  • Extraction split into two parallel API calls: person (ksas, competenceLevel, orderOfMind, values) and dynamics (transitions, motivation, causality, needs)
  • Each pass reads the full conversation and answers for its own fields only
  • Both passes retry independently, so one awkward half does not drag the other back through
  • Compile-time checks ensure every field belongs to exactly one group and no field is forgotten
  • Follows the same two-pass pattern already proven on the Role Reader since 1.0.9
  • Headroom against the grammar ceiling goes from one field to five
v1.3.1

The conversation that scrolled off its own page

A few turns into the Discover conversation and the chat box disappeared below the fold, the voice was a touch too unhurried, and when the reply came back the cursor was nowhere to be found. The conversation now stays inside a fixed viewport with the composer pinned at the bottom, messages scroll automatically as they arrive, the voice is 10% faster, and focus returns to the text box after every reply. The chatbot also has a name now — Dr Stone — rather than introducing itself as a piece of software.

  • Conversation area is now a fixed-height viewport with scrollable messages and a pinned composer
  • Messages auto-scroll to the latest turn as the conversation grows
  • Focus returns to the text box after each assistant reply
  • TTS voice speed increased 10% — still warm, slightly less glacial
  • Chat persona renamed from "Third Career" to "Dr Stone"
v1.3.0

Three doors, not one

The home page used to be a single link that dropped everyone into the candidate flow, whether they were exploring their next chapter, posting a role, or offering to mentor. That made sense when the candidate path was the only one that existed, but now all three tracks are live it was funnelling two-thirds of visitors into a journey that was never meant for them. The landing page now asks "What brings you here?" and offers three cards — one per track — so the first thing you see is the choice that matters, not the assumption that you are here to be placed.

  • Home page shows three role cards: exploring what's next, looking for someone, and offering to mentor
  • Each card links to the correct track entry point
  • All copy lives in src/lib/copy/home.ts where the tone guard can scan it
v1.2.1

The same slip, one release later

Separating moves from values meant the mentor tags on the Connect screen were suddenly showing a different kind of thing — and the screen was still translating them using the old list, so it found nothing and printed the internal names instead. Hyphens and all, exactly as in the release before last. What is worth admitting is that there was already a test guarding against this, added precisely so it would not happen again, and it passed. It was checking that the old names came out readable rather than checking whatever the screen is actually being handed, so the moment the underlying thing changed it was guarding a door nobody was using any more. Both are fixed: the screen reads from the right list, and the test now pins the thing the screen actually receives.

  • Fixed: mentor tags showed internal names again after moves and values were separated
  • The guard added last time now checks the vocabulary the screen is really handed, so it would have caught this
v1.2.0

The move you are making is not the same as what you value

Mentor suggestions rest on four things, and one of them is meant to ask whether a mentor has actually been where you are going. That is the whole pitch of the mentor side — matched on what somebody has been through, not on how senior they got. It was not asking that. It was comparing your values against a mentor's values a second time, under a different name, because the thing standing in for your transition was your list of values. So two of the four measures were the same measure, agreeing about what matters counted twice, and whether anyone had made the same move as you was never checked at all. Wanting more say over your week is a value. Going from one job to four clients is a move, and two people can make that same move wanting completely different things from it. They are now separate: eighteen recognised moves, read from your conversation the same way everything else in your map is, and picked from a list by mentors describing what they have already done. Nothing extra to fill in — it comes out of what you have already said.

  • Whether a mentor has made the move you are making is now actually measured, rather than standing in for a second look at your values
  • Eighteen recognised moves — one job to several engagements, a break and coming back, running it to governing it, and so on
  • Read from your conversation like the rest of your map, so there is no new form to fill in
  • It appears on your Experience Map, where you can correct it if we have read it wrong
  • Agreeing about what matters no longer quietly counts twice in the same calculation
v1.1.2

Four people to talk to, one of whom is wrong for you

The Connect screen has never had anybody in it, which meant the one part of the journey nobody could try was also the one part where a serious fault hid undetected for weeks. There are now four mentors on the platform to try it against. They are invented — made-up people with made-up histories, on email addresses ending .invalid, a reserved suffix that cannot resolve and cannot receive mail, so there is no chance of one of them being contacted or of an address turning out to belong to somebody real. One of the four is a deliberately poor fit. That is the interesting one: a set where everybody matches would look impressive and prove nothing, whereas somebody who is turned away shows the judgement is actually being exercised rather than everyone being waved through. As it happens two of the four come through, one is borderline and one is filtered out, which is about the shape you would want. Adding them also had to go in through the front door — the invite guard refused them at first, which was the guard doing exactly its job.

  • Four test mentors, so the Connect screen has something to show
  • One of them is deliberately a poor fit, to prove the threshold turns people away rather than waving everyone through
  • Invented people on a reserved .invalid domain that can never receive mail
  • A committed, repeatable script so the same four can be recreated on any environment
  • Six tests on the seed data itself, because a mistake there would show as silence rather than an error
v1.1.1

Labels, not database keys

With mentors finally being suggested, the suggestions arrived wearing their own internals: the little tags describing what a mentor has been through read "self-direction" and "saying-the-hard-thing", hyphens and all. Those are the names the system uses for those ideas internally, and they are not meant to be seen by anyone. Every other screen already translates them into ordinary English before showing them; this one had been passing them straight through, and nobody noticed until there was finally a mentor to display. Fixed, and there is now a test that renders the screen and fails if a raw internal name ever reaches it again — which is worth having, because this is the second time the same kind of thing has slipped out.

  • Fixed: mentor tags showed internal names like "self-direction" instead of plain English
  • A test now renders that screen and fails if an internal name ever appears on it
v1.1.0

Agreeing about something, in words that do not have to match

Values were free text everywhere — you described what mattered to you in your own words, an employer described what they stood for in theirs, and a mentor typed theirs into a box that said, encouragingly, "in your own words". Then we compared those words to each other. Two people who care about exactly the same thing almost never phrase it the same way, so the honest result of that comparison was nearly always nothing in common. On the role side that was merely useless: a floor underneath the calculation stopped it doing damage, and the values part of every match quietly contributed the same neutral figure for everyone. On the mentor side it was fatal, because there is no floor there by design — all four things have to be present — so a value of nothing meant no mentor could be suggested to anyone, ever, however many joined. There is now one shared list of about forty things people value at work, grouped into eight kinds. Your conversation is read onto it, job descriptions are read onto it, and mentors pick from it instead of typing. Your own phrasing is not lost; it stays in the quotes beside each reading, which is where every screen shows it back to you. The list is ours rather than a standard instrument, and it is informed by the research without being it — the same caveat the interests questions carry.

  • One shared vocabulary of work values, used when reading your conversation, a job description, and a mentor's profile
  • Mentor suggestions can now happen at all — previously no mentor could ever be suggested to anyone
  • The values part of a role match carries real signal instead of the same neutral number for everybody
  • Your Experience Map and the mentor form now offer the list to pick from rather than a blank box
  • Your own words are kept as the evidence beside each reading, and that is still what you see quoted
  • The list is written for this product rather than taken from a validated instrument, and we say so
v1.0.12

London is in the United Kingdom

If you said you could work in the United Kingdom, we were excluding every role in London. Also Bristol, also Exeter. The places you name are treated as hard lines rather than preferences — a role that breaks one is ruled out completely, not marked down — and underneath, that ruling out was done by comparing the words. Job descriptions almost always name a town. People almost always describe where they can work in whatever unit suits them, which is frequently a country. Those two are never the same word, so the answer was always no. What made it worse than an ordinary bug is which way it was wrong: you would have been shown the role in the ruled-out section, told it clashed with a line you had drawn, and had no way of knowing the line had been drawn wrongly. We now understand which places sit inside which. Naming a country reaches everything in it, naming a county reaches its towns, and the common ways of writing a place — UK, U.K., Britain, or a town with its county after it — all land in the right spot. Where we genuinely cannot place somewhere, the role comes through to you rather than being quietly dropped: a role you can dismiss yourself is a far smaller problem than one you never see.

  • Fixed: naming a country ruled out every role in it — "United Kingdom" was excluding London
  • Places now nest properly, so a county reaches its towns and a country reaches both
  • UK, U.K., Britain, USA and similar all resolve, as does "Exeter, Devon" or "Paris, France"
  • Somewhere we cannot place no longer causes an exclusion — the role reaches you and you decide
  • Roles genuinely outside everywhere you named are still ruled out, and still say so
  • 24 new tests covering the nesting, the spellings, and the deliberate refusal to guess
v1.0.11

Waiting for the listening to finish

The reading of your conversation happens quietly after each reply, so that a slow pass never leaves you waiting. The way that is arranged, the server is told to stay awake for however long the background job says it needs — and ours was not saying. It kicked the job off and immediately reported back that it had nothing to wait for, so the server shut down mid-sentence, every single time. Nothing was written and nothing was logged either, because the shutdown took the error reporting with it, which is why this looked like silence rather than a failure. What makes it a nasty one is that it only bites work that takes a while. Back when the reading was failing instantly for an unrelated reason, it finished before the shutdown and everything looked healthy. Fixing that earlier bug is what made this one start mattering — the job went from a second to half a minute, and half a minute is far longer than a server will sit around uninstructed. It now waits properly. There are also two new markers in our logs, one when a reading starts and one when it finishes, precisely because the way this failed was by saying nothing at all: a start with no finish is now something a person can go and find.

  • Fixed: the reading of your conversation was being cut off part-way through, every time, writing nothing
  • The server now waits for the reading to finish before shutting down, which is what it was always meant to do
  • Start and finish markers in the logs, so a pass that gets cut short is visible instead of silent
  • Two new tests, both of which fail against the old code — the previous test could not tell the difference, which is how this shipped
  • Your Experience Map should now fill in from the conversation on its own
v1.0.10

Your organisation's name, kept

With job descriptions finally readable, one got published all the way through for the first time — and came out under the wrong company. The paste screen asks for your organisation's name, and then the save quietly ignored it, filing the role under whichever organisation your account happened to have created first. The intention behind that was reasonable: there is no organisation picker on the paste screen yet, and nobody wanted a duplicate company appearing every time the same person pasted a description. But the effect was that a name typed into a box was read, discarded, and replaced with a different one — and on an account that had set up the sample roles, the replacement carried their name and their "starter role" label. A candidate would have been shown an employer that was not the employer. Roles are now matched to the organisation of the name you gave, and one is created under that name when there is not one already. Duplicates are still avoided; the difference is that the thing being matched on is what you actually typed.

  • Fixed: a published role was filed under the wrong organisation, ignoring the name entered on the paste screen
  • Roles now attach to the organisation of the name you gave, and a new one is created under that name if needed
  • Repeated pastes under the same name still reuse the same organisation rather than piling up duplicates
  • The one role already affected has been corrected
  • Three new tests, including one that fails if the name is ever dropped from the lookup again
v1.0.9

Reading a description in two passes, because one was too much to ask

The previous release was a confident fix for the wrong cause, and it changed nothing. Rather than guess a third time we asked the system directly which shapes it would accept, and the answer was narrower and duller than either theory: there is a ceiling on how much can be asked for in one go, and it sits at nine things. We were asking for twelve. Not twelve complicated things, and nothing to do with how they were described or whether they were compulsory — simply twelve. Grouping them made no difference either; the ceiling applies to the whole request, not to how tidily it is arranged. So a description is now read twice: once for what the work actually is, and once for the terms it is offered on. Both halves are well under the ceiling with room to grow, the split follows how a person would read the document anyway, and each half retries on its own rather than dragging a perfectly good reading back through the process because the other half stumbled. It is worth being straight that two earlier explanations for this were published here and both were wrong. Neither was checked against the real thing before being written up, which is the actual lesson.

  • Job descriptions can now be pasted in, read, and turned into a role — the first time that has ever worked
  • A description is read in two passes: what the work is, then the terms it is offered on
  • Each pass retries independently, so one awkward half no longer costs you the other
  • If either pass fails the whole reading fails, because half a reading looks exactly like a description that left things out
  • The limit was measured against the live system rather than reasoned about, and what we found is written down where the next person will trip over it
v1.0.8

The employer side could never read a single word

Pasting in a job description failed. Not sometimes — always, since the day the feature shipped, which is why the handful of roles on the platform were put there by hand rather than through the screen built for it. The cause is a good illustration of how a sensible decision becomes a bug. Twelve of the things we try to read out of a description were marked as optional, because most descriptions do not mention most of them and that seemed the honest way to say so. But when we ask the model for a structured answer, the shape of that answer is compiled into a set of rules first, and every optional item doubles the number of shapes those rules have to allow for. Twelve of them is over four thousand, and the compiler refused the job outright. Nothing was too long or too complicated — the description of the answer is only a few kilobytes; there were simply too many maybes. So absence is now stated rather than implied: every field comes back every time, and the ones the description does not cover come back explicitly empty. That is one rule per field instead of two multiplied together, and it is the better arrangement regardless — a field left silently unmentioned is indistinguishable from one we failed to read, whereas an explicit nothing is a real answer we can show you.

  • Fixed: pasting a job description failed every time, so no role could ever be created through the app
  • Every field the reader looks for now comes back on every reading, with the ones your description does not cover marked explicitly empty
  • The reader is told to say empty rather than stay silent, so a gap in your description and a gap in our reading are no longer the same thing
  • Two new tests fail if any field ever goes back to being optional, which is the exact change that broke it
  • No change to what we read or how we read it — only to how the answer is shaped
v1.0.7

Agreeing with us now counts for something

The Experience Map has a section for the readings we were not confident about, and a button next to each one saying that sounds right. Confirming them is supposed to be what opens up your matches, because a reading you have personally agreed with is worth more than one we guessed at — that rule was already written down and already being applied. What was missing is that nothing ever went back and checked. Your map's readiness was only ever recalculated while you were mid-conversation, so you could work down the review screen, agree with every single reading, and still be told your map was not finished, with no explanation and no way forward except returning to the conversation to say something else. Which is an odd thing to ask of someone whose only crime was agreeing with you. Readiness is now recalculated the moment you confirm anything, so the last tick on that screen is the thing that opens your matches — as it was always meant to be. A map you have already signed off is left alone, because that is a decision you have made and not ours to revisit.

  • Confirming a reading now rechecks whether your map is ready, instead of leaving it until your next message
  • Agreeing with every uncertain reading is now enough to unlock your matches on its own
  • A map you have already approved is never quietly reopened by this
  • If the recheck fails, your confirmation is still saved and reported as saved — and the next one puts it right
  • Four new tests, and the readiness rule now lives in exactly one place rather than two that could drift apart
v1.0.6

And the same fault, one screen further on

Having found the Success Formula could not save, the obvious next question was whether anything else was written the same way. It was: the Life Fit Plan, the screen where you set your hours, your income floor, where you will travel and what you will not do. Identical fault, identical cause, and it had never saved for anyone either. Worth saying plainly that this is the more consequential of the two. The Life Fit Plan is not a description, it is a set of limits, and the matching treats them as absolute — a role that breaks one of them is ruled out completely rather than marked down. A plan that silently failed to save is therefore not a missing feature, it is limits that were never applied, which is precisely the failure this product exists to avoid. Both screens are fixed the same way, and we went looking through every other save in the app for the same shape rather than waiting to trip over it a third time. The remaining ones were already written correctly.

  • Fixed: the Life Fit Plan never saved, failing the same way and for the same reason as the Success Formula
  • Audited every other save in the app for the same fault — the rest were already correct
  • Seven new tests on the Life Fit write, including one that fails if the owner stamp ever appears in an update
  • Your limits are only meaningful if they are stored, so this one mattered more than the screen before it
v1.0.5

The Success Formula could not be saved, for a good reason

Same walkthrough, next screen, next thing that had never worked. Asking for a draft Success Formula came back with a polite apology and nothing saved — every time, for everyone, since the screen shipped. Underneath it was a small collision between two sensible decisions. Your formula row is stamped with who it belongs to, and that owner stamp is deliberately one of the few things the app is forbidden from rewriting after the fact, because anything that can quietly change who owns a row can quietly hand your work to somebody else. Separately, the save was written as a save-or-create-in-one-go, and that shorthand asks the database for permission to rewrite every column it was handed — including the owner stamp. The database checks what a request could touch before it runs rather than waiting to see what it actually touches, so it refused the whole thing on the spot, first attempt included. The save is now written out longhand: change the drafts if a row is already there, create one if it is not, and only ever set the owner at the moment of creation. The protection stays exactly as strict as it was; we simply stopped asking for a permission we never wanted.

  • Fixed: drafting a Success Formula failed every time with nothing saved
  • Saving is now an update-or-create rather than a combined save, so the owner stamp is only ever written when the row is first created
  • The rule that stops the owner being rewritten later is untouched — the fix removes a request for that permission, it does not grant it
  • Two requests arriving at once no longer produce an error; the second recognises the first and carries on
  • Six new tests covering the write shape, including one that fails if the owner stamp ever appears in an update again
v1.0.4

The listening was never being written down

Someone walked the whole thing end to end for the first time, which is exactly the sort of thing that finds what tests cannot. Nine questions in, after a genuinely good conversation, the Experience Map was still completely empty — and it would have stayed empty for anyone, forever. The reading happens quietly in the background after each reply so that a slow or failing pass can never interrupt the conversation, and that protection worked precisely as designed: it caught the failure every single time and said nothing. What was actually wrong was small and stupid. Each time we finished replying, we handed the reading step the conversation with our own reply on the end, and the model will not accept a conversation that finishes with its own voice — it wants the last word to be yours, which, given what this product claims to be about, is a rather pointed thing to have got wrong. So it refused, twice, and the map stayed blank. Now we hand over the conversation up to and including what you last said, which is the only part that carries new information about you anyway. Everything you have already typed is still on file and gets read the next time you send a message, so nothing you said was wasted — it just had not been listened to yet.

  • Fixed: the Experience Map never filled in, because every background reading pass was being rejected before it started
  • The reading step is now given the conversation up to your most recent message, never trailing off on our own reply
  • Earlier parts of the conversation are untouched, so a short answer is still read against the question that prompted it
  • Five new tests pin the shape of what gets sent, four of which fail against the old code — the previous tests all passed because they stood in for the model rather than calling it
  • Nothing you had already said was lost; it is read on your next message
v1.0.3

Nothing you can see, and that is the point

Every so often a release changes nothing at all for the person using the site, and this is one of them. It exists because the project could be picked up on a second machine, and setting it up there turned out to be quietly broken. There were two files describing which settings the project needs, written months apart, and they had drifted apart without anyone noticing — the instructions pointed at the older one, which was missing a setting the site needs in order to send a sign-in link. Anyone starting fresh would have installed everything, watched it build perfectly, and then hit a wall the first time they tried to sign in, with nothing obvious to blame. There is one file now, it lists everything, and it says which parts are genuinely required rather than leaving you to find out. Recording it here rather than fixing it silently, because a setup step that only breaks for the next person is exactly the kind of thing that goes unwritten and then costs somebody an afternoon.

  • One environment template instead of two that disagreed with each other
  • The setup instructions now point at the file that is actually complete
  • Each setting is marked as required or optional, so a missing one is found before it fails rather than after
  • Handover notes rewritten for picking the project up on another machine from a clean clone
  • No change to the site itself — same screens, same behaviour, same matching
v1.0.2

Thirty questions about what you actually enjoy

Finding people worth talking to depends partly on what kind of work pulls you in, and until now there was no way to tell us. There is one now: thirty short statements, five options each, one screen. For every one, how much would you enjoy doing it — deliberately setting aside whether you are any good at it, and whether anyone would pay you for it. That separation is the entire point. This audience has spent years being matched to what they are demonstrably good at, which is exactly how people end up excellent at something they have quietly stopped enjoying. Being straight about one thing: these questions were written for Third Career. They follow a well-established way of describing work interests, but they are not lifted from a standardised test, no published norms apply to them, and the screen says so rather than borrowing authority the questions have not earned. Swapping in a properly validated public-domain set is on the list, and every stored answer is stamped with which questions it answered so the two never get quietly averaged together. You can stop halfway and come back — an unanswered area is recorded as "we do not know", never as "no interest", which are very different things and one of them would skew who you get introduced to.

  • An interests questionnaire at /candidate/interests — thirty statements, five-point scale, saves partly finished
  • Every statement is about an activity you might enjoy, never one you might be good at, and a test fails the build if ability language creeps in
  • Your answers are stored alongside the result, so a better scoring rule later can rework what you actually said rather than a number derived under old rules
  • Scoring happens on the server, because a result the browser could write is a result anyone could choose
  • An area you skipped is scored as unknown rather than as zero interest — zero is an answer, blank is not
  • Come back any time; it loads what you already said rather than starting over
  • Linked from the mentor suggestions page, where the nudge to do it already lived
  • 16 new tests, including one that caught a real bug: any unrecognised answer id starting with the right letter was being silently counted towards that interest type
v1.0.1

Mentors can now actually sign up

The mentor half of Connect shipped last release with everything except the front door: the matching worked, the screens worked, the copy was written, and there was no way for a mentor to put themselves forward. There is now. It asks four things — what matters to you, which transitions you have made yourself, what you have the appetite to offer, and roughly how many hours a month — plus six sliders about the kind of work that pulls you in. What it never asks is how senior you got, what your title was, where you worked, or how long you have been at it. That is not an oversight to fix later: the form is the selection mechanism, and one that opened with "most recent job title" would quietly select for exactly the kind of mentor this is built to stop privileging. Saving and making yourself available are separate buttons, because filling a form in over two sittings should not put you in front of strangers halfway through. Building it also turned up a genuinely nasty bug in the matching underneath. Whether two people are near enough to understand each other and different enough to be useful is worked out from those six interest sliders — and someone who has not answered them has no profile at all. Treating that absence as "no interests whatsoever" made two such people look identical, identical scores nothing on that measure by design, and because the four parts multiply, nothing on one part is nothing overall. The result would have been a mentor section that suggested nobody to anybody, for as long as it took someone to notice. It now recognises the difference between a low answer and no answer, stands in something neutral, and marks that it did so — so the screen never tells you two people's interests line up when nobody ever asked either of them.

  • A mentor signup at /mentor: values, transitions you have navigated, what you can offer, capacity, and the six interest sliders
  • Nothing on the form asks for seniority, job title, employer or length of service, and a test fails the build if any of those words appear on it
  • Save and make-yourself-available are separate actions; availability is confirmed server-side rather than asserted by a half-finished form
  • Fixed: an unanswered interests questionnaire was treated as "no interests at all", which would have stopped any mentor ever being suggested to anyone. Absent and zero are now different things
  • A substituted value is flagged as substituted, so no screen claims two people's interests line up when neither was asked
  • The five starter roles are live, so there is finally something to match against
  • 12 new tests, including one that fails if a visible number appears anywhere on the mentor form
v1.0.0

All four phases, and a number you can argue with

This is the whole journey working end to end. You talk, we build a map of what you bring and what you want, roles get read against it, and you see the result — with every part of the reasoning shown. That last bit is the release. It would have been far easier to show a percentage and leave it there, and we have all seen what that looks like: a number appears, you have no idea where it came from, and there is nothing to say back to it. So instead each role comes with the reasoning laid out — what the work asks for against what you bring, how much say you would have, the team around it, what the organisation says it stands for, the kind of thinking it wants, and the practical terms. If part of that reads wrong to you, there is a box to say so, and what you write is kept beside the reading permanently. It changes no number, and we say that plainly rather than pretending to recalculate: a score that moved whenever somebody objected would stop being a measurement and become a haggle. Roles you have ruled out yourself appear too, in their own section, described as clashing with a line you drew rather than buried at the bottom of a list — because they are not worse matches, they are ones you already said were impossible, and there is a large difference between the two. Also arriving: mentors, matched on transitions they have actually made rather than how senior they got, and deliberately never ranked. And the beginning of a record of what people who have worked with you have said, in their words, which belongs to you and stays yours if you leave.

  • Roles read against your map and the terms you set, each with all six parts of the reasoning shown
  • The part holding a match back is named, because the maths multiplies rather than adds — knowing a role fell down on how much say you'd have, rather than on your capability, is worth knowing
  • An Outcome Report for every role, set against your own Success Formula in the words you approved
  • Disagree with any part of a reading and it is recorded permanently beside it. It changes no score, and the screen says so rather than implying otherwise
  • Roles ruled out by your own non-negotiables get their own section, framed as a line you drew and can move — not as a rejection
  • No percentage, position or comparison with anybody else appears anywhere on these screens, and a test enforces it
  • Mentors, matched on the transitions they have navigated rather than the seniority they reached — and never ranked, rated or ordered. There is no rating column in the database to put one in
  • A mentoring match needs all four of values, interests, what they offer and shared experience to be present; strength in one cannot buy its way past absence in another
  • The beginning of your reputation record — what colleagues said, in their words, kept as they wrote it, marked honestly when we have not been able to verify it yet
  • Every one of the four phases on your dashboard is now somewhere you can actually go
  • 57 new tests, including one that fails the build if a digit ever appears in the mentor copy
v0.10.1

Two words for the same thing

Matching compares what someone can do against what a role asks for, and until now it did that by comparing the names of those capabilities as plain text. Which works beautifully right up until one side says "stakeholder management" and the other says "stakeholder leadership" — at which point the system concluded, with total confidence, that these two people had absolutely nothing in common. Not a weaker match. Nothing. And because the scoring multiplies rather than adds, that single disagreement about wording took the entire match to zero, no matter how well everything else lined up. Both sides of every match get their wording written by a language model reading free-flowing prose, and two separate readings simply do not land on the same phrasing by luck. We found it while writing the starter roles: the first draft scored zero on four roles out of five for both of our test candidates, purely because the roles and the candidates had been described in different words. There is now a fixed vocabulary of fifty capabilities that both sides choose from, so the comparison is between the same things rather than between two people's phrasing. Capabilities are also grouped into families, so a role wanting process design and a person offering operational leadership get partial credit rather than nothing — related is not the same as identical, but it is a very long way from unrelated. And because every capability now has a name we chose, we can actually tell you which ones matched, which is the difference between a score and an explanation.

  • A fixed vocabulary of 50 capabilities, grouped into 8 families, used by both the reading of your conversation and the reading of a job description
  • Near-misses within a family now score partial credit instead of zero — an exact match still beats a neighbour, and a neighbour still beats something unrelated
  • Every capability has a plain-language name, so it can be shown and explained rather than only counted
  • The capability picker on the role review screen is now a list to choose from rather than a free text box, because a typed name would have quietly matched nothing while looking perfectly fine
  • Corrections are checked against the vocabulary too, so an edit cannot reintroduce a name nothing else recognises
  • We chose a fixed vocabulary over the more fashionable option of comparing meaning mathematically, because the second cannot tell you WHY two things matched — and explaining the why is rather the point of this platform
  • Vectors recorded before this change keep their old behaviour exactly, so nothing shifted underneath anyone
  • 38 new tests, including checks that both readers are given the identical list and that a capability compared against itself still scores a perfect 1
v0.10.0

The two things your job ad never says

This release is the other half of the platform: the side where an organisation describes a role. You paste in the job description you already have, and we read it back to you — what it asks for, how demanding it is, what it pays, how the work is shaped — with the sentence each reading came from sitting underneath it, so nothing arrives as an assertion you have to take on trust. Then comes the part this whole release exists for. Two qualities of a role predict whether someone will thrive in it better than anything else we can measure: how much genuine say a person has in how the work gets done, and what the team around them is actually like. No job description on earth mentions either. Not yours, not anybody's — there is no advert in existence that says whether managers explain their reasoning or acknowledge when a task is tedious. So rather than quietly guessing and producing a confident-looking number resting on nothing, we ask. Four questions, in plain English, about how the work really runs. The refusal to guess is built into the shape of the thing rather than written down as a rule someone might forget: the structure the reader fills in has no room for those values at all, so even a badly behaved model cannot invent one. Every number then carries a label saying where it came from — read from your description, told to us in the conversation, or set by you — and those three stay visibly different everywhere they appear, because the moment a guess starts looking like evidence the whole exercise is theatre. Also here: five starter roles, so the first person to finish their Experience Map has something real to be matched against rather than an empty page and an apology.

  • Paste a job description and get it read back to you, each reading captioned with the sentence it came from
  • A Motivating Potential Score for the role's design, with the factor holding it down named — but only when one genuinely is, because every set of five numbers has a smallest member and pointing at it regardless is just nagging
  • A four-question conversation covering what no description contains: how much say someone has, whether the reasoning behind decisions gets shared, whether the dull parts get named as dull, and how much the team genuinely works as one
  • Those four values can only come from that conversation — the reader that processes your description has no field capable of holding them, so they cannot be inferred, defaulted or quietly filled in
  • Every field editable, with its origin shown: read from your description, from what you told us, or set by you
  • Publishing checks the reading is complete in the database itself, not just in the browser — so a role cannot reach a candidate half-answered no matter which route wrote it
  • Five starter roles spanning advisory, non-executive, fractional and consultancy work, from 8 to 30 hours, including one charity role that pays least and means most
  • The old prototype matching engine is gone, along with the "I'm hiring" button that led to it. It had no tests behind it and it was linked from the front page, which meant a visitor could reach scores from a model nobody had checked
  • Worth being straight about one limit: matching currently compares capability names as exact text, so the starter roles are written using vocabulary the system already knows. Real descriptions and real conversations will not line up that neatly, and making them do so is the next piece of work
  • 181 new tests (345 to 526), including checks that every client screen renders as intended and a run against the real database confirming an incomplete role is refused publication
v0.9.0

Some things are easier said than typed

The Discover conversation now has a Type/Speak toggle, and voice means voice: questions read aloud in a warm, unhurried voice, answers given out loud, hands free. There was a microphone here once — it lived on the original prototype and got left behind when the conversation was rebuilt back in the summer, along with a small file of type definitions that has been sitting in the repo doing nothing ever since. That file is gone now, because the way back in is a different one. Rather than lean on the browser's own speech features, which are free but send your audio to Google, don't exist at all in Firefox, and read text aloud in whatever voice your operating system happens to own, this goes through proper voice models on the server. Which brings a genuine trade worth naming: it costs real money per minute, so both endpoints check you're signed in before they'll spend a penny. The part we went back and forth on is what happens after you stop speaking. Fully hands-free means sending whatever the transcription heard, and transcription mishears — which would be a shame in a chat window and considerably worse here, where this conversation is the raw material for your entire Experience Map. So a spoken answer lands in the box, visibly, and sends itself after five seconds. Say nothing and it goes. Touch it and it waits.

  • Type/Speak toggle on the Discover conversation, switchable mid-conversation without losing your place — flipping to Speak reads out wherever you'd got to, not the opening question
  • Spoken answers transcribed via gpt-transcribe; replies read aloud via gpt-4o-mini-tts, directed to sound warm and unhurried rather than brisk or salesy
  • Transcribed answers land in the composer and auto-send after a visible five-second countdown that any keystroke cancels — hands-free by default, correctable by anyone who glances down
  • Recording adapts to the browser's own container: WebM/Opus on Chrome and Firefox, MP4/AAC on Safari, so iPhones and iPads are first-class rather than an afterthought
  • The microphone is released the moment a recording ends, so the browser's recording indicator goes out when it should
  • Both voice endpoints require a signed-in session and cap their input size, because every call spends money
  • Voice mode says plainly, on screen, that recordings travel to a transcription provider and aren't kept
  • A blocked microphone, a browser without recording, a silent take or a failed transcription each say so and leave typing working — no dead ends
  • Removed src/types/speech.d.ts, orphaned since the Slice 3 rewrite and referenced by nothing
  • 8 new tests covering the cross-browser seam — the bit that would otherwise break on iPhones and iPads while looking perfectly healthy on a Mac in Chrome — plus the controlling-language guard, which now covers all the new voice copy
v0.8.1

The invite that only worked for one person

Sign-in links were being built from whichever address bar the sender happened to be looking at, which meant an invite could go out pointing at a development server running on one laptop — reachable by exactly one person, and nobody else on the team. The link is now built from a single configured address for the deployment, so it points at the same place no matter who sends it or from where. Worth naming the part that made this hard to spot: when a return address isn't on the approved list, the email service doesn't refuse it or warn anyone — it quietly substitutes a different one and sends the email anyway. Everything looks like it worked. The email arrives, the link is real, and it simply goes somewhere useless. The approved list is a setting rather than code, so the fix is only complete once it's updated to match — and there's now a note in the code saying so, where the next person will actually see it.

  • Sign-in links are built from a configured address for the deployment rather than from the sender's current browser location
  • Added a .env.example covering every setting the app needs, so the project can be set up on a new machine without guesswork
  • Documented, at the point it matters in the code, that the email service silently falls back to a different return address when the one requested isn't on its approved list
  • Nigel and Graeme added to the pilot invite list
v0.8.0

One draft is a verdict. Two is a choice.

Slice 3 is done, and there's now a genuine front door: sign in, and Third Career opens on the life you want, not your CV — the first message in the conversation is yours, never a scripted line put in your mouth. That conversation turns into a structured Experience Map, but not a black box one: every field Claude infers carries the actual quote it drew from, and every field is yours to correct, not just confirm, including the one about how you tend to approach problems. From there, a Success Formula — one sentence for what a genuinely good working life looks like — arrives as two honestly different drafts, not one to accept or reject. That's deliberate: a single draft asks you to agree with a verdict, and two asks you to actually choose. Sitting alongside it, a Life Fit Plan turns hours, income, geography and the patterns you're ruling out entirely into hard gates, set knowingly rather than discovered as a surprise later. A new dashboard now ties all of it together — four phases, real progress read from your own data, nothing locked behind anything else. What none of this does yet, and it matters to say so plainly: produce a match. The scoring engine from Slice 2 is real, tested, and sitting right there — but nothing on this dashboard is connected to a single opportunity. That wiring is Slice 5. Everything shipped here is about being understood accurately and being able to correct that understanding; it doesn't act on it yet.

  • Discover conversation: opens on the life a candidate wants, waits for their first message rather than sending a scripted one, and persists every turn to chat_sessions/chat_messages
  • Extraction pipeline: Claude reads the conversation and proposes the seven Experience Map fields (capabilities, competence level, developmental stage, values, motivation, causality orientation, needs) — TypeScript still does the scoring, Claude only reads
  • Every extracted field carries the verbatim quote(s) it was drawn from, stored as evidence and shown alongside the field, not just a confidence number
  • Experience Map review screen: uncertain fields surfaced first, and every field — including the developmental reading — is directly editable, not just something to rubber-stamp
  • Success Formula screen: Claude drafts two genuinely different starting points from the Experience Map rather than one to accept; the candidate picks, rewrites freely, and approves in their own words, with approval timestamped server-side
  • Life Fit Plan screen: hours ceiling, income floor, geography, remote requirement and excluded work patterns (nights, weekends, on-call, shift rotation) set as hard gates the engine will honour once matching exists
  • An original, unpublished purpose check-in for the candidate's own reflection — feeds a future Outcome Report, deliberately kept out of the matching engine entirely
  • New Transition dashboard (src/app/candidate/page.tsx): all four phases in one place, "you are here" derived from real Supabase state, and every phase reachable regardless of how far along the others are — jumping ahead is explained, never blocked
  • 320 tests passing, up from 303 — engine remains fully dependency-free, still checked by the automated purity scan
  • Still nothing that produces a match: the engine is real and tested, but it isn't wired to a single opportunity yet
v0.7.0

The maths doesn't do participation trophies

Two fictional people just proved the matching model works the way it's supposed to. Bob is a burnt-out COO who wants a fractional role with real autonomy and a hard 20-hour ceiling; Sarah left a senior marketing career twelve years ago to raise her family and keeps getting steered toward admin jobs that ignore everything she's done since. Both were documented outcomes in an early planning document, long before any of this existed as code. We wrote them up as test data and ran them through the engine, and both came out on top of their respective shortlists — without touching a single tuning constant to make it happen. Nothing on the live site actually uses any of this yet: there's still no button anywhere that runs a match. What this release actually proves is narrower and, we think, more interesting — the reason the model multiplies its five fit terms together instead of averaging them. A candidate who's a flawless skills match for a job with a controlling, autonomy-crushing culture is not 'pretty good on balance'. Averaging would let the great CV paper over the bad culture; multiplying refuses to. That was a claim in a spec document until now. It's arithmetic, with a test that fails loudly if anyone quietly waters it down.

  • Bob and Sarah persona golden-file tests, encoding the two documented outcomes from the candidate journey map as executable tests against the matching engine
  • Each persona checked against its documented target role plus three distractor roles: full-time/high-intensity, under-challenging, and a controlling-autonomy climate
  • Confirms both personas rank their documented target role first, and that a full-time role blows past an hours ceiling is filtered out entirely rather than merely scored low
  • Confirms Sarah's non-corporate experience (household, school-board and community budgets) produces a strong competence match against a Marketing Director role — capability built outside formal employment counts
  • New structural test proves the candidate data model has no field capable of encoding employment recency, career gaps, or time since a role — Sarah's twelve-year gap has no channel through which it could reach the engine, not just no reason to
  • 110 tests passing, up from 96 — engine remains fully dependency-free, checked by an automated purity scan
v0.6.0

Everyone gets their own key

For months, getting into this app meant everyone typing the same four digits into the same box. Fine for keeping strangers out, not much of a foundation for anything real. This release swaps the shared PIN for actual accounts: each person signs in with a magic link sent to an email address on a genuine invite list, checked by the database itself rather than trusted to app logic. The PIN gate stays on as an outer layer for now, but everyone inside it is now themselves, not just 'whoever knows the PIN'. Alongside that: the body text finally uses the real brand typeface instead of a stand-in, and two automated checks now sit in the build — one that catches controlling language before it reaches a screen or a prompt, one that keeps a person's account changes to their own account and nobody else's.

  • Real individual accounts via magic-link sign-in, replacing the shared four-digit PIN as the way in
  • PIN gate retained as an outer layer in front of sign-in
  • Sign-in restricted to an invite list enforced by the database, not just app logic
  • The sign-in form responds identically whether or not an email is on the invite list, so it cannot be used to check who has an account
  • New Supabase project (Postgres + Auth + Row Level Security) hosted in London, with browser and server clients wired in
  • Database rules limit each signed-in person to viewing and changing only their own details
  • Body text switched to Nata Sans, the correct brand typeface, in place of the earlier stand-in
  • Vitest and Playwright test infrastructure added, running automatically ahead of every change
  • A new automated check scans every screen and every AI prompt for controlling language and stops the build if it finds any
  • Routing middleware migrated to Next.js 16's proxy.ts convention

Jun 2026

9 releases
v0.5.1

No more ghost square

A small white square was haunting the chat input bar. Turned out to be the textarea's scrollbar thumb refusing to blend in. It has been banished.

  • Hidden scrollbar on chat textarea (was rendering as a visible white square)
  • Logo added to site header on all authenticated pages
  • Middleware updated to let SVG assets through without PIN redirect
v0.5.0

Glow up

The entire app has been reskinned to match the real brand. Dark forest green background, cream text, orange CTAs, light teal accents — the design system that dev.thirdcareer.co.uk has been using all along, finally applied properly. Anek Tamil headings, DM Sans body text. We look like ourselves now.

  • New brand palette: #002C2D background, #EF8C29 primary, #71D3CC accent, #f7eed2 cream
  • Anek Tamil (weight 300) for all headings, DM Sans for body
  • All Tailwind teal-xxx and cream-xxx classes replaced with exact brand hex values
  • Pill-shaped buttons throughout (rounded-full)
  • Cards use rounded-3xl, inputs rounded-xl
  • Footer, PIN page, onboarding, results, share, employer, changelog all reskinned
v0.4.2

Stop calling people Anonymous

The AI now politely asks for your name early in the conversation — because 'Anonymous's Next Chapter Opportunities' is, frankly, not the warm welcome anyone deserves.

  • Results page falls back to 'Your Next Chapter Opportunities' if no name captured
  • Conversation prompt now asks for first name within the first couple of exchanges
v0.4.1

Secret knock

Added a 4-digit PIN gate so the site isn't just open to the entire internet while we're still building it. The pin is not 1234.

  • PIN entry screen with auto-submit on 4th digit
  • 30-day auth cookie — enter once, forgotten about
  • Middleware-enforced: can't sneak past it via direct URL
v0.4.0

Freedom from the database

Spent an embarrassing amount of time debugging a production error caused by the app needing a database that didn't exist yet. Solution: stop needing a database.

  • Conversation history now lives in the browser — no server-side session storage
  • Profile persisted to localStorage on every exchange
  • Results page falls back to localStorage if DB unavailable
  • DB writes are best-effort — errors logged but don't break anything
  • Employer dashboard with full opportunity DNA builder
  • Shareable career design profile pages (/share/[userId])
  • 'I'm hiring' CTA on landing page
v0.3.3

Next.js ate my API key

Turbopack, it turns out, doesn't inject .env.local into runtime process.env. It just... doesn't. This is a known quirk we discovered the hard way.

  • fs-based fallback to read API key directly from .env.local at runtime
  • Works locally. Always worked on Vercel. Now both work.
v0.3.2

Neo4j, we need to talk

Swapped the graph database for a dual-adapter storage layer. Locally: a JSON file. On Vercel: KV. The Experience Graph dream lives on, in spirit.

  • File-store adapter for local development
  • Vercel KV adapter for production
  • Zero code changes needed when switching between them
v0.3.1

Sliders, radars, and portfolio math

The profile sidebar got a serious upgrade. Also added logic to find two roles that stack nicely within your available hours — because one part-time advisory gig is fine, but two is a portfolio career.

  • Interactive sliders for editing profile dimensions
  • Radar visualisation for work preferences
  • Portfolio combination suggestions on results page
v0.3.0

Career design, not job hunting

Realigned the entire product language with the actual vision: this is career design for experienced professionals, not a job board with a chatbot bolted on.

  • All copy shifted to 'career design' and 'next chapter' framing
  • Expanded data model: leadership domains, sector knowledge, contribution potential, career chapters
  • Opportunity DNA enriched with behavioural fit, leadership requirements, contribution modes

May 2026

8 releases
v0.2.5

Sticky header, less chaotic mic

The progress bar now stays visible while you scroll. The mic no longer has an existential crisis when you press Send.

  • Progress header is sticky — stays on screen during long conversations
  • Send button and Enter key properly stop speech recognition before clearing the input
  • Fixed race condition where the mic would repopulate the field after sending
v0.2.4

Mic stops when you send

Previously, hitting Send while the mic was active would clear the box — then immediately refill it from the speech buffer. Now it stops.

  • Stop mic before clearing input on send
v0.2.3

Textarea that grows up

The text input now expands as you speak. Your words no longer disappear into a tiny fixed box like they're being quietly filed away.

  • Auto-expanding textarea up to 150px, then scrolls
v0.2.2

Speech-to-text that actually works

The mic now stays on until you stop it, and doesn't wipe what you'd already typed. Wild concept.

  • Continuous listening mode
  • Appends transcription to existing text rather than replacing it
  • Properly separates final vs interim results
v0.2.1

Progress bar

Added a segmented progress bar so you can see which parts of your Experience Map have been filled in. Eight sections, each lights up as the conversation covers it.

  • 8-section progress bar: Name, Life Goals, Values, Energy, Needs, Ideal Week, Skills, Constraints
v0.2.0

Speak your career design

Added a microphone button so you can talk instead of type. Because sometimes you just want to think out loud.

  • Microphone button using Web Speech API (browser-native, no extra cost)
  • Pulses red while listening
  • Fixed chat input being hidden behind the version footer
v0.1.6

Stop putting words in people's mouths

The app was sending a fake first message on behalf of the user. Removed. You type the first thing, not us.

  • Onboarding now waits for the user to send the first message
v0.1.0

It exists

The first working build: a conversational onboarding flow powered by Claude, a matching engine with weighted scoring, and a results page. Rough around the edges. Alive.

  • Conversational onboarding via Claude API
  • Experience Graph data model
  • Matching engine: 50% Outcome Alignment / 20% Values / 15% Energy / 10% Environment / 5% Constraints
  • Results page with ranked opportunity cards
  • 5 seed opportunities in the graph

Built by humans. Typed by Claude.