Plan your content
Before you create anything, sort every page of your site into one of four kinds, and write down the fields of each content type. Ten minutes on paper saves renaming slugs later, which breaks links.
Sort your pages into five kinds
| Kind | Use it for | Edited in |
|---|---|---|
| Content type | Anything you publish more than once with the same shape: articles, guides, case studies, events, team members | The admin area, by editors |
| Standard page | About, Contact, FAQ, Privacy Policy, Terms, Cookie Policy: ready-made, with the contact form and your contact details on the Contact page | The admin area, by editors, under Content, Info Pages (Write static pages) |
| Static page | Hand-written pages that never change and need no editor | HTML files in src/custom/site/pages/ |
| Home page | Your landing page, with its signup form | src/custom/site/home.html, published as a static page (Build your home page) |
| Signup form | Waitlists, newsletters, early access | Admin, Signup Forms; the form markup sits on a page of your site, or visitors use the form's own page |
When in doubt, make it a content type. Content types get the editor, drafts, version history, SEO fields, the sitemap, search and translations. Static pages get none of those. About, Contact and the policies are already a content type, the standard pages.
A content type does not have to have pages of its own. Turn Generate public pages off for parts of a page that editors change, such as services, a hero, testimonials or partner logos: they show as cards on your home page, with no item or list pages and no sitemap, feed or search entry (see Let editors change your home page). The same setting suits data that only your app's own pages read. Give such a type Your own order when the order matters.
Sketch each content type
For each type write down its plural and singular name (Articles, Article), its slug (articles), and the fields it adds. Every item already has a title, a URL slug, a cover image, a body, a summary, a published date, tags, an author and a read time worked out from the body, so list only what is extra, such as a price, an event date or a gallery. The field types are listed in Define content types.
Do not add a custom field for something every item already has, such as a Title or URL Slug field. Editors then see two inputs for one thing, and only the built-in one fills the page's title or address. Leave built-in fields out.
How pages are addressed
| Page | URL |
|---|---|
| List of a content type | /{type-slug}, for example /articles |
| One item | /{type-slug}/{url-slug}, for example /articles/pricing-guide |
| The same item in another language | /{lang}/{type-slug}/{url-slug}; the default language has no prefix |
| An item as Markdown, for AI tools | /{type-slug}/{url-slug}.md |
| RSS feed of a content type | /{type-slug}/feed.xml, with the seo feature on, in the default language only |
| Standard page | /info/{page}, for example /info/about and /info/contact |
| Static page | /p/{file}, which redirects to /pages/{file} on the live site |
| Home page | / |
| Standalone signup form | /waitlist/{form-slug} (/leaderboard/{form-slug}, from older versions, opens it too) |
| Search results | /search |
Slugs are lowercase letters, numbers and hyphens. Choose them for readers and search engines, and keep them.
- A content type slug also names the place its items are stored (
arc_{slug}). Changing it later hides every existing item of the type, in the admin area and on the site, not only the links to it. - An item's URL slug is made from its title when you first write it. A slug you type by hand is cleaned the same way: lowercase letters a to z, digits and single hyphens, so
My Post!becomesmy-post. Other letters are dropped, so give an item with a title in another script a slug in English. When the slug is taken,-2,-3and so on are added. Changing it later breaks every link to the old address.
Arc CMS does not stop you from giving a content type a slug that is already a site address. Never use admin, p, pages, search, waitlist, leaderboard, unsubscribe, signup, onboarding, notifications, pricing, account, user, checkout, assets, templates, i18n, profile, email-preferences, site, _site, info (the standard pages), checkout-success or a language code: the content pages and the built-in page then fight over the same URL.
Plan the navigation
The site menu is not built from your content types. It is plain HTML in src/custom/site/header.html, and the footer is src/custom/site/footer.html; until you write them, Arc CMS's sample header and footer (public/_site/header.html, public/_site/footer.html) are used. List the links you want in each: usually the list page of each main content type and the home page sections. The default footer already lists the published standard pages; your own footer can keep that list with data-arc-site-loop="pages", and print your contact details and social links with data-arc-site (see Design templates). The header also holds the search box and the language switcher; keep those two elements where you want them to appear.
Plan the templates
Each content type uses a template folder with a list layout and a detail layout. Types that look alike can share one folder: give their fields the same names, and use the short key in the shared files ({{ price }} rather than {{ events-price }}), which works on detail pages and in list and card loops alike. A type with no folder of its own uses the built-in default. Note which types need their own design, and which fields each layout shows. Design templates covers the files.
Next
Turn the plan into content types.