git clone https://github.com/vibeforge1111/vibeship-spawner-skills
maker/personal-tool-builder/skill.yamlPersonal 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
Question Answer 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
Method Complexity Reach npm publish Low Node devs pip install Low Python devs Homebrew tap Medium Mac users Binary release Medium Everyone Docker image Medium Tech 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 workStack Options
Stack Best For Complexity Electron + SQLite Desktop apps Medium Tauri + SQLite Lightweight desktop Medium Browser + IndexedDB Web apps Low PWA + OPFS Mobile-friendly Low CLI + JSON files Scripts Very 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 daysStage 2: Shareable Tool
Add: - README explaining what it does - Basic error messages - Config file instead of hardcoding - Works on similar machines Time: DaysStage 3: Public Tool
Add: - Installation instructions - Cross-platform support - Proper error handling - Version numbers - Basic tests Time: Week or twoStage 4: Product
Add: - Landing page - Documentation site - User support channel - Analytics (privacy-respecting) - Payment integration (if monetizing) Time: Weeks to monthsSigns You Should Productize
Signal Strength Others asking for it Strong You use it daily Strong Solves $100+ problem Strong Others would pay Very strong Competition exists but sucks Strong You're embarrassed by it Actually 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"