41554 blogs · [ { "id": "01a0879e-6495-72ef-92e8-ba9789570ee0", "title": "Claude Code fixed my WIFI", "url": "https://madole.xyz/blog/claude-code-fixed-my-wifi", "published_at": "2025-12-04T22:11:26+00:00" }, { "id": "01a0879e-6495-72ef-92e8-ba978a16a77a", "title": "Interesting facts I've learned about wildfires over the years", "url": "https://madole.xyz/blog/things-i-learned-about-wildfires", "published_at": "2025-12-03T23:43:43+00:00" }, { "id": "01a0879e-6495-72ef-92e8-ba978a6fc9c9", "title": "Six things about how AI is changing software engineering", "url": "https://madole.xyz/blog/six-things-about-how-ai-is-changing-software-engineering", "published_at": "2025-11-30T10:00:00+00:00" }, { "id": "01a0879e-6495-72ef-92e8-ba978b6bfee3", "title": "GDAL Evolved - A guide to the new unified CLI", "url": "https://madole.xyz/blog/gdal-evolved", "published_at": "2025-10-16T09:26:15+00:00" }, { "id": "01a0879e-6495-72ef-92e8-ba978c68abe0", "title": "A mentor's guide to effective 1-1s - Building trust and driving growth", "url": "https://madole.xyz/blog/a-mentors-guide-to-effective-1-1s", "published_at": "2025-10-16T03:48:58+00:00" }, { "id": "01a0879e-6495-72ef-92e8-ba978cd456ad", "title": "How do you move a whole GeoJSON feature collection in QGIS?", "url": "https://madole.xyz/blog/how-do-you-move-a-whole-geojson-feature-collection-in-qgis", "published_at": "2025-08-25T00:48:25+00:00" }, { "id": "01a0879e-6495-72ef-92e8-ba978dca8d6c", "title": "From Node.js to Deno: A Modern Take on JavaScript Runtimes", "url": "https://madole.xyz/blog/from-nodejs-to-deno", "published_at": "2025-08-15T23:19:58+00:00" }, { "id": "01a0879e-6495-72ef-92e8-ba978e1e788a", "title": "What if You Could Draw Your AI Prompts?", "url": "https://madole.xyz/blog/what-if-you-could-draw-your-ai-prompts", "published_at": "2025-07-31T10:54:57+00:00" }, { "id": "01a0879e-6495-72ef-92e8-ba978ecb9b3a", "title": "Efficiently querying large geospatial datasets with DuckDB, GeoParquet and S3", "url": "https://madole.xyz/blog/efficiently-querying-large-geospatial-datasets-with-duckdb-geoparquet-and-s3", "published_at": "2025-06-05T11:32:29+00:00" }, { "id": "01a0879e-6495-72ef-92e8-ba978f2d8bd2", "title": "WTF are Popcorn Tasks?", "url": "https://madole.xyz/blog/wtf-are-popcorn-tasks", "published_at": "2025-02-04T00:22:52+00:00" }, { "id": "01a0879e-6495-72ef-92e8-ba9790027bb8", "title": "Real-time Transport Data Visualization with GTFS", "url": "https://madole.xyz/blog/real-time-transport-data-visualization-with-gtfs", "published_at": "2025-01-27T09:13:04+00:00" }, { "id": "01a0879e-6495-72ef-92e8-ba97904efee2", "title": "Creating a gif from static image files", "url": "https://madole.xyz/blog/creating-a-gif-from-static-image-files", "published_at": "2024-12-03T02:42:53+00:00" }, { "id": "01a0879e-6495-72ef-92e8-ba97912af5cb", "title": "Dropping bananas on the Moon from a UFO", "url": "https://madole.xyz/blog/dropping-bananas-on-the-moon-from-a-ufo", "published_at": "2024-08-18T23:29:20+00:00" }, { "id": "01a0879e-6495-72ef-92e8-ba97921ea3bc", "title": "Pop the console of JS library websites to demo the library", "url": "https://madole.xyz/blog/pop-the-console-of-js-library-websites-to-demo-the-library", "published_at": "2024-08-13T01:07:09+00:00" }, { "id": "01a0879e-6495-72ef-92e8-ba97923b99cd", "title": "A quick glance at the React 19 Beta feature set", "url": "https://madole.xyz/blog/a-quick-glance-at-the-react-19-beta-feature-set", "published_at": "2024-04-28T04:59:49+00:00" }, { "id": "01a0879e-6495-72ef-92e8-ba97927f54e8", "title": "What are Spectral Indices in Remote Sensing?", "url": "https://madole.xyz/blog/spectral-indices", "published_at": "2023-12-18T23:48:15+00:00" }, { "id": "01a0879e-6495-72ef-92e8-ba97929e4d93", "title": "Setting up ESLint on Webstorm when using Yarn Berry with Plug'n'Play", "url": "https://madole.xyz/blog/setting-up-eslint-on-webstorm-when-using-yarn-berry-with-pnp", "published_at": "2022-01-07T04:35:22+00:00" }, { "id": "01a0879e-6495-72ef-92e8-ba9792e30e25", "title": "How I stress tested mapbox's handling of many polygons", "url": "https://madole.xyz/blog/how-i-stress-tested-mapboxs-handling-of-many-polygons", "published_at": "2022-01-07T01:37:23+00:00" }, { "id": "01a0879e-6495-72ef-92e8-ba97936e92a3", "title": "How to visualise Australia's weather stations on a map", "url": "https://madole.xyz/blog/how-to-visualise-weather-stations-on-a-map", "published_at": "2022-01-04T04:40:33+00:00" }, { "id": "01a0879e-6495-72ef-92e8-ba9793befcb2", "title": "How to model application flows in React with finite state machines and XState", "url": "https://madole.xyz/blog/finite-state-machines-and-xstate", "published_at": "2021-07-23T00:00:00+00:00" }, { "id": "01a0879e-6495-72ef-92e8-ba9794aee3dd", "title": "Kablamo taps McDowell for geo-spatial expertise", "url": "https://madole.xyz/blog/kablamo-taps-mcdowell-for-geo-spatial-expertise", "published_at": "2021-03-14T11:52:36+00:00" }, { "id": "01a0879e-6495-72ef-92e8-ba97955942b1", "title": "Analysing codebase metadata to make refactoring more impactful", "url": "https://madole.xyz/blog/analysing-codebase-metadata-to-make-refactoring-more-impactful", "published_at": "2020-11-11T23:31:20+00:00" }, { "id": "01a0879e-6495-72ef-92e8-ba9795894bc2", "title": "Building Software is much like buying a house", "url": "https://madole.xyz/blog/building-software-is-much-like-buying-a-house", "published_at": "2020-10-20T23:18:57+00:00" }, { "id": "01a0879e-6495-72ef-92e8-ba979643fddf", "title": "Upgrading an old Flow codebase", "url": "https://madole.xyz/blog/upgrading-an-old-flow-codebase", "published_at": "2020-10-20T01:11:34+00:00" }, { "id": "01a0879e-6495-72ef-92e8-ba979684a681", "title": "Cutting our Codeship Pro CI build time in half", "url": "https://madole.xyz/blog/cutting-our-codeship-pro-ci-build-time-in-half", "published_at": "2020-09-25T05:54:05+00:00" }, { "id": "01a0879e-6495-72ef-92e8-ba9796be340e", "title": "Meet the team - Andrew McDowell", "url": "https://madole.xyz/blog/meet-the-team", "published_at": "2019-12-01T01:15:33+00:00" }, { "id": "01a0879e-6495-72ef-92e8-ba97978d3a68", "title": "Getting organised in work", "url": "https://madole.xyz/blog/getting-organised-in-work", "published_at": "2019-11-04T07:12:35+00:00" }, { "id": "01a0879e-6495-72ef-92e8-ba97983b1ba7", "title": "Lessons from creating a component library", "url": "https://madole.xyz/blog/lessons-from-creating-a-component-library", "published_at": "2019-09-23T21:58:40+00:00" }, { "id": "01a0879e-6495-72ef-92e8-ba9798bc594e", "title": "Debugging minified code", "url": "https://madole.xyz/blog/debugging-minified-code", "published_at": "2019-09-12T11:00:34+00:00" }, { "id": "01a0879e-6495-72ef-92e8-ba97999930ed", "title": "A day in the life of", "url": "https://madole.xyz/blog/a-day-in-the-life-of", "published_at": "2019-09-11T17:45:00+00:00" }, { "id": "01a0879e-6495-72ef-92e8-ba9799c1a762", "title": "Unexpected promise in the bagging area", "url": "https://madole.xyz/blog/unexpected-promise-in-the-bagging-area", "published_at": "2019-08-27T07:34:00+00:00" }, { "id": "01a0879e-6495-72ef-92e8-ba979a62f97e", "title": "How I approach an algorithmic code challenge", "url": "https://madole.xyz/blog/how-i-approach-an-algorithmic-code-challenge", "published_at": "2019-07-12T05:59:56+00:00" }, { "id": "01a0879e-6495-72ef-92e8-ba979b41b127", "title": "How to download an image to file on disk when scraping a website", "url": "https://madole.xyz/blog/how-to-download-an-image-to-file-on-disk-when-scraping-a-website", "published_at": "2019-02-07T07:59:56+00:00" }, { "id": "01a0879e-6495-72ef-92e8-ba979c2fe653", "title": "Using Async/Await to batch asynchronous requests", "url": "https://madole.xyz/blog/batching-with-async-await", "published_at": "2018-06-24T10:28:07+00:00" }, { "id": "01a0879e-6495-72ef-92e8-ba979cc9841b", "title": "Migrating data from Ghost to GatsbyJS", "url": "https://madole.xyz/blog/migrating-data-from-ghost-to-gatsby", "published_at": "2018-06-18T10:28:07+00:00" }, { "id": "01a0879e-6495-72ef-92e8-ba979cf6a47f", "title": "Building node-canvas in Amazon Linux AMI for Lambdas", "url": "https://madole.xyz/blog/building-node-canvas-in-amazon-linux-ami-for-lambdas", "published_at": "2017-10-08T18:06:13+00:00" }, { "id": "01a0879e-6495-72ef-92e8-ba979cfb9cd4", "title": "Building a Raspberry Pi internet speed checker with NodeJS and GoogleDocs", "url": "https://madole.xyz/blog/building-a-raspberrypi-internet-speed-checker-with-nodejs-and-googledocs", "published_at": "2017-03-18T16:25:23+00:00" }, { "id": "01a0879e-6495-72ef-92e8-ba979dbc0511", "title": "Whitelisting multiple domains with kcors in Koa", "url": "https://madole.xyz/blog/whitelisting-multiple-domains-with-kcors-in-koa", "published_at": "2017-02-17T12:16:22+00:00" }, { "id": "01a0879e-6495-72ef-92e8-ba979ea02147", "title": "Mocking relative dependencies in Jest with jest.mock()", "url": "https://madole.xyz/blog/mocking-relative-dependencies-in-jest-with-jest-mock", "published_at": "2016-12-07T15:31:07+00:00" }, { "id": "01a0879e-6495-72ef-92e8-ba979f19085e", "title": "Putting Yarn Package Manager to the test", "url": "https://madole.xyz/blog/yarn-package-manager", "published_at": "2016-11-22T17:26:37+00:00" }, { "id": "01a0879e-6495-72ef-92e8-ba979fdedb93", "title": "My favourite VSCode plugins", "url": "https://madole.xyz/blog/my-favourite-vscode-plugins", "published_at": "2016-11-06T14:35:03+00:00" }, { "id": "01a0879e-6496-72e8-98f8-02f4834358f1", "title": "Webpack-dev-server: Where does your CSS go?", "url": "https://madole.xyz/blog/webpack-dev-server-where-does-your-css-go", "published_at": "2016-09-14T16:29:10+00:00" }, { "id": "01a0879e-6496-72e8-98f8-02f48361ca0d", "title": "Serverside CSS Modules with babel", "url": "https://madole.xyz/blog/serverside-css-modules-with-babel", "published_at": "2016-08-21T21:09:38+00:00" }, { "id": "01a0879e-6496-72e8-98f8-02f483d439c1", "title": "babel-loader's hidden feature - babelrc:false", "url": "https://madole.xyz/blog/babel-loaders-hidden-feature-babelrc-false", "published_at": "2016-08-21T19:59:31+00:00" }, { "id": "01a0879e-6496-72e8-98f8-02f484c5a837", "title": "NPM uses your .gitignore file", "url": "https://madole.xyz/blog/npm-uses-your-gitignore-file", "published_at": "2016-07-03T02:59:42+00:00" }, { "id": "01a0879e-6496-72e8-98f8-02f485af9764", "title": "Using console.time to profile performance in your node application", "url": "https://madole.xyz/blog/using-console-time-to-profile-performance-in-your-node-app", "published_at": "2016-06-09T15:27:36+00:00" }, { "id": "01a0879e-6496-72e8-98f8-02f485fba65f", "title": "Error handling in Express with Async/Await routes", "url": "https://madole.xyz/blog/error-handling-in-express-with-async-await-routes", "published_at": "2016-05-25T03:01:50+00:00" }, { "id": "01a0879e-6496-72e8-98f8-02f486b9562e", "title": "babel-plugin-transform-async-to-module-method gotcha", "url": "https://madole.xyz/blog/babel-plugin-transform-async-to-module-method-gotcha", "published_at": "2016-05-08T02:41:11+00:00" }, { "id": "01a0879e-6496-72e8-98f8-02f48744633b", "title": "Asset hashing with webpack", "url": "https://madole.xyz/blog/asset-hashing-with-webpack", "published_at": "2016-04-15T14:32:57+00:00" }, { "id": "01a0879e-6496-72e8-98f8-02f4879828d7", "title": "Using webpack to set up polyfills in your site", "url": "https://madole.xyz/blog/using-webpack-to-set-up-polyfills-in-your-site", "published_at": "2016-04-03T21:40:03+00:00" }, { "id": "01a0879e-6496-72e8-98f8-02f4885922bf", "title": "Writing a Gulpfile in ES6", "url": "https://madole.xyz/blog/writing-a-gulpfile-in-es6", "published_at": "2016-03-30T15:36:06+00:00" }, { "id": "01a0879e-6496-72e8-98f8-02f488995797", "title": "ASYNC/AWAIT ES7", "url": "https://madole.xyz/blog/async-await-es7", "published_at": "2016-03-12T21:56:32+00:00" }, { "id": "01a0879e-6496-72e8-98f8-02f488c3db22", "title": "My favourite Atom packages of 2015", "url": "https://madole.xyz/blog/my-favourite-atom-packages-of-2015", "published_at": "2016-01-02T06:29:19+00:00" }, { "id": "01a0879e-6496-72e8-98f8-02f489c0b8dd", "title": "Semver - the sane way", "url": "https://madole.xyz/blog/semver-the-sane-way", "published_at": "2015-11-07T13:05:03+00:00" }, { "id": "01a0879e-6496-72e8-98f8-02f48a8353e8", "title": "Setting up webpack dev middleware in express", "url": "https://madole.xyz/blog/setting-up-webpack-dev-middleware-in-express", "published_at": "2015-11-07T13:04:33+00:00" }, { "id": "01a0879e-6496-72e8-98f8-02f48a9ea78a", "title": "WhatsApp sharing from the mobile browser", "url": "https://madole.xyz/blog/whatsapp-sharing-from-the-mobile-browser", "published_at": "2015-11-07T13:03:16+00:00" }, { "id": "01a0879e-6496-72e8-98f8-02f48b69663d", "title": "Selenium ActionSequence", "url": "https://madole.xyz/blog/selenium-actionsequence", "published_at": "2015-11-07T12:34:54+00:00" }, { "id": "01a0879e-6496-72e8-98f8-02f48be4b943", "title": "JsFiddle - Firebug lite", "url": "https://madole.xyz/blog/jsfiddle-firebug-lite", "published_at": "2015-11-07T12:31:46+00:00" }, { "id": "01a0879e-6496-72e8-98f8-02f48c5d9b9d", "title": "Some useful everyday linux commands", "url": "https://madole.xyz/blog/some-useful-l", "published_at": "2015-11-07T12:22:16+00:00" }, { "id": "01a0879e-6496-72e8-98f8-02f48c94fe33", "title": "Creating SVG animation with WalkwayJS", "url": "https://madole.xyz/blog/creating-svg-animation-with-walkwayjs", "published_at": "2015-11-01T01:01:07+00:00" }, { "id": "01a0879e-6496-72e8-98f8-02f48d737368", "title": "Javascript Interview Questions", "url": "https://madole.xyz/blog/javascript-interview-questions", "published_at": "2015-11-01T00:29:11+00:00" }, { "id": "01a0879e-6496-72e8-98f8-02f48db7ab10", "title": "Javascript Toolbox", "url": "https://madole.xyz/blog/javascript-toolbox", "published_at": "2015-11-01T00:27:54+00:00" } ] posts Claim your blog
Back to Madole.xyz | Geospatial Web Apps & Portfolio of Andrew McDowell
Blog · corpus.blog/blogs/madole.xyz/posts

Madole.xyz | Geospatial Web Apps & Portfolio of Andrew McDowell

madole.xyz

2025

2024

2023

2022

2021

2020

2019

2018

2017

2016

2015