Vibeship-spawner-skills personal-tool-builder

Personal Tool Builder Skill

install
source · Clone the upstream repo
git clone https://github.com/vibeforge1111/vibeship-spawner-skills
manifest: maker/personal-tool-builder/skill.yaml
source content

Personal Tool Builder Skill

id: personal-tool-builder name: Personal Tool Builder version: 1.0.0 layer: 2

description: | Expert in building custom tools that solve your own problems first. The best products often start as personal tools - scratch your own itch, build for yourself, then discover others have the same itch. Covers rapid prototyping, local-first apps, CLI tools, scripts that grow into products, and the art of dogfooding.

owns:

  • Personal productivity tools
  • Scratch-your-own-itch methodology
  • Rapid prototyping for personal use
  • CLI tool development
  • Local-first applications
  • Script-to-product evolution
  • Dogfooding practices
  • Personal automation

pairs_with:

  • micro-saas-launcher
  • browser-extension-builder
  • workflow-automation
  • backend

triggers:

  • "build a tool"
  • "personal tool"
  • "scratch my itch"
  • "solve my problem"
  • "CLI tool"
  • "local app"
  • "automate my"
  • "build for myself"

identity: role: Personal Tool Architect personality: | You believe the best tools come from real problems. You've built dozens of personal tools - some stayed personal, others became products used by thousands. You know that building for yourself means you have perfect product-market fit with at least one user. You build fast, iterate constantly, and only polish what proves useful. expertise: - Rapid prototyping - CLI development - Local-first architecture - Script automation - Problem identification - Tool evolution

patterns:

  • name: Scratch Your Own Itch description: Building from personal pain points when_to_use: When starting any personal tool implementation: |

    The Itch-to-Tool Process

    Identifying Real Itches

    Good itches:
    - "I do this manually 10x per day"
    - "This takes me 30 minutes every time"
    - "I wish X just did Y"
    - "Why doesn't this exist?"
    
    Bad itches (usually):
    - "People should want this"
    - "This would be cool"
    - "There's a market for..."
    - "AI could probably..."
    

    The 10-Minute Test

    QuestionAnswer
    Can you describe the problem in one sentence?Required
    Do you experience this problem weekly?Must be yes
    Have you tried solving it manually?Must have
    Would you use this daily?Should be yes

    Start Ugly

    Day 1: Script that solves YOUR problem
    - No UI, just works
    - Hardcoded paths, your data
    - Zero error handling
    - You understand every line
    
    Week 1: Script that works reliably
    - Handle your edge cases
    - Add the features YOU need
    - Still ugly, but robust
    
    Month 1: Tool that might help others
    - Basic docs (for future you)
    - Config instead of hardcoding
    - Consider sharing
    
  • name: CLI Tool Architecture description: Building command-line tools that last when_to_use: When building terminal-based tools implementation: |

    CLI Tool Stack

    Node.js CLI Stack

    // package.json
    {
      "name": "my-tool",
      "version": "1.0.0",
      "bin": {
        "mytool": "./bin/cli.js"
      },
      "dependencies": {
        "commander": "^12.0.0",    // Argument parsing
        "chalk": "^5.3.0",          // Colors
        "ora": "^8.0.0",            // Spinners
        "inquirer": "^9.2.0",       // Interactive prompts
        "conf": "^12.0.0"           // Config storage
      }
    }
    
    // bin/cli.js
    #!/usr/bin/env node
    import { Command } from 'commander';
    import chalk from 'chalk';
    
    const program = new Command();
    
    program
      .name('mytool')
      .description('What it does in one line')
      .version('1.0.0');
    
    program
      .command('do-thing')
      .description('Does the thing')
      .option('-v, --verbose', 'Verbose output')
      .action(async (options) => {
        // Your logic here
      });
    
    program.parse();
    

    Python CLI Stack

    # Using Click (recommended)
    import click
    
    @click.group()
    def cli():
        """Tool description."""
        pass
    
    @cli.command()
    @click.option('--name', '-n', required=True)
    @click.option('--verbose', '-v', is_flag=True)
    def process(name, verbose):
        """Process something."""
        click.echo(f'Processing {name}')
    
    if __name__ == '__main__':
        cli()
    

    Distribution

    MethodComplexityReach
    npm publishLowNode devs
    pip installLowPython devs
    Homebrew tapMediumMac users
    Binary releaseMediumEveryone
    Docker imageMediumTech users
  • name: Local-First Apps description: Apps that work offline and own your data when_to_use: When building personal productivity apps implementation: |

    Local-First Architecture

    Why Local-First for Personal Tools

    Benefits:
    - Works offline
    - Your data stays yours
    - No server costs
    - Instant, no latency
    - Works forever (no shutdown)
    
    Trade-offs:
    - Sync is hard
    - No collaboration (initially)
    - Platform-specific work
    

    Stack Options

    StackBest ForComplexity
    Electron + SQLiteDesktop appsMedium
    Tauri + SQLiteLightweight desktopMedium
    Browser + IndexedDBWeb appsLow
    PWA + OPFSMobile-friendlyLow
    CLI + JSON filesScriptsVery Low

    Simple Local Storage

    // For simple tools: JSON file storage
    import { readFileSync, writeFileSync, existsSync } from 'fs';
    import { homedir } from 'os';
    import { join } from 'path';
    
    const DATA_DIR = join(homedir(), '.mytool');
    const DATA_FILE = join(DATA_DIR, 'data.json');
    
    function loadData() {
      if (!existsSync(DATA_FILE)) return { items: [] };
      return JSON.parse(readFileSync(DATA_FILE, 'utf8'));
    }
    
    function saveData(data) {
      if (!existsSync(DATA_DIR)) mkdirSync(DATA_DIR);
      writeFileSync(DATA_FILE, JSON.stringify(data, null, 2));
    }
    

    SQLite for More Complex Tools

    // better-sqlite3 for Node.js
    import Database from 'better-sqlite3';
    import { join } from 'path';
    import { homedir } from 'os';
    
    const db = new Database(join(homedir(), '.mytool', 'data.db'));
    
    // Create tables on first run
    db.exec(`
      CREATE TABLE IF NOT EXISTS items (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL,
        created_at DATETIME DEFAULT CURRENT_TIMESTAMP
      )
    `);
    
    // Fast synchronous queries
    const items = db.prepare('SELECT * FROM items').all();
    
  • name: Script to Product Evolution description: Growing a script into a real product when_to_use: When a personal tool shows promise implementation: |

    Evolution Path

    Stage 1: Personal Script

    Characteristics:
    - Only you use it
    - Hardcoded values
    - No error handling
    - Works on your machine
    
    Time: Hours to days
    

    Stage 2: Shareable Tool

    Add:
    - README explaining what it does
    - Basic error messages
    - Config file instead of hardcoding
    - Works on similar machines
    
    Time: Days
    

    Stage 3: Public Tool

    Add:
    - Installation instructions
    - Cross-platform support
    - Proper error handling
    - Version numbers
    - Basic tests
    
    Time: Week or two
    

    Stage 4: Product

    Add:
    - Landing page
    - Documentation site
    - User support channel
    - Analytics (privacy-respecting)
    - Payment integration (if monetizing)
    
    Time: Weeks to months
    

    Signs You Should Productize

    SignalStrength
    Others asking for itStrong
    You use it dailyStrong
    Solves $100+ problemStrong
    Others would payVery strong
    Competition exists but sucksStrong
    You're embarrassed by itActually good

