Category Archives: Programming

AI in CI Should Not Replace Your Tools. It Should Read the Evidence.

In Part 1, I compared three approaches to AI-assisted code review: hosted Codex review, a repository-owned GitHub Action using Codex, and CodeRabbit. That experiment intentionally focused on one stage of the pull request lifecycle: review comments on code.

This article moves one step wider.

Once a pull request is opened, code review is only one part of the continuous integration story. A real CI pipeline also has static analysis, security checks, unit/API tests, maybe dynamic analysis, and some final judgement about whether the PR is ready for a human reviewer.

The question I wanted to answer was not:

Can AI replace CI tools?

That is the wrong framing.

The better framing is:

Can deterministic tools produce evidence, and can AI turn that evidence into a useful reviewer-facing judgement?

That is the architecture I tested.

The design principle

The core design principle is simple:

Deterministic tools produce evidence.
AI interprets the evidence.
The human reviewer makes the final decision.

AI is not the linter. AI is not the security scanner. AI is not the test runner. AI should not be trusted as the source of truth for whether code actually passed.

Instead:

  • The static-analysis tool should decide whether linting and formatting passed.
  • The security scanner should report known security patterns.
  • The test framework should execute tests.
  • AI can generate additional targeted tests based on the PR diff.
  • pytest should still execute those AI-generated tests.
  • AI can then read the outputs and produce a final review summary.

In my experiment, those tools were Ruff, Bandit, and pytest. In another company, they could be different. A Java service might use Checkstyle, SpotBugs, PMD, Semgrep, Maven, Gradle, JUnit, or Snyk. A JavaScript service might use ESLint, TypeScript, npm audit, Playwright, Jest, or Vitest. A mobile team might use SwiftLint, Detekt, XCTest, Espresso, or Appium.

The specific tool is not the point. The point is that each tool should do the thing it is built to do. AI should assist around those tools: fill gaps, generate targeted probes, correlate outputs, and produce a reviewer-facing summary.

That gives us a more scalable pattern than asking one model to “review everything.”

The experiment

I used the same repository from the code-review experiment:

The base workflow is implemented in .github/workflows/ci-evidence-report.yml. During the blocked-path experiment, I added a deterministic evidence summary and a separate readiness gate; that refined seven-stage version is preserved in the PR #8 experiment commit.

The AI prompts live in:

The base workflow has five core jobs. The refined experiment adds two orchestration jobs, producing seven distinct stages:

  1. Static analysis
  2. Security analysis
  3. Backend unit/API tests
  4. AI-generated targeted tests
  5. Deterministic CI evidence summary
  6. AI final reviewer report
  7. CI readiness gate

The workflow also uploads artifacts between jobs. That matters because the AI final-report job should not rely on vague impressions. It should read concrete outputs: Ruff JSON, Ruff format output, Bandit JSON, pytest XML/output, and generated-test output. GitHub Actions artifacts are designed for exactly this kind of cross-job evidence sharing.

What the AI was instructed to do

There were two separate AI responsibilities, with two separate prompts.

The first prompt, targeted-test-generation.md, asks the AI to inspect the PR diff and generate temporary pytest tests only when the changed behavior justifies it. The important constraints are:

  • focus on risky changed backend behavior;
  • generate tests under the allowed temporary path only;
  • do not modify production code;
  • do not treat the model’s judgement as the test result;
  • let pytest execute the generated tests.

The second prompt, ci-final-report.md, asks the AI to read the evidence artifacts and produce a PR comment for the manual reviewer. It is not supposed to invent results. It reads files like:

  • static-analysis-results/ruff-check.json
  • static-analysis-results/ruff-format.txt
  • security-analysis-results/bandit.json
  • backend pytest output
  • AI-targeted pytest output

That final report should answer a different question from the test-generation prompt:

Given all the evidence, is this PR ready for manual review, and where should the reviewer focus?

What the pipeline looked like

At a high level, the pipeline looked like this:

Deterministic checks control readiness. AI turns their evidence into a reviewer-facing explanation.

The diagram shows the refined architecture. The separate evidence-summary and readiness-gate jobs were added while iterating on PR #8; the earlier clean PR #11 run used the five-job base workflow.

The “AI code review” box is the bridge to the first article. In the actual Blog 2 workflow, I focused on CI evidence. But in a complete implementation, code-review findings should also become one more input to the final reviewer report.

The most important detail is the separation between generation and execution.

For AI-generated tests, Codex is allowed to write a temporary pytest file under a controlled path:

ci-generated-tests/backend/test_pr_targeted.py

But Codex does not decide whether the tests pass. pytest does.

That distinction is important. The model can suggest a hypothesis. The test runner proves or disproves it.

Static analysis: let the deterministic tool do its job

For static analysis, I used Ruff:

ruff check backend --output-format=json
ruff format --check backend

Ruff is fast, deterministic, and well suited to CI. This is exactly the kind of work AI should not replace.

In another stack, replace Ruff with the tool the team already trusts. The workflow remains the same: run the tool, store the output, and let AI interpret that output alongside other CI signals.

One practical lesson showed up immediately: the existing repo baseline was not fully Ruff-clean. That created noise. So I first created a baseline cleanup PR:

That PR is not the core blog experiment. It was housekeeping. But it was necessary because PR-level CI evidence becomes much clearer when the baseline is already clean.

This is a general lesson: before you use CI evidence to judge a PR, decide whether your tools are checking the whole repo, changed files, or changed lines. If the baseline is noisy, the AI report will also become noisy.

Security analysis: deterministic scanner first, AI second

For security analysis, I used Bandit:

bandit -r backend/app -f json -o ci-results/security/bandit.json

Bandit is a static security scanner for Python. In this experiment, it was not meant to prove the application is secure. It was meant to provide a deterministic signal for known classes of Python security issues.

That distinction matters.

If Bandit finds a high-signal issue, the AI report can explain the impact and connect it to the PR. If Bandit finds nothing, the AI report should not overstate that as “the code is secure.” It should say something closer to:

Bandit did not report findings in the scanned backend application code. This does not prove runtime authorization, data access, or business-logic security.

That is the kind of nuance AI is useful for.

Testing: existing tests plus AI-generated targeted tests

There are three different testing layers that are easy to confuse:

  1. Tests the developer writes before opening the PR.
  2. Existing CI tests that protect known behavior.
  3. Temporary AI-generated targeted tests created from the PR diff.

This experiment focused on the second and third.

The normal backend test job ran the existing pytest suite. Separately, the AI-targeted-test job asked Codex to inspect the PR diff and generate a temporary pytest file for risky changed behavior.

The generated tests were not committed back to the repository. They were CI evidence.

That is a useful pattern. AI-generated tests do not have to become permanent tests every time. They can still be valuable as temporary review probes:

  • Does this PR change an authorization path?
  • Does this PR change field mapping?
  • Does this PR change input normalization?
  • Does this PR change error behavior?

If the generated test exposes a defect, the PR should be blocked. If the generated test is genuinely useful long term, the developer can convert it into a committed regression test.

That last point matters. AI-generated tests should not remain temporary forever if they expose a real gap. Once a targeted generated test catches an important issue, the baseline test suite should be updated with a durable version of that test. Otherwise the pipeline has to rediscover the same risk again in a future PR.

The bad-path PR

To test whether the pipeline could catch real problems, I created an intentionally bad PR:

This PR intentionally included multiple defects:

  • an access-control regression;
  • a registration-correction mapping bug;
  • a security-pattern issue for Bandit/static security evidence.

The result was what we wanted: deterministic jobs produced evidence, the AI-generated targeted tests failed, and the CI readiness gate blocked the PR.

The blocked path: evidence was produced successfully, but the readiness gate failed.

The static-analysis and security-analysis jobs appear green because they completed their work and uploaded evidence instead of stopping the workflow immediately. Their tool-status files still recorded failures. The readiness gate read those internal statuses and blocked the PR. This allowed the AI report to be generated even when scanners found problems.

The important part is not just that something failed. The important part is that the workflow made the failure explainable.

The final report could say:

  • Ruff/Bandit/backend tests produced their respective signals.
  • The AI-generated targeted tests found blocking evidence.
  • The PR is not ready for merge.
  • The manual reviewer should focus on the authorization and mapping behavior.

That is much more useful than a generic failed check.

The AI report explains why the PR is blocked and where the reviewer should focus.

There is an important status distinction here. The AI final reviewer report job can be green even when the PR is blocked. Green means the report was generated and published successfully. It does not mean the report recommends merging. The separate CI readiness gate represents whether the underlying evidence passed.

The good-path PR

I also created a clean PR:

This PR added a small, legitimate backend behavior change:

  • normalize medical registration corrections;
  • add a focused unit test for that normalization.

The result was the good path:

  • Static analysis passed.
  • Security analysis passed.
  • Existing backend tests passed.
  • AI-generated targeted tests passed.
  • AI final reviewer report passed.

The clean path: the five-job base workflow completed successfully.

This clean run predates the separate readiness-gate job added on PR #8, so I am not claiming that PR #11 executed that later check. It demonstrates the clean evidence path and a “ready for manual review” AI report; PR #8 demonstrates the explicit gate behavior.

The final AI report did not merely say “all green.” It summarized the evidence and still told the human reviewer where to focus:

Even on the clean path, the report gives the human reviewer a concrete focus area.

This is the workflow I want from AI in CI: not blind approval, not replacement of the reviewer, but a compact evidence report.

Constrain the AI job

There is one security point that should not be treated as an implementation detail.

If an AI agent runs inside CI, it should run with limited permissions.

In this experiment:

  • deterministic jobs used read-only repository access;
  • the AI test-generation job could write only inside the runner workspace;
  • generated tests were restricted to one expected path;
  • the final report job had permission to write a PR comment, but not to merge;
  • expensive AI jobs were label-gated;
  • the workflow used sandboxing and privilege reduction options exposed by openai/codex-action.

The enforcement happens in the workflow file itself: .github/workflows/ci-evidence-report.yml.

