website: split (#8616)

* add package

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* remove most of website

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* keep relative api browser internal

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* remove more stuff

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* switch openapi renderer

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* keep tests

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* add placeholder index page to fix build

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* fix build

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* re-add blog

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* fix default url

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* fix build?

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* actually fix build

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

---------

Signed-off-by: Jens Langhammer <jens@goauthentik.io>
This commit is contained in:
Jens L
2024-02-28 00:59:04 +01:00
committed by GitHub
parent d29c3abc7d
commit d7ed1a5d30
128 changed files with 1084 additions and 8233 deletions

View File

@ -1,40 +0,0 @@
import React from "react";
import useDocusaurusContext from "@docusaurus/useDocusaurusContext";
import useBaseUrl from "@docusaurus/useBaseUrl";
import BrowserOnly from "@docusaurus/BrowserOnly";
import { useColorMode } from "@docusaurus/theme-common";
export function APIBrowser() {
const context = useDocusaurusContext();
const { siteConfig = {} } = context;
const { colorMode, setColorMode } = useColorMode();
let bg = "#1b1b1d";
if (colorMode === "light") {
bg = "#fff";
}
return (
<BrowserOnly>
{() => {
require("rapidoc");
return (
<rapi-doc
spec-url={useBaseUrl("schema.yaml")}
allow-try="false"
show-header="false"
theme={colorMode}
bg-color={bg}
render-style="view"
primary-color="#fd4b2d"
allow-spec-url-load="false"
allow-spec-file-load="false"
allow-authentication="false"
allow-server-selection="false"
show-info="false"
></rapi-doc>
);
}}
</BrowserOnly>
);
}
export default APIBrowser;

View File

@ -1,600 +0,0 @@
import React from "react";
import { Check, X, AlertTriangle } from "react-feather";
import "./style.css";
import "react-tooltip/dist/react-tooltip.css";
import { Tooltip } from "react-tooltip";
export default function Comparison() {
const tooltipAvailableThirdParty = "Available as a third-party extension";
const tooltipPlanned = "Planned as a future feature";
const tooltipRequiresLicense =
"Requires additional licenses/not included in base tier";
const tooltipRequiresProductAADS =
"Requires additional product: Azure AD Domain Services";
const tooltipRequiresProductWAP =
"Requires additional product: Web Application Proxy";
return (
<>
<div id="comparison"></div>
<h1 className="header">Why authentik?</h1>
<div className="table-responsive">
<div className="table">
<table className="comparison">
<thead>
<tr>
<th></th>
<th className="authentik">authentik</th>
<th>Keycloak</th>
<th>Microsoft ADFS</th>
<th>Microsoft Azure AD</th>
<th>Okta</th>
<th>Duo</th>
<th>Authelia</th>
</tr>
</thead>
<thead className="group">
<tr>
<th>Protocol Support (as a provider)</th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td className="row-label">SAML2</td>
<td className="result passed authentik">
<Check></Check>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result failed">
<X></X>
</td>
</tr>
<tr>
<td className="row-label">OAuth2 and OIDC</td>
<td className="result passed authentik">
<Check></Check>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result passed">
<Check></Check>
</td>
</tr>
<tr>
<td className="row-label">SCIM</td>
<td className="result passed authentik">
<Check></Check>
</td>
<td className="result warning">
<AlertTriangle
className="tooltip"
data-tooltip-content={
tooltipAvailableThirdParty
}
></AlertTriangle>
</td>
<td className="result failed">
<X></X>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result failed">
<X></X>
</td>
<td className="result failed">
<X></X>
</td>
</tr>
<tr>
<td className="row-label">LDAP</td>
<td className="result passed authentik">
<Check></Check>
</td>
<td className="result failed">
<X></X>
</td>
<td className="result failed">
<X></X>
</td>
<td className="result warning">
<AlertTriangle
className="tooltip"
data-tooltip-content={
tooltipRequiresProductAADS
}
></AlertTriangle>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result failed">
<X></X>
</td>
</tr>
<tr>
<td className="row-label">RADIUS</td>
<td className="result passed authentik">
<Check></Check>
</td>
<td className="result warning">
<AlertTriangle
className="tooltip"
data-tooltip-content={
tooltipAvailableThirdParty
}
></AlertTriangle>
</td>
<td className="result failed">
<X></X>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result failed">
<X></X>
</td>
</tr>
</tbody>
<thead className="group">
<tr>
<th>Federation support</th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td className="row-label">SAML2</td>
<td className="result passed authentik">
<Check></Check>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result failed">
<X></X>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result failed">
<X></X>
</td>
</tr>
<tr>
<td className="row-label">OAuth2 and OIDC</td>
<td className="result passed authentik">
<Check></Check>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result failed">
<X></X>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result failed">
<X></X>
</td>
</tr>
<tr>
<td className="row-label">OAuth1</td>
<td className="result passed authentik">
<Check></Check>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result failed">
<X></X>
</td>
<td className="result failed">
<X></X>
</td>
<td className="result failed">
<X></X>
</td>
<td className="result failed">
<X></X>
</td>
<td className="result failed">
<X></X>
</td>
</tr>
<tr>
<td className="row-label">LDAP</td>
<td className="result passed authentik">
<Check></Check>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result passed">
<Check></Check>
</td>
</tr>
<tr>
<td className="row-label">SCIM</td>
<td className="result warning authentik">
<AlertTriangle
className="tooltip"
data-tooltip-content={tooltipPlanned}
></AlertTriangle>
</td>
<td className="result warning">
<AlertTriangle
className="tooltip"
data-tooltip-content={
tooltipAvailableThirdParty
}
></AlertTriangle>
</td>
<td className="result failed">
<X></X>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result failed">
<X></X>
</td>
<td className="result failed">
<X></X>
</td>
</tr>
</tbody>
<thead className="group">
<tr>
<th>Use-cases</th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td className="row-label">Authentication</td>
<td className="result passed authentik">
<Check></Check>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result passed">
<Check></Check>
</td>
</tr>
<tr>
<td className="row-label">Enrollment</td>
<td className="result passed authentik">
<Check></Check>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result failed">
<X></X>
</td>
<td className="result failed">
<X></X>
</td>
<td className="result failed">
<X></X>
</td>
<td className="result failed">
<X></X>
</td>
<td className="result failed">
<X></X>
</td>
</tr>
<tr>
<td className="row-label">Self-service</td>
<td className="result passed authentik">
<Check></Check>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result passed">
<Check></Check>
</td>
</tr>
</tbody>
<thead className="group">
<tr>
<th>Features</th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td className="row-label">MFA</td>
<td className="result passed authentik">
<Check></Check>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result failed">
<X></X>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result passed">
<Check></Check>
</td>
</tr>
<tr>
<td className="row-label">
Conditional Access
</td>
<td className="result passed authentik">
<Check></Check>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result warning">
<AlertTriangle
className="tooltip"
data-tooltip-content={
tooltipRequiresLicense
}
></AlertTriangle>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result warning">
<AlertTriangle
className="tooltip"
data-tooltip-content={
tooltipRequiresLicense
}
></AlertTriangle>
</td>
<td className="result passed">
<Check></Check>
</td>
</tr>
<tr>
<td className="row-label">
Open-source/Source available
</td>
<td className="result passed authentik">
<Check></Check>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result failed">
<X></X>
</td>
<td className="result failed">
<X></X>
</td>
<td className="result failed">
<X></X>
</td>
<td className="result failed">
<X></X>
</td>
<td className="result passed">
<Check></Check>
</td>
</tr>
<tr>
<td
className="row-label tooltip"
data-tooltip-content={
"Reverse proxy to enable an SSO experience for applications that don't support it natively."
}
>
Application Proxy
</td>
<td className="result passed authentik">
<Check></Check>
</td>
<td className="result warning">
<AlertTriangle
className="tooltip"
data-tooltip-content={
tooltipAvailableThirdParty
}
></AlertTriangle>
</td>
<td className="result warning">
<AlertTriangle
className="tooltip"
data-tooltip-content={
tooltipRequiresProductWAP
}
></AlertTriangle>
</td>
<td className="result passed">
<Check></Check>
</td>
<td className="result failed">
<X></X>
</td>
<td className="result failed">
<X></X>
</td>
<td className="result passed">
<Check></Check>
</td>
</tr>
<tr>
<td
className="row-label tooltip"
data-tooltip-content={
"Reverse proxy to enable an SSO experience for applications that don't support it natively."
}
>
Device authentication/authorization
</td>
<td className="result failed authentik">
<X></X>
</td>
<td className="result failed">
<X></X>
</td>
<td className="result failed">
<X></X>
</td>
<td className="result warning">
<AlertTriangle
className="tooltip"
data-tooltip-content={
tooltipRequiresLicense
}
></AlertTriangle>
</td>
<td className="result warning">
<AlertTriangle
className="tooltip"
data-tooltip-content={
tooltipAvailableThirdParty
}
></AlertTriangle>
</td>
<td className="result failed">
<X></X>
</td>
<td className="result failed">
<X></X>
</td>
</tr>
</tbody>
</table>
<Tooltip anchorSelect=".tooltip" place="top" />
</div>
</div>
</>
);
}

View File

@ -1,155 +0,0 @@
.header {
text-align: center;
padding: 2rem 0;
}
table {
display: table;
}
.table-responsive {
overflow-x: auto;
}
/**
* comparison
*
* Comparison table used in both the performance and correctness tables.
*/
table.comparison {
width: 100%;
}
table.comparison [title],
table.comparison [title] {
text-decoration: underline;
text-decoration-style: dotted;
}
table.comparison th,
table.comparison td,
table.comparison tr {
border: 0px none;
white-space: nowrap;
}
table.comparison th {
padding-left: 0;
padding-right: 0;
}
table.comparison tr th.authentik {
color: var(--ifm-color-primary);
}
table.comparison thead.group tr {
border-top: 1px;
border-bottom: 1px;
border-bottom-color: var(--ifm-table-head-color);
border-top-style: solid;
border-bottom-style: solid;
}
table.comparison thead.group th:first-child {
padding: 10px;
text-align: left;
font-weight: 800;
}
table.comparison tr td {
padding-left: 10px;
min-width: 90px;
text-align: center;
}
table.comparison tr td:first-child {
font-weight: bold;
text-align: left;
white-space: nowrap;
width: 25%;
}
table.comparison tr td.description {
font-weight: normal;
min-width: 250px;
padding-top: 0;
vertical-align: top;
white-space: normal;
}
table.comparison tr td.description .label {
color: var(--ifm-heading-color);
font-weight: bold;
}
table.comparison tr td.description .text {
color: var(--ifm-color-emphasis-600);
}
table.comparison tr td.description .links {
font-size: 0.9em;
margin-top: var(--ifm-spacing-vertical);
}
table.comparison tr td.result {
background-color: var(--ifm-panel-background-color);
}
table.comparison tr td.result.failed {
color: var(--ifm-color-danger);
}
table.comparison tr td.result.lost {
background: var(--ifm-color-emphasis-1000);
color: transparent;
}
table.comparison tr td.result.not-applicable {
background: var(--ifm-color-emphasis-1000);
color: rgba(var(--ifm-background-color-rgb), 0.5);
}
table.comparison tr td.result.passed {
color: var(--ifm-color-success);
}
table.comparison tr td.result.warning {
color: var(--ifm-color-warning);
}
table.comparison tr td.result.authentik {
background: var(--ifm-color-primary);
color: var(--ifm-color-secondary);
}
table.comparison tr td.bar {
padding: 0;
vertical-align: bottom;
}
table.comparison tr td.bar .place {
font-size: 0.9em;
}
table.comparison tr td.bar .measurement {
font-weight: bold;
}
table.comparison tr td.bar .bar {
background: var(--ifm-color-emphasis-1000);
margin: 0 auto;
}
table.comparison tr td.bar.authentik {
color: var(--ifm-color-primary);
}
table.comparison tr td.bar.authentik .bar {
background: var(--ifm-color-primary);
}
@media (max-width: 996px) {
table.comparison td.description {
display: none;
}
}

View File

@ -1,46 +0,0 @@
import React from "react";
import sidebar from "../../../sidebars";
import "./style.css";
import useBaseUrl from "@docusaurus/useBaseUrl";
interface ItemLink {
label: string;
link: string;
}
export function getReleases(): ItemLink[] {
const docs = sidebar.docs;
const releaseCategory = docs.filter(
(doc) => doc.link?.slug === "releases",
)[0];
// @ts-ignore
const releaseItems = releaseCategory.items!.filter(
(release) => typeof release === "string",
);
const releaseVersion: ItemLink[] = releaseItems.map((relUrl: string) => {
const [_, year, version] = relUrl.split("/");
const url = useBaseUrl(`docs/releases/${version.replace("v", "")}`);
return {
label: `authentik ${version} released!`,
link: url,
};
});
return releaseVersion;
}
export function NewsBar() {
return (
<div className="news-bar-container">
<span>News</span>
<div className="items">
{getReleases().map((version) => {
return (
<a key={version.link} href={version.link}>
{version.label}
</a>
);
})}
</div>
</div>
);
}

View File

@ -1,27 +0,0 @@
.news-bar-container {
display: flex;
flex-direction: row;
width: 100%;
font-size: 1.25rem;
font-weight: 800;
}
.news-bar-container .items {
display: flex;
flex-direction: row;
justify-content: space-around;
width: 100%;
}
.news-bar-container .items a {
color: var(--ifm-color-secondary-contrast-background);
-moz-transition: all 0.1s ease-in;
-o-transition: all 0.1s ease-in;
-webkit-transition: all 0.1s ease-in;
transition: all 0.1s ease-in;
}
.news-bar-container .items a:hover {
color: var(--ifm-color-primary);
text-decoration: none;
}

View File

@ -1,52 +0,0 @@
import React, { useState } from "react";
interface CardProps {
title: string;
body: string;
}
const Card = ({ title, body }: CardProps): JSX.Element => {
const [isActive, setIsActive] = useState(false);
return (
<div>
<div
style={{
padding: "1rem",
marginBottom: "1rem",
marginTop: "1rem",
display: "flex",
flexDirection: "column",
cursor: "pointer",
}}
className="card"
onClick={() => setIsActive((state) => !state)}
>
<div
style={{
display: "flex",
flexDirection: "row",
}}
>
<div
style={{
marginLeft: "0.5rem",
}}
>
<strong>{title}</strong>
</div>
</div>
{isActive && (
<div
className="card__body"
dangerouslySetInnerHTML={{ __html: body }}
>
{}
</div>
)}
</div>
</div>
);
};
export default Card;

View File

@ -1,13 +0,0 @@
import React from "react";
import styles from "./style.module.css";
import clsx from "clsx";
export function TextSlide({ words }) {
return (
<div className={clsx(styles.slider)}>
<div className={clsx(styles.sliderEntry)}>{words[0]}</div>
<div className={clsx(styles.sliderEntry)}>{words[1]}</div>
<div className={clsx(styles.sliderEntry)}>{words[2]}</div>
</div>
);
}

View File

@ -1,47 +0,0 @@
.slider {
--height: 1.25em;
}
.slider {
height: var(--height);
overflow: hidden;
}
.sliderEntry:first-of-type {
animation: slide 5s linear infinite;
}
.sliderEntry {
height: var(--height);
padding: 0px 15px;
text-align: center;
margin-bottom: var(--height);
box-sizing: border-box;
}
@keyframes slide {
0% {
margin-top: calc(-6 * var(--height));
}
5% {
/* For stopping effect */
margin-top: calc(-4 * var(--height));
}
33% {
margin-top: calc(-4 * var(--height));
}
38% {
/* For stopping effect */
margin-top: calc(-2 * var(--height));
}
66% {
margin-top: calc(-2 * var(--height));
}
71% {
/* For stopping effect */
margin-top: 0px;
}
100% {
margin-top: 0px;
}
}

View File

@ -1,62 +0,0 @@
import React from "react";
import styles from "./style.module.css";
import clsx from "clsx";
export function WaitListForm(props) {
return (
<section>
<div
className="container"
style={{ marginTop: "2rem", marginBottom: "4rem" }}
>
<h2 style={{ textAlign: "center" }}>Join the waitlist</h2>
<p style={{ textAlign: "center" }}>
Sign up to be notified once authentik Enterprise becomes
ready!
</p>
<div className={"row"}>
<div className={"col col--4 margin-vert--md"}></div>
<div className={"col col--4 margin-vert--md"}>
<form
name="enterprise-waitlist-v1"
method="post"
data-netlify="true"
netlify-honeypot="bot-field"
>
<p style={{ visibility: "hidden" }}>
<label>
Don't fill this out if you're human:{" "}
<input name="bot-field" />
</label>
</p>
<input
type="hidden"
name="form-name"
value="enterprise-waitlist-v1"
/>
<input
type="hidden"
name="product"
value={props.product}
/>
<input
type="email"
name="email"
className={clsx(styles.emailInput)}
placeholder="Your Email address"
/>
<button
className="button button--primary button--lg button--block"
type="submit"
>
Join
</button>
</form>
</div>
<div className={"col col--4 margin-vert--md"}></div>
</div>
</div>
</section>
);
}

View File

@ -1,6 +0,0 @@
.emailInput {
width: 100%;
line-height: 2rem;
margin-bottom: 2rem;
padding: 0.5rem 1rem;
}

View File

@ -1,109 +0,0 @@
<!-- Begin Mailchimp Signup Form -->
<link
href="//cdn-images.mailchimp.com/embedcode/classic-071822.css"
rel="stylesheet"
type="text/css"
/>
<style type="text/css">
#mc_embed_signup {
clear: left;
font:
14px Helvetica,
Arial,
sans-serif;
width: 100%;
}
#mc_embed_signup .helper_text {
background-color: transparent;
}
/* Add your own Mailchimp form style overrides in your site stylesheet or in this style block.
We recommend moving this block and the preceding CSS link to the HEAD of your HTML file. */
</style>
<div id="mc_embed_signup">
<form
action="https://goauthentik.us21.list-manage.com/subscribe/post?u=6b973b3207d334e3355ae0ab1&amp;id=971ed78bf3&amp;f_id=007bb3e1f0"
method="post"
id="mc-embedded-subscribe-form"
name="mc-embedded-subscribe-form"
class="validate"
target="_blank"
novalidate
>
<div id="mc_embed_signup_scroll">
<div class="indicates-required">
<span class="asterisk">*</span> indicates required
</div>
<div class="mc-field-group">
<label for="mce-EMAIL"
>Email Address <span class="asterisk">*</span>
</label>
<input
type="email"
value=""
name="EMAIL"
class="required email"
id="mce-EMAIL"
required
/>
<span id="mce-EMAIL-HELPERTEXT" class="helper_text"></span>
</div>
<div id="mce-responses" class="clear">
<div
class="response"
id="mce-error-response"
style="display: none"
></div>
<div
class="response"
id="mce-success-response"
style="display: none"
></div>
</div>
<!-- real people should not fill this in and expect good things - do not remove this or risk form bot signups-->
<div style="position: absolute; left: -5000px" aria-hidden="true">
<input
type="text"
name="b_6b973b3207d334e3355ae0ab1_971ed78bf3"
tabindex="-1"
value=""
/>
</div>
</div>
</form>
</div>
<div class="clear">
<input
form="mc-embedded-subscribe-form"
type="submit"
value="Subscribe"
name="subscribe"
id="mc-embedded-subscribe"
class="button button--primary button--block"
/>
</div>
<script
type="text/javascript"
src="//s3.amazonaws.com/downloads.mailchimp.com/js/mc-validate.js"
></script>
<script type="text/javascript">
(function ($) {
window.fnames = new Array();
window.ftypes = new Array();
fnames[0] = "EMAIL";
ftypes[0] = "email";
fnames[1] = "FNAME";
ftypes[1] = "text";
fnames[2] = "LNAME";
ftypes[2] = "text";
fnames[3] = "ADDRESS";
ftypes[3] = "address";
fnames[4] = "PHONE";
ftypes[4] = "phone";
fnames[5] = "BIRTHDAY";
ftypes[5] = "birthday";
})(jQuery);
var $mcj = jQuery.noConflict(true);
</script>
<!--End mc_embed_signup-->

