Back to Skills

Nawin

majiayu000
Updated Today
1 views
58
9
58
View on GitHub
Developmentgeneral

About

Nawin is a .NET implementation of the 9P2000 protocol for connecting to and serving Plan 9/9front systems. It enables developers to build clients and servers for file sharing, remote shells, and authentication. Use this skill when you need to integrate .NET applications with Plan 9 network resources.

Quick Install

Claude Code

Recommended
Plugin CommandRecommended
/plugin add https://github.com/majiayu000/claude-skill-registry
Git CloneAlternative
git clone https://github.com/majiayu000/claude-skill-registry.git ~/.claude/skills/Nawin

Copy and paste this command in Claude Code to install this skill

Documentation

Nawin

Nawin is a .NET 9 implementation of the 9P2000 protocol for connecting Windows/Linux systems to 9front (Plan 9) file servers. It provides clients, servers, authentication, and CPU remote shell capabilities.

Instructions

When helping users with Nawin, follow these guidelines:

  1. Project Location: The codebase is at /home/matt/Git/Nawin
  2. Running Tools: Use dotnet run --project Nawin.<Project> to run tools
  3. Privileged Ports: Port 564 requires root. Use sudo $(which dotnet) run or use a high port like 5640
  4. Authentication: Support for none, simple:user:pass, p9sk1 (Plan 9), and dp9ik (9front modern)
  5. 9front Testing: CPU into 9front using the auth server at localhost:17019

Available Tools

ProjectPurposeDefault Port
Nawin.CliInteractive 9P client (ls, cat, mount, copy)connects to 564
Nawin.ServeServe local directories over 9P (U9FS replacement)564
Nawin.CpuCPU client - remote shell with namespace export17010
Nawin.CpuServerAccept inbound CPU connections17010
Nawin.AuthAuthentication server (p9sk1/dp9ik)567
Nawin.JerqGraphics app with /dev/draw exportN/A

Examples

Example 1: Serve a Directory (U9FS Replacement)

User: How do I share a directory over 9P?

Claude: Use Nawin.Serve to expose a local directory:

# Serve current directory on high port (no root needed)
dotnet run --project Nawin.Serve -- -p 5640 .

# Serve with simple auth
dotnet run --project Nawin.Serve -- -p 5640 --auth simple:matt:secret /home/matt/share

# On port 564 (requires root)
sudo $(which dotnet) run --project Nawin.Serve -- /home/matt/share

Example 2: Connect to 9front

User: How do I list files on a 9front server?

Claude: Use Nawin.Cli with dp9ik auth:

dotnet run --project Nawin.Cli -- -H 9front.local -u glenda -p password -a dp9ik ls /

# Read a file
dotnet run --project Nawin.Cli -- -H 9front.local -u glenda -p password -a dp9ik cat /lib/motd

# Copy file from remote
dotnet run --project Nawin.Cli -- -H 9front.local -u glenda -p password -a dp9ik cp :/etc/profile ./profile

Example 3: CPU into 9front

User: How do I get a remote shell on 9front?

Claude: Use Nawin.Cpu for Plan 9 style CPU connection:

# Interactive shell
dotnet run --project Nawin.Cpu -- --host 9front.local --user glenda --password secret --protocol dp9ik

# Run a command
dotnet run --project Nawin.Cpu -- --host 9front.local -u glenda -P secret --protocol dp9ik "cat /dev/sysname"

# With local auth server (p9sk1)
dotnet run --project Nawin.Cpu -- --host localhost --port 17019 --user glenda --password test1234 --protocol p9sk1 "echo hello"

Example 4: Run the Auth Server

User: How do I start the authentication server?

Claude: Nawin.Auth runs as a systemd service or manually:

# Check status
systemctl status nawin-auth

# Restart
sudo systemctl restart nawin-auth && sleep 2 && systemctl status nawin-auth 2>&1 | head -15

# Run manually
dotnet run --project Nawin.Auth -- serve --port 567 --authdom mydom --keys ~/.nawin/keys

# Manage users
dotnet run --project Nawin.Auth -- adduser glenda
dotnet run --project Nawin.Auth -- listusers

Example 5: Mount Remote Filesystem

User: Can I mount a 9P filesystem locally?

Claude: Yes, Nawin.Cli supports mounting via FUSE (Linux) or ProjFS (Windows):

# Linux (FUSE) - runs in foreground with -f
dotnet run --project Nawin.Cli -- -H 9front.local -u glenda -a dp9ik mount -f /mnt/9front

# Windows (ProjFS)
dotnet run --project Nawin.Cli -- -H 9front.local -u glenda -a dp9ik mount C:\9front

Reference Implementation Details

Project Structure

