LLM CLI tool using GitHub Copilot Models

Using LLMs to write meaningful commit messages from CLI

Let’s face it, writing commit messages is tedious work. I’ve been using LLMs to write my commit messages for a while now. But until now, I used to copy the diffs manually and paste it into some chat window and ask the LLM to write a commit message. I’ve been trying various CLI tools viz. OpenAI’s Codex CLI, Google’s Gemini CLI, etc. But codex lacks piping support and Gemini CLI cannot be used with internal codebases! I can use GitHub Copilot extension in VS Code with internal codebases, but I wanted a CLI tool that I can use in my terminal. GitHub Copilot is now free for all GitHub users, so this is useful for everyone. ...

July 17, 2025 Â· 3 min Â· Suraj Deshmukh

Monitor releases of your favourite software

There are various ways to know about the release of your favourite new software, follow the mailing list, check the Github release page periodically, follow the project’s Twitter handle, etc. But do you know there is even more reliable way to track the releases of your favourite software released on Github. Github Releases and RSS feeds For every repository on Github, if the project is posting their releases, you can follow the RSS feed of that project’s release. The RSS feed link for any project’s release is: ...

January 17, 2021 Â· 2 min Â· Suraj Deshmukh

Notes on talk - Advanced testing in golang by Mitchell Hashimoto

Test Fixtures “go test” sets pwd as package directory Test Helpers should never return an error they should access to the *testing.T object call t.Helper() in the beginning (works only for go1.9+) for things reqiuiring clean up return closures Configurability Unconfigurable behavior is often a point of difficulty for tests. e.g. ports, timeouts, paths. Over-parameterize structs to allow tests to fine-tune their behavior It’s ok to make these configs unexported so only tests can set them. Slides Video GopherCon 2017: Mitchell Hashimoto - Advanced Testing with Go by Mitchell Hashimoto

March 7, 2018 Â· 1 min Â· Suraj Deshmukh

Methods that satisfy interfaces in golang

Pointer receiver For a struct User with a method Work with pointer receiver. type User struct { Name string Period int } func (u *User) Work() { fmt.Println(u.Name, "has worked for", u.Period, "hrs.") } func main() { uval := User{"UserVal", 5} uval.Work() pval := &User{"UserPtr", 6} pval.Work() } See on go playground. output: UserVal has worked for 5 hrs. UserPtr has worked for 6 hrs. If we call this method on value type object uval it works, and obviously it works with pointer type object pval. Value receiver Now we change the method receiver from pointer to value. ...

February 23, 2018 Â· 3 min Â· Suraj Deshmukh