1<!DOCTYPE html><html lang="en" class="dark" style="color-scheme:dark"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>Nicholas Griffin</title><meta name="description" content="The personal website of Nicholas Griffin"/><link rel="manifest" href="/manifest.json"/><link rel="modulepreload" href="/assets/entry.client-D9_1TavW.js"/><link rel="modulepreload" href="/assets/jsx-runtime-CnZfasm4.js"/><link rel="modulepreload" href="/assets/root-h6ZwgeJr.js"/><link rel="modulepreload" href="/assets/PageLayout-BT52NK65.js"/><link rel="modulepreload" href="/assets/seo-DYmo8BoZ.js"/><link rel="modulepreload" href="/assets/_index-Dxv6-wim.js"/><link rel="modulepreload" href="/assets/BlogCard-Boun56Mn.js"/><link rel="modulepreload" href="/assets/ContactLinks-BkqJEEzR.js"/><link rel="modulepreload" href="/assets/markdown-BM_DXfy3.js"/><link rel="modulepreload" href="/assets/InnerPage-3Ro2h29z.js"/><link rel="modulepreload" href="/assets/LoadingState-C9aUymVd.js"/><link rel="modulepreload" href="/assets/ProjectsList-CYeBXha4.js"/><link rel="modulepreload" href="/assets/VideoCardPlayer-CyoTm1Pk.js"/><link rel="modulepreload" href="/assets/card-BHNpgO1_.js"/><link rel="stylesheet" href="/assets/root-Don9vgRC.css"/><link rel="stylesheet" href="/assets/_index-DmaHmBr1.css"/></head><body class="min-h-screen bg-background font-sans antialiased"><a href="https://nicholasgriffin.dev/cdn-cgi/content?id=W.AKtWMkGjzQPK4g2ho.nV_cZ.Z4UOMq6UXAsJzntI8-1790902846.9502616-1.2.1.1-.eQY3uP5AQpY.WhsyAu3OdWcZhNUMO3wa9tiIiPbpJHZrjeHZAIO.BB472xNjzI2" aria-hidden="true" rel="nofollow noopener" style="display: none !important; visibility: hidden !important"></a><div aria-hidden="true" class="pointer-events-none fixed inset-x-0 top-0 z-[60] h-0.5 overflow-hidden bg-transparent transition-opacity duration-200 opacity-0"><div class="route-loading-bar h-full w-[40%] bg-gradient-to-r from-sky-300/20 via-sky-300 to-sky-200/20"></div></div><!--$?--><template id="B:0"></template><!--/$--><header class="fixed w-full z-50"><div class="w-full min-h-[3px] bg-gradient-to-r from-[#093054] to-[#061e35]"></div><div class="bg-[#171923] shadow"><div class="container flex items-center justify-between"><div class="flex items-center space-x-4 py-2"><a class="inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 text-primary-foreground" href="/" target="_self" data-discover="true"><span class="relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full"><svg class="aspect-square h-full w-full" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 180 180" aria-labelledby="logo-title"><title id="logo-title">Nicholas Griffin's Avatar</title><path fill="#83475B" d="M0 0h180v180H0V0Z"></path><path fill="#01177E" d="M0 0h180v180H0V0Zm37 27v2l-2.063.563C23.148 35.332 14.227 52.111 10 64c-6.51 21.782-5.404 42.632 5 63 5.99 10.114 14.44 20.077 24 27h2v2c3.799 2.944 7.495 4.713 12.016 6.285C55 163 55 163 58.188 164.5c20.95 9.15 43.761 5.915 64.812-.5v-2l2.113-.281c15.764-3.925 29.006-19.65 37.137-32.781 10.307-17.989 13.166-39.194 8.25-59.5-6.078-20.609-20.353-38.37-39.134-48.789C125.164 17.393 118.702 15.015 112 13l-3.504-1.11C84.174 6.009 56.892 12.289 37 27Z"></path><path fill="#82495B" d="M109.875 12.75c19.395 3.685 36.61 16.13 48.5 31.563 12.234 17.975 16.51 38.595 13.251 60.158-.88 4.294-2.12 8.41-3.626 12.529l-.723 2.762C166 122 166 122 163.06 123.258l-3.621.867-3.805.96L152 126a241.14 241.14 0 0 0-7.23 2.484C143 129 143 129 140 129a764.71 764.71 0 0 0-4.844 2.844c-5.914 3.171-13.452 6.703-20.156 5.156-2.715-2.386-4.837-5.115-7-8-2.567-3.259-5.172-6.227-8.375-8.875-5.107-4.246-9.848-9.03-12.625-15.125h-2l-2-3-1 16H69l-2.688-5.563C61.026 101.7 54.928 91.39 49 81l-1 36H38V64h12c2.712 3.496 4.212 6.078 6 10a284.06 284.06 0 0 0 3.395 5.684c1.14 1.917 2.279 3.835 3.417 5.754l1.772 2.966 1.686 2.842 1.518 2.553C69 96 69 96 70 99l1-35h11v6c8.78-3.069 17.536-6.187 26.25-9.438 7.878-2.933 15.82-5.638 23.81-8.253 4.034-1.323 8.025-2.657 11.94-4.309-1.898-2.298-1.898-2.298-5.063-2.438-3.026-.432-5.12-.915-7.91-1.94-5.692-1.946-11.499-3.017-17.402-4.122C105.637 37.994 97.811 36.262 90 34c1.973-5.286 4.926-8.465 8.77-12.547 1.81-1.992 3.247-3.914 4.73-6.14C106 13 106 13 109.875 12.75Z"></path><path fill="#47837C" d="m89.563 10.688 4.095-.01c9.94.054 9.94.054 13.342 2.322l-1.688 1.8C99.71 20.888 94.733 27.219 90 34c1.25.23 2.498.461 3.785.7 10.016 1.868 20.004 3.842 29.965 5.987l3.047.65 2.812.612 2.5.542C134 43 134 43 135 44c2.28.53 4.572.963 6.871 1.402C144 46 144 46 146 48c-3.749 1.42-7.5 2.836-11.25 4.25l-3.164 1.2a466.643 466.643 0 0 1-18.707 6.599c-4.457 1.472-8.887 3.023-13.317 4.576-.857.3-1.715.598-2.6.906-3.324 1.164-6.62 2.326-9.872 3.68C85 70 85 70 82 70v-6H71v36c-2.763-1.381-3.267-3.082-4.695-5.809a443.608 443.608 0 0 0-6.735-12.226l-1.718-3.01a2948.736 2948.736 0 0 0-3.524-6.14l-1.695-2.975-1.535-2.676C50 65 50 65 50 63l-2.043-.066c-4.496-1.42-7.051-4.528-10.27-7.871l-1.955-1.96C31 48.282 31 48.282 31 46l-1.875-.813C27 44 27 44 25 41c.
115-2.943.972-3.97 2.996-6.14l2.442-2.11 2.433-2.14C35 29 35 29 37 29v-2c15.908-11.623 32.976-16.552 52.563-16.313Z"></path><path fill="#261F75" d="M32 148c1.505.95 3.004 1.91 4.5 2.875l2.531 1.617L41 154v2l1.938.75a251.381 251.381 0 0 1 7.437 3.188l2.383 1.054a235.73 235.73 0 0 1 5.492 2.57c17.851 7.633 39.771 7.572 57.836 1.036 2.358-.737 4.461-.835 6.914-.598v-2l2.238-1.066c7.253-3.53 14.048-7.467 20.762-11.934 9.714 7.234 18.05 19.203 21 31H12c3.832-11.497 8.917-19.25 17.18-28.004 1.87-1.869 1.87-1.869 2.82-3.996Z"></path><path fill="#753F62" d="M24 40a92.695 92.695 0 0 1 12.172 11.906c1.942 2.225 3.95 4.358 6.016 6.469l1.917 1.96c2.08 1.969 2.08 1.969 5.895 3.665H37l.238 4.89c.273 6.019.444 12.036.586 18.06.075 2.6.177 5.199.308 7.797 1.029 21.067 1.029 21.067-2.588 26.4-3.969 3.81-8.508 5.788-13.544 7.853-2.37 1.578-2.37 1.578-4 3C6.325 109.65 2.823 89.676 9.844 65.04 12.905 55.827 17.817 47.457 24 40Z"></path><path fill="#85404E" d="M157 44c4.103 3.486 5.943 7.514 8.125 12.313l1.05 2.224C169.086 64.82 171.643 70.936 171 78l-2 3h-2l-.55 1.863c-.252.809-.504 1.617-.762 2.45l-.739 2.425c-.99 2.362-2.03 3.6-3.949 5.262-2.472-2.963-3.662-5.54-4.688-9.25l-.761-2.703L155 79c-3.417-.167-3.417-.167-7 0-2.662 2.662-3.108 5.342-4.121 8.906C143 90 143 90 140 92l-1-3h-22v8h12c-1.353 5.411-3.184 9.045-8 12-4.774.726-9.419.606-13.938-1.125-3.875-3.523-6.251-6.908-6.593-12.188-.01-1.562 0-3.125.031-4.687-.015-.781-.03-1.562-.047-2.367.044-6.59 2.267-10.158 6.734-15.008C111.184 71.316 114.49 71.229 119 72c2.8 1.038 4.536 2.19 7 4l.84 2.094L128 80c2.648.704 2.648.704 5.625.75l3.04.172L139 81c-1.82-5.649-3.34-9.099-8-13l-2.563-2.188C123.511 63.215 118.483 62.675 113 62c1-2 1-2 4.387-3.219 1.431-.435 2.865-.861 4.3-1.281l4.262-1.281 2.09-.626c5.19-1.57 10.017-3.473 14.91-5.788C145 49 145 49 148 49v-2l9-3Z"></path><path fill="#828337" d="M29 144h72l1 3c1.874 1.062 1.874 1.062 4 2 2.498 1.857 4.83 3.907 7.188 5.938l1.943 1.63c.61.523 1.22 1.046 1.85 1.584l1.684 1.438C120 161 120 161 121 164c-21.383 7.81-43.58 8.17-65 0-2.813-1.563-2.813-1.563-5-3l-2.5-1a37.442 37.442 0 0 1-7.5-4v-2l-2.063-.563c-4.096-2.004-6.96-5.013-9.937-8.437v-1Z"></path><path fill="#F9F8F8" d="M129.836 66.066c4.62 2.953 6.897 5.946 9.164 10.934v4c-3.707.283-7.303.451-11 0-1.813-2.313-1.813-2.313-3-5-4.141-2.86-7.882-3.588-12.816-3.422-4.303.831-6.827 3.491-9.32 7.04-1.345 3.71-1.233 7.341-1.239 11.257l-.074 2.395c-.027 5.372.792 8.534 4.449 12.73 4.396 3.11 9.851 2.604 15 2 4.887-2.545 6.187-6.038 8-11h-12v-8h22v29h-8v-6l-3.188 2.375c-6.799 5.066-13.514 5.59-21.812 4.625-6.608-2.395-11.746-7.815-15.035-13.922-3.411-8.44-3.426-19.043-.403-27.578 3.37-7.09 8.616-11.95 15.91-14.844 8.535-2.216 15.828-.967 23.364 3.41Z"></path><path fill="#FCFBFB" d="M38 64h12c2.712 3.496 4.212 6.078 6 10a284.06 284.06 0 0 0 3.395 5.684c1.14 1.917 2.279 3.835 3.417 5.754l1.772 2.966 1.686 2.842 1.518 2.553C69 96 69 96 70 99l1-35h10v53H70c-2.752-3.118-4.182-5.366-6-9-.953-1.678-1.906-3.357-2.866-5.03-1.706-2.991-3.353-6.014-5.009-9.032L49 81l-1 36H38V64Z"></path><path fill="#797244" d="M109.875 12.75c18.06 3.431 34.329 14.556 46 28.488C157 43 157 43 157 45c-9.228 2.654-17.11 1.744-26.098-1.426-5.648-1.926-11.421-2.978-17.277-4.074C105.637 37.994 97.811 36.262 90 34c1.973-5.286 4.926-8.465 8.77-12.547 1.81-1.992 3.247-3.914 4.73-6.14C106 13 106 13 109.875 12.75Z"></path><path fill="#45798D" d="M75.383 30.047C79.889 31.234 84.414 32.18 89 33c-1.167 2.464-2.251 4.306-4 6.438-1.937 2.481-2.986 4.604-4 7.562h-2l-.563 2c-1.688 3.523-3.872 5.921-6.484 8.797C68.777 61.38 65.9 65.192 63 69c-1.8-.105-1.8-.105-4-1-1.668-2.8-1.668-2.8-3.188-6.313L54.27 58.2C53 55 53 55 52.512 52.77 51.859 50.513 50.655 49.64 49 48c-.992-2.164-.992-2.164-1.875-4.625-1.666-4.417-3.709-8.346-6.172-12.367C40 29 40 29 40 25c8.866-4.433 26.335 2.568 35.383 5.047Z"></path><path fill="#769C77" d="M151.625 77.875 155 78l6 14c2.865-3.41 4.347-6.907 6-11h2l1-3h2c.03 3.896.047 7.792.063 11.688l.025 3.341.01 3.233.016 2.967c-.11 2.696-.509 5.146-1.114 7.771l-1.984.48c-6.254 1.6-12.023 3.665-17.899 6.336-3.904 1.483-8.04 2.278-12.117 3.184V91l3-1c1.174-2.258 1.174-2.258 2.063-4.938 2.512-7.013 2.512-7.013 7.562-7.187Z"></path><path fill="#443C8D" d="m89.563 10.688 4.095-.01c9.94.054 9.94.054 13.342 2.322l-1.688 1.836L103 17.375l-2.508 2.73c-2.519 2.816-2.519 2.816-4.484 5.82-1.855 2.722-3.48 4.96-6.008 7.075-5.91 1.022-11.486-.962-17-3-6.622-1.66-13.356-2.865-20.063-4.125A6617.376 6617.376 0 0 0 43 24c3.642-3.151 7.14-5.175 11.564-7.063l3.378-1.472c10.54-4.002 20.393-4.915 31.621-4.777Z"></path><path fill="#A66982" d="M119 72c3.703 1.309 6.33 3.047 8.625 6.313.552 3.958-.824 6.154-2.625 9.687h14v1h-22v8h12c-1.353 5.411-3.184 9.045-8 12-4.774.726-9.419.606-13.938-1.
1125-3.875-3.523-6.251-6.908-6.593-12.188-.01-1.562 0-3.125.031-4.687-.015-.781-.03-1.562-.047-2.367.044-6.59 2.267-10.158 6.734-15.008 4-2.311 7.3-2.389 11.813-1.625Z"></path><path fill="#836D31" d="M72 144h29l1 3c1.874 1.062 1.874 1.062 4 2 2.498 1.857 4.83 3.907 7.188 5.938l1.943 1.63c.61.523 1.22 1.046 1.85 1.584l1.684 1.438C120 161 120 161 121 164c-13.189 4.817-25.073 6.342-39 6l4-2-1-3 1.055-1.828c1.23-2.228 1.23-2.228.265-4.969l-1.195-2.953-1.18-2.984L83 150l4-1v-2l-1.723.035c-4.884.057-9.462-.215-14.277-1.035l1-2Z"></path><path fill="#34498D" d="M39 26c2.73 3.365 4.693 7.019 6.625 10.875l.945 1.816C48.463 42.453 49.527 45.818 50 50l3 1c1.387 2.8 1.387 2.8 2.688 6.313l1.324 3.488C58 64 58 64 58 68l-7-1-1-4-2.043-.066c-4.496-1.42-7.051-4.528-10.27-7.871l-1.955-1.96C31 48.282 31 48.282 31 46l-1.875-.813C27 44 27 44 25 41c.15-2.943.972-3.97 2.996-6.14l2.442-2.11 2.433-2.14C35 29 35 29 37 29v-2l2-1Z"></path><path fill="#7D7B31" d="M159 49c3 1 3 1 4.754 4.133a275.91 275.91 0 0 1 1.809 3.992l.92 1.977c2.768 6.08 5.134 12.11 4.517 18.898l-2 3h-2l-.55 1.863c-.252.809-.504 1.617-.762 2.45l-.739 2.425c-.99 2.362-2.03 3.6-3.949 5.262-2.472-2.963-3.662-5.54-4.688-9.25-.25-.892-.502-1.784-.761-2.703L155 79c-5.322-.296-5.322-.296-10 2 2.214-7.096 5.012-13.755 8.125-20.5l1.379-3.031C157.859 50.14 157.859 50.14 159 49Z"></path><path fill="#755C6E" d="m144 46 4 1v2c-7.912 3.387-15.771 6.453-24.023 8.895-18.015 4.962-18.015 4.962-31.352 17.25-4.017 8.41-4.066 18.91-1.5 27.793 1.801 4.577 4.727 8.324 7.875 12.062-5.67-1.35-8.257-3.722-12-8v-2h-2l-2-3-1 16H69l1-2 11 1V64h1v6c8.78-3.069 17.536-6.187 26.25-9.438 7.878-2.933 15.82-5.638 23.81-8.253 4.034-1.323 8.025-2.657 11.94-4.309v-2Z"></path><path fill="#863155" d="M165 122c-.6 1.692-1.293 3.35-2 5l-.754 1.809C157.817 137.997 148.728 148.558 140 154h-2a3651.664 3651.664 0 0 1-3.5-9.375l-1.012-2.695-.957-2.578-.888-2.38C131 135 131 135 131 133l12-6v2l2.16-1.023C157.994 122 157.994 122 165 122Z"></path><path fill="#617D64" d="M29 144h43c-4.065 5.42-8.153 10.687-12.46 15.898-1.737 1.937-1.737 1.937-1.54 4.102l-1.5-.813c-2.134-1.013-4.219-1.828-6.438-2.625-3.266-1.208-6.214-2.515-9.062-4.562v-2l-2.063-.563c-4.096-2.004-6.96-5.013-9.937-8.437v-1Z"></path><path fill="#5D979E" d="m82 43-1 4h-2l-.563 2c-1.688 3.523-3.872 5.921-6.484 8.797C68.777 61.38 65.9 65.192 63 69c-1.8-.105-1.8-.105-4-1-1.668-2.8-1.668-2.8-3.188-6.313L54.27 58.2C53 55 53 55 52.45 52.645L52 51l-2-1v-5c4.208-.337 8.416-.669 12.625-1 1.19-.095 2.38-.19 3.605-.29l3.497-.273 3.205-.253c3.031-.182 6.032-.216 9.068-.184Z"></path><path fill="#667A59" d="M95 114c1.459.477 2.917.957 4.375 1.438l2.46.808C104 117 104 117 106 118c1.591.22 3.19.39 4.79.535l2.85.264 2.985.263 3.008.276c2.455.224 4.91.445 7.367.662l2-6c.625 1.75.625 1.75 1 4l-1 1.875c-1.402 2.98-.766 4.993 0 8.125l1 1c.04 1.666.043 3.334 0 5-9.661 4.068-9.661 4.068-15 3-2.726-2.374-4.837-5.116-7-8-3.18-4.038-6.513-7.423-10.547-10.605C96 117 96 117 95 114Z"></path><path fill="#162978" d="m123 162 6 1c1.369 4.517.47 7.588-1 12l10 4v1H99c4.47-7.45 8.219-13.28 16.91-15.613 2.408-.446 4.649-.623 7.09-.387v-2Z"></path><path fill="#7A3869" d="M24 40a92.695 92.695 0 0 1 12.172 11.906c1.942 2.225 3.95 4.358 6.016 6.469l1.917 1.96C45.985 61.988 47.72 63 50 64c-12.823 1-24.62-1.992-37-5 1.348-4.707 3.297-8.283 6.063-12.313l2.16-3.175C23 41 23 41 24 40Z"></path><path fill="#A98092" d="M81 64h1l1 24 6-3 .113 2.527c.661 11.31 2.543 18.75 9.887 27.473-5.67-1.35-8.257-3.722-12-8v-2h-2l-2-3-1 16H69l1-2 11 1V64Z"></path><path fill="#774063" d="M49 83h2a2199.51 2199.51 0 0 1 5.5 9.813l1.59 2.814 1.504 2.705 1.396 2.491C62 103 62 103 62 106l-1.828.55-2.422.763-2.39.738c-2.794 1.006-2.794 1.006-6.36 3.949V83Z"></path><path fill="#86404C" d="M82 131c3.24.613 5.314 1.708 7.938 3.688l1.964 1.449c2.64 2.345 4.838 5.15 7.098 7.863H73c6-9 6-9 9-13Z"></path><path fill="#7A435F" d="M153 48c-2.174 2.5-3.73 3.436-7 4v2h-3v2l-6 2v2c-7.73 5.223-7.73 5.223-12.563 4.375L121 63c-2.662-.452-5.313-.717-8-1 1-2 1-2 4.387-3.219 1.431-.435 2.865-.861 4.3-1.281l4.262-1.281 2.096-.628c5.896-1.783 11.43-4.064 17.053-6.568 2.864-1.01 4.896-1.233 7.902-1.023Z"></path><path fill="#76394E" d="M125 137h3c-1.75 3.875-1.75 3.875-4 5-.656 2.527-.656 2.527-1 5l-1.863.043c-2.472.146-4.734.352-7.137.957-2.139 2.39-2.139 2.39-3 5-3.443-1.53-6.19-3.493-9-6l-1-3c15.56-7.073 15.56-7.073 24-5v-2Z"></path><path fill="#8F4B5A" d="M119 72c2.603 1.11 4.642 2.395 7 4l-1 5c-3.46.998-6.853 1.335-10.438 1.625l-3.37.29c-2.945.078-5.348-.203-8.192-.915.21-3.687 1.005-5.005 3.5-7.813 3.913-2.965 7.777-3.11 12.5-2.187Z"></path><path fill="#617857" d="M170 72h1c.25 5.625.25 5.625-2 9h-2l-.55 1.863c-.252.809-.504 1.617-.762 2.45l-.739 2.425c-.99 2.362-2.03 3.6-3.949 5.262-2.472-2.963-3.662-5.54-4.688-9.25l-.761-2.703L155 79c-5.322-.296-5.322-.296-10 2l2-5 23-1v-3Z"></path><path fill="#306E8B" d="m58 66 .68 1.953c1.149 2.29 1.149 2.29 3.703 2.656l2.742.141L70 71v16c-8.936-6.404-8.936-6.404-12-11v-2h-3l-3-7 6 1v-2Z"></path><path fill="#854B5D" d="M141 77h4c.512 6.401.119 9.98-4 15l-2-1v-3h-14c1-6 1-6 2-7 2.02-.072 4.042-.084 6.063-.063l3.347.028L139 81l2-4Z"></path><path fill="#433C8D" d="M37 27h2l-.275 1.665c-.413 2.507-.819 5.015-1.225 7.523l-.434 2.619C36.406 42.905 35.793 46.832 36 51c-1.938-.813-1.938-.813-4-2l-1-3a178.795 178.795 0 0 0-4-2c-2-3-2-3-1.902-4.922 1.234-2.843 3.003-4.31 5.34-6.328l2.433-2.14C35 29 35 29 37 29v-2Z"></path><path fill="#5C8457" d="M119 122h8c3.429 7.286 3.429 7.286 3 12-8.429 3.429-8.429 3.429-13 3 .525-5.03 1.106-10.019 2-15Z"></path><path fill="#8D6B6D" d="M170 108c-4.61 2.95-7.365 4.55-13 4v2c-6.672 2.39-12.913 4.455-20 5v2l-9 1 1-7-2 5h-7l-1-2 12-6v6c9.578-.87 17.874-4.261 26.684-7.93 9.036-3.71 9.036-3.71 12.316-2.07Z"></path><path fill="#2E4289" d="M39 26c2.263 3.017 3.99 5.628 5.688 8.938l1.324 2.527C47 40 47 40 47 45l-12 1 4
1-20Z"></path><path fill="#203472" d="m123 162 6 1c.688 2.313.688 2.313 1 5-1.188 1.875-1.188 1.875-3 3l-4-1-3.25 1c-4.484 1.196-7.226.794-11.75 0 .234-1.89.234-1.89 1-4 4.204-2.328 9.213-3.463 14-3v-2Z"></path><path fill="#74683F" d="M159 49c3 1 3 1 4.605 3.652l1.583 3.285 1.605 3.278C168 62 168 62 168 64h-4l-1-2c-1.888-.685-1.888-.685-4.063-1.125l-2.222-.508L155 60l-.34 2.105c-.744 3.265-1.904 6.131-3.222 9.208l-1.38 3.238L149 77l-2-2c3.546-8.921 7.62-17.469 12-26Z"></path><path fill="#779C76" d="M49 146h21c-2.511 4.186-4.865 7.357-8 11-3.453-1.513-5.956-3.547-8.75-6.063-.8-.712-1.598-1.425-2.422-2.16L49 147v-1Z"></path><path fill="#4C8174" d="m89 33 1.978.487c12.317 3.025 24.621 5.969 37.09 8.307 5.834 1.108 5.834 1.108 6.932 2.206 2.28.53 4.572.963 6.871 1.402C144 46 144 46 146 48c-3.923 1.502-6.748.458-10.688-.688-1.339-.378-2.679-.754-4.019-1.128l-2.12-.595c-3.662-.993-7.353-1.855-11.048-2.714l-2.195-.512a722.775 722.775 0 0 0-10.805-2.425c-1.376-.308-2.751-.62-4.125-.938l-2.945-.68L95 37.562l-2.813-.683L90 36l-1-3Z"></path><path fill="#5A5D9D" d="M87 11c2.771-.054 5.541-.094 8.313-.125.785-.017 1.57-.034 2.38-.05l2.295-.02 2.11-.032C104 11 104 11 107 13l-8 9-1-2-2.75-.813C91.448 17.799 89.602 16.061 87 13v-2Z"></path><path fill="#783A53" d="M43 118a219.049 219.049 0 0 1-8.563 6.188l-2.316 1.605C30 127 30 127 27 127l-2 13c-3.645-3.27-5.293-5.165-6-10 2.86-2.023 5.74-4.014 8.625-6 .808-.572 1.616-1.145 2.45-1.734 7.483-5.111 7.483-5.111 12.925-4.266Z"></path><path fill="#3B6E8B" d="M9 68h1c.143 13.035-.281 25.985-1 39l-2-1C4.458 93.097 5.955 80.613 9 68Z"></path><path fill="#774B6C" d="M56 74h2a442.497 442.497 0 0 1 3.496 5.05c2.042 2.647 4.443 4.619 7.05 6.688C70 87 70 87 71 89c.07 1.874.084 3.75.063 5.625l-.028 3.04L71 100c-2.763-1.382-3.262-3.083-4.688-5.813-2.837-5.353-5.872-10.56-8.992-15.753C56 76 56 76 56 74Z"></path><path fill="#406E7E" d="m82 74 10 2c-2.049 8.195-2.049 8.195-4.758 10.488-1.93 1.075-1.93 1.075-5.242 2.512V74Z"></path><path fill="#7B4A66" d="M98 67c-1.554 3.496-3.17 6.394-6 9-3.532.231-6.816-.408-10-2v-4c5.717-2.45 9.79-3.333 16-3Z"></path><path fill="#306D8E" d="M57 26c4.922.613 9.523 1.597 14.313 2.938C77.166 30.55 83.02 31.93 89 33l-2 4c-3.69-1.097-7.376-2.204-11.063-3.313l-3.146-.935C67.363 31.115 62.151 29.374 57 27v-1Z"></path><path fill="#3F206F" d="M145 149c1.173.951 2.338 1.911 3.5 2.875l1.969 1.617L152 155v2l-3.105-.07c-1.361-.02-2.722-.037-4.083-.055l-2.04-.05c-4.06-.04-7.122.375-10.772 2.175 3.718-4.202 8.317-6.998 13-10Z"></path><path fill="#5D764F" d="M119 122h8c-1 2-1 2-3 4a93.567 93.567 0 0 0-2.125 4.625l-1.07 2.477L120 135l2 2h-5c.525-5.03 1.106-10.019 2-15Z"></path><path fill="#538F8D" d="M76 43h6l-1 4h-2l-.563 2c-1.688 3.523-3.872 5.921-6.484 8.797C68.777 61.38 65.9 65.192 63 69l-4-1 1-2 3 1 .727-1.668c1.569-2.874 3.526-5.152 5.648-7.644C72.768 53.611 75.59 49.715 78 45h-2v-2Z"></path><path fill="#863054" d="m120 140 2 4h-19c2.199-2.199 3.964-3.037 6.813-4.25l2.582-1.14c3.305-.774 4.704-.324 7.605 1.39Z"></path><path fill="#586854" d="M29 144h43v1c-5.801.36-11.604.699-17.407 1.02-1.975.111-3.95.229-5.925.352-2.834.176-5.669.331-8.504.483l-2.686.18c-2.487.122-2.487.122-6.478-.035l-2-3Z"></path><path fill="#8D6A6C" d="M170 108c-4.61 2.95-7.365 4.55-13 4v2a759.652 759.652 0 0 1-5.875 2.063l-3.305 1.16C145 118 145 118 143 117c3.979-2.556 8.115-4.397 12.5-6.125l1.973-.8c9.285-3.696 9.285-3.696 12.527-2.075Z"></path><path fill="#396D7E" d="M70 75v12l-8-6 2-1 .438-2L65 76c3-1 3-1 5-1Z"></path><path fill="#6B5836" d="M159 49c1.245 3.734.6 4.509-1.02 8l-1.35 2.938L155.189 63l-1.409 3.063C150.331 73.504 150.331 73.504 148 77c-1-2-1-2-.25-4.328C151.196 64.616 155 56.792 159 49Z"></path><path fill="#933C60" d="m82 101 3 2v2h2c2.186 2.537 4.044 5.278 6 8l-11-3v-9Z"></path><path fill="#70486C" d="M10 82h1v30c-3-3-3-3-3.265-5.388l.156-2.796.152-3.06.207-3.194.16-3.181C8.87 85.976 8.87 85.976 10 82Z"></path><path fill="#864967" d="M88 85c1.63 3.26.893 5.547 0 9-3.063 2.438-3.063 2.438-6 4-.355-3.074-.537-5.941 0-9 3-2.563 3-2.563 6-4Z"></path><path fill="#732F65" d="m24 40 5 5-1 3h-9c3.875-6.875 3.875-6.875 5-8Z"></path><path fill="#7F7C63" d="m106 13 2 1c-1.375 2-1.375 2-3 4h-2l-.25 1.688C101.252 24.305 97.935 27.33 94 30l-2-1 1.793-1.977C97.955 22.42 102.077 17.81 106 13Z"></path><path fill="#833662" d="M26 129c.25 7.625.25 7.625-2 11-4.018-4.383-4.018-4.383-3.938-7.188C21.422 130.186 23.008 129 26 129Z"></path><path fill="#2D7F84" d="m61 70 9 1v4l-6 2-3-7Z"></path><path fill="#8C5566" d="M123 98h5c-.61 5.492-.61 5.492-2.438 7.875C124 107 124 107 122 107l1-9Z"></path><path fill="#924E6A" d="M126 79c-1 2-1 2-2.64 2.59-3.032.527-6.04.758-9.11.972l-3.547.254L108 83l1-3c5.72-.832 11.222-1.12 17-1Z"></path><path fill="#366492" d="M57 26c5.125.633 9.965 1.682 14.938 3.063l2.072.564c1.664.454 3.327.913 4.99 1.373-7.466 2.489-15.054-1.255-22-4v-1Z"></path><path fill="#8C5F6B" d="M129 112c0 3.204-.743 5.094-2 8h-7l-1-2 1.68-.805 2.195-1.07 2.18-1.055c2.096-1.036 2.096-1.036 3.945-3.07Z"></path><path fill="#29376F" d="M32 148a697.93 697.93 0 0 1 3.5 2.438l1.969 1.37L39 153v1H29l3-6Z"></path>
1<path fill="#923B60" d="M165 122v2l-2.375.25c-4.803.994-9.123 2.837-13.625 4.75l-2-2c2.247-.841 4.497-1.673 6.75-2.5l1.922-.723c3.36-1.225 5.697-1.777 9.328-1.777Z"></path><path fill="#877235" d="m155 60 8 1 1 3c2.015.733 2.015.733 4 1a978.719 978.719 0 0 1-4.25-.438l-2.39-.246c-2.184-.292-4.237-.737-6.36-1.316v-3Z"></path><path fill="#824E68" d="M114 73c-3.287 3.813-6.397 5.23-11 7 2.62-5.843 4.424-7.438 11-7Z"></path><path fill="#7F3C53" d="M114 73c2.063.438 2.063.438 4 1-1.56.963-3.123 1.92-4.688 2.875l-2.636 1.617C108.166 79.906 105.697 81 103 82c1.229-3.686 2.146-3.895 5.5-5.625 2.945-1.415 2.945-1.415 5.5-3.375Z"></path><path fill="#8B994E" d="M70 146h2c-1.41 3.039-3.089 5.594-5.125 8.25l-1.633 2.14L64 158l-3-1a993.3 993.3 0 0 1 4.375-5.5l2.46-3.094L70 146Z"></path><path fill="#7D5270" d="m9 98 2 1v13c-3-3-3-3-3.074-5.7l.386-2.987.364-3.012L9 98Z"></path><path fill="#8E5D69" d="M157 113c-2.626 1.751-4.618 2.693-7.563 3.688l-2.378.824C145 118 145 118 143 117c4.918-3.057 8.19-4.13 14-4Z"></path><path fill="#7E6176" d="M106 64c-6.897 4.079-6.897 4.079-11.5 3.75L92 67c4.695-2.528 8.733-4.6 14-3Z"></path><path fill="#547F51" d="m125 123 2 2-6 11-2-1 6-12Z"></path><path fill="#7C305A" d="M27 126v3l-8 4c.188-1.813.188-1.813 1-4 4.179-3 4.179-3 7-3Z"></path><path fill="#7F9A7A" d="M130 112h1v6h5c-2.918 1.945-4.625 2.453-8 3l2-9Z"></path><path fill="#68715D" d="M143 82h2c-.565 3.958-1.809 6.666-4 10-1-2-1-2-.441-3.945l.879-2.18.87-2.195L143 82Z"></path><path fill="#617255" d="M147 76c3.375-.125 3.375-.125 7 0l2 2-5.957.586c-2.343.34-2.343.34-5.043 2.414l2-5Z"></path><path fill="#5E465E" d="m88 85 1 2c-2 3-2 3-4.625 3.688L82 91c1.245-3.736 2.634-4.188 6-6Z"></path><path fill="#70685C" d="m98 22 2 1c-1.393 3.367-2.979 4.986-6 7l-2-1 6-7Z"></path><path fill="#893556" d="m112 147 2 1-3 5-3-1c1.75-3.875 1.75-3.875 4-5Z"></path><path fill="#348B8D" d="m61 70 9 1v2c-6.152-.586-6.152-.586-8-1l-1-2Z"></path><path fill="#4E7B93" d="m43 24 8 1v2l-8-1v-2Z"></path></svg></span><span class="sr-only">Home</span></a></div><nav class="flex items-center space-x-6 hidden lg:flex"><a class="inline-flex items-center gap-1 font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 text-primary-foreground" href="/blog" data-discover="true">Blog</a><a class="inline-flex items-center gap-1 font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 text-primary-foreground" href="/projects" data-discover="true">Projects</a><a class="inline-flex items-center gap-1 font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 text-primary-foreground" href="/ai" data-discover="true">AI</a><a class="inline-flex items-center gap-1 font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 text-primary-foreground" href="/apps" data-discover="true">Apps</a><a class="inline-flex items-center gap-1 font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 text-primary-foreground" href="/contact" data-discover="true">Contact</a></nav><button class="flex items-center space-x-6 lg:hidden" aria-label="Open menu"><span class="font-bold flex items-center gap-1"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-menu" aria-hidden="true"><path d="M4 5h16"></path><path d="M4 12h16"></path><path d="M4 19h16"></path></svg>Menu</span></button></div></div></header><main><div class="container pt-[59px] text-left"><div class="pt-5 md:pt-10"></div><div class="grid grid-cols-5 gap-4"><div class="col-span-5 md:col-span-3 lg:col-span-4 pt-5"><div class="text-primary-foreground lg:max-w-[75%]"><h1 class="text-2xl md:text-4xl font-bold text-primary-foreground">
1ð Welcome to my website!</h1><p>Thanks for visiting my site!</p><p>I'm Nicholas Griffin, a Senior Software Engineer from the UK, currently with the BBC.</p><h2 class="text-1xl md:text-2xl font-bold text-primary-foreground">About me</h2><p>I'm a Full Stack Developer, leaning a bit more towards frontend work. My time outside of my main role is spent on various personal projects across the web.</p><p>Beyond development, I enjoy reading now and then and have a passion for discovering new music â mainly trying to outsmart the algorithms.</p><p>Feel free to explore more about me and my projects below.</p><div class="flex flex-wrap gap-4 text-primary-foreground"><a rel="noopener noreferrer" title="Github" class="inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 underline text-primary-foreground" href="https://github.com/nicholasgriffintn" target="_blank"><svg class="w-[24px] h-[24px] fill-white" role="presentation" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M256 0C115.39 0 0 115.39 0 256c0 119.988 84.195 228.984 196 256v-84.695c-11.078 2.425-21.273 2.496-32.55-.828-15.13-4.465-27.423-14.543-36.548-29.91-5.816-9.813-16.125-20.454-26.879-19.672l-2.636-29.883c23.254-1.992 43.37 14.168 55.312 34.23 5.305 8.922 11.41 14.153 19.246 16.465 7.575 2.23 15.707 1.16 25.184-2.187 2.379-18.973 11.07-26.075 17.637-36.075v-.015c-66.68-9.946-93.254-45.32-103.801-73.242-13.977-37.075-6.477-83.391 18.238-112.66.48-.571 1.348-2.063 1.012-3.106-11.332-34.23 2.476-62.547 2.984-65.55 13.078 3.866 15.203-3.892 56.809 21.386l7.191 4.32c3.008 1.793 2.063.77 5.07.543 17.372-4.719 35.684-7.324 53.727-7.558 18.18.234 36.375 2.84 54.465 7.75l2.328.234c-.203-.031.633-.149 2.035-.984 51.973-31.481 50.106-21.192 64.043-25.723.504 3.008 14.13 31.785 2.918 65.582-1.512 4.656 45.059 47.3 19.246 115.754-10.547 27.933-37.117 63.308-103.797 73.254v.015c8.547 13.028 18.817 19.957 18.762 46.832V512c111.809-27.016 196-136.012 196-256C512 115.39 396.61 0 256 0zm0 0"></path></svg></a><a rel="noopener noreferrer" title="Twitter" class="inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 underline text-primary-foreground" href="https://twitter.com/ngriffin_uk" target="_blank"><svg class="w-[24px] h-[24px] fill-white" role="presentation" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M512 97.248c-19.04 8.352-39.328 13.888-60.48 16.576 21.76-12.992 38.368-33.408 46.176-58.016-20.288 12.096-42.688 20.64-66.56 25.408C411.872 60.704 384.416 48 354.464 48c-58.112 0-104.896 47.168-104.896 104.992 0 8.32.704 16.32 2.432 23.936-87.264-4.256-164.48-46.08-216.352-109.792-9.056 15.712-14.368 33.696-14.368 53.056 0 36.352 18.72 68.576 46.624 87.232-16.864-.32-33.408-5.216-47.424-12.928v1.152c0 51.008 36.384 93.376 84.096 103.136-8.544 2.336-17.856 3.456-27.52 3.456-6.72 0-13.504-.384-19.872-1.792 13.6 41.568 52.192 72.128 98.08 73.12-35.712 27.936-81.056 44.768-130.144 44.768-8.608 0-16.864-.384-25.12-1.44C46.496 446.88 101.6 464 161.024 464c193.152 0 298.752-160 298.752-298.688 0-4.64-.16-9.12-.384-13.568 20.832-14.784 38.336-33.248 52.608-54.496z" fill="#03a9f4"></path></svg></a><a rel="me noopener noreferrer" title="Mastodon" class="inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 underline text-primary-foreground" href="https://bsky.app/profile/nicholasgriffin.dev" target="_blank"><svg class="w-[24px] h-[24px] fill-[#1185fe]" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 530" role="presentation"><path fill="#1185fe" d="M135.72 44.03C202.216 93.951 273.74 195.17 300 249.49c26.262-54.316 97.782-155.54 164.28-205.46C512.26 8.009 590-19.862 590 68.825c0 17.712-10.155 148.79-16.111 170.07-20.703 73.984-96.144 92.854-163.25 81.433 117.3 19.964 147.14 86.092 82.697 152.22-122.39 125.59-175.91-31.511-189.63-71.766-2.514-7.38-3.69-10.832-3.708-7.896-.017-2.936-1.193.516-3.707 7.896-13.714 40.255-67.233 197.36-189.63 71.766-64.444-66.128-34.605-132.26 82.697-152.22-67.108 11.421-142.55-7.45-163.25-81.433C20.15 217.613 9.997 86.535 9.997 68.825c0-88.687 77.742-60.816 125.72-24.795z"></path></svg></a><a rel="me noopener noreferrer" title="Mastodon" class="inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 underline text-primary-foreground" href="https://mastodon.online/@ngriffin" target="_blank"><svg class="w-[24px] h-[24px] fill-white" role="presentation" xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16"><path fill="#595aff" d="M11.19 12.195c2.016-.24 3.77-1.475 3.99-2.603.348-1.778.32-4.339.32-4.339 0-3.47-2.286-4.488-2.286-4.488C12.062.238 10.083.017 8.027 0h-.05C5.92.017 3.942.238 2.79.765c0 0-2.285 1.017-2.285 4.488l-.002.662c-.004.64-.007 1.35.011 2.091.083 3.394.626 6.74 3.78 7.57 1.454.383 2.703.463 3.709.408 1.823-.1 2.847-.647 2.847-.647l-.06-1.317s-1.303.41-2.767.36c-1.45-.05-2.98-.156-3.215-1.928a3.614 3.614 0 0 1-.033-.496s1.424.346 3.228.428c1.103.05 2.137-.064 3.188-.189zm1.613-2.47H11.13v-4.08c0-.859-.364-1.295-1.091-1.295-.804 0-1.207.517-1.207 1.541v2.233H7.168V5.89c0-1.024-.403-1.541-1.207-1.541-.727 0-1.091.436-1.091 1.296v4.079H3.197V5.522c0-.859.22-1.541.66-2.046.456-.505 1.052-.764 1.793-.764.856 0 1.504.328 1.933.983L8 4.39l.417-.695c.429-.655 1.077-.983 1.934-.983.74 0 1.336.259 1.791.764.442.505.661 1.187.661 2.046v4.203z"></path></svg></a><a rel="noopener noreferrer" title="LinkedIn" class="inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 underline text-primary-foreground" href="https://www.linkedin.com/in/nicholasgriffin-gb/" target="_blank"><svg class="w-[24px] h-[24px] fill-white" role="presentation" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 382 382">
1<path d="M347.445 0H34.555C15.471 0 0 15.471 0 34.555v312.889C0 366.529 15.471 382 34.555 382h312.889C366.529 382 382 366.529 382 347.444V34.555C382 15.471 366.529 0 347.445 0zM118.207 329.844c0 5.554-4.502 10.056-10.056 10.056H65.345c-5.554 0-10.056-4.502-10.056-10.056V150.403c0-5.554 4.502-10.056 10.056-10.056h42.806c5.554 0 10.056 4.502 10.056 10.056v179.441zM86.748 123.432c-22.459 0-40.666-18.207-40.666-40.666S64.289 42.1 86.748 42.1s40.666 18.207 40.666 40.666-18.206 40.666-40.666 40.666zM341.91 330.654a9.247 9.247 0 0 1-9.246 9.246H286.73a9.247 9.247 0 0 1-9.246-9.246v-84.168c0-12.556 3.683-55.021-32.813-55.021-28.309 0-34.051 29.066-35.204 42.11v97.079a9.246 9.246 0 0 1-9.246 9.246h-44.426a9.247 9.247 0 0 1-9.246-9.246V149.593a9.247 9.247 0 0 1 9.246-9.246h44.426a9.247 9.247 0 0 1 9.246 9.246v15.655c10.497-15.753 26.097-27.912 59.312-27.912 73.552 0 73.131 68.716 73.131 106.472v86.846z" fill="#0077b7"></path></svg></a><a title="Contact Me" class="inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 underline text-primary-foreground" href="/contact" target="_self" data-discover="true"><svg class="w-[24px] h-[24px] fill-white" role="presentation" xmlns="http://www.w3.org/2000/svg" viewBox="0 -26 512 512"><defs></defs><path fill="#e87288" d="M463.988 240.59C487.7 216.172 502 184.55 502 150c0-77.32-77.629-140-166-140S176 72.68 176 150l160 140c23.61 0 52.031-4.48 72.21-12.512C426.489 297.468 452.782 310 482 310c-18.79-18.79-24.8-45.54-18.012-69.41zm0 0"></path><path fill="#cae9fc" d="M258.45 170C304.921 194.5 336 239.07 336 290c0 77.32-71.629 140-160 140-23.61 0-52.031-4.48-72.21-12.512C85.511 437.468 59.218 450 30 450c18.79-18.79 24.8-45.54 18.012-69.41C24.3 356.172 10 324.55 10 290c0-77.32 77.629-140 166-140 30.16 0 58.379 7.3 82.45 20zm0 0"></path><path d="M256 100c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm0 0M90 280c5.52 0 10-4.48 10-10s-4.48-10-10-10-10 4.48-10 10 4.48 10 10 10zm0 0"></path><path d="M336 0c-90.027 0-163.918 62.07-169.633 140.254C80.63 144.554 0 206.379 0 290c0 34.945 13.828 68.805 39 95.633 4.98 20.531-1.066 42.293-16.07 57.297A9.998 9.998 0 0030 460c28.52 0 56.004-11.184 76.426-30.89C126.32 435.89 152.277 440 176 440c90.016 0 163.898-62.055 169.629-140.223 20.937-.93 42.715-4.797 59.945-10.668C425.996 308.816 453.48 320 482 320a9.998 9.998 0 007.07-17.07c-15.004-15.004-21.05-36.766-16.07-57.297 25.172-26.828 39-60.688 39-95.633C512 63.113 425.16 0 336 0zM176 420c-23.602 0-50.496-4.633-68.512-11.8a10 10 0 00-11.078 2.538c-12.074 13.2-27.773 22.403-44.879 26.633a80.872 80.872 0 006.098-59.52 9.98 9.98 0 00-2.445-4.226C32.496 350.258 20 320.559 20 290c0-70.469 71.438-130 156-130 79.852 0 150 55.527 150 130 0 71.684-67.29 130-150 130zm280.816-186.375a10.027 10.027 0 00-2.445 4.227 80.872 80.872 0 006.098 59.52c-17.106-4.227-32.805-13.435-44.88-26.634a10.007 10.007 0 00-11.077-2.539c-15.614 6.211-37.887 10.512-58.914 11.551-2.922-37.816-21.786-73.36-54.036-99.75H422c5.523 0 10-4.477 10-10s-4.477-10-10-10H260.84c-22.7-11.555-48.188-18.293-74.422-19.707C192.164 73.129 257.058 20 336 20c84.563 0 156 59.531 156 130 0 30.559-12.496 60.258-35.184 83.625zm0 0"></path><path d="M256 260H130c-5.523 0-10 4.477-10 10s4.477 10 10 10h126c5.523 0 10-4.477 10-10s-4.477-10-10-10zm0 0M256 320H90c-5.523 0-10 4.477-10 10s4.477 10 10 10h166c5.523 0 10-4.477 10-10s-4.477-10-10-10zm0 0M422 100H296c-5.523 0-10 4.477-10 10s4.477 10 10 10h126c5.523 0 10-4.477 10-10s-4.477-10-10-10zm0 0"></path></svg></a></div></div></div><div class="col-span-5 md:col-span-2 lg:col-span-1 pt-10 lg:pt-5"><div><!--$?--><template id="B:1"></template><div role="status" aria-live="polite" class="inline-flex items-center gap-2 w-full py-6"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle animate-spin h-4 w-4 text-muted-foreground" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg><span class="text-sm text-muted-foreground">Loading recent tracks...</span></div><!--/$--></div></div></div><div class="mx-break-out pt-5 lg:mt-20 relative"><div class="lg:bg-[#171923] w-full lg:min-h-[240px] lg:absolute top-0 left-0"></div><div class="lg:container relative"><div class="text-left pb-5"><h2 class="text-2xl md:text-3xl font-bold text-primary-foreground md:pt-5">What's going on?</h2><p>Below you will find some of the blog posts that I have wrote (and just a few thoughts and links), I used to write a lot and I'm looking to write blog posts more about the projects that I am working on. There might not be a lot here but I hope that it will at least be interesting, at least to me.</p></div><section><!--$?--><template id="B:2"></template><div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4"><div class="h-[260px] rounded-xl border border-border/50 bg-card/40 animate-pulse"></div><div class="h-[260px] rounded-xl border border-border/50 bg-card/40 animate-pulse"></div><div class="h-[260px] rounded-xl border border-border/50 bg-card/40 animate-pulse"></div></div><!--/$--><div class="w-full flex justify-left pt-5"><a class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 bg-primary text-primary-foreground hover:bg-primary/90 h-11 rounded-md px-8 inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 text-primary-foreground" href="/blog" target="_self" data-discover="true">View all of my blog posts</a></div></section><div class="text-left pt-5 pb-5"><h2 class="text-2xl md:text-3xl font-bold text-primary-foreground md:pt-5">So what is it that you do? ð¤</h2><p>Well quite a few things, here are some of my favourite projects alongside my most recently updated GitHub repos:</p></div><!--$?--><template id="B:3"></template><section><div class="grid grid-cols-1 md:grid-cols-3 lg:grid-cols-3 gap-4"><div class="rounded-lg border bg-card text-card-foreground shadow-sm overflow-hidden">
1<div class="max-h-[190px] min-h-[190px] overflow-hidden h-full"><div class="image image--loading w-full object-cover"><picture><source type="image/avif" srcSet="https://images.s3rve.co.uk/?width=640&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbbc_open_source.png&format=avif 640w, https://images.s3rve.co.uk/?width=750&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbbc_open_source.png&format=avif 750w, https://images.s3rve.co.uk/?width=828&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbbc_open_source.png&format=avif 828w, https://images.s3rve.co.uk/?width=1080&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbbc_open_source.png&format=avif 1080w, https://images.s3rve.co.uk/?width=1200&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbbc_open_source.png&format=avif 1200w, https://images.s3rve.co.uk/?width=1920&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbbc_open_source.png&format=avif 1920w, https://images.s3rve.co.uk/?width=2048&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbbc_open_source.png&format=avif 2048w" sizes="(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw"/><source type="image/webp" srcSet="https://images.s3rve.co.uk/?width=640&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbbc_open_source.png&format=webp 640w, https://images.s3rve.co.uk/?width=750&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbbc_open_source.png&format=webp 750w, https://images.s3rve.co.uk/?width=828&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbbc_open_source.png&format=webp 828w, https://images.s3rve.co.uk/?width=1080&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbbc_open_source.png&format=webp 1080w, https://images.s3rve.co.uk/?width=1200&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbbc_open_source.png&format=webp 1200w, https://images.s3rve.co.uk/?width=1920&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbbc_open_source.png&format=webp 1920w, https://images.s3rve.co.uk/?width=2048&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbbc_open_source.png&format=webp 2048w" sizes="(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw"/><img loading="lazy" src="https://images.s3rve.co.uk/?width=700&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbbc_open_source.png" srcSet="https://images.s3rve.co.uk/?width=640&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbbc_open_source.png 640w, https://images.s3rve.co.uk/?width=750&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbbc_open_source.png 750w, https://images.s3rve.co.uk/?width=828&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbbc_open_source.png 828w, https://images.s3rve.co.uk/?width=1080&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbbc_open_source.png 1080w, https://images.s3rve.co.uk/?width=1200&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbbc_open_source.png 1200w, https://images.s3rve.co.uk/?width=1920&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbbc_open_source.png 1920w, https://images.s3rve.co.uk/?width=2048&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbbc_open_source.png 2048w" sizes="(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw" alt="A screenshot of the BBC's Open Source site" width="700" height="190" decoding="async" class="image__img"/></picture></div></div><div class="flex flex-col space-y-1.5 p-6"><div class="text-2xl font-semibold tracking-tight leading-7">BBC Projects</div></div><div class="p-6 pt-0"><div class="text-sm text-muted-foreground"><div><p class="text-base">I participate in a range of projects at the BBC. Most recently, I transitioned the BBCâs Open Source site to the <a href="https://www.bbc.co.uk/webarchive/https%3A%2F%2Fwww.bbc.co.uk%2Fblogs%2Finternet%2Fentries%2F8673fe2a-e876-45fc-9a5f-203c049c9f9c" target="_blank" rel="noopener noreferrer" class="underline text-muted-foreground inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2">WebCore</a> service to enhance performance, maintainability, accessibility, and user experience. I also contribute to open-source projects, such as <a href="https://github.com/bbc/sqs-consumer" target="_blank" rel="noopener noreferrer" class="underline text-muted-foreground inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2">SQS Consumer</a>, and help teams improve their experimentation capabilities.</p></div></div><div class="w-full flex justify-left"><div class="flex flex-wrap gap-2"><a rel="noopener noreferer" class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 border border-input bg-background hover:bg-accent hover:text-accent-foreground h-9 rounded-md px-3 inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 text-muted-foreground" href="https://www.bbc.co.uk/opensource" target="_blank">BBC Open Source<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-external-link inline ml-1" aria-hidden="true"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></a><a rel="noopener noreferer" class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 border border-input bg-background hover:bg-accent hover:text-accent-foreground h-9 rounded-md px-3 inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 text-muted-foreground" href="https://github.com/bbc" target="_blank">BBC GitHub<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-external-link inline ml-1" aria-hidden="true"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></a></div></div></div></div><div class="rounded-lg border bg-card text-card-foreground shadow-sm overflow-hidden">
1<div class="max-h-[190px] min-h-[190px] overflow-hidden h-full"><div class="image image--loading w-full object-cover"><picture><source type="image/avif" srcSet="https://images.s3rve.co.uk/?width=640&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Faccropress.png&format=avif 640w, https://images.s3rve.co.uk/?width=750&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Faccropress.png&format=avif 750w, https://images.s3rve.co.uk/?width=828&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Faccropress.png&format=avif 828w, https://images.s3rve.co.uk/?width=1080&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Faccropress.png&format=avif 1080w, https://images.s3rve.co.uk/?width=1200&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Faccropress.png&format=avif 1200w, https://images.s3rve.co.uk/?width=1920&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Faccropress.png&format=avif 1920w, https://images.s3rve.co.uk/?width=2048&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Faccropress.png&format=avif 2048w" sizes="(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw"/><source type="image/webp" srcSet="https://images.s3rve.co.uk/?width=640&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Faccropress.png&format=webp 640w, https://images.s3rve.co.uk/?width=750&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Faccropress.png&format=webp 750w, https://images.s3rve.co.uk/?width=828&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Faccropress.png&format=webp 828w, https://images.s3rve.co.uk/?width=1080&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Faccropress.png&format=webp 1080w, https://images.s3rve.co.uk/?width=1200&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Faccropress.png&format=webp 1200w, https://images.s3rve.co.uk/?width=1920&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Faccropress.png&format=webp 1920w, https://images.s3rve.co.uk/?width=2048&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Faccropress.png&format=webp 2048w" sizes="(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw"/><img loading="lazy" src="https://images.s3rve.co.uk/?width=700&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Faccropress.png" srcSet="https://images.s3rve.co.uk/?width=640&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Faccropress.png 640w, https://images.s3rve.co.uk/?width=750&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Faccropress.png 750w, https://images.s3rve.co.uk/?width=828&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Faccropress.png 828w, https://images.s3rve.co.uk/?width=1080&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Faccropress.png 1080w, https://images.s3rve.co.uk/?width=1200&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Faccropress.png 1200w, https://images.s3rve.co.uk/?width=1920&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Faccropress.png 1920w, https://images.s3rve.co.uk/?width=2048&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Faccropress.png 2048w" sizes="(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw" alt="A screenshot of the AccroPress CMS" width="700" height="190" decoding="async" class="image__img"/></picture></div></div><div class="flex flex-col space-y-1.5 p-6"><div class="text-2xl font-semibold tracking-tight leading-7">A custom CMS</div></div><div class="p-6 pt-0"><div class="text-sm text-muted-foreground"><div><p class="text-base">At Accrosoft, I developed a custom CMS called AccroPress, a fully headless system with a React frontend and a Node.js/Express backend. Designed as a hosted service, it was used by various school and job sites worldwide. AccroPress also offered several microservices, including image processing, contact forms, and more.</p></div></div><div class="w-full flex justify-left"><div class="flex flex-wrap gap-2"><a rel="noopener noreferer" class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 border border-input bg-background hover:bg-accent hover:text-accent-foreground h-9 rounded-md px-3 inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 text-muted-foreground" href="https://hireroad.com/" target="_blank">HireRoad<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-external-link inline ml-1" aria-hidden="true"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></a><a rel="noopener noreferer" class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 border border-input bg-background hover:bg-accent hover:text-accent-foreground h-9 rounded-md px-3 inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 text-muted-foreground" href="https://accropress.com" target="_blank">AccroPress<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-external-link inline ml-1" aria-hidden="true"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></a></div></div></div></div><div class="rounded-lg border bg-card text-card-foreground shadow-sm overflow-hidden">
1<div class="max-h-[190px] min-h-[190px] overflow-hidden h-full"><div class="image image--loading w-full object-cover"><picture><source type="image/avif" srcSet="https://images.s3rve.co.uk/?width=640&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbouygues.png&format=avif 640w, https://images.s3rve.co.uk/?width=750&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbouygues.png&format=avif 750w, https://images.s3rve.co.uk/?width=828&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbouygues.png&format=avif 828w, https://images.s3rve.co.uk/?width=1080&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbouygues.png&format=avif 1080w, https://images.s3rve.co.uk/?width=1200&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbouygues.png&format=avif 1200w, https://images.s3rve.co.uk/?width=1920&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbouygues.png&format=avif 1920w, https://images.s3rve.co.uk/?width=2048&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbouygues.png&format=avif 2048w" sizes="(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw"/><source type="image/webp" srcSet="https://images.s3rve.co.uk/?width=640&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbouygues.png&format=webp 640w, https://images.s3rve.co.uk/?width=750&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbouygues.png&format=webp 750w, https://images.s3rve.co.uk/?width=828&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbouygues.png&format=webp 828w, https://images.s3rve.co.uk/?width=1080&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbouygues.png&format=webp 1080w, https://images.s3rve.co.uk/?width=1200&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbouygues.png&format=webp 1200w, https://images.s3rve.co.uk/?width=1920&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbouygues.png&format=webp 1920w, https://images.s3rve.co.uk/?width=2048&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbouygues.png&format=webp 2048w" sizes="(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw"/><img loading="lazy" src="https://images.s3rve.co.uk/?width=700&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbouygues.png" srcSet="https://images.s3rve.co.uk/?width=640&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbouygues.png 640w, https://images.s3rve.co.uk/?width=750&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbouygues.png 750w, https://images.s3rve.co.uk/?width=828&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbouygues.png 828w, https://images.s3rve.co.uk/?width=1080&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbouygues.png 1080w, https://images.s3rve.co.uk/?width=1200&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbouygues.png 1200w, https://images.s3rve.co.uk/?width=1920&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbouygues.png 1920w, https://images.s3rve.co.uk/?width=2048&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbouygues.png 2048w" sizes="(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw" alt="A screenshot of the Bouygues Construction UK career site" width="700" height="190" decoding="async" class="image__img"/></picture></div></div><div class="flex flex-col space-y-1.5 p-6"><div class="text-2xl font-semibold tracking-tight leading-7">Career Sites</div></div><div class="p-6 pt-0"><div class="text-sm text-muted-foreground"><div><p class="text-base">While at Vacancy Filler, I collaborated with clients like Bouygues Construction UK to launch career site initiatives that attract and inform potential candidates about roles across their organization. I also worked with brands such as the Woodland Trust, Longleat, and the Devonshire Group, among others.</p></div></div><div class="w-full flex justify-left"><div class="flex flex-wrap gap-2"><a rel="noopener noreferer" class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 border border-input bg-background hover:bg-accent hover:text-accent-foreground h-9 rounded-md px-3 inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 text-muted-foreground" href="https://careers.bouygues-construction.co.uk/" target="_blank">Bouygues<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-external-link inline ml-1" aria-hidden="true"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></a><a rel="noopener noreferer" class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 border border-input bg-background hover:bg-accent hover:text-accent-foreground h-9 rounded-md px-3 inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 text-muted-foreground" href="https://jobs.woodlandtrust.org.uk/" target="_blank">Woodland Trust<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-external-link inline ml-1" aria-hidden="true"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></a><a rel="noopener noreferer" class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 border border-input bg-background hover:bg-accent hover:text-accent-foreground h-9 rounded-md px-3 inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 text-muted-foreground" href="https://jobs.longleat.co.uk/" target="_blank">Longleat<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-external-link inline ml-1" aria-hidden="true"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></a></div></div></div></div></div><div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-2 gap-4 mt-4"><div class="rounded-lg border bg-card text-card-foreground shadow-sm overflow-hidden"><div class="flex flex-col space-y-1.5 p-6"><div class="text-2xl font-semibold tracking-tight leading-7">TechNutty</div></div><div class="p-6 pt-0"><div class="text-sm text-muted-foreground"><div><p class="text-base">TechNutty was a technology news and reviews site that I started during college/uni in 2011, I ran it for some time as a side project and a way of experimenting with developement. Sadly, a few years back I did choose to shut down this site, so Ive included a link to wayback machine instead :)</p></div></div><div class="w-full flex justify-left"><div class="flex flex-wrap gap-2"><a rel="noopener noreferer" class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 border border-input bg-background hover:bg-accent hover:text-accent-foreground h-9 rounded-md px-3 inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 text-muted-foreground" href="https://web.archive.org/web/collections/*/https://technutty.co.uk" target="_blank">View Archive<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-external-link inline ml-1" aria-hidden="true"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></a></div></div></div></div><div class="rounded-lg border bg-card text-card-foreground shadow-sm overflow-hidden"><div class="flex flex-col space-y-1.5 p-6"><div class="text-2xl font-semibold tracking-tight leading-7">Side Projects</div></div><div class="p-6 pt-0"><div class="text-sm text-muted-foreground"><div><p class="text-base">Alongside my day job, I have a number of side projects that I work on, some of which are open source and can be found on my GitHub. I have a number of projects that I have worked on over the years, some of which are still in development, others are just experiments.</p></div></div><div class="w-full flex justify-left"><div class="flex flex-wrap gap-2"><a rel="noopener noreferer" class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 border border-input bg-background hover:bg-accent hover:text-accent-foreground h-9 rounded-md px-3 inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 text-muted-foreground" href="https://github.com/nicholasgriffintn" target="_blank">My GitHub<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-external-link inline ml-1" aria-hidden="true"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></a></div></div></div></div></div><div class="w-full flex justify-left pt-5"><a class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 bg-primary text-primary-foreground hover:bg-primary/90 h-11 rounded-md px-8 inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 text-primary-foreground" href="/projects" target="_self" data-discover="true">View all of my projects</a></div></section><!--/$--></div></div><div class="pt-5 md:pt-10"></div></div><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]"></ol></div></main><footer class="w-full"><div class="container md:flex items-left justify-left py-4 gap-4"><div><span>© <!-- -->2026<!-- --> Nicholas Griffin.<!-- --> <a rel="noopener noreferrer" class="inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 underline text-primary-foreground" href="https://creativecommons.org/licenses/by-sa/4.0/" target="_blank">CC BY-SA 4.0</a></span></div><div class="hidden md:block"><span> | </span></div><div><nav><ul class="flex items-left space-x-4"><li><a rel="noopener noreferrer" class="inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 underline text-primary-foreground" href="https://absent.computer" target="_blank">Absent Computer</a></li><li><a rel="noopener noreferrer" class="inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 underline text-primary-foreground" href="https://github.com/nicholasgriffintn/NGWebsite2021" target="_blank">Source Code</a></li><li><a class="inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 underline text-primary-foreground" href="/rss" target="_self" data-discover="true">RSS</a></li></ul></nav></div></div></footer>
1<script>((storageKey2, restoreKey) => { 2 if (!window.history.state || !window.history.state.key) { 3 let key = Math.random().toString(32).slice(2); 4 window.history.replaceState({ key }, ""); 5 } 6 try { 7 let storedY = JSON.parse(sessionStorage.getItem(storageKey2) || "{}")[restoreKey || window.history.state.key]; 8 if (typeof storedY === "number") window.scrollTo(0, storedY); 9 } catch (error) { 10 console.error(error); 11 sessionStorage.removeItem(storageKey2); 12 } 13 })("react-router-scroll-positions", null)</script>
13<script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_passThroughRequests":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"unstable_previewServerPrerendering":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":true},"routeDiscovery":{"mode":"lazy","manifestPath":"/__manifest"},"ssr":true,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamController = controller;}}).pipeThrough(new TextEncoderStream());</script>
13<script type="module" async="">; 14import * as route0 from "/assets/root-h6ZwgeJr.js"; 15import * as route1 from "/assets/_index-Dxv6-wim.js"; 16 window.__reactRouterManifest = { 17 "entry": { 18 "module": "/assets/entry.client-D9_1TavW.js", 19 "imports": [ 20 "/assets/jsx-runtime-CnZfasm4.js" 21 ], 22 "css": [] 23 }, 24 "routes": { 25 "root": { 26 "id": "root", 27 "path": "", 28 "hasAction": false, 29 "hasLoader": true, 30 "hasClientAction": false, 31 "hasClientLoader": false, 32 "hasClientMiddleware": false, 33 "hasDefaultExport": true, 34 "hasErrorBoundary": true, 35 "module": "/assets/root-h6ZwgeJr.js", 36 "imports": [ 37 "/assets/jsx-runtime-CnZfasm4.js", 38 "/assets/PageLayout-BT52NK65.js", 39 "/assets/seo-DYmo8BoZ.js" 40 ], 41 "css": [ 42 "/assets/root-Don9vgRC.css" 43 ] 44 }, 45 "routes/_index": { 46 "id": "routes/_index", 47 "parentId": "root", 48 "index": true, 49 "hasAction": false, 50 "hasLoader": true, 51 "hasClientAction": false, 52 "hasClientLoader": false, 53 "hasClientMiddleware": false, 54 "hasDefaultExport": true, 55 "hasErrorBoundary": false, 56 "module": "/assets/_index-Dxv6-wim.js", 57 "imports": [ 58 "/assets/jsx-runtime-CnZfasm4.js", 59 "/assets/BlogCard-Boun56Mn.js", 60 "/assets/ContactLinks-BkqJEEzR.js", 61 "/assets/PageLayout-BT52NK65.js", 62 "/assets/markdown-BM_DXfy3.js", 63 "/assets/InnerPage-3Ro2h29z.js", 64 "/assets/LoadingState-C9aUymVd.js", 65 "/assets/ProjectsList-CYeBXha4.js", 66 "/assets/VideoCardPlayer-CyoTm1Pk.js", 67 "/assets/card-BHNpgO1_.js" 68 ], 69 "css": [ 70 "/assets/_index-DmaHmBr1.css" 71 ] 72 } 73 }, 74 "url": "/assets/manifest-0448b585.js", 75 "version": "0448b585" 76}; 77 window.__reactRouterRouteModules = {"root":route0,"routes/_index":route1}; 78 79import("/assets/entry.client-D9_1TavW.js");</script>
79<!--$-->
79<script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_3\":-5,\"_4\":-5},\"loaderData\",{\"_5\":6,\"_7\":8},\"actionData\",\"errors\",\"root\",{\"_77\":78,\"_79\":80},\"routes/_index\",{\"_9\":10,\"_11\":12,\"_13\":14,\"_15\":16},\"music\",[\"P\",10],\"projects\",[17,18,19,20,21],\"featuredRepos\",[\"P\",14],\"blogPosts\",[\"P\",16],{\"_22\":66,\"_24\":67,\"_26\":68,\"_42\":69,\"_44\":70},{\"_22\":55,\"_24\":56,\"_26\":57,\"_42\":58,\"_44\":59},{\"_22\":39,\"_24\":40,\"_26\":41,\"_42\":43,\"_44\":45},{\"_22\":33,\"_24\":34,\"_26\":35},{\"_22\":23,\"_24\":25,\"_26\":27},\"name\",\"Side Projects\",\"description\",\"Alongside my day job, I have a number of side projects that I work on, some of which are open source and can be found on my GitHub. I have a number of projects that I have worked on over the years, some of which are still in development, others are just experiments.\",\"links\",[28],{\"_29\":30,\"_31\":32},\"title\",\"My GitHub\",\"url\",\"https://github.com/nicholasgriffintn\",\"TechNutty\",\"TechNutty was a technology news and reviews site that I started during college/uni in 2011, I ran it for some time as a side project and a way of experimenting with developement. Sadly, a few years back I did choose to shut down this site, so Ive included a link to wayback machine instead :)\",[36],{\"_29\":37,\"_31\":38},\"View Archive\",\"https://web.archive.org/web/collections/*/https://technutty.co.uk\",\"Career Sites\",\"While at Vacancy Filler, I collaborated with clients like Bouygues Construction UK to launch career site initiatives that attract and inform potential candidates about roles across their organization. I also worked with brands such as the Woodland Trust, Longleat, and the Devonshire Group, among others.\",[46,47,48],\"image\",\"/uploads/site/images/projects/bouygues.png\",\"imageAlt\",\"A screenshot of the Bouygues Construction UK career site\",{\"_29\":53,\"_31\":54},{\"_29\":51,\"_31\":52},{\"_29\":49,\"_31\":50},\"Longleat\",\"https://jobs.longleat.co.uk/\",\"Woodland Trust\",\"https://jobs.woodlandtrust.org.uk/\",\"Bouygues\",\"https://careers.bouygues-construction.co.uk/\",\"A custom CMS\",\"At Accrosoft, I developed a custom CMS called AccroPress, a fully headless system with a React frontend and a Node.js/Express backend. Designed as a hosted service, it was used by various school and job sites worldwide. AccroPress also offered several microservices, including image processing, contact forms, and more.\",[60,61],\"/uploads/site/images/projects/accropress.png\",\"A screenshot of the AccroPress CMS\",{\"_29\":64,\"_31\":65},{\"_29\":62,\"_31\":63},\"AccroPress\",\"https://accropress.com\",\"HireRoad\",\"https://hireroad.com/\",\"BBC Projects\",\"I participate in a range of projects at the BBC. Most recently, I transitioned the BBCâs Open Source site to the [WebCore](https://www.bbc.co.uk/webarchive/https%3A%2F%2Fwww.bbc.co.uk%2Fblogs%2Finternet%2Fentries%2F8673fe2a-e876-45fc-9a5f-203c049c9f9c) service to enhance performance, maintainability, accessibility, and user experience. I also contribute to open-source projects, such as [SQS Consumer](https://github.com/bbc/sqs-consumer), and help teams improve their experimentation capabilities.\",[71,72],\"/uploads/site/images/projects/bbc_open_source.png\",\"A screenshot of the BBC's Open Source site\",{\"_29\":75,\"_31\":76},{\"_29\":73,\"_31\":74},\"BBC GitHub\",\"https://github.com/bbc\",\"BBC Open Source\",\"https://www.bbc.co.uk/opensource\",\"origin\",\"https://nicholasgriffin.dev\",\"canonicalUrl\",\"https://nicholasgriffin.dev/\"]\n");</script>
79<!--$?--><template id="B:4"></template><!--/$--><!--/$-->
79<script id="_R_">requestAnimationFrame(function(){$RT=performance.now()});</script>
79<div hidden id="S:0"></div>
79<script>$RB=[];$RV=function(a){$RT=performance.now();for(var b=0;b<a.length;b+=2){var c=a[b],e=a[b+1];null!==e.parentNode&&e.parentNode.removeChild(e);var f=c.parentNode;if(f){var g=c.previousSibling,h=0;do{if(c&&8===c.nodeType){var d=c.data;if("/$"===d||"/&"===d)if(0===h)break;else h--;else"$"!==d&&"$?"!==d&&"$~"!==d&&"$!"!==d&&"&"!==d||h++}d=c.nextSibling;f.removeChild(c);c=d}while(c);for(;e.firstChild;)f.insertBefore(e.firstChild,c);g.data="$";g._reactRetry&&requestAnimationFrame(g._reactRetry)}}a.length=0}; 80$RC=function(a,b){if(b=document.getElementById(b))(a=document.getElementById(a))?(a.previousSibling.data="$~",$RB.push(a,b),2===$RB.length&&("number"!==typeof $RT?requestAnimationFrame($RV.bind(null,$RB)):(a=performance.now(),setTimeout($RV.bind(null,$RB),2300>a&&2E3<a?2300-a:$RT+300-a)))):b.parentNode.removeChild(b)};$RC("B:0","S:0")</script>
80<div hidden id="S:2"><div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4"><div class="rounded-lg border bg-card text-card-foreground shadow-sm overflow-hidden relative"><div class="max-h-[190px] min-h-[190px] overflow-hidden h-full"><div class="image image--loading w-full object-cover"><picture><source type="image/avif" srcSet="https://images.s3rve.co.uk/?width=640&image=%2Fuploads%2Fposts%2F2026%2F08%2Fi-gave-my-coding-agent-its-own-github-account.png&format=avif 640w, https://images.s3rve.co.uk/?width=750&image=%2Fuploads%2Fposts%2F2026%2F08%2Fi-gave-my-coding-agent-its-own-github-account.png&format=avif 750w, https://images.s3rve.co.uk/?width=828&image=%2Fuploads%2Fposts%2F2026%2F08%2Fi-gave-my-coding-agent-its-own-github-account.png&format=avif 828w, https://images.s3rve.co.uk/?width=1080&image=%2Fuploads%2Fposts%2F2026%2F08%2Fi-gave-my-coding-agent-its-own-github-account.png&format=avif 1080w, https://images.s3rve.co.uk/?width=1200&image=%2Fuploads%2Fposts%2F2026%2F08%2Fi-gave-my-coding-agent-its-own-github-account.png&format=avif 1200w, https://images.s3rve.co.uk/?width=1920&image=%2Fuploads%2Fposts%2F2026%2F08%2Fi-gave-my-coding-agent-its-own-github-account.png&format=avif 1920w, https://images.s3rve.co.uk/?width=2048&image=%2Fuploads%2Fposts%2F2026%2F08%2Fi-gave-my-coding-agent-its-own-github-account.png&format=avif 2048w" sizes="(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw"/><source type="image/webp" srcSet="https://images.s3rve.co.uk/?width=640&image=%2Fuploads%2Fposts%2F2026%2F08%2Fi-gave-my-coding-agent-its-own-github-account.png&format=webp 640w, https://images.s3rve.co.uk/?width=750&image=%2Fuploads%2Fposts%2F2026%2F08%2Fi-gave-my-coding-agent-its-own-github-account.png&format=webp 750w, https://images.s3rve.co.uk/?width=828&image=%2Fuploads%2Fposts%2F2026%2F08%2Fi-gave-my-coding-agent-its-own-github-account.png&format=webp 828w, https://images.s3rve.co.uk/?width=1080&image=%2Fuploads%2Fposts%2F2026%2F08%2Fi-gave-my-coding-agent-its-own-github-account.png&format=webp 1080w, https://images.s3rve.co.uk/?width=1200&image=%2Fuploads%2Fposts%2F2026%2F08%2Fi-gave-my-coding-agent-its-own-github-account.png&format=webp 1200w, https://images.s3rve.co.uk/?width=1920&image=%2Fuploads%2Fposts%2F2026%2F08%2Fi-gave-my-coding-agent-its-own-github-account.png&format=webp 1920w, https://images.s3rve.co.uk/?width=2048&image=%2Fuploads%2Fposts%2F2026%2F08%2Fi-gave-my-coding-agent-its-own-github-account.png&format=webp 2048w" sizes="(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw"/><img loading="lazy" src="https://images.s3rve.co.uk/?width=700&image=%2Fuploads%2Fposts%2F2026%2F08%2Fi-gave-my-coding-agent-its-own-github-account.png" srcSet="https://images.s3rve.co.uk/?width=640&image=%2Fuploads%2Fposts%2F2026%2F08%2Fi-gave-my-coding-agent-its-own-github-account.png 640w, https://images.s3rve.co.uk/?width=750&image=%2Fuploads%2Fposts%2F2026%2F08%2Fi-gave-my-coding-agent-its-own-github-account.png 750w, https://images.s3rve.co.uk/?width=828&image=%2Fuploads%2Fposts%2F2026%2F08%2Fi-gave-my-coding-agent-its-own-github-account.png 828w, https://images.s3rve.co.uk/?width=1080&image=%2Fuploads%2Fposts%2F2026%2F08%2Fi-gave-my-coding-agent-its-own-github-account.png 1080w, https://images.s3rve.co.uk/?width=1200&image=%2Fuploads%2Fposts%2F2026%2F08%2Fi-gave-my-coding-agent-its-own-github-account.png 1200w, https://images.s3rve.co.uk/?width=1920&image=%2Fuploads%2Fposts%2F2026%2F08%2Fi-gave-my-coding-agent-its-own-github-account.png 1920w, https://images.s3rve.co.uk/?width=2048&image=%2Fuploads%2Fposts%2F2026%2F08%2Fi-gave-my-coding-agent-its-own-github-account.png 2048w" sizes="(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw" alt="A terminal showing a git push authenticating as "Nicholas' Clanker" instead of the author's own account." width="700" height="190" decoding="async" class="image__img"/></picture></div></div><div class="flex flex-col space-y-1.5 p-6"><div class="text-2xl font-semibold leading-none tracking-tight"><a class="text-2xl font-semibold leading-7 tracking-tight space-x-2 inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 text-primary-foreground" href="/blog/i-gave-my-coding-agent-its-own-github-account" target="_self" data-discover="true">I gave my coding agent its own GitHub account</a></div></div><div class="p-6 pt-0"><div class="text-sm text-primary-foreground mb-4"><div><p class="text-base">There are security issues around giving AI your GitHub account and I'd rather not have it commit as me, so I gave my AI's their own GitHub App, its own name, and a hook that keeps it from wandering into repos that aren't mine.</p></div><span><a class="inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 underline text-primary-foreground" href="/blog/i-gave-my-coding-agent-its-own-github-account" target="_self" data-discover="true">Read more<span class="sr-only"> about <!-- -->I gave my coding agent its own GitHub account</span></a></span></div><div class="text-sm text-muted-foreground mb-4"><span>Published: <!-- -->25 August 2026</span><div class="flex flex-wrap items-center gap-2"><a class="p-1 hover:underline inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 underline text-muted-foreground" href="/tags/ai" target="_self" data-discover="true">#<!-- -->ai</a><a class="p-1 hover:underline inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 underline text-muted-foreground" href="/tags/agents" target="_self" data-discover="true">#<!-- -->agents</a><a class="p-1 hover:underline inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 underline text-muted-foreground" href="/tags/github" target="_self" data-discover="true">#<!-- -->github</a><a class="p-1 hover:underline inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 underline text-muted-foreground" href="/tags/automation" target="_self" data-discover="true">#<!-- -->automation</a></div></div></div></div><div class="rounded-lg border bg-card text-card-foreground shadow-sm overflow-hidden relative">
80<div class="max-h-[190px] min-h-[190px] overflow-hidden h-full"><div class="image image--loading w-full object-cover"><picture><source type="image/avif" srcSet="https://images.s3rve.co.uk/?width=640&image=%2Fuploads%2Fposts%2F2026%2F08%2Fi-replaced-all-my-readmes-with-a-skill.png&format=avif 640w, https://images.s3rve.co.uk/?width=750&image=%2Fuploads%2Fposts%2F2026%2F08%2Fi-replaced-all-my-readmes-with-a-skill.png&format=avif 750w, https://images.s3rve.co.uk/?width=828&image=%2Fuploads%2Fposts%2F2026%2F08%2Fi-replaced-all-my-readmes-with-a-skill.png&format=avif 828w, https://images.s3rve.co.uk/?width=1080&image=%2Fuploads%2Fposts%2F2026%2F08%2Fi-replaced-all-my-readmes-with-a-skill.png&format=avif 1080w, https://images.s3rve.co.uk/?width=1200&image=%2Fuploads%2Fposts%2F2026%2F08%2Fi-replaced-all-my-readmes-with-a-skill.png&format=avif 1200w, https://images.s3rve.co.uk/?width=1920&image=%2Fuploads%2Fposts%2F2026%2F08%2Fi-replaced-all-my-readmes-with-a-skill.png&format=avif 1920w, https://images.s3rve.co.uk/?width=2048&image=%2Fuploads%2Fposts%2F2026%2F08%2Fi-replaced-all-my-readmes-with-a-skill.png&format=avif 2048w" sizes="(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw"/><source type="image/webp" srcSet="https://images.s3rve.co.uk/?width=640&image=%2Fuploads%2Fposts%2F2026%2F08%2Fi-replaced-all-my-readmes-with-a-skill.png&format=webp 640w, https://images.s3rve.co.uk/?width=750&image=%2Fuploads%2Fposts%2F2026%2F08%2Fi-replaced-all-my-readmes-with-a-skill.png&format=webp 750w, https://images.s3rve.co.uk/?width=828&image=%2Fuploads%2Fposts%2F2026%2F08%2Fi-replaced-all-my-readmes-with-a-skill.png&format=webp 828w, https://images.s3rve.co.uk/?width=1080&image=%2Fuploads%2Fposts%2F2026%2F08%2Fi-replaced-all-my-readmes-with-a-skill.png&format=webp 1080w, https://images.s3rve.co.uk/?width=1200&image=%2Fuploads%2Fposts%2F2026%2F08%2Fi-replaced-all-my-readmes-with-a-skill.png&format=webp 1200w, https://images.s3rve.co.uk/?width=1920&image=%2Fuploads%2Fposts%2F2026%2F08%2Fi-replaced-all-my-readmes-with-a-skill.png&format=webp 1920w, https://images.s3rve.co.uk/?width=2048&image=%2Fuploads%2Fposts%2F2026%2F08%2Fi-replaced-all-my-readmes-with-a-skill.png&format=webp 2048w" sizes="(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw"/><img loading="lazy" src="https://images.s3rve.co.uk/?width=700&image=%2Fuploads%2Fposts%2F2026%2F08%2Fi-replaced-all-my-readmes-with-a-skill.png" srcSet="https://images.s3rve.co.uk/?width=640&image=%2Fuploads%2Fposts%2F2026%2F08%2Fi-replaced-all-my-readmes-with-a-skill.png 640w, https://images.s3rve.co.uk/?width=750&image=%2Fuploads%2Fposts%2F2026%2F08%2Fi-replaced-all-my-readmes-with-a-skill.png 750w, https://images.s3rve.co.uk/?width=828&image=%2Fuploads%2Fposts%2F2026%2F08%2Fi-replaced-all-my-readmes-with-a-skill.png 828w, https://images.s3rve.co.uk/?width=1080&image=%2Fuploads%2Fposts%2F2026%2F08%2Fi-replaced-all-my-readmes-with-a-skill.png 1080w, https://images.s3rve.co.uk/?width=1200&image=%2Fuploads%2Fposts%2F2026%2F08%2Fi-replaced-all-my-readmes-with-a-skill.png 1200w, https://images.s3rve.co.uk/?width=1920&image=%2Fuploads%2Fposts%2F2026%2F08%2Fi-replaced-all-my-readmes-with-a-skill.png 1920w, https://images.s3rve.co.uk/?width=2048&image=%2Fuploads%2Fposts%2F2026%2F08%2Fi-replaced-all-my-readmes-with-a-skill.png 2048w" sizes="(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw" alt="VS Code showing Codex using the Polychat setup skill to answer a question about the repository." width="700" height="190" decoding="async" class="image__img"/></picture></div></div><div class="flex flex-col space-y-1.5 p-6"><div class="text-2xl font-semibold leading-none tracking-tight"><a class="text-2xl font-semibold leading-7 tracking-tight space-x-2 inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 text-primary-foreground" href="/blog/i-replaced-all-my-readmes-with-a-skill" target="_self" data-discover="true">I replaced all my READMEs with a skill</a></div></div><div class="p-6 pt-0"><div class="text-sm text-primary-foreground mb-4"><div><p class="text-base">Polychat had setup instructions, notes, decisions and guides scattered across its monorepo. Instead of adding another README, I turned them into a skill that agents can actually use.</p></div><span><a class="inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 underline text-primary-foreground" href="/blog/i-replaced-all-my-readmes-with-a-skill" target="_self" data-discover="true">Read more<span class="sr-only"> about <!-- -->I replaced all my READMEs with a skill</span></a></span></div><div class="text-sm text-muted-foreground mb-4"><span>Published: <!-- -->14 August 2026</span><div class="flex flex-wrap items-center gap-2"><a class="p-1 hover:underline inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 underline text-muted-foreground" href="/tags/ai" target="_self" data-discover="true">#<!-- -->ai</a><a class="p-1 hover:underline inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 underline text-muted-foreground" href="/tags/agents" target="_self" data-discover="true">#<!-- -->agents</a><a class="p-1 hover:underline inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 underline text-muted-foreground" href="/tags/polychat" target="_self" data-discover="true">#<!-- -->polychat</a><a class="p-1 hover:underline inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 underline text-muted-foreground" href="/tags/skills" target="_self" data-discover="true">#<!-- -->skills</a></div></div></div></div><div class="rounded-lg border bg-card text-card-foreground shadow-sm overflow-hidden relative">
80<div class="max-h-[190px] min-h-[190px] overflow-hidden h-full"><div class="image image--loading w-full object-cover"><picture><source type="image/avif" srcSet="https://images.s3rve.co.uk/?width=640&image=%2Fuploads%2Fposts%2F2026%2F06%2Fpashi-ffmpeg-and-cloudflare-containers-tiny-toolls-with-a-slightly-overpowered-backend%2Fslack-animated.png&format=avif 640w, https://images.s3rve.co.uk/?width=750&image=%2Fuploads%2Fposts%2F2026%2F06%2Fpashi-ffmpeg-and-cloudflare-containers-tiny-toolls-with-a-slightly-overpowered-backend%2Fslack-animated.png&format=avif 750w, https://images.s3rve.co.uk/?width=828&image=%2Fuploads%2Fposts%2F2026%2F06%2Fpashi-ffmpeg-and-cloudflare-containers-tiny-toolls-with-a-slightly-overpowered-backend%2Fslack-animated.png&format=avif 828w, https://images.s3rve.co.uk/?width=1080&image=%2Fuploads%2Fposts%2F2026%2F06%2Fpashi-ffmpeg-and-cloudflare-containers-tiny-toolls-with-a-slightly-overpowered-backend%2Fslack-animated.png&format=avif 1080w, https://images.s3rve.co.uk/?width=1200&image=%2Fuploads%2Fposts%2F2026%2F06%2Fpashi-ffmpeg-and-cloudflare-containers-tiny-toolls-with-a-slightly-overpowered-backend%2Fslack-animated.png&format=avif 1200w, https://images.s3rve.co.uk/?width=1920&image=%2Fuploads%2Fposts%2F2026%2F06%2Fpashi-ffmpeg-and-cloudflare-containers-tiny-toolls-with-a-slightly-overpowered-backend%2Fslack-animated.png&format=avif 1920w, https://images.s3rve.co.uk/?width=2048&image=%2Fuploads%2Fposts%2F2026%2F06%2Fpashi-ffmpeg-and-cloudflare-containers-tiny-toolls-with-a-slightly-overpowered-backend%2Fslack-animated.png&format=avif 2048w" sizes="(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw"/><source type="image/webp" srcSet="https://images.s3rve.co.uk/?width=640&image=%2Fuploads%2Fposts%2F2026%2F06%2Fpashi-ffmpeg-and-cloudflare-containers-tiny-toolls-with-a-slightly-overpowered-backend%2Fslack-animated.png&format=webp 640w, https://images.s3rve.co.uk/?width=750&image=%2Fuploads%2Fposts%2F2026%2F06%2Fpashi-ffmpeg-and-cloudflare-containers-tiny-toolls-with-a-slightly-overpowered-backend%2Fslack-animated.png&format=webp 750w, https://images.s3rve.co.uk/?width=828&image=%2Fuploads%2Fposts%2F2026%2F06%2Fpashi-ffmpeg-and-cloudflare-containers-tiny-toolls-with-a-slightly-overpowered-backend%2Fslack-animated.png&format=webp 828w, https://images.s3rve.co.uk/?width=1080&image=%2Fuploads%2Fposts%2F2026%2F06%2Fpashi-ffmpeg-and-cloudflare-containers-tiny-toolls-with-a-slightly-overpowered-backend%2Fslack-animated.png&format=webp 1080w, https://images.s3rve.co.uk/?width=1200&image=%2Fuploads%2Fposts%2F2026%2F06%2Fpashi-ffmpeg-and-cloudflare-containers-tiny-toolls-with-a-slightly-overpowered-backend%2Fslack-animated.png&format=webp 1200w, https://images.s3rve.co.uk/?width=1920&image=%2Fuploads%2Fposts%2F2026%2F06%2Fpashi-ffmpeg-and-cloudflare-containers-tiny-toolls-with-a-slightly-overpowered-backend%2Fslack-animated.png&format=webp 1920w, https://images.s3rve.co.uk/?width=2048&image=%2Fuploads%2Fposts%2F2026%2F06%2Fpashi-ffmpeg-and-cloudflare-containers-tiny-toolls-with-a-slightly-overpowered-backend%2Fslack-animated.png&format=webp 2048w" sizes="(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw"/><img loading="lazy" src="https://images.s3rve.co.uk/?width=700&image=%2Fuploads%2Fposts%2F2026%2F06%2Fpashi-ffmpeg-and-cloudflare-containers-tiny-toolls-with-a-slightly-overpowered-backend%2Fslack-animated.png" srcSet="https://images.s3rve.co.uk/?width=640&image=%2Fuploads%2Fposts%2F2026%2F06%2Fpashi-ffmpeg-and-cloudflare-containers-tiny-toolls-with-a-slightly-overpowered-backend%2Fslack-animated.png 640w, https://images.s3rve.co.uk/?width=750&image=%2Fuploads%2Fposts%2F2026%2F06%2Fpashi-ffmpeg-and-cloudflare-containers-tiny-toolls-with-a-slightly-overpowered-backend%2Fslack-animated.png 750w, https://images.s3rve.co.uk/?width=828&image=%2Fuploads%2Fposts%2F2026%2F06%2Fpashi-ffmpeg-and-cloudflare-containers-tiny-toolls-with-a-slightly-overpowered-backend%2Fslack-animated.png 828w, https://images.s3rve.co.uk/?width=1080&image=%2Fuploads%2Fposts%2F2026%2F06%2Fpashi-ffmpeg-and-cloudflare-containers-tiny-toolls-with-a-slightly-overpowered-backend%2Fslack-animated.png 1080w, https://images.s3rve.co.uk/?width=1200&image=%2Fuploads%2Fposts%2F2026%2F06%2Fpashi-ffmpeg-and-cloudflare-containers-tiny-toolls-with-a-slightly-overpowered-backend%2Fslack-animated.png 1200w, https://images.s3rve.co.uk/?width=1920&image=%2Fuploads%2Fposts%2F2026%2F06%2Fpashi-ffmpeg-and-cloudflare-containers-tiny-toolls-with-a-slightly-overpowered-backend%2Fslack-animated.png 1920w, https://images.s3rve.co.uk/?width=2048&image=%2Fuploads%2Fposts%2F2026%2F06%2Fpashi-ffmpeg-and-cloudflare-containers-tiny-toolls-with-a-slightly-overpowered-backend%2Fslack-animated.png 2048w" sizes="(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw" alt="A screenshot from Pashi showing animated Slack emoji generation from a Cloudflare Container running FFmpeg" width="700" height="190" decoding="async" class="image__img"/>
80</picture></div></div><div class="flex flex-col space-y-1.5 p-6"><div class="text-2xl font-semibold leading-none tracking-tight"><a class="text-2xl font-semibold leading-7 tracking-tight space-x-2 inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 text-primary-foreground" href="/blog/pashi-ffmpeg-and-cloudflare-containers-tiny-tools-with-a-slightly-overpowered-backend" target="_self" data-discover="true">Pashi, FFmpeg, and Cloudflare Containers: Tiny Tools with a Slightly Overpowered Backend</a></div></div><div class="p-6 pt-0"><div class="text-sm text-primary-foreground mb-4"><div><p class="text-base">This week I've been building a new service for generating and converting things on the fly over an api called Pashi. This post talks about what I got up to with a specific focus on Cloudflare Containers.</p></div><span><a class="inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 underline text-primary-foreground" href="/blog/pashi-ffmpeg-and-cloudflare-containers-tiny-tools-with-a-slightly-overpowered-backend" target="_self" data-discover="true">Read more<span class="sr-only"> about <!-- -->Pashi, FFmpeg, and Cloudflare Containers: Tiny Tools with a Slightly Overpowered Backend</span></a></span></div><div class="text-sm text-muted-foreground mb-4"><span>Published: <!-- -->10 June 2026</span><div class="flex flex-wrap items-center gap-2"><a class="p-1 hover:underline inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 underline text-muted-foreground" href="/tags/cloudflare" target="_self" data-discover="true">#<!-- -->cloudflare</a><a class="p-1 hover:underline inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 underline text-muted-foreground" href="/tags/cloudflare-containers" target="_self" data-discover="true">#<!-- -->cloudflare-containers</a><a class="p-1 hover:underline inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 underline text-muted-foreground" href="/tags/ffmpeg" target="_self" data-discover="true">#<!-- -->ffmpeg</a><a class="p-1 hover:underline inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 underline text-muted-foreground" href="/tags/slack" target="_self" data-discover="true">#<!-- -->slack</a></div></div></div></div><div class="rounded-lg border bg-card text-card-foreground shadow-sm overflow-hidden relative"><div class="max-h-[190px] min-h-[190px] overflow-hidden h-full"><div class="image image--loading w-full object-cover"><picture><source type="image/avif" srcSet="https://images.s3rve.co.uk/?width=640&image=%2Fuploads%2Fposts%2F2026%2F06%2Fadding-realtime-chat-to-polychat%2Ffeatured.png&format=avif 640w, https://images.s3rve.co.uk/?width=750&image=%2Fuploads%2Fposts%2F2026%2F06%2Fadding-realtime-chat-to-polychat%2Ffeatured.png&format=avif 750w, https://images.s3rve.co.uk/?width=828&image=%2Fuploads%2Fposts%2F2026%2F06%2Fadding-realtime-chat-to-polychat%2Ffeatured.png&format=avif 828w, https://images.s3rve.co.uk/?width=1080&image=%2Fuploads%2Fposts%2F2026%2F06%2Fadding-realtime-chat-to-polychat%2Ffeatured.png&format=avif 1080w, https://images.s3rve.co.uk/?width=1200&image=%2Fuploads%2Fposts%2F2026%2F06%2Fadding-realtime-chat-to-polychat%2Ffeatured.png&format=avif 1200w, https://images.s3rve.co.uk/?width=1920&image=%2Fuploads%2Fposts%2F2026%2F06%2Fadding-realtime-chat-to-polychat%2Ffeatured.png&format=avif 1920w, https://images.s3rve.co.uk/?width=2048&image=%2Fuploads%2Fposts%2F2026%2F06%2Fadding-realtime-chat-to-polychat%2Ffeatured.png&format=avif 2048w" sizes="(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw"/><source type="image/webp" srcSet="https://images.s3rve.co.uk/?width=640&image=%2Fuploads%2Fposts%2F2026%2F06%2Fadding-realtime-chat-to-polychat%2Ffeatured.png&format=webp 640w, https://images.s3rve.co.uk/?width=750&image=%2Fuploads%2Fposts%2F2026%2F06%2Fadding-realtime-chat-to-polychat%2Ffeatured.png&format=webp 750w, https://images.s3rve.co.uk/?width=828&image=%2Fuploads%2Fposts%2F2026%2F06%2Fadding-realtime-chat-to-polychat%2Ffeatured.png&format=webp 828w, https://images.s3rve.co.uk/?width=1080&image=%2Fuploads%2Fposts%2F2026%2F06%2Fadding-realtime-chat-to-polychat%2Ffeatured.png&format=webp 1080w, https://images.s3rve.co.uk/?width=1200&image=%2Fuploads%2Fposts%2F2026%2F06%2Fadding-realtime-chat-to-polychat%2Ffeatured.png&format=webp 1200w, https://images.s3rve.co.uk/?width=1920&image=%2Fuploads%2Fposts%2F2026%2F06%2Fadding-realtime-chat-to-polychat%2Ffeatured.png&format=webp 1920w, https://images.s3rve.co.uk/?width=2048&image=%2Fuploads%2Fposts%2F2026%2F06%2Fadding-realtime-chat-to-polychat%2Ffeatured.png&format=webp 2048w" sizes="(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw"/><img loading="lazy" src="https://images.s3rve.co.uk/?width=700&image=%2Fuploads%2Fposts%2F2026%2F06%2Fadding-realtime-chat-to-polychat%2Ffeatured.png" srcSet="https://images.s3rve.co.uk/?width=640&image=%2Fuploads%2Fposts%2F2026%2F06%2Fadding-realtime-chat-to-polychat%2Ffeatured.png 640w, https://images.s3rve.co.uk/?width=750&image=%2Fuploads%2Fposts%2F2026%2F06%2Fadding-realtime-chat-to-polychat%2Ffeatured.png 750w, https://images.s3rve.co.uk/?width=828&image=%2Fuploads%2Fposts%2F2026%2F06%2Fadding-realtime-chat-to-polychat%2Ffeatured.png 828w, https://images.s3rve.co.uk/?width=1080&image=%2Fuploads%2Fposts%2F2026%2F06%2Fadding-realtime-chat-to-polychat%2Ffeatured.png 1080w, https://images.s3rve.co.uk/?width=1200&image=%2Fuploads%2Fposts%2F2026%2F06%2Fadding-realtime-chat-to-polychat%2Ffeatured.png 1200w, https://images.s3rve.co.uk/?width=1920&image=%2Fuploads%2Fposts%2F2026%2F06%2Fadding-realtime-chat-to-polychat%2Ffeatured.png 1920w, https://images.s3rve.co.uk/?width=2048&image=%2Fuploads%2Fposts%2F2026%2F06%2Fadding-realtime-chat-to-polychat%2Ffeatured.png 2048w" sizes="(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw" alt="A GIF showing the Polychat realtime AI chat interface." width="700" height="190" decoding="async" class="image__img"/>
80</picture></div></div><div class="flex flex-col space-y-1.5 p-6"><div class="text-2xl font-semibold leading-none tracking-tight"><a class="text-2xl font-semibold leading-7 tracking-tight space-x-2 inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 text-primary-foreground" href="/blog/adding-realtime-chat-to-polychat" target="_self" data-discover="true">Adding realtime chat to Polychat</a></div></div><div class="p-6 pt-0"><div class="text-sm text-primary-foreground mb-4"><div><p class="text-base">Polychat is my own AI Assistant platform that I've been building out a range of features for quite some time now, gradually making it more capable. With the recent release of GPT Realtime 2, I figured it was time to start on adding a proper realtime interface with GPT and other providers.</p></div><span><a class="inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 underline text-primary-foreground" href="/blog/adding-realtime-chat-to-polychat" target="_self" data-discover="true">Read more<span class="sr-only"> about <!-- -->Adding realtime chat to Polychat</span></a></span></div><div class="text-sm text-muted-foreground mb-4"><span>Published: <!-- -->1 June 2026</span><div class="flex flex-wrap items-center gap-2"><a class="p-1 hover:underline inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 underline text-muted-foreground" href="/tags/ai" target="_self" data-discover="true">#<!-- -->ai</a><a class="p-1 hover:underline inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 underline text-muted-foreground" href="/tags/realtime" target="_self" data-discover="true">#<!-- -->realtime</a><a class="p-1 hover:underline inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 underline text-muted-foreground" href="/tags/openai" target="_self" data-discover="true">#<!-- -->openai</a><a class="p-1 hover:underline inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 underline text-muted-foreground" href="/tags/gemini" target="_self" data-discover="true">#<!-- -->gemini</a><a class="p-1 hover:underline inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 underline text-muted-foreground" href="/tags/mistral" target="_self" data-discover="true">#<!-- -->mistral</a></div></div></div></div><div class="rounded-lg border bg-card text-card-foreground shadow-sm overflow-hidden relative"><div class="max-h-[190px] min-h-[190px] overflow-hidden h-full"><div class="image image--loading w-full object-cover"><picture><source type="image/avif" srcSet="https://images.s3rve.co.uk/?width=640&image=%2Fuploads%2Fposts%2F2026%2F06%2Fupgrading-beacon-to-be-openfeature-compatible%2Fdashboard.png&format=avif 640w, https://images.s3rve.co.uk/?width=750&image=%2Fuploads%2Fposts%2F2026%2F06%2Fupgrading-beacon-to-be-openfeature-compatible%2Fdashboard.png&format=avif 750w, https://images.s3rve.co.uk/?width=828&image=%2Fuploads%2Fposts%2F2026%2F06%2Fupgrading-beacon-to-be-openfeature-compatible%2Fdashboard.png&format=avif 828w, https://images.s3rve.co.uk/?width=1080&image=%2Fuploads%2Fposts%2F2026%2F06%2Fupgrading-beacon-to-be-openfeature-compatible%2Fdashboard.png&format=avif 1080w, https://images.s3rve.co.uk/?width=1200&image=%2Fuploads%2Fposts%2F2026%2F06%2Fupgrading-beacon-to-be-openfeature-compatible%2Fdashboard.png&format=avif 1200w, https://images.s3rve.co.uk/?width=1920&image=%2Fuploads%2Fposts%2F2026%2F06%2Fupgrading-beacon-to-be-openfeature-compatible%2Fdashboard.png&format=avif 1920w, https://images.s3rve.co.uk/?width=2048&image=%2Fuploads%2Fposts%2F2026%2F06%2Fupgrading-beacon-to-be-openfeature-compatible%2Fdashboard.png&format=avif 2048w" sizes="(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw"/><source type="image/webp" srcSet="https://images.s3rve.co.uk/?width=640&image=%2Fuploads%2Fposts%2F2026%2F06%2Fupgrading-beacon-to-be-openfeature-compatible%2Fdashboard.png&format=webp 640w, https://images.s3rve.co.uk/?width=750&image=%2Fuploads%2Fposts%2F2026%2F06%2Fupgrading-beacon-to-be-openfeature-compatible%2Fdashboard.png&format=webp 750w, https://images.s3rve.co.uk/?width=828&image=%2Fuploads%2Fposts%2F2026%2F06%2Fupgrading-beacon-to-be-openfeature-compatible%2Fdashboard.png&format=webp 828w, https://images.s3rve.co.uk/?width=1080&image=%2Fuploads%2Fposts%2F2026%2F06%2Fupgrading-beacon-to-be-openfeature-compatible%2Fdashboard.png&format=webp 1080w, https://images.s3rve.co.uk/?width=1200&image=%2Fuploads%2Fposts%2F2026%2F06%2Fupgrading-beacon-to-be-openfeature-compatible%2Fdashboard.png&format=webp 1200w, https://images.s3rve.co.uk/?width=1920&image=%2Fuploads%2Fposts%2F2026%2F06%2Fupgrading-beacon-to-be-openfeature-compatible%2Fdashboard.png&format=webp 1920w, https://images.s3rve.co.uk/?width=2048&image=%2Fuploads%2Fposts%2F2026%2F06%2Fupgrading-beacon-to-be-openfeature-compatible%2Fdashboard.png&format=webp 2048w" sizes="(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw"/><img loading="lazy" src="https://images.s3rve.co.uk/?width=700&image=%2Fuploads%2Fposts%2F2026%2F06%2Fupgrading-beacon-to-be-openfeature-compatible%2Fdashboard.png" srcSet="https://images.s3rve.co.uk/?width=640&image=%2Fuploads%2Fposts%2F2026%2F06%2Fupgrading-beacon-to-be-openfeature-compatible%2Fdashboard.png 640w, https://images.s3rve.co.uk/?width=750&image=%2Fuploads%2Fposts%2F2026%2F06%2Fupgrading-beacon-to-be-openfeature-compatible%2Fdashboard.png 750w, https://images.s3rve.co.uk/?width=828&image=%2Fuploads%2Fposts%2F2026%2F06%2Fupgrading-beacon-to-be-openfeature-compatible%2Fdashboard.png 828w, https://images.s3rve.co.uk/?width=1080&image=%2Fuploads%2Fposts%2F2026%2F06%2Fupgrading-beacon-to-be-openfeature-compatible%2Fdashboard.png 1080w, https://images.s3rve.co.uk/?width=1200&image=%2Fuploads%2Fposts%2F2026%2F06%2Fupgrading-beacon-to-be-openfeature-compatible%2Fdashboard.png 1200w, https://images.s3rve.co.uk/?width=1920&image=%2Fuploads%2Fposts%2F2026%2F06%2Fupgrading-beacon-to-be-openfeature-compatible%2Fdashboard.png 1920w, https://images.s3rve.co.uk/?width=2048&image=%2Fuploads%2Fposts%2F2026%2F06%2Fupgrading-beacon-to-be-openfeature-compatible%2Fdashboard.png 2048w" sizes="(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw" alt="A screenshot of the Beacon dashboard with feature flag configuration." width="700" height="190" decoding="async" class="image__img"/>
80</picture></div></div><div class="flex flex-col space-y-1.5 p-6"><div class="text-2xl font-semibold leading-none tracking-tight"><a class="text-2xl font-semibold leading-7 tracking-tight space-x-2 inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 text-primary-foreground" href="/blog/upgrading-beacon-to-be-openfeature-compatible" target="_self" data-discover="true">Upgrading Beacon to be OpenFeature Compatible</a></div></div><div class="p-6 pt-0"><div class="text-sm text-primary-foreground mb-4"><div><p class="text-base">Some time ago I started work on my own analytics and experimentation service that I called Beacon as a way to experiment with Cloudflare Pipelines for a scalable system without additional services. Recently, I've been looking into OpenFeature as a standard. In this blog post, I will be upgrading Beacon to use this system.</p></div><span><a class="inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 underline text-primary-foreground" href="/blog/upgrading-beacon-to-be-openfeature-compatible" target="_self" data-discover="true">Read more<span class="sr-only"> about <!-- -->Upgrading Beacon to be OpenFeature Compatible</span></a></span></div><div class="text-sm text-muted-foreground mb-4"><span>Published: <!-- -->31 May 2026</span><div class="flex flex-wrap items-center gap-2"><a class="p-1 hover:underline inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 underline text-muted-foreground" href="/tags/cloudflare" target="_self" data-discover="true">#<!-- -->cloudflare</a><a class="p-1 hover:underline inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 underline text-muted-foreground" href="/tags/analytics" target="_self" data-discover="true">#<!-- -->analytics</a><a class="p-1 hover:underline inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 underline text-muted-foreground" href="/tags/experimentation" target="_self" data-discover="true">#<!-- -->experimentation</a><a class="p-1 hover:underline inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 underline text-muted-foreground" href="/tags/feature-flags" target="_self" data-discover="true">#<!-- -->feature-flags</a><a class="p-1 hover:underline inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 underline text-muted-foreground" href="/tags/openfeature" target="_self" data-discover="true">#<!-- -->openfeature</a><a class="p-1 hover:underline inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 underline text-muted-foreground" href="/tags/cloudflare-workers" target="_self" data-discover="true">#<!-- -->cloudflare-workers</a></div></div></div></div><div class="rounded-lg border bg-card text-card-foreground shadow-sm overflow-hidden relative"><div class="max-h-[190px] min-h-[190px] overflow-hidden h-full"><div class="image image--loading w-full object-cover"><picture><source type="image/avif" srcSet="https://images.s3rve.co.uk/?width=640&image=%2Fuploads%2Fposts%2F2026%2F06%2Ftraining-and-deploying-hugging-face-models-on-aws%2Ftraining-deployments.png&format=avif 640w, https://images.s3rve.co.uk/?width=750&image=%2Fuploads%2Fposts%2F2026%2F06%2Ftraining-and-deploying-hugging-face-models-on-aws%2Ftraining-deployments.png&format=avif 750w, https://images.s3rve.co.uk/?width=828&image=%2Fuploads%2Fposts%2F2026%2F06%2Ftraining-and-deploying-hugging-face-models-on-aws%2Ftraining-deployments.png&format=avif 828w, https://images.s3rve.co.uk/?width=1080&image=%2Fuploads%2Fposts%2F2026%2F06%2Ftraining-and-deploying-hugging-face-models-on-aws%2Ftraining-deployments.png&format=avif 1080w, https://images.s3rve.co.uk/?width=1200&image=%2Fuploads%2Fposts%2F2026%2F06%2Ftraining-and-deploying-hugging-face-models-on-aws%2Ftraining-deployments.png&format=avif 1200w, https://images.s3rve.co.uk/?width=1920&image=%2Fuploads%2Fposts%2F2026%2F06%2Ftraining-and-deploying-hugging-face-models-on-aws%2Ftraining-deployments.png&format=avif 1920w, https://images.s3rve.co.uk/?width=2048&image=%2Fuploads%2Fposts%2F2026%2F06%2Ftraining-and-deploying-hugging-face-models-on-aws%2Ftraining-deployments.png&format=avif 2048w" sizes="(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw"/><source type="image/webp" srcSet="https://images.s3rve.co.uk/?width=640&image=%2Fuploads%2Fposts%2F2026%2F06%2Ftraining-and-deploying-hugging-face-models-on-aws%2Ftraining-deployments.png&format=webp 640w, https://images.s3rve.co.uk/?width=750&image=%2Fuploads%2Fposts%2F2026%2F06%2Ftraining-and-deploying-hugging-face-models-on-aws%2Ftraining-deployments.png&format=webp 750w, https://images.s3rve.co.uk/?width=828&image=%2Fuploads%2Fposts%2F2026%2F06%2Ftraining-and-deploying-hugging-face-models-on-aws%2Ftraining-deployments.png&format=webp 828w, https://images.s3rve.co.uk/?width=1080&image=%2Fuploads%2Fposts%2F2026%2F06%2Ftraining-and-deploying-hugging-face-models-on-aws%2Ftraining-deployments.png&format=webp 1080w, https://images.s3rve.co.uk/?width=1200&image=%2Fuploads%2Fposts%2F2026%2F06%2Ftraining-and-deploying-hugging-face-models-on-aws%2Ftraining-deployments.png&format=webp 1200w, https://images.s3rve.co.uk/?width=1920&image=%2Fuploads%2Fposts%2F2026%2F06%2Ftraining-and-deploying-hugging-face-models-on-aws%2Ftraining-deployments.png&format=webp 1920w, https://images.s3rve.co.uk/?width=2048&image=%2Fuploads%2Fposts%2F2026%2F06%2Ftraining-and-deploying-hugging-face-models-on-aws%2Ftraining-deployments.png&format=webp 2048w" sizes="(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw"/><img loading="lazy" src="https://images.s3rve.co.uk/?width=700&image=%2Fuploads%2Fposts%2F2026%2F06%2Ftraining-and-deploying-hugging-face-models-on-aws%2Ftraining-deployments.png" srcSet="https://images.s3rve.co.uk/?width=640&image=%2Fuploads%2Fposts%2F2026%2F06%2Ftraining-and-deploying-hugging-face-models-on-aws%2Ftraining-deployments.png 640w, https://images.s3rve.co.uk/?width=750&image=%2Fuploads%2Fposts%2F2026%2F06%2Ftraining-and-deploying-hugging-face-models-on-aws%2Ftraining-deployments.png 750w, https://images.s3rve.co.uk/?width=828&image=%2Fuploads%2Fposts%2F2026%2F06%2Ftraining-and-deploying-hugging-face-models-on-aws%2Ftraining-deployments.png 828w, https://images.s3rve.co.uk/?width=1080&image=%2Fuploads%2Fposts%2F2026%2F06%2Ftraining-and-deploying-hugging-face-models-on-aws%2Ftraining-deployments.png 1080w, https://images.s3rve.co.uk/?width=1200&image=%2Fuploads%2Fposts%2F2026%2F06%2Ftraining-and-deploying-hugging-face-models-on-aws%2Ftraining-deployments.png 1200w, https://images.s3rve.co.uk/?width=1920&image=%2Fuploads%2Fposts%2F2026%2F06%2Ftraining-and-deploying-hugging-face-models-on-aws%2Ftraining-deployments.png 1920w, https://images.s3rve.co.uk/?width=2048&image=%2Fuploads%2Fposts%2F2026%2F06%2Ftraining-and-deploying-hugging-face-models-on-aws%2Ftraining-deployments.png 2048w" sizes="(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw" alt="A screenshot of my new deployments interface for models training." width="700" height="190" decoding="async" class="image__img"/>
80</picture></div></div><div class="flex flex-col space-y-1.5 p-6"><div class="text-2xl font-semibold leading-none tracking-tight"><a class="text-2xl font-semibold leading-7 tracking-tight space-x-2 inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 text-primary-foreground" href="/blog/training-and-deploying-hugging-face-models-on-aws" target="_self" data-discover="true">Training and Deploying Hugging Face Models on AWS</a></div></div><div class="p-6 pt-0"><div class="text-sm text-primary-foreground mb-4"><div><p class="text-base">Creating a new API driven setup for training and deploying models from Hugging Face to AWS, building on and extending the work I did previously with my fine tuning service in Polychat.</p></div><span><a class="inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 underline text-primary-foreground" href="/blog/training-and-deploying-hugging-face-models-on-aws" target="_self" data-discover="true">Read more<span class="sr-only"> about <!-- -->Training and Deploying Hugging Face Models on AWS</span></a></span></div><div class="text-sm text-muted-foreground mb-4"><span>Published: <!-- -->30 May 2026</span><div class="flex flex-wrap items-center gap-2"><a class="p-1 hover:underline inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 underline text-muted-foreground" href="/tags/aws" target="_self" data-discover="true">#<!-- -->aws</a><a class="p-1 hover:underline inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 underline text-muted-foreground" href="/tags/ai" target="_self" data-discover="true">#<!-- -->ai</a><a class="p-1 hover:underline inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 underline text-muted-foreground" href="/tags/hugging-face" target="_self" data-discover="true">#<!-- -->hugging-face</a><a class="p-1 hover:underline inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 underline text-muted-foreground" href="/tags/sagemaker" target="_self" data-discover="true">#<!-- -->sagemaker</a><a class="p-1 hover:underline inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 underline text-muted-foreground" href="/tags/bedrock" target="_self" data-discover="true">#<!-- -->bedrock</a><a class="p-1 hover:underline inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 underline text-muted-foreground" href="/tags/fine-tuning" target="_self" data-discover="true">#<!-- -->fine-tuning</a></div></div></div></div></div></div>
80<script>$RC("B:2","S:2")</script>
80<div hidden id="S:4">
80<script>window.__reactRouterContext.streamController.enqueue("P16:[[82,83,84,85,86,87],{\"_88\":176,\"_29\":177,\"_91\":176,\"_92\":93,\"_94\":95,\"_24\":178,\"_97\":98,\"_99\":179,\"_101\":-5,\"_102\":180,\"_104\":181,\"_106\":182,\"_108\":183,\"_110\":111,\"_112\":111,\"_113\":184},{\"_88\":164,\"_29\":165,\"_91\":164,\"_92\":93,\"_94\":95,\"_24\":166,\"_97\":98,\"_99\":167,\"_101\":-5,\"_102\":168,\"_104\":169,\"_106\":170,\"_108\":171,\"_110\":111,\"_112\":111,\"_113\":172},{\"_88\":152,\"_29\":153,\"_91\":152,\"_92\":93,\"_94\":95,\"_24\":154,\"_97\":98,\"_99\":155,\"_101\":-5,\"_102\":156,\"_104\":157,\"_106\":158,\"_108\":159,\"_110\":111,\"_112\":111,\"_113\":160},{\"_88\":139,\"_29\":140,\"_91\":139,\"_92\":93,\"_94\":95,\"_24\":141,\"_97\":98,\"_99\":142,\"_101\":-5,\"_102\":143,\"_104\":144,\"_106\":145,\"_108\":146,\"_110\":111,\"_112\":111,\"_113\":147},{\"_88\":124,\"_29\":125,\"_91\":124,\"_92\":93,\"_94\":95,\"_24\":126,\"_97\":98,\"_99\":127,\"_101\":-5,\"_102\":128,\"_104\":129,\"_106\":130,\"_108\":131,\"_110\":111,\"_112\":111,\"_113\":132},{\"_88\":89,\"_29\":90,\"_91\":89,\"_92\":93,\"_94\":95,\"_24\":96,\"_97\":98,\"_99\":100,\"_101\":-5,\"_102\":103,\"_104\":105,\"_106\":107,\"_108\":109,\"_110\":111,\"_112\":111,\"_113\":114},\"id\",\"training-and-deploying-hugging-face-models-on-aws\",\"Training and Deploying Hugging Face Models on AWS\",\"slug\",\"type\",\"blog\",\"content\",\"\",\"Creating a new API driven setup for training and deploying models from Hugging Face to AWS, building on and extending the work I did previously with my fine tuning service in Polychat.\",\"has_fixed_description\",true,\"created_at\",\"2026-05-30T18:09\",\"updated_at\",\"image_url\",\"/uploads/posts/2026/06/training-and-deploying-hugging-face-models-on-aws/training-deployments.png\",\"image_alt\",\"A screenshot of my new deployments interface for models training.\",\"metadata\",{\"_121\":98,\"_122\":111,\"_123\":-5},\"tags\",[115,116,117,118,119,120],\"draft\",false,\"archived\",\"audio_url\",\"audio/training-and-deploying-hugging-face-models-on-aws.mp3\",\"aws\",\"ai\",\"hugging-face\",\"sagemaker\",\"bedrock\",\"fine-tuning\",\"hideFeaturedImage\",\"isBookmark\",\"link\",\"upgrading-beacon-to-be-openfeature-compatible\",\"Upgrading Beacon to be OpenFeature Compatible\",\"Some time ago I started work on my own analytics and experimentation service that I called Beacon as a way to experiment with Cloudflare Pipelines for a scalable system without additional services. Recently, I've been looking into OpenFeature as a standard. In this blog post, I will be upgrading Beacon to use this system.\",\"2026-05-31T16:28\",\"/uploads/posts/2026/06/upgrading-beacon-to-be-openfeature-compatible/dashboard.png\",\"A screenshot of the Beacon dashboard with feature flag configuration.\",{\"_121\":111,\"_122\":111,\"_123\":-5},[133,134,135,136,137,138],\"audio/upgrading-beacon-to-be-openfeature-compatible.mp3\",\"cloudflare\",\"analytics\",\"experimentation\",\"feature-flags\",\"openfeature\",\"cloudflare-workers\",\"adding-realtime-chat-to-polychat\",\"Adding realtime chat to Polychat\",\"Polychat is my own AI Assistant platform that I've been building out a range of features for quite some time now, gradually making it more capable. With the recent release of GPT Realtime 2, I figured it was time to start on adding a proper realtime interface with GPT and other providers.\",\"2026-06-01T00:00\",\"/uploads/posts/2026/06/adding-realtime-chat-to-polychat/featured.png\",\"A GIF showing the Polychat realtime AI chat interface.\",{\"_121\":98,\"_122\":111,\"_123\":-5},[116,148,149,150,151],\"audio/adding-realtime-chat-to-polychat.mp3\",\"realtime\",\"openai\",\"gemini\",\"mistral\",\"pashi-ffmpeg-and-cloudflare-containers-tiny-tools-with-a-slightly-overpowered-backend\",\"Pashi, FFmpeg, and Cloudflare Containers: Tiny Tools with a Slightly Overpowered Backend\",\"This week I've been building a new service for generating and converting things on the fly over an api called Pashi. This post talks about what I got up to with a specific focus on Cloudflare Containers.\",\"2026-06-10T01:15\",\"/uploads/posts/2026/06/pashi-ffmpeg-and-cloudflare-containers-tiny-toolls-with-a-slightly-overpowered-backend/slack-animated.png\",\"A screenshot from Pashi showing animated Slack emoji generation from a Cloudflare Container running FFmpeg\",{\"_121\":98,\"_122\":111,\"_123\":-5},[133,161,162,163],\"audio/pashi-ffmpeg-and-cloudflare-containers-tiny-tools-with-a-slightly-overpowered-backend.mp3\",\"cloudflare-containers\",\"ffmpeg\",\"slack\",\"i-replaced-all-my-readmes-with-a-skill\",\"I replaced all my READMEs with a skill\",\"Polychat had setup instructions, notes, decisions and guides scattered across its monorepo. Instead of adding another README, I turned them into a skill that agents can actually use.\",\"2026-08-14T04:54\",\"/uploads/posts/2026/08/i-replaced-all-my-readmes-with-a-skill.png\",\"VS Code showing Codex using the Polychat setup skill to answer a question about the repository.\",{\"_121\":111,\"_122\":111,\"_123\":-5},[116,173,174,175],\"audio/i-replaced-all-my-readmes-with-a-skill.mp3\",\"agents\",\"polychat\",\"skills\",\"i-gave-my-coding-agent-its-own-github-account\",\"I gave my coding agent its own GitHub account\",\"There are security issues around giving AI your GitHub account and I'd rather not have it commit as me, so I gave my AI's their own GitHub App, its own name, and a hook that keeps it from wandering into repos that aren't mine.\",\"2026-08-25T21:40\",\"/uploads/posts/2026/08/i-gave-my-coding-agent-its-own-github-account.png\",\"A terminal showing a git push authenticating as \\\"Nicholas' Clanker\\\" instead of the author's own account.\",{\"_121\":111,\"_122\":111,\"_123\":-5},[116,173,185,186],\"audio/i-gave-my-coding-agent-its-own-github-account.mp3\",\"github\",\"automation\"]\n");</script>
80<!--$?--><template id="B:5"></template><!--/$--></div>
80<script>$RC("B:4","S:4")</script>
80<div hidden id="S:1"><div id="applemusic-widget"><!--$?--><template id="B:6"></template><div>Loading...</div><!--/$--></div><div class="text-sm text-muted-foreground text-center inline-flex justify-center w-full mt-5"><span>What I'm listening to</span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-up" aria-hidden="true"><path d="m18 15-6-6-6 6"></path></svg></div></div>
80<script>$RC("B:1","S:1")</script>
80<div hidden id="S:5">
80<script>window.__reactRouterContext.streamController.enqueue("P10:[{\"_188\":189,\"_190\":191},\"provider\",\"lastfm\",\"tracks\",[192,193,194,195,196,197,198,199,200,201],{\"_88\":252,\"_22\":253,\"_204\":254,\"_206\":255,\"_31\":256,\"_209\":257,\"_211\":-5,\"_212\":111},{\"_88\":246,\"_22\":247,\"_204\":248,\"_206\":249,\"_31\":250,\"_209\":251,\"_211\":-5,\"_212\":111},{\"_88\":240,\"_22\":241,\"_204\":242,\"_206\":243,\"_31\":244,\"_209\":245,\"_211\":-5,\"_212\":111},{\"_88\":234,\"_22\":235,\"_204\":236,\"_206\":237,\"_31\":238,\"_209\":239,\"_211\":-5,\"_212\":111},{\"_88\":228,\"_22\":229,\"_204\":230,\"_206\":231,\"_31\":232,\"_209\":233,\"_211\":-5,\"_212\":111},{\"_88\":224,\"_22\":225,\"_204\":226,\"_206\":207,\"_31\":227,\"_209\":210,\"_211\":-5,\"_212\":111},{\"_88\":220,\"_22\":221,\"_204\":222,\"_206\":207,\"_31\":223,\"_209\":210,\"_211\":-5,\"_212\":111},{\"_88\":216,\"_22\":217,\"_204\":218,\"_206\":207,\"_31\":219,\"_209\":210,\"_211\":-5,\"_212\":111},{\"_88\":213,\"_22\":214,\"_204\":205,\"_206\":207,\"_31\":215,\"_209\":210,\"_211\":-5,\"_212\":111},{\"_88\":202,\"_22\":203,\"_204\":205,\"_206\":207,\"_31\":208,\"_209\":210,\"_211\":-5,\"_212\":111},\"de22aa44-5ace-4d13-ba95-51a5780e3cdc\",\"d1g_it.core\",\"artistName\",\"Bring Me The Horizon \u0026 HM Surf\",\"albumName\",\"Lo-files\",\"https://www.last.fm/music/Bring+Me+The+Horizon+\u0026+HM+Surf/_/d1g_it.core\",\"artworkUrl\",\"https://lastfm-img.freetls.fastly.net/i/u/300x300/e73c176ea534f27c5e4f950787004ee8.jpg\",\"previewUrl\",\"isNowPlaying\",\"4c9c795b-0813-413e-8f85-0402e50e7ed9\",\"DiE4u.sysrsk\",\"https://www.last.fm/music/Bring+Me+The+Horizon+\u0026+HM+Surf/_/DiE4u.sysrsk\",\"902aabd6-11b2-45b7-9986-6b2a87c8afe7\",\"koolaid.xxo\",\"Bring Me The Horizon \u0026 Drxnk\",\"https://www.last.fm/music/Bring+Me+The+Horizon+\u0026+Drxnk/_/koolaid.xxo\",\"7afda1e6-b560-48dc-96bd-8c2547d8190f\",\"sTr4nG3r5.vsn0\",\"Bring Me The Horizon \u0026 Dimension 32\",\"https://www.last.fm/music/Bring+Me+The+Horizon+\u0026+Dimension+32/_/sTr4nG3r5.vsn0\",\"03d3235f-e461-4c15-b88c-c92ef0f9baa2\",\"parasite.ev3\",\"Bring Me The Horizon \u0026 Mondo Loops\",\"https://www.last.fm/music/Bring+Me+The+Horizon+\u0026+Mondo+Loops/_/parasite.ev3\",\"b82fb90c-dc4f-42d9-8e4a-4af76078fd9b\",\"Heavydirtysoul\",\"Twenty One Pilots\",\"Blurryface\",\"https://www.last.fm/music/Twenty+One+Pilots/_/Heavydirtysoul\",\"https://lastfm-img.freetls.fastly.net/i/u/300x300/6f9906f43b7b516e89f9ebc331dd990a.jpg\",\"Linkin Park-Heavy (feat. Kiiara)-1782556363\",\"Heavy (feat. Kiiara)\",\"Linkin Park\",\"One More Light\",\"https://www.last.fm/music/Linkin+Park/_/Heavy+(feat.+Kiiara)\",\"https://lastfm-img.freetls.fastly.net/i/u/300x300/5e03d7c6d69c19819b07cef436e73413.jpg\",\"Trankilo-how long to get there?-1782556772\",\"how long to get there?\",\"Trankilo\",\"how long to get there? / float - Single\",\"https://www.last.fm/music/Trankilo/_/how+long+to+get+there%3F\",\"https://lastfm-img.freetls.fastly.net/i/u/300x300/2a96cbd8b46e442fc41c2b86b821562f.png\",\"577a1d74-9cfa-4d79-a6ca-8d82aa26b4ef\",\"Take What You Want (feat. Ozzy Osbourne \u0026 Travis Scott)\",\"Post Malone\",\"The Diamond Collection (Deluxe)\",\"https://www.last.fm/music/Post+Malone/_/Take+What+You+Want+(feat.+Ozzy+Osbourne+\u0026+Travis+Scott)\",\"https://lastfm-img.freetls.fastly.net/i/u/300x300/2f39969897d5de3f0395b63a889d8467.jpg\",\"43ad366d-30e0-4360-b6e4-bffd7a3438fc\",\"Damocles\",\"Sleep Token\",\"Even In Arcadia\",\"https://www.last.fm/music/Sleep+Token/_/Damocles\",\"https://lastfm-img.freetls.fastly.net/i/u/300x300/ca59461ca9b6b14cfc9c1183dbd82a8b.jpg\"]\n");</script>
80<!--$?--><template id="B:7"></template><!--/$--></div>
80<script>$RC("B:5","S:5")</script>
80<div hidden id="S:6"><div class="applemusic-widget-latest"><div class="applemusic-widget-latest-background" style="position:relative"><div class="image image--loading" style="position:relative;width:100%;height:100%"><picture style="display:block;width:100%;height:100%"><img loading="lazy" src="https://lastfm-img.freetls.fastly.net/i/u/300x300/ca59461ca9b6b14cfc9c1183dbd82a8b.jpg" alt="Damocles" decoding="async" class="image__img" style="position:absolute;inset:0;width:100%;height:100%;object-fit:cover"/></picture></div></div><div class="applemusic-widget-latest-overlay"><div class="applemusic-widget-latest-actions"><div class="applemusic-widget-latest-meta"><h3>Damocles</h3><span>Sleep Token</span><span>Even In Arcadia</span></div><a aria-label="Open Damocles" class="trackLinkPlay" rel="noopener noreferrer nofollow" target="_blank" href="https://www.last.fm/music/Sleep+Token/_/Damocles" data-playing="false"><svg role="presentation" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 60 60"><path d="M45.563 29.174l-22-15A1 1 0 1 0 22 15v30a.999.999 0 0 0 1.563.826l22-15a1 1 0 0 0 0-1.652zM24 43.107V16.893L43.225 30 24 43.107z"></path><path d="M30 0C13.458 0 0 13.458 0 30s13.458 30 30 30 30-13.458 30-30S46.542 0 30 0zm0 58C14.561 58 2 45.439 2 30S14.561 2 30 2s28 12.561 28 28-12.561 28-28 28z"></path></svg></a></div></div></div><div class="applemusic-widget-tracks"><div class="applemusic-widget-track-item"><div class="applemusic-widget-track-item-image"><div class="applemusic-widget-track-item-image-inner"><div class="image image--loading"><picture><img loading="lazy" src="https://lastfm-img.freetls.fastly.net/i/u/300x300/2f39969897d5de3f0395b63a889d8467.jpg" alt="The Diamond Collection (Deluxe)" width="53" height="53" decoding="async" class="image__img" style="object-fit:cover"/></picture></div><a aria-label="Open Take What You Want (feat. Ozzy Osbourne & Travis Scott)" class="applemusic-widget-track-item-play" rel="noopener noreferrer nofollow" target="_blank" href="https://www.last.fm/music/Post+Malone/_/Take+What+You+Want+(feat.+Ozzy+Osbourne+&+Travis+Scott)" data-playing="false"><svg role="presentation" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 60 60"><path d="M45.563 29.174l-22-15A1 1 0 1 0 22 15v30a.999.999 0 0 0 1.563.826l22-15a1 1 0 0 0 0-1.652zM24 43.107V16.893L43.225 30 24 43.107z"></path><path d="M30 0C13.458 0 0 13.458 0 30s13.458 30 30 30 30-13.458 30-30S46.542 0 30 0zm0 58C14.561 58 2 45.439 2 30S14.561 2 30 2s28 12.561 28 28-12.561 28-28 28z"></path></svg></a></div></div><div class="applemusic-widget-track-item-content"><div class="applemusic-widget-track-item-text"><h3>Take What You Want (feat. Ozzy Osbourne & Travis Scott)</h3><span>Post Malone</span><span>The Diamond Collection (Deluxe)</span></div></div></div><div class="applemusic-widget-track-item"><div class="applemusic-widget-track-item-image"><div class="applemusic-widget-track-item-image-inner"><div class="image image--loading"><picture><img loading="lazy" src="https://lastfm-img.freetls.fastly.net/i/u/300x300/2a96cbd8b46e442fc41c2b86b821562f.png" alt="how long to get there? / float - Single" width="53" height="53" decoding="async" class="image__img" style="object-fit:cover"/></picture></div><a aria-label="Open how long to get there?" class="applemusic-widget-track-item-play" rel="noopener noreferrer nofollow" target="_blank" href="https://www.last.fm/music/Trankilo/_/how+long+to+get+there%3F" data-playing="false"><svg role="presentation" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 60 60"><path d="M45.563 29.174l-22-15A1 1 0 1 0 22 15v30a.999.999 0 0 0 1.563.826l22-15a1 1 0 0 0 0-1.652zM24 43.107V16.893L43.225 30 24 43.107z"></path><path d="M30 0C13.458 0 0 13.458 0 30s13.458 30 30 30 30-13.458 30-30S46.542 0 30 0zm0 58C14.561 58 2 45.439 2 30S14.561 2 30 2s28 12.561 28 28-12.561 28-28 28z"></path></svg></a></div></div><div class="applemusic-widget-track-item-content"><div class="applemusic-widget-track-item-text"><h3>how long to get there?</h3><span>Trankilo</span><span>how long to get there? / float - Single</span></div></div></div><div class="applemusic-widget-track-item"><div class="applemusic-widget-track-item-image"><div class="applemusic-widget-track-item-image-inner"><div class="image image--loading"><picture><img loading="lazy" src="https://lastfm-img.freetls.fastly.net/i/u/300x300/5e03d7c6d69c19819b07cef436e73413.jpg" alt="One More Light" width="53" height="53" decoding="async" class="image__img" style="object-fit:cover"/>
80</picture></div><a aria-label="Open Heavy (feat. Kiiara)" class="applemusic-widget-track-item-play" rel="noopener noreferrer nofollow" target="_blank" href="https://www.last.fm/music/Linkin+Park/_/Heavy+(feat.+Kiiara)" data-playing="false"><svg role="presentation" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 60 60"><path d="M45.563 29.174l-22-15A1 1 0 1 0 22 15v30a.999.999 0 0 0 1.563.826l22-15a1 1 0 0 0 0-1.652zM24 43.107V16.893L43.225 30 24 43.107z"></path><path d="M30 0C13.458 0 0 13.458 0 30s13.458 30 30 30 30-13.458 30-30S46.542 0 30 0zm0 58C14.561 58 2 45.439 2 30S14.561 2 30 2s28 12.561 28 28-12.561 28-28 28z"></path></svg></a></div></div><div class="applemusic-widget-track-item-content"><div class="applemusic-widget-track-item-text"><h3>Heavy (feat. Kiiara)</h3><span>Linkin Park</span><span>One More Light</span></div></div></div><div class="applemusic-widget-track-item"><div class="applemusic-widget-track-item-image"><div class="applemusic-widget-track-item-image-inner"><div class="image image--loading"><picture><img loading="lazy" src="https://lastfm-img.freetls.fastly.net/i/u/300x300/6f9906f43b7b516e89f9ebc331dd990a.jpg" alt="Blurryface" width="53" height="53" decoding="async" class="image__img" style="object-fit:cover"/></picture></div><a aria-label="Open Heavydirtysoul" class="applemusic-widget-track-item-play" rel="noopener noreferrer nofollow" target="_blank" href="https://www.last.fm/music/Twenty+One+Pilots/_/Heavydirtysoul" data-playing="false"><svg role="presentation" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 60 60"><path d="M45.563 29.174l-22-15A1 1 0 1 0 22 15v30a.999.999 0 0 0 1.563.826l22-15a1 1 0 0 0 0-1.652zM24 43.107V16.893L43.225 30 24 43.107z"></path><path d="M30 0C13.458 0 0 13.458 0 30s13.458 30 30 30 30-13.458 30-30S46.542 0 30 0zm0 58C14.561 58 2 45.439 2 30S14.561 2 30 2s28 12.561 28 28-12.561 28-28 28z"></path></svg></a></div></div><div class="applemusic-widget-track-item-content"><div class="applemusic-widget-track-item-text"><h3>Heavydirtysoul</h3><span>Twenty One Pilots</span><span>Blurryface</span></div></div></div><div class="applemusic-widget-track-item"><div class="applemusic-widget-track-item-image"><div class="applemusic-widget-track-item-image-inner"><div class="image image--loading"><picture><img loading="lazy" src="https://lastfm-img.freetls.fastly.net/i/u/300x300/e73c176ea534f27c5e4f950787004ee8.jpg" alt="Lo-files" width="53" height="53" decoding="async" class="image__img" style="object-fit:cover"/></picture></div><a aria-label="Open parasite.ev3" class="applemusic-widget-track-item-play" rel="noopener noreferrer nofollow" target="_blank" href="https://www.last.fm/music/Bring+Me+The+Horizon+&+Mondo+Loops/_/parasite.ev3" data-playing="false"><svg role="presentation" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 60 60"><path d="M45.563 29.174l-22-15A1 1 0 1 0 22 15v30a.999.999 0 0 0 1.563.826l22-15a1 1 0 0 0 0-1.652zM24 43.107V16.893L43.225 30 24 43.107z"></path><path d="M30 0C13.458 0 0 13.458 0 30s13.458 30 30 30 30-13.458 30-30S46.542 0 30 0zm0 58C14.561 58 2 45.439 2 30S14.561 2 30 2s28 12.561 28 28-12.561 28-28 28z"></path></svg></a></div></div><div class="applemusic-widget-track-item-content"><div class="applemusic-widget-track-item-text"><h3>parasite.ev3</h3><span>Bring Me The Horizon & Mondo Loops</span><span>Lo-files</span></div></div></div><div class="applemusic-widget-track-item"><div class="applemusic-widget-track-item-image"><div class="applemusic-widget-track-item-image-inner"><div class="image image--loading"><picture><img loading="lazy" src="https://lastfm-img.freetls.fastly.net/i/u/300x300/e73c176ea534f27c5e4f950787004ee8.jpg" alt="Lo-files" width="53" height="53" decoding="async" class="image__img" style="object-fit:cover"/></picture></div><a aria-label="Open sTr4nG3r5.vsn0" class="applemusic-widget-track-item-play" rel="noopener noreferrer nofollow" target="_blank" href="https://www.last.fm/music/Bring+Me+The+Horizon+&+Dimension+32/_/sTr4nG3r5.vsn0" data-playing="false"><svg role="presentation" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 60 60"><path d="M45.563 29.174l-22-15A1 1 0 1 0 22 15v30a.999.999 0 0 0 1.563.826l22-15a1 1 0 0 0 0-1.652zM24 43.107V16.893L43.225 30 24 43.107z"></path><path d="M30 0C13.458 0 0 13.458 0 30s13.458 30 30 30 30-13.458 30-30S46.542 0 30 0zm0 58C14.561 58 2 45.439 2 30S14.561 2 30 2s28 12.561 28 28-12.561 28-28 28z"></path></svg></a></div></div><div class="applemusic-widget-track-item-content"><div class="applemusic-widget-track-item-text"><h3>sTr4nG3r5.vsn0</h3><span>Bring Me The Horizon & Dimension 32</span><span>Lo-files</span></div></div></div><div class="applemusic-widget-track-item"><div class="applemusic-widget-track-item-image"><div class="applemusic-widget-track-item-image-inner"><div class="image image--loading"><picture><img loading="lazy" src="https://lastfm-img.freetls.fastly.net/i/u/300x300/e73c176ea534f27c5e4f950787004ee8.jpg" alt="Lo-files" width="53" height="53" decoding="async" class="image__img" style="object-fit:cover"/>
80</picture></div><a aria-label="Open koolaid.xxo" class="applemusic-widget-track-item-play" rel="noopener noreferrer nofollow" target="_blank" href="https://www.last.fm/music/Bring+Me+The+Horizon+&+Drxnk/_/koolaid.xxo" data-playing="false"><svg role="presentation" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 60 60"><path d="M45.563 29.174l-22-15A1 1 0 1 0 22 15v30a.999.999 0 0 0 1.563.826l22-15a1 1 0 0 0 0-1.652zM24 43.107V16.893L43.225 30 24 43.107z"></path><path d="M30 0C13.458 0 0 13.458 0 30s13.458 30 30 30 30-13.458 30-30S46.542 0 30 0zm0 58C14.561 58 2 45.439 2 30S14.561 2 30 2s28 12.561 28 28-12.561 28-28 28z"></path></svg></a></div></div><div class="applemusic-widget-track-item-content"><div class="applemusic-widget-track-item-text"><h3>koolaid.xxo</h3><span>Bring Me The Horizon & Drxnk</span><span>Lo-files</span></div></div></div><div class="applemusic-widget-track-item"><div class="applemusic-widget-track-item-image"><div class="applemusic-widget-track-item-image-inner"><div class="image image--loading"><picture><img loading="lazy" src="https://lastfm-img.freetls.fastly.net/i/u/300x300/e73c176ea534f27c5e4f950787004ee8.jpg" alt="Lo-files" width="53" height="53" decoding="async" class="image__img" style="object-fit:cover"/></picture></div><a aria-label="Open DiE4u.sysrsk" class="applemusic-widget-track-item-play" rel="noopener noreferrer nofollow" target="_blank" href="https://www.last.fm/music/Bring+Me+The+Horizon+&+HM+Surf/_/DiE4u.sysrsk" data-playing="false"><svg role="presentation" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 60 60"><path d="M45.563 29.174l-22-15A1 1 0 1 0 22 15v30a.999.999 0 0 0 1.563.826l22-15a1 1 0 0 0 0-1.652zM24 43.107V16.893L43.225 30 24 43.107z"></path><path d="M30 0C13.458 0 0 13.458 0 30s13.458 30 30 30 30-13.458 30-30S46.542 0 30 0zm0 58C14.561 58 2 45.439 2 30S14.561 2 30 2s28 12.561 28 28-12.561 28-28 28z"></path></svg></a></div></div><div class="applemusic-widget-track-item-content"><div class="applemusic-widget-track-item-text"><h3>DiE4u.sysrsk</h3><span>Bring Me The Horizon & HM Surf</span><span>Lo-files</span></div></div></div><div class="applemusic-widget-track-item"><div class="applemusic-widget-track-item-image"><div class="applemusic-widget-track-item-image-inner"><div class="image image--loading"><picture><img loading="lazy" src="https://lastfm-img.freetls.fastly.net/i/u/300x300/e73c176ea534f27c5e4f950787004ee8.jpg" alt="Lo-files" width="53" height="53" decoding="async" class="image__img" style="object-fit:cover"/></picture></div><a aria-label="Open d1g_it.core" class="applemusic-widget-track-item-play" rel="noopener noreferrer nofollow" target="_blank" href="https://www.last.fm/music/Bring+Me+The+Horizon+&+HM+Surf/_/d1g_it.core" data-playing="false"><svg role="presentation" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 60 60"><path d="M45.563 29.174l-22-15A1 1 0 1 0 22 15v30a.999.999 0 0 0 1.563.826l22-15a1 1 0 0 0 0-1.652zM24 43.107V16.893L43.225 30 24 43.107z"></path><path d="M30 0C13.458 0 0 13.458 0 30s13.458 30 30 30 30-13.458 30-30S46.542 0 30 0zm0 58C14.561 58 2 45.439 2 30S14.561 2 30 2s28 12.561 28 28-12.561 28-28 28z"></path></svg></a></div></div><div class="applemusic-widget-track-item-content"><div class="applemusic-widget-track-item-text"><h3>d1g_it.core</h3><span>Bring Me The Horizon & HM Surf</span><span>Lo-files</span></div></div></div></div></div>
80<script>$RC("B:6","S:6")</script>
80<div hidden id="S:3"><section><div class="grid grid-cols-1 md:grid-cols-3 lg:grid-cols-3 gap-4"><div class="rounded-lg border bg-card text-card-foreground shadow-sm overflow-hidden"><div class="max-h-[190px] min-h-[190px] overflow-hidden h-full"><div class="image image--loading w-full object-cover"><picture><source type="image/avif" srcSet="https://images.s3rve.co.uk/?width=640&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbbc_open_source.png&format=avif 640w, https://images.s3rve.co.uk/?width=750&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbbc_open_source.png&format=avif 750w, https://images.s3rve.co.uk/?width=828&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbbc_open_source.png&format=avif 828w, https://images.s3rve.co.uk/?width=1080&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbbc_open_source.png&format=avif 1080w, https://images.s3rve.co.uk/?width=1200&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbbc_open_source.png&format=avif 1200w, https://images.s3rve.co.uk/?width=1920&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbbc_open_source.png&format=avif 1920w, https://images.s3rve.co.uk/?width=2048&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbbc_open_source.png&format=avif 2048w" sizes="(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw"/><source type="image/webp" srcSet="https://images.s3rve.co.uk/?width=640&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbbc_open_source.png&format=webp 640w, https://images.s3rve.co.uk/?width=750&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbbc_open_source.png&format=webp 750w, https://images.s3rve.co.uk/?width=828&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbbc_open_source.png&format=webp 828w, https://images.s3rve.co.uk/?width=1080&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbbc_open_source.png&format=webp 1080w, https://images.s3rve.co.uk/?width=1200&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbbc_open_source.png&format=webp 1200w, https://images.s3rve.co.uk/?width=1920&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbbc_open_source.png&format=webp 1920w, https://images.s3rve.co.uk/?width=2048&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbbc_open_source.png&format=webp 2048w" sizes="(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw"/><img loading="lazy" src="https://images.s3rve.co.uk/?width=700&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbbc_open_source.png" srcSet="https://images.s3rve.co.uk/?width=640&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbbc_open_source.png 640w, https://images.s3rve.co.uk/?width=750&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbbc_open_source.png 750w, https://images.s3rve.co.uk/?width=828&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbbc_open_source.png 828w, https://images.s3rve.co.uk/?width=1080&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbbc_open_source.png 1080w, https://images.s3rve.co.uk/?width=1200&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbbc_open_source.png 1200w, https://images.s3rve.co.uk/?width=1920&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbbc_open_source.png 1920w, https://images.s3rve.co.uk/?width=2048&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbbc_open_source.png 2048w" sizes="(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw" alt="A screenshot of the BBC's Open Source site" width="700" height="190" decoding="async" class="image__img"/></picture></div></div><div class="flex flex-col space-y-1.5 p-6"><div class="text-2xl font-semibold tracking-tight leading-7">BBC Projects</div></div><div class="p-6 pt-0"><div class="text-sm text-muted-foreground"><div><p class="text-base">I participate in a range of projects at the BBC. Most recently, I transitioned the BBCâs Open Source site to the <a href="https://www.bbc.co.uk/webarchive/https%3A%2F%2Fwww.bbc.co.uk%2Fblogs%2Finternet%2Fentries%2F8673fe2a-e876-45fc-9a5f-203c049c9f9c" target="_blank" rel="noopener noreferrer" class="underline text-muted-foreground inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2">WebCore</a> service to enhance performance, maintainability, accessibility, and user experience. I also contribute to open-source projects, such as <a href="https://github.com/bbc/sqs-consumer" target="_blank" rel="noopener noreferrer" class="underline text-muted-foreground inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2">SQS Consumer</a>, and help teams improve their experimentation capabilities.</p></div></div><div class="w-full flex justify-left"><div class="flex flex-wrap gap-2"><a rel="noopener noreferer" class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 border border-input bg-background hover:bg-accent hover:text-accent-foreground h-9 rounded-md px-3 inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 text-muted-foreground" href="https://www.bbc.co.uk/opensource" target="_blank">BBC Open Source<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-external-link inline ml-1" aria-hidden="true"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></a><a rel="noopener noreferer" class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 border border-input bg-background hover:bg-accent hover:text-accent-foreground h-9 rounded-md px-3 inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 text-muted-foreground" href="https://github.com/bbc" target="_blank">BBC GitHub<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-external-link inline ml-1" aria-hidden="true"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></a></div></div></div></div><div class="rounded-lg border bg-card text-card-foreground shadow-sm overflow-hidden">
80<div class="max-h-[190px] min-h-[190px] overflow-hidden h-full"><div class="image image--loading w-full object-cover"><picture><source type="image/avif" srcSet="https://images.s3rve.co.uk/?width=640&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Faccropress.png&format=avif 640w, https://images.s3rve.co.uk/?width=750&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Faccropress.png&format=avif 750w, https://images.s3rve.co.uk/?width=828&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Faccropress.png&format=avif 828w, https://images.s3rve.co.uk/?width=1080&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Faccropress.png&format=avif 1080w, https://images.s3rve.co.uk/?width=1200&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Faccropress.png&format=avif 1200w, https://images.s3rve.co.uk/?width=1920&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Faccropress.png&format=avif 1920w, https://images.s3rve.co.uk/?width=2048&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Faccropress.png&format=avif 2048w" sizes="(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw"/><source type="image/webp" srcSet="https://images.s3rve.co.uk/?width=640&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Faccropress.png&format=webp 640w, https://images.s3rve.co.uk/?width=750&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Faccropress.png&format=webp 750w, https://images.s3rve.co.uk/?width=828&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Faccropress.png&format=webp 828w, https://images.s3rve.co.uk/?width=1080&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Faccropress.png&format=webp 1080w, https://images.s3rve.co.uk/?width=1200&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Faccropress.png&format=webp 1200w, https://images.s3rve.co.uk/?width=1920&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Faccropress.png&format=webp 1920w, https://images.s3rve.co.uk/?width=2048&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Faccropress.png&format=webp 2048w" sizes="(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw"/><img loading="lazy" src="https://images.s3rve.co.uk/?width=700&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Faccropress.png" srcSet="https://images.s3rve.co.uk/?width=640&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Faccropress.png 640w, https://images.s3rve.co.uk/?width=750&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Faccropress.png 750w, https://images.s3rve.co.uk/?width=828&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Faccropress.png 828w, https://images.s3rve.co.uk/?width=1080&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Faccropress.png 1080w, https://images.s3rve.co.uk/?width=1200&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Faccropress.png 1200w, https://images.s3rve.co.uk/?width=1920&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Faccropress.png 1920w, https://images.s3rve.co.uk/?width=2048&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Faccropress.png 2048w" sizes="(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw" alt="A screenshot of the AccroPress CMS" width="700" height="190" decoding="async" class="image__img"/></picture></div></div><div class="flex flex-col space-y-1.5 p-6"><div class="text-2xl font-semibold tracking-tight leading-7">A custom CMS</div></div><div class="p-6 pt-0"><div class="text-sm text-muted-foreground"><div><p class="text-base">At Accrosoft, I developed a custom CMS called AccroPress, a fully headless system with a React frontend and a Node.js/Express backend. Designed as a hosted service, it was used by various school and job sites worldwide. AccroPress also offered several microservices, including image processing, contact forms, and more.</p></div></div><div class="w-full flex justify-left"><div class="flex flex-wrap gap-2"><a rel="noopener noreferer" class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 border border-input bg-background hover:bg-accent hover:text-accent-foreground h-9 rounded-md px-3 inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 text-muted-foreground" href="https://hireroad.com/" target="_blank">HireRoad<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-external-link inline ml-1" aria-hidden="true"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></a><a rel="noopener noreferer" class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 border border-input bg-background hover:bg-accent hover:text-accent-foreground h-9 rounded-md px-3 inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 text-muted-foreground" href="https://accropress.com" target="_blank">AccroPress<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-external-link inline ml-1" aria-hidden="true"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></a></div></div></div></div><div class="rounded-lg border bg-card text-card-foreground shadow-sm overflow-hidden">
80<div class="max-h-[190px] min-h-[190px] overflow-hidden h-full"><div class="image image--loading w-full object-cover"><picture><source type="image/avif" srcSet="https://images.s3rve.co.uk/?width=640&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbouygues.png&format=avif 640w, https://images.s3rve.co.uk/?width=750&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbouygues.png&format=avif 750w, https://images.s3rve.co.uk/?width=828&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbouygues.png&format=avif 828w, https://images.s3rve.co.uk/?width=1080&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbouygues.png&format=avif 1080w, https://images.s3rve.co.uk/?width=1200&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbouygues.png&format=avif 1200w, https://images.s3rve.co.uk/?width=1920&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbouygues.png&format=avif 1920w, https://images.s3rve.co.uk/?width=2048&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbouygues.png&format=avif 2048w" sizes="(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw"/><source type="image/webp" srcSet="https://images.s3rve.co.uk/?width=640&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbouygues.png&format=webp 640w, https://images.s3rve.co.uk/?width=750&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbouygues.png&format=webp 750w, https://images.s3rve.co.uk/?width=828&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbouygues.png&format=webp 828w, https://images.s3rve.co.uk/?width=1080&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbouygues.png&format=webp 1080w, https://images.s3rve.co.uk/?width=1200&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbouygues.png&format=webp 1200w, https://images.s3rve.co.uk/?width=1920&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbouygues.png&format=webp 1920w, https://images.s3rve.co.uk/?width=2048&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbouygues.png&format=webp 2048w" sizes="(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw"/><img loading="lazy" src="https://images.s3rve.co.uk/?width=700&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbouygues.png" srcSet="https://images.s3rve.co.uk/?width=640&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbouygues.png 640w, https://images.s3rve.co.uk/?width=750&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbouygues.png 750w, https://images.s3rve.co.uk/?width=828&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbouygues.png 828w, https://images.s3rve.co.uk/?width=1080&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbouygues.png 1080w, https://images.s3rve.co.uk/?width=1200&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbouygues.png 1200w, https://images.s3rve.co.uk/?width=1920&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbouygues.png 1920w, https://images.s3rve.co.uk/?width=2048&image=%2Fuploads%2Fsite%2Fimages%2Fprojects%2Fbouygues.png 2048w" sizes="(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw" alt="A screenshot of the Bouygues Construction UK career site" width="700" height="190" decoding="async" class="image__img"/></picture></div></div><div class="flex flex-col space-y-1.5 p-6"><div class="text-2xl font-semibold tracking-tight leading-7">Career Sites</div></div><div class="p-6 pt-0"><div class="text-sm text-muted-foreground"><div><p class="text-base">While at Vacancy Filler, I collaborated with clients like Bouygues Construction UK to launch career site initiatives that attract and inform potential candidates about roles across their organization. I also worked with brands such as the Woodland Trust, Longleat, and the Devonshire Group, among others.</p></div></div><div class="w-full flex justify-left"><div class="flex flex-wrap gap-2"><a rel="noopener noreferer" class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 border border-input bg-background hover:bg-accent hover:text-accent-foreground h-9 rounded-md px-3 inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 text-muted-foreground" href="https://careers.bouygues-construction.co.uk/" target="_blank">Bouygues<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-external-link inline ml-1" aria-hidden="true"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></a><a rel="noopener noreferer" class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 border border-input bg-background hover:bg-accent hover:text-accent-foreground h-9 rounded-md px-3 inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 text-muted-foreground" href="https://jobs.woodlandtrust.org.uk/" target="_blank">Woodland Trust<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-external-link inline ml-1" aria-hidden="true"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></a><a rel="noopener noreferer" class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 border border-input bg-background hover:bg-accent hover:text-accent-foreground h-9 rounded-md px-3 inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 text-muted-foreground" href="https://jobs.longleat.co.uk/" target="_blank">Longleat<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-external-link inline ml-1" aria-hidden="true"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></a></div></div></div></div></div><div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4 mt-4"><div class="rounded-lg border bg-card text-card-foreground shadow-sm overflow-hidden"><div class="flex flex-col space-y-1.5 p-6"><div class="text-2xl font-semibold tracking-tight leading-7">roomisfull</div></div><div class="p-6 pt-0"><div class="text-sm text-muted-foreground"><div><p class="text-base">
80Room is Full is a companion app setup for conferences that delivers better expereinces on a shared platform</p></div></div><div class="w-full flex justify-left"><a rel="noopener noreferer" class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 border border-input bg-background hover:bg-accent hover:text-accent-foreground h-9 rounded-md px-3 inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 text-muted-foreground" href="https://github.com/nicholasgriffintn/roomisfull" target="_blank">View Project<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-external-link inline ml-1" aria-hidden="true"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></a></div></div></div><div class="rounded-lg border bg-card text-card-foreground shadow-sm overflow-hidden"><div class="flex flex-col space-y-1.5 p-6"><div class="text-2xl font-semibold tracking-tight leading-7">machine-setup</div></div><div class="p-6 pt-0"><div class="text-sm text-muted-foreground"><div><p class="text-base">Scripts to run that setup my new macbooks</p></div></div><div class="w-full flex justify-left"><a rel="noopener noreferer" class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 border border-input bg-background hover:bg-accent hover:text-accent-foreground h-9 rounded-md px-3 inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 text-muted-foreground" href="https://github.com/nicholasgriffintn/machine-setup" target="_blank">View Project<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-external-link inline ml-1" aria-hidden="true"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></a></div></div></div><div class="rounded-lg border bg-card text-card-foreground shadow-sm overflow-hidden"><div class="flex flex-col space-y-1.5 p-6"><div class="text-2xl font-semibold tracking-tight leading-7">ai-platform</div></div><div class="p-6 pt-0"><div class="text-sm text-muted-foreground"><div><p class="text-base">A multi-model AI chat platform built to be a complete solution for your own personal assistant or an ai assistant service offering.</p></div></div><div class="w-full flex justify-left"><a rel="noopener noreferer" class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 border border-input bg-background hover:bg-accent hover:text-accent-foreground h-9 rounded-md px-3 inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 text-muted-foreground" href="https://github.com/nicholasgriffintn/ai-platform" target="_blank">View Project<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-external-link inline ml-1" aria-hidden="true"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></a></div></div></div><div class="rounded-lg border bg-card text-card-foreground shadow-sm overflow-hidden"><div class="flex flex-col space-y-1.5 p-6"><div class="text-2xl font-semibold tracking-tight leading-7">marquee</div></div><div class="p-6 pt-0"><div class="text-sm text-muted-foreground"><div><p class="text-base">An app for finding the next best thing to watch</p></div></div><div class="w-full flex justify-left"><a rel="noopener noreferer" class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 border border-input bg-background hover:bg-accent hover:text-accent-foreground h-9 rounded-md px-3 inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 text-muted-foreground" href="https://github.com/nicholasgriffintn/marquee" target="_blank">View Project<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-external-link inline ml-1" aria-hidden="true"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></a></div></div></div><div class="rounded-lg border bg-card text-card-foreground shadow-sm overflow-hidden"><div class="flex flex-col space-y-1.5 p-6"><div class="text-2xl font-semibold tracking-tight leading-7">sprintjam.co.uk</div></div><div class="p-6 pt-0"><div class="text-sm text-muted-foreground"><div><p class="text-base">SprintJam helps distributed teams run the core sprint ceremonies in one place: planning poker, daily standups, retrospectives, decision wheels, and workspace history. No sign-ups required for individual rooms, just share a link to start.</p></div></div><div class="w-full flex justify-left"><a rel="noopener noreferer" class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 border border-input bg-background hover:bg-accent hover:text-accent-foreground h-9 rounded-md px-3 inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 text-muted-foreground" href="https://github.com/nicholasgriffintn/sprintjam.co.uk" target="_blank">View Project<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-external-link inline ml-1" aria-hidden="true"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></a></div></div></div><div class="rounded-lg border bg-card text-card-foreground shadow-sm overflow-hidden"><div class="flex flex-col space-y-1.5 p-6"><div class="text-2xl font-semibold tracking-tight leading-7">Beamflare</div></div><div class="p-6 pt-0"><div class="text-sm text-muted-foreground"><div><p class="text-base">Elixir on Cloudflare Workers</p></div></div><div class="w-full flex justify-left"><a rel="noopener noreferer" class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 border border-input bg-background hover:bg-accent hover:text-accent-foreground h-9 rounded-md px-3 inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 text-muted-foreground" href="https://github.com/nicholasgriffintn/Beamflare" target="_blank">View Project<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-external-link inline ml-1" aria-hidden="true"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></a></div></div></div><div class="rounded-lg border bg-card text-card-foreground shadow-sm overflow-hidden"><div class="flex flex-col space-y-1.5 p-6"><div class="text-2xl font-semibold tracking-tight leading-7">raze</div></div><div class="p-6 pt-0"><div class="text-sm text-muted-foreground"><div><p class="text-base">An open source app for configuring Razer devices on mac</p></div></div><div class="w-full flex justify-left"><a rel="noopener noreferer" class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 border border-input bg-background hover:bg-accent hover:text-accent-foreground h-9 rounded-md px-3 inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 text-muted-foreground" href="https://github.com/nicholasgriffintn/raze" target="_blank">View Project<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-external-link inline ml-1" aria-hidden="true"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></a></div></div></div><div class="rounded-lg border bg-card text-card-foreground shadow-sm overflow-hidden"><div class="flex flex-col space-y-1.5 p-6"><div class="text-2xl font-semibold tracking-tight leading-7">playwright-visual-cloud</div></div><div class="p-6 pt-0"><div class="text-sm text-muted-foreground"><div><p class="text-base">A playwright for inspecting visual differences between playwright snapshots</p></div></div><div class="w-full flex justify-left"><a rel="noopener noreferer" class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 border border-input bg-background hover:bg-accent hover:text-accent-foreground h-9 rounded-md px-3 inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 text-muted-foreground" href="https://github.com/nicholasgriffintn/playwright-visual-cloud" target="_blank">View Project<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-external-link inline ml-1" aria-hidden="true"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></a></div></div></div></div><div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-2 gap-4 mt-4"><div class="rounded-lg border bg-card text-card-foreground shadow-sm overflow-hidden"><div class="flex flex-col space-y-1.5 p-6"><div class="text-2xl font-semibold tracking-tight leading-7">TechNutty</div></div><div class="p-6 pt-0"><div class="text-sm text-muted-foreground"><div><p class="text-base">TechNutty was a technology news and reviews site that I started during college/uni in 2011, I ran it for some time as a side project and a way of experimenting with developement. Sadly, a few years back I did choose to shut down this site, so Ive included a link to wayback machine instead :)</p></div></div><div class="w-full flex justify-left"><div class="flex flex-wrap gap-2"><a rel="noopener noreferer" class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 border border-input bg-background hover:bg-accent hover:text-accent-foreground h-9 rounded-md px-3 inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 text-muted-foreground" href="https://web.archive.org/web/collections/*/https://technutty.co.uk" target="_blank">View Archive<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-external-link inline ml-1" aria-hidden="true"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></a></div></div></div></div><div class="rounded-lg border bg-card text-card-foreground shadow-sm overflow-hidden"><div class="flex flex-col space-y-1.5 p-6"><div class="text-2xl font-semibold tracking-tight leading-7">Side Projects</div></div><div class="p-6 pt-0"><div class="text-sm text-muted-foreground"><div><p class="text-base">Alongside my day job, I have a number of side projects that I work on, some of which are open source and can be found on my GitHub. I have a number of projects that I have worked on over the years, some of which are still in development, others are just experiments.</p></div></div><div class="w-full flex justify-left"><div class="flex flex-wrap gap-2"><a rel="noopener noreferer" class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 border border-input bg-background hover:bg-accent hover:text-accent-foreground h-9 rounded-md px-3 inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 text-muted-foreground" href="https://github.com/nicholasgriffintn" target="_blank">My GitHub<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-external-link inline ml-1" aria-hidden="true"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></a></div></div></div></div></div><div class="w-full flex justify-left pt-5"><a
80 class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 bg-primary text-primary-foreground hover:bg-primary/90 h-11 rounded-md px-8 inline font-bold p-0 transition-colors hover:underline hover:outline-none decoration-1 decoration-skip-ink-none underline-offset-[0.25em] hover:decoration-2 text-primary-foreground" href="/projects" target="_self" data-discover="true">View all of my projects</a></div></section></div>
80<script>$RC("B:3","S:3")</script>
80<div hidden id="S:7">
80<script>window.__reactRouterContext.streamController.enqueue("P14:[{\"_259\":260,\"_261\":262},\"nodes\",[266,267,268,269,270,271,272,273],\"pageInfo\",{\"_263\":264,\"_265\":98},\"endCursor\",\"Y3Vyc29yOnYyOpK0MjAyNi0wOS0wN1QyMjozODozNlrOT7t3BA==\",\"hasNextPage\",{\"_22\":364,\"_24\":365,\"_276\":366,\"_278\":367,\"_280\":368,\"_88\":369,\"_31\":370,\"_284\":371,\"_286\":372,\"_288\":373,\"_290\":287,\"_291\":374},{\"_22\":353,\"_24\":354,\"_276\":355,\"_278\":356,\"_280\":357,\"_88\":358,\"_31\":359,\"_284\":-5,\"_286\":327,\"_288\":360,\"_290\":302,\"_291\":361},{\"_22\":341,\"_24\":342,\"_276\":343,\"_278\":344,\"_280\":345,\"_88\":346,\"_31\":347,\"_284\":348,\"_286\":349,\"_288\":350,\"_290\":351,\"_291\":352},{\"_22\":330,\"_24\":331,\"_276\":332,\"_278\":333,\"_280\":334,\"_88\":335,\"_31\":336,\"_284\":337,\"_286\":302,\"_288\":338,\"_290\":287,\"_291\":339},{\"_22\":319,\"_24\":320,\"_276\":321,\"_278\":322,\"_280\":323,\"_88\":324,\"_31\":325,\"_284\":326,\"_286\":327,\"_288\":328,\"_290\":327,\"_291\":329},{\"_22\":308,\"_24\":309,\"_276\":310,\"_278\":311,\"_280\":312,\"_88\":313,\"_31\":314,\"_284\":-5,\"_286\":287,\"_288\":315,\"_290\":287,\"_291\":316},{\"_22\":295,\"_24\":296,\"_276\":297,\"_278\":298,\"_280\":299,\"_88\":300,\"_31\":301,\"_284\":-5,\"_286\":302,\"_288\":303,\"_290\":287,\"_291\":304},{\"_22\":274,\"_24\":275,\"_276\":277,\"_278\":279,\"_280\":281,\"_88\":282,\"_31\":283,\"_284\":285,\"_286\":287,\"_288\":289,\"_290\":287,\"_291\":-5},\"playwright-visual-cloud\",\"A playwright for inspecting visual differences between playwright snapshots\",\"createdAt\",\"2026-08-17T21:39:55Z\",\"updatedAt\",\"2026-09-07T22:38:36Z\",\"pushedAt\",\"2026-09-07T22:38:31Z\",\"R_kgDOT7t3BA\",\"https://github.com/nicholasgriffintn/playwright-visual-cloud\",\"homepageUrl\",\"https://pvc.pashi.app/\",\"stargazerCount\",0,\"primaryLanguage\",{\"_22\":292,\"_293\":294},\"forkCount\",\"licenseInfo\",\"TypeScript\",\"color\",\"#3178c6\",\"raze\",\"An open source app for configuring Razer devices on mac\",\"2026-07-26T22:52:21Z\",\"2026-09-10T09:17:33Z\",\"2026-08-09T13:42:45Z\",\"R_kgDOTkYnTA\",\"https://github.com/nicholasgriffintn/raze\",1,{\"_22\":306,\"_293\":307},{\"_22\":305},\"Apache License 2.0\",\"Swift\",\"#F05138\",\"Beamflare\",\"Elixir on Cloudflare Workers\",\"2026-09-21T22:11:54Z\",\"2026-09-21T23:11:23Z\",\"2026-09-21T23:12:36Z\",\"R_kgDOUkoseQ\",\"https://github.com/nicholasgriffintn/Beamflare\",{\"_22\":317,\"_293\":318},{\"_22\":305},\"Elixir\",\"#6e4a7e\",\"sprintjam.co.uk\",\"SprintJam helps distributed teams run the core sprint ceremonies in one place: planning poker, daily standups, retrospectives, decision wheels, and workspace history. No sign-ups required for individual rooms, just share a link to start.\",\"2025-04-15T21:56:17Z\",\"2026-09-27T16:46:14Z\",\"2026-09-27T16:46:54Z\",\"R_kgDOOaQ-TA\",\"https://github.com/nicholasgriffintn/sprintjam.co.uk\",\"https://sprintjam.co.uk/\",2,{\"_22\":292,\"_293\":294},{\"_22\":305},\"marquee\",\"An app for finding the next best thing to watch\",\"2026-08-21T22:27:55Z\",\"2026-09-27T22:28:25Z\",\"2026-09-27T22:28:21Z\",\"R_kgDOUAFntw\",\"https://github.com/nicholasgriffintn/marquee\",\"http://marquee.pashi.app/\",{\"_22\":292,\"_293\":294},{\"_22\":340},\"GNU General Public License v3.0\",\"ai-platform\",\"A multi-model AI chat platform built to be a complete solution for your own personal assistant or an ai assistant service offering.\",\"2024-11-10T17:26:53Z\",\"2026-09-29T08:58:13Z\",\"2026-10-01T22:30:03Z\",\"R_kgDONNO9eg\",\"https://github.com/nicholasgriffintn/ai-platform\",\"https://polychat.app\",31,{\"_22\":292,\"_293\":294},6,{\"_22\":305},\"machine-setup\",\"Scripts to run that setup my new macbooks\",\"2022-12-19T14:10:43Z\",\"2026-10-01T05:28:00Z\",\"2026-10-01T05:28:32Z\",\"R_kgDOIpJcQg\",\"https://github.com/nicholasgriffintn/machine-setup\",{\"_22\":362,\"_293\":363},{\"_22\":305},\"Python\",\"#3572A5\",\"roomisfull\",\"Room is Full is a companion app setup for conferences that delivers better expereinces on a shared platform\",\"2024-01-12T19:54:56Z\",\"2026-10-01T22:32:09Z\",\"2026-10-01T22:34:02Z\",\"R_kgDOLELn8w\",\"https://github.com/nicholasgriffintn/roomisfull\",\"https://roomisfull.app/\",7,{\"_22\":292,\"_293\":294},{\"_22\":375},\"GNU Affero General Public License v3.0\"]\n");</script>
80<!--$?--><template id="B:8"></template><!--/$--></div>
80<script>$RC("B:7","S:7")</script>
80<div hidden id="S:8">
80<script>window.__reactRouterContext.streamController.close();</script>
80</div>
80<script>$RC("B:8","S:8")</script>
80<script>(function(){function c(){var b=a.contentDocument||(a.contentWindow&&a.contentWindow.document);if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a43fc5a96aab95c1',t:'MTc5MDkwMjg0Ng=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script>
80</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.