41554 blogs · [ { "id": "01a0878a-7ec0-7021-8364-c94054aea402", "title": "2025 Update", "url": "https://jameslmilner.com/posts/2025-update/", "published_at": "2025-12-30T00:00:00+00:00" }, { "id": "01a0878a-7ec0-7021-8364-c940548c61a2", "title": "I Have Not Released Any Books on Amazon", "url": "https://jameslmilner.com/posts/i-have-not-released-any-books-on-amazon/", "published_at": "2025-11-28T00:00:00+00:00" }, { "id": "01a0878a-7ec0-7021-8364-c94053a62fc6", "title": "2024 Update", "url": "https://jameslmilner.com/posts/update/", "published_at": "2024-10-26T00:00:00+00:00" }, { "id": "01a0878a-7ec0-7021-8364-c940533f2359", "title": "Stricter than Strict: 3 Compiler Flags to Consider in your TypeScript Codebase", "url": "https://jameslmilner.com/posts/stricter-than-strict/", "published_at": "2023-09-18T00:00:00+00:00" }, { "id": "01a0878a-7ec0-7021-8364-c94052c143f6", "title": "Generating GeoJSON with ChatGPT", "url": "https://jameslmilner.com/posts/geojson-chat-gpt/", "published_at": "2023-02-16T00:00:00+00:00" }, { "id": "01a0878a-7ec0-7021-8364-c940524e7259", "title": "Keeping an Automated Changelog in JavaScript", "url": "https://jameslmilner.com/posts/keeping-an-automated-changelog/", "published_at": "2023-02-06T00:00:00+00:00" }, { "id": "01a0878a-7ec0-7021-8364-c9405186c898", "title": "A Simple Introduction to Property Based Testing in JavaScript", "url": "https://jameslmilner.com/posts/property-based-testing-in-javascript/", "published_at": "2023-01-30T00:00:00+00:00" }, { "id": "01a0878a-7ec0-7021-8364-c94050d4e885", "title": "Speeding up TypeScript Jest Tests: ts-jest VS vitest VS @swc/jest", "url": "https://jameslmilner.com/posts/speeding-up-typescript-jest-tests/", "published_at": "2023-01-23T00:00:00+00:00" }, { "id": "01a0878a-7ec0-7021-8364-c9404ff3d209", "title": "Why and How to Add Pull Request Templates to Your GitHub Project", "url": "https://jameslmilner.com/posts/github-pull-request-template/", "published_at": "2023-01-16T00:00:00+00:00" }, { "id": "01a0878a-7ec0-7021-8364-c9404fedd269", "title": "Downloading Text, JSON and Images with clientside JavaScript", "url": "https://jameslmilner.com/posts/downloading-a-file-with-javascript/", "published_at": "2023-01-09T00:00:00+00:00" }, { "id": "01a0878a-7ec0-7021-8364-c9404f24a8dc", "title": "Publishing a Preact.js Site on GitHub Pages", "url": "https://jameslmilner.com/posts/preact-on-github-pages/", "published_at": "2023-01-03T00:00:00+00:00" }, { "id": "01a0878a-7ec0-7021-8364-c9404eededff", "title": "Preventing Layout Reflow for Fluid Sized Images", "url": "https://jameslmilner.com/posts/preventing-layout-reflow-for-fluid-images/", "published_at": "2022-07-28T00:00:00+00:00" }, { "id": "01a0878a-7ec0-7021-8364-c9404e7d43f1", "title": "Converting RGB, Hex and HSL Colors with JavaScript & TypeScript", "url": "https://jameslmilner.com/posts/converting-rgb-hex-hsl-colors/", "published_at": "2022-07-23T00:00:00+00:00" }, { "id": "01a0878a-7ec0-7021-8364-c9404da0369a", "title": "Making a Data Structure Iterable in JavaScript & TypeScript", "url": "https://jameslmilner.com/posts/iterable-javascript-data-structures/", "published_at": "2022-03-20T17:28:08+00:00" }, { "id": "01a0878a-7ec0-7021-8364-c9404d08425e", "title": "Coordinate Maps and Sets", "url": "https://jameslmilner.com/posts/coordinate-map/", "published_at": "2022-02-13T00:00:00+00:00" }, { "id": "01a0878a-7ec0-7021-8364-c9404ce99073", "title": "Debugging TypeScript Node Apps", "url": "https://jameslmilner.com/posts/debugging-typescript-node-programs/", "published_at": "2021-07-28T00:00:00+00:00" }, { "id": "01a0878a-7ec0-7021-8364-c9404cc65a32", "title": "Exploring TypeScript Template Literal Types", "url": "https://jameslmilner.com/posts/typescript-template-literal-types/", "published_at": "2021-04-21T00:00:00+00:00" }, { "id": "01a0878a-7ec0-7021-8364-c9404c393cb7", "title": "Measuring the World with JavaScript", "url": "https://jameslmilner.com/posts/measuring-the-world-with-javascript/", "published_at": "2021-01-31T00:00:00+00:00" }, { "id": "01a0878a-7ec0-7021-8364-c9404ba08377", "title": "Experimenting Producing AVIF Images with Node.js", "url": "https://jameslmilner.com/posts/node-avif/", "published_at": "2020-12-25T00:00:00+00:00" }, { "id": "01a0878a-7ec0-7021-8364-c9404b16ce4e", "title": "Getting Started With Handling TypeScript ASTs", "url": "https://jameslmilner.com/posts/ts-ast-and-ts-morph-intro/", "published_at": "2020-08-16T00:00:00+00:00" }, { "id": "01a0878a-7ec0-7021-8364-c9404a82a405", "title": "AssemblyScript - Passing Data to and From Your WebAssembly Program", "url": "https://jameslmilner.com/posts/assemblyscript-passing-around-data/", "published_at": "2020-05-24T00:00:00+00:00" }, { "id": "01a0878a-7ec0-7021-8364-c94049e37dff", "title": "Writing Web Workers in TypeScript", "url": "https://jameslmilner.com/posts/workers-with-webpack-and-typescript/", "published_at": "2020-05-08T00:00:00+00:00" }, { "id": "01a0878a-7ec0-7021-8364-c94049101c71", "title": "Thinking Critically About Code Quality", "url": "https://jameslmilner.com/posts/thinking-critically-about-code-quality/", "published_at": "2019-09-29T00:00:00+00:00" }, { "id": "01a0878a-7ec0-7021-8364-c94048d505df", "title": "External Blog Post Roundup", "url": "https://jameslmilner.com/posts/external-blog-posts/", "published_at": "2019-07-30T00:00:00+00:00" }, { "id": "01a0878a-7ec0-7021-8364-c94047f1b900", "title": "A Quick Look at WorkerDOM", "url": "https://jameslmilner.com/posts/worker-dom/", "published_at": "2018-10-01T00:00:00+00:00" }, { "id": "01a0878a-7ec0-7021-8364-c9404714576a", "title": "Creating Your Own OS Zoomstack Tiles", "url": "https://jameslmilner.com/posts/zoomstack/", "published_at": "2018-07-31T00:00:00+00:00" }, { "id": "01a0878a-7ec0-7021-8364-c9404631a4ba", "title": "Service Worker State Management", "url": "https://jameslmilner.com/posts/serviceworker-state-management/", "published_at": "2018-07-04T00:00:00+00:00" }, { "id": "01a0878a-7ec0-7021-8364-c9404570d29a", "title": "Examining Web Worker Performance", "url": "https://jameslmilner.com/posts/web-worker-performance/", "published_at": "2018-05-22T00:00:00+00:00" }, { "id": "01a0878a-7ec0-7021-8364-c940447afac9", "title": "The Rise of JavaScript Scheduling", "url": "https://jameslmilner.com/posts/javascript-scheduling/", "published_at": "2018-04-23T00:00:00+00:00" }, { "id": "01a0878a-7ec0-7021-8364-c9404433532b", "title": "Cancelling Requests with Abortable Fetch", "url": "https://jameslmilner.com/posts/cancelling-requests/", "published_at": "2018-04-03T00:00:00+00:00" }, { "id": "01a0878a-7ec0-7021-8364-c94043379523", "title": "Easier Web Workers", "url": "https://jameslmilner.com/posts/easier-web-workers/", "published_at": "2018-02-18T00:00:00+00:00" }, { "id": "01a0878a-7ec0-7021-8364-c94043bfbf11", "title": "Implementing the Web Share API in Your App", "url": "https://jameslmilner.com/posts/webshare-api/", "published_at": "2018-02-18T00:00:00+00:00" }, { "id": "01a0878a-7ec0-7021-8364-c940423f2ef7", "title": "Messaging Between Tabs Using Service Worker", "url": "https://jameslmilner.com/posts/tab-state-service-workers/", "published_at": "2018-02-07T00:00:00+00:00" }, { "id": "01a0878a-7ec0-7021-8364-c94041707a4f", "title": "Getting going with ES6 Maps", "url": "https://jameslmilner.com/posts/es6-maps/", "published_at": "2017-12-24T00:00:00+00:00" }, { "id": "01a0878a-7ec0-7021-8364-c940410ffeb1", "title": "Creating Gradient Borders with CSS", "url": "https://jameslmilner.com/posts/gradient-borders/", "published_at": "2017-12-03T00:00:00+00:00" }, { "id": "01a0878a-7ec0-7021-8364-c940408db4d5", "title": "Replicating JavaScripts setTimeout and setInterval in Go", "url": "https://jameslmilner.com/posts/set-timeout-interval-go/", "published_at": "2017-11-11T00:00:00+00:00" }, { "id": "01a0878a-7ec0-7021-8364-c9403fd81673", "title": "Low Hanging PWA Fruit: Manifest Files and Service Worker Precache", "url": "https://jameslmilner.com/posts/easy-pwa/", "published_at": "2017-08-23T00:00:00+00:00" }, { "id": "01a0878a-7ec0-7021-8364-c9403fc9b81a", "title": "Using Go to Plot Global Data", "url": "https://jameslmilner.com/posts/globe-plotter/", "published_at": "2017-07-22T00:00:00+00:00" }, { "id": "01a0878a-7ec0-7021-8364-c9403f2c90e6", "title": "Icon Font to SVG Icons: A worked example", "url": "https://jameslmilner.com/posts/replacing-icon-fonts-with-svg/", "published_at": "2017-06-25T00:00:00+00:00" }, { "id": "01a0878a-7ec0-7021-8364-c9403ea1d47c", "title": "Deploying a Static Blog with Continuous Integration", "url": "https://jameslmilner.com/posts/hugo-on-ci/", "published_at": "2017-06-17T00:00:00+00:00" }, { "id": "01a0878a-7ec0-7021-8364-c9403db41acc", "title": "Effective Cartograms", "url": "https://jameslmilner.com/posts/effective-cartograms/", "published_at": "2017-02-15T00:00:00+00:00" }, { "id": "01a0878a-7ec0-7021-8364-c9403d5ac512", "title": "Dense Spatial Data and User Experience", "url": "https://jameslmilner.com/posts/dense-spatial-data/", "published_at": "2017-01-22T00:00:00+00:00" }, { "id": "01a0878a-7ec0-7021-8364-c9403cc8fc7a", "title": "Visualising Facebook's Population Data on the Web", "url": "https://jameslmilner.com/posts/facebook-data-viz/", "published_at": "2016-12-23T00:00:00+00:00" }, { "id": "01a0878a-7ec0-7021-8364-c9403bf6802b", "title": "10kB Web Pages", "url": "https://jameslmilner.com/posts/10kb-web-pages/", "published_at": "2016-09-04T00:00:00+00:00" }, { "id": "01a0878a-7ec0-7021-8364-c9403bf2a4a0", "title": "The Geospatial Continuum: Is Geo Breaking Out Of Its Niche?", "url": "https://jameslmilner.com/posts/the-geospatial-continuum/", "published_at": "2016-08-31T00:00:00+00:00" }, { "id": "01a0878a-7ec0-7021-8364-c9403b071de5", "title": "Why I Moved To Hugo For My Blog", "url": "https://jameslmilner.com/posts/new-blog/", "published_at": "2016-07-31T00:00:00+00:00" }, { "id": "01a0878a-7ec0-7021-8364-c9403a3d84a6", "title": "Big Geo Data, Spatial Indexes and Parallelization", "url": "https://jameslmilner.com/posts/big-geo-data/", "published_at": "2016-04-10T00:00:00+00:00" }, { "id": "01a0878a-7ec0-7021-8364-c94039c78e3f", "title": "The Hard Thing About Hard Geo Things", "url": "https://jameslmilner.com/posts/hard-geo-things/", "published_at": "2016-03-20T00:00:00+00:00" }, { "id": "01a0878a-7ec0-7021-8364-c940394fb0dc", "title": "On Well Known Text and the Web", "url": "https://jameslmilner.com/posts/wkt-and-the-web/", "published_at": "2016-01-14T00:00:00+00:00" }, { "id": "01a0878a-7ec0-7021-8364-c940387ec5ca", "title": "Devangelism: Finding My Feet - Part 2", "url": "https://jameslmilner.com/posts/devangelism2/", "published_at": "2015-08-02T00:00:00+00:00" }, { "id": "01a0878a-7ebf-714e-825a-04474998a1ff", "title": "Devangelism: Finding My Feet - Part 1", "url": "https://jameslmilner.com/posts/devangelism1/", "published_at": "2015-06-05T00:00:00+00:00" } ] posts Claim your blog
Back to jameslmilner.com
Blog · corpus.blog/blogs/jameslmilner.com/posts

jameslmilner.com

jameslmilner.com

2025

2024

2023

2022

2021

2020

2019

2018

2017

2016

2015