Skip to content

Commit e0b525c

Browse files
committed
refactor: overhaul builder and application starter flows
1 parent b02b195 commit e0b525c

95 files changed

Lines changed: 10306 additions & 5229 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.agents/index.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ TanStack.com marketing site built with TanStack Start.
55
## Essentials
66

77
- Package manager: `pnpm`
8-
- Run `pnpm test` at end of task batches (not after every tiny change)
8+
- Run `pnpm test` before commits or after significant code changes, not after every tiny edit
9+
- Smoke tests live outside the default `pnpm test` path and are reserved for commit-hook validation
910
- Don't run builds after every change. This is a visual site; assume changes work unless reported otherwise.
1011
- **Typesafety is paramount.** Never cast types; fix at source instead. See [typescript.md](.agents/typescript.md).
1112

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
# Ecosystem Implementation Todo
2+
3+
## Goal
4+
5+
Build a database-driven `/ecosystem` marketplace and submission flow without blocking the partner-page SEO work.
6+
7+
## Product Goals
8+
9+
- Create an `/ecosystem` directory page that acts like a marketplace
10+
- Let users sort and filter entries by the fields that actually matter
11+
- Let companies submit new listings through a first-party submission flow
12+
- Seed the marketplace with existing TanStack partners when the DB work starts
13+
- Let TanStack maintainers add an official review and comparisons to each listing
14+
- Keep partner-backed entries aligned with `/partners/[partner]` pages
15+
16+
## Scope To Build Later
17+
18+
### Data model
19+
20+
- Add a new `ecosystemEntries` table
21+
- Add a dedicated moderation capability like `moderate-ecosystem`
22+
- Keep the schema intentionally small and high-value
23+
24+
Suggested v1 fields:
25+
26+
- `id`
27+
- `userId`
28+
- `slug`
29+
- `name`
30+
- `websiteUrl`
31+
- `kind`
32+
- `tags`
33+
- `libraries`
34+
- `pricingModel`
35+
- `isOpenSource`
36+
- `preferenceScore`
37+
- `isPartner`
38+
- `logoUrl`
39+
- `screenshotUrl`
40+
- `summary`
41+
- `officialReviewMd`
42+
- `competitorSlugs`
43+
- `status`
44+
- `moderationNote`
45+
- `moderatedBy`
46+
- `moderatedAt`
47+
- `createdAt`
48+
- `updatedAt`
49+
50+
### Taxonomy
51+
52+
Use a very small taxonomy surface:
53+
54+
- `kind`: `integration | service | tool | template | plugin`
55+
- `pricingModel`: `free | freemium | paid | contact | oss`
56+
- `tags: string[]` absorbs both "type" and "service"
57+
58+
### Comparison model
59+
60+
Use slugs everywhere.
61+
62+
- Partners compare against other partner ids, which are also their slugs
63+
- Ecosystem entries compare against ecosystem slugs
64+
- Partner-backed ecosystem entries should reuse the same slug namespace
65+
66+
Suggested v1 field:
67+
68+
- `competitorSlugs: string[]`
69+
70+
No UUID-based comparison references for v1.
71+
No partner-only comparison system.
72+
No extra comparison tables unless the simple shape breaks down.
73+
74+
### Canonical URL rules
75+
76+
- Partner-backed entries should be canonical at `/partners/[partner]`
77+
- Non-partner entries should be canonical at `/ecosystem/[slug]`
78+
- If a partner-backed entry is reachable from `/ecosystem/[slug]`, redirect or canonicalize to `/partners/[partner]`
79+
80+
### Submission flow
81+
82+
Build a user-facing submission portal similar in spirit to showcase, but for ecosystem listings.
83+
84+
Suggested v1 required fields:
85+
86+
- `name`
87+
- `websiteUrl`
88+
- `kind`
89+
- `tags`
90+
- `libraries`
91+
- `pricingModel`
92+
- `isOpenSource`
93+
- `logoUrl`
94+
- `screenshotUrl`
95+
- `summary`
96+
97+
Maintainer-only fields for v1:
98+
99+
- `preferenceScore`
100+
- `officialReviewMd`
101+
- `competitorSlugs`
102+
- moderation fields
103+
104+
### Admin flow
105+
106+
- Add `/admin/ecosystem`
107+
- Add `/admin/ecosystem/[id]`
108+
- Let maintainers moderate submissions
109+
- Let maintainers edit all listing fields
110+
- Let maintainers set `preferenceScore`
111+
- Let maintainers author `officialReviewMd`
112+
- Let maintainers manage `competitorSlugs`
113+
114+
### Account flow
115+
116+
- Add `/account/ecosystem`
117+
- Let users view, edit, and delete their own submissions
118+
- Keep this separate from `/account/integrations`, which already means something else
119+
120+
## Seeding Plan
121+
122+
- Seed existing partners into the ecosystem table when the DB work starts
123+
- Preserve current partner ids as ecosystem slugs for partner-backed entries
124+
- Seed `preferenceScore` from the existing `partners[].score` values
125+
- Start seeded partner entries as `approved`
126+
- Keep the current score scale and revisit later if needed
127+
128+
## Suggested Implementation Order
129+
130+
1. Add ecosystem capability, enums, and DB schema
131+
2. Add ecosystem server functions and query options
132+
3. Seed partner rows into the new table
133+
4. Build `/ecosystem` index and `/ecosystem/[slug]`
134+
5. Build `/ecosystem/submit` and edit flows
135+
6. Build `/account/ecosystem`
136+
7. Build `/admin/ecosystem`
137+
8. Add SEO metadata and JSON-LD
138+
9. Run `pnpm test`
139+
140+
## Notes
141+
142+
- Reuse showcase architecture patterns, not the showcase schema
143+
- Keep the implementation intentionally small at first
144+
- Avoid over-modeling comparison data until real usage demands it
145+
- Partner pages ship first; ecosystem follows later

