/hare-lang
Hare language skill for simple systems programming. Use when building with hare build/test/run, Hare stdlib, C FFI with @extern, tagged union error handling, or comparing Hare vs C/Zig. Activates on queries about Hare language, hare build, @extern, tagged union, or Hare stdlib.
$ npx -y skills add mohitmishra786/low-level-dev-skills --skill hare-lang --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/hare-lang
Context preview
The summary Claude sees to decide when to auto-load this skill.
Hare language skill for simple systems programming. Use when building with hare build/test/run, Hare stdlib, C FFI with @extern, tagged union error handling, or comparing Hare vs C/Zig. Activates on queries about Hare language, hare build, @extern, tagged union, or Hare stdlib.
SKILL.md
hare-lang.SKILL.mdname: hare-lang
description: Hare language skill for simple systems programming. Use when building with hare build/test/run, Hare stdlib, C FFI with @extern, tagged union error handling, or comparing Hare vs C/Zig. Activates on queries about Hare language, hare build, @extern, tagged union, or Hare stdlib.
Hare
Purpose
Guide agents through the Hare programming language: design philosophy (simple, stable, compiled), `hare build`/`test`/`run` workflows, stdlib overview, C FFI with `@extern`, the type system (tagged unions, slices), error handling with `(T | error!)`, and comparison with C and Zig for systems utilities.
When to Use
- Writing small system utilities with C-like control and modern safety
- Building CLI tools or daemons with minimal dependencies
- Calling C libraries from Hare or exporting Hare functions to C
- Preferring explicit error handling over exceptions
- Evaluating Hare vs C or Zig for a new project
- Needing a stable, auditable codebase without heavy runtime
Workflow
1. Install Hare
# Linux/macOS — build from source
git clone https://git.sr.ht/~sircmpwn/hare
cd hare
make check # builds and runs tests
sudo make install
hare version
# Create project (Hare has no project generator — lay out manually)
mkdir -p mytool && cd mytool
cat > hare.mod << 'EOF'
module mytool
EOF
2. Hello world and build
// main.ha
use fmt;
export fn main() void = {
fmt::println("Hello, Hare!")!;
};hare build -o mytool
./mytool
hare run . # build and run
hare test # run tests
3. Stdlib overview
| Module | Purpose | |--------|---------| | `fmt` | Formatted I/O (`printf`, `println`) | | `io` | Reader/writer interfaces | | `os` | Files, environment, args | | `strings` | String manipulation | | `bufio` | Buffered I/O | | `encoding` | JSON, hex, etc. | | `net` | TCP/UDP networking | | `time` | Dates and durations | | `mem` | Memory helpers | | `types` | Platform integer types |
use os;
use fmt;
use strings;
export fn main() void = {
const args = os::args;
for (let i = 0z; i < len(args); i += 1) {
fmt::println(args[i])!;
};
};4. Error handling
// Errors are tagged union values — explicit propagation with !
fn read_file(path: str) (str | os::error) = {
const file = os::open(path)?;
defer os::close(file);
let buf: []u8 = [];
io::readall(file, &buf)?;
return strings::fromutf8(buf)!;
};
export fn main() void = {
match (read_file("config.txt")) {
case let s: str =>
fmt::println(s)!;
case let err: os::error =>
fmt::fatalf("error: {}", err)!;
};
};`?` propagates errors; `!` asserts success in infallible context; `match` for handling.
5. Type system
// Tagged union
type color = (u8 | u16 | void);
fn get_color(c: color) u16 = {
match (c) {
case let v: u8 => return v: u16;
case let v: u16 => return v;
case => abort();
};
};
// Slices — pointer + length
fn sum(nums: []i32) i32 = {
let total = 0i32;
for (let i = 0z; i < len(nums); i += 1) {
total += nums[i];
};
return total;
};No implicit conversions — explicit casts required.
6. C FFI — @extern
// Link against C library
use c;
@extern("c") fn strlen(s: *const u8) size;
export fn main() void = {
const s = "hello";
fmt::println(len(s))!; // Hare strlen via strings module
};Export Hare to C:
// Exported C ABI function
export fn my_add(a: i32, b: i32) i32 = {
return a + b;
};hare build -o libmytool.a
# Link from C with generated headers or manual declarations
// cgo-style module linking in hare.mod
module mytool
require (
libc
)7. Testing
@test fn test_add() void = {
assert(sum(&[1i32, 2, 3]) == 6);
};
@test fn test_error() void = {
match (read_file("/nonexistent")) {
case => abort("expected error");
case let err: os::error => void;
};
};hare test -v
8. Hare vs C vs Zig
| Aspect | Hare | C | Zig | |--------|------|---|-----| | Memory safety | Some (no null, tagged errors) | Manual | Manual + optional safety | | Compile time | Fast | Fast | Comptime heavy | | Stdlib | Minimal, stable | libc | Extensive | | C interop | `@extern` | Native | `@cImport` | | Generics | No (comptime limited) | No | Comptime generics | | Best for | Utilities, tools | Everything | Systems with metaprogramming |
9. Use cases
Good Hare fits
├── CLI utilities (grep-like, init tools)
├── Build tools and scripts replacing shell
├── Network daemons with simple protocol
└── Auditable security-sensitive code
Consider C/Zig instead when
├── Heavy generic metaprogramming needed (Zig)
├── Existing massive C ecosystem glue
└── GPU/kernel domains with immature Hare support
Common Problems
| Symptom | Cause | Fix | |---------|-------|-----| | `unknown type` | Missing import | Add `use module;` | | FFI link error | Library not in hare.mod | Add require; correct `-l` flags | | Error not handled | Missing `?` or match | Propagate or handle all cases | | UTF-8 error | Invalid bytes in string | Validate with `strings::fromutf8` | | Test not found | Missing `@test` | Name fn with `@test` attribute | | Platform syscall missing | Hare stdlib gap | Use `@extern` to libc |
Related Skills
- `skills/zig/zig-compiler` — Zig as alternative systems language
- `skills/zig/zig-cinterop` — Zig C interop comparison
- `skills/compilers/gcc` — C toolchain alongside Hare
- `skills/languages/carbon-lang` — other emerging systems languages
- `skills/build-systems/make` — integrating Hare into Makefiles
- `skills/runtime-safety/sanitizers` — C interop safety testing
Read more
name: hare-lang description: Hare language skill for simple systems programming. Use when building with hare build/test/run, Hare stdlib, C FFI with @extern, tagged union error handling, or comparing Hare vs C/Zig. Activates on queries about Hare language, hare build, @extern, tagged union, or Hare stdlib.
Hare
Purpose
Guide agents through the Hare programming language: design philosophy (simple, stable, compiled), `hare build`/`test`/`run` workflows, stdlib overview, C FFI with `@extern`, the type system (tagged unions, slices), error handling with `(T | error!)`, and comparison with C and Zig for systems utilities.
When to Use
- Writing small system utilities with C-like control and modern safety
- Building CLI tools or daemons with minimal dependencies
- Calling C libraries from Hare or exporting Hare functions to C
- Preferring explicit error handling over exceptions
- Evaluating Hare vs C or Zig for a new project
- Needing a stable, auditable codebase without heavy runtime
Workflow
1. Install Hare
# Linux/macOS — build from source git clone https://git.sr.ht/~sircmpwn/hare cd hare make check # builds and runs tests sudo make install hare version
# Create project (Hare has no project generator — lay out manually) mkdir -p mytool && cd mytool cat > hare.mod << 'EOF' module mytool EOF
2. Hello world and build
// main.ha
use fmt;
export fn main() void = {
fmt::println("Hello, Hare!")!;
};hare build -o mytool ./mytool hare run . # build and run hare test # run tests
3. Stdlib overview
| Module | Purpose | |--------|---------| | `fmt` | Formatted I/O (`printf`, `println`) | | `io` | Reader/writer interfaces | | `os` | Files, environment, args | | `strings` | String manipulation | | `bufio` | Buffered I/O | | `encoding` | JSON, hex, etc. | | `net` | TCP/UDP networking | | `time` | Dates and durations | | `mem` | Memory helpers | | `types` | Platform integer types |
use os;
use fmt;
use strings;
export fn main() void = {
const args = os::args;
for (let i = 0z; i < len(args); i += 1) {
fmt::println(args[i])!;
};
};4. Error handling
// Errors are tagged union values — explicit propagation with !
fn read_file(path: str) (str | os::error) = {
const file = os::open(path)?;
defer os::close(file);
let buf: []u8 = [];
io::readall(file, &buf)?;
return strings::fromutf8(buf)!;
};
export fn main() void = {
match (read_file("config.txt")) {
case let s: str =>
fmt::println(s)!;
case let err: os::error =>
fmt::fatalf("error: {}", err)!;
};
};`?` propagates errors; `!` asserts success in infallible context; `match` for handling.
5. Type system
// Tagged union
type color = (u8 | u16 | void);
fn get_color(c: color) u16 = {
match (c) {
case let v: u8 => return v: u16;
case let v: u16 => return v;
case => abort();
};
};
// Slices — pointer + length
fn sum(nums: []i32) i32 = {
let total = 0i32;
for (let i = 0z; i < len(nums); i += 1) {
total += nums[i];
};
return total;
};No implicit conversions — explicit casts required.
6. C FFI — @extern
// Link against C library
use c;
@extern("c") fn strlen(s: *const u8) size;
export fn main() void = {
const s = "hello";
fmt::println(len(s))!; // Hare strlen via strings module
};Export Hare to C:
// Exported C ABI function
export fn my_add(a: i32, b: i32) i32 = {
return a + b;
};hare build -o libmytool.a # Link from C with generated headers or manual declarations
// cgo-style module linking in hare.mod
module mytool
require (
libc
)7. Testing
@test fn test_add() void = {
assert(sum(&[1i32, 2, 3]) == 6);
};
@test fn test_error() void = {
match (read_file("/nonexistent")) {
case => abort("expected error");
case let err: os::error => void;
};
};hare test -v
8. Hare vs C vs Zig
| Aspect | Hare | C | Zig | |--------|------|---|-----| | Memory safety | Some (no null, tagged errors) | Manual | Manual + optional safety | | Compile time | Fast | Fast | Comptime heavy | | Stdlib | Minimal, stable | libc | Extensive | | C interop | `@extern` | Native | `@cImport` | | Generics | No (comptime limited) | No | Comptime generics | | Best for | Utilities, tools | Everything | Systems with metaprogramming |
9. Use cases
Good Hare fits ├── CLI utilities (grep-like, init tools) ├── Build tools and scripts replacing shell ├── Network daemons with simple protocol └── Auditable security-sensitive code Consider C/Zig instead when ├── Heavy generic metaprogramming needed (Zig) ├── Existing massive C ecosystem glue └── GPU/kernel domains with immature Hare support
Common Problems
| Symptom | Cause | Fix | |---------|-------|-----| | `unknown type` | Missing import | Add `use module;` | | FFI link error | Library not in hare.mod | Add require; correct `-l` flags | | Error not handled | Missing `?` or match | Propagate or handle all cases | | UTF-8 error | Invalid bytes in string | Validate with `strings::fromutf8` | | Test not found | Missing `@test` | Name fn with `@test` attribute | | Platform syscall missing | Hare stdlib gap | Use `@extern` to libc |
Related Skills
- `skills/zig/zig-compiler` — Zig as alternative systems language
- `skills/zig/zig-cinterop` — Zig C interop comparison
- `skills/compilers/gcc` — C toolchain alongside Hare
- `skills/languages/carbon-lang` — other emerging systems languages
- `skills/build-systems/make` — integrating Hare into Makefiles
- `skills/runtime-safety/sanitizers` — C interop safety testing
A curated suite of AI agent skills for systems and low-level programming — C/C++, Rust, Zig, GPU, bare-metal firmware, Linux kernel/driver development, computer architecture, compiler internals, HPC, and more.
Repo: mohitmishra786/low-level-dev-skills
Other skills on low-level-dev-skills.
- /custom-allocators
Custom allocator skill for memory allocation strategies. Use when implementing pool/slab/arena allocators, tuning jemalloc/mimalloc, writing Rust GlobalAlloc, or benchmarking allocator performance. Activates on queries about jemalloc, mimalloc, tcmalloc, arena allocator,
Open skill - /numa-programming
NUMA programming skill for multi-socket memory locality. Use when detecting NUMA topology, binding processes with numactl, using libnuma API, building NUMA-aware data structures, or measuring remote access penalties. Activates on queries about numactl, libnuma, NUMA topology,
Open skill - /af-xdp
AF_XDP skill for high-performance XDP sockets. Use when creating AF_XDP sockets, configuring UMEM and XSK rings, XDP_REDIRECT programs, copy vs zero-copy mode, or comparing with DPDK. Activates on queries about AF_XDP, xsk_umem, XDP_REDIRECT, libbpf xsk, or zero-copy XDP.
Open skill - /dpdk
DPDK skill for userspace packet I/O. Use when initializing EAL, configuring PMD drivers, using mbuf pools and rte_ring, setting up huge pages, RSS, or testpmd validation. Activates on queries about DPDK, EAL, rte_eth_rx_burst, hugepages, PMD, or testpmd.
Open skill - /io-uring
io_uring skill for Linux async I/O. Use when building high-performance servers with liburing, multi-shot operations, provided buffers, fixed files, zero-copy send, or tokio-uring. Activates on queries about io_uring, SQE/CQE, liburing, IORING_OP_PROVIDE_BUFFERS, or io_uring vs
Open skill - /adc-dac-baremetal
Bare-metal ADC and DAC skill. Use when configuring analog sampling, DMA-driven ADC, calibration, or DAC output on MCUs. Activates on queries about ADC bare-metal, sampling time, DMA ADC, or DAC channel setup.
Open skill

