Max Potential First Input Delay
280 ms
The maximum potential First Input Delay that your users could experience is the duration of the longest task. Learn more about the Maximum Potential First Input Delay metric.
Words
952
Action candidates
2
Images
5
HTML
95 KB
Primary
Get Obsidian for macOS
Tailwind
Simulated mobile · Performance
2026-09-05 · Lab data, not field data.
Simulated mobile · Lab data, not field data
2026-09-05T04:05:44.278Z · Lighthouse 13.4.1
Results vary by server, network and environment, independently of taste/conversion scores. Diagnostics retain Lighthouse wording.
280 ms
The maximum potential First Input Delay that your users could experience is the duration of the longest task. Learn more about the Maximum Potential First Input Delay metric.
3.4 s
Time to Interactive is the amount of time it takes for the page to become fully interactive. Learn more about the Time to Interactive metric.
Focusable descendents within an `[aria-hidden="true"]` element prevent those interactive elements from being available to users of assistive technologies like screen readers. Learn how `aria-hidden` affects focusable elements.
{
"type": "table",
"items": [
{
"node": {
"lhId": "1-0-DIV",
"path": "1,HTML,1,BODY,6,DIV,0,DIV,0,DIV,1,DIV,3,DIV,1,DIV,0,DIV",
"type": "node",
"snippet": "<div class=\"select-none cursor-default relative ui bg-gray-900 border-t border-s borde…\" aria-hidden=\"true\" data-nosnippet=\"\">",
"selector": "div.text-lg > div.card > div.md:h-96 > div.select-none",
"nodeLabel": "Community plugins\nCalendar by Liam Cain\nCalendar view of your daily notes.\nKanb…",
"explanation": "Fix all of the following:\n Focusable content should be disabled or be removed from the DOM",
"boundingRect": {
"top": 4312,
"left": 45,
"right": 391,
"width": 347,
"bottom": 4696,
"height": 384
}
},
"subItems": {
"type": "subitems",
"items": [
{
"relatedNode": {
"lhId": "1-1-INPUT",
"path": "1,HTML,1,BODY,6,DIV,0,DIV,0,DIV,1,DIV,3,DIV,1,DIV,0,DIV,1,DIV,1,DIV,0,INPUT",
"type": "node",
"snippet": "<input type=\"checkbox\" aria-labelledby=\"plugins-calendar\">",
"selector": "div.select-none > div.border-b > div.shrink-0 > input",
"nodeLabel": "div.select-none > div.border-b > div.shrink-0 > input",
"boundingRect": {
"top": 4415,
"left": 333,
"right": 357,
"width": 24,
"bottom": 4431,
"height": 16
}
}
},
{
"relatedNode": {
"lhId": "1-2-INPUT",
"path": "1,HTML,1,BODY,6,DIV,0,DIV,0,DIV,1,DIV,3,DIV,1,DIV,0,DIV,2,DIV,1,DIV,0,INPUT",
"type": "node",
"snippet": "<input type=\"checkbox\" aria-labelledby=\"plugins-kanban\">",
"selector": "div.select-none > div.border-b > div.ms-auto > input",
"nodeLabel": "div.select-none > div.border-b > div.ms-auto > input",
"boundingRect": {
"top": 4488,
"left": 333,
"right": 357,
"width": 24,
"bottom": 4504,
"height": 16
}
}
},
{
"relatedNode": {
"lhId": "1-3-INPUT",
"path": "1,HTML,1,BODY,6,DIV,0,DIV,0,DIV,1,DIV,3,DIV,1,DIV,0,DIV,3,DIV,1,DIV,0,INPUT",
"type": "node",
"snippet": "<input type=\"checkbox\" aria-labelledby=\"plugins-dataview\">",
"selector": "div.select-none > div.border-b > div.ms-auto > input",
"nodeLabel": "div.select-none > div.border-b > div.ms-auto > input",
"boundingRect": {
"top": 4561,
"left": 333,
"right": 357,
"width": 24,
"bottom": 4577,
"height": 16
}
}
}
]
}
}
],
"headings": [
{
"key": "node",
"label": "Failing Elements",
"valueType": "node",
"subItemsHeading": {
"key": "relatedNode",
"valueType": "node"
}
}
],
"debugData": {
"tags": [
"cat.name-role-value",
"wcag2a",
"wcag412",
"TTv5",
"TT6.a",
"EN-301-549",
"EN-9.4.1.2",
"RGAAv4",
"RGAA-10.8.1"
],
"type": "debugdata",
"impact": "serious"
}
}Low-contrast text is difficult or impossible for many users to read. Learn how to provide sufficient color contrast.
{
"type": "table",
"items": [
{
"node": {
"lhId": "1-4-DIV",
"path": "1,HTML,1,BODY,7,DIV,0,DIV,0,DIV,1,DIV,5,DIV,0,DIV,0,DIV,1,DIV,0,DIV,0,DIV",
"type": "node",
"snippet": "<div class=\"flex-1 rounded-lg px-3 py-2 text-sm border border-gray-200 text-gray-400\">",
"selector": "div.ui > div.py-4 > div.flex > div.flex-1",
"nodeLabel": "Invite by email...",
"explanation": "Fix any of the following:\n Element has insufficient color contrast of 2.52 (foreground color: #a3a3a3, background color: #ffffff, font size: 10.5pt (14px), font weight: normal). Expected contrast ratio of 4.5:1",
"boundingRect": {
"top": 5465,
"left": 77,
"right": 359,
"width": 283,
"bottom": 5503,
"height": 38
}
},
"subItems": {
"type": "subitems",
"items": [
{
"relatedNode": {
"lhId": "1-5-DIV",
"path": "1,HTML,1,BODY,7,DIV,0,DIV,0,DIV,1,DIV,5,DIV,0,DIV,0,DIV",
"type": "node",
"snippet": "<div class=\"ui ui-light rounded-ss-xl shadow-xl pt-8 ps-8 pe-8 bg-white\" style=\"min-height: 400px; height: 100%;\">",
"selector": "div.tab-content > div.tab-pane > div.mx-auto > div.ui",
"nodeLabel": "Shared vaults\nInvite by email...\nEX\nErica Xu\nOwner\nSA\nSteph Ango\nCan edit\nLC\nLi…",
"boundingRect": {
"top": 5372,
"left": 45,
"right": 391,
"width": 347,
"bottom": 5772,
"height": 400
}
}
}
]
}
},
{
"node": {
"lhId": "1-6-DIV",
"path": "1,HTML,1,BODY,7,DIV,0,DIV,0,DIV,1,DIV,5,DIV,0,DIV,0,DIV,1,DIV,1,DIV,0,DIV",
"type": "node",
"snippet": "<div class=\"w-8 h-8 rounded-full flex items-center justify-center text-xs font-semibol…\">",
"selector": "div.ui > div.py-4 > div.flex > div.w-8",
"nodeLabel": "EX",
"explanation": "Fix any of the following:\n Element has insufficient color contrast of 4.46 (foreground color: #ffffff, background color: #6366f1, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1",
"boundingRect": {
"top": 5532,
"left": 77,
"right": 109,
"width": 32,
"bottom": 5564,
"height": 32
}
}
},
{
"node": {
"lhId": "1-7-DIV",
"path": "1,HTML,1,BODY,7,DIV,0,DIV,0,DIV,1,DIV,5,DIV,0,DIV,0,DIV,1,DIV,1,DIV,2,DIV",
"type": "node",
"snippet": "<div class=\"text-xs text-gray-400\">",
"selector": "div.ui > div.py-4 > div.flex > div.text-xs",
"nodeLabel": "Owner",
"explanation": "Fix any of the following:\n Element has insufficient color contrast of 2.52 (foreground color: #a3a3a3, background color: #ffffff, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1",
"boundingRect": {
"top": 5540,
"left": 322,
"right": 359,
"width": 37,
"bottom": 5556,
"height": 16
}
},
"subItems": {
"type": "subitems",
"items": [
{
"relatedNode": {
"lhId": "1-5-DIV",
"path": "1,HTML,1,BODY,7,DIV,0,DIV,0,DIV,1,DIV,5,DIV,0,DIV,0,DIV",
"type": "node",
"snippet": "<div class=\"ui ui-light rounded-ss-xl shadow-xl pt-8 ps-8 pe-8 bg-white\" style=\"min-height: 400px; height: 100%;\">",
"selector": "div.tab-content > div.tab-pane > div.mx-auto > div.ui",
"nodeLabel": "Shared vaults\nInvite by email...\nEX\nErica Xu\nOwner\nSA\nSteph Ango\nCan edit\nLC\nLi…",
"boundingRect": {
"top": 5372,
"left": 45,
"right": 391,
"width": 347,
"bottom": 5772,
"height": 400
}
}
}
]
}
},
{
"node": {
"lhId": "1-8-DIV",
"path": "1,HTML,1,BODY,7,DIV,0,DIV,0,DIV,1,DIV,5,DIV,0,DIV,0,DIV,1,DIV,2,DIV,0,DIV",
"type": "node",
"snippet": "<div class=\"w-8 h-8 rounded-full flex items-center justify-center text-xs font-semibol…\" style=\"background: hsl(258,88%,66%);\">",
"selector": "div.ui > div.py-4 > div.flex > div.w-8",
"nodeLabel": "SA",
"explanation": "Fix any of the following:\n Element has insufficient color contrast of 4.25 (foreground color: #ffffff, background color: #8a5cf5, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1",
"boundingRect": {
"top": 5589,
"left": 77,
"right": 109,
"width": 32,
"bottom": 5621,
"height": 32
}
}
},
{
"node": {
"lhId": "1-9-DIV",
"path": "1,HTML,1,BODY,7,DIV,0,DIV,0,DIV,1,DIV,5,DIV,0,DIV,0,DIV,1,DIV,2,DIV,2,DIV",
"type": "node",
"snippet": "<div class=\"text-xs text-gray-400\">",
"selector": "div.ui > div.py-4 > div.flex > div.text-xs",
"nodeLabel": "Can edit",
"explanation": "Fix any of the following:\n Element has insufficient color contrast of 2.52 (foreground color: #a3a3a3, background color: #ffffff, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1",
"boundingRect": {
"top": 5597,
"left": 312,
"right": 359,
"width": 47,
"bottom": 5613,
"height": 16
}
},
"subItems": {
"type": "subitems",
"items": [
{
"relatedNode": {
"lhId": "1-5-DIV",
"path": "1,HTML,1,BODY,7,DIV,0,DIV,0,DIV,1,DIV,5,DIV,0,DIV,0,DIV",
"type": "node",
"snippet": "<div class=\"ui ui-light rounded-ss-xl shadow-xl pt-8 ps-8 pe-8 bg-white\" style=\"min-height: 400px; height: 100%;\">",
"selector": "div.tab-content > div.tab-pane > div.mx-auto > div.ui",
"nodeLabel": "Shared vaults\nInvite by email...\nEX\nErica Xu\nOwner\nSA\nSteph Ango\nCan edit\nLC\nLi…",
"boundingRect": {
"top": 5372,
"left": 45,
"right": 391,
"width": 347,
"bottom": 5772,
"height": 400
}
}
}
]
}
},
{
"node": {
"lhId": "1-10-DIV",
"path": "1,HTML,1,BODY,7,DIV,0,DIV,0,DIV,1,DIV,5,DIV,0,DIV,0,DIV,1,DIV,3,DIV,0,DIV",
"type": "node",
"snippet": "<div class=\"w-8 h-8 rounded-full flex items-center justify-center text-xs font-semibol…\">",
"selector": "div.ui > div.py-4 > div.flex > div.w-8",
"nodeLabel": "LC",
"explanation": "Fix any of the following:\n Element has insufficient color contrast of 2.27 (foreground color: #ffffff, background color: #22c55e, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1",
"boundingRect": {
"top": 5646,
"left": 77,
"right": 109,
"width": 32,
"bottom": 5678,
"height": 32
}
}
},
{
"node": {
"lhId": "1-11-DIV",
"path": "1,HTML,1,BODY,7,DIV,0,DIV,0,DIV,1,DIV,5,DIV,0,DIV,0,DIV,1,DIV,3,DIV,2,DIV",
"type": "node",
"snippet": "<div class=\"text-xs text-gray-400\">",
"selector": "div.ui > div.py-4 > div.flex > div.text-xs",
"nodeLabel": "Can edit",
"explanation": "Fix any of the following:\n Element has insufficient color contrast of 2.52 (foreground color: #a3a3a3, background color: #ffffff, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1",
"boundingRect": {
"top": 5654,
"left": 312,
"right": 359,
"width": 47,
"bottom": 5670,
"height": 16
}
},
"subItems": {
"type": "subitems",
"items": [
{
"relatedNode": {
"lhId": "1-5-DIV",
"path": "1,HTML,1,BODY,7,DIV,0,DIV,0,DIV,1,DIV,5,DIV,0,DIV,0,DIV",
"type": "node",
"snippet": "<div class=\"ui ui-light rounded-ss-xl shadow-xl pt-8 ps-8 pe-8 bg-white\" style=\"min-height: 400px; height: 100%;\">",
"selector": "div.tab-content > div.tab-pane > div.mx-auto > div.ui",
"nodeLabel": "Shared vaults\nInvite by email...\nEX\nErica Xu\nOwner\nSA\nSteph Ango\nCan edit\nLC\nLi…",
"boundingRect": {
"top": 5372,
"left": 45,
"right": 391,
"width": 347,
"bottom": 5772,
"height": 400
}
}
}
]
}
},
{
"node": {
"lhId": "1-12-DIV",
"path": "1,HTML,1,BODY,7,DIV,0,DIV,0,DIV,1,DIV,5,DIV,0,DIV,0,DIV,1,DIV,4,DIV,0,DIV",
"type": "node",
"snippet": "<div class=\"w-8 h-8 rounded-full flex items-center justify-center text-xs font-semibol…\">",
"selector": "div.ui > div.py-4 > div.flex > div.w-8",
"nodeLabel": "TG",
"explanation": "Fix any of the following:\n Element has insufficient color contrast of 2.76 (foreground color: #ffffff, background color: #f87171, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1",
"boundingRect": {
"top": 5703,
"left": 77,
"right": 109,
"width": 32,
"bottom": 5735,
"height": 32
}
}
},
{
"node": {
"lhId": "1-13-DIV",
"path": "1,HTML,1,BODY,7,DIV,0,DIV,0,DIV,1,DIV,5,DIV,0,DIV,0,DIV,1,DIV,4,DIV,2,DIV",
"type": "node",
"snippet": "<div class=\"text-xs text-gray-400\">",
"selector": "div.ui > div.py-4 > div.flex > div.text-xs",
"nodeLabel": "Can edit",
"explanation": "Fix any of the following:\n Element has insufficient color contrast of 2.52 (foreground color: #a3a3a3, background color: #ffffff, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1",
"boundingRect": {
"top": 5711,
"left": 312,
"right": 359,
"width": 47,
"bottom": 5727,
"height": 16
}
},
"subItems": {
"type": "subitems",
"items": [
{
"relatedNode": {
"lhId": "1-5-DIV",
"path": "1,HTML,1,BODY,7,DIV,0,DIV,0,DIV,1,DIV,5,DIV,0,DIV,0,DIV",
"type": "node",
"snippet": "<div class=\"ui ui-light rounded-ss-xl shadow-xl pt-8 ps-8 pe-8 bg-white\" style=\"min-height: 400px; height: 100%;\">",
"selector": "div.tab-content > div.tab-pane > div.mx-auto > div.ui",
"nodeLabel": "Shared vaults\nInvite by email...\nEX\nErica Xu\nOwner\nSA\nSteph Ango\nCan edit\nLC\nLi…",
"boundingRect": {
"top": 5372,
"left": 45,
"right": 391,
"width": 347,
"bottom": 5772,
"height": 400
}
}
}
]
}
}
],
"headings": [
{
"key": "node",
"label": "Failing Elements",
"valueType": "node",
"subItemsHeading": {
"key": "relatedNode",
"valueType": "node"
}
}
],
"debugData": {
"tags": [
"cat.color",
"wcag2aa",
"wcag143",
"TTv5",
"TT13.c",
"EN-301-549",
"EN-9.1.4.3",
"ACT",
"RGAAv4",
"RGAA-3.2.1"
],
"type": "debugdata",
"impact": "serious"
}
}When definition lists are not properly marked up, screen readers may produce confusing or inaccurate output. Learn how to structure definition lists correctly.
{
"type": "table",
"items": [
{
"node": {
"lhId": "1-14-DL",
"path": "1,HTML,1,BODY,8,DIV,0,DIV,0,DIV,1,DL",
"type": "node",
"snippet": "<dl class=\"col-span-2 grid grid-cols-1 gap-y-8 gap-x-12 sm:grid-cols-3\">",
"selector": "div.py-16 > div.container > div.mx-auto > dl.col-span-2",
"nodeLabel": "Seamless editing. Publish your notes instantly from the Obsidian app, and make …",
"explanation": "Fix all of the following:\n dl element has direct children that are not allowed: div > div",
"boundingRect": {
"top": 6088,
"left": 21,
"right": 391,
"width": 371,
"bottom": 6460,
"height": 372
}
},
"subItems": {
"type": "subitems",
"items": [
{
"relatedNode": {
"lhId": "1-15-DIV",
"path": "1,HTML,1,BODY,8,DIV,0,DIV,0,DIV,1,DL,0,DIV,0,DIV",
"type": "node",
"snippet": "<div>",
"selector": "div.mx-auto > dl.col-span-2 > div.text-lg > div",
"nodeLabel": "div.mx-auto > dl.col-span-2 > div.text-lg > div",
"boundingRect": {
"top": 6088,
"left": 21,
"right": 45,
"width": 24,
"bottom": 6200,
"height": 112
}
}
},
{
"relatedNode": {
"lhId": "1-16-DIV",
"path": "1,HTML,1,BODY,8,DIV,0,DIV,0,DIV,1,DL,0,DIV,1,DIV",
"type": "node",
"snippet": "<div>",
"selector": "div.mx-auto > dl.col-span-2 > div.text-lg > div",
"nodeLabel": "Seamless editing. Publish your notes instantly from the Obsidian app, and make …",
"boundingRect": {
"top": 6088,
"left": 57,
"right": 391,
"width": 335,
"bottom": 6200,
"height": 112
}
}
},
{
"relatedNode": {
"lhId": "1-17-DIV",
"path": "1,HTML,1,BODY,8,DIV,0,DIV,0,DIV,1,DL,1,DIV,0,DIV",
"type": "node",
"snippet": "<div>",
"selector": "div.mx-auto > dl.col-span-2 > div.text-lg > div",
"nodeLabel": "div.mx-auto > dl.col-span-2 > div.text-lg > div",
"boundingRect": {
"top": 6232,
"left": 21,
"right": 45,
"width": 24,
"bottom": 6316,
"height": 84
}
}
}
]
}
}
],
"headings": [
{
"key": "node",
"label": "Failing Elements",
"valueType": "node",
"subItemsHeading": {
"key": "relatedNode",
"valueType": "node"
}
}
],
"debugData": {
"tags": [
"cat.structure",
"wcag2a",
"wcag131",
"EN-301-549",
"EN-9.1.3.1",
"RGAAv4",
"RGAA-9.3.3"
],
"type": "debugdata",
"impact": "serious"
}
}Definition list items (`<dt>` and `<dd>`) must be wrapped in a parent `<dl>` element to ensure that screen readers can properly announce them. Learn how to structure definition lists correctly.
{
"type": "table",
"items": [
{
"node": {
"lhId": "1-18-DT",
"path": "1,HTML,1,BODY,8,DIV,0,DIV,0,DIV,1,DL,0,DIV,1,DIV,0,DT",
"type": "node",
"snippet": "<dt class=\"font-semibold inline sm:block\">",
"selector": "dl.col-span-2 > div.text-lg > div > dt.font-semibold",
"nodeLabel": "Seamless editing. ",
"explanation": "Fix any of the following:\n Description list item does not have a <dl> parent element",
"boundingRect": {
"top": 6091,
"left": 57,
"right": 210,
"width": 153,
"bottom": 6112,
"height": 21
}
}
},
{
"node": {
"lhId": "1-19-DD",
"path": "1,HTML,1,BODY,8,DIV,0,DIV,0,DIV,1,DL,0,DIV,1,DIV,1,DD",
"type": "node",
"snippet": "<dd class=\"mt-2 text-lg leading-6 text-muted inline sm:block\">",
"selector": "dl.col-span-2 > div.text-lg > div > dd.mt-2",
"nodeLabel": "Publish your notes instantly from the Obsidian app, and make it easy for reader…",
"explanation": "Fix any of the following:\n Description list item does not have a <dl> parent element",
"boundingRect": {
"top": 6091,
"left": 57,
"right": 372,
"width": 316,
"bottom": 6196,
"height": 105
}
}
},
{
"node": {
"lhId": "1-20-DT",
"path": "1,HTML,1,BODY,8,DIV,0,DIV,0,DIV,1,DL,1,DIV,1,DIV,0,DT",
"type": "node",
"snippet": "<dt class=\"font-semibold inline sm:block\">",
"selector": "dl.col-span-2 > div.text-lg > div > dt.font-semibold",
"nodeLabel": "Customization. ",
"explanation": "Fix any of the following:\n Description list item does not have a <dl> parent element",
"boundingRect": {
"top": 6235,
"left": 57,
"right": 188,
"width": 131,
"bottom": 6256,
"height": 21
}
}
},
{
"node": {
"lhId": "1-21-DD",
"path": "1,HTML,1,BODY,8,DIV,0,DIV,0,DIV,1,DL,1,DIV,1,DIV,1,DD",
"type": "node",
"snippet": "<dd class=\"mt-2 text-lg leading-6 text-muted inline sm:block\">",
"selector": "dl.col-span-2 > div.text-lg > div > dd.mt-2",
"nodeLabel": "Control the look and feel of your site with themes, custom domains, password pr…",
"explanation": "Fix any of the following:\n Description list item does not have a <dl> parent element",
"boundingRect": {
"top": 6235,
"left": 57,
"right": 388,
"width": 332,
"bottom": 6312,
"height": 77
}
}
},
{
"node": {
"lhId": "1-22-DT",
"path": "1,HTML,1,BODY,8,DIV,0,DIV,0,DIV,1,DL,2,DIV,1,DIV,0,DT",
"type": "node",
"snippet": "<dt class=\"font-semibold inline sm:block\">",
"selector": "dl.col-span-2 > div.text-lg > div > dt.font-semibold",
"nodeLabel": "Optimized for performance. ",
"explanation": "Fix any of the following:\n Description list item does not have a <dl> parent element",
"boundingRect": {
"top": 6351,
"left": 57,
"right": 294,
"width": 237,
"bottom": 6372,
"height": 21
}
}
},
{
"node": {
"lhId": "1-23-DD",
"path": "1,HTML,1,BODY,8,DIV,0,DIV,0,DIV,1,DL,2,DIV,1,DIV,1,DD",
"type": "node",
"snippet": "<dd class=\"mt-2 text-lg leading-6 text-muted inline sm:block\">",
"selector": "dl.col-span-2 > div.text-lg > div > dd.mt-2",
"nodeLabel": "Obsidian Publish sites are fast, mobile-friendly, and optimized for SEO, no con…",
"explanation": "Fix any of the following:\n Description list item does not have a <dl> parent element",
"boundingRect": {
"top": 6379,
"left": 57,
"right": 368,
"width": 312,
"bottom": 6456,
"height": 77
}
}
}
],
"headings": [
{
"key": "node",
"label": "Failing Elements",
"valueType": "node",
"subItemsHeading": {
"key": "relatedNode",
"valueType": "node"
}
}
],
"debugData": {
"tags": [
"cat.structure",
"wcag2a",
"wcag131",
"EN-301-549",
"EN-9.1.3.1",
"RGAAv4",
"RGAA-9.3.3"
],
"type": "debugdata",
"impact": "serious"
}
}One main landmark helps screen reader users navigate a web page. Learn more about landmarks.
{
"type": "table",
"items": [
{
"node": {
"lhId": "1-24-HTML",
"path": "1,HTML",
"type": "node",
"snippet": "<html lang=\"en\" dir=\"ltr\">",
"selector": "html",
"nodeLabel": "html",
"explanation": "Fix all of the following:\n Document does not have a main landmark",
"boundingRect": {
"top": 0,
"left": 0,
"right": 412,
"width": 412,
"bottom": 9015,
"height": 9015
}
}
}
],
"headings": [
{
"key": "node",
"label": "Failing Elements",
"valueType": "node",
"subItemsHeading": {
"key": "relatedNode",
"valueType": "node"
}
}
],
"debugData": {
"tags": [
"cat.semantics",
"best-practice"
],
"type": "debugdata",
"impact": "moderate"
}
}Est savings of 6 KiB
Minifying CSS files can reduce network payload sizes. Learn how to minify CSS.
{
"type": "opportunity",
"items": [
{
"url": "https://obsidian.md/tailwind.css?v=9d5102ea",
"totalBytes": 34658,
"wastedBytes": 6132,
"wastedPercent": 17.69277689235189
}
],
"headings": [
{
"key": "url",
"label": "URL",
"valueType": "url"
},
{
"key": "totalBytes",
"label": "Transfer Size",
"valueType": "bytes"
},
{
"key": "wastedBytes",
"label": "Est Savings",
"valueType": "bytes"
}
],
"sortedBy": [
"wastedBytes"
],
"debugData": {
"type": "debugdata",
"metricSavings": {
"FCP": 0,
"LCP": 0
}
},
"overallSavingsMs": 0,
"overallSavingsBytes": 6132
}Est savings of 18 KiB
Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. Learn how to reduce unused CSS.
{
"type": "opportunity",
"items": [
{
"url": "https://obsidian.md/tailwind.css?v=9d5102ea",
"totalBytes": 27391,
"wastedBytes": 18476,
"wastedPercent": 67.45305603106205
}
],
"headings": [
{
"key": "url",
"label": "URL",
"valueType": "url"
},
{
"key": "totalBytes",
"label": "Transfer Size",
"valueType": "bytes"
},
{
"key": "wastedBytes",
"label": "Est Savings",
"valueType": "bytes"
}
],
"sortedBy": [
"wastedBytes"
],
"debugData": {
"type": "debugdata",
"metricSavings": {
"FCP": 270,
"LCP": 300
}
},
"overallSavingsMs": 300,
"overallSavingsBytes": 18476
}Est savings of 86 KiB
Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. Learn how to reduce unused JavaScript.
{
"type": "opportunity",
"items": [
{
"url": "https://obsidian.md/pixi.min.js",
"totalBytes": 145292,
"wastedBytes": 88404,
"wastedPercent": 60.845515201907055
}
],
"headings": [
{
"key": "url",
"label": "URL",
"valueType": "url",
"subItemsHeading": {
"key": "source",
"valueType": "code"
}
},
{
"key": "totalBytes",
"label": "Transfer Size",
"valueType": "bytes",
"subItemsHeading": {
"key": "sourceBytes"
}
},
{
"key": "wastedBytes",
"label": "Est Savings",
"valueType": "bytes",
"subItemsHeading": {
"key": "sourceWastedBytes"
}
}
],
"sortedBy": [
"wastedBytes"
],
"debugData": {
"type": "debugdata",
"metricSavings": {
"FCP": 0,
"LCP": 0
}
},
"overallSavingsMs": 0,
"overallSavingsBytes": 88404
}Est savings of 459 KiB
A long cache lifetime can speed up repeat visits to your page. Learn more about caching.
{
"type": "table",
"items": [
{
"url": "https://obsidian.md/images/publish-example-dark.png",
"totalBytes": 213853,
"wastedBytes": 196031.91666666666,
"cacheLifetimeMs": 600000
},
{
"url": "https://obsidian.md/pixi.min.js",
"totalBytes": 145755,
"wastedBytes": 133608.75,
"cacheLifetimeMs": 600000
},
{
"url": "https://obsidian.md/images/home-wiki-hume.png",
"totalBytes": 49269,
"wastedBytes": 45163.25,
"cacheLifetimeMs": 600000
},
{
"url": "https://obsidian.md/tailwind.css?v=9d5102ea",
"totalBytes": 34658,
"wastedBytes": 31769.833333333332,
"cacheLifetimeMs": 600000
},
{
"url": "https://obsidian.md/images/home-spinoza.png",
"totalBytes": 33565,
"wastedBytes": 30767.916666666664,
"cacheLifetimeMs": 600000
},
{
"url": "https://obsidian.md/static.js?v=aa730ae0",
"totalBytes": 15886,
"wastedBytes": 14562.166666666666,
"cacheLifetimeMs": 600000
},
{
"url": "https://obsidian.md/graph.js?v=2",
"totalBytes": 10219,
"wastedBytes": 9367.416666666666,
"cacheLifetimeMs": 600000
},
{
"url": "https://obsidian.md/images/home-descartes.jpg",
"totalBytes": 6001,
"wastedBytes": 5500.916666666666,
"cacheLifetimeMs": 600000
},
{
"url": "https://obsidian.md/images/obsidian-logo-gradient.svg",
"totalBytes": 2050,
"wastedBytes": 1879.1666666666665,
"cacheLifetimeMs": 600000
},
{
"url": "https://obsidian.md/download.js",
"totalBytes": 1313,
"wastedBytes": 1203.5833333333333,
"cacheLifetimeMs": 600000
}
],
"headings": [
{
"key": "url",
"label": "Request",
"valueType": "url"
},
{
"key": "cacheLifetimeMs",
"label": "Cache TTL",
"valueType": "ms",
"displayUnit": "duration"
},
{
"key": "totalBytes",
"label": "Transfer Size",
"valueType": "bytes",
"displayUnit": "kb",
"granularity": 1
}
],
"sortedBy": [
"wastedBytes"
],
"debugData": {
"type": "debugdata",
"wastedBytes": 469854.9166666667
},
"skipSumming": [
"cacheLifetimeMs"
]
}Est savings of 273 KiB
Reducing the download time of images can improve the perceived load time of the page and LCP. Learn more about optimizing image size
{
"type": "table",
"items": [
{
"url": "https://obsidian.md/images/publish-example-dark.png",
"node": {
"lhId": "page-0-IMG",
"path": "1,HTML,1,BODY,8,DIV,1,DIV,0,DIV,0,DIV,0,IMG",
"type": "node",
"snippet": "<img src=\"/images/publish-example-dark.png\" alt=\"Example of Obsidian Help site powered by Obsidian Publish\" class=\"mb-[-12%] rounded-xl shadow-2xl ring-1 ring-white/20\" width=\"2899\" height=\"1757\">",
"selector": "div.relative > div.container > div.w-[48rem] > img.mb-[-12%]",
"nodeLabel": "Example of Obsidian Help site powered by Obsidian Publish",
"boundingRect": {
"top": 6524,
"left": 21,
"right": 789,
"width": 768,
"bottom": 6990,
"height": 465
}
},
"subItems": {
"type": "subitems",
"items": [
{
"reason": "This image file is larger than it needs to be (2899x1757) for its displayed dimensions (768x465). Use responsive images to reduce the image download size.",
"wastedBytes": 198142
}
]
},
"totalBytes": 213097,
"wastedBytes": 198142
},
{
"url": "https://obsidian.md/images/home-wiki-hume.png",
"node": {
"lhId": "page-1-IMG",
"path": "1,HTML,1,BODY,6,DIV,0,DIV,0,DIV,1,DIV,2,DIV,1,DIV,0,DIV,8,DIV,0,IMG",
"type": "node",
"snippet": "<img src=\"/images/home-wiki-hume.png\" width=\"120\" height=\"200\" alt=\"Wikipedia page about David Hume embedded in Obsidian Canvas\" class=\"max-w-none\">",
"selector": "div.md:h-96 > div.mock-mirror > div.bg-white > img.max-w-none",
"nodeLabel": "Wikipedia page about David Hume embedded in Obsidian Canvas",
"boundingRect": {
"top": 3743,
"left": 382,
"right": 502,
"width": 120,
"bottom": 3943,
"height": 200
}
},
"subItems": {
"type": "subitems",
"items": [
{
"reason": "Using a modern image format (WebP, AVIF) or increasing the image compression could improve this image's download size.",
"wastedBytes": 23828
},
{
"reason": "This image file is larger than it needs to be (300x500) for its displayed dimensions (120x200). Use responsive images to reduce the image download size.",
"wastedBytes": 41016
}
]
},
"totalBytes": 48828,
"wastedBytes": 44828
},
{
"url": "https://obsidian.md/images/home-spinoza.png",
"node": {
"lhId": "page-2-IMG",
"path": "1,HTML,1,BODY,6,DIV,0,DIV,0,DIV,1,DIV,2,DIV,1,DIV,0,DIV,7,DIV,0,IMG",
"type": "node",
"snippet": "<img src=\"/images/home-spinoza.png\" width=\"68\" height=\"83\" alt=\"Image of Baruch Spinoza embedded in Obsidian Canvas\" class=\"max-w-none\">",
"selector": "div.md:h-96 > div.mock-mirror > div.cursor-grab > img.max-w-none",
"nodeLabel": "Image of Baruch Spinoza embedded in Obsidian Canvas",
"boundingRect": {
"top": 3948,
"left": 347,
"right": 415,
"width": 68,
"bottom": 4032,
"height": 83
}
},
"subItems": {
"type": "subitems",
"items": [
{
"reason": "Using a modern image format (WebP, AVIF) or increasing the image compression could improve this image's download size.",
"wastedBytes": 24748
},
{
"reason": "This image file is larger than it needs to be (200x245) for its displayed dimensions (68x83). Use responsive images to reduce the image download size.",
"wastedBytes": 29110
}
]
},
"totalBytes": 32915,
"wastedBytes": 31971
},
{
"url": "https://obsidian.md/images/home-descartes.jpg",
"node": {
"lhId": "page-3-IMG",
"path": "1,HTML,1,BODY,6,DIV,0,DIV,0,DIV,1,DIV,2,DIV,1,DIV,0,DIV,6,DIV,0,IMG",
"type": "node",
"snippet": "<img src=\"/images/home-descartes.jpg\" width=\"68\" height=\"83\" alt=\"Image of Rene Descartes embedded in Obsidian Canvas\" class=\"max-w-none\">",
"selector": "div.md:h-96 > div.mock-mirror > div.cursor-grab > img.max-w-none",
"nodeLabel": "Image of Rene Descartes embedded in Obsidian Canvas",
"boundingRect": {
"top": 3948,
"left": 267,
"right": 335,
"width": 68,
"bottom": 4032,
"height": 83
}
},
"subItems": {
"type": "subitems",
"items": [
{
"reason": "This image file is larger than it needs to be (200x245) for its displayed dimensions (68x83). Use responsive images to reduce the image download size.",
"wastedBytes": 4856
}
]
},
"totalBytes": 5491,
"wastedBytes": 4856
}
],
"headings": [
{
"key": "node",
"label": "",
"valueType": "node"
},
{
"key": "url",
"label": "URL",
"valueType": "url",
"subItemsHeading": {
"key": "reason",
"valueType": "text"
}
},
{
"key": "totalBytes",
"label": "Resource Size",
"valueType": "bytes"
},
{
"key": "wastedBytes",
"label": "Est Savings",
"valueType": "bytes",
"subItemsHeading": {
"key": "wastedBytes",
"valueType": "bytes"
}
}
],
"debugData": {
"type": "debugdata",
"wastedBytes": 279797
}
}{
"finalUrl": "https://obsidian.md/",
"userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/151.0.0.0 Safari/537.36",
"formFactor": "mobile",
"throttlingMethod": "simulate",
"throttling": {
"rttMs": 150,
"throughputKbps": 1638.4,
"requestLatencyMs": 562.5,
"uploadThroughputKbps": 675,
"cpuSlowdownMultiplier": 4,
"downloadThroughputKbps": 1474.5600000000002
},
"metrics": [
{
"id": "largest-contentful-paint",
"unit": "millisecond",
"value": 2591.8465
},
{
"id": "cumulative-layout-shift",
"unit": "unitless",
"value": 0.0004326092795076125
},
{
"id": "total-blocking-time",
"unit": "millisecond",
"value": 132.49999999999977
},
{
"id": "first-contentful-paint",
"unit": "millisecond",
"value": 1250.8465
},
{
"id": "speed-index",
"unit": "millisecond",
"value": 1824.134038104359
}
]
}01 / WHAT WORKS
The note and graph share a frame, showing both writing and connected knowledge.
Purple actions echo the small brand mark while black, gray and white organize the rest.
02 / NEXT STEPS
The 390px capture retains macOS copy while alternate platforms are less visible; this capture uses a desktop browser identity and tests narrow layout only.
Keep a visible platform selector on narrow layouts and separately test download routing with actual iOS and Android user agents; width alone does not identify a device.
03 / DESIGN LANGUAGE
Background
#0f0f0fText
#eeeeeeParameters are element samples. Empty values are unknown, and individual samples are not site-wide rules.
04 / EVIDENCE
Values come from one capture. Fonts, radii and spacing are element samples, not a universal site-wide specification. Empty values are unknown. HTML bytes are source size, not compressed transfer size; script counts are DOM tags, not network requests.
The 390px capture retains macOS copy while alternate platforms are less visible; this capture uses a desktop browser identity and tests narrow layout only.
Keep a visible platform selector on narrow layouts and separately test download routing with actual iOS and Android user agents; width alone does not identify a device.
mobile.png: macOS download label at 390px
A CSP is the standard way to limit script sources. Vibe-coded pages often load anything, including injected scripts.
Start with a report-only CSP, then default-src 'self' and an explicit script-src.
content-security-policy missing

