1. One spoken phrase, two correct spellings
Effective Go is blunt about it: the visibility of a name outside a package is determined by whether its first character is upper case. The Go Code Review Comments add that initialisms keep a consistent case, so URL appears as URL or url, never Url; it is ServeHTTP, not ServeHttp, and appID rather than appId. Google’s TypeScript style guide asks for the opposite and treats abbreviations as whole words.
So the sentence “get user by ID” has two right answers depending on the repository, and a speech model produces neither; it writes four words. IraVoice matches the spoken words against the names declared in the project behind the focused app and inserts that declaration’s spelling. A Go module that defines GetUserByID gets GetUserByID; a TypeScript project that defines getUserById gets getUserById. The capitals come from the code, not from how you said it.
2. Effective Go conventions, heard instead of read
Go uses MixedCaps or mixedCaps rather than underscores for multiword names. Package names are lower case and a single word, with no need for underscores or mixedCaps, and exported names lean on them: the buffered reader in package bufio is bufio.Reader, not BufReader. A getter for an unexported field named owner is Owner, not GetOwner. One-method interfaces take an -er name, such as Reader, Writer, Formatter or CloseNotifier. Method receivers get short names, often one or two letters such as c or cl for a Client.
Files follow conventions as well. A go.mod at the root of the repository declares the module path, the import path prefix for every package in the module. A file whose name ends in _test.go is excluded from regular package builds and included when go test runs.
- Exported versus unexported is one capital letter: “default page size” could be defaultPageSize or DefaultPageSize, and only the declaration knows.
- Package names such as bufio or httpapi are single lowercase words, so IraVoice leaves them as the speech model wrote them.
- Initialisms are spoken as letters, “I D” or “U R L”, and need the project’s case to come out right.
- Test files pair a source name with _test.go, which speech turns into “user store test dot go”.
3. Spoken to typed in a Go module
These results come from IraVoice’s matching rules applied to a small ledger module with internal/store/user_store.go, its user_store_test.go, a cmd/ledger-api command and a go.mod, dictated into a recognized app on a Mac or Windows PC:
- “get user by ID returns ErrNotFound for deleted rows” → GetUserByID returns ErrNotFound for deleted rows
- “new user store” → NewUserStore; “default page size” → defaultPageSize
- “parse URL” → ParseURL; “new HTTP client” → NewHTTPClient
- “XML HTTP request” → xmlHTTPRequest, as declared
- “invoice ID” → InvoiceID
- “test get user by ID” → TestGetUserByID
- “main dot go” → main.go; “go dot mod” → go.mod
- “user store test go” → user_store_test.go
- “ledger API” → ledger-api, the command’s folder
4. Go names that stay as words, and why
Capitalization from the speech model is ignored, so “get user by id” and “Get User By ID” both produce the declared GetUserByID, and a full stop after the phrase stays after the name. Some Go names, though, are deliberately left alone.
Short initialism names. appID and userID are made of two everyday words, and IraVoice never turns two everyday words into an identifier, so “app ID” and “user ID” stay as spoken. Longer names with a distinctive word, such as InvoiceID, come through.
Names that start with an initialism. A type named HTTPClient or URLParser has capitals but never a lowercase letter followed by a capital, so IraVoice does not treat it as a code name and “HTTP client” stays two words. NewHTTPClient does qualify, because its w is followed by a capital H.
Methods, fields and grouped declarations. IraVoice collects names from declarations such as func GetUserByID, type UserStore, var ErrNotFound and const defaultPageSize. A method with a receiver, like func (s *UserStore) ListActiveUsers(), a struct field, and constants inside a grouped const block may not be among them; in the sample module, “list active users” and “serve HTTP” stayed as words.
Files that share a type’s words. user_store.go and type UserStore reduce to the same letters, and one phrase can only produce one name; in this layout “user store” types the file’s user_store. For a test file, say it without punctuation (“user store test go”), because “user store test dot go” mixes two spellings and leaves “dot go” as words.
5. goroutine, kubectl and words from outside your module
Your dependencies are not part of your module’s own files, IraVoice skips a vendor folder, and Go’s own vocabulary is not declared anywhere in your code, so words like goroutine are not in its list. Teach the ones you say often with a learned fix. Dictate, press ⌃⌥⇧F on a Mac or Ctrl+Alt+Shift+F on Windows and Linux, correct the text, press Enter, and paste back the corrected copy. Correcting “cube cuddle” to kubectl, or “go routine” to goroutine, teaches IraVoice to type that word from then on.
Lessons apply in every app, so keep them to words you only mean as code, and review them under Advanced → Learn from my fixes. Replacements handle fixed text: a phrase that types your module path, or “race note” for a review comment you add often, such as a request to run go test -race before merging.
6. GoLand, VS Code, remote servers and other options
On a Mac, IraVoice spells Go names in GoLand and the other JetBrains IDEs, VS Code, Cursor, Windsurf, Zed and Sublime Text, and in Terminal, iTerm2, Ghostty, Warp, kitty, Alacritty and WezTerm. On Windows the recognized list includes VS Code, Cursor, Windsurf, Zed, Windows Terminal, PowerShell and cmd, but not GoLand, so in GoLand on Windows you get plain dictation. On Linux, IraVoice is a beta that dictates without code names.
Go code often runs on a server. Because IraVoice types into the local terminal window, dictation works inside an SSH session, but names come only from a Git project on your own computer; keep a local clone open if you want them spelled. Inside WSL, dictation works but names may not.
It types sentences, not Go. There are no braces, := assignments, if err != nil blocks or tabs in what it produces. Alternatives: macOS Dictation and Win+H for free prose; Claude Code’s /voice, tuned for coding vocabulary with your project and branch names as hints and audio transcribed by Anthropic; and Talon, where you choose a formatter each time, such as hammer for an exported OneTwoThree or camel for an unexported oneTwoThree.
IraVoice keeps audio and text on the computer, using NVIDIA Parakeet after a one-time model download; its other connections are license check-ins and update checks. Hold Right Command on a Mac or Right Ctrl on Windows, speak and release; tap instead of holding to keep listening hands-free. It costs $79 once for one computer, $109 for two, or $149 for three.