Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
72 commits
Select commit Hold shift + click to select a range
fe40732
Fix data.js module export for Vite compatibility
cursoragent Feb 27, 2026
738b4ef
feat: rebuild app on tanstack start with cloudflare
cursoragent Feb 27, 2026
5ac2ef8
feat: add data ops cli tools and tag normalization skills
cursoragent Feb 27, 2026
033bd3d
fix: keep data.js commonjs with generated app snapshot
cursoragent Feb 27, 2026
46bd90c
feat: chunk person rendering with load-more grid
cursoragent Feb 27, 2026
5dc1749
fix: preserve unprocessed entries in cull workflow
cursoragent Feb 27, 2026
6b5fa33
test: cover scraper parsing and sql serialization helpers
cursoragent Feb 27, 2026
7d5ac62
fix: reset chunked list when filter results change
cursoragent Feb 27, 2026
f52fbac
test: add filter parsing and d1 lookup unit coverage
cursoragent Feb 27, 2026
4a00b5c
chore: set cloudflare d1 database id
cursoragent Feb 27, 2026
1924da6
chore: remove stale pnpm lockfile for CI
cursoragent Feb 27, 2026
fa4a7e5
chore: require node 22 for cloudflare builds
cursoragent Feb 27, 2026
64e3601
chore: switch project workflows to pnpm
cursoragent Feb 27, 2026
2ffa336
feat: scrape profile data on-demand when missing
cursoragent Feb 27, 2026
916ad8e
fix: show tags on tag pages and remove filter form
cursoragent Feb 27, 2026
e71a816
fix: restore favicon icons socials and full person list
wesbos Feb 27, 2026
a45336d
chore: enable wrangler invocation logs
wesbos Feb 27, 2026
9fcf142
feat: consolidate /like routes and restore legacy icons
wesbos Feb 27, 2026
c59b7c8
chore: enable wrangler traces
wesbos Feb 27, 2026
d0742e4
adds github IDs to data.js
wesbos Feb 27, 2026
377e940
categories, tags and a whole bunch of stuff
wesbos Mar 4, 2026
9b56b7b
change to tailwind
wesbos Mar 5, 2026
a870600
new classifier
wesbos Mar 5, 2026
1f3beaf
scriptssss
wesbos Mar 5, 2026
c6f63e2
Add D1 helpers for item/tag details and scrape events
cursoragent Mar 5, 2026
537a294
Add analytics and Amazon integration server modules
cursoragent Mar 5, 2026
67cab9b
Add clickable tag and item discovery pages
cursoragent Mar 5, 2026
c1ca074
Add admin reclassify and merge item controls
cursoragent Mar 5, 2026
42f4857
Finish admin controls and company logo enhancements
cursoragent Mar 5, 2026
e733ea0
Fix FacePile tooltip: move title to img, add tooltip to overflow badge
wesbos Mar 5, 2026
436fe37
Fix tag card cleanup, article grouping, and add hidden tags support
wesbos Mar 5, 2026
9e55295
Migrate database layer to Drizzle ORM
wesbos Mar 5, 2026
c31eac7
Add re-scrape selected people with item re-extraction
wesbos Mar 5, 2026
d33ba0a
Add items dashboard for enrichment management
wesbos Mar 5, 2026
8c2210f
Add wall of shame page and filter error people from homepage
wesbos Mar 5, 2026
c503511
Add global navigation bar to root layout
wesbos Mar 5, 2026
85487a3
Add server functions for enrichment, re-scrape, and error people
wesbos Mar 5, 2026
80286a0
remove skills
wesbos Mar 5, 2026
d98172d
Convert /items page to server-side loading
wesbos Mar 5, 2026
d4ea76b
Add SEO meta tags to all routes and OG image endpoint
wesbos Mar 5, 2026
a3631b1
Add PersonMiniCard component for richer people display on item pages
wesbos Mar 5, 2026
e90ba68
Consolidate avatar logic with multi-source fallback chain
wesbos Mar 5, 2026
b03f34d
Add Cloudflare Vectorize similarity for person pages
wesbos Mar 5, 2026
f7330e6
Add /uses page generator skill
wesbos Mar 5, 2026
030ef98
Add /add page with instructions for submitting a /uses page
wesbos Mar 5, 2026
e609585
Add /uses page documenting the site's own tech stack
wesbos Mar 5, 2026
7443968
Add landing hero to the home page
wesbos Mar 5, 2026
a495494
Add remaining components, scripts, and data layer updates
wesbos Mar 5, 2026
3e1770a
move scripts into app
wesbos Mar 6, 2026
85c5823
refactor into smaller files
wesbos Mar 6, 2026
4eb2da3
admin routes
wesbos Mar 6, 2026
e1bf13d
rejigging
wesbos Mar 6, 2026
d4b195e
Update dependencies and enhance UI components
wesbos Mar 7, 2026
0f29083
Merge pull request #2076 from wesbos/cursor/user-item-tag-system-473c
wesbos Mar 7, 2026
7a4872c
Implement unified site-management toolkit
cursoragent Mar 7, 2026
dbb09ac
Add MCP adapter smoke test
cursoragent Mar 7, 2026
facba53
Fix repository TypeScript type errors
cursoragent Mar 7, 2026
aa98537
Integrate site-management APIs into app routes
cursoragent Mar 9, 2026
b5458b1
fix mcp server
wesbos Mar 9, 2026
dfb5444
MCP
wesbos Mar 9, 2026
c25caa4
Enhance agent guidelines and remove deprecated scripts
wesbos Mar 9, 2026
968d721
MCP, de-duplication sills
wesbos Mar 10, 2026
485ff71
Merge pull request #2089 from wesbos/cursor/unified-site-management-b634
wesbos Mar 10, 2026
87fdb9b
Remove deprecated database files and functions related to Amazon cach…
wesbos Mar 10, 2026
6ec43c2
Add item galaxy: vectorize items and cluster visualization
wesbos Mar 10, 2026
116fdc4
vectorization of tags
wesbos Mar 11, 2026
66f8328
fonts, languages
wesbos Mar 12, 2026
1d41b89
adds awards
wesbos Mar 13, 2026
c9f9d56
awards
wesbos Mar 16, 2026
b44de3d
switches to module
wesbos Mar 18, 2026
f0415b1
remove postscs
wesbos Mar 18, 2026
c2369e3
Avatar API work
wesbos Mar 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
94 changes: 94 additions & 0 deletions .agents/skills/deduplicate-items/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
---
name: deduplicate-items
description: Find and merge duplicate item names in the site database using the CLI. Use when the user asks to deduplicate, merge, clean up, or consolidate items — optionally filtered by tag (e.g. "headphones", "keyboard", "editor").
---

