{"data":{"featured":{"edges":[{"node":{"frontmatter":{"title":"Competitor Pricing Intelligence Pipeline","cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAABm0lEQVQoz33QzW/TMBgH4F4XKI3j2Pko65LUTexkSdqyFWmN465xmrZT0TQucEMcOIHUWyWQOMH/Dc4qMWkb0qNX7+Wn96Oj2Rnwr0wiDH9uBIXhFzDgmAg8EkhZtFXAITdHAtFlq4JR2SNvOyd2BsOlM9nhZG2lGyvb4qRx8xt3vLPjNaYrq2WO5AO1QUSPzDqak+s+R+cNZBIlDUpWMJIorlG8Msh1zyt1XzwhKNRkFQ44zrdmvOrHG5et+/HGYQ0aSRxKECyecg0C/mo466ibiejz9/b0JpjeDi/uyMXd2fidzRqHNc+Fda944ebHtSGtjajCUY1CiaNaoTUkSzBcKI/CvbO55uTHtZ3pDqdrM21QCzKp+8KIKn3AdU/8N+zNTVIBT0AmYVjh8RbnG/fqFoaVNdmibP18WN1cDuSH0/oj/fQ1+bLP94fJ4cfs12/2+dv0+898f4Ch1P37P91btuFMTe4OLg3KAS0A5QYrQVQAVgLKAWtR3j2ddV9fPvSy/+a4tmZnJ/i8lf6rVqoaSzWakz2S/w3/AaNPaDKzrrdZAAAAAElFTkSuQmCC"},"images":{"fallback":{"src":"/static/18ca81aa4002fc789309e5b3e9567700/4e258/demo.png","srcSet":"/static/18ca81aa4002fc789309e5b3e9567700/68202/demo.png 175w,\n/static/18ca81aa4002fc789309e5b3e9567700/fe25d/demo.png 350w,\n/static/18ca81aa4002fc789309e5b3e9567700/4e258/demo.png 700w,\n/static/18ca81aa4002fc789309e5b3e9567700/a22cc/demo.png 1400w","sizes":"(min-width: 700px) 700px, 100vw"},"sources":[{"srcSet":"/static/18ca81aa4002fc789309e5b3e9567700/1934d/demo.avif 175w,\n/static/18ca81aa4002fc789309e5b3e9567700/8f8aa/demo.avif 350w,\n/static/18ca81aa4002fc789309e5b3e9567700/a273d/demo.avif 700w,\n/static/18ca81aa4002fc789309e5b3e9567700/49b21/demo.avif 1400w","type":"image/avif","sizes":"(min-width: 700px) 700px, 100vw"},{"srcSet":"/static/18ca81aa4002fc789309e5b3e9567700/745fa/demo.webp 175w,\n/static/18ca81aa4002fc789309e5b3e9567700/b0f73/demo.webp 350w,\n/static/18ca81aa4002fc789309e5b3e9567700/dcd92/demo.webp 700w,\n/static/18ca81aa4002fc789309e5b3e9567700/c98e3/demo.webp 1400w","type":"image/webp","sizes":"(min-width: 700px) 700px, 100vw"}]},"width":700,"height":400}}},"tech":["Python","Scrapy","BeautifulSoup","Pandas","PostgreSQL","Docker"],"github":null,"external":null,"cta":null},"html":"<p>An automated ETL pipeline that extracts real-time competitor pricing across dozens of sources. Handles the messy end of web scraping — rotating request strategies, reverse-engineered APIs and pages that fight back — then cleans and normalises everything with Pandas before loading it into PostgreSQL. The resulting dataset feeds an internal AI model that adjusts product pricing dynamically.</p>"}},{"node":{"frontmatter":{"title":"Containerised Product Tracking Platform","cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAABv0lEQVQoz12QbW/aMBCA+TgipsRJnDjCIe9pUmHTFlqpJdgOJRC2hLYDVFWT6P7/r9gSoFsnPTqd7XvubHckayQh0jVJF9HPkC+INNFs+O9UsqhkjToSosB70EKmepnqZ8Cbqn6mBwyGXA+ZHnIYcSMWWjD7S8gU9/4ka1Fu3zyjZGUNv2FSmWnpXD8NRrV9VWNSoXRlJks9LuAHF0vgM8miHckayW5mXpZ69AiTAqWlFi/QZWlcFEa6hPFC8XiDw+TBTHZmbWTy4KGd3MhTxRfAF4rHZWfW1DmnOsVlajQHLoekNMcVpKUt9k7xpiV51ySt7EyBJ4DHgcv1tIDDlZ4s0KRGkxqzrbv+OSjevOoQPP/y60Pw9O5vDloiWhlREDLz+ju626C7jS32mO8w39libz++2vm+P9titutnP/rTlzNbEDIJ0UZWY2GOa2O0biAlHK7gMR4hJSSlQUqDfrBWvKyV22vr4Ry0zwaB0KO5GuYgaHLtmLf7/5DLzrT5sC6iasCT+1ebVrLL1WBu00preuWKK9BNjbMtpGvFFcDPz8xbuZ3c6497ePIV3x7p4UnvnJ+wPy/xba8//jP5NxLwZ3p8pSfJAAAAAElFTkSuQmCC"},"images":{"fallback":{"src":"/static/dbe116fbf868e0d594ac9f5fd7ef42c9/4e258/demo.png","srcSet":"/static/dbe116fbf868e0d594ac9f5fd7ef42c9/68202/demo.png 175w,\n/static/dbe116fbf868e0d594ac9f5fd7ef42c9/fe25d/demo.png 350w,\n/static/dbe116fbf868e0d594ac9f5fd7ef42c9/4e258/demo.png 700w,\n/static/dbe116fbf868e0d594ac9f5fd7ef42c9/a22cc/demo.png 1400w","sizes":"(min-width: 700px) 700px, 100vw"},"sources":[{"srcSet":"/static/dbe116fbf868e0d594ac9f5fd7ef42c9/1934d/demo.avif 175w,\n/static/dbe116fbf868e0d594ac9f5fd7ef42c9/8f8aa/demo.avif 350w,\n/static/dbe116fbf868e0d594ac9f5fd7ef42c9/a273d/demo.avif 700w,\n/static/dbe116fbf868e0d594ac9f5fd7ef42c9/49b21/demo.avif 1400w","type":"image/avif","sizes":"(min-width: 700px) 700px, 100vw"},{"srcSet":"/static/dbe116fbf868e0d594ac9f5fd7ef42c9/745fa/demo.webp 175w,\n/static/dbe116fbf868e0d594ac9f5fd7ef42c9/b0f73/demo.webp 350w,\n/static/dbe116fbf868e0d594ac9f5fd7ef42c9/dcd92/demo.webp 700w,\n/static/dbe116fbf868e0d594ac9f5fd7ef42c9/c98e3/demo.webp 1400w","type":"image/webp","sizes":"(min-width: 700px) 700px, 100vw"}]},"width":700,"height":400}}},"tech":["Flask","Docker","PostgreSQL","GitHub Actions","Pytest"],"github":null,"external":null,"cta":null},"html":"<p>A production platform that tracks products and their pricing history across the catalogue. Built with Flask and shipped as a fully containerised Docker service, with CI/CD pipelines and a unit test suite that keeps data quality and uptime predictable. Designed so that adding a new data source is a configuration change rather than a rewrite.</p>"}},{"node":{"frontmatter":{"title":"Collaborative Code Snippet Manager","cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAABoUlEQVQoz23RWY+iMADA8XkdlKMttyAtRcQR0PFYRIdyKDKuG5PNPu7Tfv8vsQGZzKzZ5P/QI7+2SZ84PQY4lSmD+ADJG3IzRDOF5rLHVL9Q/VKZ5MokRzT7zGMSTjlj8cQZCyWs1FWjRCf0UshBpfi1ubha8Q/z5aLNGnV61oKzPDl95teAsB5L3h7NchBkPE5EcoC0hNOj7B+Bm4uYSYRJJG9z835ACtHZ91gYbRDeQycdmmvB3qFJpYXvVnh1ljdncdPby2s1qCXMgFt0laJz6DFvbwFJAe7wOIW0RNOTOm/0oGXIqwApAC2VqAG0w/QLFqwtcFLJ2Q16XAG3UOZnZVZrwVmfNdq0NsIL/v4beiUg+b/Y3kKyBzjtsddifXkdv97s6IpoCbsknP/v2dZGGu/EcTIcbVrslsArjfnFCq+qX9Off0bsl2hnoDv0EQ/M9Ucr3k5QcJSjWosbI3qXJxVwmYTf7gHCoMsgzQXn458HxvJrgpsIJOHxNx5vuX7x9d5wtOJHa95aD8xljx961uJnLeL0uO1hy4jv3ad/AduKXhaQBxubAAAAAElFTkSuQmCC"},"images":{"fallback":{"src":"/static/75aff570ab64a85d0bd11efb7ad08353/4e258/demo.png","srcSet":"/static/75aff570ab64a85d0bd11efb7ad08353/68202/demo.png 175w,\n/static/75aff570ab64a85d0bd11efb7ad08353/fe25d/demo.png 350w,\n/static/75aff570ab64a85d0bd11efb7ad08353/4e258/demo.png 700w,\n/static/75aff570ab64a85d0bd11efb7ad08353/a22cc/demo.png 1400w","sizes":"(min-width: 700px) 700px, 100vw"},"sources":[{"srcSet":"/static/75aff570ab64a85d0bd11efb7ad08353/1934d/demo.avif 175w,\n/static/75aff570ab64a85d0bd11efb7ad08353/8f8aa/demo.avif 350w,\n/static/75aff570ab64a85d0bd11efb7ad08353/a273d/demo.avif 700w,\n/static/75aff570ab64a85d0bd11efb7ad08353/49b21/demo.avif 1400w","type":"image/avif","sizes":"(min-width: 700px) 700px, 100vw"},{"srcSet":"/static/75aff570ab64a85d0bd11efb7ad08353/745fa/demo.webp 175w,\n/static/75aff570ab64a85d0bd11efb7ad08353/b0f73/demo.webp 350w,\n/static/75aff570ab64a85d0bd11efb7ad08353/dcd92/demo.webp 700w,\n/static/75aff570ab64a85d0bd11efb7ad08353/c98e3/demo.webp 1400w","type":"image/webp","sizes":"(min-width: 700px) 700px, 100vw"}]},"width":700,"height":400}}},"tech":["Python","React","Relational Database Design"],"github":null,"external":null,"cta":null},"html":"<p>A real-time collaborative workspace for storing, tagging and sharing code snippets across a team. Backed by a relational database schema designed from scratch, with a React front end that keeps multiple editors in sync. Built to understand the hard parts properly — concurrent edits, schema design and query performance — rather than reaching for an off-the-shelf backend.</p>"}}]}}}