RuleStack

Configs

Stacks

Compare

Diff

RuleStack

Configs

Stacks

Compare

Diff

Read API

RuleStack

Configs

Stacks

Compare

Diff

Read API

Configs/Cursor rules/TechSquidTV/Hermes

Cursor rule

.cursor/rules/20-hermes-app-routes.mdc
Cursor rules

Quality

65/100

Scores the file, not the repository.

Length

742 words

23 headings · 17 code blocks

Repository

45

— · pushed 3 days ago

Last changed

3 days ago

First indexed 3 days ago.
TechSquidTV/Hermes/.cursor/rules/20-hermes-app-routes.mdcRawGitHub
1---
2globs:
3 - "packages/hermes-app/src/routes/**/*.tsx"
4---
5 
6# Hermes App - TanStack Router Rules
7 
8## Route File Structure
9 
10### File-Based Routing
11- Route files in `src/routes/`
12- File names determine route paths using dot notation
13- Special file names: `__root.tsx`, `index.tsx`
14 
15```
16routes/
17├── __root.tsx # Root layout (wraps all routes)
18├── index.tsx # Home page (/)
19├── queue.tsx # /queue
20├── settings.tsx # /settings
21├── auth.login.tsx # /auth/login
22└── auth.signup.tsx # /auth/signup
23```
24 
25### Route File Template
26```typescript
27import { createFileRoute } from "@tanstack/react-router";
28 
29export const Route = createFileRoute("/route-path")({
30 component: RouteComponent,
31 loader: async ({ context, params }) => {
32 // Load data
33 return { data };
34 },
35 errorComponent: ErrorComponent,
36 pendingComponent: LoadingComponent,
37 beforeLoad: async ({ context, location }) => {
38 // Auth checks, redirects
39 },
40});
41 
42function RouteComponent() {
43 const data = Route.useLoaderData();
44 return <div>{/* Route content */}</div>;
45}
46```
47 
48## Root Layout (__root.tsx)
49 
50```typescript
51import { createRootRoute, Outlet } from "@tanstack/react-router";
52import { AppLayout } from "@/components/layout/AppLayout";
53 
54export const Route = createRootRoute({
55 component: RootLayout,
56 errorComponent: RootErrorComponent,
57});
58 
59function RootLayout() {
60 return (
61 <AppLayout>
62 <Outlet />
63 </AppLayout>
64 );
65}
66```
67 
68## Data Loading
69 
70### Loaders
71```typescript
72export const Route = createFileRoute("/downloads")({
73 loader: async ({ context }) => {
74 const downloads = await fetchDownloads();
75 const stats = await fetchStats();
76 return { downloads, stats };
77 },
78 component: DownloadsPage,
79});
80 
81function DownloadsPage() {
82 const { downloads, stats } = Route.useLoaderData();
83 return (
84 <div>
85 <Stats data={stats} />
86 <DownloadList items={downloads} />
87 </div>
88 );
89}
90```
91 
92### With Search Params
93```typescript
94export const Route = createFileRoute("/downloads")({
95 validateSearch: (search: Record<string, unknown>) => {
96 return {
97 status: (search.status as string) || "all",
98 page: Number(search.page) || 1,
99 };
100 },
101 loader: async ({ context, search }) => {
102 const downloads = await fetchDownloads({
103 status: search.status,
104 page: search.page,
105 });
106 return { downloads };
107 },
108});
109```
110 
111## Navigation
112 
113### Link Component
114```typescript
115import { Link } from "@tanstack/react-router";
116 
117<Link to="/queue" className="nav-link" activeProps={{ className: "active" }}>
118 Queue
119</Link>
120 
121// With params
122<Link to="/downloads/$downloadId" params={{ downloadId: "123" }}>
123 View Download
124</Link>
125 
126// With search
127<Link to="/downloads" search={{ status: "completed", page: 1 }}>
128 Completed
129</Link>
130```
131 
132### Programmatic Navigation
133```typescript
134import { useNavigate } from "@tanstack/react-router";
135 
136function MyComponent() {
137 const navigate = useNavigate();
138 
139 const handleClick = () => {
140 navigate({ to: "/downloads", search: { status: "active" } });
141 };
142 
143 return <button onClick={handleClick}>Go</button>;
144}
145```
146 
147## Protected Routes
148 
149```typescript
150import { createFileRoute, redirect } from "@tanstack/react-router";
151import { isAuthenticated } from "@/services/auth";
152 
153export const Route = createFileRoute("/protected")({
154 beforeLoad: async ({ context, location }) => {
155 if (!isAuthenticated()) {
156 throw redirect({
157 to: "/auth/login",
158 search: { redirect: location.href },
159 });
160 }
161 },
162 component: ProtectedPage,
163});
164```
165 
166## Search Params
167 
168### Validating Search
169```typescript
170import { z } from "zod";
171 
172const searchSchema = z.object({
173 status: z.enum(["all", "active", "completed", "failed"]).default("all"),
174 sort: z.enum(["date", "title", "size"]).default("date"),
175 page: z.number().int().positive().default(1),
176 limit: z.number().int().positive().max(100).default(20),
177});
178 
179export const Route = createFileRoute("/downloads")({
180 validateSearch: (search) => searchSchema.parse(search),
181});
182 
183function Component() {
184 const search = Route.useSearch();
185 // search is fully typed
186}
187```
188 
189### Updating Search
190```typescript
191const navigate = useNavigate();
192const search = Route.useSearch();
193 
194const updateStatus = (status: string) => {
195 navigate({
196 search: (prev) => ({
197 ...prev,
198 status,
199 page: 1, // Reset page
200 }),
201 });
202};
203```
204 
205## Route Params
206 
207```typescript
208// File: routes/downloads.$downloadId.tsx
209export const Route = createFileRoute("/downloads/$downloadId")({
210 loader: async ({ params }) => {
211 const download = await fetchDownload(params.downloadId);
212 return { download };
213 },
214 component: DownloadDetail,
215});
216 
217function DownloadDetail() {
218 const { download } = Route.useLoaderData();
219 const { downloadId } = Route.useParams();
220 return <div>{download.title}</div>;
221}
222```
223 
224## Error Handling
225 
226```typescript
227export const Route = createFileRoute("/route")({
228 errorComponent: RouteErrorComponent,
229});
230 
231function RouteErrorComponent({ error }: { error: Error }) {
232 return (
233 <div className="error-container">
234 <h1>Something went wrong</h1>
235 <p>{error.message}</p>
236 </div>
237 );
238}
239```
240 
241### Loader Errors
242```typescript
243export const Route = createFileRoute("/data")({
244 loader: async () => {
245 const data = await fetchData();
246 if (!data) throw new Error("Data not found");
247 return { data };
248 },
249});
250```
251 
252## Loading States
253 
254```typescript
255export const Route = createFileRoute("/downloads")({
256 loader: fetchDownloads,
257 pendingComponent: LoadingDownloads,
258 component: DownloadsPage,
259});
260 
261function LoadingDownloads() {
262 return <div>Loading...</div>;
263}
264```
265 
266## Route Context
267 
268### Providing Context
269```typescript
270// In root route
271export const Route = createRootRoute({
272 beforeLoad: async () => {
273 const user = await getCurrentUser();
274 const config = await getConfig();
275 return { auth: { user }, config };
276 },
277});
278```
279 
280### Consuming Context
281```typescript
282export const Route = createFileRoute("/profile")({
283 beforeLoad: ({ context }) => {
284 const user = context.auth?.user;
285 return { user };
286 },
287});
288```
289 
290## Code Splitting
291 
292```typescript
293import { createFileRoute, lazyRouteComponent } from "@tanstack/react-router";
294 
295export const Route = createFileRoute("/large")({
296 component: lazyRouteComponent(() => import("./LargeComponent")),
297});
298```
299 
300 