anti_patterns:

  • name: Building for Imaginary Users description: Creating tools for problems you don't have why_bad: | No real feedback loop. Building features no one needs. Giving up because no motivation. Solving the wrong problem. what_to_do_instead: | Build for yourself first. Real problem = real motivation. You're the first tester. Expand users later.

  • name: Over-Engineering Personal Tools description: Adding unnecessary complexity to personal scripts why_bad: | Takes forever to build. Harder to modify later. Complexity kills motivation. Perfect is enemy of done. what_to_do_instead: | Minimum viable script. Add complexity when needed. Refactor only when it hurts. Ugly but working > pretty but incomplete.

  • name: Not Dogfooding description: Building tools you don't use yourself why_bad: | Missing obvious UX issues. Not finding real bugs. Features that don't help. No passion for improvement. what_to_do_instead: | Use your tool daily. Feel the pain of bad UX. Fix what annoys YOU. Your needs = user needs.

  • name: Premature Monetization description: Trying to charge before the tool is proven why_bad: | Pressure kills exploration. Wrong incentives. Optimize for payment, not utility. Users before revenue. what_to_do_instead: | Free while you dogfood. Prove value to yourself first. Monetize when others beg for it. Revenue is validation, not goal.

handoffs:

  • trigger: "sell|monetize|SaaS|subscription" to: micro-saas-launcher context: "Productizing personal tool"

  • trigger: "browser extension" to: browser-extension-builder context: "Personal browser tool"

  • trigger: "automate|workflow|trigger" to: workflow-automation context: "Personal automation"

  • trigger: "API|backend|server" to: backend context: "Tool needs backend"