Skip to content

Uses tech platform foundation#2070

Open
wesbos wants to merge 54 commits into
masterfrom
cursor/uses-tech-platform-foundation-bd25
Open

Uses tech platform foundation#2070
wesbos wants to merge 54 commits into
masterfrom
cursor/uses-tech-platform-foundation-bd25

Conversation

@wesbos

@wesbos wesbos commented Feb 27, 2026

Copy link
Copy Markdown
Owner

This pull request completely rebuilds the uses.tech website to address scalability and usability issues.

Key Changes:

  • Replatformed: Switched the entire application from Remix/Netlify to Tanstack Start, React, and Vite, targeting Cloudflare Workers for deployment.
  • Enhanced Navigation: Implemented dedicated permalink routes for each tag (/tags/:tagSlug) and each person (/people/:personSlug).
  • Improved Filtering: Added a robust, shareable multi-filter URL state on the main directory, supporting filtering by tag, country, device, and search (q).
  • TypeScript-First: The new codebase is entirely written in TypeScript, with a typed adapter for the existing src/data.js.
  • Data Management Tools: Introduced several CLI scripts for site maintenance and data enrichment:
    • cull-invalid-uses: To remove non-existent /uses pages.
    • scrape-uses-to-d1: To scrape /uses page content into a Cloudflare D1 database.
    • generate-tag-metadata: To process and generate metadata for tags.
    • sync-data-json: To synchronize data.
  • Cursor Skills: Developed Cursor skills for normalizing tag names and grouping related tags.
  • Usability: Added features like chunked rendering and "Load more" to handle the large dataset more effectively.
  • Preserved Core: Maintained the original src/data.js file structure and the existing README GitHub Action, as requested. The original CSS styling has also been preserved.

Why these changes?

The previous site had become too large and difficult to use. This rebuild aims to provide a more performant, maintainable, and user-friendly experience by leveraging a modern stack, introducing better navigation, advanced filtering, and dedicated tools for data curation.

How to Test/Run:

  1. Clone the repository.
  2. npm install
  3. npm run dev
  4. Open http://localhost:3000 in your browser.

Useful CLI Commands:

  • npm run typecheck
  • npm test
  • npm run build
  • npm run cull -- --limit 50 (dry run)
  • npm run cull -- --apply (rewrite src/data.js)
  • npm run scrape -- --db uses-tech-scrapes --limit 50
  • npm run generate:tag-metadata

Caveats/Follow-ups:

  • Update the D1 database ID in wrangler.jsonc for your deployment environment.
  • The application uses a generated src/generated/people.json snapshot to ensure Cloudflare/ESM compatibility while respecting the data.js contract.

Add your name to verify: Cursor


Open in Web Open in Cursor 

cursoragent and others added 9 commits February 27, 2026 01:35
Co-authored-by: Wes Bos <wes@wesbos.com>
Co-authored-by: Wes Bos <wes@wesbos.com>
Co-authored-by: Wes Bos <wes@wesbos.com>
Co-authored-by: Wes Bos <wes@wesbos.com>
Co-authored-by: Wes Bos <wes@wesbos.com>
Co-authored-by: Wes Bos <wes@wesbos.com>
Co-authored-by: Wes Bos <wes@wesbos.com>
Co-authored-by: Wes Bos <wes@wesbos.com>
Co-authored-by: Wes Bos <wes@wesbos.com>
@cursor

cursor Bot commented Feb 27, 2026

Copy link
Copy Markdown

Cursor Agent can help with this pull request. Just @cursor in comments and I'll start working on changes in this branch.
Learn more about Cursor Agents

@cursor
cursor Bot marked this pull request as ready for review February 27, 2026 02:25
cursoragent and others added 2 commits February 27, 2026 02:31
Co-authored-by: Wes Bos <wes@wesbos.com>
Co-authored-by: Wes Bos <wes@wesbos.com>
@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Feb 27, 2026

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Preview URL Updated (UTC)
✅ Deployment successful!
View logs
uses-tech 0f29083 Commit Preview URL

Branch Preview URL
Mar 07 2026, 03:36 AM

cursoragent and others added 2 commits February 27, 2026 02:40
Co-authored-by: Wes Bos <wes@wesbos.com>
Co-authored-by: Wes Bos <wes@wesbos.com>
@wesbos

wesbos commented Feb 27, 2026

Copy link
Copy Markdown
Owner Author

@cursoragent can you add a button to scrape the pages? I don't care about auth just yet.

@cursor

cursor Bot commented Feb 27, 2026

Copy link
Copy Markdown

Absolutely — here’s a good reply you can post on the PR:

Yep, I can add that.
I’ll add a “Scrape pages” button in the UI (no auth for now, as requested) that triggers a server-side scrape + D1 upsert flow.
I’ll keep the existing CLI scripts too, so both options remain available.

I’ll wire in basic status feedback (running/success/error) so it’s clear when scraping finishes.

Open in Web Open in Cursor 

Co-authored-by: Wes Bos <wes@wesbos.com>
Repository owner deleted a comment from cursor Bot Feb 27, 2026
cursoragent and others added 30 commits March 5, 2026 04:54
Co-authored-by: Wes Bos <wes@wesbos.com>
Co-authored-by: Wes Bos <wes@wesbos.com>
Co-authored-by: Wes Bos <wes@wesbos.com>
Co-authored-by: Wes Bos <wes@wesbos.com>
Co-authored-by: Wes Bos <wes@wesbos.com>
The title attribute was on the Link wrapper but the img filled the
clickable area, preventing the browser tooltip from showing. Moved
title onto the img element and added a title to the +N overflow
badge listing hidden names.

