Contribution guide
We love that you want to help us with our docs in GitHub, so here’s our guidelines to help make this easier for you.
The first thing to know is that Kinde has editorial discretion over all docs and we will review and edit community contributions to keep content in line with our styles and standards.
Don’t let this stop you from raising issues or making suggestions - we need your expertise. We just don’t expect writing perfection, so we’ve got you covered.
What to contribute
Link to this sectionOur docs describe what Kinde does, how our platform works, the core functions, configurations, features, settings, etc. We’re not trying to cover every use case, just the most common.
Please raise an issue or suggestion if:
- Something is incorrect and needs to be fixed
- Something is under-explained and needs improvement
- You find a gap in the docs or missing information
What we are not looking for:
- Product suggestions or feature requests - please log these here
- Workarounds or solutions from third-parties
- Non-specific feedback such as ‘bad doc, please improve’.
Ways to contribute
Link to this sectionRaise an issue
Link to this sectionLet us know if a document is wrong or needs fixing. Be as specific as you can so we can address it quickly. An example is where a code snippet is incorrect, or a procedure is no longer working. For issues, provide:
- Clear descriptive titles
- Links to relevant pages/files
- Explanations as to why (or for whom) this is a problem
- Optional: proposed solutions
Suggest a single page edit
Link to this sectionSuggest an improvement or change to a document by selecting Edit this page in your browser on the document. This will take you to GitHub where you can edit the content of the file and then create a pull request.
As part of creating the pull request, make sure you explain why the changes are needed, who they help, and how.
Raise a PR for bigger contributions
Link to this sectionWe prefer to write the big stuff ourselves, so we encourage people to raise issues about gaps in our content and provide suggestions that way.
However, if you want to create a new topic or edit multiple files, go to GitHub to create a branch or fork and raise a PR. There’s no guarantee your pages will be approved and merged, but we will review and get in touch to discuss and definitely consider new content for inclusion.
Contributing to SDK documentation
Link to this sectionOur SDK docs are always evolving and we welcome suggestions and contributions to make them better. SDK docs are stored with our other docs (see the file structure below). The SDKs themselves are stored in separate Kinde repos.
General document structure
Link to this sectionMost Kinde docs follow a similar structure:
- What is the topic about and who is it for (1-2 sentences)
- Conceptual explanations with appropriate headings
- Before you begin section for prerequisites
- Procedure with steps - How to do x.
- Supplementary or adjacent information
- Related topics
How we write
Link to this sectionOur documents are used by developers of varying experience, people from different language backgrounds, and users who are in a hurry to get the answer they need. Our guiding principle is to always use clear, simple language.
Our docs are not translated currently, but they will be soon. Plain English makes translation easier.
Writing principles
Link to this section- Use direct, clear sentences and short paragraphs
- Use simple, plain vocabulary and phrases
- Minimize jargon, idioms, and internet shorthand
- Don’t make assumptions about what readers already know
- Explain abbreviations and acronyms in full
Content principles
Link to this section- Use short, descriptive headings that include keywords, so people can scan to find what they need. E.g. ‘Update redirect URLs’, instead of ‘Edit the .env file’.
- Provide clear, step-by-step instructions that any level of user could follow easily.
- Include conceptual explanations and use cases for complex topics.
- Create tidy code snippets or examples that will help users get it right.
Tone and voice
Link to this section- Take a friendly but casual tone, like you are explaining things to a peer or colleague.
- Don’t waffle on too much with preamble, get to the point.
- Speak with clarity and confidence. You know what you’re talking about.
How to contribute to the Kinde docs
Link to this sectionEdit an existing article
Link to this section- Navigate to the doc in your browser and select Edit page at the bottom. GitHub opens.
- Make the required changes and then Commit.
- Provide clear and direct notes about your changes.
- Submit a PR. See below.
Create a new document
Link to this section- Navigate to the folder of the section and subsection the topic will go.
- Select New file.
- Type the name of the file in the blank field and add .mdx.
- Add the required frontmatter of the topic (
titleandpage_id). See the Docs syntax topic below. - Add content and commit.
Explain the reason for the topic as part of the PR.
File structure in GitHub
Link to this sectionOur documentation articles are written in mdx and are structured as follows:
Directorysrc
Directorycontent
Directorydocs
Directorytopic group
Directorysubtopic group
- article-1.mdx
- article-2.mdx
Raise a PR
Link to this sectionWhen you’re ready to raise a PR, use the following naming conventions:
feat:[description] for new topics or substantial changes
fix:[description] for corrections and minor changes
This helps us recognize and prioritize requests.
Docs syntax
Link to this sectionThis section describes some of our styles, elements, and conventions for docs content.
Frontmatter
Link to this sectionThe header/metadata part of the content helps the article appearing correctly in docs. It is also important for external AI tools and search optimization.
Copy the whole example below into the top of any new topic. And complete the required sections. Complete optional sections if you want.
---page_id:title:description: "description"sidebar: order:tableOfContents: maxHeadingLevel: 3relatedArticles: - -app_context: - m: s:topics: - - -sdk: []languages: []audience:complexity:keywords: - - - - -updated: yyyy-mm-ddai_summary:---Required Fields
Link to this sectionpage_id (uuid) - This is the internal unique id for the article. This will be used when referencing other articles within the relatedArticles frontmatter. You can use our online UUID generator tool to use as the page_id.
title (string) - You must provide a title for every page. This will be displayed at the top of the page, in browser tabs, and in page metadata.
description (string) - A brief description of the article content, used for SEO and metadata.
keywords (array) - Array of keywords for search optimization.
Optional Fields
Link to this sectionsidebar
-
order(number) - Control the order of this article when sorting an autogenerated group of links under a specific topic or subtopic. Lower numbers are displayed higher up in the link group. Providing theorderfrontmatter is completely optional and will be treated as a hint for us to where to place the file. We may update the article’sorderupon further review. -
label(string) - The label of the article when displayed in the sidebar. Falls back totitleif not provided.
topics (array) - Array of topic tags that help categorize the content.
sdk (array) - Array of SDKs that are relevant to this article. Use [] for no SDKs or null for not applicable.
languages (array) - Array of programming languages covered in the article.
ai_summary (string) - A full paragraph summary of the article content for AI processing and search (around 200 words). Falls back to description if not provided.
relatedArticles (array) - Array of page IDs for related articles that should be displayed at the bottom of the page.
app_context - Map doc item to the Kinde dashboard menu item and submenu items.
m(string) - The top level menu items(string) - The submenu item
How it looks in the dashboard:
In Kinde dashboard, they will appear in the “Help” menu popup under the Suggested for you section.
How to add them:
Log in to your Kinde dashboard and navigate to the appropriate setting page. You will find them within the navigation URL of each page.
Example:
app_context: - m: releases s: feature_flagsCode samples
Link to this sectionThe code snippets in our docs are powered by astro-expressive-code. Here are some examples in how you can use them:
Regular syntax highlighting
Link to this sectionFor code highlighting, you will need a language identifier. (See full list of supported languages on GitHub)
e.g. js for JavaScript:
```jsconsole.log("This code is syntax highlighted!");```Will render:
console.log("This code is syntax highlighted!");Frames
Link to this sectionIf you use a language identifier that is typically used for terminal sessions or shell scripts, a terminal frame will be added to the rendered output.
```bashnano script.sh```Will render:
nano script.shIf you add a value for title, then you get a title bar:
```powershell title="PowerShell terminal exampleWrite-Output "This one has a title!```Result:
Write-Output "This one has a title!If the language identifier is not a terminal session or shell script one, providing the title attribute will render the frame with the file name, for example.
```tsx title="src/app/page.tsximport { RegisterLink, LoginLink } from "@kinde-oss/kinde-auth-nextjs/components";```Output:
import {RegisterLink, LoginLink} from "@kinde-oss/kinde-auth-nextjs/components";This can also been achieved by adding a comment with the file name at the top of your file.
```tsx// src/app/page.tsximport { RegisterLink, LoginLink } from "@kinde-oss/kinde-auth-nextjs/components```Output:
import {RegisterLink, LoginLink} from "@kinde-oss/kinde-auth-nextjs/components";Images
Link to this sectionUse images sparingly, to support complex or detailed procedures. For accessibility, do not use images instead of text. Always include alt-text.
If you need an image or screen shot in your article, you’ll have to:
- Create a folder within
src/assets/imageswith the same slug as your article (the article’s.mdxfile name) - The image must be at least
1440pxwide - Include
alt textin the markdown.
Images are optimized before publishing, and have styles and zoom functionality added.
For example, this article lives under src/docs/contribute/index.mdx - In this case, we would create a contribute folder under src/assets/images and save the image there.
Directorysrc
Directoryassets
Directoryimages
Directorycontribute
- penguin.jpg
To add an image to an article, just simply use the markdown syntax like so:
The image will be rendered with some padding and will have the click to zoom functionality added to it.