# Deduplicate Items

Find variant spellings / naming inconsistencies for items in the site database and merge them into canonical names via the CLI.

## Prerequisites

- Working directory: the repo root (`/Users/wesbos/Dropbox/awesome-uses`)
- Dependencies installed (`pnpm install`)
- Local D1 SQLite database available (auto-resolved from `.wrangler/`)

## Workflow

### 1. List items for the target tag

Paginate through **all** results — the API returns at most 100 rows per call.

```bash
pnpm site:tools:call items.list --input '{"tag": "<TAG>", "limit": 500, "offset": 0}'
```

Increment `offset` by 500 until you've fetched all rows (check the `total` field in the first response). Collect every `(item, count)` pair.

### 2. Run the built-in duplicate detector

```bash
pnpm site:tools:call items.findDuplicates --input '{}'
```

This catches **case-only** differences. It does NOT catch abbreviations, missing hyphens, extra words, or typos — you must find those manually.

### 3. Identify duplicate groups manually

Compare the full item list for patterns like:

| Pattern | Example |
| ------------------------------- | ------------------------------------------------- |
| Brand prefix added/removed | `Apple AirPods Pro` vs `AirPods Pro` |
| Abbreviation vs full name | `Bose QC35` vs `Bose QuietComfort 35` |
| Missing/extra hyphens or spaces | `Sennheiser HD25` vs `Sennheiser HD 25` |
| Trailing descriptor | `Sony WH-1000XM4 Headphones` vs `Sony WH-1000XM4` |
| Seller prefix | `Linsoul KZ ZS10 Pro` vs `KZ ZS10 Pro` |
| Typos / transposed letters | `Sony WF-1000MX5` vs `Sony WF-1000XM5` |
| Case differences | `BeyerDynamic` vs `Beyerdynamic` |

