Roadmap & release notes

Current version 0.7.0 · page updated 2026-09-21

Everything the annotator can do, by the version it arrived in — and what we're building next.

What's next#

Next#

Committed, not yet started.

  • Organization plans — Community, Research, Coalition and Enterprise plans an admin assigns per organization, each carrying what it includes — scheduled exports, API tokens, the schema builder, Brandwatch import, more than one team, the Conflicts page — and an organization-wide AI allowance. Annotating, flagging, manual export, deletion and the AI explanation are never part of a plan. Ships switched off; the service enforces before any page hides a control.
  • AI second opinion for custom schemas — The model's verdict is currently shaped like the built-in antisemitism taxonomy, so a team on its own schema gets the plain-language explanation but not the pre-annotation. Fixing it means deriving the verdict from the team's own schema — a model contract, not wiring, which is why it wasn't folded into the parity pass.
  • Peer comparison on custom schemas — The compare carousel, the inline marks showing what other annotators said on the same post, and the guided keyboard flow — three things the built-in panel has and a custom schema's editor doesn't.
  • Contribution tracking — What each annotator, team and organization has produced. The headline figure — how many annotations each has stored — now reports on the usage page. What is still missing is the rest of the picture: output over time, how much of it has passed review, and coverage of a project rather than a running total.

Exploring#

Wanted, with an open question in front of it.

  • The other hate types in the same panel — The label spaces for anti-Black, anti-Latino and anti-queer hate already ship inside the extension; the annotation panel is locked to antisemitism. Unlocking it is a small change and a large decision about how a corpus annotated against four taxonomies is kept coherent.
  • Structured flagged-source measurement — Today the extension marks a citation to a watchlisted outlet when an annotator happens to encounter one. A deliberate, repeatable prompt suite would turn that into a rate that can be compared across assistants and over time.
A roadmap, not a schedule. These are the things being worked on and the order they are wanted in. Nothing here carries a delivery date; the dates on this page are the ones we can stand behind, which are the releases below.

Release history#

Each release lists what it added. A version in development is already built and in testing — it reaches annotators as the next install.

v0.7.0

2026-09-21#

Articles and other web pages can now be annotated — the whole piece, a passage you highlight, or any reader comment under it — by asking the extension onto the page from the toolbar popup or with a keyboard shortcut. Mastodon and Truth Social join the platforms, and a corpus can be brought in from a file. Items can also be annotated from the workspace itself, without opening the platform first, and opening one for annotation assigns it to you. You can sign in with a Microsoft work or school account, alongside Google and a username and password, so partner organizations on Microsoft 365 no longer need a separate password issued to them.

Annotable after this release — 20 surfaces: X, YouTube, Rumble, TikTok, Reddit, Instagram, Facebook, LinkedIn, Bluesky, Mastodon, Truth Social, 4chan (including its 4plebs archive), 8kun, ChatGPT, Claude, Grok, Gemini, DeepSeek, Qwen — and, on demand, any article or other web page.

Articles and other web pages
  • Any web page can now be annotated — a news story, an op-ed, a blog post. Open the toolbar popup on the page and press Annotate this page, or press Alt+Shift+A, and the page carries the usual Annotate button on its headline. Nothing runs on such a page until you ask: the extension holds no standing access to any site beyond the platforms it has always run on.
  • Highlight a passage and annotate just that — only the highlighted text is stored, and its link reopens the page scrolled to the quote. The Annotate button on the headline annotates the WHOLE piece: its own text is stored (up to 12,000 characters), with the comment section alongside it as context.
  • The comment section is annotatable too, the way a thread on a social platform is. Every reader comment carries its own Annotate button and is stored under the commenter's name rather than the publication's, with when it was posted and its likes where the page shows them. A reply keeps the comments it answers above it and the article's headline, so a reviewer reads it in context; a passage highlighted inside a comment is filed as the commenter's.
  • Comments are found on the systems news sites and blogs actually run — WordPress, Drupal, Hacker News, forum software and many more — and on sites with no recognisable markup at all. Where none of that finds them, highlighting one comment is enough: annotating it teaches the page where its comments are, and every comment beside it gets a button.
  • Disqus comments — the comment section of many news sites — can be annotated once you allow it. Disqus shows its comments in a frame the extension cannot otherwise reach, so the first time you annotate such a page Chrome asks whether it may; say no and nothing changes. Comments a site loads from other services are not read; the record says they were there instead of reading as none.
  • Pasting an article link into the queue files it as an article, and the service reads the page's headline, byline and text so it can also be annotated from the workspace. Brandwatch imports can ask for news pages in the same way, when a lead ticks Articles.
  • Administrators can allow or restrict articles per organization and team on the Platforms page like any other surface. An organization that had narrowed its platform list will need Articles ticked before its annotators see the option.
Mastodon and Truth Social
  • Posts and replies on mastodon.social and truthsocial.com carry the Annotate button, with the thread a reply sits in kept as context. An organization or team whose platform list is restricted will need the new platform ticked on the Platforms page first.
A corpus from a file
  • The Import window has a third source: upload a CSV or JSON of posts — links, or just their text — and add them to a project. A row with text and no link becomes an imported text, annotated from the workspace with no live post to open.
Looking closer at a post
  • The annotation panel's ⋯ menu gathers the tools for studying a post: the plain-language explanation, how far it travelled (its likes, replies and shares as the platform shows them), and whether the account behind it looks like a person — plus the AI pre-annotation and what other annotators said. Flag sits beside it in the panel's title row, one click away.
  • When a post's picture has gone from the platform — an imageboard deletes a thread's files, a platform's image links expire — an annotation reopened from the workspace shows the copy saved when it was annotated, marked as the saved copy. If no copy was kept, it says so and offers the post, rather than showing an empty box.