The practical controls are:

  • GitHub Actions permissions blocks, such as contents: read, so jobs do not receive unnecessary repository permissions.
  • pull-requests: write only on the final-report job, because that job needs to post a PR comment.
  • sandbox: workspace-write for Codex so it can write generated tests only inside the checked-out workspace.
  • safety-strategy: drop-sudo so Codex does not keep elevated runner privileges.
  • codex-args: '["--ephemeral"]' so the Codex run does not persist unnecessary state.
  • a scope-verification step that checks git status and fails if Codex modifies anything outside the expected generated-test file.
  • label gating with ci-ai-report, so expensive AI jobs run only when intentionally requested.

That is the right default posture.

An AI job in CI should not inherit broad write permissions just because it is convenient. Treat it like any other automation: give it the minimum access required for the specific job.

What does this architecture cost?

There are four different costs in this design:

  1. The deterministic tools.
  2. GitHub Actions runner time and artifact storage.
  3. AI model usage.
  4. Engineering time to build and maintain the orchestration.

Ruff, Bandit, and pytest are open source, so this experiment did not add license fees for those tools. An enterprise could substitute commercial scanners or test platforms, which would add their own licensing costs without changing the architecture.

The workflow has two AI calls when the ci-ai-report label is present:

  • one to generate targeted tests;
  • one to create the final reviewer report.

For a concrete planning example, assume those two calls together use 150,000 input tokens and 10,000 output tokens for one labeled PR run. That is an illustrative workload, not a measurement of the experiment’s actual bill. The workflow did not pin a model, and real usage depends on diff size, repository context, generated tests, evidence volume, caching, and retries.

Using current public API prices, that workload would cost approximately:

Reference modelInput price per 1M tokensOutput price per 1M tokensIllustrative cost per labeled PR run
GPT-5.4 mini$0.75$4.50About $0.16
GPT-5.4$2.50$15.00About $0.53

The corresponding uncached monthly model-cost estimates are:

Labeled AI-assisted CI runs per monthGPT-5.4 mini referenceGPT-5.4 reference
100About $16About $53
250About $39About $131
500About $79About $263

GitHub runner time is additional. GitHub currently lists a standard two-core Linux runner at $0.006 per minute beyond any included allowance. If the complete workflow consumes an illustrative 20 billable runner-minutes across its jobs, that is about $0.12 per PR run, or $12 for 100 runs. Public-repository rules, included minutes, job-level rounding, artifact storage, and the actual duration of each job can change that number.

If the Part 1 AI code review is also executed as another model-backed job inside the same orchestration, its token and runner usage must be added. Dynamic analysis would similarly add application-startup time, scanner time, and possibly commercial tool licensing.

The direct usage cost can therefore be modest. The larger cost in the repository-owned approach is engineering ownership: prompts, schemas, permissions, artifacts, inline publication, deduplication, retries, gates, and ongoing maintenance.

Could CodeRabbit replace this GitHub Actions workflow?

CodeRabbit can cover parts of this workflow. Its Pro plan includes AI pull-request review plus linter and SAST-tool support. Pro+ adds capabilities around the review process, including unit-test generation and other finishing actions.

But I would not describe CodeRabbit and this GitHub Actions pipeline as exact substitutes.

The Blog 2 experiment used GitHub Actions for the complete evidence flow. I did not run an equivalent end-to-end CodeRabbit experiment combining the same Ruff, Bandit, pytest, temporary-test, artifact, readiness-gate, and final-report stages. The comparison here is therefore architectural and economic, not a claim that both implementations were tested identically.

AreaRepository-owned GitHub ActionsCodeRabbit
OrchestrationFully controlled in the repositoryProduct-managed with configuration controls
Tool selectionAny tool the runner can executeSupported product integrations and features
Model choiceTeam chooses the model; changing provider means replacing the AI step or adapterCodeRabbit controls model routing
Evidence formatTeam owns artifacts, schemas, gates, and report formatProduct-defined workflow and reporting
Custom test executionFully programmableProduct capability, with unit-test generation on Pro+
Dynamic analysisCan add any start-and-scan jobDepends on supported integrations and product workflow
Operational effortHighestLower because the product owns the review machinery
Pricing shapeRunner usage + model usage + engineering timePrimarily per-developer subscription, with plan limits and add-ons

Current annual-billing prices list CodeRabbit Pro at $24 per developer per month and Pro+ at $48 per developer per month. For a five-developer team, that is $120 or $240 per month before any applicable usage add-ons.

For comparison, 100 labeled GitHub Actions runs under the assumptions above would be roughly $16 to $53 in model usage, plus an illustrative $12 in billable Linux runner time. That makes the repository-owned path look cheaper in direct usage—but it excludes the engineering time required to build and operate everything CodeRabbit packages as a product.

My preference for this broader CI architecture is GitHub Actions because it provides the maximum flexibility. The team can select the deterministic tools, choose the AI model, define permissions, decide what blocks the PR, add dynamic analysis later, and control exactly what the final reviewer sees.

That does not mean CodeRabbit has no place. A practical hybrid is to use GitHub Actions as the CI evidence backbone and feed CodeRabbit—or another dedicated reviewer’s findings—into the final evidence report as the code-review signal from Part 1.

A useful edge case: no generated tests

One of the most useful lessons came from a failure in the workflow itself.

On a formatting-only PR, Codex correctly decided that no targeted tests were needed. It created a placeholder pytest file explaining that no targeted backend test was generated.

That was logically correct.

But pytest collected zero tests and exited with code 5. According to pytest’s documented exit codes, exit code 5 means no tests were collected. GitHub Actions treated that as a failed job.

So the AI decision was right, but the CI wrapper was wrong.

The workflow now treats this specific case as non-blocking:

if [ "$pytest_status" -eq 5 ] && \
grep -q "collected 0 items" ci-results/ai-targeted-tests/pytest-output.txt; then
pytest_status=0
fi

That keeps the semantics clean:

  • generated tests fail: block the PR;
  • no generated tests needed: pass;
  • scope violations: block the PR;
  • real pytest failures: block the PR.

This is a small implementation detail, but it is an important design lesson: AI-generated CI steps need explicit no-op semantics. Otherwise a correct AI decision can become a false CI failure.

What about dynamic analysis?

Dynamic analysis is still important. Tools like OWASP ZAP can scan a running application and catch issues that static analysis cannot see.

But I did not include dynamic analysis in this experiment.

That does not change the architecture.

Dynamic analysis would simply become another deterministic evidence producer:

Start app in CI
Run dynamic scan
Upload scan output
AI final report reads scan output
Human reviewer gets the combined summary

The reason I skipped it here is practical scope. Dynamic analysis introduces extra operational concerns:

  • starting the application in CI;
  • configuring test-safe environment variables;
  • database or dependency setup;
  • authentication/session handling;
  • seed data;
  • scan tuning to avoid noisy findings;
  • deciding whether the scan is advisory or merge-blocking.

Those are real topics, but they do not change the core AI-assisted CI workflow. They are a next extension, not a prerequisite for proving the pattern.

For this article, Ruff + Bandit + pytest + AI-generated targeted tests were enough to validate the architecture.

What this means for AI-assisted CI

The experiment made the boundary clearer for me.

AI is useful in CI when it does things deterministic tools cannot do well:

  • read multiple tool outputs together;
  • connect failures back to PR intent;
  • explain whether a finding is likely introduced by the PR;
  • generate targeted tests for changed behavior;
  • tell the manual reviewer where to focus;
  • summarize uncertainty instead of hiding it.

AI is weaker when it tries to replace purpose-built tools:

  • linting;
  • formatting;
  • dependency scanning;
  • security pattern matching;
  • test execution;
  • coverage calculation;
  • merge gating.

The scalable approach is not “AI does CI.”

The scalable approach is:

CI tools produce structured evidence.
AI reads the evidence.
The reviewer gets a decision-ready summary.

Practical recommendations

If I were applying this pattern across projects, I would start with these rules.

1. Keep deterministic checks deterministic

Use existing tools for static analysis, security analysis, and test execution. Do not ask the model to decide whether formatting passed or whether a test passed.

2. Store outputs as artifacts

The AI report should read artifacts, not screenshots or vague logs. GitHub Actions artifacts make this straightforward.

3. Separate AI generation from execution

Let AI generate targeted tests, but run them with the normal test framework.

4. Label-gate expensive AI jobs

In the experiment, AI-generated tests and the final AI report were gated behind a label:

ci-ai-report

That gives control over cost and avoids running expensive AI jobs on every trivial PR.

5. Create a clear no-op path

If no targeted tests are needed, that should be a successful outcome, not a failed job.

6. Keep the final human reviewer in control

The AI report should recommend readiness. It should not silently merge code.

7. Pin and measure the production model

Choose the model deliberately, record actual token and runner usage, and set a budget per AI stage. Planning estimates are useful, but production cost controls should be based on measured runs from the team’s real PR distribution.

Final takeaway

The best role for AI in CI is not replacing the pipeline.

It is making the pipeline readable.

Static analysis, security scanners, and tests already know how to produce signals. The problem is that those signals are often scattered across logs, artifacts, comments, and check statuses.

AI can turn those signals into a coherent review brief:

  • what passed;
  • what failed;
  • what matters;
  • what is probably introduced by the PR;
  • what the human reviewer should inspect next.

That is a practical use of AI in CI.

Not magic. Not autonomous merging. Just better evidence flow.

Experiment references

Implementation files

Tool references

AI Code Review in CI: Codex Cloud vs GitHub Actions vs CodeRabbit

I have been thinking about how AI should fit into CI/CD. Not the part where a developer uses an AI coding agent before opening a pull request. That is important, but it is still developer workflow.

The part I wanted to test was what happens after the pull request is opened.

At that point, a normal CI pipeline already has several responsibilities:

  • Run tests.
  • Run static analysis.
  • Run security checks.
  • Possibly run dynamic or integration checks.
  • Give reviewers useful evidence before a human approves the change.

AI can fit into this, but it should not replace every deterministic tool. Linters, type checkers, test frameworks, dependency scanners, and security scanners are still valuable because they are repeatable. The interesting question is where an AI reviewer adds judgment: finding logical defects, interpreting tool output, spotting missing tests, and giving a reviewer a concise explanation of risk.

This first experiment focuses only on AI code review for pull requests. I compared three approaches:

  1. Hosted Codex Cloud code review
  2. A repository-owned GitHub Action using Codex
  3. CodeRabbit

