PageSourceSearch

https://shkoliar.com/

html shkoliar.com collected 2026-10-04 19:30:21 UTC 43,454 bytes, 103 lines download raw bytes

1<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="ie=edge"/><meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"/><meta name="generator" content="Gatsby 5.13.7"/><meta name="theme-color" content="hsl(31, 92%, 62%)"/><meta name="description" content="Certified Senior Software Engineer and Technical Architect with 15+ years of experience in web and software development. Specializing in Adobe Commerce (Magento 2) and the surrounding tech stack. This website serves as a personal page and blog to share projects, insights, and technical findings." data-gatsby-head="true"/><meta name="twitter:card" content="summary_large_image" data-gatsby-head="true"/><meta name="twitter:title" content="Dmytro Shkoliar - Software Engineer and Technical Architect" data-gatsby-head="true"/><meta name="twitter:description" content="Certified Senior Software Engineer and Technical Architect with 15+ years of experience in web and software development. Specializing in Adobe Commerce (Magento 2) and the surrounding tech stack. This website serves as a personal page and blog to share projects, insights, and technical findings." data-gatsby-head="true"/><meta name="og:title" content="Dmytro Shkoliar - Software Engineer and Technical Architect" data-gatsby-head="true"/><meta name="og:type" content="website" data-gatsby-head="true"/><meta name="og:description" content="Certified Senior Software Engineer and Technical Architect with 15+ years of experience in web and software development. Specializing in Adobe Commerce (Magento 2) and the surrounding tech stack. This website serves as a personal page and blog to share projects, insights, and technical findings." data-gatsby-head="true"/><meta name="image" content="https://shkoliar.com/static/483d37df2f5854545c9aea921366af5f/photo.jpg" data-gatsby-head="true"/><meta name="og:image" content="https://shkoliar.com/static/483d37df2f5854545c9aea921366af5f/photo.jpg" data-gatsby-head="true"/><meta name="twitter:image" content="https://shkoliar.com/static/483d37df2f5854545c9aea921366af5f/photo.jpg" data-gatsby-head="true"/><style data-href="/styles.380b1626c15920ece7b5.css" data-identity="gatsby-global-css">:after,:before,:root{--color-white:#fff;--color-primary:#5c92ff;--color-secondary:#f7a145;--color-prism-background:#eaeaeb;--color-typographic-base-font:#242933;--color-typographic-link-p-font:#5c92ff;--color-typographic-link-s-font:#f7a145;--color-page-border:#eaeaeb;--color-page-background:#fff;--color-sidebar-border:#eaeaeb;--color-sidebar-border-fade:#fff;--color-contacts-border:#eaeaeb;--color-button-border:#eaeaeb;--color-button-color:#242933;--color-theme-switcher:#3f485a;--color-theme-switcher-hover:#5c92ff}.dark :after,.dark :before,:root.dark{--color-white:#fff;--color-primary:#5c92ff;--color-secondary:#f7a145;--color-prism-background:#191d24;--color-typographic-base-font:#fff;--color-typographic-link-p-font:#5c92ff;--color-typographic-link-s-font:#f7a145;--color-page-border:#3f485a;--color-page-background:#242933;--color-sidebar-border:#3f485a;--color-sidebar-border-fade:#242933;--color-contacts-border:#3f485a;--color-button-border:#3f485a;--color-button-color:#fff;--color-theme-switcher:#eaeaeb;--color-theme-switcher-hover:#5c92ff}html{font-size:100}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;background:var(--color-page-background);color:var(--color-typographic-base-font);font-size:16px;line-height:1.625;margin:0 0 0 calc(100vw - 100%);text-rendering:optimizelegibility}body,h1,h2,h3,h4,h5,h6{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif}h1,h2,h3,h4,h5,h6{font-weight:600}h1{font-size:40px;line-height:52px;margin-bottom:26px;margin-top:104px}h2{font-size:27px;line-height:39px}h2,h3{margin-bottom:13px;margin-top:52px}h3{font-size:22px;line-height:26px}h4{font-size:19.2px;margin-top:39px}h4,h5{line-height:26px;margin-bottom:13px}h5,h6{font-size:16px;margin-top:65px}h6{line-height:26px;margin-bottom:13px}img{max-width:100%}hr,img{border:0;display:block}hr{background-image:linear-gradient(to bottom,transparent 1px,transparent 11px,var(--color-button-color) 11px,var(--color-button-color) 15px,transparent 15px,transparent 26px);background-size:100% 26px;color:var(--color-typographic-base-font);height:26px;margin:52px auto;width:100px}a{color:var(--color-typographic-link-p-font);text-decoration:none}a:active,a:focus,a:hover{color:var(--color-typographic-link-s-font)}b,strong{font-weight:600}ul{list-style:square;margin-bottom:26px}ul li{margin-bottom:10px;padding:0 5px}p{line-height:26px;margin-bottom:26px}blockquote{font-style:italic;padding:0;text-align:center}figure{display:block;height:auto;width:100%}figcaption{color:var(--color-typographic-base-font);font-size:14px;font-style:italic;line-height:19.5px;margin-bottom:0;margin-top:6.5px;text-align:center}@media screen and (min-width:685px){figure.float-left,figure.float-right{max-width:310px;padding:0 26px}.float-right{float:right}.float-left{float:left}}code[class*=language-],pre[class*=language-]{word-wrap:normal;color:#657b83;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;-webkit-hyphens:none;hyphens:none;line-height:1.5;tab-size:4;text-align:left;white-space:pre;word-break:normal;word-spacing:normal}pre[class*=language-]{border-radius:.3em;margin:.5em 0;overflow:auto;padding:1em}:not(pre)>code[class*=language-],pre[class*=language-]{background-color:var(--color-prism-background)}:not(pre)>code[class*=language-]{border-radius:.3em;padding:.1em}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{background:#073642}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#93a1a1}.token.punctuation{color:#586e75}.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#268bd2}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string,.token.url{color:#2aa198}.token.entity{background:#eee8d5;color:#657b83;cursor:help}.token.atrule,.token.attr-value,.token.keyword{color:#859900}.token.class-name,.token.function{color:#b58900}.token.important,.token.regex,.token.variable{color:#cb4b16}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.Feed-module--feed--a6204 .Feed-module--item--c7a63{margin-bottom:32.5px}
1.Feed-module--feed--a6204 .Feed-module--item--c7a63:last-child{margin-bottom:13px}.Feed-module--feed--a6204 .Feed-module--item--c7a63 .Feed-module--title--f252f{font-size:27px;line-height:39px;margin-bottom:13px;margin-top:0}.Feed-module--feed--a6204 .Feed-module--item--c7a63 .Feed-module--title--f252f .Feed-module--link--6123b{color:var(--color-typographic-base-font)}.Feed-module--feed--a6204 .Feed-module--item--c7a63 .Feed-module--title--f252f .Feed-module--link--6123b:focus,.Feed-module--feed--a6204 .Feed-module--item--c7a63 .Feed-module--title--f252f .Feed-module--link--6123b:hover{border-bottom:1px solid #242933;color:var(--color-typographic-base-font)}.Feed-module--feed--a6204 .Feed-module--item--c7a63 .Feed-module--description--57348{font-size:16px;line-height:26px;margin-bottom:19.5px}.Feed-module--feed--a6204 .Feed-module--item--c7a63 .Feed-module--meta--250c2 .Feed-module--time--72864{color:var(--color-typographic-base-font);font-size:14px;font-weight:600;text-transform:uppercase}.Feed-module--feed--a6204 .Feed-module--item--c7a63 .Feed-module--meta--250c2 .Feed-module--divider--81a18{margin:0 13px}.Feed-module--feed--a6204 .Feed-module--item--c7a63 .Feed-module--meta--250c2 .Feed-module--category--59f58 .Feed-module--link--6123b{color:var(--color-secondary);font-size:14px;font-weight:600;text-transform:uppercase}.Feed-module--feed--a6204 .Feed-module--item--c7a63 .Feed-module--meta--250c2 .Feed-module--category--59f58 .Feed-module--link--6123b:focus,.Feed-module--feed--a6204 .Feed-module--item--c7a63 .Feed-module--meta--250c2 .Feed-module--category--59f58 .Feed-module--link--6123b:hover{color:#5c92ff}.Feed-module--feed--a6204 .Feed-module--item--c7a63 .Feed-module--more--51a4e{color:var(--color-primary);font-size:16px}.Feed-module--feed--a6204 .Feed-module--item--c7a63 .Feed-module--more--51a4e:focus,.Feed-module--feed--a6204 .Feed-module--item--c7a63 .Feed-module--more--51a4e:hover{border-bottom:1px solid #5c92ff;color:var(--color-primary)}.Layout-module--layout--2c933{margin-left:auto;margin-right:auto;max-width:1070px}.Layout-module--layout--2c933:before{content:"";display:table}.Layout-module--layout--2c933:after{clear:both;content:"";display:table}.Page-module--page--24e03{margin-bottom:52px}.Page-module--page--24e03 .Page-module--inner--4b31d{padding:26px 19.5px 0}.Page-module--page--24e03 .Page-module--title--90338{font-size:40px;font-weight:600;line-height:52px;margin-bottom:37.7px;margin-top:0}.Page-module--page--24e03 .Page-module--body--561c4{font-size:16px;line-height:26px;margin:0 0 26px}@media screen and (min-width:685px){.Page-module--page--24e03{width:calc(58.275% - 12.5px)}.Page-module--page--24e03:nth-child(1n){clear:none;float:left;margin-right:30px}.Page-module--page--24e03:last-child{margin-right:0}.Page-module--page--24e03:nth-child(12n){float:right;margin-right:0}.Page-module--page--24e03:nth-child(12n+1){clear:both}.Page-module--page--24e03 .Page-module--inner--4b31d{padding:32.5px 19.5px 0}}@media screen and (min-width:960px){.Page-module--page--24e03{width:calc(66.6% - 10px)}.Page-module--page--24e03:nth-child(1n){clear:none;float:left;margin-right:30px}.Page-module--page--24e03:last-child{margin-right:0}.Page-module--page--24e03:nth-child(3n){float:right;margin-right:0}.Page-module--page--24e03:nth-child(3n+1){clear:both}.Page-module--page--24e03 .Page-module--inner--4b31d{padding:39px 26px 0}}.Pagination-module--pagination--d61cb{display:flex;margin-top:52px}.Pagination-module--pagination--d61cb .Pagination-module--previous--4a76b{text-align:left;width:50%}.Pagination-module--pagination--d61cb .Pagination-module--previous--4a76b .Pagination-module--previousLink--5590d{color:var(--color-secondary);font-size:26px;font-weight:700}.Pagination-module--pagination--d61cb .Pagination-module--previous--4a76b .Pagination-module--previousLink--5590d:focus,.Pagination-module--pagination--d61cb .Pagination-module--previous--4a76b .Pagination-module--previousLink--5590d:hover{color:var(--color-primary)}.Pagination-module--pagination--d61cb .Pagination-module--previous--4a76b .Pagination-module--previousLink--5590d.Pagination-module--disable--7e105{color:#3f485a;pointer-events:none}.Pagination-module--pagination--d61cb .Pagination-module--next--1cab8{text-align:right;width:50%}.Pagination-module--pagination--d61cb .Pagination-module--next--1cab8 .Pagination-module--nextLink--532ff{color:var(--color-secondary);font-size:26px;font-weight:700}.Pagination-module--pagination--d61cb .Pagination-module--next--1cab8 .Pagination-module--nextLink--532ff:focus,.Pagination-module--pagination--d61cb .Pagination-module--next--1cab8 .Pagination-module--nextLink--532ff:hover{color:var(--color-primary)}.Pagination-module--pagination--d61cb .Pagination-module--next--1cab8 .Pagination-module--nextLink--532ff.Pagination-module--disable--7e105{color:#3f485a;pointer-events:none}.Author-module--author--cbd31 .Author-module--photo--9787b{background-clip:padding-box;border-radius:50%;display:inline-block;height:75px;margin-bottom:0;width:75px}.Author-module--author--cbd31 .Author-module--photo--9787b img{border-radius:50%}.Author-module--author--cbd31 .Author-module--title--cf7e5{font-size:34px;font-weight:600;line-height:55.25px;margin:0}.Author-module--author--cbd31 .Author-module--title--cf7e5 .Author-module--link--09c17,.Author-module--author--cbd31 .Author-module--title--cf7e5 .Author-module--link--09c17:focus,.Author-module--author--cbd31 .Author-module--title--cf7e5 .Author-module--link--09c17:hover{color:var(--color-typographic-base-font)}.Author-module--author--cbd31 .Author-module--subtitle--86ec5{color:#7f8ba4;line-height:26px;margin-bottom:26px}.Author-module--author--cbd31 .Author-module--photoContainer--30368{align-items:center;display:flex;justify-content:space-between}.Author-module--author--cbd31 .Author-module--titleContainer--4f576{margin:13px 0}.Button-module--button--b1113{border:1px solid var(--color-button-border);border-radius:20px;color:var(--color-button-color);display:inline-block;font-size:16px;font-weight:400;height:40px;line-height:40px;margin-left:auto;margin-right:auto;padding:0 26px;text-align:center;text-decoration:none}.Button-module--button--b1113:focus,.Button-module--button--b1113:hover{color:#5c92ff}.ThemeSwitcher-module--themeSwitcher--8a77f{--color:var(--color-theme-switcher)}.ThemeSwitcher-module--themeSwitcher--8a77f .ThemeSwitcher-module--button--7cb7b{align-items:center;background:transparent;border:0;cursor:pointer;display:flex;justify-content:center;outline:0}.ThemeSwitcher-module--themeSwitcher--8a77f .ThemeSwitcher-module--button--7cb7b svg{stroke:var(--color);pointer-events:none;transition:stroke .4s}.ThemeSwitcher-module--themeSwitcher--8a77f .ThemeSwitcher-module--button--7cb7b:hover{--color:var(--color-theme-switcher-hover)}.ThemeSwitcher-module--themeSwitcher--8a77f .ThemeSwitcher-module--moon--10537{stroke-dasharray:0 1px;opacity:0;transition:stroke-dasharray .2s ease-in,opacity .4s ease-in}.ThemeSwitcher-module--themeSwitcher--8a77f .ThemeSwitcher-module--sun--2163a{stroke-dasharray:1px 1px;opacity:1;transition:stroke-dasharray .2s ease-in,opacity .4s ease-in}.ThemeSwitcher-module--themeSwitcher--8a77f.ThemeSwitcher-module--dark--6db0c .ThemeSwitcher-module--moon--10537{stroke-dasharray:1px 1px;opacity:1}.ThemeSwitcher-module--themeSwitcher--8a77f.ThemeSwitcher-module--dark--6db0c .ThemeSwitcher-module--sun--2163a{stroke-dasharray:0 1px;opacity:0}
1.Icon-module--icon--1d7da{fill:currentcolor;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;speak:none;stroke:currentcolor;stroke-width:0;display:inline-block;font-style:normal;font-variant:normal;font-weight:400;height:1em;line-height:1em;text-align:center;text-transform:none;width:1em}.Contacts-module--contacts--09178{margin-bottom:26px}.Contacts-module--contacts--09178 .Contacts-module--list--9670b{display:flex;flex-flow:row wrap;flex-grow:0;flex-shrink:0;list-style:none;margin:13px 0;padding:0}.Contacts-module--contacts--09178 .Contacts-module--list--9670b .Contacts-module--item--f9cb0{align-content:center;align-items:center;border:1px solid var(--color-contacts-border);border-radius:50%;display:flex;height:40px;justify-content:center;line-height:40px;margin:6.5px;padding:0;text-align:center;width:40px}.Contacts-module--contacts--09178 .Contacts-module--list--9670b .Contacts-module--item--f9cb0:nth-child(3n+1){margin-left:0}.Contacts-module--contacts--09178 .Contacts-module--list--9670b .Contacts-module--item--f9cb0 .Contacts-module--link--de1e0{border:0;color:var(--color-typographic-base-font);cursor:pointer;display:flex}.Contacts-module--contacts--09178 .Contacts-module--list--9670b .Contacts-module--item--f9cb0 .Contacts-module--link--de1e0:focus,.Contacts-module--contacts--09178 .Contacts-module--list--9670b .Contacts-module--item--f9cb0 .Contacts-module--link--de1e0:hover{color:var(--color-typographic-link-p-font)}@media screen and (min-width:685px){.Contacts-module--contacts--09178{order:2}.Contacts-module--contacts--09178 .Contacts-module--list--9670b{max-width:165px}}.Author-module--author--1c58d{border-top:1px solid var(--color-page-border);line-height:26px;margin-bottom:52px;margin-top:26px;max-width:640px;padding-top:26px}.Author-module--author--1c58d .Author-module--bio--08950 .Author-module--twitter--90647{display:block;text-decoration:underline}.Author-module--author--1c58d .Author-module--bio--08950 .Author-module--twitter--90647:focus,.Author-module--author--1c58d .Author-module--bio--08950 .Author-module--twitter--90647:hover{color:var(--color-typographic-link-s-font)}@media screen and (min-width:685px){.Author-module--author--1c58d{margin-left:auto;margin-right:auto}}.Content-module--content--80d58{margin:0 auto;max-width:945px;padding:0 13px}.Content-module--content--80d58 .Content-module--title--09504{font-size:32px;font-weight:600;line-height:42.9px;margin:26px auto 0;max-width:640px;text-align:center}.Content-module--content--80d58 .Content-module--body--726c2 figure{margin-bottom:26px}.Content-module--content--80d58 .Content-module--body--726c2 figure blockquote{font-style:italic;margin-top:0;padding:26px 0;text-align:center}.Content-module--content--80d58 .Content-module--body--726c2 figure blockquote p{font-size:26.9072px;line-height:39px;margin-bottom:26px;margin-top:0;max-width:640px}.Content-module--content--80d58 .Content-module--body--726c2 a{text-decoration:underline}.Content-module--content--80d58 .Content-module--body--726c2 *{margin-left:auto;margin-right:auto;max-width:640px}.Content-module--content--80d58 .Content-module--body--726c2 h2>a{visibility:hidden}.Content-module--content--80d58 .Content-module--body--726c2 h2>a>svg{fill:var(--color-typographic-base-font)}.Content-module--content--80d58 .Content-module--body--726c2 img{max-width:100%}@media screen and (min-width:960px){.Content-module--content--80d58{padding:0}.Content-module--content--80d58 .Content-module--title--09504{font-size:48px;line-height:58.5px;margin-bottom:39px;margin-top:58.5px}.Content-module--content--80d58 .Content-module--body--726c2,.Content-module--content--80d58 .Content-module--body--726c2 p{font-size:18px;line-height:29.25px;margin-bottom:29.25px}.Content-module--content--80d58 .Content-module--body--726c2 h2>a{padding-right:13px;visibility:unset}}.Meta-module--meta--dae0a .Meta-module--date--4d30d{font-style:italic}.Tags-module--tags--18589{margin-bottom:13px}.Tags-module--tags--18589 .Tags-module--list--82ae6{display:flex;flex-direction:row;flex-wrap:wrap;gap:.5rem;list-style:none;padding:0}.Tags-module--tags--18589 .Tags-module--list--82ae6 .Tags-module--item--52015{margin:0;padding:0}.Post-module--post--3a994 .Post-module--content--3c6e5{margin:0 auto}.Post-module--post--3a994 .Post-module--comments--d3b99,.Post-module--post--3a994 .Post-module--footer--f8705{margin:0 auto;max-width:640px;padding:0 13px}.Post-module--post--3a994 .Post-module--buttons--2972d{align-items:center;display:flex;justify-content:center;margin:26px 0 0;text-align:center}.Post-module--post--3a994 .Post-module--buttons--2972d .Post-module--buttonArticles--d793a{margin:0 13px 0 0}@media screen and (min-width:960px){.Post-module--post--3a994 .Post-module--comments--d3b99,.Post-module--post--3a994 .Post-module--footer--f8705{padding:0}.Post-module--post--3a994 .Post-module--buttons--2972d{left:30px;margin:0 13px 0 0;max-width:none;position:fixed;top:30px}}.Copyright-module--copyright--2c602{color:#7f8ba4;display:none;font-size:14px;order:1000}@media screen and (min-width:685px){.Copyright-module--copyright--2c602{display:block}}.Menu-module--menu--113a9{margin-bottom:26px}.Menu-module--menu--113a9>hr{border-color:var(--color-typographic-base-font);border-width:3px;max-width:80px}.Menu-module--menu--113a9 .Menu-module--list--e1ae3{list-style:none;margin:0;padding:0}.Menu-module--menu--113a9 .Menu-module--list--e1ae3 .Menu-module--item--8b679{margin:13px 0;padding:0}.Menu-module--menu--113a9 .Menu-module--list--e1ae3 .Menu-module--item--8b679 .Menu-module--link--a6f02{border:0;color:var(--color-typographic-base-font);font-size:16px;font-weight:400}.Menu-module--menu--113a9 .Menu-module--list--e1ae3 .Menu-module--item--8b679 .Menu-module--link--a6f02:focus,.Menu-module--menu--113a9 .Menu-module--list--e1ae3 .Menu-module--item--8b679 .Menu-module--link--a6f02:hover{border-bottom:1px solid #5c92ff;color:#5c92ff}.Menu-module--menu--113a9 .Menu-module--list--e1ae3 .Menu-module--item--8b679 .Menu-module--link--a6f02.Menu-module--active--6cb74{border-bottom:1px solid var(--color-typographic-base-font);color:var(--color-typographic-base-font)}@media screen and (min-width:685px){.Menu-module--menu--113a9{order:1}.Menu-module--menu--113a9>hr{display:none}}.Sidebar-module--sidebar--1bfa1{width:100%}.Sidebar-module--sidebar--1bfa1 .Sidebar-module--inner--344d0{padding:26px 19.5px 0;position:relative}.Sidebar-module--sidebar--1bfa1 .Sidebar-module--inner--344d0:after{background:var(--color-sidebar-border);background:linear-gradient(to bottom,var(--color-sidebar-border) 0,var(--color-sidebar-border) 48%,var(--color-sidebar-border-fade) 100%)}@media screen and (min-width:685px){.Sidebar-module--sidebar--1bfa1{width:calc(41.625% - 17.5px
1)}.Sidebar-module--sidebar--1bfa1:nth-child(1n){clear:none;float:left;margin-right:30px}.Sidebar-module--sidebar--1bfa1:last-child{margin-right:0}.Sidebar-module--sidebar--1bfa1:nth-child(12n){float:right;margin-right:0}.Sidebar-module--sidebar--1bfa1:nth-child(12n+1){clear:both}.Sidebar-module--sidebar--1bfa1 .Sidebar-module--inner--344d0{display:flex;flex-direction:column;padding:32.5px 19.5px 0}.Sidebar-module--sidebar--1bfa1 .Sidebar-module--inner--344d0:after{bottom:0;content:"";height:100%;position:absolute;right:-10px;top:30px;width:1px}}@media screen and (min-width:960px){.Sidebar-module--sidebar--1bfa1{width:calc(33.3% - 20px)}.Sidebar-module--sidebar--1bfa1:nth-child(1n){clear:none;float:left;margin-right:30px}.Sidebar-module--sidebar--1bfa1:last-child{margin-right:0}.Sidebar-module--sidebar--1bfa1:nth-child(3n){float:right;margin-right:0}.Sidebar-module--sidebar--1bfa1:nth-child(3n+1){clear:both}.Sidebar-module--sidebar--1bfa1 .Sidebar-module--inner--344d0{padding:39px}}.NotFoundImage-module--notFoundImage--9b540{bottom:0;position:fixed;right:20px}.Footer-module--footer--2d913{width:100%}.Footer-module--footer--2d913 .Footer-module--inner--461ba{padding:25px 20px;text-align:center}.Footer-module--footer--2d913 .Footer-module--inner--461ba .Footer-module--copyright--a775b{display:block}@media screen and (min-width:685px){.Footer-module--footer--2d913{display:none}.Footer-module--footer--2d913.Footer-module--visible--b3b4b{display:block}}</style><link rel="alternate" type="application/rss+xml" title="Dmytro Shkoliar - Software Engineer and Technical Architect" href="/rss.xml"/><style type="text/css">
2    .anchor.before {
3      position: absolute;
4      top: 0;
5      left: 0;
6      transform: translateX(-100%);
7      padding-right: 4px;
8    }
9    .anchor.after {
10      display: inline-block;
11      padding-left: 4px;
12    }
13    h1 .anchor svg,
14    h2 .anchor svg,
15    h3 .anchor svg,
16    h4 .anchor svg,
17    h5 .anchor svg,
18    h6 .anchor svg {
19      visibility: hidden;
20    }
21    h1:hover .anchor svg,
22    h2:hover .anchor svg,
23    h3:hover .anchor svg,
24    h4:hover .anchor svg,
25    h5:hover .anchor svg,
26    h6:hover .anchor svg,
27    h1 .anchor:focus svg,
28    h2 .anchor:focus svg,
29    h3 .anchor:focus svg,
30    h4 .anchor:focus svg,
31    h5 .anchor:focus svg,
32    h6 .anchor:focus svg {
33      visibility: visible;
34    }
35  </style>
35<script>
36    document.addEventListener("DOMContentLoaded", function(event) {
37      var hash = window.decodeURI(location.hash.replace('#', ''))
38      if (hash !== '') {
39        var element = document.getElementById(hash)
40        if (element) {
41          var scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop
42          var clientTop = document.documentElement.clientTop || document.body.clientTop || 0
43          var offset = element.getBoundingClientRect().top + scrollTop - clientTop
44          // Wait for the browser to finish rendering before scrolling.
45          setTimeout((function() {
46            window.scrollTo(0, offset - 0)
47          }), 0)
48        }
49      }
50    })
51  </script>
51<link rel="sitemap" type="application/xml" href="/sitemap-index.xml"/><link rel="icon" href="/favicon-32x32.png?v=483d37df2f5854545c9aea921366af5f" type="image/png"/><link rel="manifest" href="/manifest.webmanifest" crossorigin="anonymous"/><link rel="apple-touch-icon" sizes="48x48" href="/icons/icon-48x48.png?v=483d37df2f5854545c9aea921366af5f"/><link rel="apple-touch-icon" sizes="72x72" href="/icons/icon-72x72.png?v=483d37df2f5854545c9aea921366af5f"/><link rel="apple-touch-icon" sizes="96x96" href="/icons/icon-96x96.png?v=483d37df2f5854545c9aea921366af5f"/><link rel="apple-touch-icon" sizes="144x144" href="/icons/icon-144x144.png?v=483d37df2f5854545c9aea921366af5f"/><link rel="apple-touch-icon" sizes="192x192" href="/icons/icon-192x192.png?v=483d37df2f5854545c9aea921366af5f"/><link rel="apple-touch-icon" sizes="256x256" href="/icons/icon-256x256.png?v=483d37df2f5854545c9aea921366af5f"/><link rel="apple-touch-icon" sizes="384x384" href="/icons/icon-384x384.png?v=483d37df2f5854545c9aea921366af5f"/><link rel="apple-touch-icon" sizes="512x512" href="/icons/icon-512x512.png?v=483d37df2f5854545c9aea921366af5f"/><style>.gatsby-image-wrapper{position:relative;overflow:hidden}.gatsby-image-wrapper picture.object-fit-polyfill{position:static!important}.gatsby-image-wrapper img{bottom:0;height:100%;left:0;margin:0;max-width:none;padding:0;position:absolute;right:0;top:0;width:100%;object-fit:cover}.gatsby-image-wrapper [data-main-image]{opacity:0;transform:translateZ(0);transition:opacity .25s linear;will-change:opacity}.gatsby-image-wrapper-constrained{display:inline-block;vertical-align:top}</style><noscript><style>.gatsby-image-wrapper noscript [data-main-image]{opacity:1!important}.gatsby-image-wrapper [data-placeholder-image]{opacity:0!important}</style></noscript>
51<script type="module">const e="undefined"!=typeof HTMLImageElement&&"loading"in HTMLImageElement.prototype;e&&document.body.addEventListener("load",(function(e){const t=e.target;if(void 0===t.dataset.mainImage)return;if(void 0===t.dataset.gatsbyImageSsr)return;let a=null,n=t;for(;null===a&&n;)void 0!==n.parentNode.dataset.gatsbyImageWrapper&&(a=n.parentNode),n=n.parentNode;const o=a.querySelector("[data-placeholder-image]"),r=new Image;r.src=t.currentSrc,r.decode().catch((()=>{})).then((()=>{t.style.opacity=1,o&&(o.style.opacity=0,o.style.transition="opacity 500ms linear")}))}),!0);</script>
51<link rel="preload" as="script" href="https://analytics.ifrom.me/js/plausible.outbound-links.tagged-events.js"/><title data-gatsby-head="true">Dmytro Shkoliar - Software Engineer and Technical Architect</title></head><body>
51<script>
52          void function() {
53            var cachedMode;
54
55            try {
56              var preferredTheme = JSON.parse(localStorage.getItem('diesel:theme-atom'));
57
58              if (preferredTheme && preferredTheme.mode) {
59                cachedMode = preferredTheme.mode;
60              }
61            } catch (err) { }
62
63            function setTheme(newTheme) {
64              document.documentElement.className = newTheme;
65            }
66
67            var darkQuery = window.matchMedia('(prefers-color-scheme: dark)');
68
69            setTheme(cachedMode || (darkQuery.matches ? 'dark' : 'light'));
70          }()
71        </script>
71<script defer="" src="https://analytics.ifrom.me/js/plausible.outbound-links.tagged-events.js" data-domain="shkoliar.com"></script>
71<script>
72            window.plausible = window.plausible || function() { (window.plausible.q = window.plausible.q || []).push(arguments) };
73          </script>
73<div id="___gatsby"><div style="outline:none" tabindex="-1" id="gatsby-focus-wrapper"><div class="Layout-module--layout--2c933"><div class="Sidebar-module--sidebar--1bfa1"><div class="Sidebar-module--inner--344d0"><div class="Author-module--author--cbd31"><div class="Author-module--photoContainer--30368"><a aria-current="page" class="" href="/"><div data-gatsby-image-wrapper="" class="gatsby-image-wrapper gatsby-image-wrapper-constrained Author-module--photo--9787b"><div style="max-width:500px;display:block"><img alt="" role="presentation" aria-hidden="true" src="data:image/svg+xml;charset=utf-8,%3Csvg%20height=&#x27;500&#x27;%20width=&#x27;500&#x27;%20xmlns=&#x27;http://www.w3.org/2000/svg&#x27;%20version=&#x27;1.1&#x27;%3E%3C/svg%3E" style="max-width:100%;display:block;position:static"/></div><div aria-hidden="true" data-placeholder-image="" style="opacity:1;transition:opacity 500ms linear;background-color:#f8f8f8;position:absolute;top:0;left:0;bottom:0;right:0"></div><picture><source type="image/avif" data-srcset="/static/483d37df2f5854545c9aea921366af5f/3ebc4/photo.avif 125w,/static/483d37df2f5854545c9aea921366af5f/a9ff4/photo.avif 250w,/static/483d37df2f5854545c9aea921366af5f/a61b1/photo.avif 500w" sizes="(min-width: 500px) 500px, 100vw"/><source type="image/webp" data-srcset="/static/483d37df2f5854545c9aea921366af5f/d66e1/photo.webp 125w,/static/483d37df2f5854545c9aea921366af5f/e7160/photo.webp 250w,/static/483d37df2f5854545c9aea921366af5f/5f169/photo.webp 500w" sizes="(min-width: 500px) 500px, 100vw"/><img data-gatsby-image-ssr="" data-main-image="" style="opacity:0" sizes="(min-width: 500px) 500px, 100vw" decoding="async" loading="lazy" data-src="/static/483d37df2f5854545c9aea921366af5f/be5ed/photo.jpg" data-srcset="/static/483d37df2f5854545c9aea921366af5f/8bb35/photo.jpg 125w,/static/483d37df2f5854545c9aea921366af5f/f505e/photo.jpg 250w,/static/483d37df2f5854545c9aea921366af5f/be5ed/photo.jpg 500w" alt="Dmytro Shkoliar"/></picture><noscript><picture><source type="image/avif" srcSet="/static/483d37df2f5854545c9aea921366af5f/3ebc4/photo.avif 125w,/static/483d37df2f5854545c9aea921366af5f/a9ff4/photo.avif 250w,/static/483d37df2f5854545c9aea921366af5f/a61b1/photo.avif 500w" sizes="(min-width: 500px) 500px, 100vw"/><source type="image/webp" srcSet="/static/483d37df2f5854545c9aea921366af5f/d66e1/photo.webp 125w,/static/483d37df2f5854545c9aea921366af5f/e7160/photo.webp 250w,/static/483d37df2f5854545c9aea921366af5f/5f169/photo.webp 500w" sizes="(min-width: 500px) 500px, 100vw"/><img data-gatsby-image-ssr="" data-main-image="" style="opacity:0" sizes="(min-width: 500px) 500px, 100vw" decoding="async" loading="lazy" src="/static/483d37df2f5854545c9aea921366af5f/be5ed/photo.jpg" srcSet="/static/483d37df2f5854545c9aea921366af5f/8bb35/photo.jpg 125w,/static/483d37df2f5854545c9aea921366af5f/f505e/photo.jpg 250w,/static/483d37df2f5854545c9aea921366af5f/be5ed/photo.jpg 500w" alt="Dmytro Shkoliar"/></picture></noscript>
73<script type="module">const t="undefined"!=typeof HTMLImageElement&&"loading"in HTMLImageElement.prototype;if(t){const t=document.querySelectorAll("img[data-main-image]");for(let e of t){e.dataset.src&&(e.setAttribute("src",e.dataset.src),e.removeAttribute("data-src")),e.dataset.srcset&&(e.setAttribute("srcset",e.dataset.srcset),e.removeAttribute("data-srcset"));const t=e.parentNode.querySelectorAll("source[data-srcset]");for(let e of t)e.setAttribute("srcset",e.dataset.srcset),e.removeAttribute("data-srcset");e.complete&&(e.style.opacity=1,e.parentNode.parentNode.querySelector("[data-placeholder-image]").style.opacity=0)}}</script>
73</div></a></div><div class="Author-module--titleContainer--4f576"><h1 class="Author-module--title--cf7e5"><a aria-current="page" class="Author-module--link--09c17" href="/">Dmytro Shkoliar</a></h1></div><p class="Author-module--subtitle--86ec5">Certified Software Engineer and Technical Architect Specializing in E-commerce and Complex Business Solutions.</p></div><div class="Contacts-module--contacts--09178"><ul class="Contacts-module--list--9670b"><li class="Contacts-module--item--f9cb0"><span class="Contacts-module--link--de1e0"><svg class="Icon-module--icon--1d7da" viewBox="0 0 28 28"><title>email</title><path d="M26 23.5v-12c-0.328 0.375-0.688 0.719-1.078 1.031-2.234 1.719-4.484 3.469-6.656 5.281-1.172 0.984-2.625 2.188-4.25 2.188h-0.031c-1.625 0-3.078-1.203-4.25-2.188-2.172-1.813-4.422-3.563-6.656-5.281-0.391-0.313-0.75-0.656-1.078-1.031v12c0 0.266 0.234 0.5 0.5 0.5h23c0.266 0 0.5-0.234 0.5-0.5zM26 7.078c0-0.391 0.094-1.078-0.5-1.078h-23c-0.266 0-0.5 0.234-0.5 0.5 0 1.781 0.891 3.328 2.297 4.438 2.094 1.641 4.188 3.297 6.266 4.953 0.828 0.672 2.328 2.109 3.422 2.109h0.031c1.094 0 2.594-1.437 3.422-2.109 2.078-1.656 4.172-3.313 6.266-4.953 1.016-0.797 2.297-2.531 2.297-3.859zM28 6.5v17c0 1.375-1.125 2.5-2.5 2.5h-23c-1.375 0-2.5-1.125-2.5-2.5v-17c0-1.375 1.125-2.5 2.5-2.5h23c1.375 0 2.5 1.125 2.5 2.5z"></path></svg></span></li><li class="Contacts-module--item--f9cb0"><a class="Contacts-module--link--de1e0" href="https://github.com/shkoliar" target="_blank" rel="noopener noreferrer"><svg class="Icon-module--icon--1d7da" viewBox="0 0 26 28"><title>github</title><path d="M10 19c0 1.141-0.594 3-2 3s-2-1.859-2-3 0.594-3 2-3 2 1.859 2 3zM20 19c0 1.141-0.594 3-2 3s-2-1.859-2-3 0.594-3 2-3 2 1.859 2 3zM22.5 19c0-2.391-1.453-4.5-4-4.5-1.031 0-2.016 0.187-3.047 0.328-0.812 0.125-1.625 0.172-2.453 0.172s-1.641-0.047-2.453-0.172c-1.016-0.141-2.016-0.328-3.047-0.328-2.547 0-4 2.109-4 4.5 0 4.781 4.375 5.516 8.188 5.516h2.625c3.813 0 8.188-0.734 8.188-5.516zM26 16.25c0 1.734-0.172 3.578-0.953 5.172-2.063 4.172-7.734 4.578-11.797 4.578-4.125 0-10.141-0.359-12.281-4.578-0.797-1.578-0.969-3.437-0.969-5.172 0-2.281 0.625-4.438 2.125-6.188-0.281-0.859-0.422-1.766-0.422-2.656 0-1.172 0.266-2.344 0.797-3.406 2.469 0 4.047 1.078 5.922 2.547 1.578-0.375 3.203-0.547 4.828-0.547 1.469 0 2.953 0.156 4.375 0.5 1.859-1.453 3.437-2.5 5.875-2.5 0.531 1.062 0.797 2.234 0.797 3.406 0 0.891-0.141 1.781-0.422 2.625 1.5 1.766 2.125 3.938 2.125 6.219z"></path></svg></a></li><li class="Contacts-module--item--f9cb0"><a class="Contacts-module--link--de1e0" href="https://www.twitter.com/shkoliar" target="_blank" rel="noopener noreferrer"><svg class="Icon-module--icon--1d7da" viewBox="0 0 26 28"><title>twitter</title><path d="M25.312 6.375c-0.688 1-1.547 1.891-2.531 2.609 0.016 0.219 0.016 0.438 0.016 0.656 0 6.672-5.078 14.359-14.359 14.359-2.859 0-5.516-0.828-7.75-2.266 0.406 0.047 0.797 0.063 1.219 0.063 2.359 0 4.531-0.797 6.266-2.156-2.219-0.047-4.078-1.5-4.719-3.5 0.313 0.047 0.625 0.078 0.953 0.078 0.453 0 0.906-0.063 1.328-0.172-2.312-0.469-4.047-2.5-4.047-4.953v-0.063c0.672 0.375 1.453 0.609 2.281 0.641-1.359-0.906-2.25-2.453-2.25-4.203 0-0.938 0.25-1.797 0.688-2.547 2.484 3.062 6.219 5.063 10.406 5.281-0.078-0.375-0.125-0.766-0.125-1.156 0-2.781 2.25-5.047 5.047-5.047 1.453 0 2.766 0.609 3.687 1.594 1.141-0.219 2.234-0.641 3.203-1.219-0.375 1.172-1.172 2.156-2.219 2.781 1.016-0.109 2-0.391 2.906-0.781z"></path></svg></a></li><li class="Contacts-module--item--f9cb0"><a class="Contacts-module--link--de1e0" href="https://www.facebook.com/dmitry.shkoliar" target="_blank" rel="noopener noreferrer"><svg class="Icon-module--icon--1d7da" viewBox="0 0 16 28"><title>facebook</title><path d="M14.984 0.187v4.125h-2.453c-1.922 0-2.281 0.922-2.281 2.25v2.953h4.578l-0.609 4.625h-3.969v11.859h-4.781v-11.859h-3.984v-4.625h3.984v-3.406c0-3.953 2.422-6.109 5.953-6.109 1.687 0 3.141 0.125 3.563 0.187z"></path></svg></a></li><li class="Contacts-module--item--f9cb0"><a class="Contacts-module--link--de1e0" href="https://www.linkedin.com/in/shkoliar" target="_blank" rel="noopener noreferrer"><svg class="Icon-module--icon--1d7da" viewBox="0 0 24 24"><title>linkedin</title><path d="M4.98 3.5c0 1.381-1.11 2.5-2.48 2.5s-2.48-1.119-2.48-2.5c0-1.38 1.11-2.5 2.48-2.5s2.48 1.12 2.48 2.5zm.02 4.5h-5v16h5v-16zm7.982 0h-4.968v16h4.969v-8.399c0-4.67 6.029-5.052 6.029 0v8.399h4.988v-10.131c0-7.88-8.922-7.593-11.018-3.714v-2.155z"></path></svg></a></li><li class="Contacts-module--item--f9cb0"><a class="Contacts-module--link--de1e0" href="https://t.me/shkoliar" target="_blank" rel="noopener noreferrer"><svg class="Icon-module--icon--1d7da" viewBox="0 0 28 28"><title>telegram</title><path d="M27.563 0.172c0.328 0.234 0.484 0.609 0.422 1l-4 24c-0.047 0.297-0.234 0.547-0.5 0.703-0.141 0.078-0.313 0.125-0.484 0.125-0.125 0-0.25-0.031-0.375-0.078l-7.078-2.891-3.781 4.609c-0.187 0.234-0.469 0.359-0.766 0.359
73-0.109 0-0.234-0.016-0.344-0.063-0.391-0.141-0.656-0.516-0.656-0.938v-5.453l13.5-16.547-16.703 14.453-6.172-2.531c-0.359-0.141-0.594-0.469-0.625-0.859-0.016-0.375 0.172-0.734 0.5-0.922l26-15c0.156-0.094 0.328-0.141 0.5-0.141 0.203 0 0.406 0.063 0.562 0.172z"></path></svg></a></li></ul></div><nav class="Menu-module--menu--113a9"><ul class="Menu-module--list--e1ae3"><li class="Menu-module--item--8b679"><a aria-current="page" class="Menu-module--link--a6f02 Menu-module--active--6cb74" href="/">About me</a></li><li class="Menu-module--item--8b679"><a class="Menu-module--link--a6f02" href="/articles/">Articles</a></li></ul><hr/></nav><div class="Copyright-module--copyright--2c602">2024<!-- --> <!-- -->© All rights reserved.</div></div></div><div class="Page-module--page--24e03"><div class="Page-module--inner--4b31d"><div class="Page-module--body--561c4"><div><h1 style="margin: 0 0 37.7px">Certified Software Engineer and Technical Architect</h1>
74<p>I am a Certified Senior Software Engineer and Technical Architect with over 15 years of experience in web and software development. My expertise spans e-commerce platforms, custom business applications, mobile solutions, and Progressive Web Applications (PWA).</p>
75<p>I specialize in Adobe Commerce (formerly Magento 2) and have extensive experience working with Hyvä Themes, complex integrations, and modernizing development environments with Docker. Having successfully led numerous projects with intricate business logic and hight traffic. I bring deep technical knowledge and a strategic approach to delivering scalable, high-performance solutions.</p>
76<p>I’m open to contract opportunities, offering consulting and development services for companies and merchants seeking expertise in Adobe Commerce and tailored e-commerce solutions.</p>
77<h2>My Certifications</h2>
78<img alt="Adobe Certified Master – Adobe Commerce Architect" title="Adobe Certified Master – Adobe Commerce Architect" src="/9742f92a2ad6df6e4eb8cc4644643ec0/adobe-master.svg" style="max-width:150px;float:left">
79<img alt="Adobe Certified Expert – Adobe Commerce Front-End Developer" title="Adobe Certified Expert – Adobe Commerce Front-End Developer" src="/efe36ca098b66c38e42eff8ecaa429ee/adobe-expert.svg" style="max-width:150px;float:left">
80<img alt="Adobe Certified Professional – Adobe Commerce Developer" title="Adobe Certified Professional – Adobe Commerce Developer" src="/b6653914eeaff7abdc16638b31776eff/adobe-professional.svg" style="max-width:150px;float:left">
81<br style="clear:both" />
82<ul>
83<li><a href="https://certification.adobe.com/credential/verify/87a84776-84bd-435f-8a2e-0900c8aa231c" target="_blank" rel="noopener nofollow">Adobe Certified Master – Adobe Commerce Architect</a></li>
84<li><a href="https://certification.adobe.com/credential/verify/397041b4-4f40-46fa-a94f-60186ce3d891" target="_blank" rel="noopener nofollow">Adobe Certified Expert – Adobe Commerce Front-End Developer</a></li>
85<li><a href="https://certification.adobe.com/credential/verify/17a8dbfd-5617-40ad-b415-9c41348238f6" target="_blank" rel="noopener nofollow">Adobe Certified Professional – Adobe Commerce Developer</a></li>
86<li><a href="#">Zend Certified PHP Engineer</a></li>
87</ul>
88<h2>My projects</h2>
89<ul>
90<li><a href="https://ï.link" target="_blank" rel="noopener nofollow">Free URL shortener - ï.link</a> - It is a free tool to generate short links.</a></li>
91<li><a href="https://github.com/mage2click/m2c" target="_blank" rel="noopener nofollow">Mage2click</a> - Newest toolset and Docker-based Magento development environment with the ability to serve multiple Magento projects at the same time. Backed with a rich set of tools and features.</li>
92<li><a href="https://github.com/mage2click/docker-magento-mutagen" target="_blank" rel="noopener nofollow">Docker Magento Mutagen</a> - Mage2click’s Docker-based Magento development environment setup and toolset with mutagen.io service for sync files.</li>
93<li><a href="https://github.com/shkoliar/docker-ngrok" target="_blank" rel="noopener nofollow">Docker Ngrok</a> - Docker image to expose a local web server or docker environment to the internet with help of Ngrok secure tunnels service.</li>
94<li><a href="https://github.com/shkoliar/magento-ngrok" target="_blank" rel="noopener nofollow">Magento 2 Ngrok</a>
94 - Magento 2 module to support Ngrok secure tunnels service.</li>
95<li><a href="https://github.com/shkoliar/magento-debug-helper" target="_blank" rel="noopener nofollow">Magento 2 Debug Helper</a> - Magento 2 module for automation of one debugging technique.</li>
96<li><a href="https://github.com/shkoliar/magento-grid-colors" target="_blank" rel="noopener nofollow">Magento 2 Grid Colors</a> - Magento 2 module for colorizing admin grids. Supports saving of states with the help of grid’s bookmarks.</li>
97</ul></div></div></div></div></div><div class="Footer-module--footer--2d913"><div class="Footer-module--inner--461ba"><div class="Copyright-module--copyright--2c602 Footer-module--copyright--a775b">2024<!-- --> <!-- -->© All rights reserved.</div></div></div></div><div id="gatsby-announcer" style="position:absolute;top:0;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border:0" aria-live="assertive" aria-atomic="true"></div></div>
97<script id="gatsby-script-loader">/*<![CDATA[*/window.pagePath="/";/*]]>*/</script>
97<!-- slice-start id="_gatsby-scripts-1" -->
98          
98<script
99            id="gatsby-chunk-mapping"
100          >
101            window.___chunkMapping="{\"app\":[\"/app-64306c2edee6f21b887d.js\"],\"component---cache-caches-gatsby-plugin-offline-app-shell-js\":[\"/component---cache-caches-gatsby-plugin-offline-app-shell-js-f5e45528226a51297552.js\"],\"component---src-templates-categories-template-categories-template-tsx\":[\"/component---src-templates-categories-template-categories-template-tsx-4e5f52a3eabc791a05bd.js\"],\"component---src-templates-category-template-category-template-tsx\":[\"/component---src-templates-category-template-category-template-tsx-0cf26249fdb00bd47911.js\"],\"component---src-templates-index-template-index-template-tsx\":[\"/component---src-templates-index-template-index-template-tsx-d2281a5c28c1274d38c2.js\"],\"component---src-templates-not-found-template-not-found-template-tsx\":[\"/component---src-templates-not-found-template-not-found-template-tsx-d6196922b7780df31d16.js\"],\"component---src-templates-page-template-page-template-tsx\":[\"/component---src-templates-page-template-page-template-tsx-c8e90718d09cdea2b22c.js\"],\"component---src-templates-post-template-post-template-tsx\":[\"/component---src-templates-post-template-post-template-tsx-b52d5758b7ed4530c15b.js\"],\"component---src-templates-posts-template-posts-template-tsx\":[\"/component---src-templates-posts-template-posts-template-tsx-ab332ead91643df0d60a.js\"],\"component---src-templates-tag-template-tag-template-tsx\":[\"/component---src-templates-tag-template-tag-template-tsx-061a91c85c8d8e5e5be4.js\"],\"component---src-templates-tags-template-tags-template-tsx\":[\"/component---src-templates-tags-template-tags-template-tsx-2d4e49f8ebc7cb53b846.js\"]}";
102          </script>
102
103        
103<script>window.___webpackCompilationHash="9ea623dbd05c12e863ab";</script>
103<script src="/webpack-runtime-9378280255f8a5f12e6c.js" async></script>
103<script src="/framework-110aff3c97c98c11b1dd.js" async></script>
103<script src="/app-64306c2edee6f21b887d.js" async></script>
103<!-- slice-end id="_gatsby-scripts-1" --></body></html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.