Images and video from AI assistants
  • An image or video an AI assistant generated — on ChatGPT, Claude, Grok, Gemini, DeepSeek or Qwen — carries its own Annotate button under it, so the picture can be judged on its own rather than only as part of the whole response. A response that is nothing but a picture, which had no button at all, can now be annotated.
  • The picture is judged on its own: the prompts written before it ride along as context, and the assistant's text around it does not — even when the same response also wrote text.
  • A picture wrapped in a link to its own full-size file keeps its Annotate button, and the chat’s source check no longer offers to report the assistant’s own image host as a cited outlet.
  • The file itself is kept with the annotation: the extension reads it from the page when you annotate it (its address works only in your browser) and it is archived once, in your organization's own archive. If it cannot be read, the annotation is still saved, noting the image it was about.
Annotating
  • You can now annotate an item from the workspace itself. Open an item on the Items page or on any project or sub-project, and each of its links carries an Annotate button that opens the usual editor — the project's own schema, the same answers, the same review — without leaving for the platform first.
  • Opening an item for annotation assigns it to you, so the queue shows who is working what while they are working it, rather than once the annotation arrives.
  • The editor shows the post's own text and the account that wrote it, wherever those are known. Where they aren't, it says which is missing and puts the post one click away instead of showing you an empty card. Either way there is a link to the original, since only the platform has the images and the conversation around a post.
  • An item you have already annotated reopens your own answer rather than starting a blank one, the way editing an annotation from the Conflicts page already did.
  • Several comments can be labelled at once. Press Alt+B, click the comments you mean (or take everything on screen), choose one label and apply it — for the long threads where almost nothing applies and each comment otherwise costs a trip through the editor. It only ever answers the first question your team’s schema asks, it skips anything you have already annotated rather than overwriting your own work, and a label that needs more than that one answer stays greyed out with the reason on it.
  • The “annotated on this page” button now says how much of the THREAD each annotator has done — on hover, and as a line above the list it opens. Two people working the same video or thread can see each other’s coverage without leaving the page, and you always see your own. What you can see of other people’s work is unchanged.
  • Posts that arrive from an imported social-listening source now keep their text and their author, so they can be worked entirely from the workspace. A post somebody has already annotated shows its text and author too, however it was collected.
  • And where nobody holds the post yet — a link somebody simply pasted — opening it for annotation reads what the platform publishes about it: the post's own words and the account that wrote them, on X, YouTube, TikTok, Reddit, 4chan and 8kun, plus the link preview any other site offers. Nothing private, nothing behind a login, and only for the post you are about to work.
  • A post with pictures or video on it now says so. The images themselves stay on the platform — the editor tells you how many there are and the link takes you to them, rather than showing you the words alone as though that were the whole post.
4chan's archive
  • Posts 4chan has deleted can be annotated on archive.4plebs.org, which keeps them. Open an archived thread and every post carries the usual Annotate button.
  • An archived post is treated as the post it is: it keeps its original board and number, so a queue item added from a boards.4chan.org link is ticked off by an annotation made on the archive, and the same post annotated from either place is one piece of work rather than two. An organization already cleared for 4chan is cleared for the archive with it.
Fixes
  • When a platform redesigns and posts stop getting their Annotate button, an administrator can now put in a replacement from the Platforms page, and every installed copy picks it up within hours — no store update to wait for.
  • The toolbar popup has one button for the page behind it: Add this page on a platform, Annotate this page on an article. Pasting a list of links is done from the workspace.
  • The “✓ You annotated” mark no longer flickers on and off while you work. On sites that repaint a post as you scroll — Reddit most of all — the page kept sweeping the mark away, and it was put back only a third of a second later; it is now restored in the same instant, so it simply stays put.
  • A site your organization has not been cleared for now says so. Pressing the annotate shortcut on such a site, or opening the toolbar popup there, tells you the site is turned off for your organization and that an administrator can turn it on — instead of the extension appearing to be broken.
  • An annotation waiting on a service outage is no longer given up on. It used to stop retrying after about an hour, leaving work that needed a manual retry; it now keeps trying for as long as a week, and the message says the problem is ours and that nothing is lost.
Signing in
  • “Continue with Microsoft” sits beside “Continue with Google” on the sign-in panel and the in-page sign-in card. It appears only where your organization has been set up for it, so nothing changes for anyone who signs in another way.
  • The extension asks Microsoft for your email address and name and nothing else — it cannot read your mail, files or calendar, and never receives your password. A Microsoft sign-in lasts as long as any other, and signing out ends it everywhere.
  • If a sign-in needs your IT department's approval, the extension now says so in Microsoft's own words rather than reporting a generic failure — so you know who to ask.
Accounts
  • An administrator or team lead adding someone can now send a Microsoft invitation as well as a Google one: the account is created with its role and team already set, and the person claims it by signing in. The roster says which provider a seat is waiting on.
  • Invitations, password resets and the “no password on this account” notice are now sent from the extension’s own mailbox, so they arrive from an address a person can reply to rather than a no-reply one — and a forgotten password can be recovered without an administrator issuing a link by hand.
  • An invitation can now go to any email address. Until now a Google or Microsoft invite had to be at one of a short list of organization domains, and anyone else — a collaborator on a personal address, a partner on their own institution’s domain — had to be written into the service’s configuration by hand first. The person still has to be invited by an administrator or lead before they can sign in; what changed is who can be.
Projects
  • Putting people on a project now opens a share window, the kind every document tool uses: type a name into the box at the top, and below it is the list of everyone who already has the project, one row each.
  • Names are picked in the box and added together, so staffing three people is one action rather than three. Each row in the list has its own remove.
  • Anyone can open it to see who is working a project; only a lead can change it.
Exporting
  • Export now works on the item list as well as the Annotated one, so a project’s collected posts can be downloaded whether or not anyone has annotated them yet. Until now a spreadsheet could only ever contain finished annotations, which left the material still waiting to be worked on with no way out of the tool.
  • The button is on the Items page and on every project and sub-project, and exports what is in front of you: the workbook follows the project you have open, the slice you are on, and the search and filters you have set.
  • One download covers both halves of the page. The first sheet is the items — each post with its project, who it is assigned to, and how many people have annotated it so far — and the sheets behind it are the annotations, laid out per schema exactly as the Annotated export has always laid them out.
Scripted access
  • A lead can now create an API token on the Settings page and use it from a script or a scheduler to download the same workbooks the Export button produces — so a nightly export to a data warehouse no longer needs a browser, or a password kept in a job.
  • A token only exports. It sees exactly what its owner sees, it cannot change anything, and it stops working the moment it is revoked — by its owner on the Settings page, or by an administrator from the Users page. It is shown once, when created, with a ready-to-run command beside it.
  • Both exports can now be fetched as JSON or CSV as well as Excel, with the same sheets and columns, so a data pipeline can read the annotations without a spreadsheet parser. Large exports can be read a page at a time.
  • A lead can also set up a scheduled export: choose the project, the format and how often, and the service delivers the workbook by email or to a storage bucket — daily or weekly, without anyone opening the extension. Each schedule shows when it last ran and what happened, and can be paused, edited, run on demand or deleted from the new Scheduled exports page.
  • A schedule can be started from the list you are already looking at. The Export button now has a second half: press the arrow and choose “Schedule this export”, and a new schedule opens for exactly that export — the project, the slice, the platforms, the people and the search you had set are carried over and shown, so a standing delivery is never quietly wider than the list that prompted it. All that is left to answer is how often, and where it goes.
  • A schedule can also be narrowed to particular people: whose annotations to include, and whose items — chosen from your roster, or filled in from the list you started it on. Leaving them empty means everyone you can see, as before. The form now reads down the page with each question beside its answer.
  • Scheduled exports and scheduled imports now share one “Schedules” page, with a tab for each — they were two entries with near-identical names, and remembering which one held the thing you wanted was work the page should do for you. Anyone who could only see exports still sees only that tab.
Sources
  • The watchlist is now separate for every organization, whichever database its work is stored in. The outlets a lead approves, removes or edits are their own organization’s, and only their organization’s annotators are warned when an AI answer cites one. Organizations sharing a database used to share one list, so a lead in either could add an outlet the other’s annotators were then warned about — or take away one they relied on.
  • An organization new to the watchlist starts with an empty list and grows it from its own annotators’ reports.
  • The page is now called Sources, and the reported outlets, the watchlist and the earlier decisions each stand further apart on it, with the explanations running the full width of the page rather than stopping halfway across it.
Finding your way around
  • The workspace sidebar is now three headings — Work, Managing and General — that open where they stand, instead of one long list of every page you can reach. What you do daily is under Work; the pages you visit when something needs setting up are under Managing.
  • Items moved into Work alongside Review and Conflicts, so the queue and the two pages that watch it are together.
  • Projects are listed alphabetically and can be narrowed to one team, which is the switch that used to live in the toolbar popup. Hovering a project shows who is on it, beside the row rather than inside it.
  • Every page now carries its title and a short line about what it is for in the bar at the top, so a page opened from a link says what it is.
Getting started
  • The Getting started page has been rebuilt around what a new account actually does first. It opens with a short checklist that ticks itself off as you go — pin the extension, annotate a post, see where it landed — with the reference material below it rather than in front of it.
  • The page is drawn as well as written: the annotating loop, the panel, flagging, reviewing and how a team switch changes what you see each have a small diagram, because those are questions about an arrangement and a paragraph was the wrong answer.
  • Every line is matched to the account reading it — your role, what your team may do, and which platforms your organization has been cleared for. It no longer describes pages you do not have or sites where the extension is deliberately silent.
Settings
  • Settings is now three panels — your profile, your annotating preferences, and API access — with the legal documents along the foot of the page.
  • Leads and administrators see how many posts their organization has looked at, alongside their own count.
Reviewing
  • The Conflicts page is one table with two views. Open disagreements and the ones you have put away sit under the same columns, and a row carries both of its actions — settle it, or file it away — so clearing the page no longer means scrolling past everything already dealt with.
  • Filing a conflict away changes no annotation. It is a note about the list, it is your organization’s alone, and it can always be undone.
  • The Review page tells you when it could not load rather than showing an empty inbox. A refused or unavailable queue used to read as “nothing to review”, which is the one message that stops a reviewer looking further.
  • Ticking a row on the Review page no longer redraws the page under you, and the sidebar’s Review and Conflicts counts are fetched as counts rather than by loading both pages in full on every page you open.
  • Agreement between annotators is now measured the way research reports it — Cohen’s and Fleiss’ κ and Krippendorff’s α — in the on-page viewer for a post several people annotated, and for a whole project on the Conflicts page. Where a figure cannot be computed it says so rather than showing zero.
  • Two annotators who choose different “other ideologies” for the same post now raise a conflict. The Conflicts page had no opinion about that question, so a post everyone agreed was antisemitic — but disagreed about what else it was — was filed as agreement and never surfaced. The row says which of the three now differs, and shows each annotator’s choices side by side. The agreement statistics score the question too.
Managing people
  • Someone with an address at a university, or at a domain an organization has claimed, can create their own account and ask to join; a lead of that organization approves them before they can do anything. Organizations can list the email domains that are theirs.
  • Adding someone is one form wherever you do it. Leave the password blank and the service emails them a one-time link; they choose their own username and password from it, so nobody has to send a password to anyone.
  • The Users page can be narrowed to one organization, and the team list follows it, so a lead is choosing from their own people rather than from everyone.
  • Teams and Organizations are proper tables now, each with its own “new” control in the header, and an organization’s schemas are one list you can read down.
Usage
  • Usage can be read over a RANGE of months rather than one at a time, and narrowed to a single organization.
For reviewers and ethics boards
  • A public “What we collect” page says what the extension can see, when anything is sent and what never is, where it goes, what the AI features do, how long it is kept, and how to set up an institutional annotator account. It is linked from the privacy policy, the options page and the Getting started guide.