The broader CI question — static analysis, dynamic analysis, security tooling, and testing with AI interpreting the results — is covered in Part 2: AI in CI Should Not Replace Your Tools. It Should Read the Evidence.

The Question I Wanted to Answer

The starting point was simple: if an AI tool can write code, can a different AI tool review it?

My instinct was that the reviewer should be independent from the coding agent. If the same model, prompt, and context wrote the change and then reviewed it, the review is less convincing. It may repeat the same assumptions. Independence matters.

But independence does not automatically require a dedicated code review product. A coding agent can also act as a reviewer if it is run with a different prompt, different constraints, and a review-only role.

So the actual comparison is not just “model vs product.” It is:

  • How much review quality comes from the model?
  • How much comes from the prompt and repository instructions?
  • How much comes from operational product features such as GitHub integration, inline comments, deduplication, review status, dashboards, and configuration?
  • How much control does the repository owner retain?
  • How much effort is required to make the workflow reliable?

The Test Repository

I used a real repository for the experiment:

Repository: smakam/doctor-parser

The repository setup was introduced in PR #1. The repository-owned inline-review publisher was added in PR #3. I then used controlled experiment PRs for the actual comparison rather than reviewing the setup changes themselves.

The application has a backend and frontend, including code paths for uploaded doctor nameboard extraction and review/correction flows. That gave us enough realistic surface area to test authorization and data-mapping bugs.

To keep the comparison fair, I used two controlled defects.

Defect 1: Authorization Check Inversion

In backend/app/routers/nameboard.py, the access check was changed from denying access when neither ownership identifier matched to denying access when the session identifier did match.

- if uploader != requesting_user_id and record.session_id != requesting_user_id:
+ if uploader != requesting_user_id and record.session_id == requesting_user_id:

The expected finding was a high-priority authorization issue: a requester whose ID differs from both the uploader and session ID could access or mutate another record, while a matching guest session could be incorrectly denied.

Defect 2: Incorrect Correction Mapping

In backend/app/services/review_service.py, the correction mapping for medical_registration_no was changed to write into qualifications.

- "medical_registration_no": "medical_registration_no",
+ "medical_registration_no": "qualifications",

The expected finding was a data integrity issue: submitting a registration-number correction would overwrite qualifications and leave the actual registration number unchanged.

These are useful defects for this kind of experiment because they are not formatting issues. They require the reviewer to understand intent, data flow, and security impact.

Shared Review Guidance

One important design choice was to make the review guidance repository-owned.

The shared policy lives in .github/review/code-review.md.

The policy tells the reviewer to prioritize:

  • Authorization and access-control regressions
  • PII exposure
  • Security-sensitive behavior
  • Logic defects introduced by the pull request
  • Incorrect persistence or field mapping
  • Missing validation that changes behavior

It also sets a threshold: only report actionable defects introduced by the PR. Do not produce a generic style review.

This is an important lesson from the experiment. The model matters, but the review role matters just as much. If you want an AI reviewer, you need to define what “good review” means for your repository.

How the Three Review Paths Fit Together

All three approaches start with the same pull request and the same repository-owned review policy. What changes is who runs the review and who owns the operational layer around it.

The review policy is shared. The execution and publication layers differ.

Option 1: Hosted Codex Cloud Code Review

The first approach used hosted Codex Cloud code review.

In this mode, the repository uses AGENTS.md as the durable instruction entry point. For PR reviews, AGENTS.md routes the reviewer to the shared review policy.

There is no GitHub Actions workflow involved in this path. The hosted Codex integration reviews the pull request and posts inline GitHub review comments.

In our experiment, hosted Codex posted inline comments as chatgpt-codex-connector on PR #4.

Hosted Codex posted native inline findings on the changed code.

What Worked Well

The setup cost was low. Once the repository guidance was in place, the hosted reviewer could use that context and post inline comments directly on the PR.

It found the important seeded defects, including the authorization issue and the incorrect field mapping.

This is the simplest path if you want an AI reviewer without building a review pipeline.

What You Give Up

The tradeoff is control.

You do not own the workflow in the same way you own a GitHub Action. You have less control over:

  • Trigger rules
  • Output schema
  • Deduplication behavior
  • Review gating
  • Model/provider substitution
  • Combining the review with other CI signals
  • Custom publishing logic

For many teams, that may be fine. But if the long-term goal is a larger AI-assisted CI system, this approach may become only one review source rather than the central orchestration layer.

Option 2: Repository-Owned GitHub Action Using Codex

The second approach used a GitHub Action.

The GitHub Action does not use a separate definition of what good review means. It uses the same AGENTS.md and shared .github/review/code-review.md policy as hosted Codex. The Action prompt explicitly tells Codex to read AGENTS.md, which routes it to that common policy.

On top of that shared layer, the repository owns four Action-specific files:

This separation is deliberate. The shared code-review.md file defines review priorities, repository invariants, and the finding threshold. The Action-specific pr-review.md file defines how this particular automated run should execute and how it must structure its output. It does not duplicate the review policy.

The workflow is label-gated. A pull request is reviewed only when the codex-action-review label is present. It also runs again when a new commit is pushed to the PR branch, as long as the label remains present.

The action asks Codex to produce structured JSON with sections such as:

  • summary
  • findings
  • validation
  • coverage
  • uncertainty

That structure is not mainly for humans. It is an execution contract between the reviewer and the publishing script. The script needs predictable fields so it can decide which findings can become inline comments and which ones should fall back to a summary.

The GitHub Action then publishes review comments as github-actions[bot] on the same PR #4.

The repository-owned Action produced native inline comments after we built the publishing layer.

What We Had to Build

This approach required the most custom work.

To make the review useful, we had to build:

  • A review prompt with strict output expectations
  • A JSON schema for review results
  • Patch parsing to understand changed lines
  • Inline comment publishing through the GitHub API
  • Fallback summary behavior for findings that cannot be anchored to a changed line
  • Fingerprinting to avoid duplicate comments on repeated runs
  • A safer permission model where the trusted publisher code comes from the base branch

This is the biggest practical difference between a coding agent and a code review product. The model can identify findings, but the product workflow around those findings still has to exist somewhere.

The Fingerprint Problem

Fingerprinting is specific to the repository-owned Action path.

If a workflow runs every time a commit is pushed, the reviewer may find the same issue more than once. Without deduplication, the PR gets noisy. The same comment can be posted repeatedly.

The fingerprint solves that by creating a stable identity for a finding, usually based on fields such as:

  • File path
  • Line number
  • Rule or issue title
  • Finding body or normalized explanation

Before posting a new comment, the publisher checks whether an equivalent finding has already been posted. If yes, it avoids posting a duplicate.

Dedicated review products usually handle this operational detail internally. In the GitHub Action approach, the repository owner has to implement it.

What Worked Well

The GitHub Action found both controlled defects and posted inline comments.

It also gave the most control:

  • The model can be swapped.
  • The prompt can be changed.
  • The trigger policy can be changed.
  • The output schema is owned by the repository.
  • The review can later be combined with static-analysis, security, or test output.

This is the strongest architecture if the goal is a scalable, model-agnostic AI review pipeline.

What You Give Up

You own the operational burden.

Inline comments, deduplication, schema validation, retries, permissions, security hardening, and future maintenance are all your responsibility.

If you only want PR review, this may be too much. If you want an AI-assisted CI orchestration layer, this is probably the most extensible foundation.

Option 3: CodeRabbit

The third approach used CodeRabbit, a dedicated AI code review product.

For this experiment, CodeRabbit was configured with .coderabbit.yaml.

The configuration used:

  • The assertive review profile
  • Code guidelines pointing to .github/review/code-review.md
  • Path instructions for backend routers and services

The CodeRabbit configuration was first merged independently in PR #5. The clean CodeRabbit test was PR #6. It was created as a non-draft PR, with the configuration already present on main, and without the competing Codex Action label.

CodeRabbit posted inline comments as coderabbitai[bot].

CodeRabbit produced native inline comments in the clean, non-draft experiment.

What Worked Well

Under clean conditions, CodeRabbit found both seeded defects:

  • The authorization bypass in backend/app/routers/nameboard.py
  • The incorrect registration-number mapping in backend/app/services/review_service.py

The product experience is clearly stronger than a bare GitHub Action. CodeRabbit provides more than model output:

  • Inline comments
  • PR walkthroughs and summaries
  • Review status
  • Pre-merge checks
  • Configuration through YAML
  • Code guidelines
  • Path instructions
  • Knowledge-base behavior
  • Learnings
  • Autofix and docstring generation depending on plan
  • Unit test generation on higher plans
  • Analytics and reports
  • IDE and CLI review options
  • Integrations such as Jira and Linear
  • Linter and SAST tool support

That is the real value of a dedicated code review product. It is not just that it has a model. It packages the operational workflow around the model.

The Inconsistent Run

Before the clean PR #6 test, we had the noisier PR #4.

That PR was draft at one point, had hosted Codex comments, GitHub Action comments, manual CodeRabbit review commands, and CodeRabbit configuration changes inside the same PR.

In that noisy run, CodeRabbit selected the relevant files but did not publish the two expected actionable inline comments. Later, a CodeRabbit chat response acknowledged that the two issues should have been flagged.

I would not treat that as proof that draft PRs are unsupported or that CodeRabbit cannot find these defects. The cleaner conclusion is more limited:

CodeRabbit’s behavior was inconsistent in a noisy mixed-bot/draft/config-changing experiment, but it worked correctly in a clean non-draft PR with configuration already present on main.

That distinction matters. The blog should not overclaim from a messy experiment.

Feature Comparison

AreaHosted Codex CloudGitHub Action + CodexCodeRabbit
Setup effortLowHighMedium
Inline commentsYesYes, after custom publisherYes
Comment authorchatgpt-codex-connectorgithub-actions[bot]coderabbitai[bot]
Uses shared repo guidanceYes, via AGENTS.md routingYes, via prompt and shared policyYes, via code guidelines/path instructions
Workflow ownershipMostly product-ownedRepository-ownedProduct-owned with YAML configuration
Model flexibilityLimited from repo owner perspectiveStrongestProduct-controlled
DeduplicationProduct-managedMust buildProduct-managed
Trigger controlProduct settings / manual invocationFull GitHub Actions controlProduct settings / comments / YAML
Best use caseLow-friction AI PR reviewScalable AI-assisted CI orchestrationProductized AI code review
Main weaknessLess pipeline controlOperational burdenLess transparency into internal model decisions
Controlled-defect resultFound the seeded defectsFound the seeded defectsFound the seeded defects in the clean PR; inconsistent in the noisy mixed-bot PR

