vibes-plug 1.0.0 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/.github/workflows/publish.yml +20 -0
  2. package/AGENTS.md +66 -0
  3. package/BLUEPRINT.md +152 -60
  4. package/CHANGELOG.md +50 -0
  5. package/README.md +346 -194
  6. package/package.json +25 -25
  7. package/plugin.json +1 -1
  8. package/skills/ai-cost-token-optimizer/SKILL.md +52 -0
  9. package/skills/ai-llm-integration-expert/SKILL.md +180 -162
  10. package/skills/api-design-expert/SKILL.md +314 -310
  11. package/skills/app-analyzer-optimizer/SKILL.md +193 -189
  12. package/skills/apple-ecosystem-expert/SKILL.md +142 -0
  13. package/skills/async-queue-temporal-expert/SKILL.md +54 -0
  14. package/skills/authentication-identity-expert/SKILL.md +251 -20
  15. package/skills/auto-doc-updater/SKILL.md +214 -204
  16. package/skills/autonomous-chaos-monkey/SKILL.md +63 -0
  17. package/skills/autonomous-red-teamer/SKILL.md +59 -0
  18. package/skills/autonomous-swarm-director/SKILL.md +69 -0
  19. package/skills/autonomous-tdd-debugger/SKILL.md +65 -0
  20. package/skills/bootstrap-to-modern/SKILL.md +90 -86
  21. package/skills/brainstorming/SKILL.md +373 -353
  22. package/skills/browser-automation-expert/SKILL.md +46 -0
  23. package/skills/ci-cd-devops-architect/SKILL.md +72 -45
  24. package/skills/cloud-hosting-expert/SKILL.md +244 -244
  25. package/skills/coderabbit/SKILL.md +192 -192
  26. package/skills/cron-scheduler-expert/SKILL.md +298 -0
  27. package/skills/data-telemetry-expert/SKILL.md +213 -213
  28. package/skills/database-orm-expert/SKILL.md +294 -294
  29. package/skills/dependency-upgrade-migrator/SKILL.md +295 -0
  30. package/skills/design-system-architect/SKILL.md +27 -10
  31. package/skills/doku-mcp-server/SKILL.md +251 -0
  32. package/skills/doku-payment-gateway/SKILL.md +227 -0
  33. package/skills/e2e-testing-expert/SKILL.md +315 -315
  34. package/skills/edge-serverless-db-expert/SKILL.md +43 -0
  35. package/skills/email-notification-expert/SKILL.md +362 -0
  36. package/skills/error-resilience-expert/SKILL.md +480 -0
  37. package/skills/event-driven-architect/SKILL.md +81 -81
  38. package/skills/feature-flag-analytics-expert/SKILL.md +46 -0
  39. package/skills/file-upload-media-expert/SKILL.md +431 -0
  40. package/skills/form-validation-expert/SKILL.md +401 -0
  41. package/skills/fullstack-expert/SKILL.md +202 -202
  42. package/skills/fullstack-expert/references/api_design_guide.md +466 -466
  43. package/skills/fullstack-expert/references/multi_language_backend.md +528 -528
  44. package/skills/fullstack-expert/scripts/api_contract_validator.py +253 -253
  45. package/skills/fullstack-expert/scripts/architecture_analyzer.py +326 -326
  46. package/skills/gemini-agent-booster/SKILL.md +135 -135
  47. package/skills/global-a11y-i18n-expert/SKILL.md +81 -81
  48. package/skills/glsl-shader-expert/SKILL.md +101 -0
  49. package/skills/go-programming-expert/SKILL.md +295 -295
  50. package/skills/graphql-apollo-expert/SKILL.md +108 -0
  51. package/skills/hig/SKILL.md +188 -188
  52. package/skills/hyper-context-synthesizer/SKILL.md +55 -0
  53. package/skills/js-backend-expert/SKILL.md +34 -9
  54. package/skills/legacy-code-translator/SKILL.md +65 -0
  55. package/skills/llm-cost-arbitrage-router/SKILL.md +59 -0
  56. package/skills/logging-error-tracking-expert/SKILL.md +338 -0
  57. package/skills/mcp-client-orchestrator/SKILL.md +70 -0
  58. package/skills/mcp-server-architect/SKILL.md +194 -194
  59. package/skills/micro-frontend-architect/SKILL.md +106 -0
  60. package/skills/mobile-expo-expert/SKILL.md +186 -186
  61. package/skills/mobile-push-notification-expert/SKILL.md +51 -0
  62. package/skills/monday-design-aesthetic/SKILL.md +67 -67
  63. package/skills/monorepo-architect/SKILL.md +227 -227
  64. package/skills/mpa-orchestrator/SKILL.md +101 -101
  65. package/skills/multi-agent-orchestration/SKILL.md +234 -234
  66. package/skills/multiple-entry-points/SKILL.md +55 -55
  67. package/skills/mvc-expert/SKILL.md +231 -231
  68. package/skills/payment-gateway-expert/SKILL.md +45 -45
  69. package/skills/performance-web-vitals/SKILL.md +332 -332
  70. package/skills/post-quantum-crypto-migrator/SKILL.md +57 -0
  71. package/skills/prd-architect/SKILL.md +201 -191
  72. package/skills/proactive-background-watcher/SKILL.md +62 -0
  73. package/skills/production-ready-hardener/PRODUCTION_READINESS_REPORT.md +67 -0
  74. package/skills/production-ready-hardener/SKILL.md +173 -186
  75. package/skills/production-ready-hardener/references/production_checklist.md +161 -161
  76. package/skills/production-ready-hardener/scripts/production_readiness_scanner.py +881 -875
  77. package/skills/project-context-mapper/SKILL.md +79 -0
  78. package/skills/python-programming-expert/SKILL.md +263 -132
  79. package/skills/rate-limit-abuse-prevention/SKILL.md +371 -0
  80. package/skills/realtime-collaboration-expert/SKILL.md +45 -45
  81. package/skills/rust-programming-expert/SKILL.md +235 -235
  82. package/skills/saas-billing/SKILL.md +377 -377
  83. package/skills/saas-multi-tenant/SKILL.md +251 -237
  84. package/skills/saas-mvp-launcher/SKILL.md +10 -0
  85. package/skills/saas-transformer/SKILL.md +187 -144
  86. package/skills/saas-transformer/references/billing_integration_guide.md +401 -401
  87. package/skills/saas-transformer/references/feature_gating_patterns.md +137 -137
  88. package/skills/saas-transformer/references/saas_transformation_checklist.md +121 -121
  89. package/skills/saas-transformer/scripts/saas_transformation_scanner.py +39 -29
  90. package/skills/scalability-clean-code/SKILL.md +229 -229
  91. package/skills/self-evolving-memory-graph/SKILL.md +75 -0
  92. package/skills/self-healing-cloud-orchestrator/SKILL.md +57 -0
  93. package/skills/senior-frontend/SKILL.md +161 -161
  94. package/skills/senior-fullstack/SKILL.md +167 -167
  95. package/skills/seo/SKILL.md +235 -225
  96. package/skills/seo-geo/SKILL.md +188 -188
  97. package/skills/session-context-loader/SKILL.md +77 -0
  98. package/skills/session-handoff-resume/SKILL.md +158 -158
  99. package/skills/skill_baru/SKILL.md +172 -147
  100. package/skills/spa-orchestrator/SKILL.md +288 -288
  101. package/skills/state-management-expert/SKILL.md +272 -272
  102. package/skills/supabase-security-expert/SKILL.md +243 -243
  103. package/skills/tailwind-expert/SKILL.md +188 -188
  104. package/skills/tanstack-query-expert/SKILL.md +199 -199
  105. package/skills/token-saver/SKILL.md +119 -111
  106. package/skills/typescript-expert/SKILL.md +324 -279
  107. package/skills/ui-components-expert/SKILL.md +263 -46
  108. package/skills/ui-ux-pro-max/SKILL.md +202 -201
  109. package/skills/ui-ux-pro-max/scripts/__pycache__/core.cpython-310.pyc +0 -0
  110. package/skills/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-310.pyc +0 -0
  111. package/skills/ui_ux_expert/SKILL.md +17 -6
  112. package/skills/vector-db-rag-expert/SKILL.md +52 -0
  113. package/skills/vibe-code-gardener/SKILL.md +181 -173
  114. package/skills/visual-qa-vision-agent/SKILL.md +65 -0
  115. package/skills/vue-frontend-expert/SKILL.md +126 -0
  116. package/skills/web-3d-graphics-expert/SKILL.md +131 -0
  117. package/skills/web-game-engine-expert/SKILL.md +96 -0
  118. package/skills/web-scraper/SKILL.md +207 -205
  119. package/skills/website-design-cloner/SKILL.md +174 -0
  120. package/skills/webxr-ar-vr-expert/SKILL.md +117 -0
  121. package/skills/zero-to-prod-orchestrator/SKILL.md +206 -180
  122. package/skills/zero-trust-secret-vault/SKILL.md +40 -0
  123. package/vibes-swarm-demo.gif +0 -0