Throughout
  • A design pass over the whole workspace: one colour for the navigation icons instead of eleven, tables where there were grids of tiles, real controls where there were rows of text, and explanations folded into the page rather than stacked above it. Nothing was removed — the same information is on the same pages.
  • Checkboxes, dropdown menus and scrollbars are drawn dark throughout, including inside the annotation panel on the platforms themselves, where they had been rendering light against a dark panel.
  • Every field in the import window now announces itself to a screen reader, including the search-terms box — the one answer that decides what an import collects, and previously the one a reader was given no name for.

v0.6.1

2026-08-30#

A lead can create a team in their organization and run it: the person who made it seats and unseats everyone on it, and is the only one besides an administrator who can delete it. Admins can hand someone a one-time link to set their own password. And the queue's row buttons now say what they do out loud, for anyone using a screen reader.

Annotable after this release — 17 surfaces: X, YouTube, Rumble, TikTok, Reddit, Instagram, Facebook, LinkedIn, Bluesky, 4chan, 8kun, and ChatGPT, Claude, Grok, Gemini, DeepSeek, Qwen.

Teams
  • A lead can create a team inside their own organization, and the person who creates it owns it. An owner seats and unseats anyone in the organization on that team — other leads included — which is what makes a team something a lead can actually run rather than something they have to ask an administrator to staff.
  • An owner is also the only person besides an administrator who can delete their team. Deleting it releases the owner's own seat; a team that still has other people on it, or still owns projects, is not deleted, and says which so the next step is obvious.
  • A team made before this release has no owner recorded, so it stays an administrator's to delete — nobody inherits a team they did not create.
  • Administrators can hand anyone a one-time link that lets them set their own password, instead of inventing a starter password and sending it to them. Looking at the link does not spend it, and it is good for one use.
Privacy
  • Where two organizations share a flagged-source watchlist, the outlets on it are shared but the people are not: who reported an outlet, and who approved it, is now shown only to their own organization. The list itself is unchanged.
Projects
  • A project now belongs to the people on it. Everyone — leads included — sees the projects they were added to or created, rather than every project their team or organization has, so a workspace shows the work you are actually part of.
  • Creating a project puts you on it, and you can add other leads and annotators by name from the project's own page. Anyone added sees it in their workspace and in the drawer's “filing this under” picker; a lead added to it can edit it too.
  • A project nobody has been added to stays visible to its team's leads, so nothing made before this release goes missing and no project can end up with no one able to staff it. Administrators continue to see every project.
Getting around
  • The two buttons on a queue row — assign this to me, and remove it — now announce what they do to a screen reader. They had been read out as the bare symbol on their face, so the label a mouse user saw on hover reached nobody using assistive technology.

v0.6.0

2026-08-27#

8kun joins the imageboards the annotator covers, bringing it to seventeen surfaces; a disagreement can be settled from the Conflicts page; Instagram posts opened from a link are annotatable; a team lead can invite a colleague by email; and two things that moved when they shouldn't have — the page under a teammate's annotation, and the Multimodal button under the pointer — now stay put.

Annotable after this release — 17 surfaces: X, YouTube, Rumble, TikTok, Reddit, Instagram, Facebook, LinkedIn, Bluesky, 4chan, 8kun, and ChatGPT, Claude, Grok, Gemini, DeepSeek, Qwen.

8kun
  • The annotator now runs on 8kun, the seventeenth surface it covers. Threads and replies are annotated in place, on a thread's own page and on a board's index alike.
  • It works the way 4chan already does, because the two sites are built the same way: a post is identified by the board it is on and its post number, and a reply carries the posts it quotes as its context, so a reviewer reads it in the thread rather than on its own.
  • Work from 8kun files under the same name as the site's earlier addresses, so a thread annotated today lines up with what was collected from it before.
  • It is subject to the same per-team platform settings as every other surface: an organization that hasn't enabled it sees no change.
Annotating
  • A disagreement can be settled where it is seen. On the Conflicts page, your own row now carries “Edit my annotation”: it reopens the editor over exactly what you submitted — the post, its thread, its media and your labels — and resubmitting overwrites that annotation, the same as re-annotating the post in place. No more finding the comment again to change one call.
  • The Multimodal button no longer runs away. Picking an ideation and then clicking Multimodal used to fold the ideation grid to a single line at the moment of the click, so the button jumped up under the pointer (and on a reel, where Multimodal starts on, the whole Flags row moved). A click now leaves the layout where it is; sections still fold when you move through them with ↵ and ⇧↵.
  • Instagram posts and reels opened from a LINK can be annotated. The annotator only recognised a post opened from the feed or a profile; a reel reached directly renders its comments in a different layout, where nothing was found to annotate and Alt+click found no post either. It now reads all three layouts, and every form of Instagram post URL.
  • Work you annotate while browsing now appears in the project you filed it under. Picking a project in the annotation drawer has always decided where the work is filed, but a project’s Annotated tab only listed posts that had been added to that project as items first — so annotating a post you found yourself, with the project right there on the drawer, showed up in your own History and nowhere on the project’s page. It is now on both, and the project’s spreadsheet export includes it.
  • Answering “No” to a required yes/no question now works. On a schema whose question must be answered, No was recorded on screen but left out of what was sent, so the service refused the annotation as unanswered and the extension retried it in the background forever — the work looked submitted and never arrived, with nothing on screen saying why. Only Yes could be recorded. A required question now shows both answers with neither picked in advance, so an untouched question still reads as untouched, and No is sent as the answer it is.
Assigning work
  • Who can be put on a project now follows the project tree. A project offers the people on its team, and a SUB-project offers the people on the project above it — so a study’s batches are staffed from the study, not from the team at large. Taking someone off a project takes them off its sub-projects in the same move, and the page says which ones.
  • A sub-project whose parent has nobody on it offers nobody, and says so: add people to the project first, then narrow them into its parts.
  • The same rule reached the item assignee picker, which had been offering everyone the account could see. Work handed to someone outside the team it belongs to never appeared in their queue at all — now it isn’t offered, and isn’t accepted. Claiming a piece of work for yourself is unaffected.