Sections

  • Hermes App - TanStack Router Rules
  • Route File Structure
  • File-Based Routing
  • Route File Template
  • Root Layout (__root.tsx)
  • Data Loading
  • Loaders
  • With Search Params
  • Navigation
  • Link Component
  • Programmatic Navigation
  • Protected Routes
  • Search Params
  • Validating Search
  • Updating Search
  • Route Params
  • Error Handling
  • Loader Errors
  • Loading States
  • Route Context
  • Providing Context
  • Consuming Context
  • Code Splitting

What it covers

architectureapiuido-not

Stack — with the evidence

typescript

(1.00)

node

(0.70)

react

(0.70)

fastapi

(0.70)

redis

(0.70)

tailwind

(0.70)

vite

(0.70)

vitest

(0.70)

pytest

(0.70)

eslint

(0.70)

ruff

(0.70)

javascript

(0.60)

monorepo

(0.60)

pnpm

(0.60)

docker

(0.60)

github-actions

(0.60)

python

(0.50)

Glob targeting

  • packages/hermes-app/src/routes/**/*.tsx

Format

Cursor rules

The most expressive format here. Many small .mdc files, each with frontmatter declaring when it should load, so a rule about migrations only enters context when a migration is open. Costs the most to maintain and only one editor reads it.

What the corpus says about it

Repository

Owner
TechSquidTV
Language
—
License
—
Archived
no

All configs in this repo

Also in TechSquidTV/Hermes

Diff this repo’s formats

One repository carrying more than one format is the comparison this product exists for: does anyone actually write different content in each file, or is one a copy of the other?

