Release — v0.9.13
Overview
Release v0.9.13 covers September. Its largest single change is the URL Analyzer: it now asks you to sign in before it runs, scans only the checks you pick and prices them at four checks to a token, lays its 22 sections out as a workspace of panels you arrange, and keeps every report it produces — in your browser, versioned and comparable, and in your account when you choose. The second is an accuracy pass over seventeen colour-science workbenches, each one measured against published data before it was rebuilt; several of them were computing something other than what their labels said, and this release says so plainly. Around those: a crawled web index behind search, with a public Search Console and a Portfolio Index; new /v1/analyzer, /v1/vision and /v1/personalize endpoints; the Daylight light mode and the Loupe cursor; a one-sheet header on phones; double opt-in for the newsletter and a single design for every email we send; and browser extension 1.0.2 with a catalogue page for all seventeen VS Code extensions.
1. Highlights
+- The URL Analyzer now asks you to sign in before it runs. Signed out, the button reads “Sign in to analyze”; after signing in you come straight back and the run starts by itself with your address still filled in.
- You choose what the analyzer scans — fourteen checks, one per section — and the price follows: four checks to a token, rounded up, minimum one. A run that turns a check off no longer reports “no issues” for it, and the overall score counts only what was measured.
- The analyzer's 22 sections are panels in a workspace: drag, resize, fold, focus, save named layouts, or start from five ready-made ones. Ctrl+P (⌘+P on a Mac) opens a picker showing every section at once.
- Every analyzer run is kept: filed in your Library as one project per site, stored in full so it reopens with no re-scan and no tokens, versioned without a cap, and comparable version against version.
- Seventeen colour-science workbenches were measured against published data and rebuilt. Among the fixes: every D-series illuminant was stretched by a factor of two in wavelength, and the colour-vision viewport rendered white as magenta under protanopia.
- Search has its own crawled web index. Globe searches read it first, correct obvious typos, suggest whole words, and keep any one site from filling the page.
- The Search Console is a public tool: verify a site by DNS, meta tag or file, then see what the crawler found, what is excluded and why, and which searches found you — for as many sites as you like.
- The Portfolio Index lists portfolios made with the Portfolio Builder and portfolios hosted anywhere else, searchable by craft, tag and colour.
- New API surface:
/v1/analyzer/*audits a page from its markup,/v1/vision/*covers all 78 vision conditions and audits a palette for colours that merge, and/v1/personalize/*exposes the Personalization Generator's search. - Daylight re-tunes light mode: a warm paper ground, one “white” for things that rise, and a warm ink ladder. On twenty public pages, visible text below WCAG AA went from 96 instances to none.
- Eye-rest reminders and the idle screen saver are now off until you turn them on, and the in-app update prompt is gone: updates apply on their own.
- Browser extension 1.0.2 is on the extension page for Chrome, Edge, Firefox and Opera, and /vscode/ is now a catalogue of all seventeen VS Code extensions.
2. The URL Analyzer: sign in, scan what you ask for, keep what you ran
+Most of this month's commits went into the URL Analyzer. The work falls into six parts.
Sign in to run
Analyze and Scan Site now check that you are signed in before doing anything. Signed out, the button says “Sign in to analyze” before you press it; pressing it takes you to sign-in with the address you typed (and whether you asked for a site scan) carried along, and the run starts by itself when you return. Nothing is fetched from the site you entered while you are signed out. An account is free, and every tool remains free to open and use.
The field is the page
At 1440×1000 the URL field used to sit 337px down the page, below a hero, six feature pills, a Quick Start banner and a Start Here panel, with the first finding below the fold. The field is now at the top and the results begin under it. The explanation was not deleted — it moved into the Overview panel, which is empty before a run anyway. The five-step strip became the run's own progress rail with the token meter at its end, and the progress card lists the stages this run actually contains, marked done by the code that does the work, over a bar that is a real fraction. The floating “Sign in for free tokens” bar and the “Analyzer quota” card that sat over the corner of the tool are both gone; the run line states the price, your balance and the claim beside the button that spends them.
Scan what you asked for
What to scan lists fourteen checks, one per section, and the run skips whatever is off. Three sections read from another check rather than measuring anything of their own — Project from Structure, Before/After from Colour contrast, Simulation from Palette — so ticking one brings its source with it. Responsive behaviour is now a check of its own (it was 8% of every score with no switch), and CSP Setup is a tool again rather than a scan result. Ticking a check opens its section; opening a section the run did not cover turns its check on and re-measures, once there is a report to bring up to date.
A section whose check was off says so and offers to turn it on, instead of reporting “no issues found” for work that never ran. The overall score is weighted only from categories that were measured, the sentence under it names them, and categories that were not scanned are removed from the report rather than printed at 100. Before this change a run scoped to metadata alone came back with six perfect scores from six checks that never ran.
| What you run | What it costs in tokens |
|---|---|
| One page | Four checks to a token, rounded up, minimum one: four checks cost 1, five cost 2, all fourteen cost 4. Structure always runs and is not counted. |
| A site scan | Quoted for the scope you picked and the pages you asked for, from the same cost model the charge is made from. The quote used to stay at the static rate whatever you had switched on. |
| Crawl Full Site | One token, flat, when it has to fetch pages through our servers. Crawling your own origin is browser work and costs nothing. |
| Reopening a saved report | Nothing. It is drawn from storage with no fetch and no frame. |
Clicking the token meter opens a sheet built around your balance: this run drawn as a bite out of it (taken from the expiring part first, the order the ledger spends in), one line on why it costs what it does, and What would fit — every job priced as how many of it your balance covers. Every figure comes from the same functions the charge uses, so an estimate cannot drift from the invoice.
A workspace of panels
The 22 sections open as panels in a twelve-column grid. You can drag a panel (it lifts out and a dashed slot shows where it will land), move it with the arrow keys, cycle its width between a third, a half and the full row, fold it to its title bar, focus it as the only panel and press again to restore the arrangement, or close it. Short panels pack into the space beside tall ones rather than leaving a hole. Layouts can be saved by name, and five ready-made ones are offered — Accessibility review, Colour and vision, Speed and weight, Content and search and Everything, thin — filtered to what the current mode can open. Applying a layout or resetting no longer throws away what you had: the outgoing arrangement is kept automatically, and the newest three of those stay in the menu.
Ctrl+P opens the section picker, which shows every section at once in two columns, grouped as On screen, Ready to open and Not scanned, each with its live finding count. Space opens a section and stays; Enter opens and closes the picker. It was Ctrl+K, which the site's own search uses everywhere else.
Faster, and measuring the real page
- The work frame loads. A site-wide lazy-loading rule had marked the analyzer's off-screen frame
loading="lazy", so it never loaded and every audit waited out a 20-second timeout before falling back to static HTML. Measured on a local page with everything on, a run went from 22.5 s to 3.0 s; the same page scoped to contrast and SEO takes about half a second. - No lag after a scan. Several observers were reacting to their own writes, the cursor restyled the whole report on every pointer move, and A11y+ built all eleven of its views up front (about 16,000 hidden elements). After the fixes, pointer movement over a scanned page drops no frames where it dropped 18 in three seconds.
- Images load in the snapshot. The snapshot frame's base URL was refused by the analyzer's own security policy, so relative images and styles failed — 46 of 50 images on one Wikipedia article. Every URL is now resolved before the frame is written.
- The site map is the whole site. It used to keep the first 200 URLs of each sitemap file and the first twelve files of an index, without saying so. Discovery now reads
robots.txt, every sitemap it names and the whole index tree, four files at a time; the Pages control limits the audit, not the discovery (“Mapped 4 of 42 discovered”). There are ceilings at 200,000 URLs and 2,000 sitemap files, and reaching one prints a line saying so. Filtering the list searches every URL, not only the rows on screen. - The preview says what it is. A site that allows embedding is previewed live, with its own scripts. One that refuses gets a banner saying so, the controls that cannot work on a static copy (colour-vision filters, the playground, Before/After) are disabled rather than left looking broken, and a server screenshot is offered as a button, never taken automatically, because it costs tokens.
Reports you keep
A finished run files itself in the Universal Library, one bundle per website: Audit · <site> and Palette · <site>, both in a collection named URL Analyzer (<site>), with the site's own favicon on the card. Re-analysing adds a version to the same project; a single-page audit and a whole-site crawl of the same origin stay separate projects.
- The whole report is stored, not a summary, in your browser's IndexedDB, section by section. Opening a saved run draws every finding with no fetch, no frame and no tokens. Sitemap discovery, which finishes after the audit, is written into the stored report when it lands.
- Nothing is deleted to make room. Every version is kept until you delete the project; deleting it removes its stored reports too.
- Compare is a new section that sets any two versions side by side: the score, the categories that moved, a row per section and, on request, which findings went away and which appeared. It refuses to draw a delta across checks the two runs did not share — a run with contrast switched off would otherwise read as every contrast failure fixed.
- Every export works from a saved report — the HTML report, JSON, the fix CSS, and the developer and client Markdown reports — with no re-scan. Compare can also download any version in full as JSON. PDF export remains a paid convenience.
- Keep in your account. A version can be stored in your account in full, listed and read back on another machine, and removed only by you. Nothing uploads on its own. Where account storage is not available the button is hidden and reports stay in this browser.
- The palette goes further. The colours a run extracts are one palette per site, updated on each run, and can be opened in six tools. A palette handed back to the analyzer is audited pair by pair against WCAG, each cell painted in the two colours it judges.
A11y+ and findings you can see
A11y+ was rebuilt for the panel width: eleven views in four groups on one row, a header 114px tall instead of about 280, and one bar in which passed, failing and needs-review add up to the rules that ran — which finally shows the number of failing rules. The score band reads as a grade, and only the severity rows use impact words. Findings now show the problem where there is evidence for one: a contrast failure as the real text colour on the real background at its real size beside the fix, a small font at its actual size, a small target drawn to scale beside a 44×44 floor, a heading outline with the skipped level marked, and an unnamed button rendered so its emptiness is visible. Scanned markup is only ever drawn inside a fully sandboxed frame. The report docks are dark in both themes, and their labels, links and badges now pass contrast inside them.
3. New API endpoints
+Fourteen endpoints join the REST API. They are metered in API credits like the rest of the /v1 surface, and have nothing to do with the tokens the analyzer page spends. The credit cost of each is below.
| Endpoint | Credits | What it does |
|---|---|---|
GET /v1/analyzer/stages |
1 | The stages the analyzer can be asked for, and which of them a markup-only run can answer in full, in part, or not at all. |
POST /v1/analyzer/inspect |
12 | Audits one page from its markup, for the scope you name. |
POST /v1/analyzer/render |
10 | Turns a report into HTML or PDF. |
GET /v1/vision/conditions, /v1/vision/conditions/:slug |
1 | All 78 vision conditions, filterable, each saying what can simulate it. |
GET /v1/vision/matrices |
1 | The nine colour-vision matrices, for doing the transform yourself. |
POST /v1/vision/palette |
3 | A set of colours under a set of conditions, in one call. |
POST /v1/vision/audit |
5 | Which pairs of your colours stop being distinguishable, under which condition. |
GET /v1/personalize/vocabulary, /presets |
1 | What a brief may name, and the briefs the tool ships. |
POST /v1/personalize/pool |
2 | Grows a working set of colours from seeds and a brief. |
POST /v1/personalize/score |
3 | Scores a palette you already have on the generator's six scores. |
POST /v1/personalize/palettes |
8 | The search itself: up to 1,200 candidates in, the best few out, each with its breakdown. |
POST /v1/personalize/system |
14 | The search plus gradients, type, UI pairs and a full token deck with its contrast matrix. |
The analyzer API states its boundary. /inspect reads markup and does no layout, so it refuses the stages that need a rendered page — contrast, the accessibility engine and the deep DOM comparison — with RENDER_REQUIRED, rather than answering them confidently wrong. Palette and media have a real, narrower markup answer and come back labelled in incomplete[]. It returns score: null and names the categories nothing measured in unscored_categories. An unknown stage (UNKNOWN_STAGE) and an empty scope (EMPTY_SCOPE) are refused rather than billed as everything. Each kind of work has its own path because the meter prices a call by its path before reading the body, so asking for the palette alone is charged as the palette alone. Where the analysis engine cannot load, /inspect and /render answer 503 ANALYZER_UNAVAILABLE. There is a guide, with every example captured from the running API: Analyzer API.
The vision API covers all 78 conditions and says which ones it cannot simulate per colour. Seventeen are per-colour transforms. The other 61 — glaucoma, scotoma, hemianopia and the rest — act on a field of view, not on a colour, so they are listed with kind: "spatial", the reason, and a pointer to the image endpoint, rather than returning your colour unchanged. The mapping from each condition to an engine model was measured against the real simulation, not guessed. /v1/vision/audit reports every pair that collapses, with CIEDE2000 before and after, the colour involved in the most collapses, and the worst condition. /v1/vision/simulate still takes an engine model id; given a condition slug, its error now names the model to use.
4. Seventeen colour-science workbenches, measured
+Each of these tools was rebuilt on the shared workbench shell, and before anything was redrawn its engine was run against published data or an independent implementation. Where the arithmetic was right it was kept. Where it was wrong it was fixed, and where it could not be made right with the data we have, the feature was withdrawn and labelled rather than left producing plausible numbers. Every rebuilt workbench now carries a data register: each dataset it rests on is marked verbatim, computed, stand-in or absent, and a view that would need stand-in or absent data to report a standard value stays switched off and says which table is missing.
| Tool | What was wrong, and what it does now |
|---|---|
| Standard Illuminants | The daylight basis, tabulated at 10 nm, was read on a 5 nm grid, so every D illuminant (D50, D55, D65, D75) was stretched by two in wavelength. CCT and Duv now use Ohno's 2011 method over a Planckian table for the selected observer; Duv was an unsigned distance from the wrong point. Six adaptation transforms — Bradford, CAT16, CAT02, Von Kries, Sharp and XYZ scaling — plus None, where three were offered. TM-30, the 10° observer and the α-opic metrics are switched off until their tables exist; F1–F12 are marked stand-in. |
| Chromatic Adaptation and Gamut Mapping | The comparison column divided by 255 twice, compressing every figure about a hundredfold, and drew a spectral basis the page did not have. Two gamut-mapping methods were named after ICC rendering intents they do not implement; they are renamed. |
| Gamut Lab | BT.2020 ran the sRGB curve, ProPhoto lacked ROMM's linear toe, and Adobe RGB used 2.2 for 563/256. The spectral locus ran to rows where the table reads zero, which made the u′v′ locus about six times too large: sRGB read 5.7% of it instead of 32.6%. |
| HDR Gamut Plot | JzAzBz used ST 2084's exponent where Safdar et al. specify a modified one, so every Jz, az and bz was wrong. Image “coverage” printed 100% for every image; it now measures how much of each gamut the pixels occupy, and luminance figures an 8-bit file cannot carry are removed. Shares are stated against the spectral locus instead of Rec.2020. |
| Tonal Steps | OKLab was fed gamma-encoded values (mid grey read L 0.795 instead of 0.600). The APCA column was not APCA-W3 0.1.9 (black on white read 114 instead of 106). Two of the three ramp engines were the same engine walked in opposite directions. |
| Tone Mapping | “BT.2446 Method A” was a constant multiplier and “Method C” capped highlights; both keep curves under names that say what they compute. The hue control scaled colour instead of rotating it; the 3D LUT export was a 1D curve; saturation used Rec.709 weights in ACEScg. Four controls that did nothing are gone. |
| Perception Vision | The shader received both cone matrices transposed (white under protanopia rendered #FF00FF), neither path converted through XYZ, and the viewport drew images upside down. The screen and the export now run one projection and agree to 0 code values. |
| Visual Pathway (was Neuroscience) | The cone matrix was fed linear sRGB with no XYZ step. The V1 filter bank was tuned in cycles per image; it now takes viewing distance and pixel pitch and works in cycles per degree. “Detection %” and the spike raster are withdrawn. The pipeline moved to a worker: a slider drag that blocked the page for 7 seconds now blocks it for none. |
| Psychophysics bench | Contrast was set in code values, so an asked-for 0.02 delivered 0.051; frequency was cycles per patch under a “cpd” label. Three of the five paradigms scored every trial wrong and are withdrawn. QUEST, PEST and the Weibull fit ship under their own names. |
| Material under light | The colour rendering index read outside its own scale (illuminant A at −113.7) and TM-30's two numbers were one number twice; both are withdrawn and replaced by a labelled colour difference against each source's own reference. The “daylight” was a blackbody; D50–D75 now land within 0.0003 of their published chromaticities. |
| Dye in solution | The pH control changed nothing on fifteen of twenty presets. The model is now two species trading population, which produces a real isosbestic point. There is a light source in the calculation, and F11 is shown as absent rather than approximated. |
| LUT Lab | The .cube reader and writer now share one index function, so they cannot drift apart. The out-of-gamut overlay flagged pixels no LUT had touched. “Cine Log to Rec.709” is renamed a stylisation; ACEScct-to-ACEScg and the 32-bit export option are withdrawn. |
| ICC profile reader | The version was read from the wrong half of a byte (sRGB read 0.2.1) and then flagged as a defect in the file; shared tags were reported as corruption; no conforming display profile could be identified. The overall score is gone: a profile is conformant or it is not, and the clause says which. |
| Collage Maker | Undo could never reach where you started, and deleted layers never came back. Coverage ignored where anything was. Exports carried the guides, selection and handles; with a transparent background ticked, the file is now genuinely transparent. |
| Gradient Ramp | The APCA readout used a scale of 161.8 where APCA uses 1.14: 520 of 2,704 grey pairs cleared Lc 60 that real APCA fails. The colour-vision matrices were credited to the wrong paper; the simulation was correct and stays. |
| SVG Recolour | Two colours could not trade places, colours written as names were never changed, and a three-digit hex came back a different colour. Every write is now planned from the original values, all 148 CSS colour names resolve, and the preview strips scripts and handlers before display. |
One fix reached further than its tool: the CIEDE2000 mean-hue term folded two cases into one in four files. It is corrected everywhere it appeared. Where an old developer reference documented an engine that no longer exists, it is marked superseded and a new reference sits beside the user guide.
5. Tools rebuilt on one workbench
+The workbench is the same on every tool: a short masthead with a two-tier spec line, a flat tab rail, then a rail of controls beside the stage that shows the work. Tool mastheads now sit on the header's own edge at every width. The tools below moved onto it this month, and so did the Colour Science Lab, Basic Colour Tools, the Design System Generator and the Personalization Generator.
- Image Picker — The stage is the drop target, the read-out moves to a right rail, and the charts have their own tab. Max detail took 104 ms of frozen page per extraction; it now takes about 5 ms. The eyedropper stopped forcing a layout on every move, and ramp labels choose their ink by comparing the two contrast ratios.
- Font Library — The first specimen moved from 2,318px down the page to 590. Filters live in a sticky rail with an Applied row of removable chips and a search across all facets. Opening a typeface docks it beside the library (drag the edge between 380 and 720px) instead of covering it, and it rises as a bottom sheet on phones. The Features tab had been showing every OpenType sample in the wrong typeface; the suitability meters drew no bar; the type scale rendered in a font that was never loaded; an unknown licence permission looked like a denial. All fixed. Your selection is one surface, Your kit.
- Icon Library — The same workbench as fonts. The first icon moved from 1,709px down the page to 668, the category facet shows ten chips with a More, set tabs lose their dingbats and carry counts, the detail panel docks beside the grid, and the Sets view is never empty.
- ASCII Art Generator — Drop a picture anywhere, paste one, or press Try an example, and it converts as you go; the Render button is gone because nothing waits for it. Five looks — Classic, Blocks, Fine, Bold and Line art — replace two rails of twenty-five controls, with everything else behind Fine tuning. Colour now reaches every output: HTML, canvas and PNG, true vector SVG, and a new ANSI export (
.ans) for terminals. Analysis, Compare and Export surface batch analysis, a benchmark, charset comparison and HTML, JSON and CSV export that the engine had and the page never showed. Monochrome exports are no longer black on black, and the cell aspect comes from the chosen font. - Ishihara Plate Generation — A Diagnostics view shows the four weighted components behind each plate's score, and the standard 38-plate book can be generated. Plates can be shown at S, M, L or XL, and double-clicking one (or Enter on a focused card) opens it at full size, redrawn from its own dots, with arrow keys through the batch. Generate now sits under the three choices that decide a plate.
- Vision Simulation — Each of the seventeen colour conditions shows the same ten swatches put through it, so scanning the grid is the comparison; the 61 field-of-view conditions say so instead of inventing swatches. A new Palette audit takes your colours, checks every pair under all seventeen conditions in your browser, and proposes the smallest lightness change that separates a pair that merges. The light theme had rendered card titles at 1.30:1; the page now has no colour-contrast failures in either theme.
- Accessibility checklist — The first check is now above the fold. Export previews the real Markdown and names every item nobody looked at. Reference covers the law in fifteen jurisdictions, India first, each instrument with what it requires, whom it binds, the dates that matter and its primary source. All 45 “Understanding” links now reach their criterion instead of the WCAG index.
- Colour Tools — The launcher opens with all fourteen tools visible in two columns, where it showed three and a scroller. The Inspector's ten tabs fit down to 700px, panels fit a phone, and the control bar that lists open panels is a bar again.
6. A web index, a Search Console, and a Portfolio Index
+Search reads its own index
Globe searches on /search/ now query Auric Artisan's own crawled web index first and fall back to the previous live lookup when it has nothing. What that brings:
- Operators that work.
site:,intitle:andlang:narrow the candidates before the page is cut, sosite:w3.org contrastno longer reports matches and shows an empty page. - Paging, and at most two results per site on a page; the rest move down rather than disappear.
- Domains are places. Searching
google.computs pages on that domain above pages that mention it, and the exact host above its subdomains. - Typos are corrected when nothing matches. “gooogle” runs as “google”, the page says so, and Search instead for runs your spelling exactly. Domains, operators, quoted phrases and words that are already common are never corrected.
- Autocomplete offers words — “colourspace” rather than the stem “colourspac” it is indexed under — and no longer lets one dotted name fill the list.
- Favicons are served from our own address, so the site's security policy no longer blocks them and no third party is told which sites your results contained.
The Search Console
The Search Console reports on your site in that index. It is open to anyone with an account, linked from the footer and the Menu Kit, and says plainly that it changes nothing about how you appear in Google or Bing.
- Verify with a DNS TXT record, a meta tag or a file; each check reports where it looked, what it wanted and what it found instead.
- Overview leads with what you can fix, draws every known URL as one pipeline whose parts add up to the total, and lists what needs you first.
- Performance compares every figure with the period before, over 7, 28 or 90 days, by search, page, day, country or device, and separates searches for your site by name from searches that found it for something else.
- Coverage gives every exclusion reason as a sentence with what to do about it, in three buckets — on its way, needs you, nothing to do.
- Pages folds the site by folder, with search first; inspecting a row opens a drawer with what the crawler saw beside a live fetch of the page now.
- Submit takes one address and works out whether it is a page or a sitemap. Sitemaps named in
robots.txtare now found without being typed in. - Your sites holds as many as you like. Removing one takes it off your console, not out of the index, and deletes its search history; the dialog says both before you confirm.
Behind the console, the crawler had been ending a single-site crawl after one page per politeness window (285 seeded sitemap URLs produced 4 pages; the same seeds now produce 279), a site's own links were not credited to it, and submitted sitemaps were discarded. All three are fixed.
The Portfolio Index
/portfolios/ is a directory of portfolios made with the Portfolio Builder and portfolios people keep on their own sites. Search is typo-tolerant, understands tag:, in:, made: and is:verified, ranks a hex colour by OKLab distance, counts its facets, and keeps the whole view in the URL. Each row leads with the person, their craft, place and palette, and says whether it was made here. A builder portfolio joins with List it in the Portfolio Index. Portfolios from elsewhere are added from the Search Console: listed at once on a verified site, reviewed otherwise. Search has a Portfolios tab too.
7. Daylight, Loupe, and the site around the tools
+Daylight
Light mode was tiring rather than unreadable: text sat on three whites 1.02:1 apart, so cards never separated from the page; pure-black headings sat on a near-white ground; hairlines were 1.21:1. Daylight re-tunes the same brand. Dark mode is unchanged.
| Role | Value |
|---|---|
| Paper (the page) | #F5F0E6 |
| Sheet (the one “white”, for things that rise) | #FCF9F2 |
| Band and well (strips, recessed areas) | #EFE8DA, #ECE5D7 |
| Ink ladder | #1C1A16 (15.3:1), #2F2B24 (12.4:1), #524C42 (7.5:1), #6A6357 (5.2:1) |
| Links, gold ink | #1E40AF (7.7:1), #765A0B (5.71:1) |
| Control edges (buttons, chips, inputs) | #7A7263 |
Fixing the palette surfaced text that was already failing — Advanced Kit captions, Pass badges, disabled plan features at 2.2:1, white on bright gold at 2.11:1 — and all of it is corrected. On the twenty pages measured, visible text below AA went from 96 instances to none.
Loupe
The custom cursor is redrawn from a few hairline parts: a dot that never lags, a ring on a spring, a halo under every line, and reticle ticks over targets. All nineteen modes — text, precision, arrows, zoom, help, copy, not-allowed, disabled, loading and the rest — are drawn from them. The ring keeps the colour it samples only while that colour reaches 3:1 against the surface beneath it, and switches to ink otherwise. It leans toward small targets without the dot moving. On the Image Picker's canvas it becomes a 7× loupe naming the pixel under it. It now draws above modal dialogs, and with forced colours on it hands the system cursor back.
Around the page
- The header on phones opens one sheet from under the bar: search first; Company, Tools and Learn opening in place with counts; your Library and the guide; the app, the extension and VS Code, each with a line saying what it is; Theme (Auto, Light, Dark) and Language (English, हिन्दी); and your account or sign-in pinned at the foot. Every icon is named. From 600px it is a 400px sheet from the right.
- The right-click menu names what you clicked (page, link, image, selection or colour), leads with a quick bar — Back, Forward, Reload, Home, Copy URL — where the star pins up to six actions, groups the rest into submenus, and filters everything as you type. The gear sets layout, density, and whether you get this menu or the browser's own; holding Shift gives you the other one.
- The page-utilities dock was seven unnamed circles across the page. It is one bar with every launcher labelled, a single button when closed, and two bands on a phone.
- The six floating kits (Feature, Menu, Advanced, Status, Library, Settings) share one surface, border, header and tab style; you could read the homepage through the Menu Kit before. Settings gains focus, expand and minimise, and the Menu Kit's sixth tab is reachable.
- Comfort features are opt-in. Eye-rest reminders and the idle screen saver are off until you switch them on in Settings → Comfort. The eye rest is now a horizon that contracts over the rest, ending on a screen that says Rest complete and when the next reminder is; the reminder offers Rest now or Later, and the duration and interval (20, 35, 45 or 60 minutes) sit together. The screen saver shows a sample colour as its seven-step OKLCH ramp, full height, each step labelled in an ink that reads.
- Fewer interruptions. The guide no longer starts a tour on its own, and the feedback prompt waits for twenty minutes of actually viewing the site. The welcome bar appears on the homepage only.
- Updates apply on their own. The installed app no longer asks you to refresh; a new version installs and takes over, checking again at most every five minutes. The service worker also stopped trusting the browser's four-hour copy of scripts and styles, which had kept some returning visitors on old files after an update.
- Page gaps above content and before the footer are one value site-wide: smaller on wide screens, unchanged on phones.
8. Newsletter, email, and shared portfolios
+The newsletter asks before it sends
The footer's newsletter card has always stored addresses; nothing ever confirmed them, and the unsubscribe token it created was honoured nowhere. This release adds the rest:
- Double opt-in. Signing up sends a confirmation email. Confirming is a click on the confirmation page, never the page loading — mail scanners open every link — and links last a week. A confirmed subscriber gets a welcome with the accessibility checklist.
- Unsubscribing is one step. Every issue carries its reader's own unsubscribe link and the one-click unsubscribe header Gmail and Yahoo use. Unsubscribing invalidates any old confirmation link, so it cannot quietly re-add you; coming back is a fresh sign-up, confirmed again.
- The form cannot be used against anyone. It answers the same way whatever the address's status, so it cannot reveal who is on the list, and it is limited to four sign-ups an hour per address, so it cannot fill a stranger's inbox.
If the new sign-up service is not reachable, the card falls back to the previous endpoint, so a sign-up is not lost.
One design for every email
All sixteen emails we send — verification, welcome, password reset, receipts, payment failed, trial ending, cancellation, newsletter confirmation and issues, support replies and the rest — are drawn by one engine. Each has a dark mode, a phone layout, a plain-text part written from the same content so the two cannot disagree, and a footer saying why it arrived. A password reset now says when it was requested, one-off security and billing mail is no longer threaded under an older message, and a reply written by a person reads as a letter signed by Support. Receipts had rounded money to whole units — ₹84.75 was receipted as ₹85 — and now print paise and cents. No web fonts are loaded, so opening an email does not tell a font host who you are.
Shared portfolios
- A shared portfolio is a page on the site.
/p/<handle>still paints first, on its own, and then the cursor, the right-click menu, the header and the footer arrive when the browser is idle. The page fills the window with the author's name scaled to it, prose kept to a readable measure, and the author's status bar replaced by a small pill. The right-click menu gains Copy link to this portfolio, Save as PDF, Email the author and Make your own. Reading mode works there now. - Check is a map of the page. The builder's Check pane groups findings by the fault — one colour pair, fixed once — instead of one row per element, and pins them on a live picture of the page. Selecting a finding outlines it, which it had never actually done.
- The builder toolbar docks under the site header instead of scrolling away behind it, and the profile photo control on the dashboard now responds to the double-click, Enter and Space it advertises.
9. Browser extension 1.0.2 and the VS Code catalogue
+Browser extension 1.0.2
The extension page was rebuilt in light and dark and serves version 1.0.2 for Chrome, Edge, Firefox and Opera. 1.0.2 is the Auric Studio redesign, together with the Hindi work finished in August:
- A new workspace: Home plus four spaces (Colour, Check, Code, Saved), with / or Ctrl+K searching every tool, setting and auricartisan.com page.
- The Picker is the site's own colour picker, with twelve formats, contrast with the closest passing colour, colour-vision previews, and code for six platforms.
- Pickers on web pages that fit: a compact colour popover, search in any dropdown with more than seven options, multi-select as a real dropdown, and controls that follow your theme.
- An element inspector that leads with contrast and offers the nearest passing text colour, with a box-model diagram and accessibility checks that say what to fix.
- A right-click menu built around what you clicked, on the same design as the site's.
Further work — the side panel as home base, and audit findings drawn over the page as numbered pins — is recorded in the extension's changelog as unreleased and is not part of 1.0.2.
VS Code
/vscode/ is now a catalogue of all seventeen extensions published under auric-artisan: two-pack install commands, a guide to which extension does which job, cards with filters and search that open to a screenshot, features, a first step and the VS Code version each needs, and a privacy ledger of which extensions touch the network (Live stays on your machine; Font Hub and Icon Hub reach our font and icon servers and can be switched off; none sends telemetry). Links to Open VSX, all of which returned 404, are removed. Released or updated this month:
- Auric Artisan Theme 0.2.0 — 54 variants, up from 24, with new Dusk and Forest families, every existing theme id kept; 4,374 contrast pairs audited with no warnings.
- Auric Artisan Live 0.2.0 — one workspace (Overview, Requests, Runtime, Routing, Settings), a phone QR code generated locally, request search and filters, opt-in browser console mirroring with credential redaction, and certificate import that checks dates and the matching key before applying.
- Formatter Studio — previews of the whole document or a selection with explicit Apply and Discard, bound to the document they came from so another editor cannot receive the change.
- Auric Artisan Studio (Color, Accessibility, Code Health) — redesigned, with each engine checked against an external reference; on its regression suite the accessibility detector's false positives went from 132 to 0.
- File Icons 0.1.1, a redesigned Icon Studio, and an Icon Pack that installs Modern, Playful, Drawn and Emoji together.
10. Full change list
+- Analyzer sign-in — Analyze and Scan Site require a signed-in account; signing in returns you to the tool and starts the run you asked for.
- Analyzer layout — Moved the URL field to the top; removed the hero, pills and onboarding bands; moved the explanation into the Overview panel.
- What to scan — Fourteen checks, one per section, with derived checks bringing their source; Responsive gets a switch; CSP Setup is a tool.
- Honest scoring — Unscanned sections say so; the overall score and exports include only measured categories.
- Scan pricing — Four checks to a token, minimum one; site scans quoted for their scope; Crawl Full Site metered at one token when it uses our servers.
- Token sheet — Rebuilt around the balance, with What would fit; removed the floating token bar and the analyzer quota card.
- Analyzer workspace — Panels that drag, resize, fold, focus and pack; named and ready-made layouts; outgoing layouts kept automatically; Ctrl+P section picker.
- Analyzer speed — Fixed the work frame that never loaded (22.5 s to 3.0 s measured); removed post-scan lag; A11y+ builds views on first open.
- Site map — Complete sitemap discovery with stated ceilings; search across every discovered URL.
- Preview modes — Live, screenshot or static, stated on screen, with controls that cannot work disabled.
- Saved reports — Automatic filing per site, full reports in IndexedDB, unlimited versions, Compare, full JSON download, exports from saved reports, optional storage in your account.
- A11y+ and previews — Rebuilt A11y+ for the panel width; findings demonstrate the problem in a sandboxed preview.
- Snapshot accuracy — Resolved every URL in the snapshot so images and styles load.
- Analyzer API — Added
/v1/analyzer/stages,/inspectand/render, with a guide. - Vision API — Added
/v1/vision/conditions,/matrices,/paletteand/auditcovering all 78 conditions. - Personalization API — Added six
/v1/personalizeendpoints over the generator's own engine. - Colorimetry — Rebuilt and corrected Standard Illuminants, Chromatic Adaptation and Gamut Mapping.
- Gamut and rendering — Rebuilt and corrected Gamut Lab, HDR Gamut Plot, Tonal Steps and Tone Mapping.
- Perception — Rebuilt and corrected Perception Vision, Visual Pathway and the Psychophysics bench; withdrew what could not be made right.
- Spectral tools — Rebuilt and corrected Material under light and Dye in solution.
- Image and file tools — Rebuilt and corrected LUT Lab, the ICC profile reader, Collage Maker, Gradient Ramp and SVG Recolour.
- Data registers — Every rebuilt workbench states whether each dataset is verbatim, computed, stand-in or absent.
- Image Picker — Workbench layout; Max detail from 104 ms to about 5 ms.
- Font and Icon Libraries — Workbench layout, sticky filter rails, docked detail panels, one selection surface; fixed the Features tab's wrong typeface.
- ASCII Art Generator — Live conversion, drop anywhere, paste, example, five looks, colour in every output, ANSI export, Analysis/Compare/Export.
- Ishihara — Diagnostics, the 38-plate book, plate sizes, full-size view.
- Vision Simulation — Condition previews on every card, Palette audit, light-theme contrast fixed.
- Accessibility checklist — Workbench layout, Export preview, law in fifteen jurisdictions, 45 criterion links fixed.
- Colour Tools — Launcher shows all fourteen tools; Inspector and panels fit narrow widths.
- Web index — Globe search reads a crawled index with operators, paging, per-site limits, domain ranking, typo correction, word suggestions and self-served favicons.
- Search Console — Public, multi-site, with verification, Overview, Performance, Coverage, Pages, Links, Submit and inspection.
- Crawler — Fixed single-site crawls stopping early, property attribution, and discarded sitemaps; sitemaps found from
robots.txt. - Portfolio Index — Added
/portfolios/with operators, colour search and facets, and a Portfolios tab in search. - Daylight — New light-mode surfaces, ink ladder, links, control edges and gold ink.
- Loupe — Redrawn cursor with contrast-aware colour, target lean, a pixel loupe on the Image Picker, and forced-colours support.
- Mobile header — One sheet below 960px with named icons, Theme and Language.
- Right-click menu — Target header, quick bar with pins, submenus, filter, preferences.
- Dock and kits — One labelled launcher bar; six floating kits on one panel shell.
- Comfort — Eye rest and screen saver opt-in and redesigned; the guide never auto-starts; the feedback prompt waits twenty minutes.
- App updates — Applied automatically; scripts and styles revalidated rather than served from a four-hour copy.
- Newsletter — Double opt-in, one-click unsubscribe, per-address throttling.
- Email — All sixteen emails on one design with dark mode, phone layout and plain text; receipts show exact amounts.
- Portfolios — Shared portfolio pages join the site; Check maps findings onto the page.
- Browser extension — Version 1.0.2 and a rebuilt extension page.
- VS Code — Catalogue page for seventeen extensions; Theme 0.2.0, Live 0.2.0, Formatter Studio, Studio accuracy pass, File Icons 0.1.1, Icon Studio, Icon Pack.
- Documentation — A user guide and developer reference each for the Contrast Checker, the Design System Generator and the Font Library; the Analyzer API guide; new developer references for the rebuilt workbenches.
- Hindi — Translated the new text on every rebuilt tool and page, including text the tools build at run time.
- Deploy fix — Fixed a build step that removed the header and footer from the deployed site.
11. Technical Notes
+- Tokens and API credits are still separate. An analyzer run on the site spends tokens;
/v1/analyzer/inspectspends API credits. Neither pays for the other. No plan, plan price or allowance changed in this release; what changed is how an analyzer run is priced in tokens. - One scope list, four readers. The picker, the run, the progress card and the price all read one list of stages. The rate of four checks to a token lives in three files that cannot import one another, and a test keeps the three copies equal, because a drifting rate would mean the meter quoting one number and the ledger taking another.
- Why reports are cut into sections. One busy page's accessibility findings alone can run to half a million characters, far beyond the few megabytes browser local storage offers. The Library keeps what a list needs; IndexedDB holds the report, one record per section. Anything that cannot be stored costs only its own field, and the path of what was dropped is recorded. Past the newest 25 versions a project's list rows are slimmed to their essentials, because the full detail is already in IndexedDB.
- Reports in your account are stored as objects with one database row each for listing, and the service never parses the report it stores. Erasing an account deletes those rows and objects.
- The web index splits its storage by access pattern. Bulk data read by range (dictionary, postings, positions) lives in object storage; small rows read in sets (result cards, suggestions, crawl state, console data) live in a database. Fetching twenty result cards as twenty objects would cost hundreds of times more per query than one database statement. A code deploy does not clear cached answers; publishing a new index does.
- Heavy work leaves the frame. Visual Pathway runs its calculations in a worker that shares one kernel with the page, answers the newest request only, and falls back to the same kernel inline if a worker cannot start. Its orientation filters are computed as separable passes, which agree with the dense form to 2×10−14.
- Workbench pages load a slice of the analyzer's stylesheet. Tools that borrow the analyzer shell now load a generated 190 KB subset instead of the full 266 KB sheet, which is what kept those routes within their weight budget.
- The analyzer loads on demand. The workspace, the token sheet, the palette audit and the report-filing code are imported the first time they are used.
- Staff tools. The eight staff consoles now share one shell, and new ones were added for ads, a checkout sandbox and the newsletter. The ads console serves the site's own campaigns from a central store with frequency caps actually applied, counting only sums per campaign per day — no page, cookie or identifier — and a failed feed falls through to the existing ads. The checkout sandbox runs the real order engine against a mock gateway in separate tables, so it can never touch real orders or grant a plan. Advertisers still cannot pay through the site.
- Service worker. Runtime fetches send
cache: "no-cache", so an unchanged file costs a 304 and a changed one arrives. The search API is no longer cached by the service worker. - Pages across the site carry their own social preview image, and the documentation index is generated from the pages that exist, with a check that fails when the two disagree.
12. Testing & Quality
+The colour-science rebuilds were held to mutation testing: after each suite was written, the defects it exists to catch were injected back into the shipped code one at a time, and a suite counted only once it caught them — 73 of 73 on Collage Maker, 74 of 74 on the ICC reader, 54 of 54 on Material under light, 33 of 33 on Visual Pathway. Where an injected defect survived, the gap was in the test, and it was closed. Acceptance values are published constants (CIE chromaticities, Sharma's 34 CIEDE2000 pairs, the APCA-W3 reference values), not numbers read back out of the implementation. The analyzer gained browser suites for the workspace, pricing, sign-in and the IndexedDB library, plus contrast sweeps of every surface in both themes that fail if a surface they claim to measure is missing. New guards cover things that had drifted more than once: page-gap tokens (npm run test:layout), files the deploy step must never remove, service-worker freshness, the staff console pages and their access gates, and every email in the catalogue meeting AAA contrast in its heading.
13. How to Report Issues
+When filing an issue, please include: steps to reproduce, browser/OS, affected page, tool or endpoint, whether you were in light or dark mode, screenshots or recordings, and console logs where available. For the URL Analyzer, say which checks were switched on and whether the site allows embedding. For a workbench result you believe is wrong, include the inputs and the value you expected, and where it comes from. For an API problem, the x-request-id header from the response is the fastest way for us to find the call.