Exporting
  • The spreadsheet export follows the schema the work was annotated with. A workbook now holds one sheet per schema: the antisemitism panel’s sheet keeps its Ideation and Categories columns, and a team on its own schema gets one column per question it asked, headed by the question itself, with answers written out as the labels the annotator chose and highlighted passages as the quoted text. The post, the picked context and the review state are on every sheet. Before this, every annotation was exported into the antisemitism columns, so a custom schema’s answers were missing from the file.
Reading a teammate's annotation
  • Opening a post's annotations from its ✓ pill no longer throws the page back to the top. On YouTube, checking what a teammate had recorded on a comment meant landing on the video and scrolling all the way back down to the comment; the page now stays exactly where it was, and closing the viewer puts you back on the pill you opened it from.
Teams
  • A team lead can now invite a colleague by email. The Google invite the admin console has offered — a passwordless account the person claims by signing in with Google — is on the lead's own Team page too, beside the username-and-password form, and is bounded the same way: only addresses in a domain the deployment has approved, only onto the lead's own team, and only with a teammate's role. Until the person signs in, the roster says the seat is waiting to be claimed.
  • A lead can now arrange everyone in their organization across its teams. A new People section on the Team page lists each person with a chip per team: switch one on to add them, off to remove them, and choose which of their teams is the primary one that their new work is filed under. It covers the lead's own memberships too, so moving between your organization's teams no longer needs an admin. Other leads' teams stay an admin's to set, and nobody can be taken off their last team from here.
  • On a lead's roster, a team member who is themselves a lead now reads as one. The row used to fall back to the first group on the list, so a cross-team lead sitting on a team looked like an annotator. A lead can set a teammate's permission level up to senior annotator — make or unmake a team lead — while a cross-team lead's level, like an admin's, stays an admin's to change. Adding someone who is already on a sibling team keeps the level they have unless a new one is chosen.
  • A project a lead creates is always filed under one of their teams. It used to fall into the shared pool when the lead's account had no team of its own — and for an organization that keeps its own database, the shared pool is not theirs to see, so the project vanished the moment it was made. The page now says what is wrong instead: a lead with no team is told to ask an admin, the “no team (shared)” choice is offered only where the pool belongs to the organization, and a refused create shows the reason rather than “try again”.
  • An organization now has a list of the schemas its teams may use. An admin grants library schemas to an org on the Orgs page, and a team lead can put their team only on what their organization has — the bundled antisemitism panel is granted the same way, so an organization annotating with its own instruments never sees it, and a schema a team built for itself stays available inside its own organization. A schema in use by a team can't be taken away from the org until that team is repointed.
  • A project now decides what its work is annotated with. A lead points a project at a schema from the project's page; sub-projects inherit it unless they choose their own, the editor switches to the project's schema as you change project, and a team's schema becomes the default for posts annotated outside any project.
  • Admins can hand anyone a one-time link to set their own password — for a starter password that never arrived, or an invited account whose Google identity can't be used.
  • The lead who creates a team runs it: they can add or remove anyone in their organization on that team — other leads included — and they are the only lead who can delete it.
  • Switching teams now changes what an admin or cross-team lead sees, not only where their work is filed. Picking a team in the toolbar popup narrows the queue, the Items page and the file-under picker to that team's projects, the way it already did for everyone else; the switcher gains an “All teams” choice, the default, which keeps the whole cross-team view.
  • Flagged sources are now kept per organization. The outlets a lead approves, removes or edits on the Flagged sources page are their own organization’s, and only their organization’s annotators are warned when an AI answer cites one. A new organization starts with an empty list and grows it from its own annotators’ reports.
  • Flags you see are your organization’s. “Flagged for annotation” now shows only the flags raised inside your own organization, whichever account you read it with, so a flag — and the evidence captured with it — stays with the organization that raised it. Everything else you can see is unchanged.
  • Importing from a social-listening source is now an administrator’s to run. One import spends from a request budget shared across the whole deployment and turns a single topic judgement into hundreds of entries a team then works through, so until the curation half is settled that call is held at one level. Team leads keep every other way of filling a project.
  • Switching teams now shows you the projects you were added to on that team. The project picker in the annotation panel used to list every project the team had, so on a team with many it was a long list of places your work did not belong. It now lists the projects a lead has put you on — and says so when there are none yet. Leads still see their whole team.
Getting started
  • The Terms of Use are now shown and accepted on your first sign-in, before the extension opens. They used to be a line of small print beside the setup form saying that carrying on was the agreement; they are their own screen now, with the points that matter written out, links to the full terms and the privacy policy, and a box to tick. Which version you accepted, and when, is recorded with your account and shown in Settings under Privacy & legal.
  • One of those points is new, and is the reason the screen exists: accepting lets the project say publicly that your organization uses the extension and that you are one of its authorized annotators — in presentations, funding reports, papers and press. It covers nothing about your individual work: your annotations are not published attributed to you, you are not quoted, and nothing implies you endorse a finding. You can ask us to stop naming you at any time.
  • When the terms change materially the extension asks again rather than treating your continued use as agreement. It asks for the acceptance alone — there is no questionnaire to refill — and queued work stays queued while it does.
  • The one-time sign-up questionnaire takes any organization. Its Organization field was a list with a single entry — ours — and the service refused every other answer, so an annotator from a partner organization had exactly one choice and it was the wrong one. It is a text field now: type your organization, or pick it from the suggestions, which lead with the organization your account already belongs to.

v0.5.0

2026-08-18#

Three more places to annotate — Bluesky, LinkedIn and Facebook — a working Conflicts page, and figures that say what they mean: how much someone has actually annotated is now counted from the annotations themselves, and every oversight page says whose work it is showing.

