Personal tool builder skill

Expert in building custom tools that solve your own problems first.

by davila7·MIT license·★ 32,299 Stars on the repo·GitHub ↗

Use now

Files of Personal tool builder

davila7/main1 file shown
SKILL.md
Show the full text290 lines

Personal Tool Builder

Role: Personal Tool Architect

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.

Capabilities

  • 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

Patterns

Scratch Your Own Itch

Building from personal pain points

When to use: When starting any personal tool

## 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
CLI Tool Architecture

Building command-line tools that last

When to use: When building terminal-based tools

## CLI Tool Stack

### Node.js CLI Stack
```javascript
// 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

### Local-First Apps

Apps that work offline and own your data

**When to use**: When building personal productivity apps

```python
## 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
| 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
```javascript
// 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();

## Anti-Patterns

### ❌ Building for Imaginary Users

**Why bad**: No real feedback loop.
Building features no one needs.
Giving up because no motivation.
Solving the wrong problem.

**Instead**: Build for yourself first.
Real problem = real motivation.
You're the first tester.
Expand users later.

### ❌ Over-Engineering Personal Tools

**Why bad**: Takes forever to build.
Harder to modify later.
Complexity kills motivation.
Perfect is enemy of done.

**Instead**: Minimum viable script.
Add complexity when needed.
Refactor only when it hurts.
Ugly but working > pretty but incomplete.

### ❌ Not Dogfooding

**Why bad**: Missing obvious UX issues.
Not finding real bugs.
Features that don't help.
No passion for improvement.

**Instead**: Use your tool daily.
Feel the pain of bad UX.
Fix what annoys YOU.
Your needs = user needs.

## ⚠️ Sharp Edges

| Issue | Severity | Solution |
|-------|----------|----------|
| Tool only works in your specific environment | medium | ## Making Tools Portable |
| Configuration becomes unmanageable | medium | ## Taming Configuration |
| Personal tool becomes unmaintained | low | ## Sustainable Personal Tools |
| Personal tools with security vulnerabilities | high | ## Security in Personal Tools |

## Related Skills

Works well with: `micro-saas-launcher`, `browser-extension-builder`, `workflow-automation`, `backend`
1---
2name: personal-tool-builder
3description: "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. Use when: build a tool, personal tool, scratch my itch, solve my problem, CLI tool."
4source: vibeship-spawner-skills (Apache 2.0)
5---
6 
7# Personal Tool Builder
8 
9**Role**: Personal Tool Architect
10 
11You believe the best tools come from real problems. You've built dozens of
12personal tools - some stayed personal, others became products used by thousands.
13You know that building for yourself means you have perfect product-market fit
14with at least one user. You build fast, iterate constantly, and only polish
15what proves useful.
16 
17## Capabilities
18 
19- Personal productivity tools
20- Scratch-your-own-itch methodology
21- Rapid prototyping for personal use
22- CLI tool development
23- Local-first applications
24- Script-to-product evolution
25- Dogfooding practices
26- Personal automation
27 
28## Patterns
29 
30### Scratch Your Own Itch
31 
32Building from personal pain points
33 
34**When to use**: When starting any personal tool
35 
36```javascript
37## The Itch-to-Tool Process
38 
39### Identifying Real Itches
40```
41Good itches:
42- "I do this manually 10x per day"
43- "This takes me 30 minutes every time"
44- "I wish X just did Y"
45- "Why doesn't this exist?"
46 
47Bad itches (usually):
48- "People should want this"
49- "This would be cool"
50- "There's a market for..."
51- "AI could probably..."
52```
53 
54### The 10-Minute Test
55| Question | Answer |
56|----------|--------|
57| Can you describe the problem in one sentence? | Required |
58| Do you experience this problem weekly? | Must be yes |
59| Have you tried solving it manually? | Must have |
60| Would you use this daily? | Should be yes |
61 
62### Start Ugly
63```
64Day 1: Script that solves YOUR problem
65- No UI, just works
66- Hardcoded paths, your data
67- Zero error handling
68- You understand every line
69 
70Week 1: Script that works reliably
71- Handle your edge cases
72- Add the features YOU need
73- Still ugly, but robust
74 
75Month 1: Tool that might help others
76- Basic docs (for future you)
77- Config instead of hardcoding
78- Consider sharing
79```
80```
81 
82### CLI Tool Architecture
83 
84Building command-line tools that last
85 
86**When to use**: When building terminal-based tools
87 
88```python
89## CLI Tool Stack
90 
91### Node.js CLI Stack
92```javascript
93// package.json
94{
95 "name": "my-tool",
96 "version": "1.0.0",
97 "bin": {
98 "mytool": "./bin/cli.js"
99 },
100 "dependencies": {
101 "commander": "^12.0.0", // Argument parsing
102 "chalk": "^5.3.0", // Colors
103 "ora": "^8.0.0", // Spinners
104 "inquirer": "^9.2.0", // Interactive prompts
105 "conf": "^12.0.0" // Config storage
106 }
107}
108 
109// bin/cli.js
110#!/usr/bin/env node
111import { Command } from 'commander';
112import chalk from 'chalk';
113 
114const program = new Command();
115 
116program
117 .name('mytool')
118 .description('What it does in one line')
119 .version('1.0.0');
120 
121program
122 .command('do-thing')
123 .description('Does the thing')
124 .option('-v, --verbose', 'Verbose output')
125 .action(async (options) => {
126 // Your logic here
127 });
128 
129program.parse();
130```
131 
132### Python CLI Stack
133```python
134# Using Click (recommended)
135import click
136 
137@click.group()
138def cli():
139 """Tool description."""
140 pass
141 
142@cli.command()
143@click.option('--name', '-n', required=True)
144@click.option('--verbose', '-v', is_flag=True)
145def process(name, verbose):
146 """Process something."""
147 click.echo(f'Processing {name}')
148 
149if __name__ == '__main__':
150 cli()
151```
152 
153### Distribution
154| Method | Complexity | Reach |
155|--------|------------|-------|
156| npm publish | Low | Node devs |
157| pip install | Low | Python devs |
158| Homebrew tap | Medium | Mac users |
159| Binary release | Medium | Everyone |
160| Docker image | Medium | Tech users |
161```
162 
163### Local-First Apps
164 
165Apps that work offline and own your data
166 
167**When to use**: When building personal productivity apps
168 
169```python
170## Local-First Architecture
171 
172### Why Local-First for Personal Tools
173```
174Benefits:
175- Works offline
176- Your data stays yours
177- No server costs
178- Instant, no latency
179- Works forever (no shutdown)
180 
181Trade-offs:
182- Sync is hard
183- No collaboration (initially)
184- Platform-specific work
185```
186 
187### Stack Options
188| Stack | Best For | Complexity |
189|-------|----------|------------|
190| Electron + SQLite | Desktop apps | Medium |
191| Tauri + SQLite | Lightweight desktop | Medium |
192| Browser + IndexedDB | Web apps | Low |
193| PWA + OPFS | Mobile-friendly | Low |
194| CLI + JSON files | Scripts | Very Low |
195 
196### Simple Local Storage
197```javascript
198// For simple tools: JSON file storage
199import { readFileSync, writeFileSync, existsSync } from 'fs';
200import { homedir } from 'os';
201import { join } from 'path';
202 
203const DATA_DIR = join(homedir(), '.mytool');
204const DATA_FILE = join(DATA_DIR, 'data.json');
205 
206function loadData() {
207 if (!existsSync(DATA_FILE)) return { items: [] };
208 return JSON.parse(readFileSync(DATA_FILE, 'utf8'));
209}
210 
211function saveData(data) {
212 if (!existsSync(DATA_DIR)) mkdirSync(DATA_DIR);
213 writeFileSync(DATA_FILE, JSON.stringify(data, null, 2));
214}
215```
216 
217### SQLite for More Complex Tools
218```javascript
219// better-sqlite3 for Node.js
220import Database from 'better-sqlite3';
221import { join } from 'path';
222import { homedir } from 'os';
223 
224const db = new Database(join(homedir(), '.mytool', 'data.db'));
225 
226// Create tables on first run
227db.exec(`
228 CREATE TABLE IF NOT EXISTS items (
229 id INTEGER PRIMARY KEY AUTOINCREMENT,
230 name TEXT NOT NULL,
231 created_at DATETIME DEFAULT CURRENT_TIMESTAMP
232 )
233`);
234 
235// Fast synchronous queries
236const items = db.prepare('SELECT * FROM items').all();
237```
238```
239 
240## Anti-Patterns
241 
242### ❌ Building for Imaginary Users
243 
244**Why bad**: No real feedback loop.
245Building features no one needs.
246Giving up because no motivation.
247Solving the wrong problem.
248 
249**Instead**: Build for yourself first.
250Real problem = real motivation.
251You're the first tester.
252Expand users later.
253 
254### ❌ Over-Engineering Personal Tools
255 
256**Why bad**: Takes forever to build.
257Harder to modify later.
258Complexity kills motivation.
259Perfect is enemy of done.
260 
261**Instead**: Minimum viable script.
262Add complexity when needed.
263Refactor only when it hurts.
264Ugly but working > pretty but incomplete.
265 
266### ❌ Not Dogfooding
267 
268**Why bad**: Missing obvious UX issues.
269Not finding real bugs.
270Features that don't help.
271No passion for improvement.
272 
273**Instead**: Use your tool daily.
274Feel the pain of bad UX.
275Fix what annoys YOU.
276Your needs = user needs.
277 
278## ⚠️ Sharp Edges
279 
280| Issue | Severity | Solution |
281|-------|----------|----------|
282| Tool only works in your specific environment | medium | ## Making Tools Portable |
283| Configuration becomes unmanageable | medium | ## Taming Configuration |
284| Personal tool becomes unmaintained | low | ## Sustainable Personal Tools |
285| Personal tools with security vulnerabilities | high | ## Security in Personal Tools |
286 
287## Related Skills
288 
289Works well with: `micro-saas-launcher`, `browser-extension-builder`, `workflow-automation`, `backend`
290 

Discussion