@@ -1,288 +1,288 @@
1
- ---
2
- name: spa-orchestrator
3
- description: "Orchestrates Single-Page Application (SPA) architecture, integrating frontend state management with API-driven backends / Mengorkestrasi arsitektur Single-Page Application (SPA), mengintegrasikan state management frontend dengan backend berbasis API."
4
- author: "Roedy Rustam"
5
- ---
6
-
7
- # Single-Page Application (SPA) Orchestrator (2026 Edition)
8
-
9
- [English](#english) | [Bahasa Indonesia](#bahasa-indonesia)
10
-
11
- ---
12
-
13
- <a name="english"></a>
14
- ## English
15
-
16
- ### Description
17
- Structured orchestration guide for building modern Single-Page Applications (SPAs). Coordinates frontend architecture (TanStack Router, React 19, TanStack Query v5) with decoupled API backends (Hono RPC, tRPC). Covers state management strategy, routing patterns, API layer design, build tooling (Vite + TanStack Start), and deployment strategies.
18
-
19
- ### Trigger Conditions
20
- - Building a highly interactive dashboard, admin panel, or data-heavy web application as a SPA.
21
- - Choosing between SPA vs SSR vs MPA for a new project.
22
- - Setting up client-side routing with **TanStack Router** (type-safe routes, loaders).
23
- - Structuring state management: server state (TanStack Query) vs client state (Zustand/Jotai).
24
- - Building a decoupled frontend that communicates with a separate backend via **Hono RPC** or tRPC.
25
- - Deploying a SPA to Cloudflare Pages, Vercel, or a CDN.
26
-
27
- ### SPA vs SSR vs MPA — Decision Guide
28
- ```
29
- Choose SPA when:
30
- ✅ Highly interactive app (dashboard, editor, admin panel)
31
- ✅ Rich client-side state that persists across navigation
32
- ✅ Auth-gated app (SEO is not a primary concern)
33
- ✅ Already have a separate backend API
34
-
35
- Choose SSR (Next.js) when:
36
- ✅ SEO is critical (marketing pages, public content)
37
- ✅ Fast initial page load for unauthenticated users
38
- ✅ Mixed app: some public pages + some gated app pages
39
-
40
- Choose MPA (Astro, Django, Laravel) when:
41
- ✅ Mostly static content, minimal interactivity
42
- ✅ SEO is the primary concern
43
- ✅ Small team that wants to avoid JS complexity
44
- → see mpa-orchestrator skill
45
- ```
46
-
47
- ### Recommended SPA Stack (2026)
48
-
49
- | Layer | Tool | Why |
50
- |---|---|---|
51
- | **Build** | Vite 6 / TanStack Start | Instant HMR, ES modules, fast builds |
52
- | **Routing** | TanStack Router | Fully type-safe routes, search params, loaders |
53
- | **Server State** | TanStack Query v5 | Data fetching, caching, mutations |
54
- | **Client State** | Zustand / Jotai | Lightweight, no boilerplate |
55
- | **API Layer** | Hono RPC / tRPC | End-to-end type-safe, no codegen |
56
- | **Forms** | React Hook Form + Zod | Performant, type-safe validation |
57
- | **Styling** | Tailwind CSS v4 | Utility-first, zero-runtime |
58
- | **Components** | shadcn/ui + Base UI | Headless, accessible, customizable |
59
- | **Animations** | GSAP | Complex, timeline-based, scroll-driven |
60
-
61
- ### TanStack Router — File-Based Type-Safe Routing
62
-
63
- ```
64
- src/routes/
65
- __root.tsx # Root layout (providers, nav)
66
- index.tsx # / — landing/home
67
- _auth.tsx # Auth guard layout
68
- _auth/
69
- dashboard.tsx # /dashboard (auth required)
70
- settings/
71
- index.tsx # /settings
72
- profile.tsx # /settings/profile
73
- _public.tsx # Public layout
74
- _public/
75
- login.tsx # /login
76
- ```
77
-
78
- ```typescript
79
- // src/routes/__root.tsx
80
- import { createRootRouteWithContext, Outlet } from '@tanstack/react-router';
81
- import type { QueryClient } from '@tanstack/react-query';
82
-
83
- interface RouterContext {
84
- queryClient: QueryClient;
85
- auth: { user: User | null; isAuthenticated: boolean };
86
- }
87
-
88
- export const Route = createRootRouteWithContext<RouterContext>()({
89
- component: () => (
90
- <div>
91
- <Navbar />
92
- <Outlet />
93
- </div>
94
- ),
95
- });
96
- ```
97
-
98
- ```typescript
99
- // src/routes/_auth/dashboard.tsx — protected route with data preloading
100
- import { createFileRoute, redirect } from '@tanstack/react-router';
101
- import { workspacesQueryOptions } from '@/queries/workspaces';
102
-
103
- export const Route = createFileRoute('/_auth/dashboard')({
104
- // Runs before render — redirect if not authenticated
105
- beforeLoad: ({ context }) => {
106
- if (!context.auth.isAuthenticated) {
107
- throw redirect({ to: '/login' });
108
- }
109
- },
110
- // Prefetch data in loader — no loading state on initial render
111
- loader: ({ context: { queryClient } }) =>
112
- queryClient.ensureQueryData(workspacesQueryOptions()),
113
- component: DashboardPage,
114
- });
115
-
116
- function DashboardPage() {
117
- // Data is already available — no loading state
118
- const { data: workspaces } = useSuspenseQuery(workspacesQueryOptions());
119
- return <WorkspaceList workspaces={workspaces} />;
120
- }
121
- ```
122
-
123
- ### State Management Architecture
124
-
125
- ```
126
- State Layers:
127
- ┌─────────────────────────────────────┐
128
- │ Server State (TanStack Query v5) │ ← API data, cached, auto-refetch
129
- │ workspaces, users, projects, etc. │
130
- ├─────────────────────────────────────┤
131
- │ Client State (Zustand) │ ← UI state, sidebar open, theme
132
- │ modals, filters, UI preferences │
133
- ├─────────────────────────────────────┤
134
- │ Form State (React Hook Form) │ ← Active form inputs, validation
135
- │ Scoped to individual forms │
136
- ├─────────────────────────────────────┤
137
- │ URL State (TanStack Router) │ ← Shareable page state
138
- │ search params, active tab, page # │
139
- └─────────────────────────────────────┘
140
- ```
141
-
142
- ```typescript
143
- // URL State — persist filter state in URL (shareable)
144
- import { createFileRoute, useNavigate } from '@tanstack/react-router';
145
- import { z } from 'zod';
146
-
147
- const searchSchema = z.object({
148
- page: z.number().int().positive().default(1).catch(1),
149
- search: z.string().default('').catch(''),
150
- status: z.enum(['all', 'active', 'archived']).default('all').catch('all'),
151
- });
152
-
153
- export const Route = createFileRoute('/_auth/projects')({
154
- validateSearch: searchSchema,
155
- component: ProjectsPage,
156
- });
157
-
158
- function ProjectsPage() {
159
- const { page, search, status } = Route.useSearch();
160
- const navigate = useNavigate({ from: Route.fullPath });
161
-
162
- const setSearch = (q: string) =>
163
- navigate({ search: (prev) => ({ ...prev, search: q, page: 1 }) });
164
-
165
- return (
166
- <div>
167
- <SearchInput value={search} onChange={setSearch} />
168
- <ProjectList page={page} search={search} status={status} />
169
- </div>
170
- );
171
- }
172
- ```
173
-
174
- ### Hono RPC — Decoupled Type-Safe API
175
-
176
- ```typescript
177
- // apps/api/src/index.ts — backend Hono app
178
- import { Hono } from 'hono';
179
- import { zValidator } from '@hono/zod-validator';
180
-
181
- const workspacesRoute = new Hono()
182
- .get('/', async (c) => {
183
- const user = c.get('user');
184
- const workspaces = await db.workspace.findMany({
185
- where: { members: { some: { userId: user.id } } },
186
- });
187
- return c.json(workspaces);
188
- })
189
- .post('/', zValidator('json', CreateWorkspaceSchema), async (c) => {
190
- const data = c.req.valid('json');
191
- const workspace = await db.workspace.create({ data });
192
- return c.json(workspace, 201);
193
- });
194
-
195
- const app = new Hono()
196
- .use('*', authMiddleware)
197
- .route('/workspaces', workspacesRoute);
198
-
199
- export type AppType = typeof app;
200
- export default app;
201
- ```
202
-
203
- ```typescript
204
- // apps/web/src/lib/api.ts — type-safe client
205
- import { hc } from 'hono/client';
206
- import type { AppType } from '@myapp/api';
207
-
208
- export const api = hc<AppType>(import.meta.env.VITE_API_URL);
209
-
210
- // TanStack Query integration
211
- export const workspacesQueryOptions = () =>
212
- queryOptions({
213
- queryKey: ['workspaces'],
214
- queryFn: async () => {
215
- const res = await api.workspaces.$get();
216
- return res.json(); // Fully typed!
217
- },
218
- staleTime: 5 * 60 * 1000,
219
- });
220
- ```
221
-
222
- ### Build & Deployment
223
-
224
- ```typescript
225
- // vite.config.ts
226
- import { defineConfig } from 'vite';
227
- import react from '@vitejs/plugin-react';
228
- import { TanStackRouterVite } from '@tanstack/router-plugin/vite';
229
-
230
- export default defineConfig({
231
- plugins: [
232
- TanStackRouterVite(), // Auto-generates route tree
233
- react(),
234
- ],
235
- build: {
236
- rollupOptions: {
237
- output: {
238
- manualChunks: {
239
- 'vendor-react': ['react', 'react-dom'],
240
- 'vendor-query': ['@tanstack/react-query'],
241
- 'vendor-router': ['@tanstack/react-router'],
242
- },
243
- },
244
- },
245
- },
246
- });
247
- ```
248
-
249
- **Deployment target**: Cloudflare Pages or Vercel for CDN-served static SPA. Backend API deployed separately to Railway/Fly.io.
250
-
251
- ---
252
-
253
- <a name="bahasa-indonesia"></a>
254
- ## Bahasa Indonesia
255
-
256
- ### Deskripsi
257
- Panduan orkestrasi terstruktur untuk membangun Single-Page Application (SPA) modern. Mengkoordinasikan arsitektur frontend (TanStack Router, React 19, TanStack Query v5) dengan backend API terpisah (Hono RPC, tRPC). Mencakup strategi state management, pola routing, desain API layer, build tooling (Vite + TanStack Start), dan strategi deployment.
258
-
259
- ### Kondisi Pemicu
260
- - Membangun dashboard yang sangat interaktif, panel admin, atau aplikasi web berat data sebagai SPA.
261
- - Memilih antara SPA vs SSR vs MPA untuk proyek baru.
262
- - Menyiapkan client-side routing dengan **TanStack Router** (rute type-safe, loader).
263
- - Menyusun state management: server state (TanStack Query) vs client state (Zustand/Jotai).
264
- - Membangun frontend terpisah yang berkomunikasi dengan backend terpisah via **Hono RPC** atau tRPC.
265
- - Men-deploy SPA ke Cloudflare Pages, Vercel, atau CDN.
266
-
267
- ### SPA vs SSR vs MPA — Panduan Keputusan
268
-
269
- Pilih SPA saat: aplikasi sangat interaktif (dashboard, editor, panel admin), state sisi klien yang kaya, aplikasi yang dibatasi auth (SEO bukan perhatian utama).
270
-
271
- Pilih SSR (Next.js) saat: SEO sangat penting, load halaman awal yang cepat untuk pengguna yang tidak terautentikasi, aplikasi campuran.
272
-
273
- Pilih MPA (Astro, Django, Laravel) saat: konten sebagian besar statis, SEO adalah perhatian utama — lihat skill `mpa-orchestrator`.
274
-
275
- ### Stack SPA yang Direkomendasikan (2026)
276
- Vite 6 untuk build, TanStack Router untuk routing type-safe, TanStack Query v5 untuk server state, Zustand untuk client state, Hono RPC untuk API layer type-safe, React Hook Form + Zod untuk form, Tailwind CSS v4 untuk styling, dan GSAP untuk animasi kompleks.
277
-
278
- ### TanStack Router — Routing File-Based Type-Safe
279
- Atur rute dalam direktori `src/routes/` dengan layout bersarang. Gunakan `createFileRoute` dengan `beforeLoad` untuk guard autentikasi, `loader` untuk prefetch data, dan `validateSearch` untuk URL state yang dapat dibagikan.
280
-
281
- ### Arsitektur State Management
282
- Empat lapisan state yang saling melengkapi: Server State (TanStack Query), Client State (Zustand), Form State (React Hook Form), dan URL State (TanStack Router search params).
283
-
284
- ### Hono RPC — API Type-Safe Terpisah
285
- Ekspor `AppType` dari backend Hono dan gunakan `hc<AppType>()` di frontend untuk panggilan API yang fully typed tanpa codegen.
286
-
287
- ### Build & Deployment
288
- Gunakan plugin `TanStackRouterVite` untuk auto-generate route tree. Konfigurasi `manualChunks` untuk code splitting yang optimal. Deploy SPA ke Cloudflare Pages atau Vercel; backend API ke Railway/Fly.io secara terpisah.
1
+ ---
2
+ name: spa-orchestrator
3
+ description: "Orchestrates Single-Page Application (SPA) architecture, integrating frontend state management with API-driven backends / Mengorkestrasi arsitektur Single-Page Application (SPA), mengintegrasikan state management frontend dengan backend berbasis API."
4
+ author: "Roedy Rustam"
5
+ ---
6
+
7
+ # Single-Page Application (SPA) Orchestrator (2026 Edition)
8
+
9
+ [English](#english) | [Bahasa Indonesia](#bahasa-indonesia)
10
+
11
+ ---
12
+
13
+ <a name="english"></a>
14
+ ## English
15
+
16
+ ### Description
17
+ Structured orchestration guide for building modern Single-Page Applications (SPAs). Coordinates frontend architecture (TanStack Router, React 19, TanStack Query v5) with decoupled API backends (Hono RPC, tRPC). Covers state management strategy, routing patterns, API layer design, build tooling (Vite + TanStack Start), and deployment strategies.
18
+
19
+ ### Trigger Conditions
20
+ - Building a highly interactive dashboard, admin panel, or data-heavy web application as a SPA.
21
+ - Choosing between SPA vs SSR vs MPA for a new project.
22
+ - Setting up client-side routing with **TanStack Router** (type-safe routes, loaders).
23
+ - Structuring state management: server state (TanStack Query) vs client state (Zustand/Jotai).
24
+ - Building a decoupled frontend that communicates with a separate backend via **Hono RPC** or tRPC.
25
+ - Deploying a SPA to Cloudflare Pages, Vercel, or a CDN.
26
+
27
+ ### SPA vs SSR vs MPA — Decision Guide
28
+ ```
29
+ Choose SPA when:
30
+ ✅ Highly interactive app (dashboard, editor, admin panel)
31
+ ✅ Rich client-side state that persists across navigation
32
+ ✅ Auth-gated app (SEO is not a primary concern)
33
+ ✅ Already have a separate backend API
34
+
35
+ Choose SSR (Next.js) when:
36
+ ✅ SEO is critical (marketing pages, public content)
37
+ ✅ Fast initial page load for unauthenticated users
38
+ ✅ Mixed app: some public pages + some gated app pages
39
+
40
+ Choose MPA (Astro, Django, Laravel) when:
41
+ ✅ Mostly static content, minimal interactivity
42
+ ✅ SEO is the primary concern
43
+ ✅ Small team that wants to avoid JS complexity
44
+ → see mpa-orchestrator skill
45
+ ```
46
+
47
+ ### Recommended SPA Stack (2026)
48
+
49
+ | Layer | Tool | Why |
50
+ |---|---|---|
51
+ | **Build** | Vite 6 / TanStack Start | Instant HMR, ES modules, fast builds |
52
+ | **Routing** | TanStack Router | Fully type-safe routes, search params, loaders |
53
+ | **Server State** | TanStack Query v5 | Data fetching, caching, mutations |
54
+ | **Client State** | Zustand / Jotai | Lightweight, no boilerplate |
55
+ | **API Layer** | Hono RPC / tRPC | End-to-end type-safe, no codegen |
56
+ | **Forms** | React Hook Form + Zod | Performant, type-safe validation |
57
+ | **Styling** | Tailwind CSS v4 | Utility-first, zero-runtime |
58
+ | **Components** | shadcn/ui + Base UI | Headless, accessible, customizable |
59
+ | **Animations** | GSAP | Complex, timeline-based, scroll-driven |
60
+
61
+ ### TanStack Router — File-Based Type-Safe Routing
62
+
63
+ ```
64
+ src/routes/
65
+ __root.tsx # Root layout (providers, nav)
66
+ index.tsx # / — landing/home
67
+ _auth.tsx # Auth guard layout
68
+ _auth/
69
+ dashboard.tsx # /dashboard (auth required)
70
+ settings/
71
+ index.tsx # /settings
72
+ profile.tsx # /settings/profile
73
+ _public.tsx # Public layout
74
+ _public/
75
+ login.tsx # /login
76
+ ```
77
+
78
+ ```typescript
79
+ // src/routes/__root.tsx
80
+ import { createRootRouteWithContext, Outlet } from '@tanstack/react-router';
81
+ import type { QueryClient } from '@tanstack/react-query';
82
+
83
+ interface RouterContext {
84
+ queryClient: QueryClient;
85
+ auth: { user: User | null; isAuthenticated: boolean };
86
+ }
87
+
88
+ export const Route = createRootRouteWithContext<RouterContext>()({
89
+ component: () => (
90
+ <div>
91
+ <Navbar />
92
+ <Outlet />
93
+ </div>
94
+ ),
95
+ });
96
+ ```
97
+
98
+ ```typescript
99
+ // src/routes/_auth/dashboard.tsx — protected route with data preloading
100
+ import { createFileRoute, redirect } from '@tanstack/react-router';
101
+ import { workspacesQueryOptions } from '@/queries/workspaces';
102
+
103
+ export const Route = createFileRoute('/_auth/dashboard')({
104
+ // Runs before render — redirect if not authenticated
105
+ beforeLoad: ({ context }) => {
106
+ if (!context.auth.isAuthenticated) {
107
+ throw redirect({ to: '/login' });
108
+ }
109
+ },
110
+ // Prefetch data in loader — no loading state on initial render
111
+ loader: ({ context: { queryClient } }) =>
112
+ queryClient.ensureQueryData(workspacesQueryOptions()),
113
+ component: DashboardPage,
114
+ });
115
+
116
+ function DashboardPage() {
117
+ // Data is already available — no loading state
118
+ const { data: workspaces } = useSuspenseQuery(workspacesQueryOptions());
119
+ return <WorkspaceList workspaces={workspaces} />;
120
+ }
121
+ ```
122
+
123
+ ### State Management Architecture
124
+
125
+ ```
126
+ State Layers:
127
+ ┌─────────────────────────────────────┐
128
+ │ Server State (TanStack Query v5) │ ← API data, cached, auto-refetch
129
+ │ workspaces, users, projects, etc. │
130
+ ├─────────────────────────────────────┤
131
+ │ Client State (Zustand) │ ← UI state, sidebar open, theme
132
+ │ modals, filters, UI preferences │
133
+ ├─────────────────────────────────────┤
134
+ │ Form State (React Hook Form) │ ← Active form inputs, validation
135
+ │ Scoped to individual forms │
136
+ ├─────────────────────────────────────┤
137
+ │ URL State (TanStack Router) │ ← Shareable page state
138
+ │ search params, active tab, page # │
139
+ └─────────────────────────────────────┘
140
+ ```
141
+
142
+ ```typescript
143
+ // URL State — persist filter state in URL (shareable)
144
+ import { createFileRoute, useNavigate } from '@tanstack/react-router';
145
+ import { z } from 'zod';
146
+
147
+ const searchSchema = z.object({
148
+ page: z.number().int().positive().default(1).catch(1),
149
+ search: z.string().default('').catch(''),
150
+ status: z.enum(['all', 'active', 'archived']).default('all').catch('all'),
151
+ });
152
+
153
+ export const Route = createFileRoute('/_auth/projects')({
154
+ validateSearch: searchSchema,
155
+ component: ProjectsPage,
156
+ });
157
+
158
+ function ProjectsPage() {
159
+ const { page, search, status } = Route.useSearch();
160
+ const navigate = useNavigate({ from: Route.fullPath });
161
+
162
+ const setSearch = (q: string) =>
163
+ navigate({ search: (prev) => ({ ...prev, search: q, page: 1 }) });
164
+
165
+ return (
166
+ <div>
167
+ <SearchInput value={search} onChange={setSearch} />
168
+ <ProjectList page={page} search={search} status={status} />
169
+ </div>
170
+ );
171
+ }
172
+ ```
173
+
174
+ ### Hono RPC — Decoupled Type-Safe API
175
+
176
+ ```typescript
177
+ // apps/api/src/index.ts — backend Hono app
178
+ import { Hono } from 'hono';
179
+ import { zValidator } from '@hono/zod-validator';
180
+
181
+ const workspacesRoute = new Hono()
182
+ .get('/', async (c) => {
183
+ const user = c.get('user');
184
+ const workspaces = await db.workspace.findMany({
185
+ where: { members: { some: { userId: user.id } } },
186
+ });
187
+ return c.json(workspaces);
188
+ })
189
+ .post('/', zValidator('json', CreateWorkspaceSchema), async (c) => {
190
+ const data = c.req.valid('json');
191
+ const workspace = await db.workspace.create({ data });
192
+ return c.json(workspace, 201);
193
+ });
194
+
195
+ const app = new Hono()
196
+ .use('*', authMiddleware)
197
+ .route('/workspaces', workspacesRoute);
198
+
199
+ export type AppType = typeof app;
200
+ export default app;
201
+ ```
202
+
203
+ ```typescript
204
+ // apps/web/src/lib/api.ts — type-safe client
205
+ import { hc } from 'hono/client';
206
+ import type { AppType } from '@myapp/api';
207
+
208
+ export const api = hc<AppType>(import.meta.env.VITE_API_URL);
209
+
210
+ // TanStack Query integration
211
+ export const workspacesQueryOptions = () =>
212
+ queryOptions({
213
+ queryKey: ['workspaces'],
214
+ queryFn: async () => {
215
+ const res = await api.workspaces.$get();
216
+ return res.json(); // Fully typed!
217
+ },
218
+ staleTime: 5 * 60 * 1000,
219
+ });
220
+ ```
221
+
222
+ ### Build & Deployment
223
+
224
+ ```typescript
225
+ // vite.config.ts
226
+ import { defineConfig } from 'vite';
227
+ import react from '@vitejs/plugin-react';
228
+ import { TanStackRouterVite } from '@tanstack/router-plugin/vite';
229
+
230
+ export default defineConfig({
231
+ plugins: [
232
+ TanStackRouterVite(), // Auto-generates route tree
233
+ react(),
234
+ ],
235
+ build: {
236
+ rollupOptions: {
237
+ output: {
238
+ manualChunks: {
239
+ 'vendor-react': ['react', 'react-dom'],
240
+ 'vendor-query': ['@tanstack/react-query'],
241
+ 'vendor-router': ['@tanstack/react-router'],
242
+ },
243
+ },
244
+ },
245
+ },
246
+ });
247
+ ```
248
+
249
+ **Deployment target**: Cloudflare Pages or Vercel for CDN-served static SPA. Backend API deployed separately to Railway/Fly.io.
250
+
251
+ ---
252
+
253
+ <a name="bahasa-indonesia"></a>
254
+ ## Bahasa Indonesia
255
+
256
+ ### Deskripsi
257
+ Panduan orkestrasi terstruktur untuk membangun Single-Page Application (SPA) modern. Mengkoordinasikan arsitektur frontend (TanStack Router, React 19, TanStack Query v5) dengan backend API terpisah (Hono RPC, tRPC). Mencakup strategi state management, pola routing, desain API layer, build tooling (Vite + TanStack Start), dan strategi deployment.
258
+
259
+ ### Kondisi Pemicu
260
+ - Membangun dashboard yang sangat interaktif, panel admin, atau aplikasi web berat data sebagai SPA.
261
+ - Memilih antara SPA vs SSR vs MPA untuk proyek baru.
262
+ - Menyiapkan client-side routing dengan **TanStack Router** (rute type-safe, loader).
263
+ - Menyusun state management: server state (TanStack Query) vs client state (Zustand/Jotai).
264
+ - Membangun frontend terpisah yang berkomunikasi dengan backend terpisah via **Hono RPC** atau tRPC.
265
+ - Men-deploy SPA ke Cloudflare Pages, Vercel, atau CDN.
266
+
267
+ ### SPA vs SSR vs MPA — Panduan Keputusan
268
+
269
+ Pilih SPA saat: aplikasi sangat interaktif (dashboard, editor, panel admin), state sisi klien yang kaya, aplikasi yang dibatasi auth (SEO bukan perhatian utama).
270
+
271
+ Pilih SSR (Next.js) saat: SEO sangat penting, load halaman awal yang cepat untuk pengguna yang tidak terautentikasi, aplikasi campuran.
272
+
273
+ Pilih MPA (Astro, Django, Laravel) saat: konten sebagian besar statis, SEO adalah perhatian utama — lihat skill `mpa-orchestrator`.
274
+
275
+ ### Stack SPA yang Direkomendasikan (2026)
276
+ Vite 6 untuk build, TanStack Router untuk routing type-safe, TanStack Query v5 untuk server state, Zustand untuk client state, Hono RPC untuk API layer type-safe, React Hook Form + Zod untuk form, Tailwind CSS v4 untuk styling, dan GSAP untuk animasi kompleks.
277
+
278
+ ### TanStack Router — Routing File-Based Type-Safe
279
+ Atur rute dalam direktori `src/routes/` dengan layout bersarang. Gunakan `createFileRoute` dengan `beforeLoad` untuk guard autentikasi, `loader` untuk prefetch data, dan `validateSearch` untuk URL state yang dapat dibagikan.
280
+
281
+ ### Arsitektur State Management
282
+ Empat lapisan state yang saling melengkapi: Server State (TanStack Query), Client State (Zustand), Form State (React Hook Form), dan URL State (TanStack Router search params).
283
+
284
+ ### Hono RPC — API Type-Safe Terpisah
285
+ Ekspor `AppType` dari backend Hono dan gunakan `hc<AppType>()` di frontend untuk panggilan API yang fully typed tanpa codegen.
286
+
287
+ ### Build & Deployment
288
+ Gunakan plugin `TanStackRouterVite` untuk auto-generate route tree. Konfigurasi `manualChunks` untuk code splitting yang optimal. Deploy SPA ke Cloudflare Pages atau Vercel; backend API ke Railway/Fly.io secara terpisah.