Bluesky, LinkedIn and Facebook
  • The annotator now runs on Bluesky, LinkedIn and Facebook, bringing the number of surfaces it covers to 16. Posts and replies on Bluesky, posts and comments on LinkedIn and Facebook — all annotated in place like everywhere else.
  • Each one is its own piece of work. A Bluesky post keeps one identity whether its link names the author by handle or by DID, and a LinkedIn or Facebook comment is separate from the post it sits under, so flagging one comment doesn't mark the rest.
  • LinkedIn is midway through rebuilding its feed, and the annotator reads both layouts. The new one publishes no link of its own for a post or a comment, so work captured there travels with the post itself rather than with a URL that would not open for anyone else.
  • Flagging a LinkedIn or Facebook post that only its group can see attaches what was captured, the way flagging an AI conversation does — the link alone would open a join wall for whoever picked the flag up. Everything public is still flagged by link.
  • All three are subject to the same per-team platform settings as the other surfaces: an organization that hasn't enabled them sees no change.
The work queue
  • Annotators can assign work to themselves. The button for it has always been there and the queue has always shown them the unassigned items, but the request behind it was refused as lead-only, so the click did nothing and said nothing. Taking a piece of work back off your own list works the same way.
  • Handing work to someone else is still a lead's call, and that is now what the page shows: an annotator sees the controls for their own list rather than ones that would be refused.
  • A queue change that fails now says why, instead of quietly leaving the row as it was.
Annotating
  • On 4chan the Annotate button is no longer cut off. It sits in the post's header line, level with the name and date, so it lands in the same place on every post — and that line now reserves room for it, which it never had before: a post is drawn in a box sized to its widest content, and anything past the edge was simply clipped away. Two smaller causes went with it — the reserved space was being dropped again moments after each post was drawn, and the button's label could open wider than the post itself.
  • Anywhere the label still wouldn't fit, on any site, the button stays as its icon instead of opening part-way off the edge.
Flagging
  • A comment you have typed now travels WITH a flag instead of being thrown away by it. Noticing something worth reporting — a post the extension read wrongly, say — writing it down and then reaching for Flag used to be two gestures that cancelled each other out: the editor warned that flagging would discard the annotation, and it did, comment included. The note now becomes the flagged item's first comment, so whoever picks the flag up reads why it was flagged.
  • The warning before flagging is narrower to match. It appears only when there are LABELS to lose, and says what happens to the comment rather than leaving you to guess. With nothing typed but a comment there is nothing to warn about, so flagging just works.
  • Flagging a post someone on your team had already flagged adds your note to the existing item rather than starting a second one.
Review & conflicts
  • The Conflicts page works again. It had been showing nothing at all since the annotation platform moved to its current storage on August 5 — and, worse, saying so: the page read “Every post labeled by 2+ annotators has matching labels”, which is a claim about your data, on a page that was not looking at your data. Disagreements were being recorded correctly the whole time, which is why the side-by-side view on the post itself kept showing them.
  • Conflicts is now a comparison rather than a decision. Every annotation is kept and agreement is scored across them, so the page no longer offers to pick a winner — it shows who called what, and coaching happens through Review.
  • The Review page now says whose work is in it. Reviewers oversee different sets — some every team in the organization, some only their own teams — and the page used to describe all of them the same way, so two reviewers comparing inboxes had no way to tell the difference from a fault. It now names the teams the inbox covers.
  • It also names the two other reasons two reviewers see different lists: approving a row removes it from everyone's inbox, and an annotation is auto-approved when its author already held a reviewing role at the time they submitted — so a colleague's older work can appear while their recent work does not.
  • Annotations by someone who is not on a team are now reported instead of disappearing. They could not be approved by any team's reviewer and nothing anywhere said so; the page now says how many there are and that an admin needs to add the annotator to a team.
  • A reviewer who oversees several teams is no longer shown the names of annotators from other organizations.
Usage & limits
  • “Stored annotations” now counts the annotations a person has actually stored, read from the records themselves. A post someone revised counts once, a submission that had to be re-sent counts once, one the service refused doesn't count at all, and an annotation a lead deletes stops counting.
  • That figure was previously a count of accepted submissions, which is a different thing and could run far ahead of the work done — most visibly for anyone annotating during the August 11 service interruption, whose submissions were re-sent many times before they could be stored. Those numbers correct themselves: the figure is recounted each time the page loads rather than accumulated.
  • The old count is still shown, under its own name — “Submission attempts”, on the metered resources card. It is what the monthly limits apply to, and it is the one that reflects load on the service rather than work produced.
  • Where an organization's records can't be read, the page says the figures are incomplete and names it, instead of quietly reporting a smaller number.
  • The page now opens with what needs attention: everyone and every team at or close to a monthly limit, named, with whether anything is actually being refused. It appears only when there is something in it — finding it before meant reading every figure in every table.
  • Every column sorts, so the heaviest use is one click away rather than wherever a name happens to fall alphabetically. Long lists of people can be filtered by name, and the whole month can be exported as a spreadsheet.
  • The page says it is loading instead of showing an empty rectangle while the figures are fetched, and switching enforcement on can no longer be sent twice by an impatient second click.

v0.4.0

2026-08-12#

The antisemitism taxonomy is now the Decoding Antisemitism Lexicon itself, unaltered. Plus multi-team tenancy: a team owns its own annotation schema and its own set of surfaces, and every page that reaches across organizations is admin-only.

Annotation taxonomy
  • The categories in the annotation drawer are the Decoding Antisemitism Lexicon's own — all 40 of them, under the Lexicon's names, in the Lexicon's order, grouped into its six parts. Where the list previously carried AddressHate's own revisions, it now carries the published framework, so the extension can be read alongside the book it comes from.
  • Each category names its concept number, so a category in the drawer can be looked up in the Lexicon directly.
  • Three earlier categories were folded back into the Lexicon concepts they had been split out of, and one that the Lexicon covers in two places is again two: Evil/The Devil and Immorality are separate categories rather than one combined heading.
  • Work annotated before this change keeps the categories it was given. Nothing was relabelled retroactively — a past annotation still records the category the annotator was actually shown.
