A retro computer monitor displaying the Gemini CLI prompt "> Ask Gemini to scaffold a web app" inside a glowing neon blue and pink holographic wireframe box, representing a digital sandbox.

The Guardrails of Autonomy

I still remember the first time I let an LLM execute a shell command on my machine. It was a simple ls -la, but my finger hovered over the Enter key for a solid ten seconds.

There is a visceral, lizard-brain reaction to giving an AI that level of access. We all know the horror stories—or at least the potential horror stories. One hallucinated argument, one misplaced flag, and a helpful cleanup script becomes rm -rf /. This fear creates a central tension in what I call the Agentic Shift. We want agents to be autonomous enough to be useful—fixing a bug across ten files while we grab coffee—but safe enough to be trusted with the keys to the kingdom.

Until now, my approach with the Gemini CLI was the blunt instrument of “Human-in-the-Loop.” Any tool call with a side effect—executing shell commands, writing code, or editing files—required a manual y/n confirmation. It was safe, sure. But it was also exhausting.

I vividly remember asking Gemini to “fix all the linting errors in this project.” It brilliantly identified the issues and proposed edits for twenty different files. Then I sat there, hitting yyy… twenty times.

The magic evaporated. I wasn’t collaborating with an intelligent agent; I was acting as a slow, biological barrier for a very expensive macro. This feeling has a name—“Confirmation Fatigue”—and it’s the silent killer of autonomy. I realized I needed to move from micromanagement to strategic oversight. I didn’t want to stop the agent; I wanted to give it a leash.

The Policy Engine

The solution I’ve built is the Gemini CLI Policy Engine.

Think of it as a firewall for tool calls. It sits between the LLM’s request and your operating system’s execution. Every time the model reaches for a tool—whether it’s to read a file, run a grep command, or make a network request—the Policy Engine intercepts the call and evaluates it against a set of rules.

The system relies on three core actions:

  1. allow: The tool runs immediately.
  2. deny: The AI gets a “Permission denied” error.
  3. ask_user: The default manual approval.

A Hierarchy of Trust

The magic isn’t just in blocking or allowing things; it’s in the hierarchy. Instead of a flat list of rules, I built a tiered priority system that functions like layers of defense.

At the base, you have the Default Safety Net. These are the built-in rules that apply to everyone—basic common sense like “always ask before overwriting a file.”

Above that sits the User Layer, which is where I define my personal comfort zone. This allows me to customize the “personality” of my safety rails. On my personal laptop, I might be a cowboy, allowing git commands to run freely because I know I can always undo a bad commit. But on a production server, I might lock things down tighter than a vault.

Finally, at the top, is the Enterprise/Admin Layer. These are the immutable laws of physics for the agent. In an enterprise setting, this is where you ensure that no matter how “creative” the agent gets, it can never curl data to an external IP or access sensitive directories.

Safe Exploration

In practice, this means I can trust the agent to look but ask it to verify before it touches. I generally trust the agent to check the repository status, review history, or check if the build passed. I don’t need to approve every git log or gh run list.

[[rule]]
toolName = "run_shell_command"
commandPrefix = [
  "git status",
  "git log",
  "git diff",
  "gh issue list",
  "gh pr list",
  "gh pr view",
  "gh run list"
]
decision = "allow"
priority = 100

Yolo Mode

Sometimes, I’m working in a sandbox and I just want speed. I can use the dedicated yolo mode to take the training wheels off. There is a distinct feeling of freedom—and a slight thrill of danger—when you watch the terminal fly by, commands executing one after another.

However, even in Yolo mode, I want a final sanity check before I push code or open a PR. While Yolo mode is inherently permissive, I define specific high-priority rules to catch critical actions. I also explicitly block docker commands—I don’t want the agent spinning up (or spinning down) containers in the background without me knowing.

# Exception: Always ask before committing or creating a PR
[[rule]]
toolName = "run_shell_command"
commandPrefix = ["git commit", "gh pr create"]
decision = "ask_user"
priority = 900
modes = ["yolo"]

# Exception: Never run docker commands automatically
[[rule]]
toolName = "run_shell_command"
commandPrefix = "docker"
decision = "deny"
priority = 999
modes = ["yolo"]

The Hard Stop

And then there are the things that should simply never happen. I don’t care how confident the model is; I don’t want it rebooting my machine. These rules are the “break glass in case of emergency” protections that let me sleep at night.

[[rule]]
toolName = "run_shell_command"
commandRegex = "^(shutdown|reboot|kill)"
decision = "deny"
priority = 999

Decoupling Capability from Control

The significance of this feature goes beyond just saving me from pressing y. It fundamentally changes how we design agents.

I touched on this concept in my series on autonomous agents, specifically in Building Secure Autonomous Agents, where I argued that a “policy engine” is essential for scaling from one agent to a fleet. Now, I’m bringing that same architecture to the local CLI.

Previously, the conversation around AI safety often presented a binary choice: you could have a capable agent that was potentially dangerous, or a safe agent that was effectively useless. If I wanted to ensure the agent wouldn’t accidentally delete my home directory, the standard advice was to simply remove the shell tool. But that is a false choice. It confuses the tool with the intent. Removing the shell doesn’t just stop the agent from doing damage; it stops it from running tests, managing git, or installing packages—the very things I need it to do.

With the Policy Engine, I can give the agent powerful tools but wrap them in strict policies. I can give it access to kubectl, but only for get commands. I can let it edit files, but only on specific documentation sites.

This is how we bridge the gap between a fun demo and a production-ready tool. It allows me to define the sandbox in which the AI plays, giving me the confidence to let it run autonomously within those boundaries.

Defining Your Own Rules

The Policy Engine is available now in the latest release of Gemini CLI. You can dive into the full documentation here.

If you want to see exactly what rules are currently active on your system—including the built-in defaults and your custom additions—you can simply run /policies list from inside the Gemini CLI.

I’m currently running a mix of “Safe Exploration” and “Hard Stop” rules. It’s quieted the noise significantly while keeping my file system intact. I’d love to hear how you configure yours—are you a “deny everything” security maximalist, or are you running in full “allow” mode?

A stylized, dark digital illustration of an open laptop displaying lines of blue code. Floating above the laptop are three glowing, neon blue wireframe icons: a document on the left, a calendar in the center, and an envelope on the right. The icons appear to be formed from streams of digital particles rising from the laptop screen, symbolizing the integration of digital tools. The overall aesthetic is futuristic and high-tech, with dramatic lighting emphasizing the connection between the code and the applications.

Bringing the Office to the Terminal

There is a specific kind of friction that every developer knows. It’s the friction of the “Alt-Tab.”

You’re deep in the code, holding a complex mental model of a system in your head, when you realize you need to check a requirement. That requirement lives in a Google Doc. Or maybe you need to see if you have time to finish a feature before your next meeting. That information lives in Google Calendar.

So you leave the terminal. You open the browser. You navigate the tabs. You find the info. And in those thirty seconds, the mental model you were holding starts to evaporate. The flow is broken.

But it’s not just the context switch that kills your momentum—it’s the ambush. The moment you open that browser window, the red dots appear. Chat pings, new emails, unresolved comments on a doc you haven’t looked at in two days—they all clamor for your attention. Before you know it, the quick thing you needed to look up has morphed into an hour of answering questions and putting out fires. You didn’t just lose your place in the code; you lost your afternoon.