This was a controlled comparison, not a complete market survey. GitHub Copilot Code Review, Cursor Bugbot, Greptile, Qodo, and other review products may be worth evaluating, but I did not include tools that I had not tested on the same defects.

Cost Comparison

The pricing models differ, so the right comparison is not just “which one is cheaper per review.” The better comparison is how predictable the cost is and what operational work is included.

Hosted Codex Cloud

Hosted Codex review cost depends on the user’s ChatGPT/Codex plan and Codex credit model. It is not exposed as a simple repository-level per-PR API bill. OpenAI’s current Codex pricing documentation includes cloud-based automatic code review in supported ChatGPT plans, while API-key usage is separately token-billed and does not include the hosted GitHub code-review feature.

For an individual or small team already using Codex, this can be the lowest-friction option because it fits into the existing product experience. For a formal engineering cost model, it is harder to forecast per PR than an API-backed GitHub Action.

GitHub Action + Codex

The GitHub Action path has two costs:

  1. GitHub Actions runner minutes
  2. Model API usage

Runner cost is usually not the dominant factor for a small review job. The model cost is the meaningful part.

For a concrete API-cost reference, the table below uses the public GPT-5-Codex rate of $1.25 per 1M input tokens and $10.00 per 1M output tokens, with cached input at $0.125 per 1M tokens. The model page now marks GPT-5-Codex as deprecated, so these numbers should be read as a reproducible reference calculation, not as a recommendation to start a new production workflow on that model.

The experiment workflow did not pin a model, and the estimates below are not a measurement of its actual bill. A production workflow should explicitly choose an available model and recalculate with that model’s current prices.

The cost per review depends on:

  • Size of the diff
  • Amount of repository context included
  • Prompt length
  • Whether cached input applies
  • Number and length of findings
  • Whether the workflow reruns on every push

For planning, here is a rough uncached model-cost estimate:

Review shapeInput tokensOutput tokensApprox model cost
Small PR50,0005,000About $0.11
Medium PR150,00010,000About $0.29
Large PR400,00025,000About $0.75

These calculations assume uncached input and use the GPT-5-Codex API token prices above. Actual cost can be lower with prompt caching and higher if the workflow loads excessive repository context or reruns aggressively.

At a monthly level, the model-cost side looks like this:

Monthly PR review runsSmall PR estimateMedium PR estimateLarge PR estimate
100 reviews/monthAbout $11About $29About $75
250 reviews/monthAbout $28About $72About $188
500 reviews/monthAbout $56About $144About $375

GitHub Actions runner cost is additional, but for a lightweight Linux review workflow it is usually smaller than the model cost unless the workflow is slow or run at very high volume.

This approach can be very cost-efficient if reviews are scoped carefully. But if the workflow loads too much context or reruns aggressively on every commit, cost and PR noise can grow quickly.

CodeRabbit

CodeRabbit is primarily seat-based, not line-of-code based.

Public pricing lists:

  • Pro: $24/mo/user billed annually
  • Pro Plus: $48/mo/user billed annually

The docs describe per-developer rolling review limits:

  • Pro: 5 PR reviews per developer per hour
  • Pro+: 10 PR reviews per developer per hour

The current docs list a limit of 300 files per review for both Pro and Pro+.

Each review run consumes review allowance, including automatic incremental reviews after pushes and manual review commands such as @coderabbitai review or @coderabbitai full review.

This means CodeRabbit is not priced like “X cents per line reviewed.” You are paying for a productized review workflow, plus plan limits and optional usage-based expansion.

For a five-developer team, the annual-billing subscription comparison is:

OptionMonthly platform/model cost for 5 developersWhat this does not include
CodeRabbit Pro$120/monthUsage add-ons, if needed
CodeRabbit Pro Plus$240/monthUsage add-ons, if needed
GitHub Action + Codex, 100 medium reviews/monthAbout $29/month model costBuild/maintenance time, GitHub runner cost
GitHub Action + Codex, 250 medium reviews/monthAbout $72/month model costBuild/maintenance time, GitHub runner cost
GitHub Action + Codex, 500 medium reviews/monthAbout $144/month model costBuild/maintenance time, GitHub runner cost

So the GitHub Action path can be materially cheaper in direct model spend. But that is not the full cost. The engineering time to build and maintain inline publishing, deduplication, schema validation, security hardening, retries, and future integrations is real.

CodeRabbit costs more than the raw model calls, but it includes the product workflow. That is the main economic tradeoff.

Configuration Lesson: Keep One Review Policy

The best scalable pattern is not to duplicate long instructions across every tool.

I would organize the repository around four linked layers:

The responsibilities should be different:

  • AGENTS.md: tells coding agents and hosted Codex where the project guidance and review policy live.
  • The shared review policy contains the durable, provider-neutral priorities and finding threshold.
  • The Action prompt contains the GitHub Action execution contract, including JSON output requirements.
  • The CodeRabbit YAML contains CodeRabbit-specific configuration, review profile, code-guideline references, and short path instructions.

The important point is that the CodeRabbit YAML should not become a second full review policy. But I also would not remove path instructions entirely. In the successful CodeRabbit run, its inline comments cited path instructions as the source. So the better approach is to keep path instructions short and targeted while keeping the broader policy in the shared review-policy file.

My Recommendation

If I were adopting this in a real engineering workflow, I would not choose only one answer for all teams.

For a small team that wants quick value, I would start with hosted Codex Cloud review or CodeRabbit.

For a team that wants a polished productized PR review experience, I would evaluate CodeRabbit seriously. Its value is not only the model. Its value is the review workflow around the model.

For a platform team building a broader AI-assisted CI system, I would invest in the GitHub Action approach. It is more work, but it becomes the orchestration point. The same pipeline can later combine:

  • AI code review
  • Static-analysis output
  • Security scan output
  • Test failures
  • Coverage changes
  • Dependency risk
  • Runtime or dynamic-analysis signals

Then AI can do what it is better at: interpret multiple signals, identify risk patterns, explain impact, and help the human reviewer make a better decision.

What I Would Not Do

I would not ask a generic coding agent to “review this PR” with no policy, no structured output, and no integration plan.

That may produce useful comments sometimes, but it is not a CI/CD architecture.

For AI review to work inside CI, it needs:

  • A clear review role
  • Repository-specific guidance
  • A defect threshold
  • Inline comments or structured output
  • Deduplication
  • A trigger model
  • A human review handoff
  • Cost controls
  • A way to evolve the policy over time

The model is only one part of the system.

Conclusion

This experiment changed how I think about AI code review.

A dedicated code review product is not necessarily better because it has a different model. A repository-owned coding agent workflow is not automatically better because it is more flexible.

The real tradeoff is operational.

Hosted Codex Cloud gives a low-friction review path. A GitHub Action gives maximum control and model flexibility, but requires custom engineering. CodeRabbit gives a productized review workflow, but the internal decision-making is less transparent and the buyer does not choose the exact model stack.

For now, my preferred direction for a scalable CI architecture is:

  1. Keep review policy in the repository.
  2. Use productized review tools where they reduce operational burden.
  3. Use a repository-owned action when orchestration, model flexibility, and CI integration matter.
  4. Treat AI as a reviewer and interpreter, not as a replacement for deterministic CI tools.

That fourth point is the bridge to the next article: how deterministic static analysis, security checks, and tests can produce evidence, and how AI can turn that evidence into a concise report for the final human reviewer. In that larger design, AI code review becomes one input to the decision rather than the decision itself.

References

My Multi-Agent Coding Setup to Lower LLM Cost

AI coding tools are now good enough that the question is no longer “Should I use them?” For me, the more useful question is: how do I use them without letting LLM cost grow unnecessarily?

The obvious answer is to use cheaper models. That helps, but it is not the full answer. In practice, the bigger unlock is designing the coding workflow so that I can switch between tools and models without changing the way I work.

My setup is based on separating three things that often get blurred together:

  • Editor: where I view and manually edit code.
  • Harness: the coding agent layer that reads files, edits code, runs commands, applies patches, and manages repo context.
  • Model: the LLM doing the reasoning underneath the harness.

Once these are separated, I can optimize cost more intelligently. I can use premium models when reasoning quality matters, and use lower-cost models for exploration, boilerplate, summarization, first-pass refactors, or less risky changes.

The Architecture

At a high level, my setup looks like this:

The important part is that the editor, harness, and model are not the same thing.

VS Code is usually my editor. Codex, Claude Code, OpenCode, Copilot, and VS Code extensions are the harness layer or harness-like coding environments. Claude, GPT/Codex models, GLM, Qwen, DeepSeek, and other models are the reasoning engines underneath.

That distinction matters because cost optimization becomes easier when the harness is portable and the model is replaceable.

Shared Project Context

The foundation of the setup is shared project context.

I try to keep repo-specific guidance in files such as:

  • AGENTS.md
  • CLAUDE.md
  • architecture notes
  • test commands
  • coding conventions
  • reusable task prompts

This avoids re-explaining the project every time I switch tools. The goal is simple: if I move from Claude Code to Codex, or from Codex to OpenCode, the new harness should still understand the important repo conventions.

This also saves tokens. Instead of dumping long explanations repeatedly into every chat, I keep durable instructions close to the codebase.

Approach 1: VS Code as Editor, Harnesses Through Extensions

This is the setup I use most often for complex projects.

Here, VS Code is the editor. It is where I read code, navigate files, review diffs, and make manual edits.

The AI harness is usually provided through VS Code extensions or integrations.

Examples:

Editor: VS Code
Harness: Copilot extension / Codex extension or CLI integration / Claude extension / OpenCode extension
Model: OpenAI / Claude / Copilot-supported models / OpenRouter-supported models
Context: AGENTS.md / CLAUDE.md / repo docs / prompts

This setup works well for me because I still want to see the code clearly. I like reviewing changes in the editor, understanding the file structure, and staying close to the diff. Maybe that is old-fashioned, but for larger projects it helps me avoid blindly accepting agent output.