Nawin/
├── Nawin.Protocol/     # Wire format, message serialization, Qid/Stat types
├── Nawin.Transport/    # TCP connection, tag multiplexing
├── Nawin.Client/       # High-level client API, sessions, file handles
├── Nawin.Server/       # Server-side: listener, file tree interface
├── Nawin.Auth/         # p9sk1 and dp9ik authentication
├── Nawin.Cli/          # Command-line client
├── Nawin.Cpu/          # CPU client (rcpu equivalent)
├── Nawin.CpuServer/    # CPU server
├── Nawin.Serve/        # File server (U9FS replacement)
├── Nawin.Jerq/         # Graphics with /dev/draw export
├── Nawin.Mount.Linux/  # FUSE integration
├── Nawin.Mount.Windows/# ProjFS integration
└── Nawin.Tests/        # Unit and integration tests

Authentication Protocols

ProtocolDescriptionUse Case
noneNo authenticationTrusted networks
simpleUsername/password (plaintext)Simple setups
p9sk1DES-based Plan 9 authOriginal Plan 9
dp9ikChaCha20-Poly1305 + PBKDF2Modern 9front

Nawin.Serve Options

dotnet run --project Nawin.Serve -- [options] <directory>

Options:
  -p, --port <port>      Port to listen on (default: 564)
  -a, --address <addr>   Address to bind (default: 0.0.0.0)
  --auth <type>          Auth: none, simple:user:pass (default: none)

Nawin.Cli Options

dotnet run --project Nawin.Cli -- [options] <command> [args]

Options:
  -H, --host <host>      Server hostname (default: localhost)
  -P, --port <port>      Server port (default: 564)
  -u, --user <user>      Username
  -p, --password <pass>  Password
  -a, --auth <type>      Auth: none, simple, p9sk1, dp9ik
  --authserver <h:p>     Auth server for p9sk1/dp9ik
  --aname <name>         Attach name (file tree)

Commands:
  ls [-l] <path>         List directory
  cat <path>             Read file
  write <path> <text>    Write to file
  stat <path>            Show file metadata
  mkdir <path>           Create directory
  rm <path>              Remove file/directory
  cp [-r] <src> <dst>    Copy (: prefix for remote)
  mount [-f] <path>      Mount filesystem
  shell                  Interactive shell

Nawin.Cpu Options

dotnet run --project Nawin.Cpu -- [options] [command]

Options:
  --host <host>          CPU server hostname
  --port <port>          CPU server port (default: 17010)
  -u, --user <user>      Username
  -P, --password <pass>  Password
  --protocol <proto>     Auth: p9sk1, dp9ik
  -e, --export <dir>     Export local directory to remote
  --jerq                 Enable graphics mode

Testing with 9front

The local 9front VM (barn) can be started with:

/opt/isos/9front.sh

9front source code is available at:

/mnt/  # When /opt/isos/9front-11321.amd64.iso is mounted

CPU into 9front with local auth server:

dotnet run --project Nawin.Cpu -- --host localhost --port 17019 --user glenda --password test1234 --protocol p9sk1 "command"

Troubleshooting

"dotnet: command not found" with sudo

# Use full path
sudo $(which dotnet) run --project Nawin.Serve

# Or preserve PATH
sudo env "PATH=$PATH" dotnet run --project Nawin.Serve

Permission denied on port 564

Use a high port or grant capability:

# Option 1: Use high port
dotnet run --project Nawin.Serve -- -p 5640 .

# Option 2: Grant capability to published binary
dotnet publish -c Release Nawin.Serve
sudo setcap 'cap_net_bind_service=+ep' ./Nawin.Serve/bin/Release/net9.0/publish/Nawin.Serve

Auth server not running

sudo systemctl restart nawin-auth && sleep 2 && systemctl status nawin-auth 2>&1 | head -15

GitHub Repository

majiayu000/claude-skill-registry
Path: skills/data/Nawin

Related Skills

algorithmic-art

Meta

This Claude Skill creates original algorithmic art using p5.js with seeded randomness and interactive parameters. It generates .md files for algorithmic philosophies, plus .html and .js files for interactive generative art implementations. Use it when developers need to create flow fields, particle systems, or other computational art while avoiding copyright issues.

View skill

subagent-driven-development

Development

This skill executes implementation plans by dispatching a fresh subagent for each independent task, with code review between tasks. It enables fast iteration while maintaining quality gates through this review process. Use it when working on mostly independent tasks within the same session to ensure continuous progress with built-in quality checks.

View skill

executing-plans

Design

Use the executing-plans skill when you have a complete implementation plan to execute in controlled batches with review checkpoints. It loads and critically reviews the plan, then executes tasks in small batches (default 3 tasks) while reporting progress between each batch for architect review. This ensures systematic implementation with built-in quality control checkpoints.

View skill

cost-optimization

Other

This Claude Skill helps developers optimize cloud costs through resource rightsizing, tagging strategies, and spending analysis. It provides a framework for reducing cloud expenses and implementing cost governance across AWS, Azure, and GCP. Use it when you need to analyze infrastructure costs, right-size resources, or meet budget constraints.

View skill