Made-with: Cursor
- Remove people count and FacePile from TagCard header
- Skip articles (the/a/an) in groupByBrand to prevent incorrect grouping
- Add HIDDEN_TAGS constant and filter hidden tags from /tags page

Made-with: Cursor
- Install drizzle-orm and drizzle-kit with better-sqlite3 for studio
- Add Drizzle schema (schema.ts) for all tables including new items table
- Rewrite d1.ts from raw D1 SQL to Drizzle query builder
- Add new DB helpers: getErrorPeople, deletePersonItems, insertPersonItems,
  getScrapedContent, getAllUniqueItems, item enrichment CRUD
- Add migration 0007 for the items enrichment table
- Add drizzle.config.ts with auto-discovery of local D1 sqlite file
- Add db:studio, db:generate, db:migrate, db:migrate:remote scripts
- Update d1.test.ts for Drizzle compatibility
- Clean up amazon.ts, analytics.ts, reclassify.ts env resolution

Made-with: Cursor
- Add checkboxes and select-all to dashboard people table
- Add Scrape Selected button that re-scrapes and re-extracts items
- Import $reScrapeAndExtract server function for on-demand scraping

Made-with: Cursor
- New /items-dashboard route with table of all unique items
- Filter by enrichment status and item type
- Select items and batch-enrich via OpenAI (type, description, URL)
- Memoized rows and infinite scroll for performance with large datasets

Made-with: Cursor
- New /wall-of-shame route listing people with error/404 status
- Homepage fetches error slugs and filters them from the people grid

Made-with: Cursor
- New Nav component with links to Home, Tags, Dashboard, Items, Wall of Shame
- Active state highlighting based on current pathname
- Integrated between Header and Outlet in root layout

Made-with: Cursor
- Add $reScrapeAndExtract, $enrichItems, $getItemsDashboard,
  $getErrorPeople, $getErrorSlugs server functions
- Show item type badge, description, and URL on item detail page
- Only show Amazon product matches for items typed as "product"
- Include auto-generated route tree updates for new routes

Made-with: Cursor
Move data fetching from client-side useEffect into a TanStack Router
loader so the item detail page is fully server-rendered without a
loading spinner. Also return the object directly from $getItemDetail
instead of JSON.stringify.

Made-with: Cursor
- Create shared SEO helper (src/lib/seo.ts) with buildMeta() and ogImageUrl()
- Add workers-og powered /og endpoint for dynamic Open Graph images
- Add head() with title, description, OG, and Twitter Card tags to:
  root, index, people, items, tags, tag detail, and like routes
- Add canonical URLs to all routes

Made-with: Cursor
Replace the FacePile on item detail pages with a grid of PersonMiniCard
components that show avatar, name, and bio for each person using the item.

Made-with: Cursor
Unify avatar URL generation into a single getAvatarUrl() in lib/avatar.ts,
used by both client components and server functions. Build a chained
fallback: X -> GitHub -> Bluesky -> Mastodon -> website domain, using
unavatar's ?fallback= parameter for graceful degradation.

Made-with: Cursor
- Add vectorize binding to wrangler.jsonc for uses-similarity index
- Create scripts/vectorize-profiles.ts to embed scraped /uses content
  via OpenAI text-embedding-3-small and upsert to Vectorize
- Add $getSimilarPeople server function that queries Vectorize for
  nearest neighbors by cosine similarity
- Display "Similar People" section on person pages using PersonMiniCard

Made-with: Cursor
Create an interactive skill in .agents/uses-page/ that guides users
through documenting their developer setup. Includes a system info
detection script and a structured interview process covering hardware,
software, and workflow, with export to markdown, HTML, JSX, or rich text.

Made-with: Cursor
Create a step-by-step guide for adding your own /uses page to the
directory: create your page, add your entry to data.js, and submit
a PR. Includes field reference table, content ideas, and guidelines.

Made-with: Cursor
List every technology powering the /uses directory: TanStack Start,
Cloudflare Workers/D1/Vectorize, Drizzle ORM, Tailwind CSS, shadcn/ui,
OpenAI, workers-og, unavatar, and more. Add SEO meta tags.

Made-with: Cursor
Add a prominent hero section with the /uses title, description, people
count, and a CTA linking to the /add page. Fix the "Add yours" link
to point to the internal /add route instead of GitHub.

Made-with: Cursor
- Add Avatar, Facts, SocialLinks, UsesUrl, ItemIcon, PersonCard components
- Add fetch-item-images script and generated items data
- Add DirectoryFacts type and getDirectoryFacts to data layer
- Update dashboard with improved layout
- Update d1 queries and server functions
- Update route tree, package.json, and footer
- Add todo.md

Made-with: Cursor
- Added new dependencies: @radix-ui/react-popover, @radix-ui/react-tooltip, cmdk, ml-kmeans, shaders, and umap-js.
- Removed unused dependencies: ml-kmeans and umap-js from package.json.
- Updated styles for the body background in styles.css.
- Enhanced FacePile component with tooltips for better user experience.
- Introduced lazy loading for ShaderBackground in the root route.
- Improved admin tags page with a new category combobox using popover and command components.
- Cleaned up console logs in the Amazon search function.

Made-with: Cursor
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants