{"id":1047,"date":"2026-06-08T11:15:50","date_gmt":"2026-06-08T09:15:50","guid":{"rendered":"https:\/\/www.mariusb.net\/blog\/?p=1047"},"modified":"2026-06-08T11:15:50","modified_gmt":"2026-06-08T09:15:50","slug":"kilo-code-getting-my-hands-dirty","status":"publish","type":"post","link":"https:\/\/www.mariusb.net\/blog\/2026\/06\/kilo-code-getting-my-hands-dirty\/","title":{"rendered":"Kilo Code: Getting my Hands dirty"},"content":{"rendered":"<div class=\"wp-block-image\">\n<figure class=\"alignleft size-large is-resized\"><a href=\"https:\/\/i0.wp.com\/www.mariusb.net\/blog\/wp-content\/uploads\/2026\/06\/AIKiloDev.png?ssl=1\" rel=\"lightbox[1047]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"559\" src=\"https:\/\/i0.wp.com\/www.mariusb.net\/blog\/wp-content\/uploads\/2026\/06\/AIKiloDev.png?resize=1024%2C559&#038;ssl=1\" alt=\"AI Kilo agent\" class=\"wp-image-1046\" style=\"aspect-ratio:1.8318737860769414;width:279px;height:auto\" srcset=\"https:\/\/i0.wp.com\/www.mariusb.net\/blog\/wp-content\/uploads\/2026\/06\/AIKiloDev.png?resize=1024%2C559&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.mariusb.net\/blog\/wp-content\/uploads\/2026\/06\/AIKiloDev.png?resize=300%2C164&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.mariusb.net\/blog\/wp-content\/uploads\/2026\/06\/AIKiloDev.png?resize=768%2C419&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.mariusb.net\/blog\/wp-content\/uploads\/2026\/06\/AIKiloDev.png?w=1408&amp;ssl=1 1408w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><\/a><\/figure>\n<\/div>\n\n\n<div class=\"wp-block-jetpack-markdown\"><p>When it comes to AI, the best way to learn is by getting one\u2019s hands dirty. In this blog post, I will show how I used a small project to get to grips with <a href=\"https:\/\/kilo.ai\/\">Kilo Code<\/a><\/p>\n<h3>But first, what is Kilo Code?<\/h3>\n<p>It is an AI agent that you either install as an extension in Visual Studio Code or use as a CLI in your preferred terminal.  You can also run it in the <a href=\"https:\/\/app.kilo.ai\/cloud\">Kilo Cloud<\/a> or as a JetBrains extension.<\/p>\n<p>I installed it as a CLI using <a href=\"https:\/\/brew.sh\/\">Homebrew<\/a><\/p>\n<pre><code>brew install Kilo-Org\/tap\/kilo\n<\/code><\/pre>\n<p>Then go to <a href=\"https:\/\/kilo.ai\/\">Kilo Code<\/a> and register for an account, it is free.  Then visit your <a href=\"https:\/\/app.kilo.ai\/\">Dashboard<\/a> and look around and do some settings.<\/p>\n<p>Open a terminal and login to your account with the following:<\/p>\n<pre><code>kilo auth login\n<\/code><\/pre>\n<p>then start your Kilo CLI session using:<\/p>\n<pre><code>kilo\n<\/code><\/pre>\n<p>You issue commands using Slash [\/] and the first command to issue is to select your model:<\/p>\n<pre><code>\/models\n<\/code><\/pre>\n<p>It will show you a list of available models, some paid and some free.  I suggest you start with <strong>Auto Free Kilo Gateway<\/strong>.<\/p>\n<h3>What is the project or Use Case?<\/h3>\n<p>I have a <code>bash script<\/code> that I use to get the response from calling 5 APIs and pipe the JSON to a text file.  On some of the responses from the API call, I use <code>jq<\/code> to only retrieve some of the values.<\/p>\n<p>I then have a <code>cron<\/code> job that runs this script every day at 9am, so I always have the latest data available.<\/p>\n<p>I then just <code>cat<\/code> the text file in a <code>Terminal<\/code> window and look at the JSON output.<\/p>\n<p>Over time this text file becomes very big and it is not easy to find values for a specific date.<\/p>\n<p>So as an exercise and learning <code>Kilo Code<\/code>, I decided to ask the agent to plan, code and debug an CLI applications that call the APIs and store the results in a LibreCalc ODS file.<\/p>\n<h3>AI Agent (Kilo Code) prompt<\/h3>\n<p>I set the mode in <code>Kilo CLI<\/code> to plan and the model to <code>Auto Free<\/code> using the `Kilo Gateway\u2019<\/p>\n<p>This is the prompt I used to instruct the AI agent to plan, code and debug the CLI application, after the initial plan I added a bit to be more precise:<\/p>\n<pre><code>Provide a plan for the development of a Rust application that\n- call each of the following APIs\n  1 https:\/\/min-api.cryptocompare.com\/data\/pricemulti?fsyms=BTC,ETH,DOGE,TRX,ADA,NIGHT,BDAG,USDT,USDC&amp;tsyms=USD\n\n  2 https:\/\/min-api.cryptocompare.com\/data\/pricemulti?fsyms=ADA,NIGHT,BDAG,TRX,DOGE,BNB,ETH,USDT,USDC&amp;tsyms=BTC\n\n  3 https:\/\/min-api.cryptocompare.com\/data\/price?fsym=BTC&amp;tsyms=ZAR&amp;e=VALR\n\n  4 https:\/\/openexchangerates.org\/api\/latest.json?app_id=3263b0c93523446299d17e2e6abdd748&amp;symbols=ZAR,THB,KZT\n\n  5 https:\/\/api.valr.com\/v1\/public\/USDTZAR\/marketsummary\n- output the results to a librecals ods sheet with each value in its own colums and the first column must the a timestamp in the following format YYYY-MM-DD HH:MM\n- for the 4th API call above, only output the rates value\n<\/code><\/pre>\n<h3>AI Agent (Kilo Code) plan output<\/h3>\n<p><code>Kilo CLI<\/code> went away and the agent then asked one of its free models to plan the application based on the prompt above.<\/p>\n<p>It came back with a detailed plan on how it will implement\/code the application.  I reviewed the plan and asked it to modify it with the following prompt:<\/p>\n<pre><code>Added:\n- modify the plan, that if the ODS file does not exist then create a new one with the name CryptoPriceData.ods.  If the file exist then append to the existing file\n- For API 5 only use .lastTradedPrice\n<\/code><\/pre>\n<p>It then modified the plan as requested.  I reviewed the plan and was happy with what it was planning to do.  You can see the <a href=\"https:\/\/github.com\/mariusb\/cryptopricedata\/blob\/main\/.kilo\/plans\/1780645365199-misty-nebula.md\">plan here<\/a><\/p>\n<h3>AI Agent (Kilo Code) code implementation<\/h3>\n<p>At the end of the planning stage, <code>Kilo CLI<\/code> gave the following options:<\/p>\n<ol>\n<li>Start a new session and implement the plan<\/li>\n<li>Implement the plan in an existing session<\/li>\n<li>Exit<\/li>\n<\/ol>\n<p>I selected option 2 and implemented the plan in an existing session.  The agent changed the mode to <code>Code<\/code> and went ahead and used one of the free models to implement the code.<\/p>\n<p>During the whole process it gave detailed feedback on what it was doing.<\/p>\n<p>When it was done implementing the code, it tried to build the code and gave feedback on any errors it encountered.  It detected that the rate (that is what a library is called in Rust) it used for ODS file actions did not exist and it figured out what crate to use.  The code was updated to use the correct crate and tested again.  After some backwards and forwards, the code ran error free.<\/p>\n<p>Told the AI agent I was happy and it went ahead and updated the plan with the correct ODS crate and added a Completion section on what it did.<\/p>\n<h3>Updates I have done manually<\/h3>\n<p>The AI implementation used <em>UTC<\/em> for its timestamp and I changed the code to rather use <em>Local<\/em>.  Also when the application finished, it outputted a line to the terminal and since I am running it as a <code>cron<\/code> job where there is no terminal output, I commented out the <code>println!<\/code> line in the code.<\/p>\n<p><strong>Note:<\/strong> I use <a href=\"https:\/\/zed.dev\/\">Zed<\/a> as my editor. Unfortunately, Kilo does not have an extension for Zed, yet, hence the use of <code>Kilo CLI<\/code>.<\/p>\n<p>The code for the application is available <a href=\"https:\/\/github.com\/mariusb\/cryptopricedata\/\">here<\/a><\/p>\n<h3>Conclusion<\/h3>\n<p>Although this was a fairly straightforward application and easy to implement, I was impressed by what it was able to do, given that it was using free models.<\/p>\n<p>Stats from the session:<\/p>\n<table>\n<thead>\n<tr>\n<th>Description<\/th>\n<th>Value<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Requests<\/td>\n<td>115<\/td>\n<\/tr>\n<tr>\n<td>Input Tokens<\/td>\n<td>7\u00a0475\u00a0473<\/td>\n<\/tr>\n<tr>\n<td>Output Tokens<\/td>\n<td>42\u00a0900<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>The binary is compiled, runs in milliseconds as a <code>cron<\/code> job, and perfectly handles the scope I set out to build.<\/p>\n<p>If you\u2019re building CLI utilities or exploring Rust, I highly recommend stepping away from traditional workflows and experimenting with an agentic assistant. It turns the friction of boilerplate setup into pure building momentum.<\/p>\n<p><em>Have you built any CLI tools with Rust or experimented with agentic engineering platforms like Kilo Code? Let me know your thoughts or share your favourite crates in the comments below!<\/em><\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>This blog post details the author&#8217;s experience using Kilo Code, an AI agent, to develop a CLI application for calling APIs and storing data in a LibreCalc ODS file. The author walks through the installation, setup, and coding process, highlighting the efficiency and effectiveness of using AI for software development tasks.<\/p>\n","protected":false},"author":1,"featured_media":1046,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":true,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[193,200,188],"tags":[194,169,201,189,199],"class_list":["post-1047","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai","category-coding","category-rust","tag-ai","tag-cryptocurrencies","tag-kilocode","tag-rust","tag-software-development"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/www.mariusb.net\/blog\/wp-content\/uploads\/2026\/06\/AIKiloDev.png?fit=1408%2C768&ssl=1","jetpack_shortlink":"https:\/\/wp.me\/p1SHVw-gT","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.mariusb.net\/blog\/wp-json\/wp\/v2\/posts\/1047","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mariusb.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mariusb.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mariusb.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mariusb.net\/blog\/wp-json\/wp\/v2\/comments?post=1047"}],"version-history":[{"count":4,"href":"https:\/\/www.mariusb.net\/blog\/wp-json\/wp\/v2\/posts\/1047\/revisions"}],"predecessor-version":[{"id":1051,"href":"https:\/\/www.mariusb.net\/blog\/wp-json\/wp\/v2\/posts\/1047\/revisions\/1051"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mariusb.net\/blog\/wp-json\/wp\/v2\/media\/1046"}],"wp:attachment":[{"href":"https:\/\/www.mariusb.net\/blog\/wp-json\/wp\/v2\/media?parent=1047"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mariusb.net\/blog\/wp-json\/wp\/v2\/categories?post=1047"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mariusb.net\/blog\/wp-json\/wp\/v2\/tags?post=1047"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}