View File

@ -1,23 +0,0 @@
import React from "react";
import Layout from "@theme/Layout";
import Head from "@docusaurus/Head";
import BrowserOnly from "@docusaurus/BrowserOnly";
function APIPage() {
return (
<Layout title="API">
<Head>
<meta
name="go-import"
content="goauthentik.io/api git https://github.com/goauthentik/client-go"
></meta>
</Head>
<BrowserOnly>
{() => {
window.location.pathname = "/developer-docs/api/";
}}
</BrowserOnly>
</Layout>
);
}
export default APIPage;

View File

@ -1,23 +0,0 @@
import React from "react";
import Layout from "@theme/Layout";
import Head from "@docusaurus/Head";
import BrowserOnly from "@docusaurus/BrowserOnly";
function APIPage() {
return (
<Layout title="API">
<Head>
<meta
name="go-import"
content="goauthentik.io/api/v3 git https://github.com/goauthentik/client-go"
></meta>
</Head>
<BrowserOnly>
{() => {
window.location.pathname = "/developer-docs/api/";
}}
</BrowserOnly>
</Layout>
);
}
export default APIPage;

View File

@ -1,283 +0,0 @@
import React from "react";
import clsx from "clsx";
import Layout from "@theme/Layout";
import Link from "@docusaurus/Link";
import Head from "@docusaurus/Head";
import BrowserOnly from "@docusaurus/BrowserOnly";
import useDocusaurusContext from "@docusaurus/useDocusaurusContext";
import useBaseUrl from "@docusaurus/useBaseUrl";
import styles from "./styles.module.css";
import Comparison from "../components/Comparison";
import "react-before-after-slider-component/dist/build.css";
import { NewsBar } from "../components/NewsBar";
import { TextSlide } from "../components/TextSlide";
function Feature({ imageUrl, title, description }) {
const imgUrl = useBaseUrl(imageUrl);
return (
<div className={clsx("col col--3", styles.feature)}>
{imgUrl && (
<div className="text--center">
<img
className={styles.featureImage}
src={imgUrl}
alt={title}
/>
</div>
)}
<h3>{title}</h3>
<p>{description}</p>
</div>
);
}
function Home() {
const context = useDocusaurusContext();
const { siteConfig = {} } = context;
return (
<Layout title="Welcome" description={siteConfig.tagline}>
<Head>
<meta
name="go-import"
content="goauthentik.io git https://github.com/goauthentik/authentik"
></meta>
</Head>
<header className={clsx("hero hero--primary", styles.heroBanner)}>
<div className="container">
<div className={clsx("row", styles.headerRow)}>
<div className="col padding-top--lg">
<h1
className={clsx(
"hero__title",
styles.ak_hero__title,
)}
>
<div>Replace</div>
<TextSlide
words={[
"Active Directory",
"Okta",
"Auth0",
]}
></TextSlide>
<div>with a unified platform.</div>
</h1>
<p className="hero__subtitle">
Unify your external users and team members in a
single platform
</p>
<div className={styles.buttons}>
<Link
className={clsx(
"button button--outline button--primary button--lg",
)}
to={useBaseUrl("docs/installation/")}
>
Get Started
</Link>
<Link
className={clsx(
"button button--outline button--primary button--lg",
)}
to="#comparison"
>
Reasons to switch
</Link>
</div>
</div>
<div
className={clsx(
"col text--center",
styles.heroImage,
styles.hiddenOnMobile,
)}
>
<img
alt="authentik logo"
src={useBaseUrl("img/landing_login_card.png")}
/>
</div>
</div>
</div>
</header>
<main>
<section className={styles.features}>
<div className="container">
<div className={clsx("row", styles.row)}>
<Feature
title="Unified identity management"
description={
<>
A single platform for all your identity
needs. Engineers have overview and
control of the identity environment from
a single interface.
</>
}
/>
<Feature
title="Security through transparency"
description={
<>
Available source code ensures a
continuous high level of security
through independent industry experts
using and testing the code.
</>
}
/>
<Feature
title="Streamlined pricing"
description={
<>
A straightforward pricing model for all
the features. No more guessing if a
feature is included in your subscription
or not. Covers B2B and B2C use cases.
</>
}
/>
<Feature
title="Your workflows, realized"
description={
<>
Build your workflows in authentik as you
need them, without limitations. And if
that's not enough, everything else can
be done through the API.
</>
}
/>
</div>
</div>
<div
className={clsx(
"row",
styles.rowDark,
styles.rowFullWidth,
styles.newsBar,
styles.hiddenOnMobile,
)}
>
<div className="container">
<NewsBar />
</div>
</div>
<div className="container">
<div className={clsx("row", styles.row)}>
<div className="col col--5">
<BrowserOnly>
{() => {
const ReactBeforeSliderComponent = require("react-before-after-slider-component");
return (
<ReactBeforeSliderComponent
firstImage={{
id: 1,
imageUrl: useBaseUrl(
"img/landing_screen_apps_dark.jpg",
),
}}
secondImage={{
id: 2,
imageUrl: useBaseUrl(
"img/landing_screen_apps_light.jpg",
),
}}
/>
);
}}
</BrowserOnly>
</div>
<div className="col col--5 col--offset-2 padding-vert--xl">
<h2>What is authentik?</h2>
<p>
authentik is an open-source Identity
Provider focused on flexibility and
versatility. You can use authentik in an
existing environment to add support for new
protocols, implement sign-up/recovery/etc.
in your application so you don't have to
deal with it, and many other things.
</p>
</div>
</div>
<div className={clsx("row", styles.row)}>
<div className="col col--5 col--offset-2 padding-vert--xl">
<h2>Utmost flexibility</h2>
<p>
You can adopt authentik to your environment,
regardless of your requirements. Need an
Active-Directory integrated SSO Provider? Do
you want to implement a custom enrollment
process for your customers? Are you
developing an application and don't want to
deal with User verification and recovery?
authentik can do all of that, and more!
</p>
</div>
<div className="col col--5">
<BrowserOnly>
{() => {
const ReactBeforeSliderComponent = require("react-before-after-slider-component");
return (
<ReactBeforeSliderComponent
firstImage={{
id: 1,
imageUrl: useBaseUrl(
"img/landing_screen_admin_dark.jpg",
),
}}
secondImage={{
id: 2,
imageUrl: useBaseUrl(
"img/landing_screen_admin_light.jpg",
),
}}
/>
);
}}
</BrowserOnly>
</div>
</div>
</div>
</section>
<section>
<div className="container">
<Comparison></Comparison>
</div>
</section>
<section>
<div
className={clsx(
styles.footerCTA,
styles.rowAuthentik,
styles.rowFullWidth,
)}
>
<h1>Try authentik now!</h1>
<div className={styles.buttons}>
<Link
className={clsx(
"button button--outline button--primary button--lg",
)}
to={useBaseUrl("docs/installation/")}
>
Get Started
</Link>
<Link
className={clsx(
"button button--outline button--primary button--lg",
)}
to={useBaseUrl("pricing/")}
>
Learn about enterprise
</Link>
</div>
</div>
</section>
</main>
</Layout>
);
}
export default Home;