The free and flexible app for your private thoughts.
05 / MAKE IT HAPPEN
Use the improvement prompt for this page, or the design prompt to borrow its visual language. “Recreate” includes references and implementation steps. Paste either into your coding assistant.
Improve the current project using the 2026-09-05T03:24:48.360Z snapshot of https://obsidian.md. First identify changes since capture; do not revert newer behavior to the old snapshot.
Design baseline
Sharpen your thinking and a short privacy statement lead to a primary download action. The product visual combines sidebar, note, graph and phone, followed by local files, plugins, sync and publishing. Mobile preserves the headline and download while cropping the desktop interface. Adapt the dark tonal hierarchy and single accent color.
{
"colors": [
{
"role": "bg",
"hex": "#0f0f0f"
},
{
"role": "ink",
"hex": "#eeeeee"
}
],
"fonts": {
"body": "Inter",
"display": "Inter",
"stack": [
"ui-sans-serif"
]
},
"radius": {
"button": "8px",
"card": "",
"field": "0px"
},
"space": {
"section": "",
"card": ""
},
"type": {
"h1": "60px",
"body": "16px",
"weight": "600",
"lineHeight": "24px",
"letterSpacing": "-1.2px"
}
}
Values come from one capture. Fonts, radii and spacing are element samples, not a universal site-wide specification. Empty values are unknown. HTML bytes are source size, not compressed transfer size; script counts are DOM tags, not network requests.
Actions
1. Expose platform choices on narrow screens
Keep a visible platform selector on narrow layouts and separately test download routing with actual iOS and Android user agents; width alone does not identify a device.
Evidence: mobile.png: macOS download label at 390px
2. No Content-Security-Policy
Start with a report-only CSP, then default-src 'self' and an explicit script-src.
Evidence: content-security-policy missing
Acceptance
- Check text, layout and the main action “Get Obsidian for macOS” at 1440×900 and 390×844.
- Preserve branding, authentication and business behavior. A screenshot does not prove broken interaction.
- Change only evidence-backed issues. Validate security headers against existing resources and authentication in report-only mode where supported.
- Compare before/after screenshots and run relevant functional tests. Do not claim untested behavior passed.