update readme
This commit is contained in:
		
							
								
								
									
										117
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										117
									
								
								README.md
									
									
									
									
									
								
							| @@ -9,7 +9,9 @@ | ||||
|  | ||||
| [](https://vercel.com/new/git/external?repository-url=https://github.com/timlrx/tailwind-nextjs-starter-blog) | ||||
|  | ||||
| This is a [Next.js](https://nextjs.org/), [Tailwind CSS](https://tailwindcss.com/) blogging starter template. Probably the most feature-rich Next.js markdown blogging template out there. Comes out of the box configured with the latest technologies to make technical writing a breeze. Easily configurable and customizable. Perfect as a replacement to existing Jekyll and Hugo individual blogs. | ||||
| This is a [Next.js](https://nextjs.org/), [Tailwind CSS](https://tailwindcss.com/) blogging starter template. Version 2 is based on Next App directory with [React Server Component](https://nextjs.org/docs/getting-started/react-essentials#server-components) and uses [Contentlayer](https://www.contentlayer.dev/) to manage markdown content. | ||||
|  | ||||
| Probably the most feature-rich Next.js markdown blogging template out there. Easily configurable and customizable. Perfect as a replacement to existing Jekyll and Hugo individual blogs. | ||||
|  | ||||
| Check out the documentation below to get started. | ||||
|  | ||||
| @@ -17,28 +19,32 @@ Facing issues? Check the [FAQ page](https://github.com/timlrx/tailwind-nextjs-st | ||||
|  | ||||
| Feature request? Check the past discussions to see if it has been brought up previously. Otherwise, feel free to start a new discussion thread. All ideas are welcomed! | ||||
|  | ||||
| ## Examples | ||||
| ## Examples V2 | ||||
|  | ||||
| - [Demo Blog](https://tailwind-nextjs-starter-blog.vercel.app/) - this repo | ||||
|  | ||||
| Using the template? Feel free to create a PR and add your blog to this list. | ||||
|  | ||||
| ## Examples V1 | ||||
|  | ||||
| Many thanks to the community for sharing their blogs and contributing to the template in various ways. If you have updated from version 1 to version 2, feel free to remove your blog from this list and add it to the above one. | ||||
|  | ||||
| - [My personal blog](https://www.timlrx.com) - modified to auto-generate blog posts with dates | ||||
| - [Aloisdg's cookbook](https://tambouille.vercel.app/) - with pictures and recipes! | ||||
| - [GautierArcin's demo with next translate](https://tailwind-nextjs-starter-blog-seven.vercel.app/) - includes translation of mdx posts, [source code](https://github.com/GautierArcin/tailwind-nextjs-starter-blog/tree/demo/next-translate) | ||||
| - [David Levai's digital garden](https://davidlevai.com/) - customized design and added email subscriptions | ||||
| - [Thinh's Corner](https://thinhcorner.com/) - [customized layout](https://github.com/Th1nhNg0/th1nhng0.vercel.app/blob/5e73a420828d82f01e7147512a2c3273c4ec19f8/layouts/PostLayout.js) with sticky side table of contents | ||||
| - [Leo's Blog](https://leohuynh.dev) - Tuan Anh Huynh's personal site. Add Snippets Page, Author Profile Card, Image Lightbox, ... | ||||
| - [thvu.dev](https://thvu.dev) - Added `mdx-embed`, view count, reading minutes and more. | ||||
| - [fiqrychoerudin.dev](https://www.fiqrychoerudin.dev/) - simple portfolio. | ||||
| - [irvin.dev](https://www.irvin.dev/) - Irvin Lin's personal site. Added YouTube embedding. | ||||
| - [KirillSo.com](https://www.kirillso.com/) - Personal blog & website. | ||||
| - [ghali.dev](https://ghali.dev) - Cyril's Blog | ||||
| - [DevBoy Blog](https://devboy.vercel.app/) - M.Reza's personal blog | ||||
| - [slightlysharpe.com](https://slightlysharpe.com) - [Tincre's](https://tincre.com) main company blog | ||||
| - [blog.b00st.com](https://blog.b00st.com) - [b00st.com's](https://b00st.com) main music promotion blog | ||||
| - [astrosaurus.me](https://astrosaurus.me/) - Ephraim Atta-Duncan's Personal Blog | ||||
| - [dhanrajsp.me](https://dhanrajsp.me/) - Dhanraj's personal site and blog. | ||||
| - [blog.r00ks.io](https://blog.r00ks.io/) - Austin Rooks's personal blog ([source code](https://github.com/Austionian/blog.r00ks)). | ||||
| - [honghong.me](https://honghong.me) - Tszhong's personal website ([source code](https://github.com/tszhong0411/home)) | ||||
| - [alfoncode.com](https://alfoncode.com) - Alfonso García's personar website. Customized design ([source code](https://github.com/alfoncode/personal-web)) | ||||
| - [marceloformentao.dev](https://marceloformentao.dev) - Marcelo Formentão personal website ([source code](https://github.com/marceloavf/marceloformentao.dev)). | ||||
| - [abiraja.com](https://www.abiraja.com/) - with a [runnable JS code snippet component!](https://www.abiraja.com/blog/querying-solana-blockchain) | ||||
| - [einargudni.com](https://www.einargudni.com) - with a customized theme, command pallette and more ([source code](https://github.com/einargudnig/einargudni.com)) | ||||
| @@ -46,25 +52,20 @@ Feature request? Check the past discussions to see if it has been brought up pre | ||||
| - [maqib.cn](https://maqib.cn) - A blog of Chinese front-end developers 狂奔小马的博客 ([源码](https://github.com/maqi1520/nextjs-tailwind-blog)) | ||||
| - [ambilena.com](https://ambilena.com/) - Electronic Music Blog & imprint for upcoming musicians. | ||||
| - [kittan.ru](https://www.kittan.ru/) - Kittanb's personal blog about linux ([source code](https://github.com/kittanb/blog)) | ||||
| - [nchristopher.me](https://nchristopher.me) - Nicholas Christopher's personal website and blog ([source code](https://github.com/nchristopher/blog)) | ||||
| - [dalelarroder.com](https://dalelarroder.com) - Dale Larroder's personal website and blog ([source code](https://github.com/dlarroder/dalelarroder)) | ||||
| - [devahoy.com](https://devahoy.com) - Chai's personal blog (Thai language) | ||||
| - [0xchai.io](https://0xchai.io) - Chai's personal blog | ||||
| - [techipedia](https://techipedia.vercel.app) - Simple blogging progressive web app with custom installation button and top progress bar | ||||
| - [reubence.com](https://reubence.com) - Reuben Rapose's Digital Garden | ||||
| - [axolo.co/blog](https://axolo.co/blog) - Engineering management news & axolo.co updates (with image preview for article in the home page) | ||||
| - [musing.vercel.app](https://musing.vercel.app/) - Parth Desai's personal blog ([source code](https://github.com/pycoder2000/blog)) | ||||
| - [onyourmental.com](https://www.onyourmental.com/) - [Curtis Warcup's](https://github.com/Cwarcup) website for the On Your Mental Podcast ([source code](https://github.com/Cwarcup/on-your-mental)) | ||||
| - [cwarcup.com](https://www.cwarcup.com/) - Curtis Warcup's personal website and blog ([source code](https://github.com/Cwarcup/personal-blog). | ||||
| - [cwarcup.com](https://www.cwarcup.com/) - Curtis Warcup's personal website and blog ([source code](https://github.com/Cwarcup/personal-blog)). | ||||
| - [ondiek-elijah.me](https://www.ondiek-elijah.me/) - Ondiek Elijah's website and blog ([source code](https://github.com/Dev-Elie/ondiek-elijah)). | ||||
| - [jmalvarez.dev](https://www.jmalvarez.dev/) - José Miguel Álvarez's personal blog ([source code](https://github.com/josemiguel-alvarez/nextjs-blog)) | ||||
| - [justingosses.com](https://justingosses.com/) - Justin Gosses's personal website and blog ([source code](https://github.com/JustinGOSSES/justingosses-website)) | ||||
| - [sabare.me](https://sabare.me/) - Victor Sabare's personal website and blog ([source code](https://github.com/Sabareh/blog) | ||||
| - [https://bitoflearning-9a57.fly.dev/](https://bitoflearning-9a57.fly.dev/) - Sangeet Agarwal's personal blog, replatformed to [remix](https://remix.run/remix) using the [indie stack](https://github.com/remix-run/indie-stack) ([source code](https://github.com/SangeetAgarwal/bitoflearning)) WIP | ||||
| - [https://bitoflearning-9a57.fly.dev/](https://bitoflearning-9a57.fly.dev/) - Sangeet Agarwal's personal blog, replatformed to [remix](https://remix.run/remix) using the [indie stack](https://github.com/remix-run/indie-stack) ([source code](https://github.com/SangeetAgarwal/bitoflearning)) | ||||
| - [raphaelchelly.com](https://www.raphaelchelly.com/) - Raphaël Chelly's personal website and blog ([source code](https://github.com/raphaelchelly/raph_www)) | ||||
|  | ||||
| Using the template? Feel free to create a PR and add your blog to this list. | ||||
|  | ||||
| ## Motivation | ||||
|  | ||||
| I wanted to port my existing blog to Nextjs and Tailwind CSS but there was no easy out of the box template to use so I decided to create one. Design is adapted from [Tailwindlabs blog](https://github.com/tailwindlabs/blog.tailwindcss.com). | ||||
| @@ -73,26 +74,29 @@ I wanted it to be nearly as feature-rich as popular blogging templates like [bea | ||||
|  | ||||
| ## Features | ||||
|  | ||||
| - Typescript first, including typed mdx files | ||||
| - [Contentlayer](https://www.contentlayer.dev/) to manage content logic | ||||
| - Easy styling customization with [Tailwind 3.0](https://tailwindcss.com/blog/tailwindcss-v3) and primary color attribute | ||||
| - [MDX - write JSX in markdown documents!](https://mdxjs.com/) | ||||
| - Near perfect lighthouse score - [Lighthouse report](https://www.webpagetest.org/result/221104_AiDc59_4WF/) | ||||
| - Lightweight, 45kB first load JS, uses Preact in production build | ||||
| - Mobile-friendly view | ||||
| - Light and dark theme | ||||
| - Self-hosted font with [Fontsource](https://fontsource.org/) | ||||
| - Supports [plausible](https://plausible.io/), [simple analytics](https://simpleanalytics.com/) and google analytics | ||||
| - [MDX - write JSX in markdown documents!](https://mdxjs.com/) | ||||
| - Font optimization with [next/font](https://nextjs.org/docs/app/api-reference/components/font) | ||||
| - Integration with [pliny](https://github.com/timlrx/pliny) that provides: | ||||
|   - Multiple analytics options including [Umami](https://umami.is/), [Plausible](https://plausible.io/), [Simple Analytics](https://simpleanalytics.com/), Posthog and Google Analytics | ||||
|   - Comments via [Giscus](https://github.com/laymonage/giscus), [Utterances](https://github.com/utterance/utterances) or Disqus | ||||
|   - Newsletter API and component with support for Mailchimp, Buttondown, Convertkit, Klaviyo, Revue, and Emailoctopus | ||||
|   - Command palette search with [Kbar](https://github.com/timc1/kbar) or Algolia | ||||
| - Server-side syntax highlighting with line numbers and line highlighting via [rehype-prism-plus](https://github.com/timlrx/rehype-prism-plus) | ||||
| - Math display supported via [KaTeX](https://katex.org/) | ||||
| - Citation and bibliography support via [rehype-citation](https://github.com/timlrx/rehype-citation) | ||||
| - Automatic image optimization via [next/image](https://nextjs.org/docs/basic-features/image-optimization) | ||||
| - Flexible data retrieval with [mdx-bundler](https://github.com/kentcdodds/mdx-bundler) | ||||
| - Support for tags - each unique tag will be its own page | ||||
| - Support for multiple authors | ||||
| - Blog templates | ||||
| - TOC component | ||||
| - 3 different blog layouts | ||||
| - 2 different blog listing layouts | ||||
| - Support for nested routing of blog posts | ||||
| - Newsletter component with support for mailchimp, buttondown, convertkit, klaviyo, revue, and emailoctopus | ||||
| - Supports [giscus](https://github.com/laymonage/giscus), [utterances](https://github.com/utterance/utterances) or disqus | ||||
| - Projects page | ||||
| - Preconfigured security headers | ||||
| - SEO friendly with RSS feed, sitemaps and more! | ||||
| @@ -108,30 +112,15 @@ I wanted it to be nearly as feature-rich as popular blogging templates like [bea | ||||
|  | ||||
| ## Quick Start Guide | ||||
|  | ||||
| 1. Try installing the starter using the new [Pliny project CLI](https://github.com/timlrx/pliny): | ||||
| 1. Clone the repo | ||||
|  | ||||
| ```bash | ||||
| npm i -g @pliny/cli | ||||
| pliny new --template=starter-blog my-blog | ||||
| ``` | ||||
|  | ||||
| It supports the updated version of the blog with Contentlayer, optional choice of TS/JS and different package managers as well as more modularized components which will be the basis of the template going forward. | ||||
|  | ||||
| Alternatively to stick with the current version, TypeScript and Contentlayer: | ||||
|  | ||||
| ```bash | ||||
| npx degit 'timlrx/tailwind-nextjs-starter-blog#contentlayer' | ||||
| ``` | ||||
|  | ||||
| or JS (official support) | ||||
|  | ||||
| ```bash | ||||
| npx degit https://github.com/timlrx/tailwind-nextjs-starter-blog.git | ||||
| npx degit 'timlrx/tailwind-nextjs-starter-blog' | ||||
| ``` | ||||
|  | ||||
| 2. Personalize `siteMetadata.js` (site related information) | ||||
| 3. Modify the content security policy in `next.config.js` if you want to use | ||||
|    any analytics provider or a commenting solution other than giscus. | ||||
|    other analytics provider or a commenting solution other than giscus. | ||||
| 4. Personalize `authors/default.md` (main author) | ||||
| 5. Modify `projectsData.js` | ||||
| 6. Modify `headerNavLinks.js` to customize navigation links | ||||
| @@ -141,7 +130,7 @@ npx degit https://github.com/timlrx/tailwind-nextjs-starter-blog.git | ||||
| ## Installation | ||||
|  | ||||
| ```bash | ||||
| npm install | ||||
| yarn | ||||
| ``` | ||||
|  | ||||
| ## Development | ||||
| @@ -149,18 +138,12 @@ npm install | ||||
| First, run the development server: | ||||
|  | ||||
| ```bash | ||||
| npm start | ||||
| ``` | ||||
|  | ||||
| or | ||||
|  | ||||
| ```bash | ||||
| npm run dev | ||||
| yarn dev | ||||
| ``` | ||||
|  | ||||
| Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. | ||||
|  | ||||
| You can start editing the page by modifying `pages/index.js`. The page auto-updates as you edit the file. | ||||
| Edit the layout in `app` or content in `data`. With live reloading, the pages auto-updates as you edit them. | ||||
|  | ||||
| ## Extend / Customize | ||||
|  | ||||
| @@ -178,36 +161,41 @@ You can start editing the page by modifying `pages/index.js`. The page auto-upda | ||||
|  | ||||
| `public/static` - store assets such as images and favicons. | ||||
|  | ||||
| `tailwind.config.js` and `css/tailwind.css` - contain the tailwind stylesheet which can be modified to change the overall look and feel of the site. | ||||
| `tailwind.config.js` and `css/tailwind.css` - tailwind configuration and stylesheet which can be modified to change the overall look and feel of the site. | ||||
|  | ||||
| `css/prism.css` - controls the styles associated with the code blocks. Feel free to customize it and use your preferred prismjs theme e.g. [prism themes](https://github.com/PrismJS/prism-themes). | ||||
|  | ||||
| `components/social-icons` - to add other icons, simply copy an svg file from [Simple Icons](https://simpleicons.org/) and map them in `index.js`. Other icons use [heroicons](https://heroicons.com/). | ||||
| `contentlayer.config.ts` - configuration for Contentlayer, including definition of content sources and MDX plugins used. See [Contentlayer documentation](https://www.contentlayer.dev/docs/getting-started) for more information. | ||||
|  | ||||
| `components/MDXComponents.js` - pass your own JSX code or React component by specifying it over here. You can then call them directly in the `.mdx` or `.md` file. By default, a custom link and image component is passed. | ||||
| `components/MDXComponents.js` - pass your own JSX code or React component by specifying it over here. You can then use them directly in the `.mdx` or `.md` file. By default, a custom link, `next/image` component, table of contents component and Newsletter form are passed down. Note that the components should be default exported to avoid [existing issues with Next.js](https://github.com/vercel/next.js/issues/51593). | ||||
|  | ||||
| `layouts` - main templates used in pages. | ||||
| `layouts` - main templates used in pages: | ||||
|  | ||||
| `pages` - pages to route to. Read the [Next.js documentation](https://nextjs.org/docs) for more information. | ||||
| - There are currently 3 post layouts available: `PostLayout`, `PostSimple` and `PostBanner`. `PostLayout` is the default 2 column layout with meta and author information. `PostSimple` is a simplified version of `PostLayout`, while `PostBanner` features a banner image. | ||||
| - There are 2 blog listing layouts: `ListLayout`, the layout used in version 1 of the template with a search bar and `ListLayoutWithTags`, currently used in version 2, which omits the search bar but includes a sidebar with information on the tags. | ||||
|  | ||||
| `app` - pages to route to. Read the [Next.js documentation](https://nextjs.org/docs/app) for more information. | ||||
|  | ||||
| `next.config.js` - configuration related to Next.js. You need to adapt the Content Security Policy if you want to load scripts, images etc. from other domains. | ||||
|  | ||||
| ## Post | ||||
|  | ||||
| Content is modelled using [Contentlayer](https://www.contentlayer.dev/), which allows you to define your own content schema and use it to generate typed content objects. See [Contentlayer documentation](https://www.contentlayer.dev/docs/getting-started) for more information. | ||||
|  | ||||
| ### Frontmatter | ||||
|  | ||||
| Frontmatter follows [Hugo's standards](https://gohugo.io/content-management/front-matter/). | ||||
|  | ||||
| Currently 7 fields are supported. | ||||
| Please refer to `contentlayer.config.ts` for an up to date list of supported fields. The following fields are supported: | ||||
|  | ||||
| ``` | ||||
| title (required) | ||||
| date (required) | ||||
| tags (required, can be empty array) | ||||
| tags (optional) | ||||
| lastmod (optional) | ||||
| draft (optional) | ||||
| summary (optional) | ||||
| images (optional, if none provided defaults to socialBanner in siteMetadata config) | ||||
| images (optional) | ||||
| authors (optional list which should correspond to the file names in `data/authors`. Uses `default` if none is specified) | ||||
| layout (optional list which should correspond to the file names in `data/layouts`) | ||||
| canonicalUrl (optional, canonical url for the post for SEO) | ||||
| @@ -230,29 +218,22 @@ canonicalUrl: https://tailwind-nextjs-starter-blog.vercel.app/blog/introducing-t | ||||
| --- | ||||
| ``` | ||||
|  | ||||
| ### Compose | ||||
|  | ||||
| Run `node ./scripts/compose.js` to bootstrap a new post. | ||||
|  | ||||
| Follow the interactive prompt to generate a post with pre-filled front matter. | ||||
|  | ||||
| ## Deploy | ||||
|  | ||||
| **Vercel**   | ||||
| The easiest way to deploy the template is to use the [Vercel Platform](https://vercel.com) from the creators of Next.js. Check out the [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. | ||||
| The easiest way to deploy the template is to deploy on [Vercel](https://vercel.com). Check out the [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details. | ||||
|  | ||||
| **Netlify** | ||||
| [Netlify](https://www.netlify.com/)’s Next.js runtime configures enables key Next.js functionality on your website without the need for additional configurations. Netlify generates serverless functions that will handle Next.js functionalities such as server-side rendered (SSR) pages, incremental static regeneration (ISR), `next/images`, etc. | ||||
|  | ||||
| See [Next.js on Netlify](https://docs.netlify.com/integrations/frameworks/next-js/overview/#next-js-runtime) for suggested configuration values and more details. | ||||
|  | ||||
| **GitHub Pages / Firebase etc.**   | ||||
| As the template uses `next/image` for image optimization, additional configurations have to be made to deploy on other popular static hosting websites like [Firebase](https://firebase.google.com/) or [GitHub Pages](https://pages.github.com/). An alternative image optimization provider such as Imgix, Cloudinary or Akamai has to be used. Alternatively, replace the `next/image` component with a standard `<img>` tag. See [`next/image` documentation](https://nextjs.org/docs/basic-features/image-optimization) for more details. | ||||
| **Static hosting services / GitHub Pages / S3 / Firebase etc.** | ||||
|  | ||||
| The API routes used in the newsletter component cannot be used in a static site export. You will need to use a form API endpoint provider and substitute the route in the newsletter component accordingly. Other hosting platforms such as Netlify also offer alternative solutions - please refer to their docs for more information. | ||||
|  | ||||
| **Google App Engine** | ||||
| Apart from changes mentioned above for `next/image`, configurations should be changed based on recommendations [here](https://github.com/vercel/next.js/discussions/12474#discussioncomment-17844) in order to set up the project for GAE deployment. | ||||
| 1. Add `output: 'export'` in `next.config.js`. See [static exports documentation](https://nextjs.org/docs/app/building-your-application/deploying/static-exports#configuration) for more information. | ||||
| 2. Change `components/Image.tsx` to use a standard `<img>` tag instead of `next/image`. Alternatively, to continue using `next/image`, you can use an alternative image optimization provider such as Imgix, Cloudinary or Akamai. See [image optimization documentation](https://nextjs.org/docs/app/building-your-application/deploying/static-exports#image-optimization) for more details. | ||||
| 3. Remove `api` folder and components which call the server-side function such as the Newsletter component. | ||||
| 4. Run `yarn build`. The generated static content is in the `out` folder. | ||||
|  | ||||
| ## Support | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user