Receber por email
← Voltar para o catálogo

personal-tool-builder

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

41.2kestrelas
Atualizado há 4 meses

Ver no GitHub ↗ Licença: MIT

Como adicionar

/plugin marketplace add sickn33/antigravity-awesome-skills

O comando exato pode variar conforme o repositório. Confira o README no GitHub.

Para o autor da skill

Cole no README do seu repo

Mostra que sua skill está catalogada na Skillteca, gera backlink e tráfego rastreável.

[![Skillteca](https://www.skillteca.com.br/api/badge/personal-tool-builder-mptes710/svg)](https://www.skillteca.com.br/skills/personal-tool-builder-mptes710)

Skills relacionadas

Ver todas de Desenvolvimento →

Alerta por categoria

Receba novas skills de Desenvolvimento toda segunda

1 email curto, só com as skills novas de Desenvolvimento. 4 minutos de leitura, sem spam, cancela com 1 clique.

Você confirma o email no primeiro envio. Sem spam. Cancela com 1 clique.

Ler descrição completa

Personal Tool Builder

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.

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.

Expertise

  • Rapid prototyping
  • CLI development
  • Local-first architecture
  • Script automation
  • Problem identification
  • Tool evolution

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

// 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

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

// 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();

Script to Product Evolution

Growing a script into a real product

When to use: When a personal tool shows promise

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

| 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 |

Sharp Edges

Tool only works in your specific environment

Severity: MEDIUM

Situation: Script fails when you try to share it

Symptoms:

  • Works on my machine
  • Scripts failing for others
  • Path not found errors
  • Command not found errors

Why this breaks: Hardcoded absolute paths. Relies on your installed tools. Assumes your OS/shell. Uses your auth tokens.

Recommended fix:

Making Tools Portable

Common Portability Issues

| Issue | Fix | |-------|-----| | Hardcoded paths | Use ~ or env vars | | Specific shell | Declare shell in shebang | | Missing deps | Check and prompt to install | | Auth tokens | Use config file or env | | OS-specific | Test on other OS or use cross-platform libs |

Path Portability

// Bad
const dataFile = '~/data.json';

// Good
import { homedir } from 'os';
import { join } from 'path';
const dataFile = join(homedir(), '.mytool', 'data.json');

Dependency Checking

import { execSync } from 'child_process';

function checkDep(cmd, installHint) {
  try {
    execSync(`which ${cmd}`, { stdio: 'ignore' });
  } catch {
    console.error(`Missing: ${cmd}`);
    console.error(`Install: ${installHint}`);
    process.exit(1);
  }
}

c
Compartilhar X LinkedIn