56,966 blogs · [ { "id": "01a087e5-e6f1-73e6-99de-7fb167ae7144", "title": "Small acts of defiance", "url": "https://www.stephenlewis.me/blog/small-acts-of-defiance/", "published_at": "2026-06-30T00:00:00+00:00" }, { "id": "01a087e5-e6f1-73e6-99de-7fb1681b4c01", "title": "AI did not", "url": "https://www.stephenlewis.me/blog/ai-did-not/", "published_at": "2026-05-15T00:00:00+00:00" }, { "id": "01a087e5-e6f1-73e6-99de-7fb1684b4b33", "title": "A different mindset", "url": "https://www.stephenlewis.me/blog/a-different-mindset/", "published_at": "2026-02-13T00:00:00+00:00" }, { "id": "01a087e5-e6f1-73e6-99de-7fb168d5b632", "title": "Make it right", "url": "https://www.stephenlewis.me/blog/make-it-right/", "published_at": "2026-01-23T00:00:00+00:00" }, { "id": "01a087e5-e6f1-73e6-99de-7fb1698a1b6c", "title": "The thing that brought me joy", "url": "https://www.stephenlewis.me/blog/the-thing-that-brought-me-joy/", "published_at": "2026-01-17T00:00:00+00:00" }, { "id": "01a087e5-e6f1-73e6-99de-7fb169eace78", "title": "Move slowly and make things", "url": "https://www.stephenlewis.me/blog/move-slowly-make-things/", "published_at": "2025-05-21T00:00:00+00:00" }, { "id": "01a087e5-e6f1-73e6-99de-7fb16a057db2", "title": "Using Eloquent subqueries to randomise grouped results", "url": "https://www.stephenlewis.me/blog/eloquent-randomise-grouped/", "published_at": "2024-12-10T00:00:00+00:00" }, { "id": "01a087e5-e6f1-73e6-99de-7fb16aa77d27", "title": "PhoenixTest foot guns", "url": "https://www.stephenlewis.me/blog/phoenix-test-foot-guns/", "published_at": "2024-07-18T00:00:00+00:00" }, { "id": "01a087e5-e6f1-73e6-99de-7fb16aac0644", "title": "Weeknotes: Claude", "url": "https://www.stephenlewis.me/blog/weeknotes-2023-03-05/", "published_at": "2023-03-05T00:00:00+00:00" }, { "id": "01a087e5-e6f1-73e6-99de-7fb16ae324db", "title": "The complexity halo", "url": "https://www.stephenlewis.me/blog/complexity-halo/", "published_at": "2023-03-03T00:00:00+00:00" }, { "id": "01a087e5-e6f1-73e6-99de-7fb16bb87d7a", "title": "Weeknotes: Covid, mostly", "url": "https://www.stephenlewis.me/blog/weeknotes-2023-02-26/", "published_at": "2023-02-26T00:00:00+00:00" }, { "id": "01a087e5-e6f1-73e6-99de-7fb16c777406", "title": "Weeknotes: Working on Hap, and working on working", "url": "https://www.stephenlewis.me/blog/weeknotes-2023-02-19/", "published_at": "2023-02-19T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d252763be", "title": "Organising Ecto schemas", "url": "https://www.stephenlewis.me/blog/organising-ecto-schemas/", "published_at": "2023-02-13T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d255cf060", "title": "Naming Phoenix context functions", "url": "https://www.stephenlewis.me/blog/naming-phoenix-context-functions/", "published_at": "2023-01-10T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d2645dbca", "title": "How to bypass the Git pre-push hook", "url": "https://www.stephenlewis.me/blog/git-push-no-hooks/", "published_at": "2022-03-22T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d2740c3c9", "title": "Building Happy Stack: naming things", "url": "https://www.stephenlewis.me/blog/happy-stack-naming-things/", "published_at": "2021-03-21T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d27ddd0eb", "title": "Building Happy Stack: notifications", "url": "https://www.stephenlewis.me/blog/happy-stack-notifications/", "published_at": "2021-03-14T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d28a48227", "title": "Simplify imports with path mapping", "url": "https://www.stephenlewis.me/blog/simplify-imports-with-path-mapping/", "published_at": "2020-08-24T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d29a2116d", "title": "Check a date with Chai", "url": "https://www.stephenlewis.me/blog/chai-check-date/", "published_at": "2020-08-01T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d2a1e346c", "title": "Verify a checksum", "url": "https://www.stephenlewis.me/blog/verify-checksum/", "published_at": "2020-07-30T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d2a9346f4", "title": "MongoDB ObjectId timestamp", "url": "https://www.stephenlewis.me/blog/mongodb-objectid-timestamp/", "published_at": "2020-07-28T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d2af497bd", "title": "Specify a default line-height for each font-size in Tailwind CSS", "url": "https://www.stephenlewis.me/blog/tailwind-font-size-line-height/", "published_at": "2020-07-24T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d2b619c3f", "title": "Using TypeScript with Gatsby", "url": "https://www.stephenlewis.me/blog/using-typescript-with-gatsby/", "published_at": "2020-07-20T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d2b7c9ecf", "title": "Nested optional chaining in JavaScript", "url": "https://www.stephenlewis.me/blog/javascript-nested-optional-chaining/", "published_at": "2020-07-17T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d2c41ec22", "title": "Custom Decap CMS previews in Gatsby", "url": "https://www.stephenlewis.me/blog/netlify-cms-gatsby-custom-preview/", "published_at": "2020-07-16T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d2c734701", "title": "Rounding errors in JSON Schema validation", "url": "https://www.stephenlewis.me/blog/json-schema-rounding-errors/", "published_at": "2020-07-15T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d2d2cb6d2", "title": "CSS-only highlighter effect", "url": "https://www.stephenlewis.me/blog/css-highlighter-effect/", "published_at": "2020-07-14T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d2d3c66a6", "title": "“Module not found” error with Gatsby, Netlify CMS, and PostCSS", "url": "https://www.stephenlewis.me/blog/gatsby-netlify-cms-postcss-plugin-order/", "published_at": "2020-07-06T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d2d8f3cb8", "title": "Undocumented Node Migrate options", "url": "https://www.stephenlewis.me/blog/node-migrate-options/", "published_at": "2020-07-01T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d2e5275a3", "title": "Execute a command with another user’s environment", "url": "https://www.stephenlewis.me/blog/sudo-user-command/", "published_at": "2020-06-29T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d2e60fb40", "title": "Custom TypeScript type guards", "url": "https://www.stephenlewis.me/blog/custom-typescript-type-guards/", "published_at": "2020-06-24T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d2ee19977", "title": "Chai assert error", "url": "https://www.stephenlewis.me/blog/chai-assert-error/", "published_at": "2020-06-22T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d2fa17987", "title": "Selectively disable ESLint", "url": "https://www.stephenlewis.me/blog/selectively-disable-eslint/", "published_at": "2020-06-12T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d3036970c", "title": "The right way to compare arrays with Chai", "url": "https://www.stephenlewis.me/blog/compare-arrays-in-chai/", "published_at": "2020-06-09T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d30574156", "title": "Query MongoDB by array field size", "url": "https://www.stephenlewis.me/blog/mongodb-array-size-query/", "published_at": "2020-06-08T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d30ad7eaf", "title": "Numeric environment variables and TypeScript", "url": "https://www.stephenlewis.me/blog/typescript-numeric-env-variables/", "published_at": "2020-06-02T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d30c7b890", "title": "Visual Studio Code “actions” shortcut", "url": "https://www.stephenlewis.me/blog/code-actions-keyboard-shortcut/", "published_at": "2020-06-01T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d3180942d", "title": "Compute the difference between two JavaScript arrays", "url": "https://www.stephenlewis.me/blog/javascript-array-difference/", "published_at": "2020-05-29T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d31cce2d1", "title": "Transform objects in a Node stream", "url": "https://www.stephenlewis.me/blog/node-stream-transform-objects/", "published_at": "2020-05-28T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d32901f8e", "title": "Sort the output of git status", "url": "https://www.stephenlewis.me/blog/sort-git-status-output/", "published_at": "2020-05-27T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d338a1fd9", "title": "Clear the terminal in macOS", "url": "https://www.stephenlewis.me/blog/clear-terminal-macos/", "published_at": "2020-05-26T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d34385529", "title": "JavaScript logical operators", "url": "https://www.stephenlewis.me/blog/javascript-logical-operators/", "published_at": "2020-05-25T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d34c4b0d6", "title": "Avoid Array.prototype.push", "url": "https://www.stephenlewis.me/blog/avoid-array-push/", "published_at": "2020-05-22T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d34f55beb", "title": "Search the file explorer in Visual Studio Code", "url": "https://www.stephenlewis.me/blog/search-vscode-explorer/", "published_at": "2020-05-21T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d356b414d", "title": "Sane URL validation in JSON Schema", "url": "https://www.stephenlewis.me/blog/json-schema-url-validation/", "published_at": "2020-05-20T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d359d0b55", "title": "Log nested objects in Node", "url": "https://www.stephenlewis.me/blog/console-dir-nested/", "published_at": "2020-05-19T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d35f03cc7", "title": "Generate an array of random data", "url": "https://www.stephenlewis.me/blog/random-data-array/", "published_at": "2020-05-18T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d361ab7b8", "title": "Split a JavaScript array into chunks", "url": "https://www.stephenlewis.me/blog/chunk-javascript-array/", "published_at": "2020-05-08T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d36fc6278", "title": "Generate a pseudo-random boolean", "url": "https://www.stephenlewis.me/blog/pseudo-random-boolean/", "published_at": "2020-05-07T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d37227418", "title": "Modelling API requests with Statecharts", "url": "https://www.stephenlewis.me/blog/modelling-api-requests-with-statecharts/", "published_at": "2020-05-06T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d37437b15", "title": "TypeScript object bracket notation", "url": "https://www.stephenlewis.me/blog/typescript-object-bracket-notation/", "published_at": "2020-05-05T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d37a60bfe", "title": "Node -r", "url": "https://www.stephenlewis.me/blog/node-dash-r/", "published_at": "2020-05-04T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d37d0665e", "title": "Node type definitions", "url": "https://www.stephenlewis.me/blog/node-type-definitions/", "published_at": "2020-05-02T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d386303ff", "title": "TypeScript generics", "url": "https://www.stephenlewis.me/blog/typescript-generics/", "published_at": "2020-05-01T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d38da0d8f", "title": "How to write version-agnostic bash scripts for PHP", "url": "https://www.stephenlewis.me/blog/version-agnostic-php-bash-scripts/", "published_at": "2019-11-07T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d395ba845", "title": "Authorising Laravel Nova actions", "url": "https://www.stephenlewis.me/blog/authorising-laravel-nova-actions/", "published_at": "2019-10-31T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d39bfb44a", "title": "How to use a private GitLab repository as a Composer dependency", "url": "https://www.stephenlewis.me/blog/composer-private-gitlab-repository/", "published_at": "2019-10-24T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d3a2c0d47", "title": "GitLab CI and YAML booleans", "url": "https://www.stephenlewis.me/blog/gitlab-ci-and-yaml-booleans/", "published_at": "2019-10-17T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d3a76703c", "title": "Conditional validation rules in Laravel", "url": "https://www.stephenlewis.me/blog/laravel-conditional-validation-rules/", "published_at": "2019-10-10T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d3a81e7ec", "title": "How to change the URL slug of a Laravel Nova resource", "url": "https://www.stephenlewis.me/blog/laravel-nova-resource-url-slug/", "published_at": "2019-10-03T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d3a93496b", "title": "Randomise your tests", "url": "https://www.stephenlewis.me/blog/randomise-your-tests/", "published_at": "2019-09-26T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d3abc5ab8", "title": "Understanding Laravel’s Macroable trait", "url": "https://www.stephenlewis.me/blog/understanding-laravels-macroable-trait/", "published_at": "2018-10-18T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d3b5849e5", "title": "Laravel route collection binding", "url": "https://www.stephenlewis.me/blog/laravel-route-collection-binding/", "published_at": "2018-09-18T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d3c0f54bd", "title": "A nicer way of overriding Eloquent global scopes", "url": "https://www.stephenlewis.me/blog/overriding-eloquent-global-scopes/", "published_at": "2018-03-21T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d3c6a90e3", "title": "Laravel’s mysteriously macroable paginators", "url": "https://www.stephenlewis.me/blog/laravels-mysteriously-macroable-paginators/", "published_at": "2018-03-14T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d3c89c6ac", "title": "Eager loading Eloquent properties", "url": "https://www.stephenlewis.me/blog/eager-loading-eloquent-properties/", "published_at": "2017-10-24T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d3d46543e", "title": "Cleaner code with Eloquent events", "url": "https://www.stephenlewis.me/blog/cleaner-code-with-eloquent-events/", "published_at": "2017-10-17T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d3db733b9", "title": "Eloquent attributes and database defaults", "url": "https://www.stephenlewis.me/blog/eloquent-attributes-and-database-defaults/", "published_at": "2017-10-10T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d3ddb9b8b", "title": "Interviewed by Snipcart", "url": "https://www.stephenlewis.me/blog/interviewed-by-snipcart/", "published_at": "2015-08-18T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d3e551407", "title": "Start with the API: A better approach to developing Craft plugins", "url": "https://www.stephenlewis.me/blog/start-with-the-api/", "published_at": "2015-08-04T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d3f380fae", "title": "How to handle Composer dependency conflicts in your Craft plugins", "url": "https://www.stephenlewis.me/blog/craft-plugin-composer-dependency-conflicts/", "published_at": "2015-07-21T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d3f49ba00", "title": "The hidden perils of Craft plugin service classes", "url": "https://www.stephenlewis.me/blog/the-hidden-perils-of-craft-plugin-service-classes/", "published_at": "2015-07-09T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d3fb75245", "title": "How and when to use PSR-4 autoloading in your Craft plugins", "url": "https://www.stephenlewis.me/blog/how-and-when-to-use-psr-4-autoloading-in-your-craft-plugins/", "published_at": "2015-07-01T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d3ff0e74b", "title": "The Definitive Guide to Craft Validation for Plugin Developers (the book)", "url": "https://www.stephenlewis.me/blog/craft-validation-book/", "published_at": "2015-05-18T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d4026dd67", "title": "Design principles", "url": "https://www.stephenlewis.me/blog/design-principles/", "published_at": "2015-04-03T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d40d699cf", "title": "How to implement a custom Laravel zip code validation rule", "url": "https://www.stephenlewis.me/blog/how-to-implement-a-custom-laravel-zip-code-validation-rule/", "published_at": "2015-02-25T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d4105c5fe", "title": "Introducing Glossary for Craft", "url": "https://www.stephenlewis.me/blog/glossary-craft-plugin/", "published_at": "2014-09-09T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d41b41f7c", "title": "Craft quick tip: Add CTRL-S support to your plugin forms", "url": "https://www.stephenlewis.me/blog/craft-quick-tip-add-ctrl-s-support-to-your-plugin-forms/", "published_at": "2014-09-02T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d42b2a4da", "title": "The definitive guide to validation in Craft, part 5: Custom validators", "url": "https://www.stephenlewis.me/blog/the-definitive-guide-to-validation-in-craft-part-5-custom-validators/", "published_at": "2014-08-26T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d434aaad6", "title": "The definitive guide to validation in Craft, part 4: Hidden validator settings", "url": "https://www.stephenlewis.me/blog/the-definitive-guide-to-validation-in-craft-part-4-hidden-validator-settings/", "published_at": "2014-08-19T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d43c32ca4", "title": "The definitive guide to validation in Craft, part 3: Attribute rules", "url": "https://www.stephenlewis.me/blog/the-definitive-guide-to-validation-in-craft-part-3-attribute-rules/", "published_at": "2014-08-12T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d440d7fce", "title": "The definitive guide to validation in Craft, part 2: AttributeTypes", "url": "https://www.stephenlewis.me/blog/the-definitive-guide-to-validation-in-craft-part-2-attributetypes/", "published_at": "2014-08-05T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d447c8d4e", "title": "The definitive guide to validation in Craft, part 1: Foundations", "url": "https://www.stephenlewis.me/blog/the-definitive-guide-to-validation-in-craft-part-1-foundations/", "published_at": "2014-07-29T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d44d51582", "title": "How to build a fluent Laravel repository API", "url": "https://www.stephenlewis.me/blog/how-to-build-a-fluent-laravel-repository-api/", "published_at": "2014-03-27T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d45594fd8", "title": "A guide for Craft Cookbook recipe authors", "url": "https://www.stephenlewis.me/blog/a-guide-for-craft-cookbook-recipe-authors/", "published_at": "2014-03-04T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d458f3c27", "title": "Clean up your Craft templates with site-specific plugins", "url": "https://www.stephenlewis.me/blog/clean-up-your-craft-templates-with-site-specific-plugins/", "published_at": "2014-02-28T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d45cccb1b", "title": "Introducing Craft Cookbook", "url": "https://www.stephenlewis.me/blog/introducing-craft-cookbook/", "published_at": "2014-02-26T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d46b325de", "title": "Laravel quick tip: Find by username or fail", "url": "https://www.stephenlewis.me/blog/laravel-quick-tip-find-by-username-or-fail/", "published_at": "2014-02-05T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d472f7d19", "title": "A pedant’s guide to working with Django ModelForm fields", "url": "https://www.stephenlewis.me/blog/better-django-modelform-html/", "published_at": "2014-01-31T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d478ee064", "title": "Craft your content with Markdown and Matrix", "url": "https://www.stephenlewis.me/blog/craft-with-markdown-and-matrix/", "published_at": "2014-01-08T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d47c7afc2", "title": "Introducing SmartDown for Craft", "url": "https://www.stephenlewis.me/blog/smartdown-for-craft/", "published_at": "2013-12-28T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d481c29c1", "title": "Gender in tech, and the right not to be offended", "url": "https://www.stephenlewis.me/blog/gender-in-tech-and-the-right-not-to-be-offended/", "published_at": "2013-03-21T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d48c5340e", "title": "Git push your universe", "url": "https://www.stephenlewis.me/blog/git-push-your-universe/", "published_at": "2013-03-12T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d49ad0f20", "title": "EllisLab bemoans paltry 900% ROI", "url": "https://www.stephenlewis.me/blog/ellislab-bemoans-paltry-900-roi/", "published_at": "2012-10-04T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d4aa2ed82", "title": "A brief introduction to ExpressionEngine ACTions", "url": "https://www.stephenlewis.me/blog/expressionengine-actions-introduction/", "published_at": "2012-08-10T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d4b617504", "title": "Updates and oddments: August 2012", "url": "https://www.stephenlewis.me/blog/updates-and-oddments-august-2012/", "published_at": "2012-08-08T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d4c215e61", "title": "Testee 2.2", "url": "https://www.stephenlewis.me/blog/testee-2-2/", "published_at": "2012-07-27T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d4c8365d0", "title": "Introducing Template OmniLogger", "url": "https://www.stephenlewis.me/blog/introducing-template-omnilogger/", "published_at": "2012-07-24T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d4d5f1e9f", "title": "EE gotchas: Nested “no results” tags (redux)", "url": "https://www.stephenlewis.me/blog/ee-gotchas-nested-no-results-tags-redux/", "published_at": "2012-07-23T00:00:00+00:00" }, { "id": "01a087e5-e6f2-7339-ab46-ee2d4e3c196a", "title": "The ExpressionEngine Friday roundup", "url": "https://www.stephenlewis.me/blog/the-expressionengine-friday-round-up/", "published_at": "2012-07-20T00:00:00+00:00" } ] posts Claim your blog
Back to stephenlewis.me
Blog · corpus.blog/blogs/stephenlewis.me/posts

stephenlewis.me

stephenlewis.me

2026

2025

2024

2023

2022

2021

2020

2019

2018

2017

2015

2014

2013

2012