View File

@ -0,0 +1,17 @@
import React from "react";
import clsx from "clsx";
import Layout from "@theme/Layout";
function Home() {
return (
<Layout title={`authentik Documentation`}>
<header className={clsx("hero hero--primary")}>
<div className="container">
<h1 className="hero__title">authentik Documentation</h1>
</div>
</header>
</Layout>
);
}
export default Home;

View File

@ -1,28 +0,0 @@
import React from "react";
import Layout from "@theme/Layout";
import useDocusaurusContext from "@docusaurus/useDocusaurusContext";
import { useColorMode } from "@docusaurus/theme-common";
import { useEffect } from "react";
function JobBoardWrapper() {
const context = useDocusaurusContext();
const { siteConfig = {} } = context;
return (
<Layout title="Jobs" description={siteConfig.tagline}>
<JobBoard />
</Layout>
);
}
function JobBoard() {
const { colorMode, setColorMode } = useColorMode();
if (colorMode !== "light") {
setColorMode("light");
}
useEffect(() => {
Grnhse.Iframe.load();
}, []);
return <div id="grnhse_app"></div>;
}
export default JobBoardWrapper;

View File

@ -1,122 +0,0 @@
---
title: Authentik Security Inc. Privacy policy
---
# Authentik Security Inc. Privacy policy
Last updated January 7, 2024
## Privacy Policy
Effective as of January 7, 2024.
Authentik Security Inc. (**"authentik," "we", "us"** or **"our"**) provides security software that allow our customers to securely access a variety of applications and services. This Privacy Policy describes how Authentik processes personal information that we collect through our digital or online properties or services that link to this Privacy Policy (collectively, the "Service").
Our products and services are intended for business customers. This Privacy Policy does not apply to information that we process on behalf of our business customers while providing the Service, which is governed by our agreements with those business customers. If you have concerns regarding personal information that we process on behalf of a business, please direct your concerns to them.
## Personal information we collect
**Information you provide to us**. Personal information you may provide to us through the Service or otherwise includes:
- **Contact data**, such as your first and last name, salutation, email address, physical address, professional title and company name, and phone number.
- **Communications data** based on our exchanges with you, including when you contact us through the Service, social media, or otherwise.
- **Marketing data**, such as your preferences for receiving our marketing communications and details about your engagement with them.
- **Other data** not specifically listed here, which we will use as described in this Privacy Policy or as otherwise disclosed at the time of collection.
**Automatic data collection**. We, our service providers, and our business partners may automatically log information about you, your computer or mobile device, and your interaction over time with the Service, our communications and other online services, such as:
- **Device data**, such as your computer or mobile devices operating system type and version, manufacturer and model, browser type, screen resolution, RAM and disk size, CPU usage, device type (e.g., phone, tablet), IP address, unique identifiers (including identifiers used for advertising purposes), language settings, mobile device carrier, radio/network information (e.g., Wi-Fi, LTE, 3G), and general location information such as city, state or geographic area.
- **Online activity data**, such as pages or screens you viewed, how long you spent on a page or screen, the website you visited before browsing to the Service, navigation paths between pages or screens, information about your activity on a page or screen, access times and duration of access, and whether you have opened our emails or clicked links within them.
- **Communication interaction data** such as your interactions with our email, text or other communications (e.g., whether you open and/or forward emails) we may do this through use of pixel tags (which are also known as clear GIFs), which may be embedded invisibly in our emails.
For more information concerning our automatic collection of data, please see the Tracking technologies section below.
## Tracking Technologies
**Cookies and other technologies**. Some of the automatic collection described above is facilitated by the following technologies:
- **Cookies**, which are small text files that websites store on user devices and that allow web servers to record users web browsing activities and remember their submissions, preferences, and login status as they navigate a site. Cookies used on our sites include both "session cookies" that are deleted when a session ends, "persistent cookies" that remain longer, "first party" cookies that we place and "third party" cookies that our third-party business partners and service providers place.
- **Local storage technologies**, like HTML5, that provide cookie-equivalent functionality but can store larger amounts of data on your device outside of your browser in connection with specific applications.
- **Web beacons**, also known as pixel tags or clear GIFs, which are used to demonstrate that a webpage or email was accessed or opened, or that certain content was viewed or clicked.
For information concerning your choices with respect to the use of tracking technologies, see the Your choices section, below.
## How we use your personal information
We may use your personal information for the following purposes or as otherwise described at the time of collection:
**Service delivery and operations**. We may use your personal information to:
- provide the Service;
- enable security features of the Service;
- communicate with you about the Service, including by sending Service-related announcements, updates, security alerts, and support and administrative messages;
- provide support for the Service, and respond to your requests, questions and feedback.
**Marketing**. We, our service providers and our third-party partners may collect and use your personal information for marketing purposes, such as to send you direct marketing communications and may personalize these messages based on your needs and interests. You may opt-out of our marketing communications as described in the Opt-out of marketing section below.
**Compliance and protection**. We may use your personal information to:
- comply with applicable laws, lawful requests, and legal process, such as to respond to subpoenas, investigations or requests from government authorities;
- protect our, your or others rights, privacy, safety or property (including by making and defending legal claims);
- audit our internal processes for compliance with legal and contractual requirements or our internal policies;
- enforce the terms and conditions that govern the Service; and
- prevent, identify, investigate and deter fraudulent, harmful, unauthorized, unethical or illegal activity, including cyberattacks and identity theft.
**Cookies and other technologies**. In addition to the other uses included in this section, we may use the Cookies and other technologies described above for the following purposes:
- **Technical operation**. To allow the technical operation of the Service, such as by remembering your selections and preferences as you navigate the site, and whether you are logged in when you visit password protected areas of the Service.
- **Functionality**. To enhance the performance and functionality of our services.
- **Analytics**. To help us understand user activity on the Service, including which pages are most and least visited and how visitors move around the Service, as well as user interactions with our emails. For example, we use Google Analytics for this purpose. You can learn more about Google Analytics and how to prevent the use of Google Analytics relating to your use of our sites here: https://tools.google.com/dlpage/gaoptout?hl=en.
**To create aggregated, de-identified and/or anonymized data**. We may create aggregated, de-identified and/or anonymized data from your personal information and other individuals whose personal information we collect. We make personal information into de-identified and/or anonymized data by removing information that makes the data identifiable to you and we will not attempt to reidentify any such data. We may use this aggregated, de-identified and/or anonymized data and share it with third parties for our lawful business purposes, to the extent that such uses and sharing are in compliance with applicable laws, including to analyze and improve the Service and promote our business.
## How we share your personal information
We may share your personal information with the following parties and as otherwise described in this Privacy Policy, in other applicable notices, or at the time of collection.
**Affiliates**. Our corporate parent, subsidiaries, and affiliates.
**Service providers**. Third parties that provide services on our behalf or help us operate the Service or our business (such as hosting, information technology, customer support, email delivery, marketing, consumer research and website analytics).
**Professional advisors**. Professional advisors, such as lawyers, auditors, bankers and insurers, where necessary in the course of the professional services that they render to us.
**Authorities and others**. Law enforcement, government authorities, and private parties, as we believe in good faith to be necessary or appropriate for the Compliance and protection purposes described above.
**Business transferees**. We may disclose personal information in the context of actual or prospective business transactions (e.g., investments in Authentik, financing of Authentik, public stock offerings, or the sale, transfer or merger of all or part of our business, assets or shares), for example, we may need to share certain personal information with prospective counterparties and their advisers. We may also disclose your personal information to an acquirer, successor, or assignee of Authentik as part of any merger, acquisition, sale of assets, or similar transaction, and/or in the event of an insolvency, bankruptcy, or receivership in which personal information is transferred to one or more third parties as one of our business assets.
## Your choices
**Opt-out of communications**. You may opt-out of marketing-related emails by following the opt-out or unsubscribe instructions at the bottom of the email, or by contacting us. Please note that if you choose to opt-out of marketing-related emails, you may continue to receive service-related and other non-marketing emails.
**Cookies and other technologies**. Most browsers let you remove or reject cookies. To do this, follow the instructions in your browser settings. Many browsers accept cookies by default until you change your settings. Please note that if you set your browser to disable cookies, the Service may not work properly. For more information about cookies, including how to see what cookies have been set on your browser and how to manage and delete them, visit www.allaboutcookies.org. You can also configure your device to prevent images from loading to prevent web beacons from functioning.
**Blocking images/clear gifs**: Most browsers and devices allow you to configure your device to prevent images from loading. To do this, follow the instructions in your particular browser or device settings.
**Do Not Track**. Some Internet browsers may be configured to send "Do Not Track" signals to the online services that you visit. We currently do not respond to "Do Not Track" signals. To find out more about "Do Not Track," please visit http://www.allaboutdnt.com.
**Declining to provide information**. We need to collect personal information to provide certain services. If you do not provide the information we identify as required or mandatory, we may not be able to provide those services.
## Other sites and services
The Service may contain links to websites, mobile applications, and other online services operated by third parties. In addition, our content may be integrated into web pages or other online services that are not associated with us. These links and integrations are not an endorsement of, or representation that we are affiliated with, any third party. We do not control websites, mobile applications or online services operated by third parties, and we are not responsible for their actions. We encourage you to read the privacy policies of the other websites, mobile applications and online services you use.
## Security
We employ technical, organizational and physical safeguards designed to protect the personal information we collect. However, security risk is inherent in all internet and information technologies and we cannot guarantee the security of your personal information.
## International data transfer
We are headquartered in the United States and may use service providers that operate in other countries. Your personal information may be transferred to the United States or other locations where privacy laws may not be as protective as those in your state, province, or country.
## Children
The Service is not intended for use by anyone under 16 years of age. If you are a parent or guardian of a child from whom you believe we have collected personal information in a manner prohibited by law, please contact us. If we learn that we have collected personal information through the Service from a child without the consent of the childs parent or guardian as required by law, we will comply with applicable legal requirements to delete the information.
## Changes to this Privacy Policy
We reserve the right to modify this Privacy Policy at any time. If we make material changes to this Privacy Policy, we will notify you by updating the date of this Privacy Policy and posting it on the Service or other appropriate means. Any modifications to this Privacy Policy will be effective upon our posting the modified version (or as otherwise indicated at the time of posting). In all cases, your use of the Service after the effective date of any modified Privacy Policy indicates your acknowledging that the modified Privacy Policy applies to your interactions with the Service and our business.
## How to contact us
- **Email**: hello@goauthentik.io
- **Mail**: 548 Market Street, PMB 70148, San Francisco, CA 94104-5401

