[{"_path":"/work/","path":"/work/","slug":"folder-work","type":"folder","title":"Work","description":"Recent commercial and client work","items":[]},{"_path":"/work/forgd/","path":"/work/forgd/","type":"post","title":"Forgd","description":"Data-driven tools & advisory services for blockchain token launch","media":{"thumbnail":"/work/forgd/images/thumbnail.png?width=360&height=203"},"date":"2024-03-01","tags":["featured","enterprise","webapp","frontend","nuxt","vue","typescript","tailwind","architecture","charts","data","ui"]},{"_path":"/work/metalink/","path":"/work/metalink/","type":"post","title":"Metalink","description":"Web and mobile app to track, manage and discuss NFT collections","media":{"thumbnail":"/work/metalink/images/metalink.svg?width=1280&height=720"},"date":"2022-03-01","tags":["featured","webapp","frontend","vue","nuxt","tailwind","ui"]},{"_path":"/work/fgh/","path":"/work/fgh/","type":"post","title":"FGH Lexicon","description":"In-house tooling for global strategic communications consultancy","media":{"thumbnail":"/work/fgh/images/fgh-dark.png?width=1280&height=720"},"date":"2021-10-01","status":"unlisted","tags":["webapp","frontend","backend","elasticsearch","chrome-extension","node","nuxt","vue","api","ui"]},{"_path":"/work/asterisk/","path":"/work/asterisk/","type":"post","title":"Asterisk","description":"Greenfield build of peer to peer securities lending platform","media":{"thumbnail":"/work/asterisk/images/asterisk-logo-trans.svg?width=640&height=360"},"date":"2019-02-01","tags":["featured","enterprise","webapp","frontend","api","data","ui","vue","typescript"]},{"_path":"/work/sentiance/","path":"/work/sentiance/","type":"post","title":"Sentiance Journeys","shortTitle":"Sentiance","description":"Development of data visualisation dashboard for data science firm","media":{"thumbnail":"/work/sentiance/images/sentiance-logo-red.svg?width=640&height=360"},"date":"2019-02-01","tags":["featured","webapp","frontend","api","data","vue","graphql","enterprise","ui"]},{"_path":"/work/clearbank/","path":"/work/clearbank/","type":"post","title":"Clear Bank","description":"Development of internal banking systems and tooling","media":{"thumbnail":"/work/clearbank/images/clearbank-logo-light.svg?width=640&height=360"},"date":"2018-03-01","tags":["featured","enterprise","webapp","frontend","api","ui","vue","typescript"]},{"_path":"/work/fairsquare/","path":"/work/fairsquare/","type":"post","title":"FairSquare","description":"Greenfield build of car finance and sales platform","media":{"thumbnail":"/work/fairsquare/images/fairsquare-logo.svg?width=640&height=360"},"date":"2017-05-01","tags":["featured","enterprise","webapp","frontend","backend","database","vue","data","api","ui","laravel"]},{"_path":"/products/","path":"/products/","slug":"folder-products","type":"folder","title":"Products","description":"Digital products, aimed at consumers","items":[]},{"_path":"/products/bluesky-follower-info/","path":"/products/bluesky-follower-info/","type":"post","title":"Bluesky Follower Info","description":"View your followers' profile and stats in your feed to decide who to follow back","media":{"thumbnail":"/products/bluesky-follower-info/images/bsky-splash.png?width=640&height=360"},"github":"davestewart/bluesky-follower-info","date":"2024-11-27","tags":["productivity","chrome-extension","tools"]},{"_path":"/products/timezone-planner/","path":"/products/timezone-planner/","type":"post","title":"Timezone Planner","shortTitle":"Timezone Planner","description":"Visualise and plan your remote team's availability and meeting times","media":{"thumbnail":"/products/timezone-planner/images/thumbnail.png?width=532&height=300"},"date":"2024-04-24","tags":["productivity","tools"]},{"_path":"/products/better-fastmail/","path":"/products/better-fastmail/","type":"post","title":"Better FastMail","description":"UX & UI improvements to the FastMail web client","media":{"thumbnail":"/products/better-fastmail/images/better-fastmail.png?width=1280&height=720"},"github":"davestewart/better-fastmail","date":"2022-04-16","tags":["productivity","chrome-extension","tools"]},{"_path":"/products/control-space/","path":"/products/control-space/","type":"post","title":"Control Space","description":"Browser tab / workflow manager","media":{"thumbnail":"/products/control-space/images/cs-thumb.png?width=640&height=360"},"date":"2021-03-05","tags":["featured","productivity","chrome-extension","typescript","vue","api","ui"]},{"_path":"/products/workflowy-multiflow/","path":"/products/workflowy-multiflow/","type":"post","title":"WorkFlowy MultiFlow","description":"Multi-column view for WorkFlowy","media":{"thumbnail":"/products/workflowy-multiflow/images/multiflow-thumb-01.svg?width=700&height=394"},"date":"2021-03-01","tags":["featured","productivity","chrome-extension","tools","design"]},{"_path":"/products/great-suspender-recovery-tool/","path":"/products/great-suspender-recovery-tool/","type":"post","title":"The Great Suspender Recovery Tool","shortTitle":"Great Suspender Recovery","description":"Recover your deleted Great Suspender tabs!","media":{"thumbnail":"/products/great-suspender-recovery-tool/images/tgsrt-thumb.png?width=640&height=360"},"github":"davestewart/great-suspender-recovery-tool","date":"2021-02-01","tags":["javascript","chrome-extension","rapid-build","vue","ui"]},{"_path":"/products/todo-emojis/","path":"/products/todo-emojis/","type":"post","title":"Todo Emojis","description":"Checkbox emojis for todo lists in Slack","media":{"thumbnail":"/products/todo-emojis/images/todo-emojis-logo.svg?width=1280&height=720"},"github":"davestewart/todo-emojis","date":"2020-09-25","tags":["featured","creative","productivity","rapid-build","design"]},{"_path":"/products/got-paper/","path":"/products/got-paper/","type":"post","title":"Got Paper?","description":"A cheeky app to calculate your toilet paper requirements","media":{"thumbnail":"/products/got-paper/images/thumb.png?width=800&height=450"},"github":"davestewart/got-paper","date":"2020-02-01","tags":["featured","webapp","mobile","creative","javascript","nuxt","vue","rapid-build","design","ui"]},{"_path":"/projects/","path":"/projects/","slug":"folder-projects","type":"folder","title":"Projects","description":"Technical + creative personal projects","items":[]},{"_path":"/projects/open-source/","path":"/projects/open-source/","slug":"folder-projects-open-source","type":"folder","title":"Open Source","description":"Open Source libraries for JavaScript developers","items":[]},{"_path":"/projects/open-source/phomemo-cli/","path":"/projects/open-source/phomemo-cli/","type":"post","title":"Phomemo CLI","description":"Node CLI, print server and browser client for the Phomemo mini printer","media":{"thumbnail":"/projects/open-source/phomemo-cli/images/phomemo-cli-thumbnail.png?width=640&height=360"},"github":"davestewart/phomemo-cli","date":"2024-11-16","tags":["library","tools","node","javascript","chrome-extension"]},{"_path":"/projects/open-source/figma-select-related/","path":"/projects/open-source/figma-select-related/","type":"post","title":"Figma Select Related","description":"Select distantly-related items in complex component trees","media":{"thumbnail":"/projects/open-source/figma-select-related/images/figma-select-related-thumb.png?width=640&height=360"},"github":"davestewart/figma-select-related","date":"2023-04-29","tags":["plugin","tools","productivity","typescript","ui"]},{"_path":"/projects/open-source/spaceman/","path":"/projects/open-source/spaceman/","type":"post","title":"Spaceman","description":"Manage monorepo workspaces with a prompt-based CLI","media":{"thumbnail":"/projects/open-source/spaceman/images/spaceman-thumb.png?width=1280&height=720"},"github":"davestewart/spaceman","date":"2022-10-01","tags":["library","tools","node","design"]},{"_path":"/projects/open-source/es-kit/","path":"/projects/open-source/es-kit/","type":"post","title":"ES Kit","description":"A 'pick and mix' library that simplifies writing Elasticsearch code","media":{"thumbnail":"/projects/open-source/es-kit/images/es-kit.png?width=1280&height=720"},"github":"davestewart/es-kit","date":"2021-12-01","status":"unlisted","tags":["library","node","elasticsearch"]},{"_path":"/projects/open-source/outliner/","path":"/projects/open-source/outliner/","type":"post","title":"Outliner","description":"Convert SVG strokes to outlined fills as a post-export process","media":{"thumbnail":"/projects/open-source/outliner/images/outliner-thumb.png?width=640&height=360"},"github":"davestewart/outliner","date":"2021-09-01","tags":["featured","library","tools","node","icons"]},{"_path":"/projects/open-source/alias-hq/","path":"/projects/open-source/alias-hq/","type":"post","title":"Alias HQ","description":"The end-to-end solution for migrating to and using path aliases","media":{"thumbnail":"/projects/open-source/alias-hq/images/alias-thumbnail.png?width=640&height=360"},"github":"davestewart/alias-hq","date":"2020-08-01","tags":["featured","library","tools","node","design"]},{"_path":"/projects/open-source/axios-actions/","path":"/projects/open-source/axios-actions/","type":"post","title":"Axios Actions","description":"Bundle endpoints as callable, reusable services","media":{"thumbnail":"/projects/open-source/axios-actions/images/axios-actions.svg?width=1280&height=720"},"github":"davestewart/axios-actions","date":"2018-07-01","tags":["library","javascript","state","architecture"]},{"_path":"/projects/open-source/state-machine/","path":"/projects/open-source/state-machine/","type":"post","title":"State Machine","description":"A powerful yet simply-configured JavaScript finite-state machine","media":{"thumbnail":"/projects/open-source/state-machine/images/state-machine-thumb.png?width=720&height=403"},"github":"davestewart/javascript-state-machine","date":"2016-10-01","tags":["featured","library","javascript","state"]},{"_path":"/projects/vue/","path":"/projects/vue/","slug":"folder-projects-vue","type":"folder","title":"Vue and Nuxt","description":"Packages and plugins for Vue and Nuxt","items":[]},{"_path":"/projects/vue/nuxt-layers-utils/","path":"/projects/vue/nuxt-layers-utils/","type":"post","title":"Nuxt Layers Utils","description":"Simplify and consolidate Nuxt layers paths' configuration","media":{"thumbnail":"/projects/vue/nuxt-layers-utils/images/nuxt-layers-utils-thumb.png?width=360&height=203"},"github":"davestewart/nuxt-layers-utils","date":"2024-05-09","tags":["library","architecture","nuxt","typescript"]},{"_path":"/projects/vue/nuxt-content-assets/","path":"/projects/vue/nuxt-content-assets/","type":"post","title":"Nuxt Content Assets","description":"Enable locally-located assets in Nuxt Content","media":{"thumbnail":"/projects/vue/nuxt-content-assets/images/nuxt-content-assets.png?width=960&height=540"},"github":"davestewart/nuxt-content-assets","date":"2023-04-14","tags":["featured","library","nuxt","vue"]},{"_path":"/projects/vue/nuxt-areas/","path":"/projects/vue/nuxt-areas/","type":"post","title":"Nuxt Areas","description":"Scalable folder management for large Nuxt 2 projects","media":{"thumbnail":"/projects/vue/nuxt-areas/images/nuxt-areas.png?width=1280&height=720"},"github":"davestewart/nuxt-areas","date":"2021-11-01","tags":["library","architecture","nuxt","vue","javascript","node","webpack"]},{"_path":"/projects/vue/vue-class-store/","path":"/projects/vue/vue-class-store/","type":"post","title":"Vue Class Store","description":"Universal Vue stores you write once and use anywhere","media":{"thumbnail":"/projects/vue/vue-class-store/images/vue-class-store.svg?width=1280&height=720"},"github":"davestewart/vue-class-store","date":"2020-05-01","tags":["featured","library","javascript","typescript","vue","state","architecture","design"]},{"_path":"/projects/vue/vuex-pathify/","path":"/projects/vue/vuex-pathify/","type":"post","title":"Vuex Pathify","description":"Vue / Vuex plugin providing a unified path syntax to Vuex stores","media":{"thumbnail":"/projects/vue/vuex-pathify/images/vuex-pathify.svg?width=1280&height=720"},"github":"davestewart/vuex-pathify","date":"2017-07-01","tags":["library","javascript","vue","state","architecture","design"]},{"_path":"/projects/browser-extensions/","path":"/projects/browser-extensions/","slug":"folder-projects-browser-extensions","type":"folder","title":"Browser Extension Tooling","description":"Packages and plugins for browser extension development","items":[]},{"_path":"/projects/browser-extensions/wxt-module-layers/","path":"/projects/browser-extensions/wxt-module-layers/","type":"post","title":"WXT Layers","description":"Nuxt-like layers functionality for WXT browser extensions","media":{"thumbnail":"/projects/browser-extensions/wxt-module-layers/images/wxt-layers-thumb.png?width=640&height=360"},"github":"davestewart/wxt-module-layers","date":"2025-11-28","tags":["library","typescript","chrome-extension","architecture","tools"]},{"_path":"/projects/browser-extensions/wxt-module-pages/","path":"/projects/browser-extensions/wxt-module-pages/","type":"post","title":"WXT Pages","description":"File-system based routing for WXT browser extensions","media":{"thumbnail":"/projects/browser-extensions/wxt-module-pages/images/wxt-pages-thumb.png?width=640&height=360"},"github":"davestewart/wxt-module-pages","date":"2025-11-28","tags":["library","typescript","chrome-extension","architecture"]},{"_path":"/projects/browser-extensions/extension-bus/","path":"/projects/browser-extensions/extension-bus/","type":"post","title":"Extension Bus","description":"Universal message bus for web extensions","media":{"thumbnail":"/projects/browser-extensions/extension-bus/images/extension-bus-thumb.png?width=640&height=360"},"github":"davestewart/extension-bus","date":"2024-01-10","tags":["library","typescript","chrome-extension","api","architecture"]},{"_path":"/projects/personal/","path":"/projects/personal/","slug":"folder-projects-personal","type":"folder","title":"Personal","description":"Personal development and creative endeavours","items":[]},{"_path":"/projects/personal/dave-stewart/","path":"/projects/personal/dave-stewart/","type":"post","title":"Dave Stewart","description":"2026 Nuxt migration of davestewart.co.uk","media":{"thumbnail":"/projects/personal/dave-stewart/images/thumbnail.png?width=640&height=360"},"github":"davestewart/davestewart-site","date":"2026-02-26","status":"new","tags":["webapp","website","frontend","nuxt","vue","ui","data","creative"]},{"_path":"/projects/personal/birthday-timeline/","path":"/projects/personal/birthday-timeline/","type":"post","title":"Birthday Timeline Poster","description":"Birthday retrospective where guests share memories via QR code","media":{"thumbnail":"/projects/personal/birthday-timeline/images/timeline-thumb.png?width=640&height=360"},"date":"2024-11-03","tags":["chrome-extension","javascript","experiment","creative"]},{"_path":"/projects/personal/likely-logic/","path":"/projects/personal/likely-logic/","type":"post","title":"Likely Logic","description":"Holding page for my product development moniker","media":{"thumbnail":"/projects/personal/likely-logic/images/likely-logic.svg?width=1280&height=720"},"date":"2021-01-01","tags":["website","design"]},{"_path":"/projects/personal/branding/","path":"/projects/personal/branding/","type":"post","title":"Branding Experiment","description":"Branding experiment with overlays and colour mapping","media":{"thumbnail":"/projects/personal/branding/images/featured.png?width=722&height=406"},"date":"2020-04-01","tags":["featured","creative","animation","design"]},{"_path":"/blog/","path":"/blog/","slug":"folder-blog","type":"folder","title":"Blog","description":"Insights, opinions, musings...","items":[]},{"_path":"/blog/work/","path":"/blog/work/","slug":"folder-blog-work","type":"folder","title":"Work","description":"Thoughts and realisations on the business of software development","items":[]},{"_path":"/blog/work/hackathon-guide/","path":"/blog/hackathon-guide/","type":"post","title":"Guide to nailing your next hackathon","description":"An intro to hackathons and how to get the most out of them","media":{"thumbnail":"/blog/work/hackathon-guide/images/thumbnail.jpg?width=640&height=360"},"date":"2023-05-10"},{"_path":"/blog/work/project-estimation/","path":"/blog/the-work-is-never-just-the-work/","type":"post","title":"The work is never just “the work”","description":"A deep dive on why projects always take longer and a framework to improve future estimation","media":{"thumbnail":"/blog/work/project-estimation/images/estimation-thumbnail.png?width=600&height=338"},"date":"2022-02-01","tags":["featured"]},{"_path":"/blog/work/app-diary/","path":"/blog/app-diary/","type":"post","title":"Diary of a Rapid Application Build","description":"Development diary and reflection on building a Trello clone from scratch","media":{"thumbnail":"/blog/work/app-diary/images/app-diary-thumbnail-02.png?width=640&height=360"},"github":"davestewart/app-diary","date":"2018-02-01","tags":["website","frontend","creative","vue","rapid-build"]},{"_path":"/blog/productivity/","path":"/blog/productivity/","slug":"folder-blog-productivity","type":"folder","title":"Productivity","description":"Everything I know so far about staying productive and getting more done","items":[]},{"_path":"/blog/productivity/mind-shifts-and-wins/","path":"/blog/mind-shifts-and-wins/","type":"post","title":"On mindsets, mind shifts and wins","description":"A 10-year (ish) retrospective of self-reflection and improvement","media":{"thumbnail":"/blog/productivity/mind-shifts-and-wins/mindset.png?width=1280&height=720"},"date":"2023-02-22","tags":["featured"]},{"_path":"/blog/productivity/workflowy-inboxes/","path":"/blog/workflowy-inboxes/","type":"post","title":"WorkFlowy \"Inboxes\"","description":"A WorkFlowy organisational strategy for when you've multiple projects and lots of ideas","media":{"thumbnail":"/blog/productivity/workflowy-inboxes/workflowy-inboxes-thumb.png?width=640&height=360"},"date":"2023-02-04"},{"_path":"/blog/productivity/rocks-pebbles-sand/","path":"/blog/rocks-pebbles-sand/","type":"post","title":"Why rocks, pebbles, sand is a productivity trap","description":"Doing the big stuff first can set you up for failure; here's how you should structure your day instead","media":{"thumbnail":"/blog/productivity/rocks-pebbles-sand/images/rock-pebbles-sand.png?width=1024&height=512"},"date":"2021-08-11"},{"_path":"/blog/nuxt/","path":"/blog/nuxt/","slug":"folder-blog-nuxt","type":"folder","title":"Nuxt","description":"Deep dives about Nuxt and the Vue ecosystem","items":[]},{"_path":"/blog/nuxt/nuxt-data-fetching/","path":"/blog/nuxt-data-fetching/","type":"post","title":"Data fetching in Nuxt","description":"Nuxt data fetching explained within the context of Nuxt's SSR lifecycle","media":{"thumbnail":"/blog/nuxt/nuxt-data-fetching/thumb.png?width=360&height=203"},"date":"2025-11-05","tags":["nuxt","vue","data"]},{"_path":"/blog/nuxt/nuxt-data-fetching/cookbook/","path":"/blog/nuxt-data-fetching/cookbook/","type":"post","title":"Nuxt Data Fetching Cookbook","shortTitle":"Data Fetching Cookbook","description":"A cookbook of Nuxt data fetching patterns and best practices","media":{"thumbnail":"/blog/nuxt/nuxt-data-fetching/thumb.png?width=360&height=203"},"date":"2025-11-05","status":"unlisted","tags":["nuxt","data"]},{"_path":"/blog/nuxt/nuxt-auto-import/","path":"/blog/nuxt-auto-import/","type":"post","title":"Getting a grip on Nuxt's auto-import functionality","description":"Understanding when to use and when to avoid the auto-import magic","media":{"thumbnail":"/blog/nuxt/nuxt-auto-import/images/thumbnail.png?width=360&height=203"},"date":"2024-05-21","tags":["nuxt","vue","typescript","architecture"]},{"_path":"/blog/nuxt/nuxt-layers/","path":"/blog/nuxt-layers/","type":"post","title":"Modular site architecture with Nuxt layers","description":"Build sites that scale by organising code by domain, not concern","media":{"thumbnail":"/blog/nuxt/nuxt-layers/images/thumb.png?width=360&height=203"},"date":"2024-05-14","tags":["featured","nuxt","vue","architecture"]},{"_path":"/blog/programming/","path":"/blog/programming/","slug":"folder-blog-programming","type":"folder","title":"Programming","description":"Programming concepts explained in plain English with understandable examples","items":[]},{"_path":"/blog/programming/how-ai-writes-code/","path":"/blog/how-ai-writes-code/","type":"post","title":"How do AIs code as well as they do?","description":"Claude AI explains in its own words how it writes such good code","media":{"thumbnail":"/blog/programming/how-ai-writes-code/ai-code-thumbnail.png?width=360&height=203"},"date":"2024-11-09","tags":["featured"]},{"_path":"/blog/programming/extension-versioning/","path":"/blog/extension-versioning/","type":"post","title":"Versioning and releasing larger Chrome extensions","description":"An approach to plan and implement a robust versioning scheme and release schedule – without Semver","media":{"thumbnail":"/blog/programming/extension-versioning/versioning-thumb.png?width=360&height=203"},"date":"2023-08-09"},{"_path":"/blog/programming/msal-vue/","path":"/blog/msal-vue/","type":"post","title":"A guide to MSAL authentication in Vue","description":"Architect a Vue JS app secured with Microsoft Authentication Library","media":{"thumbnail":"/blog/programming/msal-vue/msal-thumbnail.png?width=1280&height=720"},"date":"2023-02-28","tags":["featured"]},{"_path":"/blog/programming/type-safe-json/","path":"/blog/type-safe-json/","type":"post","title":"7 code-style variations for strongly-typed JSON","description":"Destructure raw JSON whilst automatically adding type information","media":{"thumbnail":"/blog/programming/type-safe-json/thumbnail.png?width=1280&height=720"},"date":"2021-11-01"},{"_path":"/blog/software/","path":"/blog/software/","slug":"folder-blog-software","type":"folder","title":"Software","description":"Tips and hacks for software I use every day","items":[]},{"_path":"/blog/software/webstorm-features/","path":"/blog/webstorm-features/","type":"post","title":"WebStorm Power User Manual","description":"The WebStorm features and tools I use everyday to write better code and build bigger apps","media":{"thumbnail":"/blog/software/webstorm-features/webstorm-splash.png?width=1280&height=720"},"date":"2022-04-22"},{"_path":"/blog/software/webstorm-shortcuts/","path":"/blog/webstorm-shortcuts/","type":"post","title":"WebStorm shortcuts for lightning productivity","description":"Essential WebStorm keyboard shortcuts to make you the most productive developer in the office","media":{"thumbnail":"/blog/software/webstorm-shortcuts/webstorm-splash.png?width=1280&height=720"},"date":"2022-04-21"},{"_path":"/blog/software/mac-finder-tips/","path":"/blog/mac-finder-tips/","type":"post","title":"25 Finder tips & tactics to speed up your workflow","description":"A treasure trove of solid strategies and hidden gems to wrangle those windows and fly through folders","media":{"thumbnail":"/blog/software/mac-finder-tips/mac-finder.svg?width=79&height=44"},"date":"2022-02-01"},{"_path":"/blog/software/workflowy-styling/","path":"/blog/workflowy-styling/","type":"post","title":"Hacking WorkFlowy formatting with Stylish","description":"Use a well-known Chrome extension to add new functionality via custom CSS styles","media":{"thumbnail":"/blog/software/workflowy-styling/workflowy-highlight-thumb.png?width=800&height=450"},"date":"2021-06-01"},{"_path":"/blog/thoughts/","path":"/blog/thoughts/","slug":"folder-blog-thoughts","type":"folder","title":"Thoughts","description":"Random musings","items":[]},{"_path":"/blog/thoughts/keto-and-fasting/","path":"/blog/keto-and-fasting/","type":"post","title":"My ketogenic diet and intermittent fasting journey","description":"Everything I learned in 3 months of sticking to a keto and fasting regime","media":{"thumbnail":"/blog/thoughts/keto-and-fasting/laksa-thumb.jpg?width=520&height=311"},"date":"2023-05-11"},{"_path":"/blog/thoughts/nail-biting/","path":"/blog/nail-biting/","type":"post","title":"How I stopped biting my nails","description":"How I stopped biting my nails and learned to respect my hands","media":{"thumbnail":"/blog/thoughts/nail-biting/nails-splash.png?width=840&height=472"},"date":"2022-04-26"},{"_path":"/blog/thoughts/twosdays-hidden-symmetry/","path":"/blog/twosdays-hidden-symmetry/","type":"post","title":"Twosday's hidden analogue symmetry","description":"22:22 is palindromic and ambigramic, but what about its analogue form?","media":{"thumbnail":"/blog/thoughts/twosdays-hidden-symmetry/images/twosday.png?width=1200&height=675"},"date":"2022-02-23","tags":["featured"]},{"_path":"/blog/thoughts/the-wrong-kind-of-democracy/","path":"/blog/the-wrong-kind-of-democracy/","type":"post","title":"The wrong kind of democracy?","description":"A comparison of the 2015 election results with FPTP vs PR","media":{"thumbnail":"/blog/thoughts/the-wrong-kind-of-democracy/images/election-thumb.png?width=742&height=417"},"date":"2015-05-10"},{"_path":"/blog/thoughts/the-shard-finished/","path":"/blog/the-shard-finished/","type":"post","title":"The Shard, finished","description":"Ever thought The Shard looks like they forgot to finish it off? See how it could have looked if they had...","media":{"thumbnail":"/blog/thoughts/the-shard-finished/images/shard-thumbnail.jpg?width=800&height=450"},"date":"2013-11-08"},{"_path":"/archive/","path":"/archive/","slug":"folder-archive","type":"folder","title":"Archive","description":"The best older work","items":[]},{"_path":"/archive/work/","path":"/archive/work/","slug":"folder-archive-work","type":"folder","title":"Work","description":"Older commercial work","items":[]},{"_path":"/archive/work/flash/","path":"/archive/work/flash/","slug":"folder-archive-work-flash","type":"folder","title":"Flash","description":"Flash websites","items":[]},{"_path":"/archive/work/flash/mixoff/","path":"/archive/work/flash/mixoff/","type":"post","title":"TalkTalk/X Factor - Mix Off","shortTitle":"X Factor Mix Off","description":"Flash application allowing users to star in their own pop music videos","media":{"thumbnail":"/archive/work/flash/mixoff/images/mixoff-featured.png?width=260&height=260"},"date":"2014-10-21","tags":["flash","frontend","as3","ui","api","video","ugc"]},{"_path":"/archive/work/flash/world-chess/","path":"/archive/work/flash/world-chess/","type":"post","title":"World Chess: ChessCasting","shortTitle":"World Chess","description":"Interactive prototype for broadcast chess","media":{"thumbnail":"/archive/work/flash/world-chess/images/world-chess-logo.png?width=450&height=450"},"date":"2012-08-05","tags":["flash","frontend","data","api","as3","technical","concept"]},{"_path":"/archive/work/flash/map-my-summer/","path":"/archive/work/flash/map-my-summer/","type":"post","title":"YouTube: Map My Summer","shortTitle":"Map My Summer","description":"Flash micro-site with heavy use of mapping and video APIs","media":{"thumbnail":"/archive/work/flash/map-my-summer/images/map-my-summer-fwa-square.jpg?width=400&height=400"},"date":"2011-02-05","tags":["flash","frontend","data","api","ui","as3","animation","technical","mashup","award","social","video","maps","ugc"]},{"_path":"/archive/work/flash/lost-angel/","path":"/archive/work/flash/lost-angel/","type":"post","title":"Lost Angel: Flash microsite","shortTitle":"Lost Angel","description":"Immersive Flash micro-site for one of London's leading destination bars","media":{"thumbnail":"/archive/work/flash/lost-angel/images/lost-angel-thumb.png?width=260&height=260"},"date":"2009-08-05","tags":["flash","frontend","animation","creative","technical","3d","as3","after-effects","3dsmax"]},{"_path":"/archive/work/flash/sony-talkman/","path":"/archive/work/flash/sony-talkman/","type":"post","title":"Sony: Talkman PSP Microsite","shortTitle":"Talkman PSP","description":"Multilingual Flash micro-site for Sony PSP translation game / software","media":{"thumbnail":"/archive/work/flash/sony-talkman/thumbs/wallpaper-square.jpg?width=520&height=520"},"date":"2006-05-05","tags":["flash","game","data","3d","animation","technical","as3","video","ugc"]},{"_path":"/archive/work/flash/tokyo-drift/","path":"/archive/work/flash/tokyo-drift/","type":"post","title":"Universal: Fast & Furious Game","shortTitle":"Fast & Furious","description":"Flash racing game for Tokyo Drift official film site","media":{"thumbnail":"/archive/work/flash/tokyo-drift/images/tokyo-drift-thumb-square.jpg?width=520&height=520"},"date":"2006-02-08","tags":["flash","frontend","game","physics","technical","as3"]},{"_path":"/archive/work/html/","path":"/archive/work/html/","slug":"folder-archive-work-html","type":"folder","title":"HTML","description":"HTML websites","items":[]},{"_path":"/archive/work/html/timeslice-live/","path":"/archive/work/html/timeslice-live/","type":"post","title":"Timeslice Live","description":"Kiosk and online system for live event multi-camera photo studio","media":{"thumbnail":"/archive/work/html/timeslice-live/images/timeslice-feature-01.png?width=260&height=260"},"date":"2015-04-01","tags":["webapp","ui","vue","database","laravel","php","ipad"]},{"_path":"/archive/work/html/g4s/","path":"/archive/work/html/g4s/","type":"post","title":"G4S: \"How it Works\" Animation","shortTitle":"G4S \"How it Works\"","description":"Cross-device HTML5 story-style animation","media":{"thumbnail":"/archive/work/html/g4s/images/g4s-feature.png?width=260&height=260"},"date":"2014-08-01","tags":["frontend","javascript","animation","html"]},{"_path":"/archive/work/html/rise-as-one/","path":"/archive/work/html/rise-as-one/","type":"post","title":"Budweiser: Rise As One","shortTitle":"Rise As One","description":"Front end development for Rise as One World Cup campaign","media":{"thumbnail":"/archive/work/html/rise-as-one/images/budweiser-feature.png?width=260&height=260"},"date":"2014-06-12","tags":["webapp","html","responsive","javascript","video"]},{"_path":"/archive/work/html/f1/","path":"/archive/work/html/f1/","type":"post","title":"F1: Global Broadcast Report","shortTitle":"F1 Broadcast Report","description":"SPA for data-driven end-of-year report for Formula One","media":{"thumbnail":"/archive/work/html/f1/images/f1-feature-02.jpg?width=260&height=260"},"date":"2013-01-05","tags":["concept","website","frontend","html","javascript","api","data","charts","technical","ipad","svg"]},{"_path":"/archive/work/html/cyber-city/","path":"/archive/work/html/cyber-city/","type":"post","title":"e-skills Cyber City","description":"Creative and technical development for 12-14 year old e-learning project","media":{"thumbnail":"/archive/work/html/cyber-city/images/cyber-city-feature-02.png?width=260&height=259"},"date":"2012-09-05","tags":["frontend","html","javascript","game","technical","award","concept"]},{"_path":"/archive/work/html/nineteen/","path":"/archive/work/html/nineteen/","type":"post","title":"19: Microsite","shortTitle":"19 Microsite","description":"Landing page for Simon Fuller's 19 Entertainment stable","media":{"thumbnail":"/archive/work/html/nineteen/images/nineteen-thumb.jpg?width=520&height=520"},"date":"2009-02-05","tags":["frontend","html","ui","responsive","javascript","technical","concept","webapp"]},{"_path":"/archive/work/animation/","path":"/archive/work/animation/","slug":"folder-archive-work-animation","type":"folder","title":"Animation","description":"3dsmax and After Effects animation","items":[]},{"_path":"/archive/work/animation/showreel/","path":"/archive/work/animation/showreel/","type":"post","title":"Animation Showreel","description":"My final showreel from my animation days","media":{"thumbnail":"/archive/work/animation/showreel/images/showreel.png?width=512&height=288"},"date":"2007-12-01","tags":["creative","flash","3d","after-effects","3dsmax","concept"]},{"_path":"/archive/work/animation/disney-channel/","path":"/archive/work/animation/disney-channel/","type":"post","title":"Disney Channel: Halloween","shortTitle":"Disney Channel Halloween","description":"2D and 3D animation mixed to create a spooky Halloween ident","media":{"thumbnail":"/archive/work/animation/disney-channel/images/disney-channel.jpg?width=580&height=326"},"date":"2007-09-08","tags":["creative","data","animation","3d","after-effects","technical","plugin","3dsmax","concept"]},{"_path":"/archive/work/animation/jetix/","path":"/archive/work/animation/jetix/","type":"post","title":"Jetix: \"My Jetix\" promo","description":"Highly-scripted 3D animation sequence","media":{"thumbnail":"/archive/work/animation/jetix/images/jetix-thumbnail.jpg?width=580&height=326"},"date":"2006-10-08","status":"unlisted","tags":["creative","animation","3d","after-effects","technical","plugin","3dsmax","concept"]},{"_path":"/archive/work/animation/mozart-uncovered/","path":"/archive/work/animation/mozart-uncovered/","type":"post","title":"BBC4: Mozart Uncovered","shortTitle":"BBC4 Mozart Uncovered","description":"Visual exploration of the structure and ideas of Mozart's symphonies","media":{"thumbnail":"/archive/work/animation/mozart-uncovered/images/mozart-02.jpg?width=1024&height=576"},"date":"2005-06-08","tags":["javascript","data","after-effects","technical","mashup","vba"]},{"_path":"/archive/work/animation/nocturnal-groove-visuals/","path":"/archive/work/animation/nocturnal-groove-visuals/","type":"post","title":"Nocturnal Groove: Visuals","shortTitle":"Nocturnal Groove Visuals","description":"Club and festival visuals for chart-toppers Shapeshifter","media":{"thumbnail":"/archive/work/animation/nocturnal-groove-visuals/images/nocturnal-groove.png?width=404&height=227"},"date":"2005-05-08","tags":["creative","animation","after-effects","concept"]},{"_path":"/archive/work/animation/so-you-think-youre-safe/","path":"/archive/work/animation/so-you-think-youre-safe/","type":"post","title":"Sky One: So You Think You're Safe?","shortTitle":"So You Think You're Safe?","description":"Fun title animation about the hidden dangers of everyday situations","media":{"thumbnail":"/archive/work/animation/so-you-think-youre-safe/images/safe-thumb.jpg?width=640&height=352"},"date":"2004-10-01","tags":["creative","animation","after-effects","3dsmax"]},{"_path":"/archive/work/animation/truth-about-love/","path":"/archive/work/animation/truth-about-love/","type":"post","title":"The Truth About Love","description":"Film titles for mid-naughties rom-com starring Jenifer Love Hewitt","media":{"thumbnail":"/archive/work/animation/truth-about-love/images/truth-about-love.png?width=640&height=350"},"date":"2004-09-01","tags":["creative","animation","after-effects","3dsmax"]},{"_path":"/archive/projects/","path":"/archive/projects/","slug":"folder-archive-projects","type":"folder","title":"Projects","description":"Previous side projects","items":[]},{"_path":"/archive/projects/personal/","path":"/archive/projects/personal/","slug":"folder-archive-projects-personal","type":"folder","title":"Personal projects","description":"Apps, experiments and investigations","items":[]},{"_path":"/archive/projects/personal/balham-night/","path":"/archive/projects/personal/balham-night/","type":"post","title":"Balham Night","description":"Social networking & mapping experiment","media":{"thumbnail":"/archive/projects/personal/balham-night/images/balham-night.png?width=260&height=260"},"date":"2007-04-05","tags":["frontend","backend","creative","html","php","javascript","data","api","technical","mashup","social","concept","maps"]},{"_path":"/archive/projects/personal/open-source-map/","path":"/archive/projects/personal/open-source-map/","type":"post","title":"Open Source Project Map","description":"Tube map inspired exploration of my personal and open source projects","media":{"thumbnail":"/archive/projects/personal/open-source-map/images/dave-stewart-open-source-projects-2013-tn.png?width=260&height=260"},"date":"2013-09-24","tags":["creative","maps"]},{"_path":"/archive/projects/personal/mashifesto/","path":"/archive/projects/personal/mashifesto/","type":"post","title":"Mashifesto","description":"Twitter mash-up, winning 3rd place at the Digital Sizzle Art Hack 2013","media":{"thumbnail":"/archive/projects/personal/mashifesto/images/mashifesto_thumb.jpg?width=435&height=435"},"date":"2013-08-12","tags":["webapp","frontend","html","javascript","data","api","technical","mashup","rapid-build","award"]},{"_path":"/archive/projects/personal/bill-bunny/","path":"/archive/projects/personal/bill-bunny/","type":"post","title":"Bill Bunny","description":"Bill management application for flat sharers","media":{"thumbnail":"/archive/projects/personal/bill-bunny/images/bill-bunny.png?width=385&height=385"},"date":"2012-02-05","tags":["frontend","backend","creative","html","php","technical","social","concept","ui"]},{"_path":"/archive/projects/personal/futureclock/","path":"/archive/projects/personal/futureclock/","type":"post","title":"future::clock","description":"Experiment in time and visual numerical/temporal-patterns","media":{"thumbnail":"/archive/projects/personal/futureclock/images/clock-featured.png?width=260&height=260"},"date":"2011-11-11","tags":["creative","frontend","flash","technical","as3","concept"]},{"_path":"/archive/projects/personal/angry-tennis-birds/","path":"/archive/projects/personal/angry-tennis-birds/","type":"post","title":"Angry Tennis Birds","description":"Creative hack to spice up broadcast tennis to the squawks of Angry Birds","media":{"thumbnail":"/archive/projects/personal/angry-tennis-birds/images/angry-tennis-birds.png?width=260&height=260"},"date":"2011-06-05","tags":["creative","javascript","game","api","technical","mashup","concept"]},{"_path":"/archive/projects/tools/","path":"/archive/projects/tools/","slug":"folder-archive-projects-tools","type":"folder","title":"Tools & frameworks","description":"Larger, self-contained tools, mainly for developers","items":[]},{"_path":"/archive/projects/tools/laravel-sketchpad/","path":"/archive/projects/tools/laravel-sketchpad/","type":"post","title":"Laravel Sketchpad","description":"Browser-based development playground for your Laravel site","media":{"thumbnail":"/archive/projects/tools/laravel-sketchpad/images/sketchpad-thumb.png?width=740&height=416"},"date":"2017-04-01","tags":["frontend","backend","framework","tools","ui","php","laravel","plugin"]},{"_path":"/archive/projects/tools/double-o/","path":"/archive/projects/tools/double-o/","type":"post","title":"Double-O","description":"MVC theme framework for Wordpress","media":{"thumbnail":"/archive/projects/tools/double-o/images/double-o_thumb.png?width=640&height=360"},"date":"2013-08-12","tags":["backend","framework","plugin","php","api","technical"]},{"_path":"/archive/projects/tools/processr/","path":"/archive/projects/tools/processr/","type":"post","title":"Processr","description":"Online editor to manipulate and generate text, code and data","media":{"thumbnail":"/archive/projects/tools/processr/thumbs/processr-thumb.jpg?width=580&height=326"},"date":"2013-04-05","tags":["frontend","javascript","ui","framework","parsing","technical","backend"]},{"_path":"/archive/projects/tools/pocket-god-tools/","path":"/archive/projects/tools/pocket-god-tools/","type":"post","title":"Pocket God Tools","description":"Level editing toolkit for iOS game Pocket God, created with xJSFL","media":{"thumbnail":"/archive/projects/tools/pocket-god-tools/images/pocket-god-thumb.png?width=284&height=160"},"date":"2012-07-09","tags":["frontend","javascript","flash","as3","jsfl","ui"]},{"_path":"/archive/projects/tools/xjsfl/","path":"/archive/projects/tools/xjsfl/","type":"post","title":"xJSFL","description":"JSFL framework to create tools for the Flash authoring environment","media":{"thumbnail":"/archive/projects/tools/xjsfl/images/xjsfl-logo-wide.png?width=360&height=203"},"github":"davestewart/xjsfl","date":"2011-01-01","tags":["frontend","framework","plugin","javascript","flash","api","data","jsfl","concept","creative","parsing","technical","ui"]},{"_path":"/archive/projects/open-source/","path":"/archive/projects/open-source/","slug":"folder-archive-projects-open-source","type":"folder","title":"Open Source","description":"Ongoing Open Source releases for various software packages","items":[]},{"_path":"/archive/projects/open-source/plugins/","path":"/archive/projects/open-source/plugins/","type":"post","title":"Web framework plugins","description":"A wide variety of plugins for various JS and PHP frameworks","media":{"thumbnail":"/archive/projects/open-source/plugins/plugins.png?width=1280&height=720"},"date":"2009-01-01","tags":["plugin","framework","javascript","php","ui"]},{"_path":"/archive/projects/open-source/applications/","path":"/archive/projects/open-source/applications/","type":"post","title":"Application Extensions","description":"Various extensions for native Windows applications","media":{"thumbnail":"/archive/projects/open-source/applications/applications.png?width=1280&height=720"},"date":"2005-01-01","tags":["plugin","framework","javascript","design","vba","ui"]},{"_path":"/archive/projects/open-source/3dsmax/","path":"/archive/projects/open-source/3dsmax/","type":"post","title":"3dsmax plugins","description":"An extensive collection of plugins and scripts for 3dsmax","media":{"thumbnail":"/archive/projects/open-source/3dsmax/3dsmax.png?width=1280&height=720"},"date":"2001-01-01","tags":["3dsmax","plugin","framework","creative","ui"]}]