-
{eyebrow}
-
{headline}
-
{subheadline}
-
-
-
+
+
+
-
+
);
}
diff --git a/apps/web/src/app/[lang]/use-cases/content/ai-enablement.ts b/apps/web/src/app/[lang]/use-cases/content/ai-enablement.ts
index 5828dae..f28cf5d 100644
--- a/apps/web/src/app/[lang]/use-cases/content/ai-enablement.ts
+++ b/apps/web/src/app/[lang]/use-cases/content/ai-enablement.ts
@@ -17,7 +17,6 @@ export const useCase: UseCasePage = {
],
},
hero: {
- eyebrow: "KI-Enablement",
headline: "Wer in deinem Unternehmen wirklich mit KI arbeitet.",
subheadline:
"KI-Tools sind im Einsatz. Aber wer sie tatsächlich nutzt, wer nur so tut als ob, und wer noch nie geschult wurde, das weiß fast niemand. Scibly macht den Trainingsstand für jeden sichtbar.",
@@ -103,7 +102,6 @@ export const useCase: UseCasePage = {
],
},
hero: {
- eyebrow: "AI enablement",
headline: "Who in your company actually works with AI.",
subheadline:
"AI tools are in use. But who really works with them, who just says they do, and who has never been trained — almost nobody knows. Scibly makes training status visible for every person.",
diff --git a/apps/web/src/app/[lang]/use-cases/content/healthcare.ts b/apps/web/src/app/[lang]/use-cases/content/healthcare.ts
index d37f9ea..31231cb 100644
--- a/apps/web/src/app/[lang]/use-cases/content/healthcare.ts
+++ b/apps/web/src/app/[lang]/use-cases/content/healthcare.ts
@@ -17,7 +17,6 @@ export const useCase: UseCasePage = {
],
},
hero: {
- eyebrow: "Für Pflegeeinrichtungen",
headline: "Keine Aktensuche vor der nächsten MDK-Prüfung.",
subheadline:
"Hygieneschulung, Erste-Hilfe-Auffrischung, Brandschutzunterweisung: Kurs einmal erstellen, allen Mitarbeitenden zuweisen und den Nachweis für den MDK jederzeit ohne Suchen exportieren.",
@@ -104,7 +103,6 @@ export const useCase: UseCasePage = {
],
},
hero: {
- eyebrow: "For care homes and nursing facilities",
headline: "No folder search before the next inspection.",
subheadline:
"Hygiene training, first aid refreshers, fire safety: build the course once, assign it to every staff member, and export the compliance report whenever an inspector asks.",
diff --git a/apps/web/src/app/[lang]/use-cases/content/hospitality.ts b/apps/web/src/app/[lang]/use-cases/content/hospitality.ts
index b2e28f8..432b0c7 100644
--- a/apps/web/src/app/[lang]/use-cases/content/hospitality.ts
+++ b/apps/web/src/app/[lang]/use-cases/content/hospitality.ts
@@ -17,7 +17,6 @@ export const useCase: UseCasePage = {
],
},
hero: {
- eyebrow: "Für Gastronomie und Hotellerie",
headline: "HACCP-Schulungen. Revisionssicher. Kein Papier mehr.",
subheadline:
"Das Gesundheitsamt fragt nach Nachweisen. Scibly hat sie. Kurs einmal erstellen, mit einem Klick jedem neuen Mitarbeitenden zuweisen, Nachweis mit Zeitstempel und Abschlussbestätigung.",
@@ -103,7 +102,6 @@ export const useCase: UseCasePage = {
],
},
hero: {
- eyebrow: "For hospitality and catering",
headline: "Food safety training. Audit-ready. No paper.",
subheadline:
"When the inspector asks for records, you have them. Create the course once, assign it to every new hire in one click, and get a timestamped completion record for every person.",
diff --git a/apps/web/src/app/[lang]/use-cases/content/it-companies.ts b/apps/web/src/app/[lang]/use-cases/content/it-companies.ts
index 721565a..eee7605 100644
--- a/apps/web/src/app/[lang]/use-cases/content/it-companies.ts
+++ b/apps/web/src/app/[lang]/use-cases/content/it-companies.ts
@@ -18,7 +18,6 @@ export const useCase: UseCasePage = {
],
},
hero: {
- eyebrow: "Für IT-Teams",
headline: "Compliance. Onboarding. KI. Alles in einem System.",
subheadline:
"Wenn der Auditor anruft, hast du die Nachweise. Wenn jemand neu anfängt, weiß er vom ersten Tag an, was zu tun ist. Und wenn jemand nach KI-Kenntnissen fragt, kannst du zeigen, wer was gelernt hat.",
@@ -104,7 +103,6 @@ export const useCase: UseCasePage = {
],
},
hero: {
- eyebrow: "For IT teams",
headline: "Compliance. Onboarding. AI. One system for all three.",
subheadline:
"When the auditor calls, you have the records. When someone joins, they know what to do from day one. And when leadership asks about AI skills, you have the answer.",
diff --git a/apps/web/src/app/[lang]/use-cases/content/logistics.ts b/apps/web/src/app/[lang]/use-cases/content/logistics.ts
index 244a510..44488a9 100644
--- a/apps/web/src/app/[lang]/use-cases/content/logistics.ts
+++ b/apps/web/src/app/[lang]/use-cases/content/logistics.ts
@@ -17,7 +17,6 @@ export const useCase: UseCasePage = {
],
},
hero: {
- eyebrow: "Für Logistikunternehmen",
headline:
"ADR. Gabelstapler. DGUV 308-001. Einmal erstellt, für jeden einsatzbereit.",
subheadline:
@@ -104,7 +103,6 @@ export const useCase: UseCasePage = {
],
},
hero: {
- eyebrow: "For logistics and transport companies",
headline:
"ADR. Forklift. Workplace inductions. Built once, ready for everyone.",
subheadline:
diff --git a/apps/web/src/app/[lang]/use-cases/content/retail.ts b/apps/web/src/app/[lang]/use-cases/content/retail.ts
index d0ddda7..29941f8 100644
--- a/apps/web/src/app/[lang]/use-cases/content/retail.ts
+++ b/apps/web/src/app/[lang]/use-cases/content/retail.ts
@@ -17,7 +17,6 @@ export const useCase: UseCasePage = {
],
},
hero: {
- eyebrow: "Für den Einzelhandel",
headline: "Ob Stammkraft oder Aushilfe: Jeder startet richtig.",
subheadline:
"Hohe Fluktuation, Saisonspitzen, viele Filialen: Scibly erstellt den Onboarding-Kurs einmal, danach weist du ihn mit einem Klick jeder neuen Person zu. Auf dem Handy, vor dem ersten Tag.",
@@ -104,7 +103,6 @@ export const useCase: UseCasePage = {
],
},
hero: {
- eyebrow: "For retail",
headline: "Whether full-time or seasonal: everyone starts right.",
subheadline:
"High turnover, seasonal peaks, many stores: Scibly builds your onboarding course once — then you assign it to every new hire with one click. On their phone, before their first day.",
diff --git a/apps/web/src/app/[lang]/use-cases/content/trades-and-construction.ts b/apps/web/src/app/[lang]/use-cases/content/trades-and-construction.ts
index 91cb808..373e18d 100644
--- a/apps/web/src/app/[lang]/use-cases/content/trades-and-construction.ts
+++ b/apps/web/src/app/[lang]/use-cases/content/trades-and-construction.ts
@@ -17,7 +17,6 @@ export const useCase: UseCasePage = {
],
},
hero: {
- eyebrow: "Für Handwerksbetriebe",
headline: "DGUV-Unterweisungen. Digital. Nachweisbar.",
subheadline:
"Wenn die BG-Kontrolle kommt, hast du den Nachweis. Zeitstempel, exportierbar in zwei Minuten. Und neue Mitarbeitende werden eingewiesen, bevor sie anfangen.",
@@ -104,7 +103,6 @@ export const useCase: UseCasePage = {
],
},
hero: {
- eyebrow: "For trades and construction",
headline: "Health and safety inductions. Digital. Documented.",
subheadline:
"When an inspector arrives, you have the evidence. Timestamped, exportable in two minutes. And new starters are inducted before their first shift begins.",
diff --git a/apps/web/src/app/[lang]/use-cases/types.ts b/apps/web/src/app/[lang]/use-cases/types.ts
index 2f18464..ad2a09d 100644
--- a/apps/web/src/app/[lang]/use-cases/types.ts
+++ b/apps/web/src/app/[lang]/use-cases/types.ts
@@ -3,7 +3,6 @@ import type { FaqItem } from "@/components/faq/faq-list";
export type UseCaseContent = {
meta: { title: string; description: string; keywords: string[] };
hero: {
- eyebrow: string;
headline: string;
subheadline: string;
ctaLabel: string;
diff --git a/apps/web/src/app/sitemap.ts b/apps/web/src/app/sitemap.ts
index 0d63035..4e6f163 100644
--- a/apps/web/src/app/sitemap.ts
+++ b/apps/web/src/app/sitemap.ts
@@ -187,6 +187,24 @@ export default async function sitemap(): Promise
{
});
});
+ // Unlinked from the rest of the site, so the sitemap is a crawler's only way in.
+ locales.forEach((locale) => {
+ sitemapEntries.push({
+ url: withLocale(routes.web.base.home + "onboarding-offboarding", locale),
+ alternates: {
+ languages: Object.fromEntries(
+ locales.map((l) => [
+ l,
+ withLocale(routes.web.base.home + "onboarding-offboarding", l),
+ ]),
+ ),
+ },
+ lastModified: new Date(),
+ changeFrequency: "monthly",
+ priority: 0.75,
+ });
+ });
+
locales.forEach((locale) => {
sitemapEntries.push({
url: withLocale(routes.web.legal.impressum, locale),
diff --git a/apps/web/src/components/faq/faq-json-ld.tsx b/apps/web/src/components/faq/faq-json-ld.tsx
new file mode 100644
index 0000000..e300cbb
--- /dev/null
+++ b/apps/web/src/components/faq/faq-json-ld.tsx
@@ -0,0 +1,23 @@
+import { type FaqItem } from "./faq-list";
+
+export function FaqJsonLd({ questions }: { questions: FaqItem[] }) {
+ const jsonLd = {
+ "@context": "https://schema.org",
+ "@type": "FAQPage",
+ mainEntity: questions.map((question) => ({
+ "@type": "Question",
+ name: question.q,
+ acceptedAnswer: {
+ "@type": "Answer",
+ text: question.a,
+ },
+ })),
+ };
+
+ return (
+
+ );
+}
diff --git a/apps/web/src/components/faq/faq-list.tsx b/apps/web/src/components/faq/faq-list.tsx
index e006d17..e9177f4 100644
--- a/apps/web/src/components/faq/faq-list.tsx
+++ b/apps/web/src/components/faq/faq-list.tsx
@@ -29,7 +29,7 @@ export type FaqItem = {
a: string;
};
-export type FaqContext = "homepage" | "use-case";
+export type FaqContext = "homepage" | "use-case" | "landing-page";
const CHAPTER_CYCLE: PillarId[] = [
"import",
diff --git a/apps/web/src/i18n/types.ts b/apps/web/src/i18n/types.ts
index 642bd79..77c93bc 100644
--- a/apps/web/src/i18n/types.ts
+++ b/apps/web/src/i18n/types.ts
@@ -12,6 +12,7 @@ import { type AppRoutesPage } from "@/app/[lang]/i18n/app-routes.types";
import { type BlogPage } from "@/app/[lang]/i18n/blog.types";
import { type HomePage } from "@/app/[lang]/i18n/home.types";
import { type LegalPage } from "@/app/[lang]/i18n/legal.types";
+import { type OnboardingOffboardingPage } from "@/app/[lang]/onboarding-offboarding/i18n/onboarding-offboarding.types";
export type Dictionary = {
page: {
@@ -29,6 +30,7 @@ export type Dictionary = {
demoTour: DemoTourDictionary;
founder: FounderDictionary;
openSource: OpenSourceDictionary;
+ onboardingOffboarding: OnboardingOffboardingPage;
};
};
diff --git a/apps/web/src/styles/marketing-motion.css b/apps/web/src/styles/marketing-motion.css
index 6b5d948..12ab0dc 100644
--- a/apps/web/src/styles/marketing-motion.css
+++ b/apps/web/src/styles/marketing-motion.css
@@ -243,6 +243,27 @@
}
}
+/* The digit wheels are script-driven, so the plain value stands in until the counter runs, and takes over entirely when scripting is off. */
+.sc-roll {
+ opacity: 0;
+}
+
+.sc-roll-ready {
+ opacity: 1;
+}
+
+@media (scripting: enabled) {
+ .sc-roll-plain {
+ display: none;
+ }
+}
+
+@media not (scripting: enabled) {
+ .sc-roll {
+ display: none;
+ }
+}
+
.sc-bento [data-bento-visual] {
-webkit-font-smoothing: antialiased;
text-rendering: geometricPrecision;