{"id":104,"date":"2026-01-26T12:24:46","date_gmt":"2026-01-26T12:24:46","guid":{"rendered":"https:\/\/joeltan.me\/?p=104"},"modified":"2026-01-26T12:34:08","modified_gmt":"2026-01-26T12:34:08","slug":"using-an-ai-agent-for-code-review-without-letting-it-merge-code","status":"publish","type":"post","link":"https:\/\/joeltan.me\/?p=104","title":{"rendered":"Using an AI Agent for Code Review (Without Letting It Merge Code)"},"content":{"rendered":"\n<p>Code review is where good systems stay good and where most teams run out of time.<\/p>\n\n\n\n<p>This post walks through a real, production-safe setup where an AI agent performs <em>first-pass code reviews<\/em> automatically when a pull request is assigned to me, inside a GitHub pipeline.<\/p>\n\n\n\n<p>No auto-merge. No authority. Just structured feedback, grounded in the actual diff.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Problem: Reviews Do Not Scale, Risk Does<\/h2>\n\n\n\n<p>In theory:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Every PR gets careful review<\/li>\n\n\n\n<li>Standards are applied consistently<\/li>\n\n\n\n<li>Subtle issues are caught early<\/li>\n<\/ul>\n\n\n\n<p>In reality:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Reviews happen late<\/li>\n\n\n\n<li>Fatigue lowers quality<\/li>\n\n\n\n<li>&#8220;Looks good to me&#8221; sneaks in<\/li>\n<\/ul>\n\n\n\n<p>The goal here is not to replace reviewers. It is to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Reduce cognitive load<\/li>\n\n\n\n<li>Catch obvious issues early<\/li>\n\n\n\n<li>Let humans focus on judgment<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Design Principle: AI as Reviewer, Not Judge<\/h2>\n\n\n\n<p>Hard rules:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>AI cannot approve PRs<\/li>\n\n\n\n<li>AI cannot push commits<\/li>\n\n\n\n<li>AI cannot comment inline without context<\/li>\n\n\n\n<li>AI output is advisory only<\/li>\n<\/ul>\n\n\n\n<p>Think of it as a tireless junior reviewer who reads the whole diff, applies consistent rules, and never rushes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Trigger: When a PR Is Assigned to Me<\/h2>\n\n\n\n<p>GitHub gives us a clean signal:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>A pull request review is requested from a user.<\/p>\n<\/blockquote>\n\n\n\n<p>This avoids noise on every PR and reviewing code you will never touch. We trigger only when:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>review_requested<\/li>\n\n\n\n<li>reviewer == me<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">High-Level Architecture<\/h2>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nGitHub PR Event\n      \u2502\n      \u25bc\nGitHub Actions\n      \u2502\n      \u25bc\nAI Review Agent\n      \u2502\n      \u25bc\nStructured Review Comment\n      \u2502\n      \u25bc\nHuman Review\n\n<\/pre><\/div>\n\n\n<p>Key idea: The agent reviews <strong>diffs<\/strong>, not repositories.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">GitHub Actions Workflow<\/h2>\n\n\n\n<p>Here is a minimal but real workflow.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: yaml; title: ; notranslate\" title=\"\">\nname: AI Code Review\n\non:\n  pull_request:\n    types: &#x5B;review_requested]\n\njobs:\n  ai-review:\n    if: github.event.requested_reviewer.login == &#039;your-github-username&#039;\n    runs-on: ubuntu-latest\n\n    steps:\n      - name: Checkout code\n        uses: actions\/checkout@v4\n        with:\n          fetch-depth: 0\n\n      - name: Get PR diff\n        run: |\n          git fetch origin ${{ github.event.pull_request.base.ref }}\n          git diff origin\/${{ github.event.pull_request.base.ref }}...HEAD &gt; diff.txt\n\n      - name: Run AI review agent\n        run: |\n          docker run --rm -v $PWD:\/workspace ai-review-agent:latest \/workspace\/diff.txt\n\n<\/pre><\/div>\n\n\n<p>This keeps the agent isolated, stateless, and reproducible.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The AI Review Agent (Real Code)<\/h2>\n\n\n\n<p>The agent reads the diff, applies rules, and produces a structured report.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\nimport sys\nfrom pathlib import Path\n\ndiff = Path(sys.argv&#x5B;1]).read_text()\n\nissues = &#x5B;]\n\nif &quot;print(&quot; in diff:\n    issues.append({\n        &quot;severity&quot;: &quot;low&quot;,\n        &quot;message&quot;: &quot;Debug print statements found. Consider removing before merge.&quot;\n    })\n\nif &quot;TODO&quot; in diff:\n    issues.append({\n        &quot;severity&quot;: &quot;medium&quot;,\n        &quot;message&quot;: &quot;TODO comments present in diff. Confirm if intentional.&quot;\n    })\n\nreport = {\n    &quot;summary&quot;: f&quot;{len(issues)} potential issues found&quot;,\n    &quot;issues&quot;: issues\n}\n\nprint(report)\n\n<\/pre><\/div>\n\n\n<p>In real usage, the agent also checks test coverage changes, migration safety, config drift, and anti-patterns specific to your stack.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Posting the Review Back to GitHub<\/h2>\n\n\n\n<p>The agent does not comment directly. Instead, the pipeline posts a single, consolidated comment.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\ngh pr comment $PR_NUMBER --body &quot;$(cat review_output.md)&quot;\n\n<\/pre><\/div>\n\n\n<p>Why one comment?<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Less noise<\/li>\n\n\n\n<li>Easier to reason about<\/li>\n\n\n\n<li>Clear ownership<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Example Output (What I Actually See)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">AI Review Summary<\/h3>\n\n\n\n<p><strong>2 potential issues found<\/strong><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Medium<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>TODO comments present in diff. Confirm if intentional.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Low<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Debug print statements found. Consider removing before merge.<\/li>\n<\/ul>\n\n\n\n<p><em>No blocking issues detected.<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why This Works in Practice<\/h2>\n\n\n\n<p>Because the agent is consistent, the scope is limited, the output is reviewable, and humans stay accountable. Bad ideas do not slip through quietly.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Guardrails I Will Not Compromise On<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>No auto-approvals<\/li>\n\n\n\n<li>No inline commenting spam<\/li>\n\n\n\n<li>No learning from private repos<\/li>\n\n\n\n<li>No credentials beyond read-only<\/li>\n<\/ul>\n\n\n\n<p>If an agent can merge code, it is not a reviewer: it is a risk.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Final Thought<\/h2>\n\n\n\n<p>AI does not make reviews faster. It makes them calmer. And calm reviewers make better decisions.<\/p>\n\n\n","protected":false},"excerpt":{"rendered":"<p>Code review is where systems stay good, but it is also where teams burn out. This guide shows you how to deploy a &#8220;tireless junior reviewer&#8221; using GitHub Actions\u2014an AI agent that provides structured feedback without the risks of auto-merging or authority.<\/p>\n","protected":false},"author":1,"featured_media":109,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","footnotes":"[]"},"categories":[4],"tags":[],"class_list":["post-104","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-engineering-ai-beyond-the-prompt"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Using an AI Agent for Code Review (Without Letting It Merge Code) - Joel Tan Tech Blogs<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/joeltan.me\/?p=104\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Using an AI Agent for Code Review (Without Letting It Merge Code) - Joel Tan Tech Blogs\" \/>\n<meta property=\"og:description\" content=\"Code review is where systems stay good, but it is also where teams burn out. This guide shows you how to deploy a &quot;tireless junior reviewer&quot; using GitHub Actions\u2014an AI agent that provides structured feedback without the risks of auto-merging or authority.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/joeltan.me\/?p=104\" \/>\n<meta property=\"og:site_name\" content=\"Joel Tan Tech Blogs\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-26T12:24:46+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-01-26T12:34:08+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/joeltan.me\/wp-content\/uploads\/2026\/01\/abstract-illustration-of-ai-with-silhouette-head-full-of-eyes-symbolizing-observation-and-technology.-8849295-scaled.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1707\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Joel Tan\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Joel Tan\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/joeltan.me\/?p=104#article\",\"isPartOf\":{\"@id\":\"https:\/\/joeltan.me\/?p=104\"},\"author\":{\"name\":\"Joel Tan\",\"@id\":\"https:\/\/joeltan.me\/#\/schema\/person\/db13342201787db723bfdeadcd792743\"},\"headline\":\"Using an AI Agent for Code Review (Without Letting It Merge Code)\",\"datePublished\":\"2026-01-26T12:24:46+00:00\",\"dateModified\":\"2026-01-26T12:34:08+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/joeltan.me\/?p=104\"},\"wordCount\":435,\"commentCount\":0,\"image\":{\"@id\":\"https:\/\/joeltan.me\/?p=104#primaryimage\"},\"thumbnailUrl\":\"https:\/\/joeltan.me\/wp-content\/uploads\/2026\/01\/abstract-illustration-of-ai-with-silhouette-head-full-of-eyes-symbolizing-observation-and-technology.-8849295-scaled.jpg\",\"articleSection\":[\"Engineering AI: Beyond the Prompt\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/joeltan.me\/?p=104#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/joeltan.me\/?p=104\",\"url\":\"https:\/\/joeltan.me\/?p=104\",\"name\":\"Using an AI Agent for Code Review (Without Letting It Merge Code) - Joel Tan Tech Blogs\",\"isPartOf\":{\"@id\":\"https:\/\/joeltan.me\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/joeltan.me\/?p=104#primaryimage\"},\"image\":{\"@id\":\"https:\/\/joeltan.me\/?p=104#primaryimage\"},\"thumbnailUrl\":\"https:\/\/joeltan.me\/wp-content\/uploads\/2026\/01\/abstract-illustration-of-ai-with-silhouette-head-full-of-eyes-symbolizing-observation-and-technology.-8849295-scaled.jpg\",\"datePublished\":\"2026-01-26T12:24:46+00:00\",\"dateModified\":\"2026-01-26T12:34:08+00:00\",\"author\":{\"@id\":\"https:\/\/joeltan.me\/#\/schema\/person\/db13342201787db723bfdeadcd792743\"},\"breadcrumb\":{\"@id\":\"https:\/\/joeltan.me\/?p=104#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/joeltan.me\/?p=104\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/joeltan.me\/?p=104#primaryimage\",\"url\":\"https:\/\/joeltan.me\/wp-content\/uploads\/2026\/01\/abstract-illustration-of-ai-with-silhouette-head-full-of-eyes-symbolizing-observation-and-technology.-8849295-scaled.jpg\",\"contentUrl\":\"https:\/\/joeltan.me\/wp-content\/uploads\/2026\/01\/abstract-illustration-of-ai-with-silhouette-head-full-of-eyes-symbolizing-observation-and-technology.-8849295-scaled.jpg\",\"width\":2560,\"height\":1707,\"caption\":\"Abstract illustration of AI with silhouette head full of eyes, symbolizing observation and technology.\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/joeltan.me\/?p=104#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/joeltan.me\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Using an AI Agent for Code Review (Without Letting It Merge Code)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/joeltan.me\/#website\",\"url\":\"https:\/\/joeltan.me\/\",\"name\":\"Joel Tan Tech Blogs\",\"description\":\"Building systems that survive real life\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/joeltan.me\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/joeltan.me\/#\/schema\/person\/db13342201787db723bfdeadcd792743\",\"name\":\"Joel Tan\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/joeltan.me\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/d9b5d1ab218cb2478280027d371ea60543f6551132d31a8cbd45a5a5b3fbadc9?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/d9b5d1ab218cb2478280027d371ea60543f6551132d31a8cbd45a5a5b3fbadc9?s=96&d=mm&r=g\",\"caption\":\"Joel Tan\"},\"sameAs\":[\"http:\/\/192.168.1.146\"],\"url\":\"https:\/\/joeltan.me\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Using an AI Agent for Code Review (Without Letting It Merge Code) - Joel Tan Tech Blogs","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/joeltan.me\/?p=104","og_locale":"en_US","og_type":"article","og_title":"Using an AI Agent for Code Review (Without Letting It Merge Code) - Joel Tan Tech Blogs","og_description":"Code review is where systems stay good, but it is also where teams burn out. This guide shows you how to deploy a \"tireless junior reviewer\" using GitHub Actions\u2014an AI agent that provides structured feedback without the risks of auto-merging or authority.","og_url":"https:\/\/joeltan.me\/?p=104","og_site_name":"Joel Tan Tech Blogs","article_published_time":"2026-01-26T12:24:46+00:00","article_modified_time":"2026-01-26T12:34:08+00:00","og_image":[{"width":2560,"height":1707,"url":"https:\/\/joeltan.me\/wp-content\/uploads\/2026\/01\/abstract-illustration-of-ai-with-silhouette-head-full-of-eyes-symbolizing-observation-and-technology.-8849295-scaled.jpg","type":"image\/jpeg"}],"author":"Joel Tan","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Joel Tan","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/joeltan.me\/?p=104#article","isPartOf":{"@id":"https:\/\/joeltan.me\/?p=104"},"author":{"name":"Joel Tan","@id":"https:\/\/joeltan.me\/#\/schema\/person\/db13342201787db723bfdeadcd792743"},"headline":"Using an AI Agent for Code Review (Without Letting It Merge Code)","datePublished":"2026-01-26T12:24:46+00:00","dateModified":"2026-01-26T12:34:08+00:00","mainEntityOfPage":{"@id":"https:\/\/joeltan.me\/?p=104"},"wordCount":435,"commentCount":0,"image":{"@id":"https:\/\/joeltan.me\/?p=104#primaryimage"},"thumbnailUrl":"https:\/\/joeltan.me\/wp-content\/uploads\/2026\/01\/abstract-illustration-of-ai-with-silhouette-head-full-of-eyes-symbolizing-observation-and-technology.-8849295-scaled.jpg","articleSection":["Engineering AI: Beyond the Prompt"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/joeltan.me\/?p=104#respond"]}]},{"@type":"WebPage","@id":"https:\/\/joeltan.me\/?p=104","url":"https:\/\/joeltan.me\/?p=104","name":"Using an AI Agent for Code Review (Without Letting It Merge Code) - Joel Tan Tech Blogs","isPartOf":{"@id":"https:\/\/joeltan.me\/#website"},"primaryImageOfPage":{"@id":"https:\/\/joeltan.me\/?p=104#primaryimage"},"image":{"@id":"https:\/\/joeltan.me\/?p=104#primaryimage"},"thumbnailUrl":"https:\/\/joeltan.me\/wp-content\/uploads\/2026\/01\/abstract-illustration-of-ai-with-silhouette-head-full-of-eyes-symbolizing-observation-and-technology.-8849295-scaled.jpg","datePublished":"2026-01-26T12:24:46+00:00","dateModified":"2026-01-26T12:34:08+00:00","author":{"@id":"https:\/\/joeltan.me\/#\/schema\/person\/db13342201787db723bfdeadcd792743"},"breadcrumb":{"@id":"https:\/\/joeltan.me\/?p=104#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/joeltan.me\/?p=104"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/joeltan.me\/?p=104#primaryimage","url":"https:\/\/joeltan.me\/wp-content\/uploads\/2026\/01\/abstract-illustration-of-ai-with-silhouette-head-full-of-eyes-symbolizing-observation-and-technology.-8849295-scaled.jpg","contentUrl":"https:\/\/joeltan.me\/wp-content\/uploads\/2026\/01\/abstract-illustration-of-ai-with-silhouette-head-full-of-eyes-symbolizing-observation-and-technology.-8849295-scaled.jpg","width":2560,"height":1707,"caption":"Abstract illustration of AI with silhouette head full of eyes, symbolizing observation and technology."},{"@type":"BreadcrumbList","@id":"https:\/\/joeltan.me\/?p=104#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/joeltan.me\/"},{"@type":"ListItem","position":2,"name":"Using an AI Agent for Code Review (Without Letting It Merge Code)"}]},{"@type":"WebSite","@id":"https:\/\/joeltan.me\/#website","url":"https:\/\/joeltan.me\/","name":"Joel Tan Tech Blogs","description":"Building systems that survive real life","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/joeltan.me\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/joeltan.me\/#\/schema\/person\/db13342201787db723bfdeadcd792743","name":"Joel Tan","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/joeltan.me\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/d9b5d1ab218cb2478280027d371ea60543f6551132d31a8cbd45a5a5b3fbadc9?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d9b5d1ab218cb2478280027d371ea60543f6551132d31a8cbd45a5a5b3fbadc9?s=96&d=mm&r=g","caption":"Joel Tan"},"sameAs":["http:\/\/192.168.1.146"],"url":"https:\/\/joeltan.me\/?author=1"}]}},"_links":{"self":[{"href":"https:\/\/joeltan.me\/index.php?rest_route=\/wp\/v2\/posts\/104","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/joeltan.me\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/joeltan.me\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/joeltan.me\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/joeltan.me\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=104"}],"version-history":[{"count":3,"href":"https:\/\/joeltan.me\/index.php?rest_route=\/wp\/v2\/posts\/104\/revisions"}],"predecessor-version":[{"id":108,"href":"https:\/\/joeltan.me\/index.php?rest_route=\/wp\/v2\/posts\/104\/revisions\/108"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/joeltan.me\/index.php?rest_route=\/wp\/v2\/media\/109"}],"wp:attachment":[{"href":"https:\/\/joeltan.me\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=104"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/joeltan.me\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=104"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/joeltan.me\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=104"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}