The cost benefit comes from keeping VS Code constant while changing the harness or model depending on the task.

For example:

  • I may use Copilot for quick inline completions.
  • I may use Claude through a VS Code extension for complex reasoning-heavy changes.
  • I may use Codex for agentic repo work.
  • I may use OpenCode when I want more model flexibility.

The key point is that VS Code is not the whole AI coding system. It is the editor. The harness and the model can still vary underneath.

Approach 2: Harness-First Workflow

The second setup is when I work directly inside the harness.

This applies to tools like:

  • Codex CLI
  • Claude Code
  • OpenCode app

In this workflow, there may not be a separate editor involved at every step. The harness becomes the main interface. It inspects files, proposes changes, applies patches, runs tests, and iterates.

Editor: Optional / secondary
Harness: Codex CLI / Claude Code / OpenCode app
Model: Native model for that harness, or configurable provider if supported
Context: AGENTS.md / CLAUDE.md / repo docs / prompts

I use this less for complex projects because I prefer to look at the code and review changes directly in the editor. But it works well for smaller modifications, scripts, quick utilities, and contained tasks where I can verify the output easily.

For small projects, the harness-first approach can be efficient because the agent can inspect files, make changes, run commands, and iterate without needing much manual navigation.

Cost-wise, this also helps because the harness can do local exploration. It can search files, inspect only what matters, and avoid loading unnecessary context.

Approach 3: Harness Plus OpenRouter for Model Flexibility

The third setup is where the harness/model separation becomes most explicit.

Some harnesses can be configured to talk to OpenRouter or other compatible model providers. That means I can keep the same coding workflow but change the model underneath.

Editor: Optional
Harness: Codex CLI / Claude Code / OpenCode
Model: OpenRouter-routed models
Context: AGENTS.md / CLAUDE.md / repo docs / prompts

For example:

Codex CLI harness
|
v
OpenRouter provider
|
v
z-ai/glm-5.2, Claude, Qwen, DeepSeek, etc.

This is useful for experimentation and lower-cost first passes. I do not need every task to use the strongest model. Some tasks are mostly repo search, summarization, simple code generation, or mechanical refactoring. Those are good candidates for cheaper models.

Then, when I need better reasoning, I can move back to a premium model.

That said, I do not personally rely on this approach much for daily coding. It may be stable enough for some workflows, but the interface between a coding harness and a third-party model router can change. Codex, Claude Code, or OpenRouter can update their API behavior, headers, tool-calling assumptions, or model compatibility. If that breaks, the workflow breaks.

So for me, Approach 3 is useful to know and useful for experiments, but it is not my default daily setup.

Using OpenRouter with Codex CLI

Codex can be configured with profiles. That lets the default codex command keep using the normal OpenAI/Codex setup, while a separate command uses OpenRouter.

Create:

~/.codex/openrouter.config.toml

Example config:

model_provider = "openrouter"
model = "z-ai/glm-5.2"
model_reasoning_effort = "medium"
[model_providers.openrouter]
name = "OpenRouter"
base_url = "https://openrouter.ai/api/v1"
env_key = "OPENROUTER_API_KEY"
wire_api = "responses"
http_headers = { "HTTP-Referer" = "https://chatgpt.com/codex", "X-Title" = "Codex" }

Add your OpenRouter key:

echo 'OPENROUTER_API_KEY=your_key_here' >> ~/.codex/.env

Add a shell alias:

alias codex-openrouter='codex --profile openrouter'

Now:

codex

uses the normal Codex/OpenAI setup, while:

codex-openrouter

starts Codex through OpenRouter using the configured model.

Inside Codex, verify the active configuration with:

/status

To use a different OpenRouter model for one run:

codex --profile openrouter -m anthropic/claude-sonnet-4.6

The important point is that I do not have to replace my main setup. I keep the default Codex workflow intact and add OpenRouter as a separate profile.

Claude Code with OpenRouter

At a high level, the idea for Claude Code is similar: configure the harness to talk to an OpenAI-compatible endpoint or route requests through OpenRouter, where supported.

The exact setup depends on how Claude Code exposes provider configuration at that time. This is one reason I treat this approach as experimental rather than my default daily workflow.

The pattern is:

Claude Code harness
|
v
OpenRouter or compatible endpoint
|
v
Selected model

If you use this path, I would treat it as a flexible experiment rather than a guaranteed stable interface. The harness, provider, or model compatibility can change.

How I Think About Model Routing

I do not try to use the cheapest model for everything. That can backfire. A cheap model that creates bad code, misses context, or causes extra cleanup may cost more in time than it saves in tokens.

Instead, I route tasks by risk and complexity.

For example:

TaskModel Strategy
Inline completionsCopilot or editor-native tools
Repo explorationLower-cost model or configurable harness
BoilerplateLower-cost model
Simple refactorStart with lower-cost model
Complex debuggingPremium model
Architecture decisionsPremium model
Final reviewStrongest available model

The pattern is:

Use cheaper models for reversible work. Use stronger models when mistakes are expensive.

That single rule handles most cases.

My Actual Usage Pattern

My own usage looks roughly like this.

Approach 1 is my default for complex projects.

I use VS Code as the editor and switch between harnesses through extensions or integrations. I prefer this because I can inspect code, review diffs, and stay oriented.

Approach 2 is useful for smaller changes.

I use harness-first tools like Codex CLI, Claude Code, or OpenCode for scripts, contained edits, and smaller projects where the blast radius is low.

Approach 3 is mostly experimental for me.

OpenRouter gives useful model flexibility, but I do not depend on it heavily for daily coding because the connection between the harness and the model provider can change.

Where the Savings Come From

The savings are not just from cheaper tokens.

They come from a few habits:

  • keeping project context reusable
  • avoiding repeated explanations
  • using harnesses that can inspect the repo directly
  • starting with cheaper models for low-risk work
  • reserving premium models for hard reasoning
  • avoiding huge chat histories when a fresh session with repo instructions is enough
  • choosing the right harness for the task

The most expensive workflow is often the one where I paste too much context into a chat, ask an unclear question, get a partial answer, then spend more tokens correcting it.

A good harness plus good project context reduces that waste.

What about smaller Models That can run locally?

One more workflow I am watching closely is smaller models that can run locally.

I have tried a few Qwen and DeepSeek models through Ollama. My Mac has 48 GB RAM, so it can run some reasonably capable local models. But for the coding tasks I care about, the quality has not yet been strong enough for me to use them as a primary workflow.

That said, I expect this to improve. Smaller models are getting better, and coding harnesses like OpenCode can make this workflow practical if they integrate cleanly with local runtimes such as Ollama.

If this becomes good enough, the stack could look like this:

Editor: VS Code or optional
Harness: OpenCode
Model: Smaller coding-capable model running through Ollama
Cost: No per-token API cost

That would be a meaningful cost-saving path. It would not be completely free in an absolute sense, because there is still hardware cost, electricity, latency, memory pressure, and quality tradeoff. But the marginal API cost per coding task could be zero.

For now, I see this as promising but not yet my default for serious coding work. I expect that to change as smaller coding models improve.

The Tradeoffs

This setup is not free.

There are tradeoffs:

  • Different harnesses support different features.
  • Some models are better at tool use than others.
  • OpenRouter compatibility can vary by model and API behavior.
  • Cheaper models may need tighter prompts and smaller tasks.
  • Switching tools too often can hurt flow.

So I do not treat this as a rigid system. It is a practical routing strategy.

If a task is important, ambiguous, or risky, I use a stronger model. If a task is routine, exploratory, or easy to verify, I am comfortable using a cheaper model.

Final Thought

My approach to lowering LLM coding cost is not just “use cheaper models.”

It is:

Make the harness portable, make the project context reusable, and make the model replaceable.

Once those layers are separated, I can choose the right level of spend for each coding task.

VS Code can remain my editor. Codex, Claude Code, OpenCode, or Copilot can act as the harness. OpenAI, Anthropic, OpenRouter, or other providers can supply the model.

Over time, smaller models that can run locally may become another important part of this setup. If a model running through Ollama can provide good enough coding quality through a harness like OpenCode, then some workflows could move from lower-cost API models to zero marginal API cost local inference.

That flexibility is what lowers cost without forcing me to give up the benefits of high-quality AI coding tools.

AI Browsers Are Here — My Experience with Perplexity’s Comet

I have been using Perplexity’s Comet browser for the past two weeks, and it has completely changed the way I use browsers 🌐. I’ve been a Chrome user for as long as I can remember, but after trying out Comet for two weeks, I finally made it my default browser ✅.

Comet functions not just as a browser, but also as an AI assistant/agent 🤖 that automates many browser-based tasks. In this blog, I’ll share what AI browsers are, my experiences with Comet, and the use cases where I found it most useful.


❓ What is an AI Browser?

An AI browser integrates an AI agent directly into the browsing experience. This agent is aware of the activity in your tabs 🗂️ and provides recommendations and automations ⚡.

In addition to Comet from Perplexity, there are other AI browsers like Dia, Brave, and Opera. While I haven’t tried them personally, my research suggests that Comet offers much deeper AI integration 🔗.

Compared to ChatGPT’s agent, Comet runs locally on your machine 💻 and can directly control the browser. This makes it more secure 🔒 than agents like ChatGPT, where credentials are sent to external servers.


🌟 Why Did Perplexity Enter the Browser Space?

  • Most of us spend 60–70% of our workday inside browsers 🖥️.
  • Browsers are no longer just for websites; they’re the front door to SaaS apps and even AI IDEs like Replit.
  • By embedding AI into a browser, Perplexity ensures “stickiness” 📌 — you’ll keep coming back.

Building on top of Chromium (open source) was a smart move 🧠, making migration from Chrome relatively easy.


📥 Getting Comet

I joined the waitlist 📝 as soon as it opened. Currently, Comet is available to Max customers ($200/month 💸) and a limited set of Pro users. Luckily, through Airtel, I got access as a Pro subscriber 🎉.

Installed it on my MacBook 🍎, and ran it side-by-side with Chrome for two weeks.


🔄 Migration from Chrome to Comet

