Privacy
What the AI sees of you, and what it never sees
tailorr writes your application by sending your profile to an AI model, with part of it withheld. This page is the account of which part, how the line is drawn, and where it does not hold.
The AI never sees
- your name
- your email address
- your phone number
- your LinkedIn address
- your GitHub address
- the name of any organisation in your profile
- the name of any project in your profile
- the web address of any project in your profile
The AI does see
Everything else — your skills, what you actually built, what came of it, your dates, your qualifications, and the job listing you paste in.
The same profile, twice
The profile below is invented for this page — though the employer and the school are real ones, because an example built on names nobody has heard of would not show you much. First the record as we hold it, then the profile as the model receives it, printed by the same function that prepares one on a real run. Values marked withheld are the ones the boundary is drawn around.
The record, as we hold it
Profile
- Name
- Sam Whitfield withheld
- Email address
- sam.whitfield@example.com withheld
- Phone number
- +44 7700 900312 withheld
- LinkedIn address
- https://www.linkedin.com/in/example-sam-whitfield withheld
- GitHub address
- https://github.com/example-sam-whitfield withheld
Organisations
- Employer
- BBC withheld · media and publishing
- School
- University of Leeds withheld
Role
- Title
- Senior Software Engineer
- Employer
- BBC withheld
- Dates
- 2021-04 – present
- Bullet
- Rebuilt the playback layer behind iPlayer, cutting cold-start time on smart TVs and games consoles
- Bullet
- Led the migration of the media catalogue onto a new metadata store, with a rollback path at every step
Project
- Name
- Tideline withheld
- Web address
- https://tideline.example withheld
- Dates
- 2020-02 – 2021-01
- Description
- A tide-times app for the north-east coast, with an offline-first sync layer
Education
- Qualification
- BSc Computer Science
- School
- University of Leeds withheld
- Classification
- First Class Honours
- Dates
- 2016-09 – 2019-06
Skill group
- Languages
- TypeScript, Go, Python
Fact
- Body
- No experience with native mobile development — the app work has been web only
Your profile, as the model receives it
# Profile
Every line below ends with a short label in square brackets — a letter for
the kind of row, then a number, written r1 or b7. Those labels are the only
citable things in this document. Copy one exactly as it appears, including
its letter: the letter and the number both have to match the line you took
it from, and no two lines share a number.
Two markers can open a line, and neither of them means the line is untrue:
- `(only if the listing asks)` — real, renderable content, to be used only
when the listing calls for it.
- `(never printed)` — never reproduce this line, or any phrase from it, in
generated content. It is still true, and you are meant to read it: a line
recording what the candidate has *not* done is why a requirement can be
rated `none` without asking the candidate about it a second time.
An unmarked line is ordinary resume content.
## Organisations — context for reasoning
Never reproduce this section, or any phrase from it, in generated content.
It describes values you cannot see.
- {{company_1}}: media and publishing
- {{school_1}}: (no attributes)
## Experience
### Senior Software Engineer — {{company_1}} [r1]
- Dates: 2021-04 - present
- Rebuilt the playback layer behind iPlayer, cutting cold-start time on smart TVs and games consoles [b2]
- Led the migration of the media catalogue onto a new metadata store, with a rollback path at every step [b3]
## Projects
### {{project_1}} [p4]
- Dates: 2020-02 - 2021-01
- A tide-times app for the north-east coast, with an offline-first sync layer
## Education
### BSc Computer Science — {{school_1}} [e5]
- Dates: 2016-09 - 2019-06
- Classification: First Class Honours
## Skills
### Languages [s6]
- TypeScript, Go, Python
## Profile-level facts
- (never printed) No experience with native mobile development — the app work has been web only [f7]
Some of the marked values are absent from the second block rather than replaced in it. Your contact details and the project’s web address are not written by the model at all, so it is never sent them, with or without a placeholder.
Two things this does not do
The line above is drawn around the values in named fields: where one of them would otherwise reach the model, it gets a stable placeholder instead. That is a real boundary, and it is checked. It is also narrower than it first sounds, in two ways you should read here rather than discover later.
The boundary covers values in fields, not the sentences you write.
Prose you write reaches the model exactly as you typed it. Nothing rewrites it, because nothing can: what we match are the values you gave us, and no matcher reads meaning. The examples beneath are three of the ways that plays out. They are not the rule, and they are not a complete list — nobody can enumerate the ways a sentence gives you away.
- an employer you mention in a bullet but never added as a record of its own
- someone else's name, in a description of work you did together
- a description precise enough that anyone in your field would know where you were, sitting right beside the placeholder that was meant to withhold it
The job listing goes in full, as you pasted it.
The listing is the other half of the work — a model cannot match you to a role it has not read — so it is sent whole, exactly as it arrived.
- the hiring company, named throughout the listing
- any recruiter named in it
Said plainly: this is pseudonymisation. We still hold your name and the names of your employers. That is what makes the placeholders resolvable when your PDF is rendered, and it is the reason your finished document carries your real details rather than the stand-ins. So this is a boundary around what the model is shown. It is not a claim about what your profile is, and your profile is still personal data.
What is actually tested
No value from the private field set reaches the model.
That sentence is the name of a test, and the test runs on every change we make before it reaches you. It intercepts what would be sent to the model and checks that those values are not in it.
Read it against the two rules above rather than against the claim at the top of this page. It is a statement about the values in named fields, and only about them. The limits above are the rest of the truth, and no test reaches them.
One exception, which is not one of the limits
If you begin by uploading a CV, the text of that file is sent to the model once, so it can read your details into your profile. That call is how the values on the list above are learned in the first place, so it is the one call that cannot be made behind the boundary.
It is unlike the two limits in every way that matters. Those are open-ended, and we cannot close them. This is bounded, deliberate, and yours to refuse.
- It is the only call that goes around the boundary. Every other call reaches the model through a single function that applies it. This one is a separately named function, and its call sites are counted by a test — a second one fails the build rather than waiting to be spotted in review.
- We send what we read, not the file. Usually that’s the text, extracted on our own machines. When a CV is a scan with no text to extract, we send images of its pages instead. Either way the upload itself is never stored.
- The upload is discarded once it has been read into your profile. There is no copy of it afterwards.
- You can decline it. Type your details in instead — a supported path rather than a fallback — and nothing is sent.
You are told this beside the file picker, before you choose. It is a notice rather than a request: the transfer is part of doing the thing you asked for, and once it has happened it cannot be undone — which is why what we owe you is the choice beforehand, and not a promise afterwards.
Why bother, given all that
Because the boundary buys something besides privacy, and that is the part we would keep even for a reader who did not care about the first part.
Give a model a real employer name and it brings along its own opinion of that employer. Whether it credits you with meeting a requirement starts to depend on whether it happens to recognise where you worked, and it will state things about that place which appear nowhere in your profile while reporting them as though they came from you.
A curated description is different in kind. That an employer worked in public health, or was an agency rather than a client, is something you can see, change, and argue with. An employer’s reputation inside a model is none of those things: not licensed, not visible, not correctable.
So the placeholders are not only there to protect you. They remove an input nobody could audit, and leave what the model says about you resting on what you actually gave it.