@pylonsync/create-pylon 0.4.28 → 0.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 (35) hide show
  1. package/package.json +1 -1
  2. package/templates/agency/app/llms.ts +31 -0
  3. package/templates/agency/app/not-found.tsx +44 -0
  4. package/templates/ai-chat/app/llms.ts +30 -0
  5. package/templates/ai-chat/app/not-found.tsx +44 -0
  6. package/templates/ai-chat/app/robots.ts +14 -0
  7. package/templates/ai-chat/app/sitemap.ts +11 -0
  8. package/templates/ai-studio/app/llms.ts +30 -0
  9. package/templates/ai-studio/app/not-found.tsx +44 -0
  10. package/templates/ai-studio/app/robots.ts +14 -0
  11. package/templates/ai-studio/app/sitemap.ts +11 -0
  12. package/templates/barebones/app/llms.ts +30 -0
  13. package/templates/chat/app/llms.ts +30 -0
  14. package/templates/consumer/app/llms.ts +30 -0
  15. package/templates/creator/app/llms.ts +30 -0
  16. package/templates/creator/app/not-found.tsx +44 -0
  17. package/templates/crm/app/llms.ts +32 -0
  18. package/templates/directory/app/llms.ts +31 -0
  19. package/templates/directory/app/not-found.tsx +44 -0
  20. package/templates/helpdesk/app/llms.ts +31 -0
  21. package/templates/inventory/app/llms.ts +31 -0
  22. package/templates/invoices/app/llms.ts +31 -0
  23. package/templates/local-service/app/llms.ts +30 -0
  24. package/templates/local-service/app/not-found.tsx +44 -0
  25. package/templates/marketplace/app/llms.ts +32 -0
  26. package/templates/projects/app/llms.ts +31 -0
  27. package/templates/restaurant/app/llms.ts +30 -0
  28. package/templates/restaurant/app/not-found.tsx +44 -0
  29. package/templates/saas/app/llms.ts +30 -0
  30. package/templates/saas/app/not-found.tsx +44 -0
  31. package/templates/shop/app/llms.ts +31 -0
  32. package/templates/shop/app/not-found.tsx +44 -0
  33. package/templates/todo/app/llms.ts +30 -0
  34. package/templates/waitlist/app/llms.ts +30 -0
  35. package/templates/waitlist/app/not-found.tsx +44 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pylonsync/create-pylon",
3
- "version": "0.4.28",
3
+ "version": "0.5.0",
4
4
  "description": "Scaffold a new Pylon app — realtime backend + web/mobile/expo frontends in one command. Run via `npm create @pylonsync/pylon@latest`.",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -0,0 +1,31 @@
