56,966 blogs · [ { "id": "01a0d814-5e10-71ef-b59c-0292d03a8587", "title": "Surviving the Dumb Zone: A Checkpoint System for Claude Code's /compact", "url": "https://www.duncanleung.com/blog/claude-code-precompact-postcompact-context-management", "published_at": "2026-09-22T00:00:00+00:00" }, { "id": "01a0c509-7e8b-70ed-b57a-b47fbb85d2c0", "title": "Building an Observer That Turns Claude Code Sessions into a Knowledge Base", "url": "https://www.duncanleung.com/blog/claude-code-session-capture-observer-architecture", "published_at": "2026-09-18T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb1e16fcf4", "title": "Claude Code Research Tools: A Decision Guide", "url": "https://www.duncanleung.com/blog/claude-code-research-tools-decision-guide", "published_at": "2026-08-29T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb1e939b62", "title": "The Attention Mechanism: Why Your LLM Forgets the Middle", "url": "https://www.duncanleung.com/blog/llm-attention-mechanism-context-rot", "published_at": "2026-08-10T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb1f34c711", "title": "The LLM Dumb Zone: Why Your AI Gets Worse Before It Runs Out of Context", "url": "https://www.duncanleung.com/blog/llm-smart-zone-dumb-zone-context-window-degradation", "published_at": "2026-08-09T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb1fce2dca", "title": "Benchmarks vs Vibes: Why I'm Keeping Opus 4.6 for Daily Coding", "url": "https://www.duncanleung.com/blog/opus-4-6-vs-opus-5-benchmarks-vs-vibes", "published_at": "2026-07-20T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb205f5dc9", "title": "Near-Miss Retrieval in RAG: Why Semantic Chunking Lost the Data and Hierarchical Chunking Found It", "url": "https://www.duncanleung.com/blog/rag-near-miss-retrieval-semantic-vs-hierarchical-chunking", "published_at": "2026-07-16T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb20a97266", "title": "Stochastic Refusal in RAG: Same Evidence, Different Answer", "url": "https://www.duncanleung.com/blog/rag-stochastic-refusal-same-evidence-different-answer", "published_at": "2026-07-13T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb21a828ff", "title": "Reranking in RAG: Why Retrieval Needs a Second, Slower Opinion", "url": "https://www.duncanleung.com/blog/rag-reranking-cross-encoder-recall-precision", "published_at": "2026-06-17T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb21b29560", "title": "Setting Up Python with uv", "url": "https://www.duncanleung.com/blog/set-up-python-uv-astral", "published_at": "2026-05-29T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb226b51f2", "title": "Module-Load Env Guards in Next.js: Why DATABASE_URL Needs Structural Validation", "url": "https://www.duncanleung.com/blog/nextjs-module-load-env-guards-structural-validation", "published_at": "2026-05-12T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb22b2727e", "title": "Producer, Service, ProducerService: Interface Segregation for Shared Singletons in Go", "url": "https://www.duncanleung.com/blog/go-interface-segregation-shared-singletons", "published_at": "2026-04-30T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb22c774f6", "title": "Idempotent SQS Workers with Postgres UPDATE: The WHERE-Status Pattern", "url": "https://www.duncanleung.com/blog/postgres-where-status-idempotent-sqs-worker", "published_at": "2026-04-30T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb235c58d6", "title": "Agentic Engineering at Airvet: Research, Plan, Implement", "url": "https://www.duncanleung.com/blog/agentic-engineering-airvet-research-plan-implement", "published_at": "2026-04-09T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb236b8cd6", "title": "Setting up Global MCP Configuration for Claude Code", "url": "https://www.duncanleung.com/blog/claude-code-global-mcp-config", "published_at": "2025-06-22T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb23a86e15", "title": "AI \"Overview\": GPT, RAG, and How They Actually Work", "url": "https://www.duncanleung.com/blog/ai-overview-airvet", "published_at": "2024-07-27T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb2490a5ec", "title": "Preparing for ESLint v9: TypeScript Integration Changes", "url": "https://www.duncanleung.com/blog/eslint-v9-typescript", "published_at": "2024-07-18T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb25214b2b", "title": "Tackling 'on load' Scrolling in Chat Applications", "url": "https://www.duncanleung.com/blog/image-scrolling-loading", "published_at": "2024-04-16T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb25854b99", "title": "Why useRef Doesn't Work for Dynamic Element Measurements", "url": "https://www.duncanleung.com/blog/useref-resize-observer-react-dynamic-measurements", "published_at": "2024-04-16T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb262286f1", "title": "Proxy Firebase Auth with Next.js on Vercel", "url": "https://www.duncanleung.com/blog/missing-initial-state-firebase-auth-proxy-nextjs-vercel", "published_at": "2023-09-23T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb267e7377", "title": "Go Idioms: Accept Interfaces, Return Types", "url": "https://www.duncanleung.com/blog/go-idiom-accept-interfaces-return-types", "published_at": "2023-06-30T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb26aaf784", "title": "Allocating Memory in Go", "url": "https://www.duncanleung.com/blog/allocating-memory-go", "published_at": "2023-06-28T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb27282711", "title": "Methods in Go", "url": "https://www.duncanleung.com/blog/methods-in-go", "published_at": "2023-06-28T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb275037a6", "title": "Slices in Go", "url": "https://www.duncanleung.com/blog/slices-in-go", "published_at": "2023-06-26T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb275476d1", "title": "JSON Encoding and Decoding in Go", "url": "https://www.duncanleung.com/blog/go-json-encoding-and-decoding", "published_at": "2023-06-19T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb27be424b", "title": "Go Function Argument Passing Behavior", "url": "https://www.duncanleung.com/blog/go-function-arguments-passed-by-value", "published_at": "2023-06-08T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb286b966f", "title": "Tailwind CSS Unknown at Rule", "url": "https://www.duncanleung.com/blog/tailwind-css-unknown-at-rule", "published_at": "2023-01-11T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb286c1054", "title": "NVM Commands Cheatsheet", "url": "https://www.duncanleung.com/blog/nvm-commands-cheatsheet", "published_at": "2022-12-23T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb29606a7b", "title": "Understanding Interfaces in Go", "url": "https://www.duncanleung.com/blog/understand-go-golang-interfaces", "published_at": "2021-12-23T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb2a4d46a3", "title": "Recover from a git push --force", "url": "https://www.duncanleung.com/blog/recover-accidental-git-push-force", "published_at": "2021-12-16T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb2a63f626", "title": "Using SVGs with Next.js 11 and TypeScript", "url": "https://www.duncanleung.com/blog/next-js-typescript-svg-any-module-declaration", "published_at": "2021-07-10T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb2aadee47", "title": "Basic Data Structures in Go", "url": "https://www.duncanleung.com/blog/go-basic-data-structures-types-pointers-structs-arrays-slices-int-float-string", "published_at": "2021-07-09T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb2b0364d8", "title": "Find and Kill Process on Port 3000", "url": "https://www.duncanleung.com/blog/find-kill-process-port-3000-mac", "published_at": "2021-06-30T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb2b04d2bc", "title": "Indexing Strings and Runes in Go", "url": "https://www.duncanleung.com/blog/iterating-index-strings-runes-go-golang", "published_at": "2021-06-16T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb2b337e3c", "title": "Setting Up Husky, Prettier, and ESLint with precise-commits and lint-staged", "url": "https://www.duncanleung.com/blog/husky-prettier-eslint-precise-commits-lint-staged-pre-commit-pre-push", "published_at": "2021-06-12T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb2bee6bf9", "title": "Understanding JavaScript Promises: Chaining, Error Handling, and async/await", "url": "https://www.duncanleung.com/blog/javascript-promises-chaining-catch-async-await", "published_at": "2021-05-05T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb2c79357a", "title": "The io.Reader and io.Writer Interfaces in Go", "url": "https://www.duncanleung.com/blog/golang-readers-writers", "published_at": "2021-05-03T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb2cef41b9", "title": "Self-Hosting a Go Binary on AWS EC2", "url": "https://www.duncanleung.com/blog/self-hosting-go-binary-aws-ec2-systemd", "published_at": "2021-05-03T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb2d0c1752", "title": "ESLint on TypeScript and JavaScript Files", "url": "https://www.duncanleung.com/blog/eslint-mixed-javascript-typescript-files-codebase", "published_at": "2021-01-06T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb2d27c5d0", "title": "Accessing Material UI Theme Object in Emotion JS", "url": "https://www.duncanleung.com/blog/accessing-material-ui-theme-object-emotion-styled-component-css-prop", "published_at": "2020-10-22T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb2d4e4ce8", "title": "Configuring AWS Email Billing Alerts with CloudWatch", "url": "https://www.duncanleung.com/blog/aws-set-up-email-billing-alert", "published_at": "2020-06-17T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb2e01ffca", "title": "Securing AWS API Gateway Endpoints (Cognito, IAM, API Keys)", "url": "https://www.duncanleung.com/blog/serverless-securing-authenticate-aws-api-gateway-endpoints-cognito-iam-api-key", "published_at": "2020-05-30T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb2e96c027", "title": "Set Breakpoints to Locally Debug AWS Lambda", "url": "https://www.duncanleung.com/blog/serverless-set-breakpoint-locally-debug-aws-lambda", "published_at": "2020-05-28T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb2f21af7f", "title": "Export Serverless Framework Environment Variables to a Local .env File", "url": "https://www.duncanleung.com/blog/serverless-export-environment-variables", "published_at": "2020-05-10T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb2f564a61", "title": "Reference AWS Lambda API Endpoints in serverless.yml", "url": "https://www.duncanleung.com/blog/serverless-pseudo-parameters-reference-another-lambda", "published_at": "2020-05-10T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb2fe81617", "title": "Add Custom AWS YAML Tags in VS Code", "url": "https://www.duncanleung.com/blog/visual-studio-code-yml-custom-serverless-tag", "published_at": "2020-05-08T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb30d4b59b", "title": "Understanding the Browser Rendering Pipeline: Layout vs Paint vs Composite", "url": "https://www.duncanleung.com/blog/browser-rendering-pipeline-layout-paint-composite", "published_at": "2020-05-05T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb312364cd", "title": "HTTP Cache-Control: ETag, Revalidation, and the Two Caching Strategies", "url": "https://www.duncanleung.com/blog/http-cache-control-etag-revalidation-strategies", "published_at": "2020-05-05T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb31bf06a8", "title": "JavaScript Closures: Lexical Scope and the Environment That Survives Function Return", "url": "https://www.duncanleung.com/blog/javascript-closures-lexical-scope-environment-survives", "published_at": "2020-05-05T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb32bcb621", "title": "JavaScript Prototypal Inheritance: The Prototype Chain, `new`, and Class Syntax", "url": "https://www.duncanleung.com/blog/javascript-prototypal-inheritance-prototype-chain-class-new", "published_at": "2020-05-05T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb32e5ad21", "title": "Understanding useEffect: Each Render Has Its Own Props, State, and Effects", "url": "https://www.duncanleung.com/blog/react-state-rerender-useeffect", "published_at": "2020-05-05T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb3387da4d", "title": "useReducer: A Mental Model for Decoupling Actions from State Updates", "url": "https://www.duncanleung.com/blog/react-usereducer-decouple-actions-state-updates", "published_at": "2020-05-05T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb341cbd79", "title": "Switching AWS Profiles for Serverless CLI", "url": "https://www.duncanleung.com/blog/switch-multiple-aws-profile-aws-cli-serverless", "published_at": "2020-05-05T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb341f2d9d", "title": "How to Teach Programming (and other things)", "url": "https://www.duncanleung.com/blog/how-to-teach-programming-the-importance-of-mental-models", "published_at": "2020-04-30T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb3475272f", "title": "How JavaScript `this` Works: Function Invocation and the `.call` Primitive", "url": "https://www.duncanleung.com/blog/javascript-this-function-invocation-call-bind-apply", "published_at": "2020-04-27T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb355ad95a", "title": "Select Gatsby Contentful Locale Data in GraphQL", "url": "https://www.duncanleung.com/blog/select-contentful-locale-gatsby-context-graphql-variable", "published_at": "2020-04-27T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb35e2faf5", "title": "Using TypeScript Type Guards", "url": "https://www.duncanleung.com/blog/typescript-type-guards", "published_at": "2020-04-17T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb35fb1e90", "title": "Array .map() over TypeScript Array Union Types", "url": "https://www.duncanleung.com/blog/typescript-array-map-over-union-array-type", "published_at": "2020-04-16T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb3610305d", "title": "Load Python Environment Variables", "url": "https://www.duncanleung.com/blog/python-environment-variables", "published_at": "2020-04-06T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb36aa5c2c", "title": "How to Read a Python Error Traceback", "url": "https://www.duncanleung.com/blog/how-to-read-python-error-traceback", "published_at": "2020-02-26T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb37574b89", "title": "Python Context Managers: The with Statement and the __enter__/__exit__ Protocol", "url": "https://www.duncanleung.com/blog/python-context-managers-with-statement", "published_at": "2020-02-26T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb37a24e53", "title": "Testing Document Head Meta Tags", "url": "https://www.duncanleung.com/blog/testing-react-helmet-document-head-meta-tag-react-testing-library", "published_at": "2020-02-18T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb37c7b10d", "title": "Conditional Types to Infer Props from Emotion `as` Prop", "url": "https://www.duncanleung.com/blog/typescript-generics-conditional-types-emotion-as-prop", "published_at": "2020-02-17T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb3857df9b", "title": "AWS SDK v2 with async/await in Node.js Lambda Handlers", "url": "https://www.duncanleung.com/blog/aws-sdk-promise-async-await-nodejs-lambda", "published_at": "2020-02-15T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb392c77fd", "title": "CloudFormation !Ref vs !GetAtt in serverless.yml", "url": "https://www.duncanleung.com/blog/cloudformation-ref-vs-getatt-serverless-yml", "published_at": "2020-02-15T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb39974b30", "title": "When Direct Lambda-to-Lambda Invocation Is OK", "url": "https://www.duncanleung.com/blog/lambda-to-lambda-invocation-when-okay-when-avoid", "published_at": "2020-02-15T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb39f9a974", "title": "Serverless Framework Commands by Workflow", "url": "https://www.duncanleung.com/blog/serverless-framework-cli-commands-by-workflow", "published_at": "2020-02-15T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb3a2195fa", "title": "A Least-Privilege IAM Strategy for Serverless Framework Deployments", "url": "https://www.duncanleung.com/blog/serverless-framework-least-privilege-iam-deployment-strategy", "published_at": "2020-02-15T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb3a779826", "title": "Serverless Testing Strategy: Test Integrations and IAM Surface", "url": "https://www.duncanleung.com/blog/serverless-testing-strategy-integration-over-unit", "published_at": "2020-02-15T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb3aa1c251", "title": "Why typescript-eslint Performance is Slow", "url": "https://www.duncanleung.com/blog/why-slow-plugin-typescript-eslint-performance-issues", "published_at": "2020-02-10T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb3aac9487", "title": "Reducing AWS Lambda Cold Start Latency in Node.js", "url": "https://www.duncanleung.com/blog/aws-lambda-cold-start-optimization-nodejs", "published_at": "2020-02-05T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb3b602854", "title": "Setting Up ESLint: Understanding Config Files and Plugins", "url": "https://www.duncanleung.com/blog/how-to-setup-eslint-eslintrc-config-difference-eslint-config-plugin", "published_at": "2020-01-28T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb3c17dbd1", "title": "Profile and Remove Slow ESLint Rules", "url": "https://www.duncanleung.com/blog/profile-measure-find-remove-slow-eslint-rules", "published_at": "2020-01-16T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb3d14355e", "title": "TypeScript Module Declaration for SVG Assets", "url": "https://www.duncanleung.com/blog/typescript-module-declaration-svg-img-assets", "published_at": "2020-01-15T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb3dc73aca", "title": "AWS Amplify TypeScript aws-exports.js", "url": "https://www.duncanleung.com/blog/aws-amplify-aws-exports-js-typescript", "published_at": "2020-01-13T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb3dcb3c52", "title": "Set Up Storybook Decorators - Emotion Theme Provider", "url": "https://www.duncanleung.com/blog/storybook-decorators-emotion-theme-provider", "published_at": "2020-01-10T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb3df11936", "title": "Set Up Storybook Decorators - React Intl Provider", "url": "https://www.duncanleung.com/blog/storybook-decorators-react-intl-provider", "published_at": "2020-01-10T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb3e6adaa5", "title": "Import SVG Components in Storybook", "url": "https://www.duncanleung.com/blog/import-svg-storybook-webpack-loader", "published_at": "2020-01-08T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb3ee1b849", "title": "Use Emotion CSS Prop in Storybook", "url": "https://www.duncanleung.com/blog/emotion-css-prop-jsx-pragma-storybook", "published_at": "2020-01-06T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb3f1f04d6", "title": "Sync a Git Remote Fork with Upstream", "url": "https://www.duncanleung.com/blog/git-sync-remote-upstream-fork", "published_at": "2019-12-18T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb3f40e5de", "title": "Testing ValidationSchema Formik Forms", "url": "https://www.duncanleung.com/blog/testing-validation-schema-formik-form", "published_at": "2019-12-03T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb3f8037b6", "title": "What is, if __name__ == \"__main__\":", "url": "https://www.duncanleung.com/blog/python-name-main-pattern", "published_at": "2019-12-02T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb3f979eaa", "title": "Setting Up Python: pyenv, pyenv-virtualenv, poetry", "url": "https://www.duncanleung.com/blog/set-up-python-pyenv-virtualenv-poetry", "published_at": "2019-11-27T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb408615a9", "title": "Fixing Netlify Build Fail - error #98123 WEBPACK", "url": "https://www.duncanleung.com/blog/fixing-netlify-build-fail", "published_at": "2019-11-26T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb41195dc2", "title": "Hacktoberfest Orange County Meetup", "url": "https://www.duncanleung.com/blog/hacktoberfest-oc-meetup", "published_at": "2018-10-16T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb419e68b5", "title": "Testing Formik 'onSubmit' with Jest", "url": "https://www.duncanleung.com/blog/testing-formik-form-onsubmit", "published_at": "2018-10-15T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb42570780", "title": "Fixing React Warning: Synthetic Events in setState()", "url": "https://www.duncanleung.com/blog/fixing-react-warning-synthetic-events-in-setstate", "published_at": "2017-08-14T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb425d14f6", "title": "Pure render() 'this' Binding Patterns in React", "url": "https://www.duncanleung.com/blog/react-pure-render-this-binding-patterns", "published_at": "2017-08-02T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb4354bc86", "title": "webpack: Building React For Production on Windows", "url": "https://www.duncanleung.com/blog/webpack-build-react-production-windows", "published_at": "2017-07-31T00:00:00+00:00" }, { "id": "01a08770-60b2-70f8-a23e-0ecb43841cb0", "title": "Avoiding React setState() Pitfalls", "url": "https://www.duncanleung.com/blog/avoiding-react-setstate-pitfalls", "published_at": "2017-07-15T00:00:00+00:00" } ] posts Claim your blog
Back to duncanleung.com
Blog · corpus.blog/blogs/duncanleung.com/posts

duncanleung.com

duncanleung.com

2026

2025

2024

2023

2022

2021

2020

2019

2018

2017