The migration experience was mixed:

  • ✅ Extensions came through (though not all worked perfectly).
  • ✅ Some Chrome settings migrated.
  • ❌ Bookmarks didn’t import properly.
  • ❌ Passwords, sessions, cookies, and profiles were not migrated 🔑.
  • ⚠️ Web3 wallets had to be re-imported manually.

💡 Use Cases

The more I used Comet, the more possibilities I discovered. The simplest one? “Summarize this page for me” 📝.

🛒 Shopping

  • Bigbasket
    • Query: Order toor dal (½kg), guava juice (6), almonds (200g), walnuts (200g), cilantro (100g), carrots (½kg).
    • ✅ Comet found them and added to cart. If multiple options exist, it picks randomly unless you specify (“pick cheapest” 💰).
  • Amazon: Show me all sports-related purchases I made last year 🏏
  • Comparison: Find cheapest price for Sony Bravia 55” TV across Amazon & Flipkart 📺

☁️ SaaS

  • GCP Console: Find logs with errors between 6 PM and 10 PM
  • Firebase: Check if anonymous authentication is enabled 🔐
  • YouTube: Show the videos with most views from my subscriptions in last 30 days ▶️
    • It auto-scrolls, gathers stats 📊, and summarizes.
  • Gmail: Find important unanswered emails ✉️
  • Google Calendar: Schedule a 30-min meeting with <X> tomorrow 📅
  • Google Sheets: Create a pivot table 📈 (took retries, but worked).

🌍 Social

  • X (Twitter): Show me which people I follow are from India 🇮🇳
  • LinkedIn: Make a chart of my posts vs. view counts 📊

🔗 Multi-Tool Workflows

  • Amazon.in → List vegan chocolates 🍫 that deliver in 1 day → Export to Google Sheets
  • Flipkart → Find laptops under ₹50,000 💻 with 16GB RAM → Compare specs → Export to Sheets
  • Swiggy → Find vegan restaurants near Indiranagar 🥗 → Filter for 30-min delivery → Export menu highlights to Sheets
  • The Times → Summarize top 3 EV policy articles this month ⚡🚗 → Export to Google Docs

✅ Pros vs ❌ Cons

Pros
✨ Easy migration (based on Chromium)
✨ AI “superpowers” while browsing
✨ No switching between browser ↔ AI agents
✨ Tab grouping & multi-agent parallelism
✨ Can search across multiple tabs 🔍

Cons
⚠️ Partial/inaccurate outputs (AI issue)
⚠️ Slow on complex websites 🐢
⚠️ Weak compared to Chrome in syncing & performance
⚠️ Doc editing in Google Docs is buggy
⚠️ Not available for mobiles 📱
⚠️ Security risks from prompt injection attacks 🛡️


🏁 Final Thoughts

I love the Comet browser for its AI-driven, agentic capabilities 🤖. After two weeks, I switched my default from Chrome to Comet.

I still keep Chrome as backup 🔙 for extensions and performance, but Comet shines in automation and research workflows 🌟.

Security remains a concern ⚠️ — malicious websites could hijack the AI agent — but as Comet integrates with more tools, its superpowers will only grow stronger 💪.

The Rise of CLI-Based AI Coding Agents: Claude code vs Gemini CLI

Introduction

I have been a Cursor user for vibe coding for 3 months. I was very skeptical about using Claude Code and Gemini CLI at first, since I wasn’t comfortable with the idea of using a terminal as an AI agent. But in the last 1–2 months, I’ve been trying them both — and it completely changed my opinion.

In this blog, I’ll share my experiences of using them, my favorite pick between the two, and a comparison of the three broad categories of AI-assisted coding approaches that exist today.


The Three Approaches to AI-Assisted Coding

I see broadly 3 kinds of AI-assisted coding approaches:

  • Chat interface with canvas → ChatGPT, Claude
  • IDE integrated AI tools → Cursor, Windsurf, Replit, Lovable
  • CLI-based AI agent tools → Claude Code, Gemini CLI, Warp
🧑‍💻 Category💬 Chat Interface🛠️ IDE Integrated Assist⚡ CLI-based AI Agent
Where it operatesBrowserStandalone IDE or browser (Cursor uses IDE, Lovable uses browser)Terminal or IDE
Use casePrototyping, small functions, quick answers, “throwaway weekend projects.”Augmenting the core coding loop: writing, refactoring, debugging.Automating workflows: multi-step tasks, system commands, project-wide changes.
Vibe coding stylePure “vibe coding” (conversational prompting).Hybrid of “vibe coding” + “developer assist.”Agentic + autonomous (give AI a goal and let it execute).

For a vibe coder like me, a CLI-based AI agent inside VS Code works perfectly — I get the best of both IDE and terminal with AI agent powers.


My Project: A 2-Way Translator App 🌍

To test these tools, I built a translation application.

When I visited Vietnam a few months back, I noticed cab drivers and restaurants using Google Translate effectively. But one problem stood out: only one device could be used for back-and-forth communication.

So, I decided to build a two-way translation application that solved this problem.

I drafted the following prompt (with ChatGPT’s help):

Global Translator App – MVP Requirements (Web Application)

  • Build a web app that lets two users communicate in real time via text translation.
  • Users connect via QR code or unique ID.
  • Support both text and speech.
  • Translate automatically for seamless conversation.

(Details moved to the appendix 👇)

Pre-requisites:

  • Google Translate API with GCP
  • Firebase backend

Claude Code vs Gemini CLI ⚡

🔎 Feature🤖 Claude Code🌐 Gemini CLI
📍 Location of useStandalone terminal or inside VS Code. In VS Code, Claude Code has IDE context — lets you select code and ask about it.Standalone terminal only. In VS Code, Gemini CLI has no IDE context (though Google offers Gemini Code Assist for IDE, without terminal capability).
💻 Terminal capabilityExcellent — can view files, execute commands, analyze outputs.Limited — shell commands can’t run in foreground, stateless (no persistent cd), no command completion.
⚙️ AI agent capabilityStrong coding performance; required multiple iterations but reliable.Decent, though not as strong as Claude Code.
🧪 Debugging & TestingSuperb. With terminal + MCP integration, I could run unit tests from both terminal and frontend.Limited debugging/testing due to terminal restrictions and weaker MCP tool support.
🔌 MCP integrationVery good. I integrated Playwright (UI automation) + Firebase.Okay. Playwright struggled (e.g., no 2-browser instance support). Firebase worked fine.
💸 Cost & model$20/month plan (Sonnet). Didn’t use Opus ($200/month). Sometimes hit daily quota limits.Free with generous limits (Gemini 2.5 Pro).

Verdict so far: Claude Code > Gemini CLI for most features, especially debugging and testing.
But Gemini CLI’s pricing (free) and generous usage limits are a big plus.

If Google can merge Gemini CLI with Code Assist and improve Playwright integration, it will become a fantastic package. On the other hand, Claude Code really needs a more flexible pricing tier between $20 and $200.


Project Output

  • Translation app built with Claude Code → [Demo link here]
  • Translation app built with Gemini CLI → [Demo link here]

Flow of the app:

  1. User logs in with a username (no auth to keep simple).
  2. Picks language + connects with another user via QR code or username.
  3. Supports both text + voice translation in real time.
  4. Built as a PWA → works on web + mobile.

Debugging & Testing with Claude Code 🔍

This is where Claude Code really shines:

  • Console errors are debugged + fixed automatically.
  • AI agent generates unit test cases, executes them, finds failures, and fixes them.
  • Even frontend integration testing works — thanks to MCP integration:
    • It inspects browser console logs.
    • Takes screenshots to analyze UI/UX issues (!).

I even asked Claude Code to:

  • Make a 90-second demo video of the app.
  • Simulate two users chatting with translations in the app. It worked beautifully.

Demo video created by Claude

Global Translation – User1

Global Translation – User2


Summary ✨

AI-assisted coding has matured tremendously in the last year and is now a top revenue driver among AI apps.

In my first blog on Vibe coding, I complained about limited debugging and testing with the AI coding tools. With these new coding agents, that problem feels largely solved.

Next, I’d love to see AI agents:

  • Do better system design.
  • Produce more modular code.
  • Integrate smoothly with existing codebases.

Between Claude Code and Gemini CLI → Claude Code wins hands down 🏆.
But I’m confident Gemini CLI will close the gap soon.


Appendix

Detailed prompt given for the translation application:

Tech Stack

  • Frontend Framework: React (or a similar modern JavaScript framework like Vue/Angular, but React aligns with future React Native plans)
  • Backend: Firebase (Firestore/Realtime Database for real-time chat, Authentication, Cloud Functions for server-side logic if needed)
  • Translation API: Google Cloud Translation API
  • QR Code: Open-source JavaScript libraries for QR code generation and scanning (e.g., qrcode.react, html5-qrcode)
  • Authentication: Anonymous sign-in (extendable to Gmail sign-in later)
  • Chat History: Local browser storage (e.g., LocalStorage, IndexedDB – no cloud sync for MVP)
  • Encryption: Not required for MVP
  • UI/UX: Simple, intuitive, and modern chat interface inspired by leading web messaging apps (e.g., WhatsApp Web, Telegram Web)
  • Dark Mode: Full support for dark mode from MVP

Core Features (MVP)

  • User Onboarding
    • Anonymous sign-in (no registration required for MVP)
    • Generate a unique user ID and QR code for each user upon entering the app
    • Users can choose and save a unique username, which is validated against a central Firestore database to prevent conflicts.
  • Connection Mechanism
    • QR Code Scanning: Allow users to scan another user’s QR code using their device’s webcam/camera (if available and permission granted).
    • Manual ID Entry: Provide an option to manually enter another user’s unique ID to initiate a chat.
    • Display your own QR code for others to scan.
    • The application remembers the last 5 friends you’ve connected with, allowing for quick selection from a dropdown menu.
  • Progressive Web App (PWA):
    • The application is designed to be installable on mobile and desktop

