Black Sheep CodeModern web development - testability, extensibility, declarative APIs, declarative code from open specs and more.en-AUhttps://blacksheepcode.comhttps://blacksheepcode.com/blacksheep_fb_wide.webpA shield or a cudgel?A dynamic I frequently observe is that the project manager becomes a cudgel against their team members, rather than serving to protect them from the rest of the organisation.
https://blacksheepcode.com/posts/a_shield_or_a_cudgel
https://blacksheepcode.com/posts/a_shield_or_a_cudgelSun, 31 May 2026 00:00:00 GMTAdding dark mode to a blog - how to avoid flashes of the wrong themeI've added dark mode to this blog. Here's a few tricks I've learned.
https://blacksheepcode.com/posts/adding_dark_mode_to_the_blog
https://blacksheepcode.com/posts/adding_dark_mode_to_the_blogFri, 07 Jun 2024 00:00:00 GMTHow to configure Remix and mdx-bundler (with file system access)How to use Remix and mdx-bundler to make use of frontmatter headers. This will allow adding publication dates, or grouping posts into series, adding tags, etc. This solution works for a non-serverless solution - it requires file system access.
https://blacksheepcode.com/posts/adding_msw_bundler_to_remix_app
https://blacksheepcode.com/posts/adding_msw_bundler_to_remix_appSun, 19 Nov 2023 00:00:00 GMTHow to configure Remix and mdx-bundler for a serverless platform - barrel files approach, Remix v1If using Remix on a serverless platform such as Netlify we can use a build time compilation and barrel files to access frontmatter metadata.
https://blacksheepcode.com/posts/adding_msw_bundler_to_remix_app_2
https://blacksheepcode.com/posts/adding_msw_bundler_to_remix_app_2Fri, 22 Mar 2024 00:00:00 GMTAdvice for someone looking to get into software engineeringThis is advice I have for someone who is either pivoting career or has finished high school and is looking at university options.
https://blacksheepcode.com/posts/advice_for_someone_wanting_to_get_into_software_engineering
https://blacksheepcode.com/posts/advice_for_someone_wanting_to_get_into_software_engineeringMon, 24 Nov 2025 00:00:00 GMTAgentic AI - yak shaving on steroidsThe prospect of having agentic AI do all the real work means that we now focus on tuning the AI, not delivering the work.
https://blacksheepcode.com/posts/agentic_ai_yak_shaving_on_steroids
https://blacksheepcode.com/posts/agentic_ai_yak_shaving_on_steroidsSat, 23 May 2026 00:00:00 GMTAgnostic state and service management in ReactAvoid make state framework specific calls inside of your React components, and instead access them via hooks. This reduces the cognitive overhead in understanding your components, and likely allows reuse of those data fetching functions elsewhere.
https://blacksheepcode.com/posts/agnostic_state_managment_in_react
https://blacksheepcode.com/posts/agnostic_state_managment_in_reactThu, 05 May 2022 00:00:00 GMTAI and the carve-out of middle class powerHow replacing the middle class with AI could shift power toward the owners of capital.
https://blacksheepcode.com/posts/ai_and_the_carve_out_of_middle_class_power
https://blacksheepcode.com/posts/ai_and_the_carve_out_of_middle_class_powerFri, 23 Oct 2026 00:00:00 GMTAn AI-generated blindfoldIncreasingly, I'm finding it hard to hard to get a sense of human consensus on a topic from the internet
https://blacksheepcode.com/posts/an_ai_generated_blindfold
https://blacksheepcode.com/posts/an_ai_generated_blindfoldThu, 27 Aug 2026 00:00:00 GMTAn inversion of information discoveryOur information discovery starts at a high level and then digs in. In the AI world, it might be better to have AI do deep discovery and then summarize.
https://blacksheepcode.com/posts/an_inversion_of_information_discovery
https://blacksheepcode.com/posts/an_inversion_of_information_discoverySun, 18 Oct 2026 00:00:00 GMTAn overview of configuring proxy behaviour in NodeJS applicationsYou may wish to proxy node requests via service like mitmproxy for the purpose of analysing the requests its making or generating test data. Here's a quick reference sheet for setting this behaviour up.
https://blacksheepcode.com/posts/an_overview_of_configuring_proxy_behaviour_for_node_apps
https://blacksheepcode.com/posts/an_overview_of_configuring_proxy_behaviour_for_node_appsThu, 05 Sep 2024 00:00:00 GMTAt least write one test.The value of writing one test isn't in testing the code's correctness - it's in testing its consumability.
https://blacksheepcode.com/posts/at_least_write_one_test
https://blacksheepcode.com/posts/at_least_write_one_testWed, 23 Apr 2025 00:00:00 GMTIt is better to have the same meeting four times with four people each, than to have one large meeting with sixteen people.If some idea or decision needs to be socialised amongst many people, it may be tempting to get everyone into one meeting and sort it out in one go.
https://blacksheepcode.com/posts/better_to_have_the_same_meeting_four_times_than_one_large_meeting
https://blacksheepcode.com/posts/better_to_have_the_same_meeting_four_times_than_one_large_meetingThu, 26 Jun 2025 00:00:00 GMTRun a Docker image on AWS ECS + Postgres using Terraform CDKCDKTF is a tool that allows us to use fully fledged programming languages to do Terraform deployments, having the advantage of being type safe for one.
https://blacksheepcode.com/posts/cdktf_postgres_and_ecs
https://blacksheepcode.com/posts/cdktf_postgres_and_ecsWed, 21 Feb 2024 00:00:00 GMTDoes this tool exist? A tool for comparing/testing the difference between LLM harnesses, models and promptsAll the talk in the world about certain prompting techniques, models, or workflow strategies isn't very useful unless you can actually measure it
https://blacksheepcode.com/posts/coding_agent_testing
https://blacksheepcode.com/posts/coding_agent_testingWed, 08 Jul 2026 00:00:00 GMTConference notes for Web Directions Code 2025 - The behaviour of browsers and their loading of resources.Links to documentation and open issues.
https://blacksheepcode.com/posts/conference_notes_web_directions_2025
https://blacksheepcode.com/posts/conference_notes_web_directions_2025Wed, 11 Jun 2025 00:00:00 GMTDelete a range of commitsThe --onto option of a git rebase can be used to delete a range of commits
https://blacksheepcode.com/posts/delete_a_range_of_commits
https://blacksheepcode.com/posts/delete_a_range_of_commitsThu, 26 Jun 2025 00:00:00 GMTDependency injection when using redux.An unconventional strategy to inject the behaviour of your state management in testing contexts
https://blacksheepcode.com/posts/dependency_injecting_when_using_redux
https://blacksheepcode.com/posts/dependency_injecting_when_using_reduxMon, 01 Aug 2022 00:00:00 GMTDifferent Approaches to Form Element State Management in ReactWorking with lists of data for form inputs such as radio buttons or checkboxes is non-trivial. I outline three approaches.
https://blacksheepcode.com/posts/different_approaches_to_form_element_state_in_react
https://blacksheepcode.com/posts/different_approaches_to_form_element_state_in_reactWed, 27 Jul 2022 00:00:00 GMTEncapsulate as much state as possible in your componentA common pattern I see is passing every bit of a component's state in as a prop. This just puts the responsibility of that component's actual useful logic on to the parent.
https://blacksheepcode.com/posts/encapsulate_as_much_state_as_possible
https://blacksheepcode.com/posts/encapsulate_as_much_state_as_possibleFri, 31 Oct 2025 00:00:00 GMTA model of extensible changes.Making changes in an extensible manner avoids having to do significant code rewrites or being disruptive to downstream consumers of your API.
https://blacksheepcode.com/posts/extensible_changes
https://blacksheepcode.com/posts/extensible_changesWed, 10 Aug 2022 00:00:00 GMTWhy use OpenAPI?OpenAPI is a spec for describing HTTP APIs. It has a healthy ecosystem of tooling that supports it.
https://blacksheepcode.com/posts/generating_apps_from_openapi_part1
https://blacksheepcode.com/posts/generating_apps_from_openapi_part1Fri, 25 Nov 2022 00:00:00 GMTGenerating application and client code from an OpenAPI specWe'll use openapi-generators to generate a Go backend and a React frontend.
https://blacksheepcode.com/posts/generating_apps_from_openapi_part2
https://blacksheepcode.com/posts/generating_apps_from_openapi_part2Mon, 28 Nov 2022 00:00:00 GMTGenerating MSW mocks from an OpenAPI spec.We're using msw-auto-mock to generate MSW mocks to test our React application.
https://blacksheepcode.com/posts/generating_apps_from_openapi_part3
https://blacksheepcode.com/posts/generating_apps_from_openapi_part3Tue, 17 Jan 2023 00:00:00 GMTUsing Postman and an OpenAPI spec for contract/blackbox testsSyncing Postman with our Github repo, generating queries from our OpenAPI spec.
https://blacksheepcode.com/posts/generating_apps_from_openapi_part4a
https://blacksheepcode.com/posts/generating_apps_from_openapi_part4aMon, 17 Apr 2023 00:00:00 GMTPostman and OpenAPI - Automating testsPostman has an automated testing feature, but how well does it work?
https://blacksheepcode.com/posts/generating_apps_from_openapi_part4b
https://blacksheepcode.com/posts/generating_apps_from_openapi_part4bMon, 17 Apr 2023 00:00:00 GMTOpenAPI and contract tests with JestUsing good ol' Jest to write some contract tests with our OpenAPI generated client SDK.
https://blacksheepcode.com/posts/generating_apps_from_openapi_part5a
https://blacksheepcode.com/posts/generating_apps_from_openapi_part5aWed, 26 Apr 2023 00:00:00 GMTBlackbox contract tests - Performance testing with JestWe can use a tool called jest-timing-reporter to provide a performance diff in our Github pull request.
https://blacksheepcode.com/posts/generating_apps_from_openapi_part6
https://blacksheepcode.com/posts/generating_apps_from_openapi_part6Fri, 28 Apr 2023 00:00:00 GMTBlack box contract testing - third party API mockingWe have an API that makes calls out to a third party - how do we test it? We can use .HAR files to configure a tool like Mockbin to act as the third party service.
https://blacksheepcode.com/posts/generating_apps_from_openapi_part7
https://blacksheepcode.com/posts/generating_apps_from_openapi_part7Mon, 14 Aug 2023 00:00:00 GMTGood idea: Loading screen tips for developersVideo games commonly show helpful hints and tips on loading screens. Developer tools should contain the same.
https://blacksheepcode.com/posts/good_ideas_loading_screens
https://blacksheepcode.com/posts/good_ideas_loading_screensFri, 13 Dec 2024 00:00:00 GMTHow to add an experimental feature to your code, without having it in your main version controlYou might have a really good idea, but its not practical to get it commited to version control. You can keep the feature around for local use with some shell aliases and git commands.
https://blacksheepcode.com/posts/how_to_add_experimental_features_to_your_code_without_version_controlling
https://blacksheepcode.com/posts/how_to_add_experimental_features_to_your_code_without_version_controllingMon, 19 May 2025 00:00:00 GMTHow to effectively hire contractorsContractors are best utilised to plough through a well defined scope of work.
https://blacksheepcode.com/posts/how_to_effectively_hire_contractors
https://blacksheepcode.com/posts/how_to_effectively_hire_contractorsMon, 11 Apr 2022 00:00:00 GMTHow to get started testing a React codebase that has no testsYou've inherited a React codebase that has no tests. You're having trouble with regressions and think that tests might help, but how do you get started?
https://blacksheepcode.com/posts/how_to_get_started_testing
https://blacksheepcode.com/posts/how_to_get_started_testingTue, 12 Mar 2024 00:00:00 GMTHow to configure NextJS to proxy its requestsWe may wish to proxy the requests NextJS makes, for example through a tool like mitmproxy in order to analyse traffic or generate test data.
https://blacksheepcode.com/posts/how_to_proxy_nextjs
https://blacksheepcode.com/posts/how_to_proxy_nextjsMon, 19 Aug 2024 00:00:00 GMTHuman comprehension is still the bottleneckAll this talk about how AI can build a whole whatever with $120 of credits and a day is beside the point - the bottleneck is how fast we can understand things
https://blacksheepcode.com/posts/human_comprehension_is_still_the_bottleneck
https://blacksheepcode.com/posts/human_comprehension_is_still_the_bottleneckThu, 09 Jul 2026 00:00:00 GMTI'm playing with RemixUsing Remix to generate a static blog.
https://blacksheepcode.com/posts/i_am_playing_with_remix
https://blacksheepcode.com/posts/i_am_playing_with_remixMon, 28 Nov 2022 00:00:00 GMTIf I were building a start up from scratch, these are the things I would include (or have a plan to include).The easiest time to include something in your application is at the start. On the other hand, you're likely time-poor and there's no point on burning all your runway on a gold-plated hello world! application.
https://blacksheepcode.com/posts/if_i_were_building_something_from_scratch
https://blacksheepcode.com/posts/if_i_were_building_something_from_scratchMon, 13 Jan 2025 00:00:00 GMTI'm apprehensive about using too many AI-generated images in my blog.I'm worried that the blog will look samey and like more-ai-slop-everywhere.
https://blacksheepcode.com/posts/im_apprehensive_about_using_too_many_ai_images
https://blacksheepcode.com/posts/im_apprehensive_about_using_too_many_ai_imagesWed, 02 Jul 2025 00:00:00 GMTI'm going off MDX for bloggingI like standardised formats like markdown. MDX allows markdown, plus sprinkle in some React. However, I'm considering that maybe I'd be better off just using React.
https://blacksheepcode.com/posts/im_going_off_mdx_for_blogging
https://blacksheepcode.com/posts/im_going_off_mdx_for_bloggingWed, 23 Apr 2025 00:00:00 GMTExamples of tooling that do not play nicely with ESMEcmaScript Modules (ESM) are well established - leading some to argue that we no longer need to provide CJS packages. However, is that really the case?
https://blacksheepcode.com/posts/list_of_tooling_that_does_not_play_nicely_with_esm
https://blacksheepcode.com/posts/list_of_tooling_that_does_not_play_nicely_with_esmTue, 19 Nov 2024 00:00:00 GMTThe behaviour of browsers and loading resources - HTML, images, and CSSBrowsers do not need to wait for an entire HTML document to be loaded before it can display it. CSS is render blocking. Images will start streaming as soon as the tag is encountered.
https://blacksheepcode.com/posts/loading_optimisations_part_1
https://blacksheepcode.com/posts/loading_optimisations_part_1Thu, 31 Oct 2024 12:00:00 GMTThe behaviour of browsers and loading resources - ScriptsJavaScript scripts cannot be evaluated until they have been completely loaded. By default they are parse blocking.
https://blacksheepcode.com/posts/loading_optimisations_part_2
https://blacksheepcode.com/posts/loading_optimisations_part_2Thu, 31 Oct 2024 13:00:00 GMTTwo caching strategiesThere are generally two strategies for caching, 'cache, but require validation' and 'trust what you've already got without caching'. The latter is well suited for caching static assets.
https://blacksheepcode.com/posts/loading_optimisations_part_3
https://blacksheepcode.com/posts/loading_optimisations_part_3Tue, 19 Nov 2024 00:00:00 GMTModule behaviour in browsers - loading waterfalls, module preloading, cache invalidation cascades and import maps.Browsers now support ESM modules natively - meaning that we no longer need to bundle our modular code. However be aware that naive use of ESM modules may lead to unperformant loading waterfalls. Our options: bundle, use dynamic imports, or preload our modules.
https://blacksheepcode.com/posts/loading_optimisations_part_4
https://blacksheepcode.com/posts/loading_optimisations_part_4Tue, 26 Nov 2024 00:00:00 GMTMigrating from Remix to NextJSNextJS appears to well and truely established. These are the steps I followed to migrate from Remix 1.9.3 to Next 14.
https://blacksheepcode.com/posts/migrating_from_remix_to_next
https://blacksheepcode.com/posts/migrating_from_remix_to_nextMon, 09 Sep 2024 00:00:00 GMTNo, react context is not causing too many rendersA lot of people are under the impression that context shouldn't be used to store state, because it'll cause the entire application tree to re-render. This is a misnomer.
https://blacksheepcode.com/posts/no_react_context_is_not_causing_too_many_renders
https://blacksheepcode.com/posts/no_react_context_is_not_causing_too_many_rendersFri, 09 May 2025 00:00:00 GMTThe nuance of React rendering behaviour as it relates to childrenComponents that are passed as props.children and components that are directly declared by a component have different rendering behaviour - yet they are both just called 'children'. The adoption of React 19's compiler might mean that this distinction does not matter.
https://blacksheepcode.com/posts/nuance_of_react_rendering_behaviour
https://blacksheepcode.com/posts/nuance_of_react_rendering_behaviourMon, 22 Sep 2025 00:00:00 GMTAssume the next developer will copy paste what they see you do. (That next developer might be you.)It's not a criticism of developers to suggest that they'll copy paste what they already see in a codebase. Programming is complex and we'll use whatever hueristic we can to reduce what we need to think about.
https://blacksheepcode.com/posts/philosophy_assume_the_next_developer_will_copy_paste
https://blacksheepcode.com/posts/philosophy_assume_the_next_developer_will_copy_pasteMon, 18 Nov 2024 00:00:00 GMTPsychological pitfalls of using artificial intelligence - a heightened sense of urgencyAI can provide a lot of content very quickly, and we can feel the need to match its pace.
https://blacksheepcode.com/posts/psychological_pitfalls_of_ai_urgency
https://blacksheepcode.com/posts/psychological_pitfalls_of_ai_urgencyMon, 15 Jun 2026 00:00:00 GMTHow to publish a React component package, using NextJS as the compilerAlthough your component library may not be making use of React Server Components and the like, it can be helpful to see how the component behaves in a NextJS context.
https://blacksheepcode.com/posts/publish_a_react_package_using_nextjs_as_a_base
https://blacksheepcode.com/posts/publish_a_react_package_using_nextjs_as_a_baseFri, 23 Aug 2024 00:00:00 GMTHow to prevent further modification commits to a file with a pre-commit hookSometimes you want to prevent accidentally modifying sets of test fixtures etc. Use this simple pre-commit hook to prevent it.
https://blacksheepcode.com/posts/quick_tip_protect_committing_file_modifications
https://blacksheepcode.com/posts/quick_tip_protect_committing_file_modificationsTue, 25 Feb 2025 00:00:00 GMTHow to create an imperative useConfirmationModal hookAvoid a bunch of state hooks and handlers in your code for things like confirmation modals by encapsulating that kind of logic away in a hook.
https://blacksheepcode.com/posts/react_bits_imperative_confirmation_modal
https://blacksheepcode.com/posts/react_bits_imperative_confirmation_modalWed, 20 Nov 2024 00:00:00 GMTReasons to be a token miserThere is a school of thought that says 'Just throw money at the problem' - here's why you should be constantly optimising your token usage.
https://blacksheepcode.com/posts/reasons_to_be_a_token_miser
https://blacksheepcode.com/posts/reasons_to_be_a_token_miserWed, 27 May 2026 00:00:00 GMTReasons to not use GraphQLGraphQL is one of the cool kids in modern web development - but I generally recommend against using it.
https://blacksheepcode.com/posts/reasons_to_not_use_graphql
https://blacksheepcode.com/posts/reasons_to_not_use_graphqlMon, 30 Jun 2025 00:00:00 GMTHow to create a responsive React hook to listen for changes to cookiesYour React components may wish to listen for changes to made to cookies, whether they were made by other React code, or HTTP requests or non-React JavaScript. The CookieStore API can help.
https://blacksheepcode.com/posts/responsive_cookies_for_react
https://blacksheepcode.com/posts/responsive_cookies_for_reactWed, 02 Oct 2024 18:00:00 GMTUsing cookies in React Server Components to avoid a flash the incorrect content.We make use of NextJS's `cookies` function to access the cookies on the server side.
https://blacksheepcode.com/posts/server_side_responsive_cookies_for_react
https://blacksheepcode.com/posts/server_side_responsive_cookies_for_reactWed, 02 Oct 2024 19:00:00 GMTSome problems only exist when you are new to the organisationNew people to the organisation have fresh eyes and can spot issues that old hats might well be used to. But those things don't necessarily need to be fixed.
https://blacksheepcode.com/posts/some_problems_only_exist_when_you_are_new_to_the_organisation
https://blacksheepcode.com/posts/some_problems_only_exist_when_you_are_new_to_the_organisationWed, 08 Jul 2026 00:00:00 GMTA comprehensive guide to testing with Easy-Markdown-EditorEasy Markdown Editor is a handy markdown editor with formatting keyboard shortcuts. This post outlines how to write tests for applications using it, using either Testing Library or Cypress.
https://blacksheepcode.com/posts/testing_easy_mde
https://blacksheepcode.com/posts/testing_easy_mdeThu, 19 Oct 2023 00:00:00 GMTReact testing patterns: When making a change to a leaf component breaks tests further up the treeA common pain point in testing React applications is when we make a change to a component that exists down the component tree, and this change causes breaks in multiple components that directly or indirectly consume this component. Here we outline some strategies for mitigating this problem.
https://blacksheepcode.com/posts/testing_patterns_changing_a_leaf_breaks_the_root
https://blacksheepcode.com/posts/testing_patterns_changing_a_leaf_breaks_the_rootFri, 13 Dec 2024 00:00:00 GMTTesting strategies for a Single Page Application as it relates to state managementThe presence of state management is often what makes testing an Single Page Application difficult. Various approaches such as API mocking, dependency injection, component composition and error boundaries can help.
https://blacksheepcode.com/posts/testing_strategies
https://blacksheepcode.com/posts/testing_strategiesTue, 10 Oct 2023 00:00:00 GMTThe case for adding a 'this file was generated by AI' headerIt helps not gaslight anyone reading the code
https://blacksheepcode.com/posts/the_case_for_an_ai_header
https://blacksheepcode.com/posts/the_case_for_an_ai_headerWed, 01 Jul 2026 00:00:00 GMTThe case for blackbox testsBlackbox tests do not require knowledge of the implementation details - they're a 'how the consumer sees it' style of test.
https://blacksheepcode.com/posts/the_case_for_blackbox_tests
https://blacksheepcode.com/posts/the_case_for_blackbox_testsMon, 17 Apr 2023 00:00:00 GMTThe case for clear code ownershipClear code ownership = developers proud of their work, high quality code
https://blacksheepcode.com/posts/the_case_for_clear_code_ownership
https://blacksheepcode.com/posts/the_case_for_clear_code_ownershipThu, 25 Jun 2026 00:00:00 GMTThe case for splitting Cypress tests into multiple it blocksCypress recommends long running tests with lots of assertions. I argue that it would be helpful if we had granular visibility of the parts of the test.
https://blacksheepcode.com/posts/the_case_for_splitting_tests_into_multiple_it_blocks
https://blacksheepcode.com/posts/the_case_for_splitting_tests_into_multiple_it_blocksFri, 11 Nov 2022 00:00:00 GMTThe horseshoe model for software developmentI propose that the designer and the QA should be one and the same.
https://blacksheepcode.com/posts/the_horse_shoe_theory_of_software_development_lifecycle
https://blacksheepcode.com/posts/the_horse_shoe_theory_of_software_development_lifecycleFri, 11 Aug 2023 00:00:00 GMTThe natural state of software is chaosThe perfect codebase is a myth. Abondon the pursuit of it, and instead seek to contain the mess.
https://blacksheepcode.com/posts/the_natural_state_of_software_is_chaos
https://blacksheepcode.com/posts/the_natural_state_of_software_is_chaosTue, 24 Sep 2024 00:00:00 GMTThe problem of testability in ReactIt seems like there are no perfect solutions for testing in React.
https://blacksheepcode.com/posts/the_problem_of_testability_in_react
https://blacksheepcode.com/posts/the_problem_of_testability_in_reactThu, 25 Jul 2024 00:00:00 GMTThe time required to wait for a job to complete - changes the workflow for how you do itThere's a big difference between a job that takes one hour, vs a job that takes one minute vs a job that takes less than a second
https://blacksheepcode.com/posts/the_time_a_task_takes_changes_your_workflow
https://blacksheepcode.com/posts/the_time_a_task_takes_changes_your_workflowWed, 27 May 2026 00:00:00 GMTThe tool I want to exist - an API mocking tool that generates mock data by observing real world usage.Mocking API calls, particularly multiple interlinked calls can be cumbersome. I want a tool to do it for me.
https://blacksheepcode.com/posts/the_tool_I_want_to_exist
https://blacksheepcode.com/posts/the_tool_I_want_to_existTue, 04 Feb 2025 00:00:00 GMTThis blog now features commentsYou can very easily add comment functionality to a webpage via the Github-powered Utterances plugin.
https://blacksheepcode.com/posts/this_blog_now_features_comments
https://blacksheepcode.com/posts/this_blog_now_features_commentsFri, 24 Mar 2023 00:00:00 GMTThoughts about JSON APIJSON API is an opinionated REST API structuring spec. I think it has some good ideas about what can be useful in a RESTful API, but ultimately the complexity of using it makes it not worth using.
https://blacksheepcode.com/posts/thoughts_about_json_api
https://blacksheepcode.com/posts/thoughts_about_json_apiMon, 06 Mar 2023 00:00:00 GMTToday I learned: The Etc/GMT+x timezones actually mean UTC-xCounter-intuitively Etc/GMT+x timezones means the opposite of how they appear in an ISO 8601 formatted date string.
https://blacksheepcode.com/posts/til_etc_timezone_is_backward
https://blacksheepcode.com/posts/til_etc_timezone_is_backwardMon, 21 Aug 2023 00:00:00 GMTTools I Want: A VSCode plugin that highlights how often an error appears in Sentry, or other monitoring toolsI liberally throw errors defensively, often not expecting the error scenario to ever actually occur - it would be nice if I could see some real metrics about how often a thing is occurring, without having to leave the IDE.
https://blacksheepcode.com/posts/tools_I_want_vscode_sentry_plugin
https://blacksheepcode.com/posts/tools_I_want_vscode_sentry_pluginThu, 20 Feb 2025 00:00:00 GMTTools I like: @inquirer/prompts@inquirer/prompts is a JavaScript library for creating interactive CLI prompt menus
https://blacksheepcode.com/posts/tools_i_like_enquirer
https://blacksheepcode.com/posts/tools_i_like_enquirerWed, 30 Jul 2025 00:00:00 GMTTools I like: git checkout interactivegci is an interactive CLI utility to select a git branch with arrow keys.
https://blacksheepcode.com/posts/tools_i_like_gci
https://blacksheepcode.com/posts/tools_i_like_gciWed, 12 Jun 2024 00:00:00 GMTTypeScript - indexing into a mapped typeIndexing into a mapped type a powerful TypeScript technique to allow a collection of all different types, while retaining the type information.
https://blacksheepcode.com/posts/typescript_bits_indexing_into_a_mapped_type
https://blacksheepcode.com/posts/typescript_bits_indexing_into_a_mapped_typeMon, 14 Oct 2024 00:00:00 GMTTypeScript types are inferred in a forward directionTypeScript's type inference is powerful, but it does have constraints. One constraint is that it can't retrospectively narrow types.
https://blacksheepcode.com/posts/typescript_bits_types_are_inferred_forwards
https://blacksheepcode.com/posts/typescript_bits_types_are_inferred_forwardsMon, 14 Oct 2024 00:00:00 GMTUser Experience reflects the underlying data structureI propose a variation of Conway's Law.
https://blacksheepcode.com/posts/user_experience_reflects_data_structures
https://blacksheepcode.com/posts/user_experience_reflects_data_structuresThu, 01 Dec 2022 00:00:00 GMTWell designed code is easy to deleteThe mark of some well designed code is that the act of replacing it is some what straight forward.
https://blacksheepcode.com/posts/well_designed_code_is_easy_to_delete
https://blacksheepcode.com/posts/well_designed_code_is_easy_to_deleteWed, 23 Apr 2025 00:00:00 GMTWhat is the role of QA and how should their tests fit into the development process?If we're doing shift-left testing, and developers are writing their own tests - then where does that leave QA?
https://blacksheepcode.com/posts/whats_the_role_of_qa
https://blacksheepcode.com/posts/whats_the_role_of_qaTue, 19 Apr 2022 00:00:00 GMTWhere are the prompts to stop humans going off the rails?Humans are just as finicky as AI
https://blacksheepcode.com/posts/where_are_the_promptss_to_stop_humans_going_of_the_rails
https://blacksheepcode.com/posts/where_are_the_promptss_to_stop_humans_going_of_the_railsFri, 03 Jul 2026 00:00:00 GMTWhy I don't like API mocking as a necessary frontend testing strategyA lot of state management frameworks recommend doing API mocking as the testing strategy. I think dependency injection is a better approach.
https://blacksheepcode.com/posts/why_i_dont_like_api_mocking
https://blacksheepcode.com/posts/why_i_dont_like_api_mockingMon, 12 Dec 2022 00:00:00 GMTWhy I've gone off React Testing LibraryReact Testing Library is perhaps the most popular tool for testing React applications. However its use of JSDOM under-the-hood means we often spend time dealing with browser APIs that JSDOM has not implemented.
https://blacksheepcode.com/posts/why_ive_gone_off_react_testing_library
https://blacksheepcode.com/posts/why_ive_gone_off_react_testing_libraryThu, 08 Feb 2024 00:00:00 GMT