GhostStat
Community
Loading…
Open the forum
UX Doctor Co-Pilot
a plain-language read of this page & where to look next

An on-page UX overlay you launch from a bookmarklet. It audits the rendered page in your own browser — real layout and computed styles — and annotates the actual problem elements: colour contrast, tap-target size, tiny text, missing alt text, unlabelled form fields, nameless controls, vague link text, viewport and heading issues. Nothing is stored or sent anywhere; it only inspects the DOM.

Plugin

UX Doctor

Run a live UX audit on any page of your site. Unlike a report, it draws the findings on the page itself — over the real elements, with your real layout and colours — so you can see exactly what to fix. It runs entirely in your browser and stores nothing.

1 · Add the bookmarklet

Drag this button up to your bookmarks bar (or right-click → Bookmark this link).

UX Doctor
Can’t drag it? Create a new bookmark and paste this as the URL:
javascript:(function(){window.GSUX_LANG={"rendering":"… rendering","blocked":"blocked","failed":"failed","anno_title":"Draw the fixes as labelled callouts on the page — then screenshot it","hide_notes":"✕ Hide notes","annotate":"📍 Annotate","save_image":"📷 Save image","save_title":"Render the page + the fix callouts into a PNG you can download and share","copy_all":"Copy all fixes","sug_btn":"💡 Suggestions","sug_title":"A prioritised action plan — what to fix first and why","sug_panel_h":"Recommended actions","sug_first":"Start here","sug_eg":"e.g.","sug_close":"Close","sug_clean_h":"Nothing urgent","sug_clean_b":"No blocking UX issues found on this view. Re-run after any layout change.","sug_why_contrast":"Low-contrast text is the single most common reason people can\u0027t read a page — fixing it helps everyone, not just low-vision users.","sug_why_cta":"If the main action doesn\u0027t stand out, visitors hesitate or miss it. This is usually the highest-leverage conversion fix.","sug_why_tap":"Targets under ~44px are hard to hit on phones; every mis-tap is a small chance the visitor gives up.","sug_why_spacing":"Targets packed too close cause accidental taps — add spacing so each is comfortably separate.","sug_why_fontsize":"Text below ~14px forces pinch-zoom on mobile. Bump body copy so it\u0027s readable at arm\u0027s length.","sug_why_readability":"Very long or very short line lengths slow reading. Aim for 50–75 characters per line.","sug_why_alt":"Missing alt text hides images from screen readers and hurts image SEO. Describe what each image shows.","sug_why_label":"Unlabelled fields are ambiguous and inaccessible — associate a visible label with each input.","sug_why_name":"Buttons and links with no accessible name are unusable by assistive tech. Give each a clear name.","sug_why_semantics":"Clickable divs aren\u0027t keyboard- or screen-reader-friendly. Use real button\/link elements.","sug_why_linksafety":"target=_blank links without rel=noopener are a small security\/perf risk. Add rel=noopener.","sug_why_linktext":"\u0022Click here\u0022-style links tell nobody where they go. Make the link text describe the destination.","sug_why_viewport":"Without a proper viewport meta tag, mobile browsers render a zoomed-out desktop layout.","sug_why_headings":"A broken heading order confuses screen-reader navigation and weakens document structure.","sug_why_cls":"Images without width\/height cause layout shift as they load — set dimensions to keep the page stable.","uxd.a.close":"Close","uxd.a.copied_u2713":"Copied ✓","uxd.a.copy_all_fixes":"Copy all fixes","uxd.a.reload_now":"Reload now?","uxd.at.email_address":"Email address","uxd.at.recheck":"Re-check the page as it is right now (after dynamic content, or edits in DevTools). To pick up changes you made on the server, use Reload.","uxd.at.reload":"Reload the page so it fetches the changes you made on the server, then re-open UX Doctor. Note: scripts can\u0027t force a cache-bypassing hard reload — for changed CSS\/JS use your browser\u0027s hard-reload or versioned files.","uxd.f.add_a_single_h1_with_the_page_s_main_t":"Add a single <h1> with the page\u0027s main title.","uxd.f.add_visible_text_or_aria_label_describ":"Add visible text, or aria-label describing what it does.","uxd.f.add_width_and_height_attributes_or_a_c":"Add width and height attributes (or a CSS aspect-ratio) matching the image so the browser reserves space.","uxd.f.all":"All","uxd.f.button_link_names":"Button & link names","uxd.f.button_prominence":"Button prominence","uxd.f.buttons_and_links_with_no_accessible_n":"Buttons and links with no accessible name are unusable by assistive tech. Give each a clear name.","uxd.f.clickable_div_s_aren_t_keyboard_or_scr":"Clickable <div>s aren\u0027t keyboard- or screen-reader-friendly. Use real <button>\/<a> elements.","uxd.f.close":"Close","uxd.f.colour_contrast":"Colour contrast","uxd.f.draw_the_fixes_as_labelled_callouts_on":"Draw the fixes as labelled callouts on the page — then screenshot it","uxd.f.errors":"Errors","uxd.f.form_labels":"Form labels","uxd.f.give_it_a_more_prominent_background_u2":"Give it a more prominent background — use the suggested colour so the button pops against its surroundings.","uxd.f.headings":"Headings","uxd.f.if_the_main_action_doesn_t_stand_out_v":"If the main action doesn\u0027t stand out, visitors hesitate or miss it. This is usually the highest-leverage conversion fix.","uxd.f.image_dimensions":"Image dimensions","uxd.f.images_without_width_height_cause_layo":"Images without width\/height cause layout shift as they load — set dimensions to keep the page stable.","uxd.f.info":"Info","uxd.f.line_length":"Line length","uxd.f.link_safety":"Link safety","uxd.f.link_text":"Link text","uxd.f.low_contrast_text_is_the_single_most_c":"Low-contrast text is the single most common reason people can\u0027t read a page — fixing it helps everyone, not just low-vision users.","uxd.f.matters_on_phones_u0026_tablets":"Matters on phones & tablets","uxd.f.minimize":"Minimize","uxd.f.missing_alt_text_hides_images_from_scr":"Missing alt text hides images from screen readers and hurts image SEO. Describe what each image shows.","uxd.f.mobile_viewport":"Mobile viewport","uxd.f.no_blocking_ux_issues_found_on_this_vi":"No blocking UX issues found on this view. Re-run after any layout change.","uxd.f.nothing_urgent":"Nothing urgent","uxd.f.page_headings":"Page headings","uxd.f.recommended_actions":"Recommended actions","uxd.f.render_the_page_the_fix_callouts_into_":"Render the page + the fix callouts into a PNG you can download and share","uxd.f.start_here":"Start here","uxd.f.targets_packed_too_close_cause_acciden":"Targets packed too close cause accidental taps — add spacing so each is comfortably separate.","uxd.f.targets_under_44px_are_hard_to_hit_on_":"Targets under ~44px are hard to hit on phones; every mis-tap is a small chance the visitor gives up.","uxd.f.text_below_14px_forces_pinch_zoom_on_m":"Text below ~14px forces pinch-zoom on mobile. Bump body copy so it\u0027s readable at arm\u0027s length.","uxd.f.text_size":"Text size","uxd.f.the_page_has_no_mobile_viewport_tag_so":"The page has no mobile viewport tag, so phones show a zoomed-out desktop layout.","uxd.f.there_s_no_h1_so_the_page_has_no_clear":"There\u0027s no H1, so the page has no clear main heading for search engines and screen readers.","uxd.f.this_button_barely_stands_out_from_the":"This button barely stands out from the area around it, so visitors can miss your main call to action.","uxd.f.this_field_has_no_label_so_its_purpose":"This field has no label, so its purpose isn\u0027t announced to screen readers.","uxd.f.this_image_has_no_alt_text_so_screen_r":"This image has no alt text, so screen readers skip it and it\u0027s invisible to image search.","uxd.f.this_image_has_no_width_height_so_the_":"This image has no width\/height, so the page can jump around as it loads (layout shift).","uxd.f.this_tap_target_sits_less_than_8px_fro":"This tap target sits less than 8px from another one, so on a phone it\u0027s easy to tap the wrong thing.","uxd.f.unlabelled_fields_are_ambiguous_and_in":"Unlabelled fields are ambiguous and inaccessible — associate a visible <label> with each input.","uxd.f.use_at_least_12px_16px_is_comfortable_":"Use at least 12px (16px is comfortable for body text).","uxd.f.use_text_that_names_the_destination_e_":"Use text that names the destination, e.g. \u0022View our rooms\u0022.","uxd.f.ux_doctor":"UX Doctor","uxd.f.very_long_or_very_short_line_lengths_s":"Very long or very short line lengths slow reading. Aim for 50–75 characters per line.","uxd.f.warnings":"Warnings","uxd.f.without_a_proper_viewport_meta_tag_mob":"Without a proper viewport meta tag, mobile browsers render a zoomed-out desktop layout.","uxd.m.copy_all_fixes":"Copy all fixes","uxd.m.image_alt_text":"Image alt text","uxd.m.tap_target_size":"Tap target size","uxd.m.tap_target_spacing":"Tap target spacing","uxd.m.use_real_buttons":"Use real buttons","uxdoct.f3.add_space_between_interactive_elem":"Add space between interactive elements — aim for at least 8px of gap, with 44×44px targets.","uxdoct.p.add_padding_or_min_height_width_so_t":"Add padding (or min-height\/width) so the tappable area is at least 44×44px.","uxdoct.p.cap_the_text_width_u2014_e_g_set_max":"Cap the text width — e.g. set max-width: 65ch (or ~700px) on this block.","uxdoct.p.change_this_to_h2_or_h3_and_keep_a_s":"Change this to <h2> or <h3> and keep a single <h1>.","uxdoct.p.give_it_a_solid_colour_drop_the_low_":"Give it a solid colour (drop the low opacity) — use one of the suggestions and paste it into your CSS."};var s=document.createElement('script');s.src='https://cdn.ghoststat.me/plugins/ux-doctor/assets/js/ux-doctor.js?'+Date.now();document.body.appendChild(s);})();
2 · Use it
  1. Open any page of your website in this browser.
  2. Click the UX Doctor bookmark. An overlay appears with numbered markers over each issue.
  3. Read the panel (bottom-right): every issue, ordered, with a severity dot. Click one to jump to and flash that element.
  4. Fix, reload, and click the bookmark again to re-check. Close the overlay with the × in the panel.
What it checks
Error — contrast, unlabelled fields, nameless controls, no viewport Warning — small tap targets, tiny text, missing alt, heading issues Info — vague link text

Contrast uses the WCAG ratio against each element’s real background (4.5:1 for body text, 3:1 for large text). Tap targets flag anything under 44×44px. Because it reads the rendered page, it catches things a markup-only scan can’t — but it only sees the page you run it on, so click through your key templates (home, a room, the booking form) one at a time.

On-screenshot behavioural report beta

The live bookmarklet shows accessibility & design issues on the page in front of you. This shows the other half — what visitors actually did — drawn on the page’s stored screenshot: where they click, and how far they scroll before dropping off. It reads your Heatmaps data, so enable Heatmaps for the site to populate it.

Pages are listed by path, most active first. Heatmap data is keyed by path — if you track several subdomains, a path’s data is combined across them.

Enter a page path and load the report.