Platform access
  • Which sites and AI chats a team may annotate on is a setting now, not a briefing: an admin ticks the 13 surfaces per organization and per team, so a team scoped to one research question — or an agreement that doesn't cover AI-chat transcripts — is enforced rather than explained.
  • The layers intersect. An organization's list is a ceiling its teams narrow but never widen, and a surface the organization has turned off shows as unavailable on the team's row rather than as a box that can be ticked to no effect.
  • A team with no list of its own inherits. Enforcement runs in the page (no Annotate button on a surface the team doesn't hold) and again when the submission arrives, since the first check runs on the annotator's own machine.
  • Nothing is restricted out of the box — the shipped policy is empty, so every team keeps all 13 surfaces until an admin unticks something.
Teams and organizations
  • Each team assigns its own annotation schema. Resolution runs team → organization → default, so re-pointing one team leaves its siblings untouched.
  • An acting-team switcher: the team you are annotating for decides the schema, the destination and the meters, while what you can SEE still spans every team you belong to.
  • Cross-tenant pages are admin-only. A lead's oversight covers every team inside their own organization — that is depth, not a reach into another organization's names, rosters or totals.
  • The organizations page is one collapsible table of organizations and their teams, with drag-and-drop between them over the same confirmed move the buttons use.
  • Every move confirms against a dry run that NAMES the people it re-files: existing annotations stay where they are, only future work moves, and a vague “are you sure?” never conveyed that.
  • A person belongs to teams in ONE organization. They can be shared across as many teams as you like inside it, and no account — admins included — can hold a seat in two at once.
  • Moving someone to another organization releases the teams they held in the old one, and the confirmation says which before it happens. The same applies when a TEAM moves: whoever it leaves behind, or carries with it, is named and released rather than quietly straddling two organizations.
  • Moves now warn before they break. A member missing from the target organization, or a team schema that organization hasn't published, is reported up front instead of surfacing later as a failed submission.
  • The teams page shows every team in your organization; a team you're not on renders read-only rather than as a form that would be refused on save.
  • A platforms page sets which sites and AI chats each organization and team may annotate on. A team can narrow what its organization allows and never widen it, so an organization-level limit is a real ceiling rather than a suggestion.
  • Platforms a team isn't cleared for simply don't show the annotation tools, and a submission from one is refused at the service too — the policy holds whether or not the browser honours it.
  • The toolbar popup files under the team you switched to in its own header. Adding or removing a queue item there used to be filed against your primary team instead, and the popup's queue could show a different team's list than the full page did.
Annotating
  • The annotation panel says who the work is for. A line under the post names the team you are annotating for and, when you have one chosen, the project — and both can be changed from the panel itself instead of from the toolbar. Switching teams re-opens the editor with that team's schema, warning first if you have already started.
  • The project you pick is a standing choice, not a per-post one. It stays selected for everything you annotate next — across posts and across sessions — until you change it in the panel again.
  • Flagging follows it. A post you flag while working through a project arrives IN that project rather than in one shared pile someone has to sort afterwards; the confirmation names where it went, and your list of flags shows it per row. With no project selected a flag still arrives in the team's flagged queue, exactly as before.
  • The panel shows the platform's logo rather than a two-letter code, matching the queue and history rows.
  • The post and the thread it replies to now share one budget at the top of the drawer instead of reserving space each. A long comment answering a long post used to fill most of the panel before the annotation controls got any of it.
  • A “Show less” control shrinks that region further, and it stays that way — across posts, across sessions, and in both the antisemitism panel and a custom schema's form. It appears only when there is something to shrink.
  • Every reply in a Reddit thread has its own Annotate button. A reply nested under another comment was skipped — it could still be annotated by holding Alt and clicking it, but only by someone who knew that.
  • On 4chan the Annotate button is no longer clipped by a narrow post. Its label opens in whichever direction the post has room for, rather than always to the right and off the edge of a short reply.
  • Custom schemas match the built-in panel: re-opening an annotation now pre-fills the answers you already gave. Re-submitting overwrites the previous annotation, so an editor that opened blank was quietly replacing finished work — this was the release's most important fix.
  • The flag pill, the thread-context box (on a chat: the opening request and the eliciting prompt) and the AI explanation all reached custom schemas, so a team on its own schema stops judging a response with no sight of the question.
  • Annotation schemas are versioned, so an answer always renders against the definition it was asked under, however often the schema is edited afterwards.
Syncing your work
  • Finished annotations reach the service faster. Several are now sent at once instead of strictly one after another, so a backlog built up offline clears in about the time the slowest one takes rather than the sum of all of them.
  • A queue that is waiting is now chased properly. The extension re-checks on every start, the moment your connection comes back, and the moment you sign in — the three points at which whatever was blocking delivery has usually just stopped being true.
  • Each submission now retries on its own schedule rather than sharing one with the whole queue. A new annotation no longer resets the pacing for everything already waiting, and a submission the service has just refused is not re-sent every few seconds while it does.
  • When the service itself is unwell, the queue stops after the first refusal instead of offering it every annotation in turn. Delivery had been spending its whole retry allowance in minutes during an outage; it now lasts the outage.
  • Two ways an annotation could sit on “syncing” forever are closed: a submission filed for a team you have since left now reports that, in those words, instead of retrying silently and indefinitely; and the queue can no longer end up with nothing scheduled to deliver it.
  • “Retry now” retries now. It used to report success without doing anything if the queue happened to be busy at that moment.
  • The popup counts work that is retrying separately from work in flight, so a queue that is stuck no longer reads as a queue that is nearly done.
Settings
  • The settings page is four cards instead of seven. Signing out and deleting your account sit together on one line, the panel and post-counting toggles share a card, and the privacy, terms, support and roadmap links moved to a full-width footer with the version.
  • The extension now reaches the service at a permanent address, so the service can move between machines without anyone updating anything. The address is no longer an editable setting: it was a text box that could point an annotator's credentials at another server, and it had nothing left to do. The page shows which service it is talking to.

v0.3.0

2026-08-08#

The platform set nearly doubled, and the annotation panel became configurable per organization instead of fixed in the code.

Annotable after this release — 13 surfaces: X, YouTube, Rumble, TikTok, Reddit, Instagram, 4chan, and ChatGPT, Claude, Grok, Gemini, DeepSeek, Qwen.

New surfaces
  • Rumble and TikTok — both the video and its comments.
  • Three more assistants: Gemini, DeepSeek and Qwen.
  • Reddit submissions themselves became annotable, with the submission carried as context for its comments.
Annotating
  • Flag and Annotate moved into the chat's own action row, so the buttons sit where every other control on that response sits — and stopped landing in the middle of a long answer.
  • A highlighted passage now anchors to that passage. A partial highlight used to be filed against the whole response, which turned a precise piece of evidence into a vague one.
  • The editor opens centered as a modal on extension pages, where there is no post behind it for a side drawer to leave visible.
  • On Qwen, Annotate and Flag join the platform's own selection menu instead of fighting it for the same corner of the screen.
Flagged sources
  • Citations to watchlisted outlets are marked inline in an assistant's response, with the reason a click away.
  • Anyone can report an unlisted outlet; leads triage reports into the watchlist every annotator's extension fetches, with no rebuild.
  • Detection only — a flagged citation is never an automatic hate label.
Per-organization annotation schemas
  • A schema builder with visual, JSON and layout tabs, and a live preview that renders through the same renderer the annotators use.
  • Custom HTML and CSS layouts with field placeholders, validated the same way on the client and the server so a layout can't pass one and fail the other.
  • Starting-point presets, so a new schema begins from a working example.
AI budget
  • AI use is metered per organization, team and person, with monthly limits and a Usage & limits page.
  • Every account starts with 5 pre-annotations and 5 explanations a month — a default allowance rather than an unbounded one.
Reliability and safety
  • A security review pass: hardened sign-in and queue authorization, HTTPS-only ingest, rate and cost limits, and baseline security headers on every response.
  • The normalized annotation database became the authoritative store for every submission.
  • Every network call carries a timeout. A connection that is accepted and then never answered used to hang forever, which could leave the extension looking dead on the page.
Workspace
  • Platform brand logos on every queue and history row.
  • One shared token set behind the whole interface, so the popup, the panel and the workspace stop drifting apart.

v0.2.0

2026-08-04#

Five more surfaces, and adding a colleague stopped requiring a shared password or a redeploy.

Annotable after this release — 8 surfaces: X, YouTube, Reddit, Instagram, 4chan, and ChatGPT, Claude, Grok.

New surfaces
  • Grok conversations.
  • Reddit and Instagram comments.
  • 4chan threads.
Accounts
  • An admin can invite a colleague from the console: a passwordless account with its permission group, team and organization already set, claimed by signing in with Google.
  • The accounts roster groups by team, permission group or role, collapses, and searches — a flat list had stopped working past about thirty accounts.
Fixes
  • Post identity is stable on YouTube, so the badge marking an already-annotated comment (and the flag pill beside it) no longer disappears and reappears as the page re-renders.
  • A flag placed on a permalink is recognized wherever that post appears.
Permissions
  • The extension asks for no site-access permission beyond the ingest service itself. Every request it makes goes there and nowhere else, so the platform permissions it used to request bought nothing.

v0.1.0

2026-07-16#

The first release: annotate in place on the platform itself, with a lead's approval standing between a submission and the corpus.

Annotable after this release — 3 surfaces: X, YouTube, and ChatGPT and Claude conversations.

Annotating in place
  • Hover any post or comment → Annotate (or Alt+A) → classify in a drawer beside the post, against the AddressHate label space. No copy-pasting into a separate tool, and the post stays on screen.
  • The thread comes with it: reply chains, quoted posts, the parent comment, the video or conversation the post sits in, and its media.
  • Keyboard navigation between posts, contextual co-text picking for the comments that make a post legible, and a five-second undo on every submit.
  • ChatGPT and Claude conversations are annotable as well — an assistant turn, or a selected excerpt of one, with the prompt that elicited it captured as context.
Sync that doesn't lose work
  • Submissions queue locally and deliver with retry, so annotating through a dead connection, a slept laptop or a browser restart keeps the work.
  • The editor stays on screen until a submission is acknowledged, rather than closing hopefully.
The review gate
  • An annotation is archived immediately but stays pending until a lead approves it; approval is what commits it to the database and runs the AI second opinion.
  • Leads get an approval inbox with the captured evidence, a conflicts view where annotators disagree on the same post, and coaching feedback that reaches the annotator on their own history rows.
Evidence flags
  • Flag a post for someone else to annotate, with the passage that prompted it highlighted.
  • Flagging inside a private conversation is consent-gated, and the evidence is only ever readable in the workspace — nobody else can open someone's chat by its URL.
Accounts and roles
  • Username/password or Google sign-in, with capabilities coming from permission groups — admin, lead, senior annotator, annotator, flagger — resolved live, so a change to a group applies immediately.
  • Teams as the isolation unit: two teams do not see each other's flags or annotations.
  • A one-time onboarding agreement before first use.
The workspace
  • A full-page Items dashboard over the shared work queue: directories, paste-a-list to create, assignment and filtering.
  • History with gate status per row, date and project filters, and export to .xlsx.
AI second opinion
  • An optional model pre-annotation and a plain-language explanation beside the annotator's own answer, scored for agreement — a second opinion, never a substitute for the annotator's.
Hosting
  • The ingest service on Cloud Run with a durable archive of every submission envelope.
  • These public pages — privacy, data deletion, terms and support.

How versions are numbered#

The annotator is pre-1.0, so every release so far sits on the 0.x line: the middle number moves for a release, the last for a fix shipped on its own. The version above is the version in the extension's manifest — the one Chrome shows on its extensions page — so what you are running and what you are reading always match. 1.0 is reserved for the point the tool is stable across every surface it claims, not for a date.

Questions about a release: ksaiki@addresshate.org. Setup and troubleshooting live on Support.