View File

@ -1,107 +0,0 @@
---
title: Authentik Security Inc. Subscription Terms
---
# Authentik Subscription Terms
By signing this agreement, you and any entity that you represent ("Customer") are unconditionally consenting to be bound by and are becoming a party to these Authentik Subscription Terms ("Agreement") as of the date of Customer's first download of the Licensed Materials (the "Effective Date").
Customer's continued use of the software or any Licensed Materials provided by Authentik Security Inc. (a Delaware corporation with its principal offices located on Market St in San Francisco CA) or one of its affiliates and/or subsidiaries, as specified on an order form or quote ("Authentik") shall also constitute assent to the terms of this agreement.
If these terms are considered an offer, acceptance is expressly limited to these terms. If you are executing this agreement on behalf of an organization, you represent that you have the authority to do so.
## 1. LICENSE AND SUPPORT
1.1 Subject to the terms and conditions of this Agreement, Authentik hereby grants to Customer and its Affiliates (as defined below) a limited, non-exclusive, non-transferable, non-sublicensable license for Customers and its Affiliates employees and contractors to (1) internally (a) use, reproduce, modify, prepare derivative works based upon, and display the code of Authentik Enterprise Edition ("Authentik EE") at the tier level selected by Customer or set forth on a Quote (as defined below), if applicable with the specifications generally promulgated by Authentik from time to time (the “Software”) solely (i) for its internal use in connection with the development of Customers and/or its Affiliates own software, and (ii) by the number of Hosts (defined below) for which Customer has paid Authentik; and (b) use the documentation, training materials or other materials supplied by Authentik (the “Other Authentik Materials”); and (2) modify the Software and publish patches to the Software.
Notwithstanding anything to the contrary, Customer agrees that Authentik and/or its licensors (as applicable) retain all right, title and interest in and to all Software incorporated in such modifications and/or patches, and all such Software may only be used, copied, modified, displayed, distributed, or otherwise exploited in full compliance with this Agreement, and with a valid Authentik Enterprise Edition subscription for the correct number of Hosts.
The Software and Other Authentik Materials are collectively referred to herein as the “Licensed Materials.”
“Affiliate” means any entity(ies) controlling, controlled by, and/or under common control with a party hereto, where “control” means the ownership of more than 50% of the voting securities in such entity.
"User" means each individual end-user (person or machine) of Customer and/or its Affiliates (including, without limitation, employees, agents or consultants thereof) with access to the Licensed Materials hereunder.
"Host" means each individual machine (real or virtual, including servers, containers, workstations, smartphones, POS, industrial controls, gateways, sensors, IoT endpoints, or any other physical or simulated computing interface or machine) of Customer and/or its Affiliates (including, without limitation, employees, agents or consultants thereof) with access to Licensed Materials hereunder.
1.2 Subject to the terms hereof, Authentik will provide reasonable support to Customer for the Licensed Materials as set forth at https://goauthentik.io, for the support plan selected and paid for by Customer. Notwithstanding anything to the contrary, in the event that Customer does not reasonably comply with written specifications or instructions from Authentiks service engineers regarding any support issue or request (including without limitation, failure to make backups of Customers Licensed Materials) (each, a “Support Issue”), Authentik may terminate its support obligations to Customer with respect to such Support Issue upon fifteen (15) days written notice if Customer does not cure such noncompliance within the notice period.
1.2.1 Authentik will use reasonable commercial efforts to respond to support questions by phone or email during the next business day. The number of support questions is not limited.
## 2. RESTRICTIONS AND RESPONSIBILITIES
2.1 Except as expressly authorized in Section 1.1, Customer will not, and will not permit any third party to: use the Licensed Materials for any purpose other than as specifically authorized in Section 1, or in such a manner that would enable any unlicensed person to access the Licensed Materials; use the Licensed Materials or any other Authentik software for timesharing or service bureau purposes or for any purpose other than its and its Affiliates own internal use (including without limitation, sublicensing, distributing, selling, reselling any of the foregoing); except as expressly permitted herein; use the Licensed Materials in connection with any high risk or strict liability activity (including, without limitation, space travel, firefighting, police operations, power plant operation, military operations, rescue operations, hospital and medical operations or the like); use the Licensed Materials or software other than in accordance with this Agreement and in compliance with all applicable laws and regulations (including but not limited to any privacy laws, and laws and regulations concerning intellectual property, consumer and child protection, obscenity or defamation); or use the Licensed Materials in any manner that (1) is harmful, fraudulent, deceptive, threatening, abusive, harassing, tortious, defamatory, vulgar, obscene, or libelous (including without limitation, accessing any computer, computer system, network, software, or data without authorization, breaching the security of another user or system, and/or attempting to circumvent any Host or User authentication or security process), (2) impersonates any person or entity, including without limitation any employee or representative of Authentik, or (3) contains a virus, trojan horse, worm, time bomb, unsolicited bulk, commercial, or “spam” message, or other harmful computer code, file, or program (including without limitation, password guessing programs, decoders, password gatherers, keystroke loggers, cracking tools, packet sniffers, and/or encryption circumvention programs).
2.2 Customer will cooperate with Authentik in connection with the performance of this Agreement by making available such personnel and information as may be reasonably required, and taking such other actions as Authentik may reasonably request. Customer will also cooperate with Authentik in establishing a password or other procedures for verifying that only designated employees of Customer have access to any administrative functions of the Licensed Materials. Customer shall maintain during the term of this Agreement and through the end of the third year after the date on which the final payment is made under this Agreement, books, records, contracts and accounts relating to the payments due Authentik under this Agreement (collectively, the “Customer Records”). Authentik may, at its sole expense, upon 30 days prior written notice to Customer and during Customers normal business hours and subject to industry-standard confidentiality obligations, hire an independent third party auditor to audit the Customer Records only to verify the amounts payable under this Agreement. If an audit reveals underpayment, then Customer shall promptly pay the deficiency to Authentik plus late fees pursuant to Section 5.2. Authentik shall bear the cost of an audit unless the audit reveals underpayment by more than 5% for the audited period, in which case Customer shall promptly pay Authentik for the reasonable costs of the audit.
2.3 Customer will be responsible for maintaining the security of Customers account, passwords (including but not limited to administrative and User passwords and credentials for Hosts like e) and files, and for all uses of Customer account with or without Customers knowledge or consent.
## 3. CONFIDENTIALITY
3.1 Each party (the “Receiving Party”) understands that the other party (the “Disclosing Party”) has disclosed or may disclose information relating to the Disclosing Partys technology or business (hereinafter referred to as “Proprietary Information” of the Disclosing Party). Without limiting the foregoing, the Licensed Materials are Authentik Proprietary Information.
3.2 The Receiving Party agrees: (i) not to divulge to any third person any such Proprietary Information, (ii) to give access to such Proprietary Information solely to those employees with a need to have access thereto for purposes of this Agreement, and (iii) to take the same security precautions to protect against disclosure or unauthorized use of such Proprietary Information that the party takes with its own proprietary information, but in no event will a party apply less than reasonable precautions to protect such Proprietary Information. The Disclosing Party agrees that the foregoing will not apply with respect to any information that the Receiving Party can document (a) is or becomes generally available to the public without any action by, or involvement of, the Receiving Party, or (b) was in its possession or known by it prior to receipt from the Disclosing Party, or (c) was rightfully disclosed to it without restriction by a third party, or (d) was independently developed without use of any Proprietary Information of the Disclosing Party. Nothing in this Agreement will prevent the Receiving Party from disclosing Proprietary Information pursuant to any judicial or governmental order, provided that the Receiving Party gives the Disclosing Party reasonable prior notice of such disclosure to contest such order. In any event, Authentik may collect data with respect to and report on the aggregate response rate and other aggregate measures of the Licensed Materials performance and Customers usage of the Licensed Materials; provided that Authentik will not identify Customer as the source of any such data without Customers prior written consent. For the avoidance of doubt, use of a third party to host the data collected shall not be deemed a disclosure.
3.3 Each party acknowledges and agrees that the other may suffer irreparable damage in the event of a breach of the terms of Sections 1.1, 2.1 or 3.2 of this Agreement and that such party will be entitled to seek injunctive relief (without the necessity of posting a bond) in the event of any such breach.
3.4 Both parties will have the right to disclose the existence of the relationship between the parties, but not the terms and conditions of this Agreement, unless such disclosure of the Agreement terms is approved in writing by both Parties prior to such disclosure, or is included in a filing required to be made by a party with a governmental authority (provided such party will use reasonable efforts to obtain confidential treatment or a protective order) or is made on a confidential basis as reasonably necessary to potential investors or acquirers.
## 4. INTELLECTUAL PROPERTY RIGHTS
4.1 Except as expressly set forth herein, Authentik alone (and its licensors, where applicable) will retain all intellectual property rights relating to the Licensed Materials and any suggestions, ideas, enhancement requests, feedback, code, or other recommendations provided by Customer, its Affiliates or any third party relating to the Licensed Materials, which are hereby assigned to Authentik. This Agreement is not a sale and does not convey to Customer any rights of ownership in or related to the Licensed Materials, or any intellectual property rights.
4.2 Customer shall not remove, alter or obscure any of Authentiks (or its licensors) copyright notices, proprietary legends, trademark or service mark attributions, patent markings or other indicia of Authentiks (or its licensors) ownership or contribution from the Licensed Materials. Additionally, Customer agrees to reproduce and include Authentiks (and its licensors) proprietary and copyright notices on any copies of the Licensed Materials, or on any portion thereof, including reproduction of the copyright notice. Notwithstanding anything to the contrary herein, certain components of the Licensed Materials, including without limitation, any component of the Licensed Materials distributed by Authentik as part of the Authentik Community Edition, are licensed by third parties pursuant to the terms of certain third party licenses described in such source code annotations.
4.3 Customer and its licensors shall (and Customer hereby represents and warrants that they do) have and retain all right, title and interest (including, without limitation, sole ownership of) all software, information, content and data provided by or on behalf of Customer or made available or otherwise distributed through use of the Licensed Materials (“Content”) and the intellectual property rights with respect to that Content. If Authentik receives any notice or claim that any Content, or Customers activities hereunder (including without limitation, with respect to any Content), infringes or violates the rights of a third party or any applicable law or regulation (a “Claim”), Customer will indemnify, defend and hold Authentik harmless from all liability, damages, settlements, attorney fees and other costs and expenses in connection with any such Claim, as incurred. The immediately foregoing indemnity obligations are expressly conditioned on Authentik providing Customer with prompt notice of, and reasonable cooperation and sole control over the defense and/or settlement of the applicable Claim. Subject to the foregoing, Authentik may participate in the defense and/or settlement of any applicable Claim with counsel of its choosing at its own expense.
4.4 Authentik will defend, indemnify and hold Customer harmless from liability and other amounts paid or payable to unaffiliated third parties resulting from (i) the infringement or violation of any intellectual property or proprietary rights by the Licensed Materials or (ii) the violation of applicable law or regulation by Authentik in performance of its obligations hereunder, provided Authentik is promptly notified of any and all threats, claims and proceedings related thereto and given reasonable assistance and the opportunity to assume sole control over defense and settlement thereof. Subject to the foregoing, Customer may participate in the defense and/or settlement of any claim that is indemnifiable by Authentik with counsel of its choosing at its own expense. The foregoing obligations do not apply with respect to portions or components of the Licensed Materials (i) not created by Authentik, (ii) that are modified after delivery by Authentik, (iii) combined with other products, processes or materials where the alleged infringement relates to such combination, (iv) where Customer continues allegedly infringing activity after being notified thereof or after being informed of modifications that would have avoided the alleged infringement, or (v) where Customers use of the Licensed Materials is not strictly in accordance with this Agreement and all related documentation.
## 5. PAYMENT OF FEES
5.1 Unless and until Authentik and Customer have executed a quote document specifically referencing this Agreement with respect to amounts due on account of the Licensed Materials (a “Quote”, which is hereby incorporated by reference, if applicable), and unless Customers subscription to (and payment with respect to) the Licensed Materials has been made on Customers behalf by a reseller, Customer will pay Authentik the applicable fees as set forth at https://goauthentik.io (the “Pricing”) for the Licensed Materials selected and/or used by Customer (the “Fees”) without any right of set-off or deduction. On each anniversary of the Effective Date, Authentik will invoice Customer (or its reseller, if applicable) with respect to any and all additional Customer Hosts of the Licensed Materials beyond those for whom Customer has pre-paid, as of such date (and for whom the Fees due pursuant to such invoice will be the then-current per-year Host fee with respect to the year just ended, and the then current per-year Host fee with respect to all subsequent years, unless otherwise agreed in writing by both parties (collectively, a “True-Up”)). For Customers that have pre-paid all Fees for multi-year subscriptions for Licensed Materials pursuant to a Quote, on each anniversary of the Effective Date during the term of this Agreement, (i) a new license key will be provided, and (ii) a True-Up will be conducted. All additional Hosts purchased shall be co-terminated through the end of the original Subscription period.
5.2 All payments will be made in accordance with the payment schedule and the method of payment set forth in the Pricing. If not otherwise specified, (a) Authentik will invoice Customer with respect to Fees up-front, for each term of the Customer's subscription (as applicable), and (b) payments will be due within thirty (30) days of Customer's receipt of correct invoice. Except as expressly set forth in this Agreement, all Fees paid and/or due hereunder (including any prepaid amounts) are non-refundable, including without limitation if this Agreement is terminated in accordance with Section 6 below. If Customer terminates this Agreement pursuant to Section 6.2 within 45 calendar days from receipt of the initial invoice for the Licensed Materials, Authentik will refund all Fees paid hereunder.
5.3 Any unpaid fees are subject to a finance charge of one percent (1.0%) per month, or the maximum permitted by law, whichever is lower, plus all expenses of collection, including reasonable attorneys fees. Fees under this Agreement are exclusive of all taxes, including national, state or provincial and local use, sales, value-added, property and similar taxes, if any. Customer agrees to pay such taxes (excluding US taxes based on Authentik's net income) unless Customer has provided Authentik with a valid exemption certificate. In the case of any withholding requirements, Customer will pay any required withholding itself and will not reduce the amount paid to Authentik on account thereof.
## 6. TERMINATION
6.1 This Agreement shall continue until terminated in accordance with this Section 6. Either party may terminate this Agreement upon 15 days written notice to the other party hereto in the event that Customer has no then-current subscription and license key with respect to the Licensed Materials.
6.2 Customer may terminate this Agreement at any time upon written notice to Authentik. Either party may terminate this Agreement immediately upon 15 days written notice to the other party in the event of any material breach of this Agreement (including without limitation, any breach of Section 2.2 and/or failure to pay any amounts when due hereunder) by such party where such material breach is not cured during such notice period.
6.3 Either party may terminate this Agreement, without notice, (i) upon the institution by or against the other party of insolvency, receivership or bankruptcy proceedings (provided such proceedings are not dismissed within one hundred twenty (120) days of such institution), (ii) upon the other party's making an assignment for the benefit of creditors, or (iii) upon the other party's dissolution or ceasing to do business without a successor.
6.4 Customers rights to the Licensed Materials, and any licenses granted hereunder, shall terminate upon any termination of this Agreement. In the event that Customer terminates this Agreement pursuant to the second sentence of Section 6.2 above, Authentik will refund to Customer a pro-rated portion of pre-paid Fees for Services not actually received by Customer as of the date of such termination. The following Sections will survive any termination of this Agreement: 2 through 6 (except for Section 4.3), and 8 through 11.
## 7. WARRANTY; CUSTOMER SOFTWARE SECURITY
Authentik represents and warrants that (i) it has all rights and licenses necessary for it to perform its obligations hereunder, and (ii) it will not knowingly include, in any Authentik software released to the public and provided to Customer hereunder, any computer code or other computer instructions, devices or techniques, including without limitation those known as disabling devices, trojans, or time bombs, that are intentionally designed to disrupt, disable, harm, infect, defraud, damage, or otherwise impede in any manner, the operation of a network, computer program or computer system or any component thereof, including its security or user data. If, at any time, Authentik fails to comply with the warranty in this Section, Customer may promptly notify Authentik in writing of any such noncompliance. Authentik will, within thirty (30) days of receipt of such written notification, either correct the noncompliance or provide Customer with a plan for correcting the noncompliance. If the noncompliance is not corrected or if a reasonably acceptable plan for correcting them is not established during such period, Customer may terminate this Agreement as its sole and exclusive remedy for such noncompliance.
## 8. WARRANTY DISCLAIMER
EXCEPT AS EXPRESSLY STATED HEREIN, THE LICENSED MATERIALS, SOFTWARE AND AUTHENTIK PROPRIETARY INFORMATION AND ANYTHING PROVIDED IN CONNECTION WITH THIS AGREEMENT ARE PROVIDED "AS-IS," WITHOUT ANY WARRANTIES OF ANY KIND. AUTHENTIK AND ITS LICENSORS HEREBY DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, ALL IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE, AND NON-INFRINGEMENT.
## 9. LIMITATION OF LIABILITY
EXCEPT WITH RESPECT TO BREACH(ES) OF SECTION 1.1 AND/OR 2.1, IN NO EVENT WILL EITHER PARTY OR THEIR LICENSORS BE LIABLE FOR ANY INDIRECT, PUNITIVE, INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN ANY WAY CONNECTED WITH THE USE OF THE LICENSED MATERIALS OR ANYTHING PROVIDED IN CONNECTION WITH THIS AGREEMENT, ANY DELAY OR INABILITY TO USE THE LICENSED MATERIALS OR ANYTHING PROVIDED IN CONNECTION WITH THIS AGREEMENT OR OTHERWISE ARISING FROM THIS AGREEMENT, INCLUDING WITHOUT LIMITATION, LOSS OF REVENUE OR ANTICIPATED PROFITS OR LOST BUSINESS OR LOST SALES, WHETHER BASED IN CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY, OR OTHERWISE, EVEN IF SUCH PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF DAMAGES. EXCEPT WITH RESPECT TO BREACH(ES) OF SECTION 1.1 AND/OR 2.1, THE TOTAL LIABILITY OF EACH PARTY AND ITS LICENSORS, WHETHER BASED IN CONTRACT, TORT (INCLUDING NEGLIGENCE OR STRICT LIABILITY), OR OTHERWISE, WILL NOT EXCEED, IN THE AGGREGATE, THE GREATER OF (i) ONE THOUSAND DOLLARS ($1,000), OR (ii) THE FEES PAID TO AUTHENTIK HEREUNDER IN ONE YEAR PERIOD ENDING ON THE DATE THAT A CLAIM OR DEMAND IS FIRST ASSERTED. THE FOREGOING LIMITATIONS WILL APPLY NOTWITHSTANDING ANY FAILURE OF ESSENTIAL PURPOSE OF ANY LIMITED REMEDY.
## 10. U.S. GOVERNMENT MATTERS
Notwithstanding anything else, Customer may not provide to any person or export or re-export or allow the export or re-export of the Licensed Materials or any software or anything related thereto or any direct product thereof (collectively “Controlled Subject Matter”), in violation of any restrictions, laws or regulations of the United States Department of Commerce, the United States Department of Treasury Office of Foreign Assets Control, or any other United States or foreign agency or authority. Without limiting the foregoing Customer acknowledges and agrees that the Controlled Subject Matter will not be used or transferred or otherwise exported or re-exported to countries as to which the United States maintains an embargo (collectively, “Embargoed Countries”), or to or by a national or resident thereof, or any person or entity on the U.S. Department of Treasurys List of Specially Designated Nationals or the U.S. Department of Commerces Table of Denial Orders (collectively, “Designated Nationals”). The lists of Embargoed Countries and Designated Nationals are subject to change without notice. Use of the Licensed Materials is representation and warranty that neither the User nor Host is located in, under the control of, or a national or resident of an Embargoed Country or Designated National. The Controlled Subject Matter may use or include encryption technology that is subject to licensing requirements under the U.S. Export Administration Regulations. As defined in FAR section 2.101, any software and documentation provided by Authentik are “commercial items” and according to DFAR section 252.2277014(a)(1) and (5) are deemed to be “commercial computer software” and “commercial computer software documentation.” Consistent with DFAR section 227.7202 and FAR section 12.212, any use modification, reproduction, release, performance, display, or disclosure of such commercial software or commercial software documentation by the U.S. Government will be governed solely by the terms of this Agreement and will be prohibited except to the extent expressly permitted by the terms of this Agreement.
## 11. MISCELLANEOUS
If any provision of this Agreement is found to be unenforceable or invalid, that provision will be limited or eliminated to the minimum extent necessary so that this Agreement will otherwise remain in full force and effect and enforceable. This Agreement is not assignable, transferable or sublicensable by either party without the other partys prior written consent, not to be unreasonably withheld or delayed; provided that either party may transfer and/or assign this Agreement to a successor in the event of a sale of all or substantially all of its business or assets to which this Agreement relates. Both parties agree that this Agreement is the complete and exclusive statement of the mutual understanding of the parties and supersedes and cancels all previous written and oral agreements, communications and other understandings relating to the subject matter of this Agreement, and that all waivers and modifications must be in a writing signed or otherwise agreed to by each party, except as otherwise provided herein. No agency, partnership, joint venture, or employment is created as a result of this Agreement and neither party has any authority of any kind to bind the other in any respect whatsoever. In any action or proceeding to enforce rights under this Agreement, the prevailing party will be entitled to recover costs and attorneys fees. All notices under this Agreement will be in writing and will be deemed to have been duly given when received, if personally delivered; when receipt is electronically confirmed, if transmitted by facsimile or e-mail; and upon receipt, if sent by certified or registered mail (return receipt requested), postage prepaid. Authentik will not be liable for any loss resulting from a cause over which it does not have direct control. This Agreement will be governed by the laws of the State of California, U.S.A. without regard to its conflict of laws provisions. The federal and state courts sitting in San Francisco County, California, U.S.A. will have proper and exclusive jurisdiction and venue with respect to any disputes arising from or related to the subject matter of this Agreement.
## 12. DATA PRIVACY
Customer shall ensure that any and all information or data, including without limitation, personal data, used by Customer in connection with the Agreement (“Customer Data”) is collected, processed, transferred and used in full compliance with Applicable Data Protection Laws (as defined below) and that it has all obtained all necessary authorizations and consents from any data subjects to process Customer Data. Customer shall adopt and maintain appropriate organizational, technical and security measures prior to any such collection, processing or transfer in order to protect against unauthorized access to or use of Customer Data. Customer shall immediately inform Authentik upon becoming aware of any breach within the meaning of Applicable Data Protection Law relating to Customer Data (a “Security Incident”) and to cooperate with Authentik in any investigation thereof and in the implementation of any measures reasonably required to be taken in response thereto. If required by Applicable Data Protection Laws, the parties will enter into standard contractual clauses under GDPR (as defined below) for the transfer of any Customer Data outside of the European Union. For purposes hereof: (a) “Applicable Data Protection Laws” means any applicable laws, statutes or regulations as may be amended, extended or re-enacted from time to time which relate to personal data including without limitation (i) prior to 25 May 2018, the EU Data Protection Directive 95/46/EC as transposed into EU Member State law; (ii) from and after 25 May 2018, GDPR and any EU Member State laws implementing the GDPR; and (iii) the e-Privacy Directive 2002/58/EC, as amended and as transposed into EU Member State law and any legislation replacing the e-Privacy Directive and (b) “GDPR” means the Regulation (EU) 2016/679 of the European Parliament and of the Counsel of 27 April 2016 on the protection of natural persons with regard to the processing of personal data and on the free movement of such data,
[THE REMAINDER OF THIS PAGE INTENTIONALLY LEFT BLANK]
**IN WITNESS WHEREOF,** the parties have executed this Agreement as of the Effective Date.
_This work, "authentik Subscription Terms", is a derivative of "[Fleet Subscription Terms](https://fleetdm.com/legal/terms)", by [Fleet Device Management Inc.](https://fleetdm.com/handbook/company), used under CC BY-SA 4.0. "authentik Subscription Terms" is licensed under CC BY-SA 4.0 by Authentik Security Inc._
[![License: CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/80x15.png)](https://creativecommons.org/licenses/by-sa/4.0/)

View File

@ -1,177 +0,0 @@
import React from "react";
import Layout from "@theme/Layout";
import Link from "@docusaurus/Link";
import Card from "../../components/PricingQuestions/Card";
import useBaseUrl from "@docusaurus/useBaseUrl";
export default function pricingPage() {
const commonFeatures = [
<li>
Supports{" "}
<a href={useBaseUrl("docs/providers/oauth/")}>
OAuth2/OpenID Connect
</a>
</li>,
<li>
Supports <a href={useBaseUrl("docs/providers/saml/")}>SAML</a>
</li>,
<li>
Supports <a href={useBaseUrl("docs/providers/ldap/")}>LDAP</a>
</li>,
<li>
Supports <a href={useBaseUrl("docs/providers/scim/")}>SCIM</a>
</li>,
<li>
Supports <a href={useBaseUrl("docs/providers/radius/")}>Radius</a>
</li>,
<li>
Supports <a href={useBaseUrl("docs/providers/proxy/")}>Proxy</a>
</li>,
<li>Advanced policy engine</li>,
];
const enterpriseFeatures = [
<li>Long-term-support releases</li>,
<li>Enterprise support plan</li>,
<li>Web-based RDP/SSH access (planned)</li>,
<li>Push-notification MFA (planned)</li>,
<li>Desktop authentication (planned)</li>,
<li>AI-based risk assessment (planned)</li>,
];
return (
<Layout title="Pricing">
<section>
<div
className="container"
style={{ marginTop: "2rem", marginBottom: "2rem" }}
>
<h1 style={{ textAlign: "center" }}>Pricing</h1>
<div className={"row"}>
<div className={"col col--4 margin-vert--md"}>
<div className="card" style={{ height: "100%" }}>
<div className="card__header">
<h3>Open Source</h3>
</div>
<div className="card__body">
<ul>
<li>Open source</li>
<li>Self-hosted</li>
{commonFeatures}
</ul>
</div>
<div className="card__footer">
<h1>Free, forever</h1>
<Link
className="button button--primary button--block"
href={"/docs/"}
>
Get Started
</Link>
</div>
</div>
</div>
<div className={"col col--4 margin-vert--md"}>
<div className="card" style={{ height: "100%" }}>
<div className="card__header">
<h3>Enterprise Self-Hosted</h3>
</div>
<div className="card__body">
<ul>
<li>Source-available</li>
<li>Self-hosted</li>
{commonFeatures}
{enterpriseFeatures}
</ul>
</div>
<div className="card__footer">
<h1>
$5 <small>/internal user/month</small>
</h1>
<h1>
$0.02{" "}
<small>/external user/month</small>
</h1>
<a
className="button button--primary button--block"
target="_blank"
href="https://customers.goauthentik.io/"
>
Get Started
</a>
</div>
</div>
</div>
<div className={"col col--4 margin-vert--md"}>
<div className="card" style={{ height: "100%" }}>
<div className="card__header">
<h3>Enterprise Cloud</h3>
</div>
<div className="card__body">
<ul>
<li>Hosted and Managed by authentik</li>
<li>Source-available</li>
{commonFeatures}
{enterpriseFeatures}
<li>
Easily shift to self-hosted if
needed
</li>
</ul>
</div>
<div className="card__footer">
<h1>
$5 <small>/internal user/month</small>
</h1>
<h1>
$0.02{" "}
<small>/external user/month</small>
</h1>
<a
className="button button--info button--block"
href="./waitlist/cloud"
>
Join waitlist
</a>
</div>
</div>
</div>
</div>
</div>
</section>
<section>
<div className="container" style={{ marginBottom: "3rem" }}>
<div className="row">
<div className="col col--8 col--offset-2">
<h2 className="hero__subtitle margin--md">
Frequently Asked Questions
</h2>
<div className="card-demo margin--md">
<Card
title="Will any feature of the open-source version ever become enterprise?"
body="No. As part of our core principle, we will not move any features from the open source version to the enterprise version. Features from the enterprise version are periodically moved to the open source version."
/>
<Card
title="Can I get paid support for the open-source version?"
body="We only offer support as part of an enterprise license. You can get community support on GitHub and Discord for the open-source version."
/>
<Card
title="What's the difference between internal and external users?"
body="Internal users might be users such as company employees, which will get access to the full Enterprise feature set. External users might be external consultants or B2C customers. These users don't get access to enterprise features."
/>
<Card
title="Are you planning to add X to authentik?"
body="We're always curious to hear what our customers are interested in and what they want to see in authentik, so if you have any questions about features send an email to <a href='mailto:hello@goauthentik.io'>hello@goauthentik.io</a>."
/>
<Card
title="Who should use Enterprise plans?"
body="Anyone that wants to use the enterprise features listed above. There's no minimum user amount required for enterprise."
/>
</div>
</div>
</div>
</div>
</section>
</Layout>
);
}

View File

@ -1,11 +0,0 @@
import React from "react";
import { WaitListForm } from "../../../components/Waitlist";
import Layout from "@theme/Layout";
export default function waitlistCloud() {
return (
<Layout title="Waitlist">
<WaitListForm product="cloud"></WaitListForm>
</Layout>
);
}

View File

@ -1,99 +0,0 @@
/* stylelint-disable docusaurus/copyright-header */
.heroBanner {
padding: 4rem 0;
text-align: center;
position: relative;
overflow: hidden;
overflow-wrap: normal;
color: var(--white);
}
.headerRow {
margin-bottom: -10rem;
}
.heroImage {
flex-direction: column;
justify-items: center;
--ifm-col-width: 45%;
}
.heroImage > img {
filter: drop-shadow(5px 5px 25px rgba(0, 0, 0, 0.6));
}
@media (max-width: 996px) {
.headerRow {
margin-bottom: 0;
}
.hiddenOnMobile {
display: none;
}
.heroBanner {
padding: 2rem;
}
}
.ak_hero__title {
font-size: 1.75rem;
}
@media (min-width: 388px) {
.ak_hero__title {
font-size: 2rem;
}
}
@media (min-width: 520px) {
.ak_hero__title {
font-size: 3rem;
}
}
.buttons {
display: flex;
align-items: center;
justify-content: center;
align-items: center;
flex-wrap: wrap;
}
.buttons > * {
margin: 0.25rem;
}
.features {
display: flex;
align-items: center;
padding: 2rem 0;
width: 100%;
flex-direction: column;
}
.row {
padding-bottom: 2rem;
}
.rowFullWidth {
width: 100%;
padding: 1rem 3rem;
}
.rowDark {
background-color: var(--ifm-color-secondary-contrast-foreground);
color: var(--ifm-color-secondary-contrast-background);
}
.rowAuthentik {
color: var(--white);
background-color: var(--ifm-color-primary);
}
.newsBar {
margin-bottom: 4rem;
}
.footerCTA {
padding: 3rem;
text-align: center;
}

View File

@ -1,25 +0,0 @@
import React from "react";
import Layout from "@theme/Layout";
import Head from "@docusaurus/Head";
import BrowserOnly from "@docusaurus/BrowserOnly";
function TerraformProviderPage() {
return (
<Layout title="terraform-provider">
<Head>
<meta
name="go-import"
content="goauthentik.io/terraform-provider-authentik git https://github.com/goauthentik/terraform-provider-authentik"
></meta>
</Head>
<BrowserOnly>
{() => {
window.location.assign(
"https://registry.terraform.io/providers/goauthentik/authentik/latest/docs",
);
}}
</BrowserOnly>
</Layout>
);
}
export default TerraformProviderPage;

View File

@ -1,76 +0,0 @@
import React from "react";
import clsx from "clsx";
import {
HtmlClassNameProvider,
ThemeClassNames,
} from "@docusaurus/theme-common";
import {
BlogPostProvider,
useBlogPost,
} from "@docusaurus/theme-common/internal";
import BlogLayout from "@theme/BlogLayout";
import BlogPostItem from "@theme/BlogPostItem";
import BlogPostPaginator from "@theme/BlogPostPaginator";
import BlogPostPageMetadata from "@theme/BlogPostPage/Metadata";
import TOC from "@theme/TOC";
import { DiscussionEmbed } from "disqus-react";
function BlogPostPageContent({ sidebar, children }) {
const { metadata, toc } = useBlogPost();
const { nextItem, prevItem, frontMatter } = metadata;
const {
hide_table_of_contents: hideTableOfContents,
toc_min_heading_level: tocMinHeadingLevel,
toc_max_heading_level: tocMaxHeadingLevel,
} = frontMatter;
return (
<BlogLayout
sidebar={sidebar}
toc={
!hideTableOfContents && toc.length > 0 ? (
<TOC
toc={toc}
minHeadingLevel={tocMinHeadingLevel}
maxHeadingLevel={tocMaxHeadingLevel}
/>
) : undefined
}
>
<BlogPostItem>{children}</BlogPostItem>
{(nextItem || prevItem) && (
<BlogPostPaginator nextItem={nextItem} prevItem={prevItem} />
)}
</BlogLayout>
);
}
export default function BlogPostPage(props) {
const BlogPostContent = props.content;
const title = props.content.frontMatter.title.substring(0, 200);
const fmtId = title.replace(/^\//, "").replaceAll(/[\s\/]/gi, "-");
const disqusId = fmtId == "" ? "main" : fmtId;
return (
<BlogPostProvider content={props.content} isBlogPostPage>
<HtmlClassNameProvider
className={clsx(
ThemeClassNames.wrapper.blogPages,
ThemeClassNames.page.blogPostPage,
)}
>
<BlogPostPageMetadata />
<BlogPostPageContent sidebar={props.sidebar}>
<BlogPostContent />
<DiscussionEmbed
shortname="goauthentik-io"
config={{
url: "https://goauthentik.io" + props.route.path,
identifier: disqusId,
title: title,
}}
/>
</BlogPostPageContent>
</HtmlClassNameProvider>
</BlogPostProvider>
);
}