I’ve been thinking a lot about this friction lately, especially as I’ve moved more of my workflow into the Gemini CLI. If we want AI to be a true partner in our development process, it can’t just live in a silo. It needs access to the context of our work—and for most of us, that context is locked away in the cloud, in documents, chats, and calendars.

That’s why I built the Google Workspace extension for Gemini CLI.

Giving the Agent “Senses

We often talk about AI agents in the abstract, but their utility is defined by their boundaries. An agent that can only see your code is a great coding partner. An agent that can see your code and your design documents and your team’s chat history? That’s a teammate.

This extension connects the Gemini CLI to the Google Workspace APIs, effectively giving your terminal-based AI a set of digital senses and hands. It’s not just about reading data; it’s about integrating that data into your active workflow.

Here is what that looks like in practice:

1. Contextual Coding

Instead of copying and pasting requirements from a browser window, you can now ask Gemini to pull the context directly.

“Find the ‘Project Atlas Design Doc’ in Drive, read the section on API authentication, and help me scaffold the middleware based on those specs.”

2. Managing the Day

I often get lost in work and lose track of time. Now, I can simply ask my terminal:

“Check my calendar for the rest of the day. Do I have any blocks of free time longer than two hours to focus on this migration?”

3. Seamless Communication

Sometimes you just need to drop a quick note without leaving your environment.

“Send a message to the ‘Core Eng’ chat space letting them know the deployment is starting now.”

The Accidental Product

Truth be told, I didn’t set out to build a product. When I first joined Google DeepMind, this was simply my “starter project.” My manager suggested I spend a few weeks experimenting with Google Workspace and our agentic capabilities, and the Gemini CLI seemed like the perfect sandbox for that kind of exploration.

I started building purely for myself, guided by my own daily friction. I wanted to see if I could check my calendar without leaving the terminal. Then I wanted to see if I could pull specs from a Doc. I followed the path of my own curiosity, adding tools one by one.

But when I shared this little experiment with a few colleagues, the reaction was immediate. They didn’t just think it was cool; they wanted to install it. That’s when I realized this wasn’t just a personal hack—it was a shared need. It snowballed from a few scripts into a full-fledged extension that we knew we had to ship.

Under the Hood

The extension is built as a Model Context Protocol (MCP) server, which means it runs locally on your machine. It uses your own OAuth credentials, so your data never passes through a third-party server. It’s direct communication between your local CLI and the Google APIs.

It currently supports a wide range of tools across the Workspace suite:

  • Docs & Drive: Search for files, read content, and even create new docs from markdown.
  • Calendar: List events, find free time, and schedule meetings.
  • Gmail: Search threads, read emails, and draft replies.
  • Chat: Send messages and list spaces.

Why This Matters

This goes back to the idea of “Small Tools, Big Ideas.” Individually, a command-line tool to read a calendar isn’t revolutionary. But when you combine that capability with the reasoning engine of a large language model, it becomes something else entirely.

It turns your terminal into a cockpit for your entire digital work life. It allows you to script interactions between your code and your company’s knowledge base. It reduces the friction of context switching, letting you stay where you are most productive.

If you want to try it out, the extension is open source and available now. You can install it directly into the Gemini CLI:

gemini extensions install https://github.com/gemini-cli-extensions/workspace

I’m curious to see how you all use this. Does it change your workflow? Does it keep you in the flow longer? Give it a spin and let me know.

A manager, dressed in a suit, stands in the center conducting a "jazz band" composed of three glowing, transparent blue AI agents playing a piano, trumpet, and holding sheet music, with a human bass player in the background. The background is dark blue with subtle lines of code and glowing dots.

The Manager’s Edge in the Age of AI

I was catching up with an old friend last week when I shared a hypothesis that’s been on my mind: people who have experience managing, coaching, or directing others might have a surprising advantage in the age of AI. He encouraged me to write about it, and here we are. The core of the idea is this: there’s a subtle art to getting the best out of people, and I’m beginning to believe the same is true for getting the best out of our AI partners.

It’s a strange disconnect I’m seeing everywhere. For all the buzz, a surprising number of companies are struggling to turn their AI experiments into real, lasting value. The latest McKinsey Global Survey on AI found that while about three-quarters of organizations are using generative AI, many pilots are stalling out. And it turns out, the problem usually isn’t the tech. The Boston Consulting Group (BCG) puts it bluntly with their “10-20-70 rule”: AI success is about 10% algorithms, 20% technology, and a massive 70% people and processes. It’s a leadership challenge, not a technical one. A people problem, not a silicon one.

This brings me back to my hypothesis. My gut tells me that successful managers have a head start in this new world because we’ve been trained—formally or through the hard school of experience—to be ruthlessly clear in our communication. We learn to define what success looks like, provide guardrails for the work, and then guide it with a steady hand through gentle correction and continuous feedback.

I’ve seen this play out as talented developers try to adopt these new tools. Many struggle, but I’ve noticed a recurring pattern: they fail to give the model enough context, get a generic or wrong answer, and walk away thinking the AI isn’t smart enough.

When this generation of LLMs first arrived, it was natural to treat them like a search engine—ask a simple question and expect a perfect answer. But that’s like walking up to a new junior engineer on your team, saying, “Build me a login system,” and expecting a production-ready feature a week later. You’d never do that.

You’d give them architectural documents, point them to existing libraries, explain the security requirements, and set up regular check-ins. You’d provide the context, the constraints, and the success criteria.

This is the heart of the matter. The very same principles apply when working with an AI. A vague prompt like, “Write a blog post on prompt engineering,” will produce a generic, soulless article. But a more “managerial” prompt changes the game entirely: “Synthesize a 2,000-word blog post on prompt engineering using the research and references provided in this document. Here is an outline to follow. Ensure the tone and style match these three writing samples.”

Suddenly, you’re not just a user asking a question. You are a manager setting a clear direction. What we call “prompt engineering” is, in many ways, a new form of management. The research community is even starting to use a more fitting term: “context engineering“—the strategic curation of the entire information environment in which the AI operates.

When you see it this way, the parallels between managing people and directing AI are impossible to ignore. A manager’s ability to articulate a clear vision becomes the skill of crafting a precise prompt. The strategic delegation of tasks becomes the art of defining the AI’s role, deciding which work is best for the model and which needs a human’s creative or empathetic judgment. And the rhythm of performance management—monitoring progress and giving feedback—is a perfect mirror of the iterative AI workflow, where we critically evaluate an output and refine our prompts to get closer to the goal.

This isn’t to say that every developer needs to become a people manager. Of course, many ICs are brilliant communicators, but the daily work of management is a constant exercise in clarity and context-setting. It strongly suggests that the “soft skills” of management—clarity, context-setting, and iterative feedback—are becoming the new essential “hard skills” for the AI-first era. Our job is no longer just to write the code, but to effectively guide the intelligence that will help us write it. We are all becoming managers of a different kind of mind.

This is just the beginning, and it points to a powerful new workflow. As Simon Willison has observed, models are getting remarkably good at writing prompts themselves. This indicates that prompt creation itself is a task perfectly suited for AI. So here is the call to action: before you dive into solving a complex problem, make your first step a collaboration with an AI to build the perfect prompt for the job. This is the next layer of abstraction. We are moving beyond simply giving instructions to strategizing with our AI partners about what the best instructions should be. The core managerial skill of setting a clear, high-level mission remains—only now, we’re applying it to the meta-task of designing the conversation itself.

