Settings → General at /settings/site is the one settings screen documented in full here, because it is the only one with no other owner. Its header reads “General — Site title, domain, branding, and default content configuration.” Everything on it saves as you type, and nothing on it reaches your published site until you deploy.
Who can edit it
Seeing the screen needs company:read, whose floor is Read Only — so every member except Restricted gets the General card on the Settings grid and can read what is on it.
Saving needs company:write, whose floor is Content Publisher. Below that role every input on the screen is disabled, along with the Logo and Favicon buttons and the Domain Connect button. The full ladder is at roles and permissions.
The five sections
The screen is a single stack, always in this order:
- General Details — title, description, the domain pair, logo and favicon.
- Socials — thirteen handle fields.
- Documentation — the whole shape of your documentation site.
- MCP Configuration — two toggles governing reader access to your Docs MCP.
- Default Configuration — nine company-wide defaults your page types inherit.
This page owns the first two. The rest have their own homes, and this section is the hand-off.
Documentation is where a customer sets the shape of an entire documentation set: the layout (alpha, bravo or charlie), the color theme, the code theme, the font, the light and dark logo pair, the top and bottom menu slots that give the docs a header nav and a footer, the header CTA button, the starting page, and the tab groups the editor’s Tab Group menu offers your writers. Every field in it is listed at the documentation configuration reference, and the theme, font and code-theme choices in particular at themes, fonts and code themes.
One fact about that section belongs here rather than downstream, because it decides where a setting has to be made to stick: the company documentation configuration is the default for every documentation set, and it reaches your site. It is published into src/src.11tydata.json, and a docs page type stores only the values it overrides, in src/<slug>/<slug>.11tydata.json. Eleventy’s data cascade deep-merges the page type’s values over the company’s, key by key, so anything a set leaves unset is inherited from here. The OpenAPI configuration (its snippet languages included), tab groups and the highlighter are company-wide only; a page type cannot override them. If a documentation setting looks right in Settings and wrong on the built site, check whether the page type overrides it — global site data and the data cascade describes how the two files layer.
Three onward links for the parts of Documentation that most often send people looking:
- The top and bottom menu slots are what give your documentation the same header and footer as the rest of your site. Documentation header, footer and logos explains what each slot renders, why an unset one renders nothing at all, and why the logo pair must always include the light variant.
- The tab groups defined here are what the editor’s Tab Group button offers. Tab groups for consistent examples is the configuration side; tabs is the authoring side.
- Charlie is the layout Leed’s own documentation uses; the three are compared at documentation layouts.
MCP Configuration renders only when your workspace has MCP enabled, and MCP is enabled on every plan including Free, so in practice you will always see it. Its two toggles are the whole of configuring the Docs MCP.
Default Configuration is the nine-field block at the bottom, explained at default content configuration.
General Details
Six fields, two of which you cannot type into.
| Field | Editable | What it sets | Reaches your site as |
|---|---|---|---|
| Site Title | Yes | The name of the site | siteTitle in src/src.11tydata.json |
| Description | Yes | The site’s one-line description | siteDescription in src/src.11tydata.json |
| Domain | Read-only | Your live domain | deployment in src/src.11tydata.json |
| Preview Domain | Read-only | Displayed only; never stored | Nothing — it is derived for display |
| Logo | Yes, via upload | The site logo | logo |
| Favicon | Yes, via upload | The browser-tab icon | favicon |
Site title and description
Both are free text and both save as you type: the field waits 750 ms after your last keystroke and saves, and saves again immediately when you leave the field. There is no Save button and no confirmation toast — the amber dot appearing beside the section title is the acknowledgment.
If a value fails validation the field turns red, shows the error underneath, and is not saved. Fixing the value and moving on saves it.
Domain and Preview Domain are read-only
The Domain box shows your live domain and cannot be typed into. Preview Domain is not stored anywhere at all: it is rendered as staging. prefixed to whatever your live domain is, so it always tracks the box above it.
Logo and Favicon
Each shows a preview when one is set, and a single button beside it. The button reads Create when nothing is set and Update when something is — that label is the only indicator of which state you are in, so a workspace with no favicon shows Create even though the control looks identical.
Both buttons open the image upload modal; the favicon one opens it in favicon mode. A logo or favicon must be 100 KB or smaller — anything larger is refused rather than resized. What your logo, favicon, title and description then do on the published site — where each one surfaces and at what size — is at site identity and branding.
Domain Connect
Domain Connect is a one-click handshake with your registrar. The button beside the Domain field carries the entire state of the flow in its label, which is why the same control looks different on different visits.
stateDiagram-v2
[*] --> NotConnected
NotConnected --> Redirecting : you click the button
Redirecting --> Waiting : registrar returns you with ?domainConnect=pending
Redirecting --> NotConnected : the URL request fails
Waiting --> Connected : a re-check reports connected
Waiting --> NotConnected : 12 re-checks, 10 s apart, none succeeded
Connected --> [*]
NotConnected : Start Domain Connect
Redirecting : Redirecting…
Waiting : Waiting for DNS to propagate…
Connected : Connected — disabled, with a hover tooltip
Clicking Start Domain Connect opens a popup at your registrar. Leed opens that window synchronously inside the click so popup blockers allow it; if the browser blocks it anyway, the current tab navigates to the registrar instead of opening a new one. While the label reads Redirecting… the registrar URL is still being fetched.
The registrar sends you back to Settings with ?domainConnect=pending on the URL. From that point the label reads Waiting for DNS to propagate… and Leed re-checks every 10 seconds, up to 12 times — two minutes in total. On success the button becomes a disabled Connected, and hovering it shows the native tooltip Connected <date> via <provider>.
Once connected, the button reads Connected and is disabled — there is nothing left to click, which is the whole signal that the flow finished. The Domain field itself was read-only all along and stays that way.
If the two minutes pass without success, polling stops and the button returns to Start Domain Connect. Clicking it then restarts the registrar flow — it does not re-check the DNS you already configured. There is no “Check now” button on this screen. So if you are confident the records were written, reload the page after a few minutes rather than starting the handshake again.
What Domain Connect actually writes at your registrar, and the manual CNAME alternative for registrars that do not support it, belong to domains and DNS.
Socials
Thirteen fields in a two-column grid, alphabetized by label — Bluesky, Discord, Facebook, GitHub, GitLab, Instagram, LinkedIn, Mastodon, Reddit, TikTok, Twitch, Twitter and YouTube — stored on the company record under externalAccounts and written into src/src.11tydata.json on publish. Emptying a field clears the stored value.
These are handles and IDs, not URLs. The shipped documentation footer builds each link by concatenation, so what you type is appended to a fixed prefix:
| Field label | Stored as | Link the docs footer builds | Renders in the shipped docs footer |
|---|---|---|---|
| Bluesky | blueskyId | https://bsky.app/profile/<value> | Yes |
| Discord | discordInviteId | https://discord.gg/<value> | Yes |
facebookId | https://www.facebook.com/<value> | Yes | |
| GitHub | githubId | https://github.com/<value> | Yes |
| GitLab | gitlabId | https://gitlab.com/<value> | Yes |
instagramId | https://www.instagram.com/<value> | Yes | |
linkedinId | https://www.linkedin.com/company/<value> | Yes | |
| Mastodon | mastodonId | https://<value> — the full host and path, not a handle | Yes |
redditId | https://www.reddit.com/user/<value> | Yes | |
| TikTok | tiktokId | https://www.tiktok.com/<value> | Yes |
| Twitch | twitchId | https://www.twitch.tv/<value> | Yes |
twitterId | https://x.com/<value> | Yes | |
| YouTube | youtubeChannelId | — | No |
Two of the fields’ own placeholders point the wrong way, because the hint was written for the account rather than for the link the footer builds. Mastodon suggests @user@mastodon.social, but the footer prefixes only https://, so type the host and path instead — mastodon.social/@user. Reddit asks for a subreddit, but the footer links to reddit.com/user/<value>, so a subreddit name produces a link to a user profile of that name.
Why YouTube never renders
YouTube has a field, and what you type into it is stored and published — but the footer reads a key named youtubeId, while the company record stores youtubeChannelId. The two never meet, so a YouTube channel set here produces no icon on the site. Treat YouTube as not configurable until that is fixed; it is listed with the other product defects at known limitations.
Nothing here is live until you publish
Each section title carries an amber dot when the company record has unpublished changes, with the tooltip “Must be published to be active”.
Opening this screen can create a change
A workspace provisioned today is born with its documentation defaults already set: layout alpha, color theme color-theme-blue, code theme code-theme-github, font font-open-sans, and a Get started header button pointing at /. What provisioning does not set is the default list of API snippet languages, or the built-in api-languages tab group (cURL, TypeScript, Python and Go) that goes with it, so the first time someone with save permission opens Settings → General, Leed writes both — along with any of the four theme defaults an older workspace is still missing.
That is a real save. The documentation configuration is published, so it marks the workspace as having unpublished changes and puts an amber dot on the screen without you having touched a field. It happens once per workspace and it is not a bug — but it is indistinguishable from one if nobody tells you, which is why it is written down here.