Component reference
Link to this sectionSee below a list of the components ready to use. This list is constantly being updated.
<PackageManagers>
Link to this sectionThis component combines multiple useful commands from different package managers in the node ecosystem. It generates commands for npm, yarn, pnpm and bun.
Properties
Link to this sectiontype(string) - The type of command to be executed. (e.g.,add,create,dlx,exec,run,remove). Defaults toaddif not specified.pkg(string) - The package to be installed. (e.g.,firebase)args(string) - The arguments to be passed to the command. (e.g.,-e with-supabase)dev(boolean) - Whether to install the package as a dev dependency. Defaults tofalseif not specified. (e.g.,<PackageManagers pkg="dotenv" dev={true} />). You can also usedevas a shorthand:<PackageManagers pkg="dotenv" dev />.
Install a dependency
Link to this sectionSyntax
<PackageManagers pkg="@kinde-oss/kinde-auth-nextjs" />Output
npm i @kinde-oss/kinde-auth-nextjspnpm add @kinde-oss/kinde-auth-nextjsyarn add @kinde-oss/kinde-auth-nextjsbun add @kinde-oss/kinde-auth-nextjsTo add multiple packages, separate them with spaces:
<PackageManagers pkg="prisma firebase" />Install a dev dependency
Link to this sectionSyntax
<PackageManagers pkg="dotenv" dev />Output
npm i -D dotenvpnpm add -D dotenvyarn add -D dotenvbun add -d dotenvRun a command
Link to this sectionWe can output the npm run dev command equivalent with this hack:
<PackageManagers pkg="dev" type="run" />Output
npm run devpnpm run devyarn run devbun run devExecute a command (npx)
Link to this section<PackageManagers pkg="prisma" type="dlx" args="studio" />Output
npx prisma studiopnpm dlx prisma studioyarn dlx prisma studiobunx prisma studioComplex command with args
Link to this section<PackageManagers type='dlx' pkg='create-next-app' args='-e with-supabase' />Output
npx create-next-app -e with-supabasepnpm dlx create-next-app -e with-supabaseyarn dlx create-next-app -e with-supabasebunx create-next-app -e with-supabase<Aside>
Link to this sectionThis component is useful for displaying secondary information alongside a page’s main content.
Properties
Link to this sectiontype(string) - The type of aside to be displayed. (e.g.,info,warning,danger,upgrade). Defaults toinfoif not specified.title(string) - The title of the aside. Defaults tonullif not specified.
Example usage
Link to this sectionSyntax
<Aside>This is a helpful message for the user.</Aside>Output
This is a helpful message for the user.
Example with title
Link to this sectionSyntax
<Aside title="Heads up!">This is a helpful message for the user.</Aside>Output
This is a helpful message for the user.
Warning
Link to this sectionWarn about potential pitfalls or things to avoid.
Syntax
<Aside type="warning">Don't commit CLIENT_SECRET to source control!</Aside>Output
Don’t commit CLIENT_SECRET to source control!
Upgrade
Link to this sectionInform about features that are only available on paid plans in Kinde.
Syntax
<Aside type="upgrade">Google Analytics is available on the Kinde Pro plan and above.</Aside>Output
Google Analytics is available on the Kinde Pro plan and above.
<FileTree>
Link to this sectionUse the <FileTree> component to display the structure of a directory with file icons and collapsible subdirectories.
Content
Link to this sectionThe component has no props. Pass a nested markdown list as children: top-level items are files or folders at the project root, and each nested list under an item represents that folder’s contents. Indent with two spaces per level.
Simple tree
Link to this sectionSyntax
<FileTree>
- .env.local- src - app - page.tsx
</FileTree>Output
- .env.local
Directorysrc
Directoryapp
- page.tsx
Nested folders
Link to this sectionSyntax
<FileTree>
- src - app - layout.tsx - page.tsx - dashboard - page.tsx- next.config.ts- .env.local
</FileTree>Output
Directorysrc
Directoryapp
- layout.tsx
- page.tsx
Directorydashboard
- page.tsx
- next.config.ts
- .env.local
<YoutubeVideo>
Link to this sectionEmbed a YouTube video using lite-youtube behind the scenes for faster loading than a full iframe embed.
Properties
Link to this sectionvideoId(string, required) - The YouTube video ID from the watch URL (the value afterv=).videoTitle(string, optional) - Accessible label for the embed. Defaults to"Video"when omitted.
Basic embed
Link to this sectionSyntax
<YoutubeVideo videoId="ybmHcAVBnec" />Output
With a custom title
Link to this sectionSyntax
<YoutubeVideo videoId="ybmHcAVBnec" videoTitle="Kinde walkthrough" />Output
<Tabs> and <TabItem>
Link to this sectionUse <Tabs> as the wrapper and one or more <TabItem> children to group equivalent content so the reader can switch between variants (languages, stacks, or paths) without scrolling past every option.
Properties
Link to this section<Tabs>
syncKey(string, optional) - When the same key is set on multiple<Tabs>groups, changing a tab in one group switches the others to the tab with the same label (state is stored inlocalStorage, so it can persist when navigating Starlight pages that use the same key).
<TabItem>
label(string, required) - The text shown on the tab control.icon(string, optional) - A Starlight icon name to show beside the label.
Basic tabs
Link to this sectionSyntax
<Tabs> <TabItem label="Stars">Sirius, Vega, Betelgeuse</TabItem> <TabItem label="Moons">Io, Europa, Ganymede</TabItem></Tabs>Output
Tabs with code samples
Link to this sectionDepending on your MDX formatter, you may need extra blank lines or spacing between the <TabItem> tags and fenced code inside them.
Syntax
<Tabs>
<TabItem label="JavaScript">
```jsconsole.log("hello world!");```
</TabItem>
<TabItem label="PHP">
```phpecho "hello world";```
</TabItem>
</Tabs>Output
console.log("hello world!");echo "hello world";Synchronized tab groups
Link to this sectionGive two or more <Tabs> blocks the same syncKey so they stay on the same logical tab when the reader changes selection (tab labels must match across groups).
Syntax
<Tabs syncKey="contribute-guide-sync-demo"> <TabItem label="JavaScript">Use `npm install`.</TabItem> <TabItem label="PHP">Use `composer require`.</TabItem></Tabs>
<Tabs syncKey="contribute-guide-sync-demo"> <TabItem label="JavaScript">Second group follows the first.</TabItem> <TabItem label="PHP">Second group follows the first.</TabItem></Tabs>Output
npm install. composer require.