devices, offering an app-like experience with potential offline capabilities.

  • The layout is optimized to adapt and display correctly across various screen sizes, including iOS and Android mobile browsers.
  • Chat Interface
    • Real-time text chat between two users.
    • Each user selects their preferred language from a dropdown/selector. This language is the language to be used by the friend on the other side. 
    • Messages are automatically translated to the recipient’s language using Google Translate API.
    • Show both original and translated text in the chat bubble.
    • Support for dark mode.
    • Friend Online Status (Basic): It displays whether a friend is currently “Online” or “Offline” (with a “Last seen” timestamp). Note: The “offline” status is not automatically updated on browser close in the current setup.
  • Session Management
    • One-to-one chat sessions.
    • Simple chat history stored locally in the browser.
  • Language Support
    • Initial support for: Hindi, Telugu, Tamil, Kannada, English, and French.
  • Misc
    • A version number is displayed on the screen, making it easy to identify the deployed application version.

Non-Functional Requirements

  • Responsive and intuitive UI/UX, adapting well to different screen sizes (desktop, tablet, mobile browsers).
  • Fast translation and message delivery.
  • Minimal data usage.
  • Accessibility support.
  • Dark mode support.
  • Cross-browser compatibility (Chrome, Firefox, Safari, Edge).

Future Extensions (Post-MVP)

  • Native mobile applications (Android & iOS) using React Native.
  • Gmail sign-in and user profiles.
  • Speech-to-text and text-to-speech for voice communication.
  • Discover nearby users (if feasible for the web, e.g., using WebRTC data channels or location APIs).
  • Group chats.
  • Persistent chat history with cloud sync.
  • End-to-end encryption.
  • Support for additional languages.

🚀 A Guide for B.Tech CS Students to kickstart your AI journey

👋 Introduction

My daughter will be starting her B.Tech in Computer Science at MIT, Manipal this year. As a huge AI proponent, I often share the latest AI trends and tools with my family. When my daughter decided to pursue CS, she asked me several questions about AI, which inspired this blog. I hope this guide helps any student planning to specialize in CS and AI.


📚 Core Fundamentals for CSE Students

Before diving into AI, it’s crucial to master the basics. These are some of the building blocks for everything you’ll do in computer science. Following links will give you an overview of the basics before you deep-dive.


📝 General Advice for Students

In addition to doing your coursework, following tips can help you to be more practically prepared for the industry .

  • Start with Fundamentals: Focus on math, programming, data structures, and algorithms.
  • Build a Portfolio: Work on projects, participate in Kaggle competitions and hackathons, and maintain GitHub repositories.
  • Network: Join AI clubs, attend meetups, and connect with peers and professionals on LinkedIn.
  • Stay Updated: Follow AI news, research, and trends.
  • Internships: Real-world experience is invaluable—seek internships early.

🛠️ Tools to Try Out

Following is just a sample collection at this point of time. The tools change so fast so it’s very important to keep yourself updated with the latest.

  • Chatbots: ChatGPT, Gemini (Try ChatLLM, an aggregator of chatbots and other AI tools collection, its very handy)
  • Vibe Coding: Cursor, Windsurf, Replit, Pythagora (see my earlier blog for more)
  • Image Generation: DALL-E(OpenAI), Midjourney
  • Video Generation: Google Veo
  • ML Platforms: Google AI Studio(Good to experiment with Google AI models), Kaggle(Kaggle competitions are good, good for datasets and notebooks), Hugging Face(Marketplace for models, datasets and easy to share the ML work with others)
  • Automation: Zapier (AI orchestration platform connecting different AI and non-AI tools and platforms)

Note: “Vibe coding” refers to using AI-powered coding environments that help you code faster and more intuitively.


🤖 Exploring AI Domains & Career Paths

Here’s a quick overview of different AI roles, what they do, prerequisites, and how to get started. AI industry is still at its nascent stage, these roles can change as the technology matures.

RoleWhat They DoPrerequisitesHow to Get In
AI ResearcherDevelop new AI models/algorithms, advance the field, publish researchStrong math (linear algebra, stats), deep ML/DL, Python, PyTorch/TensorFlow, research skills, academic writingAdvanced courses (Master’s/PhD), join research labs, open-source, publish papers, attend conferences
ML EngineerBuild, optimize, and deploy ML models in production; manage ML systemsProgramming (Python, C++/Java), ML frameworks, software engineering, cloud (AWS/GCP/Azure), MLOps basicsEnd-to-end ML projects, internships, open-source, learn CI/CD, Docker/Kubernetes, model deployment
Data Engineer/ScientistBuild data pipelines, clean/process data, extract insights, visualize findingsPython, SQL, data wrangling, statistics, data viz, ML basics, big data tools (Spark, Hadoop)Data science/engineering courses, Kaggle, portfolio projects, internships, learn data tools and visualization
AI Application EngineerIntegrate AI models into real-world apps/products; focus on APIs and UXProgramming (Python, JS, etc.), API development, front/back-end, basic ML, UX/UIBuild AI apps, hackathons, internships, learn REST APIs, cloud deployment
AI Security & SafetyEnsure AI systems are secure/safe; address ethical, legal, and risk concernsSecurity fundamentals, cryptography, adversarial ML, AI ethics, risk, regulations, ML basicsCybersecurity/AI ethics courses, CTFs, follow AI safety research, join labs/organizations
AI Product ManagerDefine vision/strategy for AI products; bridge tech and business teamsAI/ML concepts, product management, communication, business acumen, user researchStart as engineer/analyst, PM courses, AI projects, internships, develop leadership/communication
AI Hardware SpecialistDesign/develop hardware/software (GPUs, TPUs, SDKs) for AI training/inferenceECE/CS, digital design, computer architecture, parallel computing, C/C++, CUDA, ML basicsECE/CS courses, hardware internships, FPGA/GPU projects, hardware-software co-design, follow NVIDIA/AMD/Intel

🧑‍💻 AI Basics for Students

Following is just a sample to get started with AI basics.


🤔 How Should College Students Use AI (and How Not To)?

  • Don’t: Use AI chatbots to solve class assignments directly—this can kill creativity and hinder learning.
  • Do: Use AI as a learning tool to explore new ideas, get feedback on completed assignments, and clarify concepts after self-study.
  • Tip: Treat AI as a personalized teacher—seek help only after you’ve tried solving problems yourself.

🔄 Staying Updated with AI

  • Curate Resources: Make a repository of your favorite podcasts, blogs, and YouTube channels.
  • Hands-On Practice: Try new AI tools and work on personal projects.
  • Mix Coding Styles: Combine “vibe coding” (AI-assisted) with traditional coding to strengthen your skills.

💡 Is AI Going to Take My Job?

A typical software engineer spends only 30–40% of their time coding; the rest involves architecture, design, spec reviews, cross-functional discussions, integration testing, and release processes. While AI can assist with coding, these other activities are equally critical and difficult to automate.

Even within coding, engineers must structure code, manage module interactions, choose technologies, debug, test, scale, and deploy—tasks that require human judgment. AI coding tools can boost productivity by 30–40% today, and possibly up to 70% in the next 1–2 years. However, over-reliance on these tools can erode core skills, and poorly organized AI-generated code can become hard to maintain.

There’s no substitute for strong design and coding fundamentals. Use AI tools as an assistant, not a replacement.

Jevons Paradox: If coding becomes much easier and cheaper, we’ll see more coding projects and more coders, not fewer. The demand for skilled engineers will grow as we automate more of the world.

For the next 5–10 years, CS engineers will remain essential. If AI ever surpasses humans in all aspects (AGI), it won’t just be engineers—every profession will be affected.


🌱 Final Thoughts

CS or CS with AI specialization are fields of endless possibility. Stay curious, keep building, and remember: the journey is as important as the destination. Embrace change, focus on fundamentals, and use AI as a tool to amplify your learning and creativity.


Wishing all new B.Tech CS students an exciting and rewarding journey ahead!


Picture with my lovely daughter!

🔍 Debugging Web Apps with Cursor Just Got Smarter: Evaluating Browser Assist Tools

In my previous post, I shared my experience using Vibe coding and highlighted one of the biggest challenges in that workflow: AI coding tools often lack awareness of what’s happening in the browser when you run your app.

This leads to a frustrating dev loop: you’re forced to constantly copy-paste screenshots, console errors, and network logs into your code editor just to help the AI debug your application.

Luckily, there’s a new wave of tools built on the Model Context Protocol (MCP) that bridge this gap. These browser assist tools let your AI-enhanced code editor (like Cursor) directly observe, interact with, and sometimes even control your browser — just like a real user.

Some of these tools go beyond debugging — they can actually drive the browser, making them incredibly useful for UI testing and automation as well.


🧪 Tools I Evaluated

  1. Playwright
  2. Browser MCP
  3. Browser Tools MCP

Each of these plugs into Cursor via MCP and serves a slightly different purpose.


🧠 Architecture Overview

Cursor → MCP → Browser Assist Tool → Browser → Observed by LLM → Cursor responds
  • Cursor uses Model Context Protocol (MCP) to communicate with these tools.
  • The tools interact with the browser — either controlling it or reading logs/events.
  • The data is passed to the LLM, which interprets it and responds inside Cursor.

🧩 Tool Breakdown

1. Playwright + MCP

Developed by Microsoft, Playwright is a full-featured browser automation framework that supports Chromium, Firefox, and WebKit. It works across OS platforms and supports headless execution — making it perfect for automation and CI testing.

When integrated with Cursor via MCP, it becomes a powerful browser control agent.

✅ Installation

"playwright": {
"command": "npx",
"args": ["@playwright/mcp@latest"]
}

🔧 Supported Functions

These functions are exposed by playwright using MCP. playwright has more functionalities than the ones that it exposes to MCP.

  • browser_click, browser_type, browser_navigate
  • browser_take_screenshot, browser_snapshot, browser_pdf_save
  • browser_tab_list, browser_tab_select, browser_tab_close
  • …and many more

💡 Real Use Cases

  • Asked Cursor to debug console errors in my e-commerce app
  • Asked Cursor to test flows like “Add to Cart”, “View Product Details”
  • Used it for:
    • Clicking through workflows
    • Filling out forms
    • Scraping content
    • Capturing screenshots for visual debugging

⚠️ Limitations

  • Doesn’t read network logs or API errors
  • Click interactions does not work reliably with iframes

2. Browser MCP

This is a lightweight adaptation of Playwright, still MCP-compatible, but simpler.

✅ Installation

  • Install Chrome extension (manual or via GitHub release)
  • Cursor config:
