This is the official Payload Website Template. Use it to power websites, blogs, or portfolios from small to enterprise. This repo includes a fully-working backend, enterprise-grade admin panel, and a beautifully designed, production-ready website.
You can deploy to Vercel, using Neon and Vercel Blob Storage with one click:
This template is right for you if you are working on:
Core features:
Click the 'Deploy' button above to spin up this template directly into Vercel hosting. It will first prompt you save this template into your own Github repo so that you own the code and can make any changes you want to it.
Set up the following services and secrets and then once the app has been built and deployed you will be able to visit your site at the generated URL.
From this point on you can access your admin panel at /admin
of your app URL, create an admin user and then click the 'Seed the database' button in the dashboard to add content into your app.
This project uses the following services integrated into Vercel which you will need to click "Add" and "Connect" for:
Neon Database - Postgres-based cloud database used to host your data
Vercel Blob Storage - object storage used to host your files such as images and videos
The connection variables will automatically be setup for you on Vercel when these services are connected.
SecretsYou will be prompted to add the following secret values to your project. These should be long unguessable strong passwords, you can also use a password manager to generate one for these.
CRON_SECRET - used for running cron on Vercel
PAYLOAD_SECRET - used by Payload to sign secrets like JWT tokens
PREVIEW_SECRET - used by Payload for secured live previews of your content
To spin up this template locally, follow these steps:
After you click the Deploy
button above, you'll want to have standalone copy of this repo on your machine. If you've already cloned this repo, skip to Development.
First clone the repo if you have not done so already
cd my-project && cp .env.example .env
to copy the example environment variables. You'll need to add the POSTGRES_URL
and BLOB_READ_WRITE_TOKEN
from your Vercel project to your .env
if you want to use Vercel Blob and the Neon database that was created for you.
NOTE: If the connection string value includes
localhost
or127.0.0.1
, the code will automatically use a normal postgres adapter instead of Vercel.. You can override this functionality by settingforceUseVercelPostgres: true
if desired.
pnpm install && pnpm dev
to install dependencies and start the dev server
open http://localhost:3000
to open the app in your browser
That's it! Changes made in ./src
will be reflected in your app. Follow the on-screen instructions to login and create your first admin user. Then check out Production once you're ready to build and serve your app, and Deployment when you're ready to go live.
If you prefer to use Docker for local development instead of a local Postgres instance, the provided docker-compose.yml file can be used.
To do so, follow these steps:
POSTGRES_URL
in your .env
file to postgres://postgres@localhost:54320/<dbname>
docker-compose.yml
file's POSTGRES_DB
to match the above <dbname>
docker-compose up
to start the database, optionally pass -d
to run in the background.The Payload config is tailored specifically to the needs of most websites. It is pre-configured in the following ways:
See the Collections docs for details on how to extend this functionality.
Users are auth-enabled collections that have access to the admin panel and unpublished content. See Access Control for more details.
For additional help, see the official Auth Example or the Authentication docs.
Posts are used to generate blog posts, news articles, or any other type of content that is published over time. All posts are layout builder enabled so you can generate unique layouts for each post using layout-building blocks, see Layout Builder for more details. Posts are also draft-enabled so you can preview them before publishing them to your website, see Draft Preview for more details.
All pages are layout builder enabled so you can generate unique layouts for each page using layout-building blocks, see Layout Builder for more details. Pages are also draft-enabled so you can preview them before publishing them to your website, see Draft Preview for more details.
This is the uploads enabled collection used by pages, posts, and projects to contain media like images, videos, downloads, and other assets. It features pre-configured sizes, focal point and manual resizing to help you manage your pictures.
A taxonomy used to group posts together. Categories can be nested inside of one another, for example "News > Technology". See the official Payload Nested Docs Plugin for more details.
See the Globals docs for details on how to extend this functionality.
Header
The data required by the header on your front-end like nav links.
Footer
Same as above but for the footer of your site.
Basic access control is setup to limit access to various content based based on publishing status.
users
: Users can access the admin panel and create or edit content.posts
: Everyone can access published posts, but only users can create, update, or delete them.pages
: Everyone can access published pages, but only users can create, update, or delete them.For more details on how to extend this functionality, see the Payload Access Control docs.
Create unique page layouts for any type of content using a powerful layout builder. This template comes pre-configured with the following layout building blocks:
Each block is fully designed and built into the front-end website that comes with this template. See Website for more details.
A deep editorial experience that allows complete freedom to focus just on writing content without breaking out of the flow with support for Payload blocks, media, links and other features provided out of the box. See Lexical docs.
All posts and pages are draft-enabled so you can preview them before publishing them to your website. To do this, these collections use Versions with drafts
set to true
. This means that when you create a new post, project, or page, it will be saved as a draft and will not be visible on your website until you publish it. This also means that you can preview your draft before publishing it to your website. To do this, we automatically format a custom URL which redirects to your front-end to securely fetch the draft version of your content.
Since the front-end of this template is statically generated, this also means that pages, posts, and projects will need to be regenerated as changes are made to published documents. To do this, we use an afterChange
hook to regenerate the front-end when a document has changed and its _status
is published
.
For more details on how to extend this functionality, see the official Draft Preview Example.
In addition to draft previews you can also enable live preview to view your end resulting page as you're editing content with full support for SSR rendering. See Live preview docs for more details.
We've added hooks to collections and globals so that all of your pages, posts, or footer or header, change they will automatically be updated in the frontend via on-demand revalidation supported by Nextjs.
Note: if an image has been changed, for example it's been cropped, you will need to republish the page it's used on in order to be able to revalidate the Nextjs image cache.
This template comes pre-configured with the official Payload SEO Plugin for complete SEO control from the admin panel. All SEO data is fully integrated into the front-end website that comes with this template. See Website for more details.
This template also pre-configured with the official Payload Search Plugin to showcase how SSR search features can easily be implemented into Next.js with Payload. See Website for more details.
If you are migrating an existing site or moving content to a new URL, you can use the redirects
collection to create a proper redirect from old URLs to new ones. This will ensure that proper request status codes are returned to search engines and that your users are not left with a broken link. This template comes pre-configured with the official Payload Redirects Plugin for complete redirect control from the admin panel. All redirects are fully integrated into the front-end website that comes with this template. See Website for more details.
We have configured Scheduled Publish which uses the jobs queue in order to publish or unpublish your content on a scheduled time. The tasks are run on a cron schedule and can also be run as a separate instance if needed.
Note: When deployed on Vercel, depending on the plan tier, you may be limited to daily cron only.
This template includes a beautifully designed, production-ready front-end built with the Next.js App Router, served right alongside your Payload app in a instance. This makes it so that you can deploy both your backend and website where you need it.
Core features:
To spin up this example locally, follow the Quick Start. Then Seed the database with a few pages, posts, and projects.
Postgres and other SQL-based databases follow a strict schema for managing your data. In comparison to our MongoDB adapter, this means that there's a few extra steps to working with Postgres.
Note that often times when making big schema changes you can run the risk of losing data if you're not manually migrating it.
Local developmentIdeally we recommend running a local copy of your database so that schema updates are as fast as possible. By default the Postgres adapter has push: true
for development environments. This will let you add, modify and remove fields and collections without needing to run any data migrations.
If your database is pointed to production you will want to set push: false
otherwise you will risk losing data or having your migrations out of sync.
Migrations are essentially SQL code versions that keeps track of your schema. When deploy with Postgres you will need to make sure you create and then run your migrations.
Locally create a migration
pnpm payload migrate:create
This creates the migration files you will need to push alongside with your new configuration.
On the server after building and before running pnpm start
you will want to run your migrations
pnpm payload migrate
This command will check for any migrations that have not yet been run and try to run them and it will keep a record of migrations that have been run in the database.
Alternatively, you can use Docker to spin up this template locally. To do so, follow these steps:
.env
file in your project rootdocker-compose up
That's it! The Docker instance will help you get up and running quickly while also standardizing the development environment across your teams.
To seed the database with a few pages, posts, and projects you can click the 'seed database' link from the admin panel.
The seed script will also create a demo user for demonstration purposes only:
demo-author@payloadcms.com
password
NOTICE: seeding the database is destructive because it drops your current database to populate a fresh one from the seed template. Only run this command if you are starting a new project or can afford to lose your current data.
If you have any issues or questions, reach out to us on Discord or start a GitHub discussion.
A production-ready website built with Payload, the only Next.js-native CMS.
This is the official Payload Website Template. Use it to power websites, blogs, or portfolios from small to enterprise. This repo includes a fully-working backend, enterprise-grade admin panel, and a beautifully designed, production-ready website.
You can deploy to Vercel, using Neon and Vercel Blob Storage with one click:
This template is right for you if you are working on:
Core features:
Click the 'Deploy' button above to spin up this template directly into Vercel hosting. It will first prompt you save this template into your own Github repo so that you own the code and can make any changes you want to it.
Set up the following services and secrets and then once the app has been built and deployed you will be able to visit your site at the generated URL.
From this point on you can access your admin panel at /admin
of your app URL, create an admin user and then click the 'Seed the database' button in the dashboard to add content into your app.
This project uses the following services integrated into Vercel which you will need to click "Add" and "Connect" for:
Neon Database - Postgres-based cloud database used to host your data
Vercel Blob Storage - object storage used to host your files such as images and videos
The connection variables will automatically be setup for you on Vercel when these services are connected.
SecretsYou will be prompted to add the following secret values to your project. These should be long unguessable strong passwords, you can also use a password manager to generate one for these.
CRON_SECRET - used for running cron on Vercel
PAYLOAD_SECRET - used by Payload to sign secrets like JWT tokens
PREVIEW_SECRET - used by Payload for secured live previews of your content
To spin up this template locally, follow these steps:
After you click the Deploy
button above, you'll want to have standalone copy of this repo on your machine. If you've already cloned this repo, skip to Development.
First clone the repo if you have not done so already
cd my-project && cp .env.example .env
to copy the example environment variables. You'll need to add the POSTGRES_URL
and BLOB_READ_WRITE_TOKEN
from your Vercel project to your .env
if you want to use Vercel Blob and the Neon database that was created for you.
NOTE: If the connection string value includes
localhost
or127.0.0.1
, the code will automatically use a normal postgres adapter instead of Vercel.. You can override this functionality by settingforceUseVercelPostgres: true
if desired.
pnpm install && pnpm dev
to install dependencies and start the dev server
open http://localhost:3000
to open the app in your browser
That's it! Changes made in ./src
will be reflected in your app. Follow the on-screen instructions to login and create your first admin user. Then check out Production once you're ready to build and serve your app, and Deployment when you're ready to go live.
If you prefer to use Docker for local development instead of a local Postgres instance, the provided docker-compose.yml file can be used.
To do so, follow these steps:
POSTGRES_URL
in your .env
file to postgres://postgres@localhost:54320/<dbname>
docker-compose.yml
file's POSTGRES_DB
to match the above <dbname>
docker-compose up
to start the database, optionally pass -d
to run in the background.The Payload config is tailored specifically to the needs of most websites. It is pre-configured in the following ways:
See the Collections docs for details on how to extend this functionality.
Users are auth-enabled collections that have access to the admin panel and unpublished content. See Access Control for more details.
For additional help, see the official Auth Example or the Authentication docs.
Posts are used to generate blog posts, news articles, or any other type of content that is published over time. All posts are layout builder enabled so you can generate unique layouts for each post using layout-building blocks, see Layout Builder for more details. Posts are also draft-enabled so you can preview them before publishing them to your website, see Draft Preview for more details.
All pages are layout builder enabled so you can generate unique layouts for each page using layout-building blocks, see Layout Builder for more details. Pages are also draft-enabled so you can preview them before publishing them to your website, see Draft Preview for more details.
This is the uploads enabled collection used by pages, posts, and projects to contain media like images, videos, downloads, and other assets. It features pre-configured sizes, focal point and manual resizing to help you manage your pictures.
A taxonomy used to group posts together. Categories can be nested inside of one another, for example "News > Technology". See the official Payload Nested Docs Plugin for more details.
See the Globals docs for details on how to extend this functionality.
Header
The data required by the header on your front-end like nav links.
Footer
Same as above but for the footer of your site.
Basic access control is setup to limit access to various content based based on publishing status.
users
: Users can access the admin panel and create or edit content.posts
: Everyone can access published posts, but only users can create, update, or delete them.pages
: Everyone can access published pages, but only users can create, update, or delete them.For more details on how to extend this functionality, see the Payload Access Control docs.
Create unique page layouts for any type of content using a powerful layout builder. This template comes pre-configured with the following layout building blocks:
Each block is fully designed and built into the front-end website that comes with this template. See Website for more details.
A deep editorial experience that allows complete freedom to focus just on writing content without breaking out of the flow with support for Payload blocks, media, links and other features provided out of the box. See Lexical docs.
All posts and pages are draft-enabled so you can preview them before publishing them to your website. To do this, these collections use Versions with drafts
set to true
. This means that when you create a new post, project, or page, it will be saved as a draft and will not be visible on your website until you publish it. This also means that you can preview your draft before publishing it to your website. To do this, we automatically format a custom URL which redirects to your front-end to securely fetch the draft version of your content.
Since the front-end of this template is statically generated, this also means that pages, posts, and projects will need to be regenerated as changes are made to published documents. To do this, we use an afterChange
hook to regenerate the front-end when a document has changed and its _status
is published
.
For more details on how to extend this functionality, see the official Draft Preview Example.
In addition to draft previews you can also enable live preview to view your end resulting page as you're editing content with full support for SSR rendering. See Live preview docs for more details.
We've added hooks to collections and globals so that all of your pages, posts, or footer or header, change they will automatically be updated in the frontend via on-demand revalidation supported by Nextjs.
Note: if an image has been changed, for example it's been cropped, you will need to republish the page it's used on in order to be able to revalidate the Nextjs image cache.
This template comes pre-configured with the official Payload SEO Plugin for complete SEO control from the admin panel. All SEO data is fully integrated into the front-end website that comes with this template. See Website for more details.
This template also pre-configured with the official Payload Search Plugin to showcase how SSR search features can easily be implemented into Next.js with Payload. See Website for more details.
If you are migrating an existing site or moving content to a new URL, you can use the redirects
collection to create a proper redirect from old URLs to new ones. This will ensure that proper request status codes are returned to search engines and that your users are not left with a broken link. This template comes pre-configured with the official Payload Redirects Plugin for complete redirect control from the admin panel. All redirects are fully integrated into the front-end website that comes with this template. See Website for more details.
We have configured Scheduled Publish which uses the jobs queue in order to publish or unpublish your content on a scheduled time. The tasks are run on a cron schedule and can also be run as a separate instance if needed.
Note: When deployed on Vercel, depending on the plan tier, you may be limited to daily cron only.
This template includes a beautifully designed, production-ready front-end built with the Next.js App Router, served right alongside your Payload app in a instance. This makes it so that you can deploy both your backend and website where you need it.
Core features:
To spin up this example locally, follow the Quick Start. Then Seed the database with a few pages, posts, and projects.
Postgres and other SQL-based databases follow a strict schema for managing your data. In comparison to our MongoDB adapter, this means that there's a few extra steps to working with Postgres.
Note that often times when making big schema changes you can run the risk of losing data if you're not manually migrating it.
Local developmentIdeally we recommend running a local copy of your database so that schema updates are as fast as possible. By default the Postgres adapter has push: true
for development environments. This will let you add, modify and remove fields and collections without needing to run any data migrations.
If your database is pointed to production you will want to set push: false
otherwise you will risk losing data or having your migrations out of sync.
Migrations are essentially SQL code versions that keeps track of your schema. When deploy with Postgres you will need to make sure you create and then run your migrations.
Locally create a migration
pnpm payload migrate:create
This creates the migration files you will need to push alongside with your new configuration.
On the server after building and before running pnpm start
you will want to run your migrations
pnpm payload migrate
This command will check for any migrations that have not yet been run and try to run them and it will keep a record of migrations that have been run in the database.
Alternatively, you can use Docker to spin up this template locally. To do so, follow these steps:
.env
file in your project rootdocker-compose up
That's it! The Docker instance will help you get up and running quickly while also standardizing the development environment across your teams.
To seed the database with a few pages, posts, and projects you can click the 'seed database' link from the admin panel.
The seed script will also create a demo user for demonstration purposes only:
demo-author@payloadcms.com
password
NOTICE: seeding the database is destructive because it drops your current database to populate a fresh one from the seed template. Only run this command if you are starting a new project or can afford to lose your current data.
If you have any issues or questions, reach out to us on Discord or start a GitHub discussion.