### 4. Present findings and ask for approval

Show the user a table of proposed merges with canonical name, variants, and user counts. **Do not merge without explicit approval.**

### 5. Merge via CLI

For each approved group:

```bash
pnpm site:tools:call items.merge --input '{"canonicalItem": "<CANONICAL>", "sourceItems": ["<VARIANT1>", "<VARIANT2>"]}'
```

- The canonical item is the most-used or most-correct spelling.
- Run up to 4 merge commands in parallel for speed.
- Every merge returns `affectedPeople`, `upsertedRows`, `deletedRows` — verify each succeeds (`"ok": true`).

### 6. Report results

Summarize: how many groups merged, total variants consolidated, total people affected.

## Choosing the canonical name

Pick the name that is:

1. **Most commonly used** (highest `count`)
2. **Officially correct** (matches the manufacturer's branding)
3. **Most specific** (e.g. `Bose QuietComfort 35 II` over `Bose QC35 II`)

When the most-used name conflicts with official branding, prefer official branding.

## Edge cases

- **Different product variants** (e.g. wired vs wireless, different generations): do NOT merge unless they are clearly the same product with different naming.
- **Ambiguous short names** (e.g. `Sennheiser` alone): leave as-is unless the user decides.
- **Cross-brand confusion** (e.g. `AKG ATH-M50` — AKG doesn't make this, Audio-Technica does): flag as a data error to the user.

## CLI reference

| Command | Description |
| --------------------------------------------------------------------------------------------- | -------------------------------- |
| `pnpm site:tools:call items.list --input '{"tag":"<TAG>","limit":500,"offset":0}'` | List items by tag (paginate) |
| `pnpm site:tools:call items.findDuplicates --input '{}'` | Auto-detect case-only duplicates |
| `pnpm site:tools:call items.merge --input '{"canonicalItem":"<NAME>","sourceItems":["..."]}'` | Merge variants into canonical |

Full CLI docs: `docs/site-management-toolkit.md`
98 changes: 98 additions & 0 deletions .agents/skills/deduplicate-tags/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
---
name: deduplicate-tags
description: Find and merge duplicate or overlapping tags in the site database using the CLI. Use when the user asks to deduplicate, merge, clean up, or consolidate tags — e.g. plurals, hyphen vs space variants, or synonyms like "browser" and "web browser".
---

# Deduplicate Tags

Find duplicate, overlapping, or inconsistently named tags in the site database and merge them into canonical tags via the CLI.

## Prerequisites

- Working directory: the repo root (`/Users/wesbos/Dropbox/awesome-uses`)
- Dependencies installed (`pnpm install`)
- Local D1 SQLite database available (auto-resolved from `.wrangler/`)

## Workflow

### 1. List all tags

```bash
pnpm site:tools:call tags.list --input '{}'
```

Returns `{ total, rows: [{ tag, itemCount, personCount }] }` sorted by `itemCount` descending. No pagination needed — all rows are returned in one call.

### 2. Identify duplicate groups

Scan the full tag list for these patterns:

| Pattern | Example |
|---------|---------|
| Singular vs plural | `speaker` vs `speakers` |
| Hyphen vs space | `file-manager` vs `file manager` |
| Trailing "s" variant | `framework` vs `frameworks` |
| Synonym / alias | `os` vs `operating system` |
| Verbose variant | `email-client` vs `email client` vs `mail client` vs `mail` |
| Sub-type that should merge up | `mechanical keyboard` → `keyboard` |
| Noun vs gerund | `linter` vs `linting` |
| Compound overlap | `rss-reader` vs `rss reader` vs `feed-reader` vs `rss` |
| Abbreviation | `vcs` vs `version control` |

Group them into merge sets: one **target tag** and one or more **source tags**.

### 3. Choose the canonical (target) tag

Pick the tag that is:

1. **Most commonly used** (highest `itemCount` or `personCount`)
2. **Consistent with existing conventions** — prefer the hyphenated slug form used by the majority of tags (e.g. `email-client` over `email client`)
3. **Concise but clear** (e.g. `os` over `operating system`, `browser` over `web browser`)

### 4. Present findings and ask for approval

Show the user a table of proposed merges:

| # | Canonical Tag | Source Tags | Rationale |
|---|---|---|---|
| 1 | `browser` | `browsers`, `web browser` | Plural + synonym |

**Do not merge without explicit approval.**

### 5. Merge via CLI

For each approved group:

```bash
pnpm site:tools:call tags.merge --input '{"targetTag": "<TARGET>", "sourceTags": ["<SRC1>", "<SRC2>"]}'
```

- Run up to 4 merge commands in parallel for speed.
- Every merge returns `{ targetTag, sourceTags, updatedRows, mergedRefs }` — verify each succeeds (`"ok": true`).

### 6. Report results

Summarize: how many groups merged, total source tags eliminated, total rows updated, total refs merged.

### 7. Optional: run again

After the first pass, re-list tags and look for second-order duplicates that only become visible once the first batch is consolidated (e.g. `developer tool` and `development tools` may both still exist after merging other variants).

## Edge cases

- **Genuinely distinct sub-types**: Do NOT merge tags that represent meaningfully different categories even if names are similar. For example, `browser extension` and `vs code extension` are specific sub-types of `extension` — only merge if the user explicitly approves.
- **Ambiguous overlap**: When two tags partially overlap (e.g. `music` vs `music streaming`), leave them separate unless the user decides.
- **Very low-count tags** (1 item, 1 person): These are often one-off tags from a single person's page. They are good merge candidates but verify they actually match the target concept.
- **"other" tag**: Never merge anything into or out of the `other` tag — it is a catch-all.

## CLI reference

| Command | Description |
|---------|-------------|
| `pnpm site:tools:call tags.list --input '{}'` | List all tags with item/person counts |
| `pnpm site:tools:call tags.get --input '{"tag":"<TAG>"}'` | Get detail for one tag (items, people) |
| `pnpm site:tools:call tags.merge --input '{"targetTag":"<T>","sourceTags":["..."]}'` | Merge source tags into target |
| `pnpm site:tools:call tags.rename --input '{"fromTag":"<OLD>","toTag":"<NEW>"}'` | Rename a single tag |
| `pnpm site:tools:call tags.deleteOrReplace --input '{"tag":"<TAG>","replacementTag":"<REP>"}'` | Delete tag, optionally replacing it |

Full CLI docs: `docs/site-management-toolkit.md`
153 changes: 153 additions & 0 deletions .agents/uses-page/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
# /uses Page Generator

Generate a comprehensive /uses page for a developer by gathering information about their hardware, software, desk setup, and workflow through an interactive interview process.

## Overview

A /uses page documents a developer's current setup — the tools, hardware, software, and configurations they rely on daily. This skill guides the user through creating one by asking targeted questions, optionally running system detection, and exporting the result in their preferred format.

## Process

### Step 1: System Detection (Optional)

Ask the user if they'd like to auto-detect their system info. If yes, run the helper script:

```bash
bash .agents/uses-page/gather-system-info.sh
```

This will output hardware model, OS, display info, and installed developer tools. Use this as a starting point for the interview.

### Step 2: Interview — Hardware

Ask about each section. Don't ask all at once — go section by section, confirming and expanding on each answer before moving to the next.

**Computer**
- What computer(s) do you use? (e.g. MacBook Pro 16" M4 Max, custom PC build, ThinkPad X1 Carbon)
- CPU, RAM, storage specs if they know them
- Do you use a laptop, desktop, or both?

**Peripherals & Desk**
- Monitor(s): brand, size, resolution (e.g. LG 27" 4K, Apple Studio Display)
- Keyboard: brand and model (e.g. Keychron Q1, HHKB, Apple Magic Keyboard)
- Mouse/trackpad: brand and model
- Webcam, microphone, headphones/speakers
- Desk: standing desk? Brand? (e.g. Uplift, IKEA Bekant)
- Chair: brand and model (e.g. Herman Miller Aeron, Steelcase Leap)
- Any other desk accessories (monitor arm, desk mat, cable management, lighting)

**Phone & Tablet**
- Phone: model (e.g. iPhone 16 Pro, Pixel 9)
- Tablet: if used for development or note-taking

### Step 3: Interview — Software & Development Environment

**Editor & Terminal**
- Primary code editor (e.g. VS Code, Neovim, Cursor, Zed, WebStorm)
- Editor theme and key extensions/plugins
- Terminal emulator (e.g. iTerm2, Warp, Ghostty, Kitty, Alacritty, Windows Terminal)
- Shell (e.g. zsh, fish, bash, nushell) and framework (e.g. oh-my-zsh, starship prompt)
- Font for coding (e.g. Fira Code, JetBrains Mono, MonoLisa, Dank Mono)

**Browser & DevTools**
- Primary browser for development
- Key browser extensions

**Design & Creative Tools**
- Design tools (e.g. Figma, Sketch, Adobe CC, Affinity)
- Image/video editing

**Productivity & Workflow**
- Note-taking (e.g. Obsidian, Notion, Apple Notes, Bear)
- Task management (e.g. Linear, Todoist, Things, ClickUp)
- Communication (e.g. Slack, Discord)
- Password manager (e.g. 1Password, Bitwarden)
- Cloud storage
- Music/focus app (e.g. Spotify, Apple Music)
- Window management (e.g. Raycast, Rectangle, yabai)
- Launcher (e.g. Raycast, Alfred, Spotlight)

**Development Stack**
- Primary languages and frameworks
- Package managers (npm, pnpm, yarn, bun)
- Version control workflow
- Hosting/deployment (e.g. Vercel, Cloudflare, AWS, Netlify)
- Database preferences
- API tools (e.g. Postman, Insomnia, httpie)
- Docker/containers?

### Step 4: Review & Follow-up

After gathering initial answers:

1. Summarize what you have so far in a draft format
2. Ask follow-up questions about anything that seems incomplete:
- "You mentioned VS Code — do you have a specific theme or must-have extensions?"
- "Any dotfiles or config repos you'd like to link?"
- "Anything unusual or unique about your setup that people would find interesting?"
3. Ask if there are sections they want to add:
- Gaming setup
- Home office lighting/ambiance
- Self-hosting / homelab
- Podcasting/streaming gear
- Photography/videography equipment

### Step 5: Export

Ask the user their preferred format, then generate the page:

**Markdown** (most common for /uses pages):
```markdown
# Uses

> Last updated: March 2026

## Hardware

### Computer
- MacBook Pro 16" M4 Max (64GB RAM, 1TB SSD)

### Desk Setup
- Monitor: LG 27UK850 4K
- Keyboard: Keychron Q1 with Gateron Brown switches
...

## Software

### Editor
- VS Code with the Vitesse theme
- Key extensions: ESLint, Prettier, GitHub Copilot
...
```

**HTML** — A styled, standalone HTML page with sections and anchors.

**JSX/React** — A React component with semantic markup, ready to drop into a Next.js/Remix/Astro site.

**Rich Text** — Formatted text suitable for pasting into a CMS or Google Doc.

## Tips for a Great /uses Page

- Be specific: "MacBook Pro 16" M4 Max" is better than "MacBook"
- Include why you chose things when interesting: "I switched to Neovim for the modal editing speed"
- Link to products/tools where possible
- Update it periodically — setups change!
- Add a personal touch: what makes YOUR setup unique?
- Photos of your desk setup are a huge plus (mention this to the user)

## Common Sections from Existing /uses Pages

Based on analysis of hundreds of developer /uses pages, the most common sections are:

1. **Computer/Laptop** — nearly universal
2. **Code Editor** — VS Code dominates, but Neovim, Cursor, and Zed are rising
3. **Terminal** — iTerm2, Warp, Ghostty, Kitty are popular
4. **Browser** — Chrome, Firefox, Arc, Brave
5. **Keyboard** — mechanical keyboards are very popular in the community
6. **Monitor** — ultrawide and 4K are common
7. **Desk & Chair** — standing desks and ergonomic chairs
8. **Headphones** — Sony WH-1000XM series, AirPods Pro, Audio-Technica
9. **Hosting** — Vercel, Cloudflare, Netlify, AWS
10. **Frameworks** — React, Next.js, Svelte, Vue, Astro
11. **Fonts** — Fira Code, JetBrains Mono, MonoLisa
12. **Themes** — One Dark Pro, Dracula, Catppuccin, Vitesse
Loading
Loading