VSH (Vic's Shell) is a next-generation shell that maintains the full power of traditional shells while dramatically improving ergonomics, discoverability, and accessibility for users at all skill levels.
- Cognitive Flexibility: Multiple syntax styles for the same command - your brain, your choice
- Progressive Disclosure: Beginners use verbose syntax; power users stay terse
- Adaptive Intelligence: The shell learns your style and adapts to you
- No Compromise: Full shell power with zero degradation from bash/zsh
- For Everyone: Beginners, power users, and everyone in between
- Multiple Valid Syntaxes - Commands work in terse, verbose, and named-parameter forms
- Intelligent Adaptation - Shell profiles user behavior and adapts suggestions
- Readable Scripts - .vsh files should read like pseudocode
- Helpful Errors - Errors suggest fixes and explain problems in plain English
- Backwards Compatible - Run .sh scripts natively with bash compatibility mode
- Offline-First - All intelligence runs locally, no cloud dependencies
- Fast & Reliable - Built in Rust for safety and performance
Every command supports multiple syntax variants:
Example: File Copy
# Traditional (bash-compatible)
cp file.txt backup/
# Verbose natural language
copy file.txt to backup/
# Named parameters
copy source=file.txt destination=backup/
# Mixed styles (all valid)
copy file.txt destination=backup/
cp source=file.txt to backup/Example: Find Files
# Traditional
find . -type f -name "*.txt"
# Verbose
find files with-extension txt in current-directory
# Named parameters
find type=file name="*.txt" path=.
# Natural hybrid
find files named "*.txt" in .VSH builds a profile of each user based on:
- Command history patterns (verbose vs terse usage ratio)
- Error recovery patterns (what helps them succeed)
- Syntax preference trends (converging on a style)
- Typing patterns (command length, completion usage)
- Setup questionnaire (explicit skill level declaration)
Profile is stored in ~/.vsh/profile.json and continuously updated.
When errors occur, VSH provides:
$ copy file.txt to nonexistent/
✗ Error: Destination directory does not exist
Suggestion: Did you mean to create it first?
→ mkdir nonexistent && copy file.txt to nonexistent/
Or did you mean one of these?
→ copy file.txt to Documents/
→ copy file.txt to backup/
[?] Need help? Type 'help copy' for more informationFeatures:
- Typo correction with suggestions
- Context-aware hints based on directory structure
- Plain English explanations of what went wrong
- Example commands that would work
- Help system integration for learning
Tab completion that:
- Learns your preference (verbose vs terse)
- Offers all valid syntaxes when uncertain
- Prioritizes your style as confidence grows
- Shows examples inline for unfamiliar commands
$ cop<TAB>
→ copy (verbose style - you use this 80% of the time)
cp (terse style)
copy <file> (show example)Run .sh files natively:
$ ./legacy-script.sh
[VSH: Running in bash compatibility mode]Write .vsh files with enhanced syntax:
#!/usr/bin/env vsh
# Variables - both styles work
backup_dir = "~/backups"
set log_file = "/var/log/backup.log"
# Conditionals
if directory-exists $backup_dir then
echo "Backup directory ready"
else
mkdir $backup_dir
echo "Created backup directory"
end
# Loops - readable syntax
for file in *.txt do
copy $file to $backup_dir
echo "Backed up: $file" | append-to $log_file
end
# Functions
function compress-backup
tar -czf backup.tar.gz $backup_dir
echo "Backup compressed"
end
compress-backupMultiple pipe operators for cognitive flexibility:
# Traditional
cat file.txt | grep "pattern" | sort
# Arrow style
cat file.txt -> grep "pattern" -> sort
# Natural language
cat file.txt then grep "pattern" then sort
# All valid and interchangeable┌─────────────────────────────────────────────┐
│ VSH Shell (main) │
├─────────────────────────────────────────────┤
│ ┌────────────┐ ┌──────────────┐ │
│ │ Parser │→ │ Intent │ │
│ │ Engine │ │ Analyzer │ │
│ └────────────┘ └──────────────┘ │
│ ↓ ↓ │
│ ┌────────────────────────────┐ │
│ │ Command Translator │ │
│ │ (Syntax → Canonical AST) │ │
│ └────────────────────────────┘ │
│ ↓ │
│ ┌────────────────────────────┐ │
│ │ Executor │ │
│ │ (Runs canonical commands) │ │
│ └────────────────────────────┘ │
├─────────────────────────────────────────────┤
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Profile │ │ Config │ │ Compat │ │
│ │ Manager │ │ System │ │ Layer │ │
│ └──────────┘ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────┘
Multi-Stage Pipeline:
-
Tokenization
- Split input into tokens (commands, args, operators)
- Handle quotes, escapes, variables
-
Syntax Detection
- Identify which syntax variant is being used
- Pattern match against known command structures
-
Intent Analysis
- Determine what the user is trying to do
- Extract semantic meaning from syntax
-
Canonical Translation
- Convert any valid syntax to internal AST
- Normalize to consistent representation
-
Validation
- Check arguments, paths, permissions
- Provide intelligent errors if invalid
Example Translation:
// Input variants
"copy file.txt to backup/"
"cp file.txt backup/"
"copy source=file.txt destination=backup/"
// All translate to canonical AST:
Command {
intent: Copy,
args: {
source: Path("file.txt"),
destination: Path("backup/"),
}
}Profile Structure:
struct UserProfile {
// Syntax preferences
verbose_ratio: f32, // 0.0 = always terse, 1.0 = always verbose
preferred_syntax: SyntaxStyle, // Dominant style
// Behavior metrics
avg_command_length: usize,
completion_usage_rate: f32,
error_rate: f32,
// Learning indicators
commands_executed: u64,
days_active: u32,
skill_estimate: SkillLevel, // Beginner, Intermediate, Advanced
// Adaptation state
confidence: f32, // How confident we are in profile
last_updated: DateTime,
}
enum SyntaxStyle {
Terse, // cp, mv, rm
Verbose, // copy, move, remove
Named, // copy source=x dest=y
Mixed, // User uses multiple styles
}
enum SkillLevel {
Beginner,
Intermediate,
Advanced,
PowerUser,
}Profiling Algorithm:
fn update_profile(profile: &mut UserProfile, command: &Command) {
// Track syntax style
let syntax = detect_syntax_style(command);
profile.update_syntax_preference(syntax);
// Track success/failure
if command.succeeded() {
profile.error_rate = profile.error_rate * 0.95;
} else {
profile.error_rate = profile.error_rate * 1.05;
}
// Estimate skill level
profile.skill_estimate = estimate_skill(profile);
// Increase confidence over time
profile.confidence = min(1.0, profile.confidence + 0.001);
profile.commands_executed += 1;
}Configuration File: ~/.vshrc
# VSH Configuration File
# Syntax preferences (optional - shell will learn automatically)
set default-syntax = "verbose" # or "terse" or "named"
# Error handling
set show-suggestions = true
set show-examples = true
set explain-errors = true
set typo-correction = true
set suggestion-count = 3
# Compatibility
set bash-mode = "auto" # "auto", "always", "never"
set enhance-bash-scripts = true # Better errors for .sh files
set run-sh-in-subprocess = false
# Auto-completion
set completion-style = "adaptive" # "adaptive", "all-options", "preferred-only"
set completion-delay = 100 # ms before showing completions
# Profiling
set enable-profiling = true
set profile-path = "~/.vsh/profile.json"
# History
set history-size = 10000
set history-file = "~/.vsh/history"
# Appearance
set prompt = "vsh %d $ "
set color-scheme = "default"
set show-git-status = true
# Advanced
set parser-strictness = "lenient" # "strict", "lenient"
set cache-parsed-scripts = trueModes:
-
Auto Mode (default)
- Detect .sh files → bash compatibility
- Detect .vsh files → VSH syntax
- Interactive shell → VSH syntax with bash fallback
-
Always Mode
- Everything runs in bash compatibility
- VSH features disabled
-
Never Mode
- Pure VSH mode
- .sh files may have issues
Implementation:
enum CompatMode {
Auto,
Always,
Never,
}
fn should_use_bash_compat(file: &Path, mode: CompatMode) -> bool {
match mode {
CompatMode::Always => true,
CompatMode::Never => false,
CompatMode::Auto => {
file.extension() == Some("sh") ||
file.starts_with("#!/bin/bash") ||
file.starts_with("#!/bin/sh")
}
}
}Every command supports three main styles:
cp source dest
mv old new
rm file
ls -la
grep pattern filecopy source to dest
move old to new
remove file
list all-details
grep pattern in filecopy source=file dest=backup/
move from=old to=new
remove file=document.txt
list show=all-details
grep pattern="error" file=log.txtFile Operations:
# Copy
cp file.txt backup/
copy file.txt to backup/
copy source=file.txt destination=backup/
# Move
mv old.txt new.txt
move old.txt to new.txt
move from=old.txt to=new.txt
# Remove
rm file.txt
remove file.txt
delete file.txt
remove file=file.txt
# Create directory
mkdir newdir
create-directory newdir
make directory=newdirFile Search:
# Find files
find . -name "*.txt"
find files named "*.txt"
find files with-name "*.txt" in .
find path=. name="*.txt" type=file
# Grep
grep "pattern" file.txt
search "pattern" in file.txt
grep pattern="pattern" file=file.txtDirectory Navigation:
# Change directory
cd /path/to/dir
change-directory /path/to/dir
goto /path/to/dir
cd path=/path/to/dir
# List
ls -la
list all-details
list show=all details=trueDeclaration:
# All valid
name = "value"
set name = "value"
let name = "value"
var name = "value"Usage:
# All valid
$name
${name}
{name}Types (Optional):
# Strings
name = "John"
set message = "Hello World"
# Numbers
count = 42
set price = 19.99
# Lists
files = ["a.txt", "b.txt", "c.txt"]
set numbers = [1, 2, 3, 4, 5]
# Type inference by default, explicit typing optional
set count: number = 42
set name: string = "Alice"Conditionals:
# If-then-else
if condition then
commands
else
other commands
end
# One-line
if condition then command
# Conditions
if file-exists "test.txt" then echo "Found!"
if $count > 10 then echo "Large"
if directory-exists $path then cd $pathLoops:
# For loop
for item in list do
echo $item
end
# While loop
while condition do
commands
end
# Iterate files
for file in *.txt do
process $file
end
# Iterate numbers
for i in 1..10 do
echo $i
endFunctions:
# Function definition
function backup-files
for file in *.txt do
copy $file to ~/backup/
end
end
# With parameters
function greet name
echo "Hello, $name!"
end
# With return values
function add x y
return $(($x + $y))
end
# Call
backup-files
greet "Alice"
result = add 5 3Pipes:
# All equivalent
cat file.txt | grep pattern | sort
cat file.txt -> grep pattern -> sort
cat file.txt then grep pattern then sortRedirection:
# Output
command > file.txt
command output-to file.txt
command redirect-output file.txt
# Append
command >> file.txt
command append-to file.txt
# Input
command < input.txt
command input-from input.txtStructure:
✗ Error: [What went wrong]
[Plain English explanation]
Suggestion: [How to fix it]
→ [Suggested command]
[Alternative suggestions if applicable]
[?] Need help? Type 'help [command]' for more information
Examples:
$ copy nonexistent.txt backup/
✗ Error: Source file does not exist
The file 'nonexistent.txt' could not be found in the current directory.
Suggestion: Check the filename or path
→ list files containing "nonexistent"
Did you mean one of these?
→ copy document.txt to backup/
→ copy notes.txt to backup/
[?] Need help? Type 'help copy' for more information$ remove important-file.txt
⚠ Warning: This will permanently delete 'important-file.txt'
This action cannot be undone.
Suggestion: Create a backup first
→ copy important-file.txt to backup/ && remove important-file.txt
Continue? [y/N]: Integrated help:
$ help copy
COPY - Copy files or directories
SYNTAX VARIANTS:
copy <source> to <destination>
cp <source> <destination>
copy source=<path> destination=<path>
EXAMPLES:
copy file.txt to backup/
copy *.txt to documents/
cp -r folder/ backup/
OPTIONS:
--recursive, -r Copy directories recursively
--verbose, -v Show detailed output
--force, -f Overwrite without asking
SEE ALSO: move, remove, linkContext-sensitive help:
$ copy <TAB>
[Shows files in current directory]
$ copy file.txt <TAB>
→ to [destination]
into [directory]
destination=
$ copy file.txt to <TAB>
[Shows directories]Goal: Demonstrate core parsing and multi-syntax support
Features:
- Basic parser for 3-5 core commands (copy, move, remove, list)
- Support for terse and verbose syntax
- Simple command execution
- Basic error messages
- .vshrc configuration file
Deliverable: Working shell that can execute simple file operations
Timeline: 4-6 weeks
Goal: Add adaptive profiling and smart completion
Features:
- User profiling system
- Command history tracking
- Adaptive auto-completion
- Improved error messages with suggestions
- Learning algorithm implementation
Deliverable: Shell that learns user preferences
Timeline: 6-8 weeks
Goal: Full scripting capabilities with .vsh files
Features:
- Variables and data types
- Control flow (if/for/while)
- Functions
- Script execution engine
- Bash compatibility mode for .sh files
Deliverable: Full scripting language
Timeline: 8-10 weeks
Goal: Polish and power-user features
Features:
- Advanced pipe operators
- Named parameters for all commands
- Comprehensive help system
- Plugin/extension system
- Performance optimizations
- Full test coverage
Deliverable: Production-ready shell
Timeline: 10-12 weeks
Goal: Tools, documentation, and community
Features:
- VSH package manager
- Standard library of .vsh scripts
- Comprehensive documentation
- Tutorial system
- Syntax highlighting for editors
- Migration tools from bash/zsh
Deliverable: Complete ecosystem
Timeline: Ongoing
Language: Rust (stable)
Key Crates:
clap- CLI argument parsingrustyline- Interactive line editing and historynomorpest- Parser combinatorsserde- Serialization (for config/profile)tokio- Async runtime (for background tasks)colored- Terminal colorsshellexpand- Path expansiondirs- Platform-specific directories
[dependencies]
# Parsing
nom = "7.1"
pest = "2.7"
# CLI & REPL
clap = { version = "4.4", features = ["derive"] }
rustyline = "13.0"
colored = "2.1"
# Data & Config
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
toml = "0.8"
# System interaction
nix = "0.27"
libc = "0.2"
# Utilities
anyhow = "1.0"
thiserror = "1.0"
log = "0.4"
env_logger = "0.11"
# Async (optional, for future features)
tokio = { version = "1.35", features = ["full"] }vsh/
├── Cargo.toml
├── README.md
├── LICENSE
├── .github/
│ └── workflows/
│ └── ci.yml
├── src/
│ ├── main.rs # Entry point
│ ├── lib.rs # Library root
│ ├── parser/
│ │ ├── mod.rs
│ │ ├── tokenizer.rs
│ │ ├── syntax_detector.rs
│ │ ├── intent_analyzer.rs
│ │ └── translator.rs
│ ├── executor/
│ │ ├── mod.rs
│ │ ├── command.rs
│ │ ├── builtin.rs
│ │ └── external.rs
│ ├── profile/
│ │ ├── mod.rs
│ │ ├── profiler.rs
│ │ └── analyzer.rs
│ ├── config/
│ │ ├── mod.rs
│ │ └── vshrc.rs
│ ├── completion/
│ │ ├── mod.rs
│ │ └── adaptive.rs
│ ├── error/
│ │ ├── mod.rs
│ │ └── suggestions.rs
│ ├── compat/
│ │ ├── mod.rs
│ │ └── bash.rs
│ └── repl/
│ ├── mod.rs
│ └── interactive.rs
├── tests/
│ ├── integration/
│ └── fixtures/
├── examples/
│ ├── basic.vsh
│ └── advanced.vsh
└── docs/
├── SYNTAX.md
├── COMMANDS.md
└── CONTRIBUTING.md
Shebang:
#!/usr/bin/env vshExample:
#!/usr/bin/env vsh
# Example VSH script
# Variables
backup_dir = "~/backups"
log_file = "/var/log/backup.log"
# Function
function create-backup source
if not directory-exists $backup_dir then
create-directory $backup_dir
end
copy $source to $backup_dir
echo "Backed up: $source" >> $log_file
end
# Main logic
for file in *.txt do
create-backup $file
end
echo "Backup complete!"# VSH Configuration
# Appearance
set prompt = "vsh %d $ "
set color-scheme = "monokai"
# Behavior
set default-syntax = "verbose"
set completion-style = "adaptive"
# Features
set show-suggestions = true
set enable-profiling = true
# Aliases
alias ll = "list all-details"
alias backup = "copy to ~/backups/"
# Custom functions
function quick-backup
copy $1 to ~/backups/
endFile: ~/.vsh/profile.json
{
"version": "0.1.0",
"created": "2026-02-11T00:00:00Z",
"last_updated": "2026-02-11T12:30:00Z",
"syntax_preferences": {
"verbose_ratio": 0.75,
"preferred_syntax": "Verbose",
"terse_count": 50,
"verbose_count": 150,
"named_count": 25
},
"behavior_metrics": {
"avg_command_length": 25,
"completion_usage_rate": 0.60,
"error_rate": 0.05,
"commands_executed": 1250,
"days_active": 30
},
"skill_estimate": "Intermediate",
"confidence": 0.85
}- Beginner onboarding: New users execute successful commands within 2 minutes
- Error recovery: 80%+ of errors include actionable suggestions
- Syntax flexibility: Users can mix syntaxes without confusion
- Learning curve: Intermediate proficiency within 1 week of daily use
- Performance: Command execution < 50ms overhead vs bash
- Parsing accuracy: 99%+ correct intent detection
- Profile accuracy: 85%+ syntax prediction accuracy after 100 commands
- Compatibility: 95%+ bash scripts run without modification
- Adoption: 1000+ active users within 6 months
- Contributions: 10+ external contributors
- Documentation: 100% command coverage in help system
- Scripts: Library of 50+ example .vsh scripts
VSH is a fully community-driven project. The shell is for everyone, so it should be built BY everyone.
Why Community-Driven?
- A shell for all skill levels needs input from all skill levels
- Diverse users = diverse perspectives = better design
- Sustainability beyond any single maintainer
- Transparency builds trust
- Collective wisdom > individual opinion
Principles:
- Open from Day One - All development happens in public
- Inclusive by Default - All skill levels welcome to contribute
- Transparent Decisions - Process and rationale documented
- Credit Everyone - Recognition for all contributions
- Iterate Together - Community votes on major decisions
Decision-Making Structure:
┌─────────────────────────────────────────┐
│ Community (Everyone) │
│ - Votes on major decisions │
│ - Proposes features via RFCs │
│ - Reviews and discusses │
└────────────┬────────────────────────────┘
│
┌────────────▼────────────────────────────┐
│ Core Team (3-7 members) │
│ - Day-to-day decisions │
│ - Review PRs │
│ - Maintain quality standards │
│ - Elected by community (6-month terms) │
└────────────┬────────────────────────────┘
│
┌────────────▼────────────────────────────┐
│ Founder (Vic) │
│ - Vision keeper │
│ - Tie-breaker on deadlocks │
│ - Can step back once mature │
└─────────────────────────────────────────┘
Major Decisions (Require Community Vote):
- Syntax changes affecting existing commands
- Breaking changes to .vsh file format
- Default configuration changes
- Adding/removing core features
- Governance structure changes
Minor Decisions (Core Team):
- Bug fixes
- Performance improvements
- New optional features (can be toggled off)
- Documentation updates
- Non-breaking enhancements
RFC Process:
- Anyone submits RFC (Request for Comments) via GitHub
- 2-week discussion period
- Core team summarizes feedback
- Community vote if needed (>50% approval)
- Implementation by volunteers
Everyone Can Contribute - Regardless of Skill Level
For Beginners:
- 🐛 Report bugs - Help us find issues
- 📝 Improve docs - Fix typos, clarify instructions
- 💬 Answer questions - Help others in discussions
- 🧪 Test features - Try new releases, report feedback
- 🎨 Design examples - Create .vsh script examples
For Intermediate:
- ✨ Add commands - Implement new built-in commands
- 🔧 Fix bugs - Tackle good-first-issue labels
- 📚 Write tutorials - Help others learn VSH
- 🎯 Triage issues - Help organize and prioritize
- 🌐 Translate - Localize error messages
For Advanced:
- ⚡ Core features - Parser, profiler, executor improvements
- 🏗️ Architecture - Design and implement major systems
- 🔬 Performance - Optimize hot paths
- 🛡️ Security - Review and harden code
- 🎓 Mentorship - Guide new contributors
GitHub (Primary Hub):
- Discussions - General chat, questions, ideas
- Issues - Bug reports, feature requests
- Pull Requests - Code contributions
- RFCs - Major proposals in
/rfcsdirectory - Wiki - Community-maintained documentation
Discord Server:
#general- Casual chat#help- Support for users#development- Technical discussions#design- Syntax and UX debates#rfc-discussion- Live RFC debates#showcase- Share .vsh scripts
Monthly Community Calls:
- Open to everyone
- Demo new features
- Discuss roadmap
- Live Q&A
- Recorded and posted on YouTube
Social Media:
- Twitter/X for announcements
- Reddit r/vsh for discussions
- Hacker News for launches
All Contributors Recognized:
CONTRIBUTORS.md- Everyone who contributes- Release notes credit all contributors
- "Contributor" role in Discord
- Special recognition for major features
Hall of Fame:
- Top monthly contributors
- Most helpful community members
- Best .vsh script submissions
- Outstanding bug reporters
Maintainer Election:
- Every 6 months, community votes for core team
- Nominations based on contributions
- 3-7 members (odd number for tie-breaking)
- Anyone can run if they've contributed
Core Values:
- Be Kind - Assume good intentions
- Be Inclusive - Welcome all backgrounds and skill levels
- Be Constructive - Critique ideas, not people
- Be Patient - Everyone's learning
- Be Respectful - Disagreement is fine, disrespect is not
Enforcement:
- Warnings for first offense
- Temp ban for repeated issues
- Permanent ban for severe violations
- Core team makes final decisions
Open Development:
# Everything happens in public
1. Discussion in GitHub Issues/Discussions
2. RFC for major changes
3. Implementation in feature branch
4. PR with tests and documentation
5. Review by core team + community
6. Merge when approved
7. Credit in release notesQuality Standards:
- Tests required for new features
- Documentation required for user-facing changes
- Code review by at least 2 people
- CI must pass (formatting, tests, lints)
- No merge until consensus reached
Release Cycle:
- Patch releases (0.1.x) - Bug fixes, every 2 weeks
- Minor releases (0.x.0) - New features, every 2 months
- Major releases (x.0.0) - Breaking changes, when ready
Initial Bootstrap:
- Free and open source (MIT/Apache 2.0)
- No commercial backing required
- Volunteer-driven development
Future Options (If Needed):
- GitHub Sponsors for infrastructure costs
- OpenCollective for transparent finances
- Corporate sponsorships (no influence on decisions)
- Optional premium features (cloud sync, etc.) - revenue shared with contributors
Principles:
- Core shell always free
- No paywalls for essential features
- Community controls direction, not sponsors
- Transparent finances
Phase 1: Initial Launch (Month 1)
- Release spec publicly on GitHub
- Create Discord server
- Post on Hacker News, Reddit, Twitter
- Invite initial contributors
- Set up CI/CD and documentation
Phase 2: First Contributors (Months 2-3)
- Label good-first-issues
- Mentor new contributors
- Hold first community call
- Establish RFC process
- Get to 10+ active contributors
Phase 3: Community Growth (Months 4-6)
- First community vote on major decision
- Elect initial core team (3-5 people)
- Launch contributor recognition program
- Hit 50+ contributors
- Stable release candidate
Phase 4: Maturity (Months 7-12)
- Community self-sustaining
- Regular release cadence
- Active Discord with daily activity
- 100+ contributors
- First 1.0 release
Examples of Community Input:
Syntax Design:
- Multiple variants exist BECAUSE different people think differently
- Community votes on which aliases to include
- Users propose new syntax patterns
Error Messages:
- Beginners report which errors are confusing
- Community suggests better wording
- A/B testing with real users
Platform Support:
- Windows users drive Windows compatibility
- macOS users handle macOS quirks
- Linux distro maintainers package for their distros
Localization:
- Native speakers translate error messages
- Cultural context for examples
- Region-specific defaults
- Parser implementation:
nomvspestvs custom? → Let's vote! - Profile privacy: How to handle sensitive command history?
- Update mechanism: Auto-updates vs manual?
- Telemetry: Anonymous usage stats (opt-in)? What data?
- Cross-platform: Windows support strategy?
- Default prompt: What should
vsh $look like? - License: MIT vs Apache 2.0 vs dual?
- AI Integration: Natural language command generation (opt-in)
- Cloud Sync: Profile sync across machines
- Team Profiles: Shared syntax standards for teams
- Plugin System: Community extensions
- Visual Mode: GUI overlay for beginners
- Voice Commands: Speech-to-command translation
- Package Manager: Install .vsh scripts from community repo
- Rust 1.70+ installed
- Basic shell scripting knowledge
- Familiarity with parsers (optional but helpful)
# Clone repo
git clone https://github.com/vic/vsh.git
cd vsh
# Build
cargo build
# Run tests
cargo test
# Run VSH
cargo run
# Install locally
cargo install --path .See docs/CONTRIBUTING.md for:
- Code style guidelines
- Testing requirements
- PR process
- Command implementation guide
From Vic:
I created VSH because shells shouldn't be gatekeepers. They should be gateways.
I've watched too many brilliant people bounce off the command line because
cpdoesn't make sense, becausefind . -type f -name "*.txt" -exec grep -l "pattern" {} \;looks like line noise, because one misplaced quote breaks everything.But I've also watched power users accomplish incredible things with the same tools.
VSH shouldn't make you choose. Beginners get readable commands. Power users get efficiency. Everyone gets a shell that adapts to THEM, not the other way around.
But here's the thing - I can't build this alone. A shell for everyone NEEDS everyone.
This is our project. Community-driven from day one. Your ideas, your code, your vision.
Let's build something that makes the command line accessible to millions, without dumbing it down for anyone.
Let's build VSH.
— Vic
License: MIT License (chosen by community vote)
Copyright: © 2026 VSH Contributors
Why MIT?
- Maximum freedom for users
- Compatible with commercial and open source projects
- Simple and well-understood
- Encourages adoption and contribution
Trademark: "VSH" and "Vic's Shell" are community-owned. No single entity controls the brand.
Governance: See Section 11 - Community & Governance
Contributors Retain Copyright: All contributors retain copyright to their contributions, licensed under MIT to the project.
Created by: Victor Soto (Founder & Vision Keeper)
Built by: The VSH Community (see CONTRIBUTORS.md)
Inspired by:
- Fish Shell - Intelligent auto-completion and helpful suggestions
- Nushell - Structured data and modern design
- PowerShell - Verbose, discoverable command syntax
- Bash/Zsh - Decades of proven shell design
- Elvish - Innovative parsing and pipeline ideas
- Oil Shell - Better language design for shell scripts
Special Thanks:
- Everyone who reported their frustrations with traditional shells
- The open source community for creating the tools we build on
- Early contributors and testers who shape VSH's direction
Join Us!
VSH is just getting started, and we need YOU:
🌟 Star the repo - Show support
💬 Join Discord - Connect with the community
🐛 Report bugs - Help us improve
💡 Propose features - Share your ideas
🔧 Write code - Build the future
📝 Improve docs - Make it better for everyone
🎓 Mentor others - Help newcomers contribute
Ready to contribute?
- Read
CONTRIBUTING.md - Check out
good-first-issuelabels - Join Discord
#developmentchannel - Say hi and ask questions!
No experience required. We'll help you get started.
Links:
- GitHub:
https://github.com/vic/vsh(coming soon!) - Discord:
https://discord.gg/vsh(coming soon!) - Website:
https://vsh.dev(coming soon!)
Together, we're building a shell for everyone.
Welcome to VSH. 🚀
How We Launch VSH as a Community Project from Day One
- Create GitHub repo:
vic/vsh(personal repo - free!) - Publish this spec as first commit
- Set up issue templates (bug, feature, RFC)
- Create
CONTRIBUTING.mdwith beginner-friendly guide - Create
CODE_OF_CONDUCT.md - Enable GitHub Discussions
- Create Discord server with channels
- Set up basic CI (GitHub Actions - free for public repos)
- Add topic tags:
shell,rust,cli,command-line,terminal
Note: Starting with personal repo keeps it free. Can transfer to organization later if needed (GitHub makes this easy).
- Post on Hacker News: "VSH - A Shell for Everyone, Built by Everyone"
- Post on Reddit: r/rust, r/commandline, r/opensource
- Tweet announcement with spec link
- Create project website (GitHub Pages is fine)
- Write blog post: "Why VSH is Community-Driven from Day One"
- Invite 5-10 initial interested people to be founding contributors
- Create 10 "good-first-issue" labels across different areas:
- Documentation improvements
- Example .vsh scripts
- Project setup (Cargo.toml, structure)
- Simple command implementations
- Test framework setup
- Host first community call (30 min)
- Introduce vision
- Answer questions
- Discuss initial architecture decisions
- Start first RFC: "Parser Library Selection"
- Merge first 5 PRs from community
- Update CONTRIBUTORS.md
- Showcase contributor work on Discord
- Second community call - demo basic prototype
- Vote on first major decision (parser library)
- Set up release automation
- Establish core team nomination process
- Document decision-making process in GOVERNANCE.md
- Create RFC template
- First community vote on syntax decision
- Monthly release cadence established
- 20+ active contributors
- 100+ GitHub stars
- 20+ contributors
- 50+ merged PRs
- 5+ active core team members
- Daily activity on Discord
- Working MVP released
Input: "copy file.txt to backup/"
Tokens: ["copy", "file.txt", "to", "backup/"]
Intent: FileCopy
Args: { source: "file.txt", dest: "backup/" }
Canonical: Command::Copy { src: Path("file.txt"), dst: Path("backup/") }
Input: "cp file.txt backup/"
Tokens: ["cp", "file.txt", "backup/"]
Intent: FileCopy
Args: { source: "file.txt", dest: "backup/" }
Canonical: Command::Copy { src: Path("file.txt"), dst: Path("backup/") }
Input: "copy source=file.txt destination=backup/"
Tokens: ["copy", "source=file.txt", "destination=backup/"]
Intent: FileCopy
Args: { source: "file.txt", dest: "backup/" }
Canonical: Command::Copy { src: Path("file.txt"), dst: Path("backup/") }
// High-level parser flow
fn parse(input: &str) -> Result<Command, ParseError> {
// 1. Tokenize
let tokens = tokenize(input)?;
// 2. Detect syntax style
let syntax = detect_syntax(&tokens);
// 3. Identify intent
let intent = analyze_intent(&tokens, syntax)?;
// 4. Extract arguments
let args = extract_args(&tokens, syntax, intent)?;
// 5. Validate
validate(&args, intent)?;
// 6. Build canonical command
Ok(build_command(intent, args))
}
fn detect_syntax(tokens: &[Token]) -> SyntaxStyle {
// Check for named parameters (key=value)
if tokens.iter().any(|t| t.contains('=')) {
return SyntaxStyle::Named;
}
// Check for verbose keywords (to, from, with, etc.)
if tokens.iter().any(|t| is_connector_word(t)) {
return SyntaxStyle::Verbose;
}
// Default to terse
SyntaxStyle::Terse
}
fn analyze_intent(tokens: &[Token], style: SyntaxStyle) -> Result<Intent> {
let command = &tokens[0];
// Try terse aliases first
if let Some(intent) = TERSE_ALIASES.get(command) {
return Ok(intent.clone());
}
// Try verbose keywords
if let Some(intent) = VERBOSE_KEYWORDS.get(command) {
return Ok(intent.clone());
}
// Unknown command
Err(ParseError::UnknownCommand(command.clone()))
}End of Specification v0.1
This is a living document. Suggestions and improvements welcome!