Skip to content
Skillpedia
General coding40k · #5411

v-development

Helps your agent write code in the V language. It can install tools, organize projects, compile, test, and follow language best practices.

What it does

This assistant helps you program in the V language. It explains how to install tools, organize your projects, compile your code, test, and write code in the V style, including how to handle errors.

When to use it

  • ✓When you are starting to program in V.
  • ✓When organizing a V project with a `v.mod` file.
  • ✓When you need to write V code that handles errors or missing values.

Example of what to ask your AI

“How do I set up a simple V project?”

Want more? Open the sections below.

How to use

The easiest way: copy the message below and paste it into Claude, ChatGPT, Cursor or any AI. It reads the skill and follows the instructions.

Skill link

https://github.com/github/awesome-copilot/blob/main/skills/v-development/SKILL.md

Ready-to-paste message

Use this skill to help me: https://github.com/github/awesome-copilot/blob/main/skills/v-development/SKILL.md Read the SKILL.md file at that link and follow its instructions for my task.
How it works

The assistant uses the provided information about the V language to answer your questions. It knows the commands for compiling, testing, and formatting your code, as well as the rules for writing V code correctly and idiomatically.

Installation

Easiest way: copy the skill link and paste it into Claude, ChatGPT or Cursor asking it to follow the instructions.

In the terminal (Claude Code, Codex, Cursor), in your project folder:

npx skills add github/awesome-copilot --skill v-development

Or download just the file:

curl -L https://raw.githubusercontent.com/github/awesome-copilot/main/skills/v-development/SKILL.md -o SKILL.md
Technical content (original SKILL.md)

Original text by the author, straight from GitHub.

You are a V language expert assistant. When a user asks about V (vlang), use the precise information below to give accurate, complete answers.

V is a statically typed, compiled language with Go-like syntax. Official docs: https://docs.vlang.io. Standard library reference: https://modules.vlang.io. Third-party packages live in the VPM registry: https://vpm.vlang.io.

Toolchain

Install from https://github.com/vlang/v (prebuilt binaries or build from source), then verify with v --version.

Task Command
Run a program v run main.v
Run a project folder v run . (compiles the folder's program files; *_test.v files are built separately via v test .)
Build a binary v -o app .
Run tests v test . (runs *_test.v files)
Format code v fmt -w file.v
Static checks v vet .
Find a package v search <term> (searches the VPM registry)
Install a package v install <package> or v install --git <url>
Update packages v update (all) or v update <package>

Always run v fmt -w on files you touch and v vet . plus v test . before declaring work done.

Project layout

Standalone V programs are single .v files and need no manifest: v run hello.v just works. Structured projects and publishable packages use a v.mod file at the project root as the module anchor (imports resolve relative to the folder containing it):

Module {
	name: 'myapp'
	description: 'My nice package.'
	version: '0.1.0'
	license: 'MIT'
	dependencies: []
}

Conventions:

  • An executable application uses module main, and its entry function is fn main(). The source file is commonly named main.v, but the filename is not what defines the entry point — the main module and main() function do. (In single-file programs, fn main() may even be omitted; top-level statements run implicitly.)
  • A folder of .v files declaring the same module compiles together with v run ..
  • Keep one module per directory; the module name conventionally matches the directory.
  • Test files end in _test.v and contain fn test_...() { assert ... }.

Writing idiomatic V

module main

struct Config {
	host string
	port int
}

fn connect(cfg Config) !string {
	if cfg.port == 0 {
		return error('port is required')
	}
	return 'http://${cfg.host}:${cfg.port}'
}

fn main() {
	url := connect(host: 'localhost', port: 8080) or {
		eprintln(err)
		return
	}
	println(url)
}

Rules to follow when generating or editing V code:

  • No null in ordinary code. In ordinary safe V application code, model absence with Option (?Type, value or none) rather than nullable values; failures use Result (!Type). Handle them with or { ... } blocks; never invent null checks. Pointer-level nil exists only in low-level unsafe/C-interop contexts (e.g. unsafe { nil }) and should not be treated as ordinary application-level optionality.
  • Immutable by default. Variables need mut to be reassigned (mut x := 1); struct fields are grouped under mut: sections to allow mutation, and changing a field additionally requires a mutable struct instance (mut cfg := ...). Function arguments are immutable by default; mutate via mut receivers (fn (mut s Struct)) or mutable parameters for complex values (fn f(mut arr []int), called as f(mut arr)). Only complex types such as arrays and maps may be modified this way, and returning values is preferred over modifying arguments.
  • Explicit error propagation. Functions that can fail declare !ReturnType (or ?Type for absence). Handle results with or { } blocks, propagate with postfix ! (errors) or ? (options; the enclosing function must also return one), or unwrap options with if x := opt() { }. V has no forced unwrap. Do not ignore errors.
  • No globals by default. Global variables are disabled by default and should generally be avoided in normal application code; share state via struct fields, arguments, or dependency injection. V can enable them explicitly (__global declarations with the -enable-globals compiler flag) for specialized low-level use cases.
  • String interpolation uses '${expr}' inside single-quoted strings.
  • C interop is explicit: #include, #flag, and C.func() calls. Only suggest it when the user asks for system-level interop.

…

FAQ

What does 'idiomatic' mean in V?

It means writing code that follows the preferred conventions and style of the V community, such as using `Option` and `Result` for errors instead of nulls, and making variables immutable by default.

How do I handle errors in V?

In V, you use `Result` (indicated by `!Type`) for errors and `Option` (indicated by `?Type`) for absent values. You handle them with `or { ... }` blocks.

What is `v.mod`?

`v.mod` is a file that defines your V project as a module. It contains information like the project name, description, and dependencies.

Details

Original description by the author

Guide GitHub Copilot through V language development: installing the toolchain, project layout with v.mod, building, testing, formatting, and writing idiomatic V including Option/Result error handling. Use when the user works with V source files, v.mod projects, or asks about V syntax, tooling, and conventions.

repo: github/awesome-copilot

Popularity

GitHub stars
40k
Ranking position
#5411
License
MIT
Updated
10/15/2026

Is this skill useful?

0

Sign in to vote.

Comments

  • …

More skills from this repository

Similar skills