create-next-mdx-blog-app 2.1.10 → 2.2.1
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.
- package/README.md +8 -2
- package/package.json +89 -87
package/README.md
CHANGED
|
@@ -61,7 +61,7 @@ npx create-next-mdx-blog-app .
|
|
|
61
61
|
### Package Information
|
|
62
62
|
|
|
63
63
|
- **Package Name**: `create-next-mdx-blog-app`
|
|
64
|
-
- **Version**: `2.1
|
|
64
|
+
- **Version**: `2.2.1`
|
|
65
65
|
- **License**: MIT
|
|
66
66
|
- **Homepage**: [https://www.npmjs.com/package/create-next-mdx-blog-app](https://www.npmjs.com/package/create-next-mdx-blog-app/)
|
|
67
67
|
|
|
@@ -81,7 +81,7 @@ npx create-next-mdx-blog-app .
|
|
|
81
81
|
- **react-syntax-highlighter**: A library for syntax highlighting in React applications, making code snippets more readable.
|
|
82
82
|
- **tsx**: Run TypeScript code without worrying about configuration! Run the `article-manager.ts` for manually working with published articles.
|
|
83
83
|
- **@codesandbox/sandpack-react**: Powers the in-browser JavaScript/TypeScript code execution environment, running code entirely client-side with no server required.
|
|
84
|
-
- **ai** (Vercel AI SDK): Provides streaming AI response primitives and transport utilities (`TextStreamChatTransport`, `streamText`, tool support)
|
|
84
|
+
- **ai** (Vercel AI SDK): Provides streaming AI response primitives and transport utilities (`TextStreamChatTransport`, `streamText`, tool support) used by both the interactive chatbot and the AI article summarizer.
|
|
85
85
|
- **@ai-sdk/anthropic**: Anthropic provider for the Vercel AI SDK, used to connect to Claude models.
|
|
86
86
|
- **@ai-sdk/react**: React hooks (`useChat`) for building streaming AI chat interfaces.
|
|
87
87
|
- **zod**: TypeScript-first schema validation library used to define and validate AI tool parameters.
|
|
@@ -219,6 +219,12 @@ The project includes an interactive AI-powered chatbot optimised for readers of
|
|
|
219
219
|
### API Route
|
|
220
220
|
`src/app/api/chat/route.ts` — Next.js edge route. Accepts the `UIMessages` array, converts it to `CoreMessages` via `convertToModelMessages`, streams a response using `streamText` with the three blog tools, and returns `result.toTextStreamResponse()`.
|
|
221
221
|
|
|
222
|
+
## ✨ AI Article Summarizer
|
|
223
|
+
A **Generate TL;DR** button above every dynamic article streams a short Claude Haiku summary into a collapsible green panel. The slug is the only thing sent over the wire — `src/app/api/summarize/[slug]/route.ts` (edge) fetches the article server-side, applies an origin allow-list (`NEXT_PUBLIC_SITE_URL`) + per-IP rate limit (10/min) + 1-hour in-memory cache, then calls `streamText` and writes the final text to cache via `after()`. The client (`src/components/ArticleSummarizer.tsx`) uses `AbortController` to cancel in-flight requests on close/unmount. Model and prompt live in `src/utils/constants/AiSummaryConfig.ts`.
|
|
224
|
+
|
|
225
|
+
## 👥 Author Profile Pages
|
|
226
|
+
A `/authors` index lists every distinct contributor pulled from the Supabase `Article` table, with per-author profile routes at `/authors/[slug]` showing their bio, avatar, and every article they've published.
|
|
227
|
+
|
|
222
228
|
## 📬 Newsletter Subscription
|
|
223
229
|
The project ships with an integrated **newsletter signup form** powered by [Resend](https://resend.com). Visitors can subscribe from the home page or from the bottom of any article; new subscribers are added to a Resend **Audience** and immediately receive a welcome email.
|
|
224
230
|
|
package/package.json
CHANGED
|
@@ -1,87 +1,89 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "create-next-mdx-blog-app",
|
|
3
|
-
"version": "2.1
|
|
4
|
-
"description": "A production-ready technical blog starter kit built with Next.js, MDX, Supabase, and TypeScript.",
|
|
5
|
-
"author": {
|
|
6
|
-
"name": "Abdullah Muhammad",
|
|
7
|
-
"url": "https://github.com/CodingAbdullah"
|
|
8
|
-
},
|
|
9
|
-
"files": [
|
|
10
|
-
"bin/"
|
|
11
|
-
],
|
|
12
|
-
"bin": {
|
|
13
|
-
"create-next-mdx-blog-app": "./bin/create.js"
|
|
14
|
-
},
|
|
15
|
-
"engines": {
|
|
16
|
-
"node": ">=18.17.0"
|
|
17
|
-
},
|
|
18
|
-
"homepage": "https://next-mdx-blog-starter-sigma.vercel.app/",
|
|
19
|
-
"repository": {
|
|
20
|
-
"type": "git",
|
|
21
|
-
"url": "git+https://github.com/CodingAbdullah/Next-MDX-Blog-Starter.git"
|
|
22
|
-
},
|
|
23
|
-
"keywords": [
|
|
24
|
-
"aws",
|
|
25
|
-
"docker",
|
|
26
|
-
"javascript",
|
|
27
|
-
"jsx",
|
|
28
|
-
"mdx",
|
|
29
|
-
"next",
|
|
30
|
-
"react",
|
|
31
|
-
"sql",
|
|
32
|
-
"supabase",
|
|
33
|
-
"typescript"
|
|
34
|
-
],
|
|
35
|
-
"license": "MIT",
|
|
36
|
-
"scripts": {
|
|
37
|
-
"dev": "next dev",
|
|
38
|
-
"build": "next build",
|
|
39
|
-
"start": "next start",
|
|
40
|
-
"lint": "next lint"
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
"
|
|
45
|
-
"
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
"@ai-sdk/
|
|
50
|
-
"@
|
|
51
|
-
"@
|
|
52
|
-
"@
|
|
53
|
-
"@mdx-js/
|
|
54
|
-
"@
|
|
55
|
-
"@
|
|
56
|
-
"@radix-ui/react-
|
|
57
|
-
"@
|
|
58
|
-
"@
|
|
59
|
-
"@
|
|
60
|
-
"@types/
|
|
61
|
-
"@types/
|
|
62
|
-
"@types/react
|
|
63
|
-
"@types/react-
|
|
64
|
-
"@
|
|
65
|
-
"
|
|
66
|
-
"
|
|
67
|
-
"
|
|
68
|
-
"
|
|
69
|
-
"eslint
|
|
70
|
-
"
|
|
71
|
-
"
|
|
72
|
-
"
|
|
73
|
-
"next
|
|
74
|
-
"next-
|
|
75
|
-
"
|
|
76
|
-
"react
|
|
77
|
-
"react-
|
|
78
|
-
"
|
|
79
|
-
"
|
|
80
|
-
"
|
|
81
|
-
"
|
|
82
|
-
"
|
|
83
|
-
"
|
|
84
|
-
"
|
|
85
|
-
"
|
|
86
|
-
|
|
87
|
-
|
|
1
|
+
{
|
|
2
|
+
"name": "create-next-mdx-blog-app",
|
|
3
|
+
"version": "2.2.1",
|
|
4
|
+
"description": "A production-ready technical blog starter kit built with Next.js, MDX, Supabase, and TypeScript.",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "Abdullah Muhammad",
|
|
7
|
+
"url": "https://github.com/CodingAbdullah"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"bin/"
|
|
11
|
+
],
|
|
12
|
+
"bin": {
|
|
13
|
+
"create-next-mdx-blog-app": "./bin/create.js"
|
|
14
|
+
},
|
|
15
|
+
"engines": {
|
|
16
|
+
"node": ">=18.17.0"
|
|
17
|
+
},
|
|
18
|
+
"homepage": "https://next-mdx-blog-starter-sigma.vercel.app/",
|
|
19
|
+
"repository": {
|
|
20
|
+
"type": "git",
|
|
21
|
+
"url": "git+https://github.com/CodingAbdullah/Next-MDX-Blog-Starter.git"
|
|
22
|
+
},
|
|
23
|
+
"keywords": [
|
|
24
|
+
"aws",
|
|
25
|
+
"docker",
|
|
26
|
+
"javascript",
|
|
27
|
+
"jsx",
|
|
28
|
+
"mdx",
|
|
29
|
+
"next",
|
|
30
|
+
"react",
|
|
31
|
+
"sql",
|
|
32
|
+
"supabase",
|
|
33
|
+
"typescript"
|
|
34
|
+
],
|
|
35
|
+
"license": "MIT",
|
|
36
|
+
"scripts": {
|
|
37
|
+
"dev": "next dev",
|
|
38
|
+
"build": "next build",
|
|
39
|
+
"start": "next start",
|
|
40
|
+
"lint": "next lint",
|
|
41
|
+
"doctor": "npx react-doctor@latest"
|
|
42
|
+
},
|
|
43
|
+
"dependencies": {
|
|
44
|
+
"@inquirer/prompts": "^8.4.3",
|
|
45
|
+
"degit": "^3.0.0",
|
|
46
|
+
"execa": "^9.6.1"
|
|
47
|
+
},
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"@ai-sdk/anthropic": "^3.0.78",
|
|
50
|
+
"@ai-sdk/react": "^3.0.192",
|
|
51
|
+
"@codesandbox/sandpack-react": "^2.20.0",
|
|
52
|
+
"@eslint/eslintrc": "^3",
|
|
53
|
+
"@mdx-js/loader": "^3.1.1",
|
|
54
|
+
"@mdx-js/react": "^3.1.1",
|
|
55
|
+
"@next/mdx": "^16.2.6",
|
|
56
|
+
"@radix-ui/react-avatar": "^1.1.11",
|
|
57
|
+
"@radix-ui/react-slot": "^1.2.4",
|
|
58
|
+
"@supabase/supabase-js": "^2.106.1",
|
|
59
|
+
"@tailwindcss/postcss": "^4",
|
|
60
|
+
"@types/mdx": "^2.0.13",
|
|
61
|
+
"@types/node": "^25.9.1",
|
|
62
|
+
"@types/react": "^19",
|
|
63
|
+
"@types/react-dom": "^19",
|
|
64
|
+
"@types/react-syntax-highlighter": "^15.5.13",
|
|
65
|
+
"@vercel/analytics": "^2.0.1",
|
|
66
|
+
"ai": "^6.0.190",
|
|
67
|
+
"class-variance-authority": "^0.7.1",
|
|
68
|
+
"clsx": "^2.1.1",
|
|
69
|
+
"eslint": "^10",
|
|
70
|
+
"eslint-config-next": "16.2.6",
|
|
71
|
+
"gray-matter": "^4.0.3",
|
|
72
|
+
"lucide-react": "^1.16.0",
|
|
73
|
+
"next": "^16.2.6",
|
|
74
|
+
"next-mdx-remote": "^6.0.0",
|
|
75
|
+
"next-themes": "^0.4.6",
|
|
76
|
+
"react": "^19.2.6",
|
|
77
|
+
"react-doctor": "^0.2.14",
|
|
78
|
+
"react-dom": "^19.2.6",
|
|
79
|
+
"react-syntax-highlighter": "^16.1.1",
|
|
80
|
+
"resend": "^6.12.3",
|
|
81
|
+
"sonner": "^2.0.7",
|
|
82
|
+
"tailwind-merge": "^3.6.0",
|
|
83
|
+
"tailwindcss": "^4",
|
|
84
|
+
"tsx": "^4.22.3",
|
|
85
|
+
"tw-animate-css": "^1.4.0",
|
|
86
|
+
"typescript": "6.0.3",
|
|
87
|
+
"zod": "^4.4.3"
|
|
88
|
+
}
|
|
89
|
+
}
|