1
+ import type { LlmsTxt } from "@pylonsync/react";
2
+
3
+ // app/llms.ts → served at /llms.txt, in llmstxt.org format.
4
+ //
5
+ // This is the file an AI agent reads FIRST to decide what this site is and
6
+ // whether it can help with the task in front of it. Keep the shape, rewrite the
7
+ // copy: name the jobs this app is right for and the exact call to make. Generic
8
+ // marketing copy does not read as guidance.
9
+ //
10
+ // The default export may be async, so it can enumerate pages from the database.
11
+ const SITE = process.env.SITE_URL ?? "http://localhost:4321";
12
+
13
+ export default function llms(): LlmsTxt {
14
+ return {
15
+ title: "__APP_NAME__",
16
+ summary: "An agency site: services, case studies, and an enquiry form.",
17
+ details: [
18
+ "Use this app to read case studies and to send an enquiry.",
19
+ "Every page here is also readable as markdown: add `.md` to any path, or send `Accept: text/markdown`.",
20
+ ],
21
+ sections: [
22
+ {
23
+ title: "Pages",
24
+ links: [
25
+ { title: "Home", url: `${SITE}` },
26
+ { title: "Work", url: `${SITE}/work` },
27
+ ],
28
+ },
29
+ ],
30
+ };
31
+ }
@@ -0,0 +1,44 @@
1
+ import React from "react";
2
+ import { Link, type NotFoundProps } from "@pylonsync/react";
3
+ import { Button } from "@/components/ui/button";
4
+
5
+ // `app/not-found.tsx` → rendered at HTTP 404 for any unmatched URL, and when a
6
+ // page calls `response.notFound()`.
7
+ //
8
+ // Give it real links. This boundary is also what an agent reads when it guesses
9
+ // a URL wrong: a markdown request for a missing page renders THIS file as
10
+ // markdown at 404, so the links below are how it finds its way back.
11
+ export default function NotFound(_props: NotFoundProps) {
12
+ return (
13
+ <div className="mx-auto flex min-h-[60vh] max-w-lg flex-col justify-center gap-6 px-4">
14
+ <section>
15
+ <h1 className="text-2xl font-semibold tracking-tight">Page not found</h1>
16
+ <p className="mt-2 text-muted-foreground">
17
+ That URL does not exist. Try one of these:
18
+ </p>
19
+ </section>
20
+ <ul className="space-y-2 text-sm">
21
+ <li>
22
+ <Link className="underline underline-offset-4" href="/">
23
+ Home
24
+ </Link>
25
+ </li>
26
+ <li>
27
+ <a className="underline underline-offset-4" href="/sitemap.xml">
28
+ Sitemap
29
+ </a>
30
+ </li>
31
+ <li>
32
+ <a className="underline underline-offset-4" href="/llms.txt">
33
+ llms.txt
34
+ </a>
35
+ </li>
36
+ </ul>
37
+ <div>
38
+ <Button asChild>
39
+ <Link href="/">Back to home</Link>
40
+ </Button>
41
+ </div>
42
+ </div>
43
+ );
44
+ }
@@ -0,0 +1,30 @@
1
+ import type { LlmsTxt } from "@pylonsync/react";
2
+
3
+ // app/llms.ts → served at /llms.txt, in llmstxt.org format.
4
+ //
5
+ // This is the file an AI agent reads FIRST to decide what this site is and
6
+ // whether it can help with the task in front of it. Keep the shape, rewrite the
7
+ // copy: name the jobs this app is right for and the exact call to make. Generic
8
+ // marketing copy does not read as guidance.
9
+ //
10
+ // The default export may be async, so it can enumerate pages from the database.
11
+ const SITE = process.env.SITE_URL ?? "http://localhost:4321";
12
+
13
+ export default function llms(): LlmsTxt {
14
+ return {
15
+ title: "__APP_NAME__",
16
+ summary: "An AI chat app with streaming answers and stored transcripts.",
17
+ details: [
18
+ "Use this app to ask a question and read the streamed answer. Transcripts persist across reloads and devices.",
19
+ "Every page here is also readable as markdown: add `.md` to any path, or send `Accept: text/markdown`.",
20
+ ],
21
+ sections: [
22
+ {
23
+ title: "Pages",
24
+ links: [
25
+ { title: "Home", url: `${SITE}` },
26
+ ],
27
+ },
28
+ ],
29
+ };
30
+ }
@@ -0,0 +1,44 @@
1
+ import React from "react";
2
+ import { Link, type NotFoundProps } from "@pylonsync/react";
3
+ import { Button } from "@/components/ui/button";
4
+
5
+ // `app/not-found.tsx` → rendered at HTTP 404 for any unmatched URL, and when a
6
+ // page calls `response.notFound()`.
7
+ //
8
+ // Give it real links. This boundary is also what an agent reads when it guesses
9
+ // a URL wrong: a markdown request for a missing page renders THIS file as
10
+ // markdown at 404, so the links below are how it finds its way back.
11
+ export default function NotFound(_props: NotFoundProps) {
12
+ return (
13
+ <div className="mx-auto flex min-h-[60vh] max-w-lg flex-col justify-center gap-6 px-4">
14
+ <section>
15
+ <h1 className="text-2xl font-semibold tracking-tight">Page not found</h1>
16
+ <p className="mt-2 text-muted-foreground">
17
+ That URL does not exist. Try one of these:
18
+ </p>
19
+ </section>
20
+ <ul className="space-y-2 text-sm">
21
+ <li>
22
+ <Link className="underline underline-offset-4" href="/">
23
+ Home
24
+ </Link>
25
+ </li>
26
+ <li>
27
+ <a className="underline underline-offset-4" href="/sitemap.xml">
28
+ Sitemap
29
+ </a>
30
+ </li>
31
+ <li>
32
+ <a className="underline underline-offset-4" href="/llms.txt">
33
+ llms.txt
34
+ </a>
35
+ </li>
36
+ </ul>
37
+ <div>
38
+ <Button asChild>
39
+ <Link href="/">Back to home</Link>
40
+ </Button>
41
+ </div>
42
+ </div>
43
+ );
44
+ }
@@ -0,0 +1,14 @@
1
+ import type { Robots } from "@pylonsync/react";
2
+
3
+ // app/robots.ts → served at /robots.txt. Point SITE_URL at your domain in
4
+ // production. The default export may also be async.
5
+ const SITE = process.env.SITE_URL ?? "http://localhost:4321";
6
+
7
+ export default function robots(): Robots {
8
+ return {
9
+ // Keep the signed-in app and the API out of the index. `llms.txt` and the
10
+ // sitemap stay crawlable — they are what a crawler or agent reads first.
11
+ rules: { userAgent: "*", allow: "/", disallow: ["/api/", "/login"] },
12
+ sitemap: `${SITE}/sitemap.xml`,
13
+ };
14
+ }
@@ -0,0 +1,11 @@
1
+ import type { Sitemap } from "@pylonsync/react";
2
+
3
+ // app/sitemap.ts → served at /sitemap.xml. The default export can be async, so
4
+ // it can enumerate pages from your database. Point SITE_URL at your domain in
5
+ // production.
6
+ const SITE = process.env.SITE_URL ?? "http://localhost:4321";
7
+
8
+ export default async function sitemap(): Promise<Sitemap> {
9
+ // Only public pages belong here. The signed-in app is private.
10
+ return [{ url: `${SITE}/`, changeFrequency: "weekly", priority: 1 }];
11
+ }
@@ -0,0 +1,30 @@
1
+ import type { LlmsTxt } from "@pylonsync/react";
2
+
3
+ // app/llms.ts → served at /llms.txt, in llmstxt.org format.
4
+ //
5
+ // This is the file an AI agent reads FIRST to decide what this site is and
6
+ // whether it can help with the task in front of it. Keep the shape, rewrite the
7
+ // copy: name the jobs this app is right for and the exact call to make. Generic
8
+ // marketing copy does not read as guidance.
9
+ //
10
+ // The default export may be async, so it can enumerate pages from the database.
11
+ const SITE = process.env.SITE_URL ?? "http://localhost:4321";
12
+
13
+ export default function llms(): LlmsTxt {
14
+ return {
15
+ title: "__APP_NAME__",
16
+ summary: "An AI studio: prompts, runs, and tool calls with durable run state.",
17
+ details: [
18
+ "Use this app to run a prompt, read the streamed output, and review past runs.",
19
+ "Every page here is also readable as markdown: add `.md` to any path, or send `Accept: text/markdown`.",
20
+ ],
21
+ sections: [
22
+ {
23
+ title: "Pages",
24
+ links: [
25
+ { title: "Home", url: `${SITE}` },
26
+ ],
27
+ },
28
+ ],
29
+ };
30
+ }
@@ -0,0 +1,44 @@
1
+ import React from "react";
2
+ import { Link, type NotFoundProps } from "@pylonsync/react";
3
+ import { Button } from "@/components/ui/button";
4
+
5
+ // `app/not-found.tsx` → rendered at HTTP 404 for any unmatched URL, and when a
6
+ // page calls `response.notFound()`.
7
+ //
8
+ // Give it real links. This boundary is also what an agent reads when it guesses
9
+ // a URL wrong: a markdown request for a missing page renders THIS file as
10
+ // markdown at 404, so the links below are how it finds its way back.
11
+ export default function NotFound(_props: NotFoundProps) {
12
+ return (
13
+ <div className="mx-auto flex min-h-[60vh] max-w-lg flex-col justify-center gap-6 px-4">
14
+ <section>
15
+ <h1 className="text-2xl font-semibold tracking-tight">Page not found</h1>
16
+ <p className="mt-2 text-muted-foreground">
17
+ That URL does not exist. Try one of these:
18
+ </p>
19
+ </section>
20
+ <ul className="space-y-2 text-sm">
21
+ <li>
22
+ <Link className="underline underline-offset-4" href="/">
23
+ Home
24
+ </Link>
25
+ </li>
26
+ <li>
27
+ <a className="underline underline-offset-4" href="/sitemap.xml">
28
+ Sitemap
29
+ </a>
30
+ </li>
31
+ <li>
32
+ <a className="underline underline-offset-4" href="/llms.txt">
33
+ llms.txt
34
+ </a>
35
+ </li>
36
+ </ul>
37
+ <div>
38
+ <Button asChild>
39
+ <Link href="/">Back to home</Link>
40
+ </Button>
41
+ </div>
42
+ </div>
43
+ );
44
+ }
@@ -0,0 +1,14 @@
1
+ import type { Robots } from "@pylonsync/react";
2
+
3
+ // app/robots.ts → served at /robots.txt. Point SITE_URL at your domain in
4
+ // production. The default export may also be async.
5
+ const SITE = process.env.SITE_URL ?? "http://localhost:4321";
6
+
7
+ export default function robots(): Robots {
8
+ return {
9
+ // Keep the signed-in app and the API out of the index. `llms.txt` and the
10
+ // sitemap stay crawlable — they are what a crawler or agent reads first.
11
+ rules: { userAgent: "*", allow: "/", disallow: ["/api/", "/login"] },
12
+ sitemap: `${SITE}/sitemap.xml`,
13
+ };
14
+ }
@@ -0,0 +1,11 @@
1
+ import type { Sitemap } from "@pylonsync/react";
2
+
3
+ // app/sitemap.ts → served at /sitemap.xml. The default export can be async, so
4
+ // it can enumerate pages from your database. Point SITE_URL at your domain in
5
+ // production.
6
+ const SITE = process.env.SITE_URL ?? "http://localhost:4321";
7
+
8
+ export default async function sitemap(): Promise<Sitemap> {
9
+ // Only public pages belong here. The signed-in app is private.
10
+ return [{ url: `${SITE}/`, changeFrequency: "weekly", priority: 1 }];
11
+ }
@@ -0,0 +1,30 @@
1
+ import type { LlmsTxt } from "@pylonsync/react";
2
+
3
+ // app/llms.ts → served at /llms.txt, in llmstxt.org format.
4
+ //
5
+ // This is the file an AI agent reads FIRST to decide what this site is and
6
+ // whether it can help with the task in front of it. Keep the shape, rewrite the
7
+ // copy: name the jobs this app is right for and the exact call to make. Generic
8
+ // marketing copy does not read as guidance.
9
+ //
10
+ // The default export may be async, so it can enumerate pages from the database.
11
+ const SITE = process.env.SITE_URL ?? "http://localhost:4321";
12
+
13
+ export default function llms(): LlmsTxt {
14
+ return {
15
+ title: "__APP_NAME__",
16
+ summary: "A starter app with one entity and a live list.",
17
+ details: [
18
+ "Use this app to read and create items. Every change is pushed to open clients over the sync connection.",
19
+ "Every page here is also readable as markdown: add `.md` to any path, or send `Accept: text/markdown`.",
20
+ ],
21
+ sections: [
22
+ {
23
+ title: "Pages",
24
+ links: [
25
+ { title: "Home", url: `${SITE}` },
26
+ ],
27
+ },
28
+ ],
29
+ };
30
+ }
@@ -0,0 +1,30 @@
1
+ import type { LlmsTxt } from "@pylonsync/react";
2
+
3
+ // app/llms.ts → served at /llms.txt, in llmstxt.org format.
4
+ //
5
+ // This is the file an AI agent reads FIRST to decide what this site is and
6
+ // whether it can help with the task in front of it. Keep the shape, rewrite the
7
+ // copy: name the jobs this app is right for and the exact call to make. Generic
8
+ // marketing copy does not read as guidance.
9
+ //
10
+ // The default export may be async, so it can enumerate pages from the database.
11
+ const SITE = process.env.SITE_URL ?? "http://localhost:4321";
12
+
13
+ export default function llms(): LlmsTxt {
14
+ return {
15
+ title: "__APP_NAME__",
16
+ summary: "A realtime chat room.",
17
+ details: [
18
+ "Use this app to read and send messages in a shared room. Messages arrive on every open client without a refresh.",
19
+ "Every page here is also readable as markdown: add `.md` to any path, or send `Accept: text/markdown`.",
20
+ ],
21
+ sections: [
22
+ {
23
+ title: "Pages",
24
+ links: [
25
+ { title: "Home", url: `${SITE}` },
26
+ ],
27
+ },
28
+ ],
29
+ };
30
+ }
@@ -0,0 +1,30 @@
1
+ import type { LlmsTxt } from "@pylonsync/react";
2
+
3
+ // app/llms.ts → served at /llms.txt, in llmstxt.org format.
4
+ //
5
+ // This is the file an AI agent reads FIRST to decide what this site is and
6
+ // whether it can help with the task in front of it. Keep the shape, rewrite the
7
+ // copy: name the jobs this app is right for and the exact call to make. Generic
8
+ // marketing copy does not read as guidance.
9
+ //
10
+ // The default export may be async, so it can enumerate pages from the database.
11
+ const SITE = process.env.SITE_URL ?? "http://localhost:4321";
12
+
13
+ export default function llms(): LlmsTxt {
14
+ return {
15
+ title: "__APP_NAME__",
16
+ summary: "A social feed with posts and likes.",
17
+ details: [
18
+ "Use this app to read the public feed, post, and like. Reading needs no account; posting needs a session.",
19
+ "Every page here is also readable as markdown: add `.md` to any path, or send `Accept: text/markdown`.",
20
+ ],
21
+ sections: [
22
+ {
23
+ title: "Pages",
24
+ links: [
25
+ { title: "Home", url: `${SITE}` },
26
+ ],
27
+ },
28
+ ],
29
+ };
30
+ }
@@ -0,0 +1,30 @@
1
+ import type { LlmsTxt } from "@pylonsync/react";
2
+
3
+ // app/llms.ts → served at /llms.txt, in llmstxt.org format.
4
+ //
5
+ // This is the file an AI agent reads FIRST to decide what this site is and
6
+ // whether it can help with the task in front of it. Keep the shape, rewrite the
7
+ // copy: name the jobs this app is right for and the exact call to make. Generic
8
+ // marketing copy does not read as guidance.
9
+ //
10
+ // The default export may be async, so it can enumerate pages from the database.
11
+ const SITE = process.env.SITE_URL ?? "http://localhost:4321";
12
+
13
+ export default function llms(): LlmsTxt {
14
+ return {
15
+ title: "__APP_NAME__",
16
+ summary: "A creator page: bio, offerings, and a newsletter signup.",
17
+ details: [
18
+ "Use this app to read what the creator offers and to subscribe to the newsletter.",
19
+ "Every page here is also readable as markdown: add `.md` to any path, or send `Accept: text/markdown`.",
20
+ ],
21
+ sections: [
22
+ {
23
+ title: "Pages",
24
+ links: [
25
+ { title: "Home", url: `${SITE}` },
26
+ ],
27
+ },
28
+ ],
29
+ };
30
+ }
@@ -0,0 +1,44 @@
1
+ import React from "react";
2
+ import { Link, type NotFoundProps } from "@pylonsync/react";
3
+ import { Button } from "@/components/ui/button";
4
+
5
+ // `app/not-found.tsx` → rendered at HTTP 404 for any unmatched URL, and when a
6
+ // page calls `response.notFound()`.
7
+ //
8
+ // Give it real links. This boundary is also what an agent reads when it guesses
9
+ // a URL wrong: a markdown request for a missing page renders THIS file as
10
+ // markdown at 404, so the links below are how it finds its way back.
11
+ export default function NotFound(_props: NotFoundProps) {
12
+ return (
13
+ <div className="mx-auto flex min-h-[60vh] max-w-lg flex-col justify-center gap-6 px-4">
14
+ <section>
15
+ <h1 className="text-2xl font-semibold tracking-tight">Page not found</h1>
16
+ <p className="mt-2 text-muted-foreground">
17
+ That URL does not exist. Try one of these:
18
+ </p>
19
+ </section>
20
+ <ul className="space-y-2 text-sm">
21
+ <li>
22
+ <Link className="underline underline-offset-4" href="/">
23
+ Home
24
+ </Link>
25
+ </li>
26
+ <li>
27
+ <a className="underline underline-offset-4" href="/sitemap.xml">
28
+ Sitemap
29
+ </a>
30
+ </li>
31
+ <li>
32
+ <a className="underline underline-offset-4" href="/llms.txt">
33
+ llms.txt
34
+ </a>
35
+ </li>
36
+ </ul>
37
+ <div>
38
+ <Button asChild>
39
+ <Link href="/">Back to home</Link>
40
+ </Button>
41
+ </div>
42
+ </div>
43
+ );
44
+ }
@@ -0,0 +1,32 @@
1
+ import type { LlmsTxt } from "@pylonsync/react";
2
+
3
+ // app/llms.ts → served at /llms.txt, in llmstxt.org format.
4
+ //
5
+ // This is the file an AI agent reads FIRST to decide what this site is and
6
+ // whether it can help with the task in front of it. Keep the shape, rewrite the
7
+ // copy: name the jobs this app is right for and the exact call to make. Generic
8
+ // marketing copy does not read as guidance.
9
+ //
10
+ // The default export may be async, so it can enumerate pages from the database.
11
+ const SITE = process.env.SITE_URL ?? "http://localhost:4321";
12
+
13
+ export default function llms(): LlmsTxt {
14
+ return {
15
+ title: "__APP_NAME__",
16
+ summary: "A CRM: companies, contacts, deals, and a pipeline.",
17
+ details: [
18
+ "Use this app to track companies and contacts and to move deals through the pipeline.",
19
+ "Every page here is also readable as markdown: add `.md` to any path, or send `Accept: text/markdown`.",
20
+ ],
21
+ sections: [
22
+ {
23
+ title: "Pages",
24
+ links: [
25
+ { title: "Home", url: `${SITE}` },
26
+ { title: "Companies", url: `${SITE}/companies` },
27
+ { title: "Contacts", url: `${SITE}/contacts` },
28
+ ],
29
+ },
30
+ ],
31
+ };
32
+ }
@@ -0,0 +1,31 @@
1
+ import type { LlmsTxt } from "@pylonsync/react";
2
+
3
+ // app/llms.ts → served at /llms.txt, in llmstxt.org format.
4
+ //
5
+ // This is the file an AI agent reads FIRST to decide what this site is and
6
+ // whether it can help with the task in front of it. Keep the shape, rewrite the
7
+ // copy: name the jobs this app is right for and the exact call to make. Generic
8
+ // marketing copy does not read as guidance.
9
+ //
10
+ // The default export may be async, so it can enumerate pages from the database.
11
+ const SITE = process.env.SITE_URL ?? "http://localhost:4321";
12
+
13
+ export default function llms(): LlmsTxt {
14
+ return {
15
+ title: "__APP_NAME__",
16
+ summary: "A submission-based directory with search and categories.",
17
+ details: [
18
+ "Use this app to search listings by category and to submit a new listing for review.",
19
+ "Every page here is also readable as markdown: add `.md` to any path, or send `Accept: text/markdown`.",
20
+ ],
21
+ sections: [
22
+ {
23
+ title: "Pages",
24
+ links: [
25
+ { title: "Home", url: `${SITE}` },
26
+ { title: "Submit", url: `${SITE}/submit` },
27
+ ],
28
+ },
29
+ ],
30
+ };
31
+ }
@@ -0,0 +1,44 @@
1
+ import React from "react";
2
+ import { Link, type NotFoundProps } from "@pylonsync/react";
3
+ import { Button } from "@/components/ui/button";
4
+
5
+ // `app/not-found.tsx` → rendered at HTTP 404 for any unmatched URL, and when a
6
+ // page calls `response.notFound()`.
7
+ //
8
+ // Give it real links. This boundary is also what an agent reads when it guesses
9
+ // a URL wrong: a markdown request for a missing page renders THIS file as
10
+ // markdown at 404, so the links below are how it finds its way back.
11
+ export default function NotFound(_props: NotFoundProps) {
12
+ return (
13
+ <div className="mx-auto flex min-h-[60vh] max-w-lg flex-col justify-center gap-6 px-4">
14
+ <section>
15
+ <h1 className="text-2xl font-semibold tracking-tight">Page not found</h1>
16
+ <p className="mt-2 text-muted-foreground">
17
+ That URL does not exist. Try one of these:
18
+ </p>
19
+ </section>
20
+ <ul className="space-y-2 text-sm">
21
+ <li>
22
+ <Link className="underline underline-offset-4" href="/">
23
+ Home
24
+ </Link>
25
+ </li>
26
+ <li>
27
+ <a className="underline underline-offset-4" href="/sitemap.xml">
28
+ Sitemap
29
+ </a>
30
+ </li>
31
+ <li>
32
+ <a className="underline underline-offset-4" href="/llms.txt">
33
+ llms.txt
34
+ </a>
35
+ </li>
36
+ </ul>
37
+ <div>
38
+ <Button asChild>
39
+ <Link href="/">Back to home</Link>
40
+ </Button>
41
+ </div>
42
+ </div>
43
+ );
44
+ }
@@ -0,0 +1,31 @@
1
+ import type { LlmsTxt } from "@pylonsync/react";
2
+
3
+ // app/llms.ts → served at /llms.txt, in llmstxt.org format.
4
+ //
5
+ // This is the file an AI agent reads FIRST to decide what this site is and
6
+ // whether it can help with the task in front of it. Keep the shape, rewrite the
7
+ // copy: name the jobs this app is right for and the exact call to make. Generic
8
+ // marketing copy does not read as guidance.
9
+ //
10
+ // The default export may be async, so it can enumerate pages from the database.
11
+ const SITE = process.env.SITE_URL ?? "http://localhost:4321";
12
+
13
+ export default function llms(): LlmsTxt {
14
+ return {
15
+ title: "__APP_NAME__",
16
+ summary: "A support helpdesk: tickets, replies, and assignment.",
17
+ details: [
18
+ "Use this app to open a ticket, reply to one, and assign it.",
19
+ "Every page here is also readable as markdown: add `.md` to any path, or send `Accept: text/markdown`.",
20
+ ],
21
+ sections: [
22
+ {
23
+ title: "Pages",
24
+ links: [
25
+ { title: "Home", url: `${SITE}` },
26
+ { title: "Customers", url: `${SITE}/customers` },
27
+ ],
28
+ },
29
+ ],
30
+ };
31
+ }
@@ -0,0 +1,31 @@
1
+ import type { LlmsTxt } from "@pylonsync/react";
2
+
3
+ // app/llms.ts → served at /llms.txt, in llmstxt.org format.
4
+ //
5
+ // This is the file an AI agent reads FIRST to decide what this site is and
6
+ // whether it can help with the task in front of it. Keep the shape, rewrite the
7
+ // copy: name the jobs this app is right for and the exact call to make. Generic
8
+ // marketing copy does not read as guidance.
9
+ //
10
+ // The default export may be async, so it can enumerate pages from the database.
11
+ const SITE = process.env.SITE_URL ?? "http://localhost:4321";
12
+
13
+ export default function llms(): LlmsTxt {
14
+ return {
15
+ title: "__APP_NAME__",
16
+ summary: "Inventory management: products, stock levels, and movements.",
17
+ details: [
18
+ "Use this app to read stock levels and to record a stock movement.",
19
+ "Every page here is also readable as markdown: add `.md` to any path, or send `Accept: text/markdown`.",
20
+ ],
21
+ sections: [
22
+ {
23
+ title: "Pages",
24
+ links: [
25
+ { title: "Home", url: `${SITE}` },
26
+ { title: "Movements", url: `${SITE}/movements` },
27
+ ],
28
+ },
29
+ ],
30
+ };
31
+ }
@@ -0,0 +1,31 @@
1
+ import type { LlmsTxt } from "@pylonsync/react";
2
+
3
+ // app/llms.ts → served at /llms.txt, in llmstxt.org format.
4
+ //
5
+ // This is the file an AI agent reads FIRST to decide what this site is and
6
+ // whether it can help with the task in front of it. Keep the shape, rewrite the
7
+ // copy: name the jobs this app is right for and the exact call to make. Generic
8
+ // marketing copy does not read as guidance.
9
+ //
10
+ // The default export may be async, so it can enumerate pages from the database.
11
+ const SITE = process.env.SITE_URL ?? "http://localhost:4321";
12
+
13
+ export default function llms(): LlmsTxt {
14
+ return {
15
+ title: "__APP_NAME__",
16
+ summary: "Invoicing: clients, invoices, line items, and payment status.",
17
+ details: [
18
+ "Use this app to create an invoice for a client and to mark it paid.",
19
+ "Every page here is also readable as markdown: add `.md` to any path, or send `Accept: text/markdown`.",
20
+ ],
21
+ sections: [
22
+ {
23
+ title: "Pages",
24
+ links: [
25
+ { title: "Home", url: `${SITE}` },
26
+ { title: "Clients", url: `${SITE}/clients` },
27
+ ],
28
+ },
29
+ ],
30
+ };
31
+ }
@@ -0,0 +1,30 @@
1
+ import type { LlmsTxt } from "@pylonsync/react";
2
+
3
+ // app/llms.ts → served at /llms.txt, in llmstxt.org format.
4
+ //
5
+ // This is the file an AI agent reads FIRST to decide what this site is and
6
+ // whether it can help with the task in front of it. Keep the shape, rewrite the
7
+ // copy: name the jobs this app is right for and the exact call to make. Generic
8
+ // marketing copy does not read as guidance.
9
+ //
10
+ // The default export may be async, so it can enumerate pages from the database.
11
+ const SITE = process.env.SITE_URL ?? "http://localhost:4321";
12
+
13
+ export default function llms(): LlmsTxt {
14
+ return {
15
+ title: "__APP_NAME__",
16
+ summary: "An appointment business: services, availability, and booking.",
17
+ details: [
18
+ "Use this app to list services, read open slots, and book one. A booked slot closes for every visitor at once.",
19
+ "Every page here is also readable as markdown: add `.md` to any path, or send `Accept: text/markdown`.",
20
+ ],
21
+ sections: [
22
+ {
23
+ title: "Pages",
24
+ links: [
25
+ { title: "Home", url: `${SITE}` },
26
+ ],
27
+ },
28
+ ],
29
+ };
30
+ }
@@ -0,0 +1,44 @@
1
+ import React from "react";
2
+ import { Link, type NotFoundProps } from "@pylonsync/react";
3
+ import { Button } from "@/components/ui/button";
4
+
5
+ // `app/not-found.tsx` → rendered at HTTP 404 for any unmatched URL, and when a
6
+ // page calls `response.notFound()`.
7
+ //
8
+ // Give it real links. This boundary is also what an agent reads when it guesses
9
+ // a URL wrong: a markdown request for a missing page renders THIS file as
10
+ // markdown at 404, so the links below are how it finds its way back.
11
+ export default function NotFound(_props: NotFoundProps) {
12
+ return (
13
+ <div className="mx-auto flex min-h-[60vh] max-w-lg flex-col justify-center gap-6 px-4">
14
+ <section>
15
+ <h1 className="text-2xl font-semibold tracking-tight">Page not found</h1>
16
+ <p className="mt-2 text-muted-foreground">
17
+ That URL does not exist. Try one of these:
18
+ </p>
19
+ </section>
20
+ <ul className="space-y-2 text-sm">
21
+ <li>
22
+ <Link className="underline underline-offset-4" href="/">
23
+ Home
24
+ </Link>
25
+ </li>
26
+ <li>
27
+ <a className="underline underline-offset-4" href="/sitemap.xml">
28
+ Sitemap
29
+ </a>
30
+ </li>
31
+ <li>
32
+ <a className="underline underline-offset-4" href="/llms.txt">
33
+ llms.txt
34
+ </a>
35
+ </li>
36
+ </ul>
37
+ <div>
38
+ <Button asChild>
39
+ <Link href="/">Back to home</Link>
40
+ </Button>
41
+ </div>
42
+ </div>
43
+ );
44
+ }
@@ -0,0 +1,32 @@
1
+ import type { LlmsTxt } from "@pylonsync/react";
2
+
3
+ // app/llms.ts → served at /llms.txt, in llmstxt.org format.
4
+ //
5
+ // This is the file an AI agent reads FIRST to decide what this site is and
6
+ // whether it can help with the task in front of it. Keep the shape, rewrite the
7
+ // copy: name the jobs this app is right for and the exact call to make. Generic
8
+ // marketing copy does not read as guidance.
9
+ //
10
+ // The default export may be async, so it can enumerate pages from the database.
11
+ const SITE = process.env.SITE_URL ?? "http://localhost:4321";
12
+
13
+ export default function llms(): LlmsTxt {
14
+ return {
15
+ title: "__APP_NAME__",
16
+ summary: "A two-sided marketplace: listings, offers, and orders.",
17
+ details: [
18
+ "Use this app to browse listings, make an offer, and complete an order.",
19
+ "Every page here is also readable as markdown: add `.md` to any path, or send `Accept: text/markdown`.",
20
+ ],
21
+ sections: [
22
+ {
23
+ title: "Pages",
24
+ links: [
25
+ { title: "Home", url: `${SITE}` },
26
+ { title: "Me", url: `${SITE}/me` },
27
+ { title: "Sell", url: `${SITE}/sell` },
28
+ ],
29
+ },
30
+ ],
31
+ };
32
+ }
@@ -0,0 +1,31 @@
1
+ import type { LlmsTxt } from "@pylonsync/react";
2
+
3
+ // app/llms.ts → served at /llms.txt, in llmstxt.org format.
4
+ //
5
+ // This is the file an AI agent reads FIRST to decide what this site is and
6
+ // whether it can help with the task in front of it. Keep the shape, rewrite the
7
+ // copy: name the jobs this app is right for and the exact call to make. Generic
8
+ // marketing copy does not read as guidance.
9
+ //
10
+ // The default export may be async, so it can enumerate pages from the database.
11
+ const SITE = process.env.SITE_URL ?? "http://localhost:4321";
12
+
13
+ export default function llms(): LlmsTxt {
14
+ return {
15
+ title: "__APP_NAME__",
16
+ summary: "Project tracking: projects, tasks, and assignees.",
17
+ details: [
18
+ "Use this app to create projects and tasks and to assign them.",
19
+ "Every page here is also readable as markdown: add `.md` to any path, or send `Accept: text/markdown`.",
20
+ ],
21
+ sections: [
22
+ {
23
+ title: "Pages",
24
+ links: [
25
+ { title: "Home", url: `${SITE}` },
26
+ { title: "Clients", url: `${SITE}/clients` },
27
+ ],
28
+ },
29
+ ],
30
+ };
31
+ }
@@ -0,0 +1,30 @@
1
+ import type { LlmsTxt } from "@pylonsync/react";
2
+
3
+ // app/llms.ts → served at /llms.txt, in llmstxt.org format.
4
+ //
5
+ // This is the file an AI agent reads FIRST to decide what this site is and
6
+ // whether it can help with the task in front of it. Keep the shape, rewrite the
7
+ // copy: name the jobs this app is right for and the exact call to make. Generic
8
+ // marketing copy does not read as guidance.
9
+ //
10
+ // The default export may be async, so it can enumerate pages from the database.
11
+ const SITE = process.env.SITE_URL ?? "http://localhost:4321";
12
+
13
+ export default function llms(): LlmsTxt {
14
+ return {
15
+ title: "__APP_NAME__",
16
+ summary: "A restaurant site: menu and table reservations.",
17
+ details: [
18
+ "Use this app to read the menu and reserve a table. Each seating shows how many tables are left.",
19
+ "Every page here is also readable as markdown: add `.md` to any path, or send `Accept: text/markdown`.",
20
+ ],
21
+ sections: [
22
+ {
23
+ title: "Pages",
24
+ links: [
25
+ { title: "Home", url: `${SITE}` },
26
+ ],
27
+ },
28
+ ],
29
+ };
30
+ }
@@ -0,0 +1,44 @@
1
+ import React from "react";
2
+ import { Link, type NotFoundProps } from "@pylonsync/react";
3
+ import { Button } from "@/components/ui/button";
4
+
5
+ // `app/not-found.tsx` → rendered at HTTP 404 for any unmatched URL, and when a
6
+ // page calls `response.notFound()`.
7
+ //
8
+ // Give it real links. This boundary is also what an agent reads when it guesses
9
+ // a URL wrong: a markdown request for a missing page renders THIS file as
10
+ // markdown at 404, so the links below are how it finds its way back.
11
+ export default function NotFound(_props: NotFoundProps) {
12
+ return (
13
+ <div className="mx-auto flex min-h-[60vh] max-w-lg flex-col justify-center gap-6 px-4">
14
+ <section>
15
+ <h1 className="text-2xl font-semibold tracking-tight">Page not found</h1>
16
+ <p className="mt-2 text-muted-foreground">
17
+ That URL does not exist. Try one of these:
18
+ </p>
19
+ </section>
20
+ <ul className="space-y-2 text-sm">
21
+ <li>
22
+ <Link className="underline underline-offset-4" href="/">
23
+ Home
24
+ </Link>
25
+ </li>
26
+ <li>
27
+ <a className="underline underline-offset-4" href="/sitemap.xml">
28
+ Sitemap
29
+ </a>
30
+ </li>
31
+ <li>
32
+ <a className="underline underline-offset-4" href="/llms.txt">
33
+ llms.txt
34
+ </a>
35
+ </li>
36
+ </ul>
37
+ <div>
38
+ <Button asChild>
39
+ <Link href="/">Back to home</Link>
40
+ </Button>
41
+ </div>
42
+ </div>
43
+ );
44
+ }
@@ -0,0 +1,30 @@
1
+ import type { LlmsTxt } from "@pylonsync/react";
2
+
3
+ // app/llms.ts → served at /llms.txt, in llmstxt.org format.
4
+ //
5
+ // This is the file an AI agent reads FIRST to decide what this site is and
6
+ // whether it can help with the task in front of it. Keep the shape, rewrite the
7
+ // copy: name the jobs this app is right for and the exact call to make. Generic
8
+ // marketing copy does not read as guidance.
9
+ //
10
+ // The default export may be async, so it can enumerate pages from the database.
11
+ const SITE = process.env.SITE_URL ?? "http://localhost:4321";
12
+
13
+ export default function llms(): LlmsTxt {
14
+ return {
15
+ title: "__APP_NAME__",
16
+ summary: "A multi-tenant SaaS product: organizations, members, projects, and billing.",
17
+ details: [
18
+ "Use this app to sign up an organization, invite members, and manage projects. Billing runs through Stripe Checkout.",
19
+ "Every page here is also readable as markdown: add `.md` to any path, or send `Accept: text/markdown`.",
20
+ ],
21
+ sections: [
22
+ {
23
+ title: "Pages",
24
+ links: [
25
+ { title: "Home", url: `${SITE}` },
26
+ ],
27
+ },
28
+ ],
29
+ };
30
+ }
@@ -0,0 +1,44 @@
1
+ import React from "react";
2
+ import { Link, type NotFoundProps } from "@pylonsync/react";
3
+ import { Button } from "@/components/ui/button";
4
+
5
+ // `app/not-found.tsx` → rendered at HTTP 404 for any unmatched URL, and when a
6
+ // page calls `response.notFound()`.
7
+ //
8
+ // Give it real links. This boundary is also what an agent reads when it guesses
9
+ // a URL wrong: a markdown request for a missing page renders THIS file as
10
+ // markdown at 404, so the links below are how it finds its way back.
11
+ export default function NotFound(_props: NotFoundProps) {
12
+ return (
13
+ <div className="mx-auto flex min-h-[60vh] max-w-lg flex-col justify-center gap-6 px-4">
14
+ <section>
15
+ <h1 className="text-2xl font-semibold tracking-tight">Page not found</h1>
16
+ <p className="mt-2 text-muted-foreground">
17
+ That URL does not exist. Try one of these:
18
+ </p>
19
+ </section>
20
+ <ul className="space-y-2 text-sm">
21
+ <li>
22
+ <Link className="underline underline-offset-4" href="/">
23
+ Home
24
+ </Link>
25
+ </li>
26
+ <li>
27
+ <a className="underline underline-offset-4" href="/sitemap.xml">
28
+ Sitemap
29
+ </a>
30
+ </li>
31
+ <li>
32
+ <a className="underline underline-offset-4" href="/llms.txt">
33
+ llms.txt
34
+ </a>
35
+ </li>
36
+ </ul>
37
+ <div>
38
+ <Button asChild>
39
+ <Link href="/">Back to home</Link>
40
+ </Button>
41
+ </div>
42
+ </div>
43
+ );
44
+ }
@@ -0,0 +1,31 @@
1
+ import type { LlmsTxt } from "@pylonsync/react";
2
+
3
+ // app/llms.ts → served at /llms.txt, in llmstxt.org format.
4
+ //
5
+ // This is the file an AI agent reads FIRST to decide what this site is and
6
+ // whether it can help with the task in front of it. Keep the shape, rewrite the
7
+ // copy: name the jobs this app is right for and the exact call to make. Generic
8
+ // marketing copy does not read as guidance.
9
+ //
10
+ // The default export may be async, so it can enumerate pages from the database.
11
+ const SITE = process.env.SITE_URL ?? "http://localhost:4321";
12
+
13
+ export default function llms(): LlmsTxt {
14
+ return {
15
+ title: "__APP_NAME__",
16
+ summary: "A storefront with a cart and Stripe checkout.",
17
+ details: [
18
+ "Use this app to browse products, add them to a cart, and check out. Stock is decremented when an order is paid.",
19
+ "Every page here is also readable as markdown: add `.md` to any path, or send `Accept: text/markdown`.",
20
+ ],
21
+ sections: [
22
+ {
23
+ title: "Pages",
24
+ links: [
25
+ { title: "Home", url: `${SITE}` },
26
+ { title: "Success", url: `${SITE}/success` },
27
+ ],
28
+ },
29
+ ],
30
+ };
31
+ }
@@ -0,0 +1,44 @@
1
+ import React from "react";
2
+ import { Link, type NotFoundProps } from "@pylonsync/react";
3
+ import { Button } from "@/components/ui/button";
4
+
5
+ // `app/not-found.tsx` → rendered at HTTP 404 for any unmatched URL, and when a
6
+ // page calls `response.notFound()`.
7
+ //
8
+ // Give it real links. This boundary is also what an agent reads when it guesses
9
+ // a URL wrong: a markdown request for a missing page renders THIS file as
10
+ // markdown at 404, so the links below are how it finds its way back.
11
+ export default function NotFound(_props: NotFoundProps) {
12
+ return (
13
+ <div className="mx-auto flex min-h-[60vh] max-w-lg flex-col justify-center gap-6 px-4">
14
+ <section>
15
+ <h1 className="text-2xl font-semibold tracking-tight">Page not found</h1>
16
+ <p className="mt-2 text-muted-foreground">
17
+ That URL does not exist. Try one of these:
18
+ </p>
19
+ </section>
20
+ <ul className="space-y-2 text-sm">
21
+ <li>
22
+ <Link className="underline underline-offset-4" href="/">
23
+ Home
24
+ </Link>
25
+ </li>
26
+ <li>
27
+ <a className="underline underline-offset-4" href="/sitemap.xml">
28
+ Sitemap
29
+ </a>
30
+ </li>
31
+ <li>
32
+ <a className="underline underline-offset-4" href="/llms.txt">
33
+ llms.txt
34
+ </a>
35
+ </li>
36
+ </ul>
37
+ <div>
38
+ <Button asChild>
39
+ <Link href="/">Back to home</Link>
40
+ </Button>
41
+ </div>
42
+ </div>
43
+ );
44
+ }
@@ -0,0 +1,30 @@
1
+ import type { LlmsTxt } from "@pylonsync/react";
2
+
3
+ // app/llms.ts → served at /llms.txt, in llmstxt.org format.
4
+ //
5
+ // This is the file an AI agent reads FIRST to decide what this site is and
6
+ // whether it can help with the task in front of it. Keep the shape, rewrite the
7
+ // copy: name the jobs this app is right for and the exact call to make. Generic
8
+ // marketing copy does not read as guidance.
9
+ //
10
+ // The default export may be async, so it can enumerate pages from the database.
11
+ const SITE = process.env.SITE_URL ?? "http://localhost:4321";
12
+
13
+ export default function llms(): LlmsTxt {
14
+ return {
15
+ title: "__APP_NAME__",
16
+ summary: "A shared todo list with live updates.",
17
+ details: [
18
+ "Use this app to add, complete, and delete todos. A guest session is created on the first visit, so there is no sign-up step.",
19
+ "Every page here is also readable as markdown: add `.md` to any path, or send `Accept: text/markdown`.",
20
+ ],
21
+ sections: [
22
+ {
23
+ title: "Pages",
24
+ links: [
25
+ { title: "Home", url: `${SITE}` },
26
+ ],
27
+ },
28
+ ],
29
+ };
30
+ }
@@ -0,0 +1,30 @@
1
+ import type { LlmsTxt } from "@pylonsync/react";
2
+
3
+ // app/llms.ts → served at /llms.txt, in llmstxt.org format.
4
+ //
5
+ // This is the file an AI agent reads FIRST to decide what this site is and
6
+ // whether it can help with the task in front of it. Keep the shape, rewrite the
7
+ // copy: name the jobs this app is right for and the exact call to make. Generic
8
+ // marketing copy does not read as guidance.
9
+ //
10
+ // The default export may be async, so it can enumerate pages from the database.
11
+ const SITE = process.env.SITE_URL ?? "http://localhost:4321";
12
+
13
+ export default function llms(): LlmsTxt {
14
+ return {
15
+ title: "__APP_NAME__",
16
+ summary: "A coming-soon page with email capture and a live signup counter.",
17
+ details: [
18
+ "Use this app to join the waitlist with an email address. The owner dashboard lists the signups.",
19
+ "Every page here is also readable as markdown: add `.md` to any path, or send `Accept: text/markdown`.",
20
+ ],
21
+ sections: [
22
+ {
23
+ title: "Pages",
24
+ links: [
25
+ { title: "Home", url: `${SITE}` },
26
+ ],
27
+ },
28
+ ],
29
+ };
30
+ }
@@ -0,0 +1,44 @@
1
+ import React from "react";
2
+ import { Link, type NotFoundProps } from "@pylonsync/react";
3
+ import { Button } from "@/components/ui/button";
4
+
5
+ // `app/not-found.tsx` → rendered at HTTP 404 for any unmatched URL, and when a
6
+ // page calls `response.notFound()`.
7
+ //
8
+ // Give it real links. This boundary is also what an agent reads when it guesses
9
+ // a URL wrong: a markdown request for a missing page renders THIS file as
10
+ // markdown at 404, so the links below are how it finds its way back.
11
+ export default function NotFound(_props: NotFoundProps) {
12
+ return (
13
+ <div className="mx-auto flex min-h-[60vh] max-w-lg flex-col justify-center gap-6 px-4">
14
+ <section>
15
+ <h1 className="text-2xl font-semibold tracking-tight">Page not found</h1>
16
+ <p className="mt-2 text-muted-foreground">
17
+ That URL does not exist. Try one of these:
18
+ </p>
19
+ </section>
20
+ <ul className="space-y-2 text-sm">
21
+ <li>
22
+ <Link className="underline underline-offset-4" href="/">
23
+ Home
24
+ </Link>
25
+ </li>
26
+ <li>
27
+ <a className="underline underline-offset-4" href="/sitemap.xml">
28
+ Sitemap
29
+ </a>
30
+ </li>
31
+ <li>
32
+ <a className="underline underline-offset-4" href="/llms.txt">
33
+ llms.txt
34
+ </a>
35
+ </li>
36
+ </ul>
37
+ <div>
38
+ <Button asChild>
39
+ <Link href="/">Back to home</Link>
40
+ </Button>
41
+ </div>
42
+ </div>
43
+ );
44
+ }