A cute cartoon purple bear mascot is on a golden ribbon with "Gemini Scribe" written on it. The background is a collage of two photos: the top half shows the Sydney Opera House at sunset, and the bottom half shows a laptop on a table by a pool with the ocean in the distance.

What I Did On My Summer Vacation

Every year, like clockwork, the first assignment back at school was the same: a short essay on what you did over the summer. It was a ritual of sorts, a gentle reentry into the world of homework and deadlines, usually accompanied by a gallery of crayon drawings of camping trips and beach outings.

My summer had all the makings of a classic entry. There was a trip to Australia and Fiji. I could write about the impossible blue of the water in the South Pacific, or the iconic silhouette of the Sydney Opera House against a setting sun. I have the photos to prove it. It was, by all accounts, a proper vacation.

But if I’m being honest, my most memorable trip wasn’t to a beach or a city. It was a two-week detour into the heart of my own code, building something that had been quietly nagging at me for months. While my family slept and the ocean hummed outside our window, I was on a different kind of adventure: one that took place entirely on my laptop, fueled by hotel coffee and a persistent idea I couldn’t shake. I was building an agent for Gemini Scribe.

The Genesis of an Idea

So why spend a vacation hunched over a keyboard? Because an idea was bothering me. The existing chat mode in Gemini Scribe was useful, but it was fundamentally limited. It operated on a simple, one-shot basis: you’d ask a question, and it would give you an answer. It was a powerful tool for quick queries or generating text, but it wasn’t a true partner in the writing process. It was like having a brilliant research assistant who had no short-term memory.

My work on the Gemini CLI was a huge part of this. As we described in our announcement post, we built the CLI to be a powerful, open-source AI agent for developers. It brings a conversational, tool-based experience directly to the terminal, and it’s brilliant at what it does. But its success made me wonder: what would an agent look like if it wasn’t built for a developer’s terminal, but for a writer’s notebook?

I imagined an experience that was less about executing discrete commands and more about engaging in a continuous, creative dialogue. The CLI is perfect for scripting and automation, but I wanted to build an agent that could handle the messy, iterative, and often unpredictable process of thinking and writing. I needed a sandbox to explore these ideas—a place to build and break things without disrupting the focused, developer-centric mission of the Gemini CLI.

Gemini Scribe was the perfect answer. It was my own personal lab. I wanted to be able to give it complex, multi-step tasks that mirrored how I actually work, like saying, “Read these three notes, find the common themes, and then use that to draft an outline in this new file.” With the old system, that was impossible. I was the human glue, copying and pasting, managing the context, and stitching together the outputs from a dozen different prompts. The AI was smart, but it couldn’t act.

It was this friction, this gap between what the tool was and what it could be, that I couldn’t let go of. It wasn’t just about adding a new feature; it was about fundamentally changing my relationship with the software. I didn’t want a tool I could command; I wanted a partner I could collaborate with. And so, with the Pacific as my backdrop, I started to build it.

A Creative Detour in Paradise

This wasn’t a frantic sprint. It was the opposite: a project defined by having the time and space to explore. Looking back at the commit history from July is like re-watching a time-lapse of a building being constructed, but one with very civilized hours. The work began in earnest on July 7th with the foundational architecture, built during the quiet early mornings in our Sydney hotel room while my family was still asleep.

A panoramic view of the Sydney skyline at sunset, featuring the Sydney Opera House and surrounding waterfront, with boats on the harbor and city lights beginning to illuminate.

By July 11th, the project had found its rhythm. That was the day the agent got its hands, with the first real tools like google_search and move_file. I remember a focused afternoon of debugging, patiently working through the stubborn formatting requirements of the Google AI SDK’s functionDeclarations. There was no rush, just the satisfying puzzle of getting it right.

Much of the user experience work happened during downtime. From a lounge chair by the beach in Fiji on July 15th, I implemented the @mention system to make adding files to the agent’s context feel more natural. I built a collapsible context panel and polished the session history, all with the freedom to put the laptop down whenever I got tired or frustrated.

A laptop displaying the word 'GEMINI' on its screen, placed on a wooden table with a view of the ocean and palm trees in the background.

Of course, some challenges required deeper focus. On July 16th, I had to build a LoopDetector—a crucial safety net to keep the agent from getting stuck in an infinite execution cycle. I remember wrestling with that logic while looking out over the ocean, a surreal but incredibly motivating environment. The following days were spent calmly adding session-level settings and permissions.

The final phase was about patiently testing and documenting. I wrote dozens of tests, updated the README, and fixed the small bugs that only reveal themselves through use. It was the process of turning a fun exploration into a polished, reliable feature. The first time I gave it a truly complex task—and watched it work, step-by-step, without a single hiccup—was the “aha!” moment. It felt like magic, born not from pressure, but from possibility.

What Agent Mode Really Is

So, what did all that creative exploration actually create? Agent Mode is a persistent, conversational partner for your writing. Instead of a one-off command, you now have a continuous session where the AI remembers what you’ve discussed and what it has done. It’s a research assistant and a writing partner rolled into one.

You can give it high-level goals, and it will figure out the steps to get there. It uses its tools to read your notes, search the web for new information, and even edit your files directly. When you give it a task, you can see its plan, watch it execute each step, and see the results in real-time.

It’s the difference between asking a librarian for a single book and having them join you at your table to help you research and write your entire paper. You can ask it to do things like, “Review my last three posts on AI, find the common threads, and draft an outline for a new post that combines those key themes.” Then you can watch it happen, all within your notes.

The Best Souvenirs

In the end, I came back with a tan and a camera roll full of beautiful photos. But the best souvenir from my trip was the one I built myself. For those of us who love to create, sometimes the most restorative thing you can do on a vacation is to find the time and space to build something you’re truly passionate about. It’s a reminder that the most exciting frontiers aren’t always on a map.

Agent Mode is now available in the latest version of Gemini Scribe. I’m incredibly excited about the new possibilities it opens up, and I can’t wait to see what you do with it. Please give it a try, and come join the conversation on GitHub to share your feedback and ideas. I’d love to hear what you think.

A hand points to an open journal or report, bathed in a bright spotlight against a dark background. The left page contains a structured, numerical report, and the right page shows a coherent narrative summary. This visually represents the transformation of data into a story.

The Examined Life of a Developer

The Problem of Visibility

The air in the office seems to thin a little as September rolls around, a familiar tension settling in as we all turn to the task of documenting our work. For many of us, this is a straightforward process. Our internal tools—our internal issue tracker, our company’s homegrown SCM, our project trackers—are designed to capture and report on every line of code, every bug fixed, and every feature shipped.

But what about the work that happens outside of those well-lit walls?

Lately, our team has been deeply invested in open source, pouring countless hours into a project like the Gemini CLI. It’s exciting, valuable work. It builds our skills, strengthens the community, and provides a powerful public-facing tool. Yet, none of our internal reporting tools are wired to track the PRs I’ve reviewed, the issues I’ve triaged, or the new features I’ve authored in a public repository. It’s a classic modern engineering problem: your work is everywhere, but your metrics are only in one place.

I needed a way to bridge that gap. I wanted a comprehensive view of my contributions that didn’t just exist in a list of commits but told a story of my impact. I needed something that could remind me of the little things—the code reviews, the issue comments—that are often the most valuable part of open source collaboration. So, I did what any engineer would do: I built a small tool to solve a big problem. This led me to create the GitHub Activity Reporter.

From Utility to Narrative

My initial idea was modest. I wanted a script that could query the GitHub API for my activity across specific repositories and organizations. It would pull in my authored pull requests, issues I created, and even the “orphan” commits that aren’t yet tied to a PR. But as I started building it, my thinking shifted. A raw data dump is helpful for a spreadsheet, but for a performance review, you need a narrative. You need a story.

I’ve always been a believer in the philosophy of “small tools, big ideas.” I’ve found that some of the most profound solutions start with a simple, focused utility. In this case, the big idea wasn’t just to report on my activity but to give that activity a voice. By integrating with Google’s Gemini API, I realized I could transform a dry, structured report into a human-readable narrative. The tool could do the heavy lifting of data collection and then use the AI to tell a coherent, compelling story.

To show you what that looks like, here is a report from a recent week on the Gemini CLI. The first part is the raw data straight from the activity report, and the second is the narrative generated by the AI.

A Week on Gemini CLI

Structured Report

# GitHub Activity Report for allenhutchison
**Period:** `2025-09-07` to `2025-09-13`
**Repositories:** google-gemini/gemini-cli

## 📝 Contributions
_Pull requests, issues, and commits authored by you_

### Pull Requests Authored
- [#8348](https://github.com/google-gemini/gemini-cli/pull/8348) - feat(cli): configure policy engine from existing settings _(open)_
  - [`fccd753`]([https://github.com/google-gemini/gemini-cli/commit/fccd7530fb5574a726ef5db5fe8ad3f155474b3d](https://github.com/google-gemini/gemini-cli/commit/fccd7530fb5574a726ef5db5fe8ad3f155474b3d)) - feat(cli): configure policy engine from existing settings
- [#8078](https://github.com/google-gemini/gemini-cli/pull/8078) - feat: Tool Integration with PolicyEngine (PR 2 of #7231) _(open)_
  - [`e35ae54`]([https://github.com/google-gemini/gemini-cli/commit/e35ae5425547abb492415f604378692795c89569](https://github.com/google-gemini/gemini-cli/commit/e35ae5425547abb492415f604378692795c89569)) - feat(core): implement Tool Confirmation Message Bus foundation (#7231)
  - [`dccd03a`]([https://github.com/google-gemini/gemini-cli/commit/dccd03a6d97c02a004359a52f80c0fada5318625](https://github.com/google-gemini/gemini-cli/commit/dccd03a6d97c02a004359a52f80c0fada5318625)) - fix(policy): address security issue in PolicyEngine argument matching
  - [`805270b`]([https://github.com/google-gemini/gemini-cli/commit/805270bb1f9cb4ff7d70a5a8d639fac949dd0f5b](https://github.com/google-gemini/gemini-cli/commit/805270bb1f9cb4ff7d70a5a8d639fac949dd0f5b)) - fix(policy): prevent stack overflow from circular references in stableStringify
  - [`f2ea10a`]([https://github.com/google-gemini/gemini-cli/commit/f2ea10a46adc8ae79fd47750e4cefe94bfcdc21d](https://github.com/google-gemini/gemini-cli/commit/f2ea10a46adc8ae79fd47750e4cefe94bfcdc21d)) - fix(policy-engine): address high-severity security issues in stableStringify
  - [`679f05e`]([https://github.com/google-gemini/gemini-cli/commit/679f05eb336097b34d5c3881c5925349f33a5175](https://github.com/google-gemini/gemini-cli/commit/679f05eb336097b34d5c3881c5925349f33a5175)) - fix(tests): resolve TypeScript build errors in policy-engine tests
  - ... and 7 more commits

### Issues Created
- No issues created during this period.

### Work in Progress
_Commits not yet part of a pull request_

#### `google-gemini/gemini-cli`
- [`ba85aa4`]([https://github.com/google-gemini/gemini-cli/commit/ba85aa49c7661dde884255679f925c787a678757](https://github.com/google-gemini/gemini-cli/commit/ba85aa49c7661dde884255679f925c787a678757)) - feat(core): Tool Confirmation Message Bus foundation (PR 1 of 3) (#7835)
- [`ef9469a`]([https://github.com/google-gemini/gemini-cli/commit/ef9469a417b3631544e329b0845098a5b042c7f4](https://github.com/google-gemini/gemini-cli/commit/ef9469a417b3631544e329b0845098a5b042c7f4)) - feat(commands): Add new commands for docs, git, and PR review (#7853)

## 🔧 Maintainer Work
_Code reviews, issue triage, and community engagement_

### Pull Requests Reviewed
- [#8305](https://github.com/google-gemini/gemini-cli/pull/8305) - feat(cli) Custom Commands work in Non-Interactive/Headless Mode _(open)_
- [#7347](https://github.com/google-gemini/gemini-cli/pull/7347) - feat: Add a `--session-summary` flag _(closed)_
- [#5393](https://github.com/google-gemini/gemini-cli/pull/5393) - feat(core): Add side-effect metadata to tools for safer execution _(open)_
- [#4102](https://github.com/google-gemini/gemini-cli/pull/4102) - docs: Clarify import processor security model _(open)_
- [#2943](https://github.com/google-gemini/gemini-cli/pull/2943) - Always allow should be smart about subcommands using a safety analyzer _(open)_
- [#1396](https://github.com/google-gemini/gemini-cli/pull/1396) - docs: add screenshot to README _(closed)_
- [#5814](https://github.com/google-gemini/gemini-cli/pull/5814) - feat(cli): validate model names with precedence and concise startup logs _(closed)_
- [#8086](https://github.com/google-gemini/gemini-cli/pull/8086) - Add .geminiignore support to the glob tool. _(closed)_
- [#7660](https://github.com/google-gemini/gemini-cli/pull/7660) - feat: use largest windows runner for ci _(closed)_
- [#7850](https://github.com/google-gemini/gemini-cli/pull/7850) - feat: add cached string width function for performance optimization _(closed)_
- [#7913](https://github.com/google-gemini/gemini-cli/pull/7913) - Mention replacements for deprecated settings in settings.json _(closed)_

### Pull Requests Closed/Merged
- [#7853](https://github.com/google-gemini/gemini-cli/pull/7853) - feat(commands): Add new commands for docs, git, and PR review _(merged (author))_
- [#7835](https://github.com/google-gemini/gemini-cli/pull/7835) - feat(core): Tool Confirmation Message Bus foundation (PR 1 of 3) _(merged (author))_
- [#8086](https://github.com/google-gemini/gemini-cli/pull/8086) - Add .geminiignore support to the glob tool. _(merged (reviewed))_
- [#7913](https://github.google.com/google-gemini/gemini-cli/pull/7913) - Mention replacements for deprecated settings in settings.json _(merged (reviewed))_
- [#7850](https://github.com/google-gemini/gemini-cli/pull/7850) - feat: add cached string width function for performance optimization _(merged (reviewed))_
- [#7660](https://github.com/google-gemini/gemini-cli/pull/7660) - feat: use largest windows runner for ci _(closed (reviewed))_
- [#5814](https://github.com/google-gemini/gemini-cli/pull/5814) - feat(cli): validate model names with precedence and concise startup logs _(closed (reviewed))_

### Issue Engagement
- [#8022](https://github.com/google-gemini/gemini-cli/issues/8022) - Structured JSON Output _(mentioned, commented, closed)_
- [#7113](https://github.com/google-gemini/gemini-cli/issues/7113) - /setup-github returns 404 not found _(commented, open)_
- [#5435](https://github.com/google-gemini/gemini-cli/issues/5435) - Commands Should work in Non-Interactive Mode _(mentioned, commented, assigned, open)_
- [#7763](https://github.com/google-gemini/gemini-cli/issues/7763) - Release Failed for v0.3.2 || "N/A" on 2025-09-04 _(mentioned, closed)_
- [#3132](https://github.com/google-gemini/gemini-cli/issues/3132) - Support SubAgent architecture _(assigned, open)_

### Issues Closed
- [#8022](https://github.com/google-gemini/gemini-cli/issues/8022) - Structured JSON Output _(closed after commenting)_

---
_Report generated on 2025-09-13_

Narrative Summary

Gemini CLI: A Week of Enhanced Intelligence, Security, and Collaboration

This past week, allenhutchison made significant strides in advancing the google-gemini/gemini-cli, focusing on critical enhancements to the platform’s intelligent tooling, robust security, and developer productivity. Key accomplishments include laying the groundwork for a more configurable and secure Policy Engine, integrating intelligent tool confirmation mechanisms, introducing new commands to streamline developer workflows, and addressing several high-priority security vulnerabilities. Beyond direct contributions, active engagement in code reviews and issue management further solidified the project’s stability and fostered community collaboration.


Pioneering Safer AI Tooling with the Policy Engine

A major theme of the week’s work revolved around making the gemini-cli‘s AI tools more intelligent, secure, and user-friendly, particularly through the Policy Engine. This component is vital for ensuring that AI-driven actions are executed safely, adhere to predefined rules, and respect user intent.

  • Configurable Policy Engine (PR #8348): Significant progress was made on a new feature that will allow the Policy Engine to be configured directly from existing settings. This feat(cli): configure policy engine from existing settings aims to simplify the setup and management of safety policies, making it easier for users to customize how their AI tools operate. While still under review, this PR is a key step towards a more adaptable and powerful security layer.
  • Intelligent Tool Integration and Confirmation (PR #8078, building on #7231 & #7835): This comprehensive pull request represents the second phase of a larger initiative to seamlessly integrate AI tools with the Policy Engine, enhancing user control and transparency.
  • Message Bus Foundation: The work builds upon the feat(core): implement Tool Confirmation Message Bus foundation (PR #7835 and commit e35ae54), which establishes a core communication channel for tools to interact with the system and potentially seek user confirmation before executing sensitive actions. This is crucial for transparency and preventing unintended side effects.
  • Web-Search Tool Integration: A concrete example of this integration is the feat(tools): integrate PolicyEngine with web-search tool (commit 2be4777), demonstrating how the Policy Engine will govern access and execution for external tools, starting with web searches.

Boosting Developer Productivity with New CLI Commands

Improving developer experience was also a priority, with the introduction of new commands designed to streamline common workflows directly within the CLI.

  • New Productivity Commands (PR #7853, merged): This impactful contribution added new commands for docs, git, and PR review. These commands empower developers to manage documentation, interact with Git repositories, and review pull requests without switching context, significantly enhancing workflow efficiency.
  • Non-Interactive Command Execution (PR #8305, reviewed): Related to issue #5435, work was reviewed to enable Custom Commands work in Non-Interactive/Headless Mode. This is crucial for enabling automation and scripting, allowing the CLI to be integrated into CI/CD pipelines or other automated systems without requiring manual intervention.

Fortifying Security and Stability

The week also saw a strong focus on enhancing the security and stability of the gemini-cli, particularly within the critical Policy Engine component.

  • Addressing Critical Policy Engine Vulnerabilities (PR #8078 commits): Several high-priority security fixes were implemented to safeguard the Policy Engine:
  • fix(policy): address security issue in PolicyEngine argument matching (commit dccd03a) ensures that tool arguments are correctly and securely processed, preventing potential injection or manipulation.
  • fix(policy-engine): address high-severity security issues in stableStringify (commit f2ea10a) and fix(policy-engine): address critical security issues and improve documentation (commit d693fbf) resolve vulnerabilities related to how data is serialized, preventing potential data integrity or exposure issues.
  • fix(message-bus): use safeJsonStringify for error messages (commit c3c8de8) further hardens error handling to prevent sensitive information leaks.
  • Preventing Stack Overflow Issues: A crucial stability fix, fix(policy): prevent stack overflow from circular references in stableStringify (commit 805270b), was implemented to make the Policy Engine more robust and reliable, especially when dealing with complex or recursive data structures.
  • Ensuring Code Quality: Underlying infrastructure work, including fix(tests): resolve TypeScript build errors in policy-engine tests (commit 679f05e) and Fix lint (commit c35d83c), ensured the stability and maintainability of the codebase supporting these critical features.

Community Collaboration and Project Health

Beyond direct code contributions, allenhutchison actively engaged with the google-gemini/gemini-cli community, contributing to overall project health through diligent code reviews and issue management.

  • Active Code Review and Merged Contributions: Several pull requests from other contributors were reviewed, guiding them to successful merger or closure, demonstrating a commitment to code quality and collaboration:
  • Enhanced Functionality: Reviewed and merged Add .geminiignore support to the glob tool (PR #8086), providing more granular control over file processing.
  • Performance Optimization: Guided the merger of feat: add cached string width function for performance optimization (PR #7850), improving the CLI’s responsiveness.
  • Improved User Guidance: Reviewed and merged Mention replacements for deprecated settings in settings.json (PR #7913), enhancing documentation for users.
  • Infrastructure Improvements: Provided feedback on feat: use largest windows runner for ci (PR #7660) and feat(cli): validate model names with precedence and concise startup logs (PR #5814), contributing to more robust CI/CD and CLI startup.
  • Reviewed several other open PRs, including features like --session-summary (PR #7347) and Add side-effect metadata to tools (PR #5393), and documentation updates (PR #4102).
  • Proactive Issue Management: Engaged with critical issues, demonstrating responsiveness to user feedback and project needs:
  • Resolution: Closed issue #8022, “Structured JSON Output,” after providing input and confirming resolution.
  • Guidance & Ownership: Commented on issue #7113 concerning a 404 error and was assigned to issue #3132, “Support SubAgent architecture,” indicating leadership on future architectural work. Active engagement on #5435, “Commands Should work in Non-Interactive Mode,” directly links to the ongoing work in PR #8305.

This week’s activity paints a clear picture of comprehensive development, combining forward-looking feature development with critical security and stability improvements. The ongoing work on the Policy Engine and Tool Confirmation Message Bus (PRs #8348, #8078) promises a more secure and intelligent gemini-cli, while merged features like new productivity commands (PR #7853) deliver immediate value to developers. Coupled with robust code reviews and issue management, these contributions significantly bolster the google-gemini/gemini-cli‘s capabilities, security posture, and collaborative environment. As these open features progress, users can anticipate an even more powerful, trustworthy, and user-friendly command-line experience.

From Metrics to Mindful Reflection

Socrates famously said, “The unexamined life is not worth living.” This isn’t just a philosophical idea—it’s a fundamental principle for a thriving engineering practice. While the structured report is a great list of “what” you did, it doesn’t tell you “why” or “how” you did it. It doesn’t tell you if you achieved what you set out to do at the beginning of the week.

The true value of a tool like the GitHub Activity Reporter is not in presenting the raw data, but in prompting a deeper level of reflection. Looking at the AI’s narrative, you can ask yourself:

  • Did I focus on the right things? Did I get to the key feature I planned to build, or did other issues and distractions take over?
  • What were the blockers? Were there issues that consumed my time without leading to a merged PR or a closed issue? The report can help you identify these hidden bottlenecks.
  • What was the true impact? Did my contributions, reviews, and issue engagement genuinely move the project forward? Did they help other contributors, or were they just administrative work?

The AI’s ability to synthesize your actions into a cohesive story allows you to see the forest, not just the trees. It’s a powerful tool for a weekly check-in, an on-call handover, or a periodic self-assessment, helping you align your efforts with your goals and grow as a contributor.

A Quick Start

Ready to run the tool for yourself? After setting up your GitHub and Gemini API keys (see the repository’s README for details), you can generate a report just like the one above with a single command:

python github_report.py --start-date 2025-09-07 --repos your-org/your-repo --narrative

A Call to Reflection

The world of engineering is no longer confined to a single company’s walls. We contribute to open source, we collaborate across teams, and our work exists in many different places. This requires us to be more intentional about how we track and reflect on our contributions.

By building a simple tool that leverages AI to tell a compelling story, I’ve found a way to not just see my work, but to understand it. I encourage you to check out the GitHub Activity Reporter, run the tool for yourself, and discover how a small, focused utility can help you capture and reflect on your own narrative. The story of our work is one we all get to tell, and with the right tools, it becomes that much easier to make it count.

A conceptual hero image for a blog post. An open book lies on a surface with a pen. From the right page, a holographic, futuristic city skyline rises, representing Silicon Valley. A glowing brain icon, symbolizing AI, floats above the city, connected by lines of light. The text "One Year of Building with AI" is on the left page and "Silicon Valley Insights" is on the right.

One Year of Letters from Silicon Valley

A year ago, I hit “publish” on the first post for Letters from Silicon Valley, not knowing where it would lead. I just knew I wanted to write about the messy, hands-on process of building with AI. Twelve months later, the blog has become a record of experiments, discoveries, and more than a few wrong turns that taught me something valuable.

When I started, I had a specific itch to scratch. I wanted to see what would happen if I took a large, personally meaningful dataset—in my case, nearly two decades of podcasts—and built an AI system around it. My hunch was that somewhere in those thousands of hours of stories and interviews was a hidden web of ideas I could surface with the right tools. I wasn’t chasing an abstract “AI project”; I was building something for myself, something that could finally answer the question: “Where did I hear that thing about…?”

But there was a deeper reason, too. I had just come off a role managing very large teams and was intentional about what I wanted next. I wanted more time with my hands on a keyboard, building things that were helpful to me and others. I wanted to help developers understand how to use AI in their own work and explain core concepts—like I did in my series on embeddings—in a way that was accessible and grounded in real use. Most importantly, I wanted to reconnect with the simple satisfaction of writing code that solves my own problems.

I found the perfect environment for this on the AI Developer team, working alongside the people behind the Gemini API, AI Studio, Colab, and Kaggle. The team’s maturity freed me from constant hands-on management, giving me the space to build and write. At first, my schedule felt too unpredictable for mission-critical work, so building open-source projects and writing about them was the ideal way to contribute. It also let me lead by example, showing the kind of developer engagement I hoped to inspire.

As the year went on, I grew more comfortable with my schedule and began taking on core projects. The biggest of these is the Gemini CLI, which grew directly from the philosophy of this blog: solve real developer needs through hands-on experimentation.

Along the way, I built and released two other open-source projects:

  • Podcast Rag: Tools for downloading, transcribing, embedding, and searching podcast archives, which grew directly from my initial project.
  • Gemini Scribe: An Obsidian plugin that turns your notes into an interactive workspace with AI-powered recall, summarization, and writing support.

These projects became both proofs-of-concept for ideas I’ve shared here and real tools that others can adopt, modify, and build on.

Looking back, the throughline is clear: building with AI isn’t about replacing what I know—it’s about reframing what’s possible. The best work this year came from combining my own experience with the model’s speed and breadth, letting each push the other in new directions. That’s the spirit I plan to carry into year two.

📅 Year One Recap

September 2024: The Podcast Project

My first posts documented the journey of turning two decades of listening into a searchable, AI-powered personal knowledge base.

October 2024: The Embeddings Series

A deep dive into one of the most important—and misunderstood—concepts in modern AI, showing how I used them in the podcast project.

November 2024

December 2024

March 2025

April 2025

May 2025

June 2025

July 2025

August 2025

What’s Next

Year two will bring more of the same, just with more intention. I started year one with an ambitious goal of publishing weekly, but quickly learned that pace wasn’t sustainable. This year, I’m aiming for at least two thoughtful posts a month—a balance that allows for a regular cadence and the breathing room to go deep.

The explainer series on embeddings was some of the most-read content I published, and I plan to do more of that. There are plenty of concepts in modern AI that could use the same treatment, and it’s a great way for me to learn alongside my readers.

At the same time, not every post needs to be a 10,000-word essay. I plan to mix in more short pieces—quick takes, reactions, and smaller ideas worth sharing in the moment. I enjoy the variety on Simon Willison’s Weblog, where short links and deep dives sit comfortably side-by-side, and I’d like to bring more of that spirit here.

When I launched this blog, I imagined it covering more than just AI. My “About Me” page mentions guitar building and woodworking, but I’ve hesitated to bring those topics in, worried they might feel “off-topic” for those who subscribed for AI content. This year, I’m going to embrace it. Those interests are part of the picture, and they may connect to the technical work in ways I don’t yet expect.

Finally, I’ve been inspired by the personal, thoughtful writing of former colleagues like Brian Brown (Changing Coordinates) and Chris DiBona (Substack). I hope to try a few posts in that spirit as well, sharing ideas that don’t fit into a narrow category but feel important to explore.

A cheerful, cartoon-style purple bear with a large head and big eyes is sitting at a desk, happily using a computer with a text editor open on the screen. A section of the text is highlighted.

A More Precise Way to Rewrite in Gemini Scribe

I’ve been remiss in posting updates, but I wanted to take a moment to highlight a significant enhancement to Gemini Scribe that streamlines the writing and editing process: the selection-based rewrite feature. This powerful tool replaced the previous full-file rewrite functionality, offering a more precise, intuitive, and safer way to collaborate with AI on your documents.

What’s New?

Instead of rewriting an entire file, you can now select any portion of your text and have the AI rewrite just that part based on your instructions. Whether you need to make a paragraph more concise, fix grammar in a sentence, or change the tone of a section, this new feature gives you surgical precision.

How It Works

Using the new feature is simple:

  1. Select the text you want to rewrite in your editor.
  2. Right-click on the selection and choose “Rewrite with Gemini” from the context menu, or trigger the command from the command palette.
  3. A dialog will appear showing you the selected text and asking for your instructions.
  4. Type in what you want to change (e.g., “make this more formal,” “simplify this concept,” or “fix spelling and grammar”), and the AI will get to work.
  5. The selected text is then replaced with the AI-generated version, while the rest of your document remains untouched.

Behind the scenes, the plugin sends the full content of your note to the AI for context, with special markers indicating the selected portion. This allows the AI to maintain the style, tone, and flow of your document, ensuring the rewritten text fits in seamlessly.

Why This is Better

The previous rewrite feature was an all-or-nothing affair, which could sometimes lead to unexpected changes or loss of content. This new selection-based approach is a major improvement for several reasons:

  • Precision and Control: You have complete control over what gets rewritten, down to a single word.
  • Safety: There’s no risk of accidentally overwriting parts of your document you wanted to keep.
  • Iterative Workflow: It encourages a more iterative and collaborative workflow. You can refine your document section by section, making small, incremental improvements.
  • Speed and Efficiency: It’s much faster to rewrite a small selection than an entire document, making the process more interactive and fluid.

This new feature is designed to feel like a natural extension of the editing process, making AI-assisted writing more of a partnership.

A Note on the ‘Rewrite’ Checkbox

I’ve received some feedback about the removal of the “rewrite” checkbox from the normal mode. I want to thank you for that feedback and address it directly. There are a couple of key reasons why I decided to remove this feature in favor of the new selection-based rewriting.

First, I found it difficult to get predictable results with the old mechanism. The model would sometimes overwrite the entire file unexpectedly, which made the feature unreliable and risky to use. I personally rarely used it for this reason.

Second, the new Agent Mode provides a much more reliable way to replicate the old functionality. If you want to rewrite an entire file, you can simply add the file to your Agent session and describe the changes you want the AI to make. The Agent will then edit the entire file for you, giving you a more controlled and predictable outcome.

While I understand that change can be disruptive, I’m confident that the new selection-based rewriting and the Agent Mode offer a superior and safer experience. I’m always looking for ways to improve the plugin, so please continue to share your thoughts and feedback on how you’re using the new features.

The Future is Agent-ic

Ultimately, over the next several iterations of Gemini Scribe, I’ll be moving more and more functionality to the Agent Mode and merging the experience from the existing Gemini Chat Mode into the Agent. I’m hoping that this addresses a lot of feedback I’ve received over the last nine months for this plugin and creates something that is even more powerful for interacting with your notes. More on Agent Mode in a coming post.

I’m really excited about this new direction for Gemini Scribe, and I believe it will make the plugin an even more powerful tool for writers and note-takers. Please give it a try and let me know what you think!

Gemini Scribe Supercharged: A Faster, More Powerful Workflow Awaits

It’s been a little while since I last wrote about Gemini Scribe, and that’s because I’ve been deep in the guts of the plugin, tearing things apart and putting them back together in ways that make the whole experience faster, smoother, and just plain better.

One of the first things that pushed me back into the code was the rhythm of the interaction itself. Every time I typed a prompt and hit enter, I found myself waiting—watching the spinner, watching the time pass, watching the thought in my head cool off while the AI gathered its response. It didn’t feel like a conversation. It felt like submitting a form.

That’s fixed now. As of version 2.2.0, Gemini Scribe streams responses in real-time. You see the words as they’re generated, line by line, without the long pause in between. It makes a difference. The back-and-forth becomes more fluid, more natural. It pulls you into the interaction rather than holding you at arm’s length. And once I started using it this way, I couldn’t go back.

But speed was only part of it. I also wanted more control. I’ve been using custom prompts more and more in my own workflow—not just as one-off instructions, but as reusable templates for different kinds of writing tasks. And the old prompt system, while functional, wasn’t built for that kind of use.

So I rewrote it.

Version 3.0.0 introduces a completely revamped custom prompt system. You can now create and manage your prompts right from the Command Palette. That means no more hunting through settings or copying from other notes—just hit the hotkey, type what you need, and move on. Prompts are now tracked in your chat history too, so you can always see exactly what triggered a particular response. It’s a small thing, but it brings a kind of transparency to the process that I’ve found surprisingly useful.

All of this is sitting on top of a much sturdier foundation than before. A lot of the internal work in these recent releases has been about making Gemini Scribe more stable and more integrated with the rest of the Obsidian ecosystem. Instead of relying on low-level file operations, the plugin now uses the official Obsidian APIs for everything. That shift makes it more compatible with other plugins and more resilient overall. The migration from the old system happens automatically in the background—you shouldn’t even notice it, except in the way things just work better.

There’s also a new “Advanced Settings” panel for those who like to tinker. In version 3.1.0, I added dynamic model introspection, which means Gemini Scribe now knows what the model it’s talking to is actually capable of. If you’re using a Gemini model that supports temperature or top-p adjustments, the plugin will surface those controls and tune their ranges appropriately. Defaults are shown, sliders are adjusted per-model, and you get more precise control without the guesswork.

None of these changes happened overnight. They came out of weeks of using the plugin, noticing friction, and wondering how to make things feel lighter. I’ve also spent a fair bit of time fixing bugs, adding retry logic for occasional API hiccups, and sanding off the rough edges that show up only after hours of use. This version is faster, smarter, and more comfortable to live in.

There’s still more to come. Now that the architecture is solid and the foundation is in place, I’m starting to explore ways to make Gemini Scribe even more integrated with your notes—tighter context handling, more intelligent follow-ups, and better tools for shaping long-form writing. But that’s a story for another day.

For now, if you’ve been using Gemini Scribe, update to the latest version from the community plugins tab and try out the new features. And if you’ve got ideas, feedback, or just want to follow along as things evolve, come join the conversation on GitHub. I’d love to hear what you think.

Unlocking the Future of Coding: Introducing the Gemini CLI

Back in April, I wrote about waiting for the true AI coding partner. I articulated a vision for an AI that transcends mere code generation, one that truly understands context, acts autonomously within our development environments, and collaborates with us iteratively. Today, I’m thrilled to announce a significant step towards that vision: the launch of the Gemini CLI.

For too long, AI coding assistance has often felt like a disconnected assistant. While dedicated AI-powered IDEs like Cursor have made great strides, the common experience still involves copy-pasting code into a separate interface or breaking flow to get suggestions. This breaks flow, loses context, and frankly, isn’t how truly collaborative partners work. We need an AI that lives where we live—in the terminal, within our projects, and deeply integrated into our workflow.

This is precisely what the Gemini CLI sets out to achieve. It’s not just a fancy chatbot for your command line; it’s an experimental interface designed to bring the power of Gemini directly into your development loop, enabling intelligent, contextual, and actionable AI assistance.

It’s for this very reason that I’ve been quite heads-down over the last few months, working with a super talented team to bring this application to life. It has genuinely been one of my most fun experiences at Google in the 20+ years that I’ve been here, and I feel incredibly fortunate to have had the chance to collaborate with such brilliant people across the company.

The Power of Small Tools, Amplified by AI

In May, I explored the concept of small tools, big ideas. The premise was simple: complex problems are often best tackled by composing many small, powerful, and specialized tools. This philosophy is at the very heart of the Gemini CLI’s design.

Instead of a monolithic AI trying to do everything at once, the Gemini CLI empowers Gemini with a suite of familiar command-line tools. Imagine an AI that can:

  • Read and Write Files: Using read_file and write_file, it can inspect your codebase, understand existing logic, and propose modifications directly to your files.
  • Navigate Your Project: With list_directory and grep, it can explore your project structure, locate relevant files, or find specific patterns across your repository, just like you would.
  • Execute Shell Commands: The run_shell_command tool allows Gemini to execute commands, build your project, run tests, or even interact with external services, providing real-time feedback.
  • Search the Web: Need to look up an API, debug an error message, or find best practices? The google_web_search tool lets Gemini leverage the vastness of the internet to inform its responses and actions.
  • Edit with Precision: Beyond simple file writes, the edit_file tool allows for granular, diff-based modifications, ensuring changes are precise and reviewable.

This approach means Gemini isn’t guessing; it’s acting. It’s using the same building blocks you use every day, but with its powerful reasoning capabilities to orchestrate them towards your goals.

A Truly Contextual and Collaborative Partner

The Gemini CLI maintains a persistent session, remembering your conversation history, the files it has examined, and the results of previous tool executions. This “conversational memory” and contextual understanding are critical. It allows for a natural, iterative back-and-forth, where the AI builds on prior interactions and its understanding of your project state.

You can ask Gemini to:

  • “Find all JavaScript files in this directory that import React.” (Leveraging list_directory and grep)
  • “Refactor this component to use hooks.” (Involving read_file, edit_file, and potentially run_shell_command to run tests).
  • “What’s the best way to implement X in Python given these files?” (Using read_file to understand your existing code and google_web_search for best practices).

The workflow is truly interactive. Gemini proposes actions, and you have the power to approve them or guide it further. This human-in-the-loop design ensures you’re always in control, fostering a collaborative partnership rather than a black-box operation.

Built by Gemini CLI, For Everyone

It’s particularly exciting to share that this project was started by a small and scrappy team, and we leveraged Gemini CLI itself to help write Gemini CLI. Many of us now work almost exclusively within Gemini CLI, often using our IDEs only for viewing diffs.

And while its origins are in coding, Gemini CLI is incredibly versatile for many tasks outside of traditional development. Personally, I love using it to manage my home lab, to bulk rename and reformat files for my podcast project, and to generally act as a seamless go-between for anything complicated in GitHub. Increasingly, I’ve also been using Gemini CLI with Obsidian to understand and extract insights from my vault. With over 9000 files in my work vault alone, Gemini CLI lets me ask questions of the entire vault and even make large refactoring-style changes across the entire thing.

Beyond Today: Extensibility

One of the most exciting aspects of the Gemini CLI, and a direct nod to the “small tools, big ideas” philosophy, is its extensibility. The underlying architecture allows developers to define custom tools. This means you can teach Gemini to interact with your specific internal systems, proprietary APIs, or niche development tools. The possibilities are endless, transforming Gemini into an AI assistant perfectly tailored to your unique development environment.

Get Started Today

The Gemini CLI represents a significant leap forward in bringing intelligent AI assistance directly to where developers work most effectively: the command line. It’s a practical realization of the “true AI coding partner” vision, built on the principle that small, well-designed tools can achieve big ideas when orchestrated by a powerful intelligence.

Ready to try it out? Head over to the Gemini CLI GitHub repository to get started. Explore the commands, experiment with its capabilities, and let’s shape the future of AI-powered development together.

I’m incredibly excited about what this means for developer productivity and the evolving role of AI in our daily coding lives. Let me know what you build with it!

Small tools, Big Ideas

It’s a strange time to love simple things. Everywhere I look, the future seems to be rushing toward bigger models, smarter systems, and more complex layers of automation. The story of modern technology is often told as a relentless climb toward more: more intelligence, more capability, more speed. And yet, in the quiet corners of my own work, I keep finding myself drawn back to something much older and simpler. A clean note in a vault. A script with a single, clear purpose. A search box that just works. These small tools, which once felt ordinary, now feel almost radical in their elegance. In a world where everything is getting smarter, I’m finding unexpected joy in the tools that stay beautifully dumb.

Lately, I’ve been thinking a lot about Simon Willison’s llm tool — a little Python utility that gives you a command-line interface for large language models. It doesn’t hide the complexity behind a thousand settings or a shiny UI. It just gives you a simple, direct line to the model, letting you wire it into your workflows however you want. His files-to-prompt tool is another one I admire: an almost absurdly minimal way to push files into a prompt template for LLMs. Both tools feel like reminders that power doesn’t have to mean complexity. Sometimes the most transformative tools are the ones that stay small, sharp, and focused.

This same idea keeps showing up for me in other places too. I’ve been spending more time with tmux lately — not a simple tool in the sense of being easy, but a simple one in its spirit. It doesn’t try to be clever or guess what I want. It gives me a set of building blocks: panes, sessions, terminals — and lets me compose my environment exactly how I like it. Once you internalize its grammar, you realize that you’re no longer fighting your tools. You’re building with them.

In my podcast RAG project, I’ve seen this play out with Whisper too. Whisper isn’t flashy. It’s a humble little engine that quietly turns audio into text, and the latest version is astonishingly good at it. I didn’t need to fine-tune it or coax it into working. I just pointed it at my podcast archive, and it got to work. And it kept working. There’s a kind of magic in that — a tool that doesn’t require worship or endless maintenance, just quiet trust.

The same feeling hit me again recently when I started using uv for Python package management. For years, Python developers have wrestled with slow installs, dependency conflicts, and the occasional cryptic error that turns a five-minute task into a two-hour rabbit hole. uv doesn’t try to paper over those problems with another layer of complexity — it just fixes them. Installs are blindingly fast. Dependency resolution is smart and sane. Virtual environments are first-class citizens, not an afterthought. Using it feels like someone finally rebuilt the foundation without adding a skyscraper on top. It’s one of those tools that makes you wonder how you ever put up with the old way.

Then there’s Ollama, which has completely changed the way I think about local models. Before Ollama, running large language models yourself meant a tangle of Docker containers, custom scripts, GPU configurations, and crossed fingers. Now? You run ollama run, and you’re talking to a model. It’s almost unsettling how easy they’ve made it — not because they hid the power, but because they made a conscious choice to minimize the friction.

And finally, I can’t talk about this new season of rediscovery without mentioning Ghostty. Since it was released in December, Ghostty has become my daily driver for terminals. It doesn’t try to reinvent what a terminal is; it just fixes all the little things that made older terminals frustrating, and it does it with style. Fast, beautiful, reliable. It feels like someone finally sat down and asked: what if we just made this delightful?

When I step back and look at all of these tools — the tiny Python scripts, the old-school multiplexers, the whisper-quiet transcription engines, the frictionless model runners, the sleek terminals, the rebuilt package managers — I realize they all share something in common. They don’t try to be everything. They aren’t built around a fantasy of replacing me. They’re built around the idea of empowering me.

Maybe that’s the real story happening quietly in the margins of our AI-first world.

It’s not just about building bigger models or smarter systems. It’s about rebuilding the foundations — making the tools that carry us forward simpler, faster, sturdier. Tools that invite us to stay close to the work, instead of drifting away from it.

The future won’t be built by magic.

It will be built by people who still care about the foundations.