{"id":16977,"date":"2025-03-24T11:06:51","date_gmt":"2025-03-24T18:06:51","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=16977"},"modified":"2025-06-13T16:36:16","modified_gmt":"2025-06-13T23:36:16","slug":"chat-with-your-git-history-rag-couchbase-shell","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/","title":{"rendered":"Chat With Your Git History, Thanks to RAG and Couchbase Shell"},"content":{"rendered":"<p>Don&#8217;t you love reading other people&#8217;s commit messages? No? Well, I do and as I was reading a very insightful commit message, I realized all the untapped content living in various Git logs (assuming the dev you follow are writing useful messages, of course). So, wouldn&#8217;t it be great if you could ask questions to a repo? Let&#8217;s see how this can be achieved doing RAG with Couchbase Shell.<\/p>\n<p>TL;DR<\/p>\n<pre class=\"wrap:true lang:sh decode:true\"># with bash, extract your commit history to json\r\nsource git-log-json.sh &amp;&amp; git-log-json &gt; commitlog.json\r\n\r\n# with cbsh, create scope, collection and collection Primary Index\r\nscopes create gitlog; cb-env scope gitlog;collections create commits; cb-env collection commits; query \"CREATE PRIMARY INDEX ON `default`:`cbsh`.`gitlog`.`commits`\"\r\n\r\n# Import the doc in selected collection\r\nopen commitlog.json | wrap content | insert id { |it| echo $it.content.commitHash } | doc upsert\r\n\r\n# Enrich the document with default model\r\nquery \"SELECT c.*, meta().id as id, c.subject || ' ' || c.body as text FROM `commits` as c\" | wrap content| vector enrich-doc text | doc upsert\r\n\r\n# Create a Vector Index\r\nvector create-index --similarity-metric dot_product commits textVector 1536\r\n\r\n# Run RAG\r\nvector enrich-text \"gemini\" | vector search commits textVector --neighbors 20| select id |doc get| select content | reject -i content.textVector | par-each {|x| to json} | wrap content| ask \"when and in which commit was gemini llm support added\"<\/pre>\n<h2>Couchbase Shell configuration<\/h2>\n<p>The initial step is to install and configure <em>cbsh<\/em>. I am going to use my Capella instance. To get the config you can go under the <strong>Connect<\/strong> tab of your Capella cluster and select <strong>Couchbase Shell<\/strong>. This is the config under <em>[[cluster]]<\/em>. To configure the model, take a look at what&#8217;s under<em> [[llm]]<\/em>. I have chosen OpenAI but there are others. You need to define the model used for the embedding (that&#8217;s what turns text into a vector) and one for the Chat. This one takes the question and some additional context to answer the question. And of course you will need an API key.<\/p>\n<pre class=\"wrap:true lang:yaml decode:true\">version = 1\r\n\r\n[[llm]]\r\nidentifier = \"OpenAI\"\r\nprovider = \"OpenAI\"\r\nembed_model = \"text-embedding-3-small\"\r\nchat_model = \"gpt-3.5-turbo\"\r\napi_key = \"sk-proj-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\"\r\n\r\n[[cluster]]\r\nidentifier = \"capella\"\r\nconnstr = \"couchbases:\/\/cb.xxxxxxx.cloud.couchbase.com\"\r\nuser-display-name = \"Laurent Doguin\"\r\nusername = \"USER\"\r\npassword = \"PASSWORD\"\r\ndefault-bucket = \"cbsh\"\r\ndefault-scope = \"gitlog\"<\/pre>\n<p>You also need Git installed, then you should be all set.<\/p>\n<h2>Import Git commit log<\/h2>\n<p>The first step is to get all the commits of the repo in JSON. Being lazy and old, and by old I mean not used to asking an AI, I searched for this on Google, found a number of Gists, that linked to other Gists, and I finally settled <a href=\"https:\/\/gist.github.com\/april\/ee2e104b1435f3113e67663d8875bbef\" target=\"_blank\" rel=\"noopener\">on this one<\/a>.<\/p>\n<p>I downloaded it, sourced it, went into my local couchbase-shell git repo and called it.<\/p>\n<pre class=\"nums:false lang:default decode:true \">source git-log-json.sh &amp;&amp; git-log-json &gt; commitlog.json<\/pre>\n<p>But, for the benefit of the reader wondering if I made the right decision, let&#8217;s ask the configured model. Cbsh has an <em>ask<\/em> command allowing you to to this:<\/p>\n<pre class=\"wrap:true lang:sh decode:true\">\ud83d\udc64 Laurent Doguin \ud83c\udfe0 capella in \u2601\ufe0f cbsh.gitlog.commits\r\n&gt; ask \"get the full commits in json for a git repo\"\r\n\r\nTo get the full commits in a Git repository as JSON, you can use the following command:\r\n\r\ngit log --pretty=format:'{%n \"commit\": \"%H\",%n \"author\": \"%an &lt;%ae&gt;\",%n \"date\": \"%ad\",%n \"message\": \"%f\"%n},' --date=iso --reverse --all &gt; commits.json\r\n<\/pre>\n<p>This command will output each commit in the repository as a JSON object with the commit hash, author name and email, commit date, and commit message. The<code> --all<\/code> flag ensures all branches are included. The <code>--reverse<\/code> flag lists the commits in reverse chronological order. Finally, the output is redirected to a <code>commits.json<\/code> file.<\/p>\n<p>Please make sure you run this command in the root directory of the Git repository you want to get the commits from.<\/p>\n<p>And as it turns out, it does not work out of the box (shocking I know). And it did not have all the info I needed, like the body part of the message. Of course we could spend time tuning this, but it&#8217;s very specific, with lots of edge cases.<\/p>\n<p>In any case I now have a list of commits in JSON format:<\/p>\n<pre class=\"lang:js decode:true\">[\r\n  {\r\n  ....\r\n  },\r\n  {\r\n    \"author\": {\r\n      \"name\": \"Michael Nitschinger\",\r\n      \"email\": \"michael@nitschinger.at\",\r\n      \"date\": \"Thu, 20 Feb 2020 21:29:20 +0100\",\r\n      \"dateISO8601\": \"2020-02-20T21:29:20+01:00\"\r\n    },\r\n    \"body\": \"\",\r\n    \"commitHash\": \"7a0d269fffd10045a63d40ca460deba944531890\",\r\n    \"commitHashAbbreviated\": \"7a0d269\",\r\n    \"committer\": {\r\n      \"name\": \"Michael Nitschinger\",\r\n      \"email\": \"michael@nitschinger.at\",\r\n      \"date\": \"Thu, 20 Feb 2020 21:29:20 +0100\",\r\n      \"dateISO8601\": \"2020-02-20T21:29:20+01:00\"\r\n    },\r\n    \"encoding\": \"\",\r\n    \"notes\": \"\",\r\n    \"parent\": \"\",\r\n    \"parentAbbreviated\": \"\",\r\n    \"refs\": \"\",\r\n    \"signature\": {\r\n      \"key\": \"A6BCCB72D65B0D0F\",\r\n      \"signer\": \"\",\r\n      \"verificationFlag\": \"E\"\r\n    },\r\n    \"subject\": \"Initial commit\",\r\n    \"subjectSanitized\": \"Initial-commit\",\r\n    \"tree\": \"3db442f3ef0438de58f72235e2658e5368a6752b\",\r\n    \"treeAbbreviated\": \"3db442f\"\r\n}]<\/pre>\n<p>So what can you do with a JSON array of JSON objects? You can import it through the Capella UI or you can import them with Couchbase Shell. I first create the <em>scope<\/em> and <em>collection<\/em> and select them with cb-env, then create the SQL++ Index.<\/p>\n<pre class=\"wrap:true lang:sh decode:true \">scopes create gitlog; cb-env scope gitlog; collections create commits; cb-env collection commits; query \"CREATE PRIMARY INDEX ON `default`:`cbsh`.`gitlog`.`commits`\"<\/pre>\n<p>Since cbsh is based on Nushell, the resulting JSON file can be easily opened, turned into a dataframe, transformed in a Couchbase document and inserted like so:<\/p>\n<pre class=\"line-height:12 nums:false lang:default decode:true\">\ud83d\udc64 Laurent Doguin \ud83c\udfe0 capella in \u2601\ufe0f cbsh.gitlog.commits\r\n&gt; open commitlog.json |wrap content | insert id { |it| echo $it.content.commitHash }| doc upsert\r\n\r\n\u256d\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\r\n\u2502 # \u2502 processed \u2502 success \u2502 failed \u2502 failures \u2502 cluster \u2502\r\n\u251c\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\r\n\u2502 0 \u2502 660 \u2502 660 \u2502 0       \u2502        \u2502 capella  \u2502         \u2502\r\n\u2570\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\r\n<\/pre>\n<p>Let&#8217;s get some documents just to see how it worked:<\/p>\n<pre class=\"line-height:12 nums:false lang:default decode:true\">\ud83d\udc64 Laurent Doguin \ud83c\udfe0 capella in \u2601\ufe0f cbsh.gitlog.commits\r\n&gt; query \"SELECT subject, body FROM `commits` LIMIT 1\"\r\n\u256d\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\r\n\u2502 # \u2502 subject      \u2502 body \u2502 cluster \u2502\r\n\u251c\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\r\n\u2502 0 \u2502 Bump Nushell \u2502      \u2502 capella \u2502\r\n\u2570\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\r\n\r\n<\/pre>\n<p>So this is content we could use for RAG. Time to enrich these docs.<\/p>\n<h2>Enrich document with an AI model<\/h2>\n<p>To enrich the doc you need to have a model configured. Here I am using OpenAI and the <em>enrich-doc<\/em> cbsh command:<\/p>\n<pre class=\"line-height:12 nums:false lang:default decode:true\">\ud83d\udc64 Laurent Doguin \ud83c\udfe0 capella in \u2601\ufe0f cbsh.gitlog.commits\r\n&gt; query \"SELECT c.*, meta().id as id, c.subject || ' ' || c.body as text FROM `commits` as c\" | wrap content| vector enrich-doc text | doc upsert\r\nEmbedding batch 1\/1\r\n\u256d\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\r\n\u2502 # \u2502 processed \u2502 success \u2502 failed \u2502 failures \u2502 cluster \u2502\r\n\u251c\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\r\n\u2502 0 \u2502 61        \u2502 61      \u2502 0      \u2502          \u2502 capella \u2502\r\n\u2570\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f<\/pre>\n<p>The SELECT clause will return a JSON object with the content of the doc, and additional fields <em>id<\/em> and <em>text<\/em>. Text is the subject and body appended into one string. The object is wrapped in a content object and given to the vector <em>enrich-doc<\/em> command, with text as a parameter, as it is the field that will be transformed in a vector. There should now be a <em>textVector<\/em> field in each doc.<\/p>\n<h2>Vector Search<\/h2>\n<p>In order to search through these vectors, we need to create a Vector Search index. It&#8217;s doable through the API or UI for something customizable. Here I am happy with default choices so I use cbsh instead:<\/p>\n<pre class=\"wrap:true lang:default decode:true \">\ud83d\udc64 Laurent Doguin \ud83c\udfe0 capella in \u2601\ufe0f cbsh.gitlog.commits\r\n&gt; vector create-index --similarity-metric dot_product commits textVector 1536<\/pre>\n<p>The index created will use <em>dot_product<\/em> as a similarity algorithm, vector dimensionality will be 1536, the name of the index is <em>commit<\/em> and the indexed field is <em>textVector<\/em>. The bucket, scope and collection are the one selected through <em>cb-env<\/em>.<\/p>\n<p>To test vector search, the search query has to be turned in a vector, than piped to the search:<\/p>\n<pre class=\"line-height:12 nums:false lang:default decode:true\">\ud83d\udc64 Laurent Doguin \ud83c\udfe0 capella in \u2601\ufe0f cbsh.gitlog.commits\r\n&gt; vector enrich-text \"TLS support\" | vector search commits textVector\r\nEmbedding batch 1\/1\r\n\u256d\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\r\n\u2502 # \u2502 id                                       \u2502 score      \u2502 cluster \u2502\r\n\u251c\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\r\n\u2502 0 \u2502 f2c1f124269884c88ab3925c7c5a8914298a2fbc \u2502 0.37283808 \u2502 capella \u2502\r\n\u2502 1 \u2502 da28adf7adbe910cd06c960d9c25d7316d666d1c \u2502 0.33915368 \u2502 capella \u2502\r\n\u2502 2 \u2502 f0f82353e7c060030cc2511ffab1edbcc263d099 \u2502 0.3294143  \u2502 capella \u2502\r\n\u2570\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f<\/pre>\n<p>It returns 3 rows by default. Let&#8217;s extend it to see the content of the document. I am adding <code>reject -i textVector<\/code> to remove the vector field, because no one needs a 1536 lines field in their terminal output:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-16978\" style=\"border: 1px solid Gainsboro;\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/image1-1-1024x1019.png\" alt=\"\" width=\"900\" height=\"896\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/image1-1-1024x1019.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/image1-1-300x299.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/image1-1-150x150.png 150w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/image1-1-768x765.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/image1-1-1536x1529.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/image1-1-65x65.png 65w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/image1-1-50x50.png 50w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/image1-1-1320x1314.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/image1-1.png 1999w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/p>\n<h2>Ask your Git Repository<\/h2>\n<p>From here you have all the commits of a Git repository stored in Couchbase, enriched with an AI model, and all indexed and searchable. The last thing to do is call the model to run a query with RAG. It starts by a turning a question into a vector, pipe it to a vector search, get the full document from the return IDs, select the content object without the vector field, turn each object in a JSON doc (this way we can send the content and its structured metadata), wrap the <em>jsonText<\/em> in a table and finally pipe it to the <em>ask<\/em> command:<\/p>\n<pre class=\"wrap:true lang:default decode:true\">\ud83d\udc64 Laurent Doguin \ud83c\udfe0 capella in \u2601\ufe0f cbsh.gitlog.commits\r\n&gt; vector enrich-text \"gemini\" | vector search commits textVector --neighbors 10| select id |doc get| select content | reject -i content.textVector | par-each {|x| to json} | wrap content| ask \"when and in which commit was gemini llm support added\"\r\nEmbedding batch 1\/1\r\nGemini LLM support was added in the commit with the subject \"Add support for Gemini llm\". This commit was authored by Jack Westwood on May 15, 2024, with the commit hash \"3da9b4a3532ab4f432428319361909cc14a035af\".\r\n\ud83d\udc64 Laurent Doguin \ud83c\udfe0 capella in \u2601\ufe0f cbsh.gitlog.commits\r\n&gt; git show 3da9b4a3532ab4f432428319361909cc14a035af\r\ncommit 3da9b4a3532ab4f432428319361909cc14a035af\r\nAuthor: Jack Westwood &lt;jack.westwood@couchbase.com&gt;\r\nDate: Wed May 15 15:40:13 2024 +0100\r\n\r\nAdd support for Gemini llm\r\n....<\/pre>\n<p>Asking the LLM when Gemini support was introduced. We get a date and a commit hash. It&#8217;s then easy to verify using <code>git show<\/code>. There is a bit of repetition here so you can declare a variable for your question and reuse it:<\/p>\n<pre class=\"wrap:true lang:default decode:true \">\ud83d\udc64 Laurent Doguin \ud83c\udfe0 capella in \u2601\ufe0f cbsh.gitlog.commits\r\n&gt; let question = \"why was the client crate rewritten? \"; vector enrich-text $question | vector search commits textVector --neighbors 10| select id |doc get| select content | reject -i content.textVector | par-each {|x| to json} | wrap content| ask $question\r\nEmbedding batch 1\/1\r\nThe client crate was rewritten to address issues such as inconsistency, difficulty in usage, and code organization. The rewrite split the client into key-value (kv) and HTTP clients, each consuming a common HTTP handler. This separation into multiple clients and files improved code organization and made the clients easier to understand and use. Additionally, various improvements were made to the HTTP handler, errors, and runtime instantiation within the client crate to enhance overall functionality and performance. The rewrite effort aimed to streamline the client crate, making it more robust, maintainable, and user-friendly.<\/pre>\n<p>And now we all know why the client crate had to be rewritten. It may not answer your own questions, but now you know how to get answers from any repo!<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Get started with <a href=\"https:\/\/cloud.couchbase.com\" target=\"_blank\" rel=\"noopener\">Capella for free<\/a><\/li>\n<li>Read our <a href=\"https:\/\/www.couchbase.com\/blog\/llm-embeddings\/\" target=\"_blank\" rel=\"noopener\">Guide for LLM Embeddings<\/a><\/li>\n<li>Read more of <a href=\"https:\/\/www.couchbase.com\/blog\/author\/laurent-doguin\/\" target=\"_blank\" rel=\"noopener\">my developer blogs<\/a> on vector search and more<\/li>\n<li>Try <a href=\"https:\/\/couchbase.sh\" target=\"_blank\" rel=\"noopener\">Couchbase Shell<\/a> today<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><a href=\"https:\/\/couchbase.sh\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-16979\" style=\"border: 1px solid Gainsboro;\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/blog-cbsh-rag-1024x1019.png\" alt=\"\" width=\"646\" height=\"643\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/blog-cbsh-rag-1024x1019.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/blog-cbsh-rag-300x299.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/blog-cbsh-rag-150x150.png 150w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/blog-cbsh-rag-768x764.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/blog-cbsh-rag-1536x1529.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/blog-cbsh-rag-2048x2038.png 2048w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/blog-cbsh-rag-65x65.png 65w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/blog-cbsh-rag-50x50.png 50w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/blog-cbsh-rag-1320x1314.png 1320w\" sizes=\"auto, (max-width: 646px) 100vw, 646px\" \/><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Don&#8217;t you love reading other people&#8217;s commit messages? No? Well, I do and as I was reading a very insightful commit message, I realized all the untapped content living in various Git logs (assuming the dev you follow are writing [&hellip;]<\/p>\n","protected":false},"author":49,"featured_media":16986,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[10122,1815,2225,1816,9973,2201,9937],"tags":[10023,10020,10024,10038,9924],"ppma_author":[9023],"class_list":["post-16977","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-artificial-intelligence-ai","category-best-practices-and-tutorials","category-cloud","category-couchbase-server","category-generative-ai-genai","category-tools-sdks","category-vector-search","tag-cbsh","tag-cbshell","tag-couchbase-shell","tag-nushell","tag-rag-retrieval-augmented-generation"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.8 (Yoast SEO v25.8) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Chat With Your Git History, Thanks to RAG and Couchbase Shell - The Couchbase Blog<\/title>\n<meta name=\"description\" content=\"Turn your Git history into a chat-ready knowledge base using RAG and Couchbase Shell.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Chat With Your Git History, Thanks to RAG and Couchbase Shell\" \/>\n<meta property=\"og:description\" content=\"Turn your Git history into a chat-ready knowledge base using RAG and Couchbase Shell.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2025-03-24T18:06:51+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-13T23:36:16+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/CBShell_V2.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2400\" \/>\n\t<meta property=\"og:image:height\" content=\"1256\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Laurent Doguin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@ldoguin\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"unstructured.io\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/\"},\"author\":{\"name\":\"Laurent Doguin\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e\"},\"headline\":\"Chat With Your Git History, Thanks to RAG and Couchbase Shell\",\"datePublished\":\"2025-03-24T18:06:51+00:00\",\"dateModified\":\"2025-06-13T23:36:16+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/\"},\"wordCount\":980,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/CBShell_V2.jpg\",\"keywords\":[\"cbsh\",\"cbshell\",\"couchbase shell\",\"nushell\",\"RAG retrieval-augmented generation\"],\"articleSection\":[\"Artificial Intelligence (AI)\",\"Best Practices and Tutorials\",\"Couchbase Capella\",\"Couchbase Server\",\"Generative AI (GenAI)\",\"Tools &amp; SDKs\",\"Vector Search\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/\",\"name\":\"Chat With Your Git History, Thanks to RAG and Couchbase Shell - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/CBShell_V2.jpg\",\"datePublished\":\"2025-03-24T18:06:51+00:00\",\"dateModified\":\"2025-06-13T23:36:16+00:00\",\"description\":\"Turn your Git history into a chat-ready knowledge base using RAG and Couchbase Shell.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/CBShell_V2.jpg\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/CBShell_V2.jpg\",\"width\":2400,\"height\":1256,\"caption\":\"Couchbase Shell and RAG\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Chat With Your Git History, Thanks to RAG and Couchbase Shell\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e\",\"name\":\"Laurent Doguin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/12929ce99397769f362b7a90d6b85071\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g\",\"caption\":\"Laurent Doguin\"},\"description\":\"Laurent is a nerdy metal head who lives in Paris. He mostly writes code in Java and structured text in AsciiDoc, and often talks about data, reactive programming and other buzzwordy stuff. He is also a former Developer Advocate for Clever Cloud and Nuxeo where he devoted his time and expertise to helping those communities grow bigger and stronger. He now runs Developer Relations at Couchbase.\",\"sameAs\":[\"https:\/\/x.com\/ldoguin\"],\"honorificPrefix\":\"Mr\",\"birthDate\":\"1985-06-07\",\"gender\":\"male\",\"award\":[\"Devoxx Champion\",\"Couchbase Legend\"],\"knowsAbout\":[\"Java\"],\"knowsLanguage\":[\"English\",\"French\"],\"jobTitle\":\"Director Developer Relation & Strategy\",\"worksFor\":\"Couchbase\",\"url\":\"https:\/\/www.couchbase.com\/blog\/author\/laurent-doguin\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Chat With Your Git History, Thanks to RAG and Couchbase Shell - The Couchbase Blog","description":"Turn your Git history into a chat-ready knowledge base using RAG and Couchbase Shell.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/","og_locale":"en_US","og_type":"article","og_title":"Chat With Your Git History, Thanks to RAG and Couchbase Shell","og_description":"Turn your Git history into a chat-ready knowledge base using RAG and Couchbase Shell.","og_url":"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/","og_site_name":"The Couchbase Blog","article_published_time":"2025-03-24T18:06:51+00:00","article_modified_time":"2025-06-13T23:36:16+00:00","og_image":[{"width":2400,"height":1256,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/CBShell_V2.jpg","type":"image\/jpeg"}],"author":"Laurent Doguin","twitter_card":"summary_large_image","twitter_creator":"@ldoguin","twitter_misc":{"Written by":"unstructured.io","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/"},"author":{"name":"Laurent Doguin","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e"},"headline":"Chat With Your Git History, Thanks to RAG and Couchbase Shell","datePublished":"2025-03-24T18:06:51+00:00","dateModified":"2025-06-13T23:36:16+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/"},"wordCount":980,"commentCount":2,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/CBShell_V2.jpg","keywords":["cbsh","cbshell","couchbase shell","nushell","RAG retrieval-augmented generation"],"articleSection":["Artificial Intelligence (AI)","Best Practices and Tutorials","Couchbase Capella","Couchbase Server","Generative AI (GenAI)","Tools &amp; SDKs","Vector Search"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/","url":"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/","name":"Chat With Your Git History, Thanks to RAG and Couchbase Shell - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/CBShell_V2.jpg","datePublished":"2025-03-24T18:06:51+00:00","dateModified":"2025-06-13T23:36:16+00:00","description":"Turn your Git history into a chat-ready knowledge base using RAG and Couchbase Shell.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/CBShell_V2.jpg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/CBShell_V2.jpg","width":2400,"height":1256,"caption":"Couchbase Shell and RAG"},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Chat With Your Git History, Thanks to RAG and Couchbase Shell"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"The Couchbase Blog","description":"Couchbase, the NoSQL Database","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"The Couchbase Blog","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e","name":"Laurent Doguin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/12929ce99397769f362b7a90d6b85071","url":"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g","caption":"Laurent Doguin"},"description":"Laurent is a nerdy metal head who lives in Paris. He mostly writes code in Java and structured text in AsciiDoc, and often talks about data, reactive programming and other buzzwordy stuff. He is also a former Developer Advocate for Clever Cloud and Nuxeo where he devoted his time and expertise to helping those communities grow bigger and stronger. He now runs Developer Relations at Couchbase.","sameAs":["https:\/\/x.com\/ldoguin"],"honorificPrefix":"Mr","birthDate":"1985-06-07","gender":"male","award":["Devoxx Champion","Couchbase Legend"],"knowsAbout":["Java"],"knowsLanguage":["English","French"],"jobTitle":"Director Developer Relation & Strategy","worksFor":"Couchbase","url":"https:\/\/www.couchbase.com\/blog\/author\/laurent-doguin\/"}]}},"authors":[{"term_id":9023,"user_id":49,"is_guest":0,"slug":"laurent-doguin","display_name":"Laurent Doguin","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g","author_category":"","last_name":"Doguin","first_name":"Laurent","job_title":"","user_url":"","description":"Laurent is a nerdy metal head who lives in Paris. He mostly writes code in Java and structured text in AsciiDoc, and often talks about data, reactive programming and other buzzwordy stuff. He is also a former Developer Advocate for Clever Cloud and Nuxeo where he devoted his time and expertise to helping those communities grow bigger and stronger. He now runs Developer Relations at Couchbase."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/16977","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/users\/49"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/comments?post=16977"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/16977\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media\/16986"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media?parent=16977"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/categories?post=16977"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/tags?post=16977"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/ppma_author?post=16977"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}