Help
RSS
API
Feed
Maltego
Contact
Domain > jshakespeare.com
×
More information on this domain is in
AlienVault OTX
Is this malicious?
Yes
No
DNS Resolutions
Date
IP Address
2020-09-15
157.230.35.153
(
ClassC
)
2026-01-30
52.52.192.191
(
ClassC
)
Port 443
HTTP/1.1 200 OKAccept-Ranges: bytesAge: 1Cache-Control: public,max-age0,must-revalidateCache-Status: Netlify Edge; fwdmissContent-Length: 21394Content-Type: text/html; charsetUTF-8Date: Fri, 30 Jan 2026 17:48:36 GMTEtag: fef4b07c09c84cbdc6376ad3f0c001a2-sslServer: NetlifyStrict-Transport-Security: max-age31536000X-Nf-Request-Id: 01KG80AT1WMZGKRSKP04TA9MDV !doctype html>html langen>head>meta namegenerator contentHugo 0.115.1>meta charsetutf-8>meta nameviewport contentwidthdevice-width,initial-scale1>meta propertyog:title contentJames Shakespeare - James Shakespeare>meta propertyog:site_name contentJames Shakespeare>meta propertyog:locale contenten>meta propertyog:url contenthttps://jshakespeare.com/>title>James Shakespeare - Freelance web and mobile developer/title>meta propertyog:description contentSoftware engineer and consultant with >15 years experience. Specializing in product engineering, design systems, and full-stack web development with React and TypeScript.>meta namedescription contentSoftware engineer and consultant with >15 years experience. Specializing in product engineering, design systems, and full-stack web development with React and TypeScript.>meta nametwitter:card contentsummary>/meta>meta propertyog:image contenthttps://jshakespeare.com/ogimage.png>meta nametwitter:site content@jeshake>style>:root{--background:#efeee6;--foreground:#35312f;--accent-1:#3c3ce9;--accent-2:#c0176b}@media(prefers-color-scheme:dark){:root{--background:#35312f;--foreground:#f2e4e4;--accent-1:#adcce3;--accent-2:#db3f8d}}*{box-sizing:border-box}*:focus{outline:.25rem solid var(--accent-2,black)}*:active{outline:none}::selection{background:var(--accent-2,black);color:var(--background,white)}body{background-color:var(--background,white);color:var(--foreground,black)}img{max-width:100%}a,label{color:var(--accent-1);cursor:pointer;text-decoration:underline}a:hover,label:hover{color:var(--accent-2)}figure{margin:0 auto 2em}figure img{display:block;margin:auto}figure figcaption{margin-top:1.5em;font-size:.8em}figure figcaption p{line-height:1}code,pre{background:rgba(0,0,0,5%);font-family:ubuntu mono,monospace,sans-serif}@media(prefers-color-scheme:dark){code,pre{background:rgba(0,0,0,.25)}}code{padding:0 .333333em;display:inline-block}pre{padding:1.5em;margin:2em -1.5em;overflow:auto;white-space:pre;padding:0;margin:0;line-height:1.5;white-space:pre-wrap;font-size:1em}pre code{background:0 0;padding:0}p,li{line-height:1.5}ul,ol{padding-left:1em}li{margin-bottom:.25em}blockquote{position:relative;margin:0;padding-left:2em;margin:1.25em 0}blockquote::before{content:;position:absolute;top:0;left:0;bottom:0;background:var(--foreground,black);opacity:.25;width:.25em}@font-face{font-display:swap;font-family:inter;font-style:normal;font-weight:400;src:url(../fonts/inter-v13-latin-regular.woff2)format(woff2)}@font-face{font-display:swap;font-family:inter;font-style:normal;font-weight:600;src:url(../fonts/inter-v13-latin-600.woff2)format(woff2)}@font-face{font-display:swap;font-family:overpass;font-style:normal;font-weight:400;src:url(../fonts/overpass-v13-latin-regular.woff2)format(woff2)}@font-face{font-display:swap;font-family:overpass;font-style:normal;font-weight:600;src:url(../fonts/overpass-v13-latin-600.woff2)format(woff2)}@font-face{font-display:swap;font-family:ubuntu mono;font-style:normal;font-weight:400;src:url(../fonts/ubuntu-mono-v17-latin-regular.woff2)format(woff2)}/*!normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css*/html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbrtitle{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,typebutton,typereset,typesubmit{-webkit-appearance:button}button::-moz-focus-inner,typebutton::-moz-focus-inner,typereset::-moz-focus-inner,typesubmit::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,typebutton:-moz-focusring,typereset:-moz-focusring,typesubmit:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}typecheckbox,typeradio{box-sizing:border-box;padding:0}typenumber::-webkit-inner-spin-button,typenumber::-webkit-outer-spin-button{height:auto}typesearch{-webkit-appearance:textfield;outline-offset:-2px}typesearch::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}hidden{display:none}.highlight{color:inherit}.highlight .c{color:#93a1a1}.highlight .err{color:#586e75}.highlight .g{color:#586e75}.highlight .k{color:#859900}.highlight .l{color:#586e75}.highlight .n{color:#586e75}.highlight .o{color:#859900}.highlight .x{color:#cb4b16}.highlight .p{color:#586e75}.highlight .cm{color:#93a1a1}.highlight .cp{color:#859900}.highlight .c1{color:#93a1a1}.highlight .cs{color:#859900}.highlight .gd{color:#2aa198}.highlight .ge{color:#586e75;font-style:italic}.highlight .gr{color:#dc322f}.highlight .gh{color:#cb4b16}.highlight .gi{color:#859900}.highlight .go{color:#586e75}.highlight .gp{color:#586e75}.highlight .gs{color:#586e75;font-weight:700}.highlight .gu{color:#cb4b16}.highlight .gt{color:#586e75}.highlight .kc{color:#cb4b16}.highlight .kd{color:#268bd2}.highlight .kn{color:#859900}.highlight .kp{color:#859900}.highlight .kr{color:#268bd2}.highlight .kt{color:#dc322f}.highlight .ld{color:#586e75}.highlight .m{color:#2aa198}.highlight .s{color:#2aa198}.highlight .na{color:#586e75}.highlight .nb{color:#b58900}.highlight .nc{color:#268bd2}.highlight .no{color:#cb4b16}.highlight .nd{color:#268bd2}.highlight .ni{color:#cb4b16}.highlight .ne{color:#cb4b16}.highlight .nf{color:#268bd2}.highlight .nl{color:#586e75}.highlight .nn{color:#586e75}.highlight .nx{color:#586e75}.highlight .py{color:#586e75}.highlight .nt{color:#268bd2}.highlight .nv{color:#268bd2}.highlight .ow{color:#859900}.highlight .w{color:#586e75}.highlight .mf{color:#2aa198}.highlight .mh{color:#2aa198}.highlight .mi{color:#2aa198}.highlight .mo{color:#2aa198}.highlight .sb{color:#93a1a1}.highlight .sc{color:#2aa198}.highlight .sd{color:#586e75}.highlight .s2{color:#2aa198}.highlight .se{color:#cb4b16}.highlight .sh{color:#586e75}.highlight .si{color:#2aa198}.highlight .sx{color:#2aa198}.highlight .sr{color:#dc322f}.highlight .s1{color:#2aa198}.highlight .ss{color:#2aa198}.highlight .bp{color:#268bd2}.highlight .vc{color:#268bd2}.highlight .vg{color:#268bd2}.highlight .vi{color:#268bd2}.highlight .il{color:#2aa198}@media(prefers-color-scheme:dark){.highlight{}.highlight .c{color:#586e75}.highlight .err{color:#93a1a1}.highlight .g{color:#93a1a1}.highlight .k{color:#859900}.highlight .l{color:#93a1a1}.highlight .n{color:#93a1a1}.highlight .o{color:#859900}.highlight .x{color:#cb4b16}.highlight .p{color:#93a1a1}.highlight .cm{color:#586e75}.highlight .cp{color:#859900}.highlight .c1{color:#586e75}.highlight .cs{color:#859900}.highlight .gd{color:#2aa198}.highlight .ge{color:#93a1a1;font-style:italic}.highlight .gr{color:#dc322f}.highlight .gh{color:#cb4b16}.highlight .gi{color:#859900}.highlight .go{color:#93a1a1}.highlight .gp{color:#93a1a1}.highlight .gs{color:#93a1a1;font-weight:700}.highlight .gu{color:#cb4b16}.highlight .gt{color:#93a1a1}.highlight .kc{color:#cb4b16}.highlight .kd{color:#268bd2}.highlight .kn{color:#859900}.highlight .kp{color:#859900}.highlight .kr{color:#268bd2}.highlight .kt{color:#dc322f}.highlight .ld{color:#93a1a1}.highlight .m{color:#2aa198}.highlight .s{color:#2aa198}.highlight .na{color:#93a1a1}.highlight .nb{color:#b58900}.highlight .nc{color:#268bd2}.highlight .no{color:#cb4b16}.highlight .nd{color:#268bd2}.highlight .ni{color:#cb4b16}.highlight .ne{color:#cb4b16}.highlight .nf{color:#268bd2}.highlight .nl{color:#93a1a1}.highlight .nn{color:#93a1a1}.highlight .nx{color:#93a1a1}.highlight .py{color:#93a1a1}.highlight .nt{color:#268bd2}.highlight .nv{color:#268bd2}.highlight .ow{color:#859900}.highlight .w{color:#93a1a1}.highlight .mf{color:#2aa198}.highlight .mh{color:#2aa198}.highlight .mi{color:#2aa198}.highlight .mo{color:#2aa198}.highlight .sb{color:#586e75}.highlight .sc{color:#2aa198}.highlight .sd{color:#93a1a1}.highlight .s2{color:#2aa198}.highlight .se{color:#cb4b16}.highlight .sh{color:#93a1a1}.highlight .si{color:#2aa198}.highlight .sx{color:#2aa198}.highlight .sr{color:#dc322f}.highlight .s1{color:#2aa198}.highlight .ss{color:#2aa198}.highlight .bp{color:#268bd2}.highlight .vc{color:#268bd2}.highlight .vg{color:#268bd2}.highlight .vi{color:#268bd2}.highlight .il{color:#2aa198}}.client-grid{list-style:none;padding:0;display:grid;grid-template-columns:1fr 1fr;align-items:center;gap:2rem;text-align:center;margin:2em 0}.client-grid img{display:block;height:auto}.client-grid .client-grid__item{display:flex;flex-direction:column;align-items:center}@media(min-width:768px){.client-grid{margin:4em 0;gap:2rem 3rem;grid-template-columns:1fr 1fr 1fr 1fr}}@media(min-width:1024px){.client-grid{margin:4em -4rem}}.hero{margin:0 0 4em}.hero__hr{font-size:.6em;position:relative;clip-path:polygon(0 0,100% 0,calc(100% - .6em) 100%,-.6em 100%);-webkit-clip-path:polygon(0 0,100% 0,calc(100% - .6em) 100%,-.6em 100%);left:0;right:0;top:0;bottom:0;z-index:-1;height:1em}.hero__hr:before{content:;position:fixed;top:0;right:0;bottom:0;left:0;z-index:-1;border-radius:inherit;background:linear-gradient(to bottom right,var(--accent-1) 20%,var(--accent-2) 80%);animation:gradient 15s ease-in infinite;background-size:300%}@keyframes gradient{0%{background-position:0}50%{background-position:100%}100%{background-position:0}}.hero__intro{margin:3em 0}.hero__intro p{font-size:1.666em;margin:0;line-height:1.125;font-family:overpass,sans-serif;margin-bottom:.4em}@media(min-width:768px){.hero__intro p{font-size:2.4em}}.hero__intro em{font-style:normal;background-image:linear-gradient(to bottom right,var(--accent-1) -75%,var(--accent-2) 100%);background-clip:text;color:transparent;animation:gradient 15s ease-in infinite}.hero__availability{position:relative}.hero__availability-indicator--available{display:inline-block;background-color:#36e236;margin-right:.25em;position:relative}@media(min-width:768px){.hero__availability-indicator--available{left:-1.333333em;top:.4em;position:absolute}}.hero__availability-indicator--available::after{content:;position:absolute;animation:pulse 3s infinite;top:50%;left:50%;transform:translate(-50%,-50%)}.hero__availability-indicator--available,.hero__availability-indicator--available::after{border-radius:100%;height:.666666em;width:.666666em}@keyframes pulse{0%{border:.1em solid rgba(54,226,54,.5)}33%{border:.5em solid rgba(54,226,54,0)}100%{border:.5em solid rgba(54,226,54,0)}}.hero__availability-indicator--unavailable{display:inline-block;background-color:#efd055;margin-right:.25em;position:relative}@media(min-width:768px){.hero__availability-indicator--unavailable{left:-1.333333em;top:.4em;position:absolute}}.hero__availability-indicator--unavailable::after{content:;position:absolute;animation:pulse 3s infinite;top:50%;left:50%;transform:translate(-50%,-50%)}.hero__availability-indicator--unavailable,.hero__availability-indicator--unavailable::after{border-radius:100%;height:.666666em;width:.666666em}@keyframes pulse{0%{border:.1em solid rgba(239,208,85,.5)}33%{border:.5em solid rgba(239,208,85,0)}100%{border:.5em solid rgba(239,208,85,0)}}.homepage-content__section{margin:0 0 4em}.homepage-content__section-heading{margin-top:2em}.nav__items{list-style:none;padding:0;margin:0 0 4em}.nav__item{margin-bottom:.25em}@media(min-width:768px){.nav__item{margin-bottom:0;margin-right:.75em;display:inline-block}}@media(min-width:768px){.nav__item::after{margin-left:.75em;content:·;opacity:.666666}}.nav__item:last-child::after{content:none}.nav__item atarget_blank::after{content:↗︎;padding-left:.25em;display:inline-block;font-size:92.5%}.post__header{margin:0 0 4em}.post__headline{font-size:1.666em;margin:0;line-height:1.125;font-family:overpass,sans-serif;margin-bottom:0 0 .25em}@media(min-width:768px){.post__headline{font-size:2.4em}}.post__dateline{margin-bottom:2em;display:block}.post__content pre{padding:1em;margin:2em -1em;overflow:auto;white-space:pre}@media(min-width:768px){.post__content pre{padding:1.5em;margin:2em -1.5em}}.post__featured-image{margin:0}.post__featured-image img{margin:0}.skip-link{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;position:fixed;top:1em;left:1em;z-index:1}.skip-link:focus{border:initial;clip:auto;height:auto;width:auto;overflow:visible;margin:0;padding:0;position:static;position:fixed}html{font-size:18px}body{font-family:inter,sans-serif;max-width:64em}h1,h2,h3,h4,h5,h6{font-family:overpass,sans-serif;font-weight:500}pre,code{font-family:ubuntu mono,monospace}.page{max-width:40em;margin:0 auto;padding:0 1em 2em}.page__heading{font-size:1.666em;margin:0;line-height:1.125;font-family:overpass,sans-serif;margin-bottom:1em}@media(min-width:768px){.page__heading{font-size:2.4em}}.masthead{margin:12vh 0 4em}.masthead__site-name{text-decoration:none;color:inherit;display:block;font-family:overpass,sans-serif;font-weight:700;font-size:1.1em}.masthead__site-name:hover{color:var(--accent-1)}@media(min-width:768px){.masthead__site-name{font-size:1.4em}}.post-list{list-style:none;padding:0;margin:0}.post-list__item{margin:0 0 1em}.post-list__link{display:block}.sidebar__container{position:relative}.footer{margin-top:4em}/style>link relalternate typeapplication/rss+xml titlejshakespeare.com blog RSS href/posts/index.xml>link relicon href/favicon.png typeimage/png>link relicon href/favicon.svg typeimage/svg+xml>/head>body>a href#main classskip-link>Skip to content/a>div classpage>header classmasthead>a classmasthead__site-name hrefhttps://jshakespeare.com/>span rolepresentation>▰▰/span> jshakespeare.com/a>/header>main idmain>div classhero>div classhero__intro>p>I’m strong>James Shakespeare/strong>, a freelance software developer./p>p>I build em>delightful/em>, intuitive products for the web and mobile./p>/div>p classhero__availability>i classhero__availability-indicator--unavailable aria-hiddentrue>/i>I’m fully booked! My earliest availability for new projects is October 2025.You should still a hrefmailto:j@jshakespeare.com>email me/a> if you havea project in mind for the future or just want to say hi 👋/p>nav classnav>ul classnav__items>li classnav__item>a href/services/>Services/a>/li>li classnav__item>a hrefmailto:j@jshakespeare.com>Email/a>/li>li classnav__item>a target_blank hrefhttps://www.linkedin.com/in/james-shakespeare-40784435/>LinkedIn/a>/li>li classnav__item>a target_blank hrefhttps://read.cv/jshakes>CV/a>/li>li classnav__item>a target_blank hrefhttps://github.com/jshakes>GitHub/a>/li>/ul>/nav>hr classhero__hr>/div>section classhomepage-content__section>h2 classhomepage-content__section-heading>A wealth of experience on bothsides of the pond/h2>p>I have over 15 years of software development experience in the UK and US techindustry. During that time I have worked with businesses of all shapes andsizes, from pre-seed startups to Fortune 500 companies./p>p>I have worked as an individual contributor and as a manager in high-performingengineering teams.I have been involved with every stage of the software development lifecycleand have written, tested, and shipped code that has been used by millions ofpeople./p>p>a href/services/>Read more about the services I offer/a>./p>/section>section classhomepage-content__section>h2>Trusted by top tech companies/h2>p>I work directly with product and engineering teams around the world to deliver quality andvalue, again and again./p>ul classclient-grid>li classclient-grid__item>a hrefhttps://specialprojects.automattic.com/ target_blank>picture>source srcsetlogos/automattic-dark.png media(prefers-color-scheme: light)>source srcsetlogos/automattic-light.png media(prefers-color-scheme: dark)>img srclogos/automattic-dark.png altAutomattic>/picture>/a>/li>li classclient-grid__item>a hrefhttps://www.semianalysis.com/ target_blank>img srclogos/semianalysis.png altSemiAnalysis logo width179 height74>/a>/li>li classclient-grid__item>a hrefhttps://comet.com/ target_blank>picture>source srcsetlogos/comet-dark.png media(prefers-color-scheme: light)>source srcsetlogos/comet-light.png media(prefers-color-scheme: dark)>img srclogos/comet-dark.png altComet logo width180 height69>/picture>/a>/li>li classclient-grid__item>a hrefhttps://www.taptapsend.com/ target_blank>picture>source srcsetlogos/taptap-send-dark.png media(prefers-color-scheme: light)>source srcsetlogos/taptap-send-light.png media(prefers-color-scheme: dark)>img srclogos/taptap-send-dark.png altTaptap Send logo width140 height67>/picture>/a>/li>li classclient-grid__item>a hrefhttps://www.theinfatuation.com/ target_blank>picture>source srcsetlogos/infatuation-dark.png media(prefers-color-scheme: light)>source srcsetlogos/infatuation-light.png media(prefers-color-scheme: dark)>img srclogos/infatuation-dark.png altInfatuation logo width197 height23>/picture>/a>/li>li classclient-grid__item>a hrefhttps://capimoney.com/ target_blank>picture>source srcsetlogos/capi-dark.png media(prefers-color-scheme: light)>source srcsetlogos/capi-light.png media(prefers-color-scheme: dark)>img srclogos/capi-dark.png altCapi Money logo width148 height53>/picture>/a>/li>li classclient-grid__item>a hrefhttps://www.money254.co.ke/ target_blank>picture>source srcsetlogos/money254-dark.png media(prefers-color-scheme: light)>source srcsetlogos/money254-light.png media(prefers-color-scheme: dark)>img srclogos/money254-dark.png altMoney254 logo width205 height32>/picture>/a>/li>li classclient-grid__item>a hrefhttps://qz.com/ target_blank>picture>source srcsetlogos/quartz-dark.png media(prefers-color-scheme: light)>source srcsetlogos/quartz-light.png media(prefers-color-scheme: dark)>img srclogos/quartz-dark.png altQuartz logo width168 height26>/picture>/a>/li>/ul>/section>section classhomepage-content__section>h2 classhomepage-content__section-heading>Posts/h2>ul classpost-list>li classpost-list__item>a hrefhttps://jshakespeare.com/fix-missing-skip-to-content-link-wordpress-block-themes/ classpost-list__link>Fix missing ‘Skip to Content’ link in WordPress block themes/a>small>time datetime2025-05-14 05:00:52 +0000 +0000 classpost-list__date>14 May 2025/time>/small>/li>li classpost-list__item>a hrefhttps://jshakespeare.com/accessible-route-change-react-router-autofocus-heading/ classpost-list__link>Making route changes accessible in React with an autofocusing h1/a>small>time datetime2023-11-04 09:20:52 +0000 GMT classpost-list__date>4 November 2023/time>/small>/li>li classpost-list__item>a hrefhttps://jshakespeare.com/react-error-boundary-testing-rtl/ classpost-list__link>How to test an error boundary component with React Testing Library/a>small>time datetime2023-10-16 12:20:52 +0000 +0000 classpost-list__date>16 October 2023/time>/small>/li>li classpost-list__item>a hrefhttps://jshakespeare.com/javascript-console-log-etymology/ classpost-list__link>How did JavaScript’s console.log get its name?/a>small>time datetime2020-12-07 12:20:52 +0000 GMT classpost-list__date>7 December 2020/time>/small>/li>li classpost-list__item>a hrefhttps://jshakespeare.com/use-git-hooks-and-husky-to-tell-your-teammates-when-to-run-npm-install/ classpost-list__link>Use git hooks and husky to tell your teammates when to run npm install/a>small>time datetime2020-08-02 12:20:52 +0000 +0000 classpost-list__date>2 August 2020/time>/small>/li>li classpost-list__item>a hrefhttps://jshakespeare.com/simple-count-up-number-animation-javascript-react/ classpost-list__link>A simple count-up number animation with JavaScript/a>small>time datetime2020-04-05 21:00:00 +0500 +0500 classpost-list__date>5 April 2020/time>/small>/li>li classpost-list__item>a hrefhttps://jshakespeare.com/dont-mislabel-mailto-links/ classpost-list__link>Don’t mislabel mailto links/a>small>time datetime2020-02-22 10:47:00 +0500 +0500 classpost-list__date>22 February 2020/time>/small>/li>/ul>div classnav>ul classnav__items>li classnav__item>a classcta href/posts/>Archive/a>/li>li classnav__item>a classcta href/posts/index.xml>RSS/a>/li>/ul>/div>/section>/main>footer classfooter>div classfooter__contents>p>small>© a href/>James Shakespeare/a> 2026. a href/posts/index.xml>RSS/a>/small>/p>/div>/footer>/div>/body>/html>
View on OTX
|
View on ThreatMiner
Please enable JavaScript to view the
comments powered by Disqus.
Data with thanks to
AlienVault OTX
,
VirusTotal
,
Malwr
and
others
. [
Sitemap
]