media/brand.sketch

1.2 KB
Binary file not shown.

package.json

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
"type": "module",
88
"scripts": {
99
"dev": "pnpm run with-env vite dev",
10-
"with-env": "dotenv -e ../../.env",
10+
"with-env": "dotenv -e .env -e .env.local",
1111
"dev:frontend": "pnpm run with-env vite dev",
1212
"build": "vite build && cp src/instrument.server.mjs dist/server",
1313
"start": "vite start",
@@ -19,11 +19,8 @@
1919
"db:studio": "drizzle-kit studio",
2020
"docs:webhooks:plan": "tsx scripts/sync-docs-webhooks.ts --dry-run",
2121
"docs:webhooks:sync": "tsx scripts/sync-docs-webhooks.ts",
22-
"husky": "pnpm run format && pnpm run test",
23-
"test": "run-p test:tsc test:imports test:lint test:smoke",
24-
"test:imports": "pnpm test:imports:api && pnpm test:imports:client",
25-
"test:imports:api": "tsx scripts/check-api-route-imports.ts",
26-
"test:imports:client": "tsx scripts/check-client-graph-imports.ts",
22+
"husky": "pnpm run format && pnpm run test && pnpm run test:smoke",
23+
"test": "run-p test:tsc test:lint",
2724
"test:tsc": "tsc",
2825
"test:lint": "pnpm run lint",
2926
"test:smoke": "tsx tests/smoke.ts",
@@ -48,11 +45,14 @@
4845
"@sentry/tanstackstart-react": "^10.47.0",
4946
"@tailwindcss/typography": "^0.5.19",
5047
"@tailwindcss/vite": "^4.2.2",
48+
"@tanstack/ai": "^0.10.0",
49+
"@tanstack/ai-client": "^0.7.7",
50+
"@tanstack/ai-openai": "^0.7.3",
5151
"@tanstack/create": "^0.63.2",
5252
"@tanstack/pacer": "^0.20.1",
5353
"@tanstack/react-hotkeys": "^0.9.1",
5454
"@tanstack/react-pacer": "^0.21.1",
55-
"@tanstack/react-query": "^5.96.1",
55+
"@tanstack/react-query": "^5.96.2",
5656
"@tanstack/react-router": "1.168.10",
5757
"@tanstack/react-router-devtools": "1.166.11",
5858
"@tanstack/react-router-ssr-query": "1.166.10",
@@ -117,6 +117,9 @@
117117
"@content-collections/vite": "^0.2.9",
118118
"@playwright/test": "^1.59.0",
119119
"@shikijs/transformers": "^4.0.2",
120+
"@tanstack/devtools-vite": "^0.6.0",
121+
"@tanstack/react-devtools": "^0.10.1",
122+
"@tanstack/react-query-devtools": "^5.96.2",
120123
"@types/hast": "^3.0.4",
121124
"@types/node": "^25.5.0",
122125
"@types/pg": "^8.20.0",

0 commit comments

Comments
 (0)