The other instruction files in this repository
RepositoryFormatStackCoversScoreChanged
TechSquidTV/Hermes.cursor/rules/00-project.mdc · 45Cursor rulestypescriptmonorepo+15setuplint-formatstylearch+489/1003 days ago
TechSquidTV/Hermes.cursor/rules/10-hermes-api.mdc · 45Cursor rulestypescriptpytest+15testlint-formatstylearch+5100/1003 days ago
TechSquidTV/Hermes.cursor/rules/10-hermes-app.mdc · 45Cursor rulestypescriptnode+15lint-formatstylearchtypes+588/1003 days ago
TechSquidTV/Hermes.cursor/rules/20-hermes-api-api.mdc · 45Cursor rulestypescriptnode+15stylearchdependenciesapi+277/1003 days ago
TechSquidTV/Hermes.cursor/rules/20-hermes-api-db.mdc · 45Cursor rulestypescriptnode+15teststylearchtesting-strategy+373/1003 days ago
TechSquidTV/Hermes.cursor/rules/20-hermes-api-tests.mdc · 45Cursor rulestypescriptpytest+15teststyletesting-strategysecurity+397/1003 days ago
TechSquidTV/Hermes.cursor/rules/20-hermes-app-components.mdc · 45Cursor rulestypescriptnode+15archtypesuiperformance+165/1003 days ago
TechSquidTV/Hermes.cursor/rules/20-hermes-app-hooks.mdc · 45Cursor rulestypescriptnode+15lint-formatstylearchtypes+373/1003 days ago
TechSquidTV/Hermes.cursor/rules/30-docker.mdc · 45Cursor rulestypescriptnode+15setupbuildstylesecurity+484/1003 days ago
TechSquidTV/Hermes.cursor/rules/30-docs.mdc · 45Cursor rulestypescriptnode+15setuplint-formatstylearch+381/1003 days ago
TechSquidTV/Hermes.cursor/rules/30-tests.mdc · 45Cursor rulestypescriptpytest+15buildteststylearch+485/1003 days ago
Diff against .cursor/rules/00-project.mdc Diff against .cursor/rules/10-hermes-api.mdc Diff against .cursor/rules/10-hermes-app.mdc Diff against .cursor/rules/20-hermes-api-api.mdc Diff against .cursor/rules/20-hermes-api-db.mdc Diff against .cursor/rules/20-hermes-api-tests.mdc Diff against .cursor/rules/20-hermes-app-components.mdc Diff against .cursor/rules/20-hermes-app-hooks.mdc Diff against .cursor/rules/30-docker.mdc Diff against .cursor/rules/30-docs.mdc Diff against .cursor/rules/30-tests.mdc

Similar configs

Same format, overlapping stack, ranked by quality.

Same format, overlapping stack, ranked by quality
RepositoryFormatStackCoversScoreChanged
hiromaily/go-crypto-wallet.cursor/rules/typescript.mdc · 126Cursor rulesgobun+5setupbuildtestlint-format+6100/1003 days ago
TechSquidTV/Hermes.cursor/rules/10-hermes-api.mdc · 45Cursor rulestypescriptpytest+15testlint-formatstylearch+5100/1003 days ago
markstev/mark-starter.cursor/rules/frontend.mdc · 0Cursor rulestypescriptturborepo+14setuptestlint-formatstyle+699/1003 days ago
Allymahmoud/case-intake-platform.cursor/rules/frontend.mdc · 0Cursor rulestypescriptturborepo+13setuptestlint-formatstyle+799/1003 days ago
dodgecfr/combatfilms-webapp.cursor/rules/frontend.mdc · 0Cursor rulestypescriptturborepo+15setuptestlint-formatstyle+799/1003 days ago
deifos/clipmira-subtitles.cursor/rules/frontend.mdc · 1Cursor rulestypescriptnextjs+5setuptestlint-formatstyle+799/1003 days ago
langflow-ai/langflow.cursor/rules/docs_development.mdc · 153kCursor rulespythonnode+16setupbuildtestlint-format+797/1003 days ago
TechSquidTV/Hermes.cursor/rules/20-hermes-api-tests.mdc · 45Cursor rulestypescriptpytest+15teststyletesting-strategysecurity+397/1003 days ago
RuleStack

Built by

Kynth Studio

Directory

Configs
Stacks
Compare formats
Diff two configs
Best AGENTS.md examples

Formats

AGENTS.md
CLAUDE.md
Cursor rules
Copilot instructions

Reference

Read API
Corpus health
Privacy Policy
Terms

RuleStack

RuleStack

Built by

Kynth Studio

Directory

Configs
Stacks
Compare formats
Diff two configs
Best AGENTS.md examples

Formats

AGENTS.md
CLAUDE.md
Cursor rules
Copilot instructions

Reference

Read API
Corpus health
Privacy Policy
Terms

RuleStack

RuleStack

Built by

Kynth Studio

Directory

Configs
Stacks
Compare formats
Diff two configs
Best AGENTS.md examples

Formats

AGENTS.md
CLAUDE.md
Cursor rules
Copilot instructions

Reference

Read API
Corpus health
Privacy Policy
Terms

RuleStack