"browsermcp": {
"command": "npx",
"args": ["@browsermcp/mcp@latest"]
}

💡 Why It’s Useful

Unlike Playwright, Browser MCP can control your already open browser tab, without launching a new browser instance. This is helpful for debugging apps you’re already running in Chrome.

🔻 Downsides

  • Fewer features than Playwright
  • Better suited for lightweight debugging, not complex automation

3. Browser Tools MCP

This tool focuses entirely on browser introspection and debugging, rather than control.

Think of it as DevTools for your AI.

✅ Installation

  • Install Chrome Extension
  • Start middleware:
npx @agentdeskai/browser-tools-server@latest
  • Cursor config:
"browser-tools": {
"command": "npx",
"args": ["@agentdeskai/browser-tools-mcp@1.2.0"]
}

🛠️ Supported Functions

These are exposed by browsertools using MCP.

  • getConsoleLogs, getConsoleErrors, getNetworkLogs, takeScreenshot
  • runAccessibilityAudit, runPerformanceAudit, runSEOAudit, runNextJSAudit
  • wipeLogs, runDebuggerMode, runBestPracticesAudit

💡 What I Could Do

  • Refresh app and automatically check network + console errors
  • Ask Cursor to analyze latency issues or API failures
  • Run full Lighthouse-style audits on performance and SEO

📊 Comparison: Which One to Use?

Use CaseBest Tool
Browser automation + basic debugging🟢 Playwright
Full DevTools-style debugging🟢 Browser Tools MCP
Debugging current browser tab with minimal setup🟡 Browser MCP

🧠 Final Thoughts

Playwright is phenomenal — not just for browser debugging, but for automation and testing at scale. If it added rich debugging support (like network logs and audits), it could become the one tool to rule them all.

Meanwhile, Browser Tools MCP fills that debugging gap beautifully today, while Browser MCP hits a sweet spot between the two.


🔮 Looking Ahead

I believe browser assist tools will eventually be natively integrated into code assist platforms like Cursor, eliminating the need for users to manually install and configure MCP plugins. In the future, these platforms will likely support a range of built-in agents that work seamlessly across different environments — web, mobile, desktop — and integrate with tools like databases, APIs, and SaaS platforms out of the box.

There’s also a new class of tools like Anthropic’s Computer Use and OpenAI’s Operator, which aim to control not just browsers but the entire computer environment. It feels inevitable that these worlds — browser automation, LLM-powered agents, and full computer control — will start to converge.

Exciting times ahead. ⚡

🚀 One Month with Vibe Coding: Building Real Apps with AI Assistants

Over the past few months, Vibe coding has been gaining serious traction—and I couldn’t resist diving in myself. I’ve been using AI coding assistants for a while, but I wanted to go deeper and really test what these tools can do in a realistic, end-to-end software development project.

So, I spent the last month building a full-featured ecommerce web and mobile app using some of the most talked-about Vibe coding platforms: Cursor, Windsurf, Lovable, Bolt, and Replit. It was a fun and empowering journey—there’s a real sense of accomplishment in being able to build software applications on your own. I also learned that working with the current generation of tools definitely requires a good deal of patience.

In this blog, I’ll walk you through:

  • My experience building and deploying the applications
  • What worked, what didn’t, and what broke halfway 😅
  • How each tool stacks up in terms of usability, flexibility, and reliability
  • Whether tools like these mean we still need software engineers (spoiler: yes—but it’s complicated)
  • Where I think this whole Vibe coding trend is heading next

🌍 Coding Assistant Landscape: Then vs Now

AI coding assistants have come a long way. Here’s a quick look at how things evolved:

⏰ The Old School

  • Classic autocomplete tools like IntelliSense or TabNine helped speed up typing but weren’t context-aware.
  • Low-code/no-code platforms (e.g., Bubble, Wix, Zapier) let users drag and drop components, but required scripting for anything complex.

🧠 The New Era: Vibe Coding

  • Powered by LLMs (Large Language Models)
  • Can write, refactor, debug, and deploy apps using natural language queries
  • Opens the door for non-developers to build apps
  • Empowers developers to skip boilerplate and focus on design, logic, and systems thinking

💡 What is Vibe Coding?

Vibe coding refers to using AI-powered tools to build software via natural language prompts, mixed with lightweight manual coding. It’s all about staying in the flow and letting the assistant do the heavy lifting.

💡 The Experiment

Although I started my career as a developer, I haven’t been actively coding in the last decade. Instead, I’ve focused on architecture, reviews, testing, and product design. That said, I wanted to push these Vibe tools beyond simple demos or prototypes.

So, I picked a moderately complex use case: an Ecommerce application with a web frontend and mobile app, complete with backend, auth, payment, and roles.

✨ Features Implemented

- User authentication (sign-up, login, password reset, Google login)
- Roles: Admin, Seller, Customer
- Admin: manage users, view orders, seller capabilities
- Seller: add products
- Customer: browse catalog, filter/sort, add to cart, checkout
- Order history
- Payment integration with Razorpay

🚀 Tech Stack Used

Frontend: React
Backend: Node.js + Express
Database: MongoDB
Deployment: Vercel / Render / Netlify depending on tool

🏗️ Environments

- Web app
- Mobile app (via Expo)
- Both local and production deployments

🔧 Tool-by-Tool Breakdown

Each tool was tested with the same requirements and judged based on ease of use, flexibility, ability to debug, and ability to deploy real features.

🧪 Cursor

🛠️ Plan: Paid ($20)

💻 Used With: MongoDB Atlas, Render/Vercel for deployment, Claude 3.7 model

Highlights:

  • Full tech stack flexibility
  • Supports both web and mobile
  • Git & database migration support
  • Wrote unit tests and debugged APIs
  • Workflow suits developers

⚠️ Challenges:

  • Terminal tracking is weak
  • Frequent application crashes
  • Manual debugging needed

📦 Artifacts:

Windsurf

🛠️ Plan: Free and Paid version

💻 Used With: Claude 3.7 & Gemini, Vercel/Render for cloud, Cloudinary for images

Highlights:

  • Better terminal/session management
  • Console log debugging is stronger

⚠️ Challenges:

  • Hard to course-correct from incorrect assumptions
  • Hit credit limits fast (Ran out of credits with paid version in 3 days)

📦 Artifacts:


⚡ Bolt

🛠️ Plan: Free

💻 Used With: React + Vite, Supabase, Netlify

Highlights:

  • Blazing fast startup because it runs as web container
  • Fully in-browser

⚠️ Challenges:

  • Can’t run backend services (e.g., Express, MongoDB) because of running as web container
  • Not suitable for full-stack use cases

📦 Artifacts:

  • Incomplete app prototype (Ran out of free credits)

😍 Lovable

🛠️ Plan: Free and then Paid ($20)

💻 Used With: React + Supabase, auto-deploy on Lovable Cloud

Highlights:

  • Very easy to use
  • Seamless production deployment

⚠️ Challenges:

  • Slower code generation speed

📦 Artifacts:

🛠️ Replit

🛠️ Plan: Free

💻 Used With: Ghostwriter AI, browser IDE, MongoDB Atlas

Highlights:

  • Easy to set up
  • Great for fast testing

⚠️ Challenges:

  • Cloud-only with less system-level flexibility
  • Not ideal for large production apps

📦 Artifacts:

  • Did not complete(ran out of free credits)

📊 Tool Comparison Snapshot

FeatureCursorWindsurfReplitLovableBolt
Ease of UseMediumMediumEasyEasyEasy
Dev EnvironmentLocalLocalCloudCloudCloud
Deployment OptionsManualManualBuilt-inBuilt-inManual
Tech Stack FlexibilityHighHighMediumLimitedLimited
Target UsersDevsDevsAllNon-devsNon-devs

🧠 My Take: Cursor gives you the most power; Lovable gives you the most convenience.

❌ What Needs Work

🛠️ Debugging:

Most tools still rely on you reading console logs and piecing things together manually. (My pick: Use Operator framework to understand what’s happening in browser and fix issues automatically)

🐌 Speed:

Long wait times and retries can break the flow.

🧩 Fragility:

Small changes can break other parts of the app. There’s no real “awareness” of architectural dependencies.

📐 Lack of modularity:

Encouraging reusable design and clean code still needs a human architect.

📘 Pro Tips: Making Vibe Coding Work

📋 Define clear requirements

Roles, pages, workflows, error states — lay it all out before prompting.

🧭 Use guardrails (rules/constraints)

Many tools let you enforce language, style, and folder structure.

🎯 Stick to common stacks

React, Node, Python, SQL — that's where LLMs shine.

💡 Use models wisely

Claude 3.7 was the most consistent for me, especially on multi-step flows. Experiment with models and find the best one for your use case.

🧪 Debug like a dev

Logs > terminal > DB traces. Be ready to dive in.

🔄 When stuck, reboot

Sometimes starting fresh saves more time than untangling broken AI logic. Keep regular checkpoints to go back to stable point. 

🧠 Is Software Engineering Dead?

Nope. But it’s definitely shifting.

🧠 What Vibe Coding Does Well:

  • Speeds up boilerplate
  • Empowers solo builders
  • Makes prototyping fast

🚧 What It Still Needs Help With:

  • Scaling apps
  • Clean architectures
  • Advanced debugging
  • Enhancing existing production apps

🧑‍💻 Developers won’t disappear. They’ll evolve. The future engineer:

  • Uses AI to generate & validate code fast
  • Designs smart systems
  • Oversees quality, reusability, and security

💬 “It’s not about coding less. It’s about coding smarter.”


Docker features for handling Container’s death and resurrection

Docker containers provides an isolated sandbox for the containerized program to execute. One-shot containers accomplishes a particular task and stops. Long running containers runs for an indefinite period till it either gets stopped by the user or when the root process inside container crashes. It is necessary to gracefully handle container’s death and to make sure that the Job running as container does not get impacted in an unexpected manner. When containers are run with Swarm orchestration, Swarm monitors the containers health, exit status and the entire lifecycle including upgrade and rollback. This will be a pretty long blog. I did not want to split it since it makes sense to look at this holistically. You can jump to specific sections by clicking on the links below if needed. In this blog, I will cover the following topics with examples:

Handling Signals and exit codes

Continue reading Docker features for handling Container’s death and resurrection