41554 blogs · [ { "id": "01a08ccb-105e-700e-82d6-7752f57574e9", "title": "r7.1 - Architecture (or \"How Not to Build a Static Site\")", "url": "https://nabeelvalley.co.za/blog/2026/10-09/website-revision-7-part-1-architecture.html", "published_at": "2026-09-10T00:00:00+00:00" }, { "id": "01a0b68b-4cdf-7170-bcdf-c4f8545fc3ca", "title": "Nabeel Valley", "url": "https://nabeelvalley.co.za", "published_at": "2026-09-07T05:20:44+00:00" }, { "id": "01a087ab-b371-728e-953e-d056f6fb7ae5", "title": "Week 37 - 3D Photos and Ownership", "url": "https://nabeelvalley.co.za/blog/2026/06-09/week-37-3d-photos-and-ownership.html", "published_at": "2026-09-06T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056fe4bc1a6", "title": "Landscapes (ish)", "url": "https://nabeelvalley.co.za/blog/2026/23-08/landscapes-ish.html", "published_at": "2026-08-23T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056fac93a6e", "title": "Eclipse", "url": "https://nabeelvalley.co.za/blog/2026/12-08/eclipse.html", "published_at": "2026-08-12T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056f5bc63b1", "title": "In Color", "url": "https://nabeelvalley.co.za/blog/2026/01-08/in-color.html", "published_at": "2026-08-01T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056fd1b60e0", "title": "People used to live here", "url": "https://nabeelvalley.co.za/blog/2026/18-07/people-used-to-live-here.html", "published_at": "2026-07-18T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056f7b4638d", "title": "Summer in Paris", "url": "https://nabeelvalley.co.za/blog/2026/10-07/summer-in-paris.html", "published_at": "2026-07-10T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056f753738f", "title": "r7.0 - Housekeeping", "url": "https://nabeelvalley.co.za/blog/2026/08-07/website-revision-7-part-0.html", "published_at": "2026-07-08T00:00:00+00:00" }, { "id": "01a08ccb-105e-700e-82d6-7752f469a82d", "title": "r7.0 - Housekeeping", "url": "https://nabeelvalley.co.za/blog/2026/08-07/website-revision-7-part-0-housekeeping.html", "published_at": "2026-07-08T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056fe8fffbd", "title": "Parz v1 finally published!", "url": "https://nabeelvalley.co.za/blog/2026/25-06/parz-v1.html", "published_at": "2026-06-25T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056fba455a2", "title": "Blow-up Jubilee - Den Haag", "url": "https://nabeelvalley.co.za/blog/2026/14-06/blow-up-jubilee-den-haag.html", "published_at": "2026-06-14T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056fb6e0287", "title": "Cash4Tricks", "url": "https://nabeelvalley.co.za/blog/2026/13-06/cash-4-tricks.html", "published_at": "2026-06-13T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056f91790e7", "title": "Quirky Times", "url": "https://nabeelvalley.co.za/blog/2026/11-06/quirky-times.html", "published_at": "2026-06-11T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056f6d1ac9f", "title": "Zig - Bus error at address and memory management", "url": "https://nabeelvalley.co.za/blog/2026/06-06/zig-memory-allocation.html", "published_at": "2026-06-06T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056f66c6c16", "title": "Editing Text in-stream", "url": "https://nabeelvalley.co.za/blog/2026/02-06/in-stream-text-editor.html", "published_at": "2026-06-02T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056f9f4fc89", "title": "HTML in WebGPU Shaders in Canvas", "url": "https://nabeelvalley.co.za/blog/2026/12-04/html-in-canvas.html", "published_at": "2026-04-12T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d05700d2c25f", "title": "Symbols on the Ground", "url": "https://nabeelvalley.co.za/blog/2026/31-03/mural-on-the-ground.html", "published_at": "2026-03-31T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d05700b5b42d", "title": "Photos from the Nederlands Fotomuseum", "url": "https://nabeelvalley.co.za/blog/2026/28-03/nederlands-fotomuseum.html", "published_at": "2026-03-28T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056ffcedfd6", "title": "Quick and Dirty Object Access in Go", "url": "https://nabeelvalley.co.za/blog/2026/27-03/deep-dynamic-access.html", "published_at": "2026-03-27T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056feaf167e", "title": "Async TUIs using Bubble Tea", "url": "https://nabeelvalley.co.za/blog/2026/26-03/bubbletea-commands.html", "published_at": "2026-03-26T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056fedf0e36", "title": "Git Tricks with Tri and Difft", "url": "https://nabeelvalley.co.za/blog/2026/26-03/tri-x-git-tricks.html", "published_at": "2026-03-26T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056fdb3856e", "title": "Mildly interesting photos from Eid", "url": "https://nabeelvalley.co.za/blog/2026/22-03/mildly-interesting-eid.html", "published_at": "2026-03-22T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056f9c34c3c", "title": "Join the Webring!", "url": "https://nabeelvalley.co.za/blog/2026/12-03/webring.html", "published_at": "2026-03-12T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056fc25a5fb", "title": "Web Component for Making Patterns", "url": "https://nabeelvalley.co.za/blog/2026/17-02/pattern-web-component.html", "published_at": "2026-02-17T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056f8769429", "title": "CSS Anchor Positioning", "url": "https://nabeelvalley.co.za/blog/2026/11-02/css-anchor-positioning.html", "published_at": "2026-02-11T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056f1f4b795", "title": "Generator Generation", "url": "https://nabeelvalley.co.za/blog/2025/17-12/generator-generation.html", "published_at": "2025-12-17T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056f1b8f062", "title": "Parsing Helix logs in Nushell", "url": "https://nabeelvalley.co.za/blog/2025/16-12/helix-log-parsing.html", "published_at": "2025-12-16T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056edc1518f", "title": "Coat Rack", "url": "https://nabeelvalley.co.za/blog/2025/09-11/coat-rack.html", "published_at": "2025-11-09T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056ee46b3b7", "title": "Shader Web Component", "url": "https://nabeelvalley.co.za/blog/2025/09-11/shader-web-component.html", "published_at": "2025-11-09T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056ebf21f29", "title": "Snippet: Rachets, not Levers - Chris Krycho", "url": "https://nabeelvalley.co.za/blog/2025/03-11/rachets-not-levers.html", "published_at": "2025-11-03T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056eb4ff965", "title": "Use a password manager, they said", "url": "https://nabeelvalley.co.za/blog/2025/01-10/use-a-password-manager-they-said.html", "published_at": "2025-10-01T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056f1380b7d", "title": "Week 37, Server Management", "url": "https://nabeelvalley.co.za/blog/2025/14-09/week-37-server-management.html", "published_at": "2025-09-14T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056efdc9d5a", "title": "Côte d'Azur", "url": "https://nabeelvalley.co.za/blog/2025/10-09/cote-d-azure.html", "published_at": "2025-09-10T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056ed0963b3", "title": "Week 36, Creativity", "url": "https://nabeelvalley.co.za/blog/2025/07-09/week-36-creativity.html", "published_at": "2025-09-07T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056f59d7803", "title": "Week 35, Documentation matters", "url": "https://nabeelvalley.co.za/blog/2025/31-08/week-35-trying-this-out-again.html", "published_at": "2025-08-31T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056f4125285", "title": "Problems are better left solved", "url": "https://nabeelvalley.co.za/blog/2025/27-08/problems-are-better-left-solved.html", "published_at": "2025-08-27T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056ea78beaf", "title": "Scripting Text Manipulation", "url": "https://nabeelvalley.co.za/blog/2025/01-08/scripting-text-manipulation.html", "published_at": "2025-08-01T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056f4d18919", "title": "Web Authentication API", "url": "https://nabeelvalley.co.za/blog/2025/29-07/web-authentication-api.html", "published_at": "2025-07-29T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056ef0d9faa", "title": "Exploring the CSS Paint API", "url": "https://nabeelvalley.co.za/blog/2025/10-07/css-houdini-paint-api.html", "published_at": "2025-07-10T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056ecdd9516", "title": "Accessibility Reference List", "url": "https://nabeelvalley.co.za/blog/2025/07-07/accessibility-tools.html", "published_at": "2025-07-07T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056eb52d2a1", "title": "Patching packages with PNPM", "url": "https://nabeelvalley.co.za/blog/2025/03-07/pnpm-package-patch.html", "published_at": "2025-07-03T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056f257fcc8", "title": "Typescript debugging without an IDE", "url": "https://nabeelvalley.co.za/blog/2025/18-06/typescript-debugging-without-an-ide.html", "published_at": "2025-06-18T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056f3a54689", "title": "Scan based regex composition", "url": "https://nabeelvalley.co.za/blog/2025/27-03/regex-composition.html", "published_at": "2025-03-27T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056f2cb9fff", "title": "Getting Started with the Language Server Protocol", "url": "https://nabeelvalley.co.za/blog/2025/26-03/the-language-server-protocol.html", "published_at": "2025-03-26T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056f0d9fe93", "title": "Typescript Workers in NodeJS", "url": "https://nabeelvalley.co.za/blog/2025/12-02/nodejs-worker-threads.html", "published_at": "2025-02-12T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056eccbd87b", "title": "Web Workers and Vite", "url": "https://nabeelvalley.co.za/blog/2025/06-01/web-workers.html", "published_at": "2025-01-06T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056e303a63e", "title": "Javascript Proxy Object", "url": "https://nabeelvalley.co.za/blog/2024/11-12/proxy-objects.html", "published_at": "2024-12-11T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056e011b5f0", "title": "Conditionally Protect Properties in Typescript", "url": "https://nabeelvalley.co.za/blog/2024/03-12/conditional-protection.html", "published_at": "2024-12-03T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056ea156c96", "title": "Type safe URL templates", "url": "https://nabeelvalley.co.za/blog/2024/31-10/type-safe-url-templates.html", "published_at": "2024-10-31T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056e17e145b", "title": "week 40, year 2024 - paper and pictures", "url": "https://nabeelvalley.co.za/blog/2024/06-10/week-40-paper-and-pictures.html", "published_at": "2024-10-06T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056e52b23b1", "title": "week 37, year 2024 - ui paradigms and comic books", "url": "https://nabeelvalley.co.za/blog/2024/15-09/week-37-ui-paradigms-and-comic-books.html", "published_at": "2024-09-15T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056e23a35f6", "title": "week 36, year 2024 - pretty printing", "url": "https://nabeelvalley.co.za/blog/2024/08-09/week-36-pretty-printing.html", "published_at": "2024-09-08T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056df22f9f4", "title": "week 35, year 2024 - datetimes and logic programming", "url": "https://nabeelvalley.co.za/blog/2024/01-09/week-35-datetimes-and-logic-programming.html", "published_at": "2024-09-01T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056e9ace4f7", "title": "An unexpected way to open links in the terminal", "url": "https://nabeelvalley.co.za/blog/2024/28-08/open-terminal-links-in-vscode.html", "published_at": "2024-08-28T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056e83ac7bf", "title": "A Visual Language for Image Manipulation", "url": "https://nabeelvalley.co.za/blog/2024/24-08/unintentionally-made-a-programming-language.html", "published_at": "2024-08-24T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056e8d1c9d7", "title": "week 34, year 2024 - programming languages of various types", "url": "https://nabeelvalley.co.za/blog/2024/24-08/week-34-programming-languages-of-various-types.html", "published_at": "2024-08-24T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056e619e39c", "title": "week 33, year 2024 - compilers, videography and good intentions", "url": "https://nabeelvalley.co.za/blog/2024/17-08/week-33-compilers-videography-and-good-intentions.html", "published_at": "2024-08-17T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056e597a1f5", "title": "Parameters, but only sometimes", "url": "https://nabeelvalley.co.za/blog/2024/16-08/optional-parameters-and-overloads-in-typescript.html", "published_at": "2024-08-16T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056e42f0ed9", "title": "More generic than it should be", "url": "https://nabeelvalley.co.za/blog/2024/15-08/handling-complex-typescript-generics.html", "published_at": "2024-08-15T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056e2892deb", "title": "week 32, year 2024 - branded types, nodes, and image segmentation", "url": "https://nabeelvalley.co.za/blog/2024/10-08/week-32-branded-types-nodes-and-image-segmentation.html", "published_at": "2024-08-10T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056dfb79566", "title": "week 31, year 2024 - webgpu and parsers", "url": "https://nabeelvalley.co.za/blog/2024/02-08/week-31-webgpu-and-parsers.html", "published_at": "2024-08-02T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056e7327c19", "title": "Life, Gleam, and Parser Combinators", "url": "https://nabeelvalley.co.za/blog/2024/20-07/parser-combinators-and-gleam.html", "published_at": "2024-07-20T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056e425a324", "title": "The Most Awkward Person in the Room", "url": "https://nabeelvalley.co.za/blog/2024/13-07/on-being-awkward.html", "published_at": "2024-07-13T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056e98522fb", "title": "On Automatic Lensess", "url": "https://nabeelvalley.co.za/blog/2024/27-04/automatic-lenses.html", "published_at": "2024-04-27T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056e6a67b29", "title": "On Falling Down", "url": "https://nabeelvalley.co.za/blog/2024/19-04/falling.html", "published_at": "2024-04-19T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056e3855619", "title": "Passwords", "url": "https://nabeelvalley.co.za/blog/2024/12-04/passwords.html", "published_at": "2024-04-12T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056e0791176", "title": "Show Children when Parent is Hidden with CSS", "url": "https://nabeelvalley.co.za/blog/2024/04-04/css-show-children-when-parent-hidden.html", "published_at": "2024-04-04T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056e81c1b05", "title": "CSS @counter-style with Emojis", "url": "https://nabeelvalley.co.za/blog/2024/21-03/css-counter-style.html", "published_at": "2024-03-21T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056e1c27573", "title": "Use localStorage for Tab Synchronization", "url": "https://nabeelvalley.co.za/blog/2024/07-03/localstorage-based-sync.html", "published_at": "2024-03-07T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056e0b434be", "title": "View Transitions and an Astro Presentation Framework", "url": "https://nabeelvalley.co.za/blog/2024/06-03/astro-slides.html", "published_at": "2024-03-06T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056da96a432", "title": "Interacting with Kafka with Kotlin Coroutines", "url": "https://nabeelvalley.co.za/blog/2023/11-11/interacting-with-kafka-using-kotlin.html", "published_at": "2023-11-11T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056dc1952fb", "title": "JPA Queries without the Magic", "url": "https://nabeelvalley.co.za/blog/2023/20-10/jpa-query-specifications.html", "published_at": "2023-10-20T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056ddb25abc", "title": "Using Type Guards and Unions to prevent bugs and increase maintainability", "url": "https://nabeelvalley.co.za/blog/2023/26-06/type-guards-and-unions-typescript.html", "published_at": "2023-06-26T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056db519b16", "title": "Nvim Error when using Plugins", "url": "https://nabeelvalley.co.za/blog/2023/13-06/vim-errror-when-using-plugins.html", "published_at": "2023-06-13T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056d9b49913", "title": "Generic Object Property Formatter and Validator using Typescript", "url": "https://nabeelvalley.co.za/blog/2023/09-05/generic-transformer-typescript.html", "published_at": "2023-05-09T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056dc5f2f06", "title": "Postman Flows", "url": "https://nabeelvalley.co.za/blog/2023/23-03/postman-flows.html", "published_at": "2023-03-23T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056de4d1bd4", "title": "Update or Append to DynamoDB Attributes", "url": "https://nabeelvalley.co.za/blog/2023/28-02/dynamo-db-update-attribute.html", "published_at": "2023-02-28T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056de642409", "title": "Draggable Div with XState and React", "url": "https://nabeelvalley.co.za/blog/2023/31-01/xstate-draggable-div.html", "published_at": "2023-01-31T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056dd649b6d", "title": "Structuring HTML Content", "url": "https://nabeelvalley.co.za/blog/2023/26-01/html-to-structured-content.html", "published_at": "2023-01-26T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056dc7765fc", "title": "Let's talk about Feeds", "url": "https://nabeelvalley.co.za/blog/2023/24-01/about-rss.html", "published_at": "2023-01-24T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056d80f5810", "title": "Virtual Machine vs Containers", "url": "https://nabeelvalley.co.za/blog/2022/20-12/vms-vs-containers-diagram.html", "published_at": "2022-12-20T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056d59b25f0", "title": "Smooth Bottom Navigator with Secondary Actions", "url": "https://nabeelvalley.co.za/blog/2022/15-12/smooth-bottom-nav-with-actions.html", "published_at": "2022-12-15T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056d4b934d0", "title": "Podcast and RSS Reader App Design", "url": "https://nabeelvalley.co.za/blog/2022/14-12/rss-podcast-app-design.html", "published_at": "2022-12-14T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056d3d2feff", "title": "Typescript Utilities", "url": "https://nabeelvalley.co.za/blog/2022/13-12/typescript-utilities.html", "published_at": "2022-12-13T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056d720cfcf", "title": "Un-editable sections inside of a content editable", "url": "https://nabeelvalley.co.za/blog/2022/16-11/uneditable-sections-inside-of-conteneditable.html", "published_at": "2022-11-16T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056d3a08a54", "title": "Expanding Bottom Navigation with CSS Transitions", "url": "https://nabeelvalley.co.za/blog/2022/13-11/svelte-expanding-nav.html", "published_at": "2022-11-13T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056d8f034fb", "title": "Education App Design Ideas", "url": "https://nabeelvalley.co.za/blog/2022/27-09/open-education-app.html", "published_at": "2022-09-27T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056d853d44f", "title": "Read Metadata from Images using Rust", "url": "https://nabeelvalley.co.za/blog/2022/25-08/read-image-metadata.html", "published_at": "2022-08-25T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056d7f78ec8", "title": "Binary Data and File Formats", "url": "https://nabeelvalley.co.za/blog/2022/20-08/understanding-binary-files.html", "published_at": "2022-08-20T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056d63bfc47", "title": "Using React.memo for Controlling Component Rendering", "url": "https://nabeelvalley.co.za/blog/2022/16-08/react-memo-top-level-api.html", "published_at": "2022-08-16T00:00:00+00:00" }, { "id": "01a087ab-b370-7289-a053-c33cd811bf2e", "title": "Dev Tools Update", "url": "https://nabeelvalley.co.za/blog/2022/03-08/dev-tools-update.html", "published_at": "2022-08-03T00:00:00+00:00" }, { "id": "01a087ab-b370-7289-a053-c33cd9900b46", "title": "A type for getting properties common in all objects from a union", "url": "https://nabeelvalley.co.za/blog/2022/08-07/common-object-type.html", "published_at": "2022-07-08T00:00:00+00:00" }, { "id": "01a087ab-b370-7289-a053-c33cd8c28f7b", "title": "A Simple JSON Backed Database in Typescript", "url": "https://nabeelvalley.co.za/blog/2022/06-07/typescript-json-database.html", "published_at": "2022-07-06T00:00:00+00:00" }, { "id": "01a087ab-b371-728e-953e-d056d99f5b70", "title": "Type Narrowing in Typescript", "url": "https://nabeelvalley.co.za/blog/2022/31-05/type-narrowing.html", "published_at": "2022-05-31T00:00:00+00:00" }, { "id": "01a087ab-b370-7289-a053-c33cd98c96a5", "title": "Localhost HTTP Proxy with Node.js", "url": "https://nabeelvalley.co.za/blog/2022/08-03/http-proxy-node-js.html", "published_at": "2022-03-08T00:00:00+00:00" }, { "id": "01a087ab-b370-7289-a053-c33cd76ccac1", "title": "React Top Level API", "url": "https://nabeelvalley.co.za/blog/2022/01-03/react-top-level-api.html", "published_at": "2022-03-01T00:00:00+00:00" }, { "id": "01a087ab-b370-7289-a053-c33cd9f676f5", "title": "Visualizations with React", "url": "https://nabeelvalley.co.za/blog/2022/11-02/d3-with-react.html", "published_at": "2022-02-11T00:00:00+00:00" }, { "id": "01a087ab-b370-7289-a053-c33cd31272f3", "title": "Logging Aliases for Javascript", "url": "https://nabeelvalley.co.za/blog/2021/02-11/javascript-quick-logger.html", "published_at": "2021-11-02T00:00:00+00:00" }, { "id": "01a087ab-b370-7289-a053-c33cd75ee21e", "title": "Javascript Range Function", "url": "https://nabeelvalley.co.za/blog/2021/29-10/javascript-range.html", "published_at": "2021-10-29T00:00:00+00:00" } ] posts Claim your blog
Back to Home - Nabeel Valley
Blog · corpus.blog/blogs/nabeelvalley.co.za/posts

Home - Nabeel Valley

nabeelvalley.co